diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/CREDITS linux.17p9/CREDITS
--- linux.vanilla/CREDITS	Sun Jun 11 21:44:08 2000
+++ linux.17p9/CREDITS	Tue Jun 20 22:53:58 2000
@@ -645,6 +645,10 @@
 S: San Jose, California 95131
 S: USA
 
+N: Kumar Gala
+E: kumar.gala@motorola.com
+D: AltiVec PowerPC support
+
 N: Nigel Gamble
 E: nigel@nrg.org
 E: nigel@sgi.com
@@ -812,6 +816,7 @@
 E: benh@mipsys.com
 D: PowerMac booter (BootX)
 D: Additional PowerBook support
+D: Apple "Core99" machines support (ibook,g4,...)
 S: 22, rue des Marguettes
 S: 75012 Paris
 S: France
@@ -1631,6 +1636,13 @@
 N: Ken Pizzini
 E: ken@halcyon.com
 D: CDROM driver "sonycd535" (Sony CDU-535/531)
+
+N: Matt Porter
+E: mporter@phx.mcd.mot.com
+D: Motorola PowerPC PReP support
+S: 2900 S. Diable Way
+S: Tempe, Arizona 85282
+S: USA
 
 N: Frederic Potter 
 E: Frederic.Potter@masi.ibp.fr 
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/Documentation/Configure.help linux.17p9/Documentation/Configure.help
--- linux.vanilla/Documentation/Configure.help	Sun Jun 11 21:44:08 2000
+++ linux.17p9/Documentation/Configure.help	Mon Jun 26 15:46:10 2000
@@ -5755,6 +5755,34 @@
 
   If unsure, say N here.
 
+Cyclades-PC300 support
+CONFIG_PC300
+  This is a driver for the Cyclades-PC300 synchronous communication
+  boards. These boards provide synchronous serial interfaces to your
+  Linux box. All protocols supported by the HDLC generic driver
+  (currently synchronous PPP, Cisco HDLC and Frame Relay) are available
+  by default. If you wish to support other protocols, please select one
+  of the available options below this one.
+
+  If you want to compile this as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want),
+  say M here and read Documentation/modules.txt. The module will be
+  called pc300.o.
+
+  If unsure, say N here.
+
+Cyclades-PC300 X.25 Support
+CONFIG_PC300_X25
+  Say Y to this option if you intend to use the Cyclades-PC300 to
+  provide X.25 interfaces to your Linux box.
+
+  IMPORTANT: Additional X.25 support must be enabled in the kernel
+  for this support to be functional (say Y to "CCITT X.25 Packet Layer"
+  and "LAPB Data Link Driver", in the "Networking Options"
+  configuration section).
+
+  If unsure, say N here.
+
 Ethernet (10 or 100Mbit)
 CONFIG_NET_ETHERNET
   Ethernet (also called IEEE 802.3 or ISO 8802-2) is the most common
@@ -7560,13 +7588,17 @@
   The module will be called ntfs.o. If you want to compile it as a
   module, say M here and read Documentation/modules.txt.
 
-NTFS read-write support (experimental)
+NTFS read-write support (DANGEROUS)
 CONFIG_NTFS_RW
-  If you say Y here, you will (hopefully) be able to write to NTFS
-  file systems as well as read from them. The read-write support
-  in NTFS is far from being complete and is not well tested. If you
+  If you say Y here, you will (maybe) be able to write to NTFS file
+  systems as well as read from them. The read-write support in
+  NTFS is far from being complete and is not well tested. If you
   enable this, back up your NTFS volume first since it may get
-  damaged.
+  damaged. Also, make sure to run chkdsk from within Microsoft
+  Windows NT after having performed any writes to a NTFS partition
+  from Linux to detect any problems as early as possible.
+  Please note that write support is limited to Windows NT4 and
+  earlier versions.
 
   If unsure, say N.
 
@@ -9751,6 +9783,12 @@
 
   Say Y unless you have 16MB or less RAM or a PCI sound card.
 
+Crystal SoundFusion (CS461x)
+CONFIG_SOUND_FUSION
+  This module drives the Crystal SoundFusion devices (CS46xx series) when
+  wired as native sound drivers with AC97 codecs. If this driver does not
+  work try the CS4232 driver.
+
 Support for Aztech Sound Galaxy (non-PnP) cards
 CONFIG_SOUND_SGALAXY
   This module initializes the older non Plug and Play sound galaxy
@@ -11404,10 +11442,18 @@
   whenever you want). If you want to compile it as a module, say M
   here and read Documentation/modules.txt.
 
-BMAC (G3 ethernet) support
+Use AAUI port instead of TP by default
+CONFIG_MACE_AAUI_PORT
+  Some Apple machines (notably the Apple Network Server) which use the
+  MACE ethernet chip have an Apple AUI port (small 15-pin connector),
+  instead of an 8-pin RJ45 connector for twisted-pair ethernet.  Say
+  Y here if you have such a machine.  If unsure, say N.
+
+BMAC (G3/G4 ethernet) support
 CONFIG_BMAC
-  Say Y for support of BMAC Ethernet interfaces. These are used on G3
-  computers. 
+  Say Y for support of BMAC and BMAC+ Ethernet interfaces. These
+  are used on G3 and G4 computers (Apple Power Macintoshes and
+  PowerBooks).
 
   This driver is also available as a module called bmac.o ( = code
   which can be inserted in and removed from the running kernel
@@ -12287,6 +12333,17 @@
 
   If you do not have any Quicknet telephony cards, you can safely
   ignore this option.
+
+Toshiba Laptop support
+CONFIG_TOSHIBA	
+  If you intend to run this the kernel on a Toshiba portable say yes
+  here. This adds a driver to safely access the System Management
+  Mode of the CPU on Toshiba portables. The System Management Mode
+  is used to set the BIOS and power saving options on Toshiba portables.
+
+  For information on utilities to make use of this driver see the
+  Toshiba Linux utilities website at:
+  http://www.buzzard.org.uk/toshiba/
  
 CPiA Video For Linux
 CONFIG_VIDEO_CPIA
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/Documentation/filesystems/ntfs.txt linux.17p9/Documentation/filesystems/ntfs.txt
--- linux.vanilla/Documentation/filesystems/ntfs.txt	Fri Apr 21 12:45:49 2000
+++ linux.17p9/Documentation/filesystems/ntfs.txt	Thu Jun 22 22:33:19 2000
@@ -4,10 +4,16 @@
 To mount an NTFS volume, use the filesystem type 'ntfs'. The driver
 currently works only in read-only mode, with no fault-tolerance
 supported.  If you enable the experimental write support, make sure
-you can recover from a complete loss of data. For ftdisk support,
-limited success was reported with volume sets on top of the md driver,
-although mirror and stripe sets should work as well - if the md
-driver can be talked into using the same layout as Windows NT.
+you can recover from a complete loss of data and also always run
+chkdsk from within Microsoft Windows NT after performing a write to
+a NTFS partition from Linux to detect any problems as early as 
+possible. For ftdisk support, limited success was reported with 
+volume sets on top of the md driver, although mirror and stripe 
+sets should work as well - if the md driver can be talked into 
+using the same layout as Windows NT.
+
+Please note that the experimental write support is limited to
+Windows NT4 and earlier versions.
 
 The ntfs driver supports the following mount options:
 iocharset=name      Character set to use when returning file names.
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/MAINTAINERS linux.17p9/MAINTAINERS
--- linux.vanilla/MAINTAINERS	Sun Jun 11 21:44:08 2000
+++ linux.17p9/MAINTAINERS	Thu Jun 22 22:33:19 2000
@@ -220,6 +220,12 @@
 W:	http://www.cyclades.com/
 S:	Supported
 
+CYCLADES PC300 DRIVER
+P:	Ivan Passos
+M:	ivan@cyclades.com
+W:	http://www.cyclades.com/
+S:	Supported
+
 DAMA SLAVE for AX.25
 P:	Joerg Reuter
 M:	jreuter@poboxes.com
@@ -262,6 +268,14 @@
 W:	http://www.dgii.com/linux/
 S:	Maintained
 
+DISK GEOMETRY AND PARTITION HANDLING
+P:     Andries Brouwer
+M:     aeb@veritas.com
+W:     http://www.win.tue.nl/~aeb/linux/Large-Disk.html
+W:     http://www.win.tue.nl/~aeb/linux/zip/zip-1.html
+W:     http://www.win.tue.nl/~aeb/partitions/partition_types-1.html
+S:     Maintained
+
 DISKQUOTA:
 P:	Marco van Wieringen
 M:	mvw@planets.elm.net
@@ -579,12 +593,6 @@
 L:	linux-kernel@vger.rutgers.edu
 S:	Maintained
 
-MOUSE AND MISC DEVICES [GENERAL]
-P:	Alessandro Rubini
-M:	rubini@ipvvis.unipv.it
-L:	linux-kernel@vger.rutgers.edu
-S:	Maintained
-
 MTRR AND SIMILAR SUPPORT [i386]
 P:	Richard Gooch
 M:	rgooch@atnf.csiro.au
@@ -651,6 +659,12 @@
 M:	emoenke@gwdg.de
 L:	linux-kernel@vger.rutgers.edu
 S:	Maintained
+
+NTFS FILESYSTEM
+P:	Anton Altaparmakov
+M:	aia21@cus.cam.ac.uk
+L:	linux-kernel@vger.rutgers.edu
+S:	Odd Fixes
 
 OLYMPIC NETWORK DRIVER
 P:	Peter De Shrijver
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/Makefile linux.17p9/Makefile
--- linux.vanilla/Makefile	Sun Jun 11 21:44:08 2000
+++ linux.17p9/Makefile	Mon Jun 26 23:10:49 2000
@@ -1,7 +1,7 @@
 VERSION = 2
 PATCHLEVEL = 2
-SUBLEVEL = 16
-EXTRAVERSION = 
+SUBLEVEL = 17
+EXTRAVERSION = pre9
 
 ARCH := $(shell uname -m | sed -e s/i.86/i386/ -e s/sun4u/sparc64/ -e s/arm.*/arm/ -e s/sa110/arm/)
 
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/arch/alpha/mm/fault.c linux.17p9/arch/alpha/mm/fault.c
--- linux.vanilla/arch/alpha/mm/fault.c	Sun Jun 11 21:44:09 2000
+++ linux.17p9/arch/alpha/mm/fault.c	Sun Jun 11 21:54:08 2000
@@ -150,8 +150,8 @@
 	if ((fixup = search_exception_table(regs->pc, regs->gp)) != 0) {
 		unsigned long newpc;
 		newpc = fixup_exception(dpf_reg, fixup, regs->pc);
-#if 1
-		printk("%s: Exception at [<%lx>] (%lx) handled successfully.\n",
+#if 0
+		printk("%s: Exception at [<%lx>] (%lx)\n",
 		       current->comm, regs->pc, newpc);
 #endif
 		regs->pc = newpc;
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/arch/i386/kernel/setup.c linux.17p9/arch/i386/kernel/setup.c
--- linux.vanilla/arch/i386/kernel/setup.c	Sun Jun 11 21:44:09 2000
+++ linux.17p9/arch/i386/kernel/setup.c	Fri Jun 23 00:30:42 2000
@@ -27,6 +27,8 @@
  *	Added proper Cascades CPU and L2 cache detection for Cascades
  *	and 8-way type cache happy bunch from Intel:^)
  *	Dragan Stancevic <visitor@valinux.com>, May 2000
+ *
+ *	Transmeta CPU detection.  H. Peter Anvin <hpa@zytor.com>, May 2000
  */
 
 /*
@@ -436,8 +438,10 @@
 {
 	unsigned int n, dummy, *v, ecx, edx;
 
-	/* Actually we must have cpuid or we could never have
-	 * figured out that this was AMD from the vendor info :-).
+	/* 
+	 * Actually we must have cpuid or we could never have
+	 * figured out that this was AMD/Cyrix/Transmeta
+	 * from the vendor info :-).
 	 */
 
 	cpuid(0x80000000, &n, &dummy, &dummy, &dummy);
@@ -450,8 +454,9 @@
 	cpuid(0x80000004, &v[8], &v[9], &v[10], &v[11]);
 	c->x86_model_id[48] = 0;
 	
-	if(c->x86_vendor == X86_VENDOR_AMD)
+	switch(c->x86_vendor)
 	{
+	case X86_VENDOR_AMD:
 		/*  Set MTRR capability flag if appropriate  */
 		if(boot_cpu_data.x86 == 5) {
 			if((boot_cpu_data.x86_model == 9) ||
@@ -460,17 +465,34 @@
 				c->x86_capability |= X86_FEATURE_MTRR;
 		}
 
+		/* Fall through */
+
+	case X86_VENDOR_TRANSMETA:
+		/* Cache information */
 		if (n >= 0x80000005){
 			cpuid(0x80000005, &dummy, &dummy, &ecx, &edx);
 			printk("CPU: L1 I Cache: %dK  L1 D Cache: %dK\n",
 				ecx>>24, edx>>24);
 			c->x86_cache_size=(ecx>>24)+(edx>>24);
 		}
-		if (n >= 0x80000006){
+		if(boot_cpu_data.x86_vendor == X86_VENDOR_AMD &&
+			boot_cpu_data.x86 == 6 && 
+			boot_cpu_data.x86_model== 3 &&
+			boot_cpu_data.x86_mask == 0)
+		{
+			/* AMD errata T13 (order #21922) */
+			printk("CPU: L2 Cache: 64K\n");
+			c->x86_cache_size = 64;
+		}
+		else if (n >= 0x80000006){
 			cpuid(0x80000006, &dummy, &dummy, &ecx, &edx);
 			printk("CPU: L2 Cache: %dK\n", ecx>>16);
 			c->x86_cache_size = ecx>>16;
 		}
+		break;
+
+	default:		/* Cyrix */
+		break;
 	}
 	return 1;
 }
@@ -735,6 +757,70 @@
 	return;
 }
 
+__initfunc(static void transmeta_model(struct cpuinfo_x86 *c))
+{
+	unsigned int cap_mask, uk, max, dummy, n, ecx, edx;
+	unsigned int cms_rev1, cms_rev2;
+	unsigned int cpu_rev, cpu_freq, cpu_flags;
+	char cpu_info[65];
+
+	get_model_name(c);	/* Same as AMD/Cyrix */
+
+	/* Print CMS and CPU revision */
+	cpuid(0x80860000, &max, &dummy, &dummy, &dummy);
+	if ( max >= 0x80860001 ) {
+		cpuid(0x80860001, &dummy, &cpu_rev, &cpu_freq, &cpu_flags); 
+		printk("CPU: Processor revision %u.%u.%u.%u, %u MHz%s%s\n",
+		       (cpu_rev >> 24) & 0xff,
+		       (cpu_rev >> 16) & 0xff,
+		       (cpu_rev >> 8) & 0xff,
+		       cpu_rev & 0xff,
+		       cpu_freq,
+		       (cpu_flags & 1) ? " [recovery]" : "",
+		       (cpu_flags & 2) ? " [longrun]" : "");
+	}
+	if ( max >= 0x80860002 ) {
+		cpuid(0x80860002, &dummy, &cms_rev1, &cms_rev2, &dummy);
+		printk("CPU: Code Morphing Software revision %u.%u.%u-%u-%u\n",
+		       (cms_rev1 >> 24) & 0xff,
+		       (cms_rev1 >> 16) & 0xff,
+		       (cms_rev1 >> 8) & 0xff,
+		       cms_rev1 & 0xff,
+		       cms_rev2);
+	}
+	if ( max >= 0x80860006 ) {
+		cpuid(0x80860003,
+		      (void *)&cpu_info[0],
+		      (void *)&cpu_info[4],
+		      (void *)&cpu_info[8],
+		      (void *)&cpu_info[12]);
+		cpuid(0x80860004,
+		      (void *)&cpu_info[16],
+		      (void *)&cpu_info[20],
+		      (void *)&cpu_info[24],
+		      (void *)&cpu_info[28]);
+		cpuid(0x80860005,
+		      (void *)&cpu_info[32],
+		      (void *)&cpu_info[36],
+		      (void *)&cpu_info[40],
+		      (void *)&cpu_info[44]);
+		cpuid(0x80860006,
+		      (void *)&cpu_info[48],
+		      (void *)&cpu_info[52],
+		      (void *)&cpu_info[56],
+		      (void *)&cpu_info[60]);
+		cpu_info[64] = '\0';
+		printk("CPU: %s\n", cpu_info);
+	}
+
+	/* Unhide possibly hidden flags */
+	rdmsr(0x80860004, cap_mask, uk);
+	wrmsr(0x80860004, ~0, uk);
+	cpuid(0x00000001, &dummy, &dummy, &dummy, &c->x86_capability);
+	wrmsr(0x80860004, cap_mask, uk);
+}
+
+
 __initfunc(void get_cpu_vendor(struct cpuinfo_x86 *c))
 {
 	char *v = c->x86_vendor_id;
@@ -751,6 +837,10 @@
 		c->x86_vendor = X86_VENDOR_CENTAUR;
 	else if (!strcmp(v, "NexGenDriven"))
 		c->x86_vendor = X86_VENDOR_NEXGEN;
+	else if (!strcmp(v, "RiseRiseRise"))
+		c->x86_vendor = X86_VENDOR_RISE;
+	else if (!strcmp(v, "GenuineTMx86"))
+		c->x86_vendor = X86_VENDOR_TRANSMETA;
 	else
 		c->x86_vendor = X86_VENDOR_UNKNOWN;
 }
@@ -815,6 +905,18 @@
 	    c->cpuid_level < 0)
 		return;
 
+	/* It should be possible for the user to override this. */
+	if(c->cpuid_level > 0 && 
+	   (c->x86_vendor == X86_VENDOR_INTEL || c->x86_vendor == X86_VENDOR_TRANSMETA) &&
+	   c->x86_capability&(1<<18)) {
+		/* Disable processor serial number */
+		unsigned long lo,hi;
+		rdmsr(0x119,lo,hi);
+		lo |= 0x200000;
+		wrmsr(0x119,lo,hi);
+		printk(KERN_INFO "CPU serial number disabled.\n");
+	}
+
 	if (c->x86_vendor == X86_VENDOR_CYRIX) {
 		cyrix_model(c);
 		return;
@@ -823,18 +925,9 @@
 	if (c->x86_vendor == X86_VENDOR_AMD && amd_model(c))
 		return;
 		
-	if (c->cpuid_level > 0 && c->x86_vendor == X86_VENDOR_INTEL)
-	{
-		if(c->x86_capability&(1<<18))
-		{
-			/* Disable processor serial number on Intel Pentium III 
-			   from code by Phil Karn */
-			unsigned long lo,hi;
-			rdmsr(0x119,lo,hi);
-			lo |= 0x200000;
-			wrmsr(0x119,lo,hi);
-			printk(KERN_INFO "Pentium-III serial number disabled.\n");
-		}
+	if (c->x86_vendor == X86_VENDOR_TRANSMETA) {
+		transmeta_model(c);
+		return;
 	}
 
 	if (c->cpuid_level > 1) {
@@ -928,7 +1021,7 @@
 	
 
 static char *cpu_vendor_names[] __initdata = {
-	"Intel", "Cyrix", "AMD", "UMC", "NexGen", "Centaur" };
+	"Intel", "Cyrix", "AMD", "UMC", "NexGen", "Centaur", "Rise", "Transmeta" };
 
 
 __initfunc(void print_cpu_info(struct cpuinfo_x86 *c))
@@ -940,7 +1033,7 @@
 	else if (c->cpuid_level >= 0)
 		vendor = c->x86_vendor_id;
 
-	if (vendor)
+	if (vendor && strncmp(c->x86_model_id, vendor, strlen(vendor)))
 		printk("%s ", vendor);
 
 	if (!c->x86_model_id[0])
@@ -964,6 +1057,12 @@
 		/* Emulate MTRRs using Centaur's MCR. */
 		c->x86_capability |= X86_FEATURE_MTRR;
 
+		/* Disable TSC on C6 as per errata. */
+		if (c->x86_model ==4) {
+			printk ("Disabling bugged TSC.\n");
+			c->x86_capability &= ~X86_FEATURE_TSC;
+		}
+
 		/* Set 3DNow! on Winchip 2 and above. */
 		if (c->x86_model >=8)
 		    c->x86_capability |= X86_FEATURE_AMD3D;
@@ -1029,10 +1128,15 @@
 		    case X86_VENDOR_AMD:
 			if (c->x86 == 5 && c->x86_model == 6)
 				x86_cap_flags[10] = "sep";
-			x86_cap_flags[16] = "fcmov";
+			if (c->x86 < 6)
+				x86_cap_flags[16] = "fcmov";
+			x86_cap_flags[16] = "pat";
+			x86_cap_flags[22] = "mmxext";
+			x86_cap_flags[24] = "fxsr";
+			x86_cap_flags[30] = "3dnowext";
 			x86_cap_flags[31] = "3dnow";
 			break;
-
+																																										
 		    case X86_VENDOR_INTEL:
 			x86_cap_flags[6] = "pae";
 			x86_cap_flags[9] = "apic";
@@ -1050,8 +1154,8 @@
 			break;
 
 		    default:
-			/* Unknown CPU manufacturer. Transmeta ? :-) */
-			break;
+		        /* Unknown CPU manufacturer or no specal action needed */
+		        break;
 		}
 
 		sep_bug = c->x86_vendor == X86_VENDOR_INTEL &&
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/arch/i386/kernel/traps.c linux.17p9/arch/i386/kernel/traps.c
--- linux.vanilla/arch/i386/kernel/traps.c	Sun Jun 11 21:44:09 2000
+++ linux.17p9/arch/i386/kernel/traps.c	Thu Jun 15 15:24:43 2000
@@ -367,6 +367,9 @@
 
 	__asm__ __volatile__("movl %%db6,%0" : "=r" (condition));
 
+	/* Ensure the debug status register is visible to ptrace (or the process itself) */
+	tsk->tss.debugreg[6] = condition;
+
 	/* Mask out spurious TF errors due to lazy TF clearing */
 	if (condition & DR_STEP) {
 		/*
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/arch/ppc/boot/Makefile linux.17p9/arch/ppc/boot/Makefile
--- linux.vanilla/arch/ppc/boot/Makefile	Fri Apr 21 12:45:47 2000
+++ linux.17p9/arch/ppc/boot/Makefile	Tue Jun 20 22:51:24 2000
@@ -53,6 +53,9 @@
 
 OBJECTS := head.o misc.o ../coffboot/zlib.o
 CFLAGS = -O2 -DSTDC_HEADERS -fno-builtin -I$(TOPDIR)/include
+ifeq ($(CONFIG_SMP),y)
+CFLAGS += -D__SMP__
+endif
 OBJCOPY = $(CROSS_COMPILE)objcopy
 OBJCOPY_ARGS = -O elf32-powerpc
 
@@ -66,7 +69,7 @@
 zvmlinux.initrd: zvmlinux
 	$(LD) $(ZLINKFLAGS) -o zvmlinux.initrd.tmp $(OBJECTS)
 	$(OBJCOPY) $(OBJCOPY_ARGS) -R .comment \
-		--add-section=initrd=ramdisk.image.gz \
+		--add-section=initrd=../coffboot/ramdisk.image.gz \
 		--add-section=image=../coffboot/vmlinux.gz \
 		zvmlinux.initrd.tmp zvmlinux.initrd
 	$(CC) $(CFLAGS) -DINITRD_OFFSET=`sh offset $(OBJDUMP) zvmlinux.initrd initrd` \
@@ -76,7 +79,7 @@
 		-c -o misc.o misc.c
 	$(LD) $(ZLINKFLAGS) -o zvmlinux.initrd.tmp $(OBJECTS)
 	$(OBJCOPY) $(OBJCOPY_ARGS) -R .comment \
-		--add-section=initrd=ramdisk.image.gz \
+		--add-section=initrd=../coffboot/ramdisk.image.gz \
 		--add-section=image=../coffboot/vmlinux.gz \
 		zvmlinux.initrd.tmp $@
 	rm zvmlinux.initrd.tmp
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/arch/ppc/chrpboot/main.c linux.17p9/arch/ppc/chrpboot/main.c
--- linux.vanilla/arch/ppc/chrpboot/main.c	Fri Apr 21 12:45:47 2000
+++ linux.17p9/arch/ppc/chrpboot/main.c	Mon Jun 26 15:46:10 2000
@@ -17,15 +17,16 @@
 #define get_32be(x)	(*(unsigned *)(x))
 
 #define RAM_START	0x00000000
-#define RAM_END		(8<<20)
+#define RAM_END		(64<<20)
 
-#define RAM_FREE	((unsigned long)(_end+0x1000)&~0xFFF)
+#define BOOT_START	((unsigned long)_start)
+#define BOOT_END	((unsigned long)(_end + 0xFFF) & ~0xFFF)
 #define PROG_START	0x00010000
 
 char *avail_ram;
 char *end_avail;
 
-extern char _end[];
+extern char _start[], _end[];
 extern char image_data[];
 extern int image_len;
 extern char initrd_data[];
@@ -39,26 +40,31 @@
     void *dst;
     unsigned char *im;
     unsigned initrd_start, initrd_size;
-    extern char _start;
-    
-    printf("chrpboot starting: loaded at 0x%x\n\r", &_start);
+
+    printf("chrpboot starting: loaded at 0x%x\n\r", _start);
 
     if (initrd_len) {
 	initrd_size = initrd_len;
 	initrd_start = (RAM_END - initrd_size) & ~0xFFF;
 	a1 = initrd_start;
 	a2 = initrd_size;
-	printf("initial ramdisk moving 0x%x <- 0x%x (%x bytes)\n\r", initrd_start,
-	       initrd_data,initrd_size);
+	claim(initrd_start, RAM_END - initrd_start, 0);
+	printf("initial ramdisk moving 0x%x <- 0x%x (%x bytes)\n",
+	       initrd_start, initrd_data, initrd_size);
 	memcpy((char *)initrd_start, initrd_data, initrd_size);
-	end_avail = (char *)initrd_start;
-    } else
-	end_avail = (char *) RAM_END;
+    }
     im = image_data;
     len = image_len;
+    /* try and claim our text/data in case of OF bugs */
+    claim(BOOT_START, BOOT_END - BOOT_START, 0);
+    /* claim 4MB starting at PROG_START */
+    claim(PROG_START, (4<<20) - PROG_START, 0);
     dst = (void *) PROG_START;
     if (im[0] == 0x1f && im[1] == 0x8b) {
-	avail_ram = (char *)RAM_FREE;
+	/* claim 512kB for scratch space */
+	avail_ram = (char *) claim(0, 512 << 10, 0x10);
+	end_avail = avail_ram + (512 << 10);
+	printf("avail_ram = %x\n", avail_ram);
 	printf("gunzipping (0x%x <- 0x%x:0x%0x)...", dst, im, im+len);
 	gunzip(dst, 0x400000, im, &len);
 	printf("done %u bytes\n\r", len);
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/arch/ppc/chrpboot/misc.S linux.17p9/arch/ppc/chrpboot/misc.S
--- linux.vanilla/arch/ppc/chrpboot/misc.S	Fri Apr 21 12:45:47 2000
+++ linux.17p9/arch/ppc/chrpboot/misc.S	Tue Jun 20 22:51:24 2000
@@ -9,7 +9,7 @@
 	.text
 
 /*
- * Use the BAT0 registers to map the 1st 8MB of RAM to 0x90000000.
+ * Use the BAT0 registers to map the 1st 8 or 64MB of RAM to 0x90000000.
  */
 	.globl	setup_bats
 setup_bats:
@@ -21,7 +21,7 @@
 	ori	4,4,4			/* set up BAT registers for 601 */
 	li	5,0x7f
 	b	5f
-4:	ori	4,4,0xff		/* set up BAT registers for 604 */
+4:	ori	4,4,0x7ff		/* set up BAT registers for 604 */
 	li	5,2
 	mtdbatu	3,4
 	mtdbatl	3,5
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/arch/ppc/chrpboot/start.c linux.17p9/arch/ppc/chrpboot/start.c
--- linux.vanilla/arch/ppc/chrpboot/start.c	Fri Apr 21 12:45:47 2000
+++ linux.17p9/arch/ppc/chrpboot/start.c	Tue Jun 20 22:51:24 2000
@@ -131,6 +131,29 @@
     return args.phandle;
 }
 
+void *
+claim(unsigned int virt, unsigned int size, unsigned int align)
+{
+    struct prom_args {
+	char *service;
+	int nargs;
+	int nret;
+	unsigned int virt;
+	unsigned int size;
+	unsigned int align;
+	void *ret;
+    } args;
+
+    args.service = "claim";
+    args.nargs = 3;
+    args.nret = 1;
+    args.virt = virt;
+    args.size = size;
+    args.align = align;
+    (*prom)(&args);
+    return args.ret;
+}
+
 int
 getprop(void *phandle, const char *name, void *buf, int buflen)
 {
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/arch/ppc/coffboot/Makefile linux.17p9/arch/ppc/coffboot/Makefile
--- linux.vanilla/arch/ppc/coffboot/Makefile	Fri Apr 21 12:45:47 2000
+++ linux.17p9/arch/ppc/coffboot/Makefile	Mon Jun 26 15:46:10 2000
@@ -3,32 +3,32 @@
 #
 # Paul Mackerras	January 1997
 
-HOSTCC	= gcc
 HOSTCFLAGS = -O -I$(TOPDIR)/include
 
 CC	= $(CROSS_COMPILE)gcc
 LD	= $(CROSS_COMPILE)ld
-CFLAGS	= -O -fno-builtin -I$(TOPDIR)/include
+CFLAGS	= $(CPPFLAGS) -O -fno-builtin
 OBJCOPY = $(CROSS_COMPILE)objcopy
-OBJCOPY_ARGS = -O aixcoff-rs6000 -R .stab -R .stabstr -R .comment \
-	--add-section=image=vmlinux.gz
-LD_ARGS = -e _start -T ld.script -Ttext 500000 -Tdata 510000 -Bstatic
+OBJCOPY_ARGS = -O aixcoff-rs6000 -R .stab -R .stabstr -R .comment
+COFF_LD_ARGS = -e _start -T ld.script -Ttext 500000 -Tdata 510000 -Bstatic
+CHRP_LD_ARGS = -Ttext 0x00400000
 GZ = gzip -9
 
-OBJS = crt0.o start.o main.o misc.o string.o zlib.o
+COFFOBJS = coffcrt0.o start.o coffmain.o misc.o string.o zlib.o image.o
+CHRPOBJS = crt0.o start.o chrpmain.o misc.o string.o zlib.o image.o
 LIBS = $(TOPDIR)/lib/lib.a
 
-ifeq ($(CONFIG_ALL_PPC),y)
-# yes, we want to build pmac stuff
-CONFIG_PMAC = y
-endif
-
 ifeq ($(CONFIG_PPC64),y)
 MSIZE=.64
 else
 MSIZE=
 endif
 
+ifeq ($(CONFIG_ALL_PPC),y)
+# yes, we want to build pmac stuff
+CONFIG_PMAC = y
+endif
+
 ifeq ($(CONFIG_SMP),y)
 TFTPIMAGE=/tftpboot/zImage.pmac.smp$(MSIZE)
 else
@@ -39,39 +39,81 @@
 hack-coff: hack-coff.c
 	$(HOSTCC) $(HOSTCFLAGS) -o hack-coff hack-coff.c
 
+znetboot: vmlinux.coff zImage vmlinux.elf
+	cp vmlinux.coff $(TFTPIMAGE)
+	cp vmlinux.elf $(TFTPIMAGE).elf
+
+znetboot.initrd: vmlinux.coff.initrd
+	cp vmlinux.coff.initrd $(TFTPIMAGE)
+	cp vmlinux.elf.initrd $(TFTPIMAGE).elf
+
 floppy: zImage
 #	mount -t hfs /dev/fd0 /mnt
 #	cp vmlinux.coff /mnt
 #	umount /mnt
 
-znetboot: vmlinux.coff
-	cp vmlinux.coff $(TFTPIMAGE)
+coffboot: $(COFFOBJS) no_initrd.o ld.script
+	$(LD) -o $@ $(COFF_LD_ARGS) $(COFFOBJS) no_initrd.o $(LIBS)
 
-znetboot.initrd: vmlinux.coff.initrd
-	cp vmlinux.coff.initrd $(TFTPIMAGE)
+coffboot.initrd: $(COFFOBJS) initrd.o ld.script
+	$(LD) -o $@ $(COFF_LD_ARGS) $(COFFOBJS) initrd.o $(LIBS)
+
+piggyback: piggyback.c
+	$(HOSTCC) $(HOSTCFLAGS) -DKERNELBASE=$(KERNELBASE) -o piggyback piggyback.c
 
-coffboot: $(OBJS) ld.script
-	$(LD) -o coffboot $(LD_ARGS) $(OBJS) $(LIBS)
+mknote: mknote.c
+	$(HOSTCC) $(HOSTCFLAGS) -o mknote mknote.c
 
-zImage: vmlinux.coff
+image.o: piggyback vmlinux.gz
+	./piggyback image < vmlinux.gz | $(AS) -o image.o
 
-zImage.initrd: vmlinux.coff.initrd
+initrd.o: ramdisk.image.gz piggyback
+	./piggyback initrd < ramdisk.image.gz | $(AS) -o initrd.o
 
-vmlinux.coff: coffboot hack-coff vmlinux.gz
+vmlinux.coff: coffboot hack-coff
 	$(OBJCOPY) $(OBJCOPY_ARGS) coffboot $@
 	./hack-coff $@
 	ln -sf vmlinux.coff zImage
 
-vmlinux.coff.initrd: coffboot hack-coff vmlinux.gz ramdisk.image.gz
-	$(OBJCOPY) $(OBJCOPY_ARGS) --add-section=initrd=ramdisk.image.gz \
-		coffboot $@
+vmlinux.coff.initrd: coffboot.initrd hack-coff
+	$(OBJCOPY) $(OBJCOPY_ARGS) coffboot $@
 	./hack-coff $@
 
+vmlinux.elf: $(CHRPOBJS) no_initrd.o mknote
+	$(LD) $(CHRP_LD_ARGS) -o $@ $(CHRPOBJS) no_initrd.o $(LIBS)
+	./mknote > note
+	$(OBJCOPY) $@ $@ --add-section=.note=note -R .comment
+
+vmlinux.elf.initrd: $(CHRPOBJS) initrd.o mknote
+	$(LD) $(CHRP_LD_ARGS) -o $@ $(CHRPOBJS) initrd.o $(LIBS)
+	./mknote > note
+	$(OBJCOPY) $@ $@ --add-section=.note=note -R .comment
+
+micoffboot: dummy.o
+	$(LD) -o $@ $(COFF_LD_ARGS) dummy.o $(LIBS)
+
+miboot.image: micoffboot hack-coff vmlinux.gz
+	$(OBJCOPY) $(OBJCOPY_ARGS) --add-section=image=vmlinux.gz micoffboot $@
+	./hack-coff $@
+
+miboot.image.initrd: micoffboot hack-coff vmlinux.gz ramdisk.image.gz
+	$(OBJCOPY) $(OBJCOPY_ARGS) --add-section=image=vmlinux.gz \
+	--add-section=initrd=ramdisk.image.gz micoffboot $@
+	./hack-coff $@
+
+zImage: vmlinux.coff vmlinux.elf miboot.image
+
+zImage.initrd: vmlinux.coff.initrd vmlinux.elf.initrd miboot.image.initrd
+
 else
 znetboot: vmlinux.gz
 
 znetboot.initrd: vmlinux.gz
 
+miboot.image: vmlinux.gz
+
+miboot.image.initrd: vmlinux.gz
+
 coffboot: vmlinux.gz
 
 zImage: vmlinux.gz
@@ -92,5 +134,7 @@
 
 clean:
 	rm -f hack-coff coffboot zImage vmlinux.coff vmlinux.gz
+	rm -f mknote piggyback vmlinux.elf note
+	rm -f micoffboot miboot.image
 
 fastdep:
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/arch/ppc/coffboot/chrpmain.c linux.17p9/arch/ppc/coffboot/chrpmain.c
--- linux.vanilla/arch/ppc/coffboot/chrpmain.c	Thu Jan  1 01:00:00 1970
+++ linux.17p9/arch/ppc/coffboot/chrpmain.c	Fri Jun 16 16:24:33 2000
@@ -0,0 +1,209 @@
+/*
+ * Copyright (C) Paul Mackerras 1997.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version
+ * 2 of the License, or (at your option) any later version.
+ */
+#include "nonstdio.h"
+#include "zlib.h"
+
+extern void *finddevice(const char *);
+extern int getprop(void *, const char *, void *, int);
+void gunzip(void *, int, unsigned char *, int *);
+void stop_imac_ethernet(void);
+void stop_imac_usb(void);
+
+#define get_16be(x)	(*(unsigned short *)(x))
+#define get_32be(x)	(*(unsigned *)(x))
+
+#define RAM_START	0x00000000
+#define RAM_END		(8<<20)
+
+#define PROG_START	0x00010000
+
+char *avail_ram;
+char *end_avail;
+
+extern char _end[];
+extern char image_data[];
+extern int image_len;
+extern char initrd_data[];
+extern int initrd_len;
+
+
+boot(int a1, int a2, void *prom)
+{
+    int ns, oh, i;
+    unsigned sa, len;
+    void *dst;
+    unsigned char *im;
+    unsigned initrd_start, initrd_size;
+    extern char _start;
+    
+    printf("chrpboot starting: loaded at 0x%x\n", &_start);
+    if (initrd_len) {
+	initrd_size = initrd_len;
+	initrd_start = (RAM_END - initrd_size) & ~0xFFF;
+	a1 = initrd_start;
+	a2 = initrd_size;
+	claim(initrd_start, RAM_END - initrd_start, 0);
+	printf("initial ramdisk moving 0x%x <- 0x%x (%x bytes)\n",
+	       initrd_start, initrd_data, initrd_size);
+	memcpy((char *)initrd_start, initrd_data, initrd_size);
+    }
+    im = image_data;
+    len = image_len;
+    /* claim 3MB starting at PROG_START */
+    claim(PROG_START, 3 << 20, 0);
+    dst = (void *) PROG_START;
+    if (im[0] == 0x1f && im[1] == 0x8b) {
+	/* claim 512kB for scratch space */
+	avail_ram = (char *) claim(0, 512 << 10, 0x10);
+	end_avail = avail_ram + (512 << 10);
+	printf("avail_ram = %x\n", avail_ram);
+	printf("gunzipping (0x%x <- 0x%x:0x%0x)...", dst, im, im+len);
+	gunzip(dst, 3 << 20, im, &len);
+	printf("done %u bytes\n", len);
+    } else {
+	memmove(dst, im, len);
+    }
+
+    flush_cache(dst, len);
+    stop_imac_ethernet();
+    stop_imac_usb();
+
+    sa = (unsigned long)PROG_START;
+    printf("start address = 0x%x\n", sa);
+
+    (*(void (*)())sa)(a1, a2, prom);
+
+    printf("returned?\n");
+
+    pause();
+}
+
+#define eieio()	asm volatile("eieio");
+
+void stop_imac_ethernet(void)
+{
+    void *macio, *enet;
+    unsigned int macio_addr[5], enet_reg[6];
+    int len;
+    volatile unsigned int *dbdma;
+
+    macio = finddevice("/pci/mac-io");
+    enet = finddevice("/pci/mac-io/ethernet");
+    if (macio == NULL || enet == NULL)
+	return;
+    len = getprop(macio, "assigned-addresses", macio_addr, sizeof(macio_addr));
+    if (len != sizeof(macio_addr))
+	return;
+    len = getprop(enet, "reg", enet_reg, sizeof(enet_reg));
+    if (len != sizeof(enet_reg))
+	return;
+    printf("macio base %x, dma at %x & %x\n",
+	   macio_addr[2], enet_reg[2], enet_reg[4]);
+
+    /* hope this is mapped... */
+    dbdma = (volatile unsigned int *) (macio_addr[2] + enet_reg[2]);
+    *dbdma = 0x80;	/* clear the RUN bit */
+    eieio();
+    dbdma = (volatile unsigned int *) (macio_addr[2] + enet_reg[4]);
+    *dbdma = 0x80;	/* clear the RUN bit */
+    eieio();
+}
+
+void stop_imac_usb(void)
+{
+    void *usb;
+    unsigned int usb_addr[5];
+    int len;
+    volatile unsigned int *usb_ctrl;
+
+    usb = finddevice("/pci/usb");
+    if (usb == NULL)
+	return;
+    len = getprop(usb, "assigned-addresses", usb_addr, sizeof(usb_addr));
+    if (len != sizeof(usb_addr))
+	return;
+    printf("usb base %x\n", usb_addr[2]);
+
+    usb_ctrl = (volatile unsigned int *) (usb_addr[2] + 8);
+    *usb_ctrl = 0x01000000;	/* cpu_to_le32(1) */
+    eieio();
+}
+
+void *zalloc(void *x, unsigned items, unsigned size)
+{
+    void *p = avail_ram;
+
+    size *= items;
+    size = (size + 7) & -8;
+    avail_ram += size;
+    if (avail_ram > end_avail) {
+	printf("oops... out of memory\n");
+	pause();
+    }
+    return p;
+}
+
+void zfree(void *x, void *addr, unsigned nb)
+{
+}
+
+#define HEAD_CRC	2
+#define EXTRA_FIELD	4
+#define ORIG_NAME	8
+#define COMMENT		0x10
+#define RESERVED	0xe0
+
+#define DEFLATED	8
+
+void gunzip(void *dst, int dstlen, unsigned char *src, int *lenp)
+{
+    z_stream s;
+    int r, i, flags;
+
+    /* skip header */
+    i = 10;
+    flags = src[3];
+    if (src[2] != DEFLATED || (flags & RESERVED) != 0) {
+	printf("bad gzipped data\n");
+	exit();
+    }
+    if ((flags & EXTRA_FIELD) != 0)
+	i = 12 + src[10] + (src[11] << 8);
+    if ((flags & ORIG_NAME) != 0)
+	while (src[i++] != 0)
+	    ;
+    if ((flags & COMMENT) != 0)
+	while (src[i++] != 0)
+	    ;
+    if ((flags & HEAD_CRC) != 0)
+	i += 2;
+    if (i >= *lenp) {
+	printf("gunzip: ran out of data in header\n");
+	exit();
+    }
+
+    s.zalloc = zalloc;
+    s.zfree = zfree;
+    r = inflateInit2(&s, -MAX_WBITS);
+    if (r != Z_OK) {
+	printf("inflateInit2 returned %d\n", r);
+	exit();
+    }
+    s.next_in = src + i;
+    s.avail_in = *lenp - i;
+    s.next_out = dst;
+    s.avail_out = dstlen;
+    r = inflate(&s, Z_FINISH);
+    if (r != Z_OK && r != Z_STREAM_END) {
+	printf("inflate returned %d msg: %s\n", r, s.msg);
+	exit();
+    }
+    *lenp = s.next_out - (unsigned char *) dst;
+    inflateEnd(&s);
+}
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/arch/ppc/coffboot/coffcrt0.S linux.17p9/arch/ppc/coffboot/coffcrt0.S
--- linux.vanilla/arch/ppc/coffboot/coffcrt0.S	Thu Jan  1 01:00:00 1970
+++ linux.17p9/arch/ppc/coffboot/coffcrt0.S	Fri Jun 16 16:24:33 2000
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) Paul Mackerras 1997.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version
+ * 2 of the License, or (at your option) any later version.
+ */
+	.text
+	.globl	_start
+_start:
+	.long	__start,0,0
+
+	.globl	__start
+__start:
+	lis	9,_start@h
+	lis	8,_etext@ha
+	addi	8,8,_etext@l
+1:	dcbf	0,9
+	icbi	0,9
+	addi	9,9,0x20
+	cmplwi	0,9,8
+	blt	1b
+	b	start
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/arch/ppc/coffboot/coffmain.c linux.17p9/arch/ppc/coffboot/coffmain.c
--- linux.vanilla/arch/ppc/coffboot/coffmain.c	Thu Jan  1 01:00:00 1970
+++ linux.17p9/arch/ppc/coffboot/coffmain.c	Fri Jun 16 16:24:33 2000
@@ -0,0 +1,157 @@
+/*
+ * Copyright (C) Paul Mackerras 1997.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version
+ * 2 of the License, or (at your option) any later version.
+ */
+#include "nonstdio.h"
+#include "zlib.h"
+
+extern void *finddevice(const char *);
+extern int getprop(void *, const char *, void *, int);
+extern char *claim(unsigned, unsigned, unsigned);
+void gunzip(void *, int, unsigned char *, int *);
+
+#define get_16be(x)	(*(unsigned short *)(x))
+#define get_32be(x)	(*(unsigned *)(x))
+
+#define RAM_START	0xc0000000
+#define PROG_START	RAM_START
+#define RAM_END		(RAM_START + 0x800000)	/* only 8M mapped with BATs */
+
+char *avail_ram;
+char *end_avail;
+
+extern char _start[], _end[];
+extern char image_data[];
+extern int image_len;
+extern char initrd_data[];
+extern int initrd_len;
+
+
+boot(int a1, int a2, void *prom)
+{
+    int ns, oh, i;
+    unsigned sa, len;
+    void *dst;
+    unsigned char *im;
+    unsigned initrd_start, initrd_size;
+    
+    printf("coffboot starting: loaded at 0x%x\n", _start);
+    setup_bats(RAM_START);
+    if (initrd_len) {
+	initrd_size = initrd_len;
+	initrd_start = (RAM_END - initrd_size) & ~0xFFF;
+	a1 = initrd_start;
+	a2 = initrd_size;
+	claim(initrd_start - RAM_START, RAM_END - initrd_start, 0);
+	printf("initial ramdisk moving 0x%x <- 0x%x (%x bytes)\n",
+	       initrd_start, initrd_data, initrd_size);
+	memcpy((char *)initrd_start, initrd_data, initrd_size);
+    }
+    im = image_data;
+    len = image_len;
+    /* claim 3MB starting at 0 */
+    claim(0, 3 << 20, 0);
+    dst = (void *) RAM_START;
+    if (im[0] == 0x1f && im[1] == 0x8b) {
+	/* claim 512kB for scratch space */
+	avail_ram = claim(0, 512 << 10, 0x10) + RAM_START;
+	end_avail = avail_ram + (512 << 10);
+	printf("avail_ram = %x\n", avail_ram);
+	printf("gunzipping (0x%x <- 0x%x:0x%0x)...", dst, im, im+len);
+	gunzip(dst, 3 << 20, im, &len);
+	printf("done %u bytes\n", len);
+    } else {
+	memmove(dst, im, len);
+    }
+
+    flush_cache(dst, len);
+    
+    sa = (unsigned long)PROG_START;
+    printf("start address = 0x%x\n", sa);
+
+#if 0
+    pause();
+#endif
+    (*(void (*)())sa)(a1, a2, prom);
+
+    printf("returned?\n");
+
+    pause();
+}
+
+void *zalloc(void *x, unsigned items, unsigned size)
+{
+    void *p = avail_ram;
+
+    size *= items;
+    size = (size + 7) & -8;
+    avail_ram += size;
+    if (avail_ram > end_avail) {
+	printf("oops... out of memory\n");
+	pause();
+    }
+    return p;
+}
+
+void zfree(void *x, void *addr, unsigned nb)
+{
+}
+
+#define HEAD_CRC	2
+#define EXTRA_FIELD	4
+#define ORIG_NAME	8
+#define COMMENT		0x10
+#define RESERVED	0xe0
+
+#define DEFLATED	8
+
+void gunzip(void *dst, int dstlen, unsigned char *src, int *lenp)
+{
+    z_stream s;
+    int r, i, flags;
+
+    /* skip header */
+    i = 10;
+    flags = src[3];
+    if (src[2] != DEFLATED || (flags & RESERVED) != 0) {
+	printf("bad gzipped data\n");
+	exit();
+    }
+    if ((flags & EXTRA_FIELD) != 0)
+	i = 12 + src[10] + (src[11] << 8);
+    if ((flags & ORIG_NAME) != 0)
+	while (src[i++] != 0)
+	    ;
+    if ((flags & COMMENT) != 0)
+	while (src[i++] != 0)
+	    ;
+    if ((flags & HEAD_CRC) != 0)
+	i += 2;
+    if (i >= *lenp) {
+	printf("gunzip: ran out of data in header\n");
+	exit();
+    }
+
+    s.zalloc = zalloc;
+    s.zfree = zfree;
+    r = inflateInit2(&s, -MAX_WBITS);
+    if (r != Z_OK) {
+	printf("inflateInit2 returned %d\n", r);
+	exit();
+    }
+    s.next_in = src + i;
+    s.avail_in = *lenp - i;
+    s.next_out = dst;
+    s.avail_out = dstlen;
+    r = inflate(&s, Z_FINISH);
+    if (r != Z_OK && r != Z_STREAM_END) {
+	printf("inflate returned %d msg: %s\n", r, s.msg);
+	exit();
+    }
+    *lenp = s.next_out - (unsigned char *) dst;
+    inflateEnd(&s);
+}
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/arch/ppc/coffboot/crt0.S linux.17p9/arch/ppc/coffboot/crt0.S
--- linux.vanilla/arch/ppc/coffboot/crt0.S	Fri Apr 21 12:45:47 2000
+++ linux.17p9/arch/ppc/coffboot/crt0.S	Fri Jun 16 16:24:33 2000
@@ -9,10 +9,6 @@
 	.text
 	.globl	_start
 _start:
-	.long	__start,0,0
-
-	.globl	__start
-__start:
 	lis	9,_start@h
 	lis	8,_etext@ha
 	addi	8,8,_etext@l
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/arch/ppc/coffboot/dummy.c linux.17p9/arch/ppc/coffboot/dummy.c
--- linux.vanilla/arch/ppc/coffboot/dummy.c	Thu Jan  1 01:00:00 1970
+++ linux.17p9/arch/ppc/coffboot/dummy.c	Tue Jun 20 22:51:24 2000
@@ -0,0 +1,4 @@
+int main(void)
+{
+	return 0;
+}
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/arch/ppc/coffboot/misc.S linux.17p9/arch/ppc/coffboot/misc.S
--- linux.vanilla/arch/ppc/coffboot/misc.S	Fri Apr 21 12:45:47 2000
+++ linux.17p9/arch/ppc/coffboot/misc.S	Fri Jun 16 16:24:33 2000
@@ -14,23 +14,26 @@
  */
 	.globl	setup_bats
 setup_bats:
-	mr	4,3
-	mfpvr	3
-	rlwinm	3,3,16,16,31		/* r3 = 1 for 601, 4 for 604 */
-	cmpi	0,3,1
+	mfpvr	5
+	rlwinm	5,5,16,16,31		/* r3 = 1 for 601, 4 for 604 */
+	cmpi	0,5,1
+	li	0,0
 	bne	4f
-	ori	4,4,4			/* set up BAT registers for 601 */
-	li	5,0x7f
-	mtibatu	3,4
-	mtibatl	3,5
-	isync
-	blr
-4:	ori	4,4,0xfe		/* set up BAT registers for 604 */
-	li	5,2
-	mtdbatl	3,5
-	mtdbatu	3,4
-	mtibatl	3,5
-	mtibatu	3,4
+	mtibatl	3,0			/* invalidate BAT first */
+	ori	3,3,4			/* set up BAT registers for 601 */
+	li	4,0x7f
+	mtibatu	3,3
+	mtibatl	3,4
+	b	5f
+4:	mtdbatu	3,0			/* invalidate BATs first */
+	mtibatu	3,0
+	ori	3,3,0xff		/* set up BAT registers for 604 */
+	li	4,2
+	mtdbatl	3,4
+	mtdbatu	3,3
+	mtibatl	3,4
+	mtibatu	3,3
+5:	sync
 	isync
 	blr
 
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/arch/ppc/coffboot/mknote.c linux.17p9/arch/ppc/coffboot/mknote.c
--- linux.vanilla/arch/ppc/coffboot/mknote.c	Thu Jan  1 01:00:00 1970
+++ linux.17p9/arch/ppc/coffboot/mknote.c	Fri Jun 16 16:24:33 2000
@@ -0,0 +1,43 @@
+/*
+ * Copyright (C) Cort Dougan 1999.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version
+ * 2 of the License, or (at your option) any later version.
+ *
+ * Generate a note section as per the CHRP specification.
+ *
+ */
+
+#include <stdio.h>
+
+#define PL(x) printf("%c%c%c%c", ((x)>>24)&0xff, ((x)>>16)&0xff, ((x)>>8)&0xff, (x)&0xff );
+
+int main(void)
+{
+/* header */
+	/* namesz */
+	PL(strlen("PowerPC")+1);
+	/* descrsz */
+	PL(6*4);
+	/* type */
+	PL(0x1275);
+	/* name */
+	printf("PowerPC"); printf("%c", 0);
+	
+/* descriptor */
+	/* real-mode */
+	PL(0xffffffff);
+	/* real-base */
+	PL(0x00c00000);
+	/* real-size */
+	PL(0xffffffff);
+	/* virt-base */
+	PL(0xffffffff);
+	/* virt-size */
+	PL(0xffffffff);
+	/* load-base */
+	PL(0x4000);
+	return 0;
+}
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/arch/ppc/coffboot/no_initrd.c linux.17p9/arch/ppc/coffboot/no_initrd.c
--- linux.vanilla/arch/ppc/coffboot/no_initrd.c	Thu Jan  1 01:00:00 1970
+++ linux.17p9/arch/ppc/coffboot/no_initrd.c	Fri Jun 16 16:24:33 2000
@@ -0,0 +1,2 @@
+char initrd_data[1];
+int initrd_len = 0;
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/arch/ppc/coffboot/piggyback.c linux.17p9/arch/ppc/coffboot/piggyback.c
--- linux.vanilla/arch/ppc/coffboot/piggyback.c	Thu Jan  1 01:00:00 1970
+++ linux.17p9/arch/ppc/coffboot/piggyback.c	Fri Jun 16 16:24:33 2000
@@ -0,0 +1,65 @@
+#include <stdio.h>
+
+extern long ce_exec_config[];
+
+main(int argc, char *argv[])
+{
+	int i, cnt, pos, len;
+	unsigned int cksum, val;
+	unsigned char *lp;
+	unsigned char buf[8192];
+	if (argc != 2)
+	{
+		fprintf(stderr, "usage: %s name <in-file >out-file\n",
+			argv[0]);
+		exit(1);
+	}
+	fprintf(stdout, "#\n");
+	fprintf(stdout, "# Miscellaneous data structures:\n");
+	fprintf(stdout, "# WARNING - this file is automatically generated!\n");
+	fprintf(stdout, "#\n");
+	fprintf(stdout, "\n");
+	fprintf(stdout, "\t.data\n");
+	fprintf(stdout, "\t.globl %s_data\n", argv[1]);
+	fprintf(stdout, "%s_data:\n", argv[1]);
+	pos = 0;
+	cksum = 0;
+	while ((len = read(0, buf, sizeof(buf))) > 0)
+	{
+		cnt = 0;
+		lp = (unsigned char *)buf;
+		len = (len + 3) & ~3;  /* Round up to longwords */
+		for (i = 0;  i < len;  i += 4)
+		{
+			if (cnt == 0)
+			{
+				fprintf(stdout, "\t.long\t");
+			}
+			fprintf(stdout, "0x%02X%02X%02X%02X", lp[0], lp[1], lp[2], lp[3]);
+			val = *(unsigned long *)lp;
+			cksum ^= val;
+			lp += 4;
+			if (++cnt == 4)
+			{
+				cnt = 0;
+				fprintf(stdout, " # %x \n", pos+i-12);
+				fflush(stdout);
+			} else
+			{
+				fprintf(stdout, ",");
+			}
+		}
+		if (cnt)
+		{
+			fprintf(stdout, "0\n");
+		}
+		pos += len;
+	}
+	fprintf(stdout, "\t.globl %s_len\n", argv[1]);
+	fprintf(stdout, "%s_len:\t.long\t0x%x\n", argv[1], pos);
+	fflush(stdout);
+	fclose(stdout);
+	fprintf(stderr, "cksum = %x\n", cksum);
+	exit(0);
+}
+
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/arch/ppc/coffboot/start.c linux.17p9/arch/ppc/coffboot/start.c
--- linux.vanilla/arch/ppc/coffboot/start.c	Fri Apr 21 12:45:47 2000
+++ linux.17p9/arch/ppc/coffboot/start.c	Fri Jun 16 16:24:33 2000
@@ -33,7 +33,7 @@
     if (getprop(chosen_handle, "stdin", &stdin, sizeof(stdin)) != 4)
 	exit();
 
-    coffboot(a1, a2, promptr);
+    boot(a1, a2, promptr);
     for (;;)
 	exit();
 }
@@ -62,6 +62,25 @@
     return args.actual;
 }
 
+int writestring(void *f, char *ptr, int nb)
+{
+	int w = 0, i;
+	char *ret = "\r";
+
+	for (i = 0; i < nb; ++i) {
+		if (ptr[i] == '\n') {
+			if (i > w) {
+				write(f, ptr + w, i - w);
+				w = i;
+			}
+			write(f, ret, 1);
+		}
+	}
+	if (w < nb)
+		write(f, ptr + w, nb - w);
+	return nb;
+}
+
 int
 read(void *handle, void *ptr, int nb)
 {
@@ -130,6 +149,29 @@
     return args.phandle;
 }
 
+void *
+claim(unsigned int virt, unsigned int size, unsigned int align)
+{
+    struct prom_args {
+	char *service;
+	int nargs;
+	int nret;
+	unsigned int virt;
+	unsigned int size;
+	unsigned int align;
+	void *ret;
+    } args;
+
+    args.service = "claim";
+    args.nargs = 3;
+    args.nret = 1;
+    args.virt = virt;
+    args.size = size;
+    args.align = align;
+    (*prom)(&args);
+    return args.ret;
+}
+
 int
 getprop(void *phandle, const char *name, void *buf, int buflen)
 {
@@ -161,9 +203,7 @@
 {
     char ch = c;
 
-    if (c == '\n')
-	putc('\r', f);
-    return write(f, &ch, 1) == 1? c: -1;
+    return writestring(f, &ch, 1) == 1? c: -1;
 }
 
 int
@@ -177,7 +217,7 @@
 {
     int n = strlen(str);
 
-    return write(f, str, n) == n? 0: -1;
+    return writestring(f, str, n) == n? 0: -1;
 }
 
 int
@@ -190,7 +230,7 @@
 	case 1:
 	    return ch;
 	case -1:
-	    printk("read(stdin) returned -1\r\n");
+	    printk("read(stdin) returned -1\n");
 	    return -1;
 	}
     }
@@ -264,7 +304,7 @@
 	va_start(args, fmt);
 	n = vsprintf(sprint_buf, fmt, args);
 	va_end(args);
-	write(stdout, sprint_buf, n);
+	writestring(stdout, sprint_buf, n);
 }
 
 int
@@ -276,6 +316,6 @@
 	va_start(args, fmt);
 	n = vsprintf(sprint_buf, fmt, args);
 	va_end(args);
-	write(stdout, sprint_buf, n);
+	writestring(stdout, sprint_buf, n);
 	return n;
 }
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/arch/ppc/common_defconfig linux.17p9/arch/ppc/common_defconfig
--- linux.vanilla/arch/ppc/common_defconfig	Fri Apr 21 12:45:47 2000
+++ linux.17p9/arch/ppc/common_defconfig	Fri Jun 16 16:24:33 2000
@@ -1,5 +1,5 @@
 #
-# Automatically generated by make menuconfig: don't edit
+# Automatically generated make config: don't edit
 #
 
 #
@@ -7,15 +7,16 @@
 #
 CONFIG_PPC=y
 CONFIG_6xx=y
+# CONFIG_PPC64 is not set
 # CONFIG_8xx is not set
-# CONFIG_PMAC is not set
+CONFIG_PMAC=y
 # CONFIG_PREP is not set
 # CONFIG_CHRP is not set
-CONFIG_ALL_PPC=y
+# CONFIG_ALL_PPC is not set
 # CONFIG_APUS is not set
-# CONFIG_GEMINI is not set
 # CONFIG_MBX is not set
 # CONFIG_SMP is not set
+CONFIG_MACH_SPECIFIC=y
 CONFIG_6xx=y
 
 #
@@ -23,7 +24,7 @@
 #
 CONFIG_EXPERIMENTAL=y
 CONFIG_MODULES=y
-CONFIG_MODVERSIONS=y
+# CONFIG_MODVERSIONS is not set
 CONFIG_KMOD=y
 CONFIG_PCI=y
 # CONFIG_PCI_QUIRKS is not set
@@ -34,10 +35,11 @@
 # CONFIG_BSD_PROCESS_ACCT is not set
 CONFIG_BINFMT_ELF=y
 CONFIG_KERNEL_ELF=y
-# CONFIG_BINFMT_MISC is not set
+CONFIG_BINFMT_MISC=m
 # CONFIG_BINFMT_JAVA is not set
-# CONFIG_PARPORT is not set
-CONFIG_VGA_CONSOLE=y
+CONFIG_PARPORT=m
+# CONFIG_PARPORT_PC is not set
+# CONFIG_VGA_CONSOLE is not set
 CONFIG_FB=y
 CONFIG_FB_COMPAT_XPMAC=y
 CONFIG_PMAC_PBOOK=y
@@ -50,7 +52,6 @@
 # CONFIG_TOTALMP is not set
 CONFIG_BOOTX_TEXT=y
 # CONFIG_MOTOROLA_HOTSWAP is not set
-# CONFIG_CMDLINE_BOOL is not set
 
 #
 # Plug and Play support
@@ -60,8 +61,12 @@
 #
 # Block devices
 #
-CONFIG_BLK_DEV_FD=y
+# CONFIG_BLK_DEV_FD is not set
 CONFIG_BLK_DEV_IDE=y
+
+#
+# Please see Documentation/ide.txt for help/info on IDE drives
+#
 # CONFIG_BLK_DEV_HD_IDE is not set
 CONFIG_BLK_DEV_IDEDISK=y
 CONFIG_BLK_DEV_IDECD=y
@@ -70,13 +75,25 @@
 # CONFIG_BLK_DEV_IDESCSI is not set
 # CONFIG_BLK_DEV_CMD640 is not set
 # CONFIG_BLK_DEV_RZ1000 is not set
-# CONFIG_BLK_DEV_IDEPCI is not set
-CONFIG_BLK_DEV_SL82C105=y
+CONFIG_BLK_DEV_IDEPCI=y
+CONFIG_BLK_DEV_IDEDMA=y
+# CONFIG_BLK_DEV_OFFBOARD is not set
+CONFIG_IDEDMA_AUTO=y
+# CONFIG_BLK_DEV_OPTI621 is not set
+# CONFIG_BLK_DEV_TRM290 is not set
+# CONFIG_BLK_DEV_NS87415 is not set
+# CONFIG_BLK_DEV_VIA82C586 is not set
+CONFIG_BLK_DEV_CMD646=y
+# CONFIG_BLK_DEV_SL82C105 is not set
 CONFIG_BLK_DEV_IDE_PMAC=y
 CONFIG_BLK_DEV_IDEDMA_PMAC=y
 CONFIG_BLK_DEV_IDEDMA=y
 CONFIG_PMAC_IDEDMA_AUTO=y
 # CONFIG_IDE_CHIPSETS is not set
+
+#
+# Additional Block Devices
+#
 CONFIG_BLK_DEV_LOOP=y
 # CONFIG_BLK_DEV_NBD is not set
 # CONFIG_BLK_DEV_MD is not set
@@ -84,7 +101,7 @@
 CONFIG_BLK_DEV_INITRD=y
 # CONFIG_BLK_DEV_XD is not set
 # CONFIG_BLK_DEV_DAC960 is not set
-CONFIG_PARIDE_PARPORT=y
+CONFIG_PARIDE_PARPORT=m
 # CONFIG_PARIDE is not set
 # CONFIG_BLK_CPQ_DA is not set
 # CONFIG_BLK_DEV_HD is not set
@@ -108,10 +125,18 @@
 # CONFIG_NET_IPGRE is not set
 # CONFIG_IP_MROUTE is not set
 CONFIG_IP_ALIAS=y
-CONFIG_SYN_COOKIES=y
+# CONFIG_SYN_COOKIES is not set
+
+#
+# (it is safe to leave these untouched)
+#
 CONFIG_INET_RARP=y
 CONFIG_SKB_LARGE=y
 # CONFIG_IPV6 is not set
+
+#
+#  
+#
 # CONFIG_IPX is not set
 CONFIG_ATALK=m
 # CONFIG_X25 is not set
@@ -133,11 +158,19 @@
 # SCSI support
 #
 CONFIG_SCSI=y
+
+#
+# SCSI support type (disk, tape, CD-ROM)
+#
 CONFIG_BLK_DEV_SD=y
 CONFIG_CHR_DEV_ST=y
 CONFIG_BLK_DEV_SR=y
 CONFIG_BLK_DEV_SR_VENDOR=y
-CONFIG_CHR_DEV_SG=y
+# CONFIG_CHR_DEV_SG is not set
+
+#
+# Some SCSI devices (e.g. CD jukebox) support multiple LUNs
+#
 # CONFIG_SCSI_MULTI_LUN is not set
 CONFIG_SCSI_CONSTANTS=y
 # CONFIG_SCSI_LOGGING is not set
@@ -155,7 +188,6 @@
 CONFIG_AIC7XXX_CMDS_PER_DEVICE=8
 CONFIG_AIC7XXX_PROC_STATS=y
 CONFIG_AIC7XXX_RESET_DELAY=15
-# CONFIG_SCSI_IPS is not set
 # CONFIG_SCSI_ADVANSYS is not set
 # CONFIG_SCSI_IN2000 is not set
 # CONFIG_SCSI_AM53C974 is not set
@@ -170,11 +202,12 @@
 # CONFIG_SCSI_GENERIC_NCR5380 is not set
 # CONFIG_SCSI_INITIO is not set
 # CONFIG_SCSI_INIA100 is not set
+# CONFIG_SCSI_PPA is not set
+# CONFIG_SCSI_IMM is not set
 # CONFIG_SCSI_NCR53C406A is not set
 # CONFIG_SCSI_SYM53C416 is not set
-# CONFIG_SCSI_SIM710 is not set
 # CONFIG_SCSI_NCR53C7xx is not set
-# CONFIG_SCSI_NCR53C8XX is not set
+CONFIG_SCSI_NCR53C8XX=y
 CONFIG_SCSI_SYM53C8XX=y
 CONFIG_SCSI_NCR53C8XX_DEFAULT_TAGS=8
 CONFIG_SCSI_NCR53C8XX_MAX_TAGS=32
@@ -182,7 +215,7 @@
 # CONFIG_SCSI_NCR53C8XX_PROFILE is not set
 # CONFIG_SCSI_NCR53C8XX_IOMAPPED is not set
 # CONFIG_SCSI_NCR53C8XX_PQS_PDS is not set
-# CONFIG_SCSI_NCR53C8XX_SYMBIOS_COMPAT is not set
+CONFIG_SCSI_NCR53C8XX_SYMBIOS_COMPAT=y
 # CONFIG_SCSI_PAS16 is not set
 # CONFIG_SCSI_PCI2000 is not set
 # CONFIG_SCSI_PCI2220I is not set
@@ -220,21 +253,21 @@
 CONFIG_NET_ETHERNET=y
 CONFIG_MACE=y
 CONFIG_BMAC=y
-# CONFIG_NCR885E is not set
+CONFIG_GMAC=y
 # CONFIG_NET_VENDOR_3COM is not set
 # CONFIG_LANCE is not set
 # CONFIG_NET_VENDOR_SMC is not set
 # CONFIG_NET_VENDOR_RACAL is not set
 # CONFIG_RTL8139 is not set
+# CONFIG_SIS900 is not set
 # CONFIG_YELLOWFIN is not set
 # CONFIG_NET_ISA is not set
 CONFIG_NET_EISA=y
-CONFIG_PCNET32=y
+# CONFIG_PCNET32 is not set
 # CONFIG_ACENIC is not set
 # CONFIG_AC3200 is not set
 # CONFIG_APRICOT is not set
 # CONFIG_CS89x0 is not set
-# CONFIG_DM9102 is not set
 CONFIG_DE4X5=y
 # CONFIG_DEC_ELCP is not set
 # CONFIG_DGRS is not set
@@ -244,7 +277,6 @@
 # CONFIG_NE2K_PCI is not set
 # CONFIG_TLAN is not set
 # CONFIG_VIA_RHINE is not set
-# CONFIG_SIS900 is not set
 # CONFIG_ES3210 is not set
 # CONFIG_EPIC100 is not set
 # CONFIG_ZNET is not set
@@ -258,7 +290,12 @@
 # CONFIG_LTPC is not set
 # CONFIG_COPS is not set
 # CONFIG_IPDDP is not set
+# CONFIG_PLIP is not set
 CONFIG_PPP=y
+
+#
+# CCP compressors for PPP are only built as modules.
+#
 # CONFIG_SLIP is not set
 # CONFIG_NET_RADIO is not set
 
@@ -276,9 +313,7 @@
 # CONFIG_HOSTESS_SV11 is not set
 # CONFIG_COSA is not set
 # CONFIG_SEALEVEL_4021 is not set
-# CONFIG_COMX is not set
 # CONFIG_DLCI is not set
-# CONFIG_SBNI is not set
 
 #
 # Amateur Radio support
@@ -304,14 +339,12 @@
 CONFIG_FB_CONTROL=y
 CONFIG_FB_PLATINUM=y
 CONFIG_FB_VALKYRIE=y
+CONFIG_FB_ATY=y
+CONFIG_FB_ATY128=y
 CONFIG_FB_IMSTT=y
 CONFIG_FB_CT65550=y
 # CONFIG_FB_S3TRIO is not set
-CONFIG_FB_MATROX=y
-# CONFIG_FB_MATROX_MILLENIUM is not set
-CONFIG_FB_MATROX_MYSTIQUE=y
-CONFIG_FB_MATROX_G100=y
-# CONFIG_FB_MATROX_MULTIHEAD is not set
+# CONFIG_FB_MATROX is not set
 CONFIG_FB_ATY=y
 # CONFIG_FB_VIRTUAL is not set
 # CONFIG_FBCON_ADVANCED is not set
@@ -334,22 +367,13 @@
 #
 CONFIG_VT=y
 CONFIG_VT_CONSOLE=y
-CONFIG_SERIAL=m
+# CONFIG_SERIAL is not set
 # CONFIG_SERIAL_EXTENDED is not set
 # CONFIG_SERIAL_NONSTANDARD is not set
 CONFIG_UNIX98_PTYS=y
 CONFIG_UNIX98_PTY_COUNT=256
-CONFIG_MOUSE=y
-
-#
-# Mice
-#
-# CONFIG_ATIXL_BUSMOUSE is not set
-# CONFIG_BUSMOUSE is not set
-# CONFIG_MS_BUSMOUSE is not set
-CONFIG_PSMOUSE=y
-# CONFIG_82C710_MOUSE is not set
-# CONFIG_PC110_PAD is not set
+# CONFIG_PRINTER is not set
+# CONFIG_MOUSE is not set
 # CONFIG_QIC02_TAPE is not set
 # CONFIG_WATCHDOG is not set
 CONFIG_NVRAM=y
@@ -384,10 +408,10 @@
 # CONFIG_ADFS_FS is not set
 # CONFIG_AFFS_FS is not set
 CONFIG_HFS_FS=y
-CONFIG_FAT_FS=y
-CONFIG_MSDOS_FS=y
+CONFIG_FAT_FS=m
+CONFIG_MSDOS_FS=m
 # CONFIG_UMSDOS_FS is not set
-CONFIG_VFAT_FS=y
+CONFIG_VFAT_FS=m
 CONFIG_ISO9660_FS=y
 # CONFIG_JOLIET is not set
 # CONFIG_MINIX_FS is not set
@@ -453,7 +477,7 @@
 # CONFIG_NLS_ISO8859_8 is not set
 # CONFIG_NLS_ISO8859_9 is not set
 # CONFIG_NLS_ISO8859_14 is not set
-# CONFIG_NLS_ISO8859_15 is not set
+CONFIG_NLS_ISO8859_15=y
 # CONFIG_NLS_KOI8_R is not set
 
 #
@@ -461,43 +485,13 @@
 #
 CONFIG_SOUND=y
 CONFIG_DMASOUND=y
-# CONFIG_SOUND_CMPCI is not set
 # CONFIG_SOUND_ES1370 is not set
 # CONFIG_SOUND_ES1371 is not set
-# CONFIG_SOUND_MAESTRO is not set
 # CONFIG_SOUND_ESSSOLO1 is not set
 # CONFIG_SOUND_SONICVIBES is not set
 # CONFIG_SOUND_MSNDCLAS is not set
 # CONFIG_SOUND_MSNDPIN is not set
-CONFIG_SOUND_OSS=y
-# CONFIG_SOUND_DMAP is not set
-# CONFIG_SOUND_PAS is not set
-# CONFIG_SOUND_SB is not set
-# CONFIG_SOUND_GUS is not set
-# CONFIG_SOUND_MPU401 is not set
-# CONFIG_SOUND_PSS is not set
-# CONFIG_SOUND_MSS is not set
-# CONFIG_SOUND_SSCAPE is not set
-# CONFIG_SOUND_TRIX is not set
-# CONFIG_SOUND_VIA82CXXX is not set
-# CONFIG_SOUND_MAD16 is not set
-# CONFIG_SOUND_WAVEFRONT is not set
-CONFIG_SOUND_CS4232=m
-# CONFIG_SOUND_OPL3SA2 is not set
-# CONFIG_SOUND_MAUI is not set
-# CONFIG_SOUND_SGALAXY is not set
-# CONFIG_SOUND_AD1816 is not set
-# CONFIG_SOUND_OPL3SA1 is not set
-# CONFIG_SOUND_SOFTOSS is not set
-# CONFIG_SOUND_YM3812 is not set
-# CONFIG_SOUND_VMIDI is not set
-# CONFIG_SOUND_UART6850 is not set
-# CONFIG_SOUND_NM256 is not set
-
-#
-# Additional low level sound drivers
-#
-# CONFIG_LOWLEVEL_SOUND is not set
+# CONFIG_SOUND_OSS is not set
 
 #
 # Kernel hacking
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/arch/ppc/config.in linux.17p9/arch/ppc/config.in
--- linux.vanilla/arch/ppc/config.in	Sun Jun 11 21:44:09 2000
+++ linux.17p9/arch/ppc/config.in	Tue Jun 20 22:51:24 2000
@@ -8,7 +8,7 @@
 comment 'Platform support'
 define_bool CONFIG_PPC y
 choice 'Processor type' \
-	"6xx/7xx		CONFIG_6xx \
+	"6xx/7xx/7400		CONFIG_6xx \
 	 860/821		CONFIG_8xx" 6xx/7xx
 
 choice 'Machine Type' \
@@ -21,6 +21,11 @@
 	 MBX		CONFIG_MBX" PowerMac
 
 bool 'Symmetric multi-processing support' CONFIG_SMP
+
+if [ "$CONFIG_6xx" = "y" ]; then
+  bool 'Altivec (G4) support' CONFIG_ALTIVEC
+fi
+
 if [ "$CONFIG_ALL_PPC" != "y" ];then
   define_bool CONFIG_MACH_SPECIFIC y
 fi
@@ -77,9 +82,6 @@
 
 bool 'Support for VGA Console' CONFIG_VGA_CONSOLE
 bool 'Support for frame buffer devices' CONFIG_FB
-if [ "$CONFIG_FB" = "y" ]; then
-  bool 'Backward compatibility mode for Xpmac' CONFIG_FB_COMPAT_XPMAC
-fi
 
 bool 'Power management support for Apple PowerBooks' CONFIG_PMAC_PBOOK
 bool 'Support for PowerMac keyboard' CONFIG_MAC_KEYBOARD
@@ -88,6 +90,7 @@
 if [ "$CONFIG_MAC_SERIAL" = "y" ]; then
    bool '   Support for console on serial port' CONFIG_SERIAL_CONSOLE
 fi
+tristate 'Support for /dev/rtc' CONFIG_PPC_RTC
 bool 'Support for PowerMac ADB mouse' CONFIG_ADBMOUSE
 bool 'Support for Open Firmware device tree in /proc' CONFIG_PROC_DEVICETREE
 bool 'Support for TotalImpact TotalMP' CONFIG_TOTALMP
@@ -151,6 +154,8 @@
 fi
 
 source net/ax25/Config.in
+
+source net/irda/Config.in
 
 mainmenu_option next_comment
 comment 'ISDN subsystem'
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/arch/ppc/defconfig linux.17p9/arch/ppc/defconfig
--- linux.vanilla/arch/ppc/defconfig	Fri Apr 21 12:45:47 2000
+++ linux.17p9/arch/ppc/defconfig	Fri Jun 16 16:24:33 2000
@@ -1,5 +1,5 @@
 #
-# Automatically generated by make menuconfig: don't edit
+# Automatically generated make config: don't edit
 #
 
 #
@@ -7,15 +7,16 @@
 #
 CONFIG_PPC=y
 CONFIG_6xx=y
+# CONFIG_PPC64 is not set
 # CONFIG_8xx is not set
-# CONFIG_PMAC is not set
+CONFIG_PMAC=y
 # CONFIG_PREP is not set
 # CONFIG_CHRP is not set
-CONFIG_ALL_PPC=y
+# CONFIG_ALL_PPC is not set
 # CONFIG_APUS is not set
-# CONFIG_GEMINI is not set
 # CONFIG_MBX is not set
 # CONFIG_SMP is not set
+CONFIG_MACH_SPECIFIC=y
 CONFIG_6xx=y
 
 #
@@ -23,7 +24,7 @@
 #
 CONFIG_EXPERIMENTAL=y
 CONFIG_MODULES=y
-CONFIG_MODVERSIONS=y
+# CONFIG_MODVERSIONS is not set
 CONFIG_KMOD=y
 CONFIG_PCI=y
 # CONFIG_PCI_QUIRKS is not set
@@ -34,10 +35,11 @@
 # CONFIG_BSD_PROCESS_ACCT is not set
 CONFIG_BINFMT_ELF=y
 CONFIG_KERNEL_ELF=y
-# CONFIG_BINFMT_MISC is not set
+CONFIG_BINFMT_MISC=m
 # CONFIG_BINFMT_JAVA is not set
-# CONFIG_PARPORT is not set
-CONFIG_VGA_CONSOLE=y
+CONFIG_PARPORT=m
+# CONFIG_PARPORT_PC is not set
+# CONFIG_VGA_CONSOLE is not set
 CONFIG_FB=y
 CONFIG_FB_COMPAT_XPMAC=y
 CONFIG_PMAC_PBOOK=y
@@ -50,7 +52,6 @@
 # CONFIG_TOTALMP is not set
 CONFIG_BOOTX_TEXT=y
 # CONFIG_MOTOROLA_HOTSWAP is not set
-# CONFIG_CMDLINE_BOOL is not set
 
 #
 # Plug and Play support
@@ -60,8 +61,12 @@
 #
 # Block devices
 #
-CONFIG_BLK_DEV_FD=y
+# CONFIG_BLK_DEV_FD is not set
 CONFIG_BLK_DEV_IDE=y
+
+#
+# Please see Documentation/ide.txt for help/info on IDE drives
+#
 # CONFIG_BLK_DEV_HD_IDE is not set
 CONFIG_BLK_DEV_IDEDISK=y
 CONFIG_BLK_DEV_IDECD=y
@@ -70,13 +75,25 @@
 # CONFIG_BLK_DEV_IDESCSI is not set
 # CONFIG_BLK_DEV_CMD640 is not set
 # CONFIG_BLK_DEV_RZ1000 is not set
-# CONFIG_BLK_DEV_IDEPCI is not set
-CONFIG_BLK_DEV_SL82C105=y
+CONFIG_BLK_DEV_IDEPCI=y
+CONFIG_BLK_DEV_IDEDMA=y
+# CONFIG_BLK_DEV_OFFBOARD is not set
+CONFIG_IDEDMA_AUTO=y
+# CONFIG_BLK_DEV_OPTI621 is not set
+# CONFIG_BLK_DEV_TRM290 is not set
+# CONFIG_BLK_DEV_NS87415 is not set
+# CONFIG_BLK_DEV_VIA82C586 is not set
+CONFIG_BLK_DEV_CMD646=y
+# CONFIG_BLK_DEV_SL82C105 is not set
 CONFIG_BLK_DEV_IDE_PMAC=y
 CONFIG_BLK_DEV_IDEDMA_PMAC=y
 CONFIG_BLK_DEV_IDEDMA=y
 CONFIG_PMAC_IDEDMA_AUTO=y
 # CONFIG_IDE_CHIPSETS is not set
+
+#
+# Additional Block Devices
+#
 CONFIG_BLK_DEV_LOOP=y
 # CONFIG_BLK_DEV_NBD is not set
 # CONFIG_BLK_DEV_MD is not set
@@ -84,7 +101,7 @@
 CONFIG_BLK_DEV_INITRD=y
 # CONFIG_BLK_DEV_XD is not set
 # CONFIG_BLK_DEV_DAC960 is not set
-CONFIG_PARIDE_PARPORT=y
+CONFIG_PARIDE_PARPORT=m
 # CONFIG_PARIDE is not set
 # CONFIG_BLK_CPQ_DA is not set
 # CONFIG_BLK_DEV_HD is not set
@@ -108,10 +125,18 @@
 # CONFIG_NET_IPGRE is not set
 # CONFIG_IP_MROUTE is not set
 CONFIG_IP_ALIAS=y
-CONFIG_SYN_COOKIES=y
+# CONFIG_SYN_COOKIES is not set
+
+#
+# (it is safe to leave these untouched)
+#
 CONFIG_INET_RARP=y
 CONFIG_SKB_LARGE=y
 # CONFIG_IPV6 is not set
+
+#
+#  
+#
 # CONFIG_IPX is not set
 CONFIG_ATALK=m
 # CONFIG_X25 is not set
@@ -133,11 +158,19 @@
 # SCSI support
 #
 CONFIG_SCSI=y
+
+#
+# SCSI support type (disk, tape, CD-ROM)
+#
 CONFIG_BLK_DEV_SD=y
 CONFIG_CHR_DEV_ST=y
 CONFIG_BLK_DEV_SR=y
 CONFIG_BLK_DEV_SR_VENDOR=y
-CONFIG_CHR_DEV_SG=y
+# CONFIG_CHR_DEV_SG is not set
+
+#
+# Some SCSI devices (e.g. CD jukebox) support multiple LUNs
+#
 # CONFIG_SCSI_MULTI_LUN is not set
 CONFIG_SCSI_CONSTANTS=y
 # CONFIG_SCSI_LOGGING is not set
@@ -155,7 +188,6 @@
 CONFIG_AIC7XXX_CMDS_PER_DEVICE=8
 CONFIG_AIC7XXX_PROC_STATS=y
 CONFIG_AIC7XXX_RESET_DELAY=15
-# CONFIG_SCSI_IPS is not set
 # CONFIG_SCSI_ADVANSYS is not set
 # CONFIG_SCSI_IN2000 is not set
 # CONFIG_SCSI_AM53C974 is not set
@@ -170,11 +202,12 @@
 # CONFIG_SCSI_GENERIC_NCR5380 is not set
 # CONFIG_SCSI_INITIO is not set
 # CONFIG_SCSI_INIA100 is not set
+# CONFIG_SCSI_PPA is not set
+# CONFIG_SCSI_IMM is not set
 # CONFIG_SCSI_NCR53C406A is not set
 # CONFIG_SCSI_SYM53C416 is not set
-# CONFIG_SCSI_SIM710 is not set
 # CONFIG_SCSI_NCR53C7xx is not set
-# CONFIG_SCSI_NCR53C8XX is not set
+CONFIG_SCSI_NCR53C8XX=y
 CONFIG_SCSI_SYM53C8XX=y
 CONFIG_SCSI_NCR53C8XX_DEFAULT_TAGS=8
 CONFIG_SCSI_NCR53C8XX_MAX_TAGS=32
@@ -182,7 +215,7 @@
 # CONFIG_SCSI_NCR53C8XX_PROFILE is not set
 # CONFIG_SCSI_NCR53C8XX_IOMAPPED is not set
 # CONFIG_SCSI_NCR53C8XX_PQS_PDS is not set
-# CONFIG_SCSI_NCR53C8XX_SYMBIOS_COMPAT is not set
+CONFIG_SCSI_NCR53C8XX_SYMBIOS_COMPAT=y
 # CONFIG_SCSI_PAS16 is not set
 # CONFIG_SCSI_PCI2000 is not set
 # CONFIG_SCSI_PCI2220I is not set
@@ -220,21 +253,21 @@
 CONFIG_NET_ETHERNET=y
 CONFIG_MACE=y
 CONFIG_BMAC=y
-# CONFIG_NCR885E is not set
+CONFIG_GMAC=y
 # CONFIG_NET_VENDOR_3COM is not set
 # CONFIG_LANCE is not set
 # CONFIG_NET_VENDOR_SMC is not set
 # CONFIG_NET_VENDOR_RACAL is not set
 # CONFIG_RTL8139 is not set
+# CONFIG_SIS900 is not set
 # CONFIG_YELLOWFIN is not set
 # CONFIG_NET_ISA is not set
 CONFIG_NET_EISA=y
-CONFIG_PCNET32=y
+# CONFIG_PCNET32 is not set
 # CONFIG_ACENIC is not set
 # CONFIG_AC3200 is not set
 # CONFIG_APRICOT is not set
 # CONFIG_CS89x0 is not set
-# CONFIG_DM9102 is not set
 CONFIG_DE4X5=y
 # CONFIG_DEC_ELCP is not set
 # CONFIG_DGRS is not set
@@ -244,7 +277,6 @@
 # CONFIG_NE2K_PCI is not set
 # CONFIG_TLAN is not set
 # CONFIG_VIA_RHINE is not set
-# CONFIG_SIS900 is not set
 # CONFIG_ES3210 is not set
 # CONFIG_EPIC100 is not set
 # CONFIG_ZNET is not set
@@ -258,7 +290,12 @@
 # CONFIG_LTPC is not set
 # CONFIG_COPS is not set
 # CONFIG_IPDDP is not set
+# CONFIG_PLIP is not set
 CONFIG_PPP=y
+
+#
+# CCP compressors for PPP are only built as modules.
+#
 # CONFIG_SLIP is not set
 # CONFIG_NET_RADIO is not set
 
@@ -276,9 +313,7 @@
 # CONFIG_HOSTESS_SV11 is not set
 # CONFIG_COSA is not set
 # CONFIG_SEALEVEL_4021 is not set
-# CONFIG_COMX is not set
 # CONFIG_DLCI is not set
-# CONFIG_SBNI is not set
 
 #
 # Amateur Radio support
@@ -304,14 +339,12 @@
 CONFIG_FB_CONTROL=y
 CONFIG_FB_PLATINUM=y
 CONFIG_FB_VALKYRIE=y
+CONFIG_FB_ATY=y
+CONFIG_FB_ATY128=y
 CONFIG_FB_IMSTT=y
 CONFIG_FB_CT65550=y
 # CONFIG_FB_S3TRIO is not set
-CONFIG_FB_MATROX=y
-# CONFIG_FB_MATROX_MILLENIUM is not set
-CONFIG_FB_MATROX_MYSTIQUE=y
-CONFIG_FB_MATROX_G100=y
-# CONFIG_FB_MATROX_MULTIHEAD is not set
+# CONFIG_FB_MATROX is not set
 CONFIG_FB_ATY=y
 # CONFIG_FB_VIRTUAL is not set
 # CONFIG_FBCON_ADVANCED is not set
@@ -334,22 +367,13 @@
 #
 CONFIG_VT=y
 CONFIG_VT_CONSOLE=y
-CONFIG_SERIAL=m
+# CONFIG_SERIAL is not set
 # CONFIG_SERIAL_EXTENDED is not set
 # CONFIG_SERIAL_NONSTANDARD is not set
 CONFIG_UNIX98_PTYS=y
 CONFIG_UNIX98_PTY_COUNT=256
-CONFIG_MOUSE=y
-
-#
-# Mice
-#
-# CONFIG_ATIXL_BUSMOUSE is not set
-# CONFIG_BUSMOUSE is not set
-# CONFIG_MS_BUSMOUSE is not set
-CONFIG_PSMOUSE=y
-# CONFIG_82C710_MOUSE is not set
-# CONFIG_PC110_PAD is not set
+# CONFIG_PRINTER is not set
+# CONFIG_MOUSE is not set
 # CONFIG_QIC02_TAPE is not set
 # CONFIG_WATCHDOG is not set
 CONFIG_NVRAM=y
@@ -384,10 +408,10 @@
 # CONFIG_ADFS_FS is not set
 # CONFIG_AFFS_FS is not set
 CONFIG_HFS_FS=y
-CONFIG_FAT_FS=y
-CONFIG_MSDOS_FS=y
+CONFIG_FAT_FS=m
+CONFIG_MSDOS_FS=m
 # CONFIG_UMSDOS_FS is not set
-CONFIG_VFAT_FS=y
+CONFIG_VFAT_FS=m
 CONFIG_ISO9660_FS=y
 # CONFIG_JOLIET is not set
 # CONFIG_MINIX_FS is not set
@@ -453,7 +477,7 @@
 # CONFIG_NLS_ISO8859_8 is not set
 # CONFIG_NLS_ISO8859_9 is not set
 # CONFIG_NLS_ISO8859_14 is not set
-# CONFIG_NLS_ISO8859_15 is not set
+CONFIG_NLS_ISO8859_15=y
 # CONFIG_NLS_KOI8_R is not set
 
 #
@@ -461,43 +485,13 @@
 #
 CONFIG_SOUND=y
 CONFIG_DMASOUND=y
-# CONFIG_SOUND_CMPCI is not set
 # CONFIG_SOUND_ES1370 is not set
 # CONFIG_SOUND_ES1371 is not set
-# CONFIG_SOUND_MAESTRO is not set
 # CONFIG_SOUND_ESSSOLO1 is not set
 # CONFIG_SOUND_SONICVIBES is not set
 # CONFIG_SOUND_MSNDCLAS is not set
 # CONFIG_SOUND_MSNDPIN is not set
-CONFIG_SOUND_OSS=y
-# CONFIG_SOUND_DMAP is not set
-# CONFIG_SOUND_PAS is not set
-# CONFIG_SOUND_SB is not set
-# CONFIG_SOUND_GUS is not set
-# CONFIG_SOUND_MPU401 is not set
-# CONFIG_SOUND_PSS is not set
-# CONFIG_SOUND_MSS is not set
-# CONFIG_SOUND_SSCAPE is not set
-# CONFIG_SOUND_TRIX is not set
-# CONFIG_SOUND_VIA82CXXX is not set
-# CONFIG_SOUND_MAD16 is not set
-# CONFIG_SOUND_WAVEFRONT is not set
-CONFIG_SOUND_CS4232=m
-# CONFIG_SOUND_OPL3SA2 is not set
-# CONFIG_SOUND_MAUI is not set
-# CONFIG_SOUND_SGALAXY is not set
-# CONFIG_SOUND_AD1816 is not set
-# CONFIG_SOUND_OPL3SA1 is not set
-# CONFIG_SOUND_SOFTOSS is not set
-# CONFIG_SOUND_YM3812 is not set
-# CONFIG_SOUND_VMIDI is not set
-# CONFIG_SOUND_UART6850 is not set
-# CONFIG_SOUND_NM256 is not set
-
-#
-# Additional low level sound drivers
-#
-# CONFIG_LOWLEVEL_SOUND is not set
+# CONFIG_SOUND_OSS is not set
 
 #
 # Kernel hacking
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/arch/ppc/kernel/Makefile linux.17p9/arch/ppc/kernel/Makefile
--- linux.vanilla/arch/ppc/kernel/Makefile	Fri Apr 21 12:45:47 2000
+++ linux.17p9/arch/ppc/kernel/Makefile	Tue Jun 20 22:51:24 2000
@@ -7,8 +7,13 @@
 #
 # Note 2! The CFLAGS definitions are now in the main makefile...
 
+# Once a gas that groks -mvec is generally available, we'll use it...
 .S.o:
+#ifdef CONFIG_ALTIVEC
+#	$(CC) $(CFLAGS) -D__ASSEMBLY__ -Wa,-mvec -c $< -o $*.o
+#else
 	$(CC) $(CFLAGS) -D__ASSEMBLY__ -c $< -o $*.o
+#endif
 
 O_TARGET := kernel.o
 OX_OBJS := ppc_ksyms.o setup.o
@@ -62,7 +67,8 @@
 		$(TOPDIR)/include/asm/ptrace.h
 	$(CC) ${CFLAGS} -S mk_defs.c
 	cp ppc_defs.head ppc_defs.h
-	grep '^#define' mk_defs.s >>ppc_defs.h
+	chmod 755 ppc_defs.h
+	grep '^#define' mk_defs.s >> ppc_defs.h
 	rm mk_defs.s
 
 find_name : find_name.c
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/arch/ppc/kernel/apus_setup.c linux.17p9/arch/ppc/kernel/apus_setup.c
--- linux.vanilla/arch/ppc/kernel/apus_setup.c	Fri Apr 21 12:45:47 2000
+++ linux.17p9/arch/ppc/kernel/apus_setup.c	Mon Jun 26 15:46:10 2000
@@ -42,7 +42,7 @@
 #include <asm/machdep.h>
 #include <asm/ide.h>
 
-#include "time.h"
+#include <asm/time.h>
 #include "local_irq.h"
 
 unsigned long apus_get_rtc_time(void);
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/arch/ppc/kernel/checks.c linux.17p9/arch/ppc/kernel/checks.c
--- linux.vanilla/arch/ppc/kernel/checks.c	Fri Apr 21 12:45:47 2000
+++ linux.17p9/arch/ppc/kernel/checks.c	Fri Jun 16 16:24:33 2000
@@ -1,3 +1,4 @@
+#include <linux/config.h>
 #include <linux/errno.h>
 #include <linux/sched.h>
 #include <linux/kernel.h>
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/arch/ppc/kernel/chrp_setup.c linux.17p9/arch/ppc/kernel/chrp_setup.c
--- linux.vanilla/arch/ppc/kernel/chrp_setup.c	Fri Apr 21 12:45:47 2000
+++ linux.17p9/arch/ppc/kernel/chrp_setup.c	Mon Jun 26 15:46:10 2000
@@ -48,7 +48,7 @@
 #include <asm/adb.h>
 #include <asm/hydra.h>
 
-#include "time.h"
+#include <asm/time.h>
 #include "local_irq.h"
 #include "i8259.h"
 #include "open_pic.h"
@@ -488,6 +488,7 @@
 		ppc_md.kbd_init_hw       = pckbd_init_hw;
 #ifdef CONFIG_MAGIC_SYSRQ
 		ppc_md.kbd_sysrq_xlate	 = pckbd_sysrq_xlate;
+		ppc_md.SYSRQ_KEY	 = 0x54;
 #endif		
 	}
 	else
@@ -500,6 +501,7 @@
 		ppc_md.kbd_init_hw       = mackbd_init_hw;
 #ifdef CONFIG_MAGIC_SYSRQ
 		ppc_md.kbd_sysrq_xlate	 = mackbd_sysrq_xlate;
+		ppc_md.SYSRQ_KEY	 = 0x69;
 #endif		
 	}
 #else
@@ -511,6 +513,7 @@
 	ppc_md.kbd_init_hw       = pckbd_init_hw;
 #ifdef CONFIG_MAGIC_SYSRQ
 	ppc_md.kbd_sysrq_xlate	 = pckbd_sysrq_xlate;
+	ppc_md.SYSRQ_KEY	 = 0x54;
 #endif
 #endif
 #endif
@@ -681,4 +684,9 @@
 	call_rtas( "display-character", 1, 1, NULL, '\r' );
 	while ( *s )
 		call_rtas( "display-character", 1, 1, NULL, *s++ );
+}
+
+void chrp_indicator(int x)
+{
+	call_rtas("set-indicator", 3, 1, NULL, 6, 0, x);
 }
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/arch/ppc/kernel/chrp_time.c linux.17p9/arch/ppc/kernel/chrp_time.c
--- linux.vanilla/arch/ppc/kernel/chrp_time.c	Fri Apr 21 12:45:47 2000
+++ linux.17p9/arch/ppc/kernel/chrp_time.c	Mon Jun 26 15:46:10 2000
@@ -25,7 +25,7 @@
 #include <asm/processor.h>
 #include <asm/nvram.h>
 #include <asm/prom.h>
-#include "time.h"
+#include <asm/time.h>
 
 static int nvram_as1 = NVRAM_AS1;
 static int nvram_as0 = NVRAM_AS0;
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/arch/ppc/kernel/feature.c linux.17p9/arch/ppc/kernel/feature.c
--- linux.vanilla/arch/ppc/kernel/feature.c	Fri Apr 21 12:45:47 2000
+++ linux.17p9/arch/ppc/kernel/feature.c	Thu Jun 22 22:43:51 2000
@@ -8,85 +8,182 @@
  *  as published by the Free Software Foundation; either version
  *  2 of the License, or (at your option) any later version.
  *
+ *  BenH: Changed implementation to work on multiple registers
+ * 	  polarity is also taken into account. Removed delay (now
+ * 	  responsibility of the caller). Added spinlocks.
+ *
  */
 #include <linux/types.h>
 #include <linux/init.h>
 #include <linux/delay.h>
 #include <linux/kernel.h>
 #include <linux/sched.h>
+#include <asm/spinlock.h>
 #include <asm/errno.h>
 #include <asm/ohare.h>
+#include <asm/heathrow.h>
 #include <asm/io.h>
 #include <asm/prom.h>
 #include <asm/feature.h>
 
-#define MAX_FEATURE_REGS		2
 #undef DEBUG_FEATURE
 
-static u32 feature_bits_pbook[] = {
-	0,			/* FEATURE_null */
-	OH_SCC_RESET,		/* FEATURE_Serial_reset */
-	OH_SCC_ENABLE,		/* FEATURE_Serial_enable */
-	OH_SCCA_IO,		/* FEATURE_Serial_IO_A */
-	OH_SCCB_IO,		/* FEATURE_Serial_IO_B */
-	OH_FLOPPY_ENABLE,	/* FEATURE_SWIM3_enable */
-	OH_MESH_ENABLE,		/* FEATURE_MESH_enable */
-	OH_IDE_ENABLE,		/* FEATURE_IDE_enable */
-	OH_VIA_ENABLE,		/* FEATURE_VIA_enable */
-	OH_IDECD_POWER,		/* FEATURE_CD_power */
-	OH_BAY_RESET,		/* FEATURE_Mediabay_reset */
-	OH_BAY_ENABLE,		/* FEATURE_Mediabay_enable */
-	OH_BAY_PCI_ENABLE,	/* FEATURE_Mediabay_PCI_enable */
-	OH_BAY_IDE_ENABLE,	/* FEATURE_Mediabay_IDE_enable */
-	OH_BAY_FLOPPY_ENABLE,	/* FEATURE_Mediabay_floppy_enable */
-	0,			/* FEATURE_BMac_reset */
-	0,			/* FEATURE_BMac_IO_enable */
-	0,			/* FEATURE_Modem_Reset -> guess... */
-	OH_IDE_POWER,		/* FEATURE_IDE_DiskPower -> guess... */
-	OH_IDE_RESET		/* FEATURE_IDE_Reset (0 based) -> guess... */
+#define MAX_FEATURE_CONTROLLERS		2
+#define MAX_FEATURE_OFFSET		0x50
+#define FREG(c,r)			(&(((c)->reg)[(r)>>2]))
+
+typedef struct feature_bit {
+	int		reg;		/* reg. offset from mac-io base */
+	unsigned int	polarity;	/* 0 = normal, 1 = inverse */
+	unsigned int	mask;		/* bit mask */
+} fbit;
+
+/* I don't have an OHare machine to test with, so I left those as they
+ * were. Someone with such a machine chould check out what OF says and
+ * try too see if they match the heathrow ones and should be changed too
+ */
+static fbit feature_bits_ohare_pbook[] = {
+	{0x38,0,0},			/* FEATURE_null */
+	{0x38,0,OH_SCC_RESET},		/* FEATURE_Serial_reset */
+	{0x38,0,OH_SCC_ENABLE},		/* FEATURE_Serial_enable */
+	{0x38,0,OH_SCCA_IO},		/* FEATURE_Serial_IO_A */
+	{0x38,0,OH_SCCB_IO},		/* FEATURE_Serial_IO_B */
+	{0x38,0,OH_FLOPPY_ENABLE},	/* FEATURE_SWIM3_enable */
+	{0x38,0,OH_MESH_ENABLE},	/* FEATURE_MESH_enable */
+	{0x38,0,OH_IDE0_ENABLE},	/* FEATURE_IDE0_enable */
+	{0x38,1,OH_IDE0_RESET_N},	/* FEATURE_IDE0_reset */
+	{0x38,0,OH_IOBUS_ENABLE},	/* FEATURE_IOBUS_enable */
+	{0x38,1,OH_BAY_RESET_N},	/* FEATURE_Mediabay_reset */
+	{0x38,1,OH_BAY_POWER_N},	/* FEATURE_Mediabay_power */
+	{0x38,0,OH_BAY_PCI_ENABLE},	/* FEATURE_Mediabay_PCI_enable */
+	{0x38,0,OH_BAY_IDE_ENABLE},	/* FEATURE_IDE1_enable */
+	{0x38,1,OH_IDE1_RESET_N},	/* FEATURE_IDE1_reset */
+	{0x38,0,OH_BAY_FLOPPY_ENABLE},	/* FEATURE_Mediabay_floppy_enable */
+	{0x38,0,0},			/* FEATURE_BMac_reset */
+	{0x38,0,0},			/* FEATURE_BMac_IO_enable */
+	{0x38,0,0},			/* FEATURE_Modem_power */
+	{0x38,0,0},			/* FEATURE_Slow_SCC_PCLK */
+	{0x38,0,0},			/* FEATURE_Sound_Power */
+	{0x38,0,0},			/* FEATURE_Sound_CLK_Enable */
+	{0x38,0,0},			/* FEATURE_IDE2_enable */
+	{0x38,0,0},			/* FEATURE_IDE2_reset */
+	{0x38,0,0},			/* FEATURE_Mediabay_IDE_switch */
+	{0x38,0,0},			/* FEATURE_Mediabay_content */
 };
 
-/* assume these are the same as the ohare until proven otherwise */
-static u32 feature_bits_heathrow[] = {
-	0,			/* FEATURE_null */
-	OH_SCC_RESET,		/* FEATURE_Serial_reset */
-	OH_SCC_ENABLE,		/* FEATURE_Serial_enable */
-	OH_SCCA_IO,		/* FEATURE_Serial_IO_A */
-	OH_SCCB_IO,		/* FEATURE_Serial_IO_B */
-	OH_FLOPPY_ENABLE,	/* FEATURE_SWIM3_enable */
-	OH_MESH_ENABLE,		/* FEATURE_MESH_enable */
-	OH_IDE_ENABLE,		/* FEATURE_IDE_enable */
-	OH_VIA_ENABLE,		/* FEATURE_VIA_enable */
-	OH_IDECD_POWER,		/* FEATURE_CD_power */
-	OH_BAY_RESET,		/* FEATURE_Mediabay_reset */
-	OH_BAY_ENABLE,		/* FEATURE_Mediabay_enable */
-	OH_BAY_PCI_ENABLE,	/* FEATURE_Mediabay_PCI_enable */
-	OH_BAY_IDE_ENABLE,	/* FEATURE_Mediabay_IDE_enable */
-	OH_BAY_FLOPPY_ENABLE,	/* FEATURE_Mediabay_floppy_enable */
-	0x80000000,		/* FEATURE_BMac_reset */
-	0x60000000,		/* FEATURE_BMac_IO_enable */
-	0x02000000,		/* FEATURE_Modem_Reset -> guess...*/
-	OH_IDE_POWER,		/* FEATURE_IDE_DiskPower -> guess... */
-	OH_IDE_RESET		/* FEATURE_IDE_Reset (0 based) -> guess... */
+/* Those bits are from a PowerBook. It's possible that desktop machines
+ * based on heathrow need a different definition or some bits removed
+ */
+static fbit feature_bits_heathrow[] = {
+	{0x38,0,0},			/* FEATURE_null */
+	{0x38,0,HRW_RESET_SCC},		/* FEATURE_Serial_reset */
+	{0x38,0,HRW_SCC_ENABLE},	/* FEATURE_Serial_enable */
+	{0x38,0,HRW_SCCA_IO},		/* FEATURE_Serial_IO_A */
+	{0x38,0,HRW_SCCB_IO},		/* FEATURE_Serial_IO_B */
+	{0x38,0,HRW_SWIM_ENABLE},	/* FEATURE_SWIM3_enable */
+	{0x38,0,HRW_MESH_ENABLE},	/* FEATURE_MESH_enable */
+	{0x38,0,HRW_IDE0_ENABLE},	/* FEATURE_IDE0_enable */
+	{0x38,1,HRW_IDE0_RESET_N},	/* FEATURE_IDE0_reset */
+	{0x38,0,HRW_IOBUS_ENABLE},	/* FEATURE_IOBUS_enable */
+	{0x38,1,HRW_BAY_RESET_N},	/* FEATURE_Mediabay_reset */
+	{0x38,1,HRW_BAY_POWER_N},	/* FEATURE_Mediabay_power */
+	{0x38,0,HRW_BAY_PCI_ENABLE},	/* FEATURE_Mediabay_PCI_enable */
+	{0x38,0,HRW_BAY_IDE_ENABLE},	/* FEATURE_IDE1_enable */
+	{0x38,1,HRW_IDE1_RESET_N},	/* FEATURE_IDE1_reset */
+	{0x38,0,HRW_BAY_FLOPPY_ENABLE},	/* FEATURE_Mediabay_floppy_enable */
+	{0x38,0,HRW_BMAC_RESET},	/* FEATURE_BMac_reset */
+	{0x38,0,HRW_BMAC_IO_ENABLE},	/* FEATURE_BMac_IO_enable */
+	{0x38,1,HRW_MODEM_POWER_N},	/* FEATURE_Modem_power */
+	{0x38,0,HRW_SLOW_SCC_PCLK},	/* FEATURE_Slow_SCC_PCLK */
+	{0x38,1,HRW_SOUND_POWER_N},	/* FEATURE_Sound_Power */
+	{0x38,0,HRW_SOUND_CLK_ENABLE},	/* FEATURE_Sound_CLK_Enable */
+	{0x38,0,0},			/* FEATURE_IDE2_enable */
+	{0x38,0,0},			/* FEATURE_IDE2_reset */
+	{0x38,0,0},			/* FEATURE_Mediabay_IDE_switch */
+	{0x38,0,0},			/* FEATURE_Mediabay_content */
+};
+
+/*
+ * Those bits are from a 1999 G3 PowerBook, with a paddington chip.
+ * Mostly the same as the heathrow.
+ */
+static fbit feature_bits_paddington[] = {
+	{0x38,0,0},			/* FEATURE_null */
+	{0x38,0,0},			/* FEATURE_Serial_reset */
+	{0x38,0,HRW_SCC_ENABLE},	/* FEATURE_Serial_enable */
+	{0x38,0,HRW_SCCA_IO},		/* FEATURE_Serial_IO_A */
+	{0x38,0,HRW_SCCB_IO},		/* FEATURE_Serial_IO_B */
+	{0x38,0,HRW_SWIM_ENABLE},	/* FEATURE_SWIM3_enable */
+	{0x38,0,HRW_MESH_ENABLE},	/* FEATURE_MESH_enable */
+	{0x38,0,HRW_IDE0_ENABLE},	/* FEATURE_IDE0_enable */
+	{0x38,1,HRW_IDE0_RESET_N},	/* FEATURE_IDE0_reset */
+	{0x38,0,HRW_IOBUS_ENABLE},	/* FEATURE_IOBUS_enable */
+	{0x38,1,HRW_BAY_RESET_N},	/* FEATURE_Mediabay_reset */
+	{0x38,1,HRW_BAY_POWER_N},	/* FEATURE_Mediabay_power */
+	{0x38,0,HRW_BAY_PCI_ENABLE},	/* FEATURE_Mediabay_PCI_enable */
+	{0x38,0,HRW_BAY_IDE_ENABLE},	/* FEATURE_IDE1_enable */
+	{0x38,1,HRW_IDE1_RESET_N},	/* FEATURE_IDE1_reset */
+	{0x38,0,HRW_BAY_FLOPPY_ENABLE},	/* FEATURE_Mediabay_floppy_enable */
+	{0x38,0,HRW_BMAC_RESET},	/* FEATURE_BMac_reset */
+	{0x38,0,HRW_BMAC_IO_ENABLE},	/* FEATURE_BMac_IO_enable */
+	{0x38,1,PADD_MODEM_POWER_N},	/* FEATURE_Modem_power */
+	{0x38,0,HRW_SLOW_SCC_PCLK},	/* FEATURE_Slow_SCC_PCLK */
+	{0x38,1,HRW_SOUND_POWER_N},	/* FEATURE_Sound_Power */
+	{0x38,0,HRW_SOUND_CLK_ENABLE},	/* FEATURE_Sound_CLK_Enable */
+	{0x38,0,0},			/* FEATURE_IDE2_enable */
+	{0x38,0,0},			/* FEATURE_IDE2_reset */
+	{0x38,0,0},			/* FEATURE_Mediabay_IDE_switch */
+	{0x38,0,0},			/* FEATURE_Mediabay_content */
+};
+
+/* Those bits are for Core99 machines (iBook,G4,iMacSL/DV,Pismo,...).
+ */
+static fbit feature_bits_keylargo[] = {
+	{0x38,0,0},			/* FEATURE_null */
+	{0x38,0,0},			/* FEATURE_Serial_reset */
+	{0x38,0,0x00000054},		/* FEATURE_Serial_enable */
+	{0x38,0,0},			/* FEATURE_Serial_IO_A */
+	{0x38,0,0},			/* FEATURE_Serial_IO_B */
+	{0x38,0,0},			/* FEATURE_SWIM3_enable */
+	{0x38,0,0},			/* FEATURE_MESH_enable */
+	{0x3c,0,0},			/* FEATURE_IDE0_enable */
+ 	{0x3c,1,0x01000000},		/* FEATURE_IDE0_reset */
+	{0x38,0,0},			/* FEATURE_IOBUS_enable */
+	{0x34,1,0x00000200},		/* FEATURE_Mediabay_reset */
+	{0x34,1,0x00000400},		/* FEATURE_Mediabay_power */
+	{0x38,0,0},			/* FEATURE_Mediabay_PCI_enable */
+	{0x3c,0,0x0},			/* FEATURE_IDE1_enable */
+	{0x3c,1,0x08000000},		/* FEATURE_IDE1_reset */
+	{0x38,0,0},			/* FEATURE_Mediabay_floppy_enable */
+	{0x38,0,0},			/* FEATURE_BMac_reset */
+	{0x38,0,0},			/* FEATURE_BMac_IO_enable */
+	{0x40,1,0x02000000},		/* FEATURE_Modem_power */
+	{0x38,0,0},			/* FEATURE_Slow_SCC_PCLK */
+	{0x38,0,0},			/* FEATURE_Sound_Power */
+	{0x38,0,0},			/* FEATURE_Sound_CLK_Enable */
+	{0x38,0,0},			/* FEATURE_IDE2_enable */
+	{0x3c,1,0x40000000},		/* FEATURE_IDE2_reset */
+	{0x34,0,0x00001000},		/* FEATURE_Mediabay_IDE_switch */
+	{0x34,0,0x00000100},		/* FEATURE_Mediabay_content */
 };
 
 /* definition of a feature controller object */
-struct feature_controller
-{
-	u32*			bits;
+struct feature_controller {
+	fbit*			bits;
 	volatile u32*		reg;
 	struct device_node*	device;
+	spinlock_t		lock;
 };
 
 /* static functions */
 static void
-feature_add_controller(struct device_node *controller_device, u32* bits);
+feature_add_controller(struct device_node *controller_device, fbit* bits);
 
-static int
+static struct feature_controller*
 feature_lookup_controller(struct device_node *device);
 
 /* static varialbles */
-static struct feature_controller	controllers[MAX_FEATURE_REGS];
+static struct feature_controller	controllers[MAX_FEATURE_CONTROLLERS];
 static int				controller_count = 0;
 
 
@@ -96,18 +193,25 @@
 	struct device_node *np;
 
 	np = find_devices("mac-io");
-	while (np != NULL)
-	{
-		feature_add_controller(np, feature_bits_heathrow);
+	while (np != NULL) {
+		/* KeyLargo contains several (5 ?) FCR registers in mac-io,
+		 * plus some gpio's which could eventually be handled here.
+		 */
+		if (device_is_compatible(np, "Keylargo")) {
+			feature_add_controller(np, feature_bits_keylargo);
+		} else if (device_is_compatible(np, "paddington")) {
+			feature_add_controller(np, feature_bits_paddington);
+		} else {
+			feature_add_controller(np, feature_bits_heathrow);
+		}
 		np = np->next;
 	}
 	if (controller_count == 0)
 	{
 		np = find_devices("ohare");
-		if (np)
-		{
+		if (np) {
 			if (find_devices("via-pmu") != NULL)
-				feature_add_controller(np, feature_bits_pbook);
+				feature_add_controller(np, feature_bits_ohare_pbook);
 			else
 				/* else not sure; maybe this is a Starmax? */
 				feature_add_controller(np, NULL);
@@ -116,17 +220,26 @@
 
 	if (controller_count)
 		printk(KERN_INFO "Registered %d feature controller(s)\n", controller_count);
+
+#ifdef CONFIG_PMAC_PBOOK
+#ifdef CONFIG_DMASOUND_MODULE
+	/* On PowerBooks, we disable the sound chip when dmasound is a module */
+	if (controller_count && find_devices("via-pmu") != NULL) {
+		feature_clear(controllers[0].device, FEATURE_Sound_power);
+		feature_clear(controllers[0].device, FEATURE_Sound_CLK_enable);
+	}
+#endif	
+#endif
 }
 
 static void
-feature_add_controller(struct device_node *controller_device, u32* bits)
+feature_add_controller(struct device_node *controller_device, fbit* bits)
 {
 	struct feature_controller*	controller;
 	
-	if (controller_count >= MAX_FEATURE_REGS)
-	{
+	if (controller_count >= MAX_FEATURE_CONTROLLERS) {
 		printk(KERN_INFO "Feature controller %s skipped(MAX:%d)\n",
-			controller_device->full_name, MAX_FEATURE_REGS);
+			controller_device->full_name, MAX_FEATURE_CONTROLLERS);
 		return;
 	}
 	controller = &controllers[controller_count];
@@ -140,30 +253,32 @@
 	}
 
 	controller->reg		= (volatile u32 *)ioremap(
-		controller_device->addrs[0].address + OHARE_FEATURE_REG, 4);
+		controller_device->addrs[0].address, MAX_FEATURE_OFFSET);
 
 	if (bits == NULL) {
 		printk(KERN_INFO "Twiddling the magic ohare bits\n");
-		out_le32(controller->reg, STARMAX_FEATURES);
+		out_le32(FREG(controller,OHARE_FEATURE_REG), STARMAX_FEATURES);
 		return;
 	}
 
+	spin_lock_init(&controller->lock);
+	
 	controller_count++;
 }
 
-static int
+static struct feature_controller*
 feature_lookup_controller(struct device_node *device)
 {
 	int	i;
 	
 	if (device == NULL)
-		return -EINVAL;
+		return NULL;
 		
 	while(device)
 	{
 		for (i=0; i<controller_count; i++)
 			if (device == controllers[i].device)
-				return i;
+				return &controllers[i];
 		device = device->parent;
 	}
 
@@ -172,35 +287,38 @@
 		device->name);
 #endif
 	
-	return -ENODEV;
+	return NULL;
 }
 
 int
 feature_set(struct device_node* device, enum system_feature f)
 {
-	int		controller;
-	unsigned long	flags;
+	struct feature_controller*	controller;
+	unsigned long			flags;
+	unsigned long			value;
+	fbit*				bit;
 
 	if (f >= FEATURE_last)
 		return -EINVAL;	
 
 	controller = feature_lookup_controller(device);
-	if (controller < 0)
-		return controller;
+	if (!controller)
+		return -ENODEV;
+	bit = &controller->bits[f];
+	if (!bit->mask)
+		return -EINVAL;
 	
 #ifdef DEBUG_FEATURE
 	printk("feature: <%s> setting feature %d in controller @0x%x\n",
-		device->name, (int)f, (unsigned int)controllers[controller].reg);
+		device->name, (int)f, (unsigned int)controller->reg);
 #endif
 
-	save_flags(flags);
-	cli();
-	out_le32( controllers[controller].reg,
-		 in_le32(controllers[controller].reg) |
-		 controllers[controller].bits[f]);
-	(void)in_le32(controllers[controller].reg);
-	restore_flags(flags);
-	udelay(10);
+	spin_lock_irqsave(&controller->lock, flags);
+	value = in_le32(FREG(controller, bit->reg));
+	value = bit->polarity ? (value & ~bit->mask) : (value | bit->mask);
+	out_le32(FREG(controller, bit->reg), value);
+	(void)in_le32(FREG(controller, bit->reg));
+	spin_unlock_irqrestore(&controller->lock, flags);
 	
 	return 0;
 }
@@ -208,29 +326,32 @@
 int
 feature_clear(struct device_node* device, enum system_feature f)
 {
-	int		controller;
-	unsigned long	flags;
+	struct feature_controller*	controller;
+	unsigned long			flags;
+	unsigned long			value;
+	fbit*				bit;
 
 	if (f >= FEATURE_last)
 		return -EINVAL;	
 
 	controller = feature_lookup_controller(device);
-	if (controller < 0)
-		return controller;
+	if (!controller)
+		return -ENODEV;
+	bit = &controller->bits[f];
+	if (!bit->mask)
+		return -EINVAL;
 	
 #ifdef DEBUG_FEATURE
 	printk("feature: <%s> clearing feature %d in controller @0x%x\n",
-		device->name, (int)f, (unsigned int)controllers[controller].reg);
+		device->name, (int)f, (unsigned int)controller->reg);
 #endif
 
-	save_flags(flags);
-	cli();
-	out_le32( controllers[controller].reg,
-		 in_le32(controllers[controller].reg) &
-		 ~(controllers[controller].bits[f]));
-	(void)in_le32(controllers[controller].reg);
-	restore_flags(flags);
-	udelay(10);
+	spin_lock_irqsave(&controller->lock, flags);
+	value = in_le32(FREG(controller, bit->reg));
+	value = bit->polarity ? (value | bit->mask) : (value & ~bit->mask);
+	out_le32(FREG(controller, bit->reg), value);
+	(void)in_le32(FREG(controller, bit->reg));
+	spin_unlock_irqrestore(&controller->lock, flags);
 	
 	return 0;
 }
@@ -238,16 +359,29 @@
 int
 feature_test(struct device_node* device, enum system_feature f)
 {
-	int		controller;
+	struct feature_controller*	controller;
+	unsigned long			value;
+	fbit*				bit;
 
 	if (f >= FEATURE_last)
 		return -EINVAL;	
 
 	controller = feature_lookup_controller(device);
-	if (controller < 0)
-		return controller;
+	if (!controller)
+		return -ENODEV;
+	bit = &controller->bits[f];
+	if (!bit->mask)
+		return -EINVAL;
 	
-	return (in_le32(controllers[controller].reg) &
-		controllers[controller].bits[f]) != 0;
+#ifdef DEBUG_FEATURE
+	printk("feature: <%s> clearing feature %d in controller @0x%x\n",
+		device->name, (int)f, (unsigned int)controller->reg);
+#endif
+	/* If one feature contains several bits, all of them must be set
+	 * for value to be true, or all of them must be 0 if polarity is
+	 * inverse
+	 */
+	value = (in_le32(FREG(controller, bit->reg)) & bit->mask);
+	return bit->polarity ? (value == 0) : (value == bit->mask);
 }
 
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/arch/ppc/kernel/gemini_setup.c linux.17p9/arch/ppc/kernel/gemini_setup.c
--- linux.vanilla/arch/ppc/kernel/gemini_setup.c	Fri Apr 21 12:45:47 2000
+++ linux.17p9/arch/ppc/kernel/gemini_setup.c	Mon Jun 26 15:46:10 2000
@@ -30,7 +30,7 @@
 #include <asm/m48t35.h>
 #include <asm/gemini.h>
 
-#include "time.h"
+#include <asm/time.h>
 #include "local_irq.h"
 #include "open_pic.h"
 
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/arch/ppc/kernel/head.S linux.17p9/arch/ppc/kernel/head.S
--- linux.vanilla/arch/ppc/kernel/head.S	Fri Apr 21 12:45:47 2000
+++ linux.17p9/arch/ppc/kernel/head.S	Tue Jun 20 22:51:24 2000
@@ -13,6 +13,7 @@
  *    Copyright (C) 1996 Paul Mackerras.
  *  MPC8xx modifications Copyright (C) 1997 Dan Malek (dmalek@jlc.net).
  *  Amiga/APUS changes by Jesper Skov (jskov@cygnus.co.uk).
+ *  AltiVec additions by Kumar Gala (kumar.gala@motorola.com).
  *
  *  This file contains the low-level support and setup for the
  *  PowerPC platform, including trap and interrupt dispatch.
@@ -82,6 +83,28 @@
 #define REST_16FPRS(n, base)	REST_8FPRS(n, base); REST_8FPRS(n+8, base)
 #define REST_32FPRS(n, base)	REST_16FPRS(n, base); REST_16FPRS(n+16, base)
 
+/*
+ * Once a version of gas that understands the AltiVec instructions
+ * is freely available, we can do this the normal way...  - paulus
+ */
+#define LVX(r,a,b)	.long	(31<<26)+((r)<<21)+((a)<<16)+((b)<<11)+(103<<1)
+#define STVX(r,a,b)	.long	(31<<26)+((r)<<21)+((a)<<16)+((b)<<11)+(231<<1)
+#define MFVSCR(r)	.long	(4<<26)+((r)<<11)+(770<<1)
+#define MTVSCR(r)	.long	(4<<26)+((r)<<11)+(802<<1)
+
+#define SAVE_VR(n,b,base)	li b,TSS_VR0+(16*(n)); STVX(n,b,base)
+#define SAVE_2VR(n,b,base)	SAVE_VR(n,b,base); SAVE_VR(n+1,b,base) 
+#define SAVE_4VR(n,b,base)	SAVE_2VR(n,b,base); SAVE_2VR(n+2,b,base) 
+#define SAVE_8VR(n,b,base)	SAVE_4VR(n,b,base); SAVE_4VR(n+4,b,base) 
+#define SAVE_16VR(n,b,base)	SAVE_8VR(n,b,base); SAVE_8VR(n+8,b,base)
+#define SAVE_32VR(n,b,base)	SAVE_16VR(n,b,base); SAVE_16VR(n+16,b,base)
+#define REST_VR(n,b,base)	li b,TSS_VR0+(16*(n)); LVX(n,b,base)
+#define REST_2VR(n,b,base)	REST_VR(n,b,base); REST_VR(n+1,b,base) 
+#define REST_4VR(n,b,base)	REST_2VR(n,b,base); REST_2VR(n+2,b,base) 
+#define REST_8VR(n,b,base)	REST_4VR(n,b,base); REST_4VR(n+4,b,base) 
+#define REST_16VR(n,b,base)	REST_8VR(n,b,base); REST_8VR(n+8,b,base) 
+#define REST_32VR(n,b,base)	REST_16VR(n,b,base); REST_16VR(n+16,b,base)
+
 #define SYNC \
 	sync; \
 	isync
@@ -651,7 +674,26 @@
 	STD_EXCEPTION(0xd00, SingleStep, SingleStepException)
 
 	STD_EXCEPTION(0xe00, Trap_0e, UnknownException)
+
+#ifndef CONFIG_ALTIVEC
 	STD_EXCEPTION(0xf00, Trap_0f, UnknownException)
+#else
+/*
+ * The Altivec unavailable trap is at 0x0f20.  Foo.
+ * We effectively remap it to 0x3000.
+ */
+	. = 0xf00
+	b	Trap_0f
+trap_0f_cont:
+	addi	r3,r1,STACK_FRAME_OVERHEAD
+	li	r20,MSR_KERNEL
+	bl	transfer_to_handler
+	.long	UnknownException
+	.long	int_return
+
+	. = 0xf20
+	b	AltiVecUnavailable
+#endif /* CONFIG_ALTIVEC */
 
 #ifndef CONFIG_8xx
 /*
@@ -1169,9 +1211,24 @@
 	STD_EXCEPTION(0x2f00, Trap_2f, UnknownException)
 
 	. = 0x3000
-#else
+#ifdef CONFIG_ALTIVEC
+AltiVecUnavailable:
+	EXCEPTION_PROLOG
+	bne	load_up_altivec		/* if from user, just load it up */
+	li	r20,MSR_KERNEL
+	bl	transfer_to_handler	/* if from kernel, take a trap */
+	.long	KernelAltiVec
+	.long	int_return
+
+/* here are the bits of trap 0xf00 which got displaced */
+Trap_0f:
+	EXCEPTION_PROLOG
+	b	trap_0f_cont
+#endif /* CONFIG_ALTIVEC */
+
+#else /* CONFIG_8xx */
 	. = 0x2000
-#endif
+#endif /* CONFIG_8xx */
 
 /*
  * This code finishes saving the registers to the exception frame
@@ -1493,6 +1550,7 @@
 	REST_GPR(20, r21)
 	REST_2GPRS(22, r21)
 	lwz	r21,GPR21(r21)
+	sync
 	rfi
 	
 #ifdef __SMP__
@@ -1632,6 +1690,135 @@
 #endif /* __SMP__ */
 	blr
 
+#ifdef CONFIG_ALTIVEC
+/* Note that the AltiVec support is closely modeled after the FP
+ * support.  Changes to one are likely to be applicable to the
+ * other!  */
+load_up_altivec:
+/*
+ * Disable AltiVec for the task which had AltiVec previously,
+ * and save its AltiVec registers in its thread_struct.
+ * Enables AltiVec for use in the kernel on return.
+ * On SMP we know the AltiVec units are free, since we give it up every
+ * switch.  -- Kumar
+ */
+	mfmsr	r5
+	oris	r5,r5,MSR_VEC@h
+	SYNC
+	mtmsr	r5			/* enable use of AltiVec now */
+	SYNC
+/*
+ * For SMP, we don't do lazy AltiVec switching because it just gets too
+ * horrendously complex, especially when a task switches from one CPU
+ * to another.  Instead we call giveup_altivec in switch_to.
+ */
+#ifndef __SMP__
+#ifndef CONFIG_APUS
+	lis	r6,-KERNELBASE@h
+#else
+	lis	r6,CYBERBASEp@h
+	lwz	r6,0(r6)
+#endif
+	addis	r3,r6,last_task_used_altivec@ha
+	lwz	r4,last_task_used_altivec@l(r3)
+	cmpi	0,r4,0
+	beq	1f
+	add	r4,r4,r6
+	addi	r4,r4,TSS	/* want TSS of last_task_used_altivec */
+	SAVE_32VR(0,r20,r4)
+	MFVSCR(vr0)
+	li	r20,TSS_VSCR
+	STVX(vr0,r20,r4)
+	lwz	r5,PT_REGS(r4)
+	add	r5,r5,r6
+	lwz	r4,_MSR-STACK_FRAME_OVERHEAD(r5)
+	lis	r20,MSR_VEC@h
+	andc	r4,r4,r20	/* disable altivec for previous task */
+	stw	r4,_MSR-STACK_FRAME_OVERHEAD(r5)
+1:
+#endif /* __SMP__ */
+	/* enable use of AltiVec after return */
+	oris	r23,r23,MSR_VEC@h
+	mfspr	r5,SPRG3		/* current task's TSS (phys) */
+	li	r20,TSS_VSCR
+	LVX(vr0,r20,r5)
+	MTVSCR(vr0)
+	REST_32VR(0,r20,r5)
+#ifndef __SMP__
+	subi	r4,r5,TSS
+	sub	r4,r4,r6
+	stw	r4,last_task_used_altivec@l(r3)
+#endif /* __SMP__ */
+	/* restore registers and return */
+	lwz	r3,_CCR(r21)
+	lwz	r4,_LINK(r21)
+	mtcrf	0xff,r3
+	mtlr	r4
+	REST_GPR(1, r21)
+	REST_4GPRS(3, r21)
+	/* we haven't used ctr or xer */
+	mtspr	SRR1,r23
+	mtspr	SRR0,r22
+	REST_GPR(20, r21)
+	REST_2GPRS(22, r21)
+	lwz	r21,GPR21(r21)
+	SYNC
+	rfi
+
+/*
+ * AltiVec unavailable trap from kernel - print a message, but let
+ * the task use AltiVec in the kernel until it returns to user mode.
+ */
+KernelAltiVec:
+	lwz	r3,_MSR(r1)
+	oris	r3,r3,MSR_VEC@h
+	stw	r3,_MSR(r1)	/* enable use of AltiVec after return */
+	lis	r3,87f@h
+	ori	r3,r3,87f@l
+	mr	r4,r2		/* current */
+	lwz	r5,_NIP(r1)
+	bl	printk
+	b	int_return
+87:	.string	"AltiVec used in kernel  (task=%p, pc=%x)  \n"
+	.align	4
+
+/*
+ * giveup_altivec(tsk)
+ * Disable AltiVec for the task given as the argument,
+ * and save the AltiVec registers in its thread_struct.
+ * Enables AltiVec for use in the kernel on return.
+ */
+
+	.globl	giveup_altivec
+giveup_altivec:
+	mfmsr	r5
+	oris	r5,r5,MSR_VEC@h
+	SYNC
+	mtmsr	r5			/* enable use of AltiVec now */
+	SYNC
+	cmpi	0,r3,0
+	beqlr-				/* if no previous owner, done */
+	addi	r3,r3,TSS		/* want TSS of task */
+	lwz	r5,PT_REGS(r3)
+	cmpi	0,r5,0
+	SAVE_32VR(0, r4, r3)
+	MFVSCR(vr0)
+	li	r4,TSS_VSCR
+	STVX(vr0, r4, r3)
+	beq	1f
+	lwz	r4,_MSR-STACK_FRAME_OVERHEAD(r5)
+	lis	r3,MSR_VEC@h
+	andc	r4,r4,r3		/* disable AltiVec for previous task */
+	stw	r4,_MSR-STACK_FRAME_OVERHEAD(r5)
+1:
+#ifndef __SMP__
+	li	r5,0
+	lis	r4,last_task_used_altivec@ha
+	stw	r5,last_task_used_altivec@l(r4)
+#endif /* __SMP__ */
+	blr
+#endif /* CONFIG_ALTIVEC */
+
 #else  /* CONFIG_8xx */
 	.globl	giveup_fpu
 giveup_fpu:
@@ -1660,10 +1847,6 @@
 	addi	r9,r9,0x6f58		/* translate source addr */
 	cmpw	r31,r9			/* (we have to on chrp) */
 	beq	7f
-#if 0 // still needed ? breaks on me if I don't disable this
-	rlwinm	r4,r4,0,8,31		/* translate source address */
-	add	r4,r4,r3		/* to region mapped with BATs */
-#endif	
 7:	addis	r9,r26,klimit@ha	/* fetch klimit */
 	lwz	r25,klimit@l(r9)
 	addis	r25,r25,-KERNELBASE@h
@@ -1790,14 +1973,23 @@
 	cmpi	0,r9,4			/* check for 604 */
 	cmpi	1,r9,9			/* or 604e */
 	cmpi	2,r9,10			/* or mach5 */
+	cmpi	3,r9,8			/* check for 750 (G3) */
+	cmpi	4,r9,12			/* or 7400 (G4) */
 	cror	2,2,6
 	cror	2,2,10
 	bne	4f
 	ori	r11,r11,HID0_SIED|HID0_BHTE /* for 604[e], enable */
 	bne	2,5f
 	ori	r11,r11,HID0_BTCD
-5:	mtspr	HID0,r11		/* superscalar exec & br history tbl */
+	b	5f
 4:
+	cror	14,14,18
+	bne	3,6f
+	ori	r11,r11,HID0_SGE|HID0_BHTE|HID0_BTIC|HID0_ABE /* for g3/g4, enable */
+ 	li	r3,0
+ 	mtspr	ICTC,r3
+5:	mtspr	HID0,r11		/* superscalar exec & br history tbl */
+6:
 #endif /* CONFIG_8xx */
 #ifdef __SMP__
 	/* if we're the second cpu stack and r2 are different
@@ -1878,10 +2070,10 @@
 	li	r3,MSR_KERNEL & ~(MSR_IR|MSR_DR)
 	mtspr	SRR0,r4
 	mtspr	SRR1,r3
+	SYNC
 	rfi
 /* Load up the kernel context */
 2:
-	SYNC			/* Force all PTE updates to finish */
 	tlbia			/* Clear all TLB entries */
 	sync			/* wait for tlbia/tlbie to finish */
 #ifdef __SMP__
@@ -1938,6 +2130,7 @@
 #endif /* __SMP__ */
 	mtspr	SRR0,r3
 	mtspr	SRR1,r4
+	SYNC
 	rfi			/* enable MMU and jump to start_kernel */
 
 /*
@@ -2114,6 +2307,9 @@
 	mflr	r20		/* Return to switch caller */
 	mfmsr	r22
 	li	r0,MSR_FP	/* Disable floating-point */
+#ifdef CONFIG_ALTIVEC
+	oris	r0,r0,MSR_VEC@h
+#endif /* CONFIG_ALTIVEC */
 	andc	r22,r22,r0
 	stw	r20,_NIP(r1)
 	stw	r22,_MSR(r1)
@@ -2427,6 +2623,38 @@
 	blr
 
 /*
+ * Copy a whole page.  We use the dcbz instruction on the destination
+ * to reduce memory traffic (it eliminates the unnecessary reads of
+ * the destination into cache).  This requires that the destination
+ * is cacheable.
+ */
+_GLOBAL(copy_page)
+	li	r0,4096/CACHE_LINE_SIZE
+	mtctr	r0
+	addi	r3,r3,-4
+	addi	r4,r4,-4
+	li	r5,4
+1:	dcbz	r5,r3
+	lwz	r6,4(r4)
+	lwz	r7,8(r4)
+	lwz	r8,12(r4)
+	lwzu	r9,16(r4)
+	stw	r6,4(r3)
+	stw	r7,8(r3)
+	stw	r8,12(r3)
+	stwu	r9,16(r3)
+	lwz	r6,4(r4)
+	lwz	r7,8(r4)
+	lwz	r8,12(r4)
+	lwzu	r9,16(r4)
+	stw	r6,4(r3)
+	stw	r7,8(r3)
+	stw	r8,12(r3)
+	stwu	r9,16(r3)
+	bdnz	1b
+	blr
+
+/*
  * Flush entries from the hash table with VSIDs in the range
  * given.
  */
@@ -2604,7 +2832,6 @@
 	stw	r0,20(r1)
 	lis	r4,rtas_data@ha
 	lwz	r4,rtas_data@l(r4)
-	addis	r4,r4,-KERNELBASE@h
 	lis	r6,1f@ha	/* physical return address for rtas */
 	addi	r6,r6,1f@l
 	addis	r6,r6,-KERNELBASE@h
@@ -2624,6 +2851,7 @@
 	mtspr	SPRG2,r7
 	mtspr	SRR0,r8
 	mtspr	SRR1,r9
+	SYNC
 	rfi
 1:	addis	r9,r1,-KERNELBASE@h
 	lwz	r8,20(r9)	/* get return address */
@@ -2632,6 +2860,7 @@
 	mtspr	SPRG2,r0
 	mtspr	SRR0,r8
 	mtspr	SRR1,r9
+	SYNC
 	rfi			/* return to caller */
 #endif /* CONFIG_8xx */
 
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/arch/ppc/kernel/local_irq.h linux.17p9/arch/ppc/kernel/local_irq.h
--- linux.vanilla/arch/ppc/kernel/local_irq.h	Fri Apr 21 12:45:47 2000
+++ linux.17p9/arch/ppc/kernel/local_irq.h	Fri Jun 16 16:24:33 2000
@@ -26,6 +26,7 @@
 struct irqdesc {
 	struct irqaction *action;
 	struct hw_interrupt_type *ctl;
+	int level;
 };
 
 extern struct irqdesc irq_desc[NR_IRQS];
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/arch/ppc/kernel/mbx_setup.c linux.17p9/arch/ppc/kernel/mbx_setup.c
--- linux.vanilla/arch/ppc/kernel/mbx_setup.c	Fri Apr 21 12:45:47 2000
+++ linux.17p9/arch/ppc/kernel/mbx_setup.c	Mon Jun 26 15:46:10 2000
@@ -41,7 +41,7 @@
 #include <asm/mbx.h>
 #include <asm/machdep.h>
 
-#include "time.h"
+#include <asm/time.h>
 #include "local_irq.h"
 
 static int mbx_set_rtc_time(unsigned long time);
@@ -454,6 +454,7 @@
 	ppc_md.kbd_init_hw       = pckbd_init_hw;
 #ifdef CONFIG_MAGIC_SYSRQ
 	ppc_md.kbd_sysrq_xlate	 = pckbd_sysrq_xlate;
+	ppc_md.SYSRQ_KEY	 = 0x54;
 #endif
 
 #if defined(CONFIG_BLK_DEV_IDE) || defined(CONFIG_BLK_DEV_IDE_MODULE)
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/arch/ppc/kernel/misc.S linux.17p9/arch/ppc/kernel/misc.S
--- linux.vanilla/arch/ppc/kernel/misc.S	Fri Apr 21 12:45:47 2000
+++ linux.17p9/arch/ppc/kernel/misc.S	Fri Jun 16 16:24:33 2000
@@ -480,6 +480,20 @@
 _GLOBAL(_get_PVR)
 	mfspr	r3,PVR
 	blr
+	
+_GLOBAL(_get_HID0)
+	mfspr	r3,HID0
+	blr
+
+_GLOBAL(_get_ICTC)
+	mfspr	r3,ICTC
+	blr
+
+_GLOBAL(_set_ICTC)
+	mtspr	ICTC,r3
+	blr
+
+	
 /*
 	L2CR functions
 	Copyright © 1997-1998 by PowerLogix R & D, Inc.
@@ -546,6 +560,8 @@
 	rlwinm	r4,r4,16,16,31
 	cmplwi	r4,0x0008
 	beq	thisIs750
+	cmplwi	r4,0x000c
+	beq thisIs750
 	li	r3,-1
 	blr
 	
@@ -640,9 +656,11 @@
 	mfspr	r3,PVR
 	rlwinm	r3,r3,16,16,31
 	cmplwi	r3,0x0008
+	beq	1f
+	cmplwi	r3,0x000c
 	li	r3,0
 	bnelr
-	
+1:	
 	/* Return the L2CR contents */
 	mfspr	r3,L2CR
 	blr
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/arch/ppc/kernel/mk_defs.c linux.17p9/arch/ppc/kernel/mk_defs.c
--- linux.vanilla/arch/ppc/kernel/mk_defs.c	Fri Apr 21 12:45:47 2000
+++ linux.17p9/arch/ppc/kernel/mk_defs.c	Fri Jun 16 16:24:33 2000
@@ -8,7 +8,7 @@
  * #defines from the assembly-language output.
  */
 
-#include <stddef.h>
+#include <linux/config.h>
 #include <linux/signal.h>
 #include <linux/sched.h>
 #include <linux/kernel.h>
@@ -48,6 +48,12 @@
 	DEFINE(NEED_RESCHED, offsetof(struct task_struct, need_resched));
 	DEFINE(TSS_FPR0, offsetof(struct thread_struct, fpr[0]));
 	DEFINE(TSS_FPSCR, offsetof(struct thread_struct, fpscr));
+#ifdef CONFIG_ALTIVEC
+	DEFINE(TSS_VR0, offsetof(struct thread_struct, vr[0]));
+	DEFINE(TSS_VRSAVE, offsetof(struct thread_struct, vrsave));
+	DEFINE(TSS_VSCR, offsetof(struct thread_struct, vscr));
+#endif /* CONFIG_ALTIVEC */
+
 	/* Interrupt register frame */
 	DEFINE(TASK_UNION_SIZE, sizeof(union task_union));
 	DEFINE(STACK_FRAME_OVERHEAD, STACK_FRAME_OVERHEAD);
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/arch/ppc/kernel/openpic.c linux.17p9/arch/ppc/kernel/openpic.c
--- linux.vanilla/arch/ppc/kernel/openpic.c	Fri Apr 21 12:45:47 2000
+++ linux.17p9/arch/ppc/kernel/openpic.c	Fri Jun 16 16:24:33 2000
@@ -5,6 +5,12 @@
  *
  *  Fixed up IPI and restructured a bit
  *    Cort Dougan <cort@ppc.kernel.org>
+ *
+ *  Added initialisation code for Apple Core99 machines, tweaked a few things
+ *  to avoid bogus interrupts and to make sure the disable function exits with
+ *  the interrupt actually masked.
+ *    Benjamin Herrenschmidt <bh40@calva.net>
+ *  Todo: map interrupts to all available CPUs after the ack round
  * 
  *  This file is subject to the terms and conditions of the GNU General Public
  *  License.  See the file COPYING in the main directory of this archive
@@ -21,10 +27,17 @@
 #include <asm/io.h>
 #include <asm/irq.h>
 #include "open_pic.h"
+#ifdef __powerpc__
+#include <asm/prom.h>
+#endif
 
 #define REGISTER_DEBUG
 #undef REGISTER_DEBUG
 
+#ifdef __powerpc__
+extern int use_of_interrupt_tree;
+#endif
+
 volatile struct OpenPIC *OpenPIC = NULL;
 u_int OpenPIC_NumInitSenses __initdata = 0;
 u_char *OpenPIC_InitSenses __initdata = NULL;
@@ -80,7 +93,7 @@
  *  I/O functions
  */
 #ifdef __i386__
-static inline u_int ld_le32(volatile u_int *addr)
+static inline u_int in_le32(volatile u_int *addr)
 {
 	return *addr;
 }
@@ -95,7 +108,7 @@
 {
 	u_int val;
 
-	val = ld_le32(addr);
+	val = in_le32(addr);
 #ifdef REGISTER_DEBUG
 	printk("openpic_read(0x%08x) = 0x%08x\n", (u_int)addr, val);
 #endif
@@ -142,6 +155,9 @@
 {
 	openpic_setfield(addr, OPENPIC_MASK);
 	/* wait until it's not in use */
+	/* BenH: Is this code really enough ? I would rather check the result
+	 *       and eventually retry ...
+	 */
 	while (openpic_read(addr) & OPENPIC_ACTIVITY);
 	openpic_writefield(addr, mask | OPENPIC_MASK, field | OPENPIC_MASK);
 }
@@ -149,6 +165,16 @@
 /*
  *  Initialize the OpenPIC
  */
+
+/* PoweMac note:
+ *
+ * With BootX, we consider the controller as beeing already initialized by MacOS
+ * and we only mask out interrupts.
+ * With OF booting, we initialize the interrupts that we find in the device tree,
+ * other ones are just masked out.
+ * Note: We might want to adjust priorities too.
+ */
+
 __initfunc(void openpic_init(int main_pic))
 {
 	u_int t, i;
@@ -179,13 +205,16 @@
 		      OPENPIC_FEATURE_LAST_SOURCE_SHIFT) + 1;
 	printk("OpenPIC Version %s (%d CPUs and %d IRQ sources) at %p\n", version,
 	       NumProcessors, NumSources, OpenPIC);
-	timerfreq = openpic_read(&OpenPIC->Global.Timer_Frequency);
-	printk("OpenPIC timer frequency is ");
-	if (timerfreq)
-		printk("%d Hz\n", timerfreq);
-	else
-		printk("not set\n");
-
+	/* Apple's OpenPIC is an IBM MPIC without the timer. */
+	if (_machine != _MACH_Pmac) {
+		timerfreq = openpic_read(&OpenPIC->Global.Timer_Frequency);
+		printk("OpenPIC timer frequency is ");
+		if (timerfreq)
+			printk("%d Hz\n", timerfreq);
+		else
+			printk("not set\n");
+	}
+	
 	if ( main_pic )
 	{
 		/* Initialize timer interrupts */
@@ -198,24 +227,60 @@
 	    
 		/* Initialize IPI interrupts */
 		for (i = 0; i < OPENPIC_NUM_IPI; i++) {
-			openpic_initipi(i, 10, OPENPIC_VEC_IPI+i);
+			openpic_initipi(i, 0/*10*/, OPENPIC_VEC_IPI+i);
 		}
 	    
-		/* Initialize external interrupts */
-		for (i = 0; i < NumSources; i++) {
-			/* Enabled, Priority 8 */
-			openpic_initirq(i, 8, open_pic.irq_offset+i, 0,
-					i < OpenPIC_NumInitSenses ? OpenPIC_InitSenses[i] : 1);
-			/* Processor 0 */
-			openpic_mapirq(i, 1<<0);
+		if (_machine != _MACH_Pmac) {
+			/* Initialize external interrupts */
+			for (i = 0; i < NumSources; i++) {
+			    /* Enabled, Priority 8 */
+			    openpic_initirq(i, 8, open_pic.irq_offset+i, 0,
+				i < OpenPIC_NumInitSenses ? OpenPIC_InitSenses[i] : 1);
+			    /* Processor 0 */
+			    openpic_mapirq(i, 1<<0);
+			}
+		} else {
+			/* Prevent any interrupt from occuring during initialisation.
+			 * Hum... I beleive this is not necessary, Apple does that in
+			 * Darwin's PowerExpress code.
+			 */
+			openpic_set_priority(0, 0xf);
+
+			/* First disable all interrupts and map them to CPU 0 */
+			for (i = 0; i < NumSources; i++) {
+				openpic_disable_irq(i);
+				openpic_mapirq(i, 1<<0);
+			}
+			
+			/* If we use the device tree, then lookup all interrupts and
+			 * initialize them according to sense infos found in the tree
+			 */
+			if (use_of_interrupt_tree) {
+				struct device_node* np = find_all_nodes();
+			    	while(np) {
+				    int j, pri;
+				    pri = strcmp(np->name, "programmer-switch") ? 2 : 7;
+				    for (j=0;j<np->n_intrs;j++) {
+    				    	openpic_initirq(	np->intrs[j].line,
+    				    				pri,
+    				    				np->intrs[j].line,
+    				    				np->intrs[j].sense,
+    				    				np->intrs[j].sense);
+    				    	irq_desc[np->intrs[j].line].level = np->intrs[j].sense;
+    				    }
+				    np = np->next;
+				}
+			} else {
+				/* Fixme: read level value from controller */
+				printk("openpic: WARNING, openpic running without interrupt tree\n");
+			}
 		}
-	    
+
 		/* Initialize the spurious interrupt */
 		openpic_set_spurious(OPENPIC_VEC_SPURIOUS);
 
 		/* Gemini has no i8259 */
-		if ( _machine != _MACH_gemini )
-		{
+		if (( _machine != _MACH_gemini ) && (_machine != _MACH_Pmac)) {
 			/* SIOint (8259 cascade) is special */
 			openpic_initirq(0, 8, open_pic.irq_offset, 1, 1);
 			openpic_mapirq(0, 1<<0);
@@ -225,6 +290,14 @@
 		}
 		openpic_set_priority(0, 0);
 		openpic_disable_8259_pass_through();
+
+		/* We ack pending interrupts to avoid blocking them */
+		if (_machine == _MACH_Pmac) {
+			for (i = 0; i < NumSources; i++) {
+				(void)openpic_irq(0);
+				openpic_eoi(0);
+			}
+		}
 	}
 }
 
@@ -281,6 +354,7 @@
 {
 	check_arg_cpu(cpu);
 	openpic_write(&OpenPIC->THIS_CPU.EOI, 0);
+	(void)openpic_read(&OpenPIC->THIS_CPU.EOI);
 }
 
 
@@ -428,12 +502,22 @@
 {
 	check_arg_irq(irq);
 	openpic_clearfield(&OpenPIC->Source[irq].Vector_Priority, OPENPIC_MASK);
+	/* make sure mask gets to controller before we return to user */
+	do {
+		mb();
+	} while(openpic_readfield(&OpenPIC->Source[irq].Vector_Priority,
+			OPENPIC_MASK));
 }
 
 void openpic_disable_irq(u_int irq)
 {
 	check_arg_irq(irq);
 	openpic_setfield(&OpenPIC->Source[irq].Vector_Priority, OPENPIC_MASK);
+	/* make sure mask gets to controller before we return to user */
+	do {
+		mb();
+	} while(!openpic_readfield(&OpenPIC->Source[irq].Vector_Priority,
+    			OPENPIC_MASK));
 }
 
 /*
@@ -452,10 +536,11 @@
 	check_arg_vec(vec);
 	openpic_safe_writefield(&OpenPIC->Source[irq].Vector_Priority,
 				OPENPIC_PRIORITY_MASK | OPENPIC_VECTOR_MASK |
-				OPENPIC_SENSE_POLARITY | OPENPIC_SENSE_LEVEL,
+				OPENPIC_POLARITY_MASK | OPENPIC_SENSE_MASK,
 				(pri << OPENPIC_PRIORITY_SHIFT) | vec |
-				(pol ? OPENPIC_SENSE_POLARITY : 0) |
-				(sense ? OPENPIC_SENSE_LEVEL : 0));
+				(pol ? OPENPIC_POLARITY_POSITIVE :
+			    		OPENPIC_POLARITY_NEGATIVE) |
+				(sense ? OPENPIC_SENSE_LEVEL : OPENPIC_SENSE_EDGE));
 }
 
 /*
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/arch/ppc/kernel/pci.c linux.17p9/arch/ppc/kernel/pci.c
--- linux.vanilla/arch/ppc/kernel/pci.c	Fri Apr 21 12:45:47 2000
+++ linux.17p9/arch/ppc/kernel/pci.c	Fri Jun 16 16:24:33 2000
@@ -93,7 +93,7 @@
 
 	for (; node != 0;node = node->sibling) {
 		class_code = (unsigned int *) get_property(node, "class-code", 0);
-		if((*class_code >> 8) == PCI_CLASS_BRIDGE_PCI)
+		if(class_code && (*class_code >> 8) == PCI_CLASS_BRIDGE_PCI)
 			fix_intr(node->child, dev);
 		reg = (unsigned int *) get_property(node, "reg", 0);
 		if (reg == 0 || ((reg[0] >> 8) & 0xff) != dev->devfn)
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/arch/ppc/kernel/pmac_pci.c linux.17p9/arch/ppc/kernel/pmac_pci.c
--- linux.vanilla/arch/ppc/kernel/pmac_pci.c	Fri Apr 21 12:45:47 2000
+++ linux.17p9/arch/ppc/kernel/pmac_pci.c	Fri Jun 16 16:24:33 2000
@@ -28,6 +28,18 @@
 struct bridge_data **bridges, *bridge_list;
 static int max_bus;
 
+struct uninorth_data {
+	struct device_node*	node;
+	volatile unsigned int*	cfg_addr;
+	volatile unsigned int*	cfg_data;
+};
+
+static struct uninorth_data uninorth_bridges[3];
+static int uninorth_count;
+static int uninorth_default = -1;
+ 
+
+
 static void add_bridges(struct device_node *dev, unsigned long *mem_ptr);
 
 /*
@@ -71,6 +83,161 @@
 	return 0;
 }
 
+/* This function only works for bus 0, uni-N uses a different mecanism for
+ * other busses (see below)
+ */
+#define UNI_N_CFA0(devfn, off)	\
+	((1 << (unsigned long)PCI_SLOT(dev_fn)) \
+	| (((unsigned long)PCI_FUNC(dev_fn)) << 8) \
+	| (((unsigned long)(off)) & 0xFCUL))
+
+/* This one is for type 1 config accesses */
+#define UNI_N_CFA1(bus, devfn, off)	\
+	((((unsigned long)(bus)) << 16) \
+	|(((unsigned long)(devfn)) << 8) \
+	|(((unsigned long)(off)) & 0xFCUL) \
+	|1UL)
+	
+
+/* We should really use RTAS here, unfortunately, it's not available with BootX.
+ * (one more reason for writing a beautiful OF booter). I'll do the RTAS stuff
+ * later, once I have something that works enough with BootX.
+ */
+__pmac static
+unsigned int
+uni_north_access_data(unsigned char bus, unsigned char dev_fn,
+				unsigned char offset)
+{
+	struct device_node *node, *bridge_node;
+	int bridge = uninorth_default;
+	unsigned int caddr;
+
+	if (bus == 0) {
+		if (PCI_SLOT(dev_fn) < 11) {
+			return 0;
+		}
+		/* We look for the OF device corresponding to this bus/devfn pair. If we
+		 * don't find it, we default to the external PCI */
+		bridge_node = NULL;
+		node = find_pci_device_OFnode(bus, dev_fn & 0xf8);
+		if (node) {
+                    /* note: we don't stop on the first occurence since we need to go
+                     * up to the root bridge */
+		    do {
+			if (!strcmp(node->type, "pci"))
+				bridge_node = node;
+			node=node->parent;
+		    } while (node);
+		}
+		if (bridge_node) {
+		    int i;
+		    for (i=0;i<uninorth_count;i++)
+			if (uninorth_bridges[i].node == bridge_node) {
+			    bridge = i;
+			    break;
+			}
+		}
+		caddr = UNI_N_CFA0(dev_fn, offset);
+	} else
+		caddr = UNI_N_CFA1(bus, dev_fn, offset);
+
+	if (bridge == -1) {
+		printk(KERN_WARNING "pmac_pci: no default bridge !\n");
+		return 0;
+	}
+		
+	/* Uninorth will return garbage if we don't read back the value ! */
+	out_le32(uninorth_bridges[bridge].cfg_addr, caddr);
+	(void)in_le32(uninorth_bridges[bridge].cfg_addr);
+	/* Yes, offset is & 7, not & 3 ! */
+	return (unsigned int)(uninorth_bridges[bridge].cfg_data) + (offset & 0x07);
+}
+
+__pmac
+int uni_pcibios_read_config_byte(unsigned char bus, unsigned char dev_fn,
+				  unsigned char offset, unsigned char *val)
+{
+	unsigned int addr;
+	
+	*val = 0xff;
+	addr = uni_north_access_data(bus, dev_fn, offset);
+	if (!addr)
+		return PCIBIOS_DEVICE_NOT_FOUND;
+	*val = in_8((volatile unsigned char*)addr);
+	return PCIBIOS_SUCCESSFUL;
+}
+
+__pmac
+int uni_pcibios_read_config_word(unsigned char bus, unsigned char dev_fn,
+				  unsigned char offset, unsigned short *val)
+{
+	unsigned int addr;
+	
+	*val = 0xffff;
+	addr = uni_north_access_data(bus, dev_fn, offset);
+	if (!addr)
+		return PCIBIOS_DEVICE_NOT_FOUND;
+	*val = in_le16((volatile unsigned short*)addr);
+	return PCIBIOS_SUCCESSFUL;
+}
+
+__pmac
+int uni_pcibios_read_config_dword(unsigned char bus, unsigned char dev_fn,
+				   unsigned char offset, unsigned int *val)
+{
+	unsigned int addr;
+	
+	*val = 0xffff;
+	addr = uni_north_access_data(bus, dev_fn, offset);
+	if (!addr)
+		return PCIBIOS_DEVICE_NOT_FOUND;
+	*val = in_le32((volatile unsigned int*)addr);
+	return PCIBIOS_SUCCESSFUL;
+}
+
+__pmac
+int uni_pcibios_write_config_byte(unsigned char bus, unsigned char dev_fn,
+				   unsigned char offset, unsigned char val)
+{
+	unsigned int addr;
+	
+	addr = uni_north_access_data(bus, dev_fn, offset);
+	if (!addr)
+		return PCIBIOS_DEVICE_NOT_FOUND;
+	out_8((volatile unsigned char *)addr, val);
+	(void)in_8((volatile unsigned char *)addr);
+	return PCIBIOS_SUCCESSFUL;
+}
+
+__pmac
+int uni_pcibios_write_config_word(unsigned char bus, unsigned char dev_fn,
+				   unsigned char offset, unsigned short val)
+{
+	unsigned int addr;
+	
+	addr = uni_north_access_data(bus, dev_fn, offset);
+	if (!addr)
+		return PCIBIOS_DEVICE_NOT_FOUND;
+	out_le16((volatile unsigned short *)addr, val);
+	(void)in_le16((volatile unsigned short *)addr);
+	return PCIBIOS_SUCCESSFUL;
+}
+
+__pmac
+int uni_pcibios_write_config_dword(unsigned char bus, unsigned char dev_fn,
+				    unsigned char offset, unsigned int val)
+{
+	unsigned int addr;
+	
+	addr = uni_north_access_data(bus, dev_fn, offset);
+	if (!addr)
+		return PCIBIOS_DEVICE_NOT_FOUND;
+	out_le32((volatile unsigned int *)addr, val);
+	(void)in_le32((volatile unsigned int *)addr);
+	return PCIBIOS_SUCCESSFUL;
+}
+
+
 __pmac
 int pmac_pcibios_read_config_byte(unsigned char bus, unsigned char dev_fn,
 				  unsigned char offset, unsigned char *val)
@@ -360,6 +527,36 @@
 	       bp->io_base);
 }
 
+#define GRACKLE_PICR1_STG		0x00000040
+#define GRACKLE_PICR1_LOOPSNOOP		0x00000010
+
+/* N.B. this is called before bridges is initialized, so we can't
+   use grackle_pcibios_{read,write}_config_dword. */
+static inline void grackle_set_stg(struct bridge_data *bp, int enable)
+{
+	unsigned int val;
+
+	out_be32(bp->cfg_addr, GRACKLE_CFA(0, 0, 0xa8));
+	val = in_le32((volatile unsigned int *)bp->cfg_data);
+	val = enable? (val | GRACKLE_PICR1_STG) :
+		(val & ~GRACKLE_PICR1_STG);
+	out_be32(bp->cfg_addr, GRACKLE_CFA(0, 0, 0xa8));
+	out_le32((volatile unsigned int *)bp->cfg_data, val);
+}
+
+static inline void grackle_set_loop_snoop(struct bridge_data *bp, int enable)
+{
+	unsigned int val;
+
+	out_be32(bp->cfg_addr, GRACKLE_CFA(0, 0, 0xa8));
+	val = in_le32((volatile unsigned int *)bp->cfg_data);
+	val = enable? (val | GRACKLE_PICR1_LOOPSNOOP) :
+		(val & ~GRACKLE_PICR1_LOOPSNOOP);
+	out_be32(bp->cfg_addr, GRACKLE_CFA(0, 0, 0xa8));
+	out_le32((volatile unsigned int *)bp->cfg_data, val);
+}
+
+
 __initfunc(unsigned long pmac_find_bridges(unsigned long mem_start, unsigned long mem_end))
 {
 	int bus;
@@ -411,21 +608,49 @@
 			printk(KERN_INFO "PCI buses %d..%d", bus_range[0],
 			       bus_range[1]);
 		printk(" controlled by %s at %x\n", dev->name, addr->address);
+		if (device_is_compatible(dev, "uni-north")) {
+			int i = uninorth_count++;
+			uninorth_bridges[i].cfg_addr = ioremap(addr->address + 0x800000, 0x1000);
+			uninorth_bridges[i].cfg_data = ioremap(addr->address + 0xc00000, 0x1000);
+			uninorth_bridges[i].node = dev;
+			/* XXX This is the bridge with the PCI expansion bus. This is also the
+			 * address of the bus that will receive type 1 config accesses and io
+			 * accesses. Appears to be correct for iMac DV and G4 Sawtooth too.
+			 * That means that we cannot do io cycles on the AGP bus nor the internal
+			 * ethernet/fw bus. Fortunately, they appear not to be needed on iMac DV
+			 * and G4 neither.
+			 */
+			if (addr->address == 0xf2000000)
+				uninorth_default = i;
+			else
+				continue;
+		}
 		bp = (struct bridge_data *) *mem_ptr;
 		*mem_ptr += sizeof(struct bridge_data);
-		if (strcmp(dev->name, "pci") != 0) {
-			bp->cfg_addr = (volatile unsigned int *)
-				ioremap(addr->address + 0x800000, 0x1000);
-			bp->cfg_data = (volatile unsigned char *)
-				ioremap(addr->address + 0xc00000, 0x1000);
-			bp->io_base = (void *) ioremap(addr->address, 0x10000);
-		} else {
-			/* XXX */
+		if (device_is_compatible(dev, "uni-north")) {
+			bp->cfg_addr = 0;
+			bp->cfg_data = 0;
+			/* is 0x10000 enough for io space ? */
+			bp->io_base = (void *)ioremap(addr->address, 0x10000);
+		} else if (strcmp(dev->name, "pci") == 0) {
+			/* XXX assume this is a mpc106 (grackle) */
 			bp->cfg_addr = (volatile unsigned int *)
 				ioremap(0xfec00000, 0x1000);
 			bp->cfg_data = (volatile unsigned char *)
 				ioremap(0xfee00000, 0x1000);
                         bp->io_base = (void *) ioremap(0xfe000000, 0x20000);
+                        if (machine_is_compatible("AAPL,PowerBook1998"))
+                        	grackle_set_loop_snoop(bp, 1);
+#if 0 			/* Disabled for now, HW problems ??? */
+			grackle_set_stg(bp, 1);
+#endif
+		} else {
+			/* a `bandit' or `chaos' bridge */
+			bp->cfg_addr = (volatile unsigned int *)
+				ioremap(addr->address + 0x800000, 0x1000);
+			bp->cfg_data = (volatile unsigned char *)
+				ioremap(addr->address + 0xc00000, 0x1000);
+			bp->io_base = (void *) ioremap(addr->address, 0x10000);
 		}
 		if (isa_io_base == 0)
 			isa_io_base = (unsigned long) bp->io_base;
@@ -468,7 +693,13 @@
 		if (pci_read_config_byte(dev, PCI_INTERRUPT_PIN, &pin) ||
 		    !pin)
 			continue; /* No interrupt generated -> no fixup */
-                fix_intr(bp->node->child, dev);
+		/* We iterate all instances of uninorth for now */	
+		if (uninorth_count && dev->bus->number == 0) {
+			int i;
+			for (i=0;i<uninorth_count;i++)
+				fix_intr(uninorth_bridges[i].node->child, dev);
+		} else
+                	fix_intr(bp->node->child, dev);
 	}
 }
 
@@ -476,9 +707,17 @@
 void
 pmac_setup_pci_ptrs(void))
 {
-	if (find_devices("pci") != 0) {
-		/* looks like a G3 powermac */
-		set_config_access_method(grackle);
+	struct device_node* np;
+
+	np = find_devices("pci");
+	if (np != 0) {
+		if (device_is_compatible(np, "uni-north")) {
+			/* looks like an Core99 powermac */
+			set_config_access_method(uni);
+		} else {
+			/* looks like a G3 powermac */
+			set_config_access_method(grackle);
+		}
 	} else {
 		set_config_access_method(pmac);
 	}
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/arch/ppc/kernel/pmac_pic.c linux.17p9/arch/ppc/kernel/pmac_pic.c
--- linux.vanilla/arch/ppc/kernel/pmac_pic.c	Fri Apr 21 12:45:47 2000
+++ linux.17p9/arch/ppc/kernel/pmac_pic.c	Fri Jun 16 16:24:33 2000
@@ -4,6 +4,7 @@
 #include <linux/sched.h>
 #include <linux/signal.h>
 #include <linux/pci.h>
+#include <linux/openpic.h>
 #include <asm/pci-bridge.h>
 #include <asm/io.h>
 #include <asm/smp.h>
@@ -27,6 +28,7 @@
 
 static int max_irqs;
 static int max_real_irqs;
+static int has_openpic = 0;
 
 #define MAXCOUNT 10000000
 
@@ -104,6 +106,18 @@
         pmac_set_irq_mask(irq_nr);
 }
 
+static void pmac_openpic_mask_irq(unsigned int irq_nr)
+{
+	openpic_disable_irq(irq_nr);
+}
+
+static void pmac_openpic_unmask_irq(unsigned int irq_nr)
+{
+	openpic_enable_irq(irq_nr);
+}
+
+
+
 struct hw_interrupt_type pmac_pic = {
         " PMAC-PIC ",
         NULL,
@@ -126,6 +140,17 @@
 	0
 };
 
+struct hw_interrupt_type pmac_open_pic = {
+	" OpenPIC  ",
+	NULL,
+	NULL,
+	NULL,
+	pmac_openpic_unmask_irq,
+	pmac_openpic_mask_irq,
+	NULL,/*pmac_openpic_mask_irq,*/
+	0
+};
+
 static void gatwick_action(int cpl, void *dev_id, struct pt_regs *regs)
 {
 	int irq, bits;
@@ -196,6 +221,29 @@
         }
 #endif /* __SMP__ */
 
+	/* Yeah, I know, this could be a separate do_IRQ function */
+	if (has_openpic) {
+	    irq = openpic_irq(0);
+	    if (irq == OPENPIC_VEC_SPURIOUS) {
+                /* Spurious interrupts should never be ack'ed */
+                ppc_spurious_interrupts++;
+            } else {
+            	/* Can this happen ? (comes from CHRP code) */
+		if (irq < 0) {
+		    printk(KERN_DEBUG "Bogus interrupt %d from PC = %lx\n",
+                       irq, regs->nip);
+		    ppc_spurious_interrupts++;
+		} else {
+		    if (!irq_desc[irq].level)
+	                openpic_eoi(0);
+		    ppc_irq_dispatch_handler( regs, irq );
+		    if (irq_desc[irq].level)
+	                openpic_eoi(0);
+		}
+            }
+            return;
+	}
+
         for (irq = max_real_irqs - 1; irq > 0; irq -= 32) {
                 int i = irq >> 5;
                 bits = ld_le32(&pmac_irq_hw[i]->flag)
@@ -350,6 +398,36 @@
         struct device_node *irqctrler;
         volatile struct pmac_irq_hw *addr;
 	int second_irq;
+
+	/* We first try to detect Apple's new Core99 chipset, since mac-io
+	 * is quite different on those machines and contains an IBM MPIC2.
+	 */
+	irqctrler = find_type_devices("open-pic");
+	if (irqctrler != NULL) {
+	    printk("PowerMac using OpenPIC irq controller\n");
+	    if (irqctrler->n_addrs > 0) {
+#ifdef CONFIG_XMON
+		struct device_node* pswitch;
+#endif /* CONFIG_XMON */	
+		OpenPIC = (volatile struct OpenPIC *)
+			ioremap(irqctrler->addrs[0].address,
+			irqctrler->addrs[0].size);
+		for ( i = 0 ; i < NR_IRQS ; i++ ) {
+		    irq_desc[i].ctl = &pmac_open_pic;
+		    irq_desc[i].level = 0;
+		}
+		openpic_init(1);
+		has_openpic = 1;
+#ifdef CONFIG_XMON
+		pswitch = find_devices("programmer-switch");
+		if (pswitch && pswitch->n_intrs)
+			request_irq(pswitch->intrs[0].line, xmon_irq, 0,	
+				"NMI - XMON", 0);
+#endif	/* CONFIG_XMON */
+		return;
+	    }
+	    irqctrler = NULL;
+	}
 
 	/*
 	 * G3 powermacs and 1999 G3 PowerBooks have 64 interrupts,
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/arch/ppc/kernel/pmac_setup.c linux.17p9/arch/ppc/kernel/pmac_setup.c
--- linux.vanilla/arch/ppc/kernel/pmac_setup.c	Fri Apr 21 12:45:47 2000
+++ linux.17p9/arch/ppc/kernel/pmac_setup.c	Mon Jun 26 15:46:10 2000
@@ -58,12 +58,13 @@
 #include <asm/ide.h>
 #include <asm/machdep.h>
 
-#include "time.h"
+#include <asm/time.h>
 #include "local_irq.h"
 #include "pmac_pic.h"
 
 #undef SHOW_GATWICK_IRQS
 
+void pmac_time_init(void);
 unsigned long pmac_get_rtc_time(void);
 int pmac_set_rtc_time(unsigned long nowtime);
 void pmac_read_rtc_time(void);
@@ -87,6 +88,7 @@
 extern char pckbd_unexpected_up(unsigned char keycode);
 extern void pckbd_leds(unsigned char leds);
 extern void pckbd_init_hw(void);
+extern void pmac_nvram_update(void);
 
 unsigned char drive_info;
 
@@ -95,11 +97,14 @@
 
 extern char saved_command_line[];
 
+extern int pmac_newworld;
+
 #define DEFAULT_ROOT_DEVICE 0x0801	/* sda1 - slightly silly choice */
 
 extern void zs_kgdb_hook(int tty_num);
 static void ohare_init(void);
 static void init_p2pbridge(void);
+static void init_uninorth(void);
 
 __pmac
 int
@@ -187,6 +192,10 @@
 			len += sprintf(buffer+len, "l2cr override\t: 0x%x\n", *l2cr);
 		}
 	}
+
+	/* Indicate newworld/oldworld */
+	len += sprintf(buffer+len, "pmac-generation\t: %s\n",
+		pmac_newworld ? "NewWorld" : "OldWorld");		
 	
 	return len;
 }
@@ -246,8 +255,10 @@
 		if (fp != 0) {
 			switch (_get_PVR() >> 16) {
 			case 4:		/* 604 */
+			case 8:		/* G3 */
 			case 9:		/* 604e */
 			case 10:	/* mach V (604ev5) */
+			case 12:	/* G4 */
 			case 20:	/* 620 */
 				loops_per_sec = *fp;
 				break;
@@ -266,9 +277,10 @@
 
 	*memory_start_p = pmac_find_bridges(*memory_start_p, *memory_end_p);
 	init_p2pbridge();
-
+	init_uninorth();
+	
 	/* Checks "l2cr-value" property in the registry */
-	if ( (_get_PVR() >> 16) == 8) {
+	if ( (_get_PVR() >> 16) == 8 || (_get_PVR() >> 16) == 12 ) {
 		struct device_node *np = find_devices("cpus");		
 		if (np == 0)
 			np = find_type_devices("cpu");		
@@ -288,7 +300,6 @@
 		printk(KERN_INFO "L2CR overriden (0x%x), backside cache is %s\n",
 			ppc_override_l2cr_value, (ppc_override_l2cr_value & 0x80000000)
 				? "enabled" : "disabled");
-
 	feature_init();
 
 #ifdef CONFIG_KGDB
@@ -298,6 +309,8 @@
 	find_via_cuda();
 	find_via_pmu();
 
+	pmac_nvram_init();
+
 #ifdef CONFIG_DUMMY_CONSOLE
 	conswitchp = &dummy_con;
 #endif
@@ -355,6 +368,38 @@
 	}
 }
 
+__initfunc(static void init_uninorth(void))
+{
+	/* 
+	 * Turns OFF the gmac clock. The gmac driver will turn
+	 * it back ON when the interface is enabled. This save
+	 * power on portables.
+	 * 
+	 * Note: We could also try to turn OFF the PHY. Since this
+	 * has to be done by both the gmac driver and this code,
+	 * I'll probably end-up moving some of this out of the
+	 * modular gmac driver into a non-modular stub containing
+	 * some basic PHY management and power management stuffs
+	 */
+	struct device_node* uni_n = find_devices("uni-n");
+	struct device_node* gmac = find_devices("ethernet");
+	unsigned long* addr;
+	
+	if (!uni_n || uni_n->n_addrs < 1)
+		return;
+	addr = ioremap(uni_n->addrs[0].address, 0x300);
+
+	while(gmac) {
+		if (device_is_compatible(gmac, "gmac"))
+			break;
+		gmac = gmac->next;
+	}
+	if (gmac) {
+		*(addr + 8) &= ~0x00000002UL;
+		eieio();
+	}
+}
+
 extern char *bootpath;
 extern char *bootdevice;
 void *boot_host;
@@ -366,7 +411,6 @@
 pmac_init2(void))
 {
 	adb_init();
-	pmac_nvram_init();
 	media_bay_init();
 }
 
@@ -402,14 +446,13 @@
 #endif
 
 #ifdef CONFIG_BLK_DEV_IDE_PMAC
-extern int pmac_ide_count;
-extern struct device_node *pmac_ide_node[];
-static int ide_majors[] = { 3, 22, 33, 34, 56, 57 };
+
+extern kdev_t pmac_find_ide_boot(char *bootdevice, int n);
 
 __initfunc(kdev_t find_ide_boot(void))
 {
 	char *p;
-	int i, n;
+	int n;
 
 	if (bootdevice == NULL)
 		return 0;
@@ -418,18 +461,7 @@
 		return 0;
 	n = p - bootdevice;
 
-	/*
-	 * Look through the list of IDE interfaces for this one.
-	 */
-	for (i = 0; i < pmac_ide_count; ++i) {
-		char *name = pmac_ide_node[i]->full_name;
-		if (memcmp(name, bootdevice, n) == 0 && name[n] == 0) {
-			/* XXX should cope with the 2nd drive as well... */
-			return MKDEV(ide_majors[i], 0);
-		}
-	}
-
-	return 0;
+	return pmac_find_ide_boot(bootdevice, n);
 }
 #endif /* CONFIG_BLK_DEV_IDE_PMAC */
 
@@ -468,7 +500,7 @@
 	if (boot_dev == 0 || dev == boot_dev) {
 		ROOT_DEV = MKDEV(MAJOR(dev), MINOR(dev) + part);
 		boot_dev = NODEV;
-		printk(" (root)");
+		printk(" (root on %d)", part);
 	}
 }
 
@@ -477,6 +509,8 @@
 {
 	struct adb_request req;
 
+	pmac_nvram_update();
+	
 	switch (adb_hardware) {
 	case ADB_VIACUDA:
 		cuda_request(&req, NULL, 2, CUDA_PACKET,
@@ -497,6 +531,8 @@
 {
 	struct adb_request req;
 
+	pmac_nvram_update();
+	
 	switch (adb_hardware) {
 	case ADB_VIACUDA:
 		cuda_request(&req, NULL, 2, CUDA_PACKET,
@@ -515,7 +551,6 @@
 void
 pmac_halt(void)
 {
-   pmac_power_off();
 }
 
 
@@ -541,11 +576,15 @@
         return 0;
 }
 
+#if defined(CONFIG_BLK_DEV_IDE_PMAC)
+extern ide_ioreg_t pmac_ide_get_base(int index);
+#endif
+
 ide_ioreg_t
 pmac_ide_default_io_base(int index)
 {
 #if defined(CONFIG_BLK_DEV_IDE_PMAC)
-        return pmac_ide_regbase[index];
+        return pmac_ide_get_base(index);
 #else
 	return 0;
 #endif
@@ -611,7 +650,7 @@
 	ppc_md.power_off      = pmac_power_off;
 	ppc_md.halt           = pmac_halt;
 
-	ppc_md.time_init      = NULL;
+	ppc_md.time_init      = pmac_time_init;
 	ppc_md.set_rtc_time   = pmac_set_rtc_time;
 	ppc_md.get_rtc_time   = pmac_get_rtc_time;
 	ppc_md.calibrate_decr = pmac_calibrate_decr;
@@ -625,6 +664,7 @@
 	ppc_md.kbd_init_hw       = mackbd_init_hw;
 #ifdef CONFIG_MAGIC_SYSRQ
 	ppc_md.kbd_sysrq_xlate	 = mackbd_sysrq_xlate;
+	ppc_md.SYSRQ_KEY	 = 0x69;
 #endif
 #endif
 
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/arch/ppc/kernel/pmac_support.c linux.17p9/arch/ppc/kernel/pmac_support.c
--- linux.vanilla/arch/ppc/kernel/pmac_support.c	Fri Apr 21 12:45:47 2000
+++ linux.17p9/arch/ppc/kernel/pmac_support.c	Mon Jun 26 15:46:10 2000
@@ -1,10 +1,19 @@
 /*
  * Miscellaneous procedures for dealing with the PowerMac hardware.
+ * Contains support for the nvram.
+ * 
+ *   Copyright (C) 2000 Paul Mackerras
+ *   Copyright (C) 2000 Benjamin Herrenschmidt
+ *
+ * ToDo: Handle type 0 and type 1 "NameRegistry" NVRAM properties. Those
+ *       contain, among other things, the brightness, video mode, etc...
  */
 #include <linux/kernel.h>
 #include <linux/stddef.h>
 #include <linux/reboot.h>
 #include <linux/nvram.h>
+#include <linux/slab.h>
+#include <linux/delay.h>
 #include <asm/init.h>
 #include <asm/ptrace.h>
 #include <asm/io.h>
@@ -13,6 +22,39 @@
 #include <asm/prom.h>
 #include <asm/adb.h>
 #include <asm/pmu.h>
+#include <asm/machdep.h>
+#include <asm/nvram.h>
+
+#undef DEBUG
+
+#define NVRAM_SIZE		0x2000	/* 8kB of non-volatile RAM */
+
+#define CORE99_SIGNATURE	0x5a
+#define CORE99_ADLER_START	0x14
+
+/* Core99 nvram is a flash */
+#define CORE99_FLASH_STATUS_DONE	0x80
+#define CORE99_FLASH_STATUS_ERR		0x38
+#define CORE99_FLASH_CMD_ERASE_CONFIRM	0xd0
+#define CORE99_FLASH_CMD_ERASE_SETUP	0x20
+#define CORE99_FLASH_CMD_RESET		0xff
+#define CORE99_FLASH_CMD_WRITE_SETUP	0x40
+
+/* CHRP NVRAM header */
+struct chrp_header {
+	u8	signature;
+	u8	cksum;
+	u16	len;
+	char    name[12];
+	u8	data[0];
+};
+
+struct core99_header {
+	struct chrp_header hdr;
+	u32	adler;
+	u32	generation;
+	u32	reserved[2];
+};
 
 /*
  * Read and write the non-volatile RAM on PowerMacs and CHRP machines.
@@ -20,24 +62,217 @@
 static int nvram_naddrs;
 static volatile unsigned char *nvram_addr;
 static volatile unsigned char *nvram_data;
-static int nvram_mult;
+static int nvram_mult, is_core_99;
+static int core99_bank = 0;
+static int nvram_partitions[3];
+
+/* FIXME: kmalloc fails to allocate the image now that I had to move it
+ *        before time_init(). For now, I allocate a static buffer here
+ *        but it's a waste of space on all but core99 machines
+ */
+#if 0
+static char* nvram_image;
+#else
+__pmac static char nvram_image[NVRAM_SIZE];
+#endif
+
+extern int pmac_newworld;
+
+static u8
+chrp_checksum(struct chrp_header* hdr)
+{
+	u8 *ptr;
+	u16 sum = hdr->signature;
+	for (ptr = (u8 *)&hdr->len; ptr < hdr->data; ptr++)
+		sum += *ptr;
+	while (sum > 0xFF)
+		sum = (sum & 0xFF) + (sum>>8);
+	return sum;
+}
+
+static u32
+core99_calc_adler(u8 *buffer)
+{
+	int cnt;
+	u32 low, high;
+
+   	buffer += CORE99_ADLER_START;
+	low = 1;
+	high = 0;
+	for (cnt=0; cnt<(NVRAM_SIZE-CORE99_ADLER_START); cnt++) {
+		if ((cnt % 5000) == 0) {
+			high  %= 65521UL;
+			high %= 65521UL;
+		}
+		low += buffer[cnt];
+		high += low;
+	}
+	low  %= 65521UL;
+	high %= 65521UL;
+  
+	return (high << 16) | low;
+}
+
+static u32
+core99_check(u8* datas)
+{
+	struct core99_header* hdr99 = (struct core99_header*)datas;
+
+	if (hdr99->hdr.signature != CORE99_SIGNATURE) {
+#ifdef DEBUG
+		printk("Invalid signature\n");
+#endif		
+		return 0;
+	}
+	if (hdr99->hdr.cksum != chrp_checksum(&hdr99->hdr)) {
+#ifdef DEBUG
+		printk("Invalid checksum\n");
+#endif
+		return 0;
+	}
+	if (hdr99->adler != core99_calc_adler(datas)) {
+#ifdef DEBUG
+		printk("Invalid adler\n");
+#endif
+		return 0;
+	}
+	return hdr99->generation;
+}
+
+static int
+core99_erase_bank(int bank)
+{
+	int stat, i;
+	
+	u8* base = (u8 *)nvram_data + core99_bank*NVRAM_SIZE;
+	
+	out_8(base, CORE99_FLASH_CMD_ERASE_SETUP);
+	out_8(base, CORE99_FLASH_CMD_ERASE_CONFIRM);
+	do { stat = in_8(base); }
+	while(!(stat & CORE99_FLASH_STATUS_DONE));
+	out_8(base, CORE99_FLASH_CMD_RESET);
+	if (stat & CORE99_FLASH_STATUS_ERR) {
+		printk("nvram: flash error 0x%02x on erase !\n", stat);
+		return -ENXIO;
+	}
+	for (i=0; i<NVRAM_SIZE; i++)
+		if (base[i] != 0xff) {
+			printk("nvram: flash erase failed !\n");
+			return -ENXIO;
+		}
+	return 0;
+}
 
-#define NVRAM_SIZE	0x2000	/* 8kB of non-volatile RAM */
+static int
+core99_write_bank(int bank, u8* datas)
+{
+	int i, stat = 0;
+	
+	u8* base = (u8 *)nvram_data + core99_bank*NVRAM_SIZE;
+	
+	for (i=0; i<NVRAM_SIZE; i++) {
+		out_8(base+i, CORE99_FLASH_CMD_WRITE_SETUP);
+		out_8(base+i, datas[i]);
+		do { stat = in_8(base); }
+		while(!(stat & CORE99_FLASH_STATUS_DONE));
+		if (stat & CORE99_FLASH_STATUS_ERR)
+			break;
+	}
+	out_8(base, CORE99_FLASH_CMD_RESET);
+	if (stat & CORE99_FLASH_STATUS_ERR) {
+		printk("nvram: flash error 0x%02x on write !\n", stat);
+		return -ENXIO;
+	}
+	for (i=0; i<NVRAM_SIZE; i++)
+		if (base[i] != datas[i]) {
+			printk("nvram: flash write failed !\n");
+			return -ENXIO;
+		}
+	return 0;	
+}
 
+static void
+lookup_partitions(void)
+{
+	u8 buffer[17];
+	int i, offset;
+	struct chrp_header* hdr;
+
+	if (pmac_newworld) {
+		nvram_partitions[pmac_nvram_OF] = -1;
+		nvram_partitions[pmac_nvram_XPRAM] = -1;
+		nvram_partitions[pmac_nvram_NR] = -1;
+		hdr = (struct chrp_header *)buffer;
+	
+		offset = 0;
+		buffer[16] = 0;
+		do {
+			for (i=0;i<16;i++)
+				buffer[i] = nvram_read_byte(offset+i);
+			if (!strcmp(hdr->name, "common"))
+				nvram_partitions[pmac_nvram_OF] = offset + 0x10;
+			if (!strcmp(hdr->name, "APL,MacOS75")) {
+				nvram_partitions[pmac_nvram_XPRAM] = offset + 0x10;
+				nvram_partitions[pmac_nvram_NR] = offset + 0x110;
+			}
+			offset += (hdr->len * 0x10);
+		} while(offset < NVRAM_SIZE);
+	} else {
+		nvram_partitions[pmac_nvram_OF] = 0x1800;
+		nvram_partitions[pmac_nvram_XPRAM] = 0x1300;
+		nvram_partitions[pmac_nvram_NR] = 0x1400;
+	}	
+#ifdef DEBUG
+	printk("nvram: OF partition at 0x%x\n", nvram_partitions[pmac_nvram_OF]);
+	printk("nvram: XP partition at 0x%x\n", nvram_partitions[pmac_nvram_XPRAM]);
+	printk("nvram: NR partition at 0x%x\n", nvram_partitions[pmac_nvram_NR]);
+#endif	
+}
 
 __init
 void pmac_nvram_init(void)
 {
 	struct device_node *dp;
 
+	nvram_naddrs = 0;
+
 	dp = find_devices("nvram");
 	if (dp == NULL) {
 		printk(KERN_ERR "Can't find NVRAM device\n");
-		nvram_naddrs = 0;
 		return;
 	}
 	nvram_naddrs = dp->n_addrs;
-	if (_machine == _MACH_chrp && nvram_naddrs == 1) {
+	is_core_99 = device_is_compatible(dp, "nvram,flash");
+	printk("pmac nvram is core99: %d\n", is_core_99);
+	if (is_core_99) {
+		int i;
+		u32 gen_bank0, gen_bank1;
+		
+		if (nvram_naddrs < 1) {
+			printk(KERN_ERR "nvram: no address\n");
+			return;
+		}
+#if 0
+		nvram_image = kmalloc(NVRAM_SIZE, GFP_KERNEL);
+		if (!nvram_image) {
+			printk(KERN_ERR "nvram: can't allocate image\n");
+			return;
+		}
+#endif		
+		nvram_data = ioremap(dp->addrs[0].address, NVRAM_SIZE*2);
+#ifdef DEBUG
+		printk("nvram: Checking bank 0...\n");
+#endif
+		gen_bank0 = core99_check((u8 *)nvram_data);
+		gen_bank1 = core99_check((u8 *)nvram_data + NVRAM_SIZE);
+		core99_bank = (gen_bank0 < gen_bank1) ? 1 : 0;
+#ifdef DEBUG
+		printk("nvram: gen0=%d, gen1=%d\n", gen_bank0, gen_bank1);
+		printk("nvram: Active bank is: %d\n", core99_bank);
+#endif
+		for (i=0; i<NVRAM_SIZE; i++)
+			nvram_image[i] = nvram_data[i + core99_bank*NVRAM_SIZE];
+	} else if (_machine == _MACH_chrp && nvram_naddrs == 1) {
 		nvram_data = ioremap(dp->addrs[0].address, dp->addrs[0].size);
 		nvram_mult = 1;
 	} else if (nvram_naddrs == 1) {
@@ -46,15 +281,44 @@
 	} else if (nvram_naddrs == 2) {
 		nvram_addr = ioremap(dp->addrs[0].address, dp->addrs[0].size);
 		nvram_data = ioremap(dp->addrs[1].address, dp->addrs[1].size);
-	} else if (nvram_naddrs == 0 && adb_hardware == ADB_VIAPMU) {
+	} else if (nvram_naddrs == 0 && adb_controller->kind == ADB_VIAPMU) {
 		nvram_naddrs = -1;
 	} else {
 		printk(KERN_ERR "Don't know how to access NVRAM with %d addresses\n",
 		       nvram_naddrs);
 	}
+	lookup_partitions();
 }
 
-unsigned char nvram_read_byte(int addr)
+void
+pmac_nvram_update(void)
+{
+	struct core99_header* hdr99;
+	
+	if (!is_core_99 || !nvram_data || !nvram_image)
+		return;
+	if (!memcmp(nvram_image, (u8*)nvram_data + core99_bank*NVRAM_SIZE,
+		NVRAM_SIZE))
+		return;
+#ifdef DEBUG
+	printk("Updating nvram...\n");
+#endif
+	hdr99 = (struct core99_header*)nvram_image;
+	hdr99->generation++;
+	hdr99->hdr.signature = CORE99_SIGNATURE;
+	hdr99->hdr.cksum = chrp_checksum(&hdr99->hdr);
+	hdr99->adler = core99_calc_adler(nvram_image);
+	core99_bank = core99_bank ? 0 : 1;
+	if (core99_erase_bank(core99_bank)) {
+		printk("nvram: Error erasing bank %d\n", core99_bank);
+		return;
+	}
+	if (core99_write_bank(core99_bank, nvram_image))
+		printk("nvram: Error writing bank %d\n", core99_bank);
+}
+
+unsigned char
+nvram_read_byte(int addr)
 {
 	struct adb_request req;
 
@@ -67,6 +331,8 @@
 			pmu_poll();
 		return req.reply[1];
 	case 1:
+		if (is_core_99)
+			return nvram_image ? nvram_image[addr] : 0;
 		return nvram_data[(addr & (NVRAM_SIZE - 1)) * nvram_mult];
 	case 2:
 		*nvram_addr = addr >> 5;
@@ -76,7 +342,8 @@
 	return 0;
 }
 
-void nvram_write_byte(unsigned char val, int addr)
+void
+nvram_write_byte(unsigned char val, int addr)
 {
 	struct adb_request req;
 
@@ -89,6 +356,12 @@
 			pmu_poll();
 		break;
 	case 1:
+		if (is_core_99) {
+			if (!nvram_image)
+				return;
+			nvram_image[addr] = val;
+			break;
+		}
 		nvram_data[(addr & (NVRAM_SIZE - 1)) * nvram_mult] = val;
 		break;
 	case 2:
@@ -99,3 +372,32 @@
 	}
 	eieio();
 }
+
+int
+pmac_get_partition(int partition)
+{
+	return nvram_partitions[partition];
+}
+
+u8
+pmac_xpram_read(int xpaddr)
+{
+	int offset = nvram_partitions[pmac_nvram_XPRAM];
+	
+	if (offset < 0)
+		return 0;
+		
+	return nvram_read_byte(xpaddr + offset);
+}
+
+void
+pmac_xpram_write(int xpaddr, u8 data)
+{
+	int offset = nvram_partitions[pmac_nvram_XPRAM];
+	
+	if (offset < 0)
+		return;
+		
+	nvram_write_byte(xpaddr + offset, data);
+}
+
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/arch/ppc/kernel/pmac_time.c linux.17p9/arch/ppc/kernel/pmac_time.c
--- linux.vanilla/arch/ppc/kernel/pmac_time.c	Fri Apr 21 12:45:47 2000
+++ linux.17p9/arch/ppc/kernel/pmac_time.c	Mon Jun 26 15:46:10 2000
@@ -22,8 +22,9 @@
 #include <asm/system.h>
 #include <asm/io.h>
 #include <asm/pgtable.h>
+#include <asm/nvram.h>
 
-#include "time.h"
+#include <asm/time.h>
 
 /* Apparently the RTC stores seconds since 1 Jan 1904 */
 #define RTC_OFFSET	2082844800
@@ -49,11 +50,35 @@
 /* Bits in IFR and IER */
 #define T1_INT		0x40		/* Timer 1 interrupt */
 
-__pmac
+extern struct timezone sys_tz;
+
+__init
+void pmac_time_init(void)
+{
+	s32 delta = 0;
+	int dst;
+	int i;
+	char tmp[1024];
+	char *p = tmp;
+	
+	delta = ((s32)pmac_xpram_read(PMAC_XPRAM_MACHINE_LOC + 0x9)) << 16;
+	delta |= ((s32)pmac_xpram_read(PMAC_XPRAM_MACHINE_LOC + 0xa)) << 8;
+	delta |= pmac_xpram_read(PMAC_XPRAM_MACHINE_LOC + 0xb);
+	if (delta & 0x00800000UL)
+		delta |= 0xFF000000UL;
+	dst = ((pmac_xpram_read(PMAC_XPRAM_MACHINE_LOC + 0x8) & 0x80) != 0);
+	printk("GMT Delta read from XPRAM: %d minutes, DST: %s\n", delta/60,
+		dst ? "on" : "off");
+	sys_tz.tz_minuteswest = -delta/60;
+	/* I _suppose_ this is 0:off, 1:on */
+	sys_tz.tz_dsttime = dst;
+}
 
+__pmac
 unsigned long pmac_get_rtc_time(void)
 {
 	struct adb_request req;
+	int offset = sys_tz.tz_minuteswest * 60;
 
 	/* Get the time from the RTC */
 	if (adb_controller == 0)
@@ -70,7 +95,7 @@
 			printk(KERN_ERR "pmac_get_rtc_time: got %d byte reply\n",
 			       req.reply_len);
 		return (req.reply[3] << 24) + (req.reply[4] << 16)
-			+ (req.reply[5] << 8) + req.reply[6] - RTC_OFFSET;
+			+ (req.reply[5] << 8) + req.reply[6] - RTC_OFFSET + offset;
 	case ADB_VIAPMU:
 		if (pmu_request(&req, NULL, 1, PMU_READ_RTC) < 0) {
 			printk("pmac_read_rtc_time: pmu_request failed\n");
@@ -82,7 +107,7 @@
 			printk(KERN_ERR "pmac_get_rtc_time: got %d byte reply\n",
 			       req.reply_len);
 		return (req.reply[1] << 24) + (req.reply[2] << 16)
-			+ (req.reply[3] << 8) + req.reply[4] - RTC_OFFSET;
+			+ (req.reply[3] << 8) + req.reply[4] - RTC_OFFSET + offset;
 	default:
 		return 0;
 	}
@@ -90,7 +115,39 @@
 
 int pmac_set_rtc_time(unsigned long nowtime)
 {
-	return 0;
+	struct adb_request req;
+
+	nowtime += RTC_OFFSET - sys_tz.tz_minuteswest * 60;
+
+	/* Set the time in the RTC */
+	if (adb_controller == 0)
+		return 0;
+	/* adb_controller->kind, not adb_hardware, since that doesn't
+	   get set until we call adb_init - paulus. */
+	switch (adb_controller->kind) {
+	case ADB_VIACUDA:
+		if (cuda_request(&req, NULL, 6, CUDA_PACKET, CUDA_SET_TIME,
+				 nowtime >> 24, nowtime >> 16, nowtime >> 8, nowtime) < 0)
+			return 0;
+		while (!req.complete)
+			cuda_poll();
+//		if (req.reply_len != 7)
+			printk(KERN_ERR "pmac_set_rtc_time: got %d byte reply\n",
+			       req.reply_len);
+		return 1;
+	case ADB_VIAPMU:
+		if (pmu_request(&req, NULL, 5, PMU_SET_RTC,
+				nowtime >> 24, nowtime >> 16, nowtime >> 8, nowtime) < 0)
+			return 0;
+		while (!req.complete)
+			pmu_poll();
+		if (req.reply_len != 5)
+			printk(KERN_ERR "pmac_set_rtc_time: got %d byte reply\n",
+			       req.reply_len);
+		return 1;
+	default:
+		return 0;
+	}
 }
 
 /*
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/arch/ppc/kernel/ppc-stub.c linux.17p9/arch/ppc/kernel/ppc-stub.c
--- linux.vanilla/arch/ppc/kernel/ppc-stub.c	Fri Apr 21 12:45:47 2000
+++ linux.17p9/arch/ppc/kernel/ppc-stub.c	Fri Jun 16 16:24:33 2000
@@ -351,7 +351,7 @@
 
 static inline void set_msr(int msr)
 {
-	asm volatile("mfmsr %0" : : "r" (msr));
+	asm volatile("mtmsr %0" : : "r" (msr));
 }
 
 /* Set up exception handlers for tracing and breakpoints
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/arch/ppc/kernel/ppc_asm.tmpl linux.17p9/arch/ppc/kernel/ppc_asm.tmpl
--- linux.vanilla/arch/ppc/kernel/ppc_asm.tmpl	Fri Apr 21 12:45:47 2000
+++ linux.17p9/arch/ppc/kernel/ppc_asm.tmpl	Fri Jun 16 16:24:33 2000
@@ -64,3 +64,36 @@
 #define	fr29	29
 #define	fr30	30
 #define	fr31	31
+
+#define	vr0	0
+#define	vr1	1
+#define	vr2	2
+#define	vr3	3
+#define	vr4	4
+#define	vr5	5
+#define	vr6	6
+#define	vr7	7
+#define	vr8	8
+#define	vr9	9
+#define	vr10	10
+#define	vr11	11
+#define	vr12	12
+#define	vr13	13
+#define	vr14	14
+#define	vr15	15
+#define	vr16	16
+#define	vr17	17
+#define	vr18	18
+#define	vr19	19
+#define	vr20	20
+#define	vr21	21
+#define	vr22	22
+#define	vr23	23
+#define	vr24	24
+#define	vr25	25
+#define	vr26	26
+#define	vr27	27
+#define	vr28	28
+#define	vr29	29
+#define	vr30	30
+#define	vr31	31
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/arch/ppc/kernel/ppc_htab.c linux.17p9/arch/ppc/kernel/ppc_htab.c
--- linux.vanilla/arch/ppc/kernel/ppc_htab.c	Fri Apr 21 12:45:47 2000
+++ linux.17p9/arch/ppc/kernel/ppc_htab.c	Fri Jun 16 16:24:33 2000
@@ -547,7 +547,8 @@
 		"0.5", "1.0", "(reserved2)", "(reserved3)"
 	};
 
-	if ( (_get_PVR() >> 16) != 8) return -EFAULT;
+	if ( ((_get_PVR() >> 16) != 8) && ((_get_PVR() >> 16) != 12))
+		return -EFAULT;
 	
 	if ( /*!table->maxlen ||*/ (filp->f_pos && !write)) {
 		*lenp = 0;
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/arch/ppc/kernel/ppc_ksyms.c linux.17p9/arch/ppc/kernel/ppc_ksyms.c
--- linux.vanilla/arch/ppc/kernel/ppc_ksyms.c	Fri Apr 21 12:45:47 2000
+++ linux.17p9/arch/ppc/kernel/ppc_ksyms.c	Mon Jun 26 15:46:10 2000
@@ -29,6 +29,8 @@
 #include <asm/spinlock.h>
 #include <asm/dma.h>
 #include <asm/machdep.h>
+#include <asm/nvram.h>
+#include <asm/time.h>
 
 /* Tell string.h we don't want memcpy etc. as cpp defines */
 #define EXPORT_SYMTAB_STROPS
@@ -45,10 +47,14 @@
 extern atomic_t ppc_n_lost_interrupts;
 extern void do_lost_interrupts(unsigned long);
 extern int do_signal(sigset_t *, struct pt_regs *);
-
-asmlinkage long long __ashrdi3(long long, int);
-asmlinkage long long __lshrdi3(long long, int);
-asmlinkage int abs(int);
+extern unsigned long mktime(unsigned int, unsigned int, unsigned int,
+                            unsigned int, unsigned int, unsigned int);
+extern void to_tm(int tim, struct rtc_time * tm);
+
+long long __ashrdi3(long long, int);
+long long __ashldi3(long long, int);
+long long __lshrdi3(long long, int);
+int abs(int);
 
 EXPORT_SYMBOL(clear_page);
 EXPORT_SYMBOL(do_signal);
@@ -152,6 +158,7 @@
 
 EXPORT_SYMBOL(start_thread);
 EXPORT_SYMBOL(kernel_thread);
+EXPORT_SYMBOL(init_mm);
 
 EXPORT_SYMBOL(__cli);
 EXPORT_SYMBOL(__sti);
@@ -164,6 +171,11 @@
 EXPORT_SYMBOL(enable_kernel_fp);
 EXPORT_SYMBOL(flush_icache_range);
 EXPORT_SYMBOL(xchg_u32);
+
+#ifdef CONFIG_ALTIVEC
+EXPORT_SYMBOL(giveup_altivec);
+#endif
+
 #ifdef __SMP__
 EXPORT_SYMBOL(__global_cli);
 EXPORT_SYMBOL(__global_sti);
@@ -200,6 +212,8 @@
 EXPORT_SYMBOL(find_phandle);
 EXPORT_SYMBOL(device_is_compatible);
 EXPORT_SYMBOL(machine_is_compatible);
+EXPORT_SYMBOL(find_pci_device_OFnode);
+EXPORT_SYMBOL(find_all_nodes);
 EXPORT_SYMBOL(get_property);
 EXPORT_SYMBOL(pci_io_base);
 EXPORT_SYMBOL(pci_device_loc);
@@ -210,14 +224,21 @@
 EXPORT_SYMBOL(note_scsi_host);
 #endif
 EXPORT_SYMBOL(kd_mksound);
-#ifdef CONFIG_PMAC
+/*#ifdef CONFIG_PMAC */
 EXPORT_SYMBOL(nvram_read_byte);
 EXPORT_SYMBOL(nvram_write_byte);
-#endif /* CONFIG_PMAC */
+EXPORT_SYMBOL(pmac_xpram_read);
+EXPORT_SYMBOL(pmac_xpram_write);
+/*#endif*/ /* CONFIG_PMAC */
+#ifdef CONFIG_PPC_RTC
+EXPORT_SYMBOL(mktime);
+EXPORT_SYMBOL(to_tm);
+#endif
 
 EXPORT_SYMBOL(abs);
 
 EXPORT_SYMBOL_NOVERS(__ashrdi3);
+EXPORT_SYMBOL_NOVERS(__ashldi3);
 EXPORT_SYMBOL_NOVERS(__lshrdi3);
 EXPORT_SYMBOL_NOVERS(memcpy);
 EXPORT_SYMBOL_NOVERS(memset);
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/arch/ppc/kernel/prep_pci.c linux.17p9/arch/ppc/kernel/prep_pci.c
--- linux.vanilla/arch/ppc/kernel/prep_pci.c	Fri Apr 21 12:45:47 2000
+++ linux.17p9/arch/ppc/kernel/prep_pci.c	Fri Jun 16 16:24:33 2000
@@ -8,6 +8,7 @@
  */
 
 #include <linux/types.h>
+#include <linux/string.h>
 #include <linux/pci.h>
 #include <linux/kernel.h>
 #include <linux/init.h>
@@ -36,7 +37,7 @@
 unsigned char *Motherboard_routes;
 void (*Motherboard_non0)(struct pci_dev *);
 
-void Mesquite_Map_Non0(struct pci_dev *);
+void Powerplus_Map_Non0(struct pci_dev *);
 
 /* Used for Motorola to store system config register */
 static unsigned long	*ProcInfo;
@@ -508,6 +509,51 @@
         13      /* Line 4 */
 };
 
+/* Motorola PowerPlus architecture PCI IRQ tables */
+/* Interrupt line values for INTA-D on primary/secondary MPIC inputs */
+
+struct powerplus_irq_list
+{
+	unsigned char primary[4];	/* INT A-D */
+	unsigned char secondary[4];	/* INT A-D */
+};
+
+/*
+ * For standard PowerPlus boards, bus 0 PCI INTs A-D are routed to
+ * OpenPIC inputs 9-12.  PCI INTs A-D from the on board P2P bridge
+ * are routed to OpenPIC inputs 5-8.  These values are offset by 
+ * 16 in the table to reflect the Linux kernel interrupt value.
+ */
+struct powerplus_irq_list Powerplus_pci_IRQ_list =
+{
+	{25, 26, 27, 28},
+	{21, 22, 23, 24}
+};
+
+/* 
+ * For the MCP750 (system slot board), bus 0 PCI INTs A-D are routed
+ * to OpenPIC inputs 8-11.  PCI INTs A-D from the on board P2P bridge
+ * are routed to OpenPIC inputs 12-15.  These values are offset by 16
+ * in the table to reflect the Linux kernel interrupt value.
+ */
+struct powerplus_irq_list Mesquite_pci_IRQ_list =
+{
+	{24, 25, 26, 27},
+	{28, 29, 30, 31}
+};
+
+/*
+ * This table represents the standard PCI swizzle defined in the
+ * PCI bus specification.
+ */ 
+static unsigned char prep_pci_intpins[4][4] =
+{
+        { 1, 2, 3, 4},  /* Buses 0, 4, 8, ... */
+        { 2, 3, 4, 1},  /* Buses 1, 5, 9, ... */
+        { 3, 4, 1, 2},  /* Buses 2, 6, 10 ... */
+        { 4, 1, 2, 3},  /* Buses 3, 7, 11 ... */
+};
+
 /* We have to turn on LEVEL mode for changed IRQ's */
 /* All PCI IRQ's need to be level mode, so this should be something
  * other than hard-coded as well... IRQ's are individually mappable
@@ -685,8 +731,7 @@
 #define MOT_RAVEN_PRESENT	0x1
 #define MOT_HAWK_PRESENT	0x2
 
-/* Keyboard present flag */
-int prep_kbd_present = 1;   /* Keyboard present by default */
+int mot_entry = -1;
 
 int MotMPIC = 0;
 int mot_multi = 0;
@@ -751,13 +796,17 @@
 		mot_multi = 1;
 	}
 
-	/* This is a hack.  If this is a 2300 or 2400 mot board then there is
-	 * no keyboard controller and we have to indicate that.
+	/*
+	 * If a Motorola MVME2300, 2400, or MCPN750 board is detected
+	 * disable keyboard controller initialization to avoid system
+	 * hangs.
 	 */
 	base_mod = inb(MOTOROLA_BASETYPE_REG);
 	if ((MotMPIC == MOT_HAWK_PRESENT) || (base_mod == 0xF9) ||
-	    (base_mod == 0xFA) || (base_mod == 0xE1))
-		prep_kbd_present = 0;
+	    (base_mod == 0xFA) || (base_mod == 0xE1)) {
+		ppc_md.kbd_leds	= NULL; 
+		ppc_md.kbd_init_hw = NULL; 
+	}
 
 	return 1;
 }
@@ -771,33 +820,35 @@
 	unsigned char	*map;
 	unsigned char	*routes;
 	void		(*map_non0_bus)(struct pci_dev *);	/* For boards with more than bus 0 devices. */
+	struct powerplus_irq_list *pci_irq_list; /* List of PCI MPIC inputs */
+	unsigned char	secondary_bridge_devfn;	/* devfn of secondary bus transparent bridge */
 } mot_info[] = {
-	{0x300, 0x00, 0x00, "MVME 2400",			Genesis2_pci_IRQ_map,	Raven_pci_IRQ_routes,	NULL},
-	{0x010, 0x00, 0x00, "Genesis",				Genesis_pci_IRQ_map,	Genesis_pci_IRQ_routes, NULL},
-	{0x020, 0x00, 0x00, "Powerstack (Series E)",		Comet_pci_IRQ_map,	Comet_pci_IRQ_routes,	NULL},
-	{0x040, 0x00, 0x00, "Blackhawk (Powerstack)",		Blackhawk_pci_IRQ_map,	Blackhawk_pci_IRQ_routes, NULL},
-	{0x050, 0x00, 0x00, "Omaha (PowerStack II Pro3000)",	Omaha_pci_IRQ_map,	Omaha_pci_IRQ_routes,	NULL},
-	{0x060, 0x00, 0x00, "Utah (Powerstack II Pro4000)",	Utah_pci_IRQ_map,	Utah_pci_IRQ_routes,	NULL},
-	{0x0A0, 0x00, 0x00, "Powerstack (Series EX)",		Comet2_pci_IRQ_map,	Comet2_pci_IRQ_routes,	NULL},
-	{0x1E0, 0xE0, 0x00, "Mesquite cPCI (MCP750)",		Mesquite_pci_IRQ_map,	Raven_pci_IRQ_routes,	NULL},
-	{0x1E0, 0xE1, 0x00, "Sitka cPCI (MCPN750)",		Sitka_pci_IRQ_map,	Raven_pci_IRQ_routes,	NULL},
-	{0x1E0, 0xE2, 0x00, "Mesquite cPCI (MCP750) w/ HAC",	Mesquite_pci_IRQ_map,	Raven_pci_IRQ_routes,	Mesquite_Map_Non0},
-	{0x1E0, 0xF6, 0x80, "MTX Plus",				MTXplus_pci_IRQ_map,	Raven_pci_IRQ_routes,	NULL},
-	{0x1E0, 0xF6, 0x81, "Dual MTX Plus",			MTXplus_pci_IRQ_map,	Raven_pci_IRQ_routes,	NULL},
-	{0x1E0, 0xF7, 0x80, "MTX wo/ Parallel Port",		MTX_pci_IRQ_map,	Raven_pci_IRQ_routes,	NULL},
-	{0x1E0, 0xF7, 0x81, "Dual MTX wo/ Parallel Port",	MTX_pci_IRQ_map,	Raven_pci_IRQ_routes,	NULL},
-	{0x1E0, 0xF8, 0x80, "MTX w/ Parallel Port",		MTX_pci_IRQ_map,	Raven_pci_IRQ_routes,	NULL},
-	{0x1E0, 0xF8, 0x81, "Dual MTX w/ Parallel Port",	MTX_pci_IRQ_map,	Raven_pci_IRQ_routes,	NULL},
-	{0x1E0, 0xF9, 0x00, "MVME 2300",			Genesis2_pci_IRQ_map,	Raven_pci_IRQ_routes,	NULL},
-	{0x1E0, 0xFA, 0x00, "MVME 2300SC/2600",			Genesis2_pci_IRQ_map,	Raven_pci_IRQ_routes,	NULL},
-	{0x1E0, 0xFB, 0x00, "MVME 2600 with MVME712M",		Genesis2_pci_IRQ_map,	Raven_pci_IRQ_routes,	NULL},
-	{0x1E0, 0xFC, 0x00, "MVME 2600/2700 with MVME761",	Genesis2_pci_IRQ_map,	Raven_pci_IRQ_routes,	NULL},
-	{0x1E0, 0xFD, 0x80, "MVME 3600 with MVME712M",		Genesis2_pci_IRQ_map,	Raven_pci_IRQ_routes,	NULL},
-	{0x1E0, 0xFD, 0x81, "MVME 4600 with MVME712M",		Genesis2_pci_IRQ_map,	Raven_pci_IRQ_routes,	NULL},
-	{0x1E0, 0xFE, 0x80, "MVME 3600 with MVME761",		Genesis2_pci_IRQ_map,	Raven_pci_IRQ_routes,	NULL},
-	{0x1E0, 0xFE, 0x81, "MVME 4600 with MVME761",		Genesis2_pci_IRQ_map,	Raven_pci_IRQ_routes,	NULL},
-	{0x1E0, 0xFF, 0x00, "MVME 1600-001 or 1600-011",	Genesis2_pci_IRQ_map,	Raven_pci_IRQ_routes,	NULL},
-	{0x000, 0x00, 0x00, "",					NULL,			NULL,	NULL}
+	{0x300, 0x00, 0x00, "MVME 2400",			Genesis2_pci_IRQ_map,	Raven_pci_IRQ_routes,	Powerplus_Map_Non0, &Powerplus_pci_IRQ_list, 0x00},
+	{0x010, 0x00, 0x00, "Genesis",				Genesis_pci_IRQ_map,	Genesis_pci_IRQ_routes, Powerplus_Map_Non0, &Powerplus_pci_IRQ_list, 0x00},
+	{0x020, 0x00, 0x00, "Powerstack (Series E)",		Comet_pci_IRQ_map,	Comet_pci_IRQ_routes,	NULL, NULL, 0x00},
+	{0x040, 0x00, 0x00, "Blackhawk (Powerstack)",		Blackhawk_pci_IRQ_map,	Blackhawk_pci_IRQ_routes, NULL, NULL, 0x00},
+	{0x050, 0x00, 0x00, "Omaha (PowerStack II Pro3000)",	Omaha_pci_IRQ_map,	Omaha_pci_IRQ_routes,	NULL, NULL, 0x00},
+	{0x060, 0x00, 0x00, "Utah (Powerstack II Pro4000)",	Utah_pci_IRQ_map,	Utah_pci_IRQ_routes,	NULL, NULL, 0x00},
+	{0x0A0, 0x00, 0x00, "Powerstack (Series EX)",		Comet2_pci_IRQ_map,	Comet2_pci_IRQ_routes,	NULL, NULL, 0x00},
+	{0x1E0, 0xE0, 0x00, "Mesquite cPCI (MCP750)",		Mesquite_pci_IRQ_map,	Raven_pci_IRQ_routes,	Powerplus_Map_Non0, &Mesquite_pci_IRQ_list, 0x00},
+	{0x1E0, 0xE1, 0x00, "Sitka cPCI (MCPN750)",		Sitka_pci_IRQ_map,	Raven_pci_IRQ_routes,	Powerplus_Map_Non0, &Powerplus_pci_IRQ_list, 0x00},
+	{0x1E0, 0xE2, 0x00, "Mesquite cPCI (MCP750) w/ HAC",	Mesquite_pci_IRQ_map,	Raven_pci_IRQ_routes,	Powerplus_Map_Non0, &Mesquite_pci_IRQ_list, 0xC0},
+	{0x1E0, 0xF6, 0x80, "MTX Plus",				MTXplus_pci_IRQ_map,	Raven_pci_IRQ_routes,	Powerplus_Map_Non0, &Powerplus_pci_IRQ_list, 0xA0},
+	{0x1E0, 0xF6, 0x81, "Dual MTX Plus",			MTXplus_pci_IRQ_map,	Raven_pci_IRQ_routes,	Powerplus_Map_Non0, &Powerplus_pci_IRQ_list, 0xA0},
+	{0x1E0, 0xF7, 0x80, "MTX wo/ Parallel Port",		MTX_pci_IRQ_map,	Raven_pci_IRQ_routes,	Powerplus_Map_Non0, &Powerplus_pci_IRQ_list, 0x00},
+	{0x1E0, 0xF7, 0x81, "Dual MTX wo/ Parallel Port",	MTX_pci_IRQ_map,	Raven_pci_IRQ_routes,	Powerplus_Map_Non0, &Powerplus_pci_IRQ_list, 0x00},
+	{0x1E0, 0xF8, 0x80, "MTX w/ Parallel Port",		MTX_pci_IRQ_map,	Raven_pci_IRQ_routes,	Powerplus_Map_Non0, &Powerplus_pci_IRQ_list, 0x00},
+	{0x1E0, 0xF8, 0x81, "Dual MTX w/ Parallel Port",	MTX_pci_IRQ_map,	Raven_pci_IRQ_routes,	Powerplus_Map_Non0, &Powerplus_pci_IRQ_list, 0x00},
+	{0x1E0, 0xF9, 0x00, "MVME 2300",			Genesis2_pci_IRQ_map,	Raven_pci_IRQ_routes,	Powerplus_Map_Non0, &Powerplus_pci_IRQ_list, 0x00},
+	{0x1E0, 0xFA, 0x00, "MVME 2300SC/2600",			Genesis2_pci_IRQ_map,	Raven_pci_IRQ_routes,	Powerplus_Map_Non0, &Powerplus_pci_IRQ_list, 0x00},
+	{0x1E0, 0xFB, 0x00, "MVME 2600 with MVME712M",		Genesis2_pci_IRQ_map,	Raven_pci_IRQ_routes,	Powerplus_Map_Non0, &Powerplus_pci_IRQ_list, 0x00},
+	{0x1E0, 0xFC, 0x00, "MVME 2600/2700 with MVME761",	Genesis2_pci_IRQ_map,	Raven_pci_IRQ_routes,	Powerplus_Map_Non0, &Powerplus_pci_IRQ_list, 0x00},
+	{0x1E0, 0xFD, 0x80, "MVME 3600 with MVME712M",		Genesis2_pci_IRQ_map,	Raven_pci_IRQ_routes,	Powerplus_Map_Non0, &Powerplus_pci_IRQ_list, 0x00},
+	{0x1E0, 0xFD, 0x81, "MVME 4600 with MVME712M",		Genesis2_pci_IRQ_map,	Raven_pci_IRQ_routes,	Powerplus_Map_Non0, &Powerplus_pci_IRQ_list, 0x00},
+	{0x1E0, 0xFE, 0x80, "MVME 3600 with MVME761",		Genesis2_pci_IRQ_map,	Raven_pci_IRQ_routes,	Powerplus_Map_Non0, &Powerplus_pci_IRQ_list, 0x00},
+	{0x1E0, 0xFE, 0x81, "MVME 4600 with MVME761",		Genesis2_pci_IRQ_map,	Raven_pci_IRQ_routes,	Powerplus_Map_Non0, &Powerplus_pci_IRQ_list, 0x00},
+	{0x1E0, 0xFF, 0x00, "MVME 1600-001 or 1600-011",	Genesis2_pci_IRQ_map,	Raven_pci_IRQ_routes,	NULL, NULL, 0x00},
+	{0x000, 0x00, 0x00, "",					NULL,			NULL,	NULL, 0x00}
 };
 
 __initfunc(unsigned long prep_route_pci_interrupts(void))
@@ -812,7 +863,6 @@
 		unsigned char  cpu_type;
 		unsigned char  base_mod;
 		int	       entry;
-		int	       mot_entry = -1;
 
 		cpu_type = inb(MOTOROLA_CPUTYPE_REG) & 0xF0;
 		base_mod = inb(MOTOROLA_BASETYPE_REG);
@@ -989,91 +1039,91 @@
 	return 0;
 }
 
-static unsigned int pci_localpirqs[4] =
-{
-	24,
-	25,
-	26,
-	27
-};
-
-static unsigned int pci_remotepirqs[4] =
-{
-	28,
-	29,
-	30,
-	31
-};
-
-static unsigned int pci_remotedev = 0xc0;
-
+/*
+ * Remove a device from the kernel PCI device list based on its 
+ * devfn identifier.
+ */
+__initfunc(
 void
-Mesquite_Map_Non0(struct pci_dev *pdev)
+prep_exclude_pci_device(unsigned char devfn)
+)
 {
-	struct pci_bus  *pbus;          /* Parent Bus Structure Pointer */
-	unsigned int    devnum;         /* Accumulated Device Number */
-	unsigned int    irq;            /* IRQ Value */
-
-	/*
-	**    Device Interrupt Line register initialization.
-	**    The IRQ line number will be generated after
-	**    taking into account all the PCI-2-PCI bridge
-	**    devices between the device and the Host Bridge.
-	*/
-	devnum = PCI_SLOT(pdev->devfn);
-	pbus = pdev->bus;
+	struct pci_dev *dev, *pdev = NULL;
 
-	while ((pbus->parent)->primary != (pbus->parent)->secondary)
-	{
-	    devnum += PCI_SLOT((pbus->self)->devfn);
+	/* Walk the pci device list */
+	for(dev=pci_devices; dev; dev=dev->next) {
+		if (dev->devfn == devfn)
+		{
+			/*
+			 * If we find a matching device, adjust
+			 * the list to remove the device.
+			 */
+			if (pdev != NULL)
+				pdev->next = dev->next;
+			else
+				pci_devices = dev->next;
 
-	    pbus = pbus->parent;
+			break;
+		}
+		pdev = dev;
 	}
+}
 
-	devnum &= 0x03;
-
-	/*
-	**    By default, get the PCI local domain IRQ value.
-	*/
-	irq = pci_localpirqs[devnum];
-
-	/*
-	**    Determine if the device is located in the
-	**    remote domain or not. We must find the
-	**    domain's bridge device located on bus 0.
-	*/
-	pbus = pdev->bus;
+void
+Powerplus_Map_Non0(struct pci_dev *dev)
+{
+	struct pci_bus  *pbus;          /* Parent bus structure pointer */
+	struct pci_dev	*tdev;		/* Temporary device structure */
+        unsigned int    devnum;         /* Accumulated device number */
+        unsigned char   intline;        /* Linux interrupt value */
+	unsigned char	intpin;		/* PCI interrupt pin */
+ 
+	/* Check for valid PCI dev pointer */
+	if (dev == NULL) return;
+
+	/* Fill our temporary device, and get the device number */
+	*tdev = *dev;
+	devnum = PCI_SLOT(tdev->devfn);
+
+	/* Read the interrupt pin of the device and adjust for indexing */
+	pcibios_read_config_byte(tdev->bus->number, tdev->devfn,
+				PCI_INTERRUPT_PIN, &intpin);
 
-	while (pbus->primary != 0)
-	    pbus = pbus->parent;
+	/* If device doesn't request an interrupt, return */
+	if ( (intpin < 1) || (intpin > 4) )
+		return;
 
-	/*
-	**    Check the device/function of domain's bridge
-	**    device against the remote device/function.
-	**    If the same, then the device is located in
-	**    the remote domain. Thus, get the PCI remote
-	**    domain IRQ value.
-	*/
-	if ((pbus->self)->devfn == pci_remotedev)
-        irq = pci_remotepirqs[devnum];
+	intpin--;
 
-	/*
-	**    Validate the IRQ number.
-	*/
-	if (irq <= 255)
+	/* Walk up to bus 0, adjusting the interrupt pin for the standard
+	   PCI bus swizzle. */
+	do {
+		intpin = (prep_pci_intpins[devnum % 4][intpin]) - 1;
+		pbus = tdev->bus;        /* up one level */
+		tdev = pbus->self;
+		devnum = PCI_SLOT(tdev->devfn);
+	} while(tdev->bus->number);
+
+	/* Use the primary interrupt inputs by default */
+	intline = mot_info[mot_entry].pci_irq_list->primary[intpin];
+
+	/* If the board has secondary interrupt inputs, walk the bus and
+	   note the devfn of the bridge from bus 0.  If it is the same as
+	   the devfn of the bus bridge with secondary inputs, use those. */
+	if (mot_info[mot_entry].secondary_bridge_devfn)
 	{
-	    /*
-	    **    Set the device's Interrupt Line register
-	    **    to the IRQ number and save it in the
-	    **    device's structure.
-	    */
-
-	    pci_write_config_byte(pdev, PCI_INTERRUPT_LINE, (u8)irq);
-
-	    pdev->irq = irq;
-
+		pbus = dev->bus;
+ 
+		while (pbus->primary != 0)
+			pbus = pbus->parent;
+ 
+		if ((pbus->self)->devfn == mot_info[mot_entry].secondary_bridge_devfn)
+			intline = mot_info[mot_entry].pci_irq_list->secondary[intpin];
 	}
-	return;
+	
+	/* Write calculated interrupt value to header and device list */
+	pci_write_config_byte(dev, PCI_INTERRUPT_LINE, (u8)intline);
+	dev->irq = intline;
 }
 
 int motopenpic_to_irq(int n)
@@ -1137,6 +1187,15 @@
 
 	prep_route_pci_interrupts();
 
+	/*
+	 * If MTX+, exclude the SL82C105 IDE controller so the driver
+	 * doesn't hang.
+	 */
+	if ( _prep_type == _PREP_Motorola )
+		if ( strstr(mot_info[mot_entry].name, "MTX Plus") )
+			/* On MTX+, SL82C105 is at IDSEL 0xb function 0x1 */
+			prep_exclude_pci_device(PCI_DEVFN(0xb, 0x1));
+
 	prep_pib_init();
 
 	printk("Setting PCI interrupts for a \"%s\"\n", Motherboard_map_name);
@@ -1150,7 +1209,7 @@
 		       motopenpic_to_irq(Motherboard_map[PCI_SLOT(dev->devfn)]);
 
 		    pcibios_write_config_byte(dev->bus->number, dev->devfn, 
-					      PCI_INTERRUPT_PIN, dev->irq);
+					      PCI_INTERRUPT_LINE, dev->irq);
 		} else {
 			if (Motherboard_non0 != NULL)
 				Motherboard_non0(dev);
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/arch/ppc/kernel/prep_setup.c linux.17p9/arch/ppc/kernel/prep_setup.c
--- linux.vanilla/arch/ppc/kernel/prep_setup.c	Fri Apr 21 12:45:47 2000
+++ linux.17p9/arch/ppc/kernel/prep_setup.c	Mon Jun 26 15:46:10 2000
@@ -48,7 +48,7 @@
 #include <asm/raven.h>
 
 
-#include "time.h"
+#include <asm/time.h>
 #include "local_irq.h"
 #include "i8259.h"
 #include "open_pic.h"
@@ -607,6 +607,7 @@
 	int i;
 
 	if (OpenPIC != NULL) {
+		open_pic.irq_offset = 16;
 		for ( i = 16 ; i < 36 ; i++ )
 			irq_desc[i].ctl = &open_pic;
 		openpic_init(1);
@@ -857,6 +858,7 @@
 	ppc_md.kbd_init_hw       = pckbd_init_hw;
 #ifdef CONFIG_MAGIC_SYSRQ
 	ppc_md.kbd_sysrq_xlate	 = pckbd_sysrq_xlate;
+	ppc_md.SYSRQ_KEY	 = 0x54;
 #endif
 #endif
 }
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/arch/ppc/kernel/prep_time.c linux.17p9/arch/ppc/kernel/prep_time.c
--- linux.vanilla/arch/ppc/kernel/prep_time.c	Fri Apr 21 12:45:47 2000
+++ linux.17p9/arch/ppc/kernel/prep_time.c	Mon Jun 26 15:46:10 2000
@@ -26,7 +26,7 @@
 #include <asm/prep_nvram.h>
 #include <asm/mk48t59.h>
 
-#include "time.h"
+#include <asm/time.h>
 
 /*
  * The motorola uses the m48t18 rtc (includes DS1643) whose registers
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/arch/ppc/kernel/process.c linux.17p9/arch/ppc/kernel/process.c
--- linux.vanilla/arch/ppc/kernel/process.c	Fri Apr 21 12:45:47 2000
+++ linux.17p9/arch/ppc/kernel/process.c	Fri Jun 16 16:24:33 2000
@@ -43,9 +43,11 @@
 #include <asm/mmu_context.h>
 
 int dump_fpu(struct pt_regs *regs, elf_fpregset_t *fpregs);
+int dump_altivec(struct pt_regs *regs, elf_vrregset_t *vrregs);
 extern unsigned long _get_SP(void);
 
 struct task_struct *last_task_used_math = NULL;
+struct task_struct *last_task_used_altivec = NULL;
 static struct vm_area_struct init_mmap = INIT_MMAP;
 static struct fs_struct init_fs = INIT_FS;
 static struct files_struct init_files = INIT_FILES;
@@ -79,6 +81,31 @@
 	return 1;
 }
 
+#ifdef CONFIG_ALTIVEC
+int
+dump_altivec(struct pt_regs *regs, elf_vrregset_t *vrregs)
+{
+	if (regs->msr & MSR_VEC)
+		giveup_altivec(current);
+	memcpy(vrregs, &current->tss.vr[0], sizeof(*vrregs));
+	return 1;
+}
+
+void 
+enable_kernel_altivec(void)
+{
+#ifdef __SMP__
+	if (current->tss.regs && (current->tss.regs->msr & MSR_VEC))
+		giveup_altivec(current);
+	else
+		giveup_altivec(NULL);	/* just enable AltiVec for kernel - force */
+#else
+	giveup_altivec(last_task_used_altivec);
+#endif /* __SMP __ */
+	printk("MSR_VEC in enable_altivec_kernel\n");
+}
+#endif /* CONFIG_ALTIVEC */
+
 void
 enable_kernel_fp(void)
 {
@@ -194,22 +221,53 @@
 	_enable_interrupts(s);
 }
 
-void show_regs(struct pt_regs * regs)
+struct bits {
+	const char *name;
+	unsigned int bit;
+};
+
+void print_bits(unsigned int val, struct bits *bits)
+{
+	const char *sep = "";
+
+	printk("[");
+	for (; bits->bit != 0; ++bits) {
+		if (val & bits->bit) {
+			printk("%s", bits->name);
+			sep = ", ";
+		}
+	}
+	printk("]");
+}
+
+struct bits msr_bits[] = {
+	{"VEC", MSR_VEC},
+	{"EE", MSR_EE},
+	{"PR", MSR_PR},
+	{"FP", MSR_FP},
+	{"IR", MSR_IR},
+	{"DR", MSR_DR},
+	{"ME", MSR_ME},
+	{0, 0}
+};
+
+void show_regs(struct pt_regs *regs)
 {
 	int i;
 
 	printk("NIP: %08lX XER: %08lX LR: %08lX REGS: %p TRAP: %04lx\n",
 	       regs->nip, regs->xer, regs->link, regs,regs->trap);
-	printk("MSR: %08lx EE: %01x PR: %01x FP: %01x ME: %01x IR/DR: %01x%01x\n",
-	       regs->msr, regs->msr&MSR_EE ? 1 : 0, regs->msr&MSR_PR ? 1 : 0,
-	       regs->msr & MSR_FP ? 1 : 0,regs->msr&MSR_ME ? 1 : 0,
-	       regs->msr&MSR_IR ? 1 : 0,
-	       regs->msr&MSR_DR ? 1 : 0);
+	printk("MSR: %08lx ", regs->msr);
+	print_bits(regs->msr, msr_bits);
+	printk("\n");
 	printk("TASK = %p[%d] '%s' mm->pgd %p ",
 	       current, current->pid, current->comm, current->mm->pgd);
 	printk("Last syscall: %ld ", current->tss.last_syscall);
-	printk("\nlast math %p", last_task_used_math);
-	
+	if (last_task_used_math)
+		printk("\nlast math %p", last_task_used_math);
+	if (last_task_used_altivec)
+		printk("\nlast altivec %p", last_task_used_altivec);
+
 #ifdef __SMP__	
 	printk(" CPU: %d last CPU: %d", current->processor,current->last_processor);
 #endif /* __SMP__ */
@@ -256,12 +314,16 @@
 {
 	if (last_task_used_math == current)
 		last_task_used_math = NULL;
+	if (last_task_used_altivec == current)
+		last_task_used_altivec = NULL;
 }
 
 void flush_thread(void)
 {
 	if (last_task_used_math == current)
 		last_task_used_math = NULL;
+	if (last_task_used_altivec == current)
+		last_task_used_altivec = NULL;
 }
 
 void
@@ -319,6 +381,19 @@
 	if (regs->msr & MSR_FP)
 		giveup_fpu(current);
 
+#ifdef CONFIG_ALTIVEC
+	/*
+	 * copy altiVec info - assume lazy altiVec switch
+	 * - kumar
+	 */
+	if (regs->msr & MSR_VEC)
+		giveup_altivec(current);
+
+	memcpy(&p->tss.vr, &current->tss.vr, sizeof(p->tss.vr));
+	p->tss.vscr = current->tss.vscr;
+	childregs->msr &= ~MSR_VEC;
+#endif /* CONFIG_ALTIVEC */
+
 	memcpy(&p->tss.fpr, &current->tss.fpr, sizeof(p->tss.fpr));
 	p->tss.fpscr = current->tss.fpscr;
 	childregs->msr &= ~MSR_FP;
@@ -380,6 +455,8 @@
 	shove_aux_table(sp);
 	if (last_task_used_math == current)
 		last_task_used_math = 0;
+	if (last_task_used_altivec == current)
+		last_task_used_altivec = 0;
 	current->tss.fpscr = 0;
 }
 
@@ -439,6 +516,10 @@
 		goto out;
 	if (regs->msr & MSR_FP)
 		giveup_fpu(current);
+#ifdef CONFIG_ALTIVEC
+	if (regs->msr & MSR_VEC)
+		giveup_altivec(current);
+#endif /* CONFIG_ALTIVEC */ 
 	error = do_execve(filename, (char **) a1, (char **) a2, regs);
 	putname(filename);
 out:
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/arch/ppc/kernel/prom.c linux.17p9/arch/ppc/kernel/prom.c
--- linux.vanilla/arch/ppc/kernel/prom.c	Fri Apr 21 12:45:47 2000
+++ linux.17p9/arch/ppc/kernel/prom.c	Mon Jun 26 15:46:10 2000
@@ -26,6 +26,7 @@
 #include <asm/bootx.h>
 #include <asm/system.h>
 #include <asm/gemini.h>
+#include <asm/linux_logo.h>
 
 /*
  * Properties whose value is longer than this get excluded from our
@@ -88,45 +89,50 @@
 char *of_stdout_device = 0;
 
 prom_entry prom = 0;
-ihandle prom_chosen = 0, prom_stdout = 0;
+ihandle prom_chosen = 0, prom_stdout = 0, prom_disp_node = 0;
 int prom_version = 0;
 
 extern char *klimit;
 char *bootpath = 0;
 char *bootdevice = 0;
 
-unsigned int rtas_data = 0;   /* virtual pointer */
+unsigned int rtas_data = 0;   /* physical pointer */
 unsigned int rtas_entry = 0;  /* physical pointer */
 unsigned int rtas_size = 0;
 unsigned int old_rtas = 0;
 
+/* Set for a newworld machine */
+int use_of_interrupt_tree = 0;
+int pmac_newworld = 0;
+
 static struct device_node *allnodes = 0;
 
+#ifdef CONFIG_BOOTX_TEXT
+
 static void clearscreen(void);
 static void flushscreen(void);
 
-#ifdef CONFIG_BOOTX_TEXT
-
 void drawchar(char c);
 void drawstring(const char *c);
-static void drawhex(unsigned long v);
+void drawhex(unsigned long v);
 static void scrollscreen(void);
 
 static void draw_byte(unsigned char c, long locX, long locY);
-static void draw_byte_32(unsigned char *bits, unsigned long *base);
-static void draw_byte_16(unsigned char *bits, unsigned long *base);
-static void draw_byte_8(unsigned char *bits, unsigned long *base);
-
-static long				g_loc_X;
-static long				g_loc_Y;
-static long				g_max_loc_X;
-static long				g_max_loc_Y;
+static void draw_byte_32(unsigned char *bits, unsigned long *base, int rb);
+static void draw_byte_16(unsigned char *bits, unsigned long *base, int rb);
+static void draw_byte_8(unsigned char *bits, unsigned long *base, int rb);
+
+/* We want those in the data section */
+static long				g_loc_X = 0;
+static long				g_loc_Y = 0;
+static long				g_max_loc_X = 0;
+static long				g_max_loc_Y = 0; 
 
 #define cmapsz	(16*256)
 
 static unsigned char vga_font[cmapsz];
 
-#endif
+#endif /* CONFIG_BOOTX_TEXT */
 
 
 static void *call_prom(const char *service, int nargs, int nret, ...);
@@ -136,15 +142,25 @@
 				  unsigned long, struct device_node ***);
 static unsigned long finish_node(struct device_node *, unsigned long,
 				 interpret_func *);
+static unsigned long finish_node_interrupts(struct device_node *, unsigned long);
 static unsigned long check_display(unsigned long);
 static int prom_next_node(phandle *);
 static void *early_get_property(unsigned long, unsigned long, char *);
 
+#ifdef CONFIG_BOOTX_TEXT
+static void setup_disp_fake_bi(ihandle dp);
+static void prom_welcome(boot_infos_t* bi, unsigned long phys);
+#endif
+
 extern void enter_rtas(void *);
 extern unsigned long reloc_offset(void);
 
 extern char cmd_line[512];	/* XXX */
 boot_infos_t *boot_infos = 0;	/* init it so it's in data segment not bss */
+#ifdef CONFIG_BOOTX_TEXT
+boot_infos_t *disp_bi = 0;
+boot_infos_t fake_bi = {0,};
+#endif
 
 /*
  * prom_init() is called very early on, before the kernel text
@@ -237,7 +253,7 @@
 	if (RELOC(prom_stdout) == 0)
 	{
 #ifdef CONFIG_BOOTX_TEXT
-		if (RELOC(boot_infos) != 0)
+		if (RELOC(disp_bi) != 0)
 			drawstring(msg);
 #endif
 		return;
@@ -258,6 +274,22 @@
 	}
 }
 
+void
+prom_print_hex(unsigned int v)
+{
+	char buf[16];
+	int i, c;
+
+	for (i = 0; i < 8; ++i) {
+		c = (v >> ((7-i)*4)) & 0xf;
+		c += (c >= 10)? ('a' - 10): '0';
+		buf[i] = c;
+	}
+	buf[i] = ' ';
+	buf[i+1] = 0;
+	prom_print(buf);
+}
+
 unsigned long smp_ibm_chrp_hack __initdata = 0;
 
 /*
@@ -273,6 +305,7 @@
 	phandle node;
 	char type[16], *path;
 #endif	
+	int chrp = 0;
 	unsigned long mem;
 	ihandle prom_rtas, prom_mmu, prom_op;
 	unsigned long offset = reloc_offset();
@@ -299,22 +332,19 @@
 		unsigned long space;
 		unsigned long ptr, x;
 		char *model;
-#ifdef CONFIG_BOOTX_TEXT
-		unsigned long flags;
-#endif		
 
 		RELOC(boot_infos) = PTRUNRELOC(bi);
 		if (!BOOT_INFO_IS_V2_COMPATIBLE(bi))
 			bi->logicalDisplayBase = 0;
-
-		clearscreen();
-
 #ifdef CONFIG_BOOTX_TEXT
 		RELOC(g_loc_X) = 0;
 		RELOC(g_loc_Y) = 0;
 		RELOC(g_max_loc_X) = (bi->dispDeviceRect[2] - bi->dispDeviceRect[0]) / 8;
 		RELOC(g_max_loc_Y) = (bi->dispDeviceRect[3] - bi->dispDeviceRect[1]) / 16;
+		RELOC(disp_bi) = PTRUNRELOC(bi);
 		
+		clearscreen();
+
 		/* Test if boot-info is compatible. Done only in config CONFIG_BOOTX_TEXT since
 		   there is nothing much we can do with an incompatible version, except display
 		   a message and eventually hang the processor...
@@ -325,24 +355,10 @@
 		if (!BOOT_INFO_IS_COMPATIBLE(bi))
 			prom_print(RELOC(" !!! WARNING - Incompatible version of BootX !!!\n\n\n"));
 		
-		prom_print(RELOC("Welcome to Linux, kernel " UTS_RELEASE "\n"));
-		prom_print(RELOC("\nstarted at       : 0x"));
-		drawhex(reloc_offset() + KERNELBASE);
-		prom_print(RELOC("\nlinked at        : 0x"));
-		drawhex(KERNELBASE);
-		prom_print(RELOC("\nframe buffer at  : 0x"));
-		drawhex((unsigned long)bi->dispDeviceBase);
-		prom_print(RELOC(" (phys), 0x"));
-		drawhex((unsigned long)bi->logicalDisplayBase);
-		prom_print(RELOC(" (log)"));
-		prom_print(RELOC("\nMSR              : 0x"));
-		__asm__ __volatile__ ("mfmsr %0" : "=r" ((flags)) : : "memory");
-		drawhex(flags);
-		prom_print(RELOC("\n\n"));
-#endif
-		/* Out of the #if/#endif since it flushes the clearscreen too */
+		prom_welcome(bi, phys);
 		flushscreen();
-		
+#endif /* CONFIG_BOOTX_TEXT */
+
 		/* New BootX enters kernel with MMU off, i/os are not allowed
 		   here. This hack will have been done by the boostrap anyway.
 		 */
@@ -420,12 +436,15 @@
 	    int sz;
 	    sz = (int)call_prom(RELOC("getprop"), 4, 1, prom_op, RELOC("model"), model, 64);
 	    if (sz > 0) {
-	    	char *c;
-		for (c = model; *c; c++)
-		    if (*c >= '0' && *c <= '9') {
-			RELOC(prom_version) = *c - '0';
-			break;
-		    }
+		if ( strncmp(model,RELOC("IBM"),3) ) {
+	    	    char *c;
+		    for (c = model; *c; c++)
+		        if (*c >= '0' && *c <= '9') {
+			    RELOC(prom_version) = *c - '0';
+			    break;
+		        }
+		} else
+		    chrp = 1;
 	    }
 	}
 	if (RELOC(prom_version) >= 3)
@@ -445,15 +464,6 @@
 		RELOC(bootdevice) = PTRUNRELOC(d);
 		mem = ALIGN(mem + strlen(d) + 1);
 	}
-
-	mem = check_display(mem);
-
-	prom_print(RELOC("copying OF device tree..."));
-	mem = copy_device_tree(mem, mem + (1<<20));
-	prom_print(RELOC("done\n"));
-
-
-	RELOC(klimit) = (char *) (mem - offset);
 	
 	prom_rtas = call_prom(RELOC("finddevice"), 1, 1, RELOC("/rtas"));
 	if (prom_rtas != (void *) -1) {
@@ -465,18 +475,14 @@
 			RELOC(rtas_data) = 0;
 		} else {
 			/*
-			 * We do _not_ want the rtas_data inside the klimit
-			 * boundry since it'll be squashed when we do the
-			 * relocate of the kernel on chrp right after prom_init()
-			 * in head.S.  So, we just pick a spot in memory.
-			 * -- Cort
+			 * Ask OF for some space for RTAS.
 			 */
-#if 0
-			mem = (mem + 4095) & -4096;
-			RELOC(rtas_data) = mem + KERNELBASE;
-			mem += RELOC(rtas_size);
-#endif
-			RELOC(rtas_data) = (6<<20) + KERNELBASE;
+			RELOC(rtas_data) = (unsigned int)
+				call_prom(RELOC("claim"), 3, 1, 0,
+					  RELOC(rtas_size), 0x1000);
+			prom_print(RELOC("rtas at "));
+			prom_print_hex(RELOC(rtas_data));
+			prom_print(RELOC("\n"));
 		}
 		prom_rtas = call_prom(RELOC("open"), 1, 1, RELOC("/rtas"));
 		{
@@ -488,7 +494,7 @@
 			prom_args.nret = 2;
 			prom_args.args[0] = RELOC("instantiate-rtas");
 			prom_args.args[1] = prom_rtas;
-			prom_args.args[2] = ((void *)(RELOC(rtas_data)-KERNELBASE));
+			prom_args.args[2] = (void *) RELOC(rtas_data);
 			RELOC(prom)(&prom_args);
 			if (prom_args.args[nargs] != 0)
 				i = 0;
@@ -502,6 +508,15 @@
 			prom_print(RELOC(" done\n"));
 	}
 
+	mem = check_display(mem);
+
+	prom_print(RELOC("copying OF device tree..."));
+	/* N.B. do this *after* any claims */
+	mem = copy_device_tree(mem, mem + (1<<20));
+	prom_print(RELOC("done\n"));
+
+	RELOC(klimit) = (char *) (mem - offset);
+
 	/* If we are already running at 0xc0000000, we assume we were loaded by
 	 * an OF bootloader which did set a BAT for us. This breaks OF translate
 	 * so we force phys to be 0
@@ -533,6 +548,11 @@
 	    }
 	}
 	    
+#ifdef CONFIG_BOOTX_TEXT
+	if (RELOC(prom_disp_node) != 0)
+		setup_disp_fake_bi(RELOC(prom_disp_node));
+#endif
+
 #ifdef CONFIG_SMP
 	/*
 	 * With CHRP SMP we need to use the OF to start the other
@@ -608,8 +628,8 @@
 		else
 			prom_print(RELOC("...failed\n"));
 	}
-#endif /* CONFIG_SMP */
 	
+#endif	
 	/* If OpenFirmware version >= 3, then use quiesce call */
 	if (RELOC(prom_version) >= 3) {
 	    prom_print(RELOC("Calling quiesce ...\n"));
@@ -618,9 +638,80 @@
 	    phys = offset + KERNELBASE;
 	}
 
+#ifdef CONFIG_BOOTX_TEXT
+	if (!chrp && RELOC(disp_bi)) {
+		RELOC(prom_stdout) = 0;
+		clearscreen();
+		prom_welcome(PTRRELOC(RELOC(disp_bi)), phys);
+	}
+#endif
+
+	prom_print(RELOC("booting...\n"));
 	return phys;
 }
 
+#ifdef CONFIG_BOOTX_TEXT
+__init static void
+prom_welcome(boot_infos_t* bi, unsigned long phys)
+{
+	unsigned long offset = reloc_offset();
+	unsigned long flags;
+	unsigned long pvr;
+	
+	prom_print(RELOC("Welcome to Linux, kernel " UTS_RELEASE "\n"));
+	prom_print(RELOC("\nstarted at       : 0x"));
+	drawhex(phys);
+	prom_print(RELOC("\nlinked at        : 0x"));
+	drawhex(KERNELBASE);
+	prom_print(RELOC("\nframe buffer at  : 0x"));
+	drawhex((unsigned long)bi->dispDeviceBase);
+	prom_print(RELOC(" (phys), 0x"));
+	drawhex((unsigned long)bi->logicalDisplayBase);
+	prom_print(RELOC(" (log)"));
+	prom_print(RELOC("\nMSR              : 0x"));
+	__asm__ __volatile__ ("mfmsr %0" : "=r" (flags));
+	drawhex(flags);
+	__asm__ __volatile__ ("mfspr %0, 287" : "=r" (pvr));
+	pvr >>= 16;
+	if (pvr > 1) {
+	    prom_print(RELOC("\nHID0             : 0x"));
+	    __asm__ __volatile__ ("mfspr %0, 1008" : "=r" (flags));
+	    drawhex(flags);
+	}
+	if (pvr == 8 || pvr == 12) {
+	    prom_print(RELOC("\nICTC             : 0x"));
+	    __asm__ __volatile__ ("mfspr %0, 1019" : "=r" (flags));
+	    drawhex(flags);
+	}
+	prom_print(RELOC("\n\n"));
+}
+
+void showvalue(char *str, unsigned long val)
+{
+	drawstring(str);
+	drawhex(val);
+	drawstring("\n");
+}
+#endif
+
+static int prom_set_color(ihandle ih, int i, int r, int g, int b)
+{
+	struct prom_args prom_args;
+	unsigned long offset = reloc_offset();
+
+	prom_args.service = RELOC("call-method");
+	prom_args.nargs = 6;
+	prom_args.nret = 1;
+	prom_args.args[0] = RELOC("color!");
+	prom_args.args[1] = ih;
+	prom_args.args[2] = (void *) i;
+	prom_args.args[3] = (void *) b;
+	prom_args.args[4] = (void *) g;
+	prom_args.args[5] = (void *) r;
+	RELOC(prom)(&prom_args);
+	return (int) prom_args.args[6];
+}
+
 /*
  * If we have a display that we don't know how to drive,
  * we will want to try to execute OF's open method for it
@@ -633,11 +724,32 @@
 static unsigned long
 check_display(unsigned long mem)
 {
+#ifdef CONFIG_FB
 	phandle node;
 	ihandle ih;
 	int i;
 	unsigned long offset = reloc_offset();
 	char type[16], *path;
+	static unsigned char default_colors[] = {
+		0x00, 0x00, 0x00,
+		0x00, 0x00, 0xaa,
+		0x00, 0xaa, 0x00,
+		0x00, 0xaa, 0xaa,
+		0xaa, 0x00, 0x00,
+		0xaa, 0x00, 0xaa,
+		0xaa, 0xaa, 0x00,
+		0xaa, 0xaa, 0xaa,
+		0x55, 0x55, 0x55,
+		0x55, 0x55, 0xff,
+		0x55, 0xff, 0x55,
+		0x55, 0xff, 0xff,
+		0xff, 0x55, 0x55,
+		0xff, 0x55, 0xff,
+		0xff, 0xff, 0x55,
+		0xff, 0xff, 0xff
+	};
+
+	RELOC(prom_disp_node) = 0;
 
 	for (node = 0; prom_next_node(&node); ) {
 		type[0] = 0;
@@ -660,6 +772,24 @@
 		}
 		prom_print(RELOC("... ok\n"));
 
+		if (RELOC(prom_disp_node) == 0)
+			RELOC(prom_disp_node) = node;
+
+		/* Setup a useable color table when the appropriate
+		 * method is available. Should update this to set-colors */
+		for (i = 0; i < 32; i++)
+			if (prom_set_color(ih, i, RELOC(default_colors)[i*3],
+					   RELOC(default_colors)[i*3+1],
+					   RELOC(default_colors)[i*3+2]) != 0)
+				break;
+
+		for (i = 0; i < LINUX_LOGO_COLORS; i++)
+			if (prom_set_color(ih, i + 32,
+					   RELOC(linux_logo_red)[i],
+					   RELOC(linux_logo_green)[i],
+					   RELOC(linux_logo_blue)[i]) != 0)
+				break;
+
 		/*
 		 * If this display is the device that OF is using for stdout,
 		 * move it to the front of the list.
@@ -676,9 +806,85 @@
 		if (RELOC(prom_num_displays) >= FB_MAX)
 			break;
 	}
+#endif /* CONFIG_FB */
 	return ALIGN(mem);
 }
 
+/* This function will enable the early boot text when doing OF booting. This
+ * way, xmon output should work too
+ */
+#ifdef CONFIG_BOOTX_TEXT
+__init
+static void
+setup_disp_fake_bi(ihandle dp)
+{
+	unsigned int len;
+	int width = 640, height = 480, depth = 8, pitch;
+	unsigned  address;
+	boot_infos_t* bi;
+	unsigned long offset = reloc_offset();
+	
+	prom_print(RELOC("Initing fake screen\n"));
+
+	len = 0;
+	call_prom(RELOC("getprop"), 4, 1, dp, RELOC("depth"), &len, sizeof(len));
+	if (len == 0)
+		prom_print(RELOC("Warning: assuming display depth = 8\n"));
+	else
+		depth = len;
+	width = len = 0;
+	call_prom(RELOC("getprop"), 4, 1, dp, RELOC("width"), &len, sizeof(len));
+	width = len;
+	if (width == 0) {
+		prom_print(RELOC("Failed to get width\n"));
+		return;
+	}
+	height = len = 0;
+	call_prom(RELOC("getprop"), 4, 1, dp, RELOC("height"), &len, sizeof(len));
+	height = len;
+	if (height == 0) {
+		prom_print(RELOC("Failed to get height\n"));
+		return;
+	}
+	pitch = len = 0;
+	call_prom(RELOC("getprop"), 4, 1, dp, RELOC("linebytes"), &len, sizeof(len));
+	pitch = len;
+	if (pitch == 0) {
+		prom_print(RELOC("Failed to get pitch\n"));
+		return;
+	}
+	if (pitch == 1)
+		pitch = 0x1000;
+	address = len = 0;
+	len = 0xfa000000;
+	call_prom(RELOC("getprop"), 4, 1, dp, RELOC("address"), &len, sizeof(len));
+	address = len;
+	if (address == 0) {
+		prom_print(RELOC("Failed to get address\n"));
+		return;
+	}
+#if 0
+	/* kludge for valkyrie */
+	if (strcmp(dp->name, "valkyrie") == 0) 
+	    address += 0x1000;
+#endif
+ 
+	RELOC(disp_bi) = &fake_bi;
+	bi = PTRRELOC((&fake_bi));
+	RELOC(g_loc_X) = 0;
+	RELOC(g_loc_Y) = 0;
+	RELOC(g_max_loc_X) = width / 8;
+	RELOC(g_max_loc_Y) = height / 16;
+	bi->logicalDisplayBase = (unsigned char *)address;
+	bi->dispDeviceBase = (unsigned char *)address;
+	bi->dispDeviceRowBytes = pitch;
+	bi->dispDeviceDepth = depth;
+	bi->dispDeviceRect[0] = bi->dispDeviceRect[1] = 0;
+	bi->dispDeviceRect[2] = width;
+	bi->dispDeviceRect[3] = height;
+}
+#endif
+
 __init
 static int
 prom_next_node(phandle *nodep)
@@ -814,6 +1020,18 @@
 {
 	unsigned long mem = (unsigned long) klimit;
 
+	/* All newworld machines and CHRP now use the interrupt tree */
+	struct device_node *np = allnodes;
+	while(np && (_machine == _MACH_Pmac)) {
+		if (get_property(np, "interrupt-parent", 0)) {
+			pmac_newworld = 1;
+			break;
+		}
+		np = np->allnext;
+	}
+	if ((_machine == _MACH_chrp) || (boot_infos == 0 && pmac_newworld))
+		use_of_interrupt_tree = 1;
+
 	mem = finish_node(allnodes, mem, NULL);
 	printk(KERN_INFO "device tree used %lu bytes\n",
 	       mem - (unsigned long) allnodes);
@@ -854,6 +1072,9 @@
 	if (ifunc != NULL) {
 		mem_start = ifunc(np, mem_start);
 	}
+	if (use_of_interrupt_tree) {
+		mem_start = finish_node_interrupts(np, mem_start);
+	}
 
 	/* the f50 sets the name to 'display' and 'compatible' to what we
 	 * expect for the name -- Cort
@@ -900,6 +1121,151 @@
 	return mem_start;
 }
 
+/* This routine walks the interrupt tree for a given device node and gather 
+ * all necessary informations according to the draft interrupt mapping
+ * for CHRP. The current version was only tested on Apple "Core99" machines
+ * and may not handle cascaded controllers correctly.
+ */
+__init
+static unsigned long
+finish_node_interrupts(struct device_node *np, unsigned long mem_start)
+{
+	/* Finish this node */
+	unsigned int *isizep, *asizep, *interrupts, *map, *map_mask, *reg;
+	phandle *parent;
+	struct device_node *node, *parent_node;
+	int l, isize, ipsize, asize, map_size, regpsize;
+
+	/* Currently, we don't look at all nodes with no "interrupts" property */
+	interrupts = (unsigned int *)get_property(np, "interrupts", &l);
+	if (interrupts == NULL)
+		return mem_start;
+	ipsize = l>>2;
+
+	reg = (unsigned int *)get_property(np, "reg", &l);
+	regpsize = l>>2;
+
+	/* We assume default interrupt cell size is 1 (bugus ?) */
+	isize = 1;
+	node = np;
+	
+	do {
+	    /* We adjust the cell size if the current parent contains an #interrupt-cells
+	     * property */
+	    isizep = (unsigned int *)get_property(node, "#interrupt-cells", &l);
+	    if (isizep)
+	    	isize = *isizep;
+
+	    /* We don't do interrupt cascade (ISA) for now, we stop on the first 
+	     * controller found
+	     */
+	    if (get_property(node, "interrupt-controller", &l)) {
+	    	int i,j;
+	    	np->intrs = (struct interrupt_info *) mem_start;
+		np->n_intrs = ipsize / isize;
+		mem_start += np->n_intrs * sizeof(struct interrupt_info);
+		for (i = 0; i < np->n_intrs; ++i) {
+		    np->intrs[i].line = *interrupts++;
+		    np->intrs[i].sense = 0;
+		    if (isize > 1)
+		        np->intrs[i].sense = *interrupts++;
+		    for (j=2; j<isize; j++)
+		    	interrupts++;
+		}
+		/*
+		 *  On the CHRP LongTrail, ISA interrupts are cascaded through
+		 *  the OpenPIC. For compatibility reasons, ISA interrupts are
+		 *  numbered 0-15 and OpenPIC interrupts start at 16.
+		 *  Hence we have to fixup the interrupt numbers for sources
+		 *  that are attached to the OpenPIC and thus have an
+		 *  interrupt-controller named `open-pic'.
+		 *
+		 *  FIXME: The name of the interrupt-controller node for the
+		 *         `ide' node has no name, although its parent is
+		 *         correctly specified in interrupt-map, so we check
+		 *         for a NULL name as well.
+		 */
+		if (_machine == _MACH_chrp &&
+		    ((node->name && !strcmp(node->name, "open-pic")) ||
+		     !node->name)) {
+		    for (i = 0; i < np->n_intrs; ++i)
+			np->intrs[i].line = openpic_to_irq(np->intrs[i].line);
+		}
+		return mem_start;
+	    }
+	    /* We lookup for an interrupt-map. This code can only handle one interrupt
+	     * per device in the map. We also don't handle #address-cells in the parent
+	     * I skip the pci node itself here, may not be necessary but I don't like it's
+	     * reg property.
+	     */
+	    if (np != node)
+	        map = (unsigned int *)get_property(node, "interrupt-map", &l);
+	     else
+	     	map = NULL;
+	    if (map && l) {
+	    	int i, found, temp_isize;
+	        map_size = l>>2;
+	        map_mask = (unsigned int *)get_property(node, "interrupt-map-mask", &l);
+	        asizep = (unsigned int *)get_property(node, "#address-cells", &l);
+	        if (asizep && l == sizeof(unsigned int))
+	            asize = *asizep;
+	        else
+	            asize = 0;
+	        found = 0;
+	        while(map_size>0 && !found) {
+	            found = 1;
+	            for (i=0; i<asize; i++) {
+	            	unsigned int mask = map_mask ? map_mask[i] : 0xffffffff;
+	            	if (!reg || (i>=regpsize) || ((mask & *map) != (mask & reg[i])))
+	           	    found = 0;
+	           	map++;
+	           	map_size--;
+	            }
+	            for (i=0; i<isize; i++) {
+	            	unsigned int mask = map_mask ? map_mask[i+asize] : 0xffffffff;
+	            	if ((mask & *map) != (mask & interrupts[i]))
+	            	    found = 0;
+	            	map++;
+	            	map_size--;
+	            }
+	            parent = *((phandle *)(map));
+	            map+=1; map_size-=1;
+	            parent_node = find_phandle(parent);
+	            temp_isize = isize;
+	            if (parent_node) {
+			isizep = (unsigned int *)get_property(parent_node, "#interrupt-cells", &l);
+	    		if (isizep)
+	    		    temp_isize = *isizep;
+	            }
+	            if (!found) {
+	            	map += temp_isize;
+	            	map_size-=temp_isize;
+	            }
+	        }
+	        if (found) {
+	            node = parent_node;
+	            reg = NULL;
+	            regpsize = 0;
+	            interrupts = (unsigned int *)map;
+	            ipsize = temp_isize*1;
+		    continue;
+	        }
+	    }
+	    /* We look for an explicit interrupt-parent.
+	     */
+	    parent = (phandle *)get_property(node, "interrupt-parent", &l);
+	    if (parent && (l == sizeof(phandle)) &&
+	    	(parent_node = find_phandle(*parent))) {
+	    	node = parent_node;
+	    	continue;
+	    }
+	    /* Default, get real parent */
+	    node = node->parent;
+	} while(node);
+
+	return mem_start;
+}
+
 /*
  * When BootX makes a copy of the device tree from the MacOS
  * Name Registry, it is in the format we use but all of the pointers
@@ -958,6 +1324,9 @@
 		mem_start += i * sizeof(struct address_range);
 	}
 
+	if (use_of_interrupt_tree)
+		return mem_start;
+
 	/*
 	 * If the pci host bridge has an interrupt-map property,
 	 * look for our node in it.
@@ -967,14 +1336,28 @@
 		get_property(np->parent, "interrupt-map", &ml)) != 0
 	    && (ip = (int *) get_property(np, "interrupts", &l)) != 0) {
 		unsigned int devfn = pci_addrs[0].addr.a_hi & 0xff00;
+		unsigned int cell_size;
+		struct device_node* np2;
+		/* This is hackish, but is only used for BootX booting */
+		cell_size = sizeof(struct pci_intr_map);
+		np2 = np->parent;
+		while(np2) {
+			if (device_is_compatible(np2, "uni-north")) {
+				cell_size += 4;
+				break;
+			}
+			np2 = np2->parent;
+		}
 		np->n_intrs = 0;
 		np->intrs = (struct interrupt_info *) mem_start;
-		for (i = 0; (ml -= sizeof(struct pci_intr_map)) >= 0; ++i) {
-			if (imp[i].addr.a_hi == devfn) {
-				np->intrs[np->n_intrs].line = imp[i].intr;
-				np->intrs[np->n_intrs].sense = 0;
+		for (i = 0; (ml -= cell_size) >= 0; ++i) {
+			if (imp->addr.a_hi == devfn) {
+				np->intrs[np->n_intrs].line = imp->intr;
+				np->intrs[np->n_intrs].sense = 0; /* FIXME */
 				++np->n_intrs;
 			}
+			imp = (struct pci_intr_map *)(((unsigned int)imp)
+				+ cell_size);
 		}
 		if (np->n_intrs == 0)
 			np->intrs = 0;
@@ -1031,6 +1414,9 @@
 		mem_start += i * sizeof(struct address_range);
 	}
 
+	if (use_of_interrupt_tree)
+		return mem_start;
+
 	ip = (int *) get_property(np, "AAPL,interrupts", &l);
 	if (ip == 0)
 		ip = (int *) get_property(np, "interrupts", &l);
@@ -1054,13 +1440,14 @@
 	struct reg_property *rp;
 	struct address_range *adr;
 	unsigned long base_address;
-	int i, l, *ip;
+	int i, l, keylargo, *ip;
 	struct device_node *db;
 
 	base_address = 0;
 	for (db = np->parent; db != NULL; db = db->parent) {
 		if (!strcmp(db->type, "mac-io") && db->n_addrs != 0) {
 			base_address = db->addrs[0].address;
+			keylargo = device_is_compatible(db, "Keylargo");
 			break;
 		}
 	}
@@ -1080,6 +1467,9 @@
 		mem_start += i * sizeof(struct address_range);
 	}
 
+	if (use_of_interrupt_tree)
+		return mem_start;
+
 	ip = (int *) get_property(np, "interrupts", &l);
 	if (ip == 0)
 		ip = (int *) get_property(np, "AAPL,interrupts", &l);
@@ -1088,9 +1478,15 @@
 		if (_machine == _MACH_Pmac) {
 			/* for the iMac */
 			np->n_intrs = l / sizeof(int);
+			/* Hack for BootX on Core99 */
+			if (keylargo)
+				np->n_intrs = np->n_intrs/2;
 			for (i = 0; i < np->n_intrs; ++i) {
 				np->intrs[i].line = *ip++;
-				np->intrs[i].sense = 0;
+				if (keylargo)
+					np->intrs[i].sense = *ip++;
+				else
+					np->intrs[i].sense = 0;
 			}
 		} else {
 			/* CHRP machines */
@@ -1130,6 +1526,9 @@
 		mem_start += i * sizeof(struct address_range);
 	}
 
+	if (use_of_interrupt_tree)
+		return mem_start;
+ 
 	ip = (int *) get_property(np, "interrupts", &l);
 	if (ip != 0) {
 		np->intrs = (struct interrupt_info *) mem_start;
@@ -1167,6 +1566,9 @@
 		mem_start += i * sizeof(struct address_range);
 	}
 
+	if (use_of_interrupt_tree)
+		return mem_start;
+
 	ip = (int *) get_property(np, "AAPL,interrupts", &l);
 	if (ip == 0)
 		ip = (int *) get_property(np, "interrupts", &l);
@@ -1223,6 +1625,49 @@
 	return head;
 }
 
+/* Finds a device node given its PCI bus number, device number
+ * and function number
+ */
+__openfirmware
+struct device_node *
+find_pci_device_OFnode(unsigned char bus, unsigned char dev_fn)
+{
+	struct device_node* np;
+	unsigned int *reg;
+	int l;
+	
+	for (np = allnodes; np != 0; np = np->allnext) {
+		char *pname = np->parent ?
+			(char *)get_property(np->parent, "name", &l) : 0;
+		if (pname && strcmp(pname, "mac-io") == 0)
+			continue;
+		reg = (unsigned int *) get_property(np, "reg", &l);
+		if (reg == 0 || l < sizeof(struct reg_property))
+			continue;
+		if (((reg[0] >> 8) & 0xff) == dev_fn && ((reg[0] >> 16) & 0xff) == bus)
+			break;
+	}
+	return np;
+}
+
+/*
+ * Returns all nodes linked together
+ */
+__openfirmware
+struct device_node *
+find_all_nodes(void)
+{
+	struct device_node *head, **prevp, *np;
+
+	prevp = &head;
+	for (np = allnodes; np != 0; np = np->allnext) {
+		*prevp = np;
+		prevp = &np->next;
+	}
+	*prevp = 0;
+	return head;
+}
+
 /* Checks if the given "compat" string matches one of the strings in
  * the device's "compatible" property
  */
@@ -1424,18 +1869,44 @@
 	prom_exit();
 }
 
-#ifdef CONFIG_XMON
+/* Indicates whether the root node has a given value in its
+ * compatible property.
+ */
+__openfirmware
+int
+machine_is_compatible(const char *compat)
+{
+	struct device_node *root;
+	
+	root = find_path_device("/");
+	if (root == 0)
+		return 0;
+	return device_is_compatible(root, compat);
+}
+
+
+#ifdef CONFIG_BOOTX_TEXT
+
+/* Here's a small text engine to use during early boot or for debugging purposes
+ * 
+ * todo:
+ * 
+ *  - build some kind of vgacon with it to enable early printk
+ *  - move to a separate file
+ *  - add a few video driver hooks to keep in sync with display
+ *    changes.
+ */
+
 __init
 void
 map_bootx_text(void)
 {
-	if (boot_infos == 0)
+	if (disp_bi == 0)
 		return;
-	boot_infos->logicalDisplayBase =
-		ioremap((unsigned long) boot_infos->dispDeviceBase,
-			boot_infos->dispDeviceRowBytes * boot_infos->dispDeviceRect[3]);
+	disp_bi->logicalDisplayBase =
+		ioremap((unsigned long) disp_bi->dispDeviceBase,
+			disp_bi->dispDeviceRowBytes * disp_bi->dispDeviceRect[3]);
 }
-#endif /* CONFIG_XMON */
 
 /* Calc the base address of a given point (x,y) */
 __pmac
@@ -1457,7 +1928,7 @@
 clearscreen(void)
 {
 	unsigned long offset	= reloc_offset();
-	boot_infos_t* bi	= PTRRELOC(RELOC(boot_infos));
+	boot_infos_t* bi	= PTRRELOC(RELOC(disp_bi));
 	unsigned long *base	= (unsigned long *)calc_base(bi, 0, 0);
 	unsigned long width 	= ((bi->dispDeviceRect[2] - bi->dispDeviceRect[0]) *
 					(bi->dispDeviceDepth >> 3)) >> 2;
@@ -1482,7 +1953,7 @@
 flushscreen(void)
 {
 	unsigned long offset	= reloc_offset();
-	boot_infos_t* bi	= PTRRELOC(RELOC(boot_infos));
+	boot_infos_t* bi	= PTRRELOC(RELOC(disp_bi));
 	unsigned long *base	= (unsigned long *)calc_base(bi, 0, 0);
 	unsigned long width 	= ((bi->dispDeviceRect[2] - bi->dispDeviceRect[0]) *
 					(bi->dispDeviceDepth >> 3)) >> 2;
@@ -1499,29 +1970,12 @@
 	}
 }
 
-/* Indicates whether the root node has a given value in its
- * compatible property.
- */
-__openfirmware
-int
-machine_is_compatible(const char *compat)
-{
-	struct device_node *root;
-	
-	root = find_path_device("/");
-	if (root == 0)
-		return 0;
-	return device_is_compatible(root, compat);
-}
-
-#ifdef CONFIG_BOOTX_TEXT
-
 __pmac
 static void
 scrollscreen(void)
 {
 	unsigned long offset		= reloc_offset();
-	boot_infos_t* bi		= PTRRELOC(RELOC(boot_infos));
+	boot_infos_t* bi		= PTRRELOC(RELOC(disp_bi));
 	unsigned long *src		= (unsigned long *)calc_base(bi,0,16);
 	unsigned long *dst		= (unsigned long *)calc_base(bi,0,0);
 	unsigned long width		= ((bi->dispDeviceRect[2] - bi->dispDeviceRect[0]) *
@@ -1589,7 +2043,7 @@
 }
 
 __pmac
-static void
+void
 drawhex(unsigned long v)
 {
 	static char hex_table[] = "0123456789abcdef";
@@ -1611,19 +2065,20 @@
 draw_byte(unsigned char c, long locX, long locY)
 {
 	unsigned long offset	= reloc_offset();
-	boot_infos_t* bi	= PTRRELOC(RELOC(boot_infos));
+	boot_infos_t* bi	= PTRRELOC(RELOC(disp_bi));
 	unsigned char *base	= calc_base(bi, locX << 3, locY << 4);
 	unsigned char *font	= &RELOC(vga_font)[((unsigned long)c) * 16];
+	int rb			= bi->dispDeviceRowBytes;
 	
 	switch(bi->dispDeviceDepth) {
 		case 32:
-			draw_byte_32(font, (unsigned long *)base);
+			draw_byte_32(font, (unsigned long *)base, rb);
 			break;
 		case 16:
-			draw_byte_16(font, (unsigned long *)base);
+			draw_byte_16(font, (unsigned long *)base, rb);
 			break;
 		case 8:
-			draw_byte_8(font, (unsigned long *)base);
+			draw_byte_8(font, (unsigned long *)base, rb);
 			break;
 		default:
 			break;
@@ -1661,10 +2116,8 @@
 
 __pmac
 static void
-draw_byte_32(unsigned char *font, unsigned long *base)
+draw_byte_32(unsigned char *font, unsigned long *base, int rb)
 {
-	unsigned long offset = reloc_offset();
-	boot_infos_t* bi		= PTRRELOC(RELOC(boot_infos));
 	int l, bits;	
 	int fg = 0xFFFFFFFFUL;
 	int bg = 0x00000000UL;
@@ -1681,19 +2134,18 @@
 		base[5] = (-((bits >> 2) & 1) & fg) ^ bg;
 		base[6] = (-((bits >> 1) & 1) & fg) ^ bg;
 		base[7] = (-(bits & 1) & fg) ^ bg;
-		base = (unsigned long *) ((char *)base + bi->dispDeviceRowBytes);
+		base = (unsigned long *) ((char *)base + rb);
 	}
 }
 
 __pmac
 static void
-draw_byte_16(unsigned char *font, unsigned long *base)
+draw_byte_16(unsigned char *font, unsigned long *base, int rb)
 {
-	unsigned long offset = reloc_offset();
-	boot_infos_t* bi		= PTRRELOC(RELOC(boot_infos));
 	int l, bits;	
 	int fg = 0xFFFFFFFFUL;
 	int bg = 0x00000000UL;
+	unsigned long offset = reloc_offset();
 	unsigned long *eb = RELOC(expand_bits_16);
 
 	for (l = 0; l < 16; ++l)
@@ -1703,19 +2155,18 @@
 		base[1] = (eb[(bits >> 4) & 3] & fg) ^ bg;
 		base[2] = (eb[(bits >> 2) & 3] & fg) ^ bg;
 		base[3] = (eb[bits & 3] & fg) ^ bg;
-		base = (unsigned long *) ((char *)base + bi->dispDeviceRowBytes);
+		base = (unsigned long *) ((char *)base + rb);
 	}
 }
 
 __pmac
 static void
-draw_byte_8(unsigned char *font, unsigned long *base)
+draw_byte_8(unsigned char *font, unsigned long *base, int rb)
 {
-	unsigned long offset = reloc_offset();
-	boot_infos_t* bi		= PTRRELOC(RELOC(boot_infos));
 	int l, bits;	
 	int fg = 0x0F0F0F0FUL;
 	int bg = 0x00000000UL;
+	unsigned long offset = reloc_offset();
 	unsigned long *eb = RELOC(expand_bits_8);
 
 	for (l = 0; l < 16; ++l)
@@ -1723,7 +2174,7 @@
 		bits = *font++;
 		base[0] = (eb[bits >> 4] & fg) ^ bg;
 		base[1] = (eb[bits & 0xf] & fg) ^ bg;
-		base = (unsigned long *) ((char *)base + bi->dispDeviceRowBytes);
+		base = (unsigned long *) ((char *)base + rb);
 	}
 }
 
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/arch/ppc/kernel/setup.c linux.17p9/arch/ppc/kernel/setup.c
--- linux.vanilla/arch/ppc/kernel/setup.c	Fri Apr 21 12:45:47 2000
+++ linux.17p9/arch/ppc/kernel/setup.c	Fri Jun 16 16:24:33 2000
@@ -68,6 +68,13 @@
                       unsigned long r6,
                       unsigned long r7);
 
+#ifdef CONFIG_BOOTX_TEXT
+extern void map_bootx_text(void);
+#endif
+#ifdef CONFIG_XMON
+extern void xmon_map_scc(void);
+#endif
+
 extern boot_infos_t *boot_infos;
 extern char cmd_line[512];
 char saved_command_line[256];
@@ -256,6 +263,9 @@
 		case 10:
 			len += sprintf(len+buffer, "604ev5 (MachV)\n");
 			break;
+		case 12:
+			len += sprintf(len+buffer, "7400 (G4)\n");
+			break;
 		case 50:
 			len += sprintf(len+buffer, "821\n");
 		case 80:
@@ -456,11 +466,15 @@
 			char *p;
 			
 #ifdef CONFIG_BLK_DEV_INITRD
-			if (r3 - KERNELBASE < 0x800000
-			    && r4 != 0 && r4 != 0xdeadbeef) {
+			/* Removed check < 0x800000, yaboot loads the kernel at +16Mb
+			 * and the ramdisk _after_ the kernel */
+			if (r3 && r4 && r4 != 0xdeadbeef) {
+				if (r3 < KERNELBASE)
+					r3 += KERNELBASE;
 				initrd_start = r3;
 				initrd_end = r3 + r4;
 				ROOT_DEV = MKDEV(RAMDISK_MAJOR, 0);
+				initrd_below_start_ok = 1;
 			}
 #endif
 			cmd_line[0] = 0;
@@ -538,7 +552,7 @@
 /* Checks "l2cr=xxxx" command-line option */
 void ppc_setup_l2cr(char *str, int *ints)
 {
-	if ( (_get_PVR() >> 16) == 8)
+	if ( ((_get_PVR() >> 16) == 8) || ((_get_PVR() >> 16) == 12) )
 	{
 		unsigned long val = simple_strtoul(str, NULL, 0);
 		printk(KERN_INFO "l2cr set to %lx\n", val);
@@ -564,14 +578,19 @@
 	extern unsigned long find_available_memory(void);
 	extern unsigned long *end_of_DRAM;
 
+#ifdef CONFIG_BOOTX_TEXT
+	map_bootx_text();
+#endif
+
 #ifdef CONFIG_XMON
-	extern void xmon_map_scc(void);
-	char *p;
+	{
+		char *p;
 
-	xmon_map_scc();
-	p = strstr(cmd_line, "xmon");
-	if (p != NULL && (p == cmd_line || p[-1] == ' '))
-		xmon(0);
+		xmon_map_scc();
+		p = strstr(cmd_line, "xmon");
+		if (p != NULL && (p == cmd_line || p[-1] == ' '))
+			xmon(0);
+	}
 #endif /* CONFIG_XMON */
  
 	/* reboot on panic */	
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/arch/ppc/kernel/signal.c linux.17p9/arch/ppc/kernel/signal.c
--- linux.vanilla/arch/ppc/kernel/signal.c	Fri Apr 21 12:45:47 2000
+++ linux.17p9/arch/ppc/kernel/signal.c	Fri Jun 16 16:24:33 2000
@@ -220,6 +220,10 @@
 		sr = (struct sigregs *) sigctx.regs;
 		if (regs->msr & MSR_FP )
 			giveup_fpu(current);
+#ifdef CONFIG_ALTIVEC
+		if (regs->msr & MSR_VEC)
+			giveup_altivec(current);
+#endif /* CONFIG_ALTIVEC */
 		if (copy_from_user(saved_regs, &sr->gp_regs,
 				   sizeof(sr->gp_regs)))
 			goto badframe;
@@ -268,6 +272,10 @@
 		goto badframe;
 	if (regs->msr & MSR_FP)
 		giveup_fpu(current);
+#ifdef CONFIG_ALTIVEC
+	if (regs->msr & MSR_VEC)
+		giveup_altivec(current);
+#endif /* CONFIG_ALTIVEC */
 	if (__copy_to_user(&frame->gp_regs, regs, GP_REGS_SIZE)
 	    || __copy_to_user(&frame->fp_regs, current->tss.fpr,
 			      ELF_NFPREG * sizeof(double))
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/arch/ppc/kernel/smp.c linux.17p9/arch/ppc/kernel/smp.c
--- linux.vanilla/arch/ppc/kernel/smp.c	Fri Apr 21 12:45:47 2000
+++ linux.17p9/arch/ppc/kernel/smp.c	Mon Jun 26 15:46:10 2000
@@ -7,7 +7,7 @@
  * deal of code from the sparc and intel versions.
  *
  * Support for PReP (Motorola MTX/MVME) SMP by Troy Benjegerdes
- * (troy@microux.com, hozer@drgw.net)
+ * (troy@blacklablinux.com, hozer@drgw.net)
  */
 
 #include <linux/kernel.h>
@@ -35,8 +35,8 @@
 #include <asm/io.h>
 #include <asm/prom.h>
 #include <asm/gemini.h>
-
-#include "time.h"
+#include <asm/residual.h>
+#include <asm/time.h>
 #include "open_pic.h"
 
 int first_cpu_booted = 0;
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/arch/ppc/kernel/syscalls.c linux.17p9/arch/ppc/kernel/syscalls.c
--- linux.vanilla/arch/ppc/kernel/syscalls.c	Fri Apr 21 12:45:47 2000
+++ linux.17p9/arch/ppc/kernel/syscalls.c	Fri Jun 16 16:24:33 2000
@@ -246,9 +246,14 @@
 
 asmlinkage int sys_uname(struct old_utsname * name)
 {
-	if (name && !copy_to_user(name, &system_utsname, sizeof (*name)))
-		return 0;
-	return -EFAULT;
+	int err;
+	
+	if (!name)
+		return -EFAULT;
+	down(&uts_sem);
+	err = copy_to_user(name, &system_utsname, sizeof (*name));
+	up(&uts_sem);
+	return err ? -EFAULT : 0;
 }
 
 asmlinkage int sys_olduname(struct oldold_utsname * name)
@@ -260,6 +265,7 @@
 	if (!access_ok(VERIFY_WRITE,name,sizeof(struct oldold_utsname)))
 		return -EFAULT;
   
+  	down(&uts_sem);
 	error = __copy_to_user(&name->sysname,&system_utsname.sysname,__OLD_UTS_LEN);
 	error -= __put_user(0,name->sysname+__OLD_UTS_LEN);
 	error -= __copy_to_user(&name->nodename,&system_utsname.nodename,__OLD_UTS_LEN);
@@ -271,6 +277,7 @@
 	error -= __copy_to_user(&name->machine,&system_utsname.machine,__OLD_UTS_LEN);
 	error = __put_user(0,name->machine+__OLD_UTS_LEN);
 	error = error ? -EFAULT : 0;
+	up(&uts_sem);
 
 	return error;
 }
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/arch/ppc/kernel/time.c linux.17p9/arch/ppc/kernel/time.c
--- linux.vanilla/arch/ppc/kernel/time.c	Fri Apr 21 12:45:47 2000
+++ linux.17p9/arch/ppc/kernel/time.c	Mon Jun 26 15:46:10 2000
@@ -46,7 +46,7 @@
 #endif
 #include <asm/machdep.h>
 
-#include "time.h"
+#include <asm/time.h>
 
 void smp_local_timer_interrupt(struct pt_regs *);
 
@@ -106,6 +106,13 @@
 		if ( !smp_processor_id() )
 		{
 			do_timer(regs);
+#if 0
+	/* -- BenH -- I'm removing this for now since it can cause various
+	 *            troubles with local-time RTCs. Now that we have a
+	 *            /dev/rtc that uses ppc_md.set_rtc_time() on mac, it
+	 *            should be possible to program the RTC from userland
+	 *            in all cases.
+	 */
 			/*
 			 * update the rtc when needed
 			 */
@@ -119,6 +126,7 @@
 					/* do it again in 60 s */
 					last_rtc_update = xtime.tv_sec;
 			}
+#endif			
 		}
 	}
 #ifdef __SMP__
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/arch/ppc/kernel/time.h linux.17p9/arch/ppc/kernel/time.h
--- linux.vanilla/arch/ppc/kernel/time.h	Fri Apr 21 12:45:47 2000
+++ linux.17p9/arch/ppc/kernel/time.h	Thu Jan  1 01:00:00 1970
@@ -1,34 +0,0 @@
-/*
- * $Id: time.h,v 1.11.2.1 1999/08/27 04:20:35 cort Exp $
- * Common time prototypes and such for all ppc machines.
- *
- * Written by Cort Dougan (cort@cs.nmt.edu) to merge
- * Paul Mackerras' version and mine for PReP and Pmac.
- */
-
-#include <linux/mc146818rtc.h>
-
-/* time.c */
-extern unsigned decrementer_count;
-extern unsigned count_period_num;
-extern unsigned count_period_den;
-extern unsigned long mktime(unsigned int, unsigned int, unsigned int,
-			    unsigned int, unsigned int, unsigned int);
-extern void to_tm(int tim, struct rtc_time * tm);
-extern time_t last_rtc_update;
-
-int via_calibrate_decr(void);
-
-/* Accessor functions for the decrementer register. */
-static __inline__ unsigned int get_dec(void)
-{
-	unsigned int ret;
-
-	asm volatile("mfspr %0,22" : "=r" (ret) :);
-	return ret;
-}
-
-static __inline__ void set_dec(unsigned int val)
-{
-	asm volatile("mtspr 22,%0" : : "r" (val));
-}
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/arch/ppc/kernel/traps.c linux.17p9/arch/ppc/kernel/traps.c
--- linux.vanilla/arch/ppc/kernel/traps.c	Fri Apr 21 12:45:47 2000
+++ linux.17p9/arch/ppc/kernel/traps.c	Fri Jun 16 16:24:33 2000
@@ -100,26 +100,27 @@
 			return;
 		}
 #endif
-		printk("Machine check in kernel mode.\n");
-		printk("Caused by (from msr): ");
-		printk("regs %p ",regs);
-		switch( regs->msr & 0x0000F000)
-		{
-		case (1<<12) :
-			printk("Machine check signal - probably due to mm fault\n"
-				"with mmu off\n");
+		printk("Machine check in kernel mode.  (regs at %p)\n", regs);
+		printk("Caused by (from srr1): ");
+		switch( regs->msr & 0x001F0000) {
+		case 0x100000:
+			printk("L2 data cache parity error\n");
 			break;
-		case (1<<13) :
+		case 0x80000:
+			printk("Machine check signal\n");
+			printk("(probably due to access of bad physical address\n");
+			break;
+		case 0x40000:
 			printk("Transfer error ack signal\n");
 			break;
-		case (1<<14) :
+		case 0x20000:
 			printk("Data parity signal\n");
 			break;
-		case (1<<15) :
+		case 0x10000:
 			printk("Address parity signal\n");
 			break;
 		default:
-			printk("Unknown values in msr\n");
+			printk("Unknown values in srr1\n");
 		}
 		show_regs(regs);
 #if defined(CONFIG_XMON) || defined(CONFIG_KGDB)
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/arch/ppc/lib/string.S linux.17p9/arch/ppc/lib/string.S
--- linux.vanilla/arch/ppc/lib/string.S	Fri Apr 21 12:45:47 2000
+++ linux.17p9/arch/ppc/lib/string.S	Fri Jun 16 16:24:33 2000
@@ -12,6 +12,11 @@
 #include <asm/processor.h>
 #include <asm/errno.h>
 
+CACHELINE_BYTES = 32
+LG_CACHELINE_BYTES = 5
+CACHELINE_MASK = 0x1f
+CACHELINE_WORDS = 8
+
 	.globl	strcpy
 strcpy:
 	addi	r5,r3,-1
@@ -82,7 +87,35 @@
 	andi.	r0,r6,3
 	add	r5,r0,r5
 	subf	r6,r0,r6
-	rlwinm	r0,r5,32-2,2,31
+#if 0	/* Clever, but breaks fb stuff -- paulus */
+/*
+ * Use dcbz on the complete cache lines in the destination if
+ * we are setting to zero.  This requires that the destination
+ * area is cacheable.  -- paulus
+ */
+	cmpwi	0,r4,0
+	bne	2f
+	clrlwi	r7,r6,32-LG_CACHELINE_BYTES
+	add	r8,r7,r5
+	srwi	r9,r8,LG_CACHELINE_BYTES
+	addic.	r9,r9,-1	/* total number of complete cachelines */
+	ble	2f
+	xori	r0,r7,CACHELINE_MASK & ~3
+	srwi.	r0,r0,2
+	beq	3f
+	mtctr	r0
+4:	stwu	r4,4(r6)
+	bdnz	4b
+3:	mtctr	r9
+	li	r7,4
+10:	dcbz	r7,r6
+	addi	r6,r6,CACHELINE_BYTES
+	bdnz	10b
+	clrlwi	r5,r8,32-LG_CACHELINE_BYTES
+	addi	r5,r5,4
+2:
+#endif
+	srwi	r0,r5,2
 	mtctr	r0
 	bdz	6f
 1:	stwu	r4,4(r6)
@@ -107,11 +140,94 @@
 memmove:
 	cmplw	0,r3,r4
 	bgt	backwards_memcpy
-	/* fall through */
+	b	forwards_memcpy
 
 	.globl	memcpy
 memcpy:
-	rlwinm.	r7,r5,32-3,3,31		/* r0 = r5 >> 3 */
+#if 0	/* Clever, but will probably break fb stuff -- paulus */
+/*
+ * This version uses dcbz on the complete cache lines in the
+ * destination area to reduce memory traffic.  This requires that
+ * the destination area is cacheable.
+ * We only use this version if the source and dest don't overlap.
+ * -- paulus.
+ */
+	add	r7,r3,r5		/* test if the src & dst overlap */
+	add	r8,r4,r5
+	cmplw	0,r4,r7
+	cmplw	1,r3,r8
+	crand	0,0,4			/* cr0.lt &= cr1.lt */
+	blt	forwards_memcpy		/* if regions overlap */
+
+	addi	r4,r4,-4
+	addi	r6,r3,-4
+	neg	r0,r3
+	andi.	r0,r0,CACHELINE_MASK	/* # bytes to start of cache line */
+	beq	58f
+
+	cmplw	0,r5,r0			/* is this more than total to do? */
+	blt	63f			/* if not much to do */
+	andi.	r8,r0,3			/* get it word-aligned first */
+	subf	r5,r0,r5
+	mtctr	r8
+	beq+	61f
+70:	lbz	r9,4(r4)		/* do some bytes */
+	stb	r9,4(r6)
+	addi	r4,r4,1
+	addi	r6,r6,1
+	bdnz	70b
+61:	srwi.	r0,r0,2
+	mtctr	r0
+	beq	58f
+72:	lwzu	r9,4(r4)		/* do some words */
+	stwu	r9,4(r6)
+	bdnz	72b
+
+58:	srwi.	r0,r5,LG_CACHELINE_BYTES /* # complete cachelines */
+	clrlwi	r5,r5,32-LG_CACHELINE_BYTES
+	li	r11,4
+	mtctr	r0
+	beq	63f
+53:	dcbz	r11,r6
+	lwz	r7,4(r4)
+	lwz	r8,8(r4)
+	lwz	r9,12(r4)
+	lwzu	r10,16(r4)
+	stw	r7,4(r6)
+	stw	r8,8(r6)
+	stw	r9,12(r6)
+	stwu	r10,16(r6)
+	lwz	r7,4(r4)
+	lwz	r8,8(r4)
+	lwz	r9,12(r4)
+	lwzu	r10,16(r4)
+	stw	r7,4(r6)
+	stw	r8,8(r6)
+	stw	r9,12(r6)
+	stwu	r10,16(r6)
+	bdnz	53b
+
+63:	srwi.	r0,r5,2
+	mtctr	r0
+	beq	64f
+30:	lwzu	r0,4(r4)
+	stwu	r0,4(r6)
+	bdnz	30b
+
+64:	andi.	r0,r5,3
+	mtctr	r0
+	beq+	65f
+40:	lbz	r0,4(r4)
+	stb	r0,4(r6)
+	addi	r4,r4,1
+	addi	r6,r6,1
+	bdnz	40b
+65:	blr
+#endif
+
+	.global	forwards_memcpy
+forwards_memcpy:
+	srwi.	r7,r5,3
 	addi	r6,r3,-4
 	addi	r4,r4,-4
 	beq	2f			/* if less than 8 bytes to do */
@@ -218,106 +334,167 @@
 
 	.globl	__copy_tofrom_user
 __copy_tofrom_user:
-	srwi.	r7,r5,3
-	addi	r6,r3,-4
 	addi	r4,r4,-4
-	li	r3,0		/* success return value */
-	beq	2f		/* if less than 8 bytes to do */
-	andi.	r0,r6,3		/* get dest word aligned */
-	mtctr	r7
-	bne	5f
-1:	lwz	r7,4(r4)
-11:	lwzu	r8,8(r4)
-12:	stw	r7,4(r6)
-13:	stwu	r8,8(r6)
-	bdnz	1b
-	andi.	r5,r5,7
-2:	cmplwi	0,r5,4
-	blt	3f
-14:	lwzu	r0,4(r4)
-	addi	r5,r5,-4
-15:	stwu	r0,4(r6)
-3:	cmpwi	0,r5,0		/* do 1 byte at a time for the remainder */
-	beqlr
-	mtctr	r5
-	addi	r4,r4,3
-	addi	r6,r6,3
-4:	lbzu	r0,1(r4)
-16:	stbu	r0,1(r6)
-	bdnz	4b
-	blr
-5:	subfic	r0,r0,4		/* copy bytes until we have the */
-	mtctr	r0		/* destination 4-byte aligned */
-	subf	r5,r0,r5
-6:	lbz	r7,4(r4)
+	addi	r6,r3,-4
+	neg	r0,r3
+	andi.	r0,r0,CACHELINE_MASK	/* # bytes to start of cache line */
+	beq	58f
+
+	cmplw	0,r5,r0			/* is this more than total to do? */
+	blt	63f			/* if not much to do */
+	andi.	r8,r0,3			/* get it word-aligned first */
+	mtctr	r8
+	beq+	61f
+70:	lbz	r9,4(r4)		/* do some bytes */
+71:	stb	r9,4(r6)
 	addi	r4,r4,1
-17:	stb	r7,4(r6)
 	addi	r6,r6,1
-	bdnz	6b
-	srwi.	r7,r5,3
-	beq	2b
-	mtctr	r7
-	b	1b
-/* we come here on a fault in the 8-byte-at-a-time loop */
-88:	subi	r4,r4,8		/* compensate for the lwzu */
-98:	mfctr	r0
-	rlwimi	r5,r0,3,0,28	/* use the byte-at-a-time loop to */
-	b	3b		/* copy up to the byte at fault */
-/* here on a write fault in the single-word copy */
-96:	subi	r4,r4,4
-	b	3b
-/* here on a read fault in the initial single-byte copy */
-90:	mfctr	r3
-	add	r3,r3,r5
-	b	70f
-/* here on a read fault in the final single-byte copy */
-99:	mfctr	r3
-	subi	r6,r6,3
-/* clear out the rest of the destination: r3 bytes starting at 4(r6) */
-70:	li	r0,0
-	mr.	r5,r3
-	beq	76f
-71:	andi.	r4,r6,3
-	beq	72f
-77:	stb	r0,4(r6)
+	bdnz	70b
+61:	subf	r5,r0,r5
+	srwi.	r0,r0,2
+	mtctr	r0
+	beq	58f
+72:	lwzu	r9,4(r4)		/* do some words */
+73:	stwu	r9,4(r6)
+	bdnz	72b
+
+58:	srwi.	r0,r5,LG_CACHELINE_BYTES /* # complete cachelines */
+	clrlwi	r5,r5,32-LG_CACHELINE_BYTES
+	li	r11,4
+	mtctr	r0
+	beq	63f
+53:	dcbz	r11,r6
+10:	lwz	r7,4(r4)
+11:	lwz	r8,8(r4)
+12:	lwz	r9,12(r4)
+13:	lwzu	r10,16(r4)
+14:	stw	r7,4(r6)
+15:	stw	r8,8(r6)
+16:	stw	r9,12(r6)
+17:	stwu	r10,16(r6)
+20:	lwz	r7,4(r4)
+21:	lwz	r8,8(r4)
+22:	lwz	r9,12(r4)
+23:	lwzu	r10,16(r4)
+24:	stw	r7,4(r6)
+25:	stw	r8,8(r6)
+26:	stw	r9,12(r6)
+27:	stwu	r10,16(r6)
+	bdnz	53b
+
+63:	srwi.	r0,r5,2
+	mtctr	r0
+	beq	64f
+30:	lwzu	r0,4(r4)
+31:	stwu	r0,4(r6)
+	bdnz	30b
+
+64:	andi.	r0,r5,3
+	mtctr	r0
+	beq+	65f
+40:	lbz	r0,4(r4)
+41:	stb	r0,4(r6)
+	addi	r4,r4,1
 	addi	r6,r6,1
-	addic.	r5,r5,-1
-	bne	71b
-72:	srwi.	r7,r5,2
-	beq	73f
-	mtctr	r7
-74:	stwu	r0,4(r6)
-	bdnz	74b
-73:	andi.	r5,r5,3
-	beq	76f
-	mtctr	r5
-	addi	r6,r6,3
-75:	stbu	r0,1(r6)
-	bdnz	75b
-76:	blr
-/* here on a write fault in the initial single-byte copy */
-80:	mfctr	r3
-	add	r3,r3,r5
-	blr
-/* here on a write fault in the final single-byte copy */
-81:	mfctr	r3
+	bdnz	40b
+65:	li	r3,0
 	blr
 
+/* read fault, initial single-byte copy */
+100:	li	r4,0
+	b	90f
+/* write fault, initial single-byte copy */
+101:	li	r4,1
+90:	subf	r5,r8,r5
+	li	r3,0
+	b	99f
+/* read fault, initial word copy */
+102:	li	r4,0
+	b	91f
+/* write fault, initial word copy */
+103:	li	r4,1
+91:	li	r3,2
+	b	99f
+/* read fault in 2nd half of cacheline loop */
+106:	addi	r5,r5,-16
+/* read fault in 1st half of cacheline loop */
+104:	li	r4,0
+	b	92f
+/* write fault in 2nd half of cacheline loop */
+107:	addi	r5,r5,-16
+/* fault on dcbz (effectively a write fault) */
+/* or write fault in 1st half of cacheline loop */
+105:	li	r4,1
+92:	li	r3,LG_CACHELINE_BYTES
+	b	99f
+/* read fault in final word loop */
+108:	li	r4,0
+	b	93f
+/* write fault in final word loop */
+109:	li	r4,1
+93:	andi.	r5,r5,3
+	li	r3,2
+	b	99f
+/* read fault in final byte loop */
+110:	li	r4,0
+	b	94f
+/* write fault in final byte loop */
+111:	li	r4,1
+94:	li	r5,0
+	li	r3,0
+/*
+ * At this stage the number of bytes not copied is
+ * r5 + (ctr << r3), and r4 is 0 for read or 1 for write.
+ */
+99:	mfctr	r0
+	slw	r3,r0,r3
+	add	r3,r3,r5
+	cmpwi	0,r4,0
+	bne	120f
+/* for read fault, clear out the destination: r3 bytes starting at 4(r6) */
+	srwi.	r0,r3,2
+	li	r9,0
+	mtctr	r0
+	beq	113f
+112:	stwu	r9,4(r6)
+	bdnz	112b
+113:	andi.	r0,r3,3
+	mtctr	r0
+	beq	120f
+114:	stb	r9,4(r6)
+	addi	r6,r6,1
+	bdnz	114b
+120:	blr
+
 .section __ex_table,"a"
 	.align	2
-	.long	1b,98b
-	.long	11b,98b
-	.long	12b,88b
-	.long	13b,88b
-	.long	14b,3b
-	.long	15b,96b
-	.long	4b,99b
-	.long	16b,81b
-	.long	6b,90b
-	.long	17b,80b
-	.long	77b,76b
-	.long	74b,76b
-	.long	75b,76b
+	.long	70b,100b
+	.long	71b,101b
+	.long	72b,102b
+	.long	73b,103b
+	.long	53b,105b
+	.long	10b,104b
+	.long	11b,104b
+	.long	12b,104b
+	.long	13b,104b
+	.long	14b,105b
+	.long	15b,105b
+	.long	16b,105b
+	.long	17b,105b
+	.long	20b,106b
+	.long	21b,106b
+	.long	22b,106b
+	.long	23b,106b
+	.long	24b,107b
+	.long	25b,107b
+	.long	26b,107b
+	.long	27b,107b
+	.long	30b,108b
+	.long	31b,109b
+	.long	40b,110b
+	.long	41b,111b
+	.long	112b,120b
+	.long	114b,120b
 .text
 
 	.globl	__clear_user
@@ -334,7 +511,6 @@
 	andi.	r0,r6,3
 	add	r4,r0,r4
 	subf	r6,r0,r6
-	/*rlwinm	r0,r4,32-2,2,31*/
 	srwi	r0,r4,2
 	mtctr	r0
 	bdz	6f
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/arch/ppc/mm/fault.c linux.17p9/arch/ppc/mm/fault.c
--- linux.vanilla/arch/ppc/mm/fault.c	Fri Apr 21 12:45:47 2000
+++ linux.17p9/arch/ppc/mm/fault.c	Fri Jun 16 16:24:33 2000
@@ -71,7 +71,10 @@
 	       (error_code&0x80000000)?"I/O ":"",
 	       (regs->trap == 0x400)?"instr":"data"
 	       );*/
-	       
+
+	if (regs->trap == 0x400)
+		error_code &= 0x48200000;
+
 #if defined(CONFIG_XMON) || defined(CONFIG_KGDB)
 	if (debugger_fault_handler && regs->trap == 0x300) {
 		debugger_fault_handler(regs);
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/arch/ppc/mm/init.c linux.17p9/arch/ppc/mm/init.c
--- linux.vanilla/arch/ppc/mm/init.c	Fri Apr 21 12:45:47 2000
+++ linux.17p9/arch/ppc/mm/init.c	Mon Jun 26 15:46:10 2000
@@ -416,7 +416,12 @@
 
 void iounmap(void *addr)
 {
-	/* XXX todo */
+	/* For support of dynamic hot swap on the cPCI bus this routine
+	   is now necessary.  This has been well tested on a Motorola
+	   MPC750 (Mesquite) processor board.  Johnnie Peters
+	*/
+	if (addr > high_memory && (unsigned long) addr < ioremap_bot)
+		return vfree((void *) (PAGE_MASK & (unsigned long) addr));
 }
 
 unsigned long iopa(unsigned long addr)
@@ -928,15 +933,21 @@
 				/* On the powerpc, no user access
 				   forces R/W kernel access */
 				f |= _PAGE_USER;
+			map_page(v, p, f);
+			v += PAGE_SIZE;
+			p += PAGE_SIZE;
+		}
+	}
+
 #else	/* CONFIG_8xx */
-            for (i = 0; i < phys_mem.n_regions; ++i) {
-                    v = (ulong)__va(phys_mem.regions[i].address);
-                    p = phys_mem.regions[i].address;
-                    for (s = 0; s < phys_mem.regions[i].size; s += PAGE_SIZE) {
+	for (i = 0; i < phys_mem.n_regions; ++i) {
+		v = (ulong)__va(phys_mem.regions[i].address);
+		p = phys_mem.regions[i].address;
+		for (s = 0; s < phys_mem.regions[i].size; s += PAGE_SIZE) {
                         /* On the MPC8xx, we want the page shared so we
                          * don't get ASID compares on kernel space.
                          */
-                            f = _PAGE_PRESENT | _PAGE_ACCESSED | _PAGE_SHARED;
+			f = _PAGE_PRESENT | _PAGE_ACCESSED | _PAGE_SHARED;
 
                         /* I don't really need the rest of this code, but
                          * I grabbed it because I think the line:
@@ -946,14 +957,14 @@
                          * the MPC8xx, the PAGE_DIRTY takes care of that
                          * for us (along with the RW software state).
                          */
-                            if ((char *) v < _stext || (char *) v >= etext)
-                                    f |= _PAGE_RW | _PAGE_DIRTY | _PAGE_HWWRITE;
-#endif /* CONFIG_8xx */
+			if ((char *) v < _stext || (char *) v >= etext)
+				f |= _PAGE_RW | _PAGE_DIRTY | _PAGE_HWWRITE;
 			map_page(v, p, f);
 			v += PAGE_SIZE;
 			p += PAGE_SIZE;
 		}
-	}	    
+	}
+#endif /* CONFIG_8xx */
 }
 
 /* This can get called from ioremap, so don't make it an initfunc, OK? */
@@ -1052,7 +1063,6 @@
 #endif /* CONFIG_GEMINI	*/
 	else /* prep */
 		end_of_DRAM = prep_find_end_of_memory();
-*(unsigned long *)(KERNELBASE) = 0xdeadbeef;	
         hash_init();
         _SDR1 = __pa(Hash) | (Hash_mask >> 10);
 	ioremap_base = 0xf8000000;
@@ -1252,8 +1262,8 @@
 #endif /* CONFIG_BLK_DEV_INITRD */
 #ifndef CONFIG_8xx		  
 			if ( !rtas_data ||
-			     addr < (rtas_data & PAGE_MASK) ||
-			     addr >= (rtas_data+rtas_size))
+			     addr < (rtas_data + KERNELBASE) ||
+			     addr >= (rtas_data + KERNELBASE + rtas_size))
 #endif /* CONFIG_8xx */
 				free_page(addr);
 	}
@@ -1314,6 +1324,7 @@
 	return ret;
 }
 #endif /* CONFIG_MBX */
+
 #ifndef CONFIG_8xx
 /*
  * On systems with Open Firmware, collect information about
@@ -1380,6 +1391,7 @@
 	if (boot_infos == 0) {
 		/* record which bits the prom is using */
 		get_mem_prop("available", &phys_avail);
+		remove_mem_piece(&phys_avail, __max_memory, ~__max_memory, 0);
 		prom_mem = phys_mem;
 		for (i = 0; i < phys_avail.n_regions; ++i)
 			remove_mem_piece(&prom_mem,
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/arch/ppc/pmac_defconfig linux.17p9/arch/ppc/pmac_defconfig
--- linux.vanilla/arch/ppc/pmac_defconfig	Fri Apr 21 12:45:47 2000
+++ linux.17p9/arch/ppc/pmac_defconfig	Fri Jun 16 16:24:33 2000
@@ -253,6 +253,7 @@
 CONFIG_NET_ETHERNET=y
 CONFIG_MACE=y
 CONFIG_BMAC=y
+CONFIG_GMAC=y
 # CONFIG_NET_VENDOR_3COM is not set
 # CONFIG_LANCE is not set
 # CONFIG_NET_VENDOR_SMC is not set
@@ -339,6 +340,7 @@
 CONFIG_FB_PLATINUM=y
 CONFIG_FB_VALKYRIE=y
 CONFIG_FB_ATY=y
+CONFIG_FB_ATY128=y
 CONFIG_FB_IMSTT=y
 CONFIG_FB_CT65550=y
 # CONFIG_FB_S3TRIO is not set
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/arch/ppc/xmon/start.c linux.17p9/arch/ppc/xmon/start.c
--- linux.vanilla/arch/ppc/xmon/start.c	Fri Apr 21 12:45:48 2000
+++ linux.17p9/arch/ppc/xmon/start.c	Fri Jun 16 16:24:34 2000
@@ -11,16 +11,30 @@
 #include <asm/prom.h>
 #include <asm/bootx.h>
 #include <asm/pmu.h>
+#include <asm/feature.h>
 
 static volatile unsigned char *sccc, *sccd;
 unsigned long TXRDY, RXRDY;
 extern void xmon_printf(const char *fmt, ...);
-extern void map_bootx_text(void);
 extern void drawchar(char);
 extern void drawstring(const char *str);
+static int xmon_expect(const char *str, unsigned int timeout);
 
 static int console = 0;
 static int use_screen = 0;
+static int via_modem = 0;
+static int xmon_use_sccb = 0;
+static struct device_node *macio_node;
+
+#define TB_SPEED	25000000
+
+static inline unsigned int readtb(void)
+{
+	unsigned int ret;
+
+	asm volatile("mftb %0" : "=r" (ret) :);
+	return ret;
+}
 
 void buf_access(void)
 {
@@ -36,17 +50,18 @@
 	if ( _machine == _MACH_Pmac )
 	{
 		struct device_node *np;
-		extern boot_infos_t *boot_infos;
 		unsigned long addr;
-
 #ifdef CONFIG_BOOTX_TEXT
-		if (boot_infos != 0 && find_via_pmu()) {
+		extern boot_infos_t *disp_bi;
+
+		/* needs to be hacked if xmon_printk is to be used
+ 		   from within find_via_pmu() */
+		if (!via_modem && disp_bi && find_via_pmu()) {
 			printk(KERN_INFO "xmon uses screen and keyboard\n");
 			use_screen = 1;
-			map_bootx_text();
-			return;
 		}
 #endif
+
 #ifdef CHRP_ESCC
 		addr = 0xc1013020;
 #else
@@ -57,18 +72,13 @@
 		
 		np = find_devices("mac-io");
 		if (np && np->n_addrs) {
-			addr = np->addrs[0].address + 0x13000;
-			/* use the B channel on the iMac, A channel on others */
-			if (addr >= 0xf0000000)
-				addr += 0x20; /* use A channel */
+			macio_node = np;
+			addr = np->addrs[0].address + 0x13020;
 		}
-		base = (volatile unsigned char *) ioremap(addr & PAGE_MASK, PAGE_SIZE);
+		base = (volatile unsigned char *)
+			ioremap(addr & PAGE_MASK, PAGE_SIZE);
 		sccc = base + (addr & ~PAGE_MASK);
-#ifdef CHRP_ESCC
-		sccd = sccc + (0xc1013030 - 0xc1013020);
-#else
-		sccd = sccc + (0xf3013030 - 0xf3013020);
-#endif
+		sccd = sccc + 0x10;
 	}
 	else
 	{
@@ -89,7 +99,7 @@
 xmon_write(void *handle, void *ptr, int nb)
 {
     char *p = ptr;
-    int i, ct;
+    int i, c, ct;
 
 #ifdef CONFIG_BOOTX_TEXT
     if (use_screen) {
@@ -101,19 +111,23 @@
 #endif
     if (!scc_initialized)
 	xmon_init_scc();
+    ct = 0;
     for (i = 0; i < nb; ++i) {
 	while ((*sccc & TXRDY) == 0)
 	    if (adb_hardware == ADB_VIAPMU)
 		pmu_poll();
+	c = p[i];
+	if (c == '\n' && !ct) {
+	    c = '\r';
+	    ct = 1;
+	    --i;
+	} else {
+	    if (console)
+		printk("%c", c);
+	    ct = 0;
+	}
 	buf_access();
-	if ( console && (*p != '\r'))
-		printk("%c", *p);
-	ct = 0;
-	if ( *p == '\n')
-		ct = 1;
-	*sccd = *p++;
-	if ( ct )
-		xmon_write(handle, "\r", 1);
+	*sccd = c;
     }
     return i;
 }
@@ -199,23 +213,30 @@
 	    if (adb_hardware == ADB_VIAPMU)
 		pmu_poll();
 	buf_access();
-#if 0	
-	if ( 0/*console*/ )
-		*p++ = ppc_md.kbd_getkeycode();
-	else
-#endif		
-		*p++ = *sccd;
+	*p++ = *sccd;
     }
     return i;
 }
 
+int
+xmon_read_poll(void)
+{
+	if ((*sccc & RXRDY) == 0) {
+		if (adb_hardware == ADB_VIAPMU)
+			pmu_poll();
+		return -1;
+	}
+	buf_access();
+	return *sccd;
+}
+
 static unsigned char scc_inittab[] = {
     13, 0,		/* set baud rate divisor */
     12, 1,
     14, 1,		/* baud rate gen enable, src=rtxc */
     11, 0x50,		/* clocks = br gen */
-    5,  0x6a,		/* tx 8 bits, assert RTS */
-    4,  0x44,		/* x16 clock, 1 stop */
+    5,  0xea,		/* tx 8 bits, assert DTR & RTS */
+    4,  0x46,		/* x16 clock, 1 stop */
     3,  0xc1,		/* rx enable, 8 bits */
 };
 
@@ -235,6 +256,21 @@
 	{
 		int i, x;
 
+		if (macio_node != 0) {
+			unsigned int t0;
+
+			feature_set(macio_node, FEATURE_Serial_enable);
+			if (via_modem) {
+				feature_set(macio_node, FEATURE_Modem_power);
+				t0 = readtb();
+				while (readtb() - t0 < 3*TB_SPEED)
+					eieio();
+			}
+		}
+		if (xmon_use_sccb) {
+			sccc -= 0x20;
+			sccd -= 0x20;
+		}
 		for (i = 20000; i != 0; --i) {
 			x = *sccc; eieio();
 		}
@@ -246,6 +282,18 @@
 		}
 	}
 	scc_initialized = 1;
+	if (via_modem) {
+		for (;;) {
+			xmon_write(0, "ATE1V1\r", 7);
+			if (xmon_expect("OK", 5)) {
+				xmon_write(0, "ATA\r", 4);
+				if (xmon_expect("CONNECT", 40))
+					break;
+			}
+			xmon_write(0, "+++", 3);
+			xmon_expect("OK", 3);
+		}
+	}
 }
 
 #if 0
@@ -317,6 +365,35 @@
 static char line[256];
 static char *lineptr;
 static int lineleft;
+
+int xmon_expect(const char *str, unsigned int timeout)
+{
+	int c;
+	unsigned int t0;
+
+	timeout *= TB_SPEED;
+	t0 = readtb();
+	do {
+		lineptr = line;
+		for (;;) {
+			c = xmon_read_poll();
+			if (c == -1) {
+				if (readtb() - t0 > timeout) {
+					printk("timeout\n");
+					return 0;
+				}
+				continue;
+			}
+			if (c == '\n')
+				break;
+			printk("%c", c);
+			if (c != '\r' && lineptr < &line[sizeof(line) - 1])
+				*lineptr++ = c;
+		}
+		*lineptr = 0;
+	} while (strstr(line, str) == NULL);
+	return 1;
+}
 
 int
 xmon_getchar(void)
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/arch/sparc/kernel/signal.c linux.17p9/arch/sparc/kernel/signal.c
--- linux.vanilla/arch/sparc/kernel/signal.c	Fri Apr 21 12:45:48 2000
+++ linux.17p9/arch/sparc/kernel/signal.c	Sun Jun 11 21:58:59 2000
@@ -1,4 +1,4 @@
-/*  $Id: signal.c,v 1.91.2.1 1999/06/14 00:36:13 davem Exp $
+/*  $Id: signal.c,v 1.91.2.2 2000/05/28 19:13:21 ecd Exp $
  *  linux/arch/sparc/kernel/signal.c
  *
  *  Copyright (C) 1991, 1992  Linus Torvalds
@@ -536,7 +536,7 @@
 
 static inline void
 new_setup_frame(struct k_sigaction *ka, struct pt_regs *regs,
-		int signo, sigset_t *oldset)
+		int signr, sigset_t *oldset)
 {
 	struct new_signal_frame *sf;
 	int sigframe_size, err;
@@ -583,7 +583,7 @@
 	
 	/* 3. signal handler back-trampoline and parameters */
 	regs->u_regs[UREG_FP] = (unsigned long) sf;
-	regs->u_regs[UREG_I0] = signo;
+	regs->u_regs[UREG_I0] = signr;
 	regs->u_regs[UREG_I1] = (unsigned long) &sf->info;
 
 	/* 4. signal handler */
@@ -617,7 +617,7 @@
 
 static inline void
 new_setup_rt_frame(struct k_sigaction *ka, struct pt_regs *regs,
-		   int signo, sigset_t *oldset, siginfo_t *info)
+		   int signr, sigset_t *oldset, siginfo_t *info)
 {
 	struct rt_signal_frame *sf;
 	int sigframe_size;
@@ -650,20 +650,77 @@
 	} else {
 		err |= __put_user(0, &sf->fpu_save);
 	}
-	err |= __copy_to_user(&sf->mask, &oldset->sig[0], sizeof(sigset_t));
-	
+
+	/* Update the siginfo structure.  Is this good?  */
+	if (info->si_code == 0) {
+		info->si_signo = signr;
+		info->si_errno = 0;
+
+		switch (signr) {
+		case SIGSEGV:
+		case SIGILL:
+		case SIGFPE:
+		case SIGBUS:
+		case SIGEMT:
+			info->si_code = current->tss.sig_desc;
+			info->si_addr = (void *)current->tss.sig_address;
+			info->si_trapno = 0;
+			break;
+		default:
+			break;
+		}
+	}
+
+	err = __put_user (info->si_signo, &sf->info.si_signo);
+	err |= __put_user (info->si_errno, &sf->info.si_errno);
+	err |= __put_user (info->si_code, &sf->info.si_code);
+	if (info->si_code < 0)
+		err |= __copy_to_user (sf->info._sifields._pad, info->_sifields._pad, SI_PAD_SIZE);
+	else {
+		int i = info->si_signo;
+		if (info->si_code == SI_USER)
+			i = SIGRTMIN;
+		switch (i) {
+		case SIGPOLL:
+			err |= __put_user (info->si_band, &sf->info.si_band);
+			err |= __put_user (info->si_fd, &sf->info.si_fd);
+			break;
+		case SIGCHLD:
+			err |= __put_user (info->si_pid, &sf->info.si_pid);
+			err |= __put_user (info->si_uid, &sf->info.si_uid);
+			err |= __put_user (info->si_status, &sf->info.si_status);
+			err |= __put_user (info->si_utime, &sf->info.si_utime);
+			err |= __put_user (info->si_stime, &sf->info.si_stime);
+			break;
+		case SIGSEGV:
+		case SIGILL:
+		case SIGFPE:
+		case SIGBUS:
+		case SIGEMT:
+			err |= __put_user ((long)info->si_addr, &sf->info.si_addr);
+			err |= __put_user (info->si_trapno, &sf->info.si_trapno);
+			break;
+		default:
+			err |= __put_user (info->si_pid, &sf->info.si_pid);
+			err |= __put_user (info->si_uid, &sf->info.si_uid);
+			break;
+		}
+	}
+
 	/* Setup sigaltstack */
 	err |= __put_user(current->sas_ss_sp, &sf->stack.ss_sp);
 	err |= __put_user(sas_ss_flags(regs->u_regs[UREG_FP]), &sf->stack.ss_flags);
 	err |= __put_user(current->sas_ss_size, &sf->stack.ss_size);
-	
+
+	err |= __copy_to_user(&sf->mask, &oldset->sig[0], sizeof(sigset_t));
+
 	err |= __copy_to_user(sf, (char *) regs->u_regs [UREG_FP],
 			      sizeof (struct reg_window));	
 	if (err)
 		goto sigsegv;
 
 	regs->u_regs[UREG_FP] = (unsigned long) sf;
-	regs->u_regs[UREG_I0] = signo;
+	regs->u_regs[UREG_I0] = signr;
 	regs->u_regs[UREG_I1] = (unsigned long) &sf->info;
 
 	regs->pc = (unsigned long) ka->sa.sa_handler;
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/arch/sparc64/defconfig linux.17p9/arch/sparc64/defconfig
--- linux.vanilla/arch/sparc64/defconfig	Sun Jun 11 21:44:11 2000
+++ linux.17p9/arch/sparc64/defconfig	Mon Jun 26 15:44:40 2000
@@ -30,8 +30,9 @@
 CONFIG_FB_PM2=y
 # CONFIG_FB_PM2_FIFO_DISCONNECT is not set
 CONFIG_FB_PM2_PCI=y
-# CONFIG_FB_MATROX is not set
 CONFIG_FB_ATY=y
+# CONFIG_FB_MATROX is not set
+# CONFIG_FB_ATY128 is not set
 CONFIG_FB_SBUS=y
 CONFIG_FB_CREATOR=y
 CONFIG_FB_CGSIX=y
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/arch/sparc64/kernel/psycho.c linux.17p9/arch/sparc64/kernel/psycho.c
--- linux.vanilla/arch/sparc64/kernel/psycho.c	Sun Jun 11 21:44:11 2000
+++ linux.17p9/arch/sparc64/kernel/psycho.c	Fri Jun 16 16:19:53 2000
@@ -37,6 +37,12 @@
 unsigned long pci_dvma_v2p_hash[PCI_DVMA_HASHSZ];
 unsigned long pci_dvma_p2v_hash[PCI_DVMA_HASHSZ];
 
+/* If this is non-NULL it points to Sabre's DMA write-sync register
+ * which is used by drivers of devices behind bridges other than APB
+ * to synchronize DMA write streams with interrupt delivery.
+ */
+volatile u64 *pci_dma_wsync = NULL;
+
 #ifndef CONFIG_PCI
 
 int pcibios_present(void)
@@ -299,6 +305,8 @@
 		prom_printf("SABRE: Error, cannot map SABRE main registers.\n");
 		prom_halt();
 	}
+
+	pci_dma_wsync = &sabre->psycho_regs->pci_dma_wsync;
 
 	printk("PCI: Found SABRE, main regs at %p CTRL[%016lx]\n",
 	       sabre->psycho_regs, sabre->psycho_regs->control);
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/arch/sparc64/kernel/sparc64_ksyms.c linux.17p9/arch/sparc64/kernel/sparc64_ksyms.c
--- linux.vanilla/arch/sparc64/kernel/sparc64_ksyms.c	Sun Jun 11 21:44:11 2000
+++ linux.17p9/arch/sparc64/kernel/sparc64_ksyms.c	Fri Jun 16 16:19:53 2000
@@ -43,6 +43,7 @@
 #endif
 #ifdef CONFIG_PCI
 #include <asm/ebus.h>
+#include <asm/pbm.h>
 #endif
 #include <asm/a.out.h>
 #include <asm/svr4.h>
@@ -193,6 +194,7 @@
 EXPORT_SYMBOL(insb);
 EXPORT_SYMBOL(insw);
 EXPORT_SYMBOL(insl);
+EXPORT_SYMBOL(pci_dma_wsync);
 #endif
 
 /* Solaris/SunOS binary compatibility */
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/arch/sparc64/kernel/sys_sparc32.c linux.17p9/arch/sparc64/kernel/sys_sparc32.c
--- linux.vanilla/arch/sparc64/kernel/sys_sparc32.c	Fri Apr 21 12:45:48 2000
+++ linux.17p9/arch/sparc64/kernel/sys_sparc32.c	Tue Jun 20 22:47:03 2000
@@ -1,4 +1,4 @@
-/* $Id: sys_sparc32.c,v 1.107.2.8 2000/02/28 04:09:49 davem Exp $
+/* $Id: sys_sparc32.c,v 1.107.2.9 2000/06/20 17:12:25 davem Exp $
  * sys_sparc32.c: Conversion between 32bit and 64bit native syscalls.
  *
  * Copyright (C) 1997,1998 Jakub Jelinek (jj@sunsite.mff.cuni.cz)
@@ -2488,7 +2488,8 @@
 	 * the cmsg_len for MSG_TRUNC cases, we need not check that case either.
 	 */
 	ucmsg = (struct cmsghdr *) orig_cmsg_uptr;
-	while(((unsigned long)ucmsg) < ((unsigned long)kmsg->msg_control)) {
+	while(((unsigned long)ucmsg) <=
+	      (((unsigned long)kmsg->msg_control) - sizeof(struct cmsghdr))) {
 		struct cmsghdr32 *kcmsg32 = (struct cmsghdr32 *) wp;
 		int clen64, clen32;
 
@@ -3689,8 +3690,10 @@
 		err = nfs_getfh32_trans(karg, arg32);
 		break;
 	case NFSCTL_LOCKD:
-		/* No arguments, no translations... */
-		err = 0;
+		/* We still have to copy over the version
+		 * because nfsctl still checks that.
+		 */
+		err = get_user(karg->ca_version, &arg32->ca32_version);
 		break;
 	default:
 		err = -EINVAL;
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/drivers/block/cmd646.c linux.17p9/drivers/block/cmd646.c
--- linux.vanilla/drivers/block/cmd646.c	Fri Apr 21 12:45:50 2000
+++ linux.17p9/drivers/block/cmd646.c	Tue Jun 20 22:53:06 2000
@@ -247,5 +247,9 @@
 	(void) pci_write_config_byte(dev, 0x58, 0x3f);
 	(void) pci_write_config_byte(dev, 0x5b, 0x3f);
 
+#ifdef CONFIG_PPC
+	(void) pci_write_config_byte(dev, 0x73, 0xf0);
+#endif /* CONFIG_PPC */
+
 	hwif->dmaproc = &cmd646_dmaproc;
 }
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/drivers/block/genhd.c linux.17p9/drivers/block/genhd.c
--- linux.vanilla/drivers/block/genhd.c	Sun Jun 11 21:44:11 2000
+++ linux.17p9/drivers/block/genhd.c	Sun Jun 25 17:33:29 2000
@@ -1089,6 +1089,14 @@
     /* ... more stuff */
 };
 
+static inline void mac_fix_string(char *stg, int len)
+{
+	int i;
+
+	for (i = len - 1; i >= 0 && stg[i] == ' '; i--)
+		stg[i] = 0;
+}
+
 static int mac_partition(struct gendisk *hd, kdev_t dev, unsigned long fsec)
 {
 	struct buffer_head *bh;
@@ -1157,18 +1165,31 @@
 		 */
 		if (_machine == _MACH_Pmac) {
 			int goodness = 0;
+
+			mac_fix_string(part->processor, 16);
+			mac_fix_string(part->name, 32);
+			mac_fix_string(part->type, 32);					
 		    
 			if ((be32_to_cpu(part->status) & MAC_STATUS_BOOTABLE)
 			    && strcasecmp(part->processor, "powerpc") == 0)
 				goodness++;
 
-			if (strcasecmp(part->type, "Apple_UNIX_SVR2") == 0) {
+			if (strcasecmp(part->type, "Apple_UNIX_SVR2") == 0
+			    || strcasecmp(part->type, "Linux_PPC") == 0) {
+				int i, l;
+
 				goodness++;
-				if ((strcmp(part->name, "/") == 0) ||
-				    (strstr(part->name, "root") != 0)) {
+				l = strlen(part->name);
+				if (strcmp(part->name, "/") == 0)
 					goodness++;
+				for (i = 0; i <= l - 4; ++i) {
+					if (strnicmp(part->name + i, "root",
+						     4) == 0) {
+						goodness += 2;
+						break;
+					}
 				}
-				if (strncmp(part->name, "swap", 4) == 0)
+				if (strnicmp(part->name, "swap", 4) == 0)
 					goodness--;
 			}
 
@@ -1193,7 +1214,7 @@
 #endif /* CONFIG_MAC_PARTITION */
 
 #ifdef CONFIG_ATARI_PARTITION
-#include <asm/atari_rootsec.h>
+#include <linux/atari_rootsec.h>
 
 /* ++guenther: this should be settable by the user ("make config")?.
  */
@@ -1237,7 +1258,7 @@
 	      part_fmt = 1;
 #endif
 	      printk(" XGM<");
-	      partsect = extensect = pi->st;
+	      partsect = extensect = be32_to_cpu(pi->st);
 	      while (1)
 		{
 		  xbh = bread (dev, partsect / 2, get_ptable_blocksize(dev));
@@ -1258,8 +1279,8 @@
 		    break;
 		  }
 
-		  add_partition(hd, minor, partsect + xrs->part[0].st,
-				xrs->part[0].siz, 0);
+		  add_partition(hd, minor, partsect + be32_to_cpu(xrs->part[0].st),
+				be32_to_cpu(xrs->part[0].siz), 0);
 
 		  if (!(xrs->part[1].flg & 1)) {
 		    /* end of linked partition list */
@@ -1272,7 +1293,7 @@
 		    break;
 		  }
 
-		  partsect = xrs->part[1].st + extensect;
+		  partsect = be32_to_cpu(xrs->part[1].st) + extensect;
 		  brelse (xbh);
 		  minor++;
 		  if (minor >= m_lim) {
@@ -1285,7 +1306,8 @@
 	  else
 	    {
 	      /* we don't care about other id's */
-	      add_partition (hd, minor, pi->st, pi->siz, 0);
+	      printk(" %c%c%c(%d)", pi->id[0], pi->id[1], pi->id[2], be32_to_cpu(pi->siz)/2048);
+	      add_partition (hd, minor, be32_to_cpu(pi->st), be32_to_cpu(pi->siz), 0);
 	    }
 	}
     }
@@ -1520,10 +1542,6 @@
 	if(amiga_partition(hd, dev, first_sector))
 		return;
 #endif
-#ifdef CONFIG_ATARI_PARTITION
-	if(atari_partition(hd, dev, first_sector))
-		return;
-#endif
 #ifdef CONFIG_MAC_PARTITION
 	if (mac_partition(hd, dev, first_sector))
 		return;
@@ -1534,6 +1552,10 @@
 #endif
 #ifdef CONFIG_ULTRIX_PARTITION
 	if(ultrix_partition(hd, dev, first_sector))
+		return;
+#endif
+#ifdef CONFIG_ATARI_PARTITION
+	if(atari_partition(hd, dev, first_sector))
 		return;
 #endif
 #ifdef CONFIG_ARCH_S390
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/drivers/block/ide-cd.c linux.17p9/drivers/block/ide-cd.c
--- linux.vanilla/drivers/block/ide-cd.c	Sun Jun 11 21:44:11 2000
+++ linux.17p9/drivers/block/ide-cd.c	Tue Jun 20 23:11:27 2000
@@ -1,8 +1,9 @@
 /*
- * linux/drivers/block/ide-cd.c
+ * linux/drivers/ide/ide-cd.c
+ *
  * Copyright (C) 1994, 1995, 1996  scott snyder  <snyder@fnald0.fnal.gov>
  * Copyright (C) 1996-1998  Erik Andersen <andersee@debian.org>
- * Copyright (C) 1998-2000 Jens Axboe <axboe@suse.de>
+ * Copyright (C) 1998-2000  Jens Axboe <axboe@suse.de>
  *
  * May be copied or modified under the terms of the GNU General Public
  * License.  See linux/COPYING for more information.
@@ -271,15 +272,18 @@
  *			- Fixed a problem with WPI CDS-32X drive - it
  *			  failed the capabilities 
  *
- * 4.57 never happened
- *
- * 4.58 May 1, 2000	- Fixed possible oops in ide_cdrom_get_last_session()
+ * 4.57  Apr 7, 2000	- Fixed sense reporting.
+ *			- Fixed possible oops in ide_cdrom_get_last_session()
  *			- Fix locking mania and make ide_cdrom_reset relock
  *			- Stop spewing errors to log when magicdev polls with
  *			  TEST_UNIT_READY on some drives.
- *			- Cleanup ACER50 stuff.
- *			- Integrate the ide_cdrom_packet from 2.3 to
- *			  support DVD CSS ioctls.
+ *			- Various fixes from Tobias Ringstrom:
+ *			  tray if it was locked prior to the reset.
+ *			  - cdrom_read_capacity returns one frame too little.
+ *			  - Fix real capacity reporting.
+ *
+ * 4.58  May 1, 2000	- Clean up ACER50 stuff.
+ *			- Fix small problem with ide_cdrom_capacity
  *
  *************************************************************************/
  
@@ -309,7 +313,6 @@
  * Generic packet command support and error handling routines.
  */
 
-
 /* Mark that we've seen a media change, and invalidate our internal
    buffers. */
 static void cdrom_saw_media_change (ide_drive_t *drive)
@@ -323,8 +326,9 @@
 
 
 static
-void cdrom_analyze_sense_data (ide_drive_t *drive, struct packet_command *pc,
-				struct request_sense *sense)
+void cdrom_analyze_sense_data(ide_drive_t *drive,
+			      struct packet_command *failed_command,
+			      struct request_sense *sense)
 {
 	if (sense->sense_key == NOT_READY ||
 	    sense->sense_key == UNIT_ATTENTION) {
@@ -338,13 +342,12 @@
 		   READ_SUBCHANNEL.  Workman (and probably other programs)
 		   uses this command to poll the drive, and we don't want
 		   to fill the syslog with useless errors. */
-		if (pc && (pc->c[0] == GPCMD_READ_SUBCHANNEL))
+		if (failed_command &&
+		    (failed_command->c[0] == GPCMD_READ_SUBCHANNEL ||
+		     failed_command->c[0] == GPCMD_TEST_UNIT_READY))
 			return;
 	}
 
-	if (pc && (pc->c[0] == GPCMD_TEST_UNIT_READY))
-		return;
-
 	if (sense->error_code == 0x70 && sense->sense_key  == 0x02
 	 && ((sense->asc      == 0x3a && sense->ascq       == 0x00) ||
 	     (sense->asc      == 0x04 && sense->ascq       == 0x01)))
@@ -364,9 +367,9 @@
 		char buf[80];
 
 		printk ("ATAPI device %s:\n", drive->name);
-		if (sense->error_code == 0x70)
+		if (sense->error_code==0x70)
 			printk("  Error: ");
-		else if (sense->error_code == 0x71)
+		else if (sense->error_code==0x71)
 			printk("  Deferred Error: ");
 		else if (sense->error_code == 0x7f)
 			printk("  Vendor-specific Error: ");
@@ -378,17 +381,17 @@
 		else
 			s = "bad sense key!";
 
-		printk ("%s -- (Sense key=0x%02x)\n", s, sense->sense_key);
+		printk("%s -- (Sense key=0x%02x)\n", s, sense->sense_key);
 
 		if (sense->asc == 0x40) {
-			sprintf (buf, "Diagnostic failure on component 0x%02x",
+			sprintf(buf, "Diagnostic failure on component 0x%02x",
 				 sense->ascq);
 			s = buf;
 		} else {
-			int lo=0, mid, hi=ARY_LEN (sense_data_texts);
+			int lo = 0, mid, hi = ARY_LEN(sense_data_texts);
 			unsigned long key = (sense->sense_key << 16);
 			key |= (sense->asc << 8);
-			if ( ! (sense->ascq >= 0x80 && sense->ascq <= 0xdd) )
+			if (!(sense->ascq >= 0x80 && sense->ascq <= 0xdd))
 				key |= sense->ascq;
 			s = NULL;
 
@@ -413,30 +416,32 @@
 				s = "(reserved error code)";
 		}
 
-		printk ("  %s -- (asc=0x%02x, ascq=0x%02x)\n",
+		printk("  %s -- (asc=0x%02x, ascq=0x%02x)\n",
 			s, sense->asc, sense->ascq);
 
-		if (pc != NULL) {
+		if (failed_command != NULL) {
 
 			int lo=0, mid, hi= ARY_LEN (packet_command_texts);
 			s = NULL;
 
 			while (hi > lo) {
 				mid = (lo + hi) / 2;
-				if (packet_command_texts[mid].packet_command == pc->c[0]) {
+				if (packet_command_texts[mid].packet_command ==
+				    failed_command->c[0]) {
 					s = packet_command_texts[mid].text;
 					break;
 				}
-				else if (packet_command_texts[mid].packet_command > pc->c[0])
+				if (packet_command_texts[mid].packet_command >
+				    failed_command->c[0])
 					hi = mid;
 				else
 					lo = mid+1;
 			}
 
 			printk ("  The failed \"%s\" packet command was: \n  \"", s);
-			for (i = 0; i < sizeof(pc->c); i++)
-				printk("%02x ", pc->c[i]);
-			printk("\"\n");
+			for (i=0; i<sizeof (failed_command->c); i++)
+				printk ("%02x ", failed_command->c[i]);
+			printk ("\"\n");
 		}
 
 		/* The SKSV bit specifies validity of the sense_key_specific
@@ -452,7 +457,7 @@
 
 		if (sense->sense_key == ILLEGAL_REQUEST &&
 		    (sense->sks[0] & 0x80) != 0) {
-			printk ("  Error in %s byte %d",
+			printk("  Error in %s byte %d",
 				(sense->sks[0] & 0x40) != 0 ?
 				"command packet" : "command data",
 				(sense->sks[1] << 8) + sense->sks[2]);
@@ -460,7 +465,7 @@
 			if ((sense->sks[0] & 0x40) != 0)
 				printk (" bit %d", sense->sks[0] & 0x07);
 
-			printk("\n");
+			printk ("\n");
 		}
 	}
 
@@ -475,15 +480,16 @@
 		return;
 
 	printk("%s: error code: 0x%02x  sense_key: 0x%02x  asc: 0x%02x  ascq: 0x%02x\n",
-		drive->name, sense->error_code, sense->sense_key,
+		drive->name,
+		sense->error_code, sense->sense_key,
 		sense->asc, sense->ascq);
 #endif /* not VERBOSE_IDE_CD_ERRORS */
 }
 
-static void cdrom_queue_request_sense(ide_drive_t *drive,
+static void cdrom_queue_request_sense(ide_drive_t *drive, 
 				      struct semaphore *sem,
 				      struct request_sense *sense,
-				      struct packet_command *failed_cmd)
+				      struct packet_command *failed_command)
 {
 	struct cdrom_info *info = drive->driver_data;
 	struct request *rq;
@@ -496,7 +502,7 @@
 	pc->c[0] = GPCMD_REQUEST_SENSE;
 	pc->c[4] = pc->buflen = 18;
 	pc->buffer = (char *) sense;
-	pc->sense = (struct request_sense *) failed_cmd;
+	pc->sense = (struct request_sense *) failed_command;
 
 	/* stuff the sense request in front of our current request */
 	rq = &info->request_sense_request;
@@ -507,15 +513,16 @@
 	(void) ide_do_drive_cmd(drive, rq, ide_preempt);
 }
 
+
 static void cdrom_end_request (int uptodate, ide_drive_t *drive)
 {
 	struct request *rq = HWGROUP(drive)->rq;
 
 	if (rq->cmd == REQUEST_SENSE_COMMAND && uptodate) {
 		struct packet_command *pc = (struct packet_command *)rq->buffer;
-		cdrom_analyze_sense_data (drive,
+		cdrom_analyze_sense_data(drive,
 			(struct packet_command *) pc->sense,
-			(struct request_sense *) pc->buffer - pc->c[4]);
+			(struct request_sense *) (pc->buffer - pc->c[4]));
 	}
 	if (rq->cmd == READ && !rq->current_nr_sectors)
 		uptodate = 1;
@@ -654,6 +661,9 @@
 	struct packet_command *pc = (struct packet_command *) rq->buffer;
 	unsigned long wait = 0;
 
+	/* blank and format can take an extremly long time to
+	 * complete, if the IMMED bit was not set.
+	 */
 	if (pc->c[0] == GPCMD_BLANK || pc->c[0] == GPCMD_FORMAT_UNIT)
 		wait = 60*60*HZ;
 
@@ -1066,15 +1076,15 @@
 		(65534 / CD_FRAMESIZE) : 65535);
 
 	/* Set up the command */
-	memset(&pc.c, 0, sizeof(pc.c));
+	memset (&pc.c, 0, sizeof (pc.c));
 	pc.c[0] = GPCMD_READ_10;
 	pc.c[7] = (nframes >> 8);
 	pc.c[8] = (nframes & 0xff);
 	put_unaligned(cpu_to_be32(frame), (unsigned int *) &pc.c[2]);
 
 	/* Send the command to the drive and return. */
-	return cdrom_transfer_packet_command(drive, pc.c, sizeof (pc.c),
-					      &cdrom_read_intr);
+	return cdrom_transfer_packet_command(drive, pc.c, sizeof(pc.c),
+					     &cdrom_read_intr);
 }
 
 
@@ -1190,20 +1200,20 @@
 			  struct request_sense *sense);
 
 /* Interrupt routine for packet command completion. */
-static ide_startstop_t cdrom_pc_intr(ide_drive_t *drive)
+static ide_startstop_t cdrom_pc_intr (ide_drive_t *drive)
 {
 	int ireason, len, stat, thislen;
 	struct request *rq = HWGROUP(drive)->rq;
-	struct packet_command *pc = (struct packet_command *) rq->buffer;
+	struct packet_command *pc = (struct packet_command *)rq->buffer;
 	ide_startstop_t startstop;
 
 	/* Check for errors. */
-	if (cdrom_decode_status(&startstop, drive, 0, &stat))
+	if (cdrom_decode_status (&startstop, drive, 0, &stat))
 		return startstop;
 
 	/* Read the interrupt reason and the transfer length. */
-	ireason = IN_BYTE(IDE_NSECTOR_REG);
-	len = IN_BYTE(IDE_LCYL_REG) + 256 * IN_BYTE (IDE_HCYL_REG);
+	ireason = IN_BYTE (IDE_NSECTOR_REG);
+	len = IN_BYTE (IDE_LCYL_REG) + 256 * IN_BYTE (IDE_HCYL_REG);
 
 	/* If DRQ is clear, the command has completed.
 	   Complain if we still have data left to transfer. */
@@ -1242,14 +1252,14 @@
 	/* The drive wants to be written to. */
 	if ((ireason & 3) == 0) {
 		/* Transfer the data. */
-		atapi_output_bytes(drive, pc->buffer, thislen);
+		atapi_output_bytes (drive, pc->buffer, thislen);
 
 		/* If we haven't moved enough data to satisfy the drive,
 		   add some padding. */
 		while (len > thislen) {
 			int dum = 0;
-			atapi_output_bytes(drive, &dum, sizeof (dum));
-			len -= sizeof(dum);
+			atapi_output_bytes (drive, &dum, sizeof (dum));
+			len -= sizeof (dum);
 		}
 
 		/* Keep count of how much data we've moved. */
@@ -1261,28 +1271,28 @@
 	else if ((ireason & 3) == 2) {
 
 		/* Transfer the data. */
-		atapi_input_bytes(drive, pc->buffer, thislen);
+		atapi_input_bytes (drive, pc->buffer, thislen);
 
 		/* If we haven't moved enough data to satisfy the drive,
 		   add some padding. */
 		while (len > thislen) {
 			int dum = 0;
-			atapi_input_bytes(drive, &dum, sizeof (dum));
-			len -= sizeof(dum);
+			atapi_input_bytes (drive, &dum, sizeof (dum));
+			len -= sizeof (dum);
 		}
 
 		/* Keep count of how much data we've moved. */
 		pc->buffer += thislen;
 		pc->buflen -= thislen;
 	} else {
-		printk("%s: cdrom_pc_intr: The drive "
+		printk ("%s: cdrom_pc_intr: The drive "
 			"appears confused (ireason = 0x%2x)\n",
 			drive->name, ireason);
 		pc->stat = 1;
 	}
 
 	/* Now we wait for another interrupt. */
-	ide_set_handler(drive, &cdrom_pc_intr, WAIT_CMD, cdrom_timer_expiry);
+	ide_set_handler (drive, &cdrom_pc_intr, WAIT_CMD, cdrom_timer_expiry);
 	return ide_started;
 }
 
@@ -1326,9 +1336,9 @@
 static
 int cdrom_queue_packet_command(ide_drive_t *drive, struct packet_command *pc)
 {
-	int retries = 10;
 	struct request_sense sense;
 	struct request req;
+	int retries = 10;
 
 	if (pc->sense == NULL)
 		pc->sense = &sense;
@@ -1483,9 +1493,10 @@
 	struct cdrom_device_info *cdi = &info->devinfo;
 
 	memset(&pc, 0, sizeof(pc));
-	pc.c[0] = GPCMD_TEST_UNIT_READY;
 	pc.sense = sense;
 
+	pc.c[0] = GPCMD_TEST_UNIT_READY;
+
 #if ! STANDARD_ATAPI
         /* the Sanyo 3 CD changer uses byte 7 of TEST_UNIT_READY to 
            switch CDs instead of supporting the LOAD_UNLOAD opcode   */
@@ -1509,13 +1520,13 @@
 		sense = &my_sense;
 
 	/* If the drive cannot lock the door, just pretend. */
-	if (CDROM_CONFIG_FLAGS (drive)->no_doorlock)
+	if (CDROM_CONFIG_FLAGS(drive)->no_doorlock) {
 		stat = 0;
-	else {
+	} else {
 		memset(&pc, 0, sizeof(pc));
-		pc.c[0] = GPCMD_PREVENT_ALLOW_MEDIUM_REMOVAL;
-		pc.c[4] = (lockflag != 0);
 		pc.sense = sense;
+		pc.c[0] = GPCMD_PREVENT_ALLOW_MEDIUM_REMOVAL;
+		pc.c[4] = lockflag ? 1 : 0;
 		stat = cdrom_queue_packet_command (drive, &pc);
 	}
 
@@ -1544,7 +1555,7 @@
 /* Eject the disk if EJECTFLAG is 0.
    If EJECTFLAG is 1, try to reload the disk. */
 static int cdrom_eject(ide_drive_t *drive, int ejectflag,
-			struct request_sense *sense)
+		       struct request_sense *sense)
 {
 	struct packet_command pc;
 
@@ -1556,14 +1567,15 @@
 		return 0;
 
 	memset(&pc, 0, sizeof (pc));
+	pc.sense = sense;
+
 	pc.c[0] = GPCMD_START_STOP_UNIT;
 	pc.c[4] = 0x02 + (ejectflag != 0);
-	pc.sense = sense;
 	return cdrom_queue_packet_command (drive, &pc);
 }
 
 static int cdrom_read_capacity(ide_drive_t *drive, unsigned *capacity,
-				struct request_sense *sense)
+			       struct request_sense *sense)
 {
 	struct {
 		__u32 lba;
@@ -1573,16 +1585,16 @@
 	int stat;
 	struct packet_command pc;
 
-	memset(&pc, 0, sizeof (pc));
+	memset(&pc, 0, sizeof(pc));
+	pc.sense = sense;
 
 	pc.c[0] = GPCMD_READ_CDVD_CAPACITY;
 	pc.buffer = (char *)&capbuf;
 	pc.buflen = sizeof(capbuf);
-	pc.sense = sense;
 
 	stat = cdrom_queue_packet_command(drive, &pc);
 	if (stat == 0)
-		*capacity = be32_to_cpu(capbuf.lba) + 1;
+		*capacity = 1 + be32_to_cpu(capbuf.lba);
 
 	return stat;
 }
@@ -1614,10 +1626,10 @@
 /* Try to read the entire TOC for the disk into our internal buffer. */
 static int cdrom_read_toc(ide_drive_t *drive, struct request_sense *sense)
 {
-	int stat, ntracks, i;
+	int minor, stat, ntracks, i;
+	kdev_t dev;
 	struct cdrom_info *info = drive->driver_data;
 	struct atapi_toc *toc = info->toc;
-	int minor = drive->select.b.unit << PARTN_BITS;
 	struct {
 		struct atapi_toc_header hdr;
 		struct atapi_toc_entry  ent;
@@ -1625,7 +1637,7 @@
 
 	if (toc == NULL) {
 		/* Try to allocate space. */
-		toc = (struct atapi_toc *) kmalloc(sizeof(struct atapi_toc),
+		toc = (struct atapi_toc *) kmalloc (sizeof (struct atapi_toc),
 						    GFP_KERNEL);
 		info->toc = toc;
 		if (toc == NULL) {
@@ -1642,7 +1654,7 @@
 	if (CDROM_STATE_FLAGS (drive)->toc_valid) return 0;
 
 	/* First read just the header, so we know how long the TOC is. */
-	stat = cdrom_read_tocentry (drive, 0, 1, 0, (char *)&toc->hdr,
+	stat = cdrom_read_tocentry(drive, 0, 1, 0, (char *) &toc->hdr,
 				    sizeof(struct atapi_toc_header), sense);
 	if (stat) return stat;
 
@@ -1654,14 +1666,17 @@
 #endif  /* not STANDARD_ATAPI */
 
 	ntracks = toc->hdr.last_track - toc->hdr.first_track + 1;
-	if (ntracks <= 0) return -EIO;
-	if (ntracks > MAX_TRACKS) ntracks = MAX_TRACKS;
+	if (ntracks <= 0)
+		return -EIO;
+	if (ntracks > MAX_TRACKS)
+		ntracks = MAX_TRACKS;
 
 	/* Now read the whole schmeer. */
-	stat = cdrom_read_tocentry (drive, toc->hdr.first_track, 1, 0, (char *)&toc->hdr,
-				    sizeof (struct atapi_toc_header) +
-				    (ntracks + 1) *
-				    sizeof (struct atapi_toc_entry), sense);
+	stat = cdrom_read_tocentry(drive, toc->hdr.first_track, 1, 0,
+				  (char *)&toc->hdr,
+				   sizeof(struct atapi_toc_header) +
+				   (ntracks + 1) *
+				   sizeof(struct atapi_toc_entry), sense);
 
 	if (stat && toc->hdr.first_track > 1) {
 		/* Cds with CDI tracks only don't have any TOC entries,
@@ -1674,12 +1689,12 @@
 		   the readable TOC is empty (CDI tracks are not included)
 		   and only holds the Leadout entry. Heiko Eißfeldt */
 		ntracks = 0;
-		stat = cdrom_read_tocentry (drive, CDROM_LEADOUT, 1,
-					    0, (char *)&toc->hdr,
-					    sizeof (struct atapi_toc_header) +
-					   (ntracks+1) *
-					    sizeof (struct atapi_toc_entry),
-					    sense);
+		stat = cdrom_read_tocentry(drive, CDROM_LEADOUT, 1, 0,
+					   (char *)&toc->hdr,
+					   sizeof(struct atapi_toc_header) +
+					   (ntracks + 1) *
+					   sizeof(struct atapi_toc_entry),
+					   sense);
 		if (stat) {
 			return stat;
 		}
@@ -1724,7 +1739,7 @@
 	if (toc->hdr.first_track != CDROM_LEADOUT) {
 		/* Read the multisession information. */
 		stat = cdrom_read_tocentry(drive, 0, 1, 1, (char *)&ms_tmp,
-					   sizeof (ms_tmp), sense);
+					   sizeof(ms_tmp), sense);
 		if (stat) return stat;
 	} else {
 		ms_tmp.ent.addr.msf.minute = 0;
@@ -1745,40 +1760,20 @@
 	toc->xa_flag = (ms_tmp.hdr.first_track != ms_tmp.hdr.last_track);
 
 	/* Now try to get the total cdrom capacity. */
-#if 0
-	stat = cdrom_get_last_written(MKDEV(HWIF(drive)->major, minor),
-				     (long *)&toc->capacity);
+	minor = (drive->select.b.unit) << PARTN_BITS;
+	dev = MKDEV(HWIF(drive)->major, minor);
+	stat = cdrom_get_last_written(dev, (long *)&toc->capacity);
 	if (stat)
-#endif
-	stat = cdrom_read_capacity(drive, &toc->capacity, sense);
-	if (stat) toc->capacity = 0x1fffff;
+		stat = cdrom_read_capacity(drive, &toc->capacity, sense);
+	if (stat)
+		toc->capacity = 0x1fffff;
 
-	/* for general /dev/cdrom like mounting, one big disc */
+	HWIF(drive)->gd->sizes[drive->select.b.unit << PARTN_BITS] = (toc->capacity * SECTORS_PER_FRAME) >> (BLOCK_SIZE_BITS - 9);
 	drive->part[0].nr_sects = toc->capacity * SECTORS_PER_FRAME;
-	HWIF(drive)->gd->sizes[minor] = (toc->capacity * SECTORS_PER_FRAME) >>
-					(BLOCK_SIZE_BITS - 9);
 
 	/* Remember that we've read this stuff. */
 	CDROM_STATE_FLAGS (drive)->toc_valid = 1;
 
-	/* should be "if multisession", but it does no harm. */
-	if (ntracks == 1)
-		return 0;
-
-	/* setup each minor to respond to a session */
-	minor++;
-	i = toc->hdr.first_track;
-	while ((i <= ntracks) && ((minor & CD_PART_MASK) < CD_PART_MAX)) {
-		drive->part[minor & PARTN_MASK].start_sect = 0;
- 		drive->part[minor & PARTN_MASK].nr_sects =
-			(toc->ent[i].addr.lba *
-			SECTORS_PER_FRAME) << (BLOCK_SIZE_BITS - 9);
-		HWIF(drive)->gd->sizes[minor] = (toc->ent[i].addr.lba *
-			SECTORS_PER_FRAME) >> (BLOCK_SIZE_BITS - 9);
-		i++;
-		minor++;
-	}
-
 	return 0;
 }
 
@@ -1821,9 +1816,8 @@
 	pc.c[2] = (speed >> 8) & 0xff;	
 	/* Read Drive speed in kbytes/second LSB */
 	pc.c[3] = speed & 0xff;
-	if (CDROM_CONFIG_FLAGS(drive)->cd_r ||
-            CDROM_CONFIG_FLAGS(drive)->cd_rw ||
-	    CDROM_CONFIG_FLAGS(drive)->dvd_r) {
+	if ( CDROM_CONFIG_FLAGS(drive)->cd_r ||
+                   CDROM_CONFIG_FLAGS(drive)->cd_rw ) {
 		/* Write Drive speed in kbytes/second MSB */
 		pc.c[4] = (speed >> 8) & 0xff;
 		/* Write Drive speed in kbytes/second LSB */
@@ -1874,14 +1868,18 @@
 	pc.buffer = cgc->buffer;
 	pc.buflen = cgc->buflen;
 	cgc->stat = cdrom_queue_packet_command(drive, &pc);
+
+	/*
+	 * FIXME: copy sense, don't just assign pointer!!
+	 */
 	cgc->sense = pc.sense;
 
 	return cgc->stat;
 }
 
 static
-int ide_cdrom_dev_ioctl(struct cdrom_device_info *cdi, unsigned int cmd,
-			unsigned long arg)
+int ide_cdrom_dev_ioctl (struct cdrom_device_info *cdi,
+			 unsigned int cmd, unsigned long arg)
 {
 	struct cdrom_generic_command cgc;
 	char buffer[16];
@@ -1977,18 +1975,19 @@
 }
 
 static
-int ide_cdrom_reset(struct cdrom_device_info *cdi)
+int ide_cdrom_reset (struct cdrom_device_info *cdi)
 {
 	ide_drive_t *drive = (ide_drive_t*) cdi->handle;
 	struct request_sense sense;
 	struct request req;
 	int ret;
 
-	ide_init_drive_cmd(&req);
+	ide_init_drive_cmd (&req);
 	req.cmd = RESET_DRIVE_COMMAND;
 	ret = ide_do_drive_cmd(drive, &req, ide_wait);
 
-	/* A reset will unlock the door. If it was previously locked,
+	/*
+	 * A reset will unlock the door. If it was previously locked,
 	 * lock it again.
 	 */
 	if (CDROM_STATE_FLAGS(drive)->door_locked)
@@ -1999,7 +1998,7 @@
 
 
 static
-int ide_cdrom_tray_move(struct cdrom_device_info *cdi, int position)
+int ide_cdrom_tray_move (struct cdrom_device_info *cdi, int position)
 {
 	ide_drive_t *drive = (ide_drive_t*) cdi->handle;
 	struct request_sense sense;
@@ -2019,19 +2018,17 @@
 	return cdrom_lockdoor(drive, lock, NULL);
 }
 
-
-
 static
-int ide_cdrom_select_speed(struct cdrom_device_info *cdi, int speed)
+int ide_cdrom_select_speed (struct cdrom_device_info *cdi, int speed)
 {
 	ide_drive_t *drive = (ide_drive_t*) cdi->handle;
 	struct request_sense sense;
 	int stat;
 
-	if ((stat = cdrom_select_speed(drive, speed, &sense)) < 0)
+	if ((stat = cdrom_select_speed (drive, speed, &sense)) < 0)
 		return stat;
 
-        cdi->speed = CDROM_STATE_FLAGS(drive)->current_speed;
+        cdi->speed = CDROM_STATE_FLAGS (drive)->current_speed;
         return 0;
 }
 
@@ -2072,10 +2069,11 @@
 	struct request_sense sense;
 	int ret;
 
-	toc = info->toc;
-	if (!CDROM_STATE_FLAGS(drive)->toc_valid || toc == NULL)
+	if (!CDROM_STATE_FLAGS(drive)->toc_valid || info->toc == NULL)
 		if ((ret = cdrom_read_toc(drive, &sense)))
 			return ret;
+
+	toc = info->toc;
 	ms_info->addr.lba = toc->last_session_lba;
 	ms_info->xa_flag = toc->xa_flag;
 
@@ -2121,6 +2119,7 @@
 		CDROM_STATE_FLAGS (drive)->media_changed = 0;
 		return retval;
 	}
+
 	return -EINVAL;
 }
 
@@ -2175,9 +2174,9 @@
 {
 	struct cdrom_info *info = drive->driver_data;
 	struct cdrom_device_info *devinfo = &info->devinfo;
-	int minor = (drive->select.b.unit)<<PARTN_BITS;
+	int minor = (drive->select.b.unit) << PARTN_BITS;
 
-	devinfo->dev = MKDEV (HWIF(drive)->major, minor | CD_PART_MASK);
+	devinfo->dev = MKDEV (HWIF(drive)->major, minor);
 	devinfo->ops = &ide_cdrom_dops;
 	devinfo->mask = 0;
 	*(int *)&devinfo->speed = CDROM_STATE_FLAGS (drive)->current_speed;
@@ -2202,8 +2201,8 @@
 		devinfo->mask |= CDC_PLAY_AUDIO;
 	if (!CDROM_CONFIG_FLAGS (drive)->close_tray)
 		devinfo->mask |= CDC_CLOSE_TRAY;
-		
-	return register_cdrom (devinfo);
+
+	return register_cdrom(devinfo);
 }
 
 static
@@ -2519,9 +2518,17 @@
 static
 int ide_cdrom_check_media_change (ide_drive_t *drive)
 {
-	return cdrom_fops.check_media_change
-		(MKDEV (HWIF (drive)->major,
-			(drive->select.b.unit)<<PARTN_BITS));
+	return cdrom_fops.check_media_change(MKDEV (HWIF (drive)->major,
+			(drive->select.b.unit) << PARTN_BITS));
+}
+
+static
+unsigned long ide_cdrom_capacity (ide_drive_t *drive)
+{
+	unsigned capacity;
+
+	return cdrom_read_capacity(drive, &capacity, NULL)
+		? 0 : capacity * SECTORS_PER_FRAME;
 }
 
 static
@@ -2560,12 +2567,12 @@
 	ide_cdrom_release,		/* release */
 	ide_cdrom_check_media_change,	/* media_change */
 	NULL,				/* pre_reset */
-	NULL,				/* capacity */
+	ide_cdrom_capacity,		/* capacity */
 	NULL,				/* special */
 	NULL				/* proc */
 };
 
-int ide_cdrom_init (void);
+int ide_cdrom_init(void);
 static ide_module_t ide_cdrom_module = {
 	IDE_DRIVER_MODULE,
 	ide_cdrom_init,
@@ -2597,9 +2604,10 @@
 {
 	return ide_cdrom_init();
 }
+
 #endif /* MODULE */
  
-int ide_cdrom_init (void)
+int ide_cdrom_init(void)
 {
 	ide_drive_t *drive;
 	struct cdrom_info *info;
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/drivers/block/ide-cd.h linux.17p9/drivers/block/ide-cd.h
--- linux.vanilla/drivers/block/ide-cd.h	Sun Jun 11 21:44:12 2000
+++ linux.17p9/drivers/block/ide-cd.h	Thu Jun 15 16:40:10 2000
@@ -1,11 +1,11 @@
-#ifndef _IDE_CD_H
-#define _IDE_CD_H
 /*
- *  linux/drivers/block/ide_cd.h
+ *  linux/drivers/ide/ide_cd.h
  *
- *  Copyright (C) 1996, 1997, 1998  Erik Andersen
- *  Copyright (C) 1998, 1999, 2000  Jens Axboe
+ *  Copyright (C) 1996-98  Erik Andersen
+ *  Copyright (C) 1998-2000 Jens Axboe
  */
+#ifndef _IDE_CD_H
+#define _IDE_CD_H
 
 #include <linux/cdrom.h>
 #include <asm/byteorder.h>
@@ -43,6 +43,8 @@
 #define SECTOR_BUFFER_SIZE	(CD_FRAMESIZE * 32)
 #define SECTORS_BUFFER		(SECTOR_BUFFER_SIZE / SECTOR_SIZE)
 
+#define BLOCKS_PER_FRAME	(CD_FRAMESIZE / BLOCK_SIZE)
+
 #define MIN(a,b) ((a) < (b) ? (a) : (b))
 
 /* special command codes for strategy routine. */
@@ -101,6 +103,7 @@
 	char *buffer;
 	int buflen;
 	int stat;
+	int quiet;
 	struct request_sense *sense;
 	unsigned char c[12];
 };
@@ -397,7 +400,6 @@
 	unsigned short buffer_size;
 	/* Current speed (in kB/s). */
 	unsigned short curspeed;
-
 	char pad[4];
 };
 
@@ -624,9 +626,7 @@
 	  "Logical unit not ready - in progress [sic] of becoming ready" },
 	{ 0x020402, "Logical unit not ready - initializing command required" },
 	{ 0x020403, "Logical unit not ready - manual intervention required" },
-	{ 0x020404, "Logical unit not ready - format in progress" },
-	{ 0x020407, "Logical unit not ready - operation in progress" },
-	{ 0x020408, "Logical unit not ready - long write in progress" },
+	{ 0x020404, "In process of becoming ready - writing" },
 	{ 0x020600, "No reference position found (media may be upside down)" },
 	{ 0x023000, "Incompatible medium installed" },
 	{ 0x023a00, "Medium not present" },
@@ -676,6 +676,7 @@
 	{ 0x04b600, "Media load mechanism failed" },
 	{ 0x051a00, "Parameter list length error" },
 	{ 0x052000, "Invalid command operation code" },
+	{ 0x052c00, "Command sequence error" },
 	{ 0x052100, "Logical block address out of range" },
 	{ 0x052102, "Invalid address for write" },
 	{ 0x052400, "Invalid field in command packet" },
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/drivers/block/ide-floppy.c linux.17p9/drivers/block/ide-floppy.c
--- linux.vanilla/drivers/block/ide-floppy.c	Sun Jun 11 21:44:12 2000
+++ linux.17p9/drivers/block/ide-floppy.c	Tue Jun 20 22:53:06 2000
@@ -1400,6 +1400,13 @@
 
 	*((unsigned short *) &gcw) = id->config;
 
+#ifdef CONFIG_PPC
+	/* kludge for Apple PowerBook internal zip */
+	if ((gcw.device_type == 5) && !strstr(id->model, "CD-ROM")
+	    && strstr(id->model, "ZIP"))
+		gcw.device_type = 0;			
+#endif
+
 #if IDEFLOPPY_DEBUG_INFO
 	printk (KERN_INFO "Dumping ATAPI Identify Device floppy parameters\n");
 	switch (gcw.protocol) {
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/drivers/block/ide-pmac.c linux.17p9/drivers/block/ide-pmac.c
--- linux.vanilla/drivers/block/ide-pmac.c	Sun Jun 11 21:44:12 2000
+++ linux.17p9/drivers/block/ide-pmac.c	Tue Jun 20 22:53:06 2000
@@ -5,6 +5,8 @@
  *
  *  Copyright (C) 1998 Paul Mackerras.
  *
+ *  Bits from Benjamin Herrenschmidt
+ *
  *  This program is free software; you can redistribute it and/or
  *  modify it under the terms of the GNU General Public License
  *  as published by the Free Software Foundation; either version
@@ -35,26 +37,101 @@
 #include "ide.h"
 #include "ide_modes.h"
 
-ide_ioreg_t pmac_ide_regbase[MAX_HWIFS];
-int pmac_ide_irq[MAX_HWIFS];
-int pmac_ide_count;
-struct device_node *pmac_ide_node[MAX_HWIFS];
+#undef IDE_PMAC_DEBUG
+
+#define IDE_SYSCLK_NS		30
+#define IDE_SYSCLK_ULTRA_PS	0x1d4c /* (15 * 1000 / 2)*/
+
+struct pmac_ide_hwif {
+	ide_ioreg_t			regbase;
+	int				irq;
+	int				kind;
+	int				aapl_bus_id;
+	struct device_node*		node;
+	u32				timings[2];
+#ifdef CONFIG_BLK_DEV_IDEDMA_PMAC
+	volatile struct dbdma_regs*	dma_regs;
+	struct dbdma_cmd*		dma_table;
+#endif
+	
+} pmac_ide[MAX_HWIFS];
+
+static int pmac_ide_count;
+
+enum {
+	controller_ohare,	/* OHare based */
+	controller_heathrow,	/* Heathrow/Paddington */
+	controller_kl_ata3,	/* KeyLargo ATA-3 */
+	controller_kl_ata4	/* KeyLargo ATA-4 */
+};
+
 
 #ifdef CONFIG_BLK_DEV_IDEDMA_PMAC
+
+typedef struct {
+	int	accessTime;
+	int	cycleTime;
+} pmac_ide_timing;
+
+/* Multiword DMA timings */
+static pmac_ide_timing mdma_timings[] =
+{
+    { 215,    480 },	/* Mode 0 */
+    {  80,    150 },	/*      1 */
+    {  70,    120 }	/*      2 */
+};
+
+/* Ultra DMA timings (for use when I know how to calculate them */
+static pmac_ide_timing udma_timings[] =
+{
+    {   0,    114 },	/* Mode 0 */
+    {   0,     75 },	/*      1 */
+    {   0,     55 },	/*      2 */
+    {   100,   45 },	/*      3 */
+    {   100,   25 }	/*      4 */
+};
+
+/* allow up to 256 DBDMA commands per xfer */
+#define MAX_DCMDS	256
+/* Wait 1.5s for disk to answer on IDE bus after
+ * enable operation.
+ * NOTE: There is at least one case I know of a disk that needs about 10sec
+ *       before anwering on the bus. I beleive we could add a kernel command
+ *       line arg to override this delay for such cases.
+ */
+#define IDE_WAKEUP_DELAY_MS	1500
 #define MAX_DCMDS	256	/* allow up to 256 DBDMA commands per xfer */
 
-static void pmac_ide_setup_dma(struct device_node *np, ide_hwif_t *hwif);
+static void pmac_ide_setup_dma(struct device_node *np, int ix);
 static int pmac_ide_dmaproc(ide_dma_action_t func, ide_drive_t *drive);
-static int pmac_ide_build_dmatable(ide_drive_t *drive, int wr);
+static int pmac_ide_build_dmatable(ide_drive_t *drive, int ix, int wr);
+static void pmac_ide_tuneproc(ide_drive_t *drive, byte pio);
+static void pmac_ide_selectproc(ide_drive_t *drive);
+
 #endif /* CONFIG_BLK_DEV_IDEDMA_PMAC */
 
 #ifdef CONFIG_PMAC_PBOOK
-static int idepmac_notify(struct pmu_sleep_notifier *self, int when);
+static int idepmac_notify_sleep(struct pmu_sleep_notifier *self, int when);
 struct pmu_sleep_notifier idepmac_sleep_notifier = {
-	idepmac_notify, SLEEP_LEVEL_BLOCK,
+	idepmac_notify_sleep, SLEEP_LEVEL_BLOCK,
 };
 #endif /* CONFIG_PMAC_PBOOK */
 
+static int
+pmac_ide_find(ide_drive_t *drive)
+{
+	ide_hwif_t *hwif = HWIF(drive);
+	ide_ioreg_t base;
+	int i;
+	
+	for (i=0; i<pmac_ide_count; i++) {
+		base = pmac_ide[i].regbase;
+		if (base && base == hwif->io_ports[0])
+			return i;
+	}
+	return -1;
+}
+
 /*
  * N.B. this can't be an initfunc, because the media-bay task can
  * call ide_[un]register at any time.
@@ -69,7 +146,7 @@
 		return;
 
 	for (ix = 0; ix < MAX_HWIFS; ++ix)
-		if (base == pmac_ide_regbase[ix])
+		if (base == pmac_ide[ix].regbase)
 			break;
 
 	if (ix >= MAX_HWIFS) {
@@ -83,35 +160,130 @@
 		return;
 	}
 
-	/* we check only for -EINVAL meaning that we have found a matching
-	   bay but with the wrong device type */ 
-
-	i = check_media_bay_by_base(base, MB_CD);
-	if (i == -EINVAL)
-		return;
-		
 	for (i = 0; i < 8; ++i)
 		*p++ = base + i * 0x10;
 	*p = base + 0x160;
 	if (irq != NULL)
-		*irq = pmac_ide_irq[ix];
+		*irq = pmac_ide[ix].irq;
+
+	ide_hwifs[ix].tuneproc = pmac_ide_tuneproc;
+	ide_hwifs[ix].selectproc = pmac_ide_selectproc;
+	if (pmac_ide[ix].dma_regs && pmac_ide[ix].dma_table) {
+		ide_hwifs[ix].dmaproc = &pmac_ide_dmaproc;
+#ifdef CONFIG_PMAC_IDEDMA_AUTO
+		ide_hwifs[ix].autodma = 1;
+#endif
+	}
 }
 
-void pmac_ide_tuneproc(ide_drive_t *drive, byte pio)
+#if 0
+/* This one could be later extended to handle CMD IDE and be used by some kind
+ * of /proc interface. I want to be able to get the devicetree path of a block
+ * device for yaboot configuration
+ */
+struct device_node*
+pmac_ide_get_devnode(ide_drive_t *drive)
 {
-	ide_pio_data_t d;
+	int i = pmac_ide_find(drive);
+	if (i < 0)
+		return NULL;
+	return pmac_ide[i].node;
+}
+#endif
 
-	if (_machine != _MACH_Pmac)
+/* Setup timings for the selected drive (master/slave). I still need to verify if this
+ * is enough, I beleive selectproc will be called whenever an IDE command is started,
+ * but... */
+static void
+pmac_ide_selectproc(ide_drive_t *drive)
+{
+	int i = pmac_ide_find(drive);
+	if (i < 0)
+		return;
+			
+	if (drive->select.all & 0x10)
+		out_le32((unsigned *)(IDE_DATA_REG + 0x200 + _IO_BASE), pmac_ide[i].timings[1]);
+	else
+		out_le32((unsigned *)(IDE_DATA_REG + 0x200 + _IO_BASE), pmac_ide[i].timings[0]);
+}
+
+/* Number of IDE_SYSCLK_NS ticks, argument is in nanoseconds */
+#define SYSCLK_TICKS(t)		(((t) + IDE_SYSCLK_NS - 1) / IDE_SYSCLK_NS)
+#define SYSCLK_TICKS_UDMA(t)	(((t) + IDE_SYSCLK_ULTRA_PS - 1) / IDE_SYSCLK_ULTRA_PS)
+
+/* Calculate PIO timings */
+static void
+pmac_ide_tuneproc(ide_drive_t *drive, byte pio)
+{
+	ide_pio_data_t d;
+	int i;
+	u32 *timings;
+	int accessTicks, recTicks;
+	
+	i = pmac_ide_find(drive);
+	if (i < 0)
 		return;
+		
 	pio = ide_get_best_pio_mode(drive, pio, 4, &d);
-	switch (pio) {
-	case 4:
-		out_le32((unsigned *)(IDE_DATA_REG + 0x200 + _IO_BASE), 0x211025);
-		break;
-	default:
-		out_le32((unsigned *)(IDE_DATA_REG + 0x200 + _IO_BASE), 0x2f8526);
-		break;
+	if (drive->select.all & 0x10)
+		timings = &pmac_ide[i].timings[1];
+	else
+		timings = &pmac_ide[i].timings[0];
+
+	if (pmac_ide[i].kind == controller_kl_ata4) {
+		/* The "ata-4" IDE controller of Core99 machines */
+		accessTicks = SYSCLK_TICKS_UDMA(ide_pio_timings[pio].active_time * 1000);
+		recTicks = SYSCLK_TICKS_UDMA(d.cycle_time * 1000) - accessTicks;
+
+		*timings = ((*timings) & 0x1FFFFFC00) | accessTicks | (recTicks << 5);
+	} else {
+		/* The old "ata-3" IDE controller */
+		accessTicks = SYSCLK_TICKS(ide_pio_timings[pio].active_time);
+		if (accessTicks < 4)
+			accessTicks = 4;
+		recTicks = SYSCLK_TICKS(d.cycle_time) - accessTicks - 4;
+		if (recTicks < 1)
+			recTicks = 1;
+	
+		*timings = ((*timings) & 0xFFFFFF800) | accessTicks | (recTicks << 5);
+	}
+	
+#ifdef IDE_PMAC_DEBUG
+	printk("ide_pmac: Set PIO timing for mode %d, reg: 0x%08x\n",
+		pio,  *timings);
+#endif	
+		
+	if (drive->select.all == IN_BYTE(IDE_SELECT_REG))
+		pmac_ide_selectproc(drive);
+}
+
+ide_ioreg_t
+pmac_ide_get_base(int index)
+{
+	return pmac_ide[index].regbase;
+}
+
+static int ide_majors[] = { 3, 22, 33, 34, 56, 57 };
+
+__initfunc(kdev_t pmac_find_ide_boot(char *bootdevice, int n))
+{
+	int i;
+	
+	/*
+	 * Look through the list of IDE interfaces for this one.
+	 */
+	for (i = 0; i < pmac_ide_count; ++i) {
+		char *name;
+		if (!pmac_ide[i].node || !pmac_ide[i].node->full_name)
+			continue;
+		name = pmac_ide[i].node->full_name;
+		if (memcmp(name, bootdevice, n) == 0 && name[n] == 0) {
+			/* XXX should cope with the 2nd drive as well... */
+			return MKDEV(ide_majors[i], 0);
+		}
 	}
+
+	return 0;
 }
 
 __initfunc(void
@@ -122,7 +294,7 @@
 	struct device_node *atas;
 	struct device_node *p, **pp, *removables, **rp;
 	unsigned long base;
-	int irq;
+	int irq, big_delay;
 	ide_hwif_t *hwif;
 
 	if (_machine != _MACH_Pmac)
@@ -150,9 +322,11 @@
 	}
 	*rp = NULL;
 	*pp = removables;
+	big_delay = 0;
 
 	for (i = 0, np = atas; i < MAX_HWIFS && np != NULL; np = np->next) {
 		struct device_node *tp;
+		int *bidp;
 
 		/*
 		 * If this node is not under a mac-io or dbdma node,
@@ -193,32 +367,79 @@
 		} else {
 			irq = np->intrs[0].line;
 		}
-		pmac_ide_regbase[i] = base;
-		pmac_ide_irq[i] = irq;
-		pmac_ide_node[i] = np;
+		pmac_ide[i].regbase = base;
+		pmac_ide[i].irq = irq;
+		pmac_ide[i].node = np;
+		if (device_is_compatible(np, "keylargo-ata")) {
+			if (strcmp(np->name, "ata-4") == 0)
+				pmac_ide[i].kind = controller_kl_ata4;
+			else
+				pmac_ide[i].kind = controller_kl_ata3;
+		} else if (device_is_compatible(np, "heathrow-ata"))
+			pmac_ide[i].kind = controller_heathrow;
+		else
+			pmac_ide[i].kind = controller_ohare;
+
+		bidp = (int *)get_property(np, "AAPL,bus-id", NULL);
+		pmac_ide[i].aapl_bus_id =  bidp ? *bidp : 0;
 
 		if (np->parent && np->parent->name
 		    && strcasecmp(np->parent->name, "media-bay") == 0) {
 			media_bay_set_ide_infos(np->parent,base,irq,i);
-		} else
-			feature_set(np, FEATURE_IDE_enable);
-
+		} else if (pmac_ide[i].kind == controller_ohare) {
+			/* The code below is having trouble on some ohare machines
+			 * (timing related ?). Until I can put my hand on one of these
+			 * units, I keep the old way
+			 */
+			 feature_set(np, FEATURE_IDE0_enable);
+			 feature_set(np, FEATURE_IOBUS_enable);
+		} else {
+			/* This is necessary to enable IDE when net-booting */
+			printk("pmac_ide: enabling IDE bus ID %d\n", pmac_ide[i].aapl_bus_id);
+			switch(pmac_ide[i].aapl_bus_id) {
+			    case 0:
+				feature_set(np, FEATURE_IDE0_reset);
+				feature_set(np, FEATURE_IOBUS_enable);
+				mdelay(10);
+ 				feature_set(np, FEATURE_IDE0_enable);
+				mdelay(10);
+				feature_clear(np, FEATURE_IDE0_reset);
+				break;
+			    case 1:
+				feature_set(np, FEATURE_IDE1_reset);
+				feature_set(np, FEATURE_IOBUS_enable);
+				mdelay(10);
+ 				feature_set(np, FEATURE_IDE1_enable);
+				mdelay(10);
+				feature_clear(np, FEATURE_IDE1_reset);
+				break;
+			    case 2:
+			    	/* This one exists only for KL, I don't know
+				   about any enable bit */
+				feature_set(np, FEATURE_IDE2_reset);
+				mdelay(10);
+				feature_clear(np, FEATURE_IDE2_reset);
+				break;
+			}
+			big_delay = 1;
+		}
 		hwif = &ide_hwifs[i];
 		pmac_ide_init_hwif_ports(hwif->io_ports, base, &hwif->irq);
-		hwif->chipset = ide_generic;
-		hwif->noprobe = !hwif->io_ports[IDE_DATA_OFFSET];
-		hwif->tuneproc = pmac_ide_tuneproc;
+		hwif->chipset = ide_pmac;
+		hwif->noprobe = (check_media_bay_by_base(base, MB_CD) == -EINVAL);
 
 #ifdef CONFIG_BLK_DEV_IDEDMA_PMAC
 		if (np->n_addrs >= 2) {
 			/* has a DBDMA controller channel */
-			pmac_ide_setup_dma(np, hwif);
+			pmac_ide_setup_dma(np, i);
 		}
 #endif /* CONFIG_BLK_DEV_IDEDMA_PMAC */
 
 		++i;
 	}
 	pmac_ide_count = i;
+	if (big_delay)
+		mdelay(IDE_WAKEUP_DELAY_MS);
 
 #ifdef CONFIG_PMAC_PBOOK
 	pmu_register_sleep_notifier(&idepmac_sleep_notifier);
@@ -228,26 +449,27 @@
 #ifdef CONFIG_BLK_DEV_IDEDMA_PMAC
 
 __initfunc(static void
-pmac_ide_setup_dma(struct device_node *np, ide_hwif_t *hwif))
+pmac_ide_setup_dma(struct device_node *np, int ix))
 {
-	hwif->dma_base = (unsigned long) ioremap(np->addrs[1].address, 0x200);
+	pmac_ide[ix].dma_regs =
+		(volatile struct dbdma_regs*)ioremap(np->addrs[1].address, 0x200);
 
 	/*
 	 * Allocate space for the DBDMA commands.
 	 * The +2 is +1 for the stop command and +1 to allow for
 	 * aligning the start address to a multiple of 16 bytes.
 	 */
-	hwif->dmatable = (unsigned long *)
-	       kmalloc((MAX_DCMDS + 2) * sizeof(struct dbdma_cmd), GFP_KERNEL);
-	if (hwif->dmatable == 0) {
+	pmac_ide[ix].dma_table = (struct dbdma_cmd*)
+		kmalloc((MAX_DCMDS + 2) * sizeof(struct dbdma_cmd), GFP_KERNEL);
+	if (pmac_ide[ix].dma_table == 0) {
 		printk(KERN_ERR "%s: unable to allocate DMA command list\n",
-		       hwif->name);
+		       ide_hwifs[ix].name);
 		return;
 	}
 
-	hwif->dmaproc = &pmac_ide_dmaproc;
+	ide_hwifs[ix].dmaproc = &pmac_ide_dmaproc;
 #ifdef CONFIG_PMAC_IDEDMA_AUTO
-	hwif->autodma = 1;
+	ide_hwifs[ix].autodma = 1;
 #endif
 }
 
@@ -256,19 +478,20 @@
  * for a transfer and sets the DBDMA channel to point to it.
  */
 static int
-pmac_ide_build_dmatable(ide_drive_t *drive, int wr)
+pmac_ide_build_dmatable(ide_drive_t *drive, int ix, int wr)
 {
-	ide_hwif_t *hwif = HWIF(drive);
 	struct dbdma_cmd *table, *tstart;
 	int count = 0;
 	struct request *rq = HWGROUP(drive)->rq;
 	struct buffer_head *bh = rq->bh;
 	unsigned int size, addr;
-	volatile struct dbdma_regs *dma
-		= (volatile struct dbdma_regs *) hwif->dma_base;
+	volatile struct dbdma_regs *dma = pmac_ide[ix].dma_regs;
 
-	table = tstart = (struct dbdma_cmd *) DBDMA_ALIGN(hwif->dmatable);
+	table = tstart = (struct dbdma_cmd *) DBDMA_ALIGN(pmac_ide[ix].dma_table);
 	out_le32(&dma->control, (RUN|PAUSE|FLUSH|WAKE|DEAD) << 16);
+	/* Should this be dma->control like in macserial.c ? */
+	while (in_le32(&dma->status) & RUN)
+		udelay(1);
 
 	do {
 		/*
@@ -331,30 +554,274 @@
 	return 1;
 }
 
+
+/* This is fun.  -DaveM */
+#define IDE_SETXFER		0x03
+#define IDE_SETFEATURE		0xef
+#define IDE_DMA2_ENABLE		0x22
+#define IDE_DMA1_ENABLE		0x21
+#define IDE_DMA0_ENABLE		0x20
+#define IDE_UDMA4_ENABLE	0x44
+#define IDE_UDMA3_ENABLE	0x43
+#define IDE_UDMA2_ENABLE	0x42
+#define IDE_UDMA1_ENABLE	0x41
+#define IDE_UDMA0_ENABLE	0x40
+
+static __inline__ unsigned char
+dma_bits_to_command(unsigned char bits)
+{
+	if(bits & 0x04)
+		return IDE_DMA2_ENABLE;
+	if(bits & 0x02)
+		return IDE_DMA1_ENABLE;
+	return IDE_DMA0_ENABLE;
+}
+
+static __inline__ unsigned char
+udma_bits_to_command(unsigned char bits)
+{
+	if(bits & 0x10)
+		return IDE_UDMA4_ENABLE;
+	if(bits & 0x08)
+		return IDE_UDMA3_ENABLE;
+	if(bits & 0x04)
+		return IDE_UDMA2_ENABLE;
+	if(bits & 0x02)
+		return IDE_UDMA1_ENABLE;
+	if(bits & 0x01)
+		return IDE_UDMA0_ENABLE;
+	return 0;
+}
+
+static __inline__ int
+wait_for_ready(ide_drive_t *drive)
+{
+	/* Timeout bumped for some powerbooks */
+	int timeout = 2000;
+	byte stat;
+
+	while(--timeout) {
+		stat = GET_STAT();
+		if(!(stat & BUSY_STAT)) {
+			if (drive->ready_stat == 0)
+				break;
+			else if((stat & drive->ready_stat) || (stat & ERR_STAT))
+				break;
+		}
+		mdelay(1);
+	}
+	if((stat & ERR_STAT) || timeout <= 0) {
+		if (stat & ERR_STAT) {
+			printk("ide_pmace: wait_for_ready, error status: %x\n", stat);
+		}
+		return 1;
+	}
+	return 0;
+}
+
+static int
+pmac_ide_do_setfeature(ide_drive_t *drive, byte command)
+{
+	unsigned long flags;
+	byte old_select;
+	int result = 1;
+
+	save_flags(flags);
+	cli();
+	old_select = IN_BYTE(IDE_SELECT_REG);
+	OUT_BYTE(drive->select.all, IDE_SELECT_REG);
+	udelay(10);
+	OUT_BYTE(IDE_SETXFER, IDE_FEATURE_REG);
+	OUT_BYTE(command, IDE_NSECTOR_REG);
+	if(wait_for_ready(drive)) {
+		printk("pmac_ide_do_setfeature disk not ready before SET_FEATURE!\n");
+		goto out;
+	}
+	OUT_BYTE(IDE_SETFEATURE, IDE_COMMAND_REG);
+	result = wait_for_ready(drive);
+	if (result)
+		printk("pmac_ide_do_setfeature disk not ready after SET_FEATURE !\n");
+out:
+	OUT_BYTE(old_select, IDE_SELECT_REG);
+	restore_flags(flags);
+	
+	return result;
+}
+
+/* Calculate MultiWord DMA timings */
+static int
+pmac_ide_mdma_enable(ide_drive_t *drive, int idx)
+{
+	byte bits = drive->id->dma_mword & 0x07;
+	byte feature = dma_bits_to_command(bits);
+	u32 *timings;
+	int cycleTime, accessTime;
+	int accessTicks, recTicks;
+	struct hd_driveid *id = drive->id;
+	
+	/* Set feature on drive */
+    	printk("%s: Enabling MultiWord DMA %d\n", drive->name, feature & 0xf);
+	if (pmac_ide_do_setfeature(drive, feature)) {
+	    	printk("%s: Failed !\n", drive->name);
+	    	return 0;
+	}
+	
+	/* which drive is it ? */
+	if (drive->select.all & 0x10)
+		timings = &pmac_ide[idx].timings[1];
+	else
+		timings = &pmac_ide[idx].timings[0];
+
+	/* Calculate accesstime and cycle time */
+	cycleTime = mdma_timings[feature & 0xf].cycleTime;
+	accessTime = mdma_timings[feature & 0xf].accessTime;
+	if ((id->field_valid & 2) && (id->eide_dma_time))
+		cycleTime = id->eide_dma_time;
+	if ((pmac_ide[idx].kind == controller_ohare) && (cycleTime < 150))
+		cycleTime = 150;
+
+	/* For ata-4 controller, we don't know the calculation */
+	if (pmac_ide[idx].kind == controller_kl_ata4) {
+		accessTicks = SYSCLK_TICKS_UDMA(accessTime * 1000);
+		recTicks = SYSCLK_TICKS_UDMA(cycleTime * 1000) - accessTicks;
+		*timings = ((*timings) & 0xffe003ff) |
+			(accessTicks | (recTicks << 5)) << 10;
+	} else {
+		int halfTick = 0;
+		int origAccessTime = accessTime;
+		int origCycleTime = cycleTime;
+		
+		accessTicks = SYSCLK_TICKS(accessTime);
+		if (accessTicks < 1)
+			accessTicks = 1;
+		accessTime = accessTicks * IDE_SYSCLK_NS;
+		recTicks = SYSCLK_TICKS(cycleTime - accessTime) - 1;
+		if (recTicks < 1)
+			recTicks = 1;
+		cycleTime = (recTicks + 1 + accessTicks) * IDE_SYSCLK_NS;
+
+		/* KeyLargo ata-3 don't support the half-tick stuff */
+		if ((pmac_ide[idx].kind != controller_kl_ata3) &&
+			(accessTicks > 1) &&
+			((accessTime - IDE_SYSCLK_NS/2) >= origAccessTime) &&
+			((cycleTime - IDE_SYSCLK_NS) >= origCycleTime)) {
+            			halfTick    = 1;
+				accessTicks--;
+		}
+		*timings = ((*timings) & 0x7FF) |
+			(accessTicks | (recTicks << 5) | (halfTick << 10)) << 11;
+	}
+#ifdef IDE_PMAC_DEBUG
+	printk("ide_pmac: Set MDMA timing for mode %d, reg: 0x%08x\n",
+		feature & 0xf, *timings);
+#endif	
+	return 1;
+}
+
+/* Calculate Ultra DMA timings */
+static int
+pmac_ide_udma_enable(ide_drive_t *drive, int idx)
+{
+	byte bits = drive->id->dma_ultra & 0x1f;
+	byte feature = udma_bits_to_command(bits);
+	int cycleTime, accessTime;
+	int rdyToPauseTicks, cycleTicks;
+	u32 *timings;
+	
+	/* Set feature on drive */
+    	printk("%s: Enabling Ultra DMA %d\n", drive->name, feature & 0xf);
+	if (pmac_ide_do_setfeature(drive, feature)) {
+		printk("%s: Failed !\n", drive->name);
+		return 0;
+	}
+
+	/* which drive is it ? */
+	if (drive->select.all & 0x10)
+		timings = &pmac_ide[idx].timings[1];
+	else
+		timings = &pmac_ide[idx].timings[0];
+	
+
+	cycleTime = udma_timings[feature & 0xf].cycleTime;
+	accessTime = udma_timings[feature & 0xf].accessTime;
+
+	rdyToPauseTicks = SYSCLK_TICKS_UDMA(accessTime * 1000);
+	cycleTicks = SYSCLK_TICKS_UDMA(cycleTime * 1000);
+	
+	*timings = ((*timings) & 0xe00fffff) |
+			((cycleTicks << 1) | (rdyToPauseTicks << 5) | 1) << 20;
+	return 1;
+}
+
+static int
+pmac_ide_dma_onoff(ide_drive_t *drive, int enable)
+{
+	int ata4, udma, idx;
+	struct hd_driveid *id = drive->id;
+
+	drive->using_dma = 0;
+	
+	idx = pmac_ide_find(drive);
+	if (idx < 0)
+		return 0;
+		
+	if (drive->media == ide_floppy)
+		enable = 0;
+	if (((id->capability & 1) == 0) && !check_drive_lists(drive, GOOD_DMA_DRIVE))
+		enable = 0;
+	if (check_drive_lists(drive, BAD_DMA_DRIVE))
+		enable = 0;
+
+	udma = 0;
+	ata4 = (pmac_ide[idx].kind == controller_kl_ata4);
+			
+	if(enable) {
+		if (ata4 && (drive->media == ide_disk) &&
+		    (id->field_valid & 0x0004) && (id->dma_ultra & 0x17)) {
+			/* UltraDMA modes. */
+			drive->using_dma = pmac_ide_udma_enable(drive, idx);
+		}
+		if (!drive->using_dma && (id->dma_mword & 0x0007)) {
+			/* Normal MultiWord DMA modes. */
+			drive->using_dma = pmac_ide_mdma_enable(drive, idx);
+		}
+		/* Without this, strange things will happen on Keylargo-based
+		 * machines
+		 */
+		OUT_BYTE(0, IDE_CONTROL_REG);
+		if (drive->select.all == IN_BYTE(IDE_SELECT_REG))
+			pmac_ide_selectproc(drive);
+	}
+	return 0;
+}
+
 int pmac_ide_dmaproc(ide_dma_action_t func, ide_drive_t *drive)
 {
 	ide_hwif_t *hwif = HWIF(drive);
-	volatile struct dbdma_regs *dma
-		= (volatile struct dbdma_regs *) hwif->dma_base;
-	int dstat;
+	int ix, dstat;
+	volatile struct dbdma_regs *dma;
+
+	/* Can we stuff a pointer to our intf structure in config_data
+	 * or select_data in hwif ?
+	 */
+	ix = pmac_ide_find(drive);
+	if (ix < 0)
+		return 0;		
+	dma = pmac_ide[ix].dma_regs;
 
 	switch (func) {
 	case ide_dma_on:
-		/* ide-floppy DMA doesn't work yet... */
-		drive->using_dma = drive->media != ide_floppy;
-		break;
 	case ide_dma_off:
-		printk(KERN_INFO "%s: DMA disabled\n", drive->name);
 	case ide_dma_off_quietly:
-		drive->using_dma = 0;
+		pmac_ide_dma_onoff(drive, (func == ide_dma_on));
 		break;
 	case ide_dma_check:
-		/* ide-floppy DMA doesn't work yet... */
-		drive->using_dma = hwif->autodma && drive->media != ide_floppy;
+		if (hwif->autodma)
+			pmac_ide_dma_onoff(drive, 1);
 		break;
 	case ide_dma_read:
 	case ide_dma_write:
-		if (!pmac_ide_build_dmatable(drive, func==ide_dma_write))
+		if (!pmac_ide_build_dmatable(drive, ix, func==ide_dma_write))
 			return 1;
 		drive->waiting_for_dma = 1;
 		if (drive->media != ide_disk)
@@ -383,11 +850,9 @@
 #ifdef CONFIG_PMAC_PBOOK
 static void idepmac_sleep_disk(int i, unsigned long base)
 {
+	struct device_node* np = pmac_ide[i].node;
 	int j;
 
-	/* Reset to PIO 0 */
-	out_le32((unsigned *)(base + 0x200 + _IO_BASE), 0x2f8526);
-
 	/* FIXME: We only handle the master IDE */
 	if (ide_hwifs[i].drives[0].media == ide_disk) {
 		/* Spin down the drive */
@@ -406,22 +871,61 @@
 				break;
 		}
 	}
+	feature_set(np, FEATURE_IDE0_reset);
+	feature_clear(np, FEATURE_IDE0_enable);
+	switch(pmac_ide[i].aapl_bus_id) {
+	    case 0:
+		feature_set(np, FEATURE_IDE0_reset);
+		feature_clear(np, FEATURE_IDE0_enable);
+		break;
+	    case 1:
+		feature_set(np, FEATURE_IDE1_reset);
+		feature_clear(np, FEATURE_IDE1_enable);
+		break;
+	    case 2:
+		feature_set(np, FEATURE_IDE2_reset);
+		break;
+	}
+	pmac_ide[i].timings[0] = 0;
+	pmac_ide[i].timings[1] = 0;
 }
 
 static void idepmac_wake_disk(int i, unsigned long base)
 {
+	struct device_node* np = pmac_ide[i].node;
 	int j;
 
 	/* Revive IDE disk and controller */
-	feature_set(pmac_ide_node[i], FEATURE_IDE_enable);
-	mdelay(1);
-	feature_set(pmac_ide_node[i], FEATURE_IDE_DiskPower);
-	mdelay(100);
-	feature_set(pmac_ide_node[i], FEATURE_IDE_Reset);
-	mdelay(1);
-	/* Make sure we are still PIO0 */
-	out_le32((unsigned *)(base + 0x200 + _IO_BASE), 0x2f8526);
-	mdelay(100);
+	switch(pmac_ide[i].aapl_bus_id) {
+	    case 0:
+		feature_set(np, FEATURE_IDE0_reset);
+		feature_set(np, FEATURE_IOBUS_enable);
+		mdelay(10);
+ 		feature_set(np, FEATURE_IDE0_enable);
+		mdelay(10);
+		feature_clear(np, FEATURE_IDE0_reset);
+		break;
+	    case 1:
+		feature_set(np, FEATURE_IDE1_reset);
+		feature_set(np, FEATURE_IOBUS_enable);
+		mdelay(10);
+ 		feature_set(np, FEATURE_IDE1_enable);
+		mdelay(10);
+		feature_clear(np, FEATURE_IDE1_reset);
+		break;
+	    case 2:
+	    	/* This one exists only for KL, I don't know
+		   about any enable bit */
+		feature_set(np, FEATURE_IDE2_reset);
+		mdelay(10);
+		feature_clear(np, FEATURE_IDE2_reset);
+		break;
+	}
+	mdelay(IDE_WAKEUP_DELAY_MS);
+
+	/* Reset timings */
+	pmac_ide_selectproc(&ide_hwifs[i].drives[0]);
+	mdelay(10);
 
 	/* Wait up to 10 seconds (enough for recent drives) */
 	for (j = 0; j < 100; j++) {
@@ -439,14 +943,22 @@
 {
 	int timeout;
 
-	timeout = 5000;
+	/* Reset timings */
+	pmac_ide_selectproc(&ide_hwifs[i].drives[0]);
+	mdelay(10);
+
+	timeout = 10000;
 	while ((inb(base + 0x70) & BUSY_STAT) && timeout) {
 		mdelay(1);
 		--timeout;
 	}
 }
 
-static int idepmac_notify(struct pmu_sleep_notifier *self, int when)
+/* Note: We support only master drives for now. This will have to be
+ * improved if we want to handle sleep on the iMacDV where the CD-ROM
+ * is a slave
+ */
+static int idepmac_notify_sleep(struct pmu_sleep_notifier *self, int when)
 {
 	int i, ret;
 	unsigned long base;
@@ -458,27 +970,34 @@
 		break;
 	case PBOOK_SLEEP_NOW:
 		for (i = 0; i < pmac_ide_count; ++i) {
-			if ((base = pmac_ide_regbase[i]) == 0)
+			if ((base = pmac_ide[i].regbase) == 0)
 				continue;
 			/* Disable irq during sleep */
-			disable_irq(pmac_ide_irq[i]);
+			disable_irq(pmac_ide[i].irq);
 			ret = check_media_bay_by_base(base, MB_CD);
-			if (ret == -ENODEV)
+			if ((ret == -ENODEV) && ide_hwifs[i].drives[0].present)
 				/* not media bay - put the disk to sleep */
 				idepmac_sleep_disk(i, base);
 		}
 		break;
 	case PBOOK_WAKE:
 		for (i = 0; i < pmac_ide_count; ++i) {
-			if ((base = pmac_ide_regbase[i]) == 0)
+			ide_hwif_t *hwif;
+			if ((base = pmac_ide[i].regbase) == 0)
 				continue;
+			hwif = &ide_hwifs[i];
 		        /* We don't handle media bay devices this way */
 			ret = check_media_bay_by_base(base, MB_CD);
-			if (ret == -ENODEV)
+			if ((ret == -ENODEV) && ide_hwifs[i].drives[0].present)
 				idepmac_wake_disk(i, base);
 			else if (ret == 0)
 				idepmac_wake_bay(i, base);
-			enable_irq(pmac_ide_irq[i]);
+			enable_irq(pmac_ide[i].irq);
+
+#ifdef CONFIG_BLK_DEV_IDEDMA_PMAC
+			if (hwif->drives[0].present && hwif->drives[0].using_dma)
+				pmac_ide_dma_onoff(&hwif->drives[0], 1);
+#endif				
 		}
 		break;
 	}
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/drivers/block/ide-probe.c linux.17p9/drivers/block/ide-probe.c
--- linux.vanilla/drivers/block/ide-probe.c	Sun Jun 11 21:44:12 2000
+++ linux.17p9/drivers/block/ide-probe.c	Sun Jun 25 17:37:55 2000
@@ -109,8 +109,16 @@
 				}
 				type = ide_cdrom;	/* Early cdrom models used zero */
 			case ide_cdrom:
-				printk ("CDROM");
 				drive->removable = 1;
+#ifdef CONFIG_PPC
+				/* kludge for Apple PowerBook internal zip */
+				if (!strstr(id->model, "CD-ROM") && strstr(id->model, "ZIP")) {
+					printk ("FLOPPY");
+					type = ide_floppy;
+					break;
+				}
+#endif
+				printk ("CDROM");
 				break;
 			case ide_tape:
 				printk ("TAPE");
@@ -819,7 +827,12 @@
 	
 	for (index = 0; index < MAX_HWIFS; ++index)
 		ide_unregister(index);
-	return ideprobe_init();
+	ideprobe_init();
+#ifdef CONFIG_PROC_FS
+	proc_ide_destroy();	/* Avoid multiple entry in /proc */
+	proc_ide_create();
+#endif
+	return 0;
 }
 
 void cleanup_module (void)
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/drivers/block/ide-proc.c linux.17p9/drivers/block/ide-proc.c
--- linux.vanilla/drivers/block/ide-proc.c	Fri Apr 21 12:45:50 2000
+++ linux.17p9/drivers/block/ide-proc.c	Tue Jun 20 22:53:06 2000
@@ -333,6 +333,7 @@
 		case ide_rz1000:	name = "rz1000";	break;
 		case ide_trm290:	name = "trm290";	break;
 		case ide_4drives:	name = "4drives";	break;
+		case ide_pmac:		name = "mac-io";	break;
 		default:		name = "(unknown)";	break;
 	}
 	len = sprintf(page, "%s\n", name);
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/drivers/block/ide.c linux.17p9/drivers/block/ide.c
--- linux.vanilla/drivers/block/ide.c	Sun Jun 11 21:44:12 2000
+++ linux.17p9/drivers/block/ide.c	Sun Jun 25 17:37:55 2000
@@ -3131,6 +3131,8 @@
 EXPORT_SYMBOL(ide_add_proc_entries);
 EXPORT_SYMBOL(ide_remove_proc_entries);
 EXPORT_SYMBOL(proc_ide_read_geometry);
+EXPORT_SYMBOL(proc_ide_create);
+EXPORT_SYMBOL(proc_ide_destroy);
 #endif
 EXPORT_SYMBOL(ide_add_setting);
 EXPORT_SYMBOL(ide_remove_setting);
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/drivers/block/ide.h linux.17p9/drivers/block/ide.h
--- linux.vanilla/drivers/block/ide.h	Sun Jun 11 21:44:12 2000
+++ linux.17p9/drivers/block/ide.h	Fri Jun 23 00:27:09 2000
@@ -306,7 +306,7 @@
 		ide_cmd640,	ide_dtc2278,	ide_ali14xx,
 		ide_qd6580,	ide_umc8672,	ide_ht6560b,
 		ide_pdc4030,	ide_rz1000,	ide_trm290,
-		ide_cmd646,	ide_4drives
+		ide_cmd646,	ide_4drives,	ide_pmac
 	} hwif_chipset_t;
 
 typedef struct ide_pci_devid_s {
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/drivers/block/md.c linux.17p9/drivers/block/md.c
--- linux.vanilla/drivers/block/md.c	Sun Jun 11 21:44:12 2000
+++ linux.17p9/drivers/block/md.c	Sun Jun 11 21:54:10 2000
@@ -446,8 +446,6 @@
   
   factor = min = 1 << FACTOR_SHIFT(FACTOR((md_dev+minor)));
   
-  md_blocksizes[minor] <<= FACTOR_SHIFT(FACTOR((md_dev+minor)));
-
   for (i=0; i<md_dev[minor].nb_dev; i++)
     if (md_dev[minor].devices[i].size<min)
     {
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/drivers/block/rd.c linux.17p9/drivers/block/rd.c
--- linux.vanilla/drivers/block/rd.c	Sun Jun 11 21:44:12 2000
+++ linux.17p9/drivers/block/rd.c	Tue Jun 20 22:53:06 2000
@@ -587,6 +587,9 @@
 	set_fs(fs);
 }
 
+#ifdef CONFIG_MAC_FLOPPY
+int swim3_fd_eject(int devnum);
+#endif
 
 __initfunc(static void rd_load_disk(int n))
 {
@@ -607,6 +610,12 @@
 	if (rd_prompt) {
 #ifdef CONFIG_BLK_DEV_FD
 		floppy_eject();
+#endif
+#ifdef CONFIG_MAC_FLOPPY
+		if(MAJOR(ROOT_DEV) == FLOPPY_MAJOR)
+			swim3_fd_eject(MINOR(ROOT_DEV));
+		else if(MAJOR(real_root_dev) == FLOPPY_MAJOR)
+			swim3_fd_eject(MINOR(real_root_dev));
 #endif
 		printk(KERN_NOTICE
 		       "VFS: Insert root floppy disk to be loaded into RAM disk and press ENTER\n");
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/drivers/block/swim3.c linux.17p9/drivers/block/swim3.c
--- linux.vanilla/drivers/block/swim3.c	Fri Apr 21 12:45:50 2000
+++ linux.17p9/drivers/block/swim3.c	Tue Jun 20 22:53:06 2000
@@ -808,6 +808,16 @@
 	return err;
 }
 
+int swim3_fd_eject(int devnum)
+{
+	if (devnum >= floppy_count)
+		return -ENODEV;
+	/* Do not check this - this function should ONLY be called early
+	 * in the boot process! */
+	/* if (floppy_states[devnum].ref_count != 1) return -EBUSY; */
+	return fd_eject(&floppy_states[devnum]);
+}
+
 static struct floppy_struct floppy_type =
 	{ 2880,18,2,80,0,0x1B,0x00,0xCF,0x6C,NULL };	/*  7 1.44MB 3.5"   */
 
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/drivers/cdrom/cdrom.c linux.17p9/drivers/cdrom/cdrom.c
--- linux.vanilla/drivers/cdrom/cdrom.c	Sun Jun 11 21:44:12 2000
+++ linux.17p9/drivers/cdrom/cdrom.c	Thu Jun 15 15:30:57 2000
@@ -193,7 +193,7 @@
 
   3.07 Feb 2, 2000 - Jens Axboe <axboe@suse.de>
   -- Do same "read header length" trick in cdrom_get_disc_info() as
-  we do in cdrom_get_track_info() -- some drive don't obbey specs and
+  we do in cdrom_get_track_info() -- some drive don't obey specs and
   fail if they can't supply the full Mt Fuji size table.
   -- Deleted stuff related to setting up write modes. It has a different
   home now.
@@ -213,11 +213,20 @@
   -- Fix Video-CD on SCSI drives that don't support READ_CD command. In
   that case switch block size and issue plain READ_10 again, then switch
   back.
+
+  3.10 Jun 10, 2000 - Jens Axboe <axboe@suse.de>
+  -- Fix volume control on CD's - old SCSI-II drives now use their own
+  code, as doing MODE6 stuff in here is really not my intention.
+  -- Use READ_DISC_INFO for more reliable end-of-disc.
+
+  3.11 Jun 12, 2000 - Jens Axboe <axboe@suse.de>
+  -- Fix bug in getting rpc phase 2 region info.
+  -- Reinstate "correct" CDROMPLAYTRKIND
  
 -------------------------------------------------------------------------*/
 
-#define REVISION "Revision: 3.09"
-#define VERSION "Id: cdrom.c 3.09 2000/05/12"
+#define REVISION "Revision: 3.11"
+#define VERSION "Id: cdrom.c 3.11 2000/06/12"
 
 /* I use an error-log mask to give fine grain control over the type of
    messages dumped to the system logs.  The available masks include: */
@@ -287,7 +296,7 @@
 
 /* The (cdo->capability & ~cdi->mask & CDC_XXX) construct was used in
    a lot of places. This macro makes the code more clear. */
-#define CDROM_CAN(type) (cdi->ops->capability & ~cdi->mask & type)
+#define CDROM_CAN(type) (cdi->ops->capability & ~cdi->mask & (type))
 
 /* used in the audio ioctls */
 #define CHECKAUDIO if ((ret=check_for_audio_disc(cdi, cdo))) return ret
@@ -1096,8 +1105,8 @@
 	case DVD_LU_SEND_RPC_STATE:
 		cdinfo(CD_DVD, "entering DVD_LU_SEND_RPC_STATE\n");
 		setup_report_key(&cgc, 0, 8);
+		memset(&rpc_state, 0, sizeof(rpc_state_t));
 
-		init_cdrom_command(&cgc, &rpc_state, 0);
 		if ((ret = cdo->generic_packet(cdi, &cgc)))
 			return ret;
 
@@ -1108,7 +1117,7 @@
 		ai->lrpcs.rpc_scheme = rpc_state.rpc_scheme;
 		break;
 
-		/* Set region settings */
+	/* Set region settings */
 	case DVD_HOST_SEND_RPC_STATE:
 		cdinfo(CD_DVD, "entering DVD_HOST_SEND_RPC_STATE\n");
 		setup_send_key(&cgc, 0, 6);
@@ -1334,6 +1343,18 @@
 	return cdo->generic_packet(cdi, cgc);
 }
 
+static int cdrom_mode_select_6(struct cdrom_device_info *cdi,
+			       struct cdrom_generic_command *cgc)
+{
+	struct cdrom_device_ops *cdo = cdi->ops;
+
+	memset(cgc->cmd, 0, sizeof(cgc->cmd));
+	cgc->cmd[0] = GPCMD_MODE_SELECT_6;
+	cgc->cmd[1] = 0x10;
+	cgc->cmd[4] = cgc->buflen & 0xff;
+	return cdo->generic_packet(cdi, cgc);
+}
+
 static int cdrom_read_subchannel(struct cdrom_device_info *cdi,
 				 struct cdrom_subchnl *subchnl, int mcn)
 {
@@ -1812,26 +1833,17 @@
  */
 static int cdrom_switch_blocksize(struct cdrom_device_info *cdi, int size)
 {
-	struct cdrom_device_ops *cdo = cdi->ops;
 	struct cdrom_generic_command cgc;
 	struct modesel_head mh;
 
 	memset(&mh, 0, sizeof(mh));
+	memset(&cgc, 0, sizeof(cgc));
 	mh.block_desc_length = 0x08;
 	mh.block_length_med = (size >> 8) & 0xff;
 	mh.block_length_lo = size & 0xff;
-
-	memset(&cgc, 0, sizeof(cgc));
-	cgc.cmd[0] = 0x15;
-	cgc.cmd[1] = 1 << 4;
-	cgc.cmd[4] = 12;
 	cgc.buflen = sizeof(mh);
 	cgc.buffer = (char *) &mh;
-	mh.block_desc_length = 0x08;
-	mh.block_length_med = (size >> 8) & 0xff;
-	mh.block_length_lo = size & 0xff;
-
-	return cdo->generic_packet(cdi, &cgc);
+	return cdrom_mode_select_6(cdi, &cgc);
 }
 
 static int mmc_ioctl(struct cdrom_device_info *cdi, unsigned int cmd,
@@ -1956,36 +1968,15 @@
 		}
 	case CDROMPLAYTRKIND: {
 		struct cdrom_ti ti;
-		struct cdrom_tocentry entry;
-		struct cdrom_tochdr tochdr;
 
 		cdinfo(CD_DO_IOCTL, "entering CDROMPLAYTRKIND\n");
 		IOCTL_IN(arg, struct cdrom_ti, ti);
-		entry.cdte_format = CDROM_MSF;
-
-		/* get toc entry for start and end track */
-		if (cdo->audio_ioctl(cdi, CDROMREADTOCHDR, &tochdr))
-			return -EINVAL;
-		if ((entry.cdte_track = ti.cdti_trk0) > tochdr.cdth_trk1)
-			return -EINVAL;
-		if (cdo->audio_ioctl(cdi, CDROMREADTOCENTRY, &entry))
-			return -EINVAL;
 
-		cgc.cmd[3] = entry.cdte_addr.msf.minute;
-		cgc.cmd[4] = entry.cdte_addr.msf.second;
-		cgc.cmd[5] = entry.cdte_addr.msf.frame;
-
-		entry.cdte_track = ti.cdti_trk1 + 1;
-		if (entry.cdte_track > tochdr.cdth_trk1)
-			entry.cdte_track = CDROM_LEADOUT;
-
-		if (cdo->audio_ioctl(cdi, CDROMREADTOCENTRY, &entry))
-			return -EINVAL;
-
-		cgc.cmd[6] = entry.cdte_addr.msf.minute;
-		cgc.cmd[7] = entry.cdte_addr.msf.second;
-		cgc.cmd[8] = entry.cdte_addr.msf.frame;
-		cgc.cmd[0] = GPCMD_PLAY_AUDIO_MSF;
+		cgc.cmd[0] = GPCMD_PLAY_AUDIO_TI;
+		cgc.cmd[4] = ti.cdti_trk0;
+		cgc.cmd[5] = ti.cdti_ind0;
+		cgc.cmd[7] = ti.cdti_trk1;
+		cgc.cmd[8] = ti.cdti_ind1;
 		return cdo->generic_packet(cdi, &cgc);
 		}
 	case CDROMPLAYMSF: {
@@ -2018,28 +2009,32 @@
 	case CDROMVOLREAD: {
 		struct cdrom_volctrl volctrl;
 		char mask[32];
-		unsigned short offset;
+		unsigned short offset = sizeof(struct mode_page_header);
+		struct mode_page_header *header = (struct mode_page_header *) buffer;
+		/*
+		 * pass to sr vol control
+		 */
+		if (cdi->scsi_2)
+			return -ENOTTY;
+
 		cdinfo(CD_DO_IOCTL, "entering CDROMVOLUME\n");
 
 		IOCTL_IN(arg, struct cdrom_volctrl, volctrl);
 
 		cgc.buffer = buffer;
 		cgc.buflen = 24;
-		if ((ret = cdrom_mode_sense(cdi, &cgc, GPMODE_AUDIO_CTL_PAGE, 0)))
-		    return ret;
+		if ((ret = cdrom_mode_sense(cdi, &cgc, GPMODE_AUDIO_CTL_PAGE, 0))) {
+			cdi->scsi_2 = 1;
+			return ret;
+		}
 		
 		/* some drives have longer pages, adjust and reread. */
-		if (buffer[1] > cgc.buflen) {
-			cgc.buflen = buffer[1] + 2;
-			if ((ret = cdrom_mode_sense(cdi, &cgc, 
-					GPMODE_AUDIO_CTL_PAGE, 0))) 
-			    return ret;
+		if (be16_to_cpu(header->mode_data_length) != cgc.buflen + 2) {
+			cgc.buflen = be16_to_cpu(header->mode_data_length) + 2;
+			if ((ret = cdrom_mode_sense(cdi, &cgc, GPMODE_AUDIO_CTL_PAGE, 0))) 
+				return ret;
 		}
 		
-		/* get the offset from the length of the page. length
-		   is measure from byte 2 an on, thus the 14. */
-		offset = buffer[1] - 14;
-
 		/* now we have the current volume settings. if it was only
 		   a CDROMVOLREAD, return these values */
 		if (cmd == CDROMVOLREAD) {
@@ -2053,9 +2048,8 @@
 		
 		/* get the volume mask */
 		cgc.buffer = mask;
-		if ((ret = cdrom_mode_sense(cdi, &cgc, 
-				GPMODE_AUDIO_CTL_PAGE, 1)))
-		    return ret;
+		if ((ret = cdrom_mode_sense(cdi, &cgc, GPMODE_AUDIO_CTL_PAGE, 1)))
+			return ret;
 
 		buffer[offset+9] = volctrl.channel0 & mask[offset+9];
 		buffer[offset+11] = volctrl.channel1 & mask[offset+11];
@@ -2252,6 +2246,9 @@
 	int ret = -1;
 
 	if (!CDROM_CAN(CDC_GENERIC_PACKET))
+		goto use_toc;
+
+	if (!CDROM_CAN(CDC_CD_R | CDC_CD_RW))
 		goto use_toc;
 
 	if ((ret = cdrom_get_disc_info(dev, &di)))
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/drivers/char/Config.in linux.17p9/drivers/char/Config.in
--- linux.vanilla/drivers/char/Config.in	Sun Jun 11 21:44:12 2000
+++ linux.17p9/drivers/char/Config.in	Sun Jun 25 17:41:28 2000
@@ -215,4 +215,6 @@
 fi
 endmenu
 
+tristate 'Toshiba Laptop support' CONFIG_TOSHIBA
+
 endmenu
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/drivers/char/Makefile linux.17p9/drivers/char/Makefile
--- linux.vanilla/drivers/char/Makefile	Sun Jun 11 21:44:12 2000
+++ linux.17p9/drivers/char/Makefile	Sun Jun 25 17:41:28 2000
@@ -628,6 +628,16 @@
   L_OBJS += dz.o
 endif
 
+
+ifeq ($(CONFIG_TOSHIBA),y)
+L_OBJS += toshiba.o
+else
+  ifeq ($(CONFIG_TOSHIBA),m)
+  M_OBJS += toshiba.o
+  endif
+endif
+
+
 include $(TOPDIR)/Rules.make
 
 fastdep:
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/drivers/char/adbmouse.c linux.17p9/drivers/char/adbmouse.c
--- linux.vanilla/drivers/char/adbmouse.c	Fri Apr 21 12:45:51 2000
+++ linux.17p9/drivers/char/adbmouse.c	Mon Jun 26 15:46:10 2000
@@ -35,6 +35,7 @@
 
 #include <asm/adb_mouse.h>
 #include <asm/uaccess.h>
+#include <asm/hardirq.h>
 #ifdef __powerpc__
 #include <asm/processor.h>
 #endif
@@ -56,7 +57,7 @@
  *	XXX: need to figure out what ADB mouse packets mean ... 
  *	This is the stuff stolen from the Atari driver ...
  */
-static void adb_mouse_interrupt(unsigned char *buf, int nb)
+void adb_mouse_interrupt(unsigned char *buf, int nb)
 {
     int buttons, id;
 
@@ -154,6 +155,7 @@
       return 0;
 
     adb_mouse_interrupt_hook = NULL;
+    synchronize_irq();
     MOD_DEC_USE_COUNT;
     return 0;
 }
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/drivers/char/dtlk.c linux.17p9/drivers/char/dtlk.c
--- linux.vanilla/drivers/char/dtlk.c	Fri Apr 21 12:45:51 2000
+++ linux.17p9/drivers/char/dtlk.c	Tue Jun 27 12:06:54 2000
@@ -272,14 +272,14 @@
 	}
 	/* there are no exception conditions */
 
-	if (mask == 0 && !dtlk_timer_active) {
+	{
 		/* not ready just yet.  There won't be any interrupts,
 		   so we set a timer instead. */
 		dtlk_timer_active = 1;
 		dtlk_timer.expires = jiffies + HZ / 100;
 		add_timer(&dtlk_timer);
 	}
-	return 0;
+	return mask;
 }
 
 static void dtlk_stop_timer()
@@ -295,11 +295,6 @@
 
 	wake_up_interruptible(&dtlk_process_list);
 
-	if (dtlk_timer_active) {
-		del_timer(&dtlk_timer);
-		dtlk_timer.expires = jiffies + HZ / 100;
-		add_timer(&dtlk_timer);
-	}
 }
 
 static int dtlk_ioctl(struct inode *inode,
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/drivers/char/misc.c linux.17p9/drivers/char/misc.c
--- linux.vanilla/drivers/char/misc.c	Sun Jun 11 21:44:13 2000
+++ linux.17p9/drivers/char/misc.c	Tue Jun 27 12:04:06 2000
@@ -85,6 +85,7 @@
 extern void hfmodem_init(void);
 extern int pc110pad_init(void);
 extern int pmu_device_init(void);
+extern int tosh_init(void);
 
 static int misc_read_proc(char *buf, char **start, off_t offset,
 			  int len, int *eof, void *private)
@@ -277,6 +278,9 @@
 #endif
 #ifdef CONFIG_SGI
 	streamable_init ();
+#endif
+#ifdef CONFIG_TOSHIBA
+	tosh_init();
 #endif
 	if (register_chrdev(MISC_MAJOR,"misc",&misc_fops)) {
 		printk("unable to get major %d for misc devices\n",
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/drivers/char/sx.c linux.17p9/drivers/char/sx.c
--- linux.vanilla/drivers/char/sx.c	Fri Apr 21 12:46:06 2000
+++ linux.17p9/drivers/char/sx.c	Thu Jun 15 15:23:11 2000
@@ -896,6 +896,9 @@
 
 	func_enter2();
 
+	if (!port->gs.tty)
+		return 0;
+
 	/* What is this doing here? -- REW
 	   Ha! figured it out. It is to allow you to get DTR active again
 	   if you've dropped it with stty 0. Moved to set_baud, where it
@@ -1545,9 +1548,36 @@
    exit minicom.  I expect an "oops".  -- REW */
 static void sx_hungup (void *ptr)
 {
+/*
 	func_enter ();
 	MOD_DEC_USE_COUNT;
 	func_exit ();
+*/
+	/* 
+	 * Got this from the 2.4.0-test1 serie. The port was closed before
+	 * the lines were set in the proper condition. -- pvdl
+	 */
+	struct sx_port *port = ptr; 
+	func_enter ();
+
+	/* 
+	 *  Set the lines in the proper codition before closing the port.
+	 *  Got the from 2.4.0-test1 series. -- pvdl
+	 */
+	sx_setsignals (port, 0, 0);
+	sx_reconfigure_port(port);	
+	sx_send_command (port, HS_CLOSE, -1, HS_IDLE_CLOSED);
+
+	if (sx_read_channel_byte (port, hi_hstat) != HS_IDLE_CLOSED) {
+		if (sx_send_command (port, HS_FORCE_CLOSED, -1, HS_IDLE_CLOSED) != 1) {
+			printk (KERN_ERR 
+			        "sx: sent the force_close command, but card didn't react\n");
+		} else
+			sx_dprintk (SX_DEBUG_CLOSE, "sent the force_close command.\n");
+	}
+
+	MOD_DEC_USE_COUNT;
+	func_exit ();
 }
 
 
@@ -1558,6 +1588,9 @@
 	int to = 5 * HZ; 
 
 	func_enter ();
+
+	sx_setsignals (port, 0, 0);
+	sx_reconfigure_port(port);	
 	sx_send_command (port, HS_CLOSE, 0, 0);
 
 	while (to-- && (sx_read_channel_byte (port, hi_hstat) != HS_IDLE_CLOSED)) {
@@ -1920,7 +1953,10 @@
 	func_enter();
 
 	/* This is preceded by downloading the download code. */
-
+	/* 
+	 * The board should be set to initialized to make sure 
+	 * we can boot the other cards. --pvdl
+	 */ 
 	board->flags |= SX_BOARD_INITIALIZED;
 
 	if (read_sx_byte (board, 0))
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/drivers/char/toshiba.c linux.17p9/drivers/char/toshiba.c
--- linux.vanilla/drivers/char/toshiba.c	Thu Jan  1 01:00:00 1970
+++ linux.17p9/drivers/char/toshiba.c	Sun Jun 25 17:44:16 2000
@@ -0,0 +1,561 @@
+/* toshiba.c -- Linux driver for accessing the SMM on Toshiba laptops
+ *
+ * Copyright (c) 1996-2000  Jonathan A. Buzzard (jonathan@buzzard.org.uk)
+ *
+ * Valuable assistance and patches from:
+ *     Tom May <tom@you-bastards.com>
+ *     Rob Napier <rnapier@employees.org>
+ *
+ * Fn status port numbers for machine ID's courtesy of
+ *     0xfc08: Garth Berry <garth@itsbruce.net>
+ *     0xfc11: Spencer Olson <solson@novell.com>
+ *     0xfc13: Claudius Frankewitz <kryp@gmx.de>
+ *     0xfc15: Tom May <tom@you-bastards.com>
+ *     0xfc17: Dave Konrad <konrad@xenia.it>
+ *     0xfc1a: George Betzos <betzos@engr.colostate.edu>
+ *     0xfc1d: Arthur Liu <armie@slap.mine.nu>
+ *
+ * WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING
+ *
+ *   This code is covered by the GNU GPL and you are free to make any
+ *   changes you wish to it under the terms of the license. However the
+ *   code has the potential to render your computer and/or someone else's
+ *   unusable. Please proceed with care when modifying the code.
+ *
+ * Note: Unfortunately the laptop hardware can close the System Configuration
+ *       Interface on it's own accord. It is therefore necessary for *all*
+ *       programs using this driver to be aware that *any* SCI call can fail at
+ *       *any* time. It is up to any program to be aware of this eventuality
+ *       and take appropriate steps.
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2, or (at your option) any
+ * later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * The information used to write this driver has been obtained by reverse
+ * engineering the software supplied by Toshiba for their portable computers in
+ * strict accordance with the European Council Directive 92/250/EEC on the legal
+ * protection of computer programs, and it's implementation into English Law by
+ * the Copyright (Computer Programs) Regulations 1992 (S.I. 1992 No.3233).
+ *
+ */
+
+#define TOSH_VERSION "1.7 22/6/2000"
+#define TOSH_DEBUG 0
+
+#include<linux/module.h>
+#include<linux/version.h>
+#include<linux/kernel.h>
+#include<linux/sched.h>
+#include<linux/types.h>
+#include<linux/fcntl.h>
+#include<linux/miscdevice.h>
+#include<linux/ioport.h>
+#include<asm/io.h>
+#include<asm/uaccess.h>
+#include<asm/init.h>
+#include<linux/stat.h>
+#include<linux/proc_fs.h>
+
+#include<linux/toshiba.h>
+
+#define TOSH_MINOR_DEV 181
+
+static int tosh_id = 0x0000;
+static int tosh_bios = 0x0000;
+static int tosh_date = 0x0000;
+static int tosh_sci = 0x0000;
+static int tosh_fan = 0;
+static int tosh_start = 0;
+static int tosh_extent = 0;
+
+static int tosh_fn = 0;
+
+MODULE_PARM(tosh_fn, "i");
+
+
+static int tosh_get_info(char *, char **, off_t, int, int);
+static int tosh_open(struct inode *ip, struct file *);
+static int tosh_release(struct inode *, struct file *);
+static int tosh_ioctl(struct inode *, struct file *, unsigned int,
+	unsigned long);
+
+
+static struct file_operations tosh_fops = {
+	NULL,		/* lseek */
+	NULL,		/* read */
+	NULL,		/* write */
+	NULL,		/* readdir */  
+	NULL,		/* select */ 
+	tosh_ioctl,	/* ioctl */
+	NULL,		/* mmap */
+	tosh_open,	/* open */
+	NULL,		/* flush */
+	tosh_release, 	/* close */
+	NULL,		/* fsync */
+	NULL		/* fasync */
+};
+
+static struct miscdevice tosh_device = {
+	TOSH_MINOR_DEV,
+	"toshiba",
+	&tosh_fops
+};
+
+static struct proc_dir_entry tosh_proc_entry = {
+	0, 7, "toshiba", S_IFREG|S_IRUGO, 1, 0, 0, 33, NULL, tosh_get_info, NULL
+};
+
+/*
+ * Read the Fn key status
+ */
+static int tosh_fn_status(void)
+{
+        unsigned char scan;
+	unsigned long flags;
+
+	if (tosh_fn!=0) {
+		scan = inb(tosh_fn);
+	} else {
+		save_flags(flags);
+		cli();
+		outb(0x8e, 0xe4);
+		scan = inb(0xe5);
+		restore_flags(flags);
+	}
+
+        return (int) scan;
+}
+
+
+/*
+ * At some point we need to emulate setting the HDD auto off times for
+ * the new laptops. We can do this by calling the ide_ioctl on /dev/hda.
+ * The values we need for the various times are
+ *
+ *    Disabled   0x00
+ *    1 minute   0x0c
+ *    3 minutes  0x24
+ *    5 minutes  0x3c
+ *   10 minutes  0x78
+ *   15 minutes  0xb4
+ *   20 minutes  0xf0
+ *   30 minutes  0xf1
+ *
+ */
+/*static int tosh_emulate_hdd(SMMRegisters *regs)
+{
+	return 0;
+}*/
+
+
+/*
+ * For the Portage 610CT and the Tecra 700CS/700CDT emulate the HCI fan function
+ */
+static int tosh_emulate_fan(SMMRegisters *regs)
+{
+	unsigned long eax,ecx,flags;
+	unsigned char al;
+
+	eax = regs->eax & 0xff00;
+	ecx = regs->ecx & 0xffff;
+
+	/* Portage 610CT */
+
+	if (tosh_id==0xfccb) {
+		if (eax==0xfe00) {
+			/* fan status */
+			save_flags(flags);
+			cli();
+			outb(0xbe, 0xe4);
+			al = inb(0xe5);
+			restore_flags(flags);
+			regs->eax = 0x00;
+			regs->ecx = (unsigned int) (al & 0x01);
+		}
+		if ((eax==0xff00) && (ecx==0x0000)) {
+			/* fan off */
+			save_flags(flags);
+			cli();
+			outb(0xbe, 0xe4);
+			al = inb(0xe5);
+			outb(0xbe, 0xe4);
+			outb (al | 0x01, 0xe5);
+			restore_flags(flags);
+			regs->eax = 0x00;
+			regs->ecx = 0x00;
+		}
+		if ((eax==0xff00) && (ecx==0x0001)) {
+			/* fan on */
+			save_flags(flags);
+			cli();
+			outb(0xbe, 0xe4);
+			al = inb(0xe5);
+			outb(0xbe, 0xe4);
+			outb(al & 0xfe, 0xe5);
+			restore_flags(flags);
+			regs->eax = 0x00;
+			regs->ecx = 0x01;
+		}
+	}
+
+	/* Tecra 700CS/CDT */
+
+	if (tosh_id==0xfccc) {
+		if (eax==0xfe00) {
+			/* fan status */
+			save_flags(flags);
+			cli();
+			outb(0xe0, 0xe4);
+			al = inb(0xe5);
+			restore_flags(flags);
+			regs->eax = 0x00;
+			regs->ecx = al & 0x01;
+		}
+		if ((eax==0xff00) && (ecx==0x0000)) {
+			/* fan off */
+			save_flags(flags);
+			cli();
+			outb(0xe0, 0xe4);
+			al = inb(0xe5);
+			outw(0xe0 | ((al & 0xfe) << 8), 0xe4);
+			restore_flags(flags);
+			regs->eax = 0x00;
+			regs->ecx = 0x00;
+		}
+		if ((eax==0xff00) && (ecx==0x0001)) {
+			/* fan on */
+			save_flags(flags);
+			cli();
+			outb(0xe0, 0xe4);
+			al = inb(0xe5);
+			outw(0xe0 | ((al | 0x01) << 8), 0xe4);
+			restore_flags(flags);
+			regs->eax = 0x00;
+			regs->ecx = 0x01;
+		}
+	}
+
+	return 0;
+}
+
+
+/*
+ * Put the laptop into System Management Mode
+ */
+static int tosh_smm(SMMRegisters *regs)
+{
+	int eax;
+
+	asm ("# load the values into the registers\n\t" \
+		"pushl %%eax\n\t" \
+		"movl 0(%%eax),%%edx\n\t" \
+		"push %%edx\n\t" \
+		"movl 4(%%eax),%%ebx\n\t" \
+		"movl 8(%%eax),%%ecx\n\t" \
+		"movl 12(%%eax),%%edx\n\t" \
+		"movl 16(%%eax),%%esi\n\t" \
+		"movl 20(%%eax),%%edi\n\t" \
+		"popl %%eax\n\t" \
+		"# call the System Management mode\n\t" \
+		"inb $0xb2,%%al\n\t"
+		"# fill out the memory with the values in the registers\n\t" \
+		"xchgl %%eax,(%%esp)\n\t"
+		"movl %%ebx,4(%%eax)\n\t" \
+		"movl %%ecx,8(%%eax)\n\t" \
+		"movl %%edx,12(%%eax)\n\t" \
+		"movl %%esi,16(%%eax)\n\t" \
+		"movl %%edi,20(%%eax)\n\t" \
+		"popl %%edx\n\t" \
+		"movl %%edx,0(%%eax)\n\t" \
+		"# setup the return value to the carry flag\n\t" \
+		"lahf\n\t" \
+		"shrl $8,%%eax\n\t" \
+		"andl $1,%%eax\n" \
+		: "=a" (eax)
+		: "a" (regs)
+		: "%ebx", "%ecx", "%edx", "%esi", "%edi", "memory");
+
+	return eax;
+}
+
+
+static int tosh_open(struct inode *ip, struct file *fp)
+{
+	MOD_INC_USE_COUNT;
+
+	return 0;
+}
+
+
+static int tosh_release(struct inode *ip, struct file *fp)
+{
+	MOD_DEC_USE_COUNT;
+
+	return 0;
+}
+
+
+static int tosh_ioctl(struct inode *ip, struct file *fp, unsigned int cmd,
+	unsigned long arg)
+{
+	SMMRegisters regs;
+	unsigned short ax,bx;
+	int err;
+
+	if (!arg)
+		return -EINVAL;
+
+	if(copy_from_user(&regs, (SMMRegisters *) arg, sizeof(SMMRegisters)))
+		return -EFAULT;
+
+	switch (cmd) {
+		case TOSH_SMM:
+			ax = regs.eax & 0xff00;
+			bx = regs.ebx & 0xffff;
+			/* block HCI calls to read/write memory & PCI devices */
+			if (((ax==0xff00) || (ax==0xfe00)) && (bx>0x0069))
+				return -EINVAL;
+
+			/* do we need to emulate the fan ? */
+			if (tosh_fan==1) {
+				if (((ax==0xf300) || (ax==0xf400)) && (bx==0x0004)) {
+					err = tosh_emulate_fan(&regs);
+					break;
+				}
+			}
+			err = tosh_smm(&regs);
+			break;
+		default:
+			return -EINVAL;
+	}
+
+        if(copy_to_user((SMMRegisters *) arg, &regs, sizeof(SMMRegisters)))
+        	return -EFAULT;
+
+	return (err==0) ? 0:-EINVAL;
+}
+
+
+/*
+ * Print the information for /proc/toshiba
+ */
+int tosh_get_info(char *buffer, char **start, off_t fpos, int length, int dummy)
+{
+	char *temp;
+	int key;
+
+	temp = buffer;
+	key = tosh_fn_status();
+
+	/* Arguments
+	     0) Linux driver version (this will change if format changes)
+	     1) Machine ID
+	     2) SCI version
+	     3) BIOS version (major, minor)
+	     4) BIOS date (in SCI date format)
+	     5) Fn Key status
+	*/
+
+	temp += sprintf(temp, "1.1 0x%04x %d.%d %d.%d 0x%04x 0x%02x\n",
+		tosh_id,
+		(tosh_sci & 0xff00)>>8,
+		tosh_sci & 0xff,
+		(tosh_bios & 0xff00)>>8,
+		tosh_bios & 0xff,
+		tosh_date,
+		key);
+
+	return temp-buffer;
+}
+
+
+/*
+ * Determine which port to use for the Fn key status
+ */
+static void tosh_set_fn_port(void)
+{
+	switch (tosh_id) {
+		case 0xfc11: case 0xfc13: case 0xfc15: case 0xfc1a:
+			tosh_fn = 0x62;
+			break;
+		case 0xfc08: case 0xfc17: case 0xfc1d: case 0xfcd1:
+		case 0xfce0: case 0xfce2:
+			tosh_fn = 0x68;
+			break;
+		default:
+			tosh_fn = 0x00;
+			break;
+	}
+
+	return;
+}
+
+
+/*
+ * Get the machine identification number of the current model
+ */
+static int tosh_get_machine_id(void)
+{
+	int id;
+	SMMRegisters regs;
+	unsigned short bx,cx;
+	unsigned long address;
+
+	id = (0x100*(int) readb(0xffffe))+((int) readb(0xffffa));
+	
+	/* do we have a SCTTable machine identication number on our hands */
+
+	if (id==0xfc2f) {
+
+		/* start by getting a pointer into the BIOS */
+
+		regs.eax = 0xc000;
+		regs.ebx = 0x0000;
+		regs.ecx = 0x0000;
+		tosh_smm(&regs);
+		bx = (unsigned short) (regs.ebx & 0xffff);
+
+		/* At this point in the Toshiba routines under MS Windows
+		   the bx register holds 0xe6f5. However my code is producing
+		   a different value! For the time being I will just fudge the
+		   value. This has been verified on a Satellite Pro 430CDT,
+		   Tecra 750CDT, Tecra 780DVD and Satellite 310CDT. */
+#if TOSH_DEBUG
+		printk("toshiba: debugging ID ebx=0x%04x\n", regs.ebx);
+#endif
+		bx = 0xe6f5;
+
+		/* now twiddle with our pointer a bit */
+
+		address = 0x000f0000+bx;
+		cx = readw(address);
+		address = 0x000f0009+bx+cx;
+		cx = readw(address);
+		address = 0x000f000a+cx;
+		cx = readw(address);
+
+		/* now construct our machine identification number */
+
+		id = ((cx & 0xff)<<8)+((cx & 0xff00)>>8);
+	}
+
+	return id;
+}
+
+
+/*
+ * Probe for the presence of a Toshiba laptop
+ *
+ *   returns and non-zero if unable to detect the presence of a Toshiba
+ *   laptop, otherwise zero and determines the Machine ID, BIOS version and
+ *   date, and SCI version.
+ */
+int tosh_probe(void)
+{
+	int major,minor,day,year,month,flag;
+	SMMRegisters regs;
+
+	/* call the Toshiba SCI support check routine */
+	
+	regs.eax = 0xf0f0;
+	regs.ebx = 0x0000;
+	regs.ecx = 0x0000;
+	flag = tosh_smm(&regs);
+
+	/* if this is not a Toshiba laptop carry flag is set and ah=0x86 */
+
+	if ((flag==1) || ((regs.eax & 0xff00)==0x8600)) {
+		printk("toshiba: not a supported Toshiba laptop\n");
+		return -ENODEV;
+	}
+
+	/* if we get this far then we are running on a Toshiba (probably)! */
+
+	tosh_sci = regs.edx & 0xffff;
+	
+	/* next get the machine ID of the current laptop */
+
+	tosh_id = tosh_get_machine_id();
+
+	/* get the BIOS version */
+
+	major = readb(0xfe009)-'0';
+	minor = ((readb(0xfe00b)-'0')*10)+(readb(0xfe00c)-'0');
+	tosh_bios = (major*0x100)+minor;
+
+	/* get the BIOS date */
+
+	day = ((readb(0xffff5)-'0')*10)+(readb(0xffff6)-'0');
+	month = ((readb(0xffff8)-'0')*10)+(readb(0xffff9)-'0');
+	year = ((readb(0xffffb)-'0')*10)+(readb(0xffffc)-'0');
+	tosh_date = (((year-90) & 0x1f)<<10) | ((month & 0xf)<<6)
+		| ((day & 0x1f)<<1);
+
+
+	/* in theory we should check the ports we are going to use for the
+	   fn key detection (and the fan on the Portage 610/Tecra700), and
+	   then request them to stop other drivers using them. However as
+	   the keyboard driver grabs 0x60-0x6f and the pic driver grabs
+	   0xa0-0xbf we can't. We just have to live dangerously and use the
+	   ports anyway, oh boy! */
+
+
+	/* do we need to emulate the fan? */
+
+	if ((tosh_id==0xfccb) || (tosh_id==0xfccc))
+		tosh_fan = 1;
+
+	return 0;
+}
+
+int __init tosh_init(void)
+{
+	/* are we running on a Toshiba laptop */
+
+	if (tosh_probe()!=0)
+		return -EIO;
+
+	printk(KERN_INFO "Toshiba System Managment Mode driver v"
+		TOSH_VERSION"\n");
+
+	/* set the port to use for Fn status if not specified as a parameter */
+
+	if (tosh_fn==0x00)
+		tosh_set_fn_port();
+
+	/* register the device file */
+
+	misc_register(&tosh_device);
+
+	/* register the proc entry */
+	proc_register(&proc_root, &tosh_proc_entry);
+	return 0;
+}
+
+#ifdef MODULE
+int init_module(void)
+{
+	return tosh_init();
+}
+
+void cleanup_module(void)
+{
+	/* remove the proc entry */
+	proc_unregister(&proc_root, tosh_proc_entry.low_ino);
+
+	/* unregister the device file */
+	misc_deregister(&tosh_device);
+
+	/* release ports */
+	release_region(tosh_start, tosh_extent);
+
+	return;
+}
+#endif
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/drivers/char/vt.c linux.17p9/drivers/char/vt.c
--- linux.vanilla/drivers/char/vt.c	Fri Apr 21 12:46:07 2000
+++ linux.17p9/drivers/char/vt.c	Fri Jun 16 16:32:31 2000
@@ -590,6 +590,8 @@
 
 	case KDGETKEYCODE:
 	case KDSETKEYCODE:
+		if(!suser())
+			perm=0;
 		return do_kbkeycode_ioctl(cmd, (struct kbkeycode *)arg, perm);
 
 	case KDGKBENT:
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/drivers/i2o/i2o_core.c linux.17p9/drivers/i2o/i2o_core.c
--- linux.vanilla/drivers/i2o/i2o_core.c	Sun Jun 11 21:44:13 2000
+++ linux.17p9/drivers/i2o/i2o_core.c	Sun Jun 11 21:50:44 2000
@@ -3021,7 +3021,6 @@
 extern int i2o_lan_init(void);
 extern int i2o_pci_init(void);
 extern int i2o_proc_init(void);
-extern int i2o_scsi_init(void);
 
 int __init i2o_init(void)
 {
@@ -3063,10 +3062,6 @@
 
 #ifdef CONFIG_I2O_BLOCK
 	i2o_block_init();
-#endif
-
-#ifdef CONFIG_I2O_SCSI
-	i2o_scsi_init();
 #endif
 
 #ifdef CONFIG_I2O_LAN
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/drivers/i2o/i2o_scsi.h linux.17p9/drivers/i2o/i2o_scsi.h
--- linux.vanilla/drivers/i2o/i2o_scsi.h	Wed May  3 22:34:53 2000
+++ linux.17p9/drivers/i2o/i2o_scsi.h	Tue Jun 27 13:13:44 2000
@@ -24,6 +24,7 @@
 extern int i2o_scsi_reset(Scsi_Cmnd *, unsigned int);
 extern int i2o_scsi_bios_param(Disk *, kdev_t, int *);
 extern void i2o_scsi_setup(char *str, int *ints);
+extern int i2o_scsi_release(struct Scsi_Host *host);
 
 #define I2OSCSI {                                          \
 		  next: NULL,				    \
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/drivers/macintosh/Makefile linux.17p9/drivers/macintosh/Makefile
--- linux.vanilla/drivers/macintosh/Makefile	Fri Apr 21 12:46:14 2000
+++ linux.17p9/drivers/macintosh/Makefile	Tue Jun 20 22:51:34 2000
@@ -36,6 +36,14 @@
   endif
 endif
 
+ifeq ($(CONFIG_PPC_RTC),y)
+  L_OBJS += rtc.o
+else
+  ifeq ($(CONFIG_PPC_RTC),m)
+    M_OBJS += rtc.o
+  endif
+endif
+
 ifdef CONFIG_MAC_KEYBOARD
 L_OBJS += mac_keyb.o
 endif
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/drivers/macintosh/adb.c linux.17p9/drivers/macintosh/adb.c
--- linux.vanilla/drivers/macintosh/adb.c	Fri Apr 21 12:46:14 2000
+++ linux.17p9/drivers/macintosh/adb.c	Fri Jun 16 16:24:56 2000
@@ -170,9 +170,9 @@
 	
 	if (adb_controller == NULL)
 		printk(KERN_WARNING "Warning: no ADB interface detected\n");
-	else
-	{
+	else {
 		adb_hardware = adb_controller->kind;
+		
 #ifdef CONFIG_PMAC_PBOOK
 		pmu_register_sleep_notifier(&adb_sleep_notifier);
 #endif /* CONFIG_PMAC_PBOOK */
@@ -194,6 +194,8 @@
 	switch (when) {
 	case PBOOK_SLEEP_REQUEST:
 		adb_got_sleep = 1;
+		if (adb_controller->autopoll)
+			adb_controller->autopoll(0);
 		ret = notifier_call_chain(&adb_client_list, ADB_MSG_POWERDOWN, NULL);
 		if (ret & NOTIFY_STOP_MASK)
 			return PBOOK_SLEEP_REFUSE;
@@ -209,6 +211,7 @@
 		break;
 	case PBOOK_WAKE:
 		adb_reset_bus();
+		adb_got_sleep = 0;
 		break;
 	}
 	return PBOOK_SLEEP_OK;
@@ -218,15 +221,21 @@
 int
 adb_reset_bus(void)
 {
-	int ret, devs;
+	int ret, nret, devs;
 	unsigned long flags;
 	
 	if (adb_controller == NULL)
 		return -ENXIO;
 		
-	ret = notifier_call_chain(&adb_client_list, ADB_MSG_PRE_RESET, NULL);
-	if (ret & NOTIFY_STOP_MASK)
+	if (adb_controller->autopoll)
+		adb_controller->autopoll(0);
+
+	nret = notifier_call_chain(&adb_client_list, ADB_MSG_PRE_RESET, NULL);
+	if (nret & NOTIFY_STOP_MASK) {
+		if (adb_controller->autopoll)
+			adb_controller->autopoll(devs);
 		return -EBUSY;
+	}
 
 	save_flags(flags);
 	cli();
@@ -238,18 +247,17 @@
 	else
 		ret = 0;
 
-	if (!ret)
-	{
+	if (!ret) {
 		devs = adb_scan_bus();
 		if (adb_controller->autopoll)
 			adb_controller->autopoll(devs);
 	}
 
-	ret = notifier_call_chain(&adb_client_list, ADB_MSG_POST_RESET, NULL);
-	if (ret & NOTIFY_STOP_MASK)
+	nret = notifier_call_chain(&adb_client_list, ADB_MSG_POST_RESET, NULL);
+	if (nret & NOTIFY_STOP_MASK)
 		return -EBUSY;
 	
-	return 1;
+	return ret;
 }
 
 void
@@ -327,6 +335,12 @@
 	int i, id;
 	static int dump_adb_input = 0;
 
+	/* We skip keystrokes and mouse moves when the sleep process
+	 * has been started. We stop autopoll, but this is another security
+	 */
+	if (adb_got_sleep)
+		return;
+		
 	id = buf[0] >> 4;
 	if (dump_adb_input) {
 		printk(KERN_INFO "adb packet: ");
@@ -347,12 +361,8 @@
 
 	if (adb_handler[address].handler_id == new_id)
 	    return 1;
-	adb_request(&req, NULL, ADBREQ_SYNC | ADBREQ_REPLY, 1,
-    	    ADB_READREG(address,3));
-	if (req.reply_len < 2)
-	    return 0;
 	adb_request(&req, NULL, ADBREQ_SYNC, 3,
-	    ADB_WRITEREG(address, 3), req.reply[1] & 0xF0, new_id);	
+	    ADB_WRITEREG(address, 3), address | 0x20, new_id);
 	adb_request(&req, NULL, ADBREQ_SYNC | ADBREQ_REPLY, 1,
 	    ADB_READREG(address, 3));
 	if (req.reply_len < 2)
@@ -423,7 +433,7 @@
 {
 	struct adbdev_state *state;
 
-	if (MINOR(inode->i_rdev) > 0 || (adb_controller == NULL)/*adb_hardware == ADB_NONE*/)
+	if (MINOR(inode->i_rdev) > 0 || (adb_controller == NULL))
 		return -ENXIO;
 	state = kmalloc(sizeof(struct adbdev_state), GFP_KERNEL);
 	if (state == 0)
@@ -554,10 +564,11 @@
 	/* Special case for ADB_BUSRESET request, all others are sent to
 	   the controller */
 	if ((req->data[0] == ADB_PACKET)&&(count > 1)
-		&&(req->data[1] == ADB_BUSRESET))
+		&&(req->data[1] == ADB_BUSRESET)) {
 		ret = adb_reset_bus();
-	else
-	{	
+		atomic_dec(&state->n_pending);
+		goto out;
+	} else {	
 		req->reply_expected = ((req->data[1] & 0xc) == 0xc);
 
 		if (adb_controller && adb_controller->send_request)
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/drivers/macintosh/mac_keyb.c linux.17p9/drivers/macintosh/mac_keyb.c
--- linux.vanilla/drivers/macintosh/mac_keyb.c	Fri Apr 21 12:46:14 2000
+++ linux.17p9/drivers/macintosh/mac_keyb.c	Fri Jun 16 16:24:56 2000
@@ -24,6 +24,7 @@
  * - Hunter digital (NoHandsMouse)
  * - Kensignton TurboMouse 5 (needs testing)
  * - Mouse Systems A3 mice and trackballs <aidan@kublai.com>
+ * - MacAlly 2-buttons mouse (needs testing) <pochini@denise.shiny.it>
  *
  * To do:
  *
@@ -272,6 +273,7 @@
 #define ADBMOUSE_MICROSPEED	6	/* Microspeed mouse (&trackball ?), MacPoint */
 #define ADBMOUSE_TRACKBALLPRO	7	/* Trackball Pro (special buttons) */
 #define ADBMOUSE_MS_A3		8	/* Mouse systems A3 trackball (handler 3) */
+#define ADBMOUSE_MACALLY2	9	/* MacAlly 2-button mouse */
 
 static int adb_mouse_kinds[16];
 
@@ -490,6 +492,19 @@
     data[3] = byyy bxxx Third button and fourth button.  Y is additional
 	      high bits of y-axis motion.  XY is additional
 	      high bits of x-axis motion.
+
+    MacAlly 2-button mouse protocol.
+
+    For MacAlly 2-button mouse protocol the data array will contain the
+    following values:
+
+		BITS    COMMENTS
+    data[0] = dddd 1100 ADB command: Talk, register 0, for device dddd.
+    data[1] = bxxx xxxx Left button and x-axis motion.
+    data[2] = byyy yyyy Right button and y-axis motion.
+    data[3] = ???? ???? unknown
+    data[4] = ???? ???? unknown
+
   */
 	struct kbd_struct *kbd;
 
@@ -521,6 +536,11 @@
 		data[2] = (data[2] & 0x7f) | ((data[3] & 0x02) << 6);
 		data[3] = ((data[3] & 0x04) << 5);
 		break;
+            case ADBMOUSE_MACALLY2:
+		data[3] = (data[2] & 0x80) ? 0x80 : 0x00;
+		data[2] |= 0x80;  /* Right button is mapped as button 3 */
+		nb=4;
+                break;
 	}
 
 	if (adb_mouse_interrupt_hook)
@@ -581,7 +601,7 @@
 	/* Ignore data from register other than 0 */
 	if ((adb_hardware != ADB_VIAPMU) || (data[0] & 0x3) || (nb < 2))
 		return;
-		
+
 	switch (data[1]&0xf )
 	{
 		/* mute */
@@ -645,7 +665,6 @@
 
 static void real_mackbd_leds(unsigned char leds, int device)
 {
-
     if (led_request.complete) {
 	adb_request(&led_request, leds_done, 0, 3,
 		    ADB_WRITEREG(device, KEYB_LEDREG), 0xff,
@@ -705,21 +724,29 @@
 	led_request.complete = 1;
 
 	mackeyb_probe();
-	
+
 	notifier_chain_register(&adb_client_list, &mackeyb_adb_notifier);
 }
 
 static int
 adb_message_handler(struct notifier_block *this, unsigned long code, void *x)
 {
+	unsigned long flags;
+
 	switch (code) {
 	case ADB_MSG_PRE_RESET:
 	case ADB_MSG_POWERDOWN:
-		/* Add unregister_keyboard when merging with Paul Mackerras */
+	    	/* Stop the repeat timer. Autopoll is already off at this point */
+		save_flags(flags);
+		cli();
+		del_timer(&repeat_timer);
+		restore_flags(flags);
+
+		/* Stop pending led requests */
 		while(!led_request.complete)
 			adb_poll();
 		break;
-			
+
 	case ADB_MSG_POST_RESET:
 		mackeyb_probe();
 		break;
@@ -802,7 +829,7 @@
 		    || (adb_mouse_kinds[id] == ADBMOUSE_MICROSPEED)) {
 			init_microspeed(id);
 		} else if (adb_mouse_kinds[id] == ADBMOUSE_MS_A3) {
-			init_ms_a3(id);	
+			init_ms_a3(id);
 		}  else if (adb_mouse_kinds[id] ==  ADBMOUSE_EXTENDED) {
 			/*
 			 * Register 1 is usually used for device
@@ -825,6 +852,14 @@
 			    (req.reply[1] == 0x4b) && (req.reply[2] == 0x4d) &&
 			    (req.reply[3] == 0x4c) && (req.reply[4] == 0x31))
 				init_turbomouse(id);
+			else if ((req.reply_len == 9) &&
+			    (req.reply[1] == 0x4b) && (req.reply[2] == 0x4f) &&
+			    (req.reply[3] == 0x49) && (req.reply[4] == 0x54)){
+				if (adb_try_handler_change(id, 0x42)) {
+					printk("\nADB MacAlly 2-button mouse at %d, handler set to 0x42", id);
+					adb_mouse_kinds[id] = ADBMOUSE_MACALLY2;
+				}
+			}
 		}
 		printk("\n");
         }
@@ -833,7 +868,7 @@
 static void 
 init_trackpad(int id)
 {
-	struct adb_request req;	
+	struct adb_request req;
 	unsigned char r1_buffer[8];
 
 	printk(" (trackpad)");
@@ -886,9 +921,9 @@
 init_trackball(int id)
 {
 	struct adb_request req;
-	
+
 	printk(" (trackman/mouseman)");
-	
+
 	adb_mouse_kinds[id] = ADBMOUSE_TRACKBALL;
 
 	adb_request(&req, NULL, ADBREQ_SYNC, 3,
@@ -924,7 +959,7 @@
         printk(" (TurboMouse 5)");
 
 	adb_mouse_kinds[id] = ADBMOUSE_TURBOMOUSE5;
-	
+
 	adb_request(&req, NULL, ADBREQ_SYNC, 1, ADB_FLUSH(id));
 
 	adb_request(&req, NULL, ADBREQ_SYNC, 1, ADB_FLUSH(3));
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/drivers/macintosh/macio-adb.c linux.17p9/drivers/macintosh/macio-adb.c
--- linux.vanilla/drivers/macintosh/macio-adb.c	Fri Apr 21 12:46:14 2000
+++ linux.17p9/drivers/macintosh/macio-adb.c	Fri Jun 16 16:24:56 2000
@@ -115,11 +115,6 @@
 	out_8(&adb->intr_enb.r, DFB | TAG);
 
 	adb_controller = &macio_controller;
-//	adb_hardware = ADB_MACIO;
-
-//	adb_send_request = macio_adb_send_request;
-//	adb_autopoll = macio_adb_autopoll;
-//	adb_reset_bus = macio_reset_bus;
 }
 
 static int macio_adb_autopoll(int devs)
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/drivers/macintosh/macserial.c linux.17p9/drivers/macintosh/macserial.c
--- linux.vanilla/drivers/macintosh/macserial.c	Fri Apr 21 12:46:14 2000
+++ linux.17p9/drivers/macintosh/macserial.c	Fri Jun 16 16:24:56 2000
@@ -129,6 +129,22 @@
 
 #define _INLINE_ inline
 
+#ifdef SERIAL_DEBUG_OPEN
+#define OPNDBG(fmt, arg...)	printk(KERN_INFO fmt , ## arg)
+#else
+#define OPNDBG(fmt, arg...)	do { } while (0)
+#endif
+#ifdef SERIAL_DEBUG_POWER
+#define PWRDBG(fmt, arg...)	printk(KERN_INFO fmt , ## arg)
+#else
+#define PWRDBG(fmt, arg...)	do { } while (0)
+#endif
+#ifdef SERIAL_DEBUG_BAUDS
+#define BAUDBG(fmt, arg...)	printk(KERN_INFO fmt , ## arg)
+#else
+#define BAUDBG(fmt, arg...)	do { } while (0)
+#endif
+
 static void probe_sccs(void);
 static void change_speed(struct mac_serial *info, struct termios *old);
 static void rs_wait_until_sent(struct tty_struct *tty, int timeout);
@@ -318,7 +334,7 @@
 	 * to it. - paulus)
 	 */
 	for (i = 200; i > 0; --i)
-		if (ld_le32(&dma->control) & RUN)
+		if (ld_le32(&dma->status) & RUN)
 			udelay(1);
 }
 
@@ -398,7 +414,7 @@
 			continue;
 		if (tty->flip.count >= TTY_FLIPBUF_SIZE)
 			tty_flip_buffer_push(tty);
-			
+
 		if (tty->flip.count >= TTY_FLIPBUF_SIZE) {
 			static int flip_buf_ovf;
 			if (++flip_buf_ovf <= 1)
@@ -489,7 +505,7 @@
 			if (info->tx_stopped) {
 #ifdef SERIAL_DEBUG_FLOW
 				printk("CTS up\n");
-#endif			
+#endif
 				info->tx_stopped = 0;
 				if (!info->tx_active)
 					transmit_chars(info);
@@ -497,7 +513,7 @@
 		} else {
 #ifdef SERIAL_DEBUG_FLOW
 			printk("CTS down\n");
-#endif			
+#endif
 			info->tx_stopped = 1;
 		}
 	}
@@ -520,7 +536,7 @@
 	    == virt_to_bus(info->rx_cmds[info->rx_cbuf] + 1))
 		where -= in_le16(&info->rx->res_count);
 	where--;
-	
+
 	stat = read_zsreg(info->zs_channel, R1);
 
 	flag = stat_to_flag(stat);
@@ -566,7 +582,7 @@
 #ifdef SERIAL_DEBUG_INTR
 		printk("rs_interrupt: irq %d, zs_intreg 0x%x\n",
 		       irq, (int)zs_intreg);
-#endif	
+#endif
 
 		if ((zs_intreg & CHAN_IRQMASK) == 0)
 			break;
@@ -643,7 +659,7 @@
 
 	if (serial_paranoia_check(info, tty->device, "rs_stop"))
 		return;
-	
+
 #if 0
 	save_flags(flags); cli();
 	if (info->curregs[5] & TxENAB) {
@@ -659,7 +675,7 @@
 {
 	struct mac_serial *info = (struct mac_serial *)tty->driver_data;
 	unsigned long flags;
-	
+
 #ifdef SERIAL_DEBUG_STOP
 	printk("rs_start %ld....\n", 
 	       tty->ldisc.chars_in_buffer(tty));
@@ -667,7 +683,7 @@
 
 	if (serial_paranoia_check(info, tty->device, "rs_start"))
 		return;
-	
+
 	save_flags(flags); cli();
 #if 0
 	if (info->xmit_cnt && info->xmit_buf && !(info->curregs[5] & TxENAB)) {
@@ -701,7 +717,7 @@
 {
 	struct mac_serial	*info = (struct mac_serial *) private_;
 	struct tty_struct	*tty;
-	
+
 	tty = info->tty;
 	if (!tty)
 		return;
@@ -719,14 +735,10 @@
 {
 	int delay;
 
-#ifdef SERIAL_DEBUG_OPEN
-	printk("startup() (ttyS%d, irq %d)\n", info->line, info->irq);
-#endif
+	OPNDBG("startup() (ttyS%d, irq %d)\n", info->line, info->irq);
  
 	if (info->flags & ZILOG_INITIALIZED) {
-#ifdef SERIAL_DEBUG_OPEN
-		printk(" -> already inited\n");
-#endif
+		OPNDBG(" -> already inited\n");
  		return 0;
 	}
 
@@ -736,22 +748,17 @@
 			return -ENOMEM;
 	}
 
-#ifdef SERIAL_DEBUG_OPEN
-	printk("starting up ttyS%d (irq %d)...\n", info->line, info->irq);
-#endif
+	OPNDBG("starting up ttyS%d (irq %d)...\n", info->line, info->irq);
 
 	delay = set_scc_power(info, 1);
-	
+
 	setup_scc(info);
 
-#ifdef SERIAL_DEBUG_OPEN
-	printk("enabling IRQ on ttyS%d (irq %d)...\n", info->line, info->irq);
-#endif
+	OPNDBG("enabling IRQ on ttyS%d (irq %d)...\n", info->line, info->irq);
 
 	info->flags |= ZILOG_INITIALIZED;
 	enable_irq(info->irq);
 	if (info->dma_initted) {
-//		enable_irq(info->tx_dma_irq);
 		enable_irq(info->rx_dma_irq);
 	}
 
@@ -874,8 +881,6 @@
 	volatile struct dbdma_cmd *cd;
 	unsigned char *p;
 
-//printk(KERN_DEBUG "SCC: dma_init\n");
-
 	info->rx_nbuf = 8;
 
 	/* various mem set up */
@@ -951,12 +956,10 @@
 static int setup_scc(struct mac_serial * info)
 {
 	unsigned long flags;
-	
-#ifdef SERIAL_DEBUG_OPEN
-	printk("setting up ttys%d SCC...\n", info->line);
-#endif
 
-	save_flags(flags); cli(); /* Disable interrupts */	
+	OPNDBG("setting up ttys%d SCC...\n", info->line);
+
+	save_flags(flags); cli(); /* Disable interrupts */
 
 	/*
 	 * Reset the chip.
@@ -987,7 +990,8 @@
 	/*
 	 * Turn on RTS and DTR.
 	 */
-	zs_rtsdtr(info, 1);
+	if (!info->is_irda)
+		zs_rtsdtr(info, 1);
 
 	/*
 	 * Finally, enable sequencing and interrupts
@@ -1051,16 +1055,11 @@
  */
 static void shutdown(struct mac_serial * info)
 {
-#ifdef SERIAL_DEBUG_OPEN
-	printk("Shutting down serial port %d (irq %d)....\n", info->line,
+	OPNDBG("Shutting down serial port %d (irq %d)....\n", info->line,
 	       info->irq);
-#endif
-	
+
 	if (!(info->flags & ZILOG_INITIALIZED)) {
-#ifdef SERIAL_DEBUG_OPEN
-		printk("(already shutdown)\n");
-#endif
-	
+		OPNDBG("(already shutdown)\n");
 		return;
 	}
 
@@ -1124,86 +1123,63 @@
 	/* The timings looks strange but that's the ones MacOS seems
 	   to use for the internal modem. I think we can use a lot faster
 	   ones, at least whe not using the modem, this should be tested.
-	 */				
+	 */
 	if (state) {
-#ifdef SERIAL_DEBUG_POWER
-		printk(KERN_INFO "ttyS%02d: powering up hardware\n", info->line);
-#endif
+		PWRDBG("ttyS%02d: powering up hardware\n", info->line);
 		if (feature_test(info->dev_node, FEATURE_Serial_enable) == 0) {
-			feature_clear(info->dev_node, FEATURE_Serial_reset);
-			mdelay(5);
 			feature_set(info->dev_node, FEATURE_Serial_enable);
+			mdelay(10);
+			feature_set(info->dev_node, FEATURE_Serial_reset);
+			mdelay(15);
+			feature_clear(info->dev_node, FEATURE_Serial_reset);
+			mdelay(10);
 		}
 		if (info->zs_chan_a == info->zs_channel)
 			feature_set(info->dev_node, FEATURE_Serial_IO_A);
 		else
 			feature_set(info->dev_node, FEATURE_Serial_IO_B);
-		delay = 1;
-		
+		delay = 10;
 		if (info->is_cobalt_modem){
-			feature_set(info->dev_node, FEATURE_Modem_Reset);
+			mdelay(300);
+			feature_set(info->dev_node, FEATURE_Modem_power);
 	   		mdelay(5);
-			feature_clear(info->dev_node, FEATURE_Modem_Reset);
+			feature_clear(info->dev_node, FEATURE_Modem_power);
+	   		mdelay(10);
+			feature_set(info->dev_node, FEATURE_Modem_power);
 			delay = 2500;	/* wait for 2.5s before using */
 		}
 #ifdef CONFIG_PMAC_PBOOK
-		if (info->is_pwbk_ir)
+		if (info->is_irda)
 			pmu_enable_irled(1);
 #endif /* CONFIG_PMAC_PBOOK */
 	} else {
-#ifdef SERIAL_DEBUG_POWER
-		printk(KERN_INFO "ttyS%02d: shutting down hardware\n", info->line);
-#endif
-#ifdef CONFIG_KGDB
-		if (info->kgdb_channel) {
-#ifdef SERIAL_DEBUG_POWER
-			printk(KERN_INFO "        (canceled by KGDB)\n");
-#endif
-			return 0;
-		}
-#endif
-#ifdef CONFIG_XMON
-		if (!info->is_cobalt_modem) {
-#ifdef SERIAL_DEBUG_POWER
-			printk(KERN_INFO "        (canceled by XMON)\n");
-#endif
-			return 0;
-		}
-#endif
+		PWRDBG("ttyS%02d: shutting down hardware\n", info->line);
 		if (info->is_cobalt_modem) {
-#ifdef SERIAL_DEBUG_POWER
-			printk(KERN_INFO "ttyS%02d: shutting down modem\n", info->line);
-#endif
-			feature_set(info->dev_node, FEATURE_Modem_Reset);
-			mdelay(15);
-			feature_clear(info->dev_node, FEATURE_Modem_Reset);
-			mdelay(25);
+			PWRDBG("ttyS%02d: shutting down modem\n", info->line);
+			feature_clear(info->dev_node, FEATURE_Modem_power);
+			mdelay(10);
 		}
 #ifdef CONFIG_PMAC_PBOOK
-		if (info->is_pwbk_ir)
+		if (info->is_irda)
 			pmu_enable_irled(0);
 #endif /* CONFIG_PMAC_PBOOK */
-			
-		if (info->zs_chan_a == info->zs_channel) {
-#ifdef SERIAL_DEBUG_POWER
-			printk(KERN_INFO "ttyS%02d: shutting down SCC channel A\n", info->line);
-#endif
+
+		if (info->zs_chan_a == info->zs_channel && !info->is_irda) {
+			PWRDBG("ttyS%02d: shutting down SCC channel A\n", info->line);
 			feature_clear(info->dev_node, FEATURE_Serial_IO_A);
-		} else {
-#ifdef SERIAL_DEBUG_POWER
-			printk(KERN_INFO "ttyS%02d: shutting down SCC channel B\n", info->line);
-#endif
+		} else if (!info->is_irda) {
+			PWRDBG("ttyS%02d: shutting down SCC channel B\n", info->line);
 			feature_clear(info->dev_node, FEATURE_Serial_IO_B);
 		}
 		/* XXX for now, shut down SCC core only on powerbooks */
 		if (is_powerbook
 		    && !(feature_test(info->dev_node, FEATURE_Serial_IO_A) ||
 			 feature_test(info->dev_node, FEATURE_Serial_IO_B))) {
-#ifdef SERIAL_DEBUG_POWER
-			printk(KERN_INFO "ttyS%02d: shutting down SCC core\n", info->line);
-#endif
+			PWRDBG("ttyS%02d: shutting down SCC core\n", info->line);
 			feature_set(info->dev_node, FEATURE_Serial_reset);
-			mdelay(10);
+			mdelay(15);
+			feature_clear(info->dev_node, FEATURE_Serial_reset);
+			mdelay(25);
 			feature_clear(info->dev_node, FEATURE_Serial_enable);
 			mdelay(5);
 		}
@@ -1211,6 +1187,113 @@
 	return delay;
 }
 
+static void irda_rts_pulses(struct mac_serial *info, int w)
+{
+	unsigned long flags;
+
+	udelay(w);
+	save_flags(flags); cli();
+	write_zsreg(info->zs_channel, 5, Tx8 | TxENAB);
+	udelay(2);
+	write_zsreg(info->zs_channel, 5, Tx8 | TxENAB | RTS);
+	udelay(8);
+	write_zsreg(info->zs_channel, 5, Tx8 | TxENAB);
+	udelay(4);
+	write_zsreg(info->zs_channel, 5, Tx8 | TxENAB | RTS);
+	restore_flags(flags);
+}
+
+/*
+ * Set the irda codec on the imac to the specified baud rate.
+ */
+static void irda_setup(struct mac_serial *info)
+{
+	int code, speed, t;
+	unsigned long flags;
+
+	speed = info->tty->termios->c_cflag & CBAUD;
+	if (speed < B2400 || speed > B115200)
+		return;
+	code = 0x4d + B115200 - speed;
+
+	/* disable serial interrupts and receive DMA */
+	write_zsreg(info->zs_channel, 1, info->curregs[1] & ~0x9f);
+
+	/* wait for transmitter to drain */
+	t = 10000;
+	while ((read_zsreg(info->zs_channel, 0) & Tx_BUF_EMP) == 0
+	       || (read_zsreg(info->zs_channel, 1) & ALL_SNT) == 0) {
+		if (--t <= 0) {
+			printk(KERN_ERR "transmitter didn't drain\n");
+			return;
+		}
+		udelay(10);
+	}
+	udelay(100);
+
+	/* set to 8 bits, no parity, 19200 baud, RTS on, DTR off */
+	write_zsreg(info->zs_channel, 4, X16CLK | SB1);
+	write_zsreg(info->zs_channel, 11, TCBR | RCBR);
+	t = BPS_TO_BRG(19200, ZS_CLOCK/16);
+	write_zsreg(info->zs_channel, 12, t);
+	write_zsreg(info->zs_channel, 13, t >> 8);
+	write_zsreg(info->zs_channel, 14, BRENABL);
+	write_zsreg(info->zs_channel, 3, Rx8 | RxENABLE);
+	write_zsreg(info->zs_channel, 5, Tx8 | TxENAB | RTS);
+
+	/* set TxD low for ~104us and pulse RTS */
+	udelay(1000);
+	save_flags(flags); cli();
+	write_zsdata(info->zs_channel, 0xfe);
+	irda_rts_pulses(info, 150);
+	restore_flags(flags);
+	irda_rts_pulses(info, 180);
+	irda_rts_pulses(info, 50);
+	udelay(100);
+
+	/* assert DTR, wait 30ms, talk to the chip */
+	write_zsreg(info->zs_channel, 5, Tx8 | TxENAB | RTS | DTR);
+	udelay(30000);
+	while (read_zsreg(info->zs_channel, 0) & Rx_CH_AV)
+		read_zsdata(info->zs_channel);
+
+	write_zsdata(info->zs_channel, 1);
+	t = 1000;
+	while ((read_zsreg(info->zs_channel, 0) & Rx_CH_AV) == 0) {
+		if (--t <= 0) {
+			printk(KERN_ERR "irda_setup timed out on 1st byte\n");
+			goto out;
+		}
+		udelay(10);
+	}
+	t = read_zsdata(info->zs_channel);
+	if (t != 4)
+		printk(KERN_ERR "irda_setup 1st byte = %x\n", t);
+
+	write_zsdata(info->zs_channel, code);
+	t = 1000;
+	while ((read_zsreg(info->zs_channel, 0) & Rx_CH_AV) == 0) {
+		if (--t <= 0) {
+			printk(KERN_ERR "irda_setup timed out on 2nd byte\n");
+			goto out;
+		}
+		udelay(10);
+	}
+	t = read_zsdata(info->zs_channel);
+	if (t != code)
+		printk(KERN_ERR "irda_setup 2nd byte = %x (%x)\n", t, code);
+
+	/* Drop DTR again and do some more RTS pulses */
+ out:
+	udelay(100);
+	write_zsreg(info->zs_channel, 5, Tx8 | TxENAB | RTS);
+	irda_rts_pulses(info, 80);
+
+	/* We should be right to go now.  We assume that load_zsregs
+	   will get called soon to load up the correct baud rate etc. */
+	info->curregs[5] = (info->curregs[5] | RTS) & ~DTR;
+	info->pendregs[5] = info->curregs[5];
+}
 
 /*
  * This routine is called to set the UART divisor registers to match
@@ -1218,7 +1301,6 @@
  */
 static void change_speed(struct mac_serial *info, struct termios *old_termios)
 {
-	unsigned short port;
 	unsigned cflag;
 	int	bits;
 	int	brg, baud;
@@ -1226,8 +1308,6 @@
 
 	if (!info->tty || !info->tty->termios)
 		return;
-	if (!(port = info->port))
-		return;
 
 	cflag = info->tty->termios->c_cflag;
 	baud = tty_get_baud_rate(info->tty);
@@ -1250,9 +1330,7 @@
 	info->zs_baud = baud;
 	info->clk_divisor = 16;
 
-#ifdef SERIAL_DEBUG_BAUDS
-	printk("set speed to %d bds, ", baud);
-#endif
+	BAUDBG("set speed to %d bds, ", baud);
 
 	switch (baud) {
 	case ZS_CLOCK/16:	/* 230400 */
@@ -1279,34 +1357,26 @@
 	case CS5:
 		info->curregs[3] |= Rx5;
 		info->curregs[5] |= Tx5;
-#ifdef SERIAL_DEBUG_BAUDS
-		printk("5 bits, ");
-#endif
+		BAUDBG("5 bits, ");
 		bits = 7;
 		break;
 	case CS6:
 		info->curregs[3] |= Rx6;
 		info->curregs[5] |= Tx6;
-#ifdef SERIAL_DEBUG_BAUDS
-		printk("6 bits, ");
-#endif
+		BAUDBG("6 bits, ");
 		bits = 8;
 		break;
 	case CS7:
 		info->curregs[3] |= Rx7;
 		info->curregs[5] |= Tx7;
-#ifdef SERIAL_DEBUG_BAUDS
-		printk("7 bits, ");
-#endif
+		BAUDBG("7 bits, ");
 		bits = 9;
 		break;
 	case CS8:
 	default: /* defaults to 8 bits */
 		info->curregs[3] |= Rx8;
 		info->curregs[5] |= Tx8;
-#ifdef SERIAL_DEBUG_BAUDS
-		printk("8 bits, ");
-#endif
+		BAUDBG("8 bits, ");
 		bits = 10;
 		break;
 	}
@@ -1317,21 +1387,15 @@
 	if (cflag & CSTOPB) {
 		info->curregs[4] |= SB2;
 		bits++;
-#ifdef SERIAL_DEBUG_BAUDS
-		printk("2 stop, ");
-#endif
+		BAUDBG("2 stop, ");
 	} else {
 		info->curregs[4] |= SB1;
-#ifdef SERIAL_DEBUG_BAUDS
-		printk("1 stop, ");
-#endif
+		BAUDBG("1 stop, ");
 	}
 	if (cflag & PARENB) {
 		bits++;
  		info->curregs[4] |= PAR_ENA;
-#ifdef SERIAL_DEBUG_BAUDS
-		printk("parity, ");
-#endif
+		BAUDBG("parity, ");
 	}
 	if (!(cflag & PARODD)) {
 		info->curregs[4] |= PAR_EVEN;
@@ -1361,9 +1425,12 @@
 	info->timeout = ((info->xmit_fifo_size*HZ*bits) / baud);
 	info->timeout += HZ/50+1;	/* Add .02 seconds of slop */
 
-#ifdef SERIAL_DEBUG_BAUDS
-	printk("timeout=%d/%ds, base:%d\n", (int)info->timeout, (int)HZ, (int)info->baud_base);
-#endif
+	BAUDBG("timeout=%d/%ds, base:%d\n", (int)info->timeout, (int)HZ,
+	       (int)info->baud_base);
+
+	/* set the irda codec to the right rate */
+	if (info->is_irda)
+		irda_setup(info);
 
 	/* Load up the new values */
 	load_zsregs(info->zs_channel, info->curregs);
@@ -1431,7 +1498,7 @@
 	} else {
 		while (1) {
 			save_flags(flags);
-			cli();		
+			cli();
 			c = MIN(count,
 				MIN(SERIAL_XMIT_SIZE - info->xmit_cnt - 1,
 				    SERIAL_XMIT_SIZE - info->xmit_head));
@@ -1459,7 +1526,7 @@
 {
 	struct mac_serial *info = (struct mac_serial *)tty->driver_data;
 	int	ret;
-				
+
 	if (serial_paranoia_check(info, tty->device, "rs_write_room"))
 		return 0;
 	ret = SERIAL_XMIT_SIZE - info->xmit_cnt - 1;
@@ -1471,7 +1538,7 @@
 static int rs_chars_in_buffer(struct tty_struct *tty)
 {
 	struct mac_serial *info = (struct mac_serial *)tty->driver_data;
-				
+
 	if (serial_paranoia_check(info, tty->device, "rs_chars_in_buffer"))
 		return 0;
 	return info->xmit_cnt;
@@ -1481,7 +1548,7 @@
 {
 	struct mac_serial *info = (struct mac_serial *)tty->driver_data;
 	unsigned long flags;
-				
+
 	if (serial_paranoia_check(info, tty->device, "rs_flush_buffer"))
 		return;
 	save_flags(flags); cli();
@@ -1507,13 +1574,13 @@
 	struct mac_serial *info = (struct mac_serial *)tty->driver_data;
 	unsigned long flags;
 #ifdef SERIAL_DEBUG_THROTTLE
-	
+
 	printk("throttle %ld....\n",tty->ldisc.chars_in_buffer(tty));
 #endif
 
 	if (serial_paranoia_check(info, tty->device, "rs_throttle"))
 		return;
-	
+
 	if (I_IXOFF(tty)) {
 		save_flags(flags); cli();
 		info->x_char = STOP_CHAR(tty);
@@ -1543,13 +1610,13 @@
 	struct mac_serial *info = (struct mac_serial *)tty->driver_data;
 	unsigned long flags;
 #ifdef SERIAL_DEBUG_THROTTLE
-	
+
 	printk("unthrottle %s: %d....\n",tty->ldisc.chars_in_buffer(tty));
 #endif
 
 	if (serial_paranoia_check(info, tty->device, "rs_unthrottle"))
 		return;
-	
+
 	if (I_IXOFF(tty)) {
 		save_flags(flags); cli();
 		if (info->x_char)
@@ -1726,8 +1793,6 @@
 
 	if (serial_paranoia_check(info, tty->device, "rs_break"))
 		return;
-	if (!info->port)
-		return;
 
 	save_flags(flags); cli();
 	if (break_state == -1)
@@ -1755,7 +1820,7 @@
 		if (tty->flags & (1 << TTY_IO_ERROR))
 		    return -EIO;
 	}
-	
+
 	switch (cmd) {
 		case TIOCMGET:
 			return get_modem_info(info, (unsigned int *) arg);
@@ -1777,7 +1842,7 @@
 					 info, sizeof(struct mac_serial)))
 				return -EFAULT;
 			return 0;
-			
+
 		default:
 			return -ENOIOCTLCMD;
 		}
@@ -1816,18 +1881,16 @@
 
 	if (!info || serial_paranoia_check(info, tty->device, "rs_close"))
 		return;
-	
+
 	save_flags(flags); cli();
-	
+
 	if (tty_hung_up_p(filp)) {
 		MOD_DEC_USE_COUNT;
 		restore_flags(flags);
 		return;
 	}
-	
-#ifdef SERIAL_DEBUG_OPEN
-	printk("rs_close ttys%d, count = %d\n", info->line, info->count);
-#endif
+
+	OPNDBG("rs_close ttys%d, count = %d\n", info->line, info->count);
 	if ((tty->count == 1) && (info->count != 1)) {
 		/*
 		 * Uh, oh.  tty->count is 1, which means that the tty
@@ -1863,9 +1926,7 @@
 	 * Now we wait for the transmit buffer to clear; and we notify 
 	 * the line discipline to only process XON/XOFF characters.
 	 */
-#ifdef SERIAL_DEBUG_OPEN
-	printk("waiting end of Tx... (timeout:%d)\n", info->closing_wait);
-#endif
+	OPNDBG("waiting end of Tx... (timeout:%d)\n", info->closing_wait);
 	tty->closing = 1;
 	if (info->closing_wait != ZILOG_CLOSING_WAIT_NONE) {
 		restore_flags(flags);
@@ -1889,9 +1950,7 @@
 		 * Before we drop DTR, make sure the SCC transmitter
 		 * has completely drained.
 		 */
-#ifdef SERIAL_DEBUG_OPEN
-		printk("waiting end of Rx...\n");
-#endif
+		OPNDBG("waiting end of Rx...\n");
 		restore_flags(flags);
 		rs_wait_until_sent(tty, info->timeout);
 		save_flags(flags); cli();
@@ -2031,7 +2090,7 @@
 		info->flags |= ZILOG_CALLOUT_ACTIVE;
 		return 0;
 	}
-	
+
 	/*
 	 * If non-blocking mode is set, or the port is not enabled,
 	 * then make the check up front and then exit.
@@ -2051,7 +2110,7 @@
 		if (tty->termios->c_cflag & CLOCAL)
 			do_clocal = 1;
 	}
-	
+
 	/*
 	 * Block waiting for the carrier detect and the line to become
 	 * free (i.e., not in use by the callout).  While we are in
@@ -2061,10 +2120,8 @@
 	 */
 	retval = 0;
 	add_wait_queue(&info->open_wait, &wait);
-#ifdef SERIAL_DEBUG_OPEN
-	printk("block_til_ready before block: ttys%d, count = %d\n",
+	OPNDBG("block_til_ready before block: ttys%d, count = %d\n",
 	       info->line, info->count);
-#endif
 	cli();
 	if (!tty_hung_up_p(filp)) 
 		info->count--;
@@ -2073,7 +2130,8 @@
 	while (1) {
 		cli();
 		if (!(info->flags & ZILOG_CALLOUT_ACTIVE) &&
-		    (tty->termios->c_cflag & CBAUD))
+		    (tty->termios->c_cflag & CBAUD) &&
+		    !info->is_irda)
 			zs_rtsdtr(info, 1);
 		sti();
 		current->state = TASK_INTERRUPTIBLE;
@@ -2083,7 +2141,7 @@
 			if (info->flags & ZILOG_HUP_NOTIFY)
 				retval = -EAGAIN;
 			else
-				retval = -ERESTARTSYS;	
+				retval = -ERESTARTSYS;
 #else
 			retval = -EAGAIN;
 #endif
@@ -2097,10 +2155,8 @@
 			retval = -ERESTARTSYS;
 			break;
 		}
-#ifdef SERIAL_DEBUG_OPEN
-		printk("block_til_ready blocking: ttys%d, count = %d\n",
+		OPNDBG("block_til_ready blocking: ttys%d, count = %d\n",
 		       info->line, info->count);
-#endif
 		schedule();
 	}
 	current->state = TASK_RUNNING;
@@ -2108,15 +2164,13 @@
 	if (!tty_hung_up_p(filp))
 		info->count++;
 	info->blocked_open--;
-#ifdef SERIAL_DEBUG_OPEN
-	printk("block_til_ready after blocking: ttys%d, count = %d\n",
+	OPNDBG("block_til_ready after blocking: ttys%d, count = %d\n",
 	       info->line, info->count);
-#endif
 	if (retval)
 		return retval;
 	info->flags |= ZILOG_NORMAL_ACTIVE;
 	return 0;
-}	
+}
 
 /*
  * This routine is called whenever a serial port is opened.  It
@@ -2146,10 +2200,8 @@
 #endif
 	if (serial_paranoia_check(info, tty->device, "rs_open"))
 		return -ENODEV;
-#ifdef SERIAL_DEBUG_OPEN
-	printk("rs_open %s%d, count = %d\n", tty->driver.name, info->line,
+	OPNDBG("rs_open %s%d, count = %d\n", tty->driver.name, info->line,
 	       info->count);
-#endif
 
 	info->count++;
 	tty->driver_data = info;
@@ -2190,10 +2242,8 @@
 
 	retval = block_til_ready(tty, filp, info);
 	if (retval) {
-#ifdef SERIAL_DEBUG_OPEN
-		printk("rs_open returning after block_til_ready with %d\n",
+		OPNDBG("rs_open returning after block_til_ready with %d\n",
 			retval);
-#endif
 		return retval;
 	}
 
@@ -2215,9 +2265,7 @@
 	info->session = current->session;
 	info->pgrp = current->pgrp;
 
-#ifdef SERIAL_DEBUG_OPEN
-	printk("rs_open ttys%d successful...\n", info->line);
-#endif
+	OPNDBG("rs_open ttys%d successful...\n", info->line);
 	return 0;
 }
 
@@ -2239,6 +2287,10 @@
 	struct device_node *ch = zss->dev_node;
 	char *conn;
 	int len;
+	struct slot_names_prop {
+		int	count;
+		char	name[1];
+	} *slots;
 
 	zss->irq = ch->intrs[0].line;
 	zss->has_dma = 0;
@@ -2263,7 +2315,11 @@
 	/* XXX tested only with wallstreet PowerBook,
 	   should do no harm anyway */
 	conn = get_property(ch, "AAPL,connector", &len);
-	zss->is_pwbk_ir = conn && (strcmp(conn, "infrared") == 0);
+	zss->is_irda = conn && (strcmp(conn, "infrared") == 0);
+	/* 1999 Powerbook G3 has slot-names property instead */
+	slots = (struct slot_names_prop *)get_property(ch, "slot-names", &len);
+	if (slots && slots->count > 0 && strcmp(slots->name, "IrDA") == 0)
+		zss->is_irda = 1;
 
 	if (zss->has_dma) {
 		zss->dma_priv = NULL;
@@ -2453,7 +2509,7 @@
 		zs_soft[channel].clk_divisor = 16;
 /* -- we are not sure the SCC is powered ON at this point
  		zs_soft[channel].zs_baud = get_zsbaud(&zs_soft[channel]);
-*/		
+*/
 		zs_soft[channel].zs_baud = 38400;
 
 		/* If console serial line, then enable interrupts. */
@@ -2504,20 +2560,17 @@
 			printk(", port = %s", connector);
 		if (info->is_cobalt_modem)
 			printk(" (cobalt modem)");
-		if (info->is_pwbk_ir)
-			printk(" (powerbook IR)");
+		if (info->is_irda)
+			printk(" (IrDA)");
 		printk("\n");
 
+#ifndef CONFIG_XMON
 #ifdef CONFIG_KGDB
-		if (info->kgdb_channel)
-			continue;
-#endif			
-#ifdef CONFIG_XMON
-		if (!info->is_cobalt_modem)
-			continue;
-#endif			
-		/* By default, disable the port */
-		set_scc_power(info, 0);
+		if (!info->kgdb_channel)
+#endif /* CONFIG_KGDB */
+			/* By default, disable the port */
+			set_scc_power(info, 0);
+#endif /* CONFIG_XMON */
  	}
 	tmp_buf = 0;
 
@@ -2613,7 +2666,7 @@
 			while ((read_zsreg(info->zs_channel, 0) & Tx_BUF_EMP)
                                 == 0)
 				eieio();
-			
+
 			write_zsdata(info->zs_channel, 13);
 		}
 	}
@@ -2922,7 +2975,7 @@
 		probe_sccs();
 
 	set_scc_power(&zs_soft[tty_num], 1);
-	
+
 	zs_kgdbchan = zs_soft[tty_num].zs_channel;
 	zs_soft[tty_num].change_needed = 0;
 	zs_soft[tty_num].clk_divisor = 16;
@@ -2944,12 +2997,12 @@
 serial_notify_sleep(struct pmu_sleep_notifier *self, int when)
 {
 	int i;
-	
+
 	switch (when) {
 	case PBOOK_SLEEP_REQUEST:
 	case PBOOK_SLEEP_REJECT:
 		break;
-		
+
 	case PBOOK_SLEEP_NOW:
 		for (i=0; i<zs_channels_found; i++) {
 			struct mac_serial *info = &zs_soft[i];
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/drivers/macintosh/macserial.h linux.17p9/drivers/macintosh/macserial.h
--- linux.vanilla/drivers/macintosh/macserial.h	Fri Apr 21 12:46:14 2000
+++ linux.17p9/drivers/macintosh/macserial.h	Fri Jun 16 16:24:56 2000
@@ -111,7 +111,7 @@
 	char kgdb_channel;  /* Kgdb is running on this channel */
 	char is_cons;       /* Is this our console. */
 	char is_cobalt_modem;	/* is a gatwick-based cobalt modem */
-	char is_pwbk_ir;	/* is connected to an IR led on powerbooks */
+	char is_irda;		/* is connected to an IrDA codec */
 	unsigned char tx_active; /* character is being xmitted */
 	unsigned char tx_stopped; /* output is suspended */
 
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/drivers/macintosh/mediabay.c linux.17p9/drivers/macintosh/mediabay.c
--- linux.vanilla/drivers/macintosh/mediabay.c	Fri Apr 21 12:46:14 2000
+++ linux.17p9/drivers/macintosh/mediabay.c	Fri Jun 16 16:24:56 2000
@@ -3,6 +3,8 @@
  *
  * Copyright (C) 1998 Paul Mackerras.
  *
+ * Various evolutions by Benjamin Herrenschmidt & Henry Worth
+ *
  *  This program is free software; you can redistribute it and/or
  *  modify it under the terms of the GNU General Public License
  *  as published by the Free Software Foundation; either version
@@ -38,6 +40,14 @@
 #endif
 
 #undef MB_USE_INTERRUPTS
+#undef MB_DEBUG
+#define MB_IGNORE_SIGNALS
+
+#ifdef MB_DEBUG
+#define MBDBG(fmt, arg...)	printk(KERN_INFO fmt , ## arg)
+#else
+#define MBDBG(fmt, arg...)	do { } while (0)
+#endif
 
 struct media_bay_hw {
 	unsigned char	b0;
@@ -48,18 +58,20 @@
 
 struct media_bay_info {
 	volatile struct media_bay_hw*	addr;
+	volatile u8*			extint_gpio;
 	int				content_id;
-	int				previous_id;
-	int				ready;
+	int				state;
 	int				last_value;
 	int				value_count;
-	int				reset_timer;
+	int				timer;
 	struct device_node*		dev_node;
+	int				pismo;	/* New PowerBook3,1 */
+	int				gpio_cache;
 #ifdef CONFIG_BLK_DEV_IDE
 	unsigned long			cd_base;
 	int 				cd_index;
 	int				cd_irq;
-	int				cd_timer;
+	int				cd_retry;
 #endif
 };
 
@@ -68,42 +80,102 @@
 static volatile struct media_bay_info media_bays[MAX_BAYS];
 int media_bay_count = 0;
 
-#define MB_CONTENTS(i)	((in_8(&media_bays[i].addr->contents) >> 4) & 7)
+inline int mb_content(volatile struct media_bay_info *bay)
+{
+        if (bay->pismo) {
+                unsigned char new_gpio = in_8(bay->extint_gpio + 0xe) & 2;
+                if (new_gpio) {
+                	bay->gpio_cache = new_gpio;
+                        return MB_NO;
+                } else if (bay->gpio_cache != new_gpio) {
+                        /* make sure content bits are set */
+                        feature_set(bay->dev_node, FEATURE_Mediabay_content);
+                        udelay(5);
+                        bay->gpio_cache = new_gpio;
+                }
+                return (in_le32((unsigned*)bay->addr) >> 4) & 0xf;
+        } else {
+                int cont = (in_8(&bay->addr->contents) >> 4) & 7;
+                return (cont == 7) ? MB_NO : cont;
+        }
+}
 
 #ifdef CONFIG_BLK_DEV_IDE
 /* check the busy bit in the media-bay ide interface
    (assumes the media-bay contains an ide device) */
+//#define MB_IDE_READY(i)	((inb(media_bays[i].cd_base + 0x70) & 0xc0) == 0x40)
 #define MB_IDE_READY(i)	((inb(media_bays[i].cd_base + 0x70) & 0x80) == 0)
 #endif
 
+/* Note: All delays are not in milliseconds and converted to HZ relative
+ * values by the macro below
+ */
+#define MS_TO_HZ(ms)	((ms * HZ) / 1000)
+
 /*
  * Consider the media-bay ID value stable if it is the same for
- * this many consecutive samples (at intervals of 1/HZ seconds).
+ * this number of milliseconds
+ */
+#define MB_STABLE_DELAY	40
+
+/* Wait after powering up the media bay this delay in ms
+ * timeout bumped for some powerbooks
  */
-#define MB_STABLE_COUNT	4
+#define MB_POWER_DELAY	200
 
 /*
  * Hold the media-bay reset signal true for this many ticks
  * after a device is inserted before releasing it.
  */
-#define MB_RESET_COUNT	40
+#define MB_RESET_DELAY	40
+
+/*
+ * Wait this long after the reset signal is released and before doing
+ * further operations. After this delay, the IDE reset signal is released
+ * too for an IDE device
+ */
+#define MB_SETUP_DELAY	100
 
 /*
  * Wait this many ticks after an IDE device (e.g. CD-ROM) is inserted
- * (or until the device is ready) before registering the IDE interface.
+ * (or until the device is ready) before waiting for busy bit to disappear
+ */
+#define MB_IDE_WAIT	1000
+
+/*
+ * Timeout waiting for busy bit of an IDE device to go down
  */
-#define MB_IDE_WAIT	1500
+#define MB_IDE_TIMEOUT	5000
 
 /*
- * Wait at least this many ticks after resetting an IDE device before
- * believing its ready bit.
+ * Max retries of the full power up/down sequence for an IDE device
  */
-#define MB_IDE_MINWAIT	250
+#define MAX_CD_RETRIES	3
+
+/*
+ * States of a media bay
+ */
+enum {
+	mb_empty = 0,		/* Idle */
+	mb_powering_up,		/* power bit set, waiting MB_POWER_DELAY */
+	mb_enabling_bay,	/* enable bits set, waiting MB_RESET_DELAY */
+	mb_resetting,		/* reset bit unset, waiting MB_SETUP_DELAY */
+	mb_ide_resetting,	/* IDE reset bit unser, waiting MB_IDE_WAIT */
+	mb_ide_waiting,		/* Waiting for BUSY bit to go away until MB_IDE_TIMEOUT */
+	mb_up,			/* Media bay full */
+	mb_powering_down	/* Powering down (avoid too fast down/up) */
+};
 
 static void poll_media_bay(int which);
 static void set_media_bay(int which, int id);
+static void set_mb_power(int which, int onoff);
+static void media_bay_step(int i);
 static int media_bay_task(void *);
 
+#ifdef MB_USE_INTERRUPTS
+static void media_bay_intr(int irq, void *devid, struct pt_regs *regs);
+#endif
+
 /*
  * It seems that the bit for the media-bay interrupt in the IRQ_LEVEL
  * register is always set when there is something in the media bay.
@@ -120,56 +192,69 @@
 {
 	struct device_node *np;
 	int		n,i;
-	
-	for (i=0; i<MAX_BAYS; i++)
-	{
+
+	for (i=0; i<MAX_BAYS; i++) {
 		memset((char *)&media_bays[i], 0, sizeof(struct media_bay_info));
 		media_bays[i].content_id	= -1;
 #ifdef CONFIG_BLK_DEV_IDE
 		media_bays[i].cd_index		= -1;
 #endif
 	}
-	
+
 	np = find_devices("media-bay");
 	n = 0;
-	while(np && (n<MAX_BAYS))
-	{
+	while(np && (n<MAX_BAYS)) {
 		if (np->n_addrs == 0)
 			continue;
 		media_bays[n].addr = (volatile struct media_bay_hw *)
 			ioremap(np->addrs[0].address, sizeof(struct media_bay_hw));
 
+		media_bays[n].pismo = device_is_compatible(np, "keylargo-media-bay");
+		if (media_bays[n].pismo) {
+			if (!np->parent || strcmp(np->parent->name, "mac-io")) {
+				printk(KERN_ERR "Pismo media-bay has no mac-io parent !\n");
+				continue;
+			}
+			media_bays[n].extint_gpio = ioremap(np->parent->addrs[0].address
+				+ 0x58, 0x10);
+		}
+
 #ifdef MB_USE_INTERRUPTS
-		if (np->n_intrs == 0)
-		{
+		if (np->n_intrs == 0) {
 			printk(KERN_ERR "media bay %d has no irq\n",n);
 			continue;
 		}
-		
-		if (request_irq(np_intrs[0].line, media_bay_intr, 0, "Media bay", NULL))
-		{
-			printk(KERN_ERR "Couldn't get IRQ %d for media bay %d\n", irq, n);
+
+		if (request_irq(np->intrs[0].line, media_bay_intr, 0, "Media bay", (void *)n)) {
+			printk(KERN_ERR "Couldn't get IRQ %d for media bay %d\n",
+				np->intrs[0].line, n);
 			continue;
 		}
-#endif	
+#endif
 		media_bay_count++;
-	
-		set_media_bay(n, MB_CONTENTS(n));
-		if (media_bays[n].content_id != MB_NO) {
-			feature_clear(media_bays[n].dev_node, FEATURE_Mediabay_reset);
-			udelay(500);
-		}
-		media_bays[n].ready		= 1;
-		media_bays[n].previous_id	= media_bays[n].content_id;
-		media_bays[n].reset_timer	= 0;
+
 		media_bays[n].dev_node		= np;
-#ifdef CONFIG_BLK_DEV_IDE
-		media_bays[n].cd_timer		= 0;
-#endif
+
+		/* Force an immediate detect */
+		set_mb_power(n,0);
+		mdelay(MB_POWER_DELAY);
+		if(!media_bays[n].pismo)
+			out_8(&media_bays[n].addr->contents, 0x70);
+		mdelay(MB_STABLE_DELAY);
+		media_bays[n].content_id = MB_NO;
+		media_bays[n].last_value = mb_content(&media_bays[n]);
+		media_bays[n].value_count = MS_TO_HZ(MB_STABLE_DELAY);
+		media_bays[n].state = mb_empty;
+		do {
+			mdelay(1000/HZ);
+			media_bay_step(n);
+		} while((media_bays[n].state != mb_empty) &&
+			(media_bays[n].state != mb_up));
+
 		n++;
 		np=np->next;
 	}
-	
+
 	if (media_bay_count)
 	{
 		printk(KERN_INFO "Registered %d media-bay(s)\n", media_bay_count);
@@ -178,21 +263,83 @@
 		pmu_register_sleep_notifier(&mb_sleep_notifier);
 #endif /* CONFIG_PMAC_PBOOK */
 
-		kernel_thread(media_bay_task, NULL, 0);
+		kernel_thread(media_bay_task, NULL,
+			      CLONE_FS | CLONE_FILES | CLONE_SIGHAND);
 	}
 }
 
-#if 0
+#ifdef MB_USE_INTERRUPTS
 static void
 media_bay_intr(int irq, void *devid, struct pt_regs *regs)
 {
-	int id = MB_CONTENTS();
-
-	if (id == MB_NO)
-		set_media_bay(id);
 }
 #endif
 
+static void
+set_mb_power(int which, int onoff)
+{
+	volatile struct media_bay_info*	mb = &media_bays[which];
+
+	if (onoff) {
+		feature_set(mb->dev_node, FEATURE_Mediabay_power);
+		udelay(10);
+		feature_set(mb->dev_node, FEATURE_Mediabay_reset);
+		udelay(10);
+		mb->state = mb_powering_up;
+		MBDBG("mediabay%d: powering up\n", which);
+	} else {
+		feature_clear(mb->dev_node, FEATURE_Mediabay_floppy_enable);
+		if (mb->pismo)
+			feature_clear(mb->dev_node, FEATURE_IDE0_enable);
+		else
+			feature_clear(mb->dev_node, FEATURE_IDE1_enable);
+		feature_clear(mb->dev_node, FEATURE_Mediabay_IDE_switch);
+		feature_clear(mb->dev_node, FEATURE_Mediabay_PCI_enable);
+		feature_clear(mb->dev_node, FEATURE_SWIM3_enable);
+		feature_clear(mb->dev_node, FEATURE_Mediabay_power);
+		mb->state = mb_powering_down;
+		MBDBG("mediabay%d: powering down\n", which);
+	}
+	mb->timer = MS_TO_HZ(MB_POWER_DELAY);
+}
+
+static void
+set_media_bay(int which, int id)
+{
+	volatile struct media_bay_info* bay;
+
+	bay = &media_bays[which];
+
+	switch (id) {
+	case MB_CD:
+		if (bay->pismo) {
+			feature_set(bay->dev_node, FEATURE_Mediabay_IDE_switch);
+			udelay(10);
+			feature_set(bay->dev_node, FEATURE_IDE0_enable);
+			udelay(10);
+			feature_set(bay->dev_node, FEATURE_IDE0_reset);
+		} else {
+			feature_set(bay->dev_node, FEATURE_IDE1_enable);
+			udelay(10);
+			feature_set(bay->dev_node, FEATURE_IDE1_reset);
+		}
+		printk(KERN_INFO "media bay %d contains a CD-ROM drive\n", which);
+		break;
+	case MB_FD:
+	case MB_FD1:
+		feature_set(bay->dev_node, FEATURE_Mediabay_floppy_enable);
+		feature_set(bay->dev_node, FEATURE_SWIM3_enable);
+		printk(KERN_INFO "media bay %d contains a floppy disk drive\n", which);
+		break;
+	case MB_NO:
+		break;
+	default:
+		printk(KERN_INFO "media bay %d contains an unknown device (%d)\n",
+		       which, id);
+		break;
+	}
+}
+
 int
 check_media_bay(struct device_node *which_bay, int what)
 {
@@ -202,7 +349,7 @@
 	for (i=0; i<media_bay_count; i++)
 		if (which_bay == media_bays[i].dev_node)
 		{
-			if ((what == media_bays[i].content_id) && media_bays[i].ready)
+			if ((what == media_bays[i].content_id) && media_bays[i].state == mb_up)
 				return 0;
 			media_bays[i].cd_index = -1;
 			return -EINVAL;
@@ -220,13 +367,13 @@
 	for (i=0; i<media_bay_count; i++)
 		if (base == media_bays[i].cd_base)
 		{
-			if ((what == media_bays[i].content_id) && media_bays[i].ready)
+			if ((what == media_bays[i].content_id) && media_bays[i].state == mb_up)
 				return 0;
 			media_bays[i].cd_index = -1;
 			return -EINVAL;
 		} 
 #endif
-	
+
 	return -ENODEV;
 }
 
@@ -240,17 +387,138 @@
 	for (i=0; i<media_bay_count; i++)
 		if (which_bay == media_bays[i].dev_node)
 		{
+			int timeout = 5000;
+
  			media_bays[i].cd_base	= base;
 			media_bays[i].cd_irq	= irq;
-			media_bays[i].cd_index	= index;
-			printk(KERN_DEBUG "Registered ide %d for media bay %d\n", index, i);			
-			return 0;
+
+			if ((MB_CD != media_bays[i].content_id) || media_bays[i].state != mb_up)
+				return 0;
+
+			printk(KERN_DEBUG "Registered ide %d for media bay %d\n", index, i);
+			do {
+				if (MB_IDE_READY(i)) {
+					media_bays[i].cd_index	= index;
+					return 0;
+				}
+				mdelay(1);
+			} while(--timeout);
+			printk(KERN_DEBUG "Timeount waiting IDE in bay %d\n", i);
+			return -ENODEV;
 		} 
 #endif
-	
+
 	return -ENODEV;
 }
 
+static void
+media_bay_step(int i)
+{
+	volatile struct media_bay_info* bay = &media_bays[i];
+
+	/* We don't poll when powering down */
+	if (bay->state != mb_powering_down)
+	    poll_media_bay(i);
+
+	/* If timer expired or polling IDE busy, run state machine */
+	if ((bay->state != mb_ide_waiting) && (bay->timer != 0) && ((--bay->timer) != 0))
+	    return;
+
+	switch(bay->state) {
+	case mb_powering_up:
+	    	set_media_bay(i, bay->last_value);
+	    	bay->timer = MS_TO_HZ(MB_RESET_DELAY);
+	    	bay->state = mb_enabling_bay;
+		MBDBG("mediabay%d: enabling (kind:%d)\n", i, bay->content_id);
+		break;
+	case mb_enabling_bay:
+	    	feature_clear(bay->dev_node, FEATURE_Mediabay_reset);
+	    	bay->timer = MS_TO_HZ(MB_SETUP_DELAY);
+	    	bay->state = mb_resetting;
+		MBDBG("mediabay%d: waiting reset (kind:%d)\n", i, bay->content_id);
+	    	break;
+	    
+	case mb_resetting:
+		if (bay->content_id != MB_CD) {
+			MBDBG("mediabay%d: bay is up (kind:%d)\n", i, bay->content_id);
+			bay->state = mb_up;
+			break;
+	    	}
+#ifdef CONFIG_BLK_DEV_IDE
+		MBDBG("mediabay%d: waiting IDE reset (kind:%d)\n", i, bay->content_id);
+		if (bay->pismo)
+	    		feature_clear(bay->dev_node, FEATURE_IDE0_reset);
+		else
+	    		feature_clear(bay->dev_node, FEATURE_IDE1_reset);
+	    	bay->timer = MS_TO_HZ(MB_IDE_WAIT);
+	    	bay->state = mb_ide_resetting;
+#else
+		printk(KERN_DEBUG "media-bay %d is ide (not compiled in kernel)\n", i);
+		set_mb_power(i, 0);
+#endif // #ifdef CONFIG_BLK_DEV_IDE
+	    	break;
+	    
+#ifdef CONFIG_BLK_DEV_IDE
+	case mb_ide_resetting:
+	    	bay->timer = MS_TO_HZ(MB_IDE_TIMEOUT);
+	    	bay->state = mb_ide_waiting;
+		MBDBG("mediabay%d: waiting IDE ready (kind:%d)\n", i, bay->content_id);
+	    	break;
+	    
+	case mb_ide_waiting:
+	    	if (bay->cd_base == 0) {
+			bay->timer = 0;
+			bay->state = mb_up;
+			MBDBG("mediabay%d: up before IDE init\n", i);
+			break;
+	    	} else if (MB_IDE_READY(i)) {
+			bay->timer = 0;
+			bay->state = mb_up;
+			if (bay->cd_index < 0)
+				bay->cd_index = ide_register(bay->cd_base, 0, bay->cd_irq);
+			if (bay->cd_index == -1) {
+				/* We eventually do a retry */
+				bay->cd_retry++;
+				printk("IDE register error\n");
+				set_mb_power(i, 0);
+			} else {
+				printk(KERN_DEBUG "media-bay %d is ide %d\n", i, bay->cd_index);
+				MBDBG("mediabay %d IDE ready\n", i);
+			}
+			break;
+	    	}
+	    	if (bay->timer == 0) {
+			printk("\nIDE Timeout in bay %d !\n", i);
+			MBDBG("mediabay%d: nIDE Timeout !\n", i);
+			set_mb_power(i, 0);
+	    	}
+		break;
+#endif // #ifdef CONFIG_BLK_DEV_IDE
+
+	case mb_powering_down:
+	    	bay->state = mb_empty;
+#ifdef CONFIG_BLK_DEV_IDE
+    	        if (bay->cd_index >= 0) {
+			printk(KERN_DEBUG "Unregistering mb %d ide, index:%d\n", i,
+			       bay->cd_index);
+			ide_unregister(bay->cd_index);
+			bay->cd_index = -1;
+		}
+	    	if (bay->cd_retry) {
+			if (bay->cd_retry > MAX_CD_RETRIES) {
+				/* Should add an error sound (sort of beep in dmasound) */
+				printk("\nmedia-bay %d, IDE device badly inserted or unrecognised\n", i);
+			} else {
+				/* Force a new power down/up sequence */
+				bay->content_id = MB_NO;
+			}
+	    	}
+#endif	    
+		MBDBG("mediabay%d: end of power down\n", i);
+	    	break;
+	}
+}
+
 /*
  * This procedure runs as a kernel thread to poll the media bay
  * once each tick and register and unregister the IDE interface
@@ -260,128 +528,57 @@
 int
 media_bay_task(void *x)
 {
-	volatile struct media_bay_info* bay;
 	int	i = 0;
-	
+
 	strcpy(current->comm, "media-bay");
-	for (;;)
-	{
-		bay = &media_bays[i];
-		poll_media_bay(i);
-		if (bay->content_id != bay->previous_id) {
-			bay->reset_timer = (bay->content_id != MB_NO) ?
-				MB_RESET_COUNT: 0;
-			bay->ready = 0;
-#ifdef CONFIG_BLK_DEV_IDE
-			bay->cd_timer = 0;
-			if (bay->content_id != MB_CD && bay->cd_index >= 0) {
-				printk(KERN_DEBUG "Unregistering mb %d ide, index:%d\n", i, bay->cd_index);
-				ide_unregister(bay->cd_index);
-				bay->cd_index = -1;
-			}
-#endif
-		} else if (bay->reset_timer) {
-			if (--bay->reset_timer == 0) {
- 				feature_clear(bay->dev_node, FEATURE_Mediabay_reset);
-				bay->ready = 1;
-#ifdef CONFIG_BLK_DEV_IDE
-				bay->cd_timer = 0;
-				if (bay->content_id == MB_CD && bay->cd_base != 0)
-					bay->cd_timer = MB_IDE_WAIT;
+#ifdef MB_IGNORE_SIGNALS
+	sigfillset(&current->blocked);
 #endif
-			}
-#ifdef CONFIG_BLK_DEV_IDE
-		} else if (bay->cd_timer
-			   && (--bay->cd_timer == 0
-			       || (bay->cd_timer < MB_IDE_WAIT - MB_IDE_MINWAIT
-				   && MB_IDE_READY(i)))
-			   && bay->cd_index < 0) {
-			bay->cd_timer = 0;
-			printk(KERN_DEBUG "Registering IDE, base:0x%08lx, irq:%d\n", bay->cd_base, bay->cd_irq);
-			printk("\n");
-			bay->cd_index = ide_register(bay->cd_base, 0, bay->cd_irq);
-			if (bay->cd_index == -1)
-				printk("\nCD-ROM badly inserted. Remove it and try again !\n");
-			else
-				printk(KERN_DEBUG "media-bay %d is ide %d\n", i, bay->cd_index);
-#endif
-		}
 
-		bay->previous_id = bay->content_id;
-		if (++i >= media_bay_count) {
-			i = 0;
-			current->state = TASK_INTERRUPTIBLE;
-			schedule_timeout(1);
-			if (signal_pending(current))
-				return 0;
-		}
+	for (;;) {
+	    media_bay_step(i);
+
+	    if (++i >= media_bay_count) {
+		i = 0;
+		current->state = TASK_INTERRUPTIBLE;
+		schedule_timeout(1);
+		if (signal_pending(current))
+		    return 0;
+	    }
 	}
 }
 
 void
 poll_media_bay(int which)
 {
-	int id = MB_CONTENTS(which);
+	volatile struct media_bay_info* bay = &media_bays[which];
+	int id = mb_content(bay);
 
-	if (id == media_bays[which].last_value) {
-	    if (id != media_bays[which].content_id
-	        && ++media_bays[which].value_count >= MB_STABLE_COUNT) {
+	if (id == bay->last_value) {
+	    if (id != bay->content_id
+	        && ++bay->value_count >= MS_TO_HZ(MB_STABLE_DELAY)) {
 	        /* If the device type changes without going thru "MB_NO", we force
 	           a pass by "MB_NO" to make sure things are properly reset */
-	        if ((id != MB_NO) && (media_bays[which].content_id != MB_NO)) {
-		    set_media_bay(which, MB_NO);
-		    udelay(500);
+	        if ((id != MB_NO) && (bay->content_id != MB_NO)) {
+	            id = MB_NO;
+		    MBDBG("mediabay%d: forcing MB_NO\n", which);
+		}
+		MBDBG("mediabay%d: switching to %d\n", which, id);
+		set_mb_power(which, id != MB_NO);
+		bay->content_id = id;
+		if (id == MB_NO) {
+#ifdef CONFIG_BLK_DEV_IDE
+		    bay->cd_retry = 0;
+#endif
+		    printk(KERN_INFO "media bay %d is empty\n", which);
 		}
- 		set_media_bay(which, id);
  	    }
 	} else {
-		media_bays[which].last_value = id;
-		media_bays[which].value_count = 0;
+		bay->last_value = id;
+		bay->value_count = 0;
 	}
 }
 
-static void
-set_media_bay(int which, int id)
-{
-	volatile struct media_bay_info* bay;
-
-	bay = &media_bays[which];
-	
-	bay->content_id = id;
-	bay->last_value = id;
-	
-	switch (id) {
-	case MB_CD:
-		feature_set(bay->dev_node, FEATURE_Mediabay_enable);
-		feature_set(bay->dev_node, FEATURE_Mediabay_IDE_enable);
-		udelay(500);
-		feature_set(bay->dev_node, FEATURE_CD_power);
-		printk(KERN_INFO "media bay %d contains a CD-ROM drive\n", which);
-		break;
-	case MB_FD:
-		feature_set(bay->dev_node, FEATURE_Mediabay_enable);
-		feature_set(bay->dev_node, FEATURE_Mediabay_floppy_enable);
-		feature_set(bay->dev_node, FEATURE_SWIM3_enable);
-		printk(KERN_INFO "media bay %d contains a floppy disk drive\n", which);
-		break;
-	case MB_NO:
-		feature_clear(bay->dev_node, FEATURE_CD_power);
-		feature_clear(bay->dev_node, FEATURE_Mediabay_enable);
-		feature_clear(bay->dev_node, FEATURE_Mediabay_floppy_enable);
-		feature_clear(bay->dev_node, FEATURE_Mediabay_IDE_enable);
-		feature_clear(bay->dev_node, FEATURE_SWIM3_enable);
-		feature_set(bay->dev_node, FEATURE_Mediabay_reset);
-		printk(KERN_INFO "media bay %d is empty\n", which);
-		break;
-	default:
-		feature_set(bay->dev_node, FEATURE_Mediabay_enable);
-		printk(KERN_INFO "media bay %d contains an unknown device (%d)\n",
-		       which, id);
-		break;
-	}
-	
-	udelay(500);
-}
 
 #ifdef CONFIG_PMAC_PBOOK
 /*
@@ -392,51 +589,44 @@
 {
 	volatile struct media_bay_info* bay;
 	int i;
-	
+
 	switch (when) {
 	case PBOOK_SLEEP_REQUEST:
 	case PBOOK_SLEEP_REJECT:
 		break;
-		
+
 	case PBOOK_SLEEP_NOW:
 		for (i=0; i<media_bay_count; i++) {
 			bay = &media_bays[i];
-			feature_clear(bay->dev_node, FEATURE_Mediabay_enable);
-			feature_clear(bay->dev_node, FEATURE_Mediabay_IDE_enable);
-			feature_clear(bay->dev_node, FEATURE_SWIM3_enable);
-			feature_clear(bay->dev_node, FEATURE_Mediabay_floppy_enable);
-			feature_set(bay->dev_node, FEATURE_Mediabay_reset);
-			feature_clear(bay->dev_node, FEATURE_CD_power);
-			out_8(&media_bays[i].addr->contents, 0x70);
+			set_mb_power(i, 0);
+			mdelay(10);
+			feature_clear(bay->dev_node, FEATURE_IOBUS_enable);
 		}
 		break;
 	case PBOOK_WAKE:
 		for (i=0; i<media_bay_count; i++) {
 			bay = &media_bays[i];
-			feature_set(bay->dev_node, FEATURE_Mediabay_enable);
-			/* I suppose this is enough delay to stabilize MB_CONTENT ... */
-			mdelay(10);
 			/* We re-enable the bay using it's previous content
-			   only if it did not change */
-			if (MB_CONTENTS(i) != bay->content_id)
-				continue;
-			set_media_bay(i, bay->content_id);
-			if (bay->content_id == MB_NO)
+			   only if it did not change. Note those bozo timings,
+			   they seem to help the 3400 get it right.
+			 */
+			feature_set(bay->dev_node, FEATURE_IOBUS_enable);
+			mdelay(MB_STABLE_DELAY);
+			if (!bay->pismo)
+				out_8(&bay->addr->contents, 0x70);
+			mdelay(MB_STABLE_DELAY);
+			if (mb_content(bay) != bay->content_id)
 				continue;
-			mdelay(400);
-			/* Clear the bay reset */
-			feature_clear(bay->dev_node, FEATURE_Mediabay_reset);
-			/* This small delay makes sure the device has time
-			   to assert the BUSY bit (used by IDE sleep) */
-			udelay(100);
-			/* We reset the state machine timers in case we were
-			   in the middle of a wait loop */
-			if (bay->reset_timer)
-				bay->reset_timer = MB_RESET_COUNT;
-#ifdef CONFIG_BLK_DEV_IDE
-			if (bay->cd_timer)
-				bay->cd_timer = MB_IDE_WAIT;
-#endif
+			set_mb_power(i, 1);
+			bay->last_value = bay->content_id;
+			bay->value_count = MS_TO_HZ(MB_STABLE_DELAY);
+			bay->timer = MS_TO_HZ(MB_POWER_DELAY);
+			bay->cd_retry = 0;
+			do {
+				mdelay(1000/HZ);
+				media_bay_step(i);
+			} while((media_bays[i].state != mb_empty) &&
+				(media_bays[i].state != mb_up));
 		}
 		break;
 	}
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/drivers/macintosh/rtc.c linux.17p9/drivers/macintosh/rtc.c
--- linux.vanilla/drivers/macintosh/rtc.c	Thu Jan  1 01:00:00 1970
+++ linux.17p9/drivers/macintosh/rtc.c	Mon Jun 26 15:46:10 2000
@@ -0,0 +1,163 @@
+/*
+ * Linux/PowerPC Real Time Clock Driver
+ *
+ * heavily based on:
+ * Linux/SPARC Real Time Clock Driver
+ * Copyright (C) 1996 Thomas K. Dyas (tdyas@eden.rutgers.edu)
+ *
+ * This is a little driver that lets a user-level program access
+ * the PPC clocks chip. It is no use unless you
+ * use the modified clock utility.
+ *
+ * Get the modified clock utility from:
+ *   ftp://vger.rutgers.edu/pub/linux/Sparc/userland/clock.c
+ */
+
+#include <linux/module.h>
+#include <linux/types.h>
+#include <linux/errno.h>
+#include <linux/miscdevice.h>
+#include <linux/malloc.h>
+#include <linux/fcntl.h>
+#include <linux/poll.h>
+#include <linux/init.h>
+#include <linux/mc146818rtc.h>
+#include <asm/system.h>
+#include <asm/uaccess.h>
+#include <asm/machdep.h>
+
+#include <asm/time.h>
+
+static int rtc_busy = 0;
+
+/* Retrieve the current date and time from the real time clock. */
+void get_rtc_time(struct rtc_time *t)
+{
+	unsigned long nowtime;
+    
+	nowtime = (ppc_md.get_rtc_time)();
+
+	to_tm(nowtime, t);
+
+	t->tm_year -= 1900;
+	t->tm_mon -= 1;
+	t->tm_wday -= 1;
+}
+
+/* Set the current date and time inthe real time clock. */
+void set_rtc_time(struct rtc_time *t)
+{
+	unsigned long nowtime;
+
+	printk(KERN_INFO "rtc.c:set_rtc_time: %04d-%02d-%02d %02d:%02d:%02d.\n", t->tm_year+1900, t->tm_mon+1, t->tm_mday, t->tm_hour, t->tm_min, t->tm_sec);
+
+	nowtime = mktime(t->tm_year+1900, t->tm_mon+1, t->tm_mday, t->tm_hour, t->tm_min, t->tm_sec);
+
+	printk(KERN_INFO "rtc.c:set_rtc_time: set rtc time to %d seconds.\n", nowtime);
+
+	(ppc_md.set_rtc_time)(nowtime);
+}
+
+static long long rtc_lseek(struct file *file, long long offset, int origin)
+{
+	return -ESPIPE;
+}
+
+static int rtc_ioctl(struct inode *inode, struct file *file, unsigned int cmd,
+	unsigned long arg)
+{
+	struct rtc_time rtc_tm;
+
+	switch (cmd)
+	{
+	case RTC_RD_TIME:
+		if (ppc_md.get_rtc_time)
+		{
+			get_rtc_time(&rtc_tm);
+
+			copy_to_user_ret((struct rtc_time*)arg, &rtc_tm, sizeof(struct rtc_time), -EFAULT);
+
+			return 0;
+		}
+		else
+			return -EINVAL;
+
+	case RTC_SET_TIME:
+		if (!capable(CAP_SYS_TIME))
+			return -EPERM;
+
+		if (ppc_md.set_rtc_time)
+		{
+			copy_from_user_ret(&rtc_tm, (struct rtc_time*)arg, sizeof(struct rtc_time), -EFAULT);
+
+			set_rtc_time(&rtc_tm);
+
+			return 0;
+		}
+		else
+			return -EINVAL;
+
+	default:
+		return -EINVAL;
+	}
+}
+
+static int rtc_open(struct inode *inode, struct file *file)
+{
+	if (rtc_busy)
+		return -EBUSY;
+
+	rtc_busy = 1;
+
+	MOD_INC_USE_COUNT;
+
+	return 0;
+}
+
+static int rtc_release(struct inode *inode, struct file *file)
+{
+	MOD_DEC_USE_COUNT;
+	rtc_busy = 0;
+	return 0;
+}
+
+static struct file_operations rtc_fops = {
+	rtc_lseek,
+	NULL,		/* rtc_read */
+	NULL,		/* rtc_write */
+	NULL,		/* rtc_readdir */
+	NULL,		/* rtc_poll */
+	rtc_ioctl,
+	NULL,		/* rtc_mmap */
+	rtc_open,
+	NULL,		/* flush */
+	rtc_release
+};
+
+static struct miscdevice rtc_dev = { RTC_MINOR, "rtc", &rtc_fops };
+
+EXPORT_NO_SYMBOLS;
+
+#ifdef MODULE
+int init_module(void)
+#else
+__initfunc(int rtc_init(void))
+#endif
+{
+	int error;
+
+	error = misc_register(&rtc_dev);
+	if (error) {
+		printk(KERN_ERR "rtc: unable to get misc minor\n");
+		return error;
+	}
+
+	return 0;
+}
+
+#ifdef MODULE
+void cleanup_module(void)
+{
+	misc_deregister(&rtc_dev);
+}
+#endif
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/drivers/macintosh/via-cuda.c linux.17p9/drivers/macintosh/via-cuda.c
--- linux.vanilla/drivers/macintosh/via-cuda.c	Fri Apr 21 12:46:14 2000
+++ linux.17p9/drivers/macintosh/via-cuda.c	Fri Jun 16 16:24:56 2000
@@ -21,6 +21,7 @@
 #include <asm/pgtable.h>
 #include <asm/system.h>
 #include <asm/init.h>
+#include <asm/machdep.h>
 
 static volatile unsigned char *via;
 
@@ -496,4 +497,4 @@
 cuda_present(void)
 {
 	return (adb_controller && (adb_controller->kind == ADB_VIACUDA) && via);
-}
\ No newline at end of file
+}
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/drivers/macintosh/via-pmu.c linux.17p9/drivers/macintosh/via-pmu.c
--- linux.vanilla/drivers/macintosh/via-pmu.c	Fri Apr 21 12:46:14 2000
+++ linux.17p9/drivers/macintosh/via-pmu.c	Mon Jun 26 15:46:10 2000
@@ -10,6 +10,12 @@
  * and the RTC (real time clock) chip.
  *
  * Copyright (C) 1998 Paul Mackerras and Fabio Riccardi.
+ * 
+ * todo: - Check this driver for smp safety (new Core99 motherboards).
+ *       - Cleanup synchro between VIA interrupt and GPIO-based PMU
+ *         interrupt.
+ *
+ *
  */
 #include <stdarg.h>
 #include <linux/config.h>
@@ -39,7 +45,7 @@
 /* Misc minor number allocated for /dev/pmu */
 #define PMU_MINOR	154
 
-static volatile unsigned char *via;
+static volatile unsigned char *via = 0;
 
 /* VIA registers - spaced 0x200 bytes apart */
 #define RS		0x200		/* skip between registers */
@@ -91,16 +97,18 @@
 static unsigned char *reply_ptr;
 static int data_index;
 static int data_len;
-static int adb_int_pending;
+static volatile int adb_int_pending;
 static int pmu_adb_flags;
 static int adb_dev_map = 0;
 static struct adb_request bright_req_1, bright_req_2, bright_req_3;
 static struct device_node *vias;
 static int pmu_kind = PMU_UNKNOWN;
 static int pmu_fully_inited = 0;
+static int pmu_has_adb, pmu_has_backlight;
+static unsigned char *gpio_reg = NULL;
+static int gpio_irq = -1;
 
 int asleep;
-struct notifier_block *sleep_notifier_list;
 
 static int init_pmu(void);
 static int pmu_queue_request(struct adb_request *req);
@@ -116,6 +124,7 @@
 static void pmu_handle_data(unsigned char *data, int len,
 			    struct pt_regs *regs);
 static void set_volume(int level);
+static void gpio1_interrupt(int irq, void *arg, struct pt_regs *regs);
 #ifdef CONFIG_PMAC_PBOOK
 static void pmu_pass_intr(unsigned char *data, int len);
 #endif
@@ -186,6 +195,7 @@
 	"PowerBook 2400/3400/3500(G3)",
 	"PowerBook G3 Series",
 	"1999 PowerBook G3",
+	"Core99"
 };
 
 int __openfirmware
@@ -198,9 +208,6 @@
 		return 0;
 	if (vias->next != 0)
 		printk(KERN_WARNING "Warning: only using 1st via-pmu\n");
-	
-	feature_set(vias, FEATURE_VIA_enable);
-
 #if 0
 	{ int i;
 
@@ -213,13 +220,16 @@
 	printk("\n"); }
 #endif
 
-	if (vias->n_addrs != 1 || vias->n_intrs != 1) {
+	if (vias->n_addrs < 1 || vias->n_intrs < 1) {
 		printk(KERN_ERR "via-pmu: %d addresses, %d interrupts!\n",
 		       vias->n_addrs, vias->n_intrs);
 		if (vias->n_addrs < 1 || vias->n_intrs < 1)
 			return 0;
 	}
 
+	pmu_has_adb = 1;
+	pmu_has_backlight = 1;
+
 	if (vias->parent->name && ((strcmp(vias->parent->name, "ohare") == 0)
 	    || device_is_compatible(vias->parent, "ohare")))
 		pmu_kind = PMU_OHARE_BASED;
@@ -227,23 +237,39 @@
 		pmu_kind = PMU_PADDINGTON_BASED;
 	else if (device_is_compatible(vias->parent, "heathrow"))
 		pmu_kind = PMU_HEATHROW_BASED;
-	else
+	else if (device_is_compatible(vias->parent, "Keylargo")) {
+		struct device_node *gpio, *gpiop;
+
+		pmu_kind = PMU_KEYLARGO_BASED;
+		pmu_has_adb = (find_type_devices("adb") != NULL);
+		pmu_has_backlight = (find_type_devices("backlight") != NULL);
+
+		gpiop = find_devices("gpio");
+		if (gpiop && gpiop->n_addrs) {
+			gpio_reg = ioremap(gpiop->addrs->address, 0x10);
+			gpio = find_devices("extint-gpio1");
+			if (gpio && gpio->parent == gpiop && gpio->n_intrs)
+				gpio_irq = gpio->intrs[0].line;
+		}
+	} else
 		pmu_kind = PMU_UNKNOWN;
 
 	via = (volatile unsigned char *) ioremap(vias->addrs->address, 0x2000);
 
 	out_8(&via[IER], IER_CLR | 0x7f);	/* disable all intrs */
+	out_8(&via[IFR], 0x7f);			/* clear IFR */
 
 	pmu_state = idle;
 
-	if (!init_pmu())
+	if (!init_pmu()) {
 		via = NULL;
+		return 0;
+	}
 
 	adb_controller = &pmu_controller;
 
-	if (via)
-		printk(KERN_INFO "PMU driver initialized for %s\n",
-		       pbook_type[pmu_kind]);
+	printk(KERN_INFO "PMU driver initialized for %s\n",
+	       pbook_type[pmu_kind]);
 
 	return via != 0;
 }
@@ -265,11 +291,16 @@
 		return;
 	}
 
+	if (pmu_kind == PMU_KEYLARGO_BASED && gpio_irq != -1) {
+		if (request_irq(gpio_irq, gpio1_interrupt, 0, "GPIO1/ADB", (void *)0))
+			printk(KERN_ERR "pmu: can't get irq %d (GPIO1)\n", gpio_irq);
+	}
+
 	/* Enable interrupts */
 	out_8(&via[IER], IER_SET | SR_INT | CB1_INT);
 
 	pmu_fully_inited = 1;
-	
+
 	/* Enable backlight */
 	pmu_enable_backlight(1);
 }
@@ -323,14 +354,13 @@
 {
     int i, ret;
 
-    if ((vias == NULL) || (!pmu_fully_inited))
-    {
+    if ((vias == NULL) || (!pmu_fully_inited)) {
  	req->complete = 1;
    	return -ENXIO;
-   }
+    }
 
     ret = -EINVAL;
-	
+
     switch (req->data[0]) {
     case PMU_PACKET:
 		for (i = 0; i < req->nbytes - 1; ++i)
@@ -372,6 +402,8 @@
 		}
 		break;
     case ADB_PACKET:
+	    	if (!pmu_has_adb)
+    			return -ENXIO;
 		for (i = req->nbytes - 1; i > 1; --i)
 			req->data[i+2] = req->data[i];
 		req->data[3] = req->nbytes - 2;
@@ -389,7 +421,7 @@
     	req->complete = 1;
     	return ret;
     }
-    	
+    
     if (sync) {
 	while (!req->complete)
 		pmu_poll();
@@ -404,7 +436,7 @@
 {
 	struct adb_request req;
 
-	if ((vias == NULL) || (!pmu_fully_inited))
+	if ((vias == NULL) || (!pmu_fully_inited) || !pmu_has_adb)
 		return -ENXIO;
 
 	if (devs) {
@@ -426,10 +458,9 @@
 pmu_adb_reset_bus(void)
 {
 	struct adb_request req;
-	long timeout;
 	int save_autopoll = adb_dev_map;
 
-	if ((vias == NULL) || (!pmu_fully_inited))
+	if ((vias == NULL) || (!pmu_fully_inited) || !pmu_has_adb)
 		return -ENXIO;
 
 	/* anyone got a better idea?? */
@@ -439,31 +470,21 @@
 	req.done = NULL;
 	req.data[0] = PMU_ADB_CMD;
 	req.data[1] = 0;
-	req.data[2] = 3; /* ADB_BUSRESET ??? */
+	req.data[2] = ADB_BUSRESET; /* 3 ??? */
 	req.data[3] = 0;
 	req.data[4] = 0;
 	req.reply_len = 0;
 	req.reply_expected = 1;
-	if (pmu_queue_request(&req) != 0)
-	{
+	if (pmu_queue_request(&req) != 0) {
 		printk(KERN_ERR "pmu_adb_reset_bus: pmu_queue_request failed\n");
 		return -EIO;
 	}
 	while (!req.complete)
 		pmu_poll();
-	timeout = 100000;
-	while (!req.complete) {
-		if (--timeout < 0) {
-			printk(KERN_ERR "pmu_adb_reset_bus (reset): no response from PMU\n");
-			return -EIO;
-		}
-		udelay(10);
-		pmu_poll();
-	}
 
 	if (save_autopoll != 0)
 		pmu_adb_autopoll(save_autopoll);
-		
+
 	return 0;
 }
 
@@ -537,6 +558,8 @@
 	return 0;
 }
 
+/* New PMU seems to be very sensitive to those timings, so we make sure
+ * PCI is flushed immediately */
 static void __openfirmware
 send_byte(int x)
 {
@@ -545,6 +568,7 @@
 	out_8(&v[ACR], in_8(&v[ACR]) | SR_OUT | SR_EXT);
 	out_8(&v[SR], x);
 	out_8(&v[B], in_8(&v[B]) & ~TREQ);		/* assert TREQ */
+	(void)in_8(&v[B]);
 }
 
 static void __openfirmware
@@ -554,10 +578,11 @@
 
 	out_8(&v[ACR], (in_8(&v[ACR]) & ~SR_OUT) | SR_EXT);
 	in_8(&v[SR]);		/* resets SR */
-	out_8(&v[B], in_8(&v[B]) & ~0x10);
+	out_8(&v[B], in_8(&v[B]) & ~TREQ);
+	(void)in_8(&v[B]);
 }
 
-static int disable_poll;
+static volatile int disable_poll;
 
 static void __openfirmware
 pmu_start()
@@ -594,7 +619,8 @@
 	if (disable_poll)
 		return;
 	ie = _disable_interrupts();
-	if (via[IFR] & (SR_INT | CB1_INT))
+	if ((via[IFR] & (SR_INT | CB1_INT)) ||
+		(gpio_reg && (in_8(gpio_reg + 0x9) & 0x02) == 0))
 		via_pmu_interrupt(0, 0, 0);
 	_enable_interrupts(ie);
 }
@@ -604,7 +630,12 @@
 {
 	int intr;
 	int nloop = 0;
+	unsigned long flags;
 
+	/* Currently, we use brute-force cli() for syncing with GPIO
+	 * interrupt. I'll make this smarter later, along with some
+	 * spinlocks for SMP */
+	save_flags(flags);cli();
 	++disable_poll;
 	while ((intr = in_8(&via[IFR])) != 0) {
 		if (++nloop > 1000) {
@@ -623,6 +654,9 @@
 			out_8(&via[IFR], intr);
 		}
 	}
+	if (gpio_reg && (in_8(gpio_reg + 0x9) & 0x02) == 0)
+		adb_int_pending = 1;
+
 	if (pmu_state == idle) {
 		if (adb_int_pending) {
 			pmu_state = intack;
@@ -633,9 +667,16 @@
 		}
 	}
 	--disable_poll;
+	restore_flags(flags);
 }
 
 static void __openfirmware
+gpio1_interrupt(int irq, void *arg, struct pt_regs *regs)
+{
+	via_pmu_interrupt(0, 0, 0);
+ }
+ 
+static void __openfirmware
 pmu_sr_intr(struct pt_regs *regs)
 {
 	struct adb_request *req;
@@ -646,9 +687,17 @@
 		out_8(&via[IFR], SR_INT);
 		return;
 	}
-	if (via[B] & TACK)
+	/* This one seems to appear with PMU99. According to OF methods,
+	 * the protocol didn't change...
+	 */
+	if (via[B] & TACK) {
+		while ((in_8(&via[B]) & TACK) != 0)
+			;
+#if 0
 		printk(KERN_ERR "PMU: sr_intr but ack still high! (%x)\n",
 		       via[B]);
+#endif
+	}
 
 	/* reset TREQ and wait for TACK to go high */
 	out_8(&via[B], in_8(&via[B]) | TREQ);
@@ -810,9 +859,9 @@
 {
 	struct adb_request req;
 
-	if (vias == NULL)
+	if ((vias == NULL) || !pmu_has_backlight)
 		return;
-		
+
 	/* first call: get current backlight value */
 	if (on && backlight_level < 0) {
 		switch (pmu_kind) {
@@ -831,6 +880,7 @@
 			printk(KERN_DEBUG "pmu: nvram returned bright: %d\n", backlight_level);
 			break;
 		case PMU_PADDINGTON_BASED:
+		case PMU_KEYLARGO_BASED:
 			/* the G3 PB 1999 has a backlight node
 			   and chrp-structured nvram */
 			/* XXX should read macos's "blkt" property in nvram
@@ -861,7 +911,7 @@
 {
 	int bright;
 
-	if (vias == NULL)
+	if ((vias == NULL) || !pmu_has_backlight)
 		return ;
 
 	backlight_level = level;
@@ -908,12 +958,12 @@
 	struct adb_request req;
 
 	_disable_interrupts();
-	
+
 	pmu_request(&req, NULL, 2, PMU_SET_INTR_MASK, PMU_INT_ADB |
 					PMU_INT_TICK );
 	while(!req.complete)
 		pmu_poll();
-	
+
 	pmu_request(&req, NULL, 1, PMU_RESET);
 	while(!req.complete || (pmu_state != idle))
 		pmu_poll();
@@ -927,7 +977,7 @@
 	struct adb_request req;
 
 	_disable_interrupts();
-	
+
 	pmu_request(&req, NULL, 2, PMU_SET_INTR_MASK, PMU_INT_ADB |
 					PMU_INT_TICK );
 	while(!req.complete)
@@ -944,7 +994,7 @@
 int
 pmu_present(void)
 {
-	return (adb_controller && (adb_controller->kind == ADB_VIAPMU) && vias);
+	return via != 0;
 }
 
 #ifdef CONFIG_PMAC_PBOOK
@@ -979,7 +1029,7 @@
 
 /* Sleep is broadcast last-to-first */
 static int
-broadcast_sleep(int when, int can_cancel)
+broadcast_sleep(int when, int fallback)
 {
 	int ret = PBOOK_SLEEP_OK;
 	struct list_head *list;
@@ -989,8 +1039,15 @@
 	     list = list->prev) {
 		current = list_entry(list, struct pmu_sleep_notifier, list);
 		ret = current->notifier_call(current, when);
-		if (can_cancel && (ret != PBOOK_SLEEP_OK))
+		if (ret != PBOOK_SLEEP_OK) {
+			printk(KERN_DEBUG "sleep %d rejected by %p (%p)\n",
+			       when, current, current->notifier_call);
+			for (; list != &sleep_notifiers; list = list->next) {
+				current = list_entry(list, struct pmu_sleep_notifier, list);
+				current->notifier_call(current, fallback);
+			}
 			return ret;
+		}
 	}
 	return ret;
 }
@@ -1127,9 +1184,8 @@
 			ioremap(macio->addrs[0].address, 0x40);
 
 	/* Notify device drivers */
-	ret = broadcast_sleep(PBOOK_SLEEP_REQUEST, 1);
+	ret = broadcast_sleep(PBOOK_SLEEP_REQUEST, PBOOK_SLEEP_REJECT);
 	if (ret != PBOOK_SLEEP_OK) {
-		broadcast_sleep(PBOOK_SLEEP_REJECT, 0);
 		printk("pmu: sleep rejected\n");
 		return -EBUSY;
 	}
@@ -1142,7 +1198,12 @@
 	 * vmalloc's are done before actual sleep of block drivers */
 	fsync_dev(0);
 
-	broadcast_sleep(PBOOK_SLEEP_NOW, 0);
+	/* Sleep can fail now. May not be very robust but useful for debugging */
+	ret = broadcast_sleep(PBOOK_SLEEP_NOW, PBOOK_WAKE);
+	if (ret != PBOOK_SLEEP_OK) {
+		printk("pmu: sleep failed\n");
+		return -EBUSY;
+	}
 
 	/* Give the disks a little time to actually finish writing */
 	for (wait = jiffies + (HZ/4); time_before(jiffies, wait); )
@@ -1210,7 +1271,7 @@
 	/* Restore L2 cache */
 	if (save_l2cr)
  		_set_L2CR(save_l2cr | 0x200000); /* set invalidate bit */
-	
+
 	/* reenable interrupts */
 	sleep_restore_intrs();
 
@@ -1231,9 +1292,8 @@
 	struct adb_request sleep_req;
 
 	/* Notify device drivers */
-	ret = broadcast_sleep(PBOOK_SLEEP_REQUEST, 1);
+	ret = broadcast_sleep(PBOOK_SLEEP_REQUEST, PBOOK_SLEEP_REJECT);
 	if (ret != PBOOK_SLEEP_OK) {
-		broadcast_sleep(PBOOK_SLEEP_REJECT, 0);
 		printk("pmu: sleep rejected\n");
 		return -EBUSY;
 	}
@@ -1246,7 +1306,12 @@
 	 * vmalloc's are done before actual sleep of block drivers */
 	fsync_dev(0);
 
-	broadcast_sleep(PBOOK_SLEEP_NOW, 0);
+	/* Sleep can fail now. May not be very robust but useful for debugging */
+	ret = broadcast_sleep(PBOOK_SLEEP_NOW, PBOOK_WAKE);
+	if (ret != PBOOK_SLEEP_OK) {
+		printk("pmu: sleep failed\n");
+		return -EBUSY;
+	}
 
 	/* Give the disks a little time to actually finish writing */
 	for (wait = jiffies + (HZ/4); time_before(jiffies, wait); )
@@ -1473,18 +1538,24 @@
 			error = powerbook_sleep_G3();
 			break;
 		default:
-			error = ENOSYS;
+			error = -ENOSYS;
 		}
 		return error;
 	case PMU_IOC_GET_BACKLIGHT:
+		if (!pmu_has_backlight)
+			return -ENOSYS;
 		return put_user(backlight_level, (__u32 *)arg);
 	case PMU_IOC_SET_BACKLIGHT:
+		if (!pmu_has_backlight)
+			return -ENOSYS;
 		error = get_user(value, (__u32 *)arg);
 		if (!error)
 			pmu_set_brightness(value);
 		return error;
 	case PMU_IOC_GET_MODEL:
 	    	return put_user(pmu_kind, (__u32 *)arg);
+	case PMU_IOC_HAS_ADB:
+		return put_user(pmu_has_adb, (__u32 *)arg);
 	}
 	return -EINVAL;
 }
@@ -1526,7 +1597,6 @@
 
 static inline void polled_send_byte(volatile unsigned char *via, int x)
 {
-	xmon_printf("s%.2x", x);
 	via[ACR] |= SR_OUT | SR_EXT; eieio();
 	via[SR] = x; eieio();
 	polled_handshake(via);
@@ -1540,7 +1610,6 @@
 	x = via[SR]; eieio();
 	polled_handshake(via);
 	x = via[SR]; eieio();
-	xmon_printf("r%.2x", x);
 	return x;
 }
 
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/drivers/net/3c59x.c linux.17p9/drivers/net/3c59x.c
--- linux.vanilla/drivers/net/3c59x.c	Sun Jun 11 21:44:14 2000
+++ linux.17p9/drivers/net/3c59x.c	Sun Jun 25 17:27:50 2000
@@ -42,11 +42,20 @@
     - In vortex_error, do_tx_reset and vortex_tx_timeout(Vortex): clear
       tbusy and force a BH rerun to better recover from errors.
 
+    24Jun00 <2.2.16> andrewm
+    - Better handling of shared interrupts
+    - Reset the transmitter in vortex_error() on both maxcollisions and Tx reclaim error
+    - Split the ISR into vortex_interrupt and boomerang_interrupt.  This is
+      to fix once-and-for-all the dubious testing of vortex status bits on
+      boomerang/hurricane/cyclone/tornado NICs.
+    - Fixed crash under OOM during vortex_open() (Mark Hemment)
+    - Fix Rx cessation problem during OOM (help from Mark Hemment)
+
     - See http://www.uow.edu.au/~andrewm/linux/#3c59x-2.2 for more details.
 */
 
 static char *version =
-"3c59x.c:v0.99H 27May00 Donald Becker http://cesdis.gsfc.nasa.gov/linux/drivers/vortex.html\n";
+"3c59x.c:v0.99H 24Jun00 Donald Becker and others http://www.scyld.com/network/vortex.html\n";
 
 /* "Knobs" that adjust features and parameters. */
 /* Set the copy breakpoint for the copy-only-tiny-frames scheme.
@@ -559,6 +568,7 @@
 static int vortex_rx(struct device *dev);
 static int boomerang_rx(struct device *dev);
 static void vortex_interrupt(int irq, void *dev_id, struct pt_regs *regs);
+static void boomerang_interrupt(int irq, void *dev_id, struct pt_regs *regs);
 static int vortex_close(struct device *dev);
 static void update_stats(long ioaddr, struct device *dev);
 static struct net_device_stats *vortex_get_stats(struct device *dev);
@@ -566,6 +576,8 @@
 static int vortex_ioctl(struct device *dev, struct ifreq *rq, int cmd);
 
 
+/* #define dev_alloc_skb dev_alloc_skb_debug */
+
 /* This driver uses 'options' to pass the media type, full-duplex flag, etc. */
 /* Option count limit only -- unlimited interfaces are supported. */
 #define MAX_UNITS 8
@@ -1029,12 +1041,13 @@
 	request_region(ioaddr, pci_tbl[chip_idx].io_size, dev->name);
 
 	/* The 3c59x-specific entries in the device structure. */
-	dev->open = &vortex_open;
-	dev->hard_start_xmit = &vortex_start_xmit;
-	dev->stop = &vortex_close;
-	dev->get_stats = &vortex_get_stats;
-	dev->do_ioctl = &vortex_ioctl;
-	dev->set_multicast_list = &set_rx_mode;
+	dev->open = vortex_open;
+	dev->hard_start_xmit = vp->full_bus_master_tx ?
+				boomerang_start_xmit : vortex_start_xmit;
+	dev->stop = vortex_close;
+	dev->get_stats = vortex_get_stats;
+	dev->do_ioctl = vortex_ioctl;
+	dev->set_multicast_list = set_rx_mode;
 
 	return dev;
 }
@@ -1046,7 +1059,9 @@
 	long ioaddr = dev->base_addr;
 	struct vortex_private *vp = (struct vortex_private *)dev->priv;
 	unsigned int config;
-	int i;
+	int i, retval;
+
+	MOD_INC_USE_COUNT;
 
 	/* Before initializing select the active media port. */
 	EL3WINDOW(3);
@@ -1068,12 +1083,6 @@
 	} else
 		dev->if_port = vp->default_media;
 
-	init_timer(&vp->timer);
-	vp->timer.expires = RUN_AT(media_tbl[dev->if_port].wait);
-	vp->timer.data = (unsigned long)dev;
-	vp->timer.function = &vortex_timer;		/* timer handler */
-	add_timer(&vp->timer);
-
 	if (vortex_debug > 1)
 		printk(KERN_DEBUG "%s: Initial media type %s.\n",
 			   dev->name, media_tbl[dev->if_port].name);
@@ -1123,8 +1132,11 @@
 	outw(SetStatusEnb | 0x00, ioaddr + EL3_CMD);
 
 	/* Use the now-standard shared IRQ implementation. */
-	if (request_irq(dev->irq, &vortex_interrupt, SA_SHIRQ, dev->name, dev)) {
-		return -EAGAIN;
+	if ((retval = request_irq(dev->irq, vp->full_bus_master_tx ?
+					&boomerang_interrupt : &vortex_interrupt,
+					SA_SHIRQ, dev->name, dev))) {
+		printk(KERN_ERR "%s: Cannot allocate IRQ #%d\n", dev->name, dev->irq);
+		goto out;
 	}
 
 	if (vortex_debug > 1) {
@@ -1189,12 +1201,20 @@
 			vp->rx_ring[i].addr = virt_to_bus(skb->data);
 #endif
 		}
+		if (i != RX_RING_SIZE) {
+			int j;
+			for (j = 0; j < RX_RING_SIZE; j++) {
+				if (vp->rx_skbuff[j])
+					DEV_FREE_SKB(vp->rx_skbuff[j]);
+			}
+			retval = -ENOMEM;
+			goto out_free_irq;
+		}
 		/* Wrap the ring. */
 		vp->rx_ring[i-1].next = cpu_to_le32(virt_to_bus(&vp->rx_ring[0]));
 		outl(virt_to_bus(&vp->rx_ring[0]), ioaddr + UpListPtr);
 	}
 	if (vp->full_bus_master_tx) { 		/* Boomerang bus master Tx. */
-		dev->hard_start_xmit = &boomerang_start_xmit;
 		vp->cur_tx = vp->dirty_tx = 0;
 		outb(PKT_BUF_SZ>>8, ioaddr + TxFreeThreshold); /* Room for a packet. */
 		/* Clear the Tx ring. */
@@ -1228,9 +1248,18 @@
 	if (vp->cb_fn_base)			/* The PCMCIA people are idiots.  */
 		writel(0x8000, vp->cb_fn_base + 4);
 
-	MOD_INC_USE_COUNT;
+	init_timer(&vp->timer);
+	vp->timer.expires = RUN_AT(media_tbl[dev->if_port].wait);
+	vp->timer.data = (unsigned long)dev;
+	vp->timer.function = &vortex_timer;		/* timer handler */
+	add_timer(&vp->timer);
 
 	return 0;
+
+out_free_irq:
+	free_irq(dev->irq, dev);
+out:
+	return retval;
 }
 
 static void vortex_timer(unsigned long data)
@@ -1368,7 +1397,10 @@
 			unsigned long flags;
 			__save_flags(flags);
 			__cli();
-			vortex_interrupt(dev->irq, dev, 0);
+			if (vp->full_bus_master_tx)
+				boomerang_interrupt(dev->irq, dev, 0);
+			else
+				vortex_interrupt(dev->irq, dev, 0);
 			__restore_flags(flags);
 		}
 	}
@@ -1443,8 +1475,8 @@
 		if (tx_status & 0x14)  vp->stats.tx_fifo_errors++;
 		if (tx_status & 0x38)  vp->stats.tx_aborted_errors++;
 		outb(0, ioaddr + TxStatus);
-		if (tx_status & 0x30)
-			do_tx_reset = 1;
+		if (tx_status & 0x3a)	/* TxReset after 16 collisions, despite what the manual says */
+			do_tx_reset = 1;	/* Also reset on reclaim errors */
 		else					/* Merely re-enable the transmitter. */
 			outw(TxEnable, ioaddr + EL3_CMD);
 	}
@@ -1602,10 +1634,10 @@
 		int i;
 
 		if (vortex_debug > 3)
-			printk(KERN_DEBUG "%s: Trying to send a packet, Tx index %d.\n",
+			printk(KERN_DEBUG "%s: Trying to send a boomerang packet, Tx index %d.\n",
 				   dev->name, vp->cur_tx);
 		if (vp->tx_full) {
-			if (vortex_debug >0)
+			if (vortex_debug > 0)
 				printk(KERN_WARNING "%s: Tx Ring full, refusing to send buffer.\n",
 					   dev->name);
 			return 1;
@@ -1619,7 +1651,7 @@
 		spin_lock_irqsave(&vp->lock, flags);
 		outw(DownStall, ioaddr + EL3_CMD);
 		/* Wait for the stall to complete. */
-		for (i = 4000; i >= 0 ; i--)
+		for (i = 4000; i >= 0; i--)
 			if ( (inw(ioaddr + EL3_STATUS) & CmdInProgress) == 0)
 				break;
 		prev_entry->next = cpu_to_le32(virt_to_bus(&vp->tx_ring[entry]));
@@ -1645,19 +1677,28 @@
 
 /* The interrupt handler does all of the Rx thread work and cleans up
    after the Tx thread. */
+
+/*
+ * This is the ISR for the vortex series chips.
+ * full_bus_master_tx == 0 && full_bus_master_rx == 0
+ */
+
 static void vortex_interrupt(int irq, void *dev_id, struct pt_regs *regs)
 {
 	struct device *dev = dev_id;
 	struct vortex_private *vp = (struct vortex_private *)dev->priv;
 	long ioaddr;
-	int latency, status;
+	int status;
 	int work_done = max_interrupt_work;
 
-	spin_lock(&vp->lock);
-
 	ioaddr = dev->base_addr;
-	latency = inb(ioaddr + Timer);
+	spin_lock(&vp->lock);
 	status = inw(ioaddr + EL3_STATUS);
+	if ((status & IntLatch) == 0) {
+		if (vortex_debug > 5)
+			printk(KERN_DEBUG "%s: no vortex interrupt pending\n", dev->name);
+		goto no_int;	/* Happens during shared interrupts */
+	}
 
 	if (status & IntReq) {
 		status |= vp->deferred;
@@ -1665,18 +1706,16 @@
 	}
 
 	if (vortex_debug > 4)
-		printk(KERN_DEBUG "%s: interrupt, status %4.4x, latency %d ticks.\n",
-			   dev->name, status, latency);
+		printk(KERN_DEBUG "%s: vortex_interrupt, status %4.4x, latency %d ticks.\n",
+			   dev->name, status, inb(ioaddr + Timer));
+
 	do {
 		if (vortex_debug > 5)
 				printk(KERN_DEBUG "%s: In interrupt loop, status %4.4x.\n",
 					   dev->name, status);
+
 		if (status & RxComplete)
 			vortex_rx(dev);
-		if (status & UpComplete) {
-			outw(AckIntr | UpComplete, ioaddr + EL3_CMD);
-			boomerang_rx(dev);
-		}
 
 		if (status & TxAvailable) {
 			if (vortex_debug > 5)
@@ -1687,6 +1726,93 @@
 			mark_bh(NET_BH);
 		}
 
+		if (status & DMADone) {
+			if (inw(ioaddr + Wn7_MasterStatus) & 0x1000) {
+				outw(0x1000, ioaddr + Wn7_MasterStatus); /* Ack the event. */
+				DEV_FREE_SKB(vp->tx_skb); /* Release the transfered buffer */
+				if (inw(ioaddr + TxFree) > 1536) {
+					clear_bit(0, (void*)&dev->tbusy);
+					mark_bh(NET_BH);
+				} else /* Interrupt when FIFO has room for max-sized packet. */
+					outw(SetTxThreshold + (1536>>2), ioaddr + EL3_CMD);
+			}
+		}
+
+		/* Check for all uncommon interrupts at once. */
+		if (status & (HostError | RxEarly | StatsFull | TxComplete | IntReq)) {
+			if (status == 0xffff)
+				break;
+			vortex_error(dev, status);
+		}
+
+		if (--work_done < 0) {
+			printk(KERN_WARNING "%s: Too much work in interrupt, status "
+				   "%4.4x.\n", dev->name, status);
+			/* Disable all pending interrupts. */
+			do {
+				vp->deferred |= status;
+				outw(SetStatusEnb | (~vp->deferred & vp->status_enable),
+					 ioaddr + EL3_CMD);
+				outw(AckIntr | (vp->deferred & 0x7ff), ioaddr + EL3_CMD);
+			} while ((status = inw(ioaddr + EL3_CMD)) & IntLatch);
+			/* The timer will reenable interrupts. */
+			mod_timer(&vp->timer, RUN_AT(1));
+			break;
+		}
+
+		/* Acknowledge the IRQ. */
+		outw(AckIntr | IntReq | IntLatch, ioaddr + EL3_CMD);
+	} while ((status = inw(ioaddr + EL3_STATUS)) & (IntLatch | RxComplete));
+
+	if (vortex_debug > 4)
+		printk(KERN_DEBUG "%s: exiting interrupt, status %4.4x.\n",
+			   dev->name, status);
+
+no_int:
+	spin_unlock(&vp->lock);
+}
+
+/*
+ * This is the ISR for the boomerang/cyclone/hurricane/tornado series chips.
+ * full_bus_master_tx == 1 && full_bus_master_rx == 1
+ */
+
+static void boomerang_interrupt(int irq, void *dev_id, struct pt_regs *regs)
+{
+	struct device *dev = dev_id;
+	struct vortex_private *vp = (struct vortex_private *)dev->priv;
+	long ioaddr;
+	int status;
+	int work_done = max_interrupt_work;
+
+	ioaddr = dev->base_addr;
+	spin_lock(&vp->lock);
+	status = inw(ioaddr + EL3_STATUS);
+	if ((status & IntLatch) == 0) {
+		if (vortex_debug > 5)
+			printk(KERN_DEBUG "%s: no boomerang interrupt pending\n", dev->name);
+		goto no_int;	/* Happens during shared interrupts */
+	}
+
+	if (status & IntReq) {
+		status |= vp->deferred;
+		vp->deferred = 0;
+	}
+
+	if (vortex_debug > 4)
+		printk(KERN_DEBUG "%s: interrupt, status %04x, latency %d, cur_rx %d, dirty_rx %d\n",
+			   dev->name, status, inb(ioaddr + Timer), vp->cur_rx, vp->dirty_rx);
+
+	do {
+		if (vortex_debug > 5)
+				printk(KERN_DEBUG "%s: In interrupt loop, status %4.4x.\n",
+					   dev->name, status);
+
+		if (status & UpComplete) {
+			outw(AckIntr | UpComplete, ioaddr + EL3_CMD);
+			boomerang_rx(dev);
+		}
+
 		if (status & DownComplete) {
 			unsigned int dirty_tx = vp->dirty_tx;
 
@@ -1705,22 +1831,12 @@
 			vp->dirty_tx = dirty_tx;
 			outw(AckIntr | DownComplete, ioaddr + EL3_CMD);
 			if (vp->tx_full && (vp->cur_tx - dirty_tx <= TX_RING_SIZE - 1)) {
-				vp->tx_full= 0;
+				vp->tx_full = 0;
 				clear_bit(0, (void*)&dev->tbusy);
 				mark_bh(NET_BH);
 			}
 		}
-		if (status & DMADone) {
-			if (inw(ioaddr + Wn7_MasterStatus) & 0x1000) {
-				outw(0x1000, ioaddr + Wn7_MasterStatus); /* Ack the event. */
-				DEV_FREE_SKB(vp->tx_skb); /* Release the transfered buffer */
-				if (inw(ioaddr + TxFree) > 1536) {
-					clear_bit(0, (void*)&dev->tbusy);
-					mark_bh(NET_BH);
-				} else /* Interrupt when FIFO has room for max-sized packet. */
-					outw(SetTxThreshold + (1536>>2), ioaddr + EL3_CMD);
-			}
-		}
+
 		/* Check for all uncommon interrupts at once. */
 		if (status & (HostError | RxEarly | StatsFull | TxComplete | IntReq)) {
 			if (status == 0xffff)
@@ -1729,25 +1845,18 @@
 		}
 
 		if (--work_done < 0) {
-			if ((status & (0x7fe - (UpComplete | DownComplete))) == 0) {
-				/* Just ack these and return. */
-				outw(AckIntr | UpComplete | DownComplete, ioaddr + EL3_CMD);
-			} else {
-				printk(KERN_WARNING "%s: Too much work in interrupt, status "
-					   "%4.4x.\n", dev->name, status);
-				/* Disable all pending interrupts. */
-				do {
-					vp->deferred |= status;
-					outw(SetStatusEnb | (~vp->deferred & vp->status_enable),
-						 ioaddr + EL3_CMD);
-					outw(AckIntr | (vp->deferred & 0x7ff), ioaddr + EL3_CMD);
-				} while ((status = inw(ioaddr + EL3_CMD)) & IntLatch);
-				/* The timer will reenable interrupts. */
-				del_timer(&vp->timer);
-				vp->timer.expires = RUN_AT(1);
-				add_timer(&vp->timer);
-				break;
-			}
+			printk(KERN_WARNING "%s: Too much work in interrupt, status "
+				   "%4.4x.\n", dev->name, status);
+			/* Disable all pending interrupts. */
+			do {
+				vp->deferred |= status;
+				outw(SetStatusEnb | (~vp->deferred & vp->status_enable),
+					 ioaddr + EL3_CMD);
+				outw(AckIntr | (vp->deferred & 0x7ff), ioaddr + EL3_CMD);
+			} while ((status = inw(ioaddr + EL3_CMD)) & IntLatch);
+			/* The timer will reenable interrupts. */
+			mod_timer(&vp->timer, RUN_AT(1));
+			break;
 		}
 
 		/* Acknowledge the IRQ. */
@@ -1755,14 +1864,22 @@
 		if (vp->cb_fn_base)			/* The PCMCIA people are idiots.  */
 			writel(0x8000, vp->cb_fn_base + 4);
 
-	} while ((status = inw(ioaddr + EL3_STATUS)) & (IntLatch | RxComplete));
+	} while ((status = inw(ioaddr + EL3_STATUS)) & IntLatch);
+
+	/*
+	 * If we have totally run out to rx skb's due to persistent OOM,
+	 * we can use the Tx interrupt to retry the allocation.  Dirty
+	 * but expedient
+	 */
+	if ((vp->cur_rx - vp->dirty_rx) == RX_RING_SIZE)
+		boomerang_rx(dev);
 
 	if (vortex_debug > 4)
 		printk(KERN_DEBUG "%s: exiting interrupt, status %4.4x.\n",
 			   dev->name, status);
 
+no_int:
 	spin_unlock(&vp->lock);
-	return;
 }
 
 static int vortex_rx(struct device *dev)
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/drivers/net/Config.in linux.17p9/drivers/net/Config.in
--- linux.vanilla/drivers/net/Config.in	Sun Jun 11 21:44:14 2000
+++ linux.17p9/drivers/net/Config.in	Sun Jun 25 17:18:31 2000
@@ -46,7 +46,11 @@
   fi
   if [ "$CONFIG_PPC" = "y" ]; then
     tristate 'MACE (Power Mac ethernet) support' CONFIG_MACE
+    if [ "$CONFIG_MACE" != "n" ]; then
+      bool 'Use AAUI port instead of TP by default' CONFIG_MACE_AAUI_PORT
+    fi
     tristate 'BMAC (G3 ethernet) support' CONFIG_BMAC
+    tristate 'GMAC (G4/iBook ethernet) support' CONFIG_GMAC
     tristate 'Symbios 53c885 (Synergy ethernet) support' CONFIG_NCR885E
   fi
   if [ "$CONFIG_ZORRO" = "y" ]; then
@@ -319,6 +323,10 @@
 
     if [ "$CONFIG_PCI" != "n" ]; then
       dep_tristate '  SBE wanXL support' CONFIG_WANXL $CONFIG_HDLC
+      dep_tristate '  Cyclades-PC300 support' CONFIG_PC300 $CONFIG_HDLC
+      if [ "$CONFIG_PC300" != "n" ]; then
+        bool '    Cyclades-PC300 X.25 support (please read help)' CONFIG_PC300_X25
+      fi
     fi
   fi
 fi
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/drivers/net/Makefile linux.17p9/drivers/net/Makefile
--- linux.vanilla/drivers/net/Makefile	Sun Jun 11 21:44:14 2000
+++ linux.17p9/drivers/net/Makefile	Fri Jun 16 16:24:56 2000
@@ -1003,6 +1003,14 @@
   endif
 endif
 
+ifeq ($(CONFIG_PC300),y)
+L_OBJS += pc300.o
+else
+  ifeq ($(CONFIG_PC300),m)
+  M_OBJS += pc300.o
+  endif
+endif
+
 # If anything built-in uses syncppp, then build it into the kernel also.
 # If not, but a module uses it, build as a module.
 
@@ -1242,6 +1250,14 @@
 else
   ifeq ($(CONFIG_BMAC),m)
   M_OBJS += bmac.o
+  endif
+endif
+
+ifeq ($(CONFIG_GMAC),y)
+L_OBJS += gmac.o
+else
+  ifeq ($(CONFIG_GMAC),m)
+  M_OBJS += gmac.o
   endif
 endif
 
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/drivers/net/Space.c linux.17p9/drivers/net/Space.c
--- linux.vanilla/drivers/net/Space.c	Sun Jun 11 21:44:14 2000
+++ linux.17p9/drivers/net/Space.c	Fri Jun 16 16:24:56 2000
@@ -103,6 +103,7 @@
 extern int tlan_probe(struct device *);
 extern int mace_probe(struct device *);
 extern int bmac_probe(struct device *);
+extern int gmac_probe(struct device *);
 extern int ncr885e_probe(struct device *);
 extern int cs89x0_probe(struct device *dev);
 extern int ethertap_probe(struct device *dev);
@@ -469,6 +470,9 @@
 #endif
 #ifdef CONFIG_BMAC
 	{bmac_probe, 0},
+#endif
+#ifdef CONFIG_GMAC
+	{gmac_probe, 0},
 #endif
 #ifdef CONFIG_NCR885E
 	{ncr885e_probe, 0},
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/drivers/net/bmac.c linux.17p9/drivers/net/bmac.c
--- linux.vanilla/drivers/net/bmac.c	Fri Apr 21 12:46:16 2000
+++ linux.17p9/drivers/net/bmac.c	Mon Jun 26 15:46:10 2000
@@ -1628,9 +1628,9 @@
     bp = (struct bmac_data *) bmac_devs->priv;
     unregister_netdev(bmac_devs);
 
-    free_irq(bmac_devs->irq, bmac_misc_intr);
-    free_irq(bp->tx_dma_intr, bmac_txdma_intr);
-    free_irq(bp->rx_dma_intr, bmac_rxdma_intr);
+    free_irq(bmac_devs->irq, dev);
+    free_irq(bp->tx_dma_intr, dev);
+    free_irq(bp->rx_dma_intr, dev);
 
 #ifdef CONFIG_PMAC_PBOOK
     pmu_unregister_sleep_notifier(&bmac_sleep_notifier);
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/drivers/net/de4x5.c linux.17p9/drivers/net/de4x5.c
--- linux.vanilla/drivers/net/de4x5.c	Fri Apr 21 12:46:16 2000
+++ linux.17p9/drivers/net/de4x5.c	Fri Jun 16 16:24:56 2000
@@ -653,12 +653,20 @@
 #define ALIGN64     ((u_long)64 - 1)    /* 16 longword align */
 #define ALIGN128    ((u_long)128 - 1)   /* 32 longword align */
 
+#ifndef __powerpc__
 #define ALIGN         ALIGN32           /* Keep the DC21040 happy... */
 #define CACHE_ALIGN   CAL_16LONG
 #define DESC_SKIP_LEN DSL_0             /* Must agree with DESC_ALIGN */
 /*#define DESC_ALIGN    u32 dummy[4];  / * Must agree with DESC_SKIP_LEN */
 #define DESC_ALIGN
 
+#else /* __powerpc__ */
+#define ALIGN         ALIGN32           /* Keep the DC21040 happy... */
+#define CACHE_ALIGN   CAL_8LONG
+#define DESC_SKIP_LEN DSL_4             /* Must agree with DESC_ALIGN */
+#define DESC_ALIGN    u32 dummy[4];  	/* Must agree with DESC_SKIP_LEN */
+#endif /* __powerpc__ */
+
 #ifndef DEC_ONLY                        /* See README.de4x5 for using this */
 static int dec_only = 0;
 #else
@@ -763,6 +771,9 @@
 struct de4x5_private {
     char adapter_name[80];                  /* Adapter name                 */
     u_long interrupt;                       /* Aligned ISR flag             */
+#ifdef __powerpc__
+    u_long dummy[3];			    /* Keep rx_ring 32-byte aligned */
+#endif
     struct de4x5_desc rx_ring[NUM_RX_DESC]; /* RX descriptor ring           */
     struct de4x5_desc tx_ring[NUM_TX_DESC]; /* TX descriptor ring           */
     struct sk_buff *tx_skb[NUM_TX_DESC];    /* TX skb for freeing when sent */
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/drivers/net/dmfe.c linux.17p9/drivers/net/dmfe.c
--- linux.vanilla/drivers/net/dmfe.c	Sun Jun 11 21:44:14 2000
+++ linux.17p9/drivers/net/dmfe.c	Sun Jun 18 14:38:30 2000
@@ -102,7 +102,7 @@
 #define DMFE_AUTO       8
 
 #define DMFE_TIMER_WUT  jiffies+(HZ*2)/2	/* timer wakeup time : 1 second */
-#define DMFE_TX_TIMEOUT HZ*1.5	/* tx packet time-out time 1.5 s" */
+#define DMFE_TX_TIMEOUT ((HZ*3)/2)	/* tx packet time-out time 1.5 s" */
 
 #define DMFE_DBUG(dbug_now, msg, vaule) if (dmfe_debug || dbug_now) printk("DBUG: %s %x\n", msg, vaule)
 
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/drivers/net/eepro.c linux.17p9/drivers/net/eepro.c
--- linux.vanilla/drivers/net/eepro.c	Sun Jun 11 21:44:14 2000
+++ linux.17p9/drivers/net/eepro.c	Tue Jun 27 12:07:56 2000
@@ -97,7 +97,7 @@
 */
 
 static const char *version =
-	"eepro.c: v0.12a 04/26/2000 aris@conectiva.com.br\n";
+	"eepro.c: v0.12b 04/26/2000 aris@conectiva.com.br\n";
 
 #include <linux/module.h>
 
@@ -523,6 +523,20 @@
 /* ack for tx int */
 #define eepro_ack_tx(ioaddr) outb (TX_INT, ioaddr + STATUS_REG)
 
+/* a complete sel reset */
+#define eepro_complete_selreset(ioaddr) { 	eepro_dis_int(ioaddr);\
+						lp->stats.tx_errors++;\
+						eepro_sel_reset(ioaddr);\
+						lp->tx_end = \
+							(XMT_LOWER_LIMIT << 8);\
+						lp->tx_start = lp->tx_end;\
+						lp->tx_last = 0;\
+						dev->trans_start = jiffies;\
+						netif_wake_queue(dev);\
+						eepro_en_int(ioaddr);\
+						eepro_en_rx(ioaddr);\
+					}
+
 /* Check for a network adaptor of this type, and return '0' if one exists.
    If dev->base_addr == 0, probe all likely locations.
    If dev->base_addr == 1, always return failure.
@@ -1574,9 +1588,6 @@
 	if (net_debug > 5)
 		printk(KERN_DEBUG "%s: entering eepro_rx routine.\n", dev->name);
 
-	/* clear all interrupts */
-	eepro_clear_int(ioaddr);
-	
 	/* Set the read pointer to the start of the RCV */
 	outw(rcv_car, ioaddr + HOST_ADDRESS_REG);
 	
@@ -1655,9 +1666,6 @@
 
 	if (net_debug > 5)
 		printk(KERN_DEBUG "%s: exiting eepro_rx routine.\n", dev->name);
-
-	/* enable tx/rx interrupts */
-	eepro_en_int(ioaddr);
 }
 
 static void
@@ -1754,6 +1762,12 @@
 		}
 		boguscount--;
 	}
+	/* if it reached here then it's probable that the adapter won't
+	 * interrupt again for tx. in other words: tx timeout what will take
+	 * a lot of time to happen, so we'll do a complete selreset.
+	 */
+	if (!boguscount)
+		eepro_complete_selreset(ioaddr);
 }
 
 #ifdef MODULE
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/drivers/net/eepro100.c linux.17p9/drivers/net/eepro100.c
--- linux.vanilla/drivers/net/eepro100.c	Sun Jun 11 21:44:14 2000
+++ linux.17p9/drivers/net/eepro100.c	Sun Jun 11 22:04:31 2000
@@ -53,7 +53,7 @@
 
 /* Set the copy breakpoint for the copy-only-tiny-buffer Rx method.
    Lower values use more memory, but are faster. */
-#ifdef __alpha__
+#if defined(__alpha__) || defined(__sparc__)
 /* force copying of all packets to avoid unaligned accesses on Alpha */
 static int rx_copybreak = 1518;
 #else
@@ -611,10 +611,17 @@
 				ioaddr = pciaddr & ~3UL;
 				if (check_region(ioaddr, 32))
 					continue;
-			} else if ((ioaddr = (long)ioremap(pciaddr & ~0xfUL, 0x1000)) == 0) {
-				printk(KERN_INFO "Failed to map PCI address %#lx.\n",
-					   pciaddr);
-				continue;
+			} else {
+#ifdef __sparc__
+				/* ioremap is hosed in 2.2.x on Sparc. */
+				ioaddr = pciaddr & ~0xfUL;
+#else
+				if ((ioaddr = (long)ioremap(pciaddr & ~0xfUL, 0x1000)) == 0) {
+					printk(KERN_INFO "Failed to map PCI address %#lx.\n",
+						   pciaddr);
+					continue;
+				}
+#endif
 			}
 			if (speedo_debug > 2)
 				printk("Found Intel i82557 PCI Speedo at I/O %#lx, IRQ %d.\n",
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/drivers/net/gmac.c linux.17p9/drivers/net/gmac.c
--- linux.vanilla/drivers/net/gmac.c	Thu Jan  1 01:00:00 1970
+++ linux.17p9/drivers/net/gmac.c	Mon Jun 26 15:46:11 2000
@@ -0,0 +1,1139 @@
+/*
+ * Network device driver for the GMAC ethernet controller on
+ * Apple G4 Powermacs.
+ *
+ * Copyright (C) 2000 Paul Mackerras & Ben. Herrenschmidt
+ * 
+ * portions based on sunhme.c by David S. Miller
+ *
+ */
+
+#include <linux/module.h>
+
+#include <linux/config.h>
+#include <linux/kernel.h>
+#include <linux/sched.h>
+#include <linux/types.h>
+#include <linux/fcntl.h>
+#include <linux/interrupt.h>
+#include <linux/netdevice.h>
+#include <linux/etherdevice.h>
+#include <linux/delay.h>
+#include <linux/string.h>
+#include <linux/timer.h>
+#include <linux/pci.h>
+#include <asm/prom.h>
+#include <asm/io.h>
+#include <asm/pgtable.h>
+#include <asm/bitops.h>
+
+#include "gmac.h"
+
+#define DEBUG_PHY
+
+/* Driver version 1.1, kernel 2.2.x */
+#define GMAC_VERSION	"v1.1k2"
+
+static unsigned char dummy_buf[RX_BUF_ALLOC_SIZE + RX_OFFSET + GMAC_BUFFER_ALIGN];
+static struct device *gmacs = NULL;
+
+/* Prototypes */
+static int mii_read(struct gmac *gm, int phy, int r);
+static int mii_write(struct gmac *gm, int phy, int r, int v);
+static void mii_poll_start(struct gmac *gm);
+static void mii_poll_stop(struct gmac *gm);
+static void mii_interrupt(struct gmac *gm);
+static int mii_lookup_and_reset(struct gmac *gm);
+static void mii_setup_phy(struct gmac *gm);
+
+static void gmac_set_power(struct gmac *gm, int power_up);
+static int gmac_powerup_and_reset(struct device *dev);
+static void gmac_set_duplex_mode(struct gmac *gm, int full_duplex);
+static void gmac_mac_init(struct gmac *gm, unsigned char *mac_addr);
+static void gmac_init_rings(struct gmac *gm, int from_irq);
+static void gmac_start_dma(struct gmac *gm);
+static void gmac_stop_dma(struct gmac *gm);
+static void gmac_set_multicast(struct device *dev);
+static int gmac_open(struct device *dev);
+static int gmac_close(struct device *dev);
+static void gmac_tx_timeout(struct device *dev);
+static int gmac_xmit_start(struct sk_buff *skb, struct device *dev);
+static void gmac_tx_cleanup(struct device *dev, int force_cleanup);
+static void gmac_receive(struct device *dev);
+static void gmac_interrupt(int irq, void *dev_id, struct pt_regs *regs);
+static struct net_device_stats *gmac_stats(struct device *dev);
+int gmac_probe(struct device *dev);
+
+extern int pci_device_loc(struct device_node *dev, unsigned char *bus_ptr,
+		   unsigned char *devfn_ptr);
+
+/* Stuff for talking to the physical-layer chip */
+static int
+mii_read(struct gmac *gm, int phy, int r)
+{
+	int timeout;
+
+	GM_OUT(GM_MIF_FRAME_CTL_DATA,
+		(0x01 << GM_MIF_FRAME_START_SHIFT) |
+		(0x02 << GM_MIF_FRAME_OPCODE_SHIFT) |
+		GM_MIF_FRAME_TURNAROUND_HI |
+		(phy << GM_MIF_FRAME_PHY_ADDR_SHIFT) |
+		(r << GM_MIF_FRAME_REG_ADDR_SHIFT));
+		
+	for (timeout = 1000; timeout > 0; --timeout) {
+		udelay(20);
+		if (GM_IN(GM_MIF_FRAME_CTL_DATA) & GM_MIF_FRAME_TURNAROUND_LO)
+			return GM_IN(GM_MIF_FRAME_CTL_DATA) & GM_MIF_FRAME_DATA_MASK;
+	}
+	return -1;
+}
+
+static int
+mii_write(struct gmac *gm, int phy, int r, int v)
+{
+	int timeout;
+
+	GM_OUT(GM_MIF_FRAME_CTL_DATA,
+		(0x01 << GM_MIF_FRAME_START_SHIFT) |
+		(0x01 << GM_MIF_FRAME_OPCODE_SHIFT) |
+		GM_MIF_FRAME_TURNAROUND_HI |
+		(phy << GM_MIF_FRAME_PHY_ADDR_SHIFT) |
+		(r << GM_MIF_FRAME_REG_ADDR_SHIFT) |
+		(v & GM_MIF_FRAME_DATA_MASK));
+
+	for (timeout = 1000; timeout > 0; --timeout) {
+		udelay(20);
+		if (GM_IN(GM_MIF_FRAME_CTL_DATA) & GM_MIF_FRAME_TURNAROUND_LO)
+			return 0;
+	}
+	return -1;
+}
+
+static void 
+mii_poll_start(struct gmac *gm)
+{
+	unsigned int tmp;
+	
+	/* Start the MIF polling on the external transceiver. */
+	tmp = GM_IN(GM_MIF_CFG);
+	tmp &= ~(GM_MIF_CFGPR_MASK | GM_MIF_CFGPD_MASK);
+	tmp |= ((gm->phy_addr & 0x1f) << GM_MIF_CFGPD_SHIFT);
+	tmp |= (MII_SR << GM_MIF_CFGPR_SHIFT);
+	tmp |= GM_MIF_CFGPE;
+	GM_OUT(GM_MIF_CFG, tmp);
+
+	/* Let the bits set. */
+	udelay(GM_MIF_POLL_DELAY);
+
+	GM_OUT(GM_MIF_IRQ_MASK, 0xffc0);
+}
+
+static void 
+mii_poll_stop(struct gmac *gm)
+{
+	GM_OUT(GM_MIF_IRQ_MASK, 0xffff);
+	GM_BIC(GM_MIF_CFG, GM_MIF_CFGPE);
+	udelay(GM_MIF_POLL_DELAY);
+}
+
+static void
+mii_interrupt(struct gmac *gm)
+{
+	int		phy_status;
+	int		lpar_ability;
+	
+	mii_poll_stop(gm);
+
+	/* May the status change before polling is re-enabled ? */
+	mii_poll_start(gm);
+	
+	/* We read the Auxilliary Status Summary register */
+	phy_status = mii_read(gm, gm->phy_addr, MII_SR);
+	if ((phy_status ^ gm->phy_status) & (MII_SR_ASSC | MII_SR_LKS)) {
+		int		full_duplex;
+		int		link_100;
+#ifdef DEBUG_PHY
+		printk("Link state change, phy_status: 0x%04x\n", phy_status);
+#endif
+		gm->phy_status = phy_status;
+
+		lpar_ability = mii_read(gm, gm->phy_addr, MII_ANLPA);
+		if (lpar_ability & MII_ANLPA_PAUS)
+			GM_BIS(GM_MAC_CTRL_CONFIG, GM_MAC_CTRL_CONF_SND_PAUSE_EN);
+		else
+			GM_BIC(GM_MAC_CTRL_CONFIG, GM_MAC_CTRL_CONF_SND_PAUSE_EN);
+
+		/* Link ? For now we handle only the 5201 PHY */
+		if ((phy_status & MII_SR_LKS) && (phy_status & MII_SR_ASSC)) {
+		    if (gm->phy_type == PHY_B5201) {
+		    	int aux_stat = mii_read(gm, gm->phy_addr, MII_BCM5201_AUXCTLSTATUS);
+#ifdef DEBUG_PHY
+			printk("    Link up ! BCM5201 aux_stat: 0x%04x\n", aux_stat);
+#endif
+		    	full_duplex = ((aux_stat & MII_BCM5201_AUXCTLSTATUS_DUPLEX) != 0);
+		    	link_100 = ((aux_stat & MII_BCM5201_AUXCTLSTATUS_SPEED) != 0);
+		    } else {
+		    	full_duplex = 1;
+		    	link_100 = 1;
+		    }
+#ifdef DEBUG_PHY
+		    printk("    full_duplex: %d, speed: %s\n", full_duplex,
+		    	link_100 ? "100" : "10");
+#endif
+		    if (full_duplex != gm->full_duplex) {
+			gm->full_duplex = full_duplex;
+			gmac_set_duplex_mode(gm, gm->full_duplex);
+			gmac_start_dma(gm);
+		    }
+		} else if (!(phy_status & MII_SR_LKS)) {
+#ifdef DEBUG_PHY
+		    printk("    Link down !\n");
+#endif
+		}
+	}
+}
+
+static int
+mii_lookup_and_reset(struct gmac *gm)
+{
+	int	i, timeout;
+	int	mii_status, mii_control;
+
+	/* Find the PHY */
+	gm->phy_addr = -1;
+	gm->phy_type = PHY_UNKNOWN;
+	
+	for(i=31; i>0; --i) {
+		mii_control = mii_read(gm, i, MII_CR);
+		mii_status = mii_read(gm, i, MII_SR);
+		if (mii_control != -1  && mii_status != -1 &&
+			(mii_control != 0xffff || mii_status != 0xffff))
+			break;
+	}
+	gm->phy_addr = i;
+	if (gm->phy_addr < 0)
+		return 0;
+
+	/* Reset it */
+	mii_write(gm, gm->phy_addr, MII_CR, mii_control | MII_CR_RST);
+	mdelay(10);
+	for (timeout = 100; timeout > 0; --timeout) {
+		mii_control = mii_read(gm, gm->phy_addr, MII_CR);
+		if (mii_control == -1) {
+			printk(KERN_ERR "%s PHY died after reset !\n",
+				gm->dev->name);
+			goto fail;
+		}
+		if ((mii_control & MII_CR_RST) == 0)
+			break;
+		mdelay(10);
+	}
+	if (mii_control & MII_CR_RST) {
+		printk(KERN_ERR "%s PHY reset timeout !\n", gm->dev->name);
+		goto fail;
+	}
+	mii_write(gm, gm->phy_addr, MII_CR, mii_control & ~MII_CR_ISOL);
+
+	/* Read the PHY ID */
+	gm->phy_id = (mii_read(gm, gm->phy_addr, MII_ID0) << 16) |
+		mii_read(gm, gm->phy_addr, MII_ID1);
+#ifdef DEBUG_PHY
+	printk("%s PHY ID: 0x%08x\n", gm->dev->name, gm->phy_id);
+#endif
+	if ((gm->phy_id & MII_BCM5400_MASK) == MII_BCM5400_ID) {
+		gm->phy_type = PHY_B5400;
+		printk(KERN_ERR "%s Warning ! Unsupported BCM5400 PHY !\n",
+			gm->dev->name);
+	} else if ((gm->phy_id & MII_BCM5201_MASK) == MII_BCM5201_ID) {
+		gm->phy_type = PHY_B5201;
+	} else {
+		printk(KERN_ERR "%s: Warning ! Unknown PHY ID 0x%08x !\n",
+			gm->dev->name, gm->phy_id);
+	}
+
+	return 1;
+	
+fail:
+	gm->phy_addr = -1;
+	return 0;
+}
+
+/* Code to setup the PHY duplex mode and speed should be
+ * added here
+ */
+static void
+mii_setup_phy(struct gmac *gm)
+{
+	int data;
+	
+	/* Stop auto-negociation */
+	data = mii_read(gm, gm->phy_addr, MII_CR);
+	mii_write(gm, gm->phy_addr, MII_CR, data & ~MII_CR_ASSE);
+
+	/* Set advertisement to 10/100 and Half/Full duplex
+	 * (full capabilities) */
+	data = mii_read(gm, gm->phy_addr, MII_ANA);
+	data |= MII_ANA_TXAM | MII_ANA_FDAM | MII_ANA_10M;
+	mii_write(gm, gm->phy_addr, MII_ANA, data);
+	
+	/* Restart auto-negociation */
+	data = mii_read(gm, gm->phy_addr, MII_CR);
+	data |= MII_CR_ASSE;
+	mii_write(gm, gm->phy_addr, MII_CR, data);
+	data |= MII_CR_RAN;
+	mii_write(gm, gm->phy_addr, MII_CR, data);
+}
+
+static void
+gmac_set_power(struct gmac *gm, int power_up)
+{
+	if (power_up) {
+		out_le32(gm->sysregs + 0x20/4,
+			in_le32(gm->sysregs + 0x20/4) | 0x02000000);
+		udelay(10);
+		if (gm->pci_devfn != 0xff) {
+			u16 cmd;
+			
+			/* Make sure PCI is correctly configured */
+			pcibios_read_config_word(gm->pci_bus, gm->pci_devfn,
+				PCI_COMMAND, &cmd);
+			cmd |= PCI_COMMAND_MEMORY | PCI_COMMAND_MASTER | PCI_COMMAND_INVALIDATE;
+	    		pcibios_write_config_word(gm->pci_bus, gm->pci_devfn,
+	    			PCI_COMMAND, cmd);
+	    		pcibios_write_config_byte(gm->pci_bus, gm->pci_devfn,
+	    			PCI_LATENCY_TIMER, 16);
+	    		pcibios_write_config_byte(gm->pci_bus, gm->pci_devfn,
+	    			PCI_CACHE_LINE_SIZE, 8);
+		}
+	} else {
+		/* FIXME: Add PHY power down */
+		gm->phy_type = 0;
+		out_le32(gm->sysregs + 0x20/4,
+			in_le32(gm->sysregs + 0x20/4) & ~0x02000000);
+	}
+}
+
+static int
+gmac_powerup_and_reset(struct device *dev)
+{
+	struct gmac *gm = (struct gmac *) dev->priv;
+	int timeout;
+	
+	/* turn on GB clock */
+	gmac_set_power(gm, 1);
+	/* Perform a software reset */
+	GM_OUT(GM_RESET, GM_RESET_TX | GM_RESET_RX);
+	for (timeout = 100; timeout > 0; --timeout) {
+		mdelay(10);
+		if ((GM_IN(GM_RESET) & (GM_RESET_TX | GM_RESET_RX)) == 0) {
+			/* Mask out all chips interrupts */
+			GM_OUT(GM_IRQ_MASK, 0xffffffff);
+			return 0;
+		}
+	}
+	printk(KERN_ERR "%s reset failed!\n", dev->name);
+	gmac_set_power(gm, 0);
+	return -1;
+}
+
+/* Set the MAC duplex mode. Side effect: stops Tx MAC */
+static void
+gmac_set_duplex_mode(struct gmac *gm, int full_duplex)
+{
+	/* Stop Tx MAC */
+	GM_BIC(GM_MAC_TX_CONFIG, GM_MAC_TX_CONF_ENABLE);
+	while(GM_IN(GM_MAC_TX_CONFIG) & GM_MAC_TX_CONF_ENABLE)
+		;
+	
+	if (full_duplex) {
+		GM_BIS(GM_MAC_TX_CONFIG, GM_MAC_TX_CONF_IGNORE_CARRIER
+			| GM_MAC_TX_CONF_IGNORE_COLL);
+		GM_BIC(GM_MAC_XIF_CONFIG, GM_MAC_XIF_CONF_DISABLE_ECHO);
+	} else {
+		GM_BIC(GM_MAC_TX_CONFIG, GM_MAC_TX_CONF_IGNORE_CARRIER
+			| GM_MAC_TX_CONF_IGNORE_COLL);
+		GM_BIS(GM_MAC_XIF_CONFIG, GM_MAC_XIF_CONF_DISABLE_ECHO);
+	}
+}
+
+static void
+gmac_mac_init(struct gmac *gm, unsigned char *mac_addr)
+{
+	int i, fifo_size;
+
+	/* Set random seed to low bits of MAC address */
+	GM_OUT(GM_MAC_RANDOM_SEED, mac_addr[5] | (mac_addr[4] << 8));
+	
+	/* Configure the data path mode to MII/GII */
+	GM_OUT(GM_PCS_DATAPATH_MODE, GM_PCS_DATAPATH_MII);
+	
+	/* Configure XIF to MII mode. Full duplex led is set
+	 * by Apple, so...
+	 */
+	GM_OUT(GM_MAC_XIF_CONFIG, GM_MAC_XIF_CONF_TX_MII_OUT_EN
+		| GM_MAC_XIF_CONF_FULL_DPLX_LED);
+
+	/* Mask out all MAC interrupts */
+	GM_OUT(GM_MAC_TX_MASK, 0xffff);
+	GM_OUT(GM_MAC_RX_MASK, 0xffff);
+	GM_OUT(GM_MAC_CTRLSTAT_MASK, 0xff);
+	
+	/* Setup bits of MAC */
+	GM_OUT(GM_MAC_SND_PAUSE, GM_MAC_SND_PAUSE_DEFAULT);
+	GM_OUT(GM_MAC_CTRL_CONFIG, GM_MAC_CTRL_CONF_RCV_PAUSE_EN);
+	
+	/* Configure GEM DMA */
+	GM_OUT(GM_GCONF, GM_GCONF_BURST_SZ |
+		(31 << GM_GCONF_TXDMA_LIMIT_SHIFT) |
+		(31 << GM_GCONF_RXDMA_LIMIT_SHIFT));
+	GM_OUT(GM_TX_CONF,
+		GM_TX_CONF_FIFO_THR_DEFAULT << GM_TX_CONF_FIFO_THR_SHIFT |
+		NTX_CONF);
+/* 34 byte offset for checksum computation.  This works because ip_input() will clear out
+ * the skb->csum and skb->ip_summed fields and recompute the csum if IP options are
+ * present in the header.  34 == (ethernet header len) + sizeof(struct iphdr)
+ */
+	GM_OUT(GM_RX_CONF,
+		(RX_OFFSET << GM_RX_CONF_FBYTE_OFF_SHIFT) |
+		(0x22 << GM_RX_CONF_CHK_START_SHIFT) |
+		NRX_CONF);
+
+	/* Configure other bits of MAC */
+	GM_OUT(GM_MAC_INTR_PKT_GAP0, GM_MAC_INTR_PKT_GAP0_DEFAULT);
+	GM_OUT(GM_MAC_INTR_PKT_GAP1, GM_MAC_INTR_PKT_GAP1_DEFAULT);
+	GM_OUT(GM_MAC_INTR_PKT_GAP2, GM_MAC_INTR_PKT_GAP2_DEFAULT);
+	GM_OUT(GM_MAC_MIN_FRAME_SIZE, GM_MAC_MIN_FRAME_SIZE_DEFAULT);
+	GM_OUT(GM_MAC_MAX_FRAME_SIZE, GM_MAC_MAX_FRAME_SIZE_DEFAULT);
+	GM_OUT(GM_MAC_PREAMBLE_LEN, GM_MAC_PREAMBLE_LEN_DEFAULT);
+	GM_OUT(GM_MAC_JAM_SIZE, GM_MAC_JAM_SIZE_DEFAULT);
+	GM_OUT(GM_MAC_ATTEMPT_LIMIT, GM_MAC_ATTEMPT_LIMIT_DEFAULT);
+	GM_OUT(GM_MAC_SLOT_TIME, GM_MAC_SLOT_TIME_DEFAULT);
+	GM_OUT(GM_MAC_CONTROL_TYPE, GM_MAC_CONTROL_TYPE_DEFAULT);
+	
+	/* Setup MAC addresses, clear filters, clear hash table */
+	GM_OUT(GM_MAC_ADDR_NORMAL0, (mac_addr[4] << 8) + mac_addr[5]);
+	GM_OUT(GM_MAC_ADDR_NORMAL1, (mac_addr[2] << 8) + mac_addr[3]);
+	GM_OUT(GM_MAC_ADDR_NORMAL2, (mac_addr[0] << 8) + mac_addr[1]);
+	GM_OUT(GM_MAC_ADDR_ALT0, 0);
+	GM_OUT(GM_MAC_ADDR_ALT1, 0);
+	GM_OUT(GM_MAC_ADDR_ALT2, 0);
+	GM_OUT(GM_MAC_ADDR_CTRL0, 0x0001);
+	GM_OUT(GM_MAC_ADDR_CTRL1, 0xc200);
+	GM_OUT(GM_MAC_ADDR_CTRL2, 0x0180);
+	GM_OUT(GM_MAC_ADDR_FILTER0, 0);
+	GM_OUT(GM_MAC_ADDR_FILTER1, 0);
+	GM_OUT(GM_MAC_ADDR_FILTER2, 0);
+	GM_OUT(GM_MAC_ADDR_FILTER_MASK1_2, 0);
+	GM_OUT(GM_MAC_ADDR_FILTER_MASK0, 0);
+	for (i = 0; i < 27; ++i)
+		GM_OUT(GM_MAC_ADDR_FILTER_HASH0 + i, 0);
+	
+	/* Clear stat counters */
+	GM_OUT(GM_MAC_COLLISION_CTR, 0);
+	GM_OUT(GM_MAC_FIRST_COLLISION_CTR, 0);
+	GM_OUT(GM_MAC_EXCS_COLLISION_CTR, 0);
+	GM_OUT(GM_MAC_LATE_COLLISION_CTR, 0);
+	GM_OUT(GM_MAC_DEFER_TIMER_COUNTER, 0);
+	GM_OUT(GM_MAC_PEAK_ATTEMPTS, 0);
+	GM_OUT(GM_MAC_RX_FRAME_CTR, 0);
+	GM_OUT(GM_MAC_RX_LEN_ERR_CTR, 0);
+	GM_OUT(GM_MAC_RX_ALIGN_ERR_CTR, 0);
+	GM_OUT(GM_MAC_RX_CRC_ERR_CTR, 0);
+	GM_OUT(GM_MAC_RX_CODE_VIOLATION_CTR, 0);
+	
+	/* default to half duplex */
+	GM_OUT(GM_MAC_TX_CONFIG, 0);
+	GM_OUT(GM_MAC_RX_CONFIG, 0);
+	gmac_set_duplex_mode(gm, gm->full_duplex);
+	
+	/* Setup pause thresholds */
+	fifo_size = GM_IN(GM_RX_FIFO_SIZE);
+	GM_OUT(GM_RX_PTH,
+		((fifo_size - ((GM_MAC_MAX_FRAME_SIZE_ALIGN + 8) * 2 / GM_RX_PTH_UNITS))
+			<< GM_RX_PTH_OFF_SHIFT) |
+		((fifo_size - ((GM_MAC_MAX_FRAME_SIZE_ALIGN + 8) * 3 / GM_RX_PTH_UNITS))
+			<< GM_RX_PTH_ON_SHIFT));
+		
+	/* Setup interrupt blanking */
+	if (GM_IN(GM_BIF_CFG) & GM_BIF_CFG_M66EN)
+		GM_OUT(GM_RX_BLANK, (5 << GM_RX_BLANK_INTR_PACKETS_SHIFT)
+			| (8 << GM_RX_BLANK_INTR_TIME_SHIFT));
+	else
+		GM_OUT(GM_RX_BLANK, (5 << GM_RX_BLANK_INTR_PACKETS_SHIFT)
+			| (4 << GM_RX_BLANK_INTR_TIME_SHIFT));	
+}
+
+static void
+gmac_init_rings(struct gmac *gm, int from_irq)
+{
+	int i;
+	struct sk_buff *skb;
+	unsigned char *data;
+	struct gmac_dma_desc *ring;
+	int gfp_flags = GFP_KERNEL;
+
+	if (from_irq || in_interrupt())
+		gfp_flags = GFP_ATOMIC;
+
+	/* init rx ring */
+	ring = (struct gmac_dma_desc *) gm->rxring;
+	memset(ring, 0, NRX * sizeof(struct gmac_dma_desc));
+	for (i = 0; i < NRX; ++i, ++ring) {
+		data = dummy_buf;
+		gm->rx_buff[i] = skb = gmac_alloc_skb(RX_BUF_ALLOC_SIZE, gfp_flags);
+		if (skb != 0) {
+			skb->dev = gm->dev;
+			skb_put(skb, ETH_FRAME_LEN + RX_OFFSET);
+			skb_reserve(skb, RX_OFFSET);
+			data = skb->data - RX_OFFSET;
+		}
+		st_le32(&ring->lo_addr, virt_to_bus(data));
+		st_le32(&ring->size, RX_SZ_OWN | ((RX_BUF_ALLOC_SIZE-RX_OFFSET) << RX_SZ_SHIFT));
+	}
+
+	/* init tx ring */
+	ring = (struct gmac_dma_desc *) gm->txring;
+	memset(ring, 0, NTX * sizeof(struct gmac_dma_desc));
+
+	/* set pointers in chip */
+	mb();
+	GM_OUT(GM_RX_DESC_HI, 0);
+	GM_OUT(GM_RX_DESC_LO, virt_to_bus(gm->rxring));
+	GM_OUT(GM_TX_DESC_HI, 0);
+	GM_OUT(GM_TX_DESC_LO, virt_to_bus(gm->txring));
+}
+
+static void
+gmac_start_dma(struct gmac *gm)
+{
+	/* Enable Tx and Rx */
+	GM_BIS(GM_TX_CONF, GM_TX_CONF_DMA_EN);
+	mdelay(20);
+	GM_BIS(GM_RX_CONF, GM_RX_CONF_DMA_EN);
+	mdelay(20);
+	GM_BIS(GM_MAC_RX_CONFIG, GM_MAC_RX_CONF_ENABLE);
+	mdelay(20);
+	GM_BIS(GM_MAC_TX_CONFIG, GM_MAC_TX_CONF_ENABLE);
+	mdelay(20);
+	/* Kick the receiver and enable interrupts */
+	GM_OUT(GM_RX_KICK, NRX);
+	GM_BIC(GM_IRQ_MASK, 	GM_IRQ_TX_INT_ME |
+				GM_IRQ_TX_ALL |
+				GM_IRQ_RX_DONE |
+				GM_IRQ_RX_TAG_ERR |
+				GM_IRQ_MAC_RX |
+				GM_IRQ_MIF |
+				GM_IRQ_BUS_ERROR);
+}
+
+static void
+gmac_stop_dma(struct gmac *gm)
+{
+	/* disable interrupts */
+	GM_OUT(GM_IRQ_MASK, 0xffffffff);
+	/* Enable Tx and Rx */
+	GM_BIC(GM_TX_CONF, GM_TX_CONF_DMA_EN);
+	mdelay(20);
+	GM_BIC(GM_RX_CONF, GM_RX_CONF_DMA_EN);
+	mdelay(20);
+	GM_BIC(GM_MAC_RX_CONFIG, GM_MAC_RX_CONF_ENABLE);
+	mdelay(20);
+	GM_BIC(GM_MAC_TX_CONFIG, GM_MAC_TX_CONF_ENABLE);
+	mdelay(20);
+}
+
+#define CRC_POLY	0xedb88320
+static void
+gmac_set_multicast(struct device *dev)
+{
+	struct gmac *gm = (struct gmac *) dev->priv;
+	struct dev_mc_list *dmi = dev->mc_list;
+	int i,j,k,b;
+	unsigned long crc;
+	int multicast_hash = 0;
+	int multicast_all = 0;
+
+	/* Lock out others. */
+	set_bit(0, (void *) &dev->tbusy);
+
+	gm->promisc = 0;
+
+	if (dev->flags & IFF_PROMISC)
+		gm->promisc = 1;
+	else if ((dev->flags & IFF_ALLMULTI) /* || (dev->mc_count > XXX) */) {
+		multicast_all = 1;
+	} else {
+		u16 hash_table[16];
+
+		for(i = 0; i < 16; i++)
+			hash_table[i] = 0;
+
+	    	for (i = 0; i < dev->mc_count; i++) {
+			crc = ~0;
+			for (j = 0; j < 6; ++j) {
+			    b = dmi->dmi_addr[j];
+			    for (k = 0; k < 8; ++k) {
+				if ((crc ^ b) & 1)
+				    crc = (crc >> 1) ^ CRC_POLY;
+				else
+				    crc >>= 1;
+				b >>= 1;
+			    }
+			}
+			j = crc >> 24;	/* bit number in multicast_filter */
+			hash_table[j >> 4] |= 1 << (15 - (j & 0xf));
+			dmi = dmi->next;
+	    	}
+
+	    	for (i = 0; i < 16; i++)
+	    		GM_OUT(GM_MAC_ADDR_FILTER_HASH0 + (i*4), hash_table[i]);
+		GM_BIS(GM_MAC_RX_CONFIG, GM_MAC_RX_CONF_HASH_ENABLE);
+	    	multicast_hash = 1;
+	}
+
+	if (gm->promisc)
+		GM_BIS(GM_MAC_RX_CONFIG, GM_MAC_RX_CONF_RX_ALL);
+	else
+		GM_BIC(GM_MAC_RX_CONFIG, GM_MAC_RX_CONF_RX_ALL);
+
+	if (multicast_hash)
+		GM_BIS(GM_MAC_RX_CONFIG, GM_MAC_RX_CONF_HASH_ENABLE);
+	else
+		GM_BIC(GM_MAC_RX_CONFIG, GM_MAC_RX_CONF_HASH_ENABLE);
+
+	if (multicast_all)
+		GM_BIS(GM_MAC_RX_CONFIG, GM_MAC_RX_CONF_RX_ALL_MULTI);
+	else
+		GM_BIC(GM_MAC_RX_CONFIG, GM_MAC_RX_CONF_RX_ALL_MULTI);
+	
+	/* Let us get going again. */
+	dev->tbusy = 0;
+}
+
+static int
+gmac_open(struct device *dev)
+{
+	struct gmac *gm = (struct gmac *) dev->priv;
+
+	MOD_INC_USE_COUNT;
+
+	/* Power up and reset chip */
+	if (gmac_powerup_and_reset(dev)) {
+		MOD_DEC_USE_COUNT;
+		return -EIO;
+	}
+
+	/* Get our interrupt */
+	if (request_irq(dev->irq, gmac_interrupt, 0, dev->name, dev)) {
+		printk(KERN_ERR "%s can't get irq %d\n", dev->name, dev->irq);
+		MOD_DEC_USE_COUNT;
+		return -EAGAIN;
+	}
+
+	gm->full_duplex = 0;
+	gm->phy_status = 0;
+	gm->promisc = 0;
+	
+	/* Find a PHY */
+	if (!mii_lookup_and_reset(gm))
+		printk(KERN_WARNING "%s WARNING ! Can't find PHY\n", dev->name);
+
+	/* Configure the PHY */
+	mii_setup_phy(gm);
+	
+	/* Initialize the MAC */
+	gmac_mac_init(gm, dev->dev_addr);
+	
+	/* Initialize the descriptor rings */
+	gmac_init_rings(gm, 0);
+
+	/* Initialize the multicast tables & promisc mode if any */
+	gmac_set_multicast(dev);
+	
+	/*
+	 * Check out PHY status and start auto-poll
+	 * 
+	 * Note: do this before enabling interrutps
+	 */
+	mii_interrupt(gm);
+
+	/* Start the chip */
+	gmac_start_dma(gm);
+
+	gm->opened = 1;
+
+	return 0;
+}
+
+static int
+gmac_close(struct device *dev)
+{
+	struct gmac *gm = (struct gmac *) dev->priv;
+	int i;
+
+	gm->opened = 0;
+	
+	gmac_stop_dma(gm);
+	
+	mii_poll_stop(gm);
+	
+	free_irq(dev->irq, dev);
+
+	/* Shut down chip */
+	gmac_set_power(gm, 0);
+
+	for (i = 0; i < NRX; ++i) {
+		if (gm->rx_buff[i] != 0) {
+			dev_kfree_skb(gm->rx_buff[i]);
+			gm->rx_buff[i] = 0;
+		}
+	}
+	for (i = 0; i < NTX; ++i) {
+		if (gm->tx_buff[i] != 0) {
+			dev_kfree_skb(gm->tx_buff[i]);
+			gm->tx_buff[i] = 0;
+		}
+	}
+
+	MOD_DEC_USE_COUNT;
+	return 0;
+}
+
+/*
+ * Handle a transmit timeout
+ */
+static void
+gmac_tx_timeout(struct device *dev)
+{
+	struct gmac *gm = (struct gmac *) dev->priv;
+	int i;
+	unsigned long flags;
+
+	save_flags(flags);
+	cli();
+	
+	printk (KERN_ERR "%s: transmit timed out, resetting\n", dev->name);
+
+	/*
+	 * Do something useful here
+	 * 
+	 * FIXME: check if a complete re-init of the chip isn't necessary
+	 */
+
+	/* Stop chip */
+	gmac_stop_dma(gm);
+	/* Empty Tx ring of any remaining gremlins */
+	gmac_tx_cleanup(dev, 1);
+	/* Empty Rx ring of any remaining gremlins */
+	for (i = 0; i < NRX; ++i) {
+		if (gm->rx_buff[i] != 0) {
+			dev_kfree_skb(gm->rx_buff[i]);
+			gm->rx_buff[i] = 0;
+		}
+	}
+	/* Create fresh rings */
+	gmac_init_rings(gm, 1);
+	/* Restart PHY auto-poll */
+	mii_interrupt(gm);
+	/* Restart chip */
+	gmac_start_dma(gm);
+
+	restore_flags(flags);
+	
+	dev->tbusy = 0;
+}
+
+
+static int
+gmac_xmit_start(struct sk_buff *skb, struct device *dev)
+{
+	struct gmac *gm = (struct gmac *) dev->priv;
+	volatile struct gmac_dma_desc *dp;
+	int i;
+
+	/* Check tbusy bit and handle eventual transmitter timeout */
+	if(test_and_set_bit(0, (void *) &dev->tbusy) != 0) {
+		int tickssofar = jiffies - dev->trans_start;
+	    
+		if (tickssofar >= 40)
+			gmac_tx_timeout(dev);
+		return 1;
+	}
+
+	i = gm->next_tx;
+	if (gm->tx_buff[i] != 0) {
+		/* buffer is full, can't send this packet at the moment */
+		return 1;
+	}
+	gm->next_tx = (i + 1) & (NTX - 1);
+	gm->tx_buff[i] = skb;
+
+	dp = &gm->txring[i];
+	/* FIXME: Interrupt on all packet for now, change this to every N packet,
+	 * with N to be adjusted
+	 */
+	dp->flags = TX_FL_INTERRUPT;
+	dp->hi_addr = 0;
+	st_le32(&dp->lo_addr, virt_to_bus(skb->data));
+	mb();
+	st_le32(&dp->size, TX_SZ_SOP | TX_SZ_EOP | skb->len);
+	mb();
+
+	dev->trans_start = jiffies;
+	GM_OUT(GM_TX_KICK, gm->next_tx);
+
+	dev->tbusy = (gm->tx_buff[gm->next_tx] != 0);
+
+	return 0;
+}
+
+/*
+ * Handle servicing of the transmit ring by deallocating used
+ * Tx packets and restoring flow control when necessary
+ */
+static void
+gmac_tx_cleanup(struct device *dev, int force_cleanup)
+{
+	struct gmac *gm = (struct gmac *) dev->priv;
+	volatile struct gmac_dma_desc *dp;
+	struct sk_buff *skb;
+	int gone, i;
+
+	i = gm->tx_gone;
+	gone = GM_IN(GM_TX_COMP);
+	
+	while (force_cleanup || i != gone) {
+		skb = gm->tx_buff[i];
+		if (skb == NULL)
+			break;
+		dp = &gm->txring[i];
+		if (force_cleanup)
+			++gm->stats.tx_errors;
+		else {
+			++gm->stats.tx_packets;
+			gm->stats.tx_bytes += skb->len;
+		}
+		gm->tx_buff[i] = NULL;
+		dev_kfree_skb(skb);
+		if (++i >= NTX)
+			i = 0;
+	}
+	gm->tx_gone = i;
+
+	if (!force_cleanup && dev->tbusy &&
+	    (gm->tx_buff[gm->next_tx] == 0))
+		dev->tbusy = 0;
+}
+
+static void
+gmac_receive(struct device *dev)
+{
+	struct gmac *gm = (struct gmac *) dev->priv;
+	int i = gm->next_rx;
+	volatile struct gmac_dma_desc *dp;
+	struct sk_buff *skb, *new_skb;
+	int len, flags, drop;
+	unsigned char *data;
+	u16 csum;
+	
+	for (;;) {
+		dp = &gm->rxring[i];
+		if (ld_le32(&dp->size) & RX_SZ_OWN)
+			break;
+		len = (ld_le32(&dp->size) >> 16) & 0x7fff;
+		flags = ld_le32(&dp->flags);
+		skb = gm->rx_buff[i];
+		drop = 0;
+		new_skb = NULL;
+		csum = ld_le32(&dp->size) & RX_SZ_CKSUM_MASK;
+		
+		/* Handle errors */
+		if ((len < ETH_ZLEN)||(flags & RX_FL_CRC_ERROR)||(!skb)) {
+			++gm->stats.rx_errors;
+			if (len < ETH_ZLEN)
+				++gm->stats.rx_length_errors;
+			if (flags & RX_FL_CRC_ERROR)
+				++gm->stats.rx_crc_errors;
+			if (!skb) {
+				++gm->stats.rx_dropped;
+				skb = gmac_alloc_skb(RX_BUF_ALLOC_SIZE, GFP_ATOMIC);
+				if (skb) {
+					gm->rx_buff[i] = skb;
+			    		skb->dev = dev;
+			    		skb_put(skb, ETH_FRAME_LEN + RX_OFFSET);
+			    		skb_reserve(skb, RX_OFFSET);
+				}
+			}
+			drop = 1;
+		} else {
+			/* Large packet, alloc a new skb for the ring */
+			if (len > RX_COPY_THRESHOLD) {
+			    new_skb = gmac_alloc_skb(RX_BUF_ALLOC_SIZE, GFP_ATOMIC);
+			    if(!new_skb) {
+			    	printk(KERN_INFO "%s: Out of SKBs in Rx, packet dropped !\n",
+			    		dev->name);
+			    	drop = 1;
+			    	++gm->stats.rx_dropped;
+			    	goto finish;
+			    }
+
+			    gm->rx_buff[i] = new_skb;
+			    new_skb->dev = dev;
+			    skb_put(new_skb, ETH_FRAME_LEN + RX_OFFSET);
+			    skb_reserve(new_skb, RX_OFFSET);
+			    skb_trim(skb, len);
+			} else {
+			    /* Small packet, copy it to a new small skb */
+			    struct sk_buff *copy_skb = dev_alloc_skb(len + RX_OFFSET);
+
+			    if(!copy_skb) {
+				printk(KERN_INFO "%s: Out of SKBs in Rx, packet dropped !\n",
+					dev->name);
+				drop = 1;
+				++gm->stats.rx_dropped;
+			    	goto finish;
+			    }
+
+			    copy_skb->dev = dev;
+			    skb_reserve(copy_skb, RX_OFFSET);
+			    skb_put(copy_skb, len);
+			    memcpy(copy_skb->data, skb->data, len);
+
+			    new_skb = skb;
+			    skb = copy_skb;
+			}
+		}
+	finish:
+		/* Need to drop packet ? */
+		if (drop) {
+			new_skb = skb;
+			skb = NULL;
+		}
+		
+		/* Put back ring entry */
+		data = new_skb ? (new_skb->data - RX_OFFSET) : dummy_buf;
+		dp->hi_addr = 0;
+		st_le32(&dp->lo_addr, virt_to_bus(data));
+		mb();
+		st_le32(&dp->size, RX_SZ_OWN | ((RX_BUF_ALLOC_SIZE-RX_OFFSET) << RX_SZ_SHIFT));
+		
+		/* Got Rx packet ? */
+		if (skb) {
+			/* Yes, baby, keep that hot ;) */
+			if(!(csum ^ 0xffff))
+				skb->ip_summed = CHECKSUM_UNNECESSARY;
+			else
+				skb->ip_summed = CHECKSUM_NONE;
+			skb->ip_summed = CHECKSUM_NONE;
+			skb->protocol = eth_type_trans(skb, dev);
+			netif_rx(skb);
+			gm->stats.rx_bytes += skb->len;
+			++gm->stats.rx_packets;
+		}
+		
+		if (++i >= NRX)
+			i = 0;
+	}
+	gm->next_rx = i;
+}
+
+static void
+gmac_interrupt(int irq, void *dev_id, struct pt_regs *regs)
+{
+	struct device *dev = (struct device *) dev_id;
+	struct gmac *gm = (struct gmac *) dev->priv;
+	unsigned int status;
+
+	if (test_and_set_bit(0, (void*)&dev->interrupt)) {
+		printk(KERN_ERR "%s: Duplicate entry of the interrupt handler !\n",
+			   dev->name);
+		dev->interrupt = 0;
+		return;
+	}
+
+	status = GM_IN(GM_IRQ_STATUS);
+	GM_OUT(GM_IRQ_ACK, status);
+	
+	if (status & (GM_IRQ_RX_TAG_ERR | GM_IRQ_BUS_ERROR)) {
+		printk(KERN_ERR "%s: IRQ Error status: 0x%08x\n",
+			dev->name, status);
+	}
+	
+	if (status & GM_IRQ_MIF) {
+		mii_interrupt(gm);
+	}
+
+	if (status & GM_IRQ_RX_DONE)
+		gmac_receive(dev);
+
+	if (status & (GM_IRQ_TX_INT_ME | GM_IRQ_TX_ALL))
+		gmac_tx_cleanup(dev, 0);
+
+	dev->interrupt = 0;
+}
+
+static struct net_device_stats *
+gmac_stats(struct device *dev)
+{
+	struct gmac *gm = (struct gmac *) dev->priv;
+	struct net_device_stats *stats = &gm->stats;
+
+	if (gm && gm->opened) {
+		stats->rx_crc_errors += GM_IN(GM_MAC_RX_CRC_ERR_CTR);
+		GM_OUT(GM_MAC_RX_CRC_ERR_CTR, 0);
+
+		stats->rx_frame_errors += GM_IN(GM_MAC_RX_ALIGN_ERR_CTR);
+		GM_OUT(GM_MAC_RX_ALIGN_ERR_CTR, 0);
+
+		stats->rx_length_errors += GM_IN(GM_MAC_RX_LEN_ERR_CTR);
+		GM_OUT(GM_MAC_RX_LEN_ERR_CTR, 0);
+
+		stats->tx_aborted_errors += GM_IN(GM_MAC_EXCS_COLLISION_CTR);
+
+		stats->collisions +=
+			(GM_IN(GM_MAC_EXCS_COLLISION_CTR) +
+			 GM_IN(GM_MAC_LATE_COLLISION_CTR));
+		GM_OUT(GM_MAC_EXCS_COLLISION_CTR, 0);
+		GM_OUT(GM_MAC_LATE_COLLISION_CTR, 0);
+	}
+	
+	return stats;
+}
+
+int
+gmac_probe(struct device *dev)
+{
+	static int gmacs_found;
+	static struct device_node *next_gmac;
+	struct device_node *gmac;
+	struct gmac *gm;
+	unsigned long rx_descpage, tx_descpage;
+	unsigned char *addr;
+	int i;
+
+	/*
+	 * We could (and maybe should) do this using PCI scanning
+	 * for vendor/device ID 0x106b/0x21.
+	 */
+	if (!gmacs_found) {
+		next_gmac = find_compatible_devices("network", "gmac");
+		gmacs_found = 1;
+	}
+	if ((gmac = next_gmac) == 0)
+		return -ENODEV;
+	next_gmac = gmac->next;
+
+	if (gmac->n_addrs < 1 || gmac->n_intrs < 1) {
+		printk(KERN_ERR "can't use GMAC %s: %d addrs and %d intrs\n",
+		       gmac->full_name, gmac->n_addrs, gmac->n_intrs);
+		return -ENODEV;
+	}
+
+	rx_descpage = get_free_page(GFP_KERNEL);
+	if (rx_descpage == 0) {
+		printk(KERN_ERR "%s can't get a page for rx descriptors\n", dev->name);
+		return -EAGAIN;
+	}
+
+	tx_descpage = get_free_page(GFP_KERNEL);
+	if (tx_descpage == 0) {
+		printk(KERN_ERR "%s can't get a page for tx descriptors\n", dev->name);
+		free_page(rx_descpage);
+		return -EAGAIN;
+	}
+
+	dev = init_etherdev(0, sizeof(struct gmac));
+	memset(dev->priv, 0, sizeof(struct gmac));
+
+	gm = (struct gmac *) dev->priv;
+	dev->base_addr = gmac->addrs[0].address;
+	gm->regs = (volatile unsigned int *)
+		ioremap(gmac->addrs[0].address, 0x10000);
+	gm->sysregs = (volatile unsigned int *) ioremap(0xf8000000, 0x1000);
+	dev->irq = gmac->intrs[0].line;
+	gm->dev = dev;
+
+	if (pci_device_loc(gmac, &gm->pci_bus, &gm->pci_devfn)) {
+		gm->pci_bus = gm->pci_devfn = 0xff;
+		printk(KERN_ERR "Can't locate GMAC PCI entry\n");
+	}
+
+	addr = get_property(gmac, "local-mac-address", NULL);
+	if (addr == NULL) {
+		printk(KERN_ERR "Can't get mac-address for GMAC %s\n",
+		       gmac->full_name);
+		return -EAGAIN;
+	}
+
+	printk(KERN_INFO "%s: GMAC at", dev->name);
+	for (i = 0; i < 6; ++i) {
+		dev->dev_addr[i] = addr[i];
+		printk("%c%.2x", (i? ':': ' '), addr[i]);
+	}
+	printk(", driver " GMAC_VERSION "\n");
+
+	gm->tx_desc_page = tx_descpage;
+	gm->rx_desc_page = rx_descpage;
+	gm->rxring = (volatile struct gmac_dma_desc *) rx_descpage;
+	gm->txring = (volatile struct gmac_dma_desc *) tx_descpage;
+
+	gm->phy_addr = 0;
+	gm->opened = 0;
+	
+	dev->open = gmac_open;
+	dev->stop = gmac_close;
+	dev->hard_start_xmit = gmac_xmit_start;
+	dev->get_stats = gmac_stats;
+	dev->set_multicast_list = &gmac_set_multicast;
+
+	ether_setup(dev);
+
+	gmacs = dev;
+
+	return 0;
+}
+
+#ifdef MODULE
+
+MODULE_AUTHOR("Paul Mackerras/Ben Herrenschmidt");
+MODULE_DESCRIPTION("PowerMac GMAC driver.");
+
+int
+init_module(void)
+{
+	int rc;
+	
+	if (gmacs != NULL)
+		return -EBUSY;
+
+	/* We bump use count during probe since get_free_page can sleep
+	 * which can be a race condition if module is unloaded at this
+	 * point.
+	 */
+	MOD_INC_USE_COUNT;
+
+	rc = gmac_probe(NULL);
+
+	MOD_DEC_USE_COUNT;
+
+	return rc;
+}
+
+void
+cleanup_module(void)
+{
+	struct gmac *gm;
+
+	/* XXX should handle more than one */
+	if (gmacs == NULL)
+		return;
+
+	gm = (struct gmac *) gmacs->priv;
+	unregister_netdev(gmacs);
+	free_page(gm->rx_desc_page);
+	free_page(gm->tx_desc_page);
+	kfree(gmacs);
+	gmacs = NULL;
+}
+
+#endif
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/drivers/net/gmac.h linux.17p9/drivers/net/gmac.h
--- linux.vanilla/drivers/net/gmac.h	Thu Jan  1 01:00:00 1970
+++ linux.17p9/drivers/net/gmac.h	Mon Jun 26 15:46:11 2000
@@ -0,0 +1,890 @@
+/*
+ * Definitions for the GMAC ethernet chip, used in the
+ * Apple G4 powermac.
+ */
+
+
+/* 
+ * GMAC register definitions
+ * 
+ * Note: We encode the register size the same way Apple does. I didn't copy
+ *       Apple's source as-is to avoid licence issues however. That's really
+ *       painful to re-define all those registers ...
+ *       The constants themselves were partially found in OF code, in Sun
+ *       GEM driver and in Apple's Darwin GMAC driver
+ */
+
+#define REG_SZ_8			0x00000000
+#define REG_SZ_16			0x40000000
+#define REG_SZ_32			0x80000000
+#define REG_MASK			0x0FFFFFFF
+
+	/*
+	 * Global registers
+	 */
+
+/* -- 0x0004	RW	Global configuration
+ * d: 0x00000042
+ */
+#define GM_GCONF			(0x0004 | REG_SZ_16)
+#define GM_GCONF_BURST_SZ		0x0001		/* 1: 64 bytes/burst, 0: infinite */
+#define GM_GCONF_TXDMA_LIMIT_MASK	0x003e		/* 5-1: No of 64 bytes transfers */
+#define GM_GCONF_TXDMA_LIMIT_SHIFT	1
+#define GM_GCONF_RXDMA_LIMIT_MASK	0x07c0		/* 10-6: No of 64 bytes transfers */
+#define GM_GCONF_RXDMA_LIMIT_SHIFT	6
+
+/* -- 0x000C	R-C	Global Interrupt status. 
+ * d: 0x00000000	bits 0-6 cleared on read (C)
+ */
+#define GM_IRQ_STATUS			(0x000c | REG_SZ_32)
+#define GM_IRQ_TX_INT_ME		0x00000001	/* C Frame with INT_ME bit set in fifo */
+#define GM_IRQ_TX_ALL			0x00000002	/* C TX descriptor ring empty */
+#define GM_IRQ_TX_DONE			0x00000004	/* C moved from host to TX fifo */
+#define GM_IRQ_RX_DONE			0x00000010	/* C moved from RX fifo to host */
+#define GM_IRQ_RX_NO_BUF		0x00000020	/* C No RX buffer available */
+#define GM_IRQ_RX_TAG_ERR		0x00000040	/* C RX tag error */
+#define GM_IRQ_PCS			0x00002000	/* PCS interrupt ? */
+#define GM_IRQ_MAC_TX			0x00004000	/* MAC tx register set */
+#define GM_IRQ_MAC_RX			0x00008000	/* MAC rx register set  */
+#define GM_IRQ_MAC_CTRL			0x00010000	/* MAC control register set  */
+#define GM_IRQ_MIF			0x00020000	/* MIF status register set */
+#define GM_IRQ_BUS_ERROR		0x00040000	/* Bus error status register set */
+#define GM_IRQ_TX_COMP			0xfff80000	/* TX completion mask */
+	
+/* -- 0x0010	RW	Interrupt mask. 
+ * d: 0xFFFFFFFF
+ */
+#define GM_IRQ_MASK			(0x0010 | REG_SZ_32)
+
+/* -- 0x0014	WO	Interrupt ack.
+ * 			Ack. "high" interrupts
+ */
+#define GM_IRQ_ACK			(0x0014 | REG_SZ_32)
+
+/* -- 0x001C	WO	Alias of status register (no auto-clear of "low" interrupts)
+ */
+#define GM_IRQ_ALT_STAT			(0x001C | REG_SZ_32)
+
+/* -- 0x1000	R-C	PCI Error status register
+ */
+#define GM_PCI_ERR_STAT			(0x1000 | REG_SZ_8)
+#define GM_PCI_ERR_BAD_ACK		0x01		/* Bad Ack64 */
+#define GM_PCI_ERR_TIMEOUT		0x02		/* Transaction timeout */
+#define GM_PCI_ERR_OTHER		0x04		/* Any other PCI error */
+	
+/* -- 0x1004	RW	PCI Error mask register
+ * d: 0xFFFFFFFF
+ */
+#define GM_PCI_ERR_MASK			(0x1004 | REG_SZ_8)
+
+/* -- 0x1008	RW	BIF Configuration
+ * d: 0x00000000
+ */
+#define GM_BIF_CFG			(0x1008 | REG_SZ_8)
+#define	GM_BIF_CFG_SLOWCLK		0x01		/* for parity error timing */
+#define	GM_BIF_CFG_HOST_64		0x02		/* 64-bit host */
+#define	GM_BIF_CFG_B64D_DIS		0x04		/* no 64-bit wide data cycle */
+#define	GM_BIF_CFG_M66EN		0x08		/* Read-only: sense if configured for 66MHz */
+	
+/* -- 0x100C	RW	BIF Diagnostic ???
+ */
+#define GM_BIF_DIAG			(0x100C | REG_SZ_32)
+#define GM_BIF_DIAG_BURST_STATE		0x007F0000
+#define GM_BIF_DIAG_STATE_MACH		0xFF000000
+
+/* -- 0x1010	RW	Software reset
+ *			Lower two bits reset TX and RX, both reset whole gmac. They come back
+ *			to 0 when reset is complete.
+ *			bit 2 force RSTOUT# pin when set (PHY reset)
+ */
+#define GM_RESET			(0x1010 | REG_SZ_8)
+#define	GM_RESET_TX			0x01
+#define	GM_RESET_RX			0x02
+#define	GM_RESET_RSTOUT			0x04		/* PHY reset */
+
+
+	/*
+	 * Tx DMA Registers
+	 */
+
+/* -- 0x2000	RW	Tx Kick
+ * d: 0x00000000	Written by the host with the last tx descriptor number +1 to send
+ */
+#define GM_TX_KICK			(0x2000 | REG_SZ_16)
+
+/* -- 0x2004	RW	Tx configuration
+ * d: 0x118010		Controls operation of Tx DMA channel
+ */
+
+#define GM_TX_CONF			(0x2004 | REG_SZ_32)
+#define	GM_TX_CONF_DMA_EN		0x00000001	/* Tx DMA enable */
+#define	GM_TX_CONF_RING_SZ_MASK		0x0000001e	/* Tx desc ring size */
+#define GM_TX_CONF_RING_SZ_SHIFT	1		/* Tx desc ring size shift */
+#define GM_TX_CONF_FIFO_PIO		0x00000020	/* Tx fifo PIO select ??? */
+#define	GM_TX_CONF_FIFO_THR_MASK	0x001ffc00	/* Tx fifo threshold */
+#define GM_TX_CONF_FIFO_THR_SHIFT	10		/* Tx fifo threshold shift */
+#define GM_TX_CONF_FIFO_THR_DEFAULT	0x7ff		/* Tx fifo threshold default */
+#define	GM_TX_CONF_PACED_MODE		0x00100000	/* 1: tx_all irq after last descriptor */
+							/* 0: tx_all irq when tx fifo empty */
+#define	GM_TX_RING_SZ_32		(0 << 1)
+#define	GM_TX_RING_SZ_64		(1 << 1)
+#define	GM_TX_RING_SZ_128		(2 << 1)
+#define	GM_TX_RING_SZ_256		(3 << 1)
+#define	GM_TX_RING_SZ_512		(4 << 1)
+#define	GM_TX_RING_SZ_1024		(5 << 1)
+#define	GM_TX_RING_SZ_2048		(6 << 1)
+#define	GM_TX_RING_SZ_4086		(7 << 1)
+#define	GM_TX_RING_SZ_8192		(8 << 1)
+
+/* -- 0x2008	RW	Tx descriptor ring base low
+ * -- 0x200C	RW	Tx descriptor ring base high
+ *
+ * Base of tx ring, must be 2k aligned
+ */
+#define GM_TX_DESC_LO			(0x2008 | REG_SZ_32)
+#define GM_TX_DESC_HI			(0x200C | REG_SZ_32)
+ 
+/* -- 0x2100	RW	Tx Completion
+ * d: 0x00000000	Written by the gmac with the last tx descriptor number +1 sent
+ */
+#define GM_TX_COMP			(0x2100 | REG_SZ_16)
+
+
+	/*
+	 * Rx DMA registers
+	 */
+
+
+/* -- 0x4000	RW	Rx configuration
+ * d: 0x1000010		Controls operation of Rx DMA channel
+ */
+
+#define GM_RX_CONF			(0x4000 | REG_SZ_32)
+#define	GM_RX_CONF_DMA_EN		0x00000001	/* Rx DMA enable */
+#define	GM_RX_CONF_RING_SZ_MASK		0x0000001e	/* Rx desc ring size */
+#define GM_RX_CONF_RING_SZ_SHIFT	1
+#define	GM_RX_CONF_BATCH_DIS		0x00000020	/* Rx batch disable */
+#define	GM_RX_CONF_FBYTE_OFF_MASK	0x00001c00	/* First byte offset (10-12) */
+#define GM_RX_CONF_FBYTE_OFF_SHIFT	10
+#define	GM_RX_CONF_CHK_START_MASK	0x000FE000	/* Checksum start offset */
+#define GM_RX_CONF_CHK_START_SHIFT	13
+#define	GM_RX_CONF_DMA_THR_MASK		0x07000000	/* Rx DMA threshold */
+#define GM_RX_CONF_DMA_THR_SHIFT	24		/* Rx DMA threshold shift */
+#define GM_RX_CONF_DMA_THR_DEFAULT	1		/* Rx DMA threshold default */
+
+#define	GM_RX_RING_SZ_32		(0 << 1)
+#define	GM_RX_RING_SZ_64		(1 << 1)
+#define	GM_RX_RING_SZ_128		(2 << 1)
+#define	GM_RX_RING_SZ_256		(3 << 1)
+#define	GM_RX_RING_SZ_512		(4 << 1)
+#define	GM_RX_RING_SZ_1024		(5 << 1)
+#define	GM_RX_RING_SZ_2048		(6 << 1)
+#define	GM_RX_RING_SZ_4086		(7 << 1)
+#define	GM_RX_RING_SZ_8192		(8 << 1)
+
+/* -- 0x4004	RW	Rx descriptor ring base low
+ * -- 0x4008	RW	Rx descriptor ring base high
+ *
+ * Base of rx ring
+ */
+#define GM_RX_DESC_LO			(0x4004 | REG_SZ_32)
+#define GM_RX_DESC_HI			(0x4008 | REG_SZ_32)
+
+/* -- 0x4020	RW	Rx pause threshold
+ * d: 0x000000f8	
+ *
+ * Two PAUSE thresholds are used to define when PAUSE flow control frames are
+ * emitted by GEM. The granularity of these thresholds is in 64 byte increments.
+ * XOFF PAUSE frames use the pause_time value pre-programmed in the
+ * Send PAUSE MAC Register.
+ * XON PAUSE frames use a pause_time of 0.
+ */
+#define GM_RX_PTH			(0x4020 | REG_SZ_32)
+			/*
+			 * 0-8: XOFF PAUSE emitted when RX FIFO
+			 * occupancy rises above this value (times 64 bytes)
+			 */
+#define	GM_RX_PTH_OFF_MASK		0x000001ff
+#define GM_RX_PTH_OFF_SHIFT		0
+			/*
+			 * 12-20: XON PAUSE emitted when RX FIFO
+			 * occupancy falls below this value (times 64 bytes)
+			 */
+#define	GM_RX_PTH_ON_MASK		0x001ff000
+#define	GM_RX_PTH_ON_SHIFT		12
+
+#define GM_RX_PTH_UNITS			64
+
+/* -- 0x4100	RW	Rx Kick
+ * d: 0x00000000	Written by the host with the last tx descriptor number +1 to send
+ *					Must be a multiple of 4
+ */
+#define GM_RX_KICK			(0x4100 | REG_SZ_16)
+
+/* -- 0x4104	RW	Rx Completion
+ * d: 0x00000000	Written by the gmac with the last tx descriptor number +1 sent
+ */
+#define GM_RX_COMP			(0x4104 | REG_SZ_16)
+ 
+/* -- 0x4108	RW	Rx Blanking
+ * d: 0x00000000	Written by the gmac with the last tx descriptor number +1 sent
+ *
+ * Defines the values used for receive interrupt blanking.
+ * For INTR_TIME field, every count is 2048 PCI clock time. For 66 Mhz, each
+ * count is about 16 us.
+ */
+#define GM_RX_BLANK			(0x4108 | REG_SZ_32)
+			/*
+			 * 0-8:no.of pkts to be recvd since the last RX_DONE
+			 * interrupt, before a new interrupt
+			 */
+#define	GM_RX_BLANK_INTR_PACKETS_MASK	0x000001ff
+#define	GM_RX_BLANK_INTR_PACKETS_SHIFT	0
+			/*
+			 * 12-19 : no. of clocks to be counted since the last
+			 * RX_DONE interrupt, before a new interrupt
+			 */
+#define	GM_RX_BLANK_INTR_TIME_MASK	0x000ff000
+#define	GM_RX_BLANK_INTR_TIME_SHIFT	12
+
+#define GM_RX_BLANK_UNITS		2048
+
+/* -- 0x4120	RO	Rx fifo size
+ *
+ * This 11-bit RO register indicates the size, in 64-bit multiples, of the
+ * RX FIFO. Software should use it to properly configure the PAUSE thresholds.
+ * The value read is 0x140, indicating a 20kbyte RX FIFO.
+ * -------------------------------------------------------------------------
+ */
+#define GM_RX_FIFO_SIZE			(0x4120 | REG_SZ_16)
+#define GM_RZ_FIFO_SIZE_UNITS		64
+
+
+	/*
+	 * MAC regisers
+	 */
+
+/* -- 0x6000		MAC Tx reset control
+ */
+#define GM_MAC_TX_RESET			(0x6000 | REG_SZ_8)
+#define GM_MAC_TX_RESET_NOW		0x01
+
+/* -- 0x6004		MAC Rx reset control
+ */
+#define GM_MAC_RX_RESET			(0x6004 | REG_SZ_8)
+#define GM_MAC_RX_RESET_NOW		0x01
+
+/* -- 0x6008		Send Pause command register
+ */
+#define GM_MAC_SND_PAUSE		(0x6008 | REG_SZ_32)
+#define GM_MAC_SND_PAUSE_TIME_MASK	0x0000ffff
+#define GM_MAC_SND_PAUSE_TIME_SHIFT	0
+#define GM_MAC_SND_PAUSE_NOW		0x00010000
+#define GM_MAC_SND_PAUSE_DEFAULT	0x00001bf0
+
+/* -- 0x6010		MAC transmit status
+ */
+#define GM_MAC_TX_STATUS		(0x6010 | REG_SZ_16)
+#define GM_MAC_TX_STAT_SENT		0x0001
+#define GM_MAC_TX_STAT_UNDERRUN		0x0002
+#define GM_MAC_TX_STAT_MAX_PKT_ERR	0x0004
+#define GM_MAC_TX_STAT_NORM_COLL_OVF	0x0008
+#define GM_MAC_TX_STAT_EXCS_COLL_OVF	0x0010
+#define GM_MAC_TX_STAT_LATE_COLL_OVF	0x0020
+#define GM_MAC_TX_STAT_FIRS_COLL_OVF	0x0040
+#define GM_MAC_TX_STAT_DEFER_TIMER_OVF	0x0080
+#define GM_MAC_TX_STAT_PEAK_ATTMP_OVF	0x0100
+
+/* -- 0x6014		MAC receive status
+ */
+#define GM_MAC_RX_STATUS		(0x6014 | REG_SZ_16)
+#define GM_MAC_RX_STAT_RECEIVED		0x0001
+#define GM_MAC_RX_STAT_FIFO_OVF		0x0002
+#define GM_MAC_RX_STAT_FRAME_CTR_OVF	0x0004
+#define GM_MAC_RX_STAT_ALIGN_ERR_OVF	0x0008
+#define GM_MAC_RX_STAT_CRC_ERR_OVF	0x0010
+#define GM_MAC_RX_STAT_LEN_ERR_OVF	0x0020
+#define GM_MAC_RX_STAT_CODE_ERR_OVF	0x0040
+
+/* -- 0x6018		MAC control & status
+ */
+#define GM_MAC_CTRLSTAT			(0x6018 | REG_SZ_32)
+#define GM_MAC_CTRLSTAT_PAUSE_RCVD	0x00000001
+#define GM_MAC_CTRLSTAT_PAUSE_STATE	0x00000002
+#define GM_MAC_CTRLSTAT_PAUSE_NOT	0x00000004
+#define GM_MAC_CTRLSTAT_PAUSE_TIM_MASK	0xffff0000
+#define GM_MAC_CTRLSTAT_PAUSE_TIM_SHIFT	16
+
+/* -- 0x6020		MAC Tx mask
+ * 			Same bits as MAC Tx status
+ */
+#define GM_MAC_TX_MASK			(0x6020 | REG_SZ_16)
+
+/* -- 0x6024		MAC Rx mask
+ * 			Same bits as MAC Rx status
+ */
+#define GM_MAC_RX_MASK			(0x6024 | REG_SZ_16)
+
+/* -- 0x6028		MAC Control/Status mask
+ * 			Same bits as MAC control/status low order byte
+ */
+#define GM_MAC_CTRLSTAT_MASK		(0x6024 | REG_SZ_8)
+
+/* -- 0x6030		MAC Tx configuration
+ */
+#define GM_MAC_TX_CONFIG		(0x6030 | REG_SZ_16)
+#define GM_MAC_TX_CONF_ENABLE		0x0001
+#define GM_MAC_TX_CONF_IGNORE_CARRIER	0x0002
+#define GM_MAC_TX_CONF_IGNORE_COLL	0x0004
+#define GM_MAC_TX_CONF_ENABLE_IPG0	0x0008
+#define GM_MAC_TX_CONF_DONT_GIVEUP	0x0010
+#define GM_MAC_TX_CONF_DONT_GIVEUP_NLMT	0x0020
+#define GM_MAC_TX_CONF_NO_BACKOFF	0x0040
+#define GM_MAC_TX_CONF_SLOWDOWN		0x0080
+#define GM_MAC_TX_CONF_NO_FCS		0x0100
+#define GM_MAC_TX_CONF_CARRIER_EXT	0x0200
+
+/* -- 0x6034		MAC Rx configuration
+ */
+#define GM_MAC_RX_CONFIG		(0x6034 | REG_SZ_16)
+#define GM_MAC_RX_CONF_ENABLE		0x0001
+#define GM_MAC_RX_CONF_STRIP_PAD	0x0002
+#define GM_MAC_RX_CONF_STIP_FCS		0x0004
+#define GM_MAC_RX_CONF_RX_ALL		0x0008
+#define GM_MAC_RX_CONF_RX_ALL_MULTI	0x0010
+#define GM_MAC_RX_CONF_HASH_ENABLE	0x0020
+#define GM_MAC_RX_CONF_ADDR_FLTR_ENABLE	0x0040
+#define GM_MAC_RX_CONF_PASS_ERROR_FRAM	0x0080
+#define GM_MAC_RX_CONF_CARRIER_EXT	0x0100
+
+/* -- 0x6038		MAC control configuration
+ */
+#define GM_MAC_CTRL_CONFIG		(0x6038 | REG_SZ_8)
+#define GM_MAC_CTRL_CONF_SND_PAUSE_EN	0x01
+#define GM_MAC_CTRL_CONF_RCV_PAUSE_EN	0x02
+#define GM_MAC_CTRL_CONF_PASS_CTRL_FRAM	0x04
+
+/* -- 0x603c		MAC XIF configuration */
+#define GM_MAC_XIF_CONFIG		(0x603c | REG_SZ_8)
+#define GM_MAC_XIF_CONF_TX_MII_OUT_EN	0x01
+#define GM_MAC_XIF_CONF_MII_INT_LOOP	0x02
+#define GM_MAC_XIF_CONF_DISABLE_ECHO	0x04
+#define GM_MAC_XIF_CONF_GMII_MODE	0x08
+#define GM_MAC_XIF_CONF_MII_BUFFER_EN	0x10
+#define GM_MAC_XIF_CONF_LINK_LED	0x20
+#define GM_MAC_XIF_CONF_FULL_DPLX_LED	0x40
+
+/* -- 0x6040		MAC inter-packet GAP 0
+ */
+#define GM_MAC_INTR_PKT_GAP0		(0x6040 | REG_SZ_8)
+#define GM_MAC_INTR_PKT_GAP0_DEFAULT	0x00
+
+/* -- 0x6044		MAC inter-packet GAP 1
+ */
+#define GM_MAC_INTR_PKT_GAP1		(0x6044 | REG_SZ_8)
+#define GM_MAC_INTR_PKT_GAP1_DEFAULT	0x08
+
+/* -- 0x6048		MAC inter-packet GAP 2
+ */
+#define GM_MAC_INTR_PKT_GAP2		(0x6048 | REG_SZ_8)
+#define GM_MAC_INTR_PKT_GAP2_DEFAULT	0x04
+
+/* -- 604c		MAC slot time
+ */
+#define GM_MAC_SLOT_TIME		(0x604C | REG_SZ_16)
+#define GM_MAC_SLOT_TIME_DEFAULT	0x0040
+
+/* -- 6050		MAC minimum frame size
+ */
+#define GM_MAC_MIN_FRAME_SIZE		(0x6050 | REG_SZ_16)
+#define GM_MAC_MIN_FRAME_SIZE_DEFAULT	0x0040
+
+/* -- 6054		MAC maximum frame size
+ */
+#define GM_MAC_MAX_FRAME_SIZE		(0x6054 | REG_SZ_16)
+#define GM_MAC_MAX_FRAME_SIZE_DEFAULT	0x05ee
+#define GM_MAC_MAX_FRAME_SIZE_ALIGN	0x5f0
+
+/* -- 6058		MAC preamble length
+ */
+#define GM_MAC_PREAMBLE_LEN		(0x6058 | REG_SZ_16)
+#define GM_MAC_PREAMBLE_LEN_DEFAULT	0x0007
+
+/* -- 605c		MAC jam size
+ */
+#define GM_MAC_JAM_SIZE			(0x605c | REG_SZ_8)
+#define GM_MAC_JAM_SIZE_DEFAULT		0x04
+
+/* -- 6060		MAC attempt limit
+ */
+#define GM_MAC_ATTEMPT_LIMIT		(0x6060 | REG_SZ_8)
+#define GM_MAC_ATTEMPT_LIMIT_DEFAULT	0x10
+
+/* -- 6064		MAC control type
+ */
+#define GM_MAC_CONTROL_TYPE		(0x6064 | REG_SZ_16)
+#define GM_MAC_CONTROL_TYPE_DEFAULT	0x8808
+
+/* -- 6080		MAC address 15..0
+ * -- 6084		MAC address 16..31
+ * -- 6088		MAC address 32..47
+ */
+#define GM_MAC_ADDR_NORMAL0		(0x6080 | REG_SZ_16)
+#define GM_MAC_ADDR_NORMAL1		(0x6084 | REG_SZ_16)
+#define GM_MAC_ADDR_NORMAL2		(0x6088 | REG_SZ_16)
+
+/* -- 608c		MAC alternate address 15..0
+ * -- 6090		MAC alternate address 16..31
+ * -- 6094		MAC alternate address 32..47
+ */
+#define GM_MAC_ADDR_ALT0		(0x608c | REG_SZ_16)
+#define GM_MAC_ADDR_ALT1		(0x6090 | REG_SZ_16)
+#define GM_MAC_ADDR_ALT2		(0x6094 | REG_SZ_16)
+
+/* -- 6098		MAC control address 15..0
+ * -- 609c		MAC control address 16..31
+ * -- 60a0		MAC control address 32..47
+ */
+#define GM_MAC_ADDR_CTRL0		(0x6098 | REG_SZ_16)
+#define GM_MAC_ADDR_CTRL1		(0x609c | REG_SZ_16)
+#define GM_MAC_ADDR_CTRL2		(0x60a0 | REG_SZ_16)
+
+/* -- 60a4		MAC address filter (0_0)
+ * -- 60a8		MAC address filter (0_1)
+ * -- 60ac		MAC address filter (0_2)
+ */
+#define GM_MAC_ADDR_FILTER0		(0x60a4 | REG_SZ_16)
+#define GM_MAC_ADDR_FILTER1		(0x60a8 | REG_SZ_16)
+#define GM_MAC_ADDR_FILTER2		(0x60ac | REG_SZ_16)
+
+/* -- 60b0		MAC address filter mask 1,2
+ */
+#define GM_MAC_ADDR_FILTER_MASK1_2	(0x60b0 | REG_SZ_8)
+
+/* -- 60b4		MAC address filter mask 0
+ */
+#define GM_MAC_ADDR_FILTER_MASK0	(0x60b4 | REG_SZ_16)
+
+/* -- [60c0 .. 60fc]	MAC hash table
+ */
+#define GM_MAC_ADDR_FILTER_HASH0	(0x60c0 | REG_SZ_16)
+
+/* -- 6100		MAC normal collision counter
+ */
+#define GM_MAC_COLLISION_CTR		(0x6100 | REG_SZ_16)
+
+/* -- 6104		MAC 1st successful collision counter
+ */
+#define GM_MAC_FIRST_COLLISION_CTR	(0x6104 | REG_SZ_16)
+
+/* -- 6108		MAC excess collision counter
+ */
+#define GM_MAC_EXCS_COLLISION_CTR	(0x6108 | REG_SZ_16)
+
+/* -- 610c		MAC late collision counter
+ */
+#define GM_MAC_LATE_COLLISION_CTR	(0x610c | REG_SZ_16)
+
+/* -- 6110		MAC defer timer counter
+ */
+#define GM_MAC_DEFER_TIMER_COUNTER	(0x6110 | REG_SZ_16)
+
+/* -- 6114		MAC peak attempts
+ */
+#define GM_MAC_PEAK_ATTEMPTS		(0x6114 | REG_SZ_16)
+
+/* -- 6118		MAC Rx frame counter
+ */
+#define GM_MAC_RX_FRAME_CTR		(0x6118 | REG_SZ_16)
+
+/* -- 611c		MAC Rx length error counter
+ */
+#define GM_MAC_RX_LEN_ERR_CTR		(0x611c | REG_SZ_16)
+
+/* -- 6120		MAC Rx alignment error counter
+ */
+#define GM_MAC_RX_ALIGN_ERR_CTR		(0x6120 | REG_SZ_16)
+
+/* -- 6124		MAC Rx CRC error counter
+ */
+#define GM_MAC_RX_CRC_ERR_CTR		(0x6124 | REG_SZ_16)
+
+/* -- 6128		MAC Rx code violation error counter
+ */
+#define GM_MAC_RX_CODE_VIOLATION_CTR	(0x6128 | REG_SZ_16)
+
+/* -- 6130		MAC random number seed
+ */
+#define GM_MAC_RANDOM_SEED		(0x6130 | REG_SZ_16)
+
+/* -- 6134		MAC state machine
+ */
+#define GM_MAC_STATE_MACHINE		(0x6134 | REG_SZ_8)
+
+
+	/*
+	 * MIF registers
+	 */
+
+
+/* -- 0x6200	RW	MIF bit bang clock
+ */
+#define GM_MIF_BB_CLOCK			(0x6200 | REG_SZ_8)
+
+/* -- 0x6204	RW	MIF bit bang data
+ */
+#define GM_MIF_BB_DATA			(0x6204 | REG_SZ_8)
+
+/* -- 0x6208	RW	MIF bit bang output enable
+ */
+#define GM_MIF_BB_OUT_ENABLE		(0x6208 | REG_SZ_8)
+
+/* -- 0x620c	RW	MIF frame control & data
+ */
+#define GM_MIF_FRAME_CTL_DATA		(0x620c | REG_SZ_32)
+#define GM_MIF_FRAME_START_MASK		0xc0000000
+#define GM_MIF_FRAME_START_SHIFT	30
+#define GM_MIF_FRAME_OPCODE_MASK	0x30000000
+#define GM_MIF_FRAME_OPCODE_SHIFT	28
+#define GM_MIF_FRAME_PHY_ADDR_MASK	0x0f800000
+#define GM_MIF_FRAME_PHY_ADDR_SHIFT	23
+#define GM_MIF_FRAME_REG_ADDR_MASK	0x007c0000
+#define GM_MIF_FRAME_REG_ADDR_SHIFT	18
+#define GM_MIF_FRAME_TURNAROUND_HI	0x00020000
+#define GM_MIF_FRAME_TURNAROUND_LO	0x00010000
+#define GM_MIF_FRAME_DATA_MASK		0x0000ffff
+#define GM_MIF_FRAME_DATA_SHIFT		0
+
+/* -- 0x6210	RW	MIF config reg
+ */
+#define GM_MIF_CFG			(0x6210 | REG_SZ_16)
+#define	GM_MIF_CFGPS			0x00000001	/* PHY Select */
+#define	GM_MIF_CFGPE			0x00000002	/* Poll Enable */
+#define	GM_MIF_CFGBB			0x00000004	/* Bit Bang Enable */
+#define	GM_MIF_CFGPR_MASK		0x000000f8	/* Poll Register address */
+#define	GM_MIF_CFGPR_SHIFT		3
+#define	GM_MIF_CFGM0			0x00000100	/* MDIO_0 Data / MDIO_0 attached */
+#define	GM_MIF_CFGM1			0x00000200	/* MDIO_1 Data / MDIO_1 attached */
+#define	GM_MIF_CFGPD_MASK		0x00007c00	/* Poll Device PHY address */
+#define	GM_MIF_CFGPD_SHIFT		10
+
+#define	GM_MIF_POLL_DELAY		200
+
+#define	GM_INTERNAL_PHYAD		1		/* PHY address for int. transceiver */
+#define	GM_EXTERNAL_PHYAD		0		/* PHY address for ext. transceiver */
+
+/* -- 0x6214	RW	MIF interrupt mask reg
+ *			same as basic/status Register
+ */
+#define GM_MIF_IRQ_MASK			(0x6214 | REG_SZ_16)
+
+/* -- 0x6218	RW	MIF basic/status reg
+ *			The Basic portion of this register indicates the last
+ *			value of the register read indicated in the POLL REG field
+ *			of the Configuration Register.
+ *			The Status portion indicates bit(s) that have changed.
+ *			The MIF Mask register is corresponding to this register in
+ *			terms of the bit(s) that need to be masked for generating
+ *			interrupt on the MIF Interrupt Bit of the Global Status Rgister.
+ */
+#define GM_MIF_STATUS			(0x6218 | REG_SZ_32)
+
+#define	GM_MIF_STATUS_MASK		0x0000ffff	/* 0-15 : Status */
+#define	GM_MIF_BASIC_MASK		0xffff0000	/* 16-31 : Basic register */
+
+	/*
+	 * PCS link registers
+	 */
+
+/* -- 0x9000	RW	PCS mii control reg
+ */
+#define GM_PCS_CONTROL			(0x9000 | REG_SZ_16)
+
+/* -- 0x9004	RW	PCS mii status reg
+ */
+#define GM_PCS_STATUS			(0x9004 | REG_SZ_16)
+
+/* -- 0x9008	RW	PCS mii advertisement
+ */
+#define GM_PCS_ADVERTISEMENT		(0x9008 | REG_SZ_16)
+
+/* -- 0x900c	RW	PCS mii LP ability
+ */
+#define GM_PCS_ABILITY			(0x900c | REG_SZ_16)
+
+/* -- 0x9010	RW	PCS config
+ */
+#define GM_PCS_CONFIG			(0x9010 | REG_SZ_8)
+
+/* -- 0x9014	RW	PCS state machine
+ */
+#define GM_PCS_STATE_MACHINE		(0x9014 | REG_SZ_32)
+
+/* -- 0x9018	RW	PCS interrupt status
+ */
+#define GM_PCS_IRQ_STATUS		(0x9018 | REG_SZ_8)
+
+/* -- 0x9050	RW	PCS datapath mode
+ */
+#define GM_PCS_DATAPATH_MODE		(0x9050 | REG_SZ_8)
+#define GM_PCS_DATAPATH_INTERNAL	0x01	/* Internal serial link */
+#define GM_PCS_DATAPATH_SERDES		0x02	/* 10-bit Serdes interface */
+#define GM_PCS_DATAPATH_MII		0x04	/* Select mii/gmii mode */
+#define GM_PCS_DATAPATH_GMII_OUT	0x08	/* serial mode only, copy data to gmii */
+
+/* -- 0x9054	RW	PCS serdes control
+ */
+#define GM_PCS_SERDES_CTRL		(0x9054 | REG_SZ_8)
+
+/* -- 0x9058	RW	PCS serdes output select
+ */
+#define GM_PCS_SERDES_SELECT		(0x9058 | REG_SZ_8)
+
+/* -- 0x905c	RW	PCS serdes state
+ */
+#define GM_PCS_SERDES_STATE		(0x905c | REG_SZ_8)
+
+
+	/*
+	 * PHY registers
+	 */
+
+/*
+ * Standard PHY registers (from de4x5.h)
+ */
+#define MII_CR       0x00          /* MII Management Control Register */
+#define MII_SR       0x01          /* MII Management Status Register */
+#define MII_ID0      0x02          /* PHY Identifier Register 0 */
+#define MII_ID1      0x03          /* PHY Identifier Register 1 */
+#define MII_ANA      0x04          /* Auto Negotiation Advertisement */
+#define MII_ANLPA    0x05          /* Auto Negotiation Link Partner Ability */
+#define MII_ANE      0x06          /* Auto Negotiation Expansion */
+#define MII_ANP      0x07          /* Auto Negotiation Next Page TX */
+
+/*
+** MII Management Control Register
+*/
+#define MII_CR_RST  0x8000         /* RESET the PHY chip */
+#define MII_CR_LPBK 0x4000         /* Loopback enable */
+#define MII_CR_SPD  0x2000         /* 0: 10Mb/s; 1: 100Mb/s */
+#define MII_CR_10   0x0000         /* Set 10Mb/s */
+#define MII_CR_100  0x2000         /* Set 100Mb/s */
+#define MII_CR_ASSE 0x1000         /* Auto Speed Select Enable */
+#define MII_CR_PD   0x0800         /* Power Down */
+#define MII_CR_ISOL 0x0400         /* Isolate Mode */
+#define MII_CR_RAN  0x0200         /* Restart Auto Negotiation */
+#define MII_CR_FDM  0x0100         /* Full Duplex Mode */
+#define MII_CR_CTE  0x0080         /* Collision Test Enable */
+
+/*
+** MII Management Status Register
+*/
+#define MII_SR_T4C  0x8000         /* 100BASE-T4 capable */
+#define MII_SR_TXFD 0x4000         /* 100BASE-TX Full Duplex capable */
+#define MII_SR_TXHD 0x2000         /* 100BASE-TX Half Duplex capable */
+#define MII_SR_TFD  0x1000         /* 10BASE-T Full Duplex capable */
+#define MII_SR_THD  0x0800         /* 10BASE-T Half Duplex capable */
+#define MII_SR_ASSC 0x0020         /* Auto Speed Selection Complete*/
+#define MII_SR_RFD  0x0010         /* Remote Fault Detected */
+#define MII_SR_ANC  0x0008         /* Auto Negotiation capable */
+#define MII_SR_LKS  0x0004         /* Link Status */
+#define MII_SR_JABD 0x0002         /* Jabber Detect */
+#define MII_SR_XC   0x0001         /* Extended Capabilities */
+
+/*
+** MII Management Auto Negotiation Advertisement Register
+*/
+#define MII_ANA_TAF  0x03e0        /* Technology Ability Field */
+#define MII_ANA_T4AM 0x0200        /* T4 Technology Ability Mask */
+#define MII_ANA_TXAM 0x0180        /* TX Technology Ability Mask */
+#define MII_ANA_FDAM 0x0140        /* Full Duplex Technology Ability Mask */
+#define MII_ANA_HDAM 0x02a0        /* Half Duplex Technology Ability Mask */
+#define MII_ANA_100M 0x0380        /* 100Mb Technology Ability Mask */
+#define MII_ANA_10M  0x0060        /* 10Mb Technology Ability Mask */
+#define MII_ANA_CSMA 0x0001        /* CSMA-CD Capable */
+
+/*
+** MII Management Auto Negotiation Remote End Register
+*/
+#define MII_ANLPA_NP   0x8000      /* Next Page (Enable) */
+#define MII_ANLPA_ACK  0x4000      /* Remote Acknowledge */
+#define MII_ANLPA_RF   0x2000      /* Remote Fault */
+#define MII_ANLPA_TAF  0x03e0      /* Technology Ability Field */
+#define MII_ANLPA_T4AM 0x0200      /* T4 Technology Ability Mask */
+#define MII_ANLPA_TXAM 0x0180      /* TX Technology Ability Mask */
+#define MII_ANLPA_FDAM 0x0140      /* Full Duplex Technology Ability Mask */
+#define MII_ANLPA_HDAM 0x02a0      /* Half Duplex Technology Ability Mask */
+#define MII_ANLPA_100M 0x0380      /* 100Mb Technology Ability Mask */
+#define MII_ANLPA_10M  0x0060      /* 10Mb Technology Ability Mask */
+#define MII_ANLPA_CSMA 0x0001      /* CSMA-CD Capable */
+#define MII_ANLPA_PAUS 0x0400 
+
+/*
+ * Model-specific PHY registers
+ *
+ * Note: Only the BCM5201 is described here for now. I'll add the 5400 once
+ *       I see a machine using it in real world.
+ */
+
+/* Supported PHYs (phy_type field ) */
+#define PHY_B5400	5400
+#define PHY_B5201	5201
+#define PHY_UNKNOWN	0
+
+/* Identification (for multi-PHY) */
+#define MII_BCM5201_OUI                         0x001018
+#define MII_BCM5201_MODEL                       0x21
+#define MII_BCM5201_REV                         0x01
+#define MII_BCM5201_ID                          ((MII_BCM5201_OUI << 10) | (MII_BCM5201_MODEL << 4))
+#define MII_BCM5201_MASK                        0xfffffff0
+#define MII_BCM5400_OUI                         0x000818
+#define MII_BCM5400_MODEL                       0x04
+#define MII_BCM5400_REV                         0x01
+#define MII_BCM5400_ID                          ((MII_BCM5400_OUI << 10) | (MII_BCM5400_MODEL << 4))
+#define MII_BCM5400_MASK                        0xfffffff0
+
+/* BCM5201 AUX STATUS register */
+#define MII_BCM5201_AUXCTLSTATUS		0x18
+#define MII_BCM5201_AUXCTLSTATUS_DUPLEX		0x0001
+#define MII_BCM5201_AUXCTLSTATUS_SPEED		0x0002
+
+/* MII BCM5201 MULTIPHY interrupt register */
+#define MII_BCM5201_INTERRUPT			0x1A
+#define MII_BCM5201_INTERRUPT_INTENABLE		0x4000
+
+#define MII_BCM5201_AUXMODE2			0x1B
+#define MII_BCM5201_AUXMODE2_LOWPOWER		0x0008
+
+#define MII_BCM5201_MULTIPHY                    0x1E
+
+/* MII BCM5201 MULTIPHY register bits */
+#define MII_BCM5201_MULTIPHY_SERIALMODE         0x0002
+#define MII_BCM5201_MULTIPHY_SUPERISOLATE       0x0008
+
+
+
+	/*
+	 * DMA descriptors
+	 */
+
+
+/* 
+ * Descriptor counts and buffer sizes
+ */
+#define NTX			64		/* must be power of 2 */
+#define NTX_CONF		GM_TX_RING_SZ_64
+#define NRX			64		/* must be power of 2 */
+#define NRX_CONF		GM_RX_RING_SZ_64
+#define RX_COPY_THRESHOLD	256
+#define GMAC_BUFFER_ALIGN	32		/* Align on a cache line */
+#define RX_BUF_ALLOC_SIZE	(ETH_FRAME_LEN + GMAC_BUFFER_ALIGN + 2)
+#define RX_OFFSET		2
+
+/*
+ * Definitions of Rx and Tx descriptors
+ */
+
+struct gmac_dma_desc {
+	unsigned int	size;		/* data size and OWN bit */
+	unsigned int	flags;		/* flags */
+	unsigned int	lo_addr;	/* phys addr, low 32 bits */
+	unsigned int	hi_addr;
+};
+
+/*
+ * Rx bits
+ */
+ 
+/* Bits in size */
+#define RX_SZ_OWN		0x80000000	/* 1 = owned by chip */
+#define RX_SZ_MASK		0x7FFF0000
+#define RX_SZ_SHIFT		16
+#define RX_SZ_CKSUM_MASK	0x0000FFFF
+
+/* Bits in flags */
+#define RX_FL_CRC_ERROR		0x40000000
+#define RX_FL_ALT_ADDR		0x20000000	/* Packet rcv. from alt MAC address */
+
+/* 
+ * Tx bits
+ */
+
+/* Bits in size */
+#define TX_SZ_MASK		0x00007FFF
+#define TX_SZ_CRC_MASK		0x00FF8000
+#define TX_SZ_CRC_STUFF		0x1F000000
+#define TX_SZ_CRC_ENABLE	0x20000000
+#define TX_SZ_EOP		0x40000000
+#define TX_SZ_SOP		0x80000000
+/* Bits in flags */
+#define TX_FL_INTERRUPT		0x00000001
+#define TX_FL_NO_CRC		0x00000002
+
+	/*
+	 * Other stuffs
+	 */
+	 
+struct gmac {
+	volatile unsigned int		*regs;	/* hardware registers, virtual addr */
+	volatile unsigned int		*sysregs;
+	struct device			*dev;
+	unsigned long			tx_desc_page;	/* page for DMA descriptors */
+	unsigned long			rx_desc_page;	/* page for DMA descriptors */
+	volatile struct			gmac_dma_desc *rxring;
+	struct sk_buff			*rx_buff[NRX];
+	int				next_rx;
+	volatile struct	gmac_dma_desc	*txring;
+	struct sk_buff			*tx_buff[NTX];
+	int				next_tx;
+	int				tx_gone;
+	int				phy_addr;
+	unsigned int			phy_id;
+	int				phy_type;
+	int				phy_status;	/* Cached PHY status */
+	int				full_duplex;	/* Current set to full duplex */
+	int				promisc;
+	struct net_device_stats		stats;
+	u8				pci_bus;
+	u8				pci_devfn;
+	int				opened;
+};
+
+
+/* Register access macros. We hope the preprocessor will be smart enough
+ * to optimize them into one single access instruction
+ */
+#define GM_OUT(reg, v)		(((reg) & REG_SZ_32) ? out_le32(gm->regs + \
+					(((reg) & REG_MASK)>>2), (v))  \
+				: (((reg) & REG_SZ_16) ? out_le16((volatile u16 *) \
+					(gm->regs + (((reg) & REG_MASK)>>2)), (v))  \
+				: out_8((volatile u8 *)(gm->regs + \
+					(((reg) & REG_MASK)>>2)), (v))))
+#define GM_IN(reg)		(((reg) & REG_SZ_32) ? in_le32(gm->regs + \
+					(((reg) & REG_MASK)>>2))  \
+				: (((reg) & REG_SZ_16) ? in_le16((volatile u16 *) \
+					(gm->regs + (((reg) & REG_MASK)>>2)))  \
+				: in_8((volatile u8 *)(gm->regs + \
+					(((reg) & REG_MASK)>>2)))))
+#define GM_BIS(r, v)		GM_OUT((r), GM_IN(r) | (v))
+#define GM_BIC(r, v)		GM_OUT((r), GM_IN(r) & ~(v))
+
+/* Wrapper to alloc_skb to test various alignements */
+#define GMAC_ALIGNED_RX_SKB_ADDR(addr) \
+        ((((unsigned long)(addr) + GMAC_BUFFER_ALIGN - 1) & \
+        ~(GMAC_BUFFER_ALIGN - 1)) - (unsigned long)(addr))
+        
+static inline struct sk_buff *
+gmac_alloc_skb(unsigned int length, int gfp_flags)
+{
+	struct sk_buff *skb;
+
+	skb = alloc_skb(length + GMAC_BUFFER_ALIGN, gfp_flags);
+	if(skb) {
+		int offset = GMAC_ALIGNED_RX_SKB_ADDR(skb->data);
+
+		if(offset)
+			skb_reserve(skb, offset);
+	}
+	return skb;
+}
+
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/drivers/net/hdlc.c linux.17p9/drivers/net/hdlc.c
--- linux.vanilla/drivers/net/hdlc.c	Sun Jun 11 21:44:14 2000
+++ linux.17p9/drivers/net/hdlc.c	Tue Jun 20 22:49:52 2000
@@ -41,7 +41,7 @@
 #ifndef MODULE
 static int version_printed=0;
 #endif
-static const char* version = "HDLC support routines revision: 1.0-pre9";
+static const char* version = "HDLC support routines revision: 1.0-pre10";
 
 
 #define CISCO_MULTICAST         0x8f    /* Cisco multicast address */
@@ -139,9 +139,11 @@
 #endif
 
 	case CISCO_KEEPALIVE:
-		if (skb->len != sizeof(cisco_packet)) {
+		if (skb->len != CISCO_PACKET_LEN && 
+		    skb->len != CISCO_BIG_PACKET_LEN) {
 			printk(KERN_INFO "%s: Invalid length of Cisco "
-			       "control packet\n", hdlc->name);
+			       "control packet (%d bytes)\n", hdlc->name, 
+			       skb->len);
 			goto rx_error;
 		}
 
@@ -884,7 +886,12 @@
 		dev->do_ioctl = hdlc_ioctl;
 		hdlc->pppdev.sppp.pp_flags&=~PP_CISCO;
 		dev->type=ARPHRD_PPP;
-		sppp_open(dev);
+		result = sppp_open(dev);
+		if (result) {
+			sppp_detach(dev);
+			hdlc->close(hdlc);
+			return result;
+		}
 	}
 
 	return 0;
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/drivers/net/lmc/Makefile linux.17p9/drivers/net/lmc/Makefile
--- linux.vanilla/drivers/net/lmc/Makefile	Fri Apr 21 12:46:18 2000
+++ linux.17p9/drivers/net/lmc/Makefile	Tue Jun 20 23:08:03 2000
@@ -6,13 +6,13 @@
 
 ifeq ($(CONFIG_LANMEDIA),y)
     O_TARGET := lmc.o
-    O_OBJS = lmc_debug.o lmc_media.o lmc_main.o
+    O_OBJS = lmc_debug.o lmc_media.o lmc_main.o lmc_proto.o
 else
   ifeq ($(CONFIG_LANMEDIA),m)
     MOD_LIST_NAME := NET_MODULES
     M_OBJS := lmc.o
     O_TARGET := lmc.o
-    O_OBJS = lmc_debug.o lmc_media.o lmc_main.o
+    O_OBJS = lmc_debug.o lmc_media.o lmc_main.o lmc_proto.o
   endif
 endif
 
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/drivers/net/lmc/lmc.h linux.17p9/drivers/net/lmc/lmc.h
--- linux.vanilla/drivers/net/lmc/lmc.h	Fri Apr 21 23:18:39 2000
+++ linux.17p9/drivers/net/lmc/lmc.h	Tue Jun 27 13:08:32 2000
@@ -6,7 +6,7 @@
 /*
  * prototypes for everyone
  */
-int lmc_probe(struct device * dev);
+int lmc_probe(struct net_device * dev);
 unsigned lmc_mii_readreg(lmc_softc_t * const sc, unsigned
       			  devaddr, unsigned regno);
 void lmc_mii_writereg(lmc_softc_t * const sc, unsigned devaddr,
@@ -17,6 +17,8 @@
 void lmc_mii_writereg(lmc_softc_t * const, unsigned, unsigned, unsigned);
 void lmc_gpio_mkinput(lmc_softc_t * const sc, u_int32_t bits);
 void lmc_gpio_mkoutput(lmc_softc_t * const sc, u_int32_t bits);
+
+int lmc_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd);
 
 extern lmc_media_t lmc_ds3_media;
 extern lmc_media_t lmc_ssi_media;
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/drivers/net/lmc/lmc_debug.c linux.17p9/drivers/net/lmc/lmc_debug.c
--- linux.vanilla/drivers/net/lmc/lmc_debug.c	Fri Apr 21 12:46:18 2000
+++ linux.17p9/drivers/net/lmc/lmc_debug.c	Tue Jun 20 23:08:03 2000
@@ -1,6 +1,10 @@
 
 #include <linux/types.h>
 #include <linux/sched.h>
+#include <linux/netdevice.h>
+#include <linux/interrupt.h>
+#include <linux/version.h>
+#include "lmc_ver.h"
 #include "lmc_debug.h"
 
 /*
@@ -45,20 +49,20 @@
 #endif
 }
 
-#ifdef DEBUG
-u_int32_t lmcEventLogIndex = 0;
-u_int32_t lmcEventLogBuf[LMC_EVENTLOGSIZE * LMC_EVENTLOGARGS];
-#endif
+inline void lmc_trace(struct net_device *dev, char *msg){
+#ifdef LMC_TRACE
+    unsigned long j = jiffies + 3; /* Wait for 50 ms */
 
-void lmcEventLog (u_int32_t EventNum, u_int32_t arg2, u_int32_t arg3)
-{
-#ifdef DEBUG
-  lmcEventLogBuf[lmcEventLogIndex++] = EventNum;
-  lmcEventLogBuf[lmcEventLogIndex++] = arg2;
-  lmcEventLogBuf[lmcEventLogIndex++] = arg3;
-  lmcEventLogBuf[lmcEventLogIndex++] = jiffies;
-
-  lmcEventLogIndex &= (LMC_EVENTLOGSIZE * LMC_EVENTLOGARGS) - 1;
+    if(in_interrupt()){
+        printk("%s: * %s\n", dev->name, msg);
+//        while(jiffies < j+10)
+//            ;
+    }
+    else {
+        printk("%s: %s\n", dev->name, msg);
+        while(jiffies < j)
+            schedule();
+    }
 #endif
 }
 
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/drivers/net/lmc/lmc_debug.h linux.17p9/drivers/net/lmc/lmc_debug.h
--- linux.vanilla/drivers/net/lmc/lmc_debug.h	Fri Apr 21 12:46:18 2000
+++ linux.17p9/drivers/net/lmc/lmc_debug.h	Tue Jun 20 23:08:03 2000
@@ -11,40 +11,7 @@
 #define LMC_CONSOLE_LOG(x,y,z)
 #endif
 
-
-
-/* Debug --- Event log definitions --- */
-/* EVENTLOGSIZE*EVENTLOGARGS needs to be a power of 2 */
-#define LMC_EVENTLOGSIZE 512	/* number of events in eventlog */
-#define LMC_EVENTLOGARGS 4		/* number of args for each event */
-
-/* event indicators */
-#define LMC_EVENT_XMT           1
-#define LMC_EVENT_XMTEND        2
-#define LMC_EVENT_XMTINT        3
-#define LMC_EVENT_RCVINT        4
-#define LMC_EVENT_RCVEND        5
-#define LMC_EVENT_INT           6
-#define LMC_EVENT_XMTINTTMO     7
-#define LMC_EVENT_XMTPRCTMO     8
-#define LMC_EVENT_INTEND        9
-#define LMC_EVENT_RESET1       10
-#define LMC_EVENT_RESET2       11
-#define LMC_EVENT_FORCEDRESET  12
-#define LMC_EVENT_WATCHDOG     13
-#define LMC_EVENT_BADPKTSURGE  14
-
-
-#ifdef DEBUG
-extern u_int32_t lmcEventLogIndex;
-extern u_int32_t lmcEventLogBuf[LMC_EVENTLOGSIZE * LMC_EVENTLOGARGS];
-#define LMC_EVENT_LOG(x, y, z) lmcEventLog((x), (y), (z))
-#else
-#define LMC_EVENT_LOG(x,y,z)
-#endif /* end ifdef _DBG_EVENTLOG */
-
-
 void lmcConsoleLog(char *type, unsigned char *ucData, int iLen);
-void lmcEventLog (u_int32_t EventNum, u_int32_t arg2, u_int32_t arg3);
+inline void lmc_trace(struct net_device *dev, char *msg);
 
 #endif
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/drivers/net/lmc/lmc_ioctl.h linux.17p9/drivers/net/lmc/lmc_ioctl.h
--- linux.vanilla/drivers/net/lmc/lmc_ioctl.h	Fri Apr 21 12:46:18 2000
+++ linux.17p9/drivers/net/lmc/lmc_ioctl.h	Tue Jun 20 23:08:03 2000
@@ -1,6 +1,6 @@
 #ifndef _LMC_IOCTL_H_
 #define _LMC_IOCTL_H_
-/*	$Id: lmc_ioctl.h,v 1.9 2000/01/21 13:29:47 asj Exp $	*/
+/*	$Id: lmc_ioctl.h,v 1.18 2000/06/06 08:32:12 asj Exp $	*/
 
  /*
   * Copyright (c) 1997-2000 LAN Media Corporation (LMC)
@@ -16,22 +16,20 @@
   * of the GNU Public License version 2, incorporated herein by reference.
   */
 
-#define LMCIOCGINFO         SIOCDEVPRIVATE+3 /* get current state */
-#define LMCIOCSINFO         SIOCDEVPRIVATE+4 /* set state to user values */
-#define LMCIOCSKEEPALIVE    SIOCDEVPRIVATE+5 /* Turn keepalives on/off */
-#ifdef  LMC_DEBUG_FILE
-#define LMCIOCLEARSTATS LMCIOCSINFO + 1 /* Clear debug stats */
-#endif
-#define LMCIOCGETLMCSTATS       LMCIOCSINFO + 3
-#define LMCIOCCLEARLMCSTATS     LMCIOCSINFO + 4
-#define LMCIOCDUMPEVENTLOG      LMCIOCSINFO + 5
-#define LMCIOCGETXINFO          LMCIOCSINFO + 6
-#define LMCIOCSETCIRCUIT        LMCIOCSINFO + 7
-#define LMCIOCUNUSEDATM         LMCIOCSINFO + 8
-#define LMCIOCRESET             LMCIOCSINFO + 9
-#define LMCIOCT1CONTROL         LMCIOCSINFO + 10
+#define LMCIOCGINFO             SIOCDEVPRIVATE+3 /* get current state */
+#define LMCIOCSINFO             SIOCDEVPRIVATE+4 /* set state to user values */
+#define LMCIOCGETLMCSTATS       SIOCDEVPRIVATE+5
+#define LMCIOCCLEARLMCSTATS     SIOCDEVPRIVATE+6
+#define LMCIOCDUMPEVENTLOG      SIOCDEVPRIVATE+7
+#define LMCIOCGETXINFO          SIOCDEVPRIVATE+8
+#define LMCIOCSETCIRCUIT        SIOCDEVPRIVATE+9
+#define LMCIOCUNUSEDATM         SIOCDEVPRIVATE+10
+#define LMCIOCRESET             SIOCDEVPRIVATE+11
+#define LMCIOCMEDIA             SIOCDEVPRIVATE+12
+#define LMCIOCIFTYPE            SIOCDEVPRIVATE+13
+#define LMCIOCXILINX            SIOCDEVPRIVATE+14
 
-#define LMC_CARDTYPE_UNKNOWN    -1
+#define LMC_CARDTYPE_UNKNOWN            -1
 #define LMC_CARDTYPE_HSSI               1       /* probed card is a HSSI card */
 #define LMC_CARDTYPE_DS3                2       /* probed card is a DS3 card */
 #define LMC_CARDTYPE_SSI                3       /* probed card is a SSI card */
@@ -61,6 +59,13 @@
 #define LMC_CTL_CIRCUIT_TYPE_T1 1
 
 /*
+ * IFTYPE defines
+ */
+#define LMC_PPP         1               /* use sppp interface */
+#define LMC_NET         2               /* use direct net interface */
+#define LMC_RAW         3               /* use direct net interface */
+
+/*
  * These are not in the least IOCTL related, but I want them common.
  */
 /*
@@ -68,10 +73,10 @@
  */
 #define LMC_GEP_INIT		0x01 /* 0: */
 #define LMC_GEP_RESET		0x02 /* 1: */
-#define LMC_GEP_LOAD		0x10 /* 4: */
+#define LMC_GEP_MODE		0x10 /* 4: */
 #define LMC_GEP_DP		0x20 /* 5: */
-#define LMC_GEP_SERIAL		0x40 /* 6: serial out */
-#define LMC_GEP_SERIALCLK	0x80 /* 7: serial clock */
+#define LMC_GEP_DATA		0x40 /* 6: serial out */
+#define LMC_GEP_CLK	        0x80 /* 7: serial clock */
 
 /*
  * HSSI GPIO assignments
@@ -80,12 +85,17 @@
 #define LMC_GEP_HSSI_CLOCK	0x08 /* 3: clock source */
 
 /*
- * T1 GPIO assignments
+ * SSI GPIO assignments
  */
 #define LMC_GEP_SSI_GENERATOR	0x04 /* 2: enable prog freq gen serial i/f */
 #define LMC_GEP_SSI_TXCLOCK	0x08 /* 3: provide clock on TXCLOCK output */
 
 /*
+ * T1 GPIO assigments
+ */
+#define LMC_GEP_T1_INT	        0x08 /* 3: Interupt enable */
+
+/*
  * Common MII16 bits
  */
 #define LMC_MII16_LED0         0x0080
@@ -118,6 +128,7 @@
 #define LMC_MII16_DS3_DLOS	0x0040
 #define LMC_MII16_DS3_CRC	0x1000
 #define LMC_MII16_DS3_SCRAM	0x2000
+#define LMC_MII16_DS3_SCRAM_LARS 0x4000
 
 /* Note: 2 pairs of LEDs where swapped by mistake
  * in Xilinx code for DS3 & DS1 adapters */
@@ -176,7 +187,8 @@
 /*
  * And T1, LMC1200
  */
-#define LMC_MII16_T1_UNUSED1    0x0003
+#define LMC_MII16_T1_UNUSED1            0x0001
+#define LMC_MII16_T1_INVERT             0x0002
 #define LMC_MII16_T1_XOE                0x0004
 #define LMC_MII16_T1_RST                0x0008  /* T1 chip reset - RW */
 #define LMC_MII16_T1_Z                  0x0010  /* output impedance T1=1, E1=0 output - RW */
@@ -224,6 +236,15 @@
 #define LMC_T1F_WRITE       0
 #define LMC_T1F_READ        1
 
+enum lmc_st1f_cmd {
+    lmc_st1f_write = 1,
+    lmc_st1f_read = 2,
+    lmc_st1f_inv = 3,
+    lmc_st1f_amisf = 4,
+    lmc_st1f_frac = 5,
+    lmc_st1f_loopt = 6,
+};
+
 typedef struct lmc_st1f_control {
   int command;
   int address;
@@ -231,9 +252,23 @@
   char *data;
 } lmc_t1f_control;
 
+
+
+enum lmc_xilinx_c {
+    lmc_xilinx_reset = 1,
+    lmc_xilinx_load_prom = 2,
+    lmc_xilinx_load = 3
+};
+
+struct lmc_xilinx_control {
+    enum lmc_xilinx_c command;
+    int len;
+    char *data;
+};
+
 /* ------------------ end T1 defs ------------------- */
 
 #define LMC_MII_LedMask                 0x0780
 #define LMC_MII_LedBitPos               7
 
-#endif
\ No newline at end of file
+#endif
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/drivers/net/lmc/lmc_main.c linux.17p9/drivers/net/lmc/lmc_main.c
--- linux.vanilla/drivers/net/lmc/lmc_main.c	Fri Apr 21 12:46:18 2000
+++ linux.17p9/drivers/net/lmc/lmc_main.c	Tue Jun 20 23:09:16 2000
@@ -11,7 +11,7 @@
   * With Help By:
   * David Boggs
   * Ron Crane
-  * Allan Cox
+  * Alan Cox
   *
   * This software may be used and distributed according to the terms
   * of the GNU Public License version 2, incorporated herein by reference.
@@ -36,10 +36,11 @@
   *
   */
 
-/* $Id: lmc_main.c,v 1.24 2000/01/21 13:29:48 asj Exp $ */
+/* $Id: lmc_main.c,v 1.44 2000/06/19 16:53:59 asj Exp $ */
 
-#include <linux/version.h>
 #include <linux/config.h>
+#include <linux/version.h>
+#include <linux/module.h>
 #include <linux/kernel.h>
 #include <linux/sched.h>
 #include <linux/string.h>
@@ -50,12 +51,10 @@
 #include <linux/malloc.h>
 #include <linux/interrupt.h>
 #include <linux/pci.h>
+#include <linux/delay.h>
+#include <linux/delay.h>
 #include <asm/segment.h>
-#include <asm/smp.h>
-
-#if LINUX_VERSION_CODE < 0x20155
-#include <linux/bios32.h>
-#endif
+#include <linux/init.h>
 
 #include <linux/in.h>
 #include <linux/if_arp.h>
@@ -72,64 +71,75 @@
 
 #if LINUX_VERSION_CODE >= 0x20200
 #include <asm/uaccess.h>
-#include <asm/spinlock.h>
-#endif
-
-#ifdef MODULE
-#ifdef MODVERSIONS
-#include <linux/modversions.h>
-#endif
-#include <linux/module.h>
-#include <linux/version.h>
-#else
-#define MOD_INC_USE_COUNT
-#define MOD_DEC_USE_COUNT
+//#include <asm/spinlock.h>
+#else				/* 2.0 kernel */
+#define ARPHRD_HDLC 513
 #endif
 
 #define DRIVER_MAJOR_VERSION     1
-#define DRIVER_MINOR_VERSION    33
-#define DRIVER_SUB_VERSION       1
+#define DRIVER_MINOR_VERSION    34
+#define DRIVER_SUB_VERSION       7
 
 #define DRIVER_VERSION  ((DRIVER_MAJOR_VERSION << 8) + DRIVER_MINOR_VERSION)
 
-#include "lmc.h"
 #include "lmc_ver.h"
+#include "lmc.h"
 #include "lmc_var.h"
 #include "lmc_ioctl.h"
 #include "lmc_debug.h"
+#include "lmc_proto.h"
+
 
 static int Lmc_Count = 0;
-static struct device *Lmc_root_dev = NULL;
+static struct net_device *Lmc_root_dev = NULL;
 static u8 cards_found = 0;
 
 static int lmc_first_load = 0;
 
-int lmc_probe_fake(struct device *dev);
-static struct device *lmc_probe1(struct device *dev, int ioaddr, int irq,
-				 int chip_id, int subdevice, int board_idx);
-static int lmc_start_xmit(struct sk_buff *skb, struct device *dev);
-static int lmc_rx(struct device *dev);
-static int lmc_open(struct device *dev);
-static int lmc_close(struct device *dev);
-static struct enet_statistics *lmc_get_stats(struct device *dev);
+int LMC_PKT_BUF_SZ = 1542;
+
+#if LINUX_VERSION_CODE >= 0x20363
+#ifdef MODULE
+static struct pci_device_id lmc_pci_tbl[] __devinitdata = {
+    { 0x1011, 0x009, 0x1376, PCI_ANY_ID, 0, 0, 0},
+    { 0, },
+};
+
+MODULE_DEVICE_TABLE(pci, lmc_pci_tbl);
+#endif
+#endif
+
+
+int lmc_probe_fake(struct net_device *dev);
+static struct net_device *lmc_probe1(struct net_device *dev, unsigned long ioaddr, unsigned int irq,
+				 int chip_id, int subdevice, int board_idx, void *pci_dev);
+static int lmc_start_xmit(struct sk_buff *skb, struct net_device *dev);
+static int lmc_start_xmit(struct sk_buff *skb, struct net_device *dev);
+static int lmc_rx (struct net_device *dev);
+static int lmc_open(struct net_device *dev);
+static int lmc_close(struct net_device *dev);
+static struct enet_statistics *lmc_get_stats(struct net_device *dev);
 static void lmc_interrupt(int irq, void *dev_instance, struct pt_regs *regs);
-static int lmc_ioctl(struct device *dev, struct ifreq *ifr, int cmd);
-static int lmc_set_config(struct device *dev, struct ifmap *map);
-static void lmc_initcsrs(lmc_softc_t * const, u32, size_t);
+static int lmc_set_config(struct net_device *dev, struct ifmap *map);
+static void lmc_initcsrs(lmc_softc_t * const sc, lmc_csrptr_t csr_base, size_t csr_size);
 static void lmc_softreset(lmc_softc_t * const);
-static void lmc_running_reset(struct device *dev);
-static int lmc_ifdown(struct device * const);
+static void lmc_running_reset(struct net_device *dev);
+static int lmc_ifdown(struct net_device * const);
 static void lmc_watchdog(unsigned long data);
-static int lmc_init(struct device * const);
+static int lmc_init(struct net_device * const);
 static void lmc_reset(lmc_softc_t * const sc);
 static void lmc_dec_reset(lmc_softc_t * const sc);
-static void lmc_initcsrs(lmc_softc_t * const sc, lmc_csrptr_t csr_base,size_t csr_size);
+#if LINUX_VERSION_CODE >= 0x20363
+static void lmc_driver_timeout(struct net_device *dev);
+int lmc_setup(void);
+#endif
+
 
 /*
  * linux reserves 16 device specific IOCTLs.  We call them
  * LMCIOC* to control various bits of our world.
  */
-static int lmc_ioctl (struct device *dev, struct ifreq *ifr, int cmd) /*fold00*/
+int lmc_ioctl (struct net_device *dev, struct ifreq *ifr, int cmd) /*fold00*/
 {
     lmc_softc_t *sc;
     lmc_ctl_t ctl;
@@ -143,23 +153,25 @@
 
     sc = dev->priv;
 
+    lmc_trace(dev, "lmc_ioctl in");
+
     /*
      * Most functions mess with the structure
      * Disable interupts while we do the polling
      */
-    spin_lock_irqsave(&sc->lmc_lock, flags);
+    LMC_SPIN_LOCK_IRQSAVE(sc);
 
     switch (cmd) {
         /*
          * Return current driver state.  Since we keep this up
          * To date internally, just copy this out to the user.
          */
-    case LMCIOCGINFO:
+    case LMCIOCGINFO: /*fold01*/
         LMC_COPY_TO_USER(ifr->ifr_data, &sc->ictl, sizeof (lmc_ctl_t));
         ret = 0;
         break;
 
-    case LMCIOCSINFO:
+    case LMCIOCSINFO: /*fold01*/
         sp = &((struct ppp_device *) dev)->sppp;
         if (!suser ()) {
             ret = -EPERM;
@@ -177,6 +189,10 @@
 
         if(ctl.crc_length != sc->ictl.crc_length) {
             sc->lmc_media->set_crc_length(sc, ctl.crc_length);
+	    if (sc->ictl.crc_length == LMC_CTL_CRC_LENGTH_16)
+		sc->TxDescriptControlInit |=  LMC_TDES_ADD_CRC_DISABLE;
+	    else
+		sc->TxDescriptControlInit &= ~LMC_TDES_ADD_CRC_DISABLE;
         }
 
         if (ctl.keepalive_onoff == LMC_CTL_OFF)
@@ -186,7 +202,39 @@
 
         ret = 0;
         break;
-    case LMCIOCGETXINFO:
+
+    case LMCIOCIFTYPE: /*fold01*/
+        {
+            u_int16_t	old_type = sc->if_type;
+            u_int16_t	new_type;
+
+	    if (!suser ()) {
+		ret = -EPERM;
+		break;
+	    }
+
+	    LMC_COPY_FROM_USER(&new_type, ifr->ifr_data, sizeof(u_int16_t));
+
+            
+	    if (new_type == old_type)
+	    {
+		ret = 0 ;
+		break;				/* no change */
+            }
+            
+            lmc_proto_close(sc);
+            lmc_proto_detach(sc);
+
+            sc->if_type = new_type;
+//            lmc_proto_init(sc);
+            lmc_proto_attach(sc);
+            lmc_proto_open(sc);
+
+	    ret = 0 ;
+	    break ;
+	}
+
+    case LMCIOCGETXINFO: /*fold01*/
         sc->lmc_xinfo.Magic0 = 0xBEEFCAFE;
 
         sc->lmc_xinfo.PciCardType = sc->lmc_cardtype;
@@ -196,7 +244,7 @@
         sc->lmc_xinfo.DriverSubVersion = DRIVER_SUB_VERSION;
         sc->lmc_xinfo.XilinxRevisionNumber =
             lmc_mii_readreg (sc, 0, 3) & 0xf;
-        sc->lmc_xinfo.MaxFrameSize = PKT_BUF_SZ;
+        sc->lmc_xinfo.MaxFrameSize = LMC_PKT_BUF_SZ;
         sc->lmc_xinfo.link_status = sc->lmc_media->get_link_status (sc);
         sc->lmc_xinfo.mii_reg16 = lmc_mii_readreg (sc, 0, 16);
 
@@ -208,7 +256,7 @@
 
         break;
 
-    case LMCIOCGETLMCSTATS:
+    case LMCIOCGETLMCSTATS: /*fold01*/
         if (sc->lmc_cardtype == LMC_CARDTYPE_T1){
             lmc_mii_writereg (sc, 0, 17, T1FRAMER_FERR_LSB);
             sc->stats.framingBitErrorCount +=
@@ -239,7 +287,7 @@
         ret = 0;
         break;
 
-    case LMCIOCCLEARLMCSTATS:
+    case LMCIOCCLEARLMCSTATS: /*fold01*/
         if (!suser ()){
             ret = -EPERM;
             break;
@@ -253,7 +301,7 @@
         ret = 0;
         break;
 
-    case LMCIOCSETCIRCUIT:
+    case LMCIOCSETCIRCUIT: /*fold01*/
         if (!suser ()){
             ret = -EPERM;
             break;
@@ -271,7 +319,7 @@
 
         break;
 
-    case LMCIOCRESET:
+    case LMCIOCRESET: /*fold01*/
         if (!suser ()){
             ret = -EPERM;
             break;
@@ -282,31 +330,289 @@
         lmc_running_reset (dev);
         printk (" REG16 after reset +%04x\n", lmc_mii_readreg (sc, 0, 16));
 
-        LMC_EVENT_LOG(LMC_EVENT_FORCEDRESET, LMC_CSR_READ (sc, csr_status), lmc_mii_readreg (sc, 0, 16));
-
         ret = 0;
         break;
+    case LMCIOCMEDIA: /*fold01*/
+        ret = sc->lmc_media->ioctl(sc, ifr->ifr_data);
+        break;
+    case LMCIOCXILINX: /*fold01*/
+        {
+            struct lmc_xilinx_control xc; /*fold02*/
 
-#ifdef DEBUG
-    case LMCIOCDUMPEVENTLOG:
-        LMC_COPY_TO_USER(ifr->ifr_data, &lmcEventLogIndex, sizeof (u32));
-        LMC_COPY_TO_USER(ifr->ifr_data + sizeof (u32), lmcEventLogBuf, sizeof (lmcEventLogBuf));
+            if (!suser ()){
+                ret = -EPERM;
+                break;
+            }
+
+            /*
+             * Stop the xwitter whlie we restart the hardware
+             */
+            LMC_XMITTER_BUSY(dev);
+
+            LMC_COPY_FROM_USER(&xc, ifr->ifr_data, sizeof (struct lmc_xilinx_control));
+            switch(xc.command){
+            case lmc_xilinx_reset: /*fold02*/
+                {
+                    u16 mii;
+                    mii = lmc_mii_readreg (sc, 0, 16);
+
+                    /*
+                     * Make all of them 0 and make input
+                     */
+                    lmc_gpio_mkinput(sc, 0xff);
+
+                    /*
+                     * make the reset output
+                     */
+                    lmc_gpio_mkoutput(sc, LMC_GEP_RESET);
+
+                    /*
+                     * RESET low to force configuration.  This also forces
+                     * the transmitter clock to be internal, but we expect to reset
+                     * that later anyway.
+                     */
+
+                    sc->lmc_gpio &= ~LMC_GEP_RESET;
+                    LMC_CSR_WRITE(sc, csr_gp, cpu_to_le32(sc->lmc_gpio));
+
+
+                    /*
+                     * hold for more than 10 microseconds
+                     */
+                    udelay(50);
+
+                    sc->lmc_gpio |= LMC_GEP_RESET;
+                    LMC_CSR_WRITE(sc, csr_gp, cpu_to_le32(sc->lmc_gpio));
+
+
+                    /*
+                     * stop driving Xilinx-related signals
+                     */
+                    lmc_gpio_mkinput(sc, 0xff);
+
+                    /* Reset the frammer hardware */
+                    sc->lmc_media->set_link_status (sc, 1);
+                    sc->lmc_media->set_status (sc, NULL);
+//                    lmc_softreset(sc);
+
+                    {
+                        int i;
+                        for(i = 0; i < 5; i++){
+                            lmc_led_on(sc, LMC_DS3_LED0);
+                            mdelay(100);
+                            lmc_led_off(sc, LMC_DS3_LED0);
+                            lmc_led_on(sc, LMC_DS3_LED1);
+                            mdelay(100);
+                            lmc_led_off(sc, LMC_DS3_LED1);
+                            lmc_led_on(sc, LMC_DS3_LED3);
+                            mdelay(100);
+                            lmc_led_off(sc, LMC_DS3_LED3);
+                            lmc_led_on(sc, LMC_DS3_LED2);
+                            mdelay(100);
+                            lmc_led_off(sc, LMC_DS3_LED2);
+                        }
+                    }
+                    
+                    
+
+                    ret = 0x0;
+
+                }
+
+                break;
+            case lmc_xilinx_load_prom: /*fold02*/
+                {
+                    u16 mii;
+                    int timeout = 500000;
+                    mii = lmc_mii_readreg (sc, 0, 16);
+
+                    /*
+                     * Make all of them 0 and make input
+                     */
+                    lmc_gpio_mkinput(sc, 0xff);
+
+                    /*
+                     * make the reset output
+                     */
+                    lmc_gpio_mkoutput(sc,  LMC_GEP_DP | LMC_GEP_RESET);
+
+                    /*
+                     * RESET low to force configuration.  This also forces
+                     * the transmitter clock to be internal, but we expect to reset
+                     * that later anyway.
+                     */
+
+                    sc->lmc_gpio &= ~(LMC_GEP_RESET | LMC_GEP_DP);
+                    LMC_CSR_WRITE(sc, csr_gp, cpu_to_le32(sc->lmc_gpio));
+
+
+                    /*
+                     * hold for more than 10 microseconds
+                     */
+                    udelay(50);
+
+                    sc->lmc_gpio |= LMC_GEP_DP | LMC_GEP_RESET;
+                    LMC_CSR_WRITE(sc, csr_gp, cpu_to_le32(sc->lmc_gpio));
+
+                    /*
+                     * busy wait for the chip to reset
+                     */
+                    while( (le32_to_cpu(LMC_CSR_READ(sc, csr_gp)) & LMC_GEP_INIT) == 0 &&
+                           (timeout-- > 0))
+                        ;
+
+                    /*
+                     * stop driving Xilinx-related signals
+                     */
+                    lmc_gpio_mkinput(sc, 0xff);
+                    ret = 0x0;
+                    break;
+
+                }
+
+            case lmc_xilinx_load: /*fold02*/
+                {
+                    char *data;
+                    int pos;
+                    int timeout = 500000;
+
+                    if(xc.data == 0x0){
+                            ret = -EINVAL;
+                            break;
+                    }
+
+                    data = kmalloc(xc.len, GFP_KERNEL);
+                    if(data == 0x0){
+                            printk(KERN_WARNING "%s: Failed to allocate memory for copy\n", dev->name);
+                            ret = -ENOMEM;
+                            break;
+                    }
+                    
+                    LMC_COPY_FROM_USER(data, xc.data, xc.len);
+
+                    printk("%s: Starting load of data Len: %d at 0x%p == 0x%p\n", dev->name, xc.len, xc.data, data);
+
+                    lmc_gpio_mkinput(sc, 0xff);
+
+                    /*
+                     * Clear the Xilinx and start prgramming from the DEC
+                     */
+
+                    /*
+                     * Set ouput as:
+                     * Reset: 0 (active)
+                     * DP:    0 (active)
+                     * Mode:  1
+                     *
+                     */
+                    sc->lmc_gpio = 0x00;
+                    sc->lmc_gpio &= ~LMC_GEP_DP;
+                    sc->lmc_gpio &= ~LMC_GEP_RESET;
+                    sc->lmc_gpio |=  LMC_GEP_MODE;
+                    LMC_CSR_WRITE(sc, csr_gp, cpu_to_le32(sc->lmc_gpio));
+
+                    lmc_gpio_mkoutput(sc, LMC_GEP_MODE | LMC_GEP_DP | LMC_GEP_RESET);
+
+                    /*
+                     * Wait at least 10 us 20 to be safe
+                     */
+                    udelay(50);
+
+                    /*
+                     * Clear reset and activate programing lines
+                     * Reset: Input
+                     * DP:    Input
+                     * Clock: Output
+                     * Data:  Output
+                     * Mode:  Output
+                     */
+                    lmc_gpio_mkinput(sc, LMC_GEP_DP | LMC_GEP_RESET);
+
+                    /*
+                     * Set LOAD, DATA, Clock to 1
+                     */
+                    sc->lmc_gpio = 0x00;
+                    sc->lmc_gpio |= LMC_GEP_MODE;
+                    sc->lmc_gpio |= LMC_GEP_DATA;
+                    sc->lmc_gpio |= LMC_GEP_CLK;
+                    LMC_CSR_WRITE(sc, csr_gp, cpu_to_le32(sc->lmc_gpio));
+                    
+                    lmc_gpio_mkoutput(sc, LMC_GEP_DATA | LMC_GEP_CLK | LMC_GEP_MODE );
+
+                    /*
+                     * busy wait for the chip to reset
+                     */
+                    while( (le32_to_cpu(LMC_CSR_READ(sc, csr_gp)) & LMC_GEP_INIT) == 0 &&
+                           (timeout-- > 0))
+                        ;
+
+                    printk(KERN_DEBUG "%s: Waited %d for the Xilinx to clear it's memory\n", dev->name, 500000-timeout);
+
+                    for(pos = 0; pos < xc.len; pos++){
+                        switch(data[pos]){
+                        case 0:
+                            sc->lmc_gpio &= ~LMC_GEP_DATA; /* Data is 0 */
+                            break;
+                        case 1:
+                            sc->lmc_gpio |= LMC_GEP_DATA; /* Data is 1 */
+                            break;
+                        default:
+                            printk(KERN_WARNING "%s Bad data in xilinx programing data at %d, got %d wanted 0 or 1\n", dev->name, pos, data[pos]);
+                            sc->lmc_gpio |= LMC_GEP_DATA; /* Assume it's 1 */
+                        }
+                        sc->lmc_gpio &= ~LMC_GEP_CLK; /* Clock to zero */
+                        sc->lmc_gpio |= LMC_GEP_MODE;
+                        LMC_CSR_WRITE(sc, csr_gp, cpu_to_le32(sc->lmc_gpio));
+                        udelay(1);
+                        
+                        sc->lmc_gpio |= LMC_GEP_CLK; /* Put the clack back to one */
+                        sc->lmc_gpio |= LMC_GEP_MODE;
+                        LMC_CSR_WRITE(sc, csr_gp, cpu_to_le32(sc->lmc_gpio));
+                        udelay(1);
+                    }
+                    if((le32_to_cpu(LMC_CSR_READ(sc, csr_gp)) & LMC_GEP_INIT) == 0){
+                        printk(KERN_WARNING "%s: Reprograming FAILED. Needs to be reprogramed. (corrupted data)\n", dev->name);
+                    }
+                    else if((le32_to_cpu(LMC_CSR_READ(sc, csr_gp)) & LMC_GEP_DP) == 0){
+                        printk(KERN_WARNING "%s: Reprograming FAILED. Needs to be reprogramed. (done)\n", dev->name);
+                    }
+                    else {
+                        printk(KERN_DEBUG "%s: Done reprograming Xilinx, %d bits, good luck!\n", dev->name, pos);
+                    }
+
+                    lmc_gpio_mkinput(sc, 0xff);
+                    
+                    sc->lmc_miireg16 |= LMC_MII16_FIFO_RESET;
+                    lmc_mii_writereg(sc, 0, 16, sc->lmc_miireg16);
+
+                    sc->lmc_miireg16 &= ~LMC_MII16_FIFO_RESET;
+                    lmc_mii_writereg(sc, 0, 16, sc->lmc_miireg16);
+
+                    kfree(data);
+                    
+                    ret = 0;
+                    
+                    break;
+                }
+            default: /*fold02*/
+                ret = -EBADE;
+                break;
+            }
+
+            LMC_XMITTER_FREE(dev);
+            sc->lmc_txfull = 0;
 
-        ret = 0;
-        break;
-#endif /* end ifdef _DBG_EVENTLOG */
-    case LMCIOCT1CONTROL:
-        if (sc->lmc_cardtype != LMC_CARDTYPE_T1){
-            ret = -EOPNOTSUPP;
-            break;
         }
         break;
-    default:
-        /* If we don't know what to do, give syncppp a shot. */
-        ret = sppp_do_ioctl (dev, ifr, cmd);
+    default: /*fold01*/
+        /* If we don't know what to do, give the protocol a shot. */
+        ret = lmc_proto_ioctl (sc, ifr, cmd);
+        break;
     }
 
-    spin_unlock_irqrestore(&sc->lmc_lock, flags);
+    LMC_SPIN_UNLOCK_IRQRESTORE(sc); /*fold01*/
+
+    lmc_trace(dev, "lmc_ioctl out");
 
     return ret;
 }
@@ -315,29 +621,35 @@
 /* the watchdog process that cruises around */
 static void lmc_watchdog (unsigned long data) /*fold00*/
 {
-    struct device *dev = (struct device *) data;
+    struct net_device *dev = (struct net_device *) data;
     lmc_softc_t *sc;
     int link_status;
     u_int32_t ticks;
-    LMC_SPIN_FLAGS
+    LMC_SPIN_FLAGS;
 
     sc = dev->priv;
 
-    spin_lock_irqsave(&sc->lmc_lock, flags);
+    lmc_trace(dev, "lmc_watchdog in");
+
+    LMC_SPIN_LOCK_IRQSAVE(sc);
+
+    if(sc->check != 0xBEAFCAFE){
+        printk("LMC: Corrupt net_device stuct, breaking out\n");
+        return;
+    }
+
 
     /* Make sure the tx jabber and rx watchdog are off,
      * and the transmit and recieve processes are running.
      */
 
-    LMC_CSR_WRITE (sc, csr_15, 0x00000011);
+    LMC_CSR_WRITE (sc, csr_15, cpu_to_le32(0x00000011));
     sc->lmc_cmdmode |= TULIP_CMD_TXRUN | TULIP_CMD_RXRUN;
-    LMC_CSR_WRITE (sc, csr_command, sc->lmc_cmdmode);
+    LMC_CSR_WRITE (sc, csr_command, cpu_to_le32(sc->lmc_cmdmode));
 
     if (sc->lmc_ok == 0)
         goto kick_timer;
 
-    LMC_EVENT_LOG(LMC_EVENT_WATCHDOG, LMC_CSR_READ (sc, csr_status), lmc_mii_readreg (sc, 0, 16));
-
     /* --- begin time out check -----------------------------------
      * check for a transmit interrupt timeout
      * Has the packet xmt vs xmt serviced threshold been exceeded */
@@ -354,26 +666,12 @@
              sc->tx_TimeoutInd)
     {
 
-        LMC_EVENT_LOG(LMC_EVENT_XMTINTTMO, LMC_CSR_READ (sc, csr_status), 0);
-
         sc->tx_TimeoutDisplay = 1;
         sc->stats.tx_TimeoutCnt++;
 
         /* DEC chip is stuck, hit it with a RESET!!!! */
         lmc_running_reset (dev);
 
-
-        /* look at receive & transmit process state to make sure they are running */
-        LMC_EVENT_LOG(LMC_EVENT_RESET1, LMC_CSR_READ (sc, csr_status), 0);
-
-        /* look at: DSR - 02  for Reg 16
-         *                  CTS - 08
-         *                  DCD - 10
-         *                  RI  - 20
-         * for Reg 17
-         */
-        LMC_EVENT_LOG(LMC_EVENT_RESET2, lmc_mii_readreg (sc, 0, 16), lmc_mii_readreg (sc, 0, 17));
-
         /* reset the transmit timeout detection flag */
         sc->tx_TimeoutInd = 0;
         sc->lastlmc_taint_tx = sc->lmc_taint_tx;
@@ -396,7 +694,7 @@
      * Mark it as down.
      */
     if ((link_status == 0) && (sc->last_link_status != 0)) {
-        printk(KERN_WARNING "%s: link down\n", dev->name);
+        printk(KERN_WARNING "%s: hardware/physical link down\n", dev->name);
         sc->last_link_status = 0;
         /* lmc_reset (sc); Why reset??? The link can go down ok */
 
@@ -409,7 +707,7 @@
      * Bring it back up again.
      */
      if (link_status != 0 && sc->last_link_status == 0) {
-         printk(KERN_WARNING "%s: link up\n", dev->name);
+         printk(KERN_WARNING "%s: hardware/physical link up\n", dev->name);
          sc->last_link_status = 1;
          /* lmc_reset (sc); Again why reset??? */
 
@@ -424,7 +722,7 @@
           * --bbraun
           */
 
-         sppp_reopen (dev);
+         lmc_proto_reopen(sc);
 
      }
 
@@ -435,7 +733,29 @@
      * Poke the transmitter to make sure it
      * never stops, even if we run out of mem
      */
-    LMC_CSR_WRITE(sc, csr_rxpoll, 0);
+    LMC_CSR_WRITE(sc, csr_rxpoll, cpu_to_le32(0));
+
+    /*
+     * Check for code that failed
+     * and try and fix it as appropriate
+     */
+    if(sc->failed_ring == 1){
+        /*
+         * Failed to setup the recv/xmit rin
+         * Try again
+         */
+        sc->failed_ring = 0;
+        lmc_softreset(sc);
+    }
+    if(sc->failed_recv_alloc == 1){
+        /*
+         * We failed to alloc mem in the
+         * interupt halder, go through the rings
+         * and rebuild them
+         */
+        sc->failed_recv_alloc = 0;
+        lmc_softreset(sc);
+    }
 
 
     /*
@@ -443,8 +763,8 @@
      */
 kick_timer:
 
-    ticks = LMC_CSR_READ (sc, csr_gp_timer);
-    LMC_CSR_WRITE (sc, csr_gp_timer, 0xffffffffUL);
+    ticks = le32_to_cpu(LMC_CSR_READ (sc, csr_gp_timer));
+    LMC_CSR_WRITE (sc, csr_gp_timer, cpu_to_le32(0xffffffffUL));
     sc->ictl.ticks = 0x0000ffff - (ticks & 0x0000ffff);
 
     /*
@@ -453,58 +773,87 @@
     sc->timer.expires = jiffies + (HZ);
     add_timer (&sc->timer);
 
-    spin_unlock_irqrestore(&sc->lmc_lock, flags);
+    LMC_SPIN_UNLOCK_IRQRESTORE(sc);
+
+    lmc_trace(dev, "lmc_watchdog out");
 
 }
 
-static int lmc_init(struct device * const dev) /*fold00*/
+static int lmc_init(struct net_device * const dev) /*fold00*/
 {
+    lmc_trace(dev, "lmc_init in");
+    lmc_trace(dev, "lmc_init out");
+	
     return 0;
 }
 
 /* This initializes each card from lmc_probe() */
-static struct device *lmc_probe1 (struct device *dev, int ioaddr, int irq, /*fold00*/
-                                  int chip_id, int subdevice, int board_idx)
+static struct net_device *lmc_probe1 (struct net_device *dev, unsigned long ioaddr, unsigned int irq, /*FOLD00*/
+                                  int chip_id, int subdevice, int board_idx, void *pci_dev)
 {
     lmc_softc_t *sc = NULL;
     u_int16_t AdapModelNum;
-
+#if LINUX_VERSION_CODE >= 0x20363
+    struct pci_dev *pdev = pci_dev;
+    dma_addr_t dma_handle;
+#endif
     /*
      * Allocate our own device structure
      */
-
+    
+#if LINUX_VERSION_CODE < 0x20210 /* Changed in 2.2.16 */
     dev = kmalloc (sizeof (struct ppp_device)+8, GFP_KERNEL);
+#else
+    dev = kmalloc (sizeof (struct net_device)+8, GFP_KERNEL);
+#endif
     if (dev == NULL){
         printk (KERN_ERR "lmc: kmalloc for device failed\n");
         return NULL;
     }
-    memset (dev, 0, sizeof (struct ppp_device));
+    memset (dev, 0, sizeof (struct net_device));
 
-	/*
-	 *	Switch to common hdlc%d naming. We name by type not by vendor
-	 */
-    dev->name = (char *) (((u32) (dev)) + sizeof (struct ppp_device));
+#ifndef GCOM
+    /*
+     *	Switch to common hdlc%d naming. We name by type not by vendor
+     */
+#if LINUX_VERSION_CODE < 0x20210
+    dev->name = ((char *) (dev)) + sizeof (struct ppp_device);
+#elif LINUX_VERSION_CODE < 0x20363
+    dev->name = ((char *) (dev)) + sizeof (struct net_device);
+#endif
+
+#if LINUX_VERSION_CODE >= 0x20200
     dev_alloc_name(dev, "hdlc%d");
+#else
+    sprintf(dev->name, "hdlc%d", Lmc_Count);
+#endif
+    
+#else
+    /*
+     * GCOM uses LMC vendor name so that clients can know which card
+     * to attach to.
+     */
+    dev->name = ((char *) (dev)) + sizeof (struct ppp_device);
+    dev_alloc_name(dev, "lmc%d");
+#endif
 
+    lmc_trace(dev, "lmc_probe1 in");
+    
     Lmc_Count++;
 
     if(lmc_first_load == 0){
         printk(KERN_INFO "Lan Media Corporation WAN Driver Version %d.%d.%d\n",DRIVER_MAJOR_VERSION, DRIVER_MINOR_VERSION,DRIVER_SUB_VERSION);
-#ifndef MODULE
-        sync_ppp_init();
-#endif
         lmc_first_load = 1;
     }
-
-
-    /* Initialize the sppp layer */
-    sppp_attach ((struct ppp_device *) dev);
-
+    
     /*
      * Allocate space for the private data structure
      */
-
+#if LINUX_VERSION_CODE >= 0x20363
+    sc = pci_alloc_consistent(pdev, sizeof (lmc_softc_t), &dma_handle);
+#else
     sc = kmalloc (sizeof (lmc_softc_t), GFP_KERNEL);
+#endif
     if (sc == NULL) {
         printk (KERN_WARNING "%s: Cannot allocate memory for device state\n",
                 dev->name);
@@ -514,16 +863,37 @@
     dev->priv = sc;
     sc->lmc_device = dev;
     sc->name = dev->name;
-
+    sc->if_type = LMC_PPP;
+    sc->check = 0xBEAFCAFE;
+#if LINUX_VERSION_CODE >= 0x20363
+    sc->pdev = pdev;
+    sc->sc_dma_handle = dma_handle;
+    sc->sc_dma = (lmc_softc_t *) dma_handle;
+#endif
+    
+    dev->base_addr = ioaddr;
+    dev->irq = irq;
+    /*
+     * This will get the protocol layer ready and do any 1 time init's
+     * Must have a valid sc and dev structure
+     */
+    lmc_proto_init(sc);
+    lmc_proto_attach(sc);
     /* Just fill in the entries for the device */
 
     dev->init = lmc_init;
+    dev->type = ARPHRD_HDLC;
     dev->hard_start_xmit = lmc_start_xmit;
     dev->open = lmc_open;
     dev->stop = lmc_close;
     dev->get_stats = lmc_get_stats;
     dev->do_ioctl = lmc_ioctl;
     dev->set_config = lmc_set_config;
+#if LINUX_VERSION_CODE >= 0x20363
+    dev->tx_timeout = lmc_driver_timeout;
+    dev->watchdog_timeo = (HZ); /* 1 second */
+#endif
+
     /*
      * Why were we changing this???
      dev->tx_queue_len = 100;
@@ -531,18 +901,15 @@
 
     /* Init the spin lock so can call it latter */
 
-    spin_lock_init(&sc->lmc_lock);
+    LMC_SPIN_LOCK_INIT(sc);
 
     LMC_SETUP_20_DEV;
-
-    printk ("%s: detected at %#3x, irq %d\n", dev->name, ioaddr, irq);
-
-    dev->base_addr = ioaddr;
-    dev->irq = irq;
+    
+    printk ("%s: detected at %lx, irq %d\n", dev->name, ioaddr, dev->irq);
 
     if (register_netdev (dev) != 0) {
         printk (KERN_ERR "%s: register_netdev failed.\n", dev->name);
-        sppp_detach (dev);
+        lmc_proto_detach(sc);
         kfree (dev->priv);
         kfree (dev);
         return NULL;
@@ -610,14 +977,14 @@
 
     }
     else {
-        printk ("%s: Model number (%d) miscompare for PCI Subsystem ID = 0x%04x\n",
+        /* Print a warning but not a major failure case */
+        printk (KERN_WARNING "%s: Model number (%d) miscompare for PCI Subsystem ID = 0x%04x\n",
                 dev->name, AdapModelNum, subdevice);
-        return (NULL);
     }
     /*
      * reset clock
      */
-    LMC_CSR_WRITE (sc, csr_gp_timer, 0xFFFFFFFFUL);
+    LMC_CSR_WRITE (sc, csr_gp_timer, cpu_to_le32(0xFFFFFFFFUL));
 
     sc->board_idx = board_idx;
 
@@ -631,6 +998,8 @@
     sc->lmc_ok = 0;
     sc->last_link_status = 0;
 
+    lmc_trace(dev, "lmc_probe1 out");
+
     return dev;
 }
 
@@ -638,19 +1007,29 @@
 /* This is the entry point.  This is what is called immediatly. */
 /* This goes out and finds the card */
 
-int lmc_probe_fake(struct device *dev)
+int lmc_probe_fake(struct net_device *dev) /*fold00*/
 {
     lmc_probe(NULL);
     /* Return 1 to unloaded bogus device */
     return 1;
 }
 
-int lmc_probe (struct device *dev) /*fold00*/
+int lmc_probe (struct net_device *dev) /*fold00*/
 {
     int pci_index = 0;
+#if LINUX_VERSION_CODE >= 0x20155
+    unsigned long pci_ioaddr;
+    unsigned int pci_irq_line;
+    struct pci_dev *pdev;
+#if LINUX_VERSION_CODE < 0x20363
+    unsigned short pci_command;
+#endif
+#else
     unsigned char pci_irq_line;
+    u32 pci_ioaddr;
+#endif
     u16 vendor, subvendor, device, subdevice;
-    u32 pci_ioaddr, foundaddr = 0;
+    u32 foundaddr = 0;
     unsigned char pci_bus, pci_device_fn;
     u8 intcf = 0;
 
@@ -674,16 +1053,31 @@
         /* Read the info we need to determine if this is
          * our card or not
          */
-#if LINUX_VERSION_CODE >= 0x20155
-        vendor = pci_find_slot (pci_bus, pci_device_fn)->vendor;
-        device = pci_find_slot (pci_bus, pci_device_fn)->device;
-        pci_irq_line = pci_find_slot (pci_bus, pci_device_fn)->irq;
-        pci_ioaddr = pci_find_slot (pci_bus, pci_device_fn)->base_address[0];
-        pci_read_config_word (pci_find_slot (pci_bus, pci_device_fn),
-                              PCI_SUBSYSTEM_VENDOR_ID, &subvendor);
-        pci_read_config_word (pci_find_slot (pci_bus, pci_device_fn),
-                              PCI_SUBSYSTEM_ID, &subdevice);
-#else
+#if LINUX_VERSION_CODE >= 0x20155 /* 2.2, 2.4 */
+        pdev = pci_find_slot (pci_bus, pci_device_fn);
+        
+        if (!pdev)
+            break;
+
+#if LINUX_VERSION_CODE >= 0x20363
+        if(pci_enable_device(pdev)){
+            break;
+        }
+#endif
+        
+        vendor = pdev->vendor;
+        device = pdev->device;
+        pci_irq_line = pdev->irq;
+#if LINUX_VERSION_CODE < 0x20363 /* 2.2 */
+        pci_ioaddr = pdev->base_address[0];
+        pci_read_config_word (pdev, PCI_SUBSYSTEM_VENDOR_ID, &subvendor);
+        pci_read_config_word (pdev, PCI_SUBSYSTEM_ID, &subdevice);
+#else /* 2.4 */
+        pci_ioaddr = pci_resource_start (pdev, 0);
+        subvendor = pdev->subsystem_vendor;
+        subdevice = pdev->subsystem_device;
+#endif
+#else /* 2.0 */
         pcibios_read_config_word (pci_bus, pci_device_fn,
                                   PCI_VENDOR_ID, &vendor);
         pcibios_read_config_word (pci_bus, pci_device_fn,
@@ -717,7 +1111,7 @@
             (vendor == CORRECT_VENDOR_ID) &&
             (device == CORRECT_DEV_ID) &&
             ((subvendor == PCI_VENDOR_LMC)  || (subdevice == PCI_VENDOR_LMC))){
-            struct device *cur, *prev = NULL;
+            struct net_device *cur, *prev = NULL;
 
             /* Fix the error, exchange the two values */
             if(subdevice == PCI_VENDOR_LMC){
@@ -725,9 +1119,27 @@
                 subvendor = PCI_VENDOR_LMC ;
             }
 
+            /* Set the bus master bit */
+#if LINUX_VERSION_CODE < 0x20363
+#if LINUX_VERSION_CODE > 0x20155
+            pci_read_config_word(pdev, PCI_COMMAND,
+                                 &pci_command);
+            pci_command |= PCI_COMMAND_MASTER;
+            pci_write_config_word(pdev, PCI_COMMAND,
+                                  pci_command);
+#endif
+            /* Make the call to actually setup this card */
+            dev = lmc_probe1 (dev, pci_ioaddr, pci_irq_line,
+                              device, subdevice, cards_found, 0x0);
+
+#else
+            pci_set_master (pdev);
             /* Make the call to actually setup this card */
             dev = lmc_probe1 (dev, pci_ioaddr, pci_irq_line,
-                              device, subdevice, cards_found);
+                              device, subdevice, cards_found, pdev);
+
+#endif
+
             if (dev == NULL) {
                 printk ("lmc_probe: lmc_probe1 failed\n");
                 goto lmc_probe_next_card;
@@ -769,28 +1181,28 @@
 /* After this is called, packets can be sent.
  * Does not initialize the addresses
  */
-static int lmc_open (struct device *dev) /*fold00*/
+static int lmc_open (struct net_device *dev) /*fold00*/
 {
     lmc_softc_t *sc = dev->priv;
-    int err;
 
-    lmc_dec_reset (sc);
-    lmc_reset (sc);
+    lmc_trace(dev, "lmc_open in");
 
-    LMC_EVENT_LOG(LMC_EVENT_RESET1, LMC_CSR_READ (sc, csr_status), 0);
-    LMC_EVENT_LOG(LMC_EVENT_RESET2,
-                  lmc_mii_readreg (sc, 0, 16),
-                  lmc_mii_readreg (sc, 0, 17));
+    lmc_led_on(sc, LMC_DS3_LED0);
 
+    lmc_dec_reset (sc);
+    lmc_reset (sc);
 
-    if (sc->lmc_ok)
+    if (sc->lmc_ok){
+        lmc_trace(dev, "lmc_open lmc_ok out");
         return (0);
+    }
 
     lmc_softreset (sc);
 
     /* Since we have to use PCI bus, this should work on x86,alpha,ppc */
     if (request_irq (dev->irq, &lmc_interrupt, SA_SHIRQ, dev->name, dev)){
         printk(KERN_WARNING "%s: could not get irq: %d\n", dev->name, dev->irq);
+        lmc_trace(dev, "lmc_open irq failed out");
         return -EAGAIN;
     }
     sc->got_irq = 1;
@@ -818,17 +1230,23 @@
         /* disable 32 bit CRC generated by ASIC */
         sc->TxDescriptControlInit |= LMC_TDES_ADD_CRC_DISABLE;
     }
+    sc->lmc_media->set_crc_length(sc, sc->ictl.crc_length);
     /* Acknoledge the Terminal Active and light LEDs */
 
     /* dev->flags |= IFF_UP; */
 
-    err = sppp_open (dev);
-    if (err){
-        return err;
-    }
+    lmc_proto_open(sc);
+
     dev->do_ioctl = lmc_ioctl;
-    dev->tbusy = 0;
+
+
+    LMC_XMITTER_INIT(dev);
+    
+#if LINUX_VERSION_CODE < 0x20363
     dev->start = 1;
+#endif
+    
+    sc->stats.tx_tbusy0++ ;
 
     MOD_INC_USE_COUNT;
 
@@ -845,12 +1263,13 @@
                          | TULIP_STS_TXSTOPPED
                          | TULIP_STS_TXUNDERFLOW
                          | TULIP_STS_RXSTOPPED
+		         | TULIP_STS_RXNOBUF
                         );
-    LMC_CSR_WRITE (sc, csr_intr, sc->lmc_intrmask);
+    LMC_CSR_WRITE (sc, csr_intr, cpu_to_le32(sc->lmc_intrmask));
 
     sc->lmc_cmdmode |= TULIP_CMD_TXRUN;
     sc->lmc_cmdmode |= TULIP_CMD_RXRUN;
-    LMC_CSR_WRITE (sc, csr_command, sc->lmc_cmdmode);
+    LMC_CSR_WRITE (sc, csr_command, cpu_to_le32(sc->lmc_cmdmode));
 
     sc->lmc_ok = 1; /* Run watchdog */
 
@@ -870,6 +1289,8 @@
     sc->timer.function = &lmc_watchdog;
     add_timer (&sc->timer);
 
+    lmc_trace(dev, "lmc_open out");
+
     return (0);
 }
 
@@ -877,14 +1298,16 @@
  *  under heavy load
  */
 
-static void lmc_running_reset (struct device *dev) /*fold00*/
+static void lmc_running_reset (struct net_device *dev) /*fold00*/
 {
 
     lmc_softc_t *sc = (lmc_softc_t *) dev->priv;
 
+    lmc_trace(dev, "lmc_runnig_reset in");
+
     /* stop interrupts */
     /* Clear the interrupt mask */
-    LMC_CSR_WRITE (sc, csr_intr, 0x00000000);
+    LMC_CSR_WRITE (sc, csr_intr, cpu_to_le32(0x00000000));
 
     lmc_dec_reset (sc);
     lmc_reset (sc);
@@ -893,15 +1316,20 @@
     sc->lmc_media->set_link_status (sc, 1);
     sc->lmc_media->set_status (sc, NULL);
 
-    dev->flags |= IFF_RUNNING;
-    dev->tbusy = 0;
+    //dev->flags |= IFF_RUNNING;
+    
+    LMC_XMITTER_FREE(dev);
+
     sc->lmc_txfull = 0;
+    sc->stats.tx_tbusy0++ ;
 
     sc->lmc_intrmask = TULIP_DEFAULT_INTR_MASK;
-    LMC_CSR_WRITE (sc, csr_intr, sc->lmc_intrmask);
+    LMC_CSR_WRITE (sc, csr_intr, cpu_to_le32(sc->lmc_intrmask));
 
     sc->lmc_cmdmode |= (TULIP_CMD_TXRUN | TULIP_CMD_RXRUN);
-    LMC_CSR_WRITE (sc, csr_command, sc->lmc_cmdmode);
+    LMC_CSR_WRITE (sc, csr_command, cpu_to_le32(sc->lmc_cmdmode));
+
+    lmc_trace(dev, "lmc_runnin_reset_out");
 }
 
 
@@ -909,47 +1337,68 @@
  * This disables the timer for the watchdog and keepalives,
  * and disables the irq for dev.
  */
-static int lmc_close (struct device *dev) /*fold00*/
+static int lmc_close (struct net_device *dev) /*fold00*/
 {
     /* not calling release_region() as we should */
-    lmc_softc_t *sc;
+    lmc_softc_t *sc = dev->priv;
 
+    lmc_trace(dev, "lmc_close in");
+    
     sc = dev->priv;
     sc->lmc_ok = 0;
     sc->lmc_media->set_link_status (sc, 0);
     del_timer (&sc->timer);
-    sppp_close (dev);
+    lmc_proto_close(sc);
     lmc_ifdown (dev);
 
+#if LINUX_VERSION_CODE < 0x20363
+    dev->start = 0;
+#endif
+
+    
+    /*
+     * Let's make sure all the leds are off
+     * when not configured
+     */
+    lmc_led_off(sc, LMC_DS3_LED0);
+    lmc_led_off(sc, LMC_DS3_LED1);
+    lmc_led_off(sc, LMC_DS3_LED2);
+    lmc_led_off(sc, LMC_DS3_LED3);
+
+    lmc_trace(dev, "lmc_close out");
+    
     return 0;
 }
 
 /* Ends the transfer of packets */
 /* When the interface goes down, this is called */
-static int lmc_ifdown (struct device *dev) /*fold00*/
+static int lmc_ifdown (struct net_device *dev) /*fold00*/
 {
     lmc_softc_t *sc = dev->priv;
     u32 csr6;
     int i;
 
+    lmc_trace(dev, "lmc_ifdown in");
+    
     /* Don't let anything else go on right now */
-    dev->start = 0;
-    dev->tbusy = 1;
+    //    dev->start = 0;
+    LMC_XMITTER_BUSY(dev);
+    sc->stats.tx_tbusy1++ ;
 
     /* stop interrupts */
     /* Clear the interrupt mask */
-    LMC_CSR_WRITE (sc, csr_intr, 0x00000000);
+    LMC_CSR_WRITE (sc, csr_intr, cpu_to_le32(0x00000000));
 
     /* Stop Tx and Rx on the chip */
-    csr6 = LMC_CSR_READ (sc, csr_command);
+    csr6 = le32_to_cpu(LMC_CSR_READ (sc, csr_command));
     csr6 &= ~LMC_DEC_ST;		/* Turn off the Transmission bit */
     csr6 &= ~LMC_DEC_SR;		/* Turn off the Recieve bit */
-    LMC_CSR_WRITE (sc, csr_command, csr6);
+    LMC_CSR_WRITE (sc, csr_command, cpu_to_le32(csr6));
 
     dev->flags &= ~IFF_RUNNING;
 
     sc->stats.rx_missed_errors +=
-        LMC_CSR_READ (sc, csr_missed_frames) & 0xffff;
+        le32_to_cpu(LMC_CSR_READ (sc, csr_missed_frames)) & 0xffff;
 
     /* release the interrupt */
     if(sc->got_irq == 1){
@@ -982,7 +1431,10 @@
 
     lmc_led_off (sc, LMC_MII16_LED_ALL);
 
-    dev->tbusy = 0;
+    LMC_XMITTER_FREE(dev);
+    sc->stats.tx_tbusy0++ ;
+
+    lmc_trace(dev, "lmc_ifdown out");
 
     MOD_DEC_USE_COUNT;
     return 0;
@@ -993,31 +1445,34 @@
  */
 static void lmc_interrupt (int irq, void *dev_instance, struct pt_regs *regs) /*fold00*/
 {
-    struct device *dev = (struct device *) dev_instance;
-    lmc_softc_t *sc;
+    struct net_device *dev = (struct net_device *) dev_instance;
+    lmc_softc_t *sc = dev->priv;
     u32 csr;
     int i;
     s32 stat;
     unsigned int badtx;
     u32 firstcsr;
+    int max_work = LMC_RXDESCS;
+    unsigned long flags;
 
-    sc = dev->priv;
+    lmc_trace(dev, "lmc_interrupt in");
 
-    spin_lock(&sc->lmc_lock);
 
-    if (test_and_set_bit (0, (void *) &dev->interrupt)) {
-        goto lmc_int_fail_out;
-    }
+    LMC_SPIN_LOCK_IRQSAVE(sc);
 
     /*
      * Read the csr to find what interupts we have (if any)
      */
-    csr = LMC_CSR_READ (sc, csr_status);
+    csr = le32_to_cpu(LMC_CSR_READ (sc, csr_status));
 
     /*
      * Make sure this is our interrupt
      */
     if ( ! (csr & sc->lmc_intrmask)) {
+        /*
+         * If it's not make sure it's not a media interupt first
+         */
+        sc->lmc_media->got_interupt(sc);
         goto lmc_int_fail_out;
     }
 
@@ -1025,11 +1480,10 @@
 
     /* always go through this loop at least once */
     while (csr & sc->lmc_intrmask) {
-
         /*
          * Clear interupt bits, we handle all case below
          */
-        LMC_CSR_WRITE (sc, csr_status, csr);
+        LMC_CSR_WRITE (sc, csr_status, cpu_to_le32(csr));
 
         /*
          * One of
@@ -1048,14 +1502,15 @@
             lmc_running_reset (dev);
             break;
         }
-
         
-        if (csr & (TULIP_STS_RXINTR | TULIP_STS_RXNOBUF)) {
-	  lmc_rx (dev);
+        if (csr & TULIP_STS_RXINTR){
+            lmc_trace(dev, "rx interupt");
+            lmc_rx (dev);
+            
         }
-        
         if (csr & (TULIP_STS_TXINTR | TULIP_STS_TXNOBUF | TULIP_STS_TXSTOPPED)) {
 
+	    int		n_compl = 0 ;
             /* reset the transmit timeout detection flag -baz */
             sc->stats.tx_NoCompleteCnt = 0;
 
@@ -1063,15 +1518,15 @@
             i = badtx % LMC_TXDESCS;
 
             while ((badtx < sc->lmc_next_tx)) {
-                stat = sc->lmc_txring[i].status;
+                stat = le32_to_cpu(sc->lmc_txring[i].status);
 
-                LMC_EVENT_LOG (LMC_EVENT_XMTINT, stat, 0);
                 /*
                  * If bit 31 is 1 the tulip owns it break out of the loop
                  */
-                if (stat < 0)
+                if (stat & 0x80000000)
                     break;
 
+		n_compl++ ;		/* i.e., have an empty slot in ring */
                 /*
                  * If we have no skbuff or have cleared it
                  * Already continue to the next buffer
@@ -1096,13 +1551,16 @@
                 else {
                     
 #if LINUX_VERSION_CODE >= 0x20200
-                    sc->stats.tx_bytes += sc->lmc_txring[i].length & 0x7ff;
+                    sc->stats.tx_bytes += le32_to_cpu(sc->lmc_txring[i].length) & 0x7ff;
 #endif
                     
                     sc->stats.tx_packets++;
                 }
-                
-                LMC_DEV_KFREE_SKB (sc->lmc_txq[i]);
+
+#if LINUX_VERSION_CODE >= 0x20363 /* 2.4 */
+                pci_unmap_single(sc->pdev, sc->lmc_txring[i].buffer1, sc->lmc_txq[i]->len, PCI_DMA_TODEVICE);
+#endif
+                dev_kfree_skb_irq(sc->lmc_txq[i]);
                 sc->lmc_txq[i] = 0;
 
                 badtx++;
@@ -1115,20 +1573,13 @@
                 badtx += LMC_TXDESCS;
             }
             sc->lmc_txfull = 0;
-            dev->tbusy = 0;
-            mark_bh (NET_BH);  /* Tell Linux to give me more packets */
-
-#ifdef DEBUG
-            sc->stats.dirtyTx = badtx;
-            sc->stats.lmc_next_tx = sc->lmc_next_tx;
-            sc->stats.lmc_txfull = sc->lmc_txfull;
-            sc->stats.tbusy = dev->tbusy;
+            LMC_XMITTER_FREE(dev);
+            sc->stats.tx_tbusy0++ ;
+#if LINUX_VERSION_CODE < 0x20363
+            mark_bh (NET_BH);	/* Tell Linux to give me more packets */
 #endif
             sc->lmc_taint_tx = badtx;
 
-            /*
-             * Why was there a break here???
-             */
         }			/* end handle transmit interrupt */
 
         if (csr & TULIP_STS_SYSERROR) {
@@ -1150,29 +1601,30 @@
             }
             lmc_dec_reset (sc);
             lmc_reset (sc);
-            LMC_EVENT_LOG(LMC_EVENT_RESET1, LMC_CSR_READ (sc, csr_status), 0);
-            LMC_EVENT_LOG(LMC_EVENT_RESET2,
-                          lmc_mii_readreg (sc, 0, 16),
-                          lmc_mii_readreg (sc, 0, 17));
 
         }
+
+        
+        if(max_work-- <= 0)
+            break;
+        
         /*
          * Get current csr status to make sure
          * we've cleared all interupts
          */
-        csr = LMC_CSR_READ (sc, csr_status);
+        csr = le32_to_cpu(LMC_CSR_READ (sc, csr_status));
     }				/* end interrupt loop */
-    LMC_EVENT_LOG(LMC_EVENT_INT, firstcsr, csr);
-
-    dev->interrupt = 0;
 
 lmc_int_fail_out:
 
-    spin_unlock(&sc->lmc_lock);
+    LMC_SPIN_UNLOCK_IRQRESTORE(sc);
+
+    lmc_trace(dev, "lmc_interrupt out");
+
     return;
 }
 
-static int lmc_start_xmit (struct sk_buff *skb, struct device *dev) /*fold00*/
+static int lmc_start_xmit (struct sk_buff *skb, struct net_device *dev) /*fold00*/
 {
     lmc_softc_t *sc;
     u32 flag;
@@ -1180,13 +1632,11 @@
     int ret = 0;
     LMC_SPIN_FLAGS;
 
-    sc = dev->priv;
+    lmc_trace(dev, "lmc_start_xmit in");
 
-    /* the interface better be up */
-    if ( ! (dev->flags & IFF_UP))
-        return 1;
+    sc = dev->priv;
 
-    spin_lock_irqsave(&sc->lmc_lock, flags);
+    LMC_SPIN_LOCK_IRQSAVE(sc);
 
     /*
      * If the transmitter is busy
@@ -1195,9 +1645,13 @@
      * Poke the chip and try to get it running
      *
      */
-    if (dev->tbusy) {
+#if LINUX_VERSION_CODE < 0x20363
+    if(dev->tbusy != 0){
         u32 csr6;
 
+        printk("%s: Xmitter busy|\n", dev->name);
+
+	sc->stats.tx_tbusy_calls++ ;
         if (jiffies - dev->trans_start < TX_TIMEOUT) {
             ret = 1;
             goto lmc_start_xmit_bug_out;
@@ -1210,24 +1664,15 @@
          * table and starts from scartch
          */
 
-        LMC_EVENT_LOG(LMC_EVENT_XMTPRCTMO,
-                      LMC_CSR_READ (sc, csr_status),
-                      sc->stats.tx_ProcTimeout);
-
         lmc_running_reset (dev);
 
-        LMC_EVENT_LOG(LMC_EVENT_RESET1, LMC_CSR_READ (sc, csr_status), 0);
-        LMC_EVENT_LOG(LMC_EVENT_RESET2,
-                      lmc_mii_readreg (sc, 0, 16),
-                      lmc_mii_readreg (sc, 0, 17));
-
         /* restart the tx processes */
-        csr6 = LMC_CSR_READ (sc, csr_command);
-        LMC_CSR_WRITE (sc, csr_command, csr6 | 0x0002);
-        LMC_CSR_WRITE (sc, csr_command, csr6 | 0x2002);
+        csr6 = le32_to_cpu(LMC_CSR_READ (sc, csr_command));
+        LMC_CSR_WRITE (sc, csr_command, cpu_to_le32(csr6 | 0x0002));
+        LMC_CSR_WRITE (sc, csr_command, cpu_to_le32(csr6 | 0x2002));
 
         /* immediate transmit */
-        LMC_CSR_WRITE (sc, csr_txpoll, 0);
+        LMC_CSR_WRITE (sc, csr_txpoll, cpu_to_le32(0));
 
         sc->stats.tx_errors++;
         sc->stats.tx_ProcTimeout++;	/* -baz */
@@ -1237,57 +1682,66 @@
         ret = 1;
         goto lmc_start_xmit_bug_out;
     }
-    /* normal path */
+#endif
+    /* normal path, tbusy known to be zero */
 
     entry = sc->lmc_next_tx % LMC_TXDESCS;
 
     sc->lmc_txq[entry] = skb;
+#if LINUX_VERSION_CODE >= 0x20363
+    sc->lmc_txring[entry].buffer1 = pci_map_single (sc->pdev, skb->data, skb->len, PCI_DMA_TODEVICE);
+#else
     sc->lmc_txring[entry].buffer1 = virt_to_bus (skb->data);
+#endif
 
     LMC_CONSOLE_LOG("xmit", skb->data, skb->len);
 
+#ifndef GCOM
     /* If the queue is less than half full, don't interrupt */
     if (sc->lmc_next_tx - sc->lmc_taint_tx < LMC_TXDESCS / 2)
     {
         /* Do not interrupt on completion of this packet */
         flag = 0x60000000;
-        dev->tbusy = 0;
+        LMC_XMITTER_FREE(dev);
     }
     else if (sc->lmc_next_tx - sc->lmc_taint_tx == LMC_TXDESCS / 2)
     {
         /* This generates an interrupt on completion of this packet */
         flag = 0xe0000000;
-        dev->tbusy = 0;
+        LMC_XMITTER_FREE(dev);
     }
     else if (sc->lmc_next_tx - sc->lmc_taint_tx < LMC_TXDESCS - 1)
     {
         /* Do not interrupt on completion of this packet */
         flag = 0x60000000;
-        dev->tbusy = 0;
+        LMC_XMITTER_FREE(dev);
     }
     else
     {
         /* This generates an interrupt on completion of this packet */
         flag = 0xe0000000;
         sc->lmc_txfull = 1;
-        dev->tbusy = 1;
+        LMC_XMITTER_BUSY(dev);
     }
+#else
+    flag = LMC_TDES_INTERRUPT_ON_COMPLETION;
 
-    if ((entry == LMC_TXDESCS - 1))
-    {
-        flag |= 0xe2000000;
-        dev->tbusy = 1;
+    if (sc->lmc_next_tx - sc->lmc_taint_tx >= LMC_TXDESCS - 1)
+    {				/* ring full, go busy */
+        sc->lmc_txfull = 1;
+        LMC_XMITTER_BUSY(dev);
+        sc->stats.tx_tbusy1++ ;
+        LMC_EVENT_LOG(LMC_EVENT_TBUSY1, entry, 0);
     }
-    /* don't pad small packets either */
-    sc->lmc_txring[entry].length = (skb->len) | flag | sc->TxDescriptControlInit;
+#endif
 
-    /* Done above through TxDescControlInit */
-    /*
-     sc->lmc_txring[entry].length = (skb->len) | flag | 0x00800000;
-     if(sc->ictl.crc_length == LMC_CTL_CRC_LENGTH_16){
-     sc->lmc_txring[entry].length |= 0x04000000;
-     }
-     */
+
+    if (entry == LMC_TXDESCS - 1)	/* last descriptor in ring */
+	flag |= LMC_TDES_END_OF_RING;	/* flag as such for Tulip */
+
+    /* don't pad small packets either */
+    flag = sc->lmc_txring[entry].length = cpu_to_le32((skb->len) | flag |
+						sc->TxDescriptControlInit);
 
     /* set the transmit timeout flag to be checked in
      * the watchdog timer handler. -baz
@@ -1296,22 +1750,25 @@
     sc->stats.tx_NoCompleteCnt++;
     sc->lmc_next_tx++;
 
-    /* give ownership to the chip */
-    sc->lmc_txring[entry].status = 0x80000000;
+    sc->lmc_txring[entry].status = cpu_to_le32(0x80000000);
 
     /* send now! */
-    LMC_CSR_WRITE (sc, csr_txpoll, 0);
+    LMC_CSR_WRITE (sc, csr_txpoll, cpu_to_le32(0));
 
     dev->trans_start = jiffies;
 
+#if LINUX_VERSION_CODE < 0x20363
 lmc_start_xmit_bug_out:
+#endif
+
+    LMC_SPIN_UNLOCK_IRQRESTORE(sc);
 
-    spin_unlock_irqrestore(&sc->lmc_lock, flags);
+    lmc_trace(dev, "lmc_start_xmit_out");
     return ret;
 }
 
 
-static int lmc_rx (struct device *dev) /*fold00*/
+static int lmc_rx (struct net_device *dev) /*fold00*/
 {
     lmc_softc_t *sc;
     int i;
@@ -1323,45 +1780,44 @@
     struct sk_buff *skb, *nsb;
     u16 len;
 
-    sc = dev->priv;
+    lmc_trace(dev, "lmc_rx in");
 
-    if ( ! (dev->flags & IFF_UP))
-        return 1;
+    sc = dev->priv;
 
-    rxIntLoopCnt = 0;		/* debug -baz */
+    rxIntLoopCnt = 0;
 
     i = sc->lmc_next_rx % LMC_RXDESCS;
     next_rx = sc->lmc_next_rx;
 
-    while (((stat = sc->lmc_rxring[i].status) & LMC_RDES_OWN_BIT) != DESC_OWNED_BY_DC21X4)
+    while (((stat = le32_to_cpu(sc->lmc_rxring[i].status)) & LMC_RDES_OWN_BIT) != DESC_OWNED_BY_DC21X4)
     {
         rxIntLoopCnt++;		/* debug -baz */
-        LMC_EVENT_LOG(LMC_EVENT_RCVINT, stat, 0);
-
+        len = ((stat & LMC_RDES_FRAME_LENGTH) >> RDES_FRAME_LENGTH_BIT_NUMBER);
         if ((stat & 0x0300) != 0x0300) {  /* Check first segment and last segment */
             if ((stat & 0x0000ffff) != 0x7fff) {
                 /* Oversized frame */
                 sc->stats.rx_length_errors++;
+                sc->stats.rx_errors++;
                 goto skip_packet;
             }
         }
 
-        if(stat & 0x00000008){ /* Catch a dribbling bit error */
+        if(stat & 0x00000004){ /* Catch a dribbling bit error */
             sc->stats.rx_errors++;
             sc->stats.rx_frame_errors++;
             goto skip_packet;
         }
 
 
-        if(stat & 0x00000004){ /* Catch a CRC error by the Xilinx */
+        if(stat & 0x00000008){ /* Catch a CRC error by the Xilinx */
             sc->stats.rx_errors++;
             sc->stats.rx_crc_errors++;
             goto skip_packet;
         }
 
 
-        len = ((stat & LMC_RDES_FRAME_LENGTH) >> RDES_FRAME_LENGTH_BIT_NUMBER);
-        if (len > PKT_BUF_SZ){
+        if (len > LMC_PKT_BUF_SZ){
+            sc->stats.rx_errors++;
             sc->stats.rx_length_errors++;
             localLengthErrCnt++;
             goto skip_packet;
@@ -1370,6 +1826,7 @@
         if (len < sc->lmc_crcSize + 2) {
             sc->stats.rx_length_errors++;
             sc->stats.rx_SmallPktCnt++;
+            sc->stats.rx_errors++;
             localLengthErrCnt++;
             goto skip_packet;
         }
@@ -1388,19 +1845,29 @@
          */
         
         if(skb == 0x0){
-            nsb = dev_alloc_skb (PKT_BUF_SZ + 2);
+            nsb = dev_alloc_skb (LMC_PKT_BUF_SZ + 2);
             if (nsb) {
                 LMC_SKB_FREE(nsb, 1);
                 sc->lmc_rxq[i] = nsb;
                 nsb->dev = dev;
+#if LINUX_VERSION_CODE >= 0x20363
+                sc->lmc_rxring[i].buffer1 = pci_map_single(sc->pdev, nsb->tail, LMC_PKT_BUF_SZ+2, PCI_DMA_FROMDEVICE);
+#else
                 sc->lmc_rxring[i].buffer1 = virt_to_bus (nsb->tail);
+#endif
             }
+            sc->failed_recv_alloc = 1;
             goto skip_packet;
         }
         
         dev->last_rx = jiffies;
         sc->stats.rx_packets++;
 
+#if LINUX_VERSION_CODE >= 0x20363
+#ifdef LMC_PACKET_LOG
+        pci_dma_sync_single(sc->pdev, sc->lmc_rxring[i].buffer1, len, PCI_DMA_FROMDEVICE);
+#endif
+#endif
         LMC_CONSOLE_LOG("recv", skb->data, len);
 
         /*
@@ -1410,31 +1877,39 @@
          * them into a new buffer??
          */
         
-        if(len > (3*LMC_MTU)/4){
+        if(len > (LMC_MTU - (LMC_MTU>>2))){ /* len > LMC_MTU * 0.75 */
             /*
              * If it's a large packet don't copy it just hand it up
              */
         give_it_anyways:
 
             sc->lmc_rxq[i] = 0x0;
-            sc->lmc_rxring[i].buffer1 = 0x0;
+            sc->lmc_rxring[i].buffer1 = cpu_to_le32(0x0);
 
             skb_put (skb, len);
-            skb->protocol=htons(ETH_P_WAN_PPP);
+            skb->protocol = lmc_proto_type(sc, skb);
+            skb->protocol = htons(ETH_P_WAN_PPP);
             skb->mac.raw = skb->data;
-            skb->nh.raw = skb->data;
+//            skb->nh.raw = skb->data;
             skb->dev = dev;
-            netif_rx(skb);
+#if LINUX_VERSION_CODE >= 0x20363 /* 2.4 */
+            pci_unmap_single(sc->pdev, sc->lmc_rxring[i].buffer1, len, PCI_DMA_FROMDEVICE);
+#endif
+            lmc_proto_netif(sc, skb);
 
             /*
              * This skb will be destroyed by the upper layers, make a new one
              */
-            nsb = dev_alloc_skb (PKT_BUF_SZ + 2);
+            nsb = dev_alloc_skb (LMC_PKT_BUF_SZ + 2);
             if (nsb) {
                 LMC_SKB_FREE(nsb, 1);
                 sc->lmc_rxq[i] = nsb;
                 nsb->dev = dev;
+#if LINUX_VERSION_CODE >= 0x20363
+                sc->lmc_rxring[i].buffer1 = pci_map_single(sc->pdev, nsb->tail, LMC_PKT_BUF_SZ+2, PCI_DMA_FROMDEVICE);
+#else
                 sc->lmc_rxring[i].buffer1 = virt_to_bus (nsb->tail);
+#endif
                 /* Transfered to 21140 below */
             }
             else {
@@ -1447,10 +1922,9 @@
                  * again.  (once a second)
                  */
                 sc->stats.rx_BuffAllocErr++;
+                sc->failed_recv_alloc = 1;
                 goto skip_out_of_mem;
-
             }
-
         }
         else {
             nsb = dev_alloc_skb(len);
@@ -1458,15 +1932,19 @@
                 goto give_it_anyways;
             }
             memcpy(skb_put(nsb, len), skb->data, len);
-            nsb->protocol=htons(ETH_P_WAN_PPP);
+            
+            nsb->protocol = lmc_proto_type(sc, skb);
             nsb->mac.raw = nsb->data;
-            nsb->nh.raw = nsb->data;
+            //            nsb->nh.raw = nsb->data;
             nsb->dev = dev;
-            netif_rx(nsb);
+#if LINUX_VERSION_CODE >= 0x20363 /* 2.4 */
+            pci_unmap_single(sc->pdev, sc->lmc_rxring[i].buffer1, len, PCI_DMA_FROMDEVICE);
+#endif
+            lmc_proto_netif(sc, nsb);
         }
 
     skip_packet:
-        sc->lmc_rxring[i].status = DESC_OWNED_BY_DC21X4;
+        sc->lmc_rxring[i].status = cpu_to_le32(DESC_OWNED_BY_DC21X4);
 
         sc->lmc_next_rx++;
         i = sc->lmc_next_rx % LMC_RXDESCS;
@@ -1475,54 +1953,34 @@
             break;
     }
     
-    /* detect condition for LMC1000 where DSU cable attaches and fills
-     * descriptors with bogus packets
-     */
-    if (localLengthErrCnt > LMC_RXDESCS - 3) {
-        sc->stats.rx_BadPktSurgeCnt++;
-        LMC_EVENT_LOG(LMC_EVENT_BADPKTSURGE,
-                      localLengthErrCnt,
-                      sc->stats.rx_BadPktSurgeCnt);
-    }
-
     /* save max count of receive descriptors serviced */
     if (rxIntLoopCnt > sc->stats.rxIntLoopCnt) {
         sc->stats.rxIntLoopCnt = rxIntLoopCnt;	/* debug -baz */
     }
 
-#ifdef DEBUG
-    if (rxIntLoopCnt == 0)
-    {
-        for (i = 0; i < LMC_RXDESCS; i++)
-        {
-            if ((sc->lmc_rxring[i].status & LMC_RDES_OWN_BIT)
-                != DESC_OWNED_BY_DC21X4)
-            {
-                rxIntLoopCnt++;
-            }
-        }
-        LMC_EVENT_LOG(LMC_EVENT_RCVEND, rxIntLoopCnt, 0);
-    }
-#endif
-
 skip_out_of_mem:
 
+    lmc_trace(dev, "lmc_rx out");
+
     return 0;
 }
 
-static struct enet_statistics *lmc_get_stats (struct device *dev) /*fold00*/
+static struct enet_statistics *lmc_get_stats (struct net_device *dev) /*fold00*/
 {
     lmc_softc_t *sc;
     LMC_SPIN_FLAGS;
 
+    lmc_trace(dev, "lmc_get_stats in");
+
     sc = dev->priv;
 
-    spin_lock_irqsave(&sc->lmc_lock, flags);
+    LMC_SPIN_LOCK_IRQSAVE(sc);
+
+    sc->stats.rx_missed_errors += le32_to_cpu(LMC_CSR_READ (sc, csr_missed_frames)) & 0xffff;
 
-    if (dev->start)
-        sc->stats.rx_missed_errors += LMC_CSR_READ (sc, csr_missed_frames) & 0xffff;
+    LMC_SPIN_UNLOCK_IRQRESTORE(sc);
 
-    spin_unlock_irqrestore(&sc->lmc_lock, flags);
+    lmc_trace(dev, "lmc_get_stats out");
 
     return (struct enet_statistics *) &sc->stats;
 }
@@ -1542,7 +2000,8 @@
 
 void cleanup_module (void) /*fold00*/
 {
-    struct device *dev, *next;
+    struct net_device *dev, *next;
+    lmc_softc_t *sc;
 
     /* we have no pointer to our devices, since they are all dynamically
      * allocated.  So, here we loop through all the network devices
@@ -1559,19 +2018,27 @@
 
         /* close the syncppp stuff, and release irq. Close is run on unreg net */
         lmc_close (dev);
-        sppp_detach (dev);
+        
+        sc = dev->priv;
+
+        printk ("%s: detaching from protocol...\n", dev->name);
+        if (sc != NULL)
+            lmc_proto_detach(sc);
 
-        /* Remove the device from the linked list */
         unregister_netdev (dev);
 
         /* Let go of the io region */;
         release_region (dev->base_addr, LMC_REG_RANGE);
 
         /* free our allocated structures. */
+#if LINUX_VERSION_CODE >= 0x20363
+        pci_free_consistent(sc->pdev, sizeof(lmc_softc_t), sc, sc->sc_dma_handle);
+#else
         kfree (dev->priv);
+#endif
         dev->priv = NULL;
 
-        kfree ((struct ppp_device *) dev);
+        kfree (dev);
         dev = NULL;
     }
 
@@ -1587,40 +2054,49 @@
     int command = (0xf6 << 10) | (devaddr << 5) | regno;
     int retval = 0;
 
+    lmc_trace(sc->lmc_device, "lmc_mii_readreg in");
+
     LMC_MII_SYNC (sc);
 
+    lmc_trace(sc->lmc_device, "lmc_mii_readreg: done sync");
+
     for (i = 15; i >= 0; i--)
     {
         int dataval = (command & (1 << i)) ? 0x20000 : 0;
 
-        LMC_CSR_WRITE (sc, csr_9, dataval);
+        LMC_CSR_WRITE (sc, csr_9, cpu_to_le32(dataval));
         lmc_delay ();
         /* __SLOW_DOWN_IO; */
-        LMC_CSR_WRITE (sc, csr_9, dataval | 0x10000);
+        LMC_CSR_WRITE (sc, csr_9, cpu_to_le32(dataval | 0x10000));
         lmc_delay ();
         /* __SLOW_DOWN_IO; */
     }
 
+    lmc_trace(sc->lmc_device, "lmc_mii_readreg: done1");
+
     for (i = 19; i > 0; i--)
     {
-        LMC_CSR_WRITE (sc, csr_9, 0x40000);
+        LMC_CSR_WRITE (sc, csr_9, cpu_to_le32(0x40000));
         lmc_delay ();
         /* __SLOW_DOWN_IO; */
-        retval = (retval << 1) | ((LMC_CSR_READ (sc, csr_9) & 0x80000) ? 1 : 0);
-        LMC_CSR_WRITE (sc, csr_9, 0x40000 | 0x10000);
+        retval = (retval << 1) | (le32_to_cpu((LMC_CSR_READ(sc, csr_9)) & 0x80000) ? 1 : 0);
+        LMC_CSR_WRITE (sc, csr_9, cpu_to_le32(0x40000 | 0x10000));
         lmc_delay ();
         /* __SLOW_DOWN_IO; */
     }
 
+    lmc_trace(sc->lmc_device, "lmc_mii_readreg out");
+
     return (retval >> 1) & 0xffff;
 }
 
-void lmc_mii_writereg (lmc_softc_t * const sc, unsigned devaddr, /*fold00*/
-                       unsigned regno, unsigned data)
+void lmc_mii_writereg (lmc_softc_t * const sc, unsigned devaddr, unsigned regno, unsigned data) /*fold00*/
 {
     int i = 32;
     int command = (0x5002 << 16) | (devaddr << 23) | (regno << 18) | data;
 
+    lmc_trace(sc->lmc_device, "lmc_mii_writereg in");
+
     LMC_MII_SYNC (sc);
 
     i = 31;
@@ -1633,10 +2109,10 @@
         else
             datav = 0x00000;
 
-        LMC_CSR_WRITE (sc, csr_9, datav);
+        LMC_CSR_WRITE (sc, csr_9, cpu_to_le32(datav));
         lmc_delay ();
         /* __SLOW_DOWN_IO; */
-        LMC_CSR_WRITE (sc, csr_9, (datav | 0x10000));
+        LMC_CSR_WRITE (sc, csr_9, cpu_to_le32(datav | 0x10000));
         lmc_delay ();
         /* __SLOW_DOWN_IO; */
         i--;
@@ -1645,20 +2121,24 @@
     i = 2;
     while (i > 0)
     {
-        LMC_CSR_WRITE (sc, csr_9, 0x40000);
+        LMC_CSR_WRITE (sc, csr_9, cpu_to_le32(0x40000));
         lmc_delay ();
         /* __SLOW_DOWN_IO; */
-        LMC_CSR_WRITE (sc, csr_9, 0x50000);
+        LMC_CSR_WRITE (sc, csr_9, cpu_to_le32(0x50000));
         lmc_delay ();
         /* __SLOW_DOWN_IO; */
         i--;
     }
+
+    lmc_trace(sc->lmc_device, "lmc_mii_writereg out");
 }
 
 static void lmc_softreset (lmc_softc_t * const sc) /*fold00*/
 {
     int i;
 
+    lmc_trace(sc->lmc_device, "lmc_softreset in");
+
     /* Initialize the recieve rings and buffers. */
     sc->lmc_txfull = 0;
     sc->lmc_next_rx = 0;
@@ -1678,8 +2158,15 @@
 
         if (sc->lmc_rxq[i] == NULL)
         {
-            skb = dev_alloc_skb (PKT_BUF_SZ + 2);
-            sc->lmc_rxq[i] = skb;
+            skb = dev_alloc_skb (LMC_PKT_BUF_SZ + 2);
+            if(skb == NULL){
+                printk(KERN_WARNING "%s: Failed to allocate receiver ring, will try again\n", sc->name);
+                sc->failed_ring = 1;
+                break;
+            }
+            else{
+                sc->lmc_rxq[i] = skb;
+            }
         }
         else
         {
@@ -1690,77 +2177,120 @@
         LMC_SKB_FREE(skb, 1);
 
         /* owned by 21140 */
-        sc->lmc_rxring[i].status = 0x80000000;
+        sc->lmc_rxring[i].status = cpu_to_le32(0x80000000);
 
         /* used to be PKT_BUF_SZ now uses skb since we loose some to head room */
-        sc->lmc_rxring[i].length = skb->end - skb->data;
+        sc->lmc_rxring[i].length = cpu_to_le32(skb->end - skb->data);
 
         /* use to be tail which is dumb since you're thinking why write
          * to the end of the packj,et but since there's nothing there tail == data
          */
+#if LINUX_VERSION_CODE >= 0x20363
+        sc->lmc_rxring[i].buffer1 = pci_map_single(sc->pdev, skb->data, sc->lmc_rxring[i].length, PCI_DMA_FROMDEVICE);
+        sc->lmc_rxring[i].buffer2 = (u32) &(sc->sc_dma->lmc_rxring[i + 1]);
+#else
         sc->lmc_rxring[i].buffer1 = virt_to_bus (skb->data);
+        sc->lmc_rxring[i].buffer2 = virt_to_bus (&sc->lmc_rxring[i+1]);
 
-        /* This is fair since the structure is static and we have the next address */
-        sc->lmc_rxring[i].buffer2 = virt_to_bus (&sc->lmc_rxring[i + 1]);
+#endif
 
     }
 
     /*
      * Sets end of ring
      */
-    sc->lmc_rxring[i - 1].length |= 0x02000000; /* Set end of buffers flag */
+    sc->lmc_rxring[i - 1].length |= cpu_to_le32(0x02000000); /* Set end of buffers flag */
+#if LINUX_VERSION_CODE >= 0x20363
+    sc->lmc_rxring[i - 1].buffer2 = (u32) &sc->sc_dma->lmc_rxring[0]; /* Point back to the start */
+    LMC_CSR_WRITE (sc, csr_rxlist, (u32) &sc->sc_dma->lmc_rxring); /* write base address */
+#else
     sc->lmc_rxring[i - 1].buffer2 = virt_to_bus (&sc->lmc_rxring[0]); /* Point back to the start */
     LMC_CSR_WRITE (sc, csr_rxlist, virt_to_bus (sc->lmc_rxring)); /* write base address */
+#endif
 
 
     /* Initialize the transmit rings and buffers */
     for (i = 0; i < LMC_TXDESCS; i++)
     {
+        if (sc->lmc_txq[i] != NULL){		/* have buffer */
+#if LINUX_VERSION_CODE >= 0x20363 /* 2.4 */
+            pci_unmap_single(sc->pdev, sc->lmc_txring[i].buffer1, sc->lmc_txq[i]->len, PCI_DMA_TODEVICE);
+#endif
+            LMC_DEV_KFREE_SKB(sc->lmc_txq[i]);	/* free it */
+            sc->stats.tx_dropped++;      /* We just dropped a packet */
+        }
         sc->lmc_txq[i] = 0;
-        sc->lmc_txring[i].status = 0x00000000;
+        sc->lmc_txring[i].status = cpu_to_le32(0x00000000);
+#if LINUX_VERSION_CODE >= 0x20363
+        sc->lmc_txring[i].buffer2 = (u32) &(sc->sc_dma->lmc_txring[i + 1]);
+#else
         sc->lmc_txring[i].buffer2 = virt_to_bus (&sc->lmc_txring[i + 1]);
+#endif
     }
+    
+#if LINUX_VERSION_CODE >= 0x20363
+    sc->lmc_txring[i - 1].buffer2 = (u32) &sc->sc_dma->lmc_txring[0]; /* Point back to the start */
+    LMC_CSR_WRITE (sc, csr_txlist, (u32) &sc->sc_dma->lmc_txring); /* write base address */
+#else
     sc->lmc_txring[i - 1].buffer2 = virt_to_bus (&sc->lmc_txring[0]);
     LMC_CSR_WRITE (sc, csr_txlist, virt_to_bus (sc->lmc_txring));
+#endif
+    
+    lmc_trace(sc->lmc_device, "lmc_softreset out");
 }
 
-static int lmc_set_config(struct device *dev, struct ifmap *map) /*fold00*/
+static int lmc_set_config(struct net_device *dev, struct ifmap *map) /*fold00*/
 {
+    lmc_trace(dev, "lmc_set_config in");
+    lmc_trace(dev, "lmc_set_config out");
     return -EOPNOTSUPP;
 }
 
-void lmc_gpio_mkinput(lmc_softc_t * const sc, u_int32_t bits)
+void lmc_gpio_mkinput(lmc_softc_t * const sc, u_int32_t bits) /*fold00*/
 {
+    lmc_trace(sc->lmc_device, "lmc_gpio_mkinput in");
     sc->lmc_gpio_io &= ~bits;
-    LMC_CSR_WRITE(sc, csr_gp, TULIP_GP_PINSET | (sc->lmc_gpio_io));
+    LMC_CSR_WRITE(sc, csr_gp, cpu_to_le32(TULIP_GP_PINSET | (sc->lmc_gpio_io)));
+    lmc_trace(sc->lmc_device, "lmc_gpio_mkinput out");
 }
 
-void lmc_gpio_mkoutput(lmc_softc_t * const sc, u_int32_t bits)
+void lmc_gpio_mkoutput(lmc_softc_t * const sc, u_int32_t bits) /*fold00*/
 {
+    lmc_trace(sc->lmc_device, "lmc_gpio_mkoutput in");
     sc->lmc_gpio_io |= bits;
-    LMC_CSR_WRITE(sc, csr_gp, TULIP_GP_PINSET | (sc->lmc_gpio_io));
+    LMC_CSR_WRITE(sc, csr_gp, cpu_to_le32(TULIP_GP_PINSET | (sc->lmc_gpio_io)));
+    lmc_trace(sc->lmc_device, "lmc_gpio_mkoutput out");
 }
 
-void lmc_led_on(lmc_softc_t * const sc, u_int32_t led)
+void lmc_led_on(lmc_softc_t * const sc, u_int32_t led) /*fold00*/
 {
-    if((~sc->lmc_miireg16) & led) /* Already on! */
+    lmc_trace(sc->lmc_device, "lmc_led_on in");
+    if((~sc->lmc_miireg16) & led){ /* Already on! */
+        lmc_trace(sc->lmc_device, "lmc_led_on aon out");
         return;
+    }
     
     sc->lmc_miireg16 &= ~led;
     lmc_mii_writereg(sc, 0, 16, sc->lmc_miireg16);
+    lmc_trace(sc->lmc_device, "lmc_led_on out");
 }
 
-void lmc_led_off(lmc_softc_t * const sc, u_int32_t led)
+void lmc_led_off(lmc_softc_t * const sc, u_int32_t led) /*fold00*/
 {
-    if(sc->lmc_miireg16 & led) /* Already set don't do anything */
+    lmc_trace(sc->lmc_device, "lmc_led_off in");
+    if(sc->lmc_miireg16 & led){ /* Already set don't do anything */
+        lmc_trace(sc->lmc_device, "lmc_led_off aoff out");
         return;
+    }
     
     sc->lmc_miireg16 |= led;
     lmc_mii_writereg(sc, 0, 16, sc->lmc_miireg16);
+    lmc_trace(sc->lmc_device, "lmc_led_off out");
 }
 
-static void lmc_reset(lmc_softc_t * const sc)
+static void lmc_reset(lmc_softc_t * const sc) /*fold00*/
 {
+    lmc_trace(sc->lmc_device, "lmc_reset in");
     sc->lmc_miireg16 |= LMC_MII16_FIFO_RESET;
     lmc_mii_writereg(sc, 0, 16, sc->lmc_miireg16);
 
@@ -1770,15 +2300,15 @@
     /*
      * make some of the GPIO pins be outputs
      */
-    lmc_gpio_mkoutput(sc, LMC_GEP_DP | LMC_GEP_RESET);
+    lmc_gpio_mkoutput(sc, LMC_GEP_RESET);
 
     /*
-     * drive DP and RESET low to force configuration.  This also forces
+     * RESET low to force state reset.  This also forces
      * the transmitter clock to be internal, but we expect to reset
      * that later anyway.
      */
-    sc->lmc_gpio &= ~(LMC_GEP_DP | LMC_GEP_RESET);
-    LMC_CSR_WRITE(sc, csr_gp, sc->lmc_gpio);
+    sc->lmc_gpio &= ~(LMC_GEP_RESET);
+    LMC_CSR_WRITE(sc, csr_gp, cpu_to_le32(sc->lmc_gpio));
 
     /*
      * hold for more than 10 microseconds
@@ -1788,13 +2318,7 @@
     /*
      * stop driving Xilinx-related signals
      */
-    lmc_gpio_mkinput(sc, LMC_GEP_DP | LMC_GEP_RESET);
-
-    /*
-     * busy wait for the chip to reset
-     */
-    while ((LMC_CSR_READ(sc, csr_gp) & LMC_GEP_DP) == 0)
-        ;
+    lmc_gpio_mkinput(sc, LMC_GEP_RESET);
 
     /*
      * Call media specific init routine
@@ -1802,17 +2326,19 @@
     sc->lmc_media->init(sc);
 
     sc->stats.resetCount++;
+    lmc_trace(sc->lmc_device, "lmc_reset out");
 }
 
-static void lmc_dec_reset(lmc_softc_t * const sc)
+static void lmc_dec_reset(lmc_softc_t * const sc) /*fold00*/
 {
     u_int32_t val;
+    lmc_trace(sc->lmc_device, "lmc_dec_reset in");
 
     /*
      * disable all interrupts
      */
     sc->lmc_intrmask = 0;
-    LMC_CSR_WRITE(sc, csr_intr, sc->lmc_intrmask);
+    LMC_CSR_WRITE(sc, csr_intr, cpu_to_le32(sc->lmc_intrmask));
 
     /*
      * Reset the chip with a software reset command.
@@ -1820,9 +2346,16 @@
      * 33MHz that comes to two microseconds but wait a
      * bit longer anyways)
      */
-    LMC_CSR_WRITE(sc, csr_busmode, TULIP_BUSMODE_SWRESET);
+    LMC_CSR_WRITE(sc, csr_busmode, cpu_to_le32(TULIP_BUSMODE_SWRESET));
     udelay(25);
-    sc->lmc_cmdmode = LMC_CSR_READ(sc, csr_command);
+#ifdef __sparc__
+    sc->lmc_busmode = LMC_CSR_READ(sc, cpu_to_le32(csr_busmode));
+    sc->lmc_busmode = 0x00000000;
+    //sc->lmc_busmode = 0x00100000;
+    sc->lmc_busmode &= ~TULIP_BUSMODE_SWRESET;
+    LMC_CSR_WRITE(sc, csr_busmode, cpu_to_le32(sc->lmc_busmode));
+#endif
+    sc->lmc_cmdmode = le32_to_cpu(LMC_CSR_READ(sc, csr_command));
 
     /*
      * We want:
@@ -1848,20 +2381,22 @@
                           | TULIP_CMD_TXTHRSHLDCTL
                         );
 
-    LMC_CSR_WRITE(sc, csr_command, sc->lmc_cmdmode);
+    LMC_CSR_WRITE(sc, csr_command, cpu_to_le32(sc->lmc_cmdmode));
 
     /*
      * disable receiver watchdog and transmit jabber
      */
-    val = LMC_CSR_READ(sc, csr_sia_general);
+    val = le32_to_cpu(LMC_CSR_READ(sc, csr_sia_general));
     val |= (TULIP_WATCHDOG_TXDISABLE | TULIP_WATCHDOG_RXDISABLE);
-    LMC_CSR_WRITE(sc, csr_sia_general, val);
+    LMC_CSR_WRITE(sc, csr_sia_general, cpu_to_le32(val));
 
+    lmc_trace(sc->lmc_device, "lmc_dec_reset out");
 }
 
-static void lmc_initcsrs(lmc_softc_t * const sc, lmc_csrptr_t csr_base,
+static void lmc_initcsrs(lmc_softc_t * const sc, lmc_csrptr_t csr_base, /*fold00*/
                          size_t csr_size)
 {
+    lmc_trace(sc->lmc_device, "lmc_initcsrs in");
     sc->lmc_csrs.csr_busmode	        = csr_base +  0 * csr_size;
     sc->lmc_csrs.csr_txpoll		= csr_base +  1 * csr_size;
     sc->lmc_csrs.csr_rxpoll		= csr_base +  2 * csr_size;
@@ -1878,5 +2413,61 @@
     sc->lmc_csrs.csr_13		        = csr_base + 13 * csr_size;
     sc->lmc_csrs.csr_14		        = csr_base + 14 * csr_size;
     sc->lmc_csrs.csr_15		        = csr_base + 15 * csr_size;
+    lmc_trace(sc->lmc_device, "lmc_initcsrs out");
 }
 
+#if LINUX_VERSION_CODE >= 0x20363
+static void lmc_driver_timeout(struct net_device *dev) { /*fold00*/
+    lmc_softc_t *sc;
+    u32 csr6;
+    LMC_SPIN_FLAGS;
+
+    lmc_trace(dev, "lmc_driver_timeout in");
+
+    sc = dev->priv;
+
+    LMC_SPIN_LOCK_IRQSAVE(sc);
+
+    printk("%s: Xmitter busy|\n", dev->name);
+
+    sc->stats.tx_tbusy_calls++ ;
+    if (jiffies - dev->trans_start < TX_TIMEOUT) {
+        goto bug_out;
+    }
+
+    /*
+     * Chip seems to have locked up
+     * Reset it
+     * This whips out all our decriptor
+     * table and starts from scartch
+     */
+
+    lmc_running_reset (dev);
+
+    /* restart the tx processes */
+    csr6 = le32_to_cpu(LMC_CSR_READ (sc, csr_command));
+    LMC_CSR_WRITE (sc, csr_command, cpu_to_le32(csr6 | 0x0002));
+    LMC_CSR_WRITE (sc, csr_command, cpu_to_le32(csr6 | 0x2002));
+
+    /* immediate transmit */
+    LMC_CSR_WRITE (sc, csr_txpoll, cpu_to_le32(0));
+
+    sc->stats.tx_errors++;
+    sc->stats.tx_ProcTimeout++;	/* -baz */
+
+    dev->trans_start = jiffies;
+
+bug_out:
+
+    LMC_SPIN_UNLOCK_IRQRESTORE(sc);
+
+    lmc_trace(dev, "lmc_driver_timout out");
+
+
+}
+
+int lmc_setup(void) { /*fold00*/
+   return lmc_probe(NULL);
+}
+
+#endif
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/drivers/net/lmc/lmc_media.c linux.17p9/drivers/net/lmc/lmc_media.c
--- linux.vanilla/drivers/net/lmc/lmc_media.c	Fri Apr 21 12:46:18 2000
+++ linux.17p9/drivers/net/lmc/lmc_media.c	Tue Jun 20 23:08:03 2000
@@ -1,4 +1,4 @@
-/* $Id: lmc_media.c,v 1.9 2000/01/21 13:29:49 asj Exp $ */
+/* $Id: lmc_media.c,v 1.16 2000/06/06 08:32:14 asj Exp $ */
 
 #include <linux/version.h>
 #include <linux/config.h>
@@ -13,7 +13,7 @@
 #include <linux/interrupt.h>
 #include <linux/pci.h>
 #include <asm/segment.h>
-#include <asm/smp.h>
+//#include <asm/smp.h>
 
 #if LINUX_VERSION_CODE < 0x20155
 #include <linux/bios32.h>
@@ -34,13 +34,14 @@
 
 #if LINUX_VERSION_CODE >= 0x20200
 #include <asm/uaccess.h>
-#include <asm/spinlock.h>
+//#include <asm/spinlock.h>
 #endif
 
-#include "lmc.h"
 #include "lmc_ver.h"
+#include "lmc.h"
 #include "lmc_var.h"
 #include "lmc_ioctl.h"
+#include "lmc_debug.h"
 
 #define CONFIG_LMC_IGNORE_HARDWARE_HANDSHAKE 1
 
@@ -59,7 +60,7 @@
   */
 
 /*
- * For lack of a better place, put the T1 cable stuff here.
+ * For lack of a better place, put the SSI cable stuff here.
  */
 char *lmc_t1_cables[] = {
   "V.10/RS423", "EIA530A", "reserved", "X.21", "V.35",
@@ -111,12 +112,16 @@
 static void lmc_t1_set_crc_length (lmc_softc_t * const, int);
 static void lmc_t1_set_clock (lmc_softc_t * const, int);
 static void lmc_t1_watchdog (lmc_softc_t * const);
+static int  lmc_t1_ioctl (lmc_softc_t * const, void *);
+static int  lmc_t1_got_interupt (lmc_softc_t * const);
 
 static void lmc_dummy_set_1 (lmc_softc_t * const, int);
 static void lmc_dummy_set2_1 (lmc_softc_t * const, lmc_ctl_t *);
+static int  lmc_dummy_ioctl (lmc_softc_t * const, void *);
+static int  lmc_dummy_got_interupt (lmc_softc_t * const);
 
 static inline void write_av9110_bit (lmc_softc_t *, int);
-static void write_av9110 (lmc_softc_t *, u_int32_t, u_int32_t, u_int32_t,
+static void write_av9110 (lmc_softc_t *, u_int32_t, u_int32_t, u_int32_t, /*fold00*/
 			  u_int32_t, u_int32_t);
 
 lmc_media_t lmc_ds3_media = {
@@ -131,7 +136,9 @@
   lmc_dummy_set_1,		/* set link status */
   lmc_ds3_set_crc_length,	/* set CRC length */
   lmc_dummy_set_1,		/* set T1 or E1 circuit type */
-  lmc_ds3_watchdog
+  lmc_ds3_watchdog,
+  lmc_dummy_ioctl,
+  lmc_dummy_got_interupt,
 };
 
 lmc_media_t lmc_hssi_media = {
@@ -146,7 +153,10 @@
   lmc_hssi_set_link_status,	/* set link status */
   lmc_hssi_set_crc_length,	/* set CRC length */
   lmc_dummy_set_1,		/* set T1 or E1 circuit type */
-  lmc_hssi_watchdog
+  lmc_hssi_watchdog,
+  lmc_dummy_ioctl,
+  lmc_dummy_got_interupt,
+
 };
 
 lmc_media_t lmc_ssi_media = { lmc_ssi_init,	/* special media init stuff */
@@ -160,7 +170,10 @@
   lmc_ssi_set_link_status,	/* set link status */
   lmc_ssi_set_crc_length,	/* set CRC length */
   lmc_dummy_set_1,		/* set T1 or E1 circuit type */
-  lmc_ssi_watchdog
+  lmc_ssi_watchdog,
+  lmc_dummy_ioctl,
+  lmc_dummy_got_interupt,
+
 };
 
 lmc_media_t lmc_t1_media = {
@@ -175,25 +188,38 @@
   lmc_dummy_set_1,		/* set link status */
   lmc_t1_set_crc_length,	/* set CRC length */
   lmc_t1_set_circuit_type,	/* set T1 or E1 circuit type */
-  lmc_t1_watchdog
+  lmc_t1_watchdog,
+  lmc_t1_ioctl,
+  lmc_t1_got_interupt,
+
 };
 
-static void
-lmc_dummy_set_1 (lmc_softc_t * const sc, int a)
+static void lmc_dummy_set_1 (lmc_softc_t * const sc, int a) /*fold00*/
 {
 }
 
-static void
-lmc_dummy_set2_1 (lmc_softc_t * const sc, lmc_ctl_t * a)
+static void lmc_dummy_set2_1 (lmc_softc_t * const sc, lmc_ctl_t * a) /*fold00*/
 {
 }
 
+static int lmc_dummy_ioctl (lmc_softc_t * const sc, void *d) /*fold00*/
+{
+    return -ENOSYS;
+}
+
+static int lmc_dummy_got_interupt (lmc_softc_t * const sc) /*fold00*/
+{
+    return -ENOSYS;
+}
+
+
+
 /*
  *  HSSI methods
  */
 
 static void
-lmc_hssi_init (lmc_softc_t * const sc)
+lmc_hssi_init (lmc_softc_t * const sc) /*fold00*/
 {
   sc->ictl.cardtype = LMC_CTL_CARDTYPE_LMC5200;
 
@@ -201,7 +227,7 @@
 }
 
 static void
-lmc_hssi_default (lmc_softc_t * const sc)
+lmc_hssi_default (lmc_softc_t * const sc) /*fold00*/
 {
   sc->lmc_miireg16 = LMC_MII16_LED_ALL;
 
@@ -215,7 +241,7 @@
  * always reset the card if needed.
  */
 static void
-lmc_hssi_set_status (lmc_softc_t * const sc, lmc_ctl_t * ctl)
+lmc_hssi_set_status (lmc_softc_t * const sc, lmc_ctl_t * ctl) /*fold00*/
 {
   if (ctl == NULL)
     {
@@ -246,21 +272,25 @@
  * 1 == internal, 0 == external
  */
 static void
-lmc_hssi_set_clock (lmc_softc_t * const sc, int ie)
+lmc_hssi_set_clock (lmc_softc_t * const sc, int ie) /*fold00*/
 {
+  int old;
+  old = sc->ictl.clock_source;
   if (ie == LMC_CTL_CLOCK_SOURCE_EXT)
     {
       sc->lmc_gpio |= LMC_GEP_HSSI_CLOCK;
       LMC_CSR_WRITE (sc, csr_gp, sc->lmc_gpio);
       sc->ictl.clock_source = LMC_CTL_CLOCK_SOURCE_EXT;
-      printk (LMC_PRINTF_FMT ": clock external\n", LMC_PRINTF_ARGS);
+      if(old != ie)
+        printk (KERN_INFO "%s: clock external\n", sc->name);
     }
   else
     {
       sc->lmc_gpio &= ~(LMC_GEP_HSSI_CLOCK);
       LMC_CSR_WRITE (sc, csr_gp, sc->lmc_gpio);
       sc->ictl.clock_source = LMC_CTL_CLOCK_SOURCE_INT;
-      printk (LMC_PRINTF_FMT ": clock internal\n", LMC_PRINTF_ARGS);
+      if(old != ie)
+        printk (KERN_INFO "%s: clock internal\n", sc->name);
     }
 }
 
@@ -269,7 +299,7 @@
  * 0 == link is down, 1 == link is up.
  */
 static int
-lmc_hssi_get_link_status (lmc_softc_t * const sc)
+lmc_hssi_get_link_status (lmc_softc_t * const sc) /*fold00*/
 {
     /*
      * We're using the same code as SSI since
@@ -279,7 +309,7 @@
 }
 
 static void
-lmc_hssi_set_link_status (lmc_softc_t * const sc, int state)
+lmc_hssi_set_link_status (lmc_softc_t * const sc, int state) /*fold00*/
 {
   if (state == LMC_LINK_UP)
     sc->lmc_miireg16 |= LMC_MII16_HSSI_TA;
@@ -293,26 +323,28 @@
  * 0 == 16bit, 1 == 32bit
  */
 static void
-lmc_hssi_set_crc_length (lmc_softc_t * const sc, int state)
+lmc_hssi_set_crc_length (lmc_softc_t * const sc, int state) /*FOLD00*/
 {
   if (state == LMC_CTL_CRC_LENGTH_32)
     {
       /* 32 bit */
       sc->lmc_miireg16 |= LMC_MII16_HSSI_CRC;
       sc->ictl.crc_length = LMC_CTL_CRC_LENGTH_32;
+      sc->lmc_crcSize = LMC_CTL_CRC_BYTESIZE_4;
     }
   else
     {
       /* 16 bit */
       sc->lmc_miireg16 &= ~LMC_MII16_HSSI_CRC;
       sc->ictl.crc_length = LMC_CTL_CRC_LENGTH_16;
+      sc->lmc_crcSize = LMC_CTL_CRC_BYTESIZE_2;
     }
 
   lmc_mii_writereg (sc, 0, 16, sc->lmc_miireg16);
 }
 
 static void
-lmc_hssi_watchdog (lmc_softc_t * const sc)
+lmc_hssi_watchdog (lmc_softc_t * const sc) /*fold00*/
 {
   /* HSSI is blank */
 }
@@ -325,7 +357,7 @@
  * Set cable length
  */
 static void
-lmc_ds3_set_100ft (lmc_softc_t * const sc, int ie)
+lmc_ds3_set_100ft (lmc_softc_t * const sc, int ie) /*fold00*/
 {
   if (ie == LMC_CTL_CABLE_LENGTH_GT_100FT)
     {
@@ -341,7 +373,7 @@
 }
 
 static void
-lmc_ds3_default (lmc_softc_t * const sc)
+lmc_ds3_default (lmc_softc_t * const sc) /*fold00*/
 {
   sc->lmc_miireg16 = LMC_MII16_LED_ALL;
 
@@ -356,7 +388,7 @@
  * always reset the card if needed.
  */
 static void
-lmc_ds3_set_status (lmc_softc_t * const sc, lmc_ctl_t * ctl)
+lmc_ds3_set_status (lmc_softc_t * const sc, lmc_ctl_t * ctl) /*fold00*/
 {
   if (ctl == NULL)
     {
@@ -387,7 +419,7 @@
 }
 
 static void
-lmc_ds3_init (lmc_softc_t * const sc)
+lmc_ds3_init (lmc_softc_t * const sc) /*fold00*/
 {
   int i;
 
@@ -422,7 +454,7 @@
  * 1 == DS3 payload scrambled, 0 == not scrambled
  */
 static void
-lmc_ds3_set_scram (lmc_softc_t * const sc, int ie)
+lmc_ds3_set_scram (lmc_softc_t * const sc, int ie) /*fold00*/
 {
   if (ie == LMC_CTL_ON)
     {
@@ -442,7 +474,7 @@
  * 0 == link is down, 1 == link is up.
  */
 static int
-lmc_ds3_get_link_status (lmc_softc_t * const sc)
+lmc_ds3_get_link_status (lmc_softc_t * const sc) /*fold00*/
 {
     u_int16_t link_status, link_status_11;
     int ret = 1;
@@ -528,34 +560,30 @@
  * 0 == 16bit, 1 == 32bit
  */
 static void
-lmc_ds3_set_crc_length (lmc_softc_t * const sc, int state)
+lmc_ds3_set_crc_length (lmc_softc_t * const sc, int state) /*FOLD00*/
 {
   if (state == LMC_CTL_CRC_LENGTH_32)
     {
       /* 32 bit */
       sc->lmc_miireg16 |= LMC_MII16_DS3_CRC;
       sc->ictl.crc_length = LMC_CTL_CRC_LENGTH_32;
+      sc->lmc_crcSize = LMC_CTL_CRC_BYTESIZE_4;
     }
   else
     {
       /* 16 bit */
       sc->lmc_miireg16 &= ~LMC_MII16_DS3_CRC;
       sc->ictl.crc_length = LMC_CTL_CRC_LENGTH_16;
+      sc->lmc_crcSize = LMC_CTL_CRC_BYTESIZE_2;
     }
 
   lmc_mii_writereg (sc, 0, 16, sc->lmc_miireg16);
 }
 
 static void
-lmc_ds3_watchdog (lmc_softc_t * const sc)
+lmc_ds3_watchdog (lmc_softc_t * const sc) /*fold00*/
 {
-  sc->lmc_miireg16 = lmc_mii_readreg (sc, 0, 16);
-  if (sc->lmc_miireg16 & 0x0018) {
-      printk ("%s: AIS Recieved\n", sc->name);
-      lmc_led_on (sc, LMC_DS3_LED1 | LMC_DS3_LED2);
-  }
-  else{
-  }
+    
 }
 
 
@@ -564,7 +592,7 @@
  */
 
 static void
-lmc_ssi_init (lmc_softc_t * const sc)
+lmc_ssi_init (lmc_softc_t * const sc) /*fold00*/
 {
   u_int16_t mii17;
   int cable;
@@ -580,7 +608,7 @@
 }
 
 static void
-lmc_ssi_default (lmc_softc_t * const sc)
+lmc_ssi_default (lmc_softc_t * const sc) /*fold00*/
 {
   sc->lmc_miireg16 = LMC_MII16_LED_ALL;
 
@@ -600,7 +628,7 @@
  * always reset the card if needed.
  */
 static void
-lmc_ssi_set_status (lmc_softc_t * const sc, lmc_ctl_t * ctl)
+lmc_ssi_set_status (lmc_softc_t * const sc, lmc_ctl_t * ctl) /*fold00*/
 {
   if (ctl == NULL)
     {
@@ -637,26 +665,30 @@
  * 1 == internal, 0 == external
  */
 static void
-lmc_ssi_set_clock (lmc_softc_t * const sc, int ie)
+lmc_ssi_set_clock (lmc_softc_t * const sc, int ie) /*fold00*/
 {
+  int old;
+  old = ie;
   if (ie == LMC_CTL_CLOCK_SOURCE_EXT)
     {
       sc->lmc_gpio &= ~(LMC_GEP_SSI_TXCLOCK);
       LMC_CSR_WRITE (sc, csr_gp, sc->lmc_gpio);
       sc->ictl.clock_source = LMC_CTL_CLOCK_SOURCE_EXT;
-      printk (LMC_PRINTF_FMT ": clock external\n", LMC_PRINTF_ARGS);
+      if(ie != old)
+        printk (KERN_INFO "%s: clock external\n", sc->name);
     }
   else
     {
       sc->lmc_gpio |= LMC_GEP_SSI_TXCLOCK;
       LMC_CSR_WRITE (sc, csr_gp, sc->lmc_gpio);
       sc->ictl.clock_source = LMC_CTL_CLOCK_SOURCE_INT;
-      printk (LMC_PRINTF_FMT ": clock internal\n", LMC_PRINTF_ARGS);
+      if(ie != old)
+        printk (KERN_INFO "%s: clock internal\n", sc->name);
     }
 }
 
 static void
-lmc_ssi_set_speed (lmc_softc_t * const sc, lmc_ctl_t * ctl)
+lmc_ssi_set_speed (lmc_softc_t * const sc, lmc_ctl_t * ctl) /*fold00*/
 {
   lmc_ctl_t *ictl = &sc->ictl;
   lmc_av9110_t *av;
@@ -698,7 +730,7 @@
  * 0 == link is down, 1 == link is up.
  */
 static int
-lmc_ssi_get_link_status (lmc_softc_t * const sc)
+lmc_ssi_get_link_status (lmc_softc_t * const sc) /*fold00*/
 {
   u_int16_t link_status;
   u_int32_t ticks;
@@ -741,7 +773,7 @@
       ret = 0;
       if(sc->last_led_err[3] != 1){
           sc->stats.tx_lossOfClockCnt++;
-          printk(KERN_WARNING "%s: Lost Clock Card Down\n", sc->name);
+          printk(KERN_WARNING "%s: Lost Clock, Link Down\n", sc->name);
       }
       sc->last_led_err[3] = 1;
       lmc_led_on (sc, LMC_MII16_LED3);	/* turn ON red LED */
@@ -767,7 +799,7 @@
 
   if(hw_hdsk == 0){
       if(sc->last_led_err[1] != 1)
-          printk(KERN_WARNING "%s: DSR no asserted\n", sc->name);
+          printk(KERN_WARNING "%s: DSR not asserted\n", sc->name);
       sc->last_led_err[1] = 1;
       lmc_led_off(sc, LMC_MII16_LED1);
   }
@@ -786,17 +818,17 @@
 }
 
 static void
-lmc_ssi_set_link_status (lmc_softc_t * const sc, int state)
+lmc_ssi_set_link_status (lmc_softc_t * const sc, int state) /*fold00*/
 {
   if (state == LMC_LINK_UP)
     {
       sc->lmc_miireg16 |= (LMC_MII16_SSI_DTR | LMC_MII16_SSI_RTS);
-      printk (LMC_PRINTF_FMT ": asserting DTR and RTS\n", LMC_PRINTF_ARGS);
+//      printk (LMC_PRINTF_FMT ": asserting DTR and RTS\n", LMC_PRINTF_ARGS);
     }
   else
     {
       sc->lmc_miireg16 &= ~(LMC_MII16_SSI_DTR | LMC_MII16_SSI_RTS);
-      printk (LMC_PRINTF_FMT ": deasserting DTR and RTS\n", LMC_PRINTF_ARGS);
+//      printk (LMC_PRINTF_FMT ": deasserting DTR and RTS\n", LMC_PRINTF_ARGS);
     }
 
   lmc_mii_writereg (sc, 0, 16, sc->lmc_miireg16);
@@ -807,7 +839,7 @@
  * 0 == 16bit, 1 == 32bit
  */
 static void
-lmc_ssi_set_crc_length (lmc_softc_t * const sc, int state)
+lmc_ssi_set_crc_length (lmc_softc_t * const sc, int state) /*FOLD00*/
 {
   if (state == LMC_CTL_CRC_LENGTH_32)
     {
@@ -832,51 +864,46 @@
  * These are bits to program the ssi frequency generator
  */
 static inline void
-write_av9110_bit (lmc_softc_t * sc, int c)
+write_av9110_bit (lmc_softc_t * sc, int c) /*fold00*/
 {
   /*
    * set the data bit as we need it.
    */
-  sc->lmc_gpio &= ~(LMC_GEP_SERIALCLK);
+  sc->lmc_gpio &= ~(LMC_GEP_CLK);
   if (c & 0x01)
-    sc->lmc_gpio |= LMC_GEP_SERIAL;
+    sc->lmc_gpio |= LMC_GEP_DATA;
   else
-    sc->lmc_gpio &= ~(LMC_GEP_SERIAL);
+    sc->lmc_gpio &= ~(LMC_GEP_DATA);
   LMC_CSR_WRITE (sc, csr_gp, sc->lmc_gpio);
 
   /*
    * set the clock to high
    */
-  sc->lmc_gpio |= LMC_GEP_SERIALCLK;
+  sc->lmc_gpio |= LMC_GEP_CLK;
   LMC_CSR_WRITE (sc, csr_gp, sc->lmc_gpio);
 
   /*
    * set the clock to low again.
    */
-  sc->lmc_gpio &= ~(LMC_GEP_SERIALCLK);
+  sc->lmc_gpio &= ~(LMC_GEP_CLK);
   LMC_CSR_WRITE (sc, csr_gp, sc->lmc_gpio);
 }
 
 static void
-write_av9110 (lmc_softc_t * sc, u_int32_t n, u_int32_t m, u_int32_t v,
+write_av9110 (lmc_softc_t * sc, u_int32_t n, u_int32_t m, u_int32_t v, /*fold00*/
 	      u_int32_t x, u_int32_t r)
 {
   int i;
 
-#if 0
-  printk (LMC_PRINTF_FMT ": speed %u, %d %d %d %d %d\n",
-	  LMC_PRINTF_ARGS, sc->ictl.clock_rate, n, m, v, x, r);
-#endif
-
   sc->lmc_gpio |= LMC_GEP_SSI_GENERATOR;
-  sc->lmc_gpio &= ~(LMC_GEP_SERIAL | LMC_GEP_SERIALCLK);
+  sc->lmc_gpio &= ~(LMC_GEP_DATA | LMC_GEP_CLK);
   LMC_CSR_WRITE (sc, csr_gp, sc->lmc_gpio);
 
   /*
    * Set the TXCLOCK, GENERATOR, SERIAL, and SERIALCLK
    * as outputs.
    */
-  lmc_gpio_mkoutput (sc, (LMC_GEP_SERIAL | LMC_GEP_SERIALCLK
+  lmc_gpio_mkoutput (sc, (LMC_GEP_DATA | LMC_GEP_CLK
 			  | LMC_GEP_SSI_GENERATOR));
 
   sc->lmc_gpio &= ~(LMC_GEP_SSI_GENERATOR);
@@ -902,12 +929,12 @@
    * stop driving serial-related signals
    */
   lmc_gpio_mkinput (sc,
-		    (LMC_GEP_SERIAL | LMC_GEP_SERIALCLK
+		    (LMC_GEP_DATA | LMC_GEP_CLK
 		     | LMC_GEP_SSI_GENERATOR));
 }
 
 static void
-lmc_ssi_watchdog (lmc_softc_t * const sc)
+lmc_ssi_watchdog (lmc_softc_t * const sc) /*fold00*/
 {
   u_int16_t mii17;
   struct ssicsr2
@@ -937,24 +964,24 @@
  * The framer regs are multiplexed through MII regs 17 & 18
  *  write the register address to MII reg 17 and the *  data to MII reg 18. */
 static void
-lmc_t1_write (lmc_softc_t * const sc, int a, int d)
+lmc_t1_write (lmc_softc_t * const sc, int a, int d) /*fold00*/
 {
   lmc_mii_writereg (sc, 0, 17, a);
   lmc_mii_writereg (sc, 0, 18, d);
 }
 
-/* Save a warning
+
 static int
-lmc_t1_read (lmc_softc_t * const sc, int a)
+lmc_t1_read (lmc_softc_t * const sc, int a) /*fold00*/
 {
   lmc_mii_writereg (sc, 0, 17, a);
   return lmc_mii_readreg (sc, 0, 18);
 }
-*/
+
 
 
 static void
-lmc_t1_init (lmc_softc_t * const sc)
+lmc_t1_init (lmc_softc_t * const sc) /*fold00*/
 {
   u_int16_t mii16;
   int i;
@@ -962,6 +989,10 @@
   sc->ictl.cardtype = LMC_CTL_CARDTYPE_LMC1200;
   mii16 = lmc_mii_readreg (sc, 0, 16);
 
+  mii16 &= ~LMC_MII16_T1_XOE;
+  lmc_mii_writereg (sc, 0, 16, mii16);
+  sc->lmc_miireg16 = mii16;
+
   /* reset 8370 */
   mii16 &= ~LMC_MII16_T1_RST;
   lmc_mii_writereg (sc, 0, 16, mii16 | LMC_MII16_T1_RST);
@@ -972,52 +1003,430 @@
   lmc_t1_set_circuit_type(sc, LMC_CTL_CIRCUIT_TYPE_T1);
   mii16 = sc->lmc_miireg16;
 
-  lmc_t1_write (sc, 0x01, 0x1B);	/* CR0     - primary control             */
-  lmc_t1_write (sc, 0x02, 0x42);	/* JAT_CR  - jitter atten config         */
-  lmc_t1_write (sc, 0x14, 0x00);	/* LOOP    - loopback config             */
-  lmc_t1_write (sc, 0x15, 0x00);	/* DL3_TS  - external data link timeslot */
+  /* Clear "foreced alarm" bis */
+  sc->yellow_alarm = 0;
+  sc->red_alarm = 0;
+  sc->blue_alarm = 0;
+
+  /*
+   * CR0
+   * - Set framing too ESF + Force CRC
+   * - Set T1
+   */
+  
+  lmc_t1_write (sc, 0x01, 0x1b);
+  /*
+   * JAT_CR
+   * - set Free Running JCLK and CLAD0
+   * - Reset Elastic store to center
+   * - 64 bit elastic store
+   */
+  lmc_t1_write (sc, 0x02, 0x4b);
+  
+  /*
+   * JAT_CR
+   * - Release Elastic store reset
+   */
+  lmc_t1_write (sc, 0x02, 0x43);
+  
+  /*
+   * Disable all interupts
+   * Except: BOP receive
+   */
+
+  lmc_t1_write (sc, 0x0C, 0x00);
+  lmc_t1_write (sc, 0x0D, 0x00);
+  lmc_t1_write (sc, 0x0E, 0x00);
+  lmc_t1_write (sc, 0x0F, 0x00);
+  lmc_t1_write (sc, 0x10, 0x00);
+  lmc_t1_write (sc, 0x11, 0x00);
+  lmc_t1_write (sc, 0x12, 0x80);
+  lmc_t1_write (sc, 0x13, 0x00);
+  
+  /*
+   * LOOP
+   * - No loopbacks set
+   */
+  lmc_t1_write (sc, 0x14, 0x00);
+  
+  /*
+   * DL3_TS
+   * - Disabled
+   */
+  lmc_t1_write (sc, 0x15, 0x00);
+  
+  /*
+   * PIO
+   * - ONESEC_IO, RDL_IO, TDL_IO, INDY_IO, RFSYNC_IO, RMSYNC_IO
+   *   TFSNYC_IO, TMSYNC_IO: Set for output
+   */
   lmc_t1_write (sc, 0x18, 0xFF);	/* PIO     - programmable I/O            */
+  
+  /*
+   * POE
+   * TDL_OE, RDL_OE: tri state output capable enable
+   * Rest: 2 level output
+   */
   lmc_t1_write (sc, 0x19, 0x30);	/* POE     - programmable OE             */
+  
+  /*
+   * CMUX - Clock Input Mux
+   * RSBCKLI: Normal RSB timebase
+   * TSBCKI: Normal TSB timebase
+   * CLADI: CLAD slaved to transmit
+   * TCKI: Internal CLAD
+   */
   lmc_t1_write (sc, 0x1A, 0x0F);	/* CMUX    - clock input mux             */
+  
+  /*
+   * LIU_CR
+   * RST_LIU: Reset LIU
+   * SQUELCH: Enable squelch
+   * Must be 1: Set to 1
+   */
+  lmc_t1_write (sc, 0x20, 0xC1);	/* LIU_CR  - RX LIU config               */
   lmc_t1_write (sc, 0x20, 0x41);	/* LIU_CR  - RX LIU config               */
-  lmc_t1_write (sc, 0x22, 0x76);	/* RLIU_CR - RX LIU config               */
+  /*
+   * RLIU_CR
+   * WHAT IS GOING ON HERE? USED TO BE 0x76
+   * FRZ_SHORT: don't update on strong signals
+   * AGC: 0x11 normal op
+   * LONG_EYE: normal
+   */
+  lmc_t1_write (sc, 0x22, 0xB1);	/* RLIU_CR - RX LIU config               */
+
+  /*
+   * VGA_MAX
+   * Setting of -20db sesitivity
+   */
+  lmc_t1_write (sc, 0x24, 0x21);
+
+  /*
+   * PRE_EQ
+   * Force off the pre-equilizer
+   * Load 0x26 in VTHRESH
+   */
+  lmc_t1_write (sc, 0x2A, 0xA6);
+
+  /*
+   * GAIN
+   * Equilizer Gain threshholds
+   * Number taken straight from David test code
+   */
+  lmc_t1_write (sc, 0x38, 0x24);  /* RX_TH0  - RX gain threshold 0         */
+  lmc_t1_write (sc, 0x39, 0x28);  /* RX_TH1  - RX gain threshold 0         */
+  lmc_t1_write (sc, 0x3A, 0x2C);  /* RX_TH2  - RX gain threshold 0         */
+  lmc_t1_write (sc, 0x3B, 0x30);  /* RX_TH3  - RX gain threshold 0         */
+  lmc_t1_write (sc, 0x3C, 0x34);  /* RX_TH4  - RX gain threshold 0         */
+
+  /*
+   *  LIU_CR
+   *  Reset the LIU so it'll load the new constants
+   */
+  lmc_t1_write (sc, 0x20, 0x81);  /* LIU_CR  - RX LIU config (reset RLIU)  */
+  lmc_t1_write (sc, 0x20, 0x01);  /* LIU_CR  - RX LIU config (clear reset) */
+  
+  /*
+   * RCR0
+   * Receive B8ZS and 2 out of 4 F-bit errors for reframe
+   */
   lmc_t1_write (sc, 0x40, 0x03);	/* RCR0    - RX config                   */
-  lmc_t1_write (sc, 0x45, 0x00);	/* RALM    - RX alarm config             */
-  lmc_t1_write (sc, 0x46, 0x05);	/* LATCH   - RX alarm/err/cntr latch     */
-  lmc_t1_write (sc, 0x68, 0x40);	/* TLIU_CR - TX LIU config               */
-  lmc_t1_write (sc, 0x70, 0x0D);	/* TCR0    - TX framer config            */
-  lmc_t1_write (sc, 0x71, 0x05);	/* TCR1    - TX config                   */
-  lmc_t1_write (sc, 0x72, 0x0B);	/* TFRM    - TX frame format             */
-  lmc_t1_write (sc, 0x73, 0x00);	/* TERROR  - TX error insert             */
-  lmc_t1_write (sc, 0x74, 0x00);	/* TMAN    - TX manual Sa/FEBE config    */
-  lmc_t1_write (sc, 0x75, 0x00);	/* TALM    - TX alarm signal config      */
-  lmc_t1_write (sc, 0x76, 0x00);	/* TPATT   - TX test pattern config      */
-  lmc_t1_write (sc, 0x77, 0x00);	/* TLB     - TX inband loopback config   */
-  lmc_t1_write (sc, 0x90, 0x05);	/* CLAD_CR - clock rate adapter config   */
+
+  /*
+   * RPATT
+   * Zero the test pattern generator
+   */
+  lmc_t1_write (sc, 0x41, 0x00);
+
+  /*
+   * RLB
+   * Loop back code detector
+   * DN_LEN: Down length is 8 bits
+   * UP_LEN: 5 bits
+   */
+  lmc_t1_write (sc, 0x42, 0x09);
+
+  /*
+   * LBA: Loopback activate
+   * LBA[6]: 1
+   * Loopback activate code
+   */
+  lmc_t1_write (sc, 0x43, 0x08);
+
+  /*
+   * LBD: Loopback deactivate
+   *
+   * Loopback deactivate code
+   */
+  lmc_t1_write (sc, 0x44, 0x24);
+
+  /*
+   * RALM: Receive Alarm Signal Configuration
+   *
+   * Set 0 which seems to be narmal alarms
+   */
+  lmc_t1_write (sc, 0x45, 0x00);
+
+  /*
+   * LATCH: Alarm/Error/Cournetr Latch register
+   *
+   * STOP_CNT: Stop error counters durring RLOF/RLOS/RAIS
+   */
+  lmc_t1_write (sc, 0x46, 0x08);
+
+  /*
+   * TLIU_CR: Transmit LIU Control Register
+   *
+   * TERM: External Transmit termination
+   * LBO: No line buildout
+   * Pulse shape from N8370DSE: 3-66
+   * // PULSE: 000 = 0 - 133ft 100 ohm twisted pair T1 DSX
+   * PULSE: 111 = Long Haul FCC Part 68 100 ohm twisted T1 CSU/NCTE
+   */
+  
+  lmc_t1_write (sc, 0x68, 0x4E);
+
+  /*
+   * TCR0: Transmit Framer Configuration
+   *
+   * TFRAME: 1101 == ESF + Froce CRC
+   */
+  lmc_t1_write (sc, 0x70, 0x0D);
+
+  /*
+   * TCR1: Transmit Configuration Registers
+   *
+   * TLOFA: 2 out of 4 bit errors = LOF
+   * TZCS: 000VB0VB Table 3-20 page 3-72
+   */
+  lmc_t1_write (sc, 0x71, 0x05);
+
+  /*
+   * TFRM: Transmit Frame Format
+   *
+   * INS_MF: Insert Multiframe aligement
+   * INS_CRC: Insert CRC
+   * INS_FBIT: Insert Framing
+   */
+  lmc_t1_write (sc, 0x72, 0x0B);
+
+  /*
+   * TERROR
+   *
+   * Don't xmit any errors
+   */
+  lmc_t1_write (sc, 0x73, 0x00);
+
+  /*
+   * TMAN: Tranimit Mahual Sa-byte/FEBE configuration
+   */
+  lmc_t1_write (sc, 0x74, 0x00);
+
+
+  /*
+   * TALM: Transmit Alarm Signal Configuration
+   *
+   * Don't use any of these auto alarms
+   */
+  lmc_t1_write (sc, 0x75, 0x00);
+
+
+  /*
+   * TPATT: Transmit Pattern Canfiguration
+   *
+   * No special test patterns
+   */
+  lmc_t1_write (sc, 0x76, 0x00);
+
+  /*
+   * TLB: Transmit Inband Loopback Codhe Configuration
+   *
+   * Not enabled
+   */
+  lmc_t1_write (sc, 0x77, 0x00);
+
+  /*
+   * CLAD_CR: Clack Rate Adapter Configuration
+   *
+   * LFGAIN: Loop filter gain 1/2^6
+   */
+  lmc_t1_write (sc, 0x90, 0x06);	/* CLAD_CR - clock rate adapter config   */
+
+  /*
+   * CSEL: CLAD Frequency Select
+   *
+   * CLADV: 0000 - 1024 kHz
+   * CLADO: 0101 - 1544 kHz
+   */
   lmc_t1_write (sc, 0x91, 0x05);	/* CSEL    - clad freq sel               */
-  lmc_t1_write (sc, 0xA6, 0x00);	/* DL1_CTL - DL1 control                 */
+
+  /*
+   * CPHASE: CLAD Phase detector
+   */
+  lmc_t1_write (sc, 0x92, 0x00);
+
+  /*
+   * CTEST: Clad Test
+   *
+   * No tests
+   */
+  lmc_t1_write (sc, 0x93, 0x00);
+
+  /*
+   * BOP: Bop receiver
+   *
+   * Enable, 25 messages receive, 25 send, BOP has priority over FDL
+   */
+  lmc_t1_write (sc, 0xA0, 0xea);        /* BOP     - Bit oriented protocol xcvr  */
+
+  /*
+   * Setup required to activae BOP.
+   * See table: 3-22 page 3-87
+   * See at the end
+   */
+  lmc_t1_write (sc, 0xA4, 0x40);        /* DL1_TS  - DL1 time slot enable        */
+  lmc_t1_write (sc, 0xA5, 0x00);        /* DL1_BIT - DL1 bit enable              */
+  lmc_t1_write (sc, 0xA6, 0x03);        /* DL1_CTL - DL1 control                 */
+  lmc_t1_write (sc, 0xA7, 0x00);        /* RDL1_FFC - DL1 FIFO Size */
+  lmc_t1_write (sc, 0xAB, 0x00);        /* TDL1_FFC - DL1 Empty Control*/
+
+  /*
+   * PRM: FDL PRM Messages
+   *
+   * Disable all automatic FDL messages
+   */
+  
+  lmc_t1_write (sc, 0xAA, 0x00);        /* PRM     - performance report message  */
+
+  /*
+   * DLC2 Control
+   *
+   * TDL2_EN: Disable transmit
+   * RDL2_EN: Disable receive
+   */
   lmc_t1_write (sc, 0xB1, 0x00);	/* DL2_CTL - DL2 control                 */
+  /*
+   * SBI_CR: System Bus Interface Configuration
+   *
+   * SBI_OE: Enable system bus
+   * SBI: T1 at 1544 with 24+fbit Page 3-113
+   */
   lmc_t1_write (sc, 0xD0, 0x47);	/* SBI_CR  - sys bus iface config        */
-  lmc_t1_write (sc, 0xD1, 0x70);	/* RSB_CR  - RX sys bus config           */
+  /*
+   * RSB_CR: Receive System Bus Coniguration
+   *
+   * SIG_OFF: RPCMO signalling off
+   * RPCM_NEG: Output on falling edge
+   * RSYN_NEG: Output sync an negative edge of clock
+   *
+   */
+  lmc_t1_write (sc, 0xD1, 0x70);
+
+  /*
+   * TSB_CR: Transmit System Bus  Configuration
+   *
+   * TPCM_NEG: Tranimettr multiframe follows TSB
+   * TSYN_NEG: TFSYNC or TMSYNC on falling edge output
+   */
   lmc_t1_write (sc, 0xD4, 0x30);	/* TSB_CR  - TX sys bus config           */
+
   for (i = 0; i < 32; i++)
     {
       lmc_t1_write (sc, 0x0E0 + i, 0x00);	/* SBCn - sys bus per-channel ctl    */
       lmc_t1_write (sc, 0x100 + i, 0x00);	/* TPCn - TX per-channel ctl         */
       lmc_t1_write (sc, 0x180 + i, 0x00);	/* RPCn - RX per-channel ctl         */
     }
+  for (i=1; i<25; i++)
+      lmc_t1_write (sc, 0x0E0 + i, 0x01);       /* SBCn - sys bus per-channel ctl    */
   for (i = 1; i < 25; i++)
     {
       lmc_t1_write (sc, 0x0E0 + i, 0x0D);	/* SBCn - sys bus per-channel ctl    */
     }
 
+  /*
+   * Seems to get lost sometimes
+   */
+  lmc_t1_write (sc, 0xA4, 0x40);        /* DL1_TS  - DL1 time slot enable        */
+  lmc_t1_write (sc, 0xA5, 0x00);        /* DL1_BIT - DL1 bit enable              */
+  lmc_t1_write (sc, 0xA6, 0x03);        /* DL1_CTL - DL1 control                 */
+  lmc_t1_write (sc, 0xA7, 0x00);        /* RDL1_FFC - DL1 FIFO Size */
+  lmc_t1_write (sc, 0xAB, 0x00);        /* TDL1_FFC - DL1 Empty Control*/
+
+  /*
+   * Basic setup is done, now setup modes like SF AMI, and
+   * Fractional T1.
+   */
+
+  if(sc->t1_amisf != 0){
+      /*
+       * Set ami line codeing
+       */
+      lmc_t1_write (sc, 0x40, 0x83);
+      lmc_t1_write (sc, 0x71, 0x07); // 0x03 is ami
+
+      /*
+       * Set SF framing
+       */
+      lmc_t1_write (sc, 0x70, 0x04);
+      lmc_t1_write (sc, 0x72, 0x09);
+      lmc_t1_write (sc, 0x01, 0x09);
+
+      lmc_t1_write (sc, 0x46,0x00);
+      lmc_t1_write (sc, 0xa6,0x00);
+      lmc_t1_write (sc, 0xa0,0x00);
+
+      /* Setup Loopback */
+      lmc_t1_write (sc, 0x0d, 0xc0);
+      lmc_t1_write (sc, 0x42, 0x09);
+      lmc_t1_write (sc, 0x43, 0x08);
+      lmc_t1_write (sc, 0x44, 0x24);
+
+
+      if(sc->t1_amisf == 2 && sc->t1_frac_mask == 0){
+          sc->t1_frac_mask = 0xfffffffe;
+      }
+  }
+
+  if(sc->t1_frac_mask){
+      u32 mask = sc->t1_frac_mask;
+      int i;
+      int onoff;
+      for(i = 24; i >= 1; i--){
+          onoff = mask & 0x1;
+          mask >>= 1;
+          if(onoff == 0){
+              lmc_t1_write(sc, 0x0e0+i,0x01);
+              lmc_t1_write(sc, 0x100+i,0x20);
+              lmc_t1_write(sc, 0x140+i,0x7f);
+          }
+          else{
+              lmc_t1_write(sc, 0x0e0+i,0x0D);
+              lmc_t1_write(sc, 0x100+i,0x00);
+              lmc_t1_write(sc, 0x140+i,0x00);
+          }
+      }
+      mii16 |= LMC_MII16_T1_INVERT;
+      lmc_mii_writereg (sc, 0, 16, mii16);
+  }
+  else {
+      mii16 &= ~LMC_MII16_T1_INVERT; /* Unless we're on AMI SF don't invert */
+  }
+
+  if(sc->t1_loop_time){
+	  lmc_t1_write(sc, 0x02, 0xa3);
+  }
+
+  lmc_gpio_mkoutput(sc, LMC_GEP_T1_INT);
+  sc->lmc_gpio |= LMC_GEP_T1_INT;
+  LMC_CSR_WRITE(sc, csr_gp, sc->lmc_gpio);
+
   mii16 |= LMC_MII16_T1_XOE;
   lmc_mii_writereg (sc, 0, 16, mii16);
   sc->lmc_miireg16 = mii16;
 }
 
 static void
-lmc_t1_default (lmc_softc_t * const sc)
+lmc_t1_default (lmc_softc_t * const sc) /*fold00*/
 {
   sc->lmc_miireg16 = LMC_MII16_LED_ALL;
   sc->lmc_media->set_link_status (sc, LMC_LINK_DOWN);
@@ -1029,7 +1438,7 @@
 /* * Given a user provided state, set ourselves up to match it.  This will * always reset the card if needed.
  */
 static void
-lmc_t1_set_status (lmc_softc_t * const sc, lmc_ctl_t * ctl)
+lmc_t1_set_status (lmc_softc_t * const sc, lmc_ctl_t * ctl) /*fold00*/
 {
   if (ctl == NULL)
     {
@@ -1053,7 +1462,7 @@
  * return hardware link status.
  * 0 == link is down, 1 == link is up.
  */ static int
-lmc_t1_get_link_status (lmc_softc_t * const sc)
+lmc_t1_get_link_status (lmc_softc_t * const sc) /*fold00*/
 {
     u_int16_t link_status;
     int ret = 1;
@@ -1067,19 +1476,23 @@
    * led3 red    = Loss of Signal (LOS) or out of frame (OOF)
    *               conditions detected on T3 receive signal
    */
-    
+    lmc_trace(sc->lmc_device, "lmc_t1_get_link_status in");
     lmc_led_on(sc, LMC_DS3_LED2);
 
     lmc_mii_writereg (sc, 0, 17, T1FRAMER_ALARM1_STATUS);
     link_status = lmc_mii_readreg (sc, 0, 18);
 
 
-    if (link_status & T1F_RAIS) {			/* turn on blue LED */
+    if ((link_status & T1F_RAIS) || sc->blue_alarm) {			/* turn on blue LED */
         ret = 0;
         if(sc->last_led_err[1] != 1){
             printk(KERN_WARNING "%s: Receive AIS/Blue Alarm. Far end in RED alarm\n", sc->name);
         }
+        if(sc->blue_alarm != 0){
+            sc->blue_alarm--;
+        }
         lmc_led_on(sc, LMC_DS3_LED1);
+        
         sc->last_led_err[1] = 1;
     }
     else {
@@ -1091,20 +1504,26 @@
     }
 
     /*
-     * Yellow Alarm is nasty evil stuff, looks at data patterns
+     * AMI: Yellow Alarm is nasty evil stuff, looks at data patterns
      * inside the channel and confuses it with HDLC framing
      * ignore all yellow alarms.
      *
+     * B8ZS: RAI/Yellow alarm is implemented via a continous BOP
+     * message.
+     *
      * Do listen to MultiFrame Yellow alarm which while implemented
      * different ways isn't in the channel and hence somewhat
      * more reliable
      */
 
-    if (link_status & T1F_RMYEL) {
+    if ((link_status & T1F_RMYEL) || sc->yellow_alarm) {
         ret = 0;
         if(sc->last_led_err[0] != 1){
             printk(KERN_WARNING "%s: Receive Yellow AIS Alarm\n", sc->name);
         }
+        if(sc->yellow_alarm > 0){
+            sc->yellow_alarm--;
+        }
         lmc_led_on(sc, LMC_DS3_LED0);
         sc->last_led_err[0] = 1;
     }
@@ -1120,10 +1539,21 @@
      * Loss of signal and los of frame
      * Use the green bit to identify which one lit the led
      */
-    if(link_status & T1F_RLOF){
+    if((link_status & T1F_RLOF) || sc->red_alarm){
         ret = 0;
         if(sc->last_led_err[3] != 1){
-            printk(KERN_WARNING "%s: Local Red Alarm: Loss of Framing\n", sc->name);
+            printk(KERN_WARNING "%s: Local Red Alarm: Loss of Framing (LOF)\n", sc->name);
+            /*
+             * Send AIS/Yellow
+             * So send continuous AIS/Yellom BOP messages
+             */
+            if(!sc->t1_amisf){
+                lmc_t1_write (sc, 0xA0, 0xee); /* Cont BOP */
+                lmc_t1_write (sc, 0xA1, 0x00); /* 0x00 is AIS/yellow BOP */
+            }
+        }
+        if(sc->red_alarm != 0){
+            sc->red_alarm--;
         }
         lmc_led_on(sc, LMC_DS3_LED3);
         sc->last_led_err[3] = 1;
@@ -1132,16 +1562,34 @@
     else {
         if(sc->last_led_err[3] != 0){
             printk(KERN_WARNING "%s: End Red Alarm (LOF)\n", sc->name);
+            /*
+             * Stop sending continuous BOP
+             * hence end yellow alarm
+             */
+            if(!sc->t1_amisf){
+                lmc_t1_write (sc, 0xA0, 0xea); /* Normal 25 BOP */
+            }
         }
         if( ! (link_status & T1F_RLOS))
             lmc_led_off(sc, LMC_DS3_LED3);
         sc->last_led_err[3] = 0;
     }
     
-    if(link_status & T1F_RLOS){
+    if((link_status & T1F_RLOS) || sc->red_alarm){
         ret = 0;
         if(sc->last_led_err[2] != 1){
-            printk(KERN_WARNING "%s: Local Red Alarm: Loss of Signal\n", sc->name);
+            printk(KERN_WARNING "%s: Local Red Alarm: Loss of Signal (LOS)\n", sc->name);
+            /*
+             * Send AIS/Yellow
+             * So send continuous AIS/Yellom BOP messages
+             */
+            if(!sc->t1_amisf){
+                lmc_t1_write (sc, 0xA0, 0xee); /* Cont BOP */
+                lmc_t1_write (sc, 0xA1, 0x00); /* 0x00 is AIS/yellow BOP */
+            }
+        }
+        if(sc->red_alarm != 0){
+            sc->red_alarm--;
         }
         lmc_led_on(sc, LMC_DS3_LED3);
         sc->last_led_err[2] = 1;
@@ -1150,6 +1598,14 @@
     else {
         if(sc->last_led_err[2] != 0){
             printk(KERN_WARNING "%s: End Red Alarm (LOS)\n", sc->name);
+            /*
+             * Stop sending continuous BOP
+             * hence end yellow alarm
+             */
+            if(!sc->t1_amisf){
+                lmc_t1_write (sc, 0xA0, 0xea); /* Normal 25 BOP */
+            }
+
         }
         if( ! (link_status & T1F_RLOF))
             lmc_led_off(sc, LMC_DS3_LED3);
@@ -1161,6 +1617,9 @@
     lmc_mii_writereg (sc, 0, 17, T1FRAMER_ALARM2_STATUS);
     sc->lmc_xinfo.t1_alarm2_status = lmc_mii_readreg (sc, 0, 18);
 
+    
+    lmc_trace(sc->lmc_device, "lmc_t1_get_link_status out");
+
     return ret;
 }
 
@@ -1168,17 +1627,19 @@
  * 1 == T1 Circuit Type , 0 == E1 Circuit Type
  */
 static void
-lmc_t1_set_circuit_type (lmc_softc_t * const sc, int ie)
+lmc_t1_set_circuit_type (lmc_softc_t * const sc, int ie) /*fold00*/
 {
+  int old;
+  old = sc->ictl.circuit_type;
   if (ie == LMC_CTL_CIRCUIT_TYPE_T1) {
-      sc->lmc_miireg16 |= LMC_MII16_T1_Z;
       sc->ictl.circuit_type = LMC_CTL_CIRCUIT_TYPE_T1;
-      printk(KERN_INFO "%s: In T1 Mode\n", sc->name);
+      if(old != sc->ictl.circuit_type)
+          printk(KERN_INFO "%s: In T1 Mode\n", sc->name);
   }
   else {
-      sc->lmc_miireg16 &= ~LMC_MII16_T1_Z;
       sc->ictl.circuit_type = LMC_CTL_CIRCUIT_TYPE_E1;
-      printk(KERN_INFO "%s: In E1 Mode\n", sc->name);
+      if(old != sc->ictl.circuit_type)
+          printk(KERN_INFO "%s: In E1 Mode (non functional)\n", sc->name);
   }
 
   lmc_mii_writereg (sc, 0, 16, sc->lmc_miireg16);
@@ -1188,7 +1649,7 @@
 /*
  * 0 == 16bit, 1 == 32bit */
 static void
-lmc_t1_set_crc_length (lmc_softc_t * const sc, int state)
+lmc_t1_set_crc_length (lmc_softc_t * const sc, int state) /*fold00*/
 {
   if (state == LMC_CTL_CRC_LENGTH_32)
     {
@@ -1213,31 +1674,167 @@
  * 1 == internal, 0 == external
  */
 static void
-lmc_t1_set_clock (lmc_softc_t * const sc, int ie)
+lmc_t1_set_clock (lmc_softc_t * const sc, int ie) /*fold00*/
 {
-  if (ie == LMC_CTL_CLOCK_SOURCE_EXT)
-    {
-      sc->lmc_gpio &= ~(LMC_GEP_SSI_TXCLOCK);
-      LMC_CSR_WRITE (sc, csr_gp, sc->lmc_gpio);
-      sc->ictl.clock_source = LMC_CTL_CLOCK_SOURCE_EXT;
-      printk (LMC_PRINTF_FMT ": clock external\n", LMC_PRINTF_ARGS);
-    }
-  else
-    {
-      sc->lmc_gpio |= LMC_GEP_SSI_TXCLOCK;
-      LMC_CSR_WRITE (sc, csr_gp, sc->lmc_gpio);
-      sc->ictl.clock_source = LMC_CTL_CLOCK_SOURCE_INT;
-      printk (LMC_PRINTF_FMT ": clock internal\n", LMC_PRINTF_ARGS);
-    }
+    /*
+     * Not set this way, done through T1 specific IOCTL
+     */
 }
 
-static void
-lmc_t1_watchdog (lmc_softc_t * const sc)
+static void lmc_t1_watchdog (lmc_softc_t * const sc) /*fold00*/
 {
+        if(sc->loop_timer != 0){
+                sc->loop_timer--;
+                if(sc->loop_timer == 0){
+                        if(lmc_t1_read(sc, 0x014) != 0x00){
+                                printk(KERN_DEBUG "%s: Timeout: Loop down\n", sc->name);
+                                lmc_t1_write(sc, 0x014, 0x00);
+                                /*
+                                 * If we're not loop timed
+                                 * go back to intelnal clack
+                                 */
+                                if(! sc->t1_loop_time){
+                                    lmc_t1_write(sc, 0x02, 0x4b);
+                                }
+                        }
+                }
+        }
+        /*
+         * Check for BOP messages on A2 rev boards
+         */
+        lmc_t1_got_interupt (sc);
+}
+
+static int lmc_t1_ioctl (lmc_softc_t * const sc, void *d) /*fold00*/
+{
+        struct lmc_st1f_control ctl;
+        int ret;
+
+        LMC_COPY_FROM_USER(&ctl, d, sizeof (struct lmc_st1f_control));
+
+        switch(ctl.command){
+        case lmc_st1f_write:
+                lmc_t1_write(sc, ctl.address, ctl.value);
+                ret = 0;
+                break;
+        case lmc_st1f_read:
+                ctl.value = lmc_t1_read(sc, ctl.address) & 0xff;
+                LMC_COPY_TO_USER(d, &ctl, sizeof (struct lmc_st1f_control));
+                ret = 0;
+                break;
+        case lmc_st1f_inv:
+                if(ctl.value == 1){
+                  sc->lmc_miireg16 |= LMC_MII16_T1_INVERT;
+                  lmc_mii_writereg (sc, 0, 16,   sc->lmc_miireg16);
+                  printk("%s: Request to invert data\n", sc->name);
+                }
+                else {
+                  sc->lmc_miireg16 &= ~LMC_MII16_T1_INVERT;
+                  lmc_mii_writereg (sc, 0, 16,   sc->lmc_miireg16);
+                  printk("%s: Request to non-invert data\n", sc->name);
+                }
+                ret = 0;
+                break;
+        case lmc_st1f_amisf:
+                sc->t1_amisf = ctl.value;
+                if(sc->lmc_ok){
+                 lmc_t1_init(sc);
+                }
+                ret = 0;
+                break;
+        case lmc_st1f_frac:
+                LMC_COPY_FROM_USER(&sc->t1_frac_mask, ctl.data, sizeof (u32));
+                if(sc->lmc_ok){
+                 lmc_t1_init(sc);
+                }
+                ret = 0;
+                break;
+        case lmc_st1f_loopt:
+		sc->t1_loop_time = ctl.value;
+		if(sc->lmc_ok){
+			lmc_t1_init(sc);
+		}
+		ret = 0;
+		break;
+        default:
+        ret = -ENOSYS;
+        }
+
+        return ret;
 }
 
-static void
-lmc_set_protocol (lmc_softc_t * const sc, lmc_ctl_t * ctl)
+static int lmc_t1_got_interupt (lmc_softc_t * const sc) /*fold00*/
+{
+        u8 reg;
+
+        /* And it with the mask in case we're polling
+         * and we have want the int disabsled
+         */
+        reg = lmc_t1_read(sc, 0x00a) & lmc_t1_read(sc, 0x12);
+
+        if(reg & 0x80){
+//                printk(KERN_DEBUG "%s: Got Inbound BOP message 0x%02x\n", sc->name, lmc_t1_read(sc, 0x0a2) & 0x3f);
+                switch(lmc_t1_read(sc, 0x0a2) & 0x3f) {
+                case 0x00: /* Yellow Alarm */
+                        sc->yellow_alarm = 5; /* Start Yellow Alarm for 3 seconds */
+                        break;
+
+                case 0x07: /* Loop up */
+                        printk(KERN_DEBUG "%s: BOP: Loop up\n", sc->name);
+                        sc->loop_timer = 305;
+                        lmc_t1_write(sc, 0x002, 0xa3); /* Enter loop timeing */
+                        lmc_t1_write(sc, 0x014, 0x04); /* Loop towards net */
+                        break;
+                        
+                case 0x0b: /* Pay load loop back */
+                        printk(KERN_DEBUG "%s: BOP: Payload Loop up\n", sc->name);
+                        sc->loop_timer = 305;
+                        lmc_t1_write(sc, 0x014, 0x08);
+                        break;
+                        
+                case 0x1a:
+                case 0x1c: /* Loop down T1.409, etc */
+                case 0x1d: /* Loop down T1.403 */
+                        printk(KERN_DEBUG "%s: BOP: Loop down\n", sc->name);
+                        lmc_t1_write(sc, 0x014, 0x00); /* Loop down */
+                        /*
+                         * If we're not loop timed
+                         * go back to intelnal clack
+                         */
+                        if(! sc->t1_loop_time){
+                            lmc_t1_write(sc, 0x02, 0x4b);
+                        }
+
+                        break;
+
+                }
+        }
+
+        reg = lmc_t1_read(sc, 0x005) & lmc_t1_read(sc, 0x0d);
+        
+        if(reg & 0x04){
+            printk(KERN_DEBUG "%s: Inband: Loop up\n", sc->name);
+            sc->loop_timer = 305;
+            lmc_t1_write(sc, 0x002, 0xa3); /* Enter loop timeing */
+            lmc_t1_write(sc, 0x014, 0x04); /* Loop up */
+        }
+        if(reg & 0x08){
+            printk(KERN_DEBUG "%s: Inband: Loop down\n", sc->name);
+            lmc_t1_write(sc, 0x014, 0x00);
+            /*
+             * If we're not loop timed
+             * go back to intelnal clack
+             */
+            if(! sc->t1_loop_time){
+                lmc_t1_write(sc, 0x02, 0x4b);
+            }
+        }
+        
+        return 0;
+}
+
+
+static void lmc_set_protocol (lmc_softc_t * const sc, lmc_ctl_t * ctl) /*fold00*/
 {
   if (ctl == 0)
     {
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/drivers/net/lmc/lmc_proto.c linux.17p9/drivers/net/lmc/lmc_proto.c
--- linux.vanilla/drivers/net/lmc/lmc_proto.c	Thu Jan  1 01:00:00 1970
+++ linux.17p9/drivers/net/lmc/lmc_proto.c	Tue Jun 20 23:08:03 2000
@@ -0,0 +1,270 @@
+ /*
+  * Copyright (c) 1997-2000 LAN Media Corporation (LMC)
+  * All rights reserved.  www.lanmedia.com
+  *
+  * This code is written by:
+  * Andrew Stanley-Jones (asj@cban.com)
+  *
+  * With Help By:
+  * David Boggs
+  * Ron Crane
+  * Allan Cox
+  *
+  * This software may be used and distributed according to the terms
+  * of the GNU Public License version 2, incorporated herein by reference.
+  *
+  * Driver for the LanMedia LMC5200, LMC5245, LMC1000, LMC1200 cards.
+  */
+
+#include <linux/version.h>
+//#include <linux/config.h>
+#include <linux/kernel.h>
+#include <linux/sched.h>
+#include <linux/string.h>
+#include <linux/timer.h>
+#include <linux/ptrace.h>
+#include <linux/errno.h>
+#include <linux/ioport.h>
+#include <linux/malloc.h>
+#include <linux/interrupt.h>
+#include <linux/pci.h>
+#include <asm/segment.h>
+#include <asm/smp.h>
+
+#include <linux/in.h>
+#include <linux/if_arp.h>
+#include <asm/processor.h>             /* Processor type for cache alignment. */
+#include <asm/bitops.h>
+#include <asm/io.h>
+#include <asm/dma.h>
+
+#include <linux/netdevice.h>
+#include <linux/etherdevice.h>
+#include <linux/skbuff.h>
+#include "../syncppp.h"
+#include <linux/inet.h>
+#include <linux/tqueue.h>
+#include <linux/proc_fs.h>
+
+#include "lmc_ver.h"
+#include "lmc.h"
+#include "lmc_var.h"
+#include "lmc_debug.h"
+#include "lmc_ioctl.h"
+#include "lmc_proto.h"
+//#include "lmc_proto_raw.h"
+
+/*
+ * The compile-time variable SPPPSTUP causes the module to be
+ * compiled without referencing any of the sync ppp routines.
+ */
+#ifdef SPPPSTUB
+#define SYNC_PPP_init() (void)0
+#define SPPP_detach(d)	(void)0
+#define SPPP_open(d)	0
+#define SPPP_reopen(d)	(void)0
+#define SPPP_close(d)	(void)0
+#define SPPP_attach(d)	(void)0
+#define SPPP_do_ioctl(d,i,c)	-EOPNOTSUPP
+#else
+#if LINUX_VERSION_CODE < 0x20211
+#define SYNC_PPP_init	sync_ppp_init
+#define SPPP_attach(x)	sppp_attach((struct ppp_device *)(x)->lmc_device)
+#define SPPP_detach(x)	sppp_detach((x)->lmc_device)
+#define SPPP_open(x)	sppp_open((x)->lmc_device)
+#define SPPP_reopen(x)	sppp_reopen((x)->lmc_device)
+#define SPPP_close(x)	sppp_close((x)->lmc_device)
+#define SPPP_do_ioctl(x, y, z)	sppp_do_ioctl((x)->lmc_device, (y), (z))
+#else
+#define SYNC_PPP_init	sync_ppp_init
+#define SPPP_attach(x)	sppp_attach((x)->pd)
+#define SPPP_detach(x)	sppp_detach((x)->pd->dev)
+#define SPPP_open(x)	sppp_open((x)->pd->dev)
+#define SPPP_reopen(x)	sppp_reopen((x)->pd->dev)
+#define SPPP_close(x)	sppp_close((x)->pd->dev)
+#define SPPP_do_ioctl(x, y, z)	sppp_do_ioctl((x)->pd->dev, (y), (z))
+#endif
+#endif
+
+static int lmc_first_ppp_load = 0;
+
+// init
+void lmc_proto_init(lmc_softc_t *sc) /*FOLD00*/
+{
+    lmc_trace(sc->lmc_device, "lmc_proto_init in");
+    switch(sc->if_type){
+    case LMC_PPP:
+        if(lmc_first_ppp_load == 0) {
+            lmc_first_ppp_load = 1;
+#ifndef MODULE
+            SYNC_PPP_init();
+#endif
+        }
+        
+#if LINUX_VERSION_CODE >= 0x20210
+        sc->pd = kmalloc(sizeof(struct ppp_device), GFP_KERNEL);
+        sc->pd->dev = sc->lmc_device;
+#endif
+        sc->if_ptr = sc->pd;
+        break;
+    case LMC_RAW:
+        break;
+    default:
+        break;
+    }
+    lmc_trace(sc->lmc_device, "lmc_proto_init out");
+}
+
+// attach
+void lmc_proto_attach(lmc_softc_t *sc) /*FOLD00*/
+{
+    lmc_trace(sc->lmc_device, "lmc_proto_attach in");
+    switch(sc->if_type){
+    case LMC_PPP:
+        {
+            struct net_device *dev = sc->lmc_device;
+            SPPP_attach(sc);
+            dev->do_ioctl = lmc_ioctl;
+        }
+        break;
+    case LMC_NET:
+        {
+            struct net_device *dev = sc->lmc_device;
+            /*
+             * They set a few basics because they don't use sync_ppp
+             */
+            dev->flags |= IFF_POINTOPOINT;
+            dev->hard_header = 0;
+            dev->hard_header_len = 0;
+            dev->addr_len = 0;
+        }
+    case LMC_RAW: /* Setup the task queue, maybe we should notify someone? */
+        {
+        }
+    default:
+        break;
+    }
+    lmc_trace(sc->lmc_device, "lmc_proto_attach out");
+}
+
+// detach
+void lmc_proto_detach(lmc_softc_t *sc) /*FOLD00*/
+{
+    switch(sc->if_type){
+    case LMC_PPP:
+        SPPP_detach(sc);
+        break;
+    case LMC_RAW: /* Tell someone we're detaching? */
+        break;
+    default:
+        break;
+    }
+
+}
+
+// reopen
+void lmc_proto_reopen(lmc_softc_t *sc) /*FOLD00*/
+{
+    lmc_trace(sc->lmc_device, "lmc_proto_reopen in");
+    switch(sc->if_type){
+    case LMC_PPP:
+        SPPP_reopen(sc);
+        break;
+    case LMC_RAW: /* Reset the interface after being down, prerape to receive packets again */
+        break;
+    default:
+        break;
+    }
+    lmc_trace(sc->lmc_device, "lmc_proto_reopen out");
+}
+
+
+// ioctl
+int lmc_proto_ioctl(lmc_softc_t *sc, struct ifreq *ifr, int cmd) /*FOLD00*/
+{
+    lmc_trace(sc->lmc_device, "lmc_proto_ioctl out");
+    switch(sc->if_type){
+    case LMC_PPP:
+        return SPPP_do_ioctl (sc, ifr, cmd);
+        break;
+    default:
+        return -EOPNOTSUPP;
+        break;
+    }
+    lmc_trace(sc->lmc_device, "lmc_proto_ioctl out");
+}
+
+// open
+void lmc_proto_open(lmc_softc_t *sc) /*FOLD00*/
+{
+    int ret;
+
+    lmc_trace(sc->lmc_device, "lmc_proto_open in");
+    switch(sc->if_type){
+    case LMC_PPP:
+        ret = SPPP_open(sc);
+        if(ret < 0)
+            printk("%s: syncPPP open failed: %d\n", sc->name, ret);
+        break;
+    case LMC_RAW: /* We're about to start getting packets! */
+        break;
+    default:
+        break;
+    }
+    lmc_trace(sc->lmc_device, "lmc_proto_open out");
+}
+
+// close
+
+void lmc_proto_close(lmc_softc_t *sc) /*FOLD00*/
+{
+    lmc_trace(sc->lmc_device, "lmc_proto_close in");
+    switch(sc->if_type){
+    case LMC_PPP:
+        SPPP_close(sc);
+        break;
+    case LMC_RAW: /* Interface going down */
+        break;
+    default:
+        break;
+    }
+    lmc_trace(sc->lmc_device, "lmc_proto_close out");
+}
+
+unsigned short lmc_proto_type(lmc_softc_t *sc, struct sk_buff *skb) /*FOLD00*/
+{
+    lmc_trace(sc->lmc_device, "lmc_proto_type in");
+    switch(sc->if_type){
+    case LMC_PPP:
+        return htons(ETH_P_WAN_PPP);
+        break;
+    case LMC_NET:
+        return htons(ETH_P_802_2);
+        break;
+    case LMC_RAW: /* Packet type for skbuff kind of useless */
+        return htons(ETH_P_802_2);
+        break;
+    default:
+        printk(KERN_WARNING "%s: No protocol set for this interface, assuming 802.2 (which is wrong!!)\n", sc->name);
+        return htons(ETH_P_802_2);
+        break;
+    }
+    lmc_trace(sc->lmc_device, "lmc_proto_tye out");
+
+}
+
+void lmc_proto_netif(lmc_softc_t *sc, struct sk_buff *skb) /*FOLD00*/
+{
+    lmc_trace(sc->lmc_device, "lmc_proto_netif in");
+    switch(sc->if_type){
+    case LMC_PPP:
+    case LMC_NET:
+    default:
+        netif_rx(skb);
+        break;
+    case LMC_RAW:
+        break;
+    }
+    lmc_trace(sc->lmc_device, "lmc_proto_netif out");
+}
+
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/drivers/net/lmc/lmc_proto.h linux.17p9/drivers/net/lmc/lmc_proto.h
--- linux.vanilla/drivers/net/lmc/lmc_proto.h	Thu Jan  1 01:00:00 1970
+++ linux.17p9/drivers/net/lmc/lmc_proto.h	Tue Jun 20 23:08:03 2000
@@ -0,0 +1,15 @@
+#ifndef _LMC_PROTO_H_
+#define _LMC_PROTO_H_
+
+void lmc_proto_init(lmc_softc_t *sc);
+void lmc_proto_attach(lmc_softc_t *sc);
+void lmc_proto_detach(lmc_softc_t *sc);
+void lmc_proto_reopen(lmc_softc_t *sc);
+int lmc_proto_ioctl(lmc_softc_t *sc, struct ifreq *ifr, int cmd);
+void lmc_proto_open(lmc_softc_t *sc);
+void lmc_proto_close(lmc_softc_t *sc);
+unsigned short lmc_proto_type(lmc_softc_t *sc, struct sk_buff *skb);
+void lmc_proto_netif(lmc_softc_t *sc, struct sk_buff *skb);
+int lmc_skb_rawpackets(char *buf, char **start, off_t offset, int len, int unused);
+
+#endif
\ No newline at end of file
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/drivers/net/lmc/lmc_var.h linux.17p9/drivers/net/lmc/lmc_var.h
--- linux.vanilla/drivers/net/lmc/lmc_var.h	Fri Apr 21 23:18:39 2000
+++ linux.17p9/drivers/net/lmc/lmc_var.h	Tue Jun 27 13:08:32 2000
@@ -1,7 +1,7 @@
 #ifndef _LMC_VAR_H_
 #define _LMC_VAR_H_
 
-/* $Id: lmc_var.h,v 1.14 2000/01/21 13:29:50 asj Exp $ */
+/* $Id: lmc_var.h,v 1.24 2000/06/16 23:37:16 asj Exp $ */
 
  /*
   * Copyright (c) 1997-2000 LAN Media Corporation (LMC)
@@ -18,6 +18,7 @@
   */
 
 #include <linux/timer.h>
+#include <linux/version.h>
 
 #ifndef __KERNEL__
 typedef signed char s8;
@@ -32,6 +33,14 @@
 typedef signed long long s64;
 typedef unsigned long long u64;
 
+#if LINUX_VERSION_CODE >= 0x20363
+struct timer_list {
+};
+#endif
+
+typedef u32 spinlock_t;
+typedef u32 dma_addr_t;
+
 #define BITS_PER_LONG 32 
 
 #endif
@@ -44,7 +53,7 @@
 typedef struct lmc___media lmc_media_t;
 typedef struct lmc___ctl lmc_ctl_t;
 
-#define lmc_csrptr_t	u32
+#define lmc_csrptr_t    unsigned long
 #define u_int16_t	u16
 #define u_int8_t	u8
 #define tulip_uint32_t	u32
@@ -69,13 +78,13 @@
 #define LMC_CSR_READ(sc, csr) \
 	inl((sc)->lmc_csrs.csr)
 #define LMC_CSR_WRITE(sc, reg, val) \
-	outl(val, (sc)->lmc_csrs.reg)
+	outl((val), (sc)->lmc_csrs.reg)
 
-#ifdef _LINUX_DELAY_H
-	#define SLOW_DOWN_IO udelay(2);
-	#undef __SLOW_DOWN_IO
-	#define __SLOW_DOWN_IO udelay(2);
-#endif
+//#ifdef _LINUX_DELAY_H
+//	#define SLOW_DOWN_IO udelay(2);
+//	#undef __SLOW_DOWN_IO
+//	#define __SLOW_DOWN_IO udelay(2);
+//#endif
 
 #define DELAY(n) SLOW_DOWN_IO
 
@@ -83,10 +92,10 @@
 
 /* This macro sync's up with the mii so that reads and writes can take place */
 #define LMC_MII_SYNC(sc) do {int n=32; while( n >= 0 ) { \
-		LMC_CSR_WRITE((sc), csr_9, 0x20000); \
+                LMC_CSR_WRITE((sc), csr_9, 0x20000); \
 		lmc_delay(); \
 		LMC_CSR_WRITE((sc), csr_9, 0x30000); \
-		lmc_delay(); \
+                lmc_delay(); \
 		n--; }} while(0);
 
 struct lmc_regfile_t {
@@ -242,6 +251,8 @@
 	void	(* set_crc_length)(lmc_softc_t * const, int);
         void    (* set_circuit_type)(lmc_softc_t * const, int);
         void	(* watchdog)(lmc_softc_t * const);
+        int     (* ioctl)(lmc_softc_t * const, void *);
+        int     (* got_interupt)(lmc_softc_t * const);
 };
 
 
@@ -254,32 +265,32 @@
  */
 struct lmc_statistics
 {
-        int     rx_packets;             /* total packets received       */
-        int     tx_packets;             /* total packets transmitted    */
-	int     rx_bytes;
-        int     tx_bytes;
+        unsigned long     rx_packets;             /* total packets received       */
+        unsigned long     tx_packets;             /* total packets transmitted    */
+	unsigned long     rx_bytes;
+        unsigned long     tx_bytes;
         
-        int     rx_errors;              /* bad packets received         */
-        int     tx_errors;              /* packet transmit problems     */
-        int     rx_dropped;             /* no space in linux buffers    */
-        int     tx_dropped;             /* no space available in linux  */
-        int     multicast;              /* multicast packets received   */
-        int     collisions;
+        unsigned long     rx_errors;              /* bad packets received         */
+        unsigned long     tx_errors;              /* packet transmit problems     */
+        unsigned long     rx_dropped;             /* no space in linux buffers    */
+        unsigned long     tx_dropped;             /* no space available in linux  */
+        unsigned long     multicast;              /* multicast packets received   */
+        unsigned long     collisions;
 
         /* detailed rx_errors: */
-        int     rx_length_errors;
-        int     rx_over_errors;         /* receiver ring buff overflow  */
-        int     rx_crc_errors;          /* recved pkt with crc error    */
-        int     rx_frame_errors;        /* recv'd frame alignment error */
-        int     rx_fifo_errors;         /* recv'r fifo overrun          */
-        int     rx_missed_errors;       /* receiver missed packet       */
+        unsigned long     rx_length_errors;
+        unsigned long     rx_over_errors;         /* receiver ring buff overflow  */
+        unsigned long     rx_crc_errors;          /* recved pkt with crc error    */
+        unsigned long     rx_frame_errors;        /* recv'd frame alignment error */
+        unsigned long     rx_fifo_errors;         /* recv'r fifo overrun          */
+        unsigned long     rx_missed_errors;       /* receiver missed packet       */
 
         /* detailed tx_errors */
-        int     tx_aborted_errors;
-        int     tx_carrier_errors;
-        int     tx_fifo_errors;
-        int     tx_heartbeat_errors;
-        int     tx_window_errors;
+        unsigned long     tx_aborted_errors;
+        unsigned long     tx_carrier_errors;
+        unsigned long     tx_fifo_errors;
+        unsigned long     tx_heartbeat_errors;
+        unsigned long     tx_window_errors;
 
         /* for cslip etc */
         unsigned long rx_compressed;
@@ -296,6 +307,9 @@
         u_int32_t       tx_MaxXmtsB4Int;
         u_int32_t       tx_TimeoutCnt;
         u_int32_t       tx_OutOfSyncPtr;
+        u_int32_t       tx_tbusy0;
+        u_int32_t       tx_tbusy1;
+        u_int32_t       tx_tbusy_calls;
         u_int32_t       resetCount;
         u_int32_t       lmc_txfull;
         u_int32_t       tbusy;
@@ -353,10 +367,11 @@
  * forward decl
  */
 struct lmc___softc {
+        void                   *if_ptr;   /* General purpose pointer (used by SPPP >= 2.4) */
 	char                   *name;
 	u8			board_idx;
 	struct lmc_statistics   stats;
-	struct device          *lmc_device;
+	struct net_device          *lmc_device;
 
 	int                     hang, rxdesc, bad_packet, some_counter;
 	u_int32_t               txgo;
@@ -371,9 +386,12 @@
 	u_int32_t		lmc_gpio;	/* state of outputs */
 	struct sk_buff*		lmc_txq[LMC_TXDESCS];
 	struct sk_buff*		lmc_rxq[LMC_RXDESCS];
+	volatile
 	struct tulip_desc_t	lmc_rxring[LMC_RXDESCS];
+	volatile
 	struct tulip_desc_t	lmc_txring[LMC_TXDESCS];
 	unsigned int		lmc_next_rx, lmc_next_tx;
+	volatile
 	unsigned int		lmc_taint_tx, lmc_taint_rx;
 	int			lmc_tx_start, lmc_txfull;
 	int			lmc_txbusy;
@@ -382,27 +400,49 @@
 	int			last_link_status;
 	int			lmc_cardtype;
 	u_int32_t               last_frameerr;
-	lmc_media_t	       *lmc_media;
+        lmc_media_t	       *lmc_media;
 	struct timer_list	timer;
 	lmc_ctl_t		ictl;
 	u_int32_t		TxDescriptControlInit;  
-	struct device		*next_module;   /* Link to the next module  */
+	struct net_device      *next_module;   /* Link to the next module  */
 	int                     tx_TimeoutInd; /* additional driver state */
 	int                     tx_TimeoutDisplay;
 	unsigned int		lastlmc_taint_tx;
 	int                     lasttx_packets;
 	u_int32_t		tx_clockState;
 	u_int32_t		lmc_crcSize;
-	LMC_XINFO		lmc_xinfo; 
-	char                    lmc_yel, lmc_blue, lmc_red; /* for T1 and DS3 */
+	LMC_XINFO		lmc_xinfo;
         char                    lmc_timing; /* for HSSI and SSI */
         int                     got_irq;
 
         char                    last_led_err[4];
+        char                    yellow_alarm; /* Time in seconds to run yellow alarm for */
+        char                    red_alarm;    /* Time in seconds to run red alarm for */
+        char                    blue_alarm;   /* Time in seconds to run blue alarm for */
 
 #if LINUX_VERSION_CODE >= 0x20200
 	spinlock_t              lmc_lock;
 #endif
+#if LINUX_VERSION_CODE >= 0x20363
+        struct pci_dev          *pdev;
+        dma_addr_t              sc_dma_handle;
+        struct lmc___softc      *sc_dma;
+#endif
+        u_int16_t               if_type;       /* PPP or NET */
+        struct ppp_device       *pd;
+
+        /* Failure cases */
+        u8                       failed_ring;
+        u8                       failed_recv_alloc;
+
+        /* T1 Specicfic Variable */
+        u16                      loop_timer; /* Time out loop up requests */
+        u8                       t1_amisf;
+        u32                      t1_frac_mask;
+        u8                       t1_loop_time;
+
+        /* Structure check */
+        u32                     check;
 };
 
 #define LMC_PCI_TIME 1
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/drivers/net/lmc/lmc_ver.h linux.17p9/drivers/net/lmc/lmc_ver.h
--- linux.vanilla/drivers/net/lmc/lmc_ver.h	Fri Apr 21 12:46:18 2000
+++ linux.17p9/drivers/net/lmc/lmc_ver.h	Tue Jun 20 23:08:03 2000
@@ -29,8 +29,25 @@
   *
   */
 
+#if LINUX_VERSION_CODE < 0x20363
+#define net_device device
+#define dev_kfree_skb_irq LMC_DEV_KFREE_SKB
+#endif
+
+#if LINUX_VERSION_CODE < 0x20363
+#define LMC_XMITTER_BUSY(x) (x)->tbusy = 1
+#define LMC_XMITTER_FREE(x) (x)->tbusy = 0
+#define LMC_XMITTER_INIT(x) (x)->tbusy = 0
+#else
+#define LMC_XMITTER_BUSY(x) netif_stop_queue(x)
+#define LMC_XMITTER_FREE(x) netif_wake_queue(x)
+#define LMC_XMITTER_INIT(x) netif_start_queue(x)
+
+#endif
+
+
 #if LINUX_VERSION_CODE < 0x20100
-typedef unsigned int u_int32_t;
+//typedef unsigned int u_int32_t;
 
 #define  LMC_SETUP_20_DEV {\
                              int indx; \
@@ -41,7 +58,11 @@
                           dev->pa_addr = 0; \
                           dev->pa_brdaddr = 0; \
                           dev->pa_mask = 0xFCFFFFFF; \
-                          dev->pa_alen = 4;		/* IP addr.  sizeof(u32) */
+    dev->pa_alen = 4;		/* IP addr.  sizeof(u32) */
+
+#define cpu_to_le32(x) (x)
+#define le32_to_cpu(x) (x)
+#define le16_to_cpu(x) (x)
 
 #else
 
@@ -73,20 +94,20 @@
 #define LMC_SKB_FREE(skb, val)
 #endif
 
-#define LMC_SPIN_FLAGS                unsigned long flags;
 
-#if (LINUX_VERSION_CODE >= 0x20200)
+#if LINUX_VERSION_CODE >= 0x20200
 
+#define LMC_SPIN_FLAGS                unsigned long flags;
 #define LMC_SPIN_LOCK_INIT(x)         spin_lock_init(&(x)->lmc_lock);
 #define LMC_SPIN_UNLOCK(x)            ((x)->lmc_lock = SPIN_LOCK_UNLOCKED)
 #define LMC_SPIN_LOCK_IRQSAVE(x)      spin_lock_irqsave (&(x)->lmc_lock, flags);
 #define LMC_SPIN_UNLOCK_IRQRESTORE(x) spin_unlock_irqrestore (&(x)->lmc_lock, flags);
 #else
-#define LMC_SPIN_FLAGS
-#define LMC_SPIN_LOCK_INIT(x)
-#define LMC_SPIN_UNLOCK(x)
-#define LMC_SPIN_LOCK_IRQSAVE(x)
-#define LMC_SPIN_UNLOCK_IRQRESTORE(x)
+#define LMC_SPIN_FLAGS                unsigned long flags;
+#define LMC_SPIN_LOCK_INIT(x)         
+#define LMC_SPIN_UNLOCK(x)            
+#define LMC_SPIN_LOCK_IRQSAVE(x)      save_flags(flags); cli();
+#define LMC_SPIN_UNLOCK_IRQRESTORE(x) restore_flags(flags); 
 #endif
 
 
@@ -105,3 +126,19 @@
 
 
 #endif
+
+#if LINUX_VERSION_CODE >= 0x20200
+#else
+#define mdelay(x) { int j; for(j = 0; j < x; j++){ udelay(1000); } }
+
+#endif
+
+/*
+ * See DMA-mapping.txt for info
+ */
+
+#if LINUX_VERSION_CODE < 0x20363
+#else
+#define LMC_PCI_ALLOC_CONSISTENT(x, y, z) pci_alloc_consistent(x, y, z)
+#endif
+
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/drivers/net/mace.c linux.17p9/drivers/net/mace.c
--- linux.vanilla/drivers/net/mace.c	Fri Apr 21 12:46:18 2000
+++ linux.17p9/drivers/net/mace.c	Mon Jun 26 15:46:11 2000
@@ -266,7 +266,11 @@
     /* done changing address */
     out_8(&mb->iac, 0);
 
+#ifndef CONFIG_MACE_AAUI_PORT
     out_8(&mb->plscc, PORTSEL_GPSI + ENPLSIO);
+#else
+    out_8(&mb->plscc, PORTSEL_AUI + ENPLSIO);
+#endif /* CONFIG_MACE_AAUI_PORT */
 }
 
 static void __mace_set_address(struct device *dev, void *addr)
@@ -922,9 +926,9 @@
     struct mace_data *mp = (struct mace_data *) mace_devs->priv;
     unregister_netdev(mace_devs);
 
-    free_irq(mace_devs->irq, mace_interrupt);
-    free_irq(mp->tx_dma_intr, mace_txdma_intr);
-    free_irq(mp->rx_dma_intr, mace_rxdma_intr);
+    free_irq(mace_devs->irq, dev);
+    free_irq(mp->tx_dma_intr, dev);
+    free_irq(mp->rx_dma_intr, dev);
 
     kfree(mace_devs);
     mace_devs = NULL;
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/drivers/net/pc300.c linux.17p9/drivers/net/pc300.c
--- linux.vanilla/drivers/net/pc300.c	Thu Jan  1 01:00:00 1970
+++ linux.17p9/drivers/net/pc300.c	Sun Jun 25 17:14:22 2000
@@ -0,0 +1,2846 @@
+#define	USE_PCI_CLOCK
+static char rcsid[] =
+"$Revision: 3.1.0.1 $$Date: 2000/06/23 $";
+
+/*
+ * pc300.c	Cyclades-PC300(tm) Driver.
+ *
+ * Author:	Ivan Passos <ivan@cyclades.com>
+ *
+ * Copyright:	(c) 1999-2000 Cyclades Corp.
+ *
+ *	This program is free software; you can redistribute it and/or
+ *	modify it under the terms of the GNU General Public License
+ *	as published by the Free Software Foundation; either version
+ *	2 of the License, or (at your option) any later version.
+ * 
+ * $Log: pc300.c,v $
+ * Revision 3.1.0.1 2000/06/23 ivan
+ * Revisited cpc_queue_xmit to prevent race conditions on Tx DMA buffer 
+ * handling when Tx timeouts occur.
+ * Revisited Rx statistics.
+ * Added support for loopback mode in the SCA-II.
+ * Fixed a bug in the SCA-II programming that would cause framing errors 
+ * when external clock was configured.
+ *
+ * Revision 3.1.0.0 2000/05/26 ivan
+ * Added Frame-Relay support.
+ * Driver now uses HDLC generic driver to provide protocol support.
+ * Added logic in the SCA interrupt handler so that no board can monopolize 
+ * the driver.
+ * Request PLX I/O region, although driver doesn't use it, to avoid
+ * problems with other drivers accessing it.
+ *
+ * Revision 3.0.0.0 2000/05/15 ivan
+ * Did some changes in the DMA programming implementation to avoid the 
+ * occurrence of a SCA-II bug in the second channel.
+ * Implemented workaround for PLX9050 bug that would cause a system lockup
+ * in certain systems, depending on the MMIO addresses allocated to the
+ * board.
+ * Fixed the FALC chip programming to avoid synchronization problems in the 
+ * second channel (TE only).
+ * Implemented a cleaner and faster Tx DMA descriptor cleanup procedure in 
+ * cpc_queue_xmit().
+ * Changed the built-in driver implementation so that the driver can use the 
+ * general 'hdlcN' naming convention instead of proprietary device names.
+ * Driver load messages are now device-centric, instead of board-centric.
+ * Dynamic allocation of device structures.
+ *
+ * Revision 2.0.0.0 2000/04/15 ivan
+ * Added support for the PC300/TE boards (T1/FT1/E1/FE1).
+ *
+ * Revision 1.1.0.0 2000/02/28 ivan
+ * Major changes in the driver architecture.
+ * Driver now reports physical instead of virtual memory addresses.
+ * Added cpc_change_mtu function.
+ *
+ * Revision 1.0.0.0 1999/12/16 ivan
+ * First official release.
+ * Support for 1- and 2-channel boards (which use distinct PCI Device ID's).
+ * Support for monolythic installation (i.e., drv built into the kernel).
+ * X.25 additional checking when lapb_[dis]connect_request returns an error.
+ * SCA programming now covers X.21 as well.
+ *
+ * Revision 0.3.1.0 1999/11/18 ivan
+ * Made X.25 support configuration-dependent (as it depends on external 
+ * modules to work).
+ * Changed X.25-specific function names to comply with adopted convention.
+ * Fixed typos in X.25 functions that would cause compile errors (Daniela).
+ * Fixed bug in ch_config that would disable interrupts on a previously 
+ * enabled channel if the other channel on the same board was enabled later.
+ *
+ * Revision 0.3.0.0 1999/11/16 Daniela Squassoni
+ * X.25 support.
+ *
+ * Revision 0.2.3.0 1999/11/15 ivan
+ * Function cpc_ch_status now provides more detailed information.
+ * Added support for X.21 clock configuration.
+ * Changed TNR1 setting in order to prevent Tx FIFO overaccesses by the SCA.
+ * Now using PCI clock instead of internal oscillator clock for the SCA.
+ *
+ * Revision 0.2.2.0 1999/11/10 ivan
+ * Changed the *_dma_buf_check functions so that they would print only 
+ * the useful info instead of the whole buffer descriptor bank.
+ * Fixed bug in cpc_queue_xmit that would eventually crash the system 
+ * in case of a packet drop.
+ * Implemented TX underrun handling.
+ * Improved SCA fine tuning to boost up its performance.
+ *
+ * Revision 0.2.1.0 1999/11/03 ivan
+ * Added functions *dma_buf_pt_init to allow independent initialization 
+ * of the next-descr. and DMA buffer pointers on the DMA descriptors.
+ * Kernel buffer release and tbusy clearing is now done in the interrupt 
+ * handler.
+ * Fixed bug in cpc_open that would cause an interface reopen to fail.
+ * Added a protocol-specific code section in cpc_net_rx.
+ * Removed printk level defs (they might be added back after the beta phase).
+ *
+ * Revision 0.2.0.0 1999/10/28 ivan
+ * Revisited the code so that new protocols can be easily added / supported. 
+ *
+ * Revision 0.1.0.1 1999/10/20 ivan
+ * Mostly "esthetic" changes.
+ *
+ * Revision 0.1.0.0 1999/10/11 ivan
+ * Initial version.
+ *
+ */
+
+#include <linux/module.h>
+#include <linux/kernel.h>
+#include <linux/mm.h>
+#include <linux/ioport.h>
+#include <linux/pci.h>
+#include <linux/errno.h>
+#include <linux/string.h>
+#include <linux/sched.h>
+#include <linux/init.h>
+#include <linux/delay.h>
+#include <linux/net.h>
+#include <linux/skbuff.h>
+#include <linux/if_arp.h>
+#include <linux/netdevice.h>
+#include <net/arp.h>
+#include <asm/io.h>
+#include <asm/uaccess.h>
+
+#ifdef CONFIG_PC300_X25
+#include <linux/lapb.h>
+#endif /* CONFIG_PC300_X25 */
+
+#include "syncppp.h"
+
+#include <linux/pc300.h>
+
+#include <asm/spinlock.h>
+
+#define	CPC_LOCK(card,flags)					\
+		do {						\
+		spin_lock_irqsave(&card->card_lock, flags);	\
+		} while (0)
+
+#define CPC_UNLOCK(card,flags)						\
+		do {							\
+		spin_unlock_irqrestore(&card->card_lock, flags);	\
+		} while (0)
+
+#undef	PC300_DEBUG_PCI
+#undef	PC300_DEBUG_INTR
+#undef	PC300_DEBUG_TX
+#undef	PC300_DEBUG_RX
+
+/* Hardware configuration options.
+ * These are arrays of configuration options used by verification routines.
+ * The first element of each array is its size (i.e. number of options).
+ */
+static unsigned short	cpc_pci_dev_id[] = {
+	PCI_DEVICE_ID_PC300_RX_1,	/* PC300/RSV or PC300/X21, 1 chan */
+	PCI_DEVICE_ID_PC300_RX_2,	/* PC300/RSV or PC300/X21, 2 chan */
+	PCI_DEVICE_ID_PC300_TE_1,	/* PC300/TE, 1 chan */
+	PCI_DEVICE_ID_PC300_TE_2,	/* PC300/TE, 2 chan */
+	0				/* end of table */
+};
+
+/* This is the per-card data structure containing mem. addresses, irq, etc.
+ * This driver supports a maximum of PC300_MAXCARDS cards.
+ */
+static pc300_t	cpc_card[PC300_MAXCARDS];
+
+static ucshort	cpc_nboards = 0;
+
+#ifndef min
+#define	min(a,b)	(((a)<(b))?(a):(b))
+#endif
+#ifndef max
+#define	max(a,b)	(((a)>(b))?(a):(b))
+#endif
+
+/************************/
+/***   DMA Routines   ***/
+/************************/
+static void 
+tx_dma_buf_pt_init(pc300_t *card, int ch)
+{
+    int i;
+    int ch_factor = ch * N_DMA_TX_BUF;
+    volatile pcsca_bd_t *ptdescr = (pcsca_bd_t *)(card->hw.rambase 
+		+ DMA_TX_BD_BASE + ch_factor * sizeof(pcsca_bd_t));
+
+    for (i = 0 ; i < N_DMA_TX_BUF ; i++, ptdescr++) {
+	cpc_writel(&ptdescr->next, (uclong) (DMA_TX_BD_BASE + 
+		   (ch_factor + ((i + 1) & (N_DMA_TX_BUF - 1))) * 
+		   sizeof(pcsca_bd_t)));
+	cpc_writel(&ptdescr->ptbuf, 
+		   (uclong)(DMA_TX_BASE + (ch_factor + i)*BD_DEF_LEN));
+    }
+}
+
+static void 
+tx_dma_buf_init(pc300_t *card, int ch)
+{
+    int i;
+    int ch_factor = ch * N_DMA_TX_BUF;
+    volatile pcsca_bd_t *ptdescr = (pcsca_bd_t *)(card->hw.rambase 
+		+ DMA_TX_BD_BASE + ch_factor * sizeof(pcsca_bd_t));
+
+    for (i = 0 ; i < N_DMA_TX_BUF ; i++, ptdescr++) {
+	memset_io(ptdescr, 0, sizeof (pcsca_bd_t));
+	cpc_writew(&ptdescr->len, 0);
+	cpc_writeb(&ptdescr->status, 0);
+    }
+    tx_dma_buf_pt_init(card, ch);
+}
+
+static void 
+rx_dma_buf_pt_init(pc300_t *card, int ch)
+{
+    int i;
+    int ch_factor = ch * N_DMA_RX_BUF;
+    volatile pcsca_bd_t *ptdescr = (pcsca_bd_t *)(card->hw.rambase 
+		+ DMA_RX_BD_BASE + ch_factor * sizeof(pcsca_bd_t));
+
+    for (i = 0 ; i < N_DMA_RX_BUF ; i++, ptdescr++) {
+	cpc_writel(&ptdescr->next, (uclong) (DMA_RX_BD_BASE + 
+		   (ch_factor + ((i + 1) & (N_DMA_RX_BUF - 1))) * 
+		   sizeof(pcsca_bd_t)));
+	cpc_writel(&ptdescr->ptbuf, 
+		   (uclong)(DMA_RX_BASE + (ch_factor + i)*BD_DEF_LEN));
+    }
+}
+
+static void 
+rx_dma_buf_init(pc300_t *card, int ch)
+{
+    int i;
+    int ch_factor = ch * N_DMA_RX_BUF;
+    volatile pcsca_bd_t *ptdescr = (pcsca_bd_t *)(card->hw.rambase 
+		+ DMA_RX_BD_BASE + ch_factor * sizeof(pcsca_bd_t));
+
+    for (i = 0 ; i < N_DMA_RX_BUF ; i++, ptdescr++) {
+	memset_io(ptdescr, 0, sizeof (pcsca_bd_t));
+	cpc_writew(&ptdescr->len, 0);
+	cpc_writeb(&ptdescr->status, 0);
+    }
+    rx_dma_buf_pt_init(card, ch);
+}
+
+static void
+tx_dma_buf_check(pc300_t *card, int ch)
+{
+    volatile pcsca_bd_t *ptdescr;
+    int i;
+    ucshort first_bd = card->chan[ch].tx_first_bd;
+    ucshort next_bd = card->chan[ch].tx_next_bd;
+
+    printk("#CH%d: f_bd = %d(0x%08x), n_bd = %d(0x%08x)\n", ch, 
+	   first_bd, TX_BD_ADDR(ch, first_bd), 
+	   next_bd, TX_BD_ADDR(ch, next_bd));
+    for (i = first_bd, 
+	  ptdescr = (pcsca_bd_t *)(card->hw.rambase + TX_BD_ADDR(ch, first_bd));
+	 i != ((next_bd + 1) & (N_DMA_TX_BUF - 1)) ;
+	 i = (i + 1) & (N_DMA_TX_BUF - 1), 
+	  ptdescr = (pcsca_bd_t *)(card->hw.rambase + TX_BD_ADDR(ch, i))) {
+	printk("\n CH%d TX%d: next=0x%lx, ptbuf=0x%lx, ST=0x%x, len=%d", 
+	       ch, i,
+	       (uclong)cpc_readl(&ptdescr->next), 
+	       (uclong)cpc_readl(&ptdescr->ptbuf),
+	       cpc_readb(&ptdescr->status), 
+	       cpc_readw(&ptdescr->len));
+    }
+    printk("\n");
+}
+
+static void
+rx_dma_buf_check(pc300_t *card, int ch)
+{
+    volatile pcsca_bd_t *ptdescr;
+    int i;
+    ucshort first_bd = card->chan[ch].rx_first_bd;
+    ucshort last_bd = card->chan[ch].rx_last_bd;
+    int ch_factor;
+
+    ch_factor = ch * N_DMA_RX_BUF;
+    printk("#CH%d: f_bd = %d, l_bd = %d\n", ch, first_bd, last_bd);
+    for (i = 0, ptdescr = (pcsca_bd_t *)(card->hw.rambase +
+                        DMA_RX_BD_BASE + ch_factor*sizeof(pcsca_bd_t));
+	 i < N_DMA_RX_BUF ;
+	 i++, ptdescr++) {
+	if (cpc_readb(&ptdescr->status) & DST_OSB)
+	    printk("\n CH%d RX%d: next=0x%lx, ptbuf=0x%lx, ST=0x%x, len=%d", 
+		   ch, i,
+		   (uclong)cpc_readl(&ptdescr->next), 
+		   (uclong)cpc_readl(&ptdescr->ptbuf),
+		   cpc_readb(&ptdescr->status), 
+		   cpc_readw(&ptdescr->len));
+    }
+    printk("\n");
+}
+
+int 
+dma_get_rx_frame_size(pc300_t *card, int ch)
+{
+    volatile pcsca_bd_t *ptdescr;
+    ucshort first_bd = card->chan[ch].rx_first_bd;
+    int rcvd = 0;
+    volatile ucchar status;
+
+    ptdescr = (pcsca_bd_t *)(card->hw.rambase + RX_BD_ADDR(ch, first_bd));
+    while ((status = cpc_readb(&ptdescr->status)) & DST_OSB) {
+	rcvd += cpc_readw(&ptdescr->len);
+	first_bd = (first_bd + 1) & (N_DMA_RX_BUF - 1);
+	if (status & DST_EOM)
+	    return (rcvd);
+	ptdescr = (pcsca_bd_t *)(card->hw.rambase + cpc_readl(&ptdescr->next));
+    }
+    return (-1);
+}
+
+/*
+ * dma_buf_write: writes a frame to the Tx DMA buffers
+ * NOTE: this function writes one frame at a time.
+ */ 
+int 
+dma_buf_write(pc300_t *card, int ch, ucchar *ptdata, int len)
+{
+    int i, nchar;
+    volatile pcsca_bd_t *ptdescr;
+    int tosend = len;
+    ucchar nbuf = ((len - 1)/BD_DEF_LEN) + 1;
+
+    for (i = 0 ; i < nbuf ; i++) {
+	ptdescr = (pcsca_bd_t *)(card->hw.rambase + 
+		TX_BD_ADDR(ch, card->chan[ch].tx_next_bd));
+	nchar = min(BD_DEF_LEN,tosend);
+	if (!(cpc_readb(&ptdescr->status) & DST_OSB)) {
+	    memcpy_toio((void *)(card->hw.rambase + 
+				 cpc_readl(&ptdescr->ptbuf)), 
+			&ptdata[len - tosend], 
+			nchar);
+	    if ((i + 1) == nbuf) {
+		/* This must be the last BD to be used */
+		cpc_writeb(&ptdescr->status, (DST_EOM | DST_EOT));
+	    } else {
+		cpc_writeb(&ptdescr->status, 0);
+	    }
+	    cpc_writew(&ptdescr->len, nchar);
+	} else {
+	    return -ENOMEM;
+	}
+	tosend -= nchar;
+	card->chan[ch].tx_next_bd = 
+		(card->chan[ch].tx_next_bd + 1) & (N_DMA_TX_BUF - 1);
+    }
+    /* If it gets to here, it means we have sent the whole frame */
+    return 0;
+}
+
+/*
+ * dma_buf_read: reads a frame from the Rx DMA buffers
+ * NOTE: this function reads one frame at a time.
+ */ 
+int 
+dma_buf_read(pc300_t *card, int ch, struct sk_buff *skb)
+{
+    int nchar;
+    pc300ch_t *chan = (pc300ch_t *)&card->chan[ch];
+    volatile pcsca_bd_t *ptdescr;
+    int rcvd = 0;
+    volatile ucchar status;
+
+    ptdescr = (pcsca_bd_t *)(card->hw.rambase + 
+			     RX_BD_ADDR(ch, chan->rx_first_bd));
+    while ((status = cpc_readb(&ptdescr->status)) & DST_OSB) {
+	if (status & (DST_OVR | DST_CRC | DST_RBIT | DST_SHRT | DST_ABT)) {
+	    rcvd = -status;
+	    /* Discard remaining descriptors used by the bad frame */
+	    while(chan->rx_first_bd != chan->rx_last_bd) {
+		cpc_writeb(&ptdescr->status, 0);
+		chan->rx_first_bd = 
+			(chan->rx_first_bd + 1) & (N_DMA_RX_BUF - 1);
+		if(status & DST_EOM)
+		    break;
+		ptdescr = (pcsca_bd_t *)(card->hw.rambase + 
+					 cpc_readl(&ptdescr->next));
+		status = cpc_readb(&ptdescr->status);
+	    }
+	    break;
+	}
+	if ((nchar = cpc_readw(&ptdescr->len)) != 0) {
+	    memcpy_fromio(skb_put(skb, nchar), 
+			  (void *)(card->hw.rambase + 
+				   cpc_readl(&ptdescr->ptbuf)), 
+			  nchar);
+	    rcvd += nchar;
+	}
+	cpc_writeb(&ptdescr->status, 0);
+	cpc_writeb(&ptdescr->len, 0);
+	chan->rx_first_bd = (chan->rx_first_bd + 1) & (N_DMA_RX_BUF - 1);
+
+	if (status & DST_EOM)	break;
+
+	ptdescr = (pcsca_bd_t *)(card->hw.rambase + cpc_readl(&ptdescr->next));
+    }
+
+    if (rcvd != 0) {
+	/* Update pointer */
+	chan->rx_last_bd = (chan->rx_first_bd - 1) & (N_DMA_RX_BUF - 1);
+	/* Update EDA */
+	cpc_writel(card->hw.scabase + DRX_REG(EDAL, ch),
+		   RX_BD_ADDR(ch, chan->rx_last_bd));
+    }
+    return (rcvd);
+}
+
+void 
+tx_dma_stop(pc300_t *card, int ch)
+{
+    uclong scabase = card->hw.scabase;
+    ucchar drr_ena_bit = 1<<(5 + 2*ch);
+    ucchar drr_rst_bit = 1<<(1 + 2*ch);
+
+    /* Disable DMA */
+    cpc_writeb(scabase + DRR, drr_ena_bit);
+    cpc_writeb(scabase + DRR, drr_rst_bit & ~drr_ena_bit);
+}
+
+void 
+rx_dma_stop(pc300_t *card, int ch)
+{
+    uclong scabase = card->hw.scabase;
+    ucchar drr_ena_bit = 1<<(4 + 2*ch);
+    ucchar drr_rst_bit = 1<<(2*ch);
+
+    /* Disable DMA */
+    cpc_writeb(scabase + DRR, drr_ena_bit);
+    cpc_writeb(scabase + DRR, drr_rst_bit & ~drr_ena_bit);
+}
+
+/*************************/
+/***   FALC Routines   ***/
+/*************************/
+void 
+falc_issue_cmd(pc300_t *card, int ch, ucchar cmd)
+{
+    uclong falcbase = card->hw.falcbase;
+    unsigned long i = 0;
+
+    while (cpc_readb(falcbase + F_REG(SIS, ch)) & SIS_CEC) {
+        if (i++ >= PC300_FALC_MAXLOOP) {
+            printk("%s: FALC command locked(cmd=0x%x).\n", 
+		   card->chan[ch].d.name, cmd);
+            break;
+        }
+    }
+    cpc_writeb(falcbase + F_REG(CMDR, ch), cmd);
+}
+
+void 
+falc_intr_enable(pc300_t *card, int ch)
+{
+    pc300ch_t *chan = (pc300ch_t *)&card->chan[ch];
+    pc300chconf_t *conf = (pc300chconf_t *)&chan->conf;
+    falc_t *pfalc = (falc_t *)&chan->falc;
+    uclong falcbase = card->hw.falcbase;
+
+    /* Interrupt pins are open-drain */
+    cpc_writeb(falcbase + F_REG(IPC, ch), 
+	       cpc_readb(falcbase + F_REG(IPC, ch)) & ~IPC_IC0);
+    /* Conters updated each second */
+    cpc_writeb(falcbase + F_REG(FMR1, ch), 
+	       cpc_readb(falcbase + F_REG(FMR1, ch)) | FMR1_ECM);
+    /* Enable SEC and ES interrupts  */
+    cpc_writeb(falcbase + F_REG(IMR3, ch), 
+	       cpc_readb(falcbase + F_REG(IMR3, ch)) & ~(IMR3_SEC | IMR3_ES));
+    cpc_writeb(falcbase + F_REG(IMR4, ch), 
+	       cpc_readb(falcbase + F_REG(IMR4, ch)) & 
+    	       ~(IMR4_LFA | IMR4_AIS | IMR4_LOS | IMR4_SLIP));
+    if (conf->media == LINE_T1) {
+	cpc_writeb(falcbase + F_REG(IMR3, ch), 
+		   cpc_readb(falcbase + F_REG(IMR3, ch)) & ~IMR3_LLBSC);
+    } else {
+	cpc_writeb(falcbase + F_REG(IPC, ch), 
+		   cpc_readb(falcbase + F_REG(IPC, ch)) | IPC_SCI);
+	cpc_writeb(falcbase + F_REG(IMR2, ch), 
+		   cpc_readb(falcbase + F_REG(IMR2, ch)) & 
+		   ~(IMR2_FAR | IMR2_LFA | IMR2_AIS | IMR2_LOS));
+	cpc_writeb(falcbase + F_REG(IMR1, ch), 
+		   cpc_readb(falcbase + F_REG(IMR1, ch)) & ~IMR1_LLBSC);
+	if (pfalc->multiframe_mode) {
+	    cpc_writeb(falcbase + F_REG(IMR2, ch), 
+		       cpc_readb(falcbase + F_REG(IMR2, ch)) & 
+		       ~(IMR2_T400MS | IMR2_MFAR));
+	} else {
+	    cpc_writeb(falcbase + F_REG(IMR2, ch), 
+		       cpc_readb(falcbase + F_REG(IMR2, ch)) | 
+		       IMR2_T400MS | IMR2_MFAR);
+	}
+    }
+}
+
+void 
+falc_open_timeslot(pc300_t *card, int ch, int timeslot)
+{
+    uclong falcbase = card->hw.falcbase;
+    ucchar tshf = card->chan[ch].falc.offset;
+
+    cpc_writeb(falcbase + F_REG((ICB1 + (timeslot - tshf)/8), ch),
+	       cpc_readb(falcbase + F_REG((ICB1 + (timeslot - tshf)/8), ch)) & 
+	       ~(0x80 >> ((timeslot - tshf) & 0x07)));
+    cpc_writeb(falcbase + F_REG((TTR1 + timeslot/8), ch),
+	       cpc_readb(falcbase + F_REG((TTR1 + timeslot/8), ch)) | 
+	       (0x80 >> (timeslot & 0x07)));
+    cpc_writeb(falcbase + F_REG((RTR1 + timeslot/8), ch),
+	       cpc_readb(falcbase + F_REG((RTR1 + timeslot/8), ch)) | 
+	       (0x80 >> (timeslot & 0x07)));
+}
+
+void 
+falc_close_timeslot(pc300_t *card, int ch, int timeslot)
+{
+    uclong falcbase = card->hw.falcbase;
+    ucchar tshf = card->chan[ch].falc.offset;
+
+    cpc_writeb(falcbase + F_REG((ICB1 + (timeslot - tshf)/8), ch),
+	       cpc_readb(falcbase + F_REG((ICB1 + (timeslot - tshf)/8), ch)) | 
+	       (0x80 >> ((timeslot - tshf) & 0x07)));
+    cpc_writeb(falcbase + F_REG((TTR1 + timeslot/8), ch),
+	       cpc_readb(falcbase + F_REG((TTR1 + timeslot/8), ch)) & 
+	       ~(0x80 >> (timeslot & 0x07)));
+    cpc_writeb(falcbase + F_REG((RTR1 + timeslot/8), ch),
+	       cpc_readb(falcbase + F_REG((RTR1 + timeslot/8), ch)) & 
+	       ~(0x80 >> (timeslot & 0x07)));
+}
+
+void 
+falc_close_all_timeslots(pc300_t *card, int ch)
+{
+    pc300ch_t *chan = (pc300ch_t *)&card->chan[ch];
+    pc300chconf_t *conf = (pc300chconf_t *)&chan->conf;
+    uclong falcbase = card->hw.falcbase;
+
+    cpc_writeb(falcbase + F_REG(ICB1, ch), 0xff);
+    cpc_writeb(falcbase + F_REG(TTR1, ch), 0);
+    cpc_writeb(falcbase + F_REG(RTR1, ch), 0);
+    cpc_writeb(falcbase + F_REG(ICB2, ch), 0xff);
+    cpc_writeb(falcbase + F_REG(TTR2, ch), 0);
+    cpc_writeb(falcbase + F_REG(RTR2, ch), 0);
+    cpc_writeb(falcbase + F_REG(ICB3, ch), 0xff);
+    cpc_writeb(falcbase + F_REG(TTR3, ch), 0);
+    cpc_writeb(falcbase + F_REG(RTR3, ch), 0);
+    if (conf->media == LINE_E1) {
+	cpc_writeb(falcbase + F_REG(ICB4, ch), 0xff);
+	cpc_writeb(falcbase + F_REG(TTR4, ch), 0);
+	cpc_writeb(falcbase + F_REG(RTR4, ch), 0);
+    }
+}
+
+void 
+falc_open_all_timeslots(pc300_t *card, int ch)
+{
+    pc300ch_t *chan = (pc300ch_t *)&card->chan[ch];
+    pc300chconf_t *conf = (pc300chconf_t *)&chan->conf;
+    uclong falcbase = card->hw.falcbase;
+
+    /* Timeslot 0 is never enabled */
+    cpc_writeb(falcbase + F_REG(ICB1, ch), 0);
+    cpc_writeb(falcbase + F_REG(TTR1, ch), 0x7f);
+    cpc_writeb(falcbase + F_REG(RTR1, ch), 0x7f);
+    cpc_writeb(falcbase + F_REG(ICB2, ch), 0);
+    cpc_writeb(falcbase + F_REG(TTR2, ch), 0xff);
+    cpc_writeb(falcbase + F_REG(RTR2, ch), 0xff);
+    cpc_writeb(falcbase + F_REG(ICB3, ch), 0);
+    cpc_writeb(falcbase + F_REG(TTR3, ch), 0xff);
+    cpc_writeb(falcbase + F_REG(RTR3, ch), 0xff);
+    if (conf->media == LINE_E1) {
+	cpc_writeb(falcbase + F_REG(ICB4, ch), 0);
+	cpc_writeb(falcbase + F_REG(TTR4, ch), 0xff);
+	cpc_writeb(falcbase + F_REG(RTR4, ch), 0xff);
+    } else {
+	cpc_writeb(falcbase + F_REG(ICB4, ch), 0xff);
+	cpc_writeb(falcbase + F_REG(TTR4, ch), 0x80);
+	cpc_writeb(falcbase + F_REG(RTR4, ch), 0x80);
+    }
+}
+
+void 
+falc_init_timeslot(pc300_t *card, int ch)
+{
+    pc300ch_t *chan = (pc300ch_t *)&card->chan[ch];
+    pc300chconf_t *conf = (pc300chconf_t *)&chan->conf;
+    falc_t *pfalc = (falc_t *)&chan->falc;
+    int tslot;
+
+    for (tslot = 0 ; tslot < pfalc->num_channels ; tslot++) {
+	if (conf->tslot_bitmap & (1<<tslot)) {
+	    // Channel enabled
+	    falc_open_timeslot(card, ch, tslot + 1);
+	} else {
+	    // Channel disabled
+	    falc_close_timeslot(card, ch, tslot + 1);
+	}
+    }
+}
+
+void 
+falc_enable_comm(pc300_t *card, int ch)
+{
+    pc300ch_t *chan = (pc300ch_t *)&card->chan[ch];
+    falc_t *pfalc = (falc_t *)&chan->falc;
+
+    if (pfalc->full_bandwidth) {
+	falc_open_all_timeslots(card, ch);
+    } else {
+	falc_init_timeslot(card, ch);
+    }
+    // CTS/DCD ON
+    cpc_writeb(card->hw.falcbase + CPLD_REG1,
+	       cpc_readb(card->hw.falcbase + CPLD_REG1) | 
+	       ((CPLD_REG1_FALC_DCD | CPLD_REG1_FALC_CTS) << (2*ch)));
+}
+
+void 
+falc_disable_comm(pc300_t *card, int ch)
+{
+    pc300ch_t *chan = (pc300ch_t *)&card->chan[ch];
+    falc_t *pfalc = (falc_t *)&chan->falc;
+
+    if (pfalc->loop_active != 2) {
+	falc_close_all_timeslots(card, ch);
+    }
+    // CTS/DCD OFF
+    cpc_writeb(card->hw.falcbase + CPLD_REG1,
+	       cpc_readb(card->hw.falcbase + CPLD_REG1) & 
+	       ~((CPLD_REG1_FALC_DCD | CPLD_REG1_FALC_CTS) << (2*ch)));
+}
+
+void
+falc_init_t1(pc300_t *card, int ch)
+{
+    pc300ch_t *chan = (pc300ch_t *)&card->chan[ch];
+    pc300chconf_t *conf = (pc300chconf_t *)&chan->conf;
+    falc_t *pfalc = (falc_t *)&chan->falc;
+    uclong falcbase = card->hw.falcbase;
+    ucchar dja = (ch ? (LIM2_DJA2|LIM2_DJA1) : 0);
+
+    /* Switch to T1 mode (PCM 24) */
+    cpc_writeb(falcbase + F_REG(FMR1, ch), FMR1_PMOD);
+
+    /* Wait 20 us for setup */
+    udelay(20);
+
+    /* Transmit Buffer Size (1 frame) */
+    cpc_writeb(falcbase + F_REG(SIC1, ch), SIC1_XBS0); 
+	
+    /* Clock mode */
+    if (conf->clkrate) {	/* Master mode */
+	cpc_writeb(falcbase + F_REG(LIM0, ch), 
+		   cpc_readb(falcbase + F_REG(LIM0, ch)) | LIM0_MAS); 
+    } else {	/* Slave mode */
+	cpc_writeb(falcbase + F_REG(LIM0, ch), 
+		   cpc_readb(falcbase + F_REG(LIM0, ch)) & ~LIM0_MAS); 
+	cpc_writeb(falcbase + F_REG(LOOP, ch), 
+		   cpc_readb(falcbase + F_REG(LOOP, ch)) & ~LOOP_RTM); 
+    }
+
+    cpc_writeb(falcbase + F_REG(IPC, ch), IPC_SCI);
+    cpc_writeb(falcbase + F_REG(FMR0, ch), 
+	       cpc_readb(falcbase + F_REG(FMR0, ch)) & 
+	       ~(FMR0_XC0 | FMR0_XC1 | FMR0_RC0 | FMR0_RC1));
+
+    switch (conf->lcode) {
+	case PC300_LC_AMI:
+	    cpc_writeb(falcbase + F_REG(FMR0, ch), 
+		       cpc_readb(falcbase + F_REG(FMR0, ch)) | 
+		       FMR0_XC1 | FMR0_RC1);
+	    /* Clear Channel register to ON for all channels */
+	    cpc_writeb(falcbase + F_REG(CCB1, ch), 0xff);
+	    cpc_writeb(falcbase + F_REG(CCB2, ch), 0xff);
+	    cpc_writeb(falcbase + F_REG(CCB3, ch), 0xff);
+	    break;			
+
+	case PC300_LC_B8ZS:
+	    cpc_writeb(falcbase + F_REG(FMR0, ch), 
+		       cpc_readb(falcbase + F_REG(FMR0, ch)) | 
+		       FMR0_XC0 | FMR0_XC1 | FMR0_RC0 | FMR0_RC1);
+	    break;
+
+	case PC300_LC_NRZ:
+	    cpc_writeb(falcbase + F_REG(FMR0, ch), 
+		       cpc_readb(falcbase + F_REG(FMR0, ch)) | 0x00);
+	    break;
+    }
+
+    cpc_writeb(falcbase + F_REG(LIM0, ch), 
+	       cpc_readb(falcbase + F_REG(LIM0, ch)) | LIM0_ELOS); 
+    cpc_writeb(falcbase + F_REG(LIM0, ch), 
+	       cpc_readb(falcbase + F_REG(LIM0, ch)) &
+	       ~(LIM0_SCL1 | LIM0_SCL0)); 
+    /* Set interface mode to 2 MBPS */	
+    cpc_writeb(falcbase + F_REG(FMR1, ch), 
+	       cpc_readb(falcbase + F_REG(FMR1, ch)) | FMR1_IMOD); 
+
+    switch (conf->fr_mode) {
+	case PC300_FR_ESF:
+	    pfalc->multiframe_mode = 0;
+	    cpc_writeb(falcbase + F_REG(FMR4, ch), 
+		       cpc_readb(falcbase + F_REG(FMR4, ch)) | FMR4_FM1);
+	    cpc_writeb(falcbase + F_REG(FMR1, ch), 
+		       cpc_readb(falcbase + F_REG(FMR1, ch)) | 
+		       FMR1_CRC | FMR1_EDL);
+	    cpc_writeb(falcbase + F_REG(XDL1, ch), 0);
+	    cpc_writeb(falcbase + F_REG(XDL2, ch), 0);
+	    cpc_writeb(falcbase + F_REG(XDL3, ch), 0);
+	    cpc_writeb(falcbase + F_REG(FMR0, ch), 
+		       cpc_readb(falcbase + F_REG(FMR0, ch)) & ~FMR0_SRAF);
+	    cpc_writeb(falcbase + F_REG(FMR2, ch), 
+		       cpc_readb(falcbase + F_REG(FMR2, ch)) | 
+		       FMR2_MCSP | FMR2_SSP);
+	    break;
+
+	case PC300_FR_D4:
+	    pfalc->multiframe_mode = 1;
+	    cpc_writeb(falcbase + F_REG(FMR4, ch), 
+		       cpc_readb(falcbase + F_REG(FMR4, ch)) &
+	    	       ~(FMR4_FM1 | FMR4_FM0));
+	    cpc_writeb(falcbase + F_REG(FMR0, ch), 
+		       cpc_readb(falcbase + F_REG(FMR0, ch)) | FMR0_SRAF);
+	    cpc_writeb(falcbase + F_REG(FMR2, ch), 
+		       cpc_readb(falcbase + F_REG(FMR2, ch)) & ~FMR2_SSP);
+	    break;
+    }
+	
+    /* Enable Automatic Resynchronization */
+    cpc_writeb(falcbase + F_REG(FMR4, ch), 
+	       cpc_readb(falcbase + F_REG(FMR4, ch)) | FMR4_AUTO);
+
+    /* Transmit Automatic Remote Alarm */
+    cpc_writeb(falcbase + F_REG(FMR2, ch), 
+	       cpc_readb(falcbase + F_REG(FMR2, ch)) | FMR2_AXRA);
+
+    /* Channel translation mode 1 : one to one */
+    cpc_writeb(falcbase + F_REG(FMR1, ch), 
+	       cpc_readb(falcbase + F_REG(FMR1, ch)) | FMR1_CTM);
+
+    /* No signaling */
+    cpc_writeb(falcbase + F_REG(FMR1, ch), 
+	       cpc_readb(falcbase + F_REG(FMR1, ch)) & ~FMR1_SIGM);
+    cpc_writeb(falcbase + F_REG(FMR5, ch), 
+	       cpc_readb(falcbase + F_REG(FMR5, ch)) & 
+	       ~(FMR5_EIBR | FMR5_SRS));
+    cpc_writeb(falcbase + F_REG(CCR1, ch), 0);
+
+    cpc_writeb(falcbase + F_REG(LIM1, ch), 
+	       cpc_readb(falcbase + F_REG(LIM1, ch)) | LIM1_RIL0 | LIM1_RIL1); 
+
+    switch (conf->lbo) {
+	/* Provides proper Line Build Out */
+	case PC300_LBO_0_DB:
+	    cpc_writeb(falcbase + F_REG(LIM2, ch), (LIM2_LOS1 | dja));
+	    cpc_writeb(falcbase + F_REG(XPM0, ch), 0x5a);
+	    cpc_writeb(falcbase + F_REG(XPM1, ch), 0x8f);
+	    cpc_writeb(falcbase + F_REG(XPM2, ch), 0x20);
+	    break;
+	case PC300_LBO_7_5_DB:
+	    cpc_writeb(falcbase + F_REG(LIM2, ch), (0x40 | LIM2_LOS1 | dja));
+	    cpc_writeb(falcbase + F_REG(XPM0, ch), 0x11);
+	    cpc_writeb(falcbase + F_REG(XPM1, ch), 0x02);
+	    cpc_writeb(falcbase + F_REG(XPM2, ch), 0x20);
+	    break;
+	case PC300_LBO_15_DB:
+	    cpc_writeb(falcbase + F_REG(LIM2, ch), (0x80 | LIM2_LOS1 | dja));
+	    cpc_writeb(falcbase + F_REG(XPM0, ch), 0x8e);
+	    cpc_writeb(falcbase + F_REG(XPM1, ch), 0x01);
+	    cpc_writeb(falcbase + F_REG(XPM2, ch), 0x20);
+	    break;
+	case PC300_LBO_22_5_DB:
+	    cpc_writeb(falcbase + F_REG(LIM2, ch), (0xc0 | LIM2_LOS1 | dja));
+	    cpc_writeb(falcbase + F_REG(XPM0, ch), 0x09);
+	    cpc_writeb(falcbase + F_REG(XPM1, ch), 0x01);
+	    cpc_writeb(falcbase + F_REG(XPM2, ch), 0x20);
+	    break;
+    }
+                                              
+    /* Transmit Clock-Slot Offset */
+    cpc_writeb(falcbase + F_REG(XC0, ch), 
+	       cpc_readb(falcbase + F_REG(XC0, ch)) | 0x01); 
+    /* Transmit Time-slot Offset */
+    cpc_writeb(falcbase + F_REG(XC1, ch), 0x3e);
+    /* Receive  Clock-Slot offset */
+    cpc_writeb(falcbase + F_REG(RC0, ch), 0x05);
+    /* Receive  Time-slot offset */
+    cpc_writeb(falcbase + F_REG(RC1, ch), 0x00);
+
+    /* LOS Detection after 176 consecutive 0s */
+    cpc_writeb(falcbase + F_REG(PCDR, ch), 0x0a);
+    /* LOS Recovery after 22 ones in the time window of PCD */
+    cpc_writeb(falcbase + F_REG(PCRR, ch), 0x15);
+
+    cpc_writeb(falcbase + F_REG(IDLE, ch), 0x7f);
+
+    if (conf->fr_mode == PC300_FR_ESF_JAPAN) {
+	cpc_writeb(falcbase + F_REG(RC1, ch), 
+		   cpc_readb(falcbase + F_REG(RC1, ch)) | 0x80);
+    }
+	
+    falc_close_all_timeslots(card, ch);
+}
+
+void
+falc_init_e1(pc300_t *card, int ch)
+{
+    pc300ch_t *chan = (pc300ch_t *)&card->chan[ch];
+    pc300chconf_t *conf = (pc300chconf_t *)&chan->conf;
+    falc_t *pfalc = (falc_t *)&chan->falc;
+    uclong falcbase = card->hw.falcbase;
+    ucchar dja = (ch ? (LIM2_DJA2|LIM2_DJA1) : 0);
+
+    /* Switch to E1 mode (PCM 30) */
+    cpc_writeb(falcbase + F_REG(FMR1, ch), 
+	       cpc_readb(falcbase + F_REG(FMR1, ch)) & ~FMR1_PMOD);
+
+    /* Clock mode */
+    if (conf->clkrate) {	/* Master mode */
+	cpc_writeb(falcbase + F_REG(LIM0, ch), 
+		   cpc_readb(falcbase + F_REG(LIM0, ch)) | LIM0_MAS); 
+    } else {	/* Slave mode */
+	cpc_writeb(falcbase + F_REG(LIM0, ch), 
+		   cpc_readb(falcbase + F_REG(LIM0, ch)) & ~LIM0_MAS); 
+    }
+    cpc_writeb(falcbase + F_REG(LOOP, ch), 
+	       cpc_readb(falcbase + F_REG(LOOP, ch)) & ~LOOP_RTM); 
+
+    cpc_writeb(falcbase + F_REG(IPC, ch), IPC_SCI);
+    cpc_writeb(falcbase + F_REG(FMR0, ch), 
+	       cpc_readb(falcbase + F_REG(FMR0, ch)) & 
+	       ~(FMR0_XC0 | FMR0_XC1 | FMR0_RC0 | FMR0_RC1));
+
+    switch (conf->lcode) {
+	case PC300_LC_AMI:
+	    cpc_writeb(falcbase + F_REG(FMR0, ch), 
+		       cpc_readb(falcbase + F_REG(FMR0, ch)) | 
+		       FMR0_XC1 | FMR0_RC1);
+	    break;			
+
+	case PC300_LC_HDB3:
+	    cpc_writeb(falcbase + F_REG(FMR0, ch), 
+		       cpc_readb(falcbase + F_REG(FMR0, ch)) | 
+		       FMR0_XC0 | FMR0_XC1 | FMR0_RC0 | FMR0_RC1);
+	    break;
+
+	case PC300_LC_NRZ:
+	    break;
+    }
+
+    cpc_writeb(falcbase + F_REG(LIM0, ch), 
+	       cpc_readb(falcbase + F_REG(LIM0, ch)) &
+	       ~(LIM0_SCL1 | LIM0_SCL0)); 
+    /* Set interface mode to 2 MBPS */	
+    cpc_writeb(falcbase + F_REG(FMR1, ch), 
+	       cpc_readb(falcbase + F_REG(FMR1, ch)) | FMR1_IMOD); 
+
+    cpc_writeb(falcbase + F_REG(XPM0, ch), 0x18);
+    cpc_writeb(falcbase + F_REG(XPM1, ch), 0x03);
+    cpc_writeb(falcbase + F_REG(XPM2, ch), 0x00);
+
+    switch (conf->fr_mode) {
+	case PC300_FR_MF_CRC4:
+	    pfalc->multiframe_mode = 1;
+	    cpc_writeb(falcbase + F_REG(FMR1, ch), 
+		       cpc_readb(falcbase + F_REG(FMR1, ch)) | FMR1_XFS);
+	    cpc_writeb(falcbase + F_REG(FMR2, ch), 
+		       cpc_readb(falcbase + F_REG(FMR2, ch)) | FMR2_RFS1);
+	    cpc_writeb(falcbase + F_REG(FMR2, ch), 
+		       cpc_readb(falcbase + F_REG(FMR2, ch)) & ~FMR2_RFS0);
+	    cpc_writeb(falcbase + F_REG(FMR3, ch), 
+		       cpc_readb(falcbase + F_REG(FMR3, ch)) & ~FMR3_EXTIW);
+			
+	    /* MultiFrame Resynchronization */
+	    cpc_writeb(falcbase + F_REG(FMR1, ch), 
+		       cpc_readb(falcbase + F_REG(FMR1, ch)) | FMR1_MFCS);
+
+	    /* Automatic Loss of Multiframe > 914 CRC errors */
+	    cpc_writeb(falcbase + F_REG(FMR2, ch), 
+		       cpc_readb(falcbase + F_REG(FMR2, ch)) | FMR2_ALMF);
+
+	    /* S1 and SI1/SI2 spare Bits set to 1 */
+	    cpc_writeb(falcbase + F_REG(XSP, ch), 
+		       cpc_readb(falcbase + F_REG(XSP, ch)) & ~XSP_AXS);
+	    cpc_writeb(falcbase + F_REG(XSP, ch), 
+		       cpc_readb(falcbase + F_REG(XSP, ch)) | XSP_EBP);
+	    cpc_writeb(falcbase + F_REG(XSP, ch), 
+		       cpc_readb(falcbase + F_REG(XSP, ch)) | 
+		       XSP_XS13 | XSP_XS15);
+	    break;
+
+	case PC300_FR_MF_NON_CRC4:
+	case PC300_FR_D4:
+	    pfalc->multiframe_mode = 0;
+	    cpc_writeb(falcbase + F_REG(FMR1, ch), 
+		       cpc_readb(falcbase + F_REG(FMR1, ch)) & ~FMR1_XFS);
+	    cpc_writeb(falcbase + F_REG(FMR2, ch), 
+		       cpc_readb(falcbase + F_REG(FMR2, ch)) & ~FMR2_RFS1);
+	    cpc_writeb(falcbase + F_REG(FMR2, ch), 
+		       cpc_readb(falcbase + F_REG(FMR2, ch)) & ~FMR2_RFS0);
+	    cpc_writeb(falcbase + F_REG(XSW, ch), 
+		       cpc_readb(falcbase + F_REG(XSW, ch)) | XSW_XSIS);
+	    cpc_writeb(falcbase + F_REG(XSP, ch), 
+		       cpc_readb(falcbase + F_REG(XSP, ch)) | XSP_XSIF);
+	    break;
+    }
+
+    /* Automatic Force Resynchronization */
+    cpc_writeb(falcbase + F_REG(FMR1, ch), 
+	       cpc_readb(falcbase + F_REG(FMR1, ch)) | FMR1_AFR);
+
+    /* Transmit Automatic Remote Alarm */
+    cpc_writeb(falcbase + F_REG(FMR2, ch), 
+	       cpc_readb(falcbase + F_REG(FMR2, ch)) | FMR2_AXRA);
+
+    /* No signaling */
+    cpc_writeb(falcbase + F_REG(XSP, ch), 
+	       cpc_readb(falcbase + F_REG(XSP, ch)) & ~XSP_CASEN);
+    cpc_writeb(falcbase + F_REG(CCR1, ch), 0);
+
+    cpc_writeb(falcbase + F_REG(LIM1, ch), 
+	       cpc_readb(falcbase + F_REG(LIM1, ch)) | LIM1_RIL0 | LIM1_RIL1); 
+    cpc_writeb(falcbase + F_REG(LIM2, ch), (LIM2_LOS1 | dja));
+
+    /* Transmit Clock-Slot Offset */
+    cpc_writeb(falcbase + F_REG(XC0, ch), 
+	       cpc_readb(falcbase + F_REG(XC0, ch)) | 0x01); 
+    /* Transmit Time-slot Offset */
+    cpc_writeb(falcbase + F_REG(XC1, ch), 0x3e);
+    /* Receive  Clock-Slot offset */
+    cpc_writeb(falcbase + F_REG(RC0, ch), 0x05);
+    /* Receive  Time-slot offset */
+    cpc_writeb(falcbase + F_REG(RC1, ch), 0x00);
+
+    /* LOS Detection after 176 consecutive 0s */
+    cpc_writeb(falcbase + F_REG(PCDR, ch), 0x0a);
+    /* LOS Recovery after 22 ones in the time window of PCD */
+    cpc_writeb(falcbase + F_REG(PCRR, ch), 0x15);
+
+    /* Transmit Spare Bits for National Use (Y-Bits, Sn-Bits, Sa-Bits) */
+    cpc_writeb(falcbase + F_REG(XSW, ch), 
+	       cpc_readb(falcbase + F_REG(XSW, ch)) | 
+	       XSW_XY0 | XSW_XY1 | XSW_XY2 | XSW_XY3 | XSW_XY4);
+
+    cpc_writeb(falcbase + F_REG(IDLE, ch), 0x7f);
+
+    falc_close_all_timeslots(card, ch);
+}
+
+void
+falc_init_hdlc(pc300_t *card, int ch)
+{
+    uclong falcbase = card->hw.falcbase;
+
+    /* Enable transparent data transfer */
+    cpc_writeb(falcbase + F_REG(MODE, ch), 
+	       cpc_readb(falcbase + F_REG(MODE, ch)) | MODE_HRAC | MODE_MDS2);
+    cpc_writeb(falcbase + F_REG(RAH2, ch), 0xff);
+    cpc_writeb(falcbase + F_REG(RAH1, ch), 0xff);
+    cpc_writeb(falcbase + F_REG(RAL2, ch), 0xff);
+    cpc_writeb(falcbase + F_REG(RAL1, ch), 0xff);
+
+    /* Tx/Rx reset  */
+    falc_issue_cmd(card, ch, CMDR_RRES | CMDR_XRES | CMDR_SRES);  
+
+    /* Enable interrupt sources */
+    falc_intr_enable(card, ch);
+}
+
+void 
+te_config(pc300_t *card, int ch)
+{
+    pc300ch_t *chan = (pc300ch_t *)&card->chan[ch];
+    pc300chconf_t *conf = (pc300chconf_t *)&chan->conf;
+    falc_t *pfalc = (falc_t *)&chan->falc;
+    uclong falcbase = card->hw.falcbase;
+    ucchar dummy;
+    unsigned long flags;
+
+    memset(pfalc, 0, sizeof(falc_t));
+    switch (conf->media) {
+	case LINE_T1:
+	    pfalc->num_channels = NUM_OF_T1_CHANNELS;
+	    pfalc->offset = 1;
+	    break;
+	case LINE_E1:
+	    pfalc->num_channels = NUM_OF_E1_CHANNELS;
+	    pfalc->offset = 0;
+	    break;
+    }
+    if (conf->tslot_bitmap == 0xffffffffUL)
+	pfalc->full_bandwidth = 1;
+    else
+	pfalc->full_bandwidth = 0;
+
+    CPC_LOCK(card, flags);
+    /* Reset the FALC chip */
+    cpc_writeb(card->hw.falcbase + CPLD_REG1,
+	       cpc_readb(card->hw.falcbase + CPLD_REG1) | 
+	       (CPLD_REG1_FALC_RESET << (2*ch)));
+    udelay(10000);
+    cpc_writeb(card->hw.falcbase + CPLD_REG1,
+	       cpc_readb(card->hw.falcbase + CPLD_REG1) & 
+	       ~(CPLD_REG1_FALC_RESET << (2*ch)));
+
+    if (conf->media == LINE_T1) {
+	falc_init_t1(card, ch);
+    } else {
+	falc_init_e1(card, ch);
+    }
+    falc_init_hdlc(card, ch);
+    if (conf->rx_sens == PC300_RX_SENS_SH) {
+	cpc_writeb(falcbase + F_REG(LIM0, ch),
+		   cpc_readb(falcbase + F_REG(LIM0, ch)) & ~LIM0_EQON);
+    } else {
+	cpc_writeb(falcbase + F_REG(LIM0, ch),
+		   cpc_readb(falcbase + F_REG(LIM0, ch)) | LIM0_EQON);
+    }
+    cpc_writeb(card->hw.falcbase + CPLD_REG2,
+	       cpc_readb(card->hw.falcbase + CPLD_REG2) | 
+	       ((CPLD_REG2_FALC_TX_CLK | CPLD_REG2_FALC_RX_CLK) << (2*ch)));
+
+    /* Clear all interrupt registers */
+    dummy = cpc_readb(falcbase + F_REG(FISR0, ch)) +
+	    cpc_readb(falcbase + F_REG(FISR1, ch)) +
+	    cpc_readb(falcbase + F_REG(FISR2, ch)) +
+	    cpc_readb(falcbase + F_REG(FISR3, ch));
+    CPC_UNLOCK(card, flags);
+} 
+
+void 
+falc_check_status (pc300_t *card, int ch, unsigned char frs0)
+{
+    pc300ch_t *chan = (pc300ch_t *)&card->chan[ch];
+    pc300chconf_t *conf = (pc300chconf_t *)&chan->conf;
+    falc_t *pfalc = (falc_t *)&chan->falc;
+    uclong falcbase = card->hw.falcbase;
+
+    /* Verify AIS alarm */
+    if (frs0 & FRS0_AIS) {
+	if (!pfalc->blue_alarm) {
+	    pfalc->blue_alarm = 1;
+	    pfalc->ais++;
+	    // EVENT_AIS
+	    if (conf->media == LINE_T1) {
+		/* Disable this interrupt as it may otherwise interfere with 
+		   other working boards. */
+		cpc_writeb(falcbase + F_REG(IMR0, ch), 
+			   cpc_readb(falcbase + F_REG(IMR0, ch)) | IMR0_PDEN);
+	    }
+	    falc_disable_comm(card, ch);
+	    // EVENT_AIS
+	}
+    } else {
+	pfalc->blue_alarm = 0;
+    }
+
+    /* Verify LOS */
+    if (frs0 & FRS0_LOS) {
+	if (! pfalc->red_alarm) {
+	    pfalc->red_alarm = 1;
+	    pfalc->los++;
+	    if (!pfalc->blue_alarm) {
+		// EVENT_FALC_ABNORMAL
+		if (conf->media == LINE_T1) {
+		    /* Disable this interrupt as it may otherwise interfere 
+		       with other working boards. */
+		    cpc_writeb(falcbase + F_REG(IMR0, ch), 
+			       cpc_readb(falcbase + F_REG(IMR0, ch)) | 
+			       IMR0_PDEN);
+		}
+		falc_disable_comm(card, ch);
+		// EVENT_FALC_ABNORMAL
+	    }
+	}
+    } else {
+	if (pfalc->red_alarm) {
+	    pfalc->red_alarm = 0;
+	    pfalc->losr++;
+	}
+    }
+
+    /* Verify LFA */
+    if (frs0 & FRS0_LFA) {
+	if (!pfalc->loss_fa) {
+	    pfalc->loss_fa = 1;
+	    pfalc->lfa++;
+	    if (!pfalc->blue_alarm && !pfalc->red_alarm) {
+		// EVENT_FALC_ABNORMAL
+		if (conf->media == LINE_T1) {
+		    /* Disable this interrupt as it may otherwise interfere 
+		       with other working boards. */
+		    cpc_writeb(falcbase + F_REG(IMR0, ch), 
+			       cpc_readb(falcbase + F_REG(IMR0, ch)) | 
+			       IMR0_PDEN);
+		}
+		falc_disable_comm(card, ch);
+		// EVENT_FALC_ABNORMAL
+	    }
+	}
+    } else {
+	if (pfalc->loss_fa) {
+	    pfalc->loss_fa = 0;
+	    pfalc->farec++;
+	}
+    }
+									
+    /* Verify LMFA */
+    if ((pfalc->multiframe_mode) && (frs0 & FRS0_LMFA)) { 
+	/* D4 or CRC4 frame mode */
+	if (! pfalc->loss_mfa) {
+	    pfalc->loss_mfa = 1;
+	    pfalc->lmfa++;
+	    if (!pfalc->blue_alarm && !pfalc->red_alarm && !pfalc->loss_fa) {
+		// EVENT_FALC_ABNORMAL
+		if (conf->media == LINE_T1) {
+		    /* Disable this interrupt as it may otherwise interfere 
+		       with other working boards. */
+		    cpc_writeb(falcbase + F_REG(IMR0, ch), 
+			       cpc_readb(falcbase + F_REG(IMR0, ch)) | 
+			       IMR0_PDEN);
+		}
+		falc_disable_comm(card, ch);
+		// EVENT_FALC_ABNORMAL
+	    }
+	}
+    } else {
+	pfalc->loss_mfa = 0;
+    }
+
+    if (pfalc->red_alarm || pfalc->loss_fa || 
+	pfalc->loss_mfa || pfalc->blue_alarm) {
+	if (pfalc->sync) {
+	    pfalc->sync = 0;
+	    cpc_writeb(falcbase + CPLD_REG2,
+		       cpc_readb(falcbase + CPLD_REG2) & 
+		       ~(CPLD_REG2_FALC_LED2 << (2*ch)));
+	}
+    } else {
+	if ((!pfalc->sync)) {
+	    pfalc->sync = 1;
+	    cpc_writeb(falcbase + CPLD_REG2,
+		       cpc_readb(falcbase + CPLD_REG2) |
+		       (CPLD_REG2_FALC_LED2 << (2*ch)));
+	}
+    }
+
+    /* Verify Remote Alarm */
+    if (frs0 & FRS0_RRA) {
+	if (! pfalc->yellow_alarm) {
+	    pfalc->yellow_alarm = 1;
+	    pfalc->rai++;
+	    if (pfalc->sync) {
+		// EVENT_RAI
+		falc_disable_comm(card, ch);
+		// EVENT_RAI
+	    }
+	}
+    } else {
+	pfalc->yellow_alarm = 0;
+    }
+
+    if ((pfalc->sync) && (!(pfalc->yellow_alarm))) {
+	if (! pfalc->active) {
+	    // EVENT_FALC_NORMAL
+	    if (pfalc->loop_active) {
+		return;
+	    }
+	    if (conf->media == LINE_T1) {
+		cpc_writeb(falcbase + F_REG(IMR0, ch), 
+			   cpc_readb(falcbase + F_REG(IMR0, ch)) & ~IMR0_PDEN);
+	    }
+	    falc_enable_comm(card, ch);
+	    // EVENT_FALC_NORMAL
+	    pfalc->active = 1;
+	}
+    } else {
+	if (pfalc->active) {
+	    pfalc->active = 0;
+	}
+    }
+}
+
+void 
+falc_update_stats(pc300_t *card, int ch)
+{
+    pc300ch_t *chan = (pc300ch_t *)&card->chan[ch];
+    pc300chconf_t *conf = (pc300chconf_t *)&chan->conf;
+    falc_t *pfalc = (falc_t *)&chan->falc;
+    uclong falcbase = card->hw.falcbase;
+    ucshort counter;
+
+    counter = cpc_readb(falcbase + F_REG(FECL, ch));
+    counter |= cpc_readb(falcbase + F_REG(FECH, ch)) << 8;
+    pfalc->fec += counter;
+
+    counter = cpc_readb(falcbase + F_REG(CVCL, ch));
+    counter |= cpc_readb(falcbase + F_REG(CVCH, ch)) << 8;
+    pfalc->cvc += counter;
+
+    counter = cpc_readb(falcbase + F_REG(CECL, ch));
+    counter |= cpc_readb(falcbase + F_REG(CECH, ch)) << 8;
+    pfalc->cec += counter;
+
+    counter = cpc_readb(falcbase + F_REG(EBCL, ch));
+    counter |= cpc_readb(falcbase + F_REG(EBCH, ch)) << 8;
+    pfalc->ebc += counter;
+
+    if (cpc_readb(falcbase + F_REG(LCR1, ch)) & LCR1_EPRM) {
+	counter = cpc_readb(falcbase + F_REG(BECL, ch));
+	counter |= cpc_readb(falcbase + F_REG(BECH, ch)) << 8;
+	pfalc->bec += counter;
+
+	if (((conf->media == LINE_T1) && 
+	     (cpc_readb(falcbase + F_REG(FRS1, ch)) & FRS1_LLBAD) && 
+	     (!(cpc_readb(falcbase + F_REG(FRS1, ch)) & FRS1_PDEN))) 
+	    ||
+	    ((conf->media == LINE_E1) && 
+	     (cpc_readb(falcbase + F_REG(RSP, ch)) & RSP_LLBAD))) {
+	    pfalc->prbs = 2;
+	} else {
+	    pfalc->prbs = 1;
+	}
+    }
+}
+
+void 
+falc_remote_loop(pc300_t *card, int ch, int loop_on)
+{
+    pc300ch_t *chan = (pc300ch_t *)&card->chan[ch];
+    pc300chconf_t *conf = (pc300chconf_t *)&chan->conf;
+    falc_t *pfalc = (falc_t *)&chan->falc;
+    uclong falcbase = card->hw.falcbase;
+
+    if (loop_on) {
+	// EVENT_FALC_ABNORMAL
+	if (conf->media == LINE_T1) {
+	    /* Disable this interrupt as it may otherwise interfere with 
+	       other working boards. */
+	    cpc_writeb(falcbase + F_REG(IMR0, ch), 
+		       cpc_readb(falcbase + F_REG(IMR0, ch)) | IMR0_PDEN);
+	}
+	falc_disable_comm(card, ch);
+	// EVENT_FALC_ABNORMAL
+	cpc_writeb(falcbase + F_REG(LIM1, ch), 
+		   cpc_readb(falcbase + F_REG(LIM1, ch)) | LIM1_RL);
+	pfalc->loop_active = 1;
+    } else {
+	cpc_writeb(falcbase + F_REG(LIM1, ch), 
+		   cpc_readb(falcbase + F_REG(LIM1, ch)) & ~LIM1_RL);
+	pfalc->sync = 0;
+	cpc_writeb(falcbase + CPLD_REG2,
+		   cpc_readb(falcbase + CPLD_REG2) & 
+		   ~(CPLD_REG2_FALC_LED2 << (2*ch)));
+	pfalc->active = 0;
+	falc_issue_cmd(card, ch, CMDR_XRES);
+	pfalc->loop_active = 0;
+    }
+}
+
+/**********************************/
+/***   Net Interface Routines   ***/
+/**********************************/
+int cpc_queue_xmit(struct sk_buff *skb, struct device *dev)
+{
+    pc300dev_t *d = (pc300dev_t *)dev->priv;
+    pc300ch_t *chan = (pc300ch_t *)d->chan;
+    pc300_t *card = (pc300_t *)chan->card;
+    struct enet_statistics *stats = &d->hdlc->stats;
+    int ch = chan->channel;
+    volatile pcsca_bd_t *ptdescr;
+    uclong flags;
+#ifdef PC300_DEBUG_TX
+    int i;
+#endif
+
+    if (dev->tbusy) {
+	ucchar ilar;
+
+	if (time_before(jiffies, dev->trans_start + PC300_TX_TIMEOUT))
+	    return 1;
+
+	stats->tx_errors++;
+	stats->tx_aborted_errors++;
+	printk("%s: transmit timed out, restarting channel.", dev->name);
+	CPC_LOCK(card, flags);
+	if ((ilar = cpc_readb(card->hw.scabase + ILAR)) != 0) {
+	    printk("(ILAR=0x%x)", ilar);
+	    cpc_writeb(card->hw.scabase + ILAR, ilar);
+	    cpc_writeb(card->hw.scabase + DMER, 0x80);
+	}
+	printk("\n");
+	cpc_writeb(card->hw.scabase + M_REG(CMD, ch), CMD_TX_BUF_CLR);
+	if (d->tx_skb) {
+	    dev_kfree_skb(d->tx_skb);
+	    d->tx_skb = NULL;
+	}
+	if (card->hw.type == PC300_TE) {
+	    cpc_writeb(card->hw.falcbase + CPLD_REG2,
+		       cpc_readb(card->hw.falcbase + CPLD_REG2) &
+		       ~(CPLD_REG2_FALC_LED1 << (2*ch)));
+	}
+	CPC_UNLOCK(card, flags);
+	dev->tbusy = 0;
+    }
+    if (test_and_set_bit(0, (void*)&dev->tbusy)) {
+	printk("%s: transmitter access conflict.\n", dev->name);
+	return 1;
+    }
+
+    /* Clean up descriptors from previous transmission */
+    while (chan->tx_first_bd != chan->tx_next_bd) {
+	ptdescr = (pcsca_bd_t *)
+		   (card->hw.rambase + TX_BD_ADDR(ch, chan->tx_first_bd));
+	cpc_writeb(&ptdescr->status, 0);
+	chan->tx_first_bd = (chan->tx_first_bd + 1) & (N_DMA_TX_BUF - 1);
+    }
+    /* Clean up next free descriptor to avoid race problems with timeout
+       conditions */
+    ptdescr = (pcsca_bd_t *)
+		(card->hw.rambase + TX_BD_ADDR(ch, chan->tx_next_bd));
+    cpc_writeb(&ptdescr->status, 0);
+
+    /* Write buffer to DMA buffers */
+    if(dma_buf_write(card, ch, (ucchar *)skb->data, skb->len) != 0) {
+	CPC_LOCK(card, flags);
+//	printk("%s: write error. Dropping TX packet.\n", dev->name);
+	dev->tbusy = 0;
+	CPC_UNLOCK(card, flags);
+	stats->tx_dropped++;
+	return 1;
+    }
+
+#ifdef PC300_DEBUG_TX
+    printk("%s T:", dev->name);
+    for(i = 0 ; i < skb->len ; i++)
+	printk(" %02x", *(skb->data + i));
+    printk("\n");
+#endif
+
+    d->tx_skb = skb;
+    dev->trans_start = jiffies;
+
+    /* Start transmission */
+    CPC_LOCK(card, flags);
+    cpc_writel(card->hw.scabase + DTX_REG(EDAL, ch), 
+	       TX_BD_ADDR(ch, chan->tx_next_bd));
+    cpc_writeb(card->hw.scabase + M_REG(CMD, ch), CMD_TX_ENA);
+    cpc_writeb(card->hw.scabase + DSR_TX(ch), DSR_DE);
+    if (card->hw.type == PC300_TE) {
+	cpc_writeb(card->hw.falcbase + CPLD_REG2,
+		   cpc_readb(card->hw.falcbase + CPLD_REG2) |
+		   (CPLD_REG2_FALC_LED1 << (2*ch)));
+    }
+    CPC_UNLOCK(card, flags);
+
+    return 0;
+}
+
+void 
+cpc_net_rx(hdlc_device *hdlc)
+{
+    struct device *dev = hdlc_to_dev(hdlc);
+    pc300dev_t *d = (pc300dev_t *)dev->priv;
+    pc300ch_t *chan = (pc300ch_t *)d->chan;
+    pc300_t *card = (pc300_t *)chan->card;
+    struct enet_statistics *stats = &hdlc->stats;
+    int ch = chan->channel;
+#ifdef PC300_DEBUG_RX
+    int i;
+#endif
+    int rxb;
+    struct sk_buff *skb;
+
+    while (1) {
+	if ((rxb = dma_get_rx_frame_size(card, ch)) == -1)
+	    return;
+
+	skb = dev_alloc_skb(rxb);
+	if (skb == NULL) {
+	    printk("%s: Memory squeeze!!\n", dev->name);
+	    return;
+	}
+	skb->dev = dev;
+
+	if((rxb = dma_buf_read(card, ch, skb)) <= 0) {
+	    if (rxb < 0) {	/* Invalid frame */
+		rxb = -rxb;
+		if (rxb & DST_OVR) {
+		    stats->rx_errors++;
+		    stats->rx_fifo_errors++;
+		}
+		if (rxb & DST_CRC) {
+		    stats->rx_errors++;
+		    stats->rx_crc_errors++;
+		}
+		if (rxb & (DST_RBIT | DST_SHRT | DST_ABT)) {
+		    stats->rx_errors++;
+		    stats->rx_frame_errors++;
+		}
+	    }
+	    dev_kfree_skb(skb);
+	    continue;
+	}
+
+#ifdef PC300_DEBUG_RX
+	printk("%s R:", dev->name);
+	for(i = 0 ; i < skb->len ; i++)
+	    printk(" %02x", *(skb->data + i));
+	printk("\n");
+#endif
+
+	switch(hdlc->mode & ~MODE_SOFT) {
+#ifdef CONFIG_PC300_X25
+	    case MODE_X25:
+	    {
+		int err;
+
+		skb->protocol=htons(ETH_P_X25);
+		skb->mac.raw=skb->data;
+		skb->dev=hdlc_to_dev(d->hdlc);
+
+		/* Send it to the upper layer */
+		if ((err = lapb_data_received(d, skb)) != LAPB_OK) {
+		    printk("%s: lapb_data_received err - %d\n", dev->name, err);
+		    dev_kfree_skb(skb);
+		}
+		stats->rx_bytes += rxb;
+		stats->rx_packets++;
+		break;
+	    }
+#endif /* CONFIG_PC300_X25 */
+	    default:
+		hdlc_netif_rx(hdlc, skb, 0);
+		break;
+	}
+    }
+}
+
+#ifdef CONFIG_PC300_X25
+/*********************************/
+/***   X.25 Support Routines   ***/
+/*********************************/
+int 
+cpc_x25_packetlayer_xmit(struct sk_buff *skb, struct device *dev)
+{
+    pc300dev_t *d = (pc300dev_t *)dev->priv;
+    int err;
+	
+    switch (skb->data[0]) {
+	case 0x00:
+	    break;
+
+	case 0x01:
+	    if ((err = lapb_connect_request(d)) != LAPB_OK) {
+		if (err == LAPB_CONNECTED) {
+		    /* Send connect confirm. msg to level 3 */
+		    cpc_lapb_connected(d, 0);
+		} else {
+		    printk("%s: lapb_connect_request error - %d\n",
+			   dev->name, err);
+		}
+	    }
+	    dev_kfree_skb(skb);
+	    return 0;
+
+	case 0x02:
+	    if ((err = lapb_disconnect_request(d)) != LAPB_OK) {
+		if (err == LAPB_NOTCONNECTED) {
+		    /* Send disconnect confirm. msg to level 3 */
+		    cpc_lapb_disconnected(d, 0);
+		} else {
+		    printk("%s: lapb_disconnect_request error - %d\n",
+			   dev->name, err);
+		}
+	    }
+	    dev_kfree_skb(skb);
+	    return 0;
+			
+	default:
+	    dev_kfree_skb(skb);
+	    return 0;
+    }
+
+    skb_pull(skb, 1);
+
+    if ((err = lapb_data_request(d, skb)) != LAPB_OK) {
+	printk("%s: lapb_data_request error - %d\n", dev->name, err);
+	dev_kfree_skb(skb);
+	return -ENOMEM;
+    }
+
+    return 0;
+}
+
+void 
+cpc_lapb_connected(void *token, int reason)
+{
+    pc300dev_t *d = (pc300dev_t *)token;
+    struct sk_buff *skb;
+    unsigned char *ptr;
+
+    if ((skb = dev_alloc_skb(1)) == NULL) {
+	printk("%s: out of memory\n", d->name);
+	return;
+    }
+
+    ptr  = skb_put(skb, 1);
+    *ptr = 0x01;
+
+    skb->dev      = hdlc_to_dev(d->hdlc);
+    skb->protocol = htons(ETH_P_X25);
+    skb->mac.raw  = skb->data;
+    skb->pkt_type = PACKET_HOST;
+
+    netif_rx(skb);
+}
+
+void 
+cpc_lapb_disconnected(void *token, int reason)
+{
+    pc300dev_t *d = (pc300dev_t *)token;
+    struct sk_buff *skb;
+    unsigned char *ptr;
+
+    if ((skb = dev_alloc_skb(1)) == NULL) {
+	printk("%s: out of memory\n", d->name);
+	return;
+    }
+
+    ptr  = skb_put(skb, 1);
+    *ptr = 0x02;
+
+    skb->dev      = hdlc_to_dev(d->hdlc);
+    skb->protocol = htons(ETH_P_X25);
+    skb->mac.raw  = skb->data;
+    skb->pkt_type = PACKET_HOST;
+
+    netif_rx(skb);
+}
+
+void 
+cpc_lapb_data_indication(void *token, struct sk_buff *skb)
+{
+    pc300dev_t *d = (pc300dev_t *)token;
+    unsigned char *ptr;
+
+    ptr  = skb_push(skb, 1);
+    *ptr = 0x00;
+
+    skb->dev      = hdlc_to_dev(d->hdlc);
+    skb->protocol = htons(ETH_P_X25);
+    skb->mac.raw  = skb->data;
+    skb->pkt_type = PACKET_HOST;
+
+    netif_rx(skb);
+}
+
+void 
+cpc_lapb_data_transmit(void *token, struct sk_buff *skb)
+{
+    pc300dev_t *d = (pc300dev_t *)token;
+    struct device *dev = hdlc_to_dev(d->hdlc);
+
+    cpc_queue_xmit (skb, dev);
+}
+#endif /* CONFIG_PC300_X25 */
+
+/************************************/
+/***   PC300 Interrupt Routines   ***/
+/************************************/
+static void 
+sca_intr(pc300_t *card)
+{
+    uclong scabase = card->hw.scabase;
+    volatile uclong status;
+    int ch;
+    int intr_count = 0;
+
+    while ((status = cpc_readl(scabase + ISR0)) != 0) {
+	for (ch = 0 ; ch < card->hw.nchan ; ch++) {
+	    pc300ch_t *chan = &card->chan[ch];
+	    pc300dev_t *d = &chan->d;
+	    hdlc_device *hdlc = d->hdlc;
+	    struct device *dev = hdlc_to_dev(hdlc);
+
+	    dev->interrupt = 1;
+
+	    /**** Reception ****/
+	    if (status & IR0_DRX((IR0_DMIA|IR0_DMIB), ch)) {
+		ucchar drx_stat = cpc_readb(scabase + DSR_RX(ch));
+
+		/* Clear RX interrupts */
+		cpc_writeb(scabase + DSR_RX(ch), drx_stat | DSR_DWE);
+
+#ifdef PC300_DEBUG_INTR
+	        printk("sca_intr: RX intr (st=0x%08lx, dsr=0x%02x)\n", 
+		       status, drx_stat);
+#endif
+		if (status & IR0_DRX(IR0_DMIA, ch)) {
+		    if (drx_stat & DSR_BOF) {
+			chan->rx_first_bd = 0;
+			chan->rx_last_bd = N_DMA_RX_BUF - 1;
+			cpc_writel(scabase + DRX_REG(CDAL, ch), 
+				   RX_BD_ADDR(ch, chan->rx_first_bd));
+			cpc_writel(scabase + DRX_REG(EDAL, ch), 
+				   RX_BD_ADDR(ch, chan->rx_last_bd));
+			cpc_writew(scabase + DRX_REG(BFLL, ch), BD_DEF_LEN);
+			cpc_writeb(scabase + DSR_RX(ch), DSR_DE);
+		    }
+		}
+		if (status & IR0_DRX(IR0_DMIB, ch)) {
+		    if (drx_stat & DSR_EOM) {
+			if (card->hw.type == PC300_TE) {
+			    cpc_writeb(card->hw.falcbase + CPLD_REG2,
+				       cpc_readb(card->hw.falcbase + CPLD_REG2)
+				       | (CPLD_REG2_FALC_LED1 << (2*ch)));
+			}
+			cpc_net_rx(hdlc);
+			if (card->hw.type == PC300_TE) {
+			    cpc_writeb(card->hw.falcbase + CPLD_REG2,
+				       cpc_readb(card->hw.falcbase + CPLD_REG2)
+				       & ~(CPLD_REG2_FALC_LED1 << (2*ch)));
+			}
+		    }
+		}
+	    }
+
+	    /**** Transmission ****/
+	    if (status & IR0_DTX((IR0_EFT|IR0_DMIA|IR0_DMIB), ch)) {
+		ucchar dtx_stat = cpc_readb(scabase + DSR_TX(ch));
+
+		/* Clear TX interrupts */
+		cpc_writeb(scabase + DSR_TX(ch), dtx_stat | DSR_DWE);
+
+#ifdef PC300_DEBUG_INTR
+	        printk("sca_intr: TX intr (st=0x%08lx, dsr=0x%02x)\n", 
+		       status, dtx_stat);
+#endif
+		if (status & IR0_DTX(IR0_EFT, ch)) {
+		    if (dtx_stat & DSR_UDRF) {
+			if (cpc_readb(scabase + M_REG(TBN, ch)) != 0) {
+			    cpc_writeb(scabase + M_REG(CMD, ch), 
+				CMD_TX_BUF_CLR);
+			}
+			if (card->hw.type == PC300_TE) {
+			    cpc_writeb(card->hw.falcbase + CPLD_REG2,
+				       cpc_readb(card->hw.falcbase + CPLD_REG2)
+				       & ~(CPLD_REG2_FALC_LED1 << (2*ch)));
+			}
+			if (d->tx_skb) {
+			    struct sk_buff *skb = d->tx_skb;
+
+			    dev_kfree_skb(skb);
+			    d->tx_skb = NULL;
+			    hdlc->stats.tx_errors++;
+			    hdlc->stats.tx_fifo_errors++;
+			    /* Tell the upper layer we are ready to transmit
+			       more packets */
+			    dev->tbusy = 0;
+			    mark_bh(NET_BH);
+			}
+		    }
+		}
+		if (status & IR0_DTX(IR0_DMIA, ch)) {
+		    if (dtx_stat & DSR_BOF) {
+		    }
+		}
+		if (status & IR0_DTX(IR0_DMIB, ch)) {
+		    if (dtx_stat & DSR_EOM) {
+			if (card->hw.type == PC300_TE) {
+			    cpc_writeb(card->hw.falcbase + CPLD_REG2,
+				       cpc_readb(card->hw.falcbase + CPLD_REG2)
+				       & ~(CPLD_REG2_FALC_LED1 << (2*ch)));
+			}
+			if (d->tx_skb) {
+			    struct sk_buff *skb = d->tx_skb;
+
+			    dev_kfree_skb(skb);
+			    d->tx_skb = NULL;
+			    hdlc->stats.tx_bytes += skb->len;
+			    hdlc->stats.tx_packets++;
+			    /* Tell the upper layer we are ready to transmit
+			       more packets */
+			    dev->tbusy = 0;
+			    mark_bh(NET_BH);
+			}
+		    }
+		}
+	    }
+	    dev->interrupt = 0;
+	}
+	if (++intr_count == 10) 
+	    /* Too much work at this board. Force exit */
+	    break;
+    }
+}
+
+static void 
+falc_t1_loop_detection(pc300_t *card, int ch, ucchar frs1)
+{
+    pc300ch_t *chan = (pc300ch_t *)&card->chan[ch];
+    falc_t *pfalc = (falc_t *)&chan->falc;
+    uclong falcbase = card->hw.falcbase;
+
+    if (((cpc_readb(falcbase + F_REG(LCR1, ch)) & LCR1_XPRBS) == 0) && 
+	!pfalc->loop_gen) {
+	if (frs1 & FRS1_LLBDD) {
+	    // A Line Loop Back Deactuation signal detected
+	    if (pfalc->loop_active) {
+		falc_remote_loop(card, ch, 0);
+	    }
+	} else {
+	    if ((frs1 & FRS1_LLBAD) && 
+		((cpc_readb(falcbase + F_REG(LCR1, ch)) & LCR1_EPRM) == 0)) {
+		// A Line Loop Back Actuation signal detected	
+		if (!pfalc->loop_active) {
+		    falc_remote_loop(card, ch, 1);
+		}
+	    }
+	}
+    }
+}
+
+static void 
+falc_e1_loop_detection(pc300_t *card, int ch, ucchar rsp)
+{
+    pc300ch_t *chan = (pc300ch_t *)&card->chan[ch];
+    falc_t *pfalc = (falc_t *)&chan->falc;
+    uclong falcbase = card->hw.falcbase;
+
+    if (((cpc_readb(falcbase + F_REG(LCR1, ch)) & LCR1_XPRBS) == 0) && 
+	!pfalc->loop_gen) {
+	if (rsp & RSP_LLBDD) {
+	    // A Line Loop Back Deactuation signal detected
+	    if (pfalc->loop_active) {
+		falc_remote_loop(card, ch, 0);
+	    }
+	} else {
+	    if ((rsp & RSP_LLBAD) && 
+		((cpc_readb(falcbase + F_REG(LCR1, ch)) & LCR1_EPRM) == 0)) {
+		// A Line Loop Back Actuation signal detected	
+		if (!pfalc->loop_active) {
+		    falc_remote_loop(card, ch, 1);
+		}
+	    }
+	}
+    }
+}
+
+static void 
+falc_t1_intr(pc300_t *card, int ch)
+{
+    pc300ch_t *chan = (pc300ch_t *)&card->chan[ch];
+    falc_t *pfalc = (falc_t *)&chan->falc;
+    uclong falcbase = card->hw.falcbase;
+    ucchar isr0, isr3, gis;
+    ucchar dummy;
+
+    while ((gis = cpc_readb(falcbase + F_REG(GIS, ch))) != 0) {
+	if (gis & GIS_ISR0) {
+	    isr0 = cpc_readb(falcbase + F_REG(FISR0, ch));
+	    if (isr0 & FISR0_PDEN)  { 
+		/* Read the bit to clear the situation */
+		if (cpc_readb(falcbase + F_REG(FRS1, ch)) & FRS1_PDEN) {
+			pfalc->pden++;
+		}
+	    }
+	}
+
+	if (gis & GIS_ISR1) {
+	    dummy = cpc_readb(falcbase + F_REG(FISR1, ch));
+	}
+	      
+	if (gis & GIS_ISR2) {
+	    dummy = cpc_readb(falcbase + F_REG(FISR2, ch));
+	}
+      
+	if (gis & GIS_ISR3) {
+	    isr3 = cpc_readb(falcbase + F_REG(FISR3, ch));
+	    if (isr3 & FISR3_SEC) {
+		pfalc->sec++;
+		falc_update_stats(card, ch);
+		falc_check_status(card, ch, 
+				  cpc_readb(falcbase + F_REG(FRS0, ch)));
+	    }
+	    if (isr3 & FISR3_ES) {
+		pfalc->es++;
+	    }
+	    if (isr3 & FISR3_LLBSC) {
+		falc_t1_loop_detection(card, ch, 
+				cpc_readb(falcbase + F_REG(FRS1, ch)));
+	    }
+	}
+    }
+}
+
+static void 
+falc_e1_intr(pc300_t *card, int ch)
+{
+    pc300ch_t *chan = (pc300ch_t *)&card->chan[ch];
+    falc_t *pfalc = (falc_t *)&chan->falc;
+    uclong falcbase = card->hw.falcbase;
+    ucchar isr1, isr2, isr3, gis, rsp;
+    ucchar dummy;
+
+    while ((gis = cpc_readb(falcbase + F_REG(GIS, ch))) != 0) {
+	rsp = cpc_readb(falcbase + F_REG(RSP, ch));
+
+	if (gis & GIS_ISR0)  { 
+	    dummy = cpc_readb(falcbase + F_REG(FISR0, ch));
+	}
+	if (gis & GIS_ISR1) {
+	    isr1 = cpc_readb(falcbase + F_REG(FISR1, ch));
+	    if (isr1 & FISR1_XMB) {
+		if ((pfalc->xmb_cause & 2) && pfalc->multiframe_mode) {
+		    if (cpc_readb(falcbase + F_REG(FRS0, ch)) & 
+			(FRS0_LOS | FRS0_AIS | FRS0_LFA)) {
+			cpc_writeb(falcbase + F_REG(XSP, ch), 
+				   cpc_readb(falcbase + F_REG(XSP, ch)) & 
+				   ~XSP_AXS);
+		    } else {
+			cpc_writeb(falcbase + F_REG(XSP, ch), 
+				   cpc_readb(falcbase + F_REG(XSP, ch)) | 
+				   XSP_AXS);
+		    }
+		}
+		pfalc->xmb_cause = 0;
+		cpc_writeb(falcbase + F_REG(IMR1, ch), 
+			   cpc_readb(falcbase + F_REG(IMR1, ch)) | IMR1_XMB);
+	    }
+	    if (isr1 & FISR1_LLBSC) {
+		falc_e1_loop_detection(card, ch, rsp);
+	    }
+	}
+	if (gis & GIS_ISR2) {
+	    isr2 = cpc_readb(falcbase + F_REG(FISR2, ch));
+	    if (isr2 & FISR2_T400MS) {
+		cpc_writeb(falcbase + F_REG(XSW, ch), 
+			   cpc_readb(falcbase + F_REG(XSW, ch)) | XSW_XRA);
+	    }
+	    if (isr2 & FISR2_MFAR) {
+		cpc_writeb(falcbase + F_REG(XSW, ch), 
+			   cpc_readb(falcbase + F_REG(XSW, ch)) & ~XSW_XRA);
+	    }
+	    if (isr2 & (FISR2_FAR | FISR2_LFA | FISR2_AIS | FISR2_LOS)) {
+		pfalc->xmb_cause |= 2;
+		cpc_writeb(falcbase + F_REG(IMR1, ch), 
+			   cpc_readb(falcbase + F_REG(IMR1, ch)) & ~IMR1_XMB);
+	    }
+	}
+	if (gis & GIS_ISR3) {
+	    isr3 = cpc_readb(falcbase + F_REG(FISR3, ch));
+	    if (isr3 & FISR3_SEC) {
+		pfalc->sec++;
+		falc_update_stats(card, ch);
+		falc_check_status(card, ch, 
+				  cpc_readb(falcbase + F_REG(FRS0, ch)));
+	    }
+	    if (isr3 & FISR3_ES) {
+		pfalc->es++;
+	    }
+	}
+    }
+}
+
+static void
+falc_intr(pc300_t *card)
+{
+    int ch;
+
+    for (ch = 0 ; ch < card->hw.nchan ; ch++) {
+	pc300ch_t *chan = &card->chan[ch];
+	pc300chconf_t *conf = (pc300chconf_t *)&chan->conf;
+
+	if (conf->media == LINE_T1) {
+	    falc_t1_intr(card, ch);
+	} else {
+	    falc_e1_intr(card, ch);
+	}
+    }
+}
+
+static void
+cpc_intr(int irq, void *dev_id, struct pt_regs *regs)
+{
+    pc300_t *card;
+    volatile ucchar plx_status;
+
+    if((card = (pc300_t *)dev_id) == 0){
+#ifdef PC300_DEBUG_INTR
+        printk("cpc_intr: spurious intr %d\n", irq);
+#endif
+        return; /* spurious intr */
+    }
+
+    switch (card->hw.type) {
+	case PC300_RSV:
+	case PC300_X21:
+	    sca_intr(card);
+	    break;
+
+	case PC300_TE:
+	    while ((plx_status = (cpc_readb(card->hw.plxbase + 0x4c) & 
+			(PLX_9050_LINT1_STATUS|PLX_9050_LINT2_STATUS))) != 0) {
+		if (plx_status & PLX_9050_LINT1_STATUS) { /* SCA Interrupt */
+		    sca_intr(card);
+		}
+		if (plx_status & PLX_9050_LINT2_STATUS) { /* FALC Interrupt */
+		    falc_intr(card);
+		}
+	    }
+	    break;
+    }
+}
+
+void 
+cpc_sca_status(pc300_t *card, int ch)
+{
+    ucchar ilar;
+    uclong scabase = card->hw.scabase;
+    uclong flags;
+
+    tx_dma_buf_check(card, ch);
+    rx_dma_buf_check(card, ch);
+    ilar = cpc_readb(scabase + ILAR);
+    printk("ILAR=0x%02x, WCRL=0x%02x, PCR=0x%02x, BTCR=0x%02x, BOLR=0x%02x\n", 
+	   ilar, cpc_readb(scabase + WCRL),
+	   cpc_readb(scabase + PCR),
+	   cpc_readb(scabase + BTCR),
+	   cpc_readb(scabase + BOLR));
+    printk("TX_CDA=0x%08lx, TX_EDA=0x%08lx\n", 
+	   (uclong)cpc_readl(scabase + DTX_REG(CDAL, ch)),
+	   (uclong)cpc_readl(scabase + DTX_REG(EDAL, ch)));
+    printk("RX_CDA=0x%08lx, RX_EDA=0x%08lx, BFL=0x%04x\n", 
+	   (uclong)cpc_readl(scabase + DRX_REG(CDAL, ch)),
+	   (uclong)cpc_readl(scabase + DRX_REG(EDAL, ch)),
+	   cpc_readw(scabase + DRX_REG(BFLL, ch)));
+    printk("DMER=0x%02x, DSR_TX=0x%02x, DSR_RX=0x%02x\n", 
+	   cpc_readb(scabase + DMER),
+	   cpc_readb(scabase + DSR_TX(ch)),
+	   cpc_readb(scabase + DSR_RX(ch)));
+    printk("DMR_TX=0x%02x, DMR_RX=0x%02x, DIR_TX=0x%02x, DIR_RX=0x%02x\n", 
+	   cpc_readb(scabase + DMR_TX(ch)),
+	   cpc_readb(scabase + DMR_RX(ch)),
+	   cpc_readb(scabase + DIR_TX(ch)),
+	   cpc_readb(scabase + DIR_RX(ch)));
+    printk("DCR_TX=0x%02x, DCR_RX=0x%02x, FCT_TX=0x%02x, FCT_RX=0x%02x\n", 
+	   cpc_readb(scabase + DCR_TX(ch)),
+	   cpc_readb(scabase + DCR_RX(ch)),
+	   cpc_readb(scabase + FCT_TX(ch)),
+	   cpc_readb(scabase + FCT_RX(ch)));
+    printk("MD0=0x%02x, MD1=0x%02x, MD2=0x%02x, MD3=0x%02x, IDL=0x%02x\n",
+	   cpc_readb(scabase + M_REG(MD0, ch)),
+	   cpc_readb(scabase + M_REG(MD1, ch)),
+	   cpc_readb(scabase + M_REG(MD2, ch)),
+	   cpc_readb(scabase + M_REG(MD3, ch)),
+	   cpc_readb(scabase + M_REG(IDL, ch)));
+    printk("CMD=0x%02x, SA0=0x%02x, SA1=0x%02x, TFN=0x%02x, CTL=0x%02x\n",
+	   cpc_readb(scabase + M_REG(CMD, ch)),
+	   cpc_readb(scabase + M_REG(SA0, ch)),
+	   cpc_readb(scabase + M_REG(SA1, ch)),
+	   cpc_readb(scabase + M_REG(TFN, ch)),
+	   cpc_readb(scabase + M_REG(CTL, ch)));
+    printk("ST0=0x%02x, ST1=0x%02x, ST2=0x%02x, ST3=0x%02x, ST4=0x%02x\n",
+	   cpc_readb(scabase + M_REG(ST0, ch)),
+	   cpc_readb(scabase + M_REG(ST1, ch)),
+	   cpc_readb(scabase + M_REG(ST2, ch)),
+	   cpc_readb(scabase + M_REG(ST3, ch)),
+	   cpc_readb(scabase + M_REG(ST4, ch)));
+    printk("CST0=0x%02x, CST1=0x%02x, CST2=0x%02x, CST3=0x%02x, FST=0x%02x\n",
+	   cpc_readb(scabase + M_REG(CST0, ch)),
+	   cpc_readb(scabase + M_REG(CST1, ch)),
+	   cpc_readb(scabase + M_REG(CST2, ch)),
+	   cpc_readb(scabase + M_REG(CST3, ch)),
+	   cpc_readb(scabase + M_REG(FST, ch)));
+    printk("TRC0=0x%02x, TRC1=0x%02x, RRC=0x%02x, TBN=0x%02x, RBN=0x%02x\n",
+	   cpc_readb(scabase + M_REG(TRC0, ch)),
+	   cpc_readb(scabase + M_REG(TRC1, ch)),
+	   cpc_readb(scabase + M_REG(RRC, ch)),
+	   cpc_readb(scabase + M_REG(TBN, ch)),
+	   cpc_readb(scabase + M_REG(RBN, ch)));
+    printk("TFS=0x%02x, TNR0=0x%02x, TNR1=0x%02x, RNR=0x%02x\n",
+	   cpc_readb(scabase + M_REG(TFS, ch)),
+	   cpc_readb(scabase + M_REG(TNR0, ch)),
+	   cpc_readb(scabase + M_REG(TNR1, ch)),
+	   cpc_readb(scabase + M_REG(RNR, ch)));
+    printk("TCR=0x%02x, RCR=0x%02x, TNR1=0x%02x, RNR=0x%02x\n",
+	   cpc_readb(scabase + M_REG(TCR, ch)),
+	   cpc_readb(scabase + M_REG(RCR, ch)),
+	   cpc_readb(scabase + M_REG(TNR1, ch)),
+	   cpc_readb(scabase + M_REG(RNR, ch)));
+    printk("TXS=0x%02x, RXS=0x%02x, EXS=0x%02x, TMCT=0x%02x, TMCR=0x%02x\n",
+	   cpc_readb(scabase + M_REG(TXS, ch)),
+	   cpc_readb(scabase + M_REG(RXS, ch)),
+	   cpc_readb(scabase + M_REG(EXS, ch)),
+	   cpc_readb(scabase + M_REG(TMCT, ch)),
+	   cpc_readb(scabase + M_REG(TMCR, ch)));
+    printk("IE0=0x%02x, IE1=0x%02x, IE2=0x%02x, IE4=0x%02x, FIE=0x%02x\n",
+	   cpc_readb(scabase + M_REG(IE0, ch)),
+	   cpc_readb(scabase + M_REG(IE1, ch)),
+	   cpc_readb(scabase + M_REG(IE2, ch)),
+	   cpc_readb(scabase + M_REG(IE4, ch)),
+	   cpc_readb(scabase + M_REG(FIE, ch)));
+    printk("IER0=0x%08lx\n", (uclong)cpc_readl(scabase + IER0)); 
+
+    if (ilar != 0) {
+	CPC_LOCK(card, flags);
+	cpc_writeb(scabase + ILAR, ilar);
+	cpc_writeb(scabase + DMER, 0x80);
+	CPC_UNLOCK(card, flags);
+    }
+}
+
+void 
+cpc_falc_status(pc300_t *card, int ch)
+{
+    pc300ch_t *chan = &card->chan[ch];
+    falc_t *pfalc = (falc_t *)&chan->falc;
+    uclong flags;
+
+    CPC_LOCK(card, flags);
+    printk("CH%d:   %s %s  %d channels\n",
+	ch, (pfalc->sync ? "SYNC":""), (pfalc->active ? "ACTIVE":""), 
+	pfalc->num_channels);
+
+    printk("        pden=%d,  los=%d,  losr=%d,  lfa=%d,  farec=%d\n",
+        pfalc->pden, pfalc->los, pfalc->losr, pfalc->lfa, pfalc->farec);
+    printk("        lmfa=%d,  ais=%d,  sec=%d,  es=%d,  rai=%d\n",
+        pfalc->lmfa, pfalc->ais, pfalc->sec, pfalc->es, pfalc->rai);
+    printk("        bec=%d,  fec=%d,  cvc=%d,  cec=%d,  ebc=%d\n",
+        pfalc->bec, pfalc->fec, pfalc->cvc, pfalc->cec, pfalc->ebc);
+
+    printk("\n");
+    printk("        STATUS: %s  %s  %s  %s  %s  %s\n",
+	(pfalc->red_alarm ? "RED":""), 
+	(pfalc->blue_alarm ? "BLU":""), 
+	(pfalc->yellow_alarm ? "YEL":""), 
+	(pfalc->loss_fa ? "LFA":""), 
+	(pfalc->loss_mfa ? "LMF":""), 
+	(pfalc->prbs ? "PRB":""));
+    CPC_UNLOCK(card, flags);
+}
+
+int 
+cpc_ioctl(hdlc_device *hdlc, struct ifreq *ifr, int cmd)
+{
+    struct device *dev = hdlc_to_dev(hdlc);
+    pc300dev_t *d = (pc300dev_t *)dev->priv;
+    pc300ch_t *chan = (pc300ch_t *)d->chan;
+    pc300_t *card = (pc300_t *)chan->card;
+    pc300chconf_t *conf = (pc300chconf_t *)&chan->conf;
+    int ch = chan->channel;
+    int value;
+    void *arg = (void *) ifr->ifr_data;
+
+    if(!capable(CAP_NET_ADMIN))
+	return -EPERM;
+
+    switch(cmd) {
+	case SIOCGPC300CONF:
+	    conf->proto = hdlc->mode;
+	    if (!arg || copy_to_user(arg, conf, sizeof(pc300chconf_t)))
+		return -EINVAL;
+	    return 0;
+	case SIOCSPC300CONF:
+	    if (!suser())
+		return -EPERM;
+	    if (!arg || copy_from_user(conf, arg, sizeof(pc300chconf_t)))
+		return -EINVAL;
+	    return 0;
+	case SIOCGPC300STATUS:
+	    cpc_sca_status(card, ch);
+	    return 0;
+	case SIOCGPC300FALCSTATUS:
+	    cpc_falc_status(card, ch);
+	    return 0;
+	case HDLCSETLINE:
+	    value = ifr->ifr_ifru.ifru_ivalue;
+	    switch (value) {
+		case LINE_LOOPBACK:
+		    cpc_writeb(card->hw.scabase + M_REG(MD2, ch), 
+			       cpc_readb(card->hw.scabase + M_REG(MD2, ch)) | 
+			       MD2_LOOP_MIR);
+		    conf->loopback = 1;
+		    return 0;
+
+		case LINE_NOLOOPBACK:
+		    cpc_writeb(card->hw.scabase + M_REG(MD2, ch), 
+			       cpc_readb(card->hw.scabase + M_REG(MD2, ch)) & 
+			       ~MD2_LOOP_MIR);
+		    conf->loopback = 0;
+		    return 0;
+
+		case LINE_V35:
+		case LINE_X21:
+		case LINE_RS232:
+		case LINE_T1:
+		case LINE_E1:
+		    /* Media */
+		    conf->media = value;
+		    return 0;
+
+		default:
+		    /* Clock rate */
+		    conf->clkrate = value;
+		    return 0;
+	    }
+	
+	default:
+	    switch(hdlc->mode & ~MODE_SOFT) {
+#ifdef CONFIG_PC300_X25
+		case MODE_X25:
+		    /* There are no X.25-specific ioctls */
+		    return -EINVAL;
+#endif /* CONFIG_PC300_X25 */
+		default:
+		    return -EINVAL;
+	    }
+    }
+}
+
+static int
+clock_rate_calc(uclong rate, uclong clock, int *br_io)
+{
+    int br, tc;
+    int br_pwr, error;
+
+    if (rate == 0)
+	return (0);
+
+    for (br = 0, br_pwr = 1 ; br <= 9 ; br++, br_pwr <<= 1) {
+	if ((tc = clock / br_pwr / rate) <= 0xff) {
+	    *br_io = br;
+	    break;
+	}
+    }
+
+    if (tc <= 0xff) {
+	error = ((rate - (clock / br_pwr / rate)) / rate) * 1000;
+	/* Errors bigger than +/- 1% won't be tolerated */
+	if (error < -10 || error > 10)
+	    return (-1);
+	else
+	    return (tc);
+    } else {
+	return (-1);
+    }
+}
+
+int
+ch_config(pc300dev_t *d)
+{
+    pc300ch_t *chan = (pc300ch_t *)d->chan;
+    pc300chconf_t *conf = (pc300chconf_t *)&chan->conf;
+    pc300_t *card = (pc300_t *)chan->card;
+    uclong scabase = card->hw.scabase;
+    uclong plxbase = card->hw.plxbase;
+    int ch = chan->channel;
+    uclong clkrate = chan->conf.clkrate;
+    ucchar loopback = (conf->loopback ? MD2_LOOP_MIR : MD2_F_DUPLEX);
+    int tmc, br;
+
+    /* Reset the channel */
+    cpc_writeb(scabase + M_REG(CMD, ch), CMD_CH_RST);
+
+    /* Configure the SCA registers */
+    cpc_writeb(scabase + M_REG(MD0, ch),
+                (MD0_CRC_CCITT|MD0_CRCC0|MD0_BIT_SYNC));
+    cpc_writeb(scabase + M_REG(MD1, ch), 0);
+    cpc_writeb(scabase + M_REG(MD2, ch), (loopback|MD2_ADPLL_X8|MD2_NRZ));
+    cpc_writeb(scabase + M_REG(IDL, ch), 0x7e);
+    cpc_writeb(scabase + M_REG(CTL, ch), CTL_URSKP|CTL_IDLC);
+
+    /* Configure HW media */
+    switch(card->hw.type) {
+	case PC300_RSV:
+	    if(conf->media == LINE_V35) {
+		cpc_writel((plxbase+0x50),
+			cpc_readl(plxbase+0x50) | PC300_CHMEDIA_MASK(ch));
+	    } else {
+		cpc_writel((plxbase+0x50),
+			cpc_readl(plxbase+0x50) & ~PC300_CHMEDIA_MASK(ch));
+	    }
+	    break;
+
+	case PC300_X21:
+	    break;
+
+	case PC300_TE:
+	    te_config(card, ch);
+	    break;
+    }
+
+    switch(card->hw.type) {
+	case PC300_RSV:
+	case PC300_X21:
+	    if (clkrate) {
+		/* Calculate the clkrate rate parameters */
+		tmc = clock_rate_calc(clkrate, card->hw.clock, &br);
+		cpc_writeb(scabase + M_REG(TMCT, ch), tmc);
+		cpc_writeb(scabase + M_REG(TXS, ch), (TXS_DTRXC|TXS_IBRG|br));
+		cpc_writeb(scabase + M_REG(TMCR, ch), tmc);
+		cpc_writeb(scabase + M_REG(RXS, ch), (RXS_IBRG|br));
+		if (card->hw.type == PC300_X21)
+		    cpc_writeb(scabase + M_REG(GPO, ch), 1);
+	    } else {
+		cpc_writeb(scabase + M_REG(TMCT, ch), 1);
+		cpc_writeb(scabase + M_REG(TXS, ch), TXS_DTRXC);
+		cpc_writeb(scabase + M_REG(TMCR, ch), 1);
+		cpc_writeb(scabase + M_REG(RXS, ch), 0);
+		if (card->hw.type == PC300_X21)
+		    cpc_writeb(scabase + M_REG(GPO, ch), 0);
+	    }
+	    cpc_writeb(scabase + M_REG(EXS, ch), EXS_TES1);
+	    break;
+
+	case PC300_TE:
+	    /* SCA always receives clock from the FALC chip */
+	    cpc_writeb(scabase + M_REG(TMCT, ch), 1);
+	    cpc_writeb(scabase + M_REG(TXS, ch), 0);
+	    cpc_writeb(scabase + M_REG(TMCR, ch), 1);
+	    cpc_writeb(scabase + M_REG(RXS, ch), 0);
+	    cpc_writeb(scabase + M_REG(EXS, ch), 0);
+	    break;
+    }
+
+    /* Enable Interrupts */
+    cpc_writel(scabase + IER0, 
+	cpc_readl(scabase + IER0) |
+	IR0_DRX(IR0_EFT|IR0_DMIA|IR0_DMIB, ch) |
+	IR0_DTX(IR0_EFT|IR0_DMIA|IR0_DMIB, ch) );
+
+    return 0;
+}
+
+int
+rx_config(pc300dev_t *d)
+{
+    pc300ch_t *chan = (pc300ch_t *)d->chan;
+    pc300_t *card = (pc300_t *)chan->card;
+    uclong scabase = card->hw.scabase;
+    int ch = chan->channel;
+
+    cpc_writeb(scabase + DSR_RX(ch), 0);
+
+    /* General RX settings */
+    cpc_writeb(scabase + M_REG(RRC, ch), 0);
+    cpc_writeb(scabase + M_REG(RNR, ch), 16);
+
+    /* Enable reception */
+    cpc_writeb(scabase + M_REG(CMD, ch), CMD_RX_CRC_INIT);
+    cpc_writeb(scabase + M_REG(CMD, ch), CMD_RX_ENA);
+
+    /* Initialize DMA stuff */
+    chan->rx_first_bd = 0;
+    chan->rx_last_bd = N_DMA_RX_BUF - 1;
+    rx_dma_buf_init(card, ch);
+    cpc_writeb(scabase + DCR_RX(ch), DCR_FCT_CLR);
+    cpc_writeb(scabase + DMR_RX(ch), (DMR_TMOD | DMR_NF));
+    cpc_writeb(scabase + DIR_RX(ch), (DIR_EOM | DIR_BOF));
+
+    /* Start DMA */
+    cpc_writel(scabase + DRX_REG(CDAL, ch), RX_BD_ADDR(ch, chan->rx_first_bd));
+    cpc_writel(scabase + DRX_REG(EDAL, ch), RX_BD_ADDR(ch, chan->rx_last_bd));
+    cpc_writew(scabase + DRX_REG(BFLL, ch), BD_DEF_LEN);
+    cpc_writeb(scabase + DSR_RX(ch), DSR_DE);
+
+    return 0;
+}
+
+int
+tx_config(pc300dev_t *d)
+{
+    pc300ch_t *chan = (pc300ch_t *)d->chan;
+    pc300_t *card = (pc300_t *)chan->card;
+    uclong scabase = card->hw.scabase;
+    int ch = chan->channel;
+
+    cpc_writeb(scabase + DSR_TX(ch), 0);
+
+    /* General TX settings */
+    cpc_writeb(scabase + M_REG(TRC0, ch), 0);
+    cpc_writeb(scabase + M_REG(TFS, ch), 32);
+    cpc_writeb(scabase + M_REG(TNR0, ch), 20);
+    cpc_writeb(scabase + M_REG(TNR1, ch), 48);
+    cpc_writeb(scabase + M_REG(TCR, ch), 8);
+
+    /* Enable transmission */
+    cpc_writeb(scabase + M_REG(CMD, ch), CMD_TX_CRC_INIT);
+
+    /* Initialize DMA stuff */
+    chan->tx_first_bd = 0;
+    chan->tx_next_bd = 0;
+    tx_dma_buf_init(card, ch);
+    cpc_writeb(scabase + DCR_TX(ch), DCR_FCT_CLR);
+    cpc_writeb(scabase + DMR_TX(ch), (DMR_TMOD | DMR_NF));
+    cpc_writeb(scabase + DIR_TX(ch), (DIR_EOM | DIR_BOF | DIR_UDRF));
+    cpc_writel(scabase + DTX_REG(CDAL, ch), TX_BD_ADDR(ch, chan->tx_first_bd));
+    cpc_writel(scabase + DTX_REG(EDAL, ch), TX_BD_ADDR(ch, chan->tx_next_bd));
+
+    return 0;
+}
+
+int
+cpc_opench(pc300dev_t *d)
+{
+    pc300ch_t *chan = (pc300ch_t *)d->chan;
+    pc300_t *card = (pc300_t *)chan->card;
+    int ch = chan->channel;
+    uclong scabase = card->hw.scabase;
+    int err = -1;
+
+    err = ch_config(d);
+    if (err)
+	return err;
+
+    err = rx_config(d);
+    if (err)
+	return err;
+
+    err = tx_config(d);
+    if (err)
+	return err;
+
+    /* Assert RTS and DTR */
+    cpc_writeb(scabase + M_REG(CTL, ch), 
+	cpc_readb(scabase + M_REG(CTL, ch)) & ~(CTL_RTS | CTL_DTR));
+
+    return 0;
+}
+
+void
+cpc_closech(pc300dev_t *d)
+{
+    pc300ch_t *chan = (pc300ch_t *)d->chan;
+    pc300_t *card = (pc300_t *)chan->card;
+    falc_t *pfalc = (falc_t *)&chan->falc;
+    int ch = chan->channel;
+
+    cpc_writeb(card->hw.scabase + M_REG(CMD, ch), CMD_CH_RST);
+    if (card->hw.type == PC300_TE) {
+	memset(pfalc, 0, sizeof(falc_t));
+	cpc_writeb(card->hw.falcbase + CPLD_REG2,
+		   cpc_readb(card->hw.falcbase + CPLD_REG2) & 
+		   ~((CPLD_REG2_FALC_TX_CLK | CPLD_REG2_FALC_RX_CLK | 
+		      CPLD_REG2_FALC_LED2) << (2*ch)));
+	/* Reset the FALC chip */
+	cpc_writeb(card->hw.falcbase + CPLD_REG1,
+		   cpc_readb(card->hw.falcbase + CPLD_REG1) | 
+		   (CPLD_REG1_FALC_RESET << (2*ch)));
+	udelay(10000);
+	cpc_writeb(card->hw.falcbase + CPLD_REG1,
+		   cpc_readb(card->hw.falcbase + CPLD_REG1) & 
+		   ~(CPLD_REG1_FALC_RESET << (2*ch)));
+    }
+}
+
+int
+cpc_open(hdlc_device *hdlc)
+{
+    struct device *dev = hdlc_to_dev(hdlc);
+    pc300dev_t *d = (pc300dev_t *)dev->priv;
+    int err = -1;
+
+    err = cpc_opench(d);
+    if (err)
+	return err;
+
+    switch(hdlc->mode & ~MODE_SOFT) {
+#ifdef CONFIG_PC300_X25
+	case MODE_X25:
+	{
+	    struct lapb_register_struct cpc_lapb_callbacks;
+
+	    hdlc->ioctl = cpc_ioctl;
+	    cpc_lapb_callbacks.connect_confirmation = cpc_lapb_connected;
+	    cpc_lapb_callbacks.connect_indication = cpc_lapb_connected;
+	    cpc_lapb_callbacks.disconnect_confirmation = cpc_lapb_disconnected;
+	    cpc_lapb_callbacks.disconnect_indication = cpc_lapb_disconnected;
+	    cpc_lapb_callbacks.data_indication = cpc_lapb_data_indication;
+	    cpc_lapb_callbacks.data_transmit = cpc_lapb_data_transmit;
+
+	    if ((err = lapb_register(d, &cpc_lapb_callbacks)) != LAPB_OK) {
+		printk("%s: lapb_register error - %d\n", dev->name, err);
+		dev->tbusy = 1;
+		dev->start = 0;
+		return -ENODEV;
+	    }
+	    dev->hard_start_xmit = cpc_x25_packetlayer_xmit;
+	    dev->type = ARPHRD_X25;
+	    dev->hard_header_len = 2;
+	    dev->addr_len = 0;
+	    break;
+	}
+#endif /* CONFIG_PC300_X25 */
+	default:
+	    break;
+    }
+    dev->tbusy = 0;
+    dev->interrupt = 0;
+    dev->start = 1;
+    MOD_INC_USE_COUNT;
+    return 0;
+}
+
+void
+cpc_close(hdlc_device *hdlc)
+{
+    struct device *dev = hdlc_to_dev(hdlc);
+    pc300dev_t *d = (pc300dev_t *)dev->priv;
+    pc300ch_t *chan = (pc300ch_t *)d->chan;
+    pc300_t *card = (pc300_t *)chan->card;
+    uclong flags;
+
+    CPC_LOCK(card, flags);
+    switch(hdlc->mode & ~MODE_SOFT) {
+#ifdef CONFIG_PC300_X25
+	case MODE_X25:
+	{
+	    int err;
+
+	    if ((err = lapb_unregister(d)) != LAPB_OK) {
+		printk("%s: lapb_unregister error - %d\n", dev->name, err);
+	    }
+	    break;
+	}
+#endif /* CONFIG_PC300_X25 */
+	default:
+	    break;
+    }
+    if (d->tx_skb) {
+	dev_kfree_skb(d->tx_skb);
+	d->tx_skb = NULL;
+    }
+    dev->tbusy = 1;
+    dev->start = 0;
+    cpc_closech(d);
+    CPC_UNLOCK(card, flags);
+
+    MOD_DEC_USE_COUNT;
+}
+
+static uclong
+detect_ram(pc300_t *card)
+{
+    uclong i;
+    ucchar data;
+    uclong rambase = card->hw.rambase;
+
+    card->hw.ramsize = PC300_RAMSIZE;
+    /* Let's find out how much RAM is present on this board */
+    for (i = 0; i < card->hw.ramsize ; i++) {
+        data = (ucchar)(i & 0xff);
+        cpc_writeb(rambase + i, data);
+        if (cpc_readb(rambase + i) != data) {
+            break;
+        }
+    }
+    return (i);
+}
+
+static void
+plx_init(pc300_t *card)
+{
+  struct RUNTIME_9050 *plx_ctl = (struct RUNTIME_9050 *)card->hw.plxbase;
+
+    /* Reset PLX */
+    cpc_writel(&plx_ctl->init_ctrl, cpc_readl(&plx_ctl->init_ctrl)|0x40000000);
+    udelay(10000L);
+    cpc_writel(&plx_ctl->init_ctrl, cpc_readl(&plx_ctl->init_ctrl)&~0x40000000);
+
+    /* Reload Config. Registers from EEPROM */
+    cpc_writel(&plx_ctl->init_ctrl, cpc_readl(&plx_ctl->init_ctrl)|0x20000000);
+    udelay(10000L);
+    cpc_writel(&plx_ctl->init_ctrl, cpc_readl(&plx_ctl->init_ctrl)&~0x20000000);
+
+}
+
+__initfunc(static int  
+cpc_detect(void))
+{
+#ifdef CONFIG_PCI
+    static struct pci_dev	*pdev = NULL;
+    ucchar	cpc_rev_id;
+    ucchar	cpc_irq = 0;
+    uclong	cpc_plxphys, cpc_ramphys, cpc_scaphys, cpc_falcphys, cpc_iophys;
+    uclong	cpc_plxbase, cpc_rambase, cpc_scabase, cpc_falcbase;
+    ucshort	i, j, eeprom_outdated = 0;
+    ucshort	device_id, dev_index = 0;
+    pc300_t	*card;
+
+    if(pci_present() == 0) {    /* PCI bus not present */
+	return 0;
+    }
+    for (i = 0 ; i < PC300_MAXCARDS ; i++) {
+	/* look for a Cyclades card by vendor and device id */
+	while((device_id = cpc_pci_dev_id[dev_index]) != 0) {
+	    if((pdev = pci_find_device(PCI_VENDOR_ID_CYCLADES, 
+				       device_id, pdev)) == NULL) {
+		dev_index++;    /* try next device id */
+	    } else {
+		break;    /* found a board */
+	    }
+	}
+	if (device_id == 0)
+	    break;
+
+	/* read PCI configuration area */
+	cpc_irq = pdev->irq;
+	cpc_iophys = pdev->base_address[1];
+	cpc_scaphys = pdev->base_address[2];
+	cpc_ramphys = pdev->base_address[3];
+	cpc_falcphys = pdev->base_address[4];
+	cpc_plxphys = pdev->base_address[5];
+	pci_read_config_byte(pdev, PCI_REVISION_ID, &cpc_rev_id);
+
+	if ((device_id == PCI_DEVICE_ID_PC300_RX_1) ||
+	    (device_id == PCI_DEVICE_ID_PC300_RX_2) ||
+	    (device_id == PCI_DEVICE_ID_PC300_TE_1) ||
+	    (device_id == PCI_DEVICE_ID_PC300_TE_2)) {
+#ifdef PC300_DEBUG_PCI
+	    printk("cpc (bus=0x0%x, pci_id=0x%x, ",
+		   pdev->bus->number, pdev->devfn);
+	    printk("rev_id=%d) IRQ%d\n", cpc_rev_id, (int)cpc_irq);
+	    printk("cpc:found  ramaddr=0x%lx plxaddr=0x%lx "
+		   "ctladdr=0x%lx falcaddr=0x%lx\n",
+		   (ulong)cpc_ramphys, (ulong)cpc_plxphys, 
+		   (ulong)cpc_scaphys, (ulong)cpc_falcphys);
+#endif
+	    cpc_iophys &= PCI_BASE_ADDRESS_IO_MASK;
+	    cpc_plxphys &= PCI_BASE_ADDRESS_MEM_MASK;
+	    cpc_ramphys &= PCI_BASE_ADDRESS_MEM_MASK;
+	    cpc_scaphys &= PCI_BASE_ADDRESS_MEM_MASK;
+	    cpc_falcphys &= PCI_BASE_ADDRESS_MEM_MASK;
+
+	    /* Although we don't use this I/O region, we should
+	       request it from the kernel anyway, to avoid problems
+	       with other drivers accessing it. */
+	    request_region(cpc_iophys, PC300_PLX_WIN, "Cyclades-PC300");
+
+	    if (cpc_plxphys) {
+		pdev->base_address[0] = cpc_plxphys;
+		pci_write_config_dword(pdev, PCI_BASE_ADDRESS_0, cpc_plxphys);
+	    } else {
+		eeprom_outdated = 1;
+		cpc_plxphys = pdev->base_address[0];
+		cpc_plxphys &= PCI_BASE_ADDRESS_MEM_MASK;
+	    }
+
+	    cpc_plxbase = (uclong) ioremap(cpc_plxphys, PC300_PLX_WIN);
+	    cpc_rambase = (uclong) ioremap(cpc_ramphys, PC300_RAMSIZE);
+	    cpc_scabase = (uclong) ioremap(cpc_scaphys, PC300_SCASIZE);
+	    switch(device_id) {
+		case PCI_DEVICE_ID_PC300_TE_1:
+		case PCI_DEVICE_ID_PC300_TE_2:
+		    cpc_falcbase = (uclong) ioremap(cpc_falcphys, 
+						    PC300_FALCSIZE);
+		    break;
+
+		case PCI_DEVICE_ID_PC300_RX_1:
+		case PCI_DEVICE_ID_PC300_RX_2:
+		default:
+		    cpc_falcbase = 0;
+		    break;
+	    }
+
+#ifdef PC300_DEBUG_PCI
+	    printk("cpc: relocate ramaddr=0x%lx plxaddr=0x%lx "
+		   "ctladdr=0x%lx falcaddr=0x%lx\n",
+		   (ulong)cpc_rambase, (ulong)cpc_plxbase, 
+		   (ulong)cpc_scabase, (ulong)cpc_falcbase);
+#endif
+	    /* Fill the next card structure available */
+	    for (j = 0 ; j < PC300_MAXCARDS ; j++) {
+		if (cpc_card[j].hw.rambase == 0)  break;
+	    }
+
+	    if (j == PC300_MAXCARDS) {	/* No more cards available */
+		printk("PC300 found at RAM 0x%lx, "
+		       "but no more cards can be used.\n",
+		       (ulong) cpc_ramphys);
+		printk("Change PC300_MAXCARDS in pc300drv.c and "
+		       "recompile your kernel.\n");
+		return(i);
+	    }
+
+	    /* Allocate IRQ */
+	    if(request_irq(cpc_irq, cpc_intr, SA_SHIRQ, "Cyclades-PC300", 
+			   &cpc_card[j]))
+	    {
+		printk("PC300 found at RAM 0x%lx, "
+		       "but could not allocate IRQ%d.\n",
+		       (ulong) cpc_ramphys, cpc_irq);
+		return(i);
+	    }
+
+	    card = &cpc_card[j];
+
+	    /* Set PC300 HW structure */
+	    card->hw.plxphys = cpc_plxphys;
+	    card->hw.plxbase = cpc_plxbase;
+	    card->hw.plxsize = (uclong)PC300_PLX_WIN;
+	    card->hw.scaphys = cpc_scaphys;
+	    card->hw.scabase = cpc_scabase;
+	    card->hw.scasize = (uclong)PC300_SCASIZE;
+	    card->hw.ramphys = cpc_ramphys;
+	    card->hw.rambase = cpc_rambase;
+	    card->hw.ramsize = detect_ram(card);
+	    card->hw.falcphys = cpc_falcphys;
+	    card->hw.falcbase = cpc_falcbase;
+	    card->hw.falcsize = (uclong)PC300_FALCSIZE;
+	    card->hw.irq = (int)cpc_irq;
+	    switch(device_id) {
+		case PCI_DEVICE_ID_PC300_RX_1:
+		case PCI_DEVICE_ID_PC300_TE_1:
+		    card->hw.nchan = 1;
+		    break;
+
+		case PCI_DEVICE_ID_PC300_RX_2:
+		case PCI_DEVICE_ID_PC300_TE_2:
+		default:
+		    card->hw.nchan = PC300_MAXCHAN;
+		    break;
+	    }
+
+	    /* Enable interrupts on the PCI bridge */
+	    plx_init(&cpc_card[j]);
+	    cpc_writew(card->hw.plxbase+0x4c, 
+		cpc_readw(card->hw.plxbase+0x4c) | 0x0040);
+
+#ifdef USE_PCI_CLOCK
+	    /* Set board clock to PCI clock */
+	    cpc_writel(card->hw.plxbase+0x50, 
+		cpc_readl(card->hw.plxbase+0x50) | 0x00000004UL);
+	    card->hw.clock = PC300_PCI_CLOCK;
+#else
+	    /* Set board clock to internal oscillator clock */
+	    cpc_writel(card->hw.plxbase+0x50, 
+		cpc_readl(card->hw.plxbase+0x50) & ~0x00000004UL);
+	    card->hw.clock = PC300_OSC_CLOCK;
+#endif
+
+	    /* Set Global SCA-II registers */
+	    cpc_writeb(card->hw.scabase + PCR, PCR_PR2);
+	    cpc_writeb(card->hw.scabase + BTCR, 0x10);
+	    cpc_writeb(card->hw.scabase + WCRL, 0);
+	    cpc_writeb(card->hw.scabase + DMER, 0x80);
+
+	    /* Set board type */
+	    switch(device_id) {
+		case PCI_DEVICE_ID_PC300_TE_1:
+		case PCI_DEVICE_ID_PC300_TE_2:
+		    card->hw.type = PC300_TE;
+		    /* Enable the board's global clock */
+		    cpc_writeb(card->hw.falcbase + CPLD_REG1,
+			       cpc_readb(card->hw.falcbase + CPLD_REG1) | 
+			       CPLD_REG1_GLOBAL_CLK);
+		    break;
+
+		case PCI_DEVICE_ID_PC300_RX_1:
+		case PCI_DEVICE_ID_PC300_RX_2:
+		default:
+		    if((cpc_readl(card->hw.plxbase+0x50) & PC300_CTYPE_MASK)) {
+			card->hw.type = PC300_X21;
+		    } else {
+			card->hw.type = PC300_RSV;
+		    }
+		    break;
+	    }
+	}
+    }
+    if (eeprom_outdated)
+	printk("WARNING: detected at least one PC300 with an outdated "
+	       "EEPROM.\n");
+    return i;
+#else
+    printk("cpc: WARNING: your kernel does not have PCI support.\n");
+    return 0;
+#endif /* CONFIG_PCI */
+}
+
+/*
+ * This routine prints out the appropriate serial driver version number
+ * and identifies which options were configured into this driver.
+ */
+static inline void
+show_version(void)
+{
+  char *rcsvers, *rcsdate, *tmp;
+    rcsvers = strchr(rcsid, ' '); rcsvers++;
+    tmp = strchr(rcsvers, ' '); *tmp++ = '\0';
+    rcsdate = strchr(tmp, ' '); rcsdate++;
+    tmp = strrchr(rcsdate, ' '); *tmp = '\0';
+    printk("Cyclades-PC300 driver %s %s\n", rcsvers, rcsdate);
+    printk("        built %s %s\n", __DATE__, __TIME__);
+} /* show_version */
+
+__initfunc(int 
+cpc_init(void))
+{
+    int i, j, devcount = 0;
+
+    show_version();
+    memset(&cpc_card, 0, (PC300_MAXCARDS * sizeof(pc300_t)));
+    if((cpc_nboards = cpc_detect()) == 0) {
+	printk("** No boards were found.\n");
+	return -ENODEV;
+    }
+
+    /* Fill in valid structures and invalidate the remaining */
+    for (i = 0 ; i < PC300_MAXCARDS ; i++) {
+	pc300_t *card = &cpc_card[i];
+
+	if (card->hw.rambase != 0) {
+	    for(j = 0; j < card->hw.nchan; j++) {
+		pc300ch_t *chan = &card->chan[j];
+		pc300dev_t *d = &chan->d;
+		hdlc_device *hdlc;
+		struct device *dev;
+
+		memset(chan, 0, sizeof(pc300ch_t));
+
+		chan->card = card;
+		chan->channel = j;
+		chan->conf.clkrate = 64000;
+		chan->conf.loopback = 0;
+		switch(card->hw.type) {
+		    case PC300_TE:
+			chan->conf.media = LINE_T1;
+			chan->conf.lcode = PC300_LC_B8ZS;
+			chan->conf.fr_mode = PC300_FR_ESF;
+			chan->conf.lbo = PC300_LBO_0_DB;
+			chan->conf.rx_sens = PC300_RX_SENS_SH;
+			chan->conf.tslot_bitmap = 0xffffffffUL;
+			break;
+
+		    case PC300_X21:
+			chan->conf.media = LINE_X21;
+			break;
+
+		    case PC300_RSV:
+		    default:
+			chan->conf.media = LINE_RS232;
+			break;
+		}
+		chan->tx_first_bd = 0;
+		chan->tx_next_bd = 0;
+		chan->rx_first_bd = 0;
+		chan->rx_last_bd = N_DMA_RX_BUF - 1;
+
+		d->chan = chan;
+		d->tx_skb = NULL;
+
+		d->hdlc = (hdlc_device *)
+			kmalloc(sizeof(hdlc_device), GFP_KERNEL);
+		if (d->hdlc == NULL)
+		    continue;
+		memset(d->hdlc, 0, sizeof(hdlc_device));
+
+		hdlc = d->hdlc;
+		hdlc->open = cpc_open;
+		hdlc->close = cpc_close;
+		hdlc->ioctl = cpc_ioctl;
+		d->if_ptr = &hdlc->pppdev;
+
+		dev = hdlc_to_dev(d->hdlc);
+		dev->mem_start = card->hw.ramphys;
+		dev->mem_end = card->hw.ramphys + card->hw.ramsize - 1;
+		dev->irq = card->hw.irq;
+		dev->interrupt = 0;
+		dev->start = 0;
+		dev->tx_queue_len = PC300_TX_QUEUE_LEN;
+		dev->hard_start_xmit = cpc_queue_xmit;
+		dev->set_multicast_list = NULL;
+		dev->set_mac_address = NULL;
+
+		if(register_hdlc_device(hdlc) == 0) {
+		    dev->priv = d;	/* We need 'priv', hdlc doesn't */
+		    printk("%s: PC300/", hdlc->name);
+		    switch(card->hw.type) {
+			case PC300_TE:
+			    printk("TE ");
+			    break;
+
+			case PC300_X21:
+			    printk("X21");
+			    break;
+
+			case PC300_RSV:
+			default:
+			    printk("RSV");
+			    break;
+		    }
+		    printk(" #%d, %ldKB of RAM at 0x%lx, IRQ%d, channel %d.\n",
+			   i + 1, card->hw.ramsize/1024, card->hw.ramphys, 
+			   card->hw.irq, j + 1);
+		    devcount++;
+		} else {
+		    *(d->name) = 0;
+		    kfree(d->hdlc);
+		    continue;
+		}
+	    }
+	    spin_lock_init(&card->card_lock);
+	} else {
+	    memset(&card->hw, 0, sizeof (pc300hw_t));
+	}
+    }
+
+    return 0;
+}
+
+#ifdef MODULE
+int init_module (void)
+{
+    return (cpc_init());
+} /* init_module */
+
+void cleanup_module (void)
+{
+    int i, j;
+
+    for (i = 0 ; i < PC300_MAXCARDS ; i++) {
+	pc300_t *card = &cpc_card[i];
+
+        if (card->hw.rambase != 0) {
+	    for(j = 0 ; j < card->hw.nchan ; j++) {
+		unregister_hdlc_device(card->chan[j].d.hdlc);
+	    }
+
+	    iounmap((void *)card->hw.plxbase);
+	    iounmap((void *)card->hw.scabase);
+	    iounmap((void *)card->hw.rambase);
+	    if (card->hw.type == PC300_TE)
+		iounmap((void *)card->hw.falcbase);
+	    if (card->hw.irq)
+		free_irq(card->hw.irq, card);
+        }
+    }
+}
+#endif
+
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/drivers/net/rtl8139.c linux.17p9/drivers/net/rtl8139.c
--- linux.vanilla/drivers/net/rtl8139.c	Fri Apr 21 12:46:19 2000
+++ linux.17p9/drivers/net/rtl8139.c	Thu Jun 15 15:07:44 2000
@@ -1265,8 +1265,8 @@
 			} else {
 #if 1  /* USE_IP_COPYSUM */
 				eth_copy_and_sum(skb, &rx_ring[ring_offset + 4],
-								 rx_size, 0);
-				skb_put(skb, rx_size);
+						 rx_size - 4, 0);
+				skb_put(skb, rx_size - 4);
 #else
 				memcpy(skb_put(skb, rx_size), &rx_ring[ring_offset + 4],
 					   rx_size);
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/drivers/net/sunhme.c linux.17p9/drivers/net/sunhme.c
--- linux.vanilla/drivers/net/sunhme.c	Fri Apr 21 12:46:21 2000
+++ linux.17p9/drivers/net/sunhme.c	Fri Jun 16 16:19:53 2000
@@ -2336,6 +2336,11 @@
 
 	dev->interrupt = 1;
 
+	if ((happy_status & (GREG_STAT_TXALL | GREG_STAT_RXTOHOST)) &&
+	    (hp->happy_flags & HFLAG_QUATTRO) != 0 &&
+	    pci_dma_wsync != NULL)
+		(void) *(pci_dma_wsync);
+
 	if(happy_status & GREG_STAT_ERRORS) {
 		HMD(("ERRORS "));
 		if(happy_meal_is_not_so_happy(hp, gregs, /* un- */ happy_status)) {
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/drivers/pci/oldproc.c linux.17p9/drivers/pci/oldproc.c
--- linux.vanilla/drivers/pci/oldproc.c	Sun Jun 11 21:44:15 2000
+++ linux.17p9/drivers/pci/oldproc.c	Thu Jun 15 15:45:43 2000
@@ -458,6 +458,10 @@
 	DEVICE( CYCLADES,	CYCLOM_8Y_Hi,	"Cyclom-8Y above 1Mbyte"),
 	DEVICE( CYCLADES,	CYCLOM_Z_Lo,	"Cyclades-Z below 1Mbyte"),
 	DEVICE( CYCLADES,	CYCLOM_Z_Hi,	"Cyclades-Z above 1Mbyte"),
+	DEVICE( CYCLADES,	PC300_RX_2,	"PC300/RSV or /X21 (2 ports)"),
+	DEVICE( CYCLADES,	PC300_RX_1,	"PC300/RSV or /X21 (1 port)"),
+	DEVICE( CYCLADES,	PC300_TE_2,	"PC300/TE (2 ports)"),
+	DEVICE( CYCLADES,	PC300_TE_1,	"PC300/TE (1 port)"),
 	DEVICE( ESSENTIAL,	ESSENTIAL_ROADRUNNER,"Roadrunner serial HIPPI"),
 	DEVICE( O2,		O2_6832,	"6832"),
 	DEVICE( 3DFX,		3DFX_VOODOO,	"Voodoo"),
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/drivers/scsi/aic7xxx/aic7xxx.seq linux.17p9/drivers/scsi/aic7xxx/aic7xxx.seq
--- linux.vanilla/drivers/scsi/aic7xxx/aic7xxx.seq	Fri Apr 21 12:46:27 2000
+++ linux.17p9/drivers/scsi/aic7xxx/aic7xxx.seq	Thu Jun 22 22:35:41 2000
@@ -60,11 +60,7 @@
 	clr	SCSISIGO;		/* De-assert BSY */
 	and	SXFRCTL1, ~BITBUCKET;
 	/* Always allow reselection */
-	if ((p->flags & AHC_TARGETMODE) != 0) {
-		mvi	SCSISEQ, ENSELI|ENRSELI|ENAUTOATNP;
-	} else {
-		mvi	SCSISEQ, ENRSELI|ENAUTOATNP;
-	}
+	mvi	SCSISEQ, ENRSELI|ENAUTOATNP;
 
 	if ((p->features & AHC_CMD_CHAN) != 0) {
 		/* Ensure that no DMA operations are in progress */
@@ -236,118 +232,6 @@
 
 selection:
 	test	SSTAT0,SELDO	jnz select_out;
-select_in:
-	if ((p->flags & AHC_TARGETMODE) != 0) {
-		test	SSTAT0, TARGET	jz initiator_reselect;
-		/*
-		 * We've just been selected.  Assert BSY and
-		 * setup the phase for receiving the messages
-		 * from the target.
-		 */
-		mvi	SCSISIGO, P_MESGOUT|BSYO;
-		mvi	CLRSINT0, CLRSELDO;
-
-		/*
-		 * If ATN isn't asserted, go directly to bus free.
-		 */
-		test	SCSISIGI, ATNI	jz	target_busfree;
-
-		/*
-		 * Setup the DMA for sending the identify and
-		 * command information.
-		 */
-		mov	A, TMODE_CMDADDR_NEXT;
-		mvi	DINDEX, HADDR;
-		mvi	TMODE_CMDADDR call set_32byte_addr;
-		mvi	DFCNTRL, FIFORESET;
-
-		clr	SINDEX;
-		/* Watch ATN closely now */
-message_loop:
-		or	SXFRCTL0, SPIOEN;
-		test	SSTAT0, SPIORDY jz .;
-		and	SXFRCTL0, ~SPIOEN;
-		mov	DINDEX, SCSIDATL;
-		mov	DFDAT, DINDEX;
-		inc	SINDEX;
-
-		/* Message Testing... */
-		test	DINDEX, MSG_IDENTIFYFLAG jz . + 2;
-		mov	ARG_1, DINDEX;
-
-		test	SCSISIGI, ATNI	jnz	message_loop;
-		add	A, -4, SINDEX;
-		jc	target_cmdphase;
-		mvi	DFDAT, SCB_LIST_NULL;	/* Terminate the message list */
-
-target_cmdphase:
-		add	HCNT[0], 1, A;
-		clr	HCNT[1];
-		clr	HCNT[2];
-		mvi	SCSISIGO, P_COMMAND|BSYO;
-		or	SXFRCTL0, SPIOEN;
-		test	SSTAT0, SPIORDY jz .;
-		mov	A, SCSIDATL;
-		mov	DFDAT, A;	/* Store for host */
-
-		/*
-		 * Determine the number of bytes to read
-		 * based on the command group code.  Count is
-		 * one less than the total since we've already
-		 * fetched the first byte.
-		 */
-		clr	SINDEX;
-		shr	A, CMD_GROUP_CODE_SHIFT;
-		add	SEQADDR0, A;
-
-		add	SINDEX, CMD_GROUP0_BYTE_DELTA;
-		nop;	/* Group 1 and 2 are the same */
-		add	SINDEX, CMD_GROUP2_BYTE_DELTA;
-		nop;	/* Group 3 is reserved */
-		add	SINDEX, CMD_GROUP4_BYTE_DELTA;
-		add	SINDEX, CMD_GROUP5_BYTE_DELTA;
-		/* Group 6 and 7 are not handled yet */
-
-		mov	A, SINDEX;
-		add	HCNT[0], A;
-
-command_loop:
-		test	SSTAT0, SPIORDY jz .;
-		cmp	SINDEX, 1 jne . + 2;
-		and	SXFRCTL0, ~SPIOEN;	/* Last Byte */
-		mov	DFDAT, SCSIDATL;
-		dec	SINDEX;
-		test	SINDEX, 0xFF jnz command_loop;
-
-		or	DFCNTRL, HDMAEN|FIFOFLUSH;
-	
-		call	dma_finish;
-
-		test	ARG_1, MSG_IDENTIFY_DISCFLAG jz selectin_post;
-
-		mvi	SCSISIGO, P_MESGIN|BSYO;
-
-		or	SXFRCTL0, SPIOEN;
-
-		mvi	MSG_DISCONNECT call target_outb;
-	
-selectin_post:
-		inc	TMODE_CMDADDR_NEXT;
-		cmp	TMODE_CMDADDR_NEXT, TMODE_NUMCMDS jne . + 2;
-		clr	TMODE_CMDADDR_NEXT;
-		mvi	QOUTFIFO, SCB_LIST_NULL;
-		mvi	INTSTAT,CMDCMPLT;
-
-		test	ARG_1, MSG_IDENTIFY_DISCFLAG jnz target_busfree;
-
-		/* Busy loop on something then go to data or status phase */
-
-target_busfree:
-		clr	SCSISIGO;
-		jmp	poll_for_work;
-
-	}
-
 /*
  * Reselection has been initiated by a target. Make a note that we've been
  * reselected, but haven't seen an IDENTIFY message from the target yet.
@@ -453,14 +337,14 @@
  * STCNT may have been cleared, so restore it from the residual field.
  */
 data_phase_reinit:
-	if ((p->features & AHC_CMD_CHAN) != 0) {
-		if ((p->features & AHC_ULTRA2) != 0) {
-			bmov	HADDR, SHADDR, 4;
-			bmov    HCNT, SCB_RESID_DCNT, 3;
-		} else {
-			bmov    STCNT, SCB_RESID_DCNT, 3;
-		}
-	} else {
+	if ((p->features & AHC_ULTRA2) != 0) {
+		bmov	HADDR, SHADDR, 4;
+		bmov    HCNT, SCB_RESID_DCNT, 3;
+	}
+	if ((p->chip & AHC_CHIPID_MASK) == AHC_AIC7895) {
+		bmov    STCNT, SCB_RESID_DCNT, 3;
+	}
+	if ((p->features & AHC_CMD_CHAN) == 0) {
 		mvi	DINDEX, STCNT;
 		mvi	SCB_RESID_DCNT	call bcopy_3;
 	}
@@ -687,10 +571,13 @@
 		test	DFSTATUS, FIFOEMP jz ultra2_dmafifoflush;
 		test	DFSTATUS, MREQPEND	jnz .;
 ultra2_dmahalt:
-		and     DFCNTRL, ~HDMAEN;
-		test	DFCNTRL, HDMAEN jnz .;
-		and     DFCNTRL, ~SCSIEN;
-		test	DFCNTRL, SCSIEN jnz .;
+		test	SCSIOFFSET, 0x7f	jnz ultra2_shutdown;
+ultra2_await_nreq:
+		test	SCSISIGI, REQI	jz ultra2_shutdown;
+		test	SSTAT1, (PHASEMIS|REQINIT)	jz ultra2_await_nreq;
+ultra2_shutdown:
+		and     DFCNTRL, ~(HDMAEN|SCSIEN);
+		test	DFCNTRL, (HDMAEN|SCSIEN) jnz .;
 		bmov	SCB_RESID_DCNT, STCNT, 3;
 		mov	SCB_RESID_SGCNT, SG_COUNT;
 		or	SXFRCTL0, CLRSTCNT|CLRCHN;
@@ -729,10 +616,11 @@
 		test	SSTAT0, SDONE jnz p_command_ultra2_dma_done;
 		test	SSTAT1,PHASEMIS	jz p_command_dma_loop;	/* ie. underrun */
 p_command_ultra2_dma_done:
-		and     DFCNTRL, ~HDMAEN;
-		test	DFCNTRL, HDMAEN jnz .;
-		and	DFCNTRL, ~SCSIEN;
-		test	DFCNTRL, SCSIEN jnz .;
+		test	SCSISIGI, REQI	jz p_command_ultra2_shutdown;
+		test	SSTAT1, (PHASEMIS|REQINIT)	jz p_command_ultra2_dma_done;
+p_command_ultra2_shutdown:
+		and     DFCNTRL, ~(HDMAEN|SCSIEN);
+		test	DFCNTRL, (HDMAEN|SCSIEN) jnz .;
 		or	SXFRCTL0, CLRSTCNT|CLRCHN;
 	}
 	jmp	ITloop;
@@ -1079,22 +967,12 @@
 	mvi	ARG_1	call inb_next; /* ACK the wide_residue and get */
 				       /* the size byte */
 /*
- * See if we'll ignore this wide residue (because it's an overrun byte)
- */
-	test	SCB_RESID_SGCNT,0xff jnz wide_residue_int;
-	test	SCB_RESID_DCNT[0],0xff jnz wide_residue_int;
-	test	SCB_RESID_DCNT[1],0xff jnz wide_residue_int;
-	test	SCB_RESID_DCNT[2],0xff jnz wide_residue_int;
-	jmp	mesgin_done;
-
-wide_residue_int:
-/*
  * In order for this to be reliable, we have to do all sorts of horrible
  * magic in terms of resetting the datafifo and reloading the shadow layer
  * with the correct new values (so that a subsequent save data pointers
  * message will do the right thing).  We let the kernel do that work.
  */
- 	mvi	INTSTAT,WIDE_RESIDUE;
+ 	mvi	INTSTAT, WIDE_RESIDUE;
 	jmp	mesgin_done;
 	
 /*
@@ -1143,17 +1021,6 @@
 inb_last:
 	mov	NONE,SCSIDATL ret;		/*dummy read from latch to ACK*/
 
-if ((p->flags & AHC_TARGETMODE) != 0) {
-	/*
-	 * Send a byte to an initiator in Automatic PIO mode.
-	 * SPIOEN must be on prior to calling this routine.
-	 */
-target_outb:
-	mov	SCSIDATL, SINDEX;
-	test	SSTAT0, SPIORDY	jz .;
-	ret;
-}
-	
 mesgin_phasemis:
 /*
  * We expected to receive another byte, but the target changed phase
@@ -1198,6 +1065,12 @@
  * actually off first lest we get an ILLSADDR.
  */
 dma_dmadone:
+	cmp	LASTPHASE, P_COMMAND	je dma_await_nreq;
+	test	SCSIRATE, 0x0f	jnz dma_shutdown;
+dma_await_nreq:
+	test	SCSISIGI, REQI	jz dma_shutdown;
+	test	SSTAT1, (PHASEMIS|REQINIT)	jz dma_await_nreq;
+dma_shutdown:
 	and	DFCNTRL, ~(SCSIEN|SDMAEN|HDMAEN);
 dma_halt:
 	/*
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/drivers/scsi/aic7xxx.c linux.17p9/drivers/scsi/aic7xxx.c
--- linux.vanilla/drivers/scsi/aic7xxx.c	Fri Apr 21 12:46:27 2000
+++ linux.17p9/drivers/scsi/aic7xxx.c	Thu Jun 22 22:35:41 2000
@@ -270,7 +270,7 @@
     0, 0, 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL
 };
 
-#define AIC7XXX_C_VERSION  "5.1.28"
+#define AIC7XXX_C_VERSION  "5.1.31"
 
 #define NUMBER(arr)     (sizeof(arr) / sizeof(arr[0]))
 #define MIN(a,b)        (((a) < (b)) ? (a) : (b))
@@ -576,7 +576,7 @@
  * AIC-7770 I/O range to reserve for a card
  */
 #define MINREG                0xC00
-#define MAXREG                0xCBF
+#define MAXREG                0xCFF
 
 #define INTDEF                0x5C      /* Interrupt Definition Register */
 
@@ -1491,10 +1491,10 @@
   {
     outb(val, p->base + port);
     mb(); /* locked operation in order to force ordering */
-    inb(p->base + HCNTRL); /* dummy read to flush the write */
   }
 #else
   outb(val, p->base + port);
+  mb(); /* locked operation in order to force ordering */
 #endif
 }
 
@@ -1664,6 +1664,10 @@
   {
     ;
   }
+  if(p->features & AHC_ULTRA2)
+  {
+    aic_inb(p, CCSCBCTL);
+  }
 }
 
 /*+F*************************************************************************
@@ -2133,7 +2137,7 @@
      * Use async transfers for this target
      */
     *options = 0;
-    *period = 0;
+    *period = 255;
     syncrate = NULL;
   }
   return (syncrate);
@@ -2901,6 +2905,7 @@
 #define WIDE_INQUIRY_BITS 0x60
 #define SYNC_INQUIRY_BITS 0x10
 #define SCSI_VERSION_BITS 0x07
+#define SCSI_DT_BIT       0x04
       if ( (buffer[7] & WIDE_INQUIRY_BITS) &&
            (p->features & AHC_WIDE) )
       {
@@ -2919,61 +2924,66 @@
                                                    AHC_TRANS_CUR) );
         unpause_sequencer(p, FALSE);
       }
-      if (buffer[7] & SYNC_INQUIRY_BITS)
+      if ( (buffer[7] & SYNC_INQUIRY_BITS) &&
+            p->transinfo[tindex].user_offset )
       {
-        p->needsdtr |= (1<<tindex);
-        p->needsdtr_copy |= (1<<tindex);
-
         p->transinfo[tindex].goal_period = p->transinfo[tindex].user_period;
         p->transinfo[tindex].goal_options = p->transinfo[tindex].user_options;
-        if (p->transinfo[tindex].user_offset)
+        if (p->features & AHC_ULTRA2)
+          p->transinfo[tindex].goal_offset = MAX_OFFSET_ULTRA2;
+        else if (p->transinfo[tindex].goal_width == MSG_EXT_WDTR_BUS_16_BIT)
+          p->transinfo[tindex].goal_offset = MAX_OFFSET_16BIT;
+        else
+          p->transinfo[tindex].goal_offset = MAX_OFFSET_8BIT;
+        if ( (((buffer[2] & SCSI_VERSION_BITS) == 3) ||
+               (buffer[56] & SCSI_DT_BIT) ||
+	       (p->dev_flags[tindex] & DEVICE_SCSI_3) ) &&
+               (p->transinfo[tindex].user_period <= 9) &&
+               (p->transinfo[tindex].user_options) )
         {
-          if (p->features & AHC_ULTRA2)
-            p->transinfo[tindex].goal_offset = MAX_OFFSET_ULTRA2;
-          else if (p->transinfo[tindex].goal_width == MSG_EXT_WDTR_BUS_16_BIT)
-            p->transinfo[tindex].goal_offset = MAX_OFFSET_16BIT;
-          else
-            p->transinfo[tindex].goal_offset = MAX_OFFSET_8BIT;
+          p->needppr |= (1<<tindex);
+          p->needppr_copy |= (1<<tindex);
+          p->needsdtr &= ~(1<<tindex);
+          p->needsdtr_copy &= ~(1<<tindex);
+          p->needwdtr &= ~(1<<tindex);
+          p->needwdtr_copy &= ~(1<<tindex);
+          p->dev_flags[tindex] |= DEVICE_SCSI_3;
+        }
+        else
+        {
+          p->needsdtr |= (1<<tindex);
+          p->needsdtr_copy |= (1<<tindex);
+          p->transinfo[tindex].goal_period = 
+            MAX(10, p->transinfo[tindex].goal_period);
+          p->transinfo[tindex].goal_options = 0;
         }
       }
       else
       {
         p->needsdtr &= ~(1<<tindex);
         p->needsdtr_copy &= ~(1<<tindex);
-        p->transinfo[tindex].goal_period = 0;
+        p->transinfo[tindex].goal_period = 255;
         p->transinfo[tindex].goal_offset = 0;
         p->transinfo[tindex].goal_options = 0;
       }
-      if ( (buffer[2] & SCSI_VERSION_BITS) == 3 )
+      /*
+       * This is needed to work around a sequencer bug for now.  Regardless
+       * of the controller in use, if we have a Quantum drive, we need to
+       * limit the speed to 80MByte/sec.  As soon as I get a fixed version
+       * of the sequencer, this code will get yanked.
+       */
+      if(!strncmp(buffer + 8, "QUANTUM", 7) &&
+         p->transinfo[tindex].goal_options )
       {
-        p->dev_flags[tindex] |= DEVICE_SCSI_3;
-        /*
-         * OK, we are a SCSI 3 device and we are in need of negotiation.
-         * Use PPR messages instead of WDTR and SDTR messages.
-         */
-        if ( (p->needsdtr & (1<<tindex)) ||
-             (p->needwdtr & (1<<tindex)) )
-        {
-          p->needppr |= (1<<tindex);
-          p->needppr_copy |= (1<<tindex);
-        }
-        p->needwdtr &= ~(1<<tindex);
-        p->needwdtr_copy &= ~(1<<tindex);
-        p->needsdtr &= ~(1<<tindex);
-        p->needsdtr_copy &= ~(1<<tindex);
-        /*
-         * This is needed to work around a sequencer bug for now.  Regardless
-         * of the controller in use, if we have a Quantum drive, we need to
-         * limit the speed to 80MByte/sec.  As soon as I get a fixed version
-         * of the sequencer, this code will get yanked.
-         */
-        if(!strncmp(buffer + 8, "QUANTUM", 7) &&
-           p->transinfo[tindex].goal_options )
-        {
-          p->transinfo[tindex].goal_period = 
-            MAX(p->transinfo[tindex].goal_period, 10);
-          p->transinfo[tindex].goal_options = 0;
-        }
+        p->transinfo[tindex].goal_period = 
+          MAX(p->transinfo[tindex].goal_period, 10);
+        p->transinfo[tindex].goal_options = 0;
+        p->needppr &= ~(1<<tindex);
+        p->needppr_copy &= ~(1<<tindex);
+        p->needsdtr |= (1<<tindex);
+        p->needsdtr_copy |= (1<<tindex);
+        p->needwdtr |= (1<<tindex);
+        p->needwdtr_copy |= (1<<tindex);
       }
       /*
        * Get the INQUIRY checksum.  We use this on Ultra 160/m
@@ -3003,6 +3013,7 @@
 #undef WIDE_INQUIRY_BITS
 #undef SYNC_INQUIRY_BITS
 #undef SCSI_VERSION_BITS
+#undef SCSI_DT_BIT
     }
   }
   else if ((scb->flags & SCB_MSGOUT_BITS) != 0)
@@ -4639,7 +4650,9 @@
            * As per the draft specs, any device capable of supporting any of
            * the option values other than 0 are not allowed to reject the
            * PPR message.  Instead, they must negotiate out what they do
-           * support instead of rejecting our offering.
+           * support instead of rejecting our offering or else they cause
+           * a parity error during msg_out phase to signal that they don't
+           * like our settings.
            */
           p->needppr &= ~target_mask;
           p->needppr_copy &= ~target_mask;
@@ -4817,51 +4830,6 @@
                 scb->sg_count = hscb->SG_segment_count = 1;
                 scb->sg_length = sizeof(cmd->sense_buffer);
                 scb->tag_action = 0;
-                /*
-                 * This problem could be caused if the target has lost power
-                 * or found some other way to loose the negotiation settings,
-                 * so if needed, we'll re-negotiate while doing the sense cmd.
-                 * However, if this SCB already was attempting to negotiate,
-                 * then we assume this isn't the problem and skip this part.
-                 */
-                if ( (scb->cmd->cmnd[0] != TEST_UNIT_READY) &&
-                     (p->dev_flags[tindex] & DEVICE_SCANNED) &&
-                     !(p->dtr_pending & target_mask) ) 
-                {
-                  p->needppr |= (p->needppr_copy & target_mask);
-                  p->needwdtr |= (p->needwdtr_copy & target_mask);
-                  p->needsdtr |= (p->needsdtr_copy & target_mask);
-                }
-                else if ( scb->cmd == p->dev_dtr_cmnd[tindex] )
-                {
-                  /*
-                   * This is already a negotiation command, so we must have
-                   * already done PPR, WDTR or SDTR.  Since our negotiation
-                   * could have gotten rejected, we don't really know the
-                   * full state of things.  Don't do anything here, and allow
-                   * the negotiation_complete() handler to do the right
-                   * thing.
-                   */
-
-                  /*
-                   * This is the important part though.  We are getting sense
-                   * info back from this device.  It's going into a fake
-                   * command.  We need to put that into the real command
-                   * instead so that the mid level SCSI code can act upon it.
-                   * So, when we set up these fake commands, the next pointer
-                   * is used to point to the real command.  Use that to change
-                   * the address of our sense_buffer[] to the real command.
-                   * However, don't do this if the real command is also a
-                   * TEST_UNIT_READY as it will most likely pull down its own
-                   * SENSE information anyway.
-                   */
-                  if (cmd->next->cmnd[0] != TEST_UNIT_READY)
-                  {
-                    scb->sg_list[0].address = 
-                      cpu_to_le32(VIRT_TO_BUS(&cmd->next->sense_buffer[0]));
-                    hscb->data_pointer = scb->sg_list[0].address;
-                  }
-                }
                 scb->flags |= SCB_SENSE;
                 /*
                  * Ensure the target is busy since this will be an
@@ -4884,7 +4852,7 @@
                 aic7xxx_error(cmd) = DID_OK;
                 break;
               }  /* first time sense, no errors */
-              aic7xxx_error(cmd) = DID_OK;
+              aic7xxx_error(cmd) = DID_ERROR;
               scb->flags &= ~SCB_SENSE;
               break;
 
@@ -5135,51 +5103,14 @@
         }
         else if (scb->flags & SCB_MSGOUT_PPR)
         {
-          unsigned int max_sync, period;
-          unsigned char options = 0;
-
-          if (p->features & AHC_ULTRA2)
-          {
-            if ( (aic_inb(p, SBLKCTL) & ENAB40) &&
-                !(aic_inb(p, SSTAT2) & EXP_ACTIVE) )
-            {
-              if( (p->features & AHC_ULTRA3) &&
-                  (p->dev_flags[tindex] & DEVICE_SCSI_3) &&
-                  (p->transinfo[tindex].goal_width ==
-                   MSG_EXT_WDTR_BUS_16_BIT) &&
-                  (p->transinfo[tindex].goal_options != 0) )
-              {
-                max_sync = AHC_SYNCRATE_ULTRA3;
-                options = p->transinfo[tindex].goal_options;
-              }
-              else
-              {
-                max_sync = AHC_SYNCRATE_ULTRA2;
-              }
-            }
-            else
-            {
-              max_sync = AHC_SYNCRATE_ULTRA;
-            }
-          }
-          else if (p->features & AHC_ULTRA)
-          {
-            max_sync = AHC_SYNCRATE_ULTRA;
-          }
-          else
-          {
-            max_sync = AHC_SYNCRATE_FAST;
-          }
-          period = p->transinfo[tindex].goal_period;
-          aic7xxx_find_syncrate(p, &period, max_sync, &options);
-          p->transinfo[tindex].goal_period = period;
-          p->transinfo[tindex].goal_options = options;
           if (aic7xxx_verbose & VERBOSE_NEGOTIATION2)
           {
             printk(INFO_LEAD "Sending PPR (%d/%d/%d/%d) message.\n",
-                   p->host_no, CTL_OF_SCB(scb), period,
+                   p->host_no, CTL_OF_SCB(scb),
+                   p->transinfo[tindex].goal_period,
                    p->transinfo[tindex].goal_offset,
-                   p->transinfo[tindex].goal_width, options);
+                   p->transinfo[tindex].goal_width,
+                   p->transinfo[tindex].goal_options);
           }
           aic7xxx_construct_ppr(p, scb);
         }
@@ -5225,8 +5156,7 @@
           if (aic7xxx_verbose & VERBOSE_NEGOTIATION2)
           {
             printk(INFO_LEAD "Sending SDTR %d/%d message.\n", p->host_no,
-                   CTL_OF_SCB(scb),
-                   p->transinfo[tindex].goal_period,
+                   CTL_OF_SCB(scb), period,
                    p->transinfo[tindex].goal_offset);
           }
           aic7xxx_construct_sdtr(p, period,
@@ -5339,7 +5269,7 @@
         resid_sgcnt = aic_inb(p, SCB_RESID_SGCNT);
         resid_dcnt = aic_inb(p, SCB_RESID_DCNT) |
           (aic_inb(p, SCB_RESID_DCNT + 1) << 8) |
-          (aic_inb(p, SCB_RESID_DCNT + 2) << 24);
+          (aic_inb(p, SCB_RESID_DCNT + 2) << 16);
         index = scb->sg_count - (resid_sgcnt + 1);
         native_addr = le32_to_cpu(scb->sg_list[index].address);
         native_length = le32_to_cpu(scb->sg_list[index].length);
@@ -5347,7 +5277,7 @@
          * Make sure this is a valid sg_seg for the given pointer
          */
         if(cur_addr < native_addr ||
-           cur_addr > (native_addr + native_length))
+           cur_addr > (native_addr + native_length + 1))
         {
           printk(WARN_LEAD "invalid cur_addr:0x%x during WIDE_RESIDUE\n",
                  p->host_no, CTL_OF_SCB(scb), cur_addr);
@@ -5364,16 +5294,31 @@
                    p->host_no, CTL_OF_SCB(scb),
                    le32_to_cpu(scb->sg_list[index + 1].address),
                    le32_to_cpu(scb->sg_list[index + 1].length));
+          printk(WARN_LEAD "  cur_address:0x%x resid_dcnt:0x%06x\n",
+                 p->host_no, CTL_OF_SCB(scb),
+                 cur_addr, resid_dcnt);
           break;
         }
 
-        /*
-         * If our current address matches the sg_seg->address then we
-         * have to back up the sg array to the previous segment and set
-         * it up to have only one byte of transfer left to go.
-         */
-        if(cur_addr == native_addr)
+        if( (resid_sgcnt == 0) &&
+            ((resid_dcnt == 0) || (resid_dcnt == 0xffffff)))
         {
+          /*
+           * We are at the end of the transfer and this is about a byte
+           * we ignored already (because the sequencer knew this was
+           * the last segment and set the adapter to ignore any wide
+           * residue bytes that might come through, which is only done
+           * on the last scatter gather segment of transfers).
+           */
+          break;
+        }
+        else if(cur_addr == native_addr)
+        {
+          /*
+           * If our current address matches the sg_seg->address then we
+           * have to back up the sg array to the previous segment and set
+           * it up to have only one byte of transfer left to go.
+           */
           if(index == 0)
           {
             printk(WARN_LEAD "bogus WIDE_RESIDUE message, no data has been "
@@ -5403,39 +5348,6 @@
           aic_outb(p, (cur_addr >> 8) & 0xff, HADDR + 1);
           aic_outb(p, (cur_addr >> 16) & 0xff, HADDR + 2);
           aic_outb(p, (cur_addr >> 24) & 0xff, HADDR + 3);
-          /*
-           * The sequencer actually wants to find the new address and byte
-           * count in the SHCNT and SHADDR register sets.  These registers
-           * are a shadow of the regular HCNT and HADDR registers.  On the
-           * Ultra2 controllers, these registers are read only and the way
-           * we have to set their values is to put the values we want into
-           * the HCNT and HADDR registers and then output PRELOADEN into
-           * the DFCNTRL register which causes the card to latch the current
-           * values in the HADDR and HCNT registers and drop it through to
-           * the shadow registers.  On older cards we copy them directly
-           * across by hand.
-           */
-          if(p->features & AHC_ULTRA2)
-          {
-            aic_outb(p, aic_inb(p, DMAPARAMS), DFCNTRL);
-            i=0;
-            udelay(1);
-            while(((aic_inb(p, SSTAT0) & SDONE) != 0) && (i++ < 1000))
-            {
-              aic_outb(p, aic_inb(p, DMAPARAMS), DFCNTRL);
-              udelay(1);
-            }
-          }
-          else
-          {
-            aic_outb(p, 1, STCNT); 
-            aic_outb(p, 0, STCNT + 1); 
-            aic_outb(p, 0, STCNT + 2); 
-            aic_outb(p, cur_addr & 0xff, SHADDR);
-            aic_outb(p, (cur_addr >> 8) & 0xff, SHADDR + 1);
-            aic_outb(p, (cur_addr >> 16) & 0xff, SHADDR + 2);
-            aic_outb(p, (cur_addr >> 24) & 0xff, SHADDR + 3);
-          }
         }
         else
         {
@@ -5455,28 +5367,46 @@
           aic_outb(p, (cur_addr >> 8) & 0xff, HADDR + 1);
           aic_outb(p, (cur_addr >> 16) & 0xff, HADDR + 2);
           aic_outb(p, (cur_addr >> 24) & 0xff, HADDR + 3);
-          if(p->features & AHC_ULTRA2)
+        }
+        /*
+         * The sequencer actually wants to find the new address and byte
+         * count in the SHCNT and SHADDR register sets.  These registers
+         * are a shadow of the regular HCNT and HADDR registers.  On the
+         * Ultra2 controllers, these registers are read only and the way
+         * we have to set their values is to put the values we want into
+         * the HCNT and HADDR registers and then output PRELOADEN into
+         * the DFCNTRL register which causes the card to latch the current
+         * values in the HADDR and HCNT registers and drop it through to
+         * the shadow registers.  On older cards we copy them directly
+         * across by hand.
+         */
+        if(p->features & AHC_ULTRA2)
+        {
+          aic_outb(p, aic_inb(p, DMAPARAMS), DFCNTRL);
+          i=0;
+          udelay(1);
+          while(((aic_inb(p, SSTAT0) & SDONE) != 0) && (i++ < 1000))
           {
-            aic_outb(p, aic_inb(p, DMAPARAMS), DFCNTRL);
-            i=0;
             udelay(1);
-            while(((aic_inb(p, SSTAT0) & SDONE) != 0) && (i++ < 1000))
-            {
-              aic_outb(p, aic_inb(p, DMAPARAMS), DFCNTRL);
-              udelay(1);
-            }
           }
-          else
+          aic_outb(p, aic_inb(p, DMAPARAMS) & ~(SCSIEN|HDMAEN), DFCNTRL);
+          i=0;
+          udelay(1);
+          while(((aic_inb(p, DFCNTRL) & (SCSIEN|HDMAEN)) != 0) && (i++ < 1000))
           {
-            aic_outb(p, resid_dcnt & 0xff, STCNT); 
-            aic_outb(p, (resid_dcnt >> 8) & 0xff, STCNT + 1); 
-            aic_outb(p, (resid_dcnt >> 16) & 0xff, STCNT + 2); 
-            aic_outb(p, cur_addr & 0xff, SHADDR);
-            aic_outb(p, (cur_addr >> 8) & 0xff, SHADDR + 1);
-            aic_outb(p, (cur_addr >> 16) & 0xff, SHADDR + 2);
-            aic_outb(p, (cur_addr >> 24) & 0xff, SHADDR + 3);
+            udelay(1);
           }
         }
+        else
+        {
+          aic_outb(p, resid_dcnt & 0xff, STCNT); 
+          aic_outb(p, (resid_dcnt >> 8) & 0xff, STCNT + 1); 
+          aic_outb(p, (resid_dcnt >> 16) & 0xff, STCNT + 2); 
+          aic_outb(p, cur_addr & 0xff, SHADDR);
+          aic_outb(p, (cur_addr >> 8) & 0xff, SHADDR + 1);
+          aic_outb(p, (cur_addr >> 16) & 0xff, SHADDR + 2);
+          aic_outb(p, (cur_addr >> 24) & 0xff, SHADDR + 3);
+        }
       }
       break;
 
@@ -5885,6 +5815,7 @@
           reply = TRUE;
           scb->flags &= ~SCB_MSGOUT_BITS;
           scb->flags |= SCB_MSGOUT_PPR;
+	  p->dev_flags[tindex] |= DEVICE_SCSI_3;
           if (!(p->dev_flags[tindex] & DEVICE_SCANNED))
           {
             /*
@@ -5918,7 +5849,6 @@
               p->transinfo[tindex].user_width;
             p->transinfo[tindex].goal_options =
               p->transinfo[tindex].user_options;
-            p->needppr_copy |= target_mask;
           }
           if (aic7xxx_verbose & VERBOSE_NEGOTIATION2)
           {
@@ -5952,6 +5882,25 @@
               break;
             }
           }
+          if ( (p->transinfo[tindex].goal_period > 9) ||
+               (p->transinfo[tindex].goal_options == 0) )
+          {
+            scb->flags &= ~SCB_MSGOUT_BITS;
+            reject = TRUE;
+            reply = FALSE;
+            p->needppr &= ~(1 << tindex);
+            p->needppr_copy &= ~(1 << tindex);
+            if ( p->transinfo[tindex].goal_offset )
+            {
+              p->needsdtr |= (1 << tindex);
+              p->needsdtr_copy |= (1 << tindex);
+            }
+            if ( p->transinfo[tindex].goal_width )
+            {
+              p->needwdtr |= (1 << tindex);
+              p->needwdtr_copy |= (1 << tindex);
+            }
+          }
         }
         else
         {
@@ -5959,7 +5908,7 @@
           {
             default:
             {
-              reply = TRUE;
+              reject = TRUE;
               if ( (aic7xxx_verbose & VERBOSE_NEGOTIATION2) &&
                    ((p->dev_flags[tindex] & DEVICE_PRINT_DTR) ||
                     (aic7xxx_verbose > 0xffff)) )
@@ -5985,27 +5934,18 @@
           }
         }
 
-        aic7xxx_set_width(p, target, channel, lun, bus_width,
-                          AHC_TRANS_ACTIVE|AHC_TRANS_CUR);
-        syncrate = aic7xxx_find_syncrate(p, &period, maxsync,
-                                         &new_trans_options);
-        aic7xxx_validate_offset(p, syncrate, &offset, bus_width);
-        aic7xxx_set_syncrate(p, syncrate, target, channel, period,
-                             offset, new_trans_options,
-                             AHC_TRANS_ACTIVE|AHC_TRANS_CUR);
-
-        if( (offset != saved_offset) ||
-            (trans_options != new_trans_options) ||
-            ((scb->flags & (SCB_MSGOUT_SENT|SCB_MSGOUT_PPR)) !=
-             (SCB_MSGOUT_SENT|SCB_MSGOUT_PPR)) )
+        if ( !reject )
         {
           aic7xxx_set_width(p, target, channel, lun, bus_width,
-                            AHC_TRANS_GOAL|AHC_TRANS_QUITE);
+                            AHC_TRANS_ACTIVE|AHC_TRANS_CUR);
+          syncrate = aic7xxx_find_syncrate(p, &period, maxsync,
+                                           &new_trans_options);
+          aic7xxx_validate_offset(p, syncrate, &offset, bus_width);
           aic7xxx_set_syncrate(p, syncrate, target, channel, period,
                                offset, new_trans_options,
-                               AHC_TRANS_GOAL|AHC_TRANS_QUITE);
-          reply = TRUE;
+                               AHC_TRANS_ACTIVE|AHC_TRANS_CUR);
         }
+
         p->dtr_pending &= ~target_mask;
         p->needppr &= ~target_mask;
         if(reply)
@@ -6411,20 +6351,14 @@
     /*
      * Keep the sequencer from trying to restart any selections
      */
-    aic_outb(p, 0, SCSISEQ);
+    aic_outb(p, aic_inb(p, SCSISEQ) & ~ENSELO, SCSISEQ);
     /*
      * Make sure the data bits on the bus are released
+     * Don't do this on 7770 chipsets, it makes them give us
+     * a BRKADDRINT and kills the card.
      */
-    if(p->features & AHC_WIDE)
-      aic_outb(p, 0, SCSIBUSH);
-    aic_outb(p, 0, SCSIBUSL);
-    /*
-     * Clear the target id bit from the SCSI bus
-     */
-    if(p->features & AHC_ULTRA2)
-      aic_outb(p, aic_inb(p, SCSIID_ULTRA2) & 0x0f, SCSIID_ULTRA2);
-    else
-      aic_outb(p, aic_inb(p, SCSIID) & 0x0f, SCSIID);
+    if( (p->chip & ~AHC_CHIPID_MASK) == AHC_PCI )
+      aic_outb(p, 0, SCSIBUSL);
 
     /*
      * Delay for the selection timeout delay period then stop the selection
@@ -6507,7 +6441,9 @@
      * A parity error has occurred during a data
      * transfer phase. Flag it and continue.
      */
-    if( (aic_inb(p, SCSIRATE) & AHC_SYNCRATE_CRC) && (lastphase == P_DATAIN) )
+    if( (p->features & AHC_ULTRA3) && 
+        (aic_inb(p, SCSIRATE) & AHC_SYNCRATE_CRC) &&
+        (lastphase == P_DATAIN) )
     {
       printk(WARN_LEAD "CRC error during %s phase.\n",
              p->host_no, CTL_OF_SCB(scb), phase);
@@ -6532,13 +6468,50 @@
                p->host_no, CTL_OF_SCB(scb));
       }
     }
-    else
+    else if( (lastphase == P_MESGOUT) &&
+             (cmd == p->dev_dtr_cmnd[tindex]) &&
+             (scb->flags & SCB_MSGOUT_PPR) )
     {
-      printk(WARN_LEAD "Parity error during %s phase.\n",
-             p->host_no, CTL_OF_SCB(scb), phase);
+      /*
+       * As per the draft specs, any device capable of supporting any of
+       * the option values other than 0 are not allowed to reject the
+       * PPR message.  Instead, they must negotiate out what they do
+       * support instead of rejecting our offering or else they cause
+       * a parity error during msg_out phase to signal that they don't
+       * like our settings.
+       */
+      p->needppr &= ~(1 << tindex);
+      p->needppr_copy &= ~(1 << tindex);
+      aic7xxx_set_width(p, scb->cmd->target, scb->cmd->channel, scb->cmd->lun,
+                        MSG_EXT_WDTR_BUS_8_BIT,
+                        (AHC_TRANS_ACTIVE|AHC_TRANS_CUR|AHC_TRANS_QUITE));
+      aic7xxx_set_syncrate(p, NULL, scb->cmd->target, scb->cmd->channel, 0, 0,
+                           0, AHC_TRANS_ACTIVE|AHC_TRANS_CUR|AHC_TRANS_QUITE);
+      p->transinfo[tindex].goal_options = 0;
+      p->dtr_pending &= ~(1 << tindex);
+      scb->flags &= ~SCB_MSGOUT_BITS;
+      if(aic7xxx_verbose & VERBOSE_NEGOTIATION2)
+      {
+        printk(INFO_LEAD "parity error during PPR message, reverting "
+               "to WDTR/SDTR\n", p->host_no, CTL_OF_SCB(scb));
+      }
+      if ( p->transinfo[tindex].goal_width )
+      {
+        p->needwdtr |= (1 << tindex);
+        p->needwdtr_copy |= (1 << tindex);
+      }
+      if ( p->transinfo[tindex].goal_offset )
+      {
+        if( p->transinfo[tindex].goal_period <= 9 )
+        {
+          p->transinfo[tindex].goal_period = 10;
+        }
+        p->needsdtr |= (1 << tindex);
+        p->needsdtr_copy |= (1 << tindex);
+      }
+      scb = NULL;
     }
-
-    if(p->dev_flags[tindex] & DEVICE_PARITY_ERROR)
+    else if(p->dev_flags[tindex] & DEVICE_PARITY_ERROR)
     {
       struct aic7xxx_syncrate *syncrate;
       unsigned int period = p->transinfo[tindex].cur_period;
@@ -6550,6 +6523,8 @@
        * instead of slowing down if those exist.  That's hard to do with simple
        * checksums though.
        */
+      printk(WARN_LEAD "Parity error during %s phase.\n",
+             p->host_no, CTL_OF_SCB(scb), phase);
       if((syncrate = aic7xxx_find_syncrate(p, &period, 0, &options)) != NULL)
       {
         syncrate++;
@@ -6557,20 +6532,59 @@
             (!(p->features & AHC_ULTRA2) || (syncrate->sxfr_ultra2 == 0)) )
         {
           p->transinfo[tindex].goal_period = syncrate->period;
-          if( !(syncrate->sxfr_ultra2 & 0x40) )
+          if( p->transinfo[tindex].goal_period > 9 )
           {
             p->transinfo[tindex].goal_options = 0;
+            p->needppr &= ~(1<<tindex);
+            p->needsdtr |= (1<<tindex);
+            p->needppr_copy &= ~(1<<tindex);
+            p->needsdtr_copy |= (1<<tindex);
+            if (p->transinfo[tindex].goal_width)
+            {
+              p->needwdtr |= (1<<tindex);
+              p->needwdtr_copy |= (1<<tindex);
+            }
+          }
+        }
+        else if (p->transinfo[tindex].goal_width)
+        {
+          p->transinfo[tindex].goal_width = 0;
+          p->needwdtr &= ~(1<<tindex);
+          p->needwdtr_copy &= ~(1<<tindex);
+          p->transinfo[tindex].goal_offset =
+            p->transinfo[tindex].user_offset;
+          p->transinfo[tindex].goal_period =
+            p->transinfo[tindex].user_period;
+          p->transinfo[tindex].goal_options =
+            p->transinfo[tindex].user_options;
+          if( p->transinfo[tindex].goal_period <= 9 )
+          {
+            p->needppr |= (1<<tindex);
+            p->needsdtr &= ~(1<<tindex);
+            p->needppr_copy |= (1<<tindex);
+            p->needsdtr_copy &= ~(1<<tindex);
+          }
+          else
+          {
+            p->needppr &= ~(1<<tindex);
+            p->needsdtr |= (1<<tindex);
+            p->needppr_copy &= ~(1<<tindex);
+            p->needsdtr_copy |= (1<<tindex);
           }
         }
         else
         {
           p->transinfo[tindex].goal_offset = 0;
-          p->transinfo[tindex].goal_period = 0;
+          p->transinfo[tindex].goal_period = 255;
           p->transinfo[tindex].goal_options = 0;
+          p->transinfo[tindex].goal_width = 0;
+          p->needppr &= ~(1<<tindex);
+          p->needsdtr &= ~(1<<tindex);
+          p->needwdtr &= ~(1<<tindex);
+          p->needppr_copy &= ~(1<<tindex);
+          p->needsdtr_copy &= ~(1<<tindex);
+          p->needwdtr_copy &= ~(1<<tindex);
         }
-        p->needppr |= (p->needppr_copy & (1<<tindex));
-        p->needsdtr |= (p->needsdtr_copy & (1<<tindex));
-        p->needwdtr |= (p->needwdtr_copy & (1<<tindex));
       }
       p->dev_flags[tindex] &= ~DEVICE_PARITY_ERROR;
     }
@@ -6588,6 +6602,7 @@
     if (mesg_out != MSG_NOOP)
     {
       aic_outb(p, mesg_out, MSG_OUT);
+      aic_outb(p, aic_inb(p, SCSISIGI) | ATNO, SCSISIGO);
       scb = NULL;
     }
     aic_outb(p, CLRSCSIPERR, CLRSINT1);
@@ -6779,7 +6794,7 @@
 {
   struct aic7xxx_scb *scb = NULL;
   Scsi_Cmnd *cmd;
-  unsigned char scb_index;
+  unsigned char scb_index, tindex;
 
 #ifdef AIC7XXX_VERBOSE_DEBUGGING
   if( (p->isr_count < 16) && (aic7xxx_verbose > 0xffff) )
@@ -6805,23 +6820,21 @@
     scb_index = p->qoutfifo[p->qoutfifonext];
     p->qoutfifo[p->qoutfifonext++] = SCB_LIST_NULL;
     if ( scb_index >= p->scb_data->numscbs )
-      scb = NULL;
-    else
-      scb = p->scb_data->scb_array[scb_index];
-    if (scb == NULL)
     {
       printk(WARN_LEAD "CMDCMPLT with invalid SCB index %d\n", p->host_no,
         -1, -1, -1, scb_index);
       continue;
     }
-    else if (!(scb->flags & SCB_ACTIVE) || (scb->cmd == NULL))
+    scb = p->scb_data->scb_array[scb_index];
+    if (!(scb->flags & SCB_ACTIVE) || (scb->cmd == NULL))
     {
       printk(WARN_LEAD "CMDCMPLT without command for SCB %d, SCB flags "
         "0x%x, cmd 0x%lx\n", p->host_no, -1, -1, -1, scb_index, scb->flags,
         (unsigned long) scb->cmd);
       continue;
     }
-    else if (scb->flags & SCB_QUEUED_ABORT)
+    tindex = TARGET_INDEX(scb->cmd);
+    if (scb->flags & SCB_QUEUED_ABORT)
     {
       pause_sequencer(p);
       if ( ((aic_inb(p, LASTPHASE) & PHASE_MASK) != P_BUSFREE) &&
@@ -6844,6 +6857,43 @@
        */
       scb->flags &= ~(SCB_ABORT|SCB_RESET);
     }
+    else if (scb->flags & SCB_SENSE)
+    {
+      char *buffer = &scb->cmd->sense_buffer[0];
+      if (scb->cmd == p->dev_dtr_cmnd[tindex])
+      {
+        struct aic7xxx_scb *old_scb;
+        /*
+         * We have valid sense data, send it back immediately.
+         */
+        old_scb = p->scb_data->scb_array[scb->cmd->next->tag];
+        *old_scb->cmd->sense_buffer = *scb->cmd->sense_buffer;
+        old_scb->hscb->target_status = scb->hscb->target_status;
+        old_scb->cmd->result = scb->hscb->target_status;
+        old_scb->cmd->result |= (DID_ERROR << 16);
+        aic7xxx_status(old_scb->cmd) = scb->hscb->target_status;
+        scbq_remove(&p->waiting_scbs, old_scb);
+        scbq_remove(&p->delayed_scbs[tindex], old_scb);
+        scb->cmd->next = NULL;
+	aic7xxx_done(p, scb);
+        aic7xxx_done(p, old_scb);
+	continue;
+      } 
+      else if (buffer[12] == 0x47 || buffer[12] == 0x54)
+      {
+        /*
+         * SCSI errors, run domain validation and re-run negotiation
+         */
+        p->needdv |= (1<<tindex);
+        /*
+         * Signal that we need to re-negotiate things, this also gets us our
+         * INQUIRY command to re-checksum off of.
+         */
+        p->needppr |= (p->needppr_copy & (1<<tindex));
+        p->needsdtr |= (p->needsdtr_copy & (1<<tindex));
+        p->needwdtr |= (p->needwdtr_copy & (1<<tindex));
+      }
+    }
     switch (status_byte(scb->hscb->target_status))
     {
       case QUEUE_FULL:
@@ -6973,6 +7023,13 @@
 
   if (intstat & SEQINT)
   {
+    /*
+     * Read the CCSCBCTL register to work around a bug in the Ultra2 cards
+     */
+    if(p->features & AHC_ULTRA2)
+    {
+      aic_inb(p, CCSCBCTL);
+    }
     aic7xxx_handle_seqint(p, intstat);
   }
 
@@ -7055,7 +7112,7 @@
  *   with queue depths for individual devices.  It also allows tagged
  *   queueing to be [en|dis]abled for a specific adapter.
  *-F*************************************************************************/
-static void
+static int
 aic7xxx_device_queue_depth(struct aic7xxx_host *p, Scsi_Device *device)
 {
   int default_depth = 3;
@@ -7065,6 +7122,14 @@
   tindex = device->id | (device->channel << 3);
   target_mask = (1 << tindex);
 
+  if (p->dev_max_queue_depth[tindex] > 1)
+  {
+    /*
+     * We've already scanned this device, leave it alone
+     */
+    return(p->dev_max_queue_depth[tindex]);
+  }
+
   device->queue_depth = default_depth;
   p->dev_temp_queue_depth[tindex] = 1;
   p->dev_max_queue_depth[tindex] = 1;
@@ -7133,6 +7198,7 @@
       }
     }
   }
+  return(p->dev_max_queue_depth[tindex]);
 }
 
 /*+F*************************************************************************
@@ -7160,8 +7226,7 @@
   {
     if (device->host == host)
     {
-      aic7xxx_device_queue_depth(p, device);
-      scbnum += device->queue_depth;
+      scbnum += aic7xxx_device_queue_depth(p, device);
     }
   }
   while (scbnum > p->scb_data->numscbs)
@@ -8371,23 +8436,8 @@
   }
   aic_outb(p, 0, SEQ_FLAGS);
 
-  /*
-   * We are starting to do real work on the card....it's possible we could
-   * generate some spurious interrupts at this point, especially in the
-   * event of a PCI error or some such.  If there are other devices already
-   * registered on the same interrupt as us, this could cause the machine
-   * to lock up.  So, we disable the interrupt this card is on until we
-   * finish our card setup.  We only need to do this for modules, if we are
-   * compiled into the kernel then interrupts are already off during this
-   * part of the code.
-   */
-#ifdef MODULE
-  disable_irq(p->irq);
-#endif
-
   detect_maxscb(p);
 
-
   printk("%d/%d SCBs\n", p->scb_data->maxhscbs, p->scb_data->maxscbs);
   if (aic7xxx_verbose & VERBOSE_PROBE2)
   {
@@ -8616,9 +8666,6 @@
       printk("(scsi%d) Unable to allocate hardware SCB array; "
              "failing detection.\n", p->host_no);
       aic_outb(p, 0, SIMODE1);
-#ifdef MODULE
-      enable_irq(p->irq);
-#endif
       p->irq = 0;
       return(0);
     }
@@ -8796,9 +8843,6 @@
     printk(KERN_WARNING "(scsi%d) Couldn't register IRQ %d, ignoring "
            "controller.\n", p->host_no, p->irq);
     aic_outb(p, 0, SIMODE1);
-#ifdef MODULE
-    enable_irq(p->irq);
-#endif
     p->irq = 0;
     return (0);
   }
@@ -8808,10 +8852,6 @@
       p->host_no, -1, -1 , -1);
   aic7xxx_clear_intstat(p);
 
-#ifdef MODULE
-  enable_irq(p->irq);
-#endif
-
   unpause_sequencer(p, /* unpause_always */ TRUE);
 
   return (found);
@@ -8920,7 +8960,7 @@
     p->orderedtag = 0;
     for (i=0; i<MAX_TARGETS; i++)
     {
-      p->transinfo[i].goal_period = 0;
+      p->transinfo[i].goal_period = 255;
       p->transinfo[i].goal_offset = 0;
       p->transinfo[i].goal_options = 0;
       p->transinfo[i].goal_width = MSG_EXT_WDTR_BUS_8_BIT;
@@ -9709,7 +9749,8 @@
           {
             if ( ((current_p->pci_bus == temp_p->pci_bus) &&
                   (current_p->pci_device_fn == temp_p->pci_device_fn)) ||
-                  (current_p->base == temp_p->base) )
+                 (temp_p->base && (current_p->base == temp_p->base)) ||
+                 (temp_p->mbase && (current_p->mbase == temp_p->mbase)) )
             {
               /* duplicate PCI entry, skip it */
               kfree(temp_p);
@@ -9769,7 +9810,8 @@
           {
             if ( ((current_p->pci_bus == temp_p->pci_bus) &&
                   (current_p->pci_device_fn == temp_p->pci_device_fn)) ||
-                  (current_p->base == temp_p->base) )
+                 (temp_p->base && (current_p->base == temp_p->base)) ||
+                 (temp_p->mbase && (current_p->mbase == temp_p->mbase)) )
             {
               /* duplicate PCI entry, skip it */
               kfree(temp_p);
@@ -9812,7 +9854,7 @@
 #endif /* AIC7XXX_STRICT_PCI_SETUP */
 #endif /* LINUIX_VERSION_CODE > KERNEL_VERSION(2,1,92) */
 
-          if(check_region(temp_p->base, MAXREG - MINREG))
+          if(temp_p->base && check_region(temp_p->base, MAXREG - MINREG))
           {
             printk("aic7xxx: <%s> at PCI %d/%d/%d\n", 
               board_names[aic_pdevs[i].board_name_index],
@@ -9843,7 +9885,7 @@
           }
 
 #ifdef MMAPIO
-          if ( !(temp_p->flags & AHC_MULTI_CHANNEL) ||
+          if ( !(temp_p->base) || !(temp_p->flags & AHC_MULTI_CHANNEL) ||
                ((temp_p->chip != (AHC_AIC7870 | AHC_PCI)) &&
                 (temp_p->chip != (AHC_AIC7880 | AHC_PCI))) )
           {
@@ -9881,6 +9923,18 @@
                 vfree((void *) (((unsigned long) temp_p->maddr) & PAGE_MASK));
 #endif
                 temp_p->maddr = 0;
+                if(temp_p->base == 0)
+                {
+                  printk("aic7xxx: <%s> at PCI %d/%d/%d\n", 
+                    board_names[aic_pdevs[i].board_name_index],
+                    temp_p->pci_bus,
+                    PCI_SLOT(temp_p->pci_device_fn),
+                    PCI_FUNC(temp_p->pci_device_fn));
+                  printk("aic7xxx: Controller disabled by BIOS, ignoring.\n");
+                  kfree(temp_p);
+                  temp_p = NULL;
+                  continue;
+                }
               }
             }
           }
@@ -9889,7 +9943,8 @@
           /*
            * Lock out other contenders for our i/o space.
            */
-          request_region(temp_p->base, MAXREG - MINREG, "aic7xxx");
+          if(temp_p->base)
+            request_region(temp_p->base, MAXREG - MINREG, "aic7xxx");
 
           /*
            * We HAVE to make sure the first pause_sequencer() and all other
@@ -10801,20 +10856,59 @@
               (!(p->features & AHC_ULTRA2) || (syncrate->sxfr_ultra2 == 0)) )
           {
             p->transinfo[tindex].goal_period = syncrate->period;
-            if( !(syncrate->sxfr_ultra2 & 0x40) )
+            if( p->transinfo[tindex].goal_period > 9 )
             {
               p->transinfo[tindex].goal_options = 0;
+              p->needppr &= ~(1<<tindex);
+              p->needsdtr |= (1<<tindex);
+              p->needppr_copy &= ~(1<<tindex);
+              p->needsdtr_copy |= (1<<tindex);
+              if (p->transinfo[tindex].goal_width)
+              {
+                p->needwdtr |= (1<<tindex);
+                p->needwdtr_copy |= (1<<tindex);
+              }
+            }
+          }
+          else if (p->transinfo[tindex].goal_width)
+          {
+            p->transinfo[tindex].goal_width = 0;
+            p->needwdtr &= ~(1<<tindex);
+            p->needwdtr_copy &= ~(1<<tindex);
+            p->transinfo[tindex].goal_offset =
+              p->transinfo[tindex].user_offset;
+            p->transinfo[tindex].goal_period =
+              p->transinfo[tindex].user_period;
+            p->transinfo[tindex].goal_options =
+              p->transinfo[tindex].user_options;
+            if( p->transinfo[tindex].goal_period <= 9 )
+            {
+              p->needppr |= (1<<tindex);
+              p->needsdtr &= ~(1<<tindex);
+              p->needppr_copy |= (1<<tindex);
+              p->needsdtr_copy &= ~(1<<tindex);
+            }
+            else
+            {
+              p->needppr &= ~(1<<tindex);
+              p->needsdtr |= (1<<tindex);
+              p->needppr_copy &= ~(1<<tindex);
+              p->needsdtr_copy |= (1<<tindex);
             }
           }
           else
           {
             p->transinfo[tindex].goal_offset = 0;
-            p->transinfo[tindex].goal_period = 0;
+            p->transinfo[tindex].goal_period = 255;
             p->transinfo[tindex].goal_options = 0;
+            p->transinfo[tindex].goal_width = 0;
+            p->needppr &= ~(1<<tindex);
+            p->needsdtr &= ~(1<<tindex);
+            p->needwdtr &= ~(1<<tindex);
+            p->needppr_copy &= ~(1<<tindex);
+            p->needsdtr_copy &= ~(1<<tindex);
+            p->needwdtr_copy &= ~(1<<tindex);
           }
-          p->needppr |= (p->needppr_copy & (1<<tindex));
-          p->needsdtr |= (p->needsdtr_copy & (1<<tindex));
-          p->needwdtr |= (p->needwdtr_copy & (1<<tindex));
         }
         p->needdv &= ~(1<<tindex);
       }
@@ -10865,8 +10959,16 @@
    * and we didn't follow up with SDTR yet, then this will get it started.
    * For all other cases, this should work out to be a no-op, unless we are
    * doing domain validation and happen to need a new negotiation command.
+   *
+   * In case we don't want this to go any further, the cmdcmplt interrupt
+   * handler will NULL out the cmd->next entry so that the real SCSI command
+   * can be sent back to the mid layer code with SENSE data intact.  We'll
+   * finish things up when the cmd gets sent back down to us, so no worries.
    */
-  aic7xxx_build_negotiation_cmnd(p, cmd->next, tindex);
+  if(cmd->next)
+  {
+    aic7xxx_build_negotiation_cmnd(p, cmd->next, tindex);
+  }
   return;
 }
 
@@ -10988,13 +11090,13 @@
    */
   hscb->control = 0;
   scb->tag_action = 0;
+  cmd->tag = hscb->tag;
   if (p->discenable & mask)
   {
     hscb->control |= DISCENB;
     if ( (p->tagenable & mask) &&
          (cmd->cmnd[0] != TEST_UNIT_READY) )
     {
-      cmd->tag = hscb->tag;
       p->dev_commands_sent[tindex]++;
       if (p->dev_commands_sent[tindex] < 200)
       {
@@ -12275,7 +12377,8 @@
 
   if(p->irq)
     free_irq(p->irq, p);
-  release_region(p->base, MAXREG - MINREG);
+  if(p->base)
+    release_region(p->base, MAXREG - MINREG);
 #ifdef MMAPIO
   if(p->maddr)
   {
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/drivers/scsi/aic7xxx_seq.c linux.17p9/drivers/scsi/aic7xxx_seq.c
--- linux.vanilla/drivers/scsi/aic7xxx_seq.c	Fri Apr 21 12:46:27 2000
+++ linux.17p9/drivers/scsi/aic7xxx_seq.c	Thu Jun 22 22:35:41 2000
@@ -4,34 +4,33 @@
 static unsigned char seqprog[] = {
 	0xff, 0x6a, 0x06, 0x08,
 	0x7f, 0x02, 0x04, 0x08,
-	0x32, 0x6a, 0x00, 0x00,
 	0x12, 0x6a, 0x00, 0x00,
 	0xff, 0x6a, 0xd6, 0x09,
 	0xff, 0x6a, 0xdc, 0x09,
-	0x00, 0x65, 0x44, 0x59,
+	0x00, 0x65, 0xca, 0x58,
 	0xf7, 0x01, 0x02, 0x08,
 	0xff, 0x4e, 0xc8, 0x08,
 	0xbf, 0x60, 0xc0, 0x08,
-	0x60, 0x0b, 0x88, 0x68,
-	0x40, 0x00, 0x0e, 0x68,
+	0x60, 0x0b, 0x86, 0x68,
+	0x40, 0x00, 0x0c, 0x68,
 	0x08, 0x1f, 0x3e, 0x10,
-	0x60, 0x0b, 0x88, 0x68,
-	0x40, 0x00, 0x0e, 0x68,
+	0x60, 0x0b, 0x86, 0x68,
+	0x40, 0x00, 0x0c, 0x68,
 	0x08, 0x1f, 0x3e, 0x10,
-	0xff, 0x3e, 0x4a, 0x60,
-	0x40, 0xfa, 0x12, 0x78,
+	0xff, 0x3e, 0x48, 0x60,
+	0x40, 0xfa, 0x10, 0x78,
 	0xff, 0xf6, 0xd4, 0x08,
 	0x01, 0x4e, 0x9c, 0x18,
 	0x40, 0x60, 0xc0, 0x00,
-	0x00, 0x4d, 0x12, 0x70,
+	0x00, 0x4d, 0x10, 0x70,
 	0x01, 0x4e, 0x9c, 0x18,
 	0xbf, 0x60, 0xc0, 0x08,
-	0x00, 0x6a, 0xbe, 0x5c,
+	0x00, 0x6a, 0x3e, 0x5c,
 	0xff, 0x4e, 0xc8, 0x18,
-	0x02, 0x6a, 0xd4, 0x5b,
+	0x02, 0x6a, 0x54, 0x5b,
 	0xff, 0x52, 0x20, 0x09,
 	0x0d, 0x6a, 0x6a, 0x00,
-	0x00, 0x52, 0x4a, 0x5c,
+	0x00, 0x52, 0xca, 0x5b,
 	0x03, 0xb0, 0x52, 0x31,
 	0xff, 0xb0, 0x52, 0x09,
 	0xff, 0xb1, 0x54, 0x09,
@@ -40,8 +39,8 @@
 	0xff, 0x3e, 0x74, 0x09,
 	0xff, 0x90, 0x7c, 0x08,
 	0xff, 0x3e, 0x20, 0x09,
-	0x00, 0x65, 0x50, 0x58,
-	0x00, 0x65, 0x0e, 0x40,
+	0x00, 0x65, 0x4e, 0x58,
+	0x00, 0x65, 0x0c, 0x40,
 	0xf7, 0x1f, 0xca, 0x08,
 	0x08, 0xa1, 0xc8, 0x08,
 	0x00, 0x65, 0xca, 0x00,
@@ -56,88 +55,28 @@
 	0x5a, 0x6a, 0x00, 0x04,
 	0x12, 0x65, 0x02, 0x00,
 	0x31, 0x6a, 0xca, 0x00,
-	0x80, 0x37, 0x70, 0x68,
+	0x80, 0x37, 0x6e, 0x68,
 	0xff, 0x65, 0xca, 0x18,
 	0xff, 0x37, 0xdc, 0x08,
 	0xff, 0x6e, 0xc8, 0x08,
-	0x00, 0x6c, 0x78, 0x78,
+	0x00, 0x6c, 0x76, 0x78,
 	0x20, 0x01, 0x02, 0x00,
 	0x4c, 0x37, 0xc8, 0x28,
-	0x08, 0x1f, 0x80, 0x78,
+	0x08, 0x1f, 0x7e, 0x78,
 	0x08, 0x37, 0x6e, 0x00,
 	0x08, 0x64, 0xc8, 0x00,
 	0x70, 0x64, 0xca, 0x18,
 	0xff, 0x6c, 0x0a, 0x08,
 	0x20, 0x64, 0xca, 0x18,
 	0xff, 0x6c, 0x08, 0x0c,
-	0x40, 0x0b, 0x10, 0x69,
-	0x80, 0x0b, 0x02, 0x79,
-	0xa4, 0x6a, 0x06, 0x00,
-	0x40, 0x6a, 0x16, 0x00,
-	0x10, 0x03, 0xfe, 0x78,
-	0xff, 0x50, 0xc8, 0x08,
-	0x88, 0x6a, 0xcc, 0x00,
-	0x49, 0x6a, 0x3a, 0x5c,
-	0x01, 0x6a, 0x26, 0x01,
-	0xff, 0x6a, 0xca, 0x08,
-	0x08, 0x01, 0x02, 0x00,
-	0x02, 0x0b, 0x9e, 0x78,
-	0xf7, 0x01, 0x02, 0x08,
-	0xff, 0x06, 0xcc, 0x08,
-	0xff, 0x66, 0x32, 0x09,
-	0x01, 0x65, 0xca, 0x18,
-	0x80, 0x66, 0xac, 0x78,
-	0xff, 0x66, 0xa2, 0x08,
-	0x10, 0x03, 0x9c, 0x68,
-	0xfc, 0x65, 0xc8, 0x18,
-	0x00, 0x65, 0xb4, 0x48,
-	0xff, 0x6a, 0x32, 0x01,
-	0x01, 0x64, 0x18, 0x19,
-	0xff, 0x6a, 0x1a, 0x09,
-	0xff, 0x6a, 0x1c, 0x09,
-	0x84, 0x6a, 0x06, 0x00,
-	0x08, 0x01, 0x02, 0x00,
-	0x02, 0x0b, 0xbe, 0x78,
-	0xff, 0x06, 0xc8, 0x08,
-	0xff, 0x64, 0x32, 0x09,
-	0xff, 0x6a, 0xca, 0x08,
-	0x5b, 0x64, 0xc8, 0x28,
-	0x00, 0x62, 0xc4, 0x18,
-	0xfc, 0x65, 0xca, 0x18,
-	0xff, 0x6a, 0xd4, 0x08,
-	0xfa, 0x65, 0xca, 0x18,
-	0xff, 0x6a, 0xd4, 0x08,
-	0x04, 0x65, 0xca, 0x18,
-	0x0b, 0x65, 0xca, 0x18,
-	0xff, 0x65, 0xc8, 0x08,
-	0x00, 0x8c, 0x18, 0x19,
-	0x02, 0x0b, 0xda, 0x78,
-	0x01, 0x65, 0xe0, 0x60,
-	0xf7, 0x01, 0x02, 0x08,
-	0xff, 0x06, 0x32, 0x09,
-	0xff, 0x65, 0xca, 0x18,
-	0xff, 0x65, 0xda, 0x68,
-	0x0a, 0x93, 0x26, 0x01,
-	0x00, 0x65, 0xb0, 0x5c,
-	0x40, 0x51, 0xf2, 0x78,
-	0xe4, 0x6a, 0x06, 0x00,
-	0x08, 0x01, 0x02, 0x00,
-	0x04, 0x6a, 0x6c, 0x5b,
-	0x01, 0x50, 0xa0, 0x18,
-	0x00, 0x50, 0xf8, 0xe0,
-	0xff, 0x6a, 0xa0, 0x08,
-	0xff, 0x6a, 0x3a, 0x01,
-	0x02, 0x6a, 0x22, 0x01,
-	0x40, 0x51, 0xfe, 0x68,
-	0xff, 0x6a, 0x06, 0x08,
-	0x00, 0x65, 0x0e, 0x40,
+	0x40, 0x0b, 0x96, 0x68,
 	0x20, 0x6a, 0x16, 0x00,
 	0xf0, 0x19, 0x6e, 0x08,
 	0x08, 0x6a, 0x18, 0x00,
 	0x08, 0x11, 0x22, 0x00,
-	0x08, 0x6a, 0x68, 0x58,
+	0x08, 0x6a, 0x66, 0x58,
 	0x08, 0x6a, 0x68, 0x00,
-	0x00, 0x65, 0x24, 0x41,
+	0x00, 0x65, 0xaa, 0x40,
 	0x12, 0x6a, 0x00, 0x00,
 	0x40, 0x6a, 0x16, 0x00,
 	0xff, 0x3e, 0x20, 0x09,
@@ -145,24 +84,24 @@
 	0xff, 0xa1, 0x6e, 0x08,
 	0x08, 0x6a, 0x18, 0x00,
 	0x08, 0x11, 0x22, 0x00,
-	0x08, 0x6a, 0x68, 0x58,
+	0x08, 0x6a, 0x66, 0x58,
 	0x80, 0x6a, 0x68, 0x00,
 	0x80, 0x36, 0x6c, 0x00,
-	0x00, 0x65, 0x1e, 0x5c,
+	0x00, 0x65, 0x9e, 0x5b,
 	0xff, 0x3d, 0xc8, 0x08,
-	0xbf, 0x64, 0x5c, 0x79,
-	0x80, 0x64, 0x24, 0x72,
-	0xa0, 0x64, 0x54, 0x72,
-	0xc0, 0x64, 0x4c, 0x72,
-	0xe0, 0x64, 0x94, 0x72,
+	0xbf, 0x64, 0xe2, 0x78,
+	0x80, 0x64, 0xac, 0x71,
+	0xa0, 0x64, 0xdc, 0x71,
+	0xc0, 0x64, 0xd4, 0x71,
+	0xe0, 0x64, 0x1c, 0x72,
 	0x01, 0x6a, 0x22, 0x01,
-	0x00, 0x65, 0x24, 0x41,
+	0x00, 0x65, 0xaa, 0x40,
 	0xf7, 0x11, 0x22, 0x08,
-	0x00, 0x65, 0x44, 0x59,
+	0x00, 0x65, 0xca, 0x58,
 	0xff, 0x06, 0xd4, 0x08,
 	0xf7, 0x01, 0x02, 0x08,
-	0x09, 0x0c, 0x3e, 0x79,
-	0x08, 0x0c, 0x0e, 0x68,
+	0x09, 0x0c, 0xc4, 0x78,
+	0x08, 0x0c, 0x0c, 0x68,
 	0x01, 0x6a, 0x22, 0x01,
 	0xff, 0x6a, 0x26, 0x09,
 	0x02, 0x6a, 0x08, 0x30,
@@ -174,25 +113,25 @@
 	0x03, 0xa9, 0x18, 0x31,
 	0x03, 0xa9, 0x10, 0x30,
 	0x08, 0x6a, 0xcc, 0x00,
-	0xa9, 0x6a, 0x34, 0x5c,
-	0x00, 0x65, 0x7c, 0x41,
+	0xa9, 0x6a, 0xb4, 0x5b,
+	0x00, 0x65, 0x02, 0x41,
 	0xa8, 0x6a, 0x6a, 0x00,
 	0x79, 0x6a, 0x6a, 0x00,
-	0x40, 0x3d, 0x64, 0x69,
+	0x40, 0x3d, 0xea, 0x68,
 	0x04, 0x35, 0x6a, 0x00,
-	0x00, 0x65, 0x8e, 0x5b,
+	0x00, 0x65, 0x0e, 0x5b,
 	0x80, 0x6a, 0xd4, 0x01,
-	0x10, 0x36, 0x50, 0x69,
+	0x10, 0x36, 0xd6, 0x68,
 	0x10, 0x36, 0x6c, 0x00,
 	0x07, 0xac, 0x10, 0x31,
 	0x03, 0x8c, 0x10, 0x30,
 	0x05, 0xa3, 0x70, 0x30,
 	0x88, 0x6a, 0xcc, 0x00,
-	0xac, 0x6a, 0x2c, 0x5c,
-	0x00, 0x65, 0x26, 0x5c,
+	0xac, 0x6a, 0xac, 0x5b,
+	0x00, 0x65, 0xa6, 0x5b,
 	0x38, 0x6a, 0xcc, 0x00,
-	0xa3, 0x6a, 0x30, 0x5c,
-	0xff, 0x38, 0x8c, 0x69,
+	0xa3, 0x6a, 0xb0, 0x5b,
+	0xff, 0x38, 0x12, 0x69,
 	0x80, 0x02, 0x04, 0x00,
 	0xe7, 0x35, 0x6a, 0x08,
 	0x03, 0x69, 0x18, 0x31,
@@ -200,337 +139,334 @@
 	0xff, 0x6a, 0x10, 0x00,
 	0xff, 0x6a, 0x12, 0x00,
 	0xff, 0x6a, 0x14, 0x00,
-	0x01, 0x38, 0x92, 0x61,
+	0x01, 0x38, 0x18, 0x61,
 	0xbf, 0x35, 0x6a, 0x08,
 	0x02, 0x6a, 0xf8, 0x01,
 	0xff, 0x69, 0xca, 0x08,
 	0xff, 0x35, 0x26, 0x09,
-	0x04, 0x0b, 0x96, 0x69,
-	0x04, 0x0b, 0xa2, 0x69,
-	0x10, 0x0c, 0x98, 0x79,
-	0x04, 0x0b, 0xa2, 0x69,
+	0x04, 0x0b, 0x1c, 0x69,
+	0x04, 0x0b, 0x28, 0x69,
+	0x10, 0x0c, 0x1e, 0x79,
+	0x04, 0x0b, 0x28, 0x69,
 	0xff, 0x6a, 0xca, 0x08,
-	0x00, 0x35, 0x76, 0x5b,
-	0x80, 0x02, 0xf6, 0x69,
-	0xff, 0x65, 0xe6, 0x79,
+	0x00, 0x35, 0xee, 0x5a,
+	0x80, 0x02, 0x7c, 0x69,
+	0xff, 0x65, 0x6c, 0x79,
 	0xff, 0x38, 0x70, 0x18,
-	0xff, 0x38, 0xe6, 0x79,
-	0x80, 0xea, 0xc2, 0x61,
+	0xff, 0x38, 0x6c, 0x79,
+	0x80, 0xea, 0x48, 0x61,
 	0xef, 0x38, 0xc8, 0x18,
 	0x80, 0x6a, 0xc8, 0x00,
-	0x00, 0x65, 0xb4, 0x49,
+	0x00, 0x65, 0x3a, 0x49,
 	0x33, 0x38, 0xc8, 0x28,
 	0xff, 0x64, 0xd0, 0x09,
 	0x04, 0x39, 0xc0, 0x31,
 	0x09, 0x6a, 0xd6, 0x01,
-	0x80, 0xeb, 0xba, 0x79,
+	0x80, 0xeb, 0x40, 0x79,
 	0xf7, 0xeb, 0xd6, 0x09,
-	0x08, 0xeb, 0xbe, 0x69,
+	0x08, 0xeb, 0x44, 0x69,
 	0x01, 0x6a, 0xd6, 0x01,
 	0x08, 0xe9, 0x10, 0x31,
 	0x03, 0x8c, 0x10, 0x30,
 	0x88, 0x6a, 0xcc, 0x00,
-	0x39, 0x6a, 0x32, 0x5c,
+	0x39, 0x6a, 0xb2, 0x5b,
 	0x08, 0x6a, 0x18, 0x01,
 	0xff, 0x6a, 0x1a, 0x09,
 	0xff, 0x6a, 0x1c, 0x09,
 	0x0d, 0x93, 0x26, 0x01,
-	0x00, 0x65, 0xb0, 0x5c,
-	0x88, 0x6a, 0xa0, 0x5c,
-	0x00, 0x65, 0x26, 0x5c,
+	0x00, 0x65, 0x30, 0x5c,
+	0x88, 0x6a, 0x20, 0x5c,
+	0x00, 0x65, 0xa6, 0x5b,
 	0xff, 0x6a, 0xc8, 0x08,
 	0x08, 0x39, 0x72, 0x18,
 	0x00, 0x3a, 0x74, 0x20,
-	0x01, 0x0c, 0xde, 0x79,
-	0x10, 0x0c, 0x7c, 0x79,
+	0x01, 0x0c, 0x64, 0x79,
+	0x10, 0x0c, 0x02, 0x79,
 	0xff, 0x35, 0x26, 0x09,
-	0x04, 0x0b, 0xe4, 0x69,
-	0x00, 0x65, 0xfe, 0x59,
+	0x04, 0x0b, 0x6a, 0x69,
+	0x00, 0x65, 0x84, 0x59,
 	0x03, 0x08, 0x52, 0x31,
 	0xff, 0x38, 0x50, 0x09,
 	0xff, 0x08, 0x52, 0x09,
 	0xff, 0x09, 0x54, 0x09,
 	0xff, 0x0a, 0x56, 0x09,
 	0xff, 0x38, 0x50, 0x09,
-	0x00, 0x65, 0x24, 0x41,
-	0x00, 0x65, 0xfe, 0x59,
+	0x00, 0x65, 0xaa, 0x40,
+	0x00, 0x65, 0x84, 0x59,
 	0x7f, 0x02, 0x04, 0x08,
 	0xe1, 0x6a, 0x22, 0x01,
-	0x00, 0x65, 0x24, 0x41,
-	0x04, 0x93, 0x14, 0x6a,
+	0x00, 0x65, 0xaa, 0x40,
+	0x04, 0x93, 0x9a, 0x69,
 	0xdf, 0x93, 0x26, 0x09,
-	0x20, 0x93, 0x02, 0x6a,
+	0x20, 0x93, 0x88, 0x69,
 	0x02, 0x93, 0x26, 0x01,
-	0x01, 0x94, 0x04, 0x7a,
-	0x01, 0x94, 0x04, 0x7a,
-	0x01, 0x94, 0x04, 0x7a,
-	0x01, 0x94, 0x04, 0x7a,
-	0x01, 0x94, 0x04, 0x7a,
-	0x01, 0x94, 0x04, 0x7a,
-	0x10, 0x94, 0x12, 0x6a,
-	0xf7, 0x93, 0x26, 0x09,
-	0x08, 0x93, 0x16, 0x6a,
-	0xdf, 0x93, 0x26, 0x09,
-	0x20, 0x93, 0x1a, 0x6a,
+	0x01, 0x94, 0x8a, 0x79,
+	0x01, 0x94, 0x8a, 0x79,
+	0x01, 0x94, 0x8a, 0x79,
+	0x01, 0x94, 0x8a, 0x79,
+	0x01, 0x94, 0x8a, 0x79,
+	0x01, 0x94, 0x8a, 0x79,
+	0x10, 0x94, 0x98, 0x69,
+	0x7f, 0x05, 0xa0, 0x69,
+	0x02, 0x03, 0xa0, 0x79,
+	0x11, 0x0c, 0x9c, 0x79,
+	0xd7, 0x93, 0x26, 0x09,
+	0x28, 0x93, 0xa2, 0x69,
 	0x03, 0x08, 0x52, 0x31,
 	0xff, 0x38, 0x50, 0x09,
 	0x12, 0x01, 0x02, 0x00,
 	0xff, 0x6a, 0xd4, 0x0c,
-	0x00, 0x65, 0x8e, 0x5b,
+	0x00, 0x65, 0x0e, 0x5b,
 	0x05, 0xb4, 0x10, 0x31,
 	0x02, 0x6a, 0x1a, 0x31,
 	0x03, 0x8c, 0x10, 0x30,
 	0x88, 0x6a, 0xcc, 0x00,
-	0xb4, 0x6a, 0x30, 0x5c,
+	0xb4, 0x6a, 0xb0, 0x5b,
 	0xff, 0x6a, 0x1a, 0x09,
 	0xff, 0x6a, 0x1c, 0x09,
-	0x00, 0x65, 0x26, 0x5c,
-	0x3d, 0x6a, 0x76, 0x5b,
+	0x00, 0x65, 0xa6, 0x5b,
+	0x3d, 0x6a, 0xee, 0x5a,
 	0xac, 0x6a, 0x26, 0x01,
-	0x04, 0x0b, 0x3a, 0x6a,
-	0x04, 0x0b, 0x40, 0x6a,
-	0x10, 0x0c, 0x3c, 0x7a,
-	0xf7, 0x93, 0x26, 0x09,
-	0x08, 0x93, 0x42, 0x6a,
-	0xdf, 0x93, 0x26, 0x09,
-	0x20, 0x93, 0x46, 0x6a,
+	0x04, 0x0b, 0xc2, 0x69,
+	0x04, 0x0b, 0xc8, 0x69,
+	0x10, 0x0c, 0xc4, 0x79,
+	0x02, 0x03, 0xcc, 0x79,
+	0x11, 0x0c, 0xc8, 0x79,
+	0xd7, 0x93, 0x26, 0x09,
+	0x28, 0x93, 0xce, 0x69,
 	0x12, 0x01, 0x02, 0x00,
-	0x00, 0x65, 0x24, 0x41,
-	0x00, 0x65, 0x8e, 0x5b,
+	0x00, 0x65, 0xaa, 0x40,
+	0x00, 0x65, 0x0e, 0x5b,
 	0xff, 0x06, 0x44, 0x09,
-	0x00, 0x65, 0x24, 0x41,
+	0x00, 0x65, 0xaa, 0x40,
 	0x10, 0x3d, 0x06, 0x00,
 	0xff, 0x34, 0xca, 0x08,
-	0x80, 0x65, 0x78, 0x62,
+	0x80, 0x65, 0x00, 0x62,
 	0x0f, 0xa1, 0xca, 0x08,
 	0x07, 0xa1, 0xca, 0x08,
 	0x40, 0xa0, 0xc8, 0x08,
 	0x00, 0x65, 0xca, 0x00,
 	0x80, 0x65, 0xca, 0x00,
-	0x80, 0xa0, 0x68, 0x7a,
+	0x80, 0xa0, 0xf0, 0x79,
 	0xff, 0x65, 0x0c, 0x08,
-	0x00, 0x65, 0x7a, 0x42,
-	0x20, 0xa0, 0x80, 0x7a,
+	0x00, 0x65, 0x02, 0x42,
+	0x20, 0xa0, 0x08, 0x7a,
 	0xff, 0x65, 0x0c, 0x08,
-	0x00, 0x65, 0x1e, 0x5c,
-	0xa0, 0x3d, 0x88, 0x62,
+	0x00, 0x65, 0x9e, 0x5b,
+	0xa0, 0x3d, 0x10, 0x62,
 	0x23, 0xa0, 0x0c, 0x08,
-	0x00, 0x65, 0x1e, 0x5c,
-	0xa0, 0x3d, 0x88, 0x62,
-	0x00, 0xb9, 0x80, 0x42,
-	0xff, 0x65, 0x80, 0x62,
+	0x00, 0x65, 0x9e, 0x5b,
+	0xa0, 0x3d, 0x10, 0x62,
+	0x00, 0xb9, 0x08, 0x42,
+	0xff, 0x65, 0x08, 0x62,
 	0xa1, 0x6a, 0x22, 0x01,
 	0xff, 0x6a, 0xd4, 0x08,
-	0x10, 0x51, 0x88, 0x72,
+	0x10, 0x51, 0x10, 0x72,
 	0x40, 0x6a, 0x18, 0x00,
 	0xff, 0x65, 0x0c, 0x08,
-	0x00, 0x65, 0x1e, 0x5c,
-	0xa0, 0x3d, 0x52, 0x72,
+	0x00, 0x65, 0x9e, 0x5b,
+	0xa0, 0x3d, 0xda, 0x71,
 	0x40, 0x6a, 0x18, 0x00,
 	0xff, 0x34, 0xa6, 0x08,
-	0x80, 0x34, 0x90, 0x62,
+	0x80, 0x34, 0x18, 0x62,
 	0x7f, 0xa0, 0x40, 0x09,
 	0x08, 0x6a, 0x68, 0x00,
-	0x00, 0x65, 0x24, 0x41,
-	0x64, 0x6a, 0x66, 0x5b,
-	0x80, 0x64, 0x06, 0x6b,
-	0x04, 0x64, 0xe8, 0x72,
-	0x02, 0x64, 0xee, 0x72,
-	0x00, 0x6a, 0xb0, 0x72,
-	0x03, 0x64, 0x02, 0x73,
-	0x01, 0x64, 0xe4, 0x72,
-	0x07, 0x64, 0x44, 0x73,
-	0x08, 0x64, 0xac, 0x72,
-	0x23, 0x64, 0x48, 0x73,
+	0x00, 0x65, 0xaa, 0x40,
+	0x64, 0x6a, 0xe4, 0x5a,
+	0x80, 0x64, 0x8e, 0x6a,
+	0x04, 0x64, 0x70, 0x72,
+	0x02, 0x64, 0x76, 0x72,
+	0x00, 0x6a, 0x38, 0x72,
+	0x03, 0x64, 0x8a, 0x72,
+	0x01, 0x64, 0x6c, 0x72,
+	0x07, 0x64, 0xcc, 0x72,
+	0x08, 0x64, 0x34, 0x72,
+	0x23, 0x64, 0xd0, 0x72,
 	0x11, 0x6a, 0x22, 0x01,
-	0x07, 0x6a, 0x58, 0x5b,
+	0x07, 0x6a, 0xd6, 0x5a,
 	0xff, 0x06, 0xd4, 0x08,
-	0x00, 0x65, 0x24, 0x41,
-	0xff, 0xa8, 0xb4, 0x6a,
-	0xff, 0xa2, 0xcc, 0x7a,
+	0x00, 0x65, 0xaa, 0x40,
+	0xff, 0xa8, 0x3c, 0x6a,
+	0xff, 0xa2, 0x54, 0x7a,
 	0x01, 0x6a, 0x6a, 0x00,
-	0x00, 0xb9, 0x4a, 0x5c,
-	0xff, 0xa2, 0xcc, 0x7a,
+	0x00, 0xb9, 0xca, 0x5b,
+	0xff, 0xa2, 0x54, 0x7a,
 	0x71, 0x6a, 0x22, 0x01,
 	0xff, 0x6a, 0xd4, 0x08,
-	0x40, 0x51, 0xcc, 0x62,
+	0x40, 0x51, 0x54, 0x62,
 	0x0d, 0x6a, 0x6a, 0x00,
-	0x00, 0xb9, 0x4a, 0x5c,
+	0x00, 0xb9, 0xca, 0x5b,
 	0xff, 0x3e, 0x74, 0x09,
 	0xff, 0x90, 0x7c, 0x08,
-	0x00, 0x65, 0x50, 0x58,
-	0x00, 0x65, 0x36, 0x41,
-	0x20, 0xa0, 0xd4, 0x6a,
+	0x00, 0x65, 0x4e, 0x58,
+	0x00, 0x65, 0xbc, 0x40,
+	0x20, 0xa0, 0x5c, 0x6a,
 	0xff, 0x37, 0xc8, 0x08,
-	0x00, 0x6a, 0xf4, 0x5b,
-	0xff, 0x6a, 0x0a, 0x5c,
+	0x00, 0x6a, 0x74, 0x5b,
+	0xff, 0x6a, 0x8a, 0x5b,
 	0xff, 0xf8, 0xc8, 0x08,
 	0xff, 0x4f, 0xc8, 0x08,
-	0x01, 0x6a, 0xf4, 0x5b,
-	0x00, 0xb9, 0x0a, 0x5c,
+	0x01, 0x6a, 0x74, 0x5b,
+	0x00, 0xb9, 0x8a, 0x5b,
 	0x01, 0x4f, 0x9e, 0x18,
 	0x02, 0x6a, 0x22, 0x01,
-	0x00, 0x65, 0xb8, 0x5c,
-	0x00, 0x65, 0x36, 0x41,
+	0x00, 0x65, 0x38, 0x5c,
+	0x00, 0x65, 0xbc, 0x40,
 	0x41, 0x6a, 0x22, 0x01,
-	0x00, 0x65, 0x24, 0x41,
+	0x00, 0x65, 0xaa, 0x40,
 	0x04, 0xa0, 0x40, 0x01,
-	0x00, 0x65, 0xd0, 0x5c,
-	0x00, 0x65, 0x36, 0x41,
-	0x10, 0x36, 0xac, 0x7a,
+	0x00, 0x65, 0x50, 0x5c,
+	0x00, 0x65, 0xbc, 0x40,
+	0x10, 0x36, 0x34, 0x7a,
 	0x05, 0x38, 0x46, 0x31,
 	0x04, 0x14, 0x58, 0x31,
 	0x03, 0xa9, 0x60, 0x31,
 	0xa3, 0x6a, 0xcc, 0x00,
-	0x38, 0x6a, 0x30, 0x5c,
+	0x38, 0x6a, 0xb0, 0x5b,
 	0xac, 0x6a, 0xcc, 0x00,
-	0x14, 0x6a, 0x32, 0x5c,
-	0xa9, 0x6a, 0x34, 0x5c,
-	0x00, 0x65, 0xac, 0x42,
+	0x14, 0x6a, 0xb2, 0x5b,
+	0xa9, 0x6a, 0xb4, 0x5b,
+	0x00, 0x65, 0x34, 0x42,
 	0xef, 0x36, 0x6c, 0x08,
-	0x00, 0x65, 0xac, 0x42,
+	0x00, 0x65, 0x34, 0x42,
 	0x0f, 0x64, 0xc8, 0x08,
 	0x07, 0x64, 0xc8, 0x08,
 	0x00, 0x37, 0x6e, 0x00,
 	0xff, 0x6a, 0xa4, 0x00,
-	0x00, 0x65, 0xc4, 0x5b,
-	0xff, 0x51, 0x18, 0x73,
-	0x20, 0x36, 0x22, 0x7b,
-	0x00, 0x90, 0xb2, 0x5b,
-	0x00, 0x65, 0x24, 0x43,
+	0x00, 0x65, 0x44, 0x5b,
+	0xff, 0x51, 0xa0, 0x72,
+	0x20, 0x36, 0xaa, 0x7a,
+	0x00, 0x90, 0x32, 0x5b,
+	0x00, 0x65, 0xac, 0x42,
 	0xff, 0x06, 0xd4, 0x08,
-	0x00, 0x65, 0x1e, 0x5c,
-	0xe0, 0x3d, 0x3e, 0x63,
-	0x20, 0x12, 0x3e, 0x63,
-	0x51, 0x6a, 0x5c, 0x5b,
-	0x00, 0x65, 0xac, 0x5b,
+	0x00, 0x65, 0x9e, 0x5b,
+	0xe0, 0x3d, 0xc6, 0x62,
+	0x20, 0x12, 0xc6, 0x62,
+	0x51, 0x6a, 0xda, 0x5a,
+	0x00, 0x65, 0x2c, 0x5b,
 	0xff, 0x37, 0xc8, 0x08,
-	0x00, 0xa1, 0x36, 0x63,
-	0x04, 0xa0, 0x36, 0x7b,
+	0x00, 0xa1, 0xbe, 0x62,
+	0x04, 0xa0, 0xbe, 0x7a,
 	0xfb, 0xa0, 0x40, 0x09,
 	0x80, 0x36, 0x6c, 0x00,
-	0x80, 0xa0, 0xac, 0x7a,
+	0x80, 0xa0, 0x34, 0x7a,
 	0x7f, 0xa0, 0x40, 0x09,
-	0xff, 0x6a, 0x58, 0x5b,
-	0x00, 0x65, 0xac, 0x42,
-	0x04, 0xa0, 0x3c, 0x7b,
-	0x00, 0x65, 0xd0, 0x5c,
-	0x00, 0x65, 0x3e, 0x43,
-	0x00, 0x65, 0xb8, 0x5c,
+	0xff, 0x6a, 0xd6, 0x5a,
+	0x00, 0x65, 0x34, 0x42,
+	0x04, 0xa0, 0xc4, 0x7a,
+	0x00, 0x65, 0x50, 0x5c,
+	0x00, 0x65, 0xc6, 0x42,
+	0x00, 0x65, 0x38, 0x5c,
 	0x31, 0x6a, 0x22, 0x01,
-	0x0c, 0x6a, 0x58, 0x5b,
-	0x00, 0x65, 0xac, 0x42,
+	0x0c, 0x6a, 0xd6, 0x5a,
+	0x00, 0x65, 0x34, 0x42,
 	0x61, 0x6a, 0x22, 0x01,
-	0x00, 0x65, 0xac, 0x42,
-	0x51, 0x6a, 0x5c, 0x5b,
-	0xff, 0xa8, 0x54, 0x6b,
-	0xff, 0xa9, 0x54, 0x6b,
-	0xff, 0xaa, 0x54, 0x6b,
-	0xff, 0xab, 0x54, 0x6b,
-	0x00, 0x65, 0xac, 0x42,
+	0x00, 0x65, 0x34, 0x42,
+	0x51, 0x6a, 0xda, 0x5a,
 	0x51, 0x6a, 0x22, 0x01,
-	0x00, 0x65, 0xac, 0x42,
+	0x00, 0x65, 0x34, 0x42,
 	0x10, 0x3d, 0x06, 0x00,
 	0xff, 0x65, 0x68, 0x0c,
 	0xff, 0x06, 0xd4, 0x08,
-	0x01, 0x0c, 0x5e, 0x7b,
-	0x04, 0x0c, 0x60, 0x6b,
+	0x01, 0x0c, 0xdc, 0x7a,
+	0x04, 0x0c, 0xde, 0x6a,
 	0xe0, 0x03, 0x7a, 0x08,
-	0xe0, 0x3d, 0x72, 0x63,
+	0xe0, 0x3d, 0xea, 0x62,
 	0xff, 0x65, 0xcc, 0x08,
 	0xff, 0x12, 0xda, 0x0c,
 	0xff, 0x06, 0xd4, 0x0c,
-	0xff, 0x65, 0x0c, 0x08,
-	0x02, 0x0b, 0x6e, 0x7b,
-	0xff, 0x6a, 0xd4, 0x0c,
 	0xd1, 0x6a, 0x22, 0x01,
-	0x00, 0x65, 0x24, 0x41,
+	0x00, 0x65, 0xaa, 0x40,
 	0xff, 0x65, 0x26, 0x09,
-	0x01, 0x0b, 0x86, 0x6b,
-	0x10, 0x0c, 0x78, 0x7b,
-	0x04, 0x0b, 0x80, 0x6b,
+	0x01, 0x0b, 0xfe, 0x6a,
+	0x10, 0x0c, 0xf0, 0x7a,
+	0x04, 0x0b, 0xf8, 0x6a,
 	0xff, 0x6a, 0xca, 0x08,
-	0x04, 0x93, 0x84, 0x6b,
-	0x01, 0x94, 0x82, 0x7b,
-	0x10, 0x94, 0x84, 0x6b,
+	0x04, 0x93, 0xfc, 0x6a,
+	0x01, 0x94, 0xfa, 0x7a,
+	0x10, 0x94, 0xfc, 0x6a,
+	0x80, 0x3d, 0x02, 0x73,
+	0x0f, 0x04, 0x06, 0x6b,
+	0x02, 0x03, 0x06, 0x7b,
+	0x11, 0x0c, 0x02, 0x7b,
 	0xc7, 0x93, 0x26, 0x09,
 	0xff, 0x99, 0xd4, 0x08,
-	0x38, 0x93, 0x88, 0x6b,
+	0x38, 0x93, 0x08, 0x6b,
 	0xff, 0x6a, 0xd4, 0x0c,
-	0x80, 0x36, 0x8c, 0x6b,
+	0x80, 0x36, 0x0c, 0x6b,
 	0x21, 0x6a, 0x22, 0x05,
 	0xff, 0x65, 0x20, 0x09,
-	0xff, 0x51, 0x9a, 0x63,
+	0xff, 0x51, 0x1a, 0x63,
 	0xff, 0x37, 0xc8, 0x08,
-	0xa1, 0x6a, 0xa6, 0x43,
+	0xa1, 0x6a, 0x26, 0x43,
 	0xff, 0x51, 0xc8, 0x08,
-	0xb9, 0x6a, 0xa6, 0x43,
+	0xb9, 0x6a, 0x26, 0x43,
 	0xff, 0x90, 0xa4, 0x08,
-	0xff, 0xba, 0xaa, 0x73,
+	0xff, 0xba, 0x2a, 0x73,
 	0xff, 0xba, 0x20, 0x09,
 	0xff, 0x65, 0xca, 0x18,
-	0x00, 0x6c, 0x9e, 0x63,
+	0x00, 0x6c, 0x1e, 0x63,
 	0xff, 0x90, 0xca, 0x0c,
 	0xff, 0x6a, 0xca, 0x04,
-	0x20, 0x36, 0xbe, 0x7b,
-	0x00, 0x90, 0x92, 0x5b,
-	0xff, 0x65, 0xbe, 0x73,
-	0xff, 0x52, 0xbc, 0x73,
+	0x20, 0x36, 0x3e, 0x7b,
+	0x00, 0x90, 0x12, 0x5b,
+	0xff, 0x65, 0x3e, 0x73,
+	0xff, 0x52, 0x3c, 0x73,
 	0xff, 0xba, 0xcc, 0x08,
 	0xff, 0x52, 0x20, 0x09,
 	0xff, 0x66, 0x74, 0x09,
 	0xff, 0x65, 0x20, 0x0d,
 	0xff, 0xba, 0x7e, 0x0c,
-	0x00, 0x6a, 0xbe, 0x5c,
+	0x00, 0x6a, 0x3e, 0x5c,
 	0x0d, 0x6a, 0x6a, 0x00,
-	0x00, 0x51, 0x4a, 0x44,
-	0xff, 0x3f, 0x18, 0x74,
+	0x00, 0x51, 0xca, 0x43,
+	0xff, 0x3f, 0x98, 0x73,
 	0xff, 0x6a, 0xa2, 0x00,
-	0x00, 0x3f, 0x92, 0x5b,
-	0xff, 0x65, 0x18, 0x74,
+	0x00, 0x3f, 0x12, 0x5b,
+	0xff, 0x65, 0x98, 0x73,
 	0x20, 0x36, 0x6c, 0x00,
-	0x20, 0xa0, 0xd2, 0x6b,
+	0x20, 0xa0, 0x52, 0x6b,
 	0xff, 0xb9, 0xa2, 0x0c,
 	0xff, 0x6a, 0xa2, 0x04,
 	0xff, 0x65, 0xa4, 0x08,
 	0xe0, 0x6a, 0xcc, 0x00,
-	0x45, 0x6a, 0x3e, 0x5c,
+	0x45, 0x6a, 0xbe, 0x5b,
 	0x01, 0x6a, 0xd0, 0x01,
 	0x09, 0x6a, 0xd6, 0x01,
-	0x80, 0xeb, 0xde, 0x7b,
+	0x80, 0xeb, 0x5e, 0x7b,
 	0x01, 0x6a, 0xd6, 0x01,
 	0x01, 0xe9, 0xa4, 0x34,
 	0x88, 0x6a, 0xcc, 0x00,
-	0x45, 0x6a, 0x3e, 0x5c,
+	0x45, 0x6a, 0xbe, 0x5b,
 	0x01, 0x6a, 0x18, 0x01,
 	0xff, 0x6a, 0x1a, 0x09,
 	0xff, 0x6a, 0x1c, 0x09,
 	0x0d, 0x6a, 0x26, 0x01,
-	0x00, 0x65, 0xb0, 0x5c,
+	0x00, 0x65, 0x30, 0x5c,
 	0xff, 0x99, 0xa4, 0x0c,
 	0xff, 0x65, 0xa4, 0x08,
 	0xe0, 0x6a, 0xcc, 0x00,
-	0x45, 0x6a, 0x3e, 0x5c,
+	0x45, 0x6a, 0xbe, 0x5b,
 	0x01, 0x6a, 0xd0, 0x01,
 	0x01, 0x6a, 0xdc, 0x05,
 	0x88, 0x6a, 0xcc, 0x00,
-	0x45, 0x6a, 0x3e, 0x5c,
+	0x45, 0x6a, 0xbe, 0x5b,
 	0x01, 0x6a, 0x18, 0x01,
 	0xff, 0x6a, 0x1a, 0x09,
 	0xff, 0x6a, 0x1c, 0x09,
 	0x01, 0x6a, 0x26, 0x05,
 	0x01, 0x65, 0xd8, 0x31,
 	0x09, 0xee, 0xdc, 0x01,
-	0x80, 0xee, 0x0e, 0x7c,
+	0x80, 0xee, 0x8e, 0x7b,
 	0xff, 0x6a, 0xdc, 0x0d,
 	0xff, 0x65, 0x32, 0x09,
 	0x0a, 0x93, 0x26, 0x01,
-	0x00, 0x65, 0xb0, 0x44,
+	0x00, 0x65, 0x30, 0x44,
 	0xff, 0x37, 0xc8, 0x08,
-	0x00, 0x6a, 0xd4, 0x5b,
+	0x00, 0x6a, 0x54, 0x5b,
 	0xff, 0x52, 0xa2, 0x0c,
-	0x01, 0x0c, 0x1e, 0x7c,
-	0x04, 0x0c, 0x1e, 0x6c,
+	0x01, 0x0c, 0x9e, 0x7b,
+	0x04, 0x0c, 0x9e, 0x6b,
 	0xe0, 0x03, 0x06, 0x08,
 	0xe0, 0x03, 0x7a, 0x0c,
 	0xff, 0x8c, 0x10, 0x08,
@@ -553,29 +489,29 @@
 	0x00, 0x6c, 0xda, 0x24,
 	0xff, 0x65, 0xc8, 0x08,
 	0xe0, 0x6a, 0xcc, 0x00,
-	0x41, 0x6a, 0x3a, 0x5c,
+	0x41, 0x6a, 0xba, 0x5b,
 	0xff, 0x90, 0xe2, 0x09,
 	0x20, 0x6a, 0xd0, 0x01,
-	0x04, 0x35, 0x5c, 0x7c,
+	0x04, 0x35, 0xdc, 0x7b,
 	0x1d, 0x6a, 0xdc, 0x01,
-	0xdc, 0xee, 0x58, 0x64,
-	0x00, 0x65, 0x68, 0x44,
+	0xdc, 0xee, 0xd8, 0x63,
+	0x00, 0x65, 0xe8, 0x43,
 	0x01, 0x6a, 0xdc, 0x01,
 	0x20, 0xa0, 0xd8, 0x31,
 	0x09, 0xee, 0xdc, 0x01,
-	0x80, 0xee, 0x62, 0x7c,
+	0x80, 0xee, 0xe2, 0x7b,
 	0x19, 0x6a, 0xdc, 0x01,
-	0xd8, 0xee, 0x66, 0x64,
+	0xd8, 0xee, 0xe6, 0x63,
 	0xff, 0x6a, 0xdc, 0x09,
-	0x18, 0xee, 0x6a, 0x6c,
+	0x18, 0xee, 0xea, 0x6b,
 	0xff, 0x6a, 0xd4, 0x0c,
 	0x88, 0x6a, 0xcc, 0x00,
-	0x41, 0x6a, 0x3a, 0x5c,
+	0x41, 0x6a, 0xba, 0x5b,
 	0x20, 0x6a, 0x18, 0x01,
 	0xff, 0x6a, 0x1a, 0x09,
 	0xff, 0x6a, 0x1c, 0x09,
 	0xff, 0x35, 0x26, 0x09,
-	0x04, 0x35, 0x94, 0x6c,
+	0x04, 0x35, 0x14, 0x6c,
 	0xa0, 0x6a, 0xca, 0x00,
 	0x20, 0x65, 0xc8, 0x18,
 	0xff, 0x6c, 0x32, 0x09,
@@ -586,14 +522,14 @@
 	0xff, 0x6c, 0x32, 0x09,
 	0xff, 0x6c, 0x32, 0x09,
 	0xff, 0x6c, 0x32, 0x09,
-	0x00, 0x65, 0x80, 0x64,
+	0x00, 0x65, 0x00, 0x64,
 	0x0a, 0x93, 0x26, 0x01,
-	0x00, 0x65, 0xb0, 0x5c,
-	0x04, 0x35, 0x8c, 0x7b,
-	0xa0, 0x6a, 0xa0, 0x5c,
-	0x00, 0x65, 0xa2, 0x5c,
-	0x00, 0x65, 0xa2, 0x5c,
-	0x00, 0x65, 0xa2, 0x44,
+	0x00, 0x65, 0x30, 0x5c,
+	0x04, 0x35, 0x0c, 0x7b,
+	0xa0, 0x6a, 0x20, 0x5c,
+	0x00, 0x65, 0x22, 0x5c,
+	0x00, 0x65, 0x22, 0x5c,
+	0x00, 0x65, 0x22, 0x44,
 	0xff, 0x65, 0xcc, 0x08,
 	0xff, 0x99, 0xda, 0x08,
 	0xff, 0x99, 0xda, 0x08,
@@ -602,19 +538,19 @@
 	0xff, 0x99, 0xda, 0x08,
 	0xff, 0x99, 0xda, 0x08,
 	0xff, 0x99, 0xda, 0x0c,
-	0x08, 0x94, 0xb0, 0x7c,
+	0x08, 0x94, 0x30, 0x7c,
 	0xf7, 0x93, 0x26, 0x09,
-	0x08, 0x93, 0xb4, 0x6c,
+	0x08, 0x93, 0x34, 0x6c,
 	0xff, 0x6a, 0xd4, 0x0c,
 	0xff, 0x40, 0x74, 0x09,
 	0xff, 0x90, 0x80, 0x08,
 	0xff, 0x6a, 0x72, 0x05,
-	0xff, 0x40, 0xcc, 0x64,
-	0xff, 0x3f, 0xc4, 0x64,
+	0xff, 0x40, 0x4c, 0x64,
+	0xff, 0x3f, 0x44, 0x64,
 	0xff, 0x6a, 0xca, 0x04,
 	0xff, 0x3f, 0x20, 0x09,
 	0x01, 0x6a, 0x6a, 0x00,
-	0x00, 0xb9, 0x4a, 0x5c,
+	0x00, 0xb9, 0xca, 0x5b,
 	0xff, 0xba, 0x7e, 0x0c,
 	0xff, 0x40, 0x20, 0x09,
 	0xff, 0xba, 0x80, 0x0c,
@@ -622,20 +558,12 @@
 	0xff, 0x90, 0x7e, 0x0c,
 };
 
-static int aic7xxx_patch13_func(struct aic7xxx_host *p);
-
-static int
-aic7xxx_patch13_func(struct aic7xxx_host *p)
-{
-	return ((p->chip & AHC_CHIPID_MASK) == AHC_AIC7895);
-}
-
 static int aic7xxx_patch12_func(struct aic7xxx_host *p);
 
 static int
 aic7xxx_patch12_func(struct aic7xxx_host *p)
 {
-	return ((p->features & AHC_CMD_CHAN) == 0);
+	return ((p->features & AHC_WIDE) != 0);
 }
 
 static int aic7xxx_patch11_func(struct aic7xxx_host *p);
@@ -643,7 +571,7 @@
 static int
 aic7xxx_patch11_func(struct aic7xxx_host *p)
 {
-	return ((p->features & AHC_WIDE) != 0);
+	return ((p->features & AHC_ULTRA2) == 0);
 }
 
 static int aic7xxx_patch10_func(struct aic7xxx_host *p);
@@ -651,7 +579,7 @@
 static int
 aic7xxx_patch10_func(struct aic7xxx_host *p)
 {
-	return ((p->features & AHC_ULTRA2) == 0);
+	return ((p->features & AHC_CMD_CHAN) == 0);
 }
 
 static int aic7xxx_patch9_func(struct aic7xxx_host *p);
@@ -659,7 +587,7 @@
 static int
 aic7xxx_patch9_func(struct aic7xxx_host *p)
 {
-	return ((p->features & AHC_ULTRA) != 0);
+	return ((p->chip & AHC_CHIPID_MASK) == AHC_AIC7895);
 }
 
 static int aic7xxx_patch8_func(struct aic7xxx_host *p);
@@ -667,7 +595,7 @@
 static int
 aic7xxx_patch8_func(struct aic7xxx_host *p)
 {
-	return ((p->features & AHC_ULTRA2) != 0);
+	return ((p->features & AHC_ULTRA) != 0);
 }
 
 static int aic7xxx_patch7_func(struct aic7xxx_host *p);
@@ -675,7 +603,7 @@
 static int
 aic7xxx_patch7_func(struct aic7xxx_host *p)
 {
-	return ((p->flags & AHC_PAGESCBS) == 0);
+	return ((p->features & AHC_ULTRA2) != 0);
 }
 
 static int aic7xxx_patch6_func(struct aic7xxx_host *p);
@@ -683,7 +611,7 @@
 static int
 aic7xxx_patch6_func(struct aic7xxx_host *p)
 {
-	return ((p->flags & AHC_PAGESCBS) != 0);
+	return ((p->flags & AHC_PAGESCBS) == 0);
 }
 
 static int aic7xxx_patch5_func(struct aic7xxx_host *p);
@@ -691,7 +619,7 @@
 static int
 aic7xxx_patch5_func(struct aic7xxx_host *p)
 {
-	return ((p->features & AHC_QUEUE_REGS) != 0);
+	return ((p->flags & AHC_PAGESCBS) != 0);
 }
 
 static int aic7xxx_patch4_func(struct aic7xxx_host *p);
@@ -699,7 +627,7 @@
 static int
 aic7xxx_patch4_func(struct aic7xxx_host *p)
 {
-	return ((p->features & AHC_TWIN) != 0);
+	return ((p->features & AHC_QUEUE_REGS) != 0);
 }
 
 static int aic7xxx_patch3_func(struct aic7xxx_host *p);
@@ -707,7 +635,7 @@
 static int
 aic7xxx_patch3_func(struct aic7xxx_host *p)
 {
-	return ((p->features & AHC_QUEUE_REGS) == 0);
+	return ((p->features & AHC_TWIN) != 0);
 }
 
 static int aic7xxx_patch2_func(struct aic7xxx_host *p);
@@ -715,7 +643,7 @@
 static int
 aic7xxx_patch2_func(struct aic7xxx_host *p)
 {
-	return ((p->features & AHC_CMD_CHAN) != 0);
+	return ((p->features & AHC_QUEUE_REGS) == 0);
 }
 
 static int aic7xxx_patch1_func(struct aic7xxx_host *p);
@@ -723,7 +651,7 @@
 static int
 aic7xxx_patch1_func(struct aic7xxx_host *p)
 {
-	return ((p->flags & AHC_TARGETMODE) != 0);
+	return ((p->features & AHC_CMD_CHAN) != 0);
 }
 
 static int aic7xxx_patch0_func(struct aic7xxx_host *p);
@@ -740,83 +668,78 @@
 			skip_instr :10,
 			skip_patch :12;
 } sequencer_patches[] = {
-	{ aic7xxx_patch1_func, 2, 1, 2 },
-	{ aic7xxx_patch0_func, 3, 1, 1 },
-	{ aic7xxx_patch2_func, 4, 2, 1 },
-	{ aic7xxx_patch3_func, 8, 1, 1 },
-	{ aic7xxx_patch3_func, 9, 1, 1 },
-	{ aic7xxx_patch4_func, 12, 4, 1 },
-	{ aic7xxx_patch5_func, 17, 3, 2 },
-	{ aic7xxx_patch0_func, 20, 4, 1 },
-	{ aic7xxx_patch6_func, 24, 1, 1 },
-	{ aic7xxx_patch7_func, 27, 1, 1 },
-	{ aic7xxx_patch2_func, 30, 1, 2 },
-	{ aic7xxx_patch0_func, 31, 3, 1 },
-	{ aic7xxx_patch4_func, 40, 4, 1 },
-	{ aic7xxx_patch8_func, 44, 3, 2 },
-	{ aic7xxx_patch0_func, 47, 3, 1 },
-	{ aic7xxx_patch9_func, 53, 7, 1 },
-	{ aic7xxx_patch4_func, 61, 3, 1 },
-	{ aic7xxx_patch8_func, 64, 2, 1 },
-	{ aic7xxx_patch1_func, 69, 60, 1 },
-	{ aic7xxx_patch8_func, 163, 1, 2 },
-	{ aic7xxx_patch0_func, 164, 2, 1 },
-	{ aic7xxx_patch2_func, 168, 3, 4 },
-	{ aic7xxx_patch8_func, 168, 2, 2 },
-	{ aic7xxx_patch0_func, 170, 1, 1 },
-	{ aic7xxx_patch0_func, 171, 2, 1 },
-	{ aic7xxx_patch8_func, 174, 1, 2 },
-	{ aic7xxx_patch0_func, 175, 1, 1 },
-	{ aic7xxx_patch2_func, 179, 1, 1 },
-	{ aic7xxx_patch2_func, 182, 3, 2 },
-	{ aic7xxx_patch0_func, 185, 5, 1 },
-	{ aic7xxx_patch2_func, 193, 2, 3 },
-	{ aic7xxx_patch8_func, 193, 1, 1 },
-	{ aic7xxx_patch0_func, 195, 3, 1 },
-	{ aic7xxx_patch10_func, 199, 1, 2 },
-	{ aic7xxx_patch0_func, 200, 1, 1 },
-	{ aic7xxx_patch8_func, 201, 7, 2 },
-	{ aic7xxx_patch0_func, 208, 1, 1 },
-	{ aic7xxx_patch2_func, 213, 14, 3 },
-	{ aic7xxx_patch10_func, 226, 1, 1 },
-	{ aic7xxx_patch0_func, 227, 9, 1 },
-	{ aic7xxx_patch8_func, 241, 2, 1 },
-	{ aic7xxx_patch8_func, 243, 1, 1 },
-	{ aic7xxx_patch10_func, 244, 6, 3 },
-	{ aic7xxx_patch2_func, 244, 2, 2 },
-	{ aic7xxx_patch0_func, 246, 4, 1 },
-	{ aic7xxx_patch8_func, 251, 1, 1 },
-	{ aic7xxx_patch8_func, 255, 19, 1 },
-	{ aic7xxx_patch2_func, 275, 3, 3 },
-	{ aic7xxx_patch10_func, 277, 1, 1 },
-	{ aic7xxx_patch0_func, 278, 5, 1 },
-	{ aic7xxx_patch10_func, 283, 1, 2 },
-	{ aic7xxx_patch0_func, 284, 9, 1 },
-	{ aic7xxx_patch11_func, 300, 1, 2 },
-	{ aic7xxx_patch0_func, 301, 1, 1 },
-	{ aic7xxx_patch5_func, 362, 1, 2 },
-	{ aic7xxx_patch0_func, 363, 1, 1 },
-	{ aic7xxx_patch3_func, 366, 1, 1 },
-	{ aic7xxx_patch2_func, 376, 3, 2 },
-	{ aic7xxx_patch0_func, 379, 5, 1 },
-	{ aic7xxx_patch11_func, 387, 1, 2 },
-	{ aic7xxx_patch0_func, 388, 1, 1 },
-	{ aic7xxx_patch6_func, 393, 1, 1 },
-	{ aic7xxx_patch1_func, 438, 3, 1 },
-	{ aic7xxx_patch10_func, 443, 11, 1 },
-	{ aic7xxx_patch2_func, 491, 7, 2 },
-	{ aic7xxx_patch0_func, 498, 8, 1 },
-	{ aic7xxx_patch2_func, 507, 4, 2 },
-	{ aic7xxx_patch0_func, 511, 6, 1 },
-	{ aic7xxx_patch2_func, 517, 4, 2 },
-	{ aic7xxx_patch0_func, 521, 3, 1 },
-	{ aic7xxx_patch12_func, 531, 10, 1 },
-	{ aic7xxx_patch2_func, 550, 17, 4 },
-	{ aic7xxx_patch13_func, 558, 4, 2 },
-	{ aic7xxx_patch0_func, 562, 2, 1 },
-	{ aic7xxx_patch0_func, 567, 33, 1 },
-	{ aic7xxx_patch12_func, 600, 4, 1 },
-	{ aic7xxx_patch6_func, 604, 2, 1 },
-	{ aic7xxx_patch6_func, 607, 9, 1 },
+	{ aic7xxx_patch1_func, 3, 2, 1 },
+	{ aic7xxx_patch2_func, 7, 1, 1 },
+	{ aic7xxx_patch2_func, 8, 1, 1 },
+	{ aic7xxx_patch3_func, 11, 4, 1 },
+	{ aic7xxx_patch4_func, 16, 3, 2 },
+	{ aic7xxx_patch0_func, 19, 4, 1 },
+	{ aic7xxx_patch5_func, 23, 1, 1 },
+	{ aic7xxx_patch6_func, 26, 1, 1 },
+	{ aic7xxx_patch1_func, 29, 1, 2 },
+	{ aic7xxx_patch0_func, 30, 3, 1 },
+	{ aic7xxx_patch3_func, 39, 4, 1 },
+	{ aic7xxx_patch7_func, 43, 3, 2 },
+	{ aic7xxx_patch0_func, 46, 3, 1 },
+	{ aic7xxx_patch8_func, 52, 7, 1 },
+	{ aic7xxx_patch3_func, 60, 3, 1 },
+	{ aic7xxx_patch7_func, 63, 2, 1 },
+	{ aic7xxx_patch7_func, 102, 1, 2 },
+	{ aic7xxx_patch0_func, 103, 2, 1 },
+	{ aic7xxx_patch7_func, 107, 2, 1 },
+	{ aic7xxx_patch9_func, 109, 1, 1 },
+	{ aic7xxx_patch10_func, 110, 2, 1 },
+	{ aic7xxx_patch7_func, 113, 1, 2 },
+	{ aic7xxx_patch0_func, 114, 1, 1 },
+	{ aic7xxx_patch1_func, 118, 1, 1 },
+	{ aic7xxx_patch1_func, 121, 3, 2 },
+	{ aic7xxx_patch0_func, 124, 5, 1 },
+	{ aic7xxx_patch1_func, 132, 2, 3 },
+	{ aic7xxx_patch7_func, 132, 1, 1 },
+	{ aic7xxx_patch0_func, 134, 3, 1 },
+	{ aic7xxx_patch11_func, 138, 1, 2 },
+	{ aic7xxx_patch0_func, 139, 1, 1 },
+	{ aic7xxx_patch7_func, 140, 7, 2 },
+	{ aic7xxx_patch0_func, 147, 1, 1 },
+	{ aic7xxx_patch1_func, 152, 14, 3 },
+	{ aic7xxx_patch11_func, 165, 1, 1 },
+	{ aic7xxx_patch0_func, 166, 9, 1 },
+	{ aic7xxx_patch7_func, 180, 2, 1 },
+	{ aic7xxx_patch7_func, 182, 1, 1 },
+	{ aic7xxx_patch11_func, 183, 6, 3 },
+	{ aic7xxx_patch1_func, 183, 2, 2 },
+	{ aic7xxx_patch0_func, 185, 4, 1 },
+	{ aic7xxx_patch7_func, 190, 1, 1 },
+	{ aic7xxx_patch7_func, 194, 20, 1 },
+	{ aic7xxx_patch1_func, 215, 3, 3 },
+	{ aic7xxx_patch11_func, 217, 1, 1 },
+	{ aic7xxx_patch0_func, 218, 5, 1 },
+	{ aic7xxx_patch11_func, 223, 1, 2 },
+	{ aic7xxx_patch0_func, 224, 9, 1 },
+	{ aic7xxx_patch12_func, 240, 1, 2 },
+	{ aic7xxx_patch0_func, 241, 1, 1 },
+	{ aic7xxx_patch4_func, 302, 1, 2 },
+	{ aic7xxx_patch0_func, 303, 1, 1 },
+	{ aic7xxx_patch2_func, 306, 1, 1 },
+	{ aic7xxx_patch1_func, 316, 3, 2 },
+	{ aic7xxx_patch0_func, 319, 5, 1 },
+	{ aic7xxx_patch12_func, 327, 1, 2 },
+	{ aic7xxx_patch0_func, 328, 1, 1 },
+	{ aic7xxx_patch5_func, 333, 1, 1 },
+	{ aic7xxx_patch11_func, 375, 15, 1 },
+	{ aic7xxx_patch1_func, 427, 7, 2 },
+	{ aic7xxx_patch0_func, 434, 8, 1 },
+	{ aic7xxx_patch1_func, 443, 4, 2 },
+	{ aic7xxx_patch0_func, 447, 6, 1 },
+	{ aic7xxx_patch1_func, 453, 4, 2 },
+	{ aic7xxx_patch0_func, 457, 3, 1 },
+	{ aic7xxx_patch10_func, 467, 10, 1 },
+	{ aic7xxx_patch1_func, 486, 17, 4 },
+	{ aic7xxx_patch9_func, 494, 4, 2 },
+	{ aic7xxx_patch0_func, 498, 2, 1 },
+	{ aic7xxx_patch0_func, 503, 33, 1 },
+	{ aic7xxx_patch10_func, 536, 4, 1 },
+	{ aic7xxx_patch5_func, 540, 2, 1 },
+	{ aic7xxx_patch5_func, 543, 9, 1 },
 
 };
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/drivers/scsi/hosts.c linux.17p9/drivers/scsi/hosts.c
--- linux.vanilla/drivers/scsi/hosts.c	Fri Apr 21 12:46:28 2000
+++ linux.17p9/drivers/scsi/hosts.c	Sun Jun 11 21:50:44 2000
@@ -343,6 +343,10 @@
 #include "3w-xxxx.h"
 #endif
 
+#ifdef CONFIG_I2O_SCSI
+#include "../i2o/i2o_scsi.h"
+#endif
+
 /*
  * Moved ppa driver to the end of the probe list
  * since it is a removable host adapter.
@@ -617,7 +621,10 @@
 #ifdef CONFIG_BLK_DEV_3W_XXXX_RAID
 	TWXXXX,
 #endif
-
+/* Put I2O after specific adapters */
+#ifdef CONFIG_I2O_SCSI
+	I2OSCSI,
+#endif
 /* "Removable host adapters" below this line (Parallel Port/USB/other) */
 #ifdef CONFIG_SCSI_PPA
     PPA,
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/drivers/scsi/ini9100u.c linux.17p9/drivers/scsi/ini9100u.c
--- linux.vanilla/drivers/scsi/ini9100u.c	Sun Jun 11 21:44:15 2000
+++ linux.17p9/drivers/scsi/ini9100u.c	Sun Jun 11 22:00:50 2000
@@ -545,8 +545,6 @@
 #if LINUX_VERSION_CODE >= CVT_LINUX_VERSION(2,1,95)
 		pHCB->pSRB_lock = SPIN_LOCK_UNLOCKED;	/* SRB save queue lock */
 #endif
-		request_region(pHCB->HCS_Base, 0x100, "i91u");	/* Register */
-
 		get_tulipPCIConfig(pHCB, i);
 
 		dBiosAdr = pHCB->HCS_BIOS;
@@ -557,6 +555,8 @@
 #endif
 
 		init_tulip(pHCB, tul_scb + (i * tul_num_scb), tul_num_scb, pbBiosAdr, 10);
+		request_region(pHCB->HCS_Base, 256, "i91u"); /* Register */ 
+
 		pHCB->HCS_Index = i;	/* 7/29/98 */
 		hreg = scsi_register(tpnt, sizeof(HCS));
 		hreg->io_port = pHCB->HCS_Base;
@@ -1086,4 +1086,14 @@
 {
 	printk("\ni91u_panic: %s\n", msg);
 	panic("i91u panic");
+}
+
+/*
+ * Release ressources
+ */
+int i91u_release(struct Scsi_Host *hreg)
+{
+	free_irq(hreg->irq, hreg);
+	release_region(hreg->io_port, 256);
+	return 0;
 }
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/drivers/scsi/ini9100u.h linux.17p9/drivers/scsi/ini9100u.h
--- linux.vanilla/drivers/scsi/ini9100u.h	Wed May  3 22:31:20 2000
+++ linux.17p9/drivers/scsi/ini9100u.h	Tue Jun 27 13:10:07 2000
@@ -78,6 +78,7 @@
 #include "sd.h"
 
 extern int i91u_detect(Scsi_Host_Template *);
+extern int i91u_release(struct Scsi_Host *);
 extern int i91u_command(Scsi_Cmnd *);
 extern int i91u_queue(Scsi_Cmnd *, void (*done) (Scsi_Cmnd *));
 extern int i91u_abort(Scsi_Cmnd *);
@@ -148,7 +149,7 @@
 	proc_info:	NULL,				\
 	name:		i91u_REVID, \
 	detect:		i91u_detect, \
-	release:	NULL, \
+	release:	i91u_release, \
 	info:		NULL,					\
 	command:	i91u_command, \
 	queuecommand:	i91u_queue, \
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/drivers/scsi/inia100.c linux.17p9/drivers/scsi/inia100.c
--- linux.vanilla/drivers/scsi/inia100.c	Fri Apr 21 12:46:28 2000
+++ linux.17p9/drivers/scsi/inia100.c	Sun Jun 11 22:01:03 2000
@@ -466,7 +466,6 @@
 		memset((unsigned char *) pHCB->HCS_virEscbArray, 0, sz);
 		pHCB->HCS_physEscbArray = (U32) VIRT_TO_BUS(pHCB->HCS_virEscbArray);
 
-		request_region(pHCB->HCS_Base, 0x100, "inia100");	/* Register */
 		get_orcPCIConfig(pHCB, i);
 
 		dBiosAdr = pHCB->HCS_BIOS;
@@ -480,6 +479,8 @@
 			printk("inia100: initial orchid fail!!\n");
 			return (0);
 		}
+		request_region(pHCB->HCS_Base, 256, "inia100");	/* Register */
+
 		hreg = scsi_register(tpnt, sizeof(ORC_HCS));
 		if (hreg == NULL) {
 			printk("Invalid scsi_register pointer.\n");
@@ -512,28 +513,28 @@
 		switch (i) {
 #if LINUX_VERSION_CODE >= CVT_LINUX_VERSION(1,3,0)
 		case 0:
-			ok = request_irq(pHCB->HCS_Intr, inia100_intr0, SA_INTERRUPT | SA_SHIRQ, "inia100", NULL);
+			ok = request_irq(pHCB->HCS_Intr, inia100_intr0, SA_INTERRUPT | SA_SHIRQ, "inia100", hreg);
 			break;
 		case 1:
-			ok = request_irq(pHCB->HCS_Intr, inia100_intr1, SA_INTERRUPT | SA_SHIRQ, "inia100", NULL);
+			ok = request_irq(pHCB->HCS_Intr, inia100_intr1, SA_INTERRUPT | SA_SHIRQ, "inia100", hreg);
 			break;
 		case 2:
-			ok = request_irq(pHCB->HCS_Intr, inia100_intr2, SA_INTERRUPT | SA_SHIRQ, "inia100", NULL);
+			ok = request_irq(pHCB->HCS_Intr, inia100_intr2, SA_INTERRUPT | SA_SHIRQ, "inia100", hreg);
 			break;
 		case 3:
-			ok = request_irq(pHCB->HCS_Intr, inia100_intr3, SA_INTERRUPT | SA_SHIRQ, "inia100", NULL);
+			ok = request_irq(pHCB->HCS_Intr, inia100_intr3, SA_INTERRUPT | SA_SHIRQ, "inia100", hreg);
 			break;
 		case 4:
-			ok = request_irq(pHCB->HCS_Intr, inia100_intr4, SA_INTERRUPT | SA_SHIRQ, "inia100", NULL);
+			ok = request_irq(pHCB->HCS_Intr, inia100_intr4, SA_INTERRUPT | SA_SHIRQ, "inia100", hreg);
 			break;
 		case 5:
-			ok = request_irq(pHCB->HCS_Intr, inia100_intr5, SA_INTERRUPT | SA_SHIRQ, "inia100", NULL);
+			ok = request_irq(pHCB->HCS_Intr, inia100_intr5, SA_INTERRUPT | SA_SHIRQ, "inia100", hreg);
 			break;
 		case 6:
-			ok = request_irq(pHCB->HCS_Intr, inia100_intr6, SA_INTERRUPT | SA_SHIRQ, "inia100", NULL);
+			ok = request_irq(pHCB->HCS_Intr, inia100_intr6, SA_INTERRUPT | SA_SHIRQ, "inia100", hreg);
 			break;
 		case 7:
-			ok = request_irq(pHCB->HCS_Intr, inia100_intr7, SA_INTERRUPT | SA_SHIRQ, "inia100", NULL);
+			ok = request_irq(pHCB->HCS_Intr, inia100_intr7, SA_INTERRUPT | SA_SHIRQ, "inia100", hreg);
 			break;
 		default:
 			inia100_panic("inia100: Too many host adapters\n");
@@ -936,5 +937,15 @@
 	printk("\ninia100_panic: %s\n", msg);
 	panic("inia100 panic");
 }
+
+/*
+ * Release ressources
+ */
+int inia100_release(struct Scsi_Host *hreg)
+{
+        free_irq(hreg->irq, hreg);
+        release_region(hreg->io_port, 256);
+        return 0;
+} 
 
 /*#include "inia100scsi.c" */
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/drivers/scsi/inia100.h linux.17p9/drivers/scsi/inia100.h
--- linux.vanilla/drivers/scsi/inia100.h	Wed May  3 22:31:20 2000
+++ linux.17p9/drivers/scsi/inia100.h	Tue Jun 27 13:10:07 2000
@@ -71,6 +71,7 @@
 #include "sd.h"
 
 extern int inia100_detect(Scsi_Host_Template *);
+extern int inia100_release(struct Scsi_Host *);
 extern int inia100_command(Scsi_Cmnd *);
 extern int inia100_queue(Scsi_Cmnd *, void (*done) (Scsi_Cmnd *));
 extern int inia100_abort(Scsi_Cmnd *);
@@ -142,7 +143,7 @@
 	proc_info:	NULL,				\
 	name:		inia100_REVID, \
 	detect:		inia100_detect, \
-	release:	NULL, \
+	release:	inia100_release, \
 	info:		NULL,					\
 	command:	inia100_command, \
 	queuecommand:	inia100_queue, \
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/drivers/scsi/mac53c94.c linux.17p9/drivers/scsi/mac53c94.c
--- linux.vanilla/drivers/scsi/mac53c94.c	Fri Apr 21 12:46:28 2000
+++ linux.17p9/drivers/scsi/mac53c94.c	Mon Jun 26 15:46:11 2000
@@ -7,6 +7,7 @@
  * Paul Mackerras, August 1996.
  * Copyright (C) 1996 Paul Mackerras.
  */
+#include <linux/module.h>
 #include <linux/kernel.h>
 #include <linux/delay.h>
 #include <linux/types.h>
@@ -542,3 +543,9 @@
 		return 0;
 	}
 }
+
+#ifdef MODULE
+Scsi_Host_Template driver_template = SCSI_MAC53C94;
+
+#include "scsi_module.c"
+#endif /* MODULE */
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/drivers/scsi/mesh.c linux.17p9/drivers/scsi/mesh.c
--- linux.vanilla/drivers/scsi/mesh.c	Fri Apr 21 12:46:30 2000
+++ linux.17p9/drivers/scsi/mesh.c	Mon Jun 26 15:46:11 2000
@@ -8,6 +8,7 @@
  * Copyright (C) 1996 Paul Mackerras.
  */
 #include <linux/config.h>
+#include <linux/module.h>
 #include <linux/kernel.h>
 #include <linux/delay.h>
 #include <linux/types.h>
@@ -1910,6 +1911,12 @@
 		return 0;
 	}
 }
+
+#ifdef MODULE
+Scsi_Host_Template driver_template = SCSI_MESH;
+
+#include "scsi_module.c"
+#endif /* MODULE */
 
 #ifdef MESH_DBG
 static inline u32 readtb(void)
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/drivers/scsi/sg.c linux.17p9/drivers/scsi/sg.c
--- linux.vanilla/drivers/scsi/sg.c	Sun Jun 11 21:44:17 2000
+++ linux.17p9/drivers/scsi/sg.c	Tue Jun 27 12:04:59 2000
@@ -16,8 +16,8 @@
  *
  *  Borrows code from st driver. Thanks to Alessandro Rubini's "dd" book.
  */
- static char * sg_version_str = "Version: 2.1.38 (20000527)";
- static int sg_version_num = 20138; /* 2 digits for each component */
+ static char * sg_version_str = "Version: 2.1.39 (20000626)";
+ static int sg_version_num = 20139; /* 2 digits for each component */
 /*
  *  D. P. Gilbert (dgilbert@interlog.com, dougg@triode.net.au), notes:
  *      - scsi logging is available via SCSI_LOG_TIMEOUT macros. First
@@ -1376,9 +1376,9 @@
     Sg_scatter_hold * req_schp = &srp->data;
     Sg_scatter_hold * rsv_schp = &sfp->reserve;
 
+    srp->res_used = 1;
     SCSI_LOG_TIMEOUT(4, printk("sg_link_reserve: size=%d\n", size)); 
-    /* round request up to next highest SG_SECTOR_SZ byte boundary */
-    size = (size + SG_SECTOR_MSK) & (~SG_SECTOR_MSK);
+    size = (size + 1) & (~1);   /* round to even for aha1542 */
     if (rsv_schp->use_sg > 0) {
         int k, num;
         int rem = size;
@@ -1387,22 +1387,26 @@
         for (k = 0; k < rsv_schp->use_sg; ++k, ++sclp) {
             num = (int)sclp->length;
             if (rem <= num) {
-                sfp->save_scat_len = num;
-                sclp->length = (unsigned)rem;
+                if (0 == k) {
+                    req_schp->use_sg = 0;
+                    req_schp->buffer = sclp->address;
+                }
+                else {
+                    sfp->save_scat_len = num;
+                    sclp->length = (unsigned)rem;
+                    req_schp->use_sg = k + 1;
+                    req_schp->sglist_len = rsv_schp->sglist_len;
+                    req_schp->buffer = rsv_schp->buffer;
+                }
+                req_schp->bufflen = size;
+                req_schp->mem_src = rsv_schp->mem_src;
+                req_schp->b_malloc_len = rsv_schp->b_malloc_len;
                 break;
             }
             else
                 rem -= num;
         }
-        if (k < rsv_schp->use_sg) {
-            req_schp->use_sg = k + 1;   /* adjust scatter list length */
-            req_schp->bufflen = size;
-            req_schp->sglist_len = rsv_schp->sglist_len;
-            req_schp->buffer = rsv_schp->buffer;
-            req_schp->mem_src = rsv_schp->mem_src;
-            req_schp->b_malloc_len = rsv_schp->b_malloc_len;
-        }
-        else
+        if (k >= rsv_schp->use_sg)
             SCSI_LOG_TIMEOUT(1, printk("sg_link_reserve: BAD size\n")); 
     }
     else {
@@ -1410,10 +1414,8 @@
         req_schp->bufflen = size;
         req_schp->buffer = rsv_schp->buffer;
         req_schp->mem_src = rsv_schp->mem_src;
-        req_schp->use_sg = rsv_schp->use_sg;
         req_schp->b_malloc_len = rsv_schp->b_malloc_len;
     }
-    srp->res_used = 1;
 }
 
 static void sg_unlink_reserve(Sg_fd * sfp, Sg_request * srp)
@@ -1423,7 +1425,7 @@
 
     SCSI_LOG_TIMEOUT(4, printk("sg_unlink_reserve: req->use_sg=%d\n",
                                (int)req_schp->use_sg)); 
-    if (rsv_schp->use_sg > 0) {
+    if ((rsv_schp->use_sg > 0) && (req_schp->use_sg > 0)) {
         struct scatterlist * sclp = (struct scatterlist *)rsv_schp->buffer;
 
         if (sfp->save_scat_len > 0) 
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/drivers/scsi/sr_ioctl.c linux.17p9/drivers/scsi/sr_ioctl.c
--- linux.vanilla/drivers/scsi/sr_ioctl.c	Sun Jun 11 21:44:17 2000
+++ linux.17p9/drivers/scsi/sr_ioctl.c	Sun Jun 11 22:05:48 2000
@@ -365,6 +365,98 @@
 	
         break;
     }
+	case CDROMVOLCTRL: {
+		char * buffer, * mask;
+		struct cdrom_volctrl* volctrl = (struct cdrom_volctrl*)arg;
+	
+	/* First we get the current params so we can just twiddle the volume */
+		sr_cmd[0] = MODE_SENSE;
+		sr_cmd[1] = (scsi_CDs[target].device -> lun) << 5;
+		sr_cmd[2] = 0xe;    /* Want mode page 0xe, CDROM audio params */
+		sr_cmd[3] = 0;
+		sr_cmd[4] = 28;
+		sr_cmd[5] = 0;
+	
+		if ((buffer = (unsigned char *) scsi_malloc(512)) == NULL)
+			return -ENOMEM;
+	
+		if ((result = sr_do_ioctl(target, sr_cmd, buffer, 28, 0))) {
+			printk ("Hosed while obtaining audio mode page\n");
+			scsi_free(buffer, 512);
+			break;
+		}
+	
+		sr_cmd[0] = MODE_SENSE;
+		sr_cmd[1] = (scsi_CDs[target].device -> lun) << 5;
+		sr_cmd[2] = 0x4e;   /* Want the mask for mode page 0xe */
+		sr_cmd[3] = 0;
+		sr_cmd[4] = 28;
+		sr_cmd[5] = 0;
+	
+		mask = (unsigned char *) scsi_malloc(512);
+		if(!mask) {
+			scsi_free(buffer, 512);
+			result = -ENOMEM;
+			break;
+		}
+
+		if ((result = sr_do_ioctl (target, sr_cmd, mask, 28, 0))) {
+			printk("Hosed obtaining mask for audio mode page\n");
+			scsi_free(buffer, 512);
+			scsi_free(mask, 512);
+			break;
+		}
+	
+		/* Now mask and substitute our own volume and reuse the rest */
+		buffer[0] = 0;  /* Clear reserved field */
+	
+		buffer[21] = volctrl->channel0 & mask[21];
+		buffer[23] = volctrl->channel1 & mask[23];
+		buffer[25] = volctrl->channel2 & mask[25];
+		buffer[27] = volctrl->channel3 & mask[27];
+	
+		sr_cmd[0] = MODE_SELECT;
+		sr_cmd[1] = ((scsi_CDs[target].device -> lun) << 5) | 0x10;    /* Params are SCSI-2 */
+		sr_cmd[2] = sr_cmd[3] = 0;
+		sr_cmd[4] = 28;
+		sr_cmd[5] = 0;
+	
+		result = sr_do_ioctl (target, sr_cmd, buffer, 28, 0);
+		scsi_free(buffer, 512);
+		scsi_free(mask, 512);
+		break;
+	}
+	
+	case CDROMVOLREAD: {
+		char * buffer;
+		struct cdrom_volctrl* volctrl = (struct cdrom_volctrl*)arg;
+	
+		/* Get the current params */
+	
+		sr_cmd[0] = MODE_SENSE;
+		sr_cmd[1] = (scsi_CDs[target].device -> lun) << 5;
+		sr_cmd[2] = 0xe;    /* Want mode page 0xe, CDROM audio params */
+		sr_cmd[3] = 0;
+		sr_cmd[4] = 28;
+		sr_cmd[5] = 0;
+	
+		if ((buffer = (unsigned char *) scsi_malloc(512)) == NULL)
+			return -ENOMEM;
+	
+		if ((result = sr_do_ioctl (target, sr_cmd, buffer, 28, 0))) {
+			printk("(CDROMVOLREAD) Hosed while obtaining audio mode page\n");
+			scsi_free(buffer, 512);
+			break;
+		}
+
+		volctrl->channel0 = buffer[21];
+		volctrl->channel1 = buffer[23];
+		volctrl->channel2 = buffer[25];
+		volctrl->channel3 = buffer[27];
+
+		scsi_free(buffer, 512);
+		break;
+	}
 
     default:
         return -EINVAL;
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/drivers/scsi/st.c linux.17p9/drivers/scsi/st.c
--- linux.vanilla/drivers/scsi/st.c	Fri Apr 21 12:46:32 2000
+++ linux.17p9/drivers/scsi/st.c	Tue Jun 20 23:04:45 2000
@@ -11,7 +11,7 @@
   Copyright 1992 - 2000 Kai Makisara
 		 email Kai.Makisara@metla.fi
 
-  Last modified: Wed Feb  2 22:04:05 2000 by makisara@kai.makisara.local
+  Last modified: Sat Jun 17 17:29:35 2000 by makisara@kai.makisara.local
   Some small formal changes - aeb, 950809
 */
 
@@ -896,7 +896,7 @@
 scsi_tape_flush(struct file * filp)
 {
     int result = 0, result2;
-    static unsigned char cmd[10];
+    unsigned char cmd[10];
     Scsi_Cmnd * SCpnt;
     Scsi_Tape * STp;
     ST_mode * STm;
@@ -1060,7 +1060,7 @@
     ssize_t i, do_count, blks, retval, transfer;
     int write_threshold;
     int doing_write = 0;
-    static unsigned char cmd[10];
+    unsigned char cmd[10];
     const char *b_point;
     Scsi_Cmnd * SCpnt = NULL;
     Scsi_Tape * STp;
@@ -1380,7 +1380,7 @@
 read_tape(struct inode *inode, long count, Scsi_Cmnd **aSCpnt)
 {
     int transfer, blks, bytes;
-    static unsigned char cmd[10];
+    unsigned char cmd[10];
     Scsi_Cmnd *SCpnt;
     Scsi_Tape *STp;
     ST_mode * STm;
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/drivers/scsi/sym53c8xx.c linux.17p9/drivers/scsi/sym53c8xx.c
--- linux.vanilla/drivers/scsi/sym53c8xx.c	Fri Apr 21 12:46:33 2000
+++ linux.17p9/drivers/scsi/sym53c8xx.c	Mon Jun 26 15:44:40 2000
@@ -4180,7 +4180,7 @@
 	**	64 bit (53C896) ?
 	*/
 	if (np->features & FE_64BIT)
-#if BITS_PER_LONG > 32
+#ifdef SCSI_NCR_USE_64BIT_DAC
 		np->rv_ccntl1	|= (XTIMOD | EXTIBMV);
 #else
 		np->rv_ccntl1	|= (DDAC);
@@ -9021,7 +9021,7 @@
 **	code will get more complex later).
 */
 
-#if BITS_PER_LONG > 32
+#ifdef SCSI_NCR_USE_64BIT_DAC
 #define SCATTER_ONE(data, badd, len)					\
 	(data)->addr = cpu_to_scr(badd);				\
 	(data)->size = cpu_to_scr((((badd) >> 8) & 0xff000000) + len);
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/drivers/sound/Config.in linux.17p9/drivers/sound/Config.in
--- linux.vanilla/drivers/sound/Config.in	Sun Jun 11 21:44:17 2000
+++ linux.17p9/drivers/sound/Config.in	Sat Jun 24 14:45:25 2000
@@ -17,6 +17,7 @@
   fi
 fi
 
+dep_tristate 'Crystal SoundFusion (CS461x)' CONFIG_SOUND_FUSION $CONFIG_SOUND
 dep_tristate 'Ensoniq AudioPCI (ES1370)' CONFIG_SOUND_ES1370 $CONFIG_SOUND
 if [ "$CONFIG_SOUND_ES1370" = "y" ]; then
    bool 'Joystick support at boot time' CONFIG_SOUND_ES1370_JOYPORT_BOOT
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/drivers/sound/Makefile linux.17p9/drivers/sound/Makefile
--- linux.vanilla/drivers/sound/Makefile	Sun Jun 11 21:44:17 2000
+++ linux.17p9/drivers/sound/Makefile	Sat Jun 24 14:45:56 2000
@@ -84,6 +84,7 @@
 obj-$(CONFIG_SOUND_ES1370)	+= es1370.o
 obj-$(CONFIG_SOUND_ES1371)	+= es1371.o
 obj-$(CONFIG_SOUND_ESSSOLO1)	+= esssolo1.o
+obj-$(CONFIG_SOUND_FUSION)	+= cs46xx.o
 obj-$(CONFIG_SOUND_ICH)		+= i810_audio.o ac97_codec.o
 obj-$(CONFIG_SOUND_MAESTRO)	+= maestro.o
 obj-$(CONFIG_SOUND_SONICVIBES)	+= sonicvibes.o
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/drivers/sound/ac97_codec.c linux.17p9/drivers/sound/ac97_codec.c
--- linux.vanilla/drivers/sound/ac97_codec.c	Sun Jun 11 21:44:17 2000
+++ linux.17p9/drivers/sound/ac97_codec.c	Thu Jun 15 15:21:09 2000
@@ -530,6 +530,11 @@
 	/* probing AC97 codec, AC97 2.0 says that bit 15 of register 0x00 (reset) should 
 	   be read zero. Probing of AC97 in this way is not reliable, it is not even SAFE !! */
 	codec->codec_write(codec, AC97_RESET, 0L);
+	
+	/* We need a codec->codec_reset() function here but the delay is a
+	   reasonable hack for the moment */
+	   
+	schedule_timeout((5*HZ)/100);
 	if ((audio = codec->codec_read(codec, AC97_RESET)) & 0x8000) {
 		printk(KERN_ERR "ac97_codec: %s ac97 codec not present\n",
 		       codec->id ? "Secondary" : "Primary");
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/drivers/sound/cs461x.h linux.17p9/drivers/sound/cs461x.h
--- linux.vanilla/drivers/sound/cs461x.h	Thu Jan  1 01:00:00 1970
+++ linux.17p9/drivers/sound/cs461x.h	Sat Jun 24 20:22:40 2000
@@ -0,0 +1,1617 @@
+#ifndef __CS461X_H
+#define __CS461X_H
+
+/*
+ *  Copyright (c) by Jaroslav Kysela <perex@suse.cz>
+ *  Definitions for Cirrus Logic CS461x chips
+ *
+ *
+ *   This program is free software; you can redistribute it and/or modify
+ *   it under the terms of the GNU General Public License as published by
+ *   the Free Software Foundation; either version 2 of the License, or
+ *   (at your option) any later version.
+ *
+ *   This program is distributed in the hope that it will be useful,
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *   GNU General Public License for more details.
+ *
+ *   You should have received a copy of the GNU General Public License
+ *   along with this program; if not, write to the Free Software
+ *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ */
+
+#ifndef PCI_VENDOR_ID_CIRRUS
+#define PCI_VENDOR_ID_CIRRUS            0x1013
+#endif
+#ifndef PCI_DEVICE_ID_CIRRUS_4610
+#define PCI_DEVICE_ID_CIRRUS_4610       0x6001
+#endif
+#ifndef PCI_DEVICE_ID_CIRRUS_4612
+#define PCI_DEVICE_ID_CIRRUS_4612       0x6003
+#endif
+#ifndef PCI_DEVICE_ID_CIRRUS_4615
+#define PCI_DEVICE_ID_CIRRUS_4615       0x6004
+#endif
+
+/*
+ *  Direct registers
+ */
+
+/*
+ *  The following define the offsets of the registers accessed via base address
+ *  register zero on the CS461x part.
+ */
+#define BA0_HISR				0x00000000
+#define BA0_HSR0                                0x00000004
+#define BA0_HICR                                0x00000008
+#define BA0_DMSR                                0x00000100
+#define BA0_HSAR                                0x00000110
+#define BA0_HDAR                                0x00000114
+#define BA0_HDMR                                0x00000118
+#define BA0_HDCR                                0x0000011C
+#define BA0_PFMC                                0x00000200
+#define BA0_PFCV1                               0x00000204
+#define BA0_PFCV2                               0x00000208
+#define BA0_PCICFG00                            0x00000300
+#define BA0_PCICFG04                            0x00000304
+#define BA0_PCICFG08                            0x00000308
+#define BA0_PCICFG0C                            0x0000030C
+#define BA0_PCICFG10                            0x00000310
+#define BA0_PCICFG14                            0x00000314
+#define BA0_PCICFG18                            0x00000318
+#define BA0_PCICFG1C                            0x0000031C
+#define BA0_PCICFG20                            0x00000320
+#define BA0_PCICFG24                            0x00000324
+#define BA0_PCICFG28                            0x00000328
+#define BA0_PCICFG2C                            0x0000032C
+#define BA0_PCICFG30                            0x00000330
+#define BA0_PCICFG34                            0x00000334
+#define BA0_PCICFG38                            0x00000338
+#define BA0_PCICFG3C                            0x0000033C
+#define BA0_CLKCR1                              0x00000400
+#define BA0_CLKCR2                              0x00000404
+#define BA0_PLLM                                0x00000408
+#define BA0_PLLCC                               0x0000040C
+#define BA0_FRR                                 0x00000410 
+#define BA0_CFL1                                0x00000414
+#define BA0_CFL2                                0x00000418
+#define BA0_SERMC1                              0x00000420
+#define BA0_SERMC2                              0x00000424
+#define BA0_SERC1                               0x00000428
+#define BA0_SERC2                               0x0000042C
+#define BA0_SERC3                               0x00000430
+#define BA0_SERC4                               0x00000434
+#define BA0_SERC5                               0x00000438
+#define BA0_SERBSP                              0x0000043C
+#define BA0_SERBST                              0x00000440
+#define BA0_SERBCM                              0x00000444
+#define BA0_SERBAD                              0x00000448
+#define BA0_SERBCF                              0x0000044C
+#define BA0_SERBWP                              0x00000450
+#define BA0_SERBRP                              0x00000454
+#ifndef NO_CS4612
+#define BA0_ASER_FADDR                          0x00000458
+#endif
+#define BA0_ACCTL                               0x00000460
+#define BA0_ACSTS                               0x00000464
+#define BA0_ACOSV                               0x00000468
+#define BA0_ACCAD                               0x0000046C
+#define BA0_ACCDA                               0x00000470
+#define BA0_ACISV                               0x00000474
+#define BA0_ACSAD                               0x00000478
+#define BA0_ACSDA                               0x0000047C
+#define BA0_JSPT                                0x00000480
+#define BA0_JSCTL                               0x00000484
+#define BA0_JSC1                                0x00000488
+#define BA0_JSC2                                0x0000048C
+#define BA0_MIDCR                               0x00000490
+#define BA0_MIDSR                               0x00000494
+#define BA0_MIDWP                               0x00000498
+#define BA0_MIDRP                               0x0000049C
+#define BA0_JSIO                                0x000004A0
+#ifndef NO_CS4612
+#define BA0_ASER_MASTER                         0x000004A4
+#endif
+#define BA0_CFGI                                0x000004B0
+#define BA0_SSVID                               0x000004B4
+#define BA0_GPIOR                               0x000004B8
+#ifndef NO_CS4612
+#define BA0_EGPIODR                             0x000004BC
+#define BA0_EGPIOPTR                            0x000004C0
+#define BA0_EGPIOTR                             0x000004C4
+#define BA0_EGPIOWR                             0x000004C8
+#define BA0_EGPIOSR                             0x000004CC
+#define BA0_SERC6                               0x000004D0
+#define BA0_SERC7                               0x000004D4
+#define BA0_SERACC                              0x000004D8
+#define BA0_ACCTL2                              0x000004E0
+#define BA0_ACSTS2                              0x000004E4
+#define BA0_ACOSV2                              0x000004E8
+#define BA0_ACCAD2                              0x000004EC
+#define BA0_ACCDA2                              0x000004F0
+#define BA0_ACISV2                              0x000004F4
+#define BA0_ACSAD2                              0x000004F8
+#define BA0_ACSDA2                              0x000004FC
+#define BA0_IOTAC0                              0x00000500
+#define BA0_IOTAC1                              0x00000504
+#define BA0_IOTAC2                              0x00000508
+#define BA0_IOTAC3                              0x0000050C
+#define BA0_IOTAC4                              0x00000510
+#define BA0_IOTAC5                              0x00000514
+#define BA0_IOTAC6                              0x00000518
+#define BA0_IOTAC7                              0x0000051C
+#define BA0_IOTAC8                              0x00000520
+#define BA0_IOTAC9                              0x00000524
+#define BA0_IOTAC10                             0x00000528
+#define BA0_IOTAC11                             0x0000052C
+#define BA0_IOTFR0                              0x00000540
+#define BA0_IOTFR1                              0x00000544
+#define BA0_IOTFR2                              0x00000548
+#define BA0_IOTFR3                              0x0000054C
+#define BA0_IOTFR4                              0x00000550
+#define BA0_IOTFR5                              0x00000554
+#define BA0_IOTFR6                              0x00000558
+#define BA0_IOTFR7                              0x0000055C
+#define BA0_IOTFIFO                             0x00000580
+#define BA0_IOTRRD                              0x00000584
+#define BA0_IOTFP                               0x00000588
+#define BA0_IOTCR                               0x0000058C
+#define BA0_DPCID                               0x00000590
+#define BA0_DPCIA                               0x00000594
+#define BA0_DPCIC                               0x00000598
+#define BA0_PCPCIR                              0x00000600
+#define BA0_PCPCIG                              0x00000604
+#define BA0_PCPCIEN                             0x00000608
+#define BA0_EPCIPMC                             0x00000610
+#endif
+
+/*
+ *  The following define the offsets of the registers and memories accessed via
+ *  base address register one on the CS461x part.
+ */
+#define BA1_SP_DMEM0                            0x00000000
+#define BA1_SP_DMEM1                            0x00010000
+#define BA1_SP_PMEM                             0x00020000
+#define BA1_SP_REG				0x00030000
+#define BA1_SPCR                                0x00030000
+#define BA1_DREG                                0x00030004
+#define BA1_DSRWP                               0x00030008
+#define BA1_TWPR                                0x0003000C
+#define BA1_SPWR                                0x00030010
+#define BA1_SPIR                                0x00030014
+#define BA1_FGR1                                0x00030020
+#define BA1_SPCS                                0x00030028
+#define BA1_SDSR                                0x0003002C
+#define BA1_FRMT                                0x00030030
+#define BA1_FRCC                                0x00030034
+#define BA1_FRSC                                0x00030038
+#define BA1_OMNI_MEM                            0x000E0000
+
+/*
+ *  The following defines are for the flags in the host interrupt status
+ *  register.
+ */
+#define HISR_VC_MASK                            0x0000FFFF
+#define HISR_VC0                                0x00000001
+#define HISR_VC1                                0x00000002
+#define HISR_VC2                                0x00000004
+#define HISR_VC3                                0x00000008
+#define HISR_VC4                                0x00000010
+#define HISR_VC5                                0x00000020
+#define HISR_VC6                                0x00000040
+#define HISR_VC7                                0x00000080
+#define HISR_VC8                                0x00000100
+#define HISR_VC9                                0x00000200
+#define HISR_VC10                               0x00000400
+#define HISR_VC11                               0x00000800
+#define HISR_VC12                               0x00001000
+#define HISR_VC13                               0x00002000
+#define HISR_VC14                               0x00004000
+#define HISR_VC15                               0x00008000
+#define HISR_INT0                               0x00010000
+#define HISR_INT1                               0x00020000
+#define HISR_DMAI                               0x00040000
+#define HISR_FROVR                              0x00080000
+#define HISR_MIDI                               0x00100000
+#ifdef NO_CS4612
+#define HISR_RESERVED                           0x0FE00000
+#else
+#define HISR_SBINT                              0x00200000
+#define HISR_RESERVED                           0x0FC00000
+#endif
+#define HISR_H0P                                0x40000000
+#define HISR_INTENA                             0x80000000
+
+/*
+ *  The following defines are for the flags in the host signal register 0.
+ */
+#define HSR0_VC_MASK                            0xFFFFFFFF
+#define HSR0_VC16                               0x00000001
+#define HSR0_VC17                               0x00000002
+#define HSR0_VC18                               0x00000004
+#define HSR0_VC19                               0x00000008
+#define HSR0_VC20                               0x00000010
+#define HSR0_VC21                               0x00000020
+#define HSR0_VC22                               0x00000040
+#define HSR0_VC23                               0x00000080
+#define HSR0_VC24                               0x00000100
+#define HSR0_VC25                               0x00000200
+#define HSR0_VC26                               0x00000400
+#define HSR0_VC27                               0x00000800
+#define HSR0_VC28                               0x00001000
+#define HSR0_VC29                               0x00002000
+#define HSR0_VC30                               0x00004000
+#define HSR0_VC31                               0x00008000
+#define HSR0_VC32                               0x00010000
+#define HSR0_VC33                               0x00020000
+#define HSR0_VC34                               0x00040000
+#define HSR0_VC35                               0x00080000
+#define HSR0_VC36                               0x00100000
+#define HSR0_VC37                               0x00200000
+#define HSR0_VC38                               0x00400000
+#define HSR0_VC39                               0x00800000
+#define HSR0_VC40                               0x01000000
+#define HSR0_VC41                               0x02000000
+#define HSR0_VC42                               0x04000000
+#define HSR0_VC43                               0x08000000
+#define HSR0_VC44                               0x10000000
+#define HSR0_VC45                               0x20000000
+#define HSR0_VC46                               0x40000000
+#define HSR0_VC47                               0x80000000
+
+/*
+ *  The following defines are for the flags in the host interrupt control
+ *  register.
+ */
+#define HICR_IEV                                0x00000001
+#define HICR_CHGM                               0x00000002
+
+/*
+ *  The following defines are for the flags in the DMA status register.
+ */
+#define DMSR_HP                                 0x00000001
+#define DMSR_HR                                 0x00000002
+#define DMSR_SP                                 0x00000004
+#define DMSR_SR                                 0x00000008
+
+/*
+ *  The following defines are for the flags in the host DMA source address
+ *  register.
+ */
+#define HSAR_HOST_ADDR_MASK                     0xFFFFFFFF
+#define HSAR_DSP_ADDR_MASK                      0x0000FFFF
+#define HSAR_MEMID_MASK                         0x000F0000
+#define HSAR_MEMID_SP_DMEM0                     0x00000000
+#define HSAR_MEMID_SP_DMEM1                     0x00010000
+#define HSAR_MEMID_SP_PMEM                      0x00020000
+#define HSAR_MEMID_SP_DEBUG                     0x00030000
+#define HSAR_MEMID_OMNI_MEM                     0x000E0000
+#define HSAR_END                                0x40000000
+#define HSAR_ERR                                0x80000000
+
+/*
+ *  The following defines are for the flags in the host DMA destination address
+ *  register.
+ */
+#define HDAR_HOST_ADDR_MASK                     0xFFFFFFFF
+#define HDAR_DSP_ADDR_MASK                      0x0000FFFF
+#define HDAR_MEMID_MASK                         0x000F0000
+#define HDAR_MEMID_SP_DMEM0                     0x00000000
+#define HDAR_MEMID_SP_DMEM1                     0x00010000
+#define HDAR_MEMID_SP_PMEM                      0x00020000
+#define HDAR_MEMID_SP_DEBUG                     0x00030000
+#define HDAR_MEMID_OMNI_MEM                     0x000E0000
+#define HDAR_END                                0x40000000
+#define HDAR_ERR                                0x80000000
+
+/*
+ *  The following defines are for the flags in the host DMA control register.
+ */
+#define HDMR_AC_MASK                            0x0000F000
+#define HDMR_AC_8_16                            0x00001000
+#define HDMR_AC_M_S                             0x00002000
+#define HDMR_AC_B_L                             0x00004000
+#define HDMR_AC_S_U                             0x00008000
+
+/*
+ *  The following defines are for the flags in the host DMA control register.
+ */
+#define HDCR_COUNT_MASK                         0x000003FF
+#define HDCR_DONE                               0x00004000
+#define HDCR_OPT                                0x00008000
+#define HDCR_WBD                                0x00400000
+#define HDCR_WBS                                0x00800000
+#define HDCR_DMS_MASK                           0x07000000
+#define HDCR_DMS_LINEAR                         0x00000000
+#define HDCR_DMS_16_DWORDS                      0x01000000
+#define HDCR_DMS_32_DWORDS                      0x02000000
+#define HDCR_DMS_64_DWORDS                      0x03000000
+#define HDCR_DMS_128_DWORDS                     0x04000000
+#define HDCR_DMS_256_DWORDS                     0x05000000
+#define HDCR_DMS_512_DWORDS                     0x06000000
+#define HDCR_DMS_1024_DWORDS                    0x07000000
+#define HDCR_DH                                 0x08000000
+#define HDCR_SMS_MASK                           0x70000000
+#define HDCR_SMS_LINEAR                         0x00000000
+#define HDCR_SMS_16_DWORDS                      0x10000000
+#define HDCR_SMS_32_DWORDS                      0x20000000
+#define HDCR_SMS_64_DWORDS                      0x30000000
+#define HDCR_SMS_128_DWORDS                     0x40000000
+#define HDCR_SMS_256_DWORDS                     0x50000000
+#define HDCR_SMS_512_DWORDS                     0x60000000
+#define HDCR_SMS_1024_DWORDS                    0x70000000
+#define HDCR_SH                                 0x80000000
+#define HDCR_COUNT_SHIFT                        0
+
+/*
+ *  The following defines are for the flags in the performance monitor control
+ *  register.
+ */
+#define PFMC_C1SS_MASK                          0x0000001F
+#define PFMC_C1EV                               0x00000020
+#define PFMC_C1RS                               0x00008000
+#define PFMC_C2SS_MASK                          0x001F0000
+#define PFMC_C2EV                               0x00200000
+#define PFMC_C2RS                               0x80000000
+#define PFMC_C1SS_SHIFT                         0
+#define PFMC_C2SS_SHIFT                         16
+#define PFMC_BUS_GRANT                          0
+#define PFMC_GRANT_AFTER_REQ                    1
+#define PFMC_TRANSACTION                        2
+#define PFMC_DWORD_TRANSFER                     3
+#define PFMC_SLAVE_READ                         4
+#define PFMC_SLAVE_WRITE                        5
+#define PFMC_PREEMPTION                         6
+#define PFMC_DISCONNECT_RETRY                   7
+#define PFMC_INTERRUPT                          8
+#define PFMC_BUS_OWNERSHIP                      9
+#define PFMC_TRANSACTION_LAG                    10
+#define PFMC_PCI_CLOCK                          11
+#define PFMC_SERIAL_CLOCK                       12
+#define PFMC_SP_CLOCK                           13
+
+/*
+ *  The following defines are for the flags in the performance counter value 1
+ *  register.
+ */
+#define PFCV1_PC1V_MASK                         0xFFFFFFFF
+#define PFCV1_PC1V_SHIFT                        0
+
+/*
+ *  The following defines are for the flags in the performance counter value 2
+ *  register.
+ */
+#define PFCV2_PC2V_MASK                         0xFFFFFFFF
+#define PFCV2_PC2V_SHIFT                        0
+
+/*
+ *  The following defines are for the flags in the clock control register 1.
+ */
+#define CLKCR1_OSCS                             0x00000001
+#define CLKCR1_OSCP                             0x00000002
+#define CLKCR1_PLLSS_MASK                       0x0000000C
+#define CLKCR1_PLLSS_SERIAL                     0x00000000
+#define CLKCR1_PLLSS_CRYSTAL                    0x00000004
+#define CLKCR1_PLLSS_PCI                        0x00000008
+#define CLKCR1_PLLSS_RESERVED                   0x0000000C
+#define CLKCR1_PLLP                             0x00000010
+#define CLKCR1_SWCE                             0x00000020
+#define CLKCR1_PLLOS                            0x00000040
+
+/*
+ *  The following defines are for the flags in the clock control register 2.
+ */
+#define CLKCR2_PDIVS_MASK                       0x0000000F
+#define CLKCR2_PDIVS_1                          0x00000001
+#define CLKCR2_PDIVS_2                          0x00000002
+#define CLKCR2_PDIVS_4                          0x00000004
+#define CLKCR2_PDIVS_7                          0x00000007
+#define CLKCR2_PDIVS_8                          0x00000008
+#define CLKCR2_PDIVS_16                         0x00000000
+
+/*
+ *  The following defines are for the flags in the PLL multiplier register.
+ */
+#define PLLM_MASK                               0x000000FF
+#define PLLM_SHIFT                              0
+
+/*
+ *  The following defines are for the flags in the PLL capacitor coefficient
+ *  register.
+ */
+#define PLLCC_CDR_MASK                          0x00000007
+#ifndef NO_CS4610
+#define PLLCC_CDR_240_350_MHZ                   0x00000000
+#define PLLCC_CDR_184_265_MHZ                   0x00000001
+#define PLLCC_CDR_144_205_MHZ                   0x00000002
+#define PLLCC_CDR_111_160_MHZ                   0x00000003
+#define PLLCC_CDR_87_123_MHZ                    0x00000004
+#define PLLCC_CDR_67_96_MHZ                     0x00000005
+#define PLLCC_CDR_52_74_MHZ                     0x00000006
+#define PLLCC_CDR_45_58_MHZ                     0x00000007
+#endif
+#ifndef NO_CS4612
+#define PLLCC_CDR_271_398_MHZ                   0x00000000
+#define PLLCC_CDR_227_330_MHZ                   0x00000001
+#define PLLCC_CDR_167_239_MHZ                   0x00000002
+#define PLLCC_CDR_150_215_MHZ                   0x00000003
+#define PLLCC_CDR_107_154_MHZ                   0x00000004
+#define PLLCC_CDR_98_140_MHZ                    0x00000005
+#define PLLCC_CDR_73_104_MHZ                    0x00000006
+#define PLLCC_CDR_63_90_MHZ                     0x00000007
+#endif
+#define PLLCC_LPF_MASK                          0x000000F8
+#ifndef NO_CS4610
+#define PLLCC_LPF_23850_60000_KHZ               0x00000000
+#define PLLCC_LPF_7960_26290_KHZ                0x00000008
+#define PLLCC_LPF_4160_10980_KHZ                0x00000018
+#define PLLCC_LPF_1740_4580_KHZ                 0x00000038
+#define PLLCC_LPF_724_1910_KHZ                  0x00000078
+#define PLLCC_LPF_317_798_KHZ                   0x000000F8
+#endif
+#ifndef NO_CS4612
+#define PLLCC_LPF_25580_64530_KHZ               0x00000000
+#define PLLCC_LPF_14360_37270_KHZ               0x00000008
+#define PLLCC_LPF_6100_16020_KHZ                0x00000018
+#define PLLCC_LPF_2540_6690_KHZ                 0x00000038
+#define PLLCC_LPF_1050_2780_KHZ                 0x00000078
+#define PLLCC_LPF_450_1160_KHZ                  0x000000F8
+#endif
+
+/*
+ *  The following defines are for the flags in the feature reporting register.
+ */
+#define FRR_FAB_MASK                            0x00000003
+#define FRR_MASK_MASK                           0x0000001C
+#ifdef NO_CS4612
+#define FRR_CFOP_MASK                           0x000000E0
+#else
+#define FRR_CFOP_MASK                           0x00000FE0
+#endif
+#define FRR_CFOP_NOT_DVD                        0x00000020
+#define FRR_CFOP_A3D                            0x00000040
+#define FRR_CFOP_128_PIN                        0x00000080
+#ifndef NO_CS4612
+#define FRR_CFOP_CS4280                         0x00000800
+#endif
+#define FRR_FAB_SHIFT                           0
+#define FRR_MASK_SHIFT                          2
+#define FRR_CFOP_SHIFT                          5
+
+/*
+ *  The following defines are for the flags in the configuration load 1
+ *  register.
+ */
+#define CFL1_CLOCK_SOURCE_MASK                  0x00000003
+#define CFL1_CLOCK_SOURCE_CS423X                0x00000000
+#define CFL1_CLOCK_SOURCE_AC97                  0x00000001
+#define CFL1_CLOCK_SOURCE_CRYSTAL               0x00000002
+#define CFL1_CLOCK_SOURCE_DUAL_AC97             0x00000003
+#define CFL1_VALID_DATA_MASK                    0x000000FF
+
+/*
+ *  The following defines are for the flags in the configuration load 2
+ *  register.
+ */
+#define CFL2_VALID_DATA_MASK                    0x000000FF
+
+/*
+ *  The following defines are for the flags in the serial port master control
+ *  register 1.
+ */
+#define SERMC1_MSPE                             0x00000001
+#define SERMC1_PTC_MASK                         0x0000000E
+#define SERMC1_PTC_CS423X                       0x00000000
+#define SERMC1_PTC_AC97                         0x00000002
+#define SERMC1_PTC_DAC                          0x00000004
+#define SERMC1_PLB                              0x00000010
+#define SERMC1_XLB                              0x00000020
+
+/*
+ *  The following defines are for the flags in the serial port master control
+ *  register 2.
+ */
+#define SERMC2_LROE                             0x00000001
+#define SERMC2_MCOE                             0x00000002
+#define SERMC2_MCDIV                            0x00000004
+
+/*
+ *  The following defines are for the flags in the serial port 1 configuration
+ *  register.
+ */
+#define SERC1_SO1EN                             0x00000001
+#define SERC1_SO1F_MASK                         0x0000000E
+#define SERC1_SO1F_CS423X                       0x00000000
+#define SERC1_SO1F_AC97                         0x00000002
+#define SERC1_SO1F_DAC                          0x00000004
+#define SERC1_SO1F_SPDIF                        0x00000006
+
+/*
+ *  The following defines are for the flags in the serial port 2 configuration
+ *  register.
+ */
+#define SERC2_SI1EN                             0x00000001
+#define SERC2_SI1F_MASK                         0x0000000E
+#define SERC2_SI1F_CS423X                       0x00000000
+#define SERC2_SI1F_AC97                         0x00000002
+#define SERC2_SI1F_ADC                          0x00000004
+#define SERC2_SI1F_SPDIF                        0x00000006
+
+/*
+ *  The following defines are for the flags in the serial port 3 configuration
+ *  register.
+ */
+#define SERC3_SO2EN                             0x00000001
+#define SERC3_SO2F_MASK                         0x00000006
+#define SERC3_SO2F_DAC                          0x00000000
+#define SERC3_SO2F_SPDIF                        0x00000002
+
+/*
+ *  The following defines are for the flags in the serial port 4 configuration
+ *  register.
+ */
+#define SERC4_SO3EN                             0x00000001
+#define SERC4_SO3F_MASK                         0x00000006
+#define SERC4_SO3F_DAC                          0x00000000
+#define SERC4_SO3F_SPDIF                        0x00000002
+
+/*
+ *  The following defines are for the flags in the serial port 5 configuration
+ *  register.
+ */
+#define SERC5_SI2EN                             0x00000001
+#define SERC5_SI2F_MASK                         0x00000006
+#define SERC5_SI2F_ADC                          0x00000000
+#define SERC5_SI2F_SPDIF                        0x00000002
+
+/*
+ *  The following defines are for the flags in the serial port backdoor sample
+ *  pointer register.
+ */
+#define SERBSP_FSP_MASK                         0x0000000F
+#define SERBSP_FSP_SHIFT                        0
+
+/*
+ *  The following defines are for the flags in the serial port backdoor status
+ *  register.
+ */
+#define SERBST_RRDY                             0x00000001
+#define SERBST_WBSY                             0x00000002
+
+/*
+ *  The following defines are for the flags in the serial port backdoor command
+ *  register.
+ */
+#define SERBCM_RDC                              0x00000001
+#define SERBCM_WRC                              0x00000002
+
+/*
+ *  The following defines are for the flags in the serial port backdoor address
+ *  register.
+ */
+#ifdef NO_CS4612
+#define SERBAD_FAD_MASK                         0x000000FF
+#else
+#define SERBAD_FAD_MASK                         0x000001FF
+#endif
+#define SERBAD_FAD_SHIFT                        0
+
+/*
+ *  The following defines are for the flags in the serial port backdoor
+ *  configuration register.
+ */
+#define SERBCF_HBP                              0x00000001
+
+/*
+ *  The following defines are for the flags in the serial port backdoor write
+ *  port register.
+ */
+#define SERBWP_FWD_MASK                         0x000FFFFF
+#define SERBWP_FWD_SHIFT                        0
+
+/*
+ *  The following defines are for the flags in the serial port backdoor read
+ *  port register.
+ */
+#define SERBRP_FRD_MASK                         0x000FFFFF
+#define SERBRP_FRD_SHIFT                        0
+
+/*
+ *  The following defines are for the flags in the async FIFO address register.
+ */
+#ifndef NO_CS4612
+#define ASER_FADDR_A1_MASK                      0x000001FF
+#define ASER_FADDR_EN1                          0x00008000
+#define ASER_FADDR_A2_MASK                      0x01FF0000
+#define ASER_FADDR_EN2                          0x80000000
+#define ASER_FADDR_A1_SHIFT                     0
+#define ASER_FADDR_A2_SHIFT                     16
+#endif
+
+/*
+ *  The following defines are for the flags in the AC97 control register.
+ */
+#define ACCTL_RSTN                              0x00000001
+#define ACCTL_ESYN                              0x00000002
+#define ACCTL_VFRM                              0x00000004
+#define ACCTL_DCV                               0x00000008
+#define ACCTL_CRW                               0x00000010
+#define ACCTL_ASYN                              0x00000020
+#ifndef NO_CS4612
+#define ACCTL_TC                                0x00000040
+#endif
+
+/*
+ *  The following defines are for the flags in the AC97 status register.
+ */
+#define ACSTS_CRDY                              0x00000001
+#define ACSTS_VSTS                              0x00000002
+#ifndef NO_CS4612
+#define ACSTS_WKUP                              0x00000004
+#endif
+
+/*
+ *  The following defines are for the flags in the AC97 output slot valid
+ *  register.
+ */
+#define ACOSV_SLV3                              0x00000001
+#define ACOSV_SLV4                              0x00000002
+#define ACOSV_SLV5                              0x00000004
+#define ACOSV_SLV6                              0x00000008
+#define ACOSV_SLV7                              0x00000010
+#define ACOSV_SLV8                              0x00000020
+#define ACOSV_SLV9                              0x00000040
+#define ACOSV_SLV10                             0x00000080
+#define ACOSV_SLV11                             0x00000100
+#define ACOSV_SLV12                             0x00000200
+
+/*
+ *  The following defines are for the flags in the AC97 command address
+ *  register.
+ */
+#define ACCAD_CI_MASK                           0x0000007F
+#define ACCAD_CI_SHIFT                          0
+
+/*
+ *  The following defines are for the flags in the AC97 command data register.
+ */
+#define ACCDA_CD_MASK                           0x0000FFFF
+#define ACCDA_CD_SHIFT                          0
+
+/*
+ *  The following defines are for the flags in the AC97 input slot valid
+ *  register.
+ */
+#define ACISV_ISV3                              0x00000001
+#define ACISV_ISV4                              0x00000002
+#define ACISV_ISV5                              0x00000004
+#define ACISV_ISV6                              0x00000008
+#define ACISV_ISV7                              0x00000010
+#define ACISV_ISV8                              0x00000020
+#define ACISV_ISV9                              0x00000040
+#define ACISV_ISV10                             0x00000080
+#define ACISV_ISV11                             0x00000100
+#define ACISV_ISV12                             0x00000200
+
+/*
+ *  The following defines are for the flags in the AC97 status address
+ *  register.
+ */
+#define ACSAD_SI_MASK                           0x0000007F
+#define ACSAD_SI_SHIFT                          0
+
+/*
+ *  The following defines are for the flags in the AC97 status data register.
+ */
+#define ACSDA_SD_MASK                           0x0000FFFF
+#define ACSDA_SD_SHIFT                          0
+
+/*
+ *  The following defines are for the flags in the joystick poll/trigger
+ *  register.
+ */
+#define JSPT_CAX                                0x00000001
+#define JSPT_CAY                                0x00000002
+#define JSPT_CBX                                0x00000004
+#define JSPT_CBY                                0x00000008
+#define JSPT_BA1                                0x00000010
+#define JSPT_BA2                                0x00000020
+#define JSPT_BB1                                0x00000040
+#define JSPT_BB2                                0x00000080
+
+/*
+ *  The following defines are for the flags in the joystick control register.
+ */
+#define JSCTL_SP_MASK                           0x00000003
+#define JSCTL_SP_SLOW                           0x00000000
+#define JSCTL_SP_MEDIUM_SLOW                    0x00000001
+#define JSCTL_SP_MEDIUM_FAST                    0x00000002
+#define JSCTL_SP_FAST                           0x00000003
+#define JSCTL_ARE                               0x00000004
+
+/*
+ *  The following defines are for the flags in the joystick coordinate pair 1
+ *  readback register.
+ */
+#define JSC1_Y1V_MASK                           0x0000FFFF
+#define JSC1_X1V_MASK                           0xFFFF0000
+#define JSC1_Y1V_SHIFT                          0
+#define JSC1_X1V_SHIFT                          16
+
+/*
+ *  The following defines are for the flags in the joystick coordinate pair 2
+ *  readback register.
+ */
+#define JSC2_Y2V_MASK                           0x0000FFFF
+#define JSC2_X2V_MASK                           0xFFFF0000
+#define JSC2_Y2V_SHIFT                          0
+#define JSC2_X2V_SHIFT                          16
+
+/*
+ *  The following defines are for the flags in the MIDI control register.
+ */
+#define MIDCR_TXE                               0x00000001	/* Enable transmitting. */
+#define MIDCR_RXE                               0x00000002	/* Enable receiving. */
+#define MIDCR_RIE                               0x00000004	/* Interrupt upon tx ready. */
+#define MIDCR_TIE                               0x00000008	/* Interrupt upon rx ready. */
+#define MIDCR_MLB                               0x00000010	/* Enable midi loopback. */
+#define MIDCR_MRST                              0x00000020	/* Reset interface. */
+
+/*
+ *  The following defines are for the flags in the MIDI status register.
+ */
+#define MIDSR_TBF                               0x00000001	/* Tx FIFO is full. */
+#define MIDSR_RBE                               0x00000002	/* Rx FIFO is empty. */
+
+/*
+ *  The following defines are for the flags in the MIDI write port register.
+ */
+#define MIDWP_MWD_MASK                          0x000000FF
+#define MIDWP_MWD_SHIFT                         0
+
+/*
+ *  The following defines are for the flags in the MIDI read port register.
+ */
+#define MIDRP_MRD_MASK                          0x000000FF
+#define MIDRP_MRD_SHIFT                         0
+
+/*
+ *  The following defines are for the flags in the joystick GPIO register.
+ */
+#define JSIO_DAX                                0x00000001
+#define JSIO_DAY                                0x00000002
+#define JSIO_DBX                                0x00000004
+#define JSIO_DBY                                0x00000008
+#define JSIO_AXOE                               0x00000010
+#define JSIO_AYOE                               0x00000020
+#define JSIO_BXOE                               0x00000040
+#define JSIO_BYOE                               0x00000080
+
+/*
+ *  The following defines are for the flags in the master async/sync serial
+ *  port enable register.
+ */
+#ifndef NO_CS4612
+#define ASER_MASTER_ME                          0x00000001
+#endif
+
+/*
+ *  The following defines are for the flags in the configuration interface
+ *  register.
+ */
+#define CFGI_CLK                                0x00000001
+#define CFGI_DOUT                               0x00000002
+#define CFGI_DIN_EEN                            0x00000004
+#define CFGI_EELD                               0x00000008
+
+/*
+ *  The following defines are for the flags in the subsystem ID and vendor ID
+ *  register.
+ */
+#define SSVID_VID_MASK                          0x0000FFFF
+#define SSVID_SID_MASK                          0xFFFF0000
+#define SSVID_VID_SHIFT                         0
+#define SSVID_SID_SHIFT                         16
+
+/*
+ *  The following defines are for the flags in the GPIO pin interface register.
+ */
+#define GPIOR_VOLDN                             0x00000001
+#define GPIOR_VOLUP                             0x00000002
+#define GPIOR_SI2D                              0x00000004
+#define GPIOR_SI2OE                             0x00000008
+
+/*
+ *  The following defines are for the flags in the extended GPIO pin direction
+ *  register.
+ */
+#ifndef NO_CS4612
+#define EGPIODR_GPOE0                           0x00000001
+#define EGPIODR_GPOE1                           0x00000002
+#define EGPIODR_GPOE2                           0x00000004
+#define EGPIODR_GPOE3                           0x00000008
+#define EGPIODR_GPOE4                           0x00000010
+#define EGPIODR_GPOE5                           0x00000020
+#define EGPIODR_GPOE6                           0x00000040
+#define EGPIODR_GPOE7                           0x00000080
+#define EGPIODR_GPOE8                           0x00000100
+#endif
+
+/*
+ *  The following defines are for the flags in the extended GPIO pin polarity/
+ *  type register.
+ */
+#ifndef NO_CS4612
+#define EGPIOPTR_GPPT0                          0x00000001
+#define EGPIOPTR_GPPT1                          0x00000002
+#define EGPIOPTR_GPPT2                          0x00000004
+#define EGPIOPTR_GPPT3                          0x00000008
+#define EGPIOPTR_GPPT4                          0x00000010
+#define EGPIOPTR_GPPT5                          0x00000020
+#define EGPIOPTR_GPPT6                          0x00000040
+#define EGPIOPTR_GPPT7                          0x00000080
+#define EGPIOPTR_GPPT8                          0x00000100
+#endif
+
+/*
+ *  The following defines are for the flags in the extended GPIO pin sticky
+ *  register.
+ */
+#ifndef NO_CS4612
+#define EGPIOTR_GPS0                            0x00000001
+#define EGPIOTR_GPS1                            0x00000002
+#define EGPIOTR_GPS2                            0x00000004
+#define EGPIOTR_GPS3                            0x00000008
+#define EGPIOTR_GPS4                            0x00000010
+#define EGPIOTR_GPS5                            0x00000020
+#define EGPIOTR_GPS6                            0x00000040
+#define EGPIOTR_GPS7                            0x00000080
+#define EGPIOTR_GPS8                            0x00000100
+#endif
+
+/*
+ *  The following defines are for the flags in the extended GPIO ping wakeup
+ *  register.
+ */
+#ifndef NO_CS4612
+#define EGPIOWR_GPW0                            0x00000001
+#define EGPIOWR_GPW1                            0x00000002
+#define EGPIOWR_GPW2                            0x00000004
+#define EGPIOWR_GPW3                            0x00000008
+#define EGPIOWR_GPW4                            0x00000010
+#define EGPIOWR_GPW5                            0x00000020
+#define EGPIOWR_GPW6                            0x00000040
+#define EGPIOWR_GPW7                            0x00000080
+#define EGPIOWR_GPW8                            0x00000100
+#endif
+
+/*
+ *  The following defines are for the flags in the extended GPIO pin status
+ *  register.
+ */
+#ifndef NO_CS4612
+#define EGPIOSR_GPS0                            0x00000001
+#define EGPIOSR_GPS1                            0x00000002
+#define EGPIOSR_GPS2                            0x00000004
+#define EGPIOSR_GPS3                            0x00000008
+#define EGPIOSR_GPS4                            0x00000010
+#define EGPIOSR_GPS5                            0x00000020
+#define EGPIOSR_GPS6                            0x00000040
+#define EGPIOSR_GPS7                            0x00000080
+#define EGPIOSR_GPS8                            0x00000100
+#endif
+
+/*
+ *  The following defines are for the flags in the serial port 6 configuration
+ *  register.
+ */
+#ifndef NO_CS4612
+#define SERC6_ASDO2EN                           0x00000001
+#endif
+
+/*
+ *  The following defines are for the flags in the serial port 7 configuration
+ *  register.
+ */
+#ifndef NO_CS4612
+#define SERC7_ASDI2EN                           0x00000001
+#define SERC7_POSILB                            0x00000002
+#define SERC7_SIPOLB                            0x00000004
+#define SERC7_SOSILB                            0x00000008
+#define SERC7_SISOLB                            0x00000010
+#endif
+
+/*
+ *  The following defines are for the flags in the serial port AC link
+ *  configuration register.
+ */
+#ifndef NO_CS4612
+#define SERACC_CODEC_TYPE_MASK                  0x00000001
+#define SERACC_CODEC_TYPE_1_03                  0x00000000
+#define SERACC_CODEC_TYPE_2_0                   0x00000001
+#define SERACC_TWO_CODECS                       0x00000002
+#define SERACC_MDM                              0x00000004
+#define SERACC_HSP                              0x00000008
+#endif
+
+/*
+ *  The following defines are for the flags in the AC97 control register 2.
+ */
+#ifndef NO_CS4612
+#define ACCTL2_RSTN                             0x00000001
+#define ACCTL2_ESYN                             0x00000002
+#define ACCTL2_VFRM                             0x00000004
+#define ACCTL2_DCV                              0x00000008
+#define ACCTL2_CRW                              0x00000010
+#define ACCTL2_ASYN                             0x00000020
+#endif
+
+/*
+ *  The following defines are for the flags in the AC97 status register 2.
+ */
+#ifndef NO_CS4612
+#define ACSTS2_CRDY                             0x00000001
+#define ACSTS2_VSTS                             0x00000002
+#endif
+
+/*
+ *  The following defines are for the flags in the AC97 output slot valid
+ *  register 2.
+ */
+#ifndef NO_CS4612
+#define ACOSV2_SLV3                             0x00000001
+#define ACOSV2_SLV4                             0x00000002
+#define ACOSV2_SLV5                             0x00000004
+#define ACOSV2_SLV6                             0x00000008
+#define ACOSV2_SLV7                             0x00000010
+#define ACOSV2_SLV8                             0x00000020
+#define ACOSV2_SLV9                             0x00000040
+#define ACOSV2_SLV10                            0x00000080
+#define ACOSV2_SLV11                            0x00000100
+#define ACOSV2_SLV12                            0x00000200
+#endif
+
+/*
+ *  The following defines are for the flags in the AC97 command address
+ *  register 2.
+ */
+#ifndef NO_CS4612
+#define ACCAD2_CI_MASK                          0x0000007F
+#define ACCAD2_CI_SHIFT                         0
+#endif
+
+/*
+ *  The following defines are for the flags in the AC97 command data register
+ *  2.
+ */
+#ifndef NO_CS4612
+#define ACCDA2_CD_MASK                          0x0000FFFF
+#define ACCDA2_CD_SHIFT                         0  
+#endif
+
+/*
+ *  The following defines are for the flags in the AC97 input slot valid
+ *  register 2.
+ */
+#ifndef NO_CS4612
+#define ACISV2_ISV3                             0x00000001
+#define ACISV2_ISV4                             0x00000002
+#define ACISV2_ISV5                             0x00000004
+#define ACISV2_ISV6                             0x00000008
+#define ACISV2_ISV7                             0x00000010
+#define ACISV2_ISV8                             0x00000020
+#define ACISV2_ISV9                             0x00000040
+#define ACISV2_ISV10                            0x00000080
+#define ACISV2_ISV11                            0x00000100
+#define ACISV2_ISV12                            0x00000200
+#endif
+
+/*
+ *  The following defines are for the flags in the AC97 status address
+ *  register 2.
+ */
+#ifndef NO_CS4612
+#define ACSAD2_SI_MASK                          0x0000007F
+#define ACSAD2_SI_SHIFT                         0
+#endif
+
+/*
+ *  The following defines are for the flags in the AC97 status data register 2.
+ */
+#ifndef NO_CS4612
+#define ACSDA2_SD_MASK                          0x0000FFFF
+#define ACSDA2_SD_SHIFT                         0
+#endif
+
+/*
+ *  The following defines are for the flags in the I/O trap address and control
+ *  registers (all 12).
+ */
+#ifndef NO_CS4612
+#define IOTAC_SA_MASK                           0x0000FFFF
+#define IOTAC_MSK_MASK                          0x000F0000
+#define IOTAC_IODC_MASK                         0x06000000
+#define IOTAC_IODC_16_BIT                       0x00000000
+#define IOTAC_IODC_10_BIT                       0x02000000
+#define IOTAC_IODC_12_BIT                       0x04000000
+#define IOTAC_WSPI                              0x08000000
+#define IOTAC_RSPI                              0x10000000
+#define IOTAC_WSE                               0x20000000
+#define IOTAC_WE                                0x40000000
+#define IOTAC_RE                                0x80000000
+#define IOTAC_SA_SHIFT                          0
+#define IOTAC_MSK_SHIFT                         16
+#endif
+
+/*
+ *  The following defines are for the flags in the I/O trap fast read registers
+ *  (all 8).
+ */
+#ifndef NO_CS4612
+#define IOTFR_D_MASK                            0x0000FFFF
+#define IOTFR_A_MASK                            0x000F0000
+#define IOTFR_R_MASK                            0x0F000000
+#define IOTFR_ALL                               0x40000000
+#define IOTFR_VL                                0x80000000
+#define IOTFR_D_SHIFT                           0
+#define IOTFR_A_SHIFT                           16
+#define IOTFR_R_SHIFT                           24
+#endif
+
+/*
+ *  The following defines are for the flags in the I/O trap FIFO register.
+ */
+#ifndef NO_CS4612
+#define IOTFIFO_BA_MASK                         0x00003FFF
+#define IOTFIFO_S_MASK                          0x00FF0000
+#define IOTFIFO_OF                              0x40000000
+#define IOTFIFO_SPIOF                           0x80000000
+#define IOTFIFO_BA_SHIFT                        0
+#define IOTFIFO_S_SHIFT                         16
+#endif
+
+/*
+ *  The following defines are for the flags in the I/O trap retry read data
+ *  register.
+ */
+#ifndef NO_CS4612
+#define IOTRRD_D_MASK                           0x0000FFFF
+#define IOTRRD_RDV                              0x80000000
+#define IOTRRD_D_SHIFT                          0
+#endif
+
+/*
+ *  The following defines are for the flags in the I/O trap FIFO pointer
+ *  register.
+ */
+#ifndef NO_CS4612
+#define IOTFP_CA_MASK                           0x00003FFF
+#define IOTFP_PA_MASK                           0x3FFF0000
+#define IOTFP_CA_SHIFT                          0
+#define IOTFP_PA_SHIFT                          16
+#endif
+
+/*
+ *  The following defines are for the flags in the I/O trap control register.
+ */
+#ifndef NO_CS4612
+#define IOTCR_ITD                               0x00000001
+#define IOTCR_HRV                               0x00000002
+#define IOTCR_SRV                               0x00000004
+#define IOTCR_DTI                               0x00000008
+#define IOTCR_DFI                               0x00000010
+#define IOTCR_DDP                               0x00000020
+#define IOTCR_JTE                               0x00000040
+#define IOTCR_PPE                               0x00000080
+#endif
+
+/*
+ *  The following defines are for the flags in the direct PCI data register.
+ */
+#ifndef NO_CS4612
+#define DPCID_D_MASK                            0xFFFFFFFF
+#define DPCID_D_SHIFT                           0
+#endif
+
+/*
+ *  The following defines are for the flags in the direct PCI address register.
+ */
+#ifndef NO_CS4612
+#define DPCIA_A_MASK                            0xFFFFFFFF
+#define DPCIA_A_SHIFT                           0
+#endif
+
+/*
+ *  The following defines are for the flags in the direct PCI command register.
+ */
+#ifndef NO_CS4612
+#define DPCIC_C_MASK                            0x0000000F
+#define DPCIC_C_IOREAD                          0x00000002
+#define DPCIC_C_IOWRITE                         0x00000003
+#define DPCIC_BE_MASK                           0x000000F0
+#endif
+
+/*
+ *  The following defines are for the flags in the PC/PCI request register.
+ */
+#ifndef NO_CS4612
+#define PCPCIR_RDC_MASK                         0x00000007
+#define PCPCIR_C_MASK                           0x00007000
+#define PCPCIR_REQ                              0x00008000
+#define PCPCIR_RDC_SHIFT                        0
+#define PCPCIR_C_SHIFT                          12
+#endif
+
+/*
+ *  The following defines are for the flags in the PC/PCI grant register.
+ */ 
+#ifndef NO_CS4612
+#define PCPCIG_GDC_MASK                         0x00000007
+#define PCPCIG_VL                               0x00008000
+#define PCPCIG_GDC_SHIFT                        0
+#endif
+
+/*
+ *  The following defines are for the flags in the PC/PCI master enable
+ *  register.
+ */
+#ifndef NO_CS4612
+#define PCPCIEN_EN                              0x00000001
+#endif
+
+/*
+ *  The following defines are for the flags in the extended PCI power
+ *  management control register.
+ */
+#ifndef NO_CS4612
+#define EPCIPMC_GWU                             0x00000001
+#define EPCIPMC_FSPC                            0x00000002
+#endif 
+
+/*
+ *  The following defines are for the flags in the SP control register.
+ */
+#define SPCR_RUN                                0x00000001
+#define SPCR_STPFR                              0x00000002
+#define SPCR_RUNFR                              0x00000004
+#define SPCR_TICK                               0x00000008
+#define SPCR_DRQEN                              0x00000020
+#define SPCR_RSTSP                              0x00000040
+#define SPCR_OREN                               0x00000080
+#ifndef NO_CS4612
+#define SPCR_PCIINT                             0x00000100
+#define SPCR_OINTD                              0x00000200
+#define SPCR_CRE                                0x00008000
+#endif
+
+/*
+ *  The following defines are for the flags in the debug index register.
+ */
+#define DREG_REGID_MASK                         0x0000007F
+#define DREG_DEBUG                              0x00000080
+#define DREG_RGBK_MASK                          0x00000700
+#define DREG_TRAP                               0x00000800
+#if !defined(NO_CS4612)
+#if !defined(NO_CS4615)
+#define DREG_TRAPX                              0x00001000
+#endif
+#endif
+#define DREG_REGID_SHIFT                        0
+#define DREG_RGBK_SHIFT                         8
+#define DREG_RGBK_REGID_MASK                    0x0000077F
+#define DREG_REGID_R0                           0x00000010
+#define DREG_REGID_R1                           0x00000011
+#define DREG_REGID_R2                           0x00000012
+#define DREG_REGID_R3                           0x00000013
+#define DREG_REGID_R4                           0x00000014
+#define DREG_REGID_R5                           0x00000015
+#define DREG_REGID_R6                           0x00000016
+#define DREG_REGID_R7                           0x00000017
+#define DREG_REGID_R8                           0x00000018
+#define DREG_REGID_R9                           0x00000019
+#define DREG_REGID_RA                           0x0000001A
+#define DREG_REGID_RB                           0x0000001B
+#define DREG_REGID_RC                           0x0000001C
+#define DREG_REGID_RD                           0x0000001D
+#define DREG_REGID_RE                           0x0000001E
+#define DREG_REGID_RF                           0x0000001F
+#define DREG_REGID_RA_BUS_LOW                   0x00000020
+#define DREG_REGID_RA_BUS_HIGH                  0x00000038
+#define DREG_REGID_YBUS_LOW                     0x00000050
+#define DREG_REGID_YBUS_HIGH                    0x00000058
+#define DREG_REGID_TRAP_0                       0x00000100
+#define DREG_REGID_TRAP_1                       0x00000101
+#define DREG_REGID_TRAP_2                       0x00000102
+#define DREG_REGID_TRAP_3                       0x00000103
+#define DREG_REGID_TRAP_4                       0x00000104
+#define DREG_REGID_TRAP_5                       0x00000105
+#define DREG_REGID_TRAP_6                       0x00000106
+#define DREG_REGID_TRAP_7                       0x00000107
+#define DREG_REGID_INDIRECT_ADDRESS             0x0000010E
+#define DREG_REGID_TOP_OF_STACK                 0x0000010F
+#if !defined(NO_CS4612)
+#if !defined(NO_CS4615)
+#define DREG_REGID_TRAP_8                       0x00000110
+#define DREG_REGID_TRAP_9                       0x00000111
+#define DREG_REGID_TRAP_10                      0x00000112
+#define DREG_REGID_TRAP_11                      0x00000113
+#define DREG_REGID_TRAP_12                      0x00000114
+#define DREG_REGID_TRAP_13                      0x00000115
+#define DREG_REGID_TRAP_14                      0x00000116
+#define DREG_REGID_TRAP_15                      0x00000117
+#define DREG_REGID_TRAP_16                      0x00000118
+#define DREG_REGID_TRAP_17                      0x00000119
+#define DREG_REGID_TRAP_18                      0x0000011A
+#define DREG_REGID_TRAP_19                      0x0000011B
+#define DREG_REGID_TRAP_20                      0x0000011C
+#define DREG_REGID_TRAP_21                      0x0000011D
+#define DREG_REGID_TRAP_22                      0x0000011E
+#define DREG_REGID_TRAP_23                      0x0000011F
+#endif
+#endif
+#define DREG_REGID_RSA0_LOW                     0x00000200
+#define DREG_REGID_RSA0_HIGH                    0x00000201
+#define DREG_REGID_RSA1_LOW                     0x00000202
+#define DREG_REGID_RSA1_HIGH                    0x00000203
+#define DREG_REGID_RSA2                         0x00000204
+#define DREG_REGID_RSA3                         0x00000205
+#define DREG_REGID_RSI0_LOW                     0x00000206
+#define DREG_REGID_RSI0_HIGH                    0x00000207
+#define DREG_REGID_RSI1                         0x00000208
+#define DREG_REGID_RSI2                         0x00000209
+#define DREG_REGID_SAGUSTATUS                   0x0000020A
+#define DREG_REGID_RSCONFIG01_LOW               0x0000020B
+#define DREG_REGID_RSCONFIG01_HIGH              0x0000020C
+#define DREG_REGID_RSCONFIG23_LOW               0x0000020D
+#define DREG_REGID_RSCONFIG23_HIGH              0x0000020E
+#define DREG_REGID_RSDMA01E                     0x0000020F
+#define DREG_REGID_RSDMA23E                     0x00000210
+#define DREG_REGID_RSD0_LOW                     0x00000211
+#define DREG_REGID_RSD0_HIGH                    0x00000212
+#define DREG_REGID_RSD1_LOW                     0x00000213
+#define DREG_REGID_RSD1_HIGH                    0x00000214
+#define DREG_REGID_RSD2_LOW                     0x00000215
+#define DREG_REGID_RSD2_HIGH                    0x00000216
+#define DREG_REGID_RSD3_LOW                     0x00000217
+#define DREG_REGID_RSD3_HIGH                    0x00000218
+#define DREG_REGID_SRAR_HIGH                    0x0000021A
+#define DREG_REGID_SRAR_LOW                     0x0000021B
+#define DREG_REGID_DMA_STATE                    0x0000021C
+#define DREG_REGID_CURRENT_DMA_STREAM           0x0000021D
+#define DREG_REGID_NEXT_DMA_STREAM              0x0000021E
+#define DREG_REGID_CPU_STATUS                   0x00000300
+#define DREG_REGID_MAC_MODE                     0x00000301
+#define DREG_REGID_STACK_AND_REPEAT             0x00000302
+#define DREG_REGID_INDEX0                       0x00000304
+#define DREG_REGID_INDEX1                       0x00000305
+#define DREG_REGID_DMA_STATE_0_3                0x00000400
+#define DREG_REGID_DMA_STATE_4_7                0x00000404
+#define DREG_REGID_DMA_STATE_8_11               0x00000408
+#define DREG_REGID_DMA_STATE_12_15              0x0000040C
+#define DREG_REGID_DMA_STATE_16_19              0x00000410
+#define DREG_REGID_DMA_STATE_20_23              0x00000414
+#define DREG_REGID_DMA_STATE_24_27              0x00000418
+#define DREG_REGID_DMA_STATE_28_31              0x0000041C
+#define DREG_REGID_DMA_STATE_32_35              0x00000420
+#define DREG_REGID_DMA_STATE_36_39              0x00000424
+#define DREG_REGID_DMA_STATE_40_43              0x00000428
+#define DREG_REGID_DMA_STATE_44_47              0x0000042C
+#define DREG_REGID_DMA_STATE_48_51              0x00000430
+#define DREG_REGID_DMA_STATE_52_55              0x00000434
+#define DREG_REGID_DMA_STATE_56_59              0x00000438
+#define DREG_REGID_DMA_STATE_60_63              0x0000043C
+#define DREG_REGID_DMA_STATE_64_67              0x00000440
+#define DREG_REGID_DMA_STATE_68_71              0x00000444
+#define DREG_REGID_DMA_STATE_72_75              0x00000448
+#define DREG_REGID_DMA_STATE_76_79              0x0000044C
+#define DREG_REGID_DMA_STATE_80_83              0x00000450
+#define DREG_REGID_DMA_STATE_84_87              0x00000454
+#define DREG_REGID_DMA_STATE_88_91              0x00000458
+#define DREG_REGID_DMA_STATE_92_95              0x0000045C
+#define DREG_REGID_TRAP_SELECT                  0x00000500
+#define DREG_REGID_TRAP_WRITE_0                 0x00000500
+#define DREG_REGID_TRAP_WRITE_1                 0x00000501
+#define DREG_REGID_TRAP_WRITE_2                 0x00000502
+#define DREG_REGID_TRAP_WRITE_3                 0x00000503
+#define DREG_REGID_TRAP_WRITE_4                 0x00000504
+#define DREG_REGID_TRAP_WRITE_5                 0x00000505
+#define DREG_REGID_TRAP_WRITE_6                 0x00000506
+#define DREG_REGID_TRAP_WRITE_7                 0x00000507
+#if !defined(NO_CS4612)
+#if !defined(NO_CS4615)
+#define DREG_REGID_TRAP_WRITE_8                 0x00000510
+#define DREG_REGID_TRAP_WRITE_9                 0x00000511
+#define DREG_REGID_TRAP_WRITE_10                0x00000512
+#define DREG_REGID_TRAP_WRITE_11                0x00000513
+#define DREG_REGID_TRAP_WRITE_12                0x00000514
+#define DREG_REGID_TRAP_WRITE_13                0x00000515
+#define DREG_REGID_TRAP_WRITE_14                0x00000516
+#define DREG_REGID_TRAP_WRITE_15                0x00000517
+#define DREG_REGID_TRAP_WRITE_16                0x00000518
+#define DREG_REGID_TRAP_WRITE_17                0x00000519
+#define DREG_REGID_TRAP_WRITE_18                0x0000051A
+#define DREG_REGID_TRAP_WRITE_19                0x0000051B
+#define DREG_REGID_TRAP_WRITE_20                0x0000051C
+#define DREG_REGID_TRAP_WRITE_21                0x0000051D
+#define DREG_REGID_TRAP_WRITE_22                0x0000051E
+#define DREG_REGID_TRAP_WRITE_23                0x0000051F
+#endif
+#endif
+#define DREG_REGID_MAC0_ACC0_LOW                0x00000600
+#define DREG_REGID_MAC0_ACC1_LOW                0x00000601
+#define DREG_REGID_MAC0_ACC2_LOW                0x00000602
+#define DREG_REGID_MAC0_ACC3_LOW                0x00000603
+#define DREG_REGID_MAC1_ACC0_LOW                0x00000604
+#define DREG_REGID_MAC1_ACC1_LOW                0x00000605
+#define DREG_REGID_MAC1_ACC2_LOW                0x00000606
+#define DREG_REGID_MAC1_ACC3_LOW                0x00000607
+#define DREG_REGID_MAC0_ACC0_MID                0x00000608
+#define DREG_REGID_MAC0_ACC1_MID                0x00000609
+#define DREG_REGID_MAC0_ACC2_MID                0x0000060A
+#define DREG_REGID_MAC0_ACC3_MID                0x0000060B
+#define DREG_REGID_MAC1_ACC0_MID                0x0000060C
+#define DREG_REGID_MAC1_ACC1_MID                0x0000060D
+#define DREG_REGID_MAC1_ACC2_MID                0x0000060E
+#define DREG_REGID_MAC1_ACC3_MID                0x0000060F
+#define DREG_REGID_MAC0_ACC0_HIGH               0x00000610
+#define DREG_REGID_MAC0_ACC1_HIGH               0x00000611
+#define DREG_REGID_MAC0_ACC2_HIGH               0x00000612
+#define DREG_REGID_MAC0_ACC3_HIGH               0x00000613
+#define DREG_REGID_MAC1_ACC0_HIGH               0x00000614
+#define DREG_REGID_MAC1_ACC1_HIGH               0x00000615
+#define DREG_REGID_MAC1_ACC2_HIGH               0x00000616
+#define DREG_REGID_MAC1_ACC3_HIGH               0x00000617
+#define DREG_REGID_RSHOUT_LOW                   0x00000620
+#define DREG_REGID_RSHOUT_MID                   0x00000628
+#define DREG_REGID_RSHOUT_HIGH                  0x00000630
+
+/*
+ *  The following defines are for the flags in the DMA stream requestor write
+ */
+#define DSRWP_DSR_MASK                          0x0000000F
+#define DSRWP_DSR_BG_RQ                         0x00000001
+#define DSRWP_DSR_PRIORITY_MASK                 0x00000006
+#define DSRWP_DSR_PRIORITY_0                    0x00000000
+#define DSRWP_DSR_PRIORITY_1                    0x00000002
+#define DSRWP_DSR_PRIORITY_2                    0x00000004
+#define DSRWP_DSR_PRIORITY_3                    0x00000006
+#define DSRWP_DSR_RQ_PENDING                    0x00000008
+
+/*
+ *  The following defines are for the flags in the trap write port register.
+ */
+#define TWPR_TW_MASK                            0x0000FFFF
+#define TWPR_TW_SHIFT                           0
+
+/*
+ *  The following defines are for the flags in the stack pointer write
+ *  register.
+ */
+#define SPWR_STKP_MASK                          0x0000000F
+#define SPWR_STKP_SHIFT                         0
+
+/*
+ *  The following defines are for the flags in the SP interrupt register.
+ */
+#define SPIR_FRI                                0x00000001
+#define SPIR_DOI                                0x00000002
+#define SPIR_GPI2                               0x00000004
+#define SPIR_GPI3                               0x00000008
+#define SPIR_IP0                                0x00000010
+#define SPIR_IP1                                0x00000020
+#define SPIR_IP2                                0x00000040
+#define SPIR_IP3                                0x00000080
+
+/*
+ *  The following defines are for the flags in the functional group 1 register.
+ */
+#define FGR1_F1S_MASK                           0x0000FFFF
+#define FGR1_F1S_SHIFT                          0
+
+/*
+ *  The following defines are for the flags in the SP clock status register.
+ */
+#define SPCS_FRI                                0x00000001
+#define SPCS_DOI                                0x00000002
+#define SPCS_GPI2                               0x00000004
+#define SPCS_GPI3                               0x00000008
+#define SPCS_IP0                                0x00000010
+#define SPCS_IP1                                0x00000020
+#define SPCS_IP2                                0x00000040
+#define SPCS_IP3                                0x00000080
+#define SPCS_SPRUN                              0x00000100
+#define SPCS_SLEEP                              0x00000200
+#define SPCS_FG                                 0x00000400
+#define SPCS_ORUN                               0x00000800
+#define SPCS_IRQ                                0x00001000
+#define SPCS_FGN_MASK                           0x0000E000
+#define SPCS_FGN_SHIFT                          13
+
+/*
+ *  The following defines are for the flags in the SP DMA requestor status
+ *  register.
+ */
+#define SDSR_DCS_MASK                           0x000000FF
+#define SDSR_DCS_SHIFT                          0
+#define SDSR_DCS_NONE                           0x00000007
+
+/*
+ *  The following defines are for the flags in the frame timer register.
+ */
+#define FRMT_FTV_MASK                           0x0000FFFF
+#define FRMT_FTV_SHIFT                          0
+
+/*
+ *  The following defines are for the flags in the frame timer current count
+ *  register.
+ */
+#define FRCC_FCC_MASK                           0x0000FFFF
+#define FRCC_FCC_SHIFT                          0
+
+/*
+ *  The following defines are for the flags in the frame timer save count
+ *  register.
+ */
+#define FRSC_FCS_MASK                           0x0000FFFF
+#define FRSC_FCS_SHIFT                          0
+
+/*
+ *  The following define the various flags stored in the scatter/gather
+ *  descriptors.
+ */
+#define DMA_SG_NEXT_ENTRY_MASK                  0x00000FF8
+#define DMA_SG_SAMPLE_END_MASK                  0x0FFF0000
+#define DMA_SG_SAMPLE_END_FLAG                  0x10000000
+#define DMA_SG_LOOP_END_FLAG                    0x20000000
+#define DMA_SG_SIGNAL_END_FLAG                  0x40000000
+#define DMA_SG_SIGNAL_PAGE_FLAG                 0x80000000
+#define DMA_SG_NEXT_ENTRY_SHIFT                 3
+#define DMA_SG_SAMPLE_END_SHIFT                 16
+
+/*
+ *  The following define the offsets of the fields within the on-chip generic
+ *  DMA requestor.
+ */
+#define DMA_RQ_CONTROL1                         0x00000000
+#define DMA_RQ_CONTROL2                         0x00000004
+#define DMA_RQ_SOURCE_ADDR                      0x00000008
+#define DMA_RQ_DESTINATION_ADDR                 0x0000000C
+#define DMA_RQ_NEXT_PAGE_ADDR                   0x00000010
+#define DMA_RQ_NEXT_PAGE_SGDESC                 0x00000014
+#define DMA_RQ_LOOP_START_ADDR                  0x00000018
+#define DMA_RQ_POST_LOOP_ADDR                   0x0000001C
+#define DMA_RQ_PAGE_MAP_ADDR                    0x00000020
+
+/*
+ *  The following defines are for the flags in the first control word of the
+ *  on-chip generic DMA requestor.
+ */
+#define DMA_RQ_C1_COUNT_MASK                    0x000003FF
+#define DMA_RQ_C1_DESTINATION_SCATTER           0x00001000
+#define DMA_RQ_C1_SOURCE_GATHER                 0x00002000
+#define DMA_RQ_C1_DONE_FLAG                     0x00004000
+#define DMA_RQ_C1_OPTIMIZE_STATE                0x00008000
+#define DMA_RQ_C1_SAMPLE_END_STATE_MASK         0x00030000
+#define DMA_RQ_C1_FULL_PAGE                     0x00000000
+#define DMA_RQ_C1_BEFORE_SAMPLE_END             0x00010000
+#define DMA_RQ_C1_PAGE_MAP_ERROR                0x00020000
+#define DMA_RQ_C1_AT_SAMPLE_END                 0x00030000
+#define DMA_RQ_C1_LOOP_END_STATE_MASK           0x000C0000
+#define DMA_RQ_C1_NOT_LOOP_END                  0x00000000
+#define DMA_RQ_C1_BEFORE_LOOP_END               0x00040000
+#define DMA_RQ_C1_2PAGE_LOOP_BEGIN              0x00080000
+#define DMA_RQ_C1_LOOP_BEGIN                    0x000C0000
+#define DMA_RQ_C1_PAGE_MAP_MASK                 0x00300000
+#define DMA_RQ_C1_PM_NONE_PENDING               0x00000000
+#define DMA_RQ_C1_PM_NEXT_PENDING               0x00100000
+#define DMA_RQ_C1_PM_RESERVED                   0x00200000
+#define DMA_RQ_C1_PM_LOOP_NEXT_PENDING          0x00300000
+#define DMA_RQ_C1_WRITEBACK_DEST_FLAG           0x00400000
+#define DMA_RQ_C1_WRITEBACK_SRC_FLAG            0x00800000
+#define DMA_RQ_C1_DEST_SIZE_MASK                0x07000000
+#define DMA_RQ_C1_DEST_LINEAR                   0x00000000
+#define DMA_RQ_C1_DEST_MOD16                    0x01000000
+#define DMA_RQ_C1_DEST_MOD32                    0x02000000
+#define DMA_RQ_C1_DEST_MOD64                    0x03000000
+#define DMA_RQ_C1_DEST_MOD128                   0x04000000
+#define DMA_RQ_C1_DEST_MOD256                   0x05000000
+#define DMA_RQ_C1_DEST_MOD512                   0x06000000
+#define DMA_RQ_C1_DEST_MOD1024                  0x07000000
+#define DMA_RQ_C1_DEST_ON_HOST                  0x08000000
+#define DMA_RQ_C1_SOURCE_SIZE_MASK              0x70000000
+#define DMA_RQ_C1_SOURCE_LINEAR                 0x00000000
+#define DMA_RQ_C1_SOURCE_MOD16                  0x10000000
+#define DMA_RQ_C1_SOURCE_MOD32                  0x20000000
+#define DMA_RQ_C1_SOURCE_MOD64                  0x30000000
+#define DMA_RQ_C1_SOURCE_MOD128                 0x40000000
+#define DMA_RQ_C1_SOURCE_MOD256                 0x50000000
+#define DMA_RQ_C1_SOURCE_MOD512                 0x60000000
+#define DMA_RQ_C1_SOURCE_MOD1024                0x70000000
+#define DMA_RQ_C1_SOURCE_ON_HOST                0x80000000
+#define DMA_RQ_C1_COUNT_SHIFT                   0
+
+/*
+ *  The following defines are for the flags in the second control word of the
+ *  on-chip generic DMA requestor.
+ */
+#define DMA_RQ_C2_VIRTUAL_CHANNEL_MASK          0x0000003F
+#define DMA_RQ_C2_VIRTUAL_SIGNAL_MASK           0x00000300
+#define DMA_RQ_C2_NO_VIRTUAL_SIGNAL             0x00000000
+#define DMA_RQ_C2_SIGNAL_EVERY_DMA              0x00000100
+#define DMA_RQ_C2_SIGNAL_SOURCE_PINGPONG        0x00000200
+#define DMA_RQ_C2_SIGNAL_DEST_PINGPONG          0x00000300
+#define DMA_RQ_C2_AUDIO_CONVERT_MASK            0x0000F000
+#define DMA_RQ_C2_AC_NONE                       0x00000000
+#define DMA_RQ_C2_AC_8_TO_16_BIT                0x00001000
+#define DMA_RQ_C2_AC_MONO_TO_STEREO             0x00002000
+#define DMA_RQ_C2_AC_ENDIAN_CONVERT             0x00004000
+#define DMA_RQ_C2_AC_SIGNED_CONVERT             0x00008000
+#define DMA_RQ_C2_LOOP_END_MASK                 0x0FFF0000
+#define DMA_RQ_C2_LOOP_MASK                     0x30000000
+#define DMA_RQ_C2_NO_LOOP                       0x00000000
+#define DMA_RQ_C2_ONE_PAGE_LOOP                 0x10000000
+#define DMA_RQ_C2_TWO_PAGE_LOOP                 0x20000000
+#define DMA_RQ_C2_MULTI_PAGE_LOOP               0x30000000
+#define DMA_RQ_C2_SIGNAL_LOOP_BACK              0x40000000
+#define DMA_RQ_C2_SIGNAL_POST_BEGIN_PAGE        0x80000000
+#define DMA_RQ_C2_VIRTUAL_CHANNEL_SHIFT         0
+#define DMA_RQ_C2_LOOP_END_SHIFT                16
+
+/*
+ *  The following defines are for the flags in the source and destination words
+ *  of the on-chip generic DMA requestor.
+ */
+#define DMA_RQ_SD_ADDRESS_MASK                  0x0000FFFF
+#define DMA_RQ_SD_MEMORY_ID_MASK                0x000F0000
+#define DMA_RQ_SD_SP_PARAM_ADDR                 0x00000000
+#define DMA_RQ_SD_SP_SAMPLE_ADDR                0x00010000
+#define DMA_RQ_SD_SP_PROGRAM_ADDR               0x00020000
+#define DMA_RQ_SD_SP_DEBUG_ADDR                 0x00030000
+#define DMA_RQ_SD_OMNIMEM_ADDR                  0x000E0000
+#define DMA_RQ_SD_END_FLAG                      0x40000000
+#define DMA_RQ_SD_ERROR_FLAG                    0x80000000
+#define DMA_RQ_SD_ADDRESS_SHIFT                 0
+
+/*
+ *  The following defines are for the flags in the page map address word of the
+ *  on-chip generic DMA requestor.
+ */
+#define DMA_RQ_PMA_LOOP_THIRD_PAGE_ENTRY_MASK   0x00000FF8
+#define DMA_RQ_PMA_PAGE_TABLE_MASK              0xFFFFF000
+#define DMA_RQ_PMA_LOOP_THIRD_PAGE_ENTRY_SHIFT  3
+#define DMA_RQ_PMA_PAGE_TABLE_SHIFT             12
+
+#define BA1_VARIDEC_BUF_1       0x000
+
+#define BA1_PDTC                0x0c0    /* BA1_PLAY_DMA_TRANSACTION_COUNT_REG */
+#define BA1_PFIE                0x0c4    /* BA1_PLAY_FORMAT_&_INTERRUPT_ENABLE_REG */
+#define BA1_PBA                 0x0c8    /* BA1_PLAY_BUFFER_ADDRESS */
+#define BA1_PVOL                0x0f8    /* BA1_PLAY_VOLUME_REG */
+#define BA1_PSRC                0x288    /* BA1_PLAY_SAMPLE_RATE_CORRECTION_REG */
+#define BA1_PCTL                0x2a4    /* BA1_PLAY_CONTROL_REG */
+#define BA1_PPI                 0x2b4    /* BA1_PLAY_PHASE_INCREMENT_REG */
+
+#define BA1_CCTL                0x064    /* BA1_CAPTURE_CONTROL_REG */
+#define BA1_CIE                 0x104    /* BA1_CAPTURE_INTERRUPT_ENABLE_REG */
+#define BA1_CBA                 0x10c    /* BA1_CAPTURE_BUFFER_ADDRESS */
+#define BA1_CSRC                0x2c8    /* BA1_CAPTURE_SAMPLE_RATE_CORRECTION_REG */
+#define BA1_CCI                 0x2d8    /* BA1_CAPTURE_COEFFICIENT_INCREMENT_REG */
+#define BA1_CD                  0x2e0    /* BA1_CAPTURE_DELAY_REG */
+#define BA1_CPI                 0x2f4    /* BA1_CAPTURE_PHASE_INCREMENT_REG */
+#define BA1_CVOL                0x2f8    /* BA1_CAPTURE_VOLUME_REG */
+
+#define BA1_CFG1                0x134    /* BA1_CAPTURE_FRAME_GROUP_1_REG */
+#define BA1_CFG2                0x138    /* BA1_CAPTURE_FRAME_GROUP_2_REG */
+#define BA1_CCST                0x13c    /* BA1_CAPTURE_CONSTANT_REG */
+#define BA1_CSPB                0x340    /* BA1_CAPTURE_SPB_ADDRESS */
+
+/*
+ *
+ */
+
+#define CS461X_MODE_OUTPUT	(1<<0)	 /* MIDI UART - output */ 
+#define CS461X_MODE_INPUT	(1<<1)	 /* MIDI UART - input */
+
+#endif				/* __CS461X_H */
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/drivers/sound/cs461x_image.h linux.17p9/drivers/sound/cs461x_image.h
--- linux.vanilla/drivers/sound/cs461x_image.h	Thu Jan  1 01:00:00 1970
+++ linux.17p9/drivers/sound/cs461x_image.h	Sat Jun 24 20:21:15 2000
@@ -0,0 +1,3459 @@
+struct BA1struct BA1Struct = {
+{{ 0x00000000, 0x00003000 },{ 0x00010000, 0x00003800 },{ 0x00020000, 0x00007000 }},
+{0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000163,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00200040,0x00008010,0x00000000,
+0x00000000,0x80000001,0x00000001,0x00060000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00900080,0x00000173,0x00000000,
+0x00000000,0x00000010,0x00800000,0x00900000,
+0xf2c0000f,0x00000200,0x00000000,0x00010600,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000163,0x330300c2,
+0x06000000,0x00000000,0x80008000,0x80008000,
+0x3fc0000f,0x00000301,0x00010400,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00b00000,0x00d0806d,0x330480c3,
+0x04800000,0x00000001,0x00800001,0x0000ffff,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x066a0600,0x06350070,0x0000929d,0x929d929d,
+0x00000000,0x0000735a,0x00000600,0x00000000,
+0x929d735a,0x8734abfe,0x00010000,0x735a735a,
+0xa431ac75,0xa431ac75,0xa431ac75,0xa431ac75,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x0000804f,0x000000c3,
+0x05000000,0x00a00010,0x00000000,0x80008000,
+0x00000000,0x00000000,0x00000700,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000080,0x00a00000,0x0000809a,0x000000c2,
+0x07400000,0x00000000,0x80008000,0xffffffff,
+0x00c80028,0x00005555,0x00000000,0x000107a0,
+0x00c80028,0x000000c2,0x06800000,0x00000000,
+0x06e00080,0x00300000,0x000080bb,0x000000c9,
+0x07a00000,0x04000000,0x80008000,0xffffffff,
+0x00c80028,0x00005555,0x00000000,0x00000780,
+0x00c80028,0x000000c5,0xff800000,0x00000000,
+0x00640080,0x00c00000,0x00008197,0x000000c9,
+0x07800000,0x04000000,0x80008000,0xffffffff,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x0000805e,0x000000c1,
+0x00000000,0x00800000,0x80008000,0x80008000,
+0x00020000,0x0000ffff,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x929d0600,0x929d929d,0x929d929d,0x929d0000,
+0x929d929d,0x929d929d,0x929d929d,0x929d929d,
+0x929d929d,0x00100635,0x060b013f,0x00000004,
+0x00000001,0x007a0002,0x00000000,0x066e0610,
+0x0105929d,0x929d929d,0x929d929d,0x929d929d,
+0x929d929d,0xa431ac75,0x0001735a,0xa431ac75,
+0xa431ac75,0xa431ac75,0xa431ac75,0xa431ac75,
+0xa431ac75,0xa431ac75,0xa431ac75,0xa431ac75,
+0xa431ac75,0xa431ac75,0xa431ac75,0xa431ac75,
+0xa431ac75,0xa431ac75,0xa431ac75,0xa431ac75,
+0xa431ac75,0xa431ac75,0xa431ac75,0xa431ac75,
+0xa431ac75,0xa431ac75,0xa431ac75,0xa431ac75,
+0xa431ac75,0xa431ac75,0xa431ac75,0x735a0051,
+0x00000000,0x929d929d,0x929d929d,0x929d929d,
+0x929d929d,0x929d929d,0x929d929d,0x929d929d,
+0x929d929d,0x929d929d,0x00000000,0x06400136,
+0x0000270f,0x00010000,0x007a0000,0x00000000,
+0x068e0645,0x0105929d,0x929d929d,0x929d929d,
+0x929d929d,0x929d929d,0xa431ac75,0x0001735a,
+0xa431ac75,0xa431ac75,0xa431ac75,0xa431ac75,
+0xa431ac75,0xa431ac75,0xa431ac75,0xa431ac75,
+0xa431ac75,0xa431ac75,0xa431ac75,0xa431ac75,
+0xa431ac75,0xa431ac75,0xa431ac75,0xa431ac75,
+0xa431ac75,0xa431ac75,0xa431ac75,0xa431ac75,
+0xa431ac75,0xa431ac75,0xa431ac75,0xa431ac75,
+0xa431ac75,0xa431ac75,0xa431ac75,0xa431ac75,
+0x735a0100,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00010004,
+0x00040730,0x00001002,0x000f619e,0x00001003,
+0x00001705,0x00001400,0x000a411e,0x00001003,
+0x00040730,0x00001002,0x000f619e,0x00001003,
+0x00009705,0x00001400,0x000a411e,0x00001003,
+0x00040730,0x00001002,0x000f619e,0x00001003,
+0x00011705,0x00001400,0x000a411e,0x00001003,
+0x00040730,0x00001002,0x000f619e,0x00001003,
+0x00019705,0x00001400,0x000a411e,0x00001003,
+0x00040730,0x00001002,0x000f619e,0x00001003,
+0x00021705,0x00001400,0x000a411e,0x00001003,
+0x00040730,0x00001002,0x000f619e,0x00001003,
+0x00029705,0x00001400,0x000a411e,0x00001003,
+0x00040730,0x00001002,0x000f619e,0x00001003,
+0x00031705,0x00001400,0x000a411e,0x00001003,
+0x00040730,0x00001002,0x000f619e,0x00001003,
+0x00039705,0x00001400,0x000a411e,0x00001003,
+0x000fe19e,0x00001003,0x0009c730,0x00001003,
+0x0008e19c,0x00001003,0x000083c1,0x00093040,
+0x00098730,0x00001002,0x000ee19e,0x00001003,
+0x00009705,0x00001400,0x000a211e,0x00001003,
+0x00098730,0x00001002,0x000ee19e,0x00001003,
+0x00011705,0x00001400,0x000a211e,0x00001003,
+0x00098730,0x00001002,0x000ee19e,0x00001003,
+0x00019705,0x00001400,0x000a211e,0x00001003,
+0x00098730,0x00001002,0x000ee19e,0x00001003,
+0x00021705,0x00001400,0x000a211e,0x00001003,
+0x00098730,0x00001002,0x000ee19e,0x00001003,
+0x00029705,0x00001400,0x000a211e,0x00001003,
+0x00098730,0x00001002,0x000ee19e,0x00001003,
+0x00031705,0x00001400,0x000a211e,0x00001003,
+0x00098730,0x00001002,0x000ee19e,0x00001003,
+0x00039705,0x00001400,0x000a211e,0x00001003,
+0x0000a730,0x00001008,0x000e2730,0x00001002,
+0x0000a731,0x00001002,0x0000a731,0x00001002,
+0x0000a731,0x00001002,0x0000a731,0x00001002,
+0x0000a731,0x00001002,0x0000a731,0x00001002,
+0x00000000,0x00000000,0x000f619c,0x00001003,
+0x0007f801,0x000c0000,0x00000037,0x00001000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x000c0000,0x00000000,0x00000000,
+0x0000373c,0x00001000,0x00000000,0x00000000,
+0x000ee19c,0x00001003,0x0007f801,0x000c0000,
+0x00000037,0x00001000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x0000273c,0x00001000,
+0x00000033,0x00001000,0x000e679e,0x00001003,
+0x00007705,0x00001400,0x000ac71e,0x00001003,
+0x00087fc1,0x000c3be0,0x0007f801,0x000c0000,
+0x00000037,0x00001000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x0000a730,0x00001003,
+0x00000033,0x00001000,0x0007f801,0x000c0000,
+0x00000037,0x00001000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x000c0000,
+0x00000032,0x00001000,0x0000273d,0x00001000,
+0x0004a730,0x00001003,0x00000f41,0x00097140,
+0x0000a841,0x0009b240,0x0000a0c1,0x0009f040,
+0x0001c641,0x00093540,0x0001cec1,0x0009b5c0,
+0x00000000,0x00000000,0x0001bf05,0x0003fc40,
+0x00002725,0x000aa400,0x00013705,0x00093a00,
+0x0000002e,0x0009d6c0,0x00038630,0x00001004,
+0x0004ef0a,0x000eb785,0x0003fc8a,0x00000000,
+0x00000000,0x000c70e0,0x0007d182,0x0002c640,
+0x00000630,0x00001004,0x000799b8,0x0002c6c0,
+0x00031705,0x00092240,0x00039f05,0x000932c0,
+0x0003520a,0x00000000,0x00040731,0x0000100b,
+0x00010705,0x000b20c0,0x00000000,0x000eba44,
+0x00032108,0x000c60c4,0x00065208,0x000c2917,
+0x000406b0,0x00001007,0x00012f05,0x00036880,
+0x0002818e,0x000c0000,0x0004410a,0x00000000,
+0x00040630,0x00001007,0x00029705,0x000c0000,
+0x00000000,0x00000000,0x00003fc1,0x0003fc40,
+0x000037c1,0x00091b40,0x00003fc1,0x000911c0,
+0x000037c1,0x000957c0,0x00003fc1,0x000951c0,
+0x000037c1,0x00000000,0x00003fc1,0x000991c0,
+0x000037c1,0x00000000,0x00003fc1,0x0009d1c0,
+0x000037c1,0x00000000,0x0001ccc1,0x000915c0,
+0x0001c441,0x0009d800,0x0009cdc1,0x00091240,
+0x0001c541,0x00091d00,0x0009cfc1,0x00095240,
+0x0001c741,0x00095c80,0x000e8ca9,0x00099240,
+0x000e85ad,0x00095640,0x00069ca9,0x00099d80,
+0x000e952d,0x00099640,0x000eaca9,0x0009d6c0,
+0x000ea5ad,0x00091a40,0x0006bca9,0x0009de80,
+0x000eb52d,0x00095a40,0x000ecca9,0x00099ac0,
+0x000ec5ad,0x0009da40,0x000edca9,0x0009d300,
+0x000a6e0a,0x00001000,0x000ed52d,0x00091e40,
+0x000eeca9,0x00095ec0,0x000ee5ad,0x00099e40,
+0x0006fca9,0x00002500,0x000fb208,0x000c59a0,
+0x000ef52d,0x0009de40,0x00068ca9,0x000912c1,
+0x000683ad,0x00095241,0x00020f05,0x000991c1,
+0x00000000,0x00000000,0x00086f88,0x00001000,
+0x0009cf81,0x000b5340,0x0009c701,0x000b92c0,
+0x0009de81,0x000bd300,0x0009d601,0x000b1700,
+0x0001fd81,0x000b9d80,0x0009f501,0x000b57c0,
+0x000a0f81,0x000bd740,0x00020701,0x000b5c80,
+0x000a1681,0x000b97c0,0x00021601,0x00002500,
+0x000a0701,0x000b9b40,0x000a0f81,0x000b1bc0,
+0x00021681,0x00002d00,0x00020f81,0x000bd800,
+0x000a0701,0x000b5bc0,0x00021601,0x00003500,
+0x000a0f81,0x000b5f40,0x000a0701,0x000bdbc0,
+0x00021681,0x00003d00,0x00020f81,0x000b1d00,
+0x000a0701,0x000b1fc0,0x00021601,0x00020500,
+0x00020f81,0x000b1341,0x000a0701,0x000b9fc0,
+0x00021681,0x00020d00,0x00020f81,0x000bde80,
+0x000a0701,0x000bdfc0,0x00021601,0x00021500,
+0x00020f81,0x000b9341,0x00020701,0x000b53c1,
+0x00021681,0x00021d00,0x000a0f81,0x000d0380,
+0x0000b601,0x000b15c0,0x00007b01,0x00000000,
+0x00007b81,0x000bd1c0,0x00007b01,0x00000000,
+0x00007b81,0x000b91c0,0x00007b01,0x000b57c0,
+0x00007b81,0x000b51c0,0x00007b01,0x000b1b40,
+0x00007b81,0x000b11c0,0x00087b01,0x000c3dc0,
+0x0007e488,0x000d7e45,0x00000000,0x000d7a44,
+0x0007e48a,0x00000000,0x00011f05,0x00084080,
+0x00000000,0x00000000,0x00001705,0x000b3540,
+0x00008a01,0x000bf040,0x00007081,0x000bb5c0,
+0x00055488,0x00000000,0x0000d482,0x0003fc40,
+0x0003fc88,0x00000000,0x0001e401,0x000b3a00,
+0x0001ec81,0x000bd6c0,0x0004ef08,0x000eb784,
+0x000c86b0,0x00001007,0x00008281,0x000bb240,
+0x0000b801,0x000b7140,0x00007888,0x00000000,
+0x0000073c,0x00001000,0x0007f188,0x000c0000,
+0x00000000,0x00000000,0x00055288,0x000c555c,
+0x0005528a,0x000c0000,0x0009fa88,0x000c5d00,
+0x0000fa88,0x00000000,0x00000032,0x00001000,
+0x0000073d,0x00001000,0x0007f188,0x000c0000,
+0x00000000,0x00000000,0x0008c01c,0x00001003,
+0x00002705,0x00001008,0x0008b201,0x000c1392,
+0x0000ba01,0x00000000,0x00008731,0x00001400,
+0x0004c108,0x000fe0c4,0x00057488,0x00000000,
+0x000a6388,0x00001001,0x0008b334,0x000bc141,
+0x0003020e,0x00000000,0x000886b0,0x00001008,
+0x00003625,0x000c5dfa,0x000a638a,0x00001001,
+0x0008020e,0x00001002,0x0008a6b0,0x00001008,
+0x0007f301,0x00000000,0x00000000,0x00000000,
+0x00002725,0x000a8c40,0x000000ae,0x00000000,
+0x000d8630,0x00001008,0x00000000,0x000c74e0,
+0x0007d182,0x0002d640,0x000a8630,0x00001008,
+0x000799b8,0x0002d6c0,0x0000748a,0x000c3ec5,
+0x0007420a,0x000c0000,0x00062208,0x000c4117,
+0x00070630,0x00001009,0x00000000,0x000c0000,
+0x0001022e,0x00000000,0x0003a630,0x00001009,
+0x00000000,0x000c0000,0x00000036,0x00001000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x0002a730,0x00001008,0x0007f801,0x000c0000,
+0x00000037,0x00001000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x0002a730,0x00001008,
+0x00000033,0x00001000,0x0002a705,0x00001008,
+0x00007a01,0x000c0000,0x000e6288,0x000d550a,
+0x0006428a,0x00000000,0x00060730,0x0000100a,
+0x00000000,0x000c0000,0x00000000,0x00000000,
+0x0007aab0,0x00034880,0x00078fb0,0x0000100b,
+0x00057488,0x00000000,0x00033b94,0x00081140,
+0x000183ae,0x00000000,0x000786b0,0x0000100b,
+0x00022f05,0x000c3545,0x0000eb8a,0x00000000,
+0x00042731,0x00001003,0x0007aab0,0x00034880,
+0x00048fb0,0x0000100a,0x00057488,0x00000000,
+0x00033b94,0x00081140,0x000183ae,0x00000000,
+0x000806b0,0x0000100b,0x00022f05,0x00000000,
+0x00007401,0x00091140,0x00048f05,0x000951c0,
+0x00042731,0x00001003,0x0000473d,0x00001000,
+0x000f19b0,0x000bbc47,0x00080000,0x000bffc7,
+0x000fe19e,0x00001003,0x00000000,0x00000000,
+0x0008e19c,0x00001003,0x000083c1,0x00093040,
+0x00000f41,0x00097140,0x0000a841,0x0009b240,
+0x0000a0c1,0x0009f040,0x0001c641,0x00093540,
+0x0001cec1,0x0009b5c0,0x00000000,0x000fdc44,
+0x00055208,0x00000000,0x00010705,0x000a2880,
+0x0000a23a,0x00093a00,0x0003fc8a,0x000df6c5,
+0x0004ef0a,0x000c0000,0x00012f05,0x00036880,
+0x00065308,0x000c2997,0x000d86b0,0x0000100a,
+0x0004410a,0x000d40c7,0x00000000,0x00000000,
+0x00080730,0x00001004,0x00056f0a,0x000ea105,
+0x00000000,0x00000000,0x0000473d,0x00001000,
+0x000f19b0,0x000bbc47,0x00080000,0x000bffc7,
+0x0000273d,0x00001000,0x00000000,0x000eba44,
+0x00048f05,0x0000f440,0x00007401,0x0000f7c0,
+0x00000734,0x00001000,0x00010705,0x000a6880,
+0x00006a88,0x000c75c4,0x00000000,0x000e5084,
+0x00000000,0x000eba44,0x00087401,0x000e4782,
+0x00000734,0x00001000,0x00010705,0x000a6880,
+0x00006a88,0x000c75c4,0x0007c108,0x000c0000,
+0x0007e721,0x000bed40,0x00005f25,0x000badc0,
+0x0003ba97,0x000beb80,0x00065590,0x000b2e00,
+0x00033217,0x00003ec0,0x00065590,0x000b8e40,
+0x0003ed80,0x000491c0,0x00073fb0,0x00074c80,
+0x000283a0,0x0000100c,0x000ee388,0x00042970,
+0x00008301,0x00021ef2,0x000b8f14,0x0000000f,
+0x000c4d8d,0x0000001b,0x000d6dc2,0x000e06c6,
+0x000032ac,0x000c3916,0x0004edc2,0x00074c80,
+0x00078898,0x00001000,0x00038894,0x00000032,
+0x000c4d8d,0x00092e1b,0x000d6dc2,0x000e06c6,
+0x0004edc2,0x000c1956,0x0000722c,0x00034a00,
+0x00041705,0x0009ed40,0x00058730,0x00001400,
+0x000d7488,0x000c3a00,0x00048f05,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000}
+ };
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/drivers/sound/cs46xx.c linux.17p9/drivers/sound/cs46xx.c
--- linux.vanilla/drivers/sound/cs46xx.c	Thu Jan  1 01:00:00 1970
+++ linux.17p9/drivers/sound/cs46xx.c	Tue Jun 27 12:17:43 2000
@@ -0,0 +1,2529 @@
+/*
+ *	Crystal SoundFusion CS46xx driver
+ *
+ *	Copyright 1999-2000 Jaroslav Kysela <perex@suse.cz>
+ *	Copyright 2000 Alan Cox <alan@redhat.com>
+ *
+ *	The core of this code is taken from the ALSA project driver by 
+ *	Jaroslav. Please send Jaroslav the credit for the driver and 
+ *	report bugs in this port to <alan@redhat.com>
+ *
+ *	This program is free software; you can redistribute it and/or modify
+ *	it under the terms of the GNU General Public License as published by
+ *	the Free Software Foundation; either version 2 of the License, or
+ *	(at your option) any later version.
+ *
+ *	This program is distributed in the hope that it will be useful,
+ *	but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *	GNU General Public License for more details.
+ *
+ *	You should have received a copy of the GNU General Public License
+ *	along with this program; if not, write to the Free Software
+ *	Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ */
+ 
+#include <linux/module.h>
+#include <linux/version.h>
+#include <linux/string.h>
+#include <linux/ctype.h>
+#include <linux/ioport.h>
+#include <linux/sched.h>
+#include <linux/delay.h>
+#include <linux/sound.h>
+#include <linux/malloc.h>
+#include <linux/soundcard.h>
+#include <linux/pci.h>
+#include <asm/io.h>
+#include <asm/dma.h>
+#include <linux/init.h>
+#include <linux/poll.h>
+#include <asm/spinlock.h>
+#include <linux/ac97_codec.h>
+#include <asm/uaccess.h>
+#include <asm/hardirq.h>
+
+#include "cs461x.h"
+
+#define ADC_RUNNING	1
+#define DAC_RUNNING	2
+
+#define CS_FMT_16BIT	1		/* These are fixed in fact */
+#define CS_FMT_STEREO	2
+#define CS_FMT_MASK	3
+
+/*
+ *	CS461x definitions
+ */
+ 
+#define CS461X_BA0_SIZE		0x2000
+#define CS461X_BA1_DATA0_SIZE	0x3000
+#define CS461X_BA1_DATA1_SIZE	0x3800
+#define CS461X_BA1_PRG_SIZE	0x7000
+#define CS461X_BA1_REG_SIZE	0x0100
+
+#define GOF_PER_SEC	200
+
+/* an instance of the 4610 channel */
+
+struct cs_channel 
+{
+	int used;
+	int num;
+	void *state;
+};
+
+#define DRIVER_VERSION "0.01"
+
+/* magic numbers to protect our data structures */
+#define CS_CARD_MAGIC		0x46524F4D /* "FROM" */
+#define CS_STATE_MAGIC		0x414c5341 /* "ALSA" */
+#define NR_HW_CH		3
+
+/* maxinum number of AC97 codecs connected, AC97 2.0 defined 4 */
+#define NR_AC97		2
+
+/* minor number of /dev/dspW */
+#define SND_DEV_DSP8	1
+
+/* minor number of /dev/dspW */
+#define SND_DEV_DSP16	1 
+
+static const unsigned sample_size[] = { 1, 2, 2, 4 };
+static const unsigned sample_shift[] = { 0, 1, 1, 2 };
+
+/* "software" or virtual channel, an instance of opened /dev/dsp */
+struct cs_state {
+	unsigned int magic;
+	struct cs_card *card;	/* Card info */
+
+	/* single open lock mechanism, only used for recording */
+	struct semaphore open_sem;
+	struct wait_queue *open_wait;
+
+	/* file mode */
+	mode_t open_mode;
+
+	/* virtual channel number */
+	int virt;
+	
+	struct dmabuf {
+		/* wave sample stuff */
+		unsigned int rate;
+		unsigned char fmt, enable;
+
+		/* hardware channel */
+		struct cs_channel *channel;
+		int pringbuf;		/* Software ring slot */
+		int ppingbuf;		/* Hardware ring slot */
+		void *pbuf;		/* 4K hardware DMA buffer */
+
+		/* OSS buffer management stuff */
+		void *rawbuf;
+		unsigned buforder;
+		unsigned numfrag;
+		unsigned fragshift;
+
+		/* our buffer acts like a circular ring */
+		unsigned hwptr;		/* where dma last started, updated by update_ptr */
+		unsigned swptr;		/* where driver last clear/filled, updated by read/write */
+		int count;		/* bytes to be comsumed or been generated by dma machine */
+		unsigned total_bytes;	/* total bytes dmaed by hardware */
+
+		unsigned error;		/* number of over/underruns */
+		struct wait_queue *wait;	/* put process on wait queue when no more space in buffer */
+
+		/* redundant, but makes calculations easier */
+		unsigned fragsize;
+		unsigned dmasize;
+		unsigned fragsamples;
+
+		/* OSS stuff */
+		unsigned mapped:1;
+		unsigned ready:1;
+		unsigned endcleared:1;
+		unsigned update_flag;
+		unsigned ossfragshift;
+		int ossmaxfrags;
+		unsigned subdivision;
+	} dmabuf;
+};
+
+
+struct cs_card {
+	struct cs_channel channel[2];
+	unsigned int magic;
+
+	/* We keep cs461x cards in a linked list */
+	struct cs_card *next;
+
+	/* The cs461x has a certain amount of cross channel interaction
+	   so we use a single per card lock */
+	spinlock_t lock;
+
+	/* PCI device stuff */
+	struct pci_dev * pci_dev;
+
+	unsigned int pctl, cctl;	/* Hardware DMA flag sets */
+
+	/* soundcore stuff */
+	int dev_audio;
+
+	/* structures for abstraction of hardware facilities, codecs, banks and channels*/
+	struct ac97_codec *ac97_codec[NR_AC97];
+	struct cs_state *states[NR_HW_CH];
+
+	u16 ac97_features;
+	
+	/* hardware resources */
+	unsigned long ba0_addr;
+	unsigned long ba1_addr;
+	u32 irq;
+	
+	/* mappings */
+	void *ba0;
+	union
+	{
+		struct
+		{
+			u8 *data0;
+			u8 *data1;
+			u8 *pmem;
+			u8 *reg;
+		} name;
+		u8 *idx[4];
+	} ba1;
+	
+	/* Function support */
+	struct cs_channel *(*alloc_pcm_channel)(struct cs_card *);
+	struct cs_channel *(*alloc_rec_pcm_channel)(struct cs_card *);
+	void (*free_pcm_channel)(struct cs_card *, int chan);
+};
+
+static struct cs_card *devs = NULL;
+
+static int cs_open_mixdev(struct inode *inode, struct file *file);
+static int cs_release_mixdev(struct inode *inode, struct file *file);
+static int cs_ioctl_mixdev(struct inode *inode, struct file *file, unsigned int cmd,
+				unsigned long arg);
+static loff_t cs_llseek(struct file *file, loff_t offset, int origin);
+
+extern __inline__ unsigned ld2(unsigned int x)
+{
+	unsigned r = 0;
+	
+	if (x >= 0x10000) {
+		x >>= 16;
+		r += 16;
+	}
+	if (x >= 0x100) {
+		x >>= 8;
+		r += 8;
+	}
+	if (x >= 0x10) {
+		x >>= 4;
+		r += 4;
+	}
+	if (x >= 4) {
+		x >>= 2;
+		r += 2;
+	}
+	if (x >= 2)
+		r++;
+	return r;
+}
+
+
+/*
+ *  common I/O routines
+ */
+
+static void cs461x_poke(struct cs_card *codec, unsigned long reg, unsigned int val)
+{
+	writel(val, codec->ba1.idx[(reg >> 16) & 3]+(reg&0xffff));
+}
+
+static unsigned int cs461x_peek(struct cs_card *codec, unsigned long reg)
+{
+	return readl(codec->ba1.idx[(reg >> 16) & 3]+(reg&0xffff));
+}
+
+static void cs461x_pokeBA0(struct cs_card *codec, unsigned long reg, unsigned int val)
+{
+	writel(val, codec->ba0+reg);
+}
+
+static unsigned int cs461x_peekBA0(struct cs_card *codec, unsigned long reg)
+{
+	return readl(codec->ba0+reg);
+}
+
+
+static u16 cs_ac97_get(struct ac97_codec *dev, u8 reg);
+static void cs_ac97_set(struct ac97_codec *dev, u8 reg, u16 data);
+
+static struct cs_channel *cs_alloc_pcm_channel(struct cs_card *card)
+{
+	if(card->channel[1].used==1)
+		return NULL;
+	card->channel[1].used=1;
+	card->channel[1].num=1;
+	return &card->channel[1];
+}
+
+static struct cs_channel *cs_alloc_rec_pcm_channel(struct cs_card *card)
+{
+	if(card->channel[0].used==1)
+		return NULL;
+	card->channel[0].used=1;
+	card->channel[0].num=0;
+	return &card->channel[0];
+}
+
+static void cs_free_pcm_channel(struct cs_card *card, int channel)
+{
+	card->channel[channel].state = NULL;
+	card->channel[channel].used=0;
+}
+
+/* set playback sample rate */
+static unsigned int cs_set_dac_rate(struct cs_state * state, unsigned int rate)
+{	
+	struct dmabuf *dmabuf = &state->dmabuf;
+	unsigned int tmp1, tmp2;
+	unsigned int phiIncr;
+	unsigned int correctionPerGOF, correctionPerSec;
+
+	/*
+	 *  Compute the values used to drive the actual sample rate conversion.
+	 *  The following formulas are being computed, using inline assembly
+	 *  since we need to use 64 bit arithmetic to compute the values:
+	 *
+	 *  phiIncr = floor((Fs,in * 2^26) / Fs,out)
+	 *  correctionPerGOF = floor((Fs,in * 2^26 - Fs,out * phiIncr) /
+         *                                   GOF_PER_SEC)
+         *  ulCorrectionPerSec = Fs,in * 2^26 - Fs,out * phiIncr -M
+         *                       GOF_PER_SEC * correctionPerGOF
+	 *
+	 *  i.e.
+	 *
+	 *  phiIncr:other = dividend:remainder((Fs,in * 2^26) / Fs,out)
+	 *  correctionPerGOF:correctionPerSec =
+	 *      dividend:remainder(ulOther / GOF_PER_SEC)
+	 */
+	tmp1 = rate << 16;
+	phiIncr = tmp1 / 48000;
+	tmp1 -= phiIncr * 48000;
+	tmp1 <<= 10;
+	phiIncr <<= 10;
+	tmp2 = tmp1 / 48000;
+	phiIncr += tmp2;
+	tmp1 -= tmp2 * 48000;
+	correctionPerGOF = tmp1 / GOF_PER_SEC;
+	tmp1 -= correctionPerGOF * GOF_PER_SEC;
+	correctionPerSec = tmp1;
+
+	/*
+	 *  Fill in the SampleRateConverter control block.
+	 */
+	 
+	spin_lock_irq(&state->card->lock);
+	cs461x_poke(state->card, BA1_PSRC,
+	  ((correctionPerSec << 16) & 0xFFFF0000) | (correctionPerGOF & 0xFFFF));
+	cs461x_poke(state->card, BA1_PPI, phiIncr);
+	spin_unlock_irq(&state->card->lock);
+	dmabuf->rate = rate;
+	
+	return rate;
+}
+
+/* set recording sample rate */
+static unsigned int cs_set_adc_rate(struct cs_state * state, unsigned int rate)
+{
+	struct dmabuf *dmabuf = &state->dmabuf;
+	struct cs_card *card = state->card;
+	unsigned int phiIncr, coeffIncr, tmp1, tmp2;
+	unsigned int correctionPerGOF, correctionPerSec, initialDelay;
+	unsigned int frameGroupLength, cnt;
+
+	/*
+	 *  We can only decimate by up to a factor of 1/9th the hardware rate.
+	 *  Correct the value if an attempt is made to stray outside that limit.
+	 */
+	if ((rate * 9) < 48000)
+		rate = 48000 / 9;
+
+	/*
+	 *  We can not capture at at rate greater than the Input Rate (48000).
+	 *  Return an error if an attempt is made to stray outside that limit.
+	 */
+	if (rate > 48000)
+		rate = 48000;
+
+	/*
+	 *  Compute the values used to drive the actual sample rate conversion.
+	 *  The following formulas are being computed, using inline assembly
+	 *  since we need to use 64 bit arithmetic to compute the values:
+	 *
+	 *     coeffIncr = -floor((Fs,out * 2^23) / Fs,in)
+	 *     phiIncr = floor((Fs,in * 2^26) / Fs,out)
+	 *     correctionPerGOF = floor((Fs,in * 2^26 - Fs,out * phiIncr) /
+	 *                                GOF_PER_SEC)
+	 *     correctionPerSec = Fs,in * 2^26 - Fs,out * phiIncr -
+	 *                          GOF_PER_SEC * correctionPerGOF
+	 *     initialDelay = ceil((24 * Fs,in) / Fs,out)
+	 *
+	 * i.e.
+	 *
+	 *     coeffIncr = neg(dividend((Fs,out * 2^23) / Fs,in))
+	 *     phiIncr:ulOther = dividend:remainder((Fs,in * 2^26) / Fs,out)
+	 *     correctionPerGOF:correctionPerSec =
+	 * 	    dividend:remainder(ulOther / GOF_PER_SEC)
+	 *     initialDelay = dividend(((24 * Fs,in) + Fs,out - 1) / Fs,out)
+	 */
+
+	tmp1 = rate << 16;
+	coeffIncr = tmp1 / 48000;
+	tmp1 -= coeffIncr * 48000;
+	tmp1 <<= 7;
+	coeffIncr <<= 7;
+	coeffIncr += tmp1 / 48000;
+	coeffIncr ^= 0xFFFFFFFF;
+	coeffIncr++;
+	tmp1 = 48000 << 16;
+	phiIncr = tmp1 / rate;
+	tmp1 -= phiIncr * rate;
+	tmp1 <<= 10;
+	phiIncr <<= 10;
+	tmp2 = tmp1 / rate;
+	phiIncr += tmp2;
+	tmp1 -= tmp2 * rate;
+	correctionPerGOF = tmp1 / GOF_PER_SEC;
+	tmp1 -= correctionPerGOF * GOF_PER_SEC;
+	correctionPerSec = tmp1;
+	initialDelay = ((48000 * 24) + rate - 1) / rate;
+
+	/*
+	 *  Fill in the VariDecimate control block.
+	 */
+	spin_lock_irq(&card->lock);
+	cs461x_poke(card, BA1_CSRC,
+		((correctionPerSec << 16) & 0xFFFF0000) | (correctionPerGOF & 0xFFFF));
+	cs461x_poke(card, BA1_CCI, coeffIncr);
+	cs461x_poke(card, BA1_CD,
+		(((BA1_VARIDEC_BUF_1 + (initialDelay << 2)) << 16) & 0xFFFF0000) | 0x80);
+	cs461x_poke(card, BA1_CPI, phiIncr);
+	spin_unlock_irq(&card->lock);
+
+	/*
+	 *  Figure out the frame group length for the write back task.  Basically,
+	 *  this is just the factors of 24000 (2^6*3*5^3) that are not present in
+	 *  the output sample rate.
+	 */
+	frameGroupLength = 1;
+	for (cnt = 2; cnt <= 64; cnt *= 2) {
+		if (((rate / cnt) * cnt) != rate)
+			frameGroupLength *= 2;
+	}
+	if (((rate / 3) * 3) != rate) {
+		frameGroupLength *= 3;
+	}
+	for (cnt = 5; cnt <= 125; cnt *= 5) {
+		if (((rate / cnt) * cnt) != rate) 
+			frameGroupLength *= 5;
+        }
+
+	/*
+	 * Fill in the WriteBack control block.
+	 */
+	spin_lock_irq(&card->lock);
+	cs461x_poke(card, BA1_CFG1, frameGroupLength);
+	cs461x_poke(card, BA1_CFG2, (0x00800000 | frameGroupLength));
+	cs461x_poke(card, BA1_CCST, 0x0000FFFF);
+	cs461x_poke(card, BA1_CSPB, ((65536 * rate) / 24000));
+	cs461x_poke(card, (BA1_CSPB + 4), 0x0000FFFF);
+	spin_unlock_irq(&card->lock);
+	dmabuf->rate = rate;
+	return rate;
+}
+
+/* prepare channel attributes for playback */ 
+static void cs_play_setup(struct cs_state *state)
+{
+	struct dmabuf *dmabuf = &state->dmabuf;
+	struct cs_card *card = state->card;
+	unsigned int tmp, tmp1;
+
+	tmp1=16;
+	if (!(dmabuf->fmt & CS_FMT_STEREO))
+		tmp1>>=1;
+	cs461x_poke(card, BA1_PVOL, 0x80008000);
+	cs461x_poke(card, BA1_PBA, virt_to_bus(dmabuf->pbuf));
+	
+	tmp=cs461x_peek(card, BA1_PDTC);
+	tmp&=~0x000003FF;
+	tmp|=tmp1-1;
+	cs461x_poke(card, BA1_PDTC, tmp);
+	
+	tmp=cs461x_peek(card, BA1_PFIE);
+	tmp&=~0x0000F03F;
+	if(!(dmabuf->fmt & CS_FMT_STEREO))
+	{
+		tmp|=0x00002000;
+		tmp|=0x00008000;	/* unsigned */
+	}
+	cs461x_poke(card, BA1_PFIE, tmp);
+
+}
+
+/* prepare channel attributes for recording */
+static void cs_rec_setup(struct cs_state *state)
+{
+	struct cs_card *card = state->card;
+	struct dmabuf *dmabuf = &state->dmabuf;
+	/* set the attenuation to 0dB */
+	cs461x_poke(card, BA1_CVOL, 0x80008000);
+	cs461x_poke(card, BA1_CBA, virt_to_bus(dmabuf->pbuf));
+}
+
+
+/* get current playback/recording dma buffer pointer (byte offset from LBA),
+   called with spinlock held! */
+   
+extern __inline__ unsigned cs_get_dma_addr(struct cs_state *state)
+{
+	struct dmabuf *dmabuf = &state->dmabuf;
+	u32 offset;
+	
+	if (!dmabuf->enable)
+		return 0;
+		
+	offset = dmabuf->pringbuf * 2048;
+	return offset;
+}
+
+static void resync_dma_ptrs(struct cs_state *state)
+{
+	struct dmabuf *dmabuf = &state->dmabuf;
+	int offset;
+	
+	offset = 0;
+	dmabuf->hwptr=dmabuf->swptr = 0;
+	dmabuf->ppingbuf = dmabuf->pringbuf = 0;
+	dmabuf->ppingbuf = 1;
+	if(dmabuf->fmt&CS_FMT_16BIT)
+		memset(dmabuf->pbuf, 0, PAGE_SIZE);
+	else
+		memset(dmabuf->pbuf, 0x80, PAGE_SIZE);
+}
+	
+/* Stop recording (lock held) */
+extern __inline__ void __stop_adc(struct cs_state *state)
+{
+	struct dmabuf *dmabuf = &state->dmabuf;
+	struct cs_card *card = state->card;
+	unsigned int tmp;
+	
+	dmabuf->enable &= ~ADC_RUNNING;
+	
+	tmp=cs461x_peek(card, BA1_CCTL);
+	tmp&=0xFFFF;
+	cs461x_poke(card, BA1_CCTL, tmp);
+	
+}
+
+static void stop_adc(struct cs_state *state)
+{
+	struct cs_card *card = state->card;
+	unsigned long flags;
+
+	spin_lock_irqsave(&card->lock, flags);
+	__stop_adc(state);
+	spin_unlock_irqrestore(&card->lock, flags);
+}
+
+static void start_adc(struct cs_state *state)
+{
+	struct dmabuf *dmabuf = &state->dmabuf;
+	struct cs_card *card = state->card;
+	unsigned long flags;
+	unsigned int tmp;
+
+	spin_lock_irqsave(&card->lock, flags);
+	if ((dmabuf->mapped || dmabuf->count < (signed)dmabuf->dmasize) && dmabuf->ready) {
+		dmabuf->enable |= ADC_RUNNING;
+		tmp=cs461x_peek(card, BA1_CCTL);
+		tmp&=0xFFFF;
+		tmp|=card->cctl;
+		cs461x_poke(card, BA1_CCTL, tmp);
+	}
+	spin_unlock_irqrestore(&card->lock, flags);
+}
+
+/* stop playback (lock held) */
+extern __inline__ void __stop_dac(struct cs_state *state)
+{
+	struct dmabuf *dmabuf = &state->dmabuf;
+	struct cs_card *card = state->card;
+	unsigned int tmp;
+
+	dmabuf->enable &= ~DAC_RUNNING;
+	
+	tmp=cs461x_peek(card, BA1_PCTL);
+	tmp&=0xFFFF;
+	cs461x_poke(card, BA1_PCTL, tmp);
+}
+
+static void stop_dac(struct cs_state *state)
+{
+	struct cs_card *card = state->card;
+	unsigned long flags;
+
+	spin_lock_irqsave(&card->lock, flags);
+	__stop_dac(state);
+	spin_unlock_irqrestore(&card->lock, flags);
+}	
+
+static void start_dac(struct cs_state *state)
+{
+	struct dmabuf *dmabuf = &state->dmabuf;
+	struct cs_card *card = state->card;
+	unsigned long flags;
+	int tmp;
+
+	spin_lock_irqsave(&card->lock, flags);
+	if ((dmabuf->mapped || dmabuf->count > 0) && dmabuf->ready) {
+		if(!(dmabuf->enable&DAC_RUNNING))
+		{
+			dmabuf->enable |= DAC_RUNNING;
+			tmp = cs461x_peek(card, BA1_PCTL);
+			tmp &= 0xFFFF;
+			tmp |= card->pctl;
+			cs461x_poke(card, BA1_PCTL, tmp);
+		}
+	}
+	spin_unlock_irqrestore(&card->lock, flags);
+}
+
+#define DMABUF_DEFAULTORDER (15-PAGE_SHIFT)
+#define DMABUF_MINORDER 1
+
+/* allocate DMA buffer, playback and recording buffer should be allocated seperately */
+static int alloc_dmabuf(struct cs_state *state)
+{
+	struct dmabuf *dmabuf = &state->dmabuf;
+	void *rawbuf = NULL;
+	int order;
+	unsigned long map, mapend;
+
+	/* alloc as big a chunk as we can */
+	for (order = DMABUF_DEFAULTORDER; order >= DMABUF_MINORDER; order--)
+		if((rawbuf = (void *)__get_free_pages(GFP_KERNEL|GFP_DMA, order)))
+			break;
+
+	if (!rawbuf)
+		return -ENOMEM;
+
+#ifdef DEBUG
+	printk("cs461x: allocated %ld (order = %d) bytes at %p\n",
+	       PAGE_SIZE << order, order, rawbuf);
+#endif
+
+	dmabuf->ready  = dmabuf->mapped = 0;
+	dmabuf->rawbuf = rawbuf;
+	dmabuf->buforder = order;
+	
+	/* now mark the pages as reserved; otherwise remap_page_range doesn't do what we want */
+	mapend = MAP_NR(rawbuf + (PAGE_SIZE << order) - 1);
+	for (map = MAP_NR(rawbuf); map <= mapend; map++)
+		set_bit(PG_reserved, &mem_map[map].flags);
+
+	return 0;
+}
+
+/* free DMA buffer */
+static void dealloc_dmabuf(struct cs_state *state)
+{
+	struct dmabuf *dmabuf = &state->dmabuf;
+	unsigned long map, mapend;
+
+	if (dmabuf->rawbuf) {
+		/* undo marking the pages as reserved */
+		mapend = MAP_NR(dmabuf->rawbuf + (PAGE_SIZE << dmabuf->buforder) - 1);
+		for (map = MAP_NR(dmabuf->rawbuf); map <= mapend; map++)
+			clear_bit(PG_reserved, &mem_map[map].flags);
+		free_pages((unsigned long)dmabuf->rawbuf,dmabuf->buforder);
+	}
+	dmabuf->rawbuf = NULL;
+	dmabuf->mapped = dmabuf->ready = 0;
+}
+
+static int prog_dmabuf(struct cs_state *state, unsigned rec)
+{
+	struct dmabuf *dmabuf = &state->dmabuf;
+	unsigned bytepersec;
+	unsigned bufsize;
+	unsigned long flags;
+	int ret;
+	
+	spin_lock_irqsave(&state->card->lock, flags);
+	resync_dma_ptrs(state);
+	dmabuf->total_bytes = 0;
+	dmabuf->count = dmabuf->error = 0;
+	spin_unlock_irqrestore(&state->card->lock, flags);
+
+	/* allocate DMA buffer if not allocated yet */
+	if (!dmabuf->rawbuf)
+		if ((ret = alloc_dmabuf(state)))
+			return ret;
+
+	/* FIXME: figure out all this OSS fragment stuff */
+	bytepersec = dmabuf->rate << sample_shift[dmabuf->fmt];
+	bufsize = PAGE_SIZE << dmabuf->buforder;
+	if (dmabuf->ossfragshift) {
+		if ((1000 << dmabuf->ossfragshift) < bytepersec)
+			dmabuf->fragshift = ld2(bytepersec/1000);
+		else
+			dmabuf->fragshift = dmabuf->ossfragshift;
+	} else {
+		/* lets hand out reasonable big ass buffers by default */
+		dmabuf->fragshift = (dmabuf->buforder + PAGE_SHIFT -2);
+	}
+	dmabuf->numfrag = bufsize >> dmabuf->fragshift;
+	while (dmabuf->numfrag < 4 && dmabuf->fragshift > 3) {
+		dmabuf->fragshift--;
+		dmabuf->numfrag = bufsize >> dmabuf->fragshift;
+	}
+	dmabuf->fragsize = 1 << dmabuf->fragshift;
+	if (dmabuf->ossmaxfrags >= 4 && dmabuf->ossmaxfrags < dmabuf->numfrag)
+		dmabuf->numfrag = dmabuf->ossmaxfrags;
+	dmabuf->fragsamples = dmabuf->fragsize >> sample_shift[dmabuf->fmt];
+	dmabuf->dmasize = dmabuf->numfrag << dmabuf->fragshift;
+
+	memset(dmabuf->rawbuf, (dmabuf->fmt & CS_FMT_16BIT) ? 0 : 0x80,
+	       dmabuf->dmasize);
+
+	/*
+	 *	Now set up the ring 
+	 */
+
+	spin_lock_irqsave(&state->card->lock, flags);
+	if (rec) {
+		cs_rec_setup(state);
+	} else {
+		cs_play_setup(state);
+	}
+	spin_unlock_irqrestore(&state->card->lock, flags);
+
+	/* set the ready flag for the dma buffer */
+	dmabuf->ready = 1;
+
+#ifdef DEBUG
+	printk("cs461x: prog_dmabuf, sample rate = %d, format = %d, numfrag = %d, "
+	       "fragsize = %d dmasize = %d\n",
+	       dmabuf->rate, dmabuf->fmt, dmabuf->numfrag,
+	       dmabuf->fragsize, dmabuf->dmasize);
+#endif
+
+	return 0;
+}
+
+/* we are doing quantum mechanics here, the buffer can only be empty, half or full filled i.e.
+   |------------|------------|   or   |xxxxxxxxxxxx|------------|   or   |xxxxxxxxxxxx|xxxxxxxxxxxx|
+   but we almost always get this
+   |xxxxxx------|------------|   or   |xxxxxxxxxxxx|xxxxx-------|
+   so we have to clear the tail space to "silence"
+   |xxxxxx000000|------------|   or   |xxxxxxxxxxxx|xxxxxx000000|
+*/
+static void cs_clear_tail(struct cs_state *state)
+{
+	struct dmabuf *dmabuf = &state->dmabuf;
+	unsigned swptr;
+	unsigned char silence = (dmabuf->fmt & CS_FMT_16BIT) ? 0 : 0x80;
+	unsigned int len;
+	unsigned long flags;
+
+	spin_lock_irqsave(&state->card->lock, flags);
+	swptr = dmabuf->swptr;
+	spin_unlock_irqrestore(&state->card->lock, flags);
+
+	if (swptr == 0 || swptr == dmabuf->dmasize / 2 || swptr == dmabuf->dmasize)
+		return;
+
+	if (swptr < dmabuf->dmasize/2)
+		len = dmabuf->dmasize/2 - swptr;
+	else
+		len = dmabuf->dmasize - swptr;
+
+	memset(dmabuf->rawbuf + swptr, silence, len);
+
+	spin_lock_irqsave(&state->card->lock, flags);
+	dmabuf->swptr += len;
+	dmabuf->count += len;
+	spin_unlock_irqrestore(&state->card->lock, flags);
+
+	/* restart the dma machine in case it is halted */
+	start_dac(state);
+}
+
+static int drain_dac(struct cs_state *state, int nonblock)
+{
+	struct wait_queue wait = {current, NULL};
+	struct dmabuf *dmabuf = &state->dmabuf;
+	unsigned long flags;
+	unsigned long tmo;
+	int count;
+
+	if (dmabuf->mapped || !dmabuf->ready)
+		return 0;
+
+	add_wait_queue(&dmabuf->wait, &wait);
+	for (;;) {
+		/* It seems that we have to set the current state to TASK_INTERRUPTIBLE
+		   every time to make the process really go to sleep */
+		current->state = TASK_INTERRUPTIBLE;
+
+		spin_lock_irqsave(&state->card->lock, flags);
+		count = dmabuf->count;
+		spin_unlock_irqrestore(&state->card->lock, flags);
+
+		if (count <= 0)
+			break;
+
+		if (signal_pending(current))
+			break;
+
+		if (nonblock) {
+			remove_wait_queue(&dmabuf->wait, &wait);
+			current->state = TASK_RUNNING;
+			return -EBUSY;
+		}
+
+		tmo = (dmabuf->dmasize + 4096 * HZ) / dmabuf->rate;
+		tmo >>= sample_shift[dmabuf->fmt];
+		if (!schedule_timeout(tmo ? tmo : 1) && tmo){
+			printk(KERN_ERR "cs461x: drain_dac, dma timeout?\n");
+			break;
+		}
+	}
+	remove_wait_queue(&dmabuf->wait, &wait);
+	current->state = TASK_RUNNING;
+	if (signal_pending(current))
+		return -ERESTARTSYS;
+
+	return 0;
+}
+
+/* update buffer manangement pointers, especially, dmabuf->count and dmabuf->hwptr */
+static void cs_update_ptr(struct cs_state *state)
+{
+	struct dmabuf *dmabuf = &state->dmabuf;
+	unsigned hwptr, swptr;
+	int clear_cnt = 0;
+	int diff;
+	unsigned char silence;
+
+	/* update hardware pointer */
+	hwptr = cs_get_dma_addr(state);
+	diff = (dmabuf->dmasize + hwptr - dmabuf->hwptr) % dmabuf->dmasize;
+	dmabuf->hwptr = hwptr;
+	dmabuf->total_bytes += diff;
+
+	/* error handling and process wake up for DAC */
+	if (dmabuf->enable == ADC_RUNNING) {
+		if (dmabuf->mapped) {
+			dmabuf->count -= diff;
+			if (dmabuf->count >= (signed)dmabuf->fragsize)
+				wake_up(&dmabuf->wait);
+		} else {
+			dmabuf->count += diff;
+
+			if (dmabuf->count < 0 || dmabuf->count > dmabuf->dmasize) {
+				/* buffer underrun or buffer overrun, we have no way to recover
+				   it here, just stop the machine and let the process force hwptr
+				   and swptr to sync */
+				__stop_adc(state);
+				dmabuf->error++;
+			}
+			else if (!dmabuf->endcleared) {
+				swptr = dmabuf->swptr;
+				silence = (dmabuf->fmt & CS_FMT_16BIT ? 0 : 0x80);
+				if (dmabuf->count < (signed) dmabuf->fragsize) 
+				{
+					clear_cnt = dmabuf->fragsize;
+					if ((swptr + clear_cnt) > dmabuf->dmasize)
+						clear_cnt = dmabuf->dmasize - swptr;
+					memset (dmabuf->rawbuf + swptr, silence, clear_cnt);
+					dmabuf->endcleared = 1;
+				}
+			}			
+			wake_up(&dmabuf->wait);
+		}
+	}
+	/* error handling and process wake up for DAC */
+	if (dmabuf->enable == DAC_RUNNING) {
+		if (dmabuf->mapped) {
+			dmabuf->count += diff;
+			if (dmabuf->count >= (signed)dmabuf->fragsize)
+				wake_up(&dmabuf->wait);
+		} else {
+			dmabuf->count -= diff;
+
+			if (dmabuf->count < 0 || dmabuf->count > dmabuf->dmasize) {
+				/* buffer underrun or buffer overrun, we have no way to recover
+				   it here, just stop the machine and let the process force hwptr
+				   and swptr to sync */
+				__stop_dac(state);
+				dmabuf->error++;
+			}
+			wake_up(&dmabuf->wait);
+		}
+	}
+}
+
+static void cs_record_interrupt(struct cs_state *state)
+{
+	memcpy(state->dmabuf.rawbuf + (2048*state->dmabuf.pringbuf++),
+		state->dmabuf.pbuf+2048*state->dmabuf.ppingbuf++, 2048);
+	state->dmabuf.ppingbuf&=1;
+	if(state->dmabuf.pringbuf > (PAGE_SIZE<<state->dmabuf.buforder)/2048)
+		state->dmabuf.pringbuf=0;
+	cs_update_ptr(state);
+}
+
+static void cs_play_interrupt(struct cs_state *state)
+{
+	memcpy(state->dmabuf.pbuf+2048*state->dmabuf.ppingbuf++,
+		state->dmabuf.rawbuf + (2048*state->dmabuf.pringbuf++), 2048);
+	state->dmabuf.ppingbuf&=1;
+	if(state->dmabuf.pringbuf >= (PAGE_SIZE<<state->dmabuf.buforder)/2048)
+		state->dmabuf.pringbuf=0;
+	cs_update_ptr(state);
+}
+
+static void cs_interrupt(int irq, void *dev_id, struct pt_regs *regs)
+{
+	struct cs_card *card = (struct cs_card *)dev_id;
+	/* Single channel card */
+	struct cs_state *recstate = card->channel[0].state;
+	struct cs_state *playstate = card->channel[1].state;
+	u32 status;
+
+	spin_lock(&card->lock);
+
+	status = cs461x_peekBA0(card, BA0_HISR);
+	
+	if((status&0x7fffffff)==0)
+	{
+		cs461x_pokeBA0(card, BA0_HICR, HICR_CHGM|HICR_IEV);
+		spin_unlock(&card->lock);
+		return;
+	}
+	
+	if((status & HISR_VC0) && playstate && playstate->dmabuf.ready)
+		cs_play_interrupt(playstate);
+	if((status & HISR_VC1) && recstate && recstate->dmabuf.ready)
+		cs_record_interrupt(recstate);
+	
+ 	/* clear 'em */
+	cs461x_pokeBA0(card, BA0_HICR, HICR_CHGM|HICR_IEV);
+	spin_unlock(&card->lock);
+}
+
+static loff_t cs_llseek(struct file *file, loff_t offset, int origin)
+{
+	return -ESPIPE;
+}
+
+/* in this loop, dmabuf.count signifies the amount of data that is waiting to be copied to
+   the user's buffer.  it is filled by the dma machine and drained by this loop. */
+static ssize_t cs_read(struct file *file, char *buffer, size_t count, loff_t *ppos)
+{
+	struct cs_state *state = (struct cs_state *)file->private_data;
+	struct dmabuf *dmabuf = &state->dmabuf;
+	ssize_t ret;
+	unsigned long flags;
+	unsigned swptr;
+	int cnt;
+
+#ifdef DEBUG
+	printk("cs461x: cs_read called, count = %d\n", count);
+#endif
+
+	if (ppos != &file->f_pos)
+		return -ESPIPE;
+	if (dmabuf->mapped)
+		return -ENXIO;
+	if (!dmabuf->ready && (ret = prog_dmabuf(state, 1)))
+		return ret;
+	if (!access_ok(VERIFY_WRITE, buffer, count))
+		return -EFAULT;
+	ret = 0;
+
+	while (count > 0) {
+		spin_lock_irqsave(&state->card->lock, flags);
+		if (dmabuf->count > (signed) dmabuf->dmasize) {
+			/* buffer overrun, we are recovering from sleep_on_timeout,
+			   resync hwptr and swptr, make process flush the buffer */
+			dmabuf->count = dmabuf->dmasize;
+			dmabuf->swptr = dmabuf->hwptr;
+		}
+		swptr = dmabuf->swptr;
+		cnt = dmabuf->dmasize - swptr;
+		if (dmabuf->count < cnt)
+			cnt = dmabuf->count;
+		spin_unlock_irqrestore(&state->card->lock, flags);
+
+		if (cnt > count)
+			cnt = count;
+		if (cnt <= 0) {
+			unsigned long tmo;
+			/* buffer is empty, start the dma machine and wait for data to be
+			   recorded */
+			start_adc(state);
+			if (file->f_flags & O_NONBLOCK) {
+				if (!ret) ret = -EAGAIN;
+				return ret;
+			}
+			/* This isnt strictly right for the 810  but it'll do */
+			tmo = (dmabuf->dmasize * HZ) / (dmabuf->rate * 2);
+			tmo >>= sample_shift[dmabuf->fmt];
+			/* There are two situations when sleep_on_timeout returns, one is when
+			   the interrupt is serviced correctly and the process is waked up by
+			   ISR ON TIME. Another is when timeout is expired, which means that
+			   either interrupt is NOT serviced correctly (pending interrupt) or it
+			   is TOO LATE for the process to be scheduled to run (scheduler latency)
+			   which results in a (potential) buffer overrun. And worse, there is
+			   NOTHING we can do to prevent it. */
+			if (!interruptible_sleep_on_timeout(&dmabuf->wait, tmo)) {
+#ifdef DEBUG
+				printk(KERN_ERR "cs461x: recording schedule timeout, "
+				       "dmasz %u fragsz %u count %i hwptr %u swptr %u\n",
+				       dmabuf->dmasize, dmabuf->fragsize, dmabuf->count,
+				       dmabuf->hwptr, dmabuf->swptr);
+#endif
+				/* a buffer overrun, we delay the recovery untill next time the
+				   while loop begin and we REALLY have space to record */
+			}
+			if (signal_pending(current)) {
+				ret = ret ? ret : -ERESTARTSYS;
+				return ret;
+			}
+			continue;
+		}
+
+		if (copy_to_user(buffer, dmabuf->rawbuf + swptr, cnt)) {
+			if (!ret) ret = -EFAULT;
+			return ret;
+		}
+
+		swptr = (swptr + cnt) % dmabuf->dmasize;
+
+		spin_lock_irqsave(&state->card->lock, flags);
+		dmabuf->swptr = swptr;
+		dmabuf->count -= cnt;
+		spin_unlock_irqrestore(&state->card->lock, flags);
+
+		count -= cnt;
+		buffer += cnt;
+		ret += cnt;
+		start_adc(state);
+	}
+	return ret;
+}
+
+/* in this loop, dmabuf.count signifies the amount of data that is waiting to be dma to
+   the soundcard.  it is drained by the dma machine and filled by this loop. */
+static ssize_t cs_write(struct file *file, const char *buffer, size_t count, loff_t *ppos)
+{
+	struct cs_state *state = (struct cs_state *)file->private_data;
+	struct dmabuf *dmabuf = &state->dmabuf;
+	ssize_t ret;
+	unsigned long flags;
+	unsigned swptr;
+	int cnt;
+
+#ifdef DEBUG
+	printk("cs461x: cs_write called, count = %d\n", count);
+#endif
+
+	if (ppos != &file->f_pos)
+		return -ESPIPE;
+	if (dmabuf->mapped)
+		return -ENXIO;
+	if (!dmabuf->ready && (ret = prog_dmabuf(state, 0)))
+		return ret;
+	if (!access_ok(VERIFY_READ, buffer, count))
+		return -EFAULT;
+	ret = 0;
+
+	while (count > 0) {
+		spin_lock_irqsave(&state->card->lock, flags);
+		if (dmabuf->count < 0) {
+			/* buffer underrun, we are recovering from sleep_on_timeout,
+			   resync hwptr and swptr */
+			dmabuf->count = 0;
+			dmabuf->swptr = dmabuf->hwptr;
+		}
+		swptr = dmabuf->swptr;
+		cnt = dmabuf->dmasize - swptr;
+		if (dmabuf->count + cnt > dmabuf->dmasize)
+			cnt = dmabuf->dmasize - dmabuf->count;
+		spin_unlock_irqrestore(&state->card->lock, flags);
+
+		if (cnt > count)
+			cnt = count;
+		if (cnt <= 0) {
+			unsigned long tmo;
+			/* buffer is full, start the dma machine and wait for data to be
+			   played */
+			start_dac(state);
+			if (file->f_flags & O_NONBLOCK) {
+				if (!ret) ret = -EAGAIN;
+				return ret;
+			}
+			/* Not strictly correct but works */
+			tmo = (dmabuf->dmasize * HZ) / (dmabuf->rate * 2);
+			tmo >>= sample_shift[dmabuf->fmt];
+			/* There are two situations when sleep_on_timeout returns, one is when
+			   the interrupt is serviced correctly and the process is waked up by
+			   ISR ON TIME. Another is when timeout is expired, which means that
+			   either interrupt is NOT serviced correctly (pending interrupt) or it
+			   is TOO LATE for the process to be scheduled to run (scheduler latency)
+			   which results in a (potential) buffer underrun. And worse, there is
+			   NOTHING we can do to prevent it. */
+			if (!interruptible_sleep_on_timeout(&dmabuf->wait, tmo)) {
+#ifdef DEBUG
+				printk(KERN_ERR "cs461x: playback schedule timeout, "
+				       "dmasz %u fragsz %u count %i hwptr %u swptr %u\n",
+				       dmabuf->dmasize, dmabuf->fragsize, dmabuf->count,
+				       dmabuf->hwptr, dmabuf->swptr);
+#endif
+				/* a buffer underrun, we delay the recovery untill next time the
+				   while loop begin and we REALLY have data to play */
+			}
+			if (signal_pending(current)) {
+				if (!ret) ret = -ERESTARTSYS;
+				return ret;
+			}
+			continue;
+		}
+		if (copy_from_user(dmabuf->rawbuf + swptr, buffer, cnt)) {
+			if (!ret) ret = -EFAULT;
+			return ret;
+		}
+
+		swptr = (swptr + cnt) % dmabuf->dmasize;
+
+		spin_lock_irqsave(&state->card->lock, flags);
+		dmabuf->swptr = swptr;
+		dmabuf->count += cnt;
+		dmabuf->endcleared = 0;
+		spin_unlock_irqrestore(&state->card->lock, flags);
+
+		count -= cnt;
+		buffer += cnt;
+		ret += cnt;
+		start_dac(state);
+	}
+	return ret;
+}
+
+static unsigned int cs_poll(struct file *file, struct poll_table_struct *wait)
+{
+	struct cs_state *state = (struct cs_state *)file->private_data;
+	struct dmabuf *dmabuf = &state->dmabuf;
+	unsigned long flags;
+	unsigned int mask = 0;
+
+	if (file->f_mode & FMODE_WRITE)
+		poll_wait(file, &dmabuf->wait, wait);
+	if (file->f_mode & FMODE_READ)
+		poll_wait(file, &dmabuf->wait, wait);
+
+	spin_lock_irqsave(&state->card->lock, flags);
+	cs_update_ptr(state);
+	if (file->f_mode & FMODE_READ) {
+		if (dmabuf->count >= (signed)dmabuf->fragsize)
+			mask |= POLLIN | POLLRDNORM;
+	}
+	if (file->f_mode & FMODE_WRITE) {
+		if (dmabuf->mapped) {
+			if (dmabuf->count >= (signed)dmabuf->fragsize)
+				mask |= POLLOUT | POLLWRNORM;
+		} else {
+			if ((signed)dmabuf->dmasize >= dmabuf->count + (signed)dmabuf->fragsize)
+				mask |= POLLOUT | POLLWRNORM;
+		}
+	}
+	spin_unlock_irqrestore(&state->card->lock, flags);
+
+	return mask;
+}
+
+static int cs_mmap(struct file *file, struct vm_area_struct *vma)
+{
+	return -EINVAL;
+#if 0	
+	struct cs_state *state = (struct cs_state *)file->private_data;
+	struct dmabuf *dmabuf = &state->dmabuf;
+	int ret;
+	unsigned long size;
+	
+
+	if (vma->vm_flags & VM_WRITE) {
+		if ((ret = prog_dmabuf(state, 0)) != 0)
+			return ret;
+	} else if (vma->vm_flags & VM_READ) {
+		if ((ret = prog_dmabuf(state, 1)) != 0)
+			return ret;
+	} else 
+		return -EINVAL;
+
+	if (vma->vm_offset != 0)
+		return -EINVAL;
+	size = vma->vm_end - vma->vm_start;
+	if (size > (PAGE_SIZE << dmabuf->buforder))
+		return -EINVAL;
+	if (remap_page_range(vma->vm_start, virt_to_phys(dmabuf->rawbuf),
+			     size, vma->vm_page_prot))
+		return -EAGAIN;
+	dmabuf->mapped = 1;
+
+	return 0;
+#endif	
+}
+
+static int cs_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg)
+{
+	struct cs_state *state = (struct cs_state *)file->private_data;
+	struct dmabuf *dmabuf = &state->dmabuf;
+	unsigned long flags;
+	audio_buf_info abinfo;
+	count_info cinfo;
+	int val, mapped, ret;
+
+	mapped = ((file->f_mode & FMODE_WRITE) && dmabuf->mapped) ||
+		((file->f_mode & FMODE_READ) && dmabuf->mapped);
+#ifdef DEBUG
+	printk("cs461x: cs_ioctl, command = %2d, arg = 0x%08x\n",
+	       _IOC_NR(cmd), arg ? *(int *)arg : 0);
+#endif
+
+	switch (cmd) 
+	{
+	case OSS_GETVERSION:
+		return put_user(SOUND_VERSION, (int *)arg);
+
+	case SNDCTL_DSP_RESET:
+		/* FIXME: spin_lock ? */
+		if (file->f_mode & FMODE_WRITE) {
+			stop_dac(state);
+			synchronize_irq();
+			dmabuf->ready = 0;
+			resync_dma_ptrs(state);
+			dmabuf->swptr = dmabuf->hwptr = 0;
+			dmabuf->count = dmabuf->total_bytes = 0;
+		}
+		if (file->f_mode & FMODE_READ) {
+			stop_adc(state);
+			synchronize_irq();
+			resync_dma_ptrs(state);
+			dmabuf->ready = 0;
+			dmabuf->swptr = dmabuf->hwptr = 0;
+			dmabuf->count = dmabuf->total_bytes = 0;
+		}
+		return 0;
+
+	case SNDCTL_DSP_SYNC:
+		if (file->f_mode & FMODE_WRITE)
+			return drain_dac(state, file->f_flags & O_NONBLOCK);
+		return 0;
+
+	case SNDCTL_DSP_SPEED: /* set smaple rate */
+		get_user_ret(val, (int *)arg, -EFAULT);
+		if (val >= 0) {
+			if (file->f_mode & FMODE_WRITE) {
+				stop_dac(state);
+				dmabuf->ready = 0;
+				spin_lock_irqsave(&state->card->lock, flags);
+				cs_set_dac_rate(state, val);
+				spin_unlock_irqrestore(&state->card->lock, flags);
+			}
+			if (file->f_mode & FMODE_READ) {
+				stop_adc(state);
+				dmabuf->ready = 0;
+				spin_lock_irqsave(&state->card->lock, flags);
+				cs_set_adc_rate(state, val);
+				spin_unlock_irqrestore(&state->card->lock, flags);
+			}
+		}
+		return put_user(dmabuf->rate, (int *)arg);
+
+	case SNDCTL_DSP_STEREO: /* set stereo or mono channel */
+		get_user_ret(val, (int *)arg, -EFAULT);
+		if (file->f_mode & FMODE_WRITE) {
+			stop_dac(state);
+			dmabuf->ready = 0;
+			if(val)
+				dmabuf->fmt |= CS_FMT_STEREO;
+			else
+				dmabuf->fmt &= ~CS_FMT_STEREO;
+		}
+		if (file->f_mode & FMODE_READ) {
+			stop_adc(state);
+			dmabuf->ready = 0;
+			if(val)
+				dmabuf->fmt |= CS_FMT_STEREO;
+			else
+				dmabuf->fmt &= ~CS_FMT_STEREO;
+		}
+		return 0;
+
+	case SNDCTL_DSP_GETBLKSIZE:
+		if (file->f_mode & FMODE_WRITE) {
+			if ((val = prog_dmabuf(state, 0)))
+				return val;
+			return put_user(dmabuf->fragsize, (int *)arg);
+		}
+		if (file->f_mode & FMODE_READ) {
+			if ((val = prog_dmabuf(state, 1)))
+				return val;
+			return put_user(dmabuf->fragsize, (int *)arg);
+		}
+
+	case SNDCTL_DSP_GETFMTS: /* Returns a mask of supported sample format*/
+		return put_user(AFMT_S16_LE|AFMT_U8, (int *)arg);
+
+	case SNDCTL_DSP_SETFMT: /* Select sample format */
+		get_user_ret(val, (int *)arg, -EFAULT);
+		if (val != AFMT_QUERY) {
+			if(val==AFMT_S16_LE || val==AFMT_U8)
+			{
+				if (file->f_mode & FMODE_WRITE) {
+					stop_dac(state);
+					dmabuf->ready = 0;
+				}
+				if (file->f_mode & FMODE_READ) {
+					stop_adc(state);
+					dmabuf->ready = 0;
+				}
+				if(val==AFMT_S16_LE)
+					dmabuf->fmt |= CS_FMT_16BIT;
+				else
+					dmabuf->fmt &= ~CS_FMT_16BIT;
+			}
+		}
+		if(dmabuf->fmt&CS_FMT_16BIT)
+			return put_user(AFMT_S16_LE, (int *)arg);
+		else
+			return put_user(AFMT_U8, (int *)arg);
+
+	case SNDCTL_DSP_CHANNELS:
+		get_user_ret(val, (int *)arg, -EFAULT);
+		if (val != 0) {
+			if (file->f_mode & FMODE_WRITE) {
+				stop_dac(state);
+				dmabuf->ready = 0;
+			}
+			if (file->f_mode & FMODE_READ) {
+				stop_adc(state);
+				dmabuf->ready = 0;
+			}
+		}
+		return put_user(2, (int *)arg);
+
+	case SNDCTL_DSP_POST:
+		/* FIXME: the same as RESET ?? */
+		return 0;
+
+	case SNDCTL_DSP_SUBDIVIDE:
+		if (dmabuf->subdivision)
+			return -EINVAL;
+		get_user_ret(val, (int *)arg, -EFAULT);
+		if (val != 1 && val != 2 && val != 4)
+			return -EINVAL;
+		dmabuf->subdivision = val;
+		return 0;
+
+	case SNDCTL_DSP_SETFRAGMENT:
+		get_user_ret(val, (int *)arg, -EFAULT);
+
+		dmabuf->ossfragshift = val & 0xffff;
+		dmabuf->ossmaxfrags = (val >> 16) & 0xffff;
+		/* Fragments must be 2K long */
+		dmabuf->ossfragshift = 9;
+		if (dmabuf->ossmaxfrags < 4)
+			dmabuf->ossmaxfrags = 4;
+		return 0;
+
+	case SNDCTL_DSP_GETOSPACE:
+		if (!(file->f_mode & FMODE_WRITE))
+			return -EINVAL;
+		if (!dmabuf->enable && (val = prog_dmabuf(state, 0)) != 0)
+			return val;
+		spin_lock_irqsave(&state->card->lock, flags);
+		cs_update_ptr(state);
+		abinfo.fragsize = dmabuf->fragsize;
+		abinfo.bytes = dmabuf->dmasize - dmabuf->count;
+		abinfo.fragstotal = dmabuf->numfrag;
+		abinfo.fragments = abinfo.bytes >> dmabuf->fragshift;
+		spin_unlock_irqrestore(&state->card->lock, flags);
+		return copy_to_user((void *)arg, &abinfo, sizeof(abinfo)) ? -EFAULT : 0;
+
+	case SNDCTL_DSP_GETISPACE:
+		if (!(file->f_mode & FMODE_READ))
+			return -EINVAL;
+		if (!dmabuf->enable && (val = prog_dmabuf(state, 1)) != 0)
+			return val;
+		spin_lock_irqsave(&state->card->lock, flags);
+		cs_update_ptr(state);
+		abinfo.fragsize = dmabuf->fragsize;
+		abinfo.bytes = dmabuf->count;
+		abinfo.fragstotal = dmabuf->numfrag;
+		abinfo.fragments = abinfo.bytes >> dmabuf->fragshift;
+		spin_unlock_irqrestore(&state->card->lock, flags);
+		return copy_to_user((void *)arg, &abinfo, sizeof(abinfo)) ? -EFAULT : 0;
+
+	case SNDCTL_DSP_NONBLOCK:
+		file->f_flags |= O_NONBLOCK;
+		return 0;
+
+	case SNDCTL_DSP_GETCAPS:
+	    return put_user(DSP_CAP_REALTIME|DSP_CAP_TRIGGER|DSP_CAP_MMAP,
+			    (int *)arg);
+
+	case SNDCTL_DSP_GETTRIGGER:
+		val = 0;
+		if (file->f_mode & FMODE_READ && dmabuf->enable)
+			val |= PCM_ENABLE_INPUT;
+		if (file->f_mode & FMODE_WRITE && dmabuf->enable)
+			val |= PCM_ENABLE_OUTPUT;
+		return put_user(val, (int *)arg);
+
+	case SNDCTL_DSP_SETTRIGGER:
+		get_user_ret(val, (int *)arg, -EFAULT);
+		if (file->f_mode & FMODE_READ) {
+			if (val & PCM_ENABLE_INPUT) {
+				if (!dmabuf->ready && (ret = prog_dmabuf(state, 1)))
+					return ret;
+				start_adc(state);
+			} else
+				stop_adc(state);
+		}
+		if (file->f_mode & FMODE_WRITE) {
+			if (val & PCM_ENABLE_OUTPUT) {
+				if (!dmabuf->ready && (ret = prog_dmabuf(state, 0)))
+					return ret;
+				start_dac(state);
+			} else
+				stop_dac(state);
+		}
+		return 0;
+
+	case SNDCTL_DSP_GETIPTR:
+		if (!(file->f_mode & FMODE_READ))
+			return -EINVAL;
+		spin_lock_irqsave(&state->card->lock, flags);
+		cs_update_ptr(state);
+		cinfo.bytes = dmabuf->total_bytes;
+		cinfo.blocks = dmabuf->count >> dmabuf->fragshift;
+		cinfo.ptr = dmabuf->hwptr;
+		if (dmabuf->mapped)
+			dmabuf->count &= dmabuf->fragsize-1;
+		spin_unlock_irqrestore(&state->card->lock, flags);
+		return copy_to_user((void *)arg, &cinfo, sizeof(cinfo));
+
+	case SNDCTL_DSP_GETOPTR:
+		if (!(file->f_mode & FMODE_WRITE))
+			return -EINVAL;
+		spin_lock_irqsave(&state->card->lock, flags);
+		cs_update_ptr(state);
+		cinfo.bytes = dmabuf->total_bytes;
+		cinfo.blocks = dmabuf->count >> dmabuf->fragshift;
+		cinfo.ptr = dmabuf->hwptr;
+		if (dmabuf->mapped)
+			dmabuf->count &= dmabuf->fragsize-1;
+		spin_unlock_irqrestore(&state->card->lock, flags);
+		return copy_to_user((void *)arg, &cinfo, sizeof(cinfo));
+
+	case SNDCTL_DSP_SETDUPLEX:
+		return -EINVAL;
+
+	case SNDCTL_DSP_GETODELAY:
+		if (!(file->f_mode & FMODE_WRITE))
+			return -EINVAL;
+		spin_lock_irqsave(&state->card->lock, flags);
+		cs_update_ptr(state);
+		val = dmabuf->count;
+		spin_unlock_irqrestore(&state->card->lock, flags);
+		return put_user(val, (int *)arg);
+
+	case SOUND_PCM_READ_RATE:
+		return put_user(dmabuf->rate, (int *)arg);
+
+	case SOUND_PCM_READ_CHANNELS:
+		return put_user((dmabuf->fmt & CS_FMT_STEREO) ? 2 : 1,
+				(int *)arg);
+
+	case SOUND_PCM_READ_BITS:
+		return put_user(AFMT_S16_LE, (int *)arg);
+
+	case SNDCTL_DSP_MAPINBUF:
+	case SNDCTL_DSP_MAPOUTBUF:
+	case SNDCTL_DSP_SETSYNCRO:
+	case SOUND_PCM_WRITE_FILTER:
+	case SOUND_PCM_READ_FILTER:
+		return -EINVAL;
+	}
+	return -EINVAL;
+}
+
+static int cs_open(struct inode *inode, struct file *file)
+{
+	int i = 0;
+	struct cs_card *card = devs;
+	struct cs_state *state = NULL;
+	struct dmabuf *dmabuf = NULL;
+
+	/* find an avaiable virtual channel (instance of /dev/dsp) */
+	while (card != NULL) {
+		for (i = 0; i < NR_HW_CH; i++) {
+			if (card->states[i] == NULL) {
+				state = card->states[i] = (struct cs_state *)
+					kmalloc(sizeof(struct cs_state), GFP_KERNEL);
+				if (state == NULL)
+					return -ENOMEM;
+				memset(state, 0, sizeof(struct cs_state));
+				dmabuf = &state->dmabuf;
+				dmabuf->pbuf = (void *)get_free_page(GFP_KERNEL);
+				if(dmabuf->pbuf==NULL)
+				{
+					kfree(state);
+					card->states[i]=NULL;
+					return -ENOMEM;
+				}
+				goto found_virt;
+			}
+		}
+		card = card->next;
+	}
+	/* no more virtual channel avaiable */
+	if (!state)
+		return -ENODEV;
+
+ found_virt:
+	/* found a free virtual channel, allocate hardware channels */
+	if(file->f_mode & FMODE_READ)
+		dmabuf->channel = card->alloc_rec_pcm_channel(card);
+	else
+		dmabuf->channel = card->alloc_pcm_channel(card);
+		
+	if (dmabuf->channel == NULL) {
+		kfree (card->states[i]);
+		card->states[i] = NULL;;
+		return -ENODEV;
+	}
+
+	dmabuf->channel->state = state;
+	/* initialize the virtual channel */
+	state->virt = i;
+	state->card = card;
+	state->magic = CS_STATE_MAGIC;
+	dmabuf->wait = NULL;
+	state->open_sem = MUTEX;
+	file->private_data = state;
+
+	down(&state->open_sem);
+
+	/* set default sample format. According to OSS Programmer's Guide  /dev/dsp
+	   should be default to unsigned 8-bits, mono, with sample rate 8kHz and
+	   /dev/dspW will accept 16-bits sample */
+	if (file->f_mode & FMODE_WRITE) {
+		dmabuf->fmt &= ~CS_FMT_MASK;
+		dmabuf->fmt |= CS_FMT_16BIT;
+		dmabuf->ossfragshift = 0;
+		dmabuf->ossmaxfrags  = 0;
+		dmabuf->subdivision  = 0;
+		cs_set_dac_rate(state, 48000);
+	}
+
+	if (file->f_mode & FMODE_READ) {
+		dmabuf->fmt &= ~CS_FMT_MASK;
+		dmabuf->fmt |= CS_FMT_16BIT;
+		dmabuf->ossfragshift = 0;
+		dmabuf->ossmaxfrags  = 0;
+		dmabuf->subdivision  = 0;
+		cs_set_adc_rate(state, 48000);
+	}
+
+	state->open_mode |= file->f_mode & (FMODE_READ | FMODE_WRITE);
+	up(&state->open_sem);
+
+	MOD_INC_USE_COUNT;
+	return 0;
+}
+
+static int cs_release(struct inode *inode, struct file *file)
+{
+	struct cs_state *state = (struct cs_state *)file->private_data;
+	struct dmabuf *dmabuf = &state->dmabuf;
+
+	if (file->f_mode & FMODE_WRITE) {
+		/* FIXME :.. */
+		cs_clear_tail(state);
+		drain_dac(state, file->f_flags & O_NONBLOCK);
+	}
+
+	/* stop DMA state machine and free DMA buffers/channels */
+	down(&state->open_sem);
+
+	if (file->f_mode & FMODE_WRITE) {
+		stop_dac(state);
+		dealloc_dmabuf(state);
+		state->card->free_pcm_channel(state->card, dmabuf->channel->num);
+	}
+	if (file->f_mode & FMODE_READ) {
+		stop_adc(state);
+		dealloc_dmabuf(state);
+		state->card->free_pcm_channel(state->card, dmabuf->channel->num);
+	}
+
+	free_page((unsigned long)state->dmabuf.pbuf);
+	kfree(state->card->states[state->virt]);
+
+	/* we're covered by the open_sem */
+	up(&state->open_sem);
+
+	state->card->states[state->virt] = NULL;
+	state->open_mode &= (~file->f_mode) & (FMODE_READ|FMODE_WRITE);
+
+	MOD_DEC_USE_COUNT;
+	return 0;
+}
+
+static /*const*/ struct file_operations cs461x_fops = {
+	llseek:		cs_llseek,
+	read:		cs_read,
+	write:		cs_write,
+	poll:		cs_poll,
+	ioctl:		cs_ioctl,
+	mmap:		cs_mmap,
+	open:		cs_open,
+	release:	cs_release,
+};
+
+/* Write AC97 codec registers */
+
+
+static u16 cs_ac97_get(struct ac97_codec *dev, u8 reg)
+{
+	struct cs_card *card = dev->private_data;
+	int count;
+	
+	/*
+	 *  1. Write ACCAD = Command Address Register = 46Ch for AC97 register address
+	 *  2. Write ACCDA = Command Data Register = 470h    for data to write to AC97 
+	 *  3. Write ACCTL = Control Register = 460h for initiating the write
+	 *  4. Read ACCTL = 460h, DCV should be reset by now and 460h = 17h
+	 *  5. if DCV not cleared, break and return error
+	 *  6. Read ACSTS = Status Register = 464h, check VSTS bit
+	 */
+
+
+	cs461x_peekBA0(card, BA0_ACSDA);
+
+	/*
+	 *  Setup the AC97 control registers on the CS461x to send the
+	 *  appropriate command to the AC97 to perform the read.
+	 *  ACCAD = Command Address Register = 46Ch
+	 *  ACCDA = Command Data Register = 470h
+	 *  ACCTL = Control Register = 460h
+	 *  set DCV - will clear when process completed
+	 *  set CRW - Read command
+	 *  set VFRM - valid frame enabled
+	 *  set ESYN - ASYNC generation enabled
+	 *  set RSTN - ARST# inactive, AC97 codec not reset
+	 */
+
+	cs461x_pokeBA0(card, BA0_ACCAD, reg);
+	cs461x_pokeBA0(card, BA0_ACCDA, 0);
+	cs461x_pokeBA0(card, BA0_ACCTL, ACCTL_DCV | ACCTL_CRW |
+					     ACCTL_VFRM | ACCTL_ESYN |
+					     ACCTL_RSTN);
+
+
+	/*
+	 *  Wait for the read to occur.
+	 */
+	for (count = 0; count < 500; count++) {
+		/*
+		 *  First, we want to wait for a short time.
+	 	 */
+		udelay(10);
+		/*
+		 *  Now, check to see if the read has completed.
+		 *  ACCTL = 460h, DCV should be reset by now and 460h = 17h
+		 */
+		if (!(cs461x_peekBA0(card, BA0_ACCTL) & ACCTL_DCV))
+			break;
+	}
+
+	/*
+	 *  Make sure the read completed.
+	 */
+	if (cs461x_peekBA0(card, BA0_ACCTL) & ACCTL_DCV) {
+		printk(KERN_WARNING "cs461x: AC'97 read problem (ACCTL_DCV), reg = 0x%x\n", reg);
+		return 0xffff;
+	}
+
+	/*
+	 *  Wait for the valid status bit to go active.
+	 */
+	for (count = 0; count < 100; count++) {
+		/*
+		 *  Read the AC97 status register.
+		 *  ACSTS = Status Register = 464h
+		 *  VSTS - Valid Status
+		 */
+		if (cs461x_peekBA0(card, BA0_ACSTS) & ACSTS_VSTS)
+			break;
+		udelay(10);
+	}
+	
+	/*
+	 *  Make sure we got valid status.
+	 */
+	if (!(cs461x_peekBA0(card, BA0_ACSTS) & ACSTS_VSTS)) {
+		printk(KERN_WARNING "cs461x: AC'97 read problem (ACSTS_VSTS), reg = 0x%x\n", reg);
+		return 0xffff;
+	}
+
+	/*
+	 *  Read the data returned from the AC97 register.
+	 *  ACSDA = Status Data Register = 474h
+	 */
+#if 0
+	printk("e) reg = 0x%x, val = 0x%x, BA0_ACCAD = 0x%x\n", reg,
+			cs461x_peekBA0(card, BA0_ACSDA),
+			cs461x_peekBA0(card, BA0_ACCAD));
+#endif
+	return cs461x_peekBA0(card, BA0_ACSDA);
+}
+
+static void cs_ac97_set(struct ac97_codec *dev, u8 reg, u16 val)
+{
+	struct cs_card *card = dev->private_data;
+	int count;
+	
+	/*
+	 *  1. Write ACCAD = Command Address Register = 46Ch for AC97 register address
+	 *  2. Write ACCDA = Command Data Register = 470h    for data to write to AC97
+	 *  3. Write ACCTL = Control Register = 460h for initiating the write
+	 *  4. Read ACCTL = 460h, DCV should be reset by now and 460h = 07h
+	 *  5. if DCV not cleared, break and return error
+	 */
+
+	/*
+	 *  Setup the AC97 control registers on the CS461x to send the
+	 *  appropriate command to the AC97 to perform the read.
+	 *  ACCAD = Command Address Register = 46Ch
+	 *  ACCDA = Command Data Register = 470h
+	 *  ACCTL = Control Register = 460h
+	 *  set DCV - will clear when process completed
+	 *  reset CRW - Write command
+	 *  set VFRM - valid frame enabled
+	 *  set ESYN - ASYNC generation enabled
+	 *  set RSTN - ARST# inactive, AC97 codec not reset
+         */
+	cs461x_pokeBA0(card, BA0_ACCAD, reg);
+	cs461x_pokeBA0(card, BA0_ACCDA, val);
+	cs461x_pokeBA0(card, BA0_ACCTL, ACCTL_DCV | ACCTL_VFRM |
+				             ACCTL_ESYN | ACCTL_RSTN);
+	for (count = 0; count < 1000; count++) {
+		/*
+		 *  First, we want to wait for a short time.
+		 */
+		udelay(10);
+		/*
+		 *  Now, check to see if the write has completed.
+		 *  ACCTL = 460h, DCV should be reset by now and 460h = 07h
+		 */
+		if (!(cs461x_peekBA0(card, BA0_ACCTL) & ACCTL_DCV))
+			break;
+	}
+	/*
+	 *  Make sure the write completed.
+	 */
+	if (cs461x_peekBA0(card, BA0_ACCTL) & ACCTL_DCV)
+		printk(KERN_WARNING "cs461x: AC'97 write problem, reg = 0x%x, val = 0x%x\n", reg, val);
+}
+
+
+/* OSS /dev/mixer file operation methods */
+
+static int cs_open_mixdev(struct inode *inode, struct file *file)
+{
+	int i;
+	int minor = MINOR(inode->i_rdev);
+	struct cs_card *card = devs;
+
+	for (card = devs; card != NULL; card = card->next)
+		for (i = 0; i < NR_AC97; i++)
+			if (card->ac97_codec[i] != NULL &&
+			    card->ac97_codec[i]->dev_mixer == minor)
+				goto match;
+
+	if (!card)
+		return -ENODEV;
+
+ match:
+	file->private_data = card->ac97_codec[i];
+
+	MOD_INC_USE_COUNT;
+	return 0;
+}
+
+static int cs_release_mixdev(struct inode *inode, struct file *file)
+{
+	MOD_DEC_USE_COUNT;
+	return 0;
+}
+
+static int cs_ioctl_mixdev(struct inode *inode, struct file *file, unsigned int cmd,
+				unsigned long arg)
+{
+	struct ac97_codec *codec = (struct ac97_codec *)file->private_data;
+
+	return codec->mixer_ioctl(codec, cmd, arg);
+}
+
+static /*const*/ struct file_operations cs_mixer_fops = {
+	llseek:		cs_llseek,
+	ioctl:		cs_ioctl_mixdev,
+	open:		cs_open_mixdev,
+	release:	cs_release_mixdev,
+};
+
+/* AC97 codec initialisation. */
+static int __init cs_ac97_init(struct cs_card *card)
+{
+	int num_ac97 = 0;
+	int ready_2nd = 0;
+	struct ac97_codec *codec;
+	u16 eid;
+
+	for (num_ac97 = 0; num_ac97 < NR_AC97; num_ac97++) {
+		if ((codec = kmalloc(sizeof(struct ac97_codec), GFP_KERNEL)) == NULL)
+			return -ENOMEM;
+		memset(codec, 0, sizeof(struct ac97_codec));
+
+		/* initialize some basic codec information, other fields will be filled
+		   in ac97_probe_codec */
+		codec->private_data = card;
+		codec->id = num_ac97;
+
+		codec->codec_read = cs_ac97_get;
+		codec->codec_write = cs_ac97_set;
+	
+		if (ac97_probe_codec(codec) == 0)
+			break;
+
+		eid = cs_ac97_get(codec, AC97_EXTENDED_ID);
+		
+		if(eid==0xFFFFFF)
+		{
+			printk(KERN_WARNING "cs461x: no codec attached ?\n");
+			kfree(codec);
+			break;
+		}
+		
+		card->ac97_features = eid;
+				
+			
+		if ((codec->dev_mixer = register_sound_mixer(&cs_mixer_fops, -1)) < 0) {
+			printk(KERN_ERR "cs461x: couldn't register mixer!\n");
+			kfree(codec);
+			break;
+		}
+
+		card->ac97_codec[num_ac97] = codec;
+
+		/* if there is no secondary codec at all, don't probe any more */
+		if (!ready_2nd)
+			return num_ac97+1;
+	}
+	return num_ac97;
+}
+
+/* Boot the card
+ */
+ 
+static void cs461x_download(struct cs_card *card, u32 *src, unsigned long offset, unsigned long len)
+{
+	unsigned long counter;
+	void *dst;
+	
+	dst = card->ba1.idx[(offset>>16)&3];
+	dst += (offset&0xFFFF)<<2;
+	for(counter=0;counter<len;counter+=4)
+		writel(*src++, dst+counter);
+}
+
+/* 3*1024 parameter, 3.5*1024 sample, 2*3.5*1024 code */
+#define BA1_DWORD_SIZE		(13 * 1024 + 512)
+#define BA1_MEMORY_COUNT	3
+
+struct BA1struct {
+	struct {
+		unsigned long offset;
+		unsigned long size;
+	} memory[BA1_MEMORY_COUNT];
+	unsigned int map[BA1_DWORD_SIZE];
+};
+
+#include "cs461x_image.h"
+
+static void cs461x_download_image(struct cs_card *card)
+{
+	int idx;
+	unsigned long offset = 0;
+	
+	for (idx = 0; idx < BA1_MEMORY_COUNT; idx++) {
+		cs461x_download(card,&BA1Struct.map[offset],
+			       BA1Struct.memory[idx].offset,
+			       BA1Struct.memory[idx].size);
+		offset += BA1Struct.memory[idx].size >> 2;
+	}	
+}
+
+/*
+ *  Chip reset
+ */
+
+static void cs461x_reset(struct cs_card *card)
+{
+	int idx;
+
+	/*
+	 *  Write the reset bit of the SP control register.
+	 */
+	cs461x_poke(card, BA1_SPCR, SPCR_RSTSP);
+
+	/*
+	 *  Write the control register.
+	 */
+	cs461x_poke(card, BA1_SPCR, SPCR_DRQEN);
+
+	/*
+	 *  Clear the trap registers.
+	 */
+	for (idx = 0; idx < 8; idx++) {
+		cs461x_poke(card, BA1_DREG, DREG_REGID_TRAP_SELECT + idx);
+		cs461x_poke(card, BA1_TWPR, 0xFFFF);
+	}
+	cs461x_poke(card, BA1_DREG, 0);
+
+	/*
+	 *  Set the frame timer to reflect the number of cycles per frame.
+	 */
+	cs461x_poke(card, BA1_FRMT, 0xadf);
+}
+
+static void cs461x_clear_serial_FIFOs(struct cs_card *card)
+{
+	int idx, loop, powerdown = 0;
+	unsigned int tmp;
+
+	/*
+	 *  See if the devices are powered down.  If so, we must power them up first
+	 *  or they will not respond.
+	 */
+	if (!((tmp = cs461x_peekBA0(card, BA0_CLKCR1)) & CLKCR1_SWCE)) {
+		cs461x_pokeBA0(card, BA0_CLKCR1, tmp | CLKCR1_SWCE);
+		powerdown = 1;
+	}
+
+	/*
+	 *  We want to clear out the serial port FIFOs so we don't end up playing
+	 *  whatever random garbage happens to be in them.  We fill the sample FIFOS
+	 *  with zero (silence).
+         */
+	cs461x_pokeBA0(card, BA0_SERBWP, 0);
+
+	/*
+	 *  Fill all 256 sample FIFO locations.
+	 */
+	for (idx = 0; idx < 256; idx++) {
+		/*
+		 *  Make sure the previous FIFO write operation has completed.
+		 */
+		for (loop = 0; loop < 5; loop++) {
+			udelay(50);
+			if (!(cs461x_peekBA0(card, BA0_SERBST) & SERBST_WBSY))
+				break;
+		}
+		if (cs461x_peekBA0(card, BA0_SERBST) & SERBST_WBSY) {
+			if (powerdown)
+				cs461x_pokeBA0(card, BA0_CLKCR1, tmp);
+		}
+		/*
+		 *  Write the serial port FIFO index.
+		 */
+		cs461x_pokeBA0(card, BA0_SERBAD, idx);
+		/*
+		 *  Tell the serial port to load the new value into the FIFO location.
+		 */
+		cs461x_pokeBA0(card, BA0_SERBCM, SERBCM_WRC);
+	}
+	/*
+	 *  Now, if we powered up the devices, then power them back down again.
+	 *  This is kinda ugly, but should never happen.
+	 */
+	if (powerdown)
+		cs461x_pokeBA0(card, BA0_CLKCR1, tmp);
+}
+
+static void cs461x_powerup_dac(struct cs_card *card)
+{
+	int count;
+	unsigned int tmp;
+
+	/*
+	 *  Power on the DACs on the AC97 card.  We turn off the DAC
+	 *  powerdown bit and write the new value of the power control
+	 *  register.
+	 */
+	tmp = cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL);
+	if (tmp & 2)	/* already */
+		return;
+	cs_ac97_set(card->ac97_codec[0], AC97_POWER_CONTROL, tmp & 0xfdff);
+
+	/*
+	 *  Now, we wait until we sample a DAC ready state.
+	 */
+	for (count = 0; count < 32; count++) {
+		/*
+		 *  First, lets wait a short while to let things settle out a
+		 *  bit, and to prevent retrying the read too quickly.
+		 */
+		udelay(50);
+
+		/*
+		 *  Read the current state of the power control register.
+		 */
+		if (cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL) & 2)
+			break;
+	}
+	
+	/*
+	 *  Check the status..
+	 */
+	if (!(cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL) & 2))
+		printk(KERN_WARNING "cs461x: powerup DAC failed\n");
+}
+
+static void cs461x_powerup_adc(struct cs_card *card)
+{
+	int count;
+	unsigned int tmp;
+
+	/*
+	 *  Power on the ADCs on the AC97 card.  We turn off the DAC
+	 *  powerdown bit and write the new value of the power control
+	 *  register.
+	 */
+	tmp = cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL);
+	if (tmp & 1)	/* already */
+		return;
+	cs_ac97_set(card->ac97_codec[0], AC97_POWER_CONTROL, tmp & 0xfeff);
+
+	/*
+	 *  Now, we wait until we sample a ADC ready state.
+	 */
+	for (count = 0; count < 32; count++) {
+		/*
+		 *  First, lets wait a short while to let things settle out a
+		 *  bit, and to prevent retrying the read too quickly.
+		 */
+		udelay(50);
+
+		/*
+		 *  Read the current state of the power control register.
+		 */
+		if (cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL) & 1)
+			break;
+	}
+
+	/*
+	 *  Check the status..
+	 */
+	if (!(cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL) & 1))
+		printk(KERN_WARNING "cs461x: powerup ADC failed\n");
+}
+
+static void cs461x_proc_start(struct cs_card *card)
+{
+	int cnt;
+
+	/*
+	 *  Set the frame timer to reflect the number of cycles per frame.
+	 */
+	cs461x_poke(card, BA1_FRMT, 0xadf);
+	/*
+	 *  Turn on the run, run at frame, and DMA enable bits in the local copy of
+	 *  the SP control register.
+	 */
+	cs461x_poke(card, BA1_SPCR, SPCR_RUN | SPCR_RUNFR | SPCR_DRQEN);
+	/*
+	 *  Wait until the run at frame bit resets itself in the SP control
+	 *  register.
+	 */
+	for (cnt = 0; cnt < 25; cnt++) {
+		udelay(50);
+		if (!(cs461x_peek(card, BA1_SPCR) & SPCR_RUNFR))
+			break;
+	}
+
+	if (cs461x_peek(card, BA1_SPCR) & SPCR_RUNFR)
+		printk(KERN_WARNING "cs461x: SPCR_RUNFR never reset\n");
+}
+
+static void cs461x_proc_stop(struct cs_card *card)
+{
+	/*
+	 *  Turn off the run, run at frame, and DMA enable bits in the local copy of
+	 *  the SP control register.
+	 */
+	cs461x_poke(card, BA1_SPCR, 0);
+}
+
+
+
+static int cs_hardware_init(struct cs_card *card)
+{
+	unsigned long end_time;
+	unsigned int tmp;
+	
+	/* 
+	 *  First, blast the clock control register to zero so that the PLL starts
+         *  out in a known state, and blast the master serial port control register
+         *  to zero so that the serial ports also start out in a known state.
+         */
+        cs461x_pokeBA0(card, BA0_CLKCR1, 0);
+        cs461x_pokeBA0(card, BA0_SERMC1, 0);
+
+	/*
+	 *  If we are in AC97 mode, then we must set the part to a host controlled
+         *  AC-link.  Otherwise, we won't be able to bring up the link.
+         */        
+        cs461x_pokeBA0(card, BA0_SERACC, SERACC_HSP | SERACC_CODEC_TYPE_1_03);	/* 1.03 card */
+        /* cs461x_pokeBA0(card, BA0_SERACC, SERACC_HSP | SERACC_CODEC_TYPE_2_0); */ /* 2.00 card */
+
+        /*
+         *  Drive the ARST# pin low for a minimum of 1uS (as defined in the AC97
+         *  spec) and then drive it high.  This is done for non AC97 modes since
+         *  there might be logic external to the CS461x that uses the ARST# line
+         *  for a reset.
+         */
+        cs461x_pokeBA0(card, BA0_ACCTL, 0);
+        udelay(50);
+        cs461x_pokeBA0(card, BA0_ACCTL, ACCTL_RSTN);
+
+	/*
+	 *  The first thing we do here is to enable sync generation.  As soon
+	 *  as we start receiving bit clock, we'll start producing the SYNC
+	 *  signal.
+	 */
+	cs461x_pokeBA0(card, BA0_ACCTL, ACCTL_ESYN | ACCTL_RSTN);
+
+	/*
+	 *  Now wait for a short while to allow the AC97 part to start
+	 *  generating bit clock (so we don't try to start the PLL without an
+	 *  input clock).
+	 */
+	mdelay(5);		/* 1 should be enough ?? */
+
+	/*
+	 *  Set the serial port timing configuration, so that
+	 *  the clock control circuit gets its clock from the correct place.
+	 */
+	cs461x_pokeBA0(card, BA0_SERMC1, SERMC1_PTC_AC97);
+
+	/*
+	 *  Write the selected clock control setup to the hardware.  Do not turn on
+	 *  SWCE yet (if requested), so that the devices clocked by the output of
+	 *  PLL are not clocked until the PLL is stable.
+	 */
+	cs461x_pokeBA0(card, BA0_PLLCC, PLLCC_LPF_1050_2780_KHZ | PLLCC_CDR_73_104_MHZ);
+	cs461x_pokeBA0(card, BA0_PLLM, 0x3a);
+	cs461x_pokeBA0(card, BA0_CLKCR2, CLKCR2_PDIVS_8);
+
+	/*
+	 *  Power up the PLL.
+	 */
+	cs461x_pokeBA0(card, BA0_CLKCR1, CLKCR1_PLLP);
+
+	/*
+         *  Wait until the PLL has stabilized.
+	 */
+	mdelay(5);		/* Again 1 should be enough ?? */
+
+	/*
+	 *  Turn on clocking of the core so that we can setup the serial ports.
+	 */
+	tmp = cs461x_peekBA0(card, BA0_CLKCR1) | CLKCR1_SWCE;
+	cs461x_pokeBA0(card, BA0_CLKCR1, tmp);
+
+	/*
+	 *  Fill the serial port FIFOs with silence.
+	 */
+	cs461x_clear_serial_FIFOs(card);
+
+	/*
+	 *  Set the serial port FIFO pointer to the first sample in the FIFO.
+	 */
+	/* cs461x_pokeBA0(card, BA0_SERBSP, 0); */
+
+	/*
+	 *  Write the serial port configuration to the part.  The master
+	 *  enable bit is not set until all other values have been written.
+	 */
+	cs461x_pokeBA0(card, BA0_SERC1, SERC1_SO1F_AC97 | SERC1_SO1EN);
+	cs461x_pokeBA0(card, BA0_SERC2, SERC2_SI1F_AC97 | SERC1_SO1EN);
+	cs461x_pokeBA0(card, BA0_SERMC1, SERMC1_PTC_AC97 | SERMC1_MSPE);
+
+
+	mdelay(5);		/* Shouldnt be needed ?? */
+	
+	/*
+	 * Wait for the card ready signal from the AC97 card.
+	 */
+	end_time = jiffies + 3 * (HZ >> 2);
+	do {
+		/*
+		 *  Read the AC97 status register to see if we've seen a CODEC READY
+		 *  signal from the AC97 card.
+		 */
+		if (cs461x_peekBA0(card, BA0_ACSTS) & ACSTS_CRDY)
+			break;
+		current->state = TASK_UNINTERRUPTIBLE;
+		schedule_timeout(1);
+	} while (end_time - (signed long)jiffies >= 0);
+
+	/*
+	 *  Make sure CODEC is READY.
+	 */
+	if (!(cs461x_peekBA0(card, BA0_ACSTS) & ACSTS_CRDY)) {
+		printk(KERN_WARNING "cs461x: create - never read card ready from AC'97\n");
+		printk(KERN_WARNING "cs461x: it is probably not a bug, try using the CS4232 driver\n");
+		return -EIO;
+	}
+
+	/*
+	 *  Assert the vaid frame signal so that we can start sending commands
+	 *  to the AC97 card.
+	 */
+	cs461x_pokeBA0(card, BA0_ACCTL, ACCTL_VFRM | ACCTL_ESYN | ACCTL_RSTN);
+
+	/*
+	 *  Wait until we've sampled input slots 3 and 4 as valid, meaning that
+	 *  the card is pumping ADC data across the AC-link.
+	 */
+	end_time = jiffies + 3 * (HZ >> 2);
+	do {
+		/*
+		 *  Read the input slot valid register and see if input slots 3 and
+		 *  4 are valid yet.
+		 */
+		if ((cs461x_peekBA0(card, BA0_ACISV) & (ACISV_ISV3 | ACISV_ISV4)) == (ACISV_ISV3 | ACISV_ISV4))
+			break;
+		current->state = TASK_UNINTERRUPTIBLE;
+		schedule_timeout(1);
+	} while (end_time - (signed long)jiffies >= 0);
+
+	/*
+	 *  Make sure input slots 3 and 4 are valid.  If not, then return
+	 *  an error.
+	 */
+	if ((cs461x_peekBA0(card, BA0_ACISV) & (ACISV_ISV3 | ACISV_ISV4)) != (ACISV_ISV3 | ACISV_ISV4)) {
+		printk(KERN_WARNING "cs461x: create - never read ISV3 & ISV4 from AC'97\n");
+		return -EIO;
+	}
+
+	/*
+	 *  Now, assert valid frame and the slot 3 and 4 valid bits.  This will
+	 *  commense the transfer of digital audio data to the AC97 card.
+	 */
+	cs461x_pokeBA0(card, BA0_ACOSV, ACOSV_SLV3 | ACOSV_SLV4);
+
+	/*
+	 *  Power down the DAC and ADC.  We will power them up (if) when we need
+	 *  them.
+	 */
+	/* cs461x_pokeBA0(card, BA0_AC97_POWERDOWN, 0x300); */
+
+	/*
+	 *  Turn off the Processor by turning off the software clock enable flag in 
+	 *  the clock control register.
+	 */
+	/* tmp = cs461x_peekBA0(card, BA0_CLKCR1) & ~CLKCR1_SWCE; */
+	/* cs461x_pokeBA0(card, BA0_CLKCR1, tmp); */
+
+	/*
+         *  Reset the processor.
+         */
+	cs461x_reset(card);
+
+	/*
+         *  Download the image to the processor.
+	 */
+	
+	cs461x_download_image(card);
+
+	/*
+         *  Stop playback DMA.
+	 */
+	tmp = cs461x_peek(card, BA1_PCTL);
+	card->pctl = tmp & 0xffff0000;
+	cs461x_poke(card, BA1_PCTL, tmp & 0x0000ffff);
+
+	/*
+         *  Stop capture DMA.
+	 */
+	tmp = cs461x_peek(card, BA1_CCTL);
+	card->cctl = tmp & 0x0000ffff;
+	cs461x_poke(card, BA1_CCTL, tmp & 0xffff0000);
+
+	/* initialize AC97 codec and register /dev/mixer */
+	if (cs_ac97_init(card) <= 0)
+		return -EIO;
+		
+	mdelay(5);		/* Do we need this ?? */
+	
+	cs461x_powerup_adc(card);
+	cs461x_powerup_dac(card);
+
+	cs461x_proc_start(card);
+
+	/*
+	 *  Enable interrupts on the part.
+	 */
+	cs461x_pokeBA0(card, BA0_HICR, HICR_IEV | HICR_CHGM);
+
+	tmp = cs461x_peek(card, BA1_PFIE);
+	tmp &= ~0x0000f03f;
+	cs461x_poke(card, BA1_PFIE, tmp);	/* playback interrupt enable */
+
+	tmp = cs461x_peek(card, BA1_CIE);
+	tmp &= ~0x0000003f;
+	tmp |=  0x00000001;
+	cs461x_poke(card, BA1_CIE, tmp);	/* capture interrupt enable */	
+	return 0;
+}
+
+/* install the driver, we do not allocate hardware channel nor DMA buffer now, they are defered 
+   untill "ACCESS" time (in prog_dmabuf called by open/read/write/ioctl/mmap) */
+   
+static int __init cs_install(struct pci_dev *pci_dev)
+{
+	struct cs_card *card;
+
+	if ((card = kmalloc(sizeof(struct cs_card), GFP_KERNEL)) == NULL) {
+		printk(KERN_ERR "cs461x: out of memory\n");
+		return -ENOMEM;
+	}
+	memset(card, 0, sizeof(*card));
+
+	card->ba0_addr = pci_dev->base_address[0]&PCI_BASE_ADDRESS_MEM_MASK;
+	card->ba1_addr = pci_dev->base_address[1]&PCI_BASE_ADDRESS_MEM_MASK;
+	card->pci_dev = pci_dev;
+	card->irq = pci_dev->irq;
+	card->magic = CS_CARD_MAGIC;
+	spin_lock_init(&card->lock);
+
+	pci_set_master(pci_dev);
+
+	printk(KERN_INFO "cs461x: Card found at  0x%08lx and 0x%08lx, IRQ %d\n",
+	       card->ba0_addr, card->ba1_addr, card->irq);
+
+	card->alloc_pcm_channel = cs_alloc_pcm_channel;
+	card->alloc_rec_pcm_channel = cs_alloc_rec_pcm_channel;
+	card->free_pcm_channel = cs_free_pcm_channel;
+
+	/* claim our iospace and irq */
+	
+	card->ba0 = ioremap(card->ba0_addr, CS461X_BA0_SIZE);
+	card->ba1.name.data0 = ioremap(card->ba1_addr + BA1_SP_DMEM0, CS461X_BA1_DATA0_SIZE);
+	card->ba1.name.data1 = ioremap(card->ba1_addr + BA1_SP_DMEM1, CS461X_BA1_DATA1_SIZE);
+	card->ba1.name.pmem = ioremap(card->ba1_addr + BA1_SP_PMEM, CS461X_BA1_PRG_SIZE);
+	card->ba1.name.reg = ioremap(card->ba1_addr + BA1_SP_REG, CS461X_BA1_REG_SIZE);
+	
+	if(card->ba0 == 0 || card->ba1.name.data0 == 0 ||
+		card->ba1.name.data1 == 0 || card->ba1.name.pmem == 0 ||
+		card->ba1.name.reg == 0)
+		goto fail2;
+		
+	if (request_irq(card->irq, &cs_interrupt, SA_SHIRQ, "cs461x", card)) {
+		printk(KERN_ERR "cs461x: unable to allocate irq %d\n", card->irq);
+		goto fail2;
+	}
+	/* register /dev/dsp */
+	if ((card->dev_audio = register_sound_dsp(&cs461x_fops, -1)) < 0) {
+		printk(KERN_ERR "cs461x: unable to register dsp\n");
+		goto fail;
+	}
+
+	if (cs_hardware_init(card)<0)
+	{
+		unregister_sound_dsp(card->dev_audio);
+		goto fail;
+	}
+	card->next = devs;
+	devs = card;
+	
+	return 0;
+	
+fail:
+	free_irq(card->irq, card);
+fail2:
+	if(card->ba0)
+		iounmap(card->ba0);
+	if(card->ba1.name.data0)
+		iounmap(card->ba1.name.data0);
+	if(card->ba1.name.data1)
+		iounmap(card->ba1.name.data1);
+	if(card->ba1.name.pmem)
+		iounmap(card->ba1.name.pmem);
+	if(card->ba1.name.reg)
+		iounmap(card->ba1.name.reg);
+	kfree(card);
+	return -ENODEV;
+
+}
+
+static void cs_remove(struct cs_card *card)
+{
+	int i;
+	unsigned int tmp;
+	
+	tmp = cs461x_peek(card, BA1_PFIE);
+	tmp &= ~0x0000f03f;
+	tmp |=  0x00000010;
+	cs461x_poke(card, BA1_PFIE, tmp);	/* playback interrupt disable */
+
+	tmp = cs461x_peek(card, BA1_CIE);
+	tmp &= ~0x0000003f;
+	tmp |=  0x00000011;
+	cs461x_poke(card, BA1_CIE, tmp);	/* capture interrupt disable */
+
+	/*
+         *  Stop playback DMA.
+	 */
+	tmp = cs461x_peek(card, BA1_PCTL);
+	cs461x_poke(card, BA1_PCTL, tmp & 0x0000ffff);
+
+	/*
+         *  Stop capture DMA.
+	 */
+	tmp = cs461x_peek(card, BA1_CCTL);
+	cs461x_poke(card, BA1_CCTL, tmp & 0xffff0000);
+
+	/*
+         *  Reset the processor.
+         */
+	cs461x_reset(card);
+
+	cs461x_proc_stop(card);
+
+	/*
+	 *  Power down the DAC and ADC.  We will power them up (if) when we need
+	 *  them.
+	 */
+	cs_ac97_set(card->ac97_codec[0], AC97_POWER_CONTROL, 0x300);
+
+	/*
+	 *  Power down the PLL.
+	 */
+	cs461x_pokeBA0(card, BA0_CLKCR1, 0);
+
+	/*
+	 *  Turn off the Processor by turning off the software clock enable flag in 
+	 *  the clock control register.
+	 */
+	tmp = cs461x_peekBA0(card, BA0_CLKCR1) & ~CLKCR1_SWCE;
+	cs461x_pokeBA0(card, BA0_CLKCR1, tmp);
+
+
+	/* free hardware resources */
+	free_irq(card->irq, card);
+	iounmap(card->ba0);
+	iounmap(card->ba1.name.data0);
+	iounmap(card->ba1.name.data1);
+	iounmap(card->ba1.name.pmem);
+	iounmap(card->ba1.name.reg);
+	
+	/* unregister audio devices */
+	for (i = 0; i < NR_AC97; i++)
+		if (card->ac97_codec[i] != NULL) {
+			unregister_sound_mixer(card->ac97_codec[i]->dev_mixer);
+			kfree (card->ac97_codec[i]);
+		}
+	unregister_sound_dsp(card->dev_audio);
+	kfree(card);
+}
+
+MODULE_AUTHOR("Alan Cox <alan@redhat.com>, Jaroslav Kysela");
+MODULE_DESCRIPTION("Crystal SoundFusion Audio Support");
+
+int __init cs_probe(void)
+{
+	struct pci_dev *pcidev = NULL;
+	int foundone=0;
+	
+	if (!pci_present())   /* No PCI bus in this machine! */
+		return -ENODEV;
+		
+	printk(KERN_INFO "Crystal 4280/461x + AC97 Audio, version "
+	       DRIVER_VERSION ", " __TIME__ " " __DATE__ "\n");
+
+	while( (pcidev = pci_find_device(PCI_VENDOR_ID_CIRRUS, 0x6001 , pcidev))!=NULL ) {
+		if (cs_install(pcidev)==0)
+			foundone++;
+	}
+	while( (pcidev = pci_find_device(PCI_VENDOR_ID_CIRRUS, 0x6003 , pcidev))!=NULL ) {
+		if (cs_install(pcidev)==0)
+			foundone++;
+	}
+	while( (pcidev = pci_find_device(PCI_VENDOR_ID_CIRRUS, 0x6004 , pcidev))!=NULL ) {
+		if (cs_install(pcidev)==0)
+			foundone++;
+	}
+
+	printk(KERN_INFO "cs461x: Found %d audio device(s).\n",
+		foundone);
+	return foundone;
+}
+
+#ifdef MODULE
+
+int init_module(void)
+{
+	if(cs_probe()==0)
+		printk(KERN_ERR "cs461x: No devices found.\n");
+	return 0;
+}
+
+void cleanup_module (void)
+{
+	struct cs_card *next;
+	while(devs)
+	{
+		next=devs->next;
+		cs_remove(devs);
+		devs=next;
+	}
+}
+
+#endif
\ No newline at end of file
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/drivers/sound/dmasound.c linux.17p9/drivers/sound/dmasound.c
--- linux.vanilla/drivers/sound/dmasound.c	Fri Apr 21 12:46:34 2000
+++ linux.17p9/drivers/sound/dmasound.c	Fri Jun 16 16:24:34 2000
@@ -115,6 +115,7 @@
 #include <asm/adb.h>
 #include <asm/cuda.h>
 #include <asm/pmu.h>
+#include <asm/feature.h>
 #include "awacs_defs.h"
 #include <linux/nvram.h>
 #include <linux/vt_kern.h>
@@ -175,6 +176,7 @@
 static int awacs_rate_index;
 static int awacs_subframe;
 static int awacs_spkr_vol;
+static struct device_node* awacs_node;
 
 static int awacs_revision;
 #define AWACS_BURGUNDY	100		/* fake revision # for burgundy */
@@ -3018,6 +3020,12 @@
 	out_le32(&awacs_txdma->control, RUN<<16);
 	/* disable interrupts from awacs interface */
 	out_le32(&awacs->control, in_le32(&awacs->control) & 0xfff);
+#ifdef CONFIG_PMAC_PBOOK
+	if (is_pbook_G3) {
+		feature_clear(awacs_node, FEATURE_Sound_power);
+		feature_clear(awacs_node, FEATURE_Sound_CLK_enable);
+	}
+#endif
 	free_irq(awacs_irq, (void *) awacs);
 	free_irq(awacs_tx_irq, (void *) awacs);
 	kfree(awacs_tx_cmd_space);
@@ -3370,8 +3378,21 @@
 		PMacSilence();
 		disable_irq(awacs_irq);
 		disable_irq(awacs_tx_irq);
+		feature_clear(awacs_node, FEATURE_Sound_CLK_enable);
+		feature_clear(awacs_node, FEATURE_Sound_power);
 		break;
 	case PBOOK_WAKE:
+		/* There is still a problem on wake. Sound seems to work fine
+		   if I launch mpg123 and resumes fine if mpg123 was playing,
+		   but the console beep is dead until I do something with the
+		   mixer. Probably yet another timing issue */
+		if (!feature_test(awacs_node, FEATURE_Sound_CLK_enable)
+		    || !feature_test(awacs_node, FEATURE_Sound_power)) {
+			/* these aren't present on the 3400 AFAIK -- paulus */
+			feature_set(awacs_node, FEATURE_Sound_CLK_enable);
+			feature_set(awacs_node, FEATURE_Sound_power);
+			mdelay(1000);
+		}
 		out_le32(&awacs->control, MASK_IEPC
 			 | (awacs_rate_index << 8) | 0x11
 			 | (awacs_revision < AWACS_BURGUNDY? MASK_IEE: 0));
@@ -3388,6 +3409,16 @@
 			mdelay(2);
 			awacs_write(awacs_reg[1] | MASK_ADDR1);
 		}
+		/* enable CD sound input */
+		if (macio_base && is_pbook_G3) {
+			out_8(macio_base + 0x37, 3);
+		} else if (is_pbook_3400) {
+			feature_set(awacs_node, FEATURE_IOBUS_enable);
+			udelay(10);
+			in_8((unsigned char *)0xf301a190);
+		}
+ 		/* Resume pending sounds. Paul, Is this wrong ? */
+ 		PMacPlay();
 	}
 	return PBOOK_SLEEP_OK;
 }
@@ -4596,6 +4627,7 @@
 	u_long fmt;
 	int data;
 	int size, nbufs;
+	audio_buf_info info;
 
 	switch (cmd) {
 	case SNDCTL_DSP_RESET:
@@ -4671,6 +4703,14 @@
 		sq_setup(numBufs, size, sound_buffers);
 		sq.max_active = nbufs;
 		return 0;
+	case SNDCTL_DSP_GETOSPACE:
+		info.fragments = sq.max_active - sq.count;
+		info.fragstotal = sq.max_active;
+		info.fragsize = sq.block_size;
+		info.bytes = info.fragments * info.fragsize;
+		if (copy_to_user((void *)arg, &info, sizeof(info)))
+			return -EFAULT;
+		return 0;
 
 	default:
 		return mixer_ioctl(inode, file, cmd, arg);
@@ -4777,7 +4817,9 @@
 #endif /* CONFIG_AMIGA */
 #ifdef CONFIG_PPC
 	case DMASND_AWACS:
-		sprintf(mach, "PowerMac (AWACS rev %d) ", awacs_revision);
+		/* BenH: This one used to sprintf in mach which doesn't point to
+		 * a large enough buffer */
+		len += sprintf(buffer+len, "PowerMac (AWACS rev %d) ", awacs_revision);
 		break;
 #endif /* CONFIG_PPC */
 	}
@@ -5022,6 +5064,16 @@
 			printk(KERN_ERR "DMA sound driver: Not enough buffer memory, driver disabled!\n");
 			return;
 		}
+		awacs_node = np;
+#ifdef CONFIG_PMAC_PBOOK
+		if (machine_is_compatible("PowerBook1,1")
+		    || machine_is_compatible("AAPL,PowerBook1998")) {
+			feature_set(np, FEATURE_Sound_CLK_enable);
+			feature_set(np, FEATURE_Sound_power);
+			/* Shorter delay will not work */
+			mdelay(1000);
+		}
+#endif
 		awacs_tx_cmds = (volatile struct dbdma_cmd *)
 			DBDMA_ALIGN(awacs_tx_cmd_space);
 		awacs_reg[0] = MASK_MUX_CD;
@@ -5041,7 +5093,10 @@
 			awacs_revision =
 				(in_le32(&awacs->codec_stat) >> 12) & 0xf;
 			if (awacs_revision == 3) {
+				mdelay(100);
 				awacs_write(0x6000);
+				mdelay(2);
+				awacs_write(awacs_reg[1] + MASK_ADDR1);
 				awacs_enable_amp(100 * 0x101);
 			}
 		}
@@ -5063,27 +5118,35 @@
 		/* Powerbooks have odd ways of enabling inputs such as
 		   an expansion-bay CD or sound from an internal modem
 		   or a PC-card modem. */
-		if (machine_is_compatible("AAPL,3400/2400")) {
+		if (machine_is_compatible("AAPL,3400/2400")
+			|| machine_is_compatible("AAPL,3500")) {
 			is_pbook_3400 = 1;
 			/*
 			 * Enable CD and PC-card sound inputs.
 			 * This is done by reading from address
 			 * f301a000, + 0x10 to enable the expansion-bay
 			 * CD sound input, + 0x80 to enable the PC-card
-			 * sound input.  The 0x100 seems to enable the
-			 * MESH and/or its SCSI bus drivers.
+			 * sound input.  The 0x100 enables the SCSI bus
+			 * terminator power.
 			 */
 			in_8((unsigned char *)0xf301a190);
-		} else if (machine_is_compatible("PowerBook1,1")) {
-			np = find_devices("mac-io");
-			if (np && np->n_addrs > 0) {
-				is_pbook_G3 = 1;
-				macio_base = (unsigned char *)
-					ioremap(np->addrs[0].address, 0x40);
-				/* enable CD sound input */
-				out_8(macio_base + 0x37, 3);
+		} else if (machine_is_compatible("PowerBook1,1")
+			   || machine_is_compatible("AAPL,PowerBook1998")) {
+			struct device_node* mio;
+			macio_base = 0;
+			is_pbook_G3 = 1;
+			for (mio = np->parent; mio; mio = mio->parent) {
+				if (strcmp(mio->name, "mac-io") == 0
+				    && mio->n_addrs > 0) {
+					macio_base = (unsigned char *) ioremap
+						(mio->addrs[0].address, 0x40);
+					break;
+				}
 			}
-		}
+			/* enable CD sound input */
+			if (macio_base)
+				out_8(macio_base + 0x37, 3);
+ 		}
 	}
 #endif /* CONFIG_PPC */
 
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/drivers/sound/es1370.c linux.17p9/drivers/sound/es1370.c
--- linux.vanilla/drivers/sound/es1370.c	Fri Apr 21 12:46:34 2000
+++ linux.17p9/drivers/sound/es1370.c	Tue Jun 20 23:10:28 2000
@@ -1993,7 +1993,7 @@
 		return 0;
 
 	case SNDCTL_DSP_GETOSPACE:
-		if (!(s->ctrl & CTRL_DAC2_EN) && (val = prog_dmabuf_dac1(s)) != 0)
+		if (!(s->ctrl & CTRL_DAC1_EN) && (val = prog_dmabuf_dac1(s)) != 0)
 			return val;
 		spin_lock_irqsave(&s->lock, flags);
 		es1370_update_ptr(s);
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/drivers/sound/es1371.c linux.17p9/drivers/sound/es1371.c
--- linux.vanilla/drivers/sound/es1371.c	Fri Apr 21 12:46:34 2000
+++ linux.17p9/drivers/sound/es1371.c	Tue Jun 20 23:10:31 2000
@@ -182,6 +182,7 @@
 #define CT5880REV_CT5880_C  0x02
 #define ES1371REV_ES1371_B  0x09
 #define EV1938REV_EV1938_A  0x00
+#define ES1371REV_ES1373_8  0x08
 
 #define ES1371_MAGIC  ((PCI_VENDOR_ID_ENSONIQ<<16)|PCI_DEVICE_ID_ENSONIQ_ES1371)
 
@@ -2563,7 +2564,7 @@
 		return 0;
 
 	case SNDCTL_DSP_GETOSPACE:
-		if (!(s->ctrl & CTRL_DAC2_EN) && (val = prog_dmabuf_dac1(s)) != 0)
+		if (!(s->ctrl & CTRL_DAC1_EN) && (val = prog_dmabuf_dac1(s)) != 0)
 			return val;
 		spin_lock_irqsave(&s->lock, flags);
 		es1371_update_ptr(s);
@@ -3166,7 +3167,8 @@
 	/* if we are a 5880 turn on the AC97 */
 	if (s->vendor == PCI_VENDOR_ID_ENSONIQ &&
 	    ((s->device == PCI_DEVICE_ID_ENSONIQ_CT5880 && s->rev == CT5880REV_CT5880_C) || 
-	     (s->device == PCI_DEVICE_ID_ENSONIQ_ES1371 && s->rev == ES1371REV_CT5880_A))) { 
+	     (s->device == PCI_DEVICE_ID_ENSONIQ_ES1371 && s->rev == ES1371REV_CT5880_A) || 
+	     (s->device == PCI_DEVICE_ID_ENSONIQ_ES1371 && s->rev == ES1371REV_ES1373_8))) { 
 		cssr |= CSTAT_5880_AC97_RST;
 		outl(cssr, s->io+ES1371_REG_STATUS);
 		/* need to delay around 20ms(bleech) to give
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/drivers/sound/i810_audio.c linux.17p9/drivers/sound/i810_audio.c
--- linux.vanilla/drivers/sound/i810_audio.c	Sun Jun 11 21:44:18 2000
+++ linux.17p9/drivers/sound/i810_audio.c	Sun Jun 25 17:31:18 2000
@@ -14,6 +14,11 @@
  *	Analog Devices (A major AC97 codec maker)
  *	Intel Corp  (you've probably heard of them already)
  *
+ * AC97 clues and assistance provided by
+ *	Analog Devices
+ *	Zach 'Fufu' Brown
+ *	Jeff Garzik
+ *
  *	This program is free software; you can redistribute it and/or modify
  *	it under the terms of the GNU General Public License as published by
  *	the Free Software Foundation; either version 2 of the License, or
@@ -46,6 +51,18 @@
  *	There is no midi support, no synth support. Use timidity. To get
  *	esd working you need to use esd -r 48000 as it won't probe 48KHz
  *	by default. mpg123 can't handle 48Khz only audio so use xmms.
+ *
+ *	Fix The Sound On Dell
+ *
+ *	Not everyone uses 48KHz. We know of no way to detect this reliably
+ *	and certainly not to get the right data. If your i810 audio sounds
+ *	stupid you may need to investigate other speeds. According to Analog
+ *	they tend to use a 14.318MHz clock which gives you a base rate of
+ *	41194Hz.
+ *
+ *	This is available via the 'ftsodell=1' option. 
+ *
+ *	If you need to force a specific rate set the clocking= option
  */
  
 #include <linux/module.h>
@@ -74,10 +91,16 @@
 #ifndef PCI_DEVICE_ID_INTEL_82901
 #define PCI_DEVICE_ID_INTEL_82901	0x2425
 #endif
+#ifndef PCI_DEVICE_ID_INTEL_ICH2
+#define PCI_DEVICE_ID_INTEL_ICH2	0x2445
+#endif
 #ifndef PCI_DEVICE_ID_INTEL_440MX
 #define PCI_DEVICE_ID_INTEL_440MX	0x7195
 #endif
 
+static int ftsodell=0;
+static int clocking=48000;
+
 #define ADC_RUNNING	1
 #define DAC_RUNNING	2
 
@@ -180,7 +203,8 @@
 enum {
 	ICH82801AA = 0,
 	ICH82901AB,
-	INTEL440MX
+	INTEL440MX,
+	INTELICH2
 };
 
 /* "software" or virtual channel, an instance of opened /dev/dsp */
@@ -327,7 +351,7 @@
 	card->channel[0].used=1;
 	card->channel[0].offset = 0;
 	card->channel[0].port = 0x00;
-	card->channel[1].num=0;
+	card->channel[0].num=0;
 	return &card->channel[0];
 }
 
@@ -340,20 +364,32 @@
 static unsigned int i810_set_dac_rate(struct i810_state * state, unsigned int rate)
 {	
 	struct dmabuf *dmabuf = &state->dmabuf;
-	u16 dacp, rp;
+	u32 dacp, rp;
 	struct ac97_codec *codec=state->card->ac97_codec[0];
 	
 	if(!(state->card->ac97_features&0x0001))
 	{
-		dmabuf->rate=48000;
-		return 48000;
+		dmabuf->rate=clocking;
+		return clocking;
 	}
 			
 	if (rate > 48000)
 		rate = 48000;
-	if (rate < 4000)
-		rate = 4000;
-
+	if (rate < 8000)
+		rate = 8000;
+	
+	/*
+	 *	Adjust for misclocked crap
+	 */
+	 
+	rate = ( rate * clocking)/48000;
+	
+	/* Analog codecs can go lower via magic registers but others
+	   might not */
+	   
+	if(rate < 8000)
+		rate = 8000;
+		
 	/* Power down the DAC */
 	dacp=i810_ac97_get(codec, AC97_POWER_CONTROL);
 	i810_ac97_set(codec, AC97_POWER_CONTROL, dacp|0x0200);
@@ -362,11 +398,8 @@
 	i810_ac97_set(codec, AC97_PCM_FRONT_DAC_RATE, rate);
 	rp=i810_ac97_get(codec, AC97_PCM_FRONT_DAC_RATE);
 	
-//	printk("DAC rate set to %d Returned %d\n", 
-//		rate, (int)rp);
-		
-	rate=rp;
-		
+	rate=(rp*48000) / clocking;
+	
 	/* Power it back up */
 	i810_ac97_set(codec, AC97_POWER_CONTROL, dacp);
 	
@@ -382,19 +415,31 @@
 static unsigned int i810_set_adc_rate(struct i810_state * state, unsigned int rate)
 {
 	struct dmabuf *dmabuf = &state->dmabuf;
-	u16 dacp, rp;
+	u32 dacp, rp;
 	struct ac97_codec *codec=state->card->ac97_codec[0];
 	
 	if(!(state->card->ac97_features&0x0001))
 	{
-		dmabuf->rate = 48000;
-		return 48000;
+		dmabuf->rate = clocking;
+		return clocking;
 	}
 			
 	if (rate > 48000)
 		rate = 48000;
-	if (rate < 4000)
-		rate = 4000;
+	if (rate < 8000)
+		rate = 8000;
+
+	/*
+	 *	Adjust for misclocked crap
+	 */
+	 
+	rate = ( rate * clocking)/48000;
+	
+	/* Analog codecs can go lower via magic registers but others
+	   might not */
+	   
+	if(rate < 8000)
+		rate = 8000;
 
 	/* Power down the ADC */
 	dacp=i810_ac97_get(codec, AC97_POWER_CONTROL);
@@ -407,7 +452,7 @@
 //	printk("ADC rate set to %d Returned %d\n", 
 //		rate, (int)rp);
 		
-	rate=rp;
+	rate = (rp * 48000) / clocking;
 		
 	/* Power it back up */
 	i810_ac97_set(codec, AC97_POWER_CONTROL, dacp);
@@ -1560,13 +1605,12 @@
 		state->card->free_pcm_channel(state->card, dmabuf->channel->num);
 	}
 
-	kfree(state->card->states[state->virt]);
-	state->card->states[state->virt] = NULL;
 	state->open_mode &= (~file->f_mode) & (FMODE_READ|FMODE_WRITE);
 
 	/* we're covered by the open_sem */
 	up(&state->open_sem);
-
+	kfree(state->card->states[state->virt]);
+	state->card->states[state->virt] = NULL;
 	MOD_DEC_USE_COUNT;
 	return 0;
 }
@@ -1587,20 +1631,35 @@
 static u16 i810_ac97_get(struct ac97_codec *dev, u8 reg)
 {
 	struct i810_card *card = dev->private_data;
-	int count = 100;
+	int count = 1000;
 
+	while(count-- && (inl(card->iobase + GLOB_STA) & 0x0100))
+		udelay(10);
+	if(!count)
+		printk("i810_audio: AC97 access failed.\n");
+	count=1000;
 	while(count-- && (inb(card->iobase + CAS) & 1)) 
-		udelay(1);
+		udelay(10);
+	if(!count)
+		printk("i810_audio: AC97 access failed.\n");
 	return inw(card->ac97base + (reg&0x7f));
 }
 
 static void i810_ac97_set(struct ac97_codec *dev, u8 reg, u16 data)
 {
 	struct i810_card *card = dev->private_data;
-	int count = 100;
+	int count = 1000;
+
+	while(count-- && (inl(card->iobase + GLOB_STA) & 0x0100))
+		udelay(10);
+	if(!count)
+		printk("i810_audio: AC97 write access failed.\n");
 
+	count=1000;
 	while(count-- && (inb(card->iobase + CAS) & 1)) 
-		udelay(1);
+		udelay(10);
+	if(!count)
+		printk("i810_audio: AC97 write access failed.\n");
 	outw(data, card->ac97base + (reg&0x7f));
 }
 
@@ -1657,10 +1716,25 @@
 	int ready_2nd = 0;
 	struct ac97_codec *codec;
 	u16 eid;
+	int i=0;
 
-	outl(0, card->iobase + GLOB_CNT);
-	udelay(500);
-	outl(1<<1, card->iobase + GLOB_CNT);
+
+	outl(6 , card->iobase + GLOB_CNT);
+	while(i<10)
+	{
+		if((inl(card->iobase+GLOB_CNT)&4)==0)
+			break;
+		current->state = TASK_UNINTERRUPTIBLE;
+		schedule_timeout(HZ/20);
+		i++;
+	}
+	if(i==10)
+	{
+		printk(KERN_ERR "i810_audio: AC'97 reset failed.\n");
+		return 0;
+	}
+	
+	inw(card->ac97base);
 
 	for (num_ac97 = 0; num_ac97 < NR_AC97; num_ac97++) {
 		if ((codec = kmalloc(sizeof(struct ac97_codec), GFP_KERNEL)) == NULL)
@@ -1692,9 +1766,17 @@
 		if(!(eid&0x0001))
 			printk(KERN_WARNING "i810_audio: only 48Khz playback available.\n");
 		else
+		{
 			/* Enable variable rate mode */
-			i810_ac97_set(codec, AC97_EXTENDED_STATUS, 
-				i810_ac97_get(codec,AC97_EXTENDED_STATUS)|1);
+			i810_ac97_set(codec, AC97_EXTENDED_STATUS, 9);
+			i810_ac97_set(codec,AC97_EXTENDED_STATUS,
+				i810_ac97_get(codec, AC97_EXTENDED_STATUS)|0xE800);
+			if(!(i810_ac97_get(codec, AC97_EXTENDED_STATUS)&1))
+			{
+				printk(KERN_WARNING "i810_audio: Codec refused to allow VRA, using 48Khz only.\n");
+				card->ac97_features&=~1;
+			}
+		}
 			
 		if ((codec->dev_mixer = register_sound_mixer(&i810_mixer_fops, -1)) < 0) {
 			printk(KERN_ERR "i810_audio: couldn't register mixer!\n");
@@ -1777,12 +1859,6 @@
 		kfree(card);
 		return -ENODEV;
 	}
-
-//	printk("resetting codec?\n");
-	outl(0, card->iobase + GLOB_CNT);
-	udelay(500);
-//	printk("bringing it back?\n");
-	outl(1<<1, card->iobase + GLOB_CNT);
 	return 0;
 }
 
@@ -1806,6 +1882,8 @@
 
 MODULE_AUTHOR("Assorted");
 MODULE_DESCRIPTION("Intel 810 audio support");
+MODULE_PARM(ftsodell, "i");
+MODULE_PARM(clocking, "i");
 
 int __init i810_probe(void)
 {
@@ -1815,6 +1893,9 @@
 	if (!pci_present())   /* No PCI bus in this machine! */
 		return -ENODEV;
 
+	if(ftsodell==1)
+		clocking=41194;
+		
 	printk(KERN_INFO "Intel 810 + AC97 Audio, version "
 	       DRIVER_VERSION ", " __TIME__ " " __DATE__ "\n");
 
@@ -1828,6 +1909,11 @@
 	}
 	while( (pcidev = pci_find_device(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_440MX, pcidev))!=NULL ) {
 		if (i810_install(pcidev, INTEL440MX, "Intel 440MX")==0)
+			foundone++;
+	}
+
+	while( (pcidev = pci_find_device(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH2, pcidev))!=NULL ) {
+		if (i810_install(pcidev, INTELICH2, "Intel ICH2")==0)
 			foundone++;
 	}
 
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/drivers/sound/sound_core.c linux.17p9/drivers/sound/sound_core.c
--- linux.vanilla/drivers/sound/sound_core.c	Sun Jun 11 21:44:18 2000
+++ linux.17p9/drivers/sound/sound_core.c	Sun Jun 25 18:14:41 2000
@@ -80,7 +80,10 @@
 extern int init_solo1(void);
 #endif
 #ifdef CONFIG_SOUND_YMPCI
-extern init_ymf7xxsb_module();
+extern int init_ymf7xxsb_module(void);
+#endif
+#ifdef CONFIG_SOUND_FUSION
+extern int cs_probe(void);
 #endif
 
 /*
@@ -442,6 +445,9 @@
 #endif
 #ifdef CONFIG_SOUND_YMPCI
 	init_ymf7xxsb_module();
+#endif
+#ifdef CONFIG_SOUND_FUSION
+	cs_probe();
 #endif
 	return 0;
 }
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/drivers/sound/ymf_sb.c linux.17p9/drivers/sound/ymf_sb.c
--- linux.vanilla/drivers/sound/ymf_sb.c	Sun Jun 11 21:44:18 2000
+++ linux.17p9/drivers/sound/ymf_sb.c	Sun Jun 11 21:54:57 2000
@@ -822,7 +822,7 @@
 	return;
 }
 
-static int __init init_ymf7xxsb_module(void)
+int __init init_ymf7xxsb_module(void)
 {
 	if ( master_vol < 0 ) master_vol  = 50;
 	if ( master_vol > 100 ) master_vol = 100;
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/drivers/telephony/ixj.c linux.17p9/drivers/telephony/ixj.c
--- linux.vanilla/drivers/telephony/ixj.c	Fri Apr 21 12:46:37 2000
+++ linux.17p9/drivers/telephony/ixj.c	Thu Jun 15 16:27:23 2000
@@ -1,10 +1,10 @@
-/*
+/****************************************************************************
  *    ixj.c
  *
  *    Device Driver for the Internet PhoneJACK and
  *    Internet LineJACK Telephony Cards.
  *
- *    (c) Copyright 1999 Quicknet Technologies, Inc.
+ *    (c) Copyright 1999-2000  Quicknet Technologies, Inc.
  *
  *    This program is free software; you can redistribute it and/or
  *    modify it under the terms of the GNU General Public License
@@ -12,25 +12,42 @@
  *    2 of the License, or (at your option) any later version.
  *
  * Author:          Ed Okerson, <eokerson@quicknet.net>
- *    
+ *
  * Contributors:    Greg Herlein, <gherlein@quicknet.net>
  *                  David W. Erhart, <derhart@quicknet.net>
  *                  John Sellers, <jsellers@quicknet.net>
  *                  Mike Preston, <mpreston@quicknet.net>
- *
+ *    
  * Fixes:
- *
- * More information about the hardware related to this driver can be found
+ * 
+ * More information about the hardware related to this driver can be found  
  * at our website:    http://www.quicknet.net
  *
- */
+ * IN NO EVENT SHALL QUICKNET TECHNOLOGIES, INC. BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT
+ * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF QUICKNET
+ * TECHNOLOGIES, INC.HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *    
+ * QUICKNET TECHNOLOGIES, INC. SPECIFICALLY DISCLAIMS ANY WARRANTIES,
+ * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND QUICKNET TECHNOLOGIES, INC. HAS NO OBLIGATION
+ * TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ ***************************************************************************/
 
-static char ixj_c_rcsid[] = "$Id: ixj.c,v 3.4 1999/12/16 22:18:36 root Exp root $";
+static char ixj_c_rcsid[] = "$Id: ixj.c,v 3.31 2000/04/14 19:24:47 jaugenst Exp $";
+static char ixj_c_revision[] = "$Revision: 3.31 $";
 
 //#define PERFMON_STATS
 #define IXJDEBUG 0
 #define MAXRINGS 5
 
+#ifdef CONFIG_PCMCIA
+#include <pcmcia/config.h>
+#include <pcmcia/k_compat.h>
+#endif
+
 #include <linux/module.h>
 
 #include <linux/init.h>
@@ -54,8 +71,18 @@
 #include <asm/uaccess.h>
 
 #ifdef CONFIG_ISAPNP
-#include "../pnp/pnpio.h"
-#include "../pnp/isapnp.h"
+#include "../isapnp/pnpio.h"
+#include "../isapnp/isapnp.h"
+#endif
+
+#ifdef CONFIG_PCMCIA
+#include <pcmcia/version.h>
+#include <pcmcia/cs_types.h>
+#include <pcmcia/cs.h>
+#include <pcmcia/cistpl.h>
+#include <pcmcia/ds.h>
+#include <pcmcia/cisreg.h>
+#include <pcmcia/ciscode.h>
 #endif
 
 #include "ixj.h"
@@ -100,14 +127,17 @@
 static void ixj_write_frame(int board);
 static void ixj_init_timer(void);
 static void ixj_add_timer(void);
-static void ixj_del_timer(void);
 static void ixj_timeout(unsigned long ptr);
 static int read_filters(int board);
 static int LineMonitor(int board);
 static int ixj_fasync(int fd, struct file *, int mode);
+static int ixj_set_port(int board, int arg);
+static int ixj_set_pots(int board, int arg);
 static int ixj_hookstate(int board);
 static int ixj_record_start(int board);
 static void ixj_record_stop(int board);
+static void set_rec_volume(int board, int volume);
+static void ixj_vad(int board, int arg);
 static int ixj_play_start(int board);
 static void ixj_play_stop(int board);
 static int ixj_set_tone_on(unsigned short arg, int board);
@@ -124,6 +154,7 @@
 static char daa_int_read(int board);
 static int daa_set_mode(int board, int mode);
 static int ixj_linetest(int board);
+static int ixj_daa_write(int board);
 static int ixj_daa_cid_read(int board);
 static void DAA_Coeff_US(int board);
 static void DAA_Coeff_UK(int board);
@@ -134,12 +165,18 @@
 static int ixj_init_filter(int board, IXJ_FILTER * jf);
 static int ixj_init_tone(int board, IXJ_TONE * ti);
 static int ixj_build_cadence(int board, IXJ_CADENCE * cp);
+static int ixj_build_filter_cadence(int board, IXJ_FILTER_CADENCE * cp);
 // Serial Control Interface funtions
 static int SCI_Control(int board, int control);
 static int SCI_Prepare(int board);
 static int SCI_WaitHighSCI(int board);
 static int SCI_WaitLowSCI(int board);
 static DWORD PCIEE_GetSerialNumber(WORD wAddress);
+static int ixj_PCcontrol_wait(int board);
+static void ixj_write_cid(int board);
+static void ixj_write_cid_bit(int board, int bit);
+static int set_base_frame(int board, int size);
+static int set_play_codec(int board, int rate);
 
 /************************************************************************
 CT8020/CT8021 Host Programmers Model
@@ -160,12 +197,19 @@
 	ixj[board].hsr.bytes.low = inb_p(ixj[board].DSPbase + 8);
 	ixj[board].hsr.bytes.high = inb_p(ixj[board].DSPbase + 9);
 }
+
 extern __inline__ int IsControlReady(int board)
 {
 	ixj_read_HSR(board);
 	return ixj[board].hsr.bits.controlrdy ? 1 : 0;
 }
 
+extern __inline__ int IsPCControlReady(int board)
+{
+	ixj[board].pccr1.byte = inb_p(ixj[board].XILINXbase + 3);
+	return ixj[board].pccr1.bits.crr ? 1 : 0;
+}
+
 extern __inline__ int IsStatusReady(int board)
 {
 	ixj_read_HSR(board);
@@ -175,21 +219,54 @@
 extern __inline__ int IsRxReady(int board)
 {
 	ixj_read_HSR(board);
+#ifdef PERFMON_STATS
+	++ixj[board].rxreadycheck;
+#endif
 	return ixj[board].hsr.bits.rxrdy ? 1 : 0;
 }
 
 extern __inline__ int IsTxReady(int board)
 {
 	ixj_read_HSR(board);
+#ifdef PERFMON_STATS
+	++ixj[board].txreadycheck;
+#endif
 	return ixj[board].hsr.bits.txrdy ? 1 : 0;
 }
 
+extern __inline__ void set_play_volume(int board, int volume)
+{
+	ixj_WriteDSPCommand(0xCF02, board);
+	ixj_WriteDSPCommand(volume, board);
+}
+
+extern __inline__ int get_play_volume(int board)
+{
+	ixj_WriteDSPCommand(0xCF00, board);
+	return ixj[board].ssr.high << 8 | ixj[board].ssr.low;
+}
+
 extern __inline__ BYTE SLIC_GetState(int board)
 {
 	IXJ *j = &ixj[board];
 
-	j->pld_slicr.byte = inb_p(j->XILINXbase + 0x01);
-
+	if (j->cardtype == 600) {
+		j->pccr1.byte = 0;
+		j->psccr.bits.dev = 3;
+		j->psccr.bits.rw = 1;
+		outw_p(j->psccr.byte << 8, j->XILINXbase + 0x00);
+		ixj_PCcontrol_wait(board);
+		j->pslic.byte = inw_p(j->XILINXbase + 0x00) & 0xFF;
+		ixj_PCcontrol_wait(board);
+		if (j->pslic.bits.powerdown)
+			return PLD_SLIC_STATE_OC;
+		else if (!j->pslic.bits.ring0 && !j->pslic.bits.ring1)
+			return PLD_SLIC_STATE_ACTIVE;
+		else
+			return PLD_SLIC_STATE_RINGING;
+	} else {
+		j->pld_slicr.byte = inb_p(j->XILINXbase + 0x01);
+	}
 	return j->pld_slicr.bits.state;
 }
 
@@ -198,78 +275,122 @@
 	BOOL fRetVal = FALSE;
 	IXJ *j = &ixj[board];
 
-	// Set the C1, C2, C3 & B2EN signals.
-	switch (byState) {
-	case PLD_SLIC_STATE_OC:
-		j->pld_slicw.bits.c1 = 0;
-		j->pld_slicw.bits.c2 = 0;
-		j->pld_slicw.bits.c3 = 0;
-		j->pld_slicw.bits.b2en = 0;
-		outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
-		fRetVal = TRUE;
-		break;
-	case PLD_SLIC_STATE_RINGING:
-		j->pld_slicw.bits.c1 = 1;
-		j->pld_slicw.bits.c2 = 0;
-		j->pld_slicw.bits.c3 = 0;
-		j->pld_slicw.bits.b2en = 1;
-		outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
-		fRetVal = TRUE;
-		break;
-	case PLD_SLIC_STATE_ACTIVE:
-		j->pld_slicw.bits.c1 = 0;
-		j->pld_slicw.bits.c2 = 1;
-		j->pld_slicw.bits.c3 = 0;
-		j->pld_slicw.bits.b2en = 0;
-		outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
-		fRetVal = TRUE;
-		break;
-	case PLD_SLIC_STATE_OHT:	// On-hook transmit
+	if (j->cardtype == 600) {
+		if (j->flags.pcmciasct) {
+			switch (byState) {
+			case PLD_SLIC_STATE_TIPOPEN:
+			case PLD_SLIC_STATE_OC:
+				j->pslic.bits.powerdown = 1;
+				j->pslic.bits.ring0 = j->pslic.bits.ring1 = 0;
+				fRetVal = TRUE;
+				break;
+			case PLD_SLIC_STATE_RINGING:
+				if (j->readers || j->writers) {
+					j->pslic.bits.powerdown = 0;
+					j->pslic.bits.ring0 = 1;
+					j->pslic.bits.ring1 = 0;
+					fRetVal = TRUE;
+				}
+				break;
+			case PLD_SLIC_STATE_OHT:	// On-hook transmit
 
-		j->pld_slicw.bits.c1 = 1;
-		j->pld_slicw.bits.c2 = 1;
-		j->pld_slicw.bits.c3 = 0;
-		j->pld_slicw.bits.b2en = 0;
-		outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
-		fRetVal = TRUE;
-		break;
-	case PLD_SLIC_STATE_TIPOPEN:
-		j->pld_slicw.bits.c1 = 0;
-		j->pld_slicw.bits.c2 = 0;
-		j->pld_slicw.bits.c3 = 1;
-		j->pld_slicw.bits.b2en = 0;
-		outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
-		fRetVal = TRUE;
-		break;
-	case PLD_SLIC_STATE_STANDBY:
-		j->pld_slicw.bits.c1 = 1;
-		j->pld_slicw.bits.c2 = 0;
-		j->pld_slicw.bits.c3 = 1;
-		j->pld_slicw.bits.b2en = 1;
-		outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
-		fRetVal = TRUE;
-		break;
-	case PLD_SLIC_STATE_APR:	// Active polarity reversal
+			case PLD_SLIC_STATE_STANDBY:
+			case PLD_SLIC_STATE_ACTIVE:
+				if (j->readers || j->writers) {
+					j->pslic.bits.powerdown = 0;
+				} else {
+					j->pslic.bits.powerdown = 1;
+				}
+				j->pslic.bits.ring0 = j->pslic.bits.ring1 = 0;
+				fRetVal = TRUE;
+				break;
+			case PLD_SLIC_STATE_APR:	// Active polarity reversal
 
-		j->pld_slicw.bits.c1 = 0;
-		j->pld_slicw.bits.c2 = 1;
-		j->pld_slicw.bits.c3 = 1;
-		j->pld_slicw.bits.b2en = 0;
-		outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
-		fRetVal = TRUE;
-		break;
-	case PLD_SLIC_STATE_OHTPR:	// OHT polarity reversal
+			case PLD_SLIC_STATE_OHTPR:	// OHT polarity reversal
 
-		j->pld_slicw.bits.c1 = 1;
-		j->pld_slicw.bits.c2 = 1;
-		j->pld_slicw.bits.c3 = 1;
-		j->pld_slicw.bits.b2en = 0;
-		outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
-		fRetVal = TRUE;
-		break;
-	default:
-		fRetVal = FALSE;
-		break;
+			default:
+				fRetVal = FALSE;
+				break;
+			}
+			j->psccr.bits.dev = 3;
+			j->psccr.bits.rw = 0;
+			outw_p(j->psccr.byte << 8 | j->pslic.byte, j->XILINXbase + 0x00);
+			ixj_PCcontrol_wait(board);
+		}
+	} else {
+		// Set the C1, C2, C3 & B2EN signals.
+		switch (byState) {
+		case PLD_SLIC_STATE_OC:
+			j->pld_slicw.bits.c1 = 0;
+			j->pld_slicw.bits.c2 = 0;
+			j->pld_slicw.bits.c3 = 0;
+			j->pld_slicw.bits.b2en = 0;
+			outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
+			fRetVal = TRUE;
+			break;
+		case PLD_SLIC_STATE_RINGING:
+			j->pld_slicw.bits.c1 = 1;
+			j->pld_slicw.bits.c2 = 0;
+			j->pld_slicw.bits.c3 = 0;
+			j->pld_slicw.bits.b2en = 1;
+			outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
+			fRetVal = TRUE;
+			break;
+		case PLD_SLIC_STATE_ACTIVE:
+			j->pld_slicw.bits.c1 = 0;
+			j->pld_slicw.bits.c2 = 1;
+			j->pld_slicw.bits.c3 = 0;
+			j->pld_slicw.bits.b2en = 0;
+			outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
+			fRetVal = TRUE;
+			break;
+		case PLD_SLIC_STATE_OHT:	// On-hook transmit
+
+			j->pld_slicw.bits.c1 = 1;
+			j->pld_slicw.bits.c2 = 1;
+			j->pld_slicw.bits.c3 = 0;
+			j->pld_slicw.bits.b2en = 0;
+			outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
+			fRetVal = TRUE;
+			break;
+		case PLD_SLIC_STATE_TIPOPEN:
+			j->pld_slicw.bits.c1 = 0;
+			j->pld_slicw.bits.c2 = 0;
+			j->pld_slicw.bits.c3 = 1;
+			j->pld_slicw.bits.b2en = 0;
+			outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
+			fRetVal = TRUE;
+			break;
+		case PLD_SLIC_STATE_STANDBY:
+			j->pld_slicw.bits.c1 = 1;
+			j->pld_slicw.bits.c2 = 0;
+			j->pld_slicw.bits.c3 = 1;
+			j->pld_slicw.bits.b2en = 1;
+			outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
+			fRetVal = TRUE;
+			break;
+		case PLD_SLIC_STATE_APR:	// Active polarity reversal
+
+			j->pld_slicw.bits.c1 = 0;
+			j->pld_slicw.bits.c2 = 1;
+			j->pld_slicw.bits.c3 = 1;
+			j->pld_slicw.bits.b2en = 0;
+			outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
+			fRetVal = TRUE;
+			break;
+		case PLD_SLIC_STATE_OHTPR:	// OHT polarity reversal
+
+			j->pld_slicw.bits.c1 = 1;
+			j->pld_slicw.bits.c2 = 1;
+			j->pld_slicw.bits.c3 = 1;
+			j->pld_slicw.bits.b2en = 0;
+			outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
+			fRetVal = TRUE;
+			break;
+		default:
+			fRetVal = FALSE;
+			break;
+		}
 	}
 
 	return fRetVal;
@@ -361,51 +482,42 @@
 	add_timer(&ixj_timer);
 }
 
-static void ixj_del_timer(void)
-{
-	del_timer(&ixj_timer);
-}
-
 static void ixj_tone_timeout(int board)
 {
 	IXJ *j = &ixj[board];
 	IXJ_TONE ti;
-	
+
 	j->tone_state++;
 	if (j->tone_state == 3) {
 		j->tone_state = 0;
 		if (j->cadence_t) {
 			j->tone_cadence_state++;
-			if (j->tone_cadence_state >= j->cadence_t->elements_used) 
-			{
-				switch (j->cadence_t->termination) 
-				{
-					case PLAY_ONCE:
-						ixj_cpt_stop(board);
-							break;
-					case REPEAT_LAST_ELEMENT:
-						j->tone_cadence_state--;
-						ixj_play_tone(board, j->cadence_t->ce[j->tone_cadence_state].index);
-						break;
-					case REPEAT_ALL:
-						j->tone_cadence_state = 0;
-						if (j->cadence_t->ce[j->tone_cadence_state].freq0) 
-						{
-							ti.tone_index = j->cadence_t->ce[j->tone_cadence_state].index;
-							ti.freq0 = j->cadence_t->ce[j->tone_cadence_state].freq0;
-							ti.gain0 = j->cadence_t->ce[j->tone_cadence_state].gain0;
-							ti.freq1 = j->cadence_t->ce[j->tone_cadence_state].freq1;
-							ti.gain1 = j->cadence_t->ce[j->tone_cadence_state].gain1;
-							ixj_init_tone(board, &ti);
-						}
-						ixj_set_tone_on(j->cadence_t->ce[0].tone_on_time, board);
-						ixj_set_tone_off(j->cadence_t->ce[0].tone_off_time, board);
-						ixj_play_tone(board, j->cadence_t->ce[0].index);
-						break;
+			if (j->tone_cadence_state >= j->cadence_t->elements_used) {
+				switch (j->cadence_t->termination) {
+				case PLAY_ONCE:
+					ixj_cpt_stop(board);
+					break;
+				case REPEAT_LAST_ELEMENT:
+					j->tone_cadence_state--;
+					ixj_play_tone(board, j->cadence_t->ce[j->tone_cadence_state].index);
+					break;
+				case REPEAT_ALL:
+					j->tone_cadence_state = 0;
+					if (j->cadence_t->ce[j->tone_cadence_state].freq0) {
+						ti.tone_index = j->cadence_t->ce[j->tone_cadence_state].index;
+						ti.freq0 = j->cadence_t->ce[j->tone_cadence_state].freq0;
+						ti.gain0 = j->cadence_t->ce[j->tone_cadence_state].gain0;
+						ti.freq1 = j->cadence_t->ce[j->tone_cadence_state].freq1;
+						ti.gain1 = j->cadence_t->ce[j->tone_cadence_state].gain1;
+						ixj_init_tone(board, &ti);
+					}
+					ixj_set_tone_on(j->cadence_t->ce[0].tone_on_time, board);
+					ixj_set_tone_off(j->cadence_t->ce[0].tone_off_time, board);
+					ixj_play_tone(board, j->cadence_t->ce[0].index);
+					break;
 				}
 			} else {
-				if (j->cadence_t->ce[j->tone_cadence_state].gain0) 
-				{
+				if (j->cadence_t->ce[j->tone_cadence_state].gain0) {
 					ti.tone_index = j->cadence_t->ce[j->tone_cadence_state].index;
 					ti.freq0 = j->cadence_t->ce[j->tone_cadence_state].freq0;
 					ti.gain0 = j->cadence_t->ce[j->tone_cadence_state].gain0;
@@ -421,50 +533,50 @@
 	}
 }
 
+extern __inline__ void ixj_kill_fasync(int board)
+{
+	if (ixj[board].async_queue)
+		kill_fasync(ixj[board].async_queue, SIGIO);	// Send apps notice of change
+
+}
 static void ixj_timeout(unsigned long ptr)
 {
 	int board;
 	unsigned long jifon;
 	IXJ *j;
 
-	for (board = 0; board < IXJMAX; board++) 
-	{
+	for (board = 0; board < IXJMAX; board++) {
 		j = &ixj[board];
 
-		if (j->DSPbase) 
-		{
+		if (j->DSPbase) {
 #ifdef PERFMON_STATS
 			j->timerchecks++;
 #endif
-			if (j->tone_state) 
-			{
-				if (!ixj_hookstate(board)) 
-				{
+			if (j->tone_state) {
+				if (!ixj_hookstate(board)) {
 					ixj_cpt_stop(board);
-					if (j->m_hook) 
-					{
+					if (j->m_hook) {
 						j->m_hook = 0;
 						j->ex.bits.hookstate = 1;
-						if (j->async_queue)
-							kill_fasync(j->async_queue, SIGIO);	// Send apps notice of change
+						ixj_kill_fasync(board);
 					}
-					goto timer_end;
+					continue;
 				}
 				if (j->tone_state == 1)
 					jifon = (hertz * j->tone_on_time * 25 / 100000);
 				else
 					jifon = (hertz * j->tone_on_time * 25 / 100000) +
 					    (hertz * j->tone_off_time * 25 / 100000);
-				if (jiffies < j->tone_start_jif + jifon) {
+				if (time_before(jiffies, j->tone_start_jif + jifon)) {
 					if (j->tone_state == 1) {
 						ixj_play_tone(board, j->tone_index);
 						if (j->dsp.low == 0x20) {
-							goto timer_end;
+							continue;
 						}
 					} else {
 						ixj_play_tone(board, 0);
 						if (j->dsp.low == 0x20) {
-							goto timer_end;
+							continue;
 						}
 					}
 				} else {
@@ -475,13 +587,13 @@
 					if (j->flags.busytone) {
 						ixj_busytone(board);
 						if (j->dsp.low == 0x20) {
-							goto timer_end;
+							continue;
 						}
 					}
 					if (j->flags.ringback) {
 						ixj_ringback(board);
 						if (j->dsp.low == 0x20) {
-							goto timer_end;
+							continue;
 						}
 					}
 					if (!j->tone_state) {
@@ -498,7 +610,7 @@
 				if (IsRxReady(board)) {
 					ixj_read_frame(board);
 				}
-				if (IsTxReady(board)) {
+				if (IsTxReady(board) && !j->flags.cidplay) {
 					ixj_write_frame(board);
 				}
 			}
@@ -507,7 +619,12 @@
 					j->flags.cringing = 0;
 					ixj_ring_off(board);
 				} else {
-					if (jiffies - j->ring_cadence_jif >= (hertz/2)) {
+					if (jiffies - j->ring_cadence_jif >= (.5 * hertz)) {
+						if (j->flags.cidring && !j->flags.cidsent) {
+							j->flags.cidsent = 1;
+							ixj_write_cid(board);
+							j->flags.cidring = 0;
+						}
 						j->ring_cadence_t--;
 						if (j->ring_cadence_t == -1)
 							j->ring_cadence_t = 15;
@@ -517,16 +634,15 @@
 						ixj_ring_on(board);
 					} else {
 						ixj_ring_off(board);
+						j->flags.cidring = 1;
 					}
-					goto timer_end;
+					continue;
 				}
 			}
 			if (!j->flags.ringing) {
 				if (ixj_hookstate(board)) {
-					if ((j->dsp.low == 0x21 || j->dsp.low == 0x22 )&&
-					    j->pld_slicr.bits.state != PLD_SLIC_STATE_ACTIVE)
-               // Internet LineJACK
-					{
+					if (j->dsp.low != 0x20 &&
+					    SLIC_GetState(board) != PLD_SLIC_STATE_ACTIVE) {
 						SLIC_SetState(PLD_SLIC_STATE_ACTIVE, board);
 					}
 					LineMonitor(board);
@@ -535,13 +651,12 @@
 					j->proc_load = j->ssr.high << 8 | j->ssr.low;
 					if (!j->m_hook) {
 						j->m_hook = j->ex.bits.hookstate = 1;
-						if (j->async_queue)
-							kill_fasync(j->async_queue, SIGIO);	// Send apps notice of change
+						ixj_kill_fasync(board);
 					}
 				} else {
-					if ((j->dsp.low == 0x21 || j->dsp.low == 0x22) &&
-					    j->pld_slicr.bits.state == PLD_SLIC_STATE_ACTIVE)
-               // Internet LineJACK
+					if (j->dsp.low != 0x20 &&
+					    SLIC_GetState(board) == PLD_SLIC_STATE_ACTIVE)
+						// Internet LineJACK
 					{
 						SLIC_SetState(PLD_SLIC_STATE_STANDBY, board);
 					}
@@ -551,15 +666,14 @@
 					if (j->m_hook) {
 						j->m_hook = 0;
 						j->ex.bits.hookstate = 1;
-						if (j->async_queue)
-							kill_fasync(j->async_queue, SIGIO);	// Send apps notice of change
+						ixj_kill_fasync(board);
 					}
 				}
 			}
-			if (j->cardtype == 300) {
+			if (j->cardtype == 300 && !j->flags.incheck) {
 				if (j->flags.pstn_present) {
 					j->pld_scrr.byte = inb_p(j->XILINXbase);
-					if (jiffies >= j->pstn_sleeptil && j->pld_scrr.bits.daaflag) {
+					if (j->pld_scrr.bits.daaflag) {
 						daa_int_read(board);
 						if (j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.bitreg.RING) {
 							if (!j->flags.pstn_ringing) {
@@ -568,22 +682,38 @@
 									daa_set_mode(board, SOP_PU_RINGING);
 							}
 						}
-						if (j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.bitreg.VDD_OK) {
+						if (time_after(jiffies, j->pstn_sleeptil) && j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.bitreg.VDD_OK) {
 							j->pstn_winkstart = 0;
+							j->pstn_ring_stop = 0;
+							ixj[board].pld_scrw.bits.led1 = 1;
 							if (j->flags.pstn_ringing && !j->pstn_envelope) {
+								if (j->daa_mode != SOP_PU_RINGING) {
+									j->flags.pstn_ringing = 0;
+								} else {
+									ixj[board].pld_scrw.bits.led2 = 0;
+									j->pstn_envelope = 1;
+									j->pstn_ring_start = jiffies;
+									j->pstn_ring_stop = 0;
+								}
 								j->ex.bits.pstn_ring = 0;
-								j->pstn_envelope = 1;
-								j->pstn_ring_start = jiffies;
 							}
+							outb_p(ixj[board].pld_scrw.byte, ixj[board].XILINXbase);
 						} else {
-							if (j->flags.pstn_ringing && j->pstn_envelope &&
-							    jiffies > j->pstn_ring_start + ((hertz * 15) / 10)) {
-								j->ex.bits.pstn_ring = 1;
-								j->pstn_envelope = 0;
+							ixj[board].pld_scrw.bits.led1 = 0;
+							ixj[board].pld_scrw.bits.led2 = 1;
+							outb_p(ixj[board].pld_scrw.byte, ixj[board].XILINXbase);
+							if (j->flags.pstn_ringing && j->pstn_envelope) {
+								if(!j->pstn_ring_stop) {
+									j->pstn_ring_stop = jiffies;
+								} else if (time_after(jiffies, j->pstn_ring_stop + ((hertz * 5) / 100))){
+									j->pstn_ring_stop = 0;
+									j->ex.bits.pstn_ring = 1;
+									j->pstn_envelope = 0;
+								}
 							} else if (j->daa_mode == SOP_PU_CONVERSATION) {
 								if (!j->pstn_winkstart) {
 									j->pstn_winkstart = jiffies;
-								} else if (jiffies > j->pstn_winkstart + (hertz * j->winktime / 1000)) {
+								} else if (time_after(jiffies, j->pstn_winkstart + (hertz * j->winktime / 1000))) {
 									daa_set_mode(board, SOP_PU_SLEEP);
 									j->pstn_winkstart = 0;
 									j->ex.bits.pstn_wink = 1;
@@ -620,13 +750,23 @@
 							j->ex.bits.caller_id = 0;
 						}
 						if (!j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.bitreg.VDD_OK) {
+							ixj[board].pld_scrw.bits.led1 = 0;
+							ixj[board].pld_scrw.bits.led2 = 1;
+							outb_p(ixj[board].pld_scrw.byte, ixj[board].XILINXbase);
 							if (j->flags.pstn_ringing && j->pstn_envelope) {
-								j->ex.bits.pstn_ring = 1;
-								j->pstn_envelope = 0;
+								if(!j->pstn_ring_stop) {
+									j->pstn_ring_stop = jiffies;
+								} else if (time_after(jiffies, j->pstn_ring_stop + ((hertz * 5) / 100))){
+									j->pstn_ring_stop = 0;
+									j->ex.bits.pstn_ring = 1;
+									j->pstn_envelope = 0;
+								}
+								ixj[board].pld_scrw.bits.led1 = 0;
+								outb_p(ixj[board].pld_scrw.byte, ixj[board].XILINXbase);
 							} else if (j->daa_mode == SOP_PU_CONVERSATION) {
 								if (!j->pstn_winkstart) {
 									j->pstn_winkstart = jiffies;
-								} else if (jiffies > j->pstn_winkstart + (hertz * 320 / 1000)) {
+								} else if (time_after(jiffies, j->pstn_winkstart + (hertz * j->winktime / 1000))) {
 									daa_set_mode(board, SOP_PU_SLEEP);
 									j->pstn_winkstart = 0;
 									j->ex.bits.pstn_wink = 1;
@@ -636,19 +776,15 @@
 					}
 				}
 			}
-			if ((j->ex.bits.f0 || j->ex.bits.f1 || j->ex.bits.f2 || j->ex.bits.f3)
-			    && j->filter_cadence) {
-			}
 			if (j->ex.bytes) {
 				wake_up_interruptible(&j->poll_q);	// Wake any blocked selects
-				if (j->async_queue)
-					kill_fasync(j->async_queue, SIGIO);	// Send apps notice of change
+
+				ixj_kill_fasync(board);
 			}
 		} else {
 			break;
 		}
 	}
-timer_end:
 	ixj_add_timer();
 }
 
@@ -665,6 +801,19 @@
 	return 0;
 }
 
+static int ixj_PCcontrol_wait(int board)
+{
+	unsigned long jif;
+
+	jif = jiffies;
+	while (!IsPCControlReady(board)) {
+		if (jiffies - jif > (60 * (hertz / 100))) {
+			return -1;
+		}
+	}
+	return 0;
+}
+
 int ixj_WriteDSPCommand(unsigned short cmd, int board)
 {
 	BYTES bytes;
@@ -710,7 +859,7 @@
 
 extern __inline__ void LED_SetState(int state, int board)
 {
-	if (ixj[board].dsp.low == 0x21) {
+	if (ixj[board].cardtype == 300) {
 		ixj[board].pld_scrw.bits.led1 = state & 0x1 ? 1 : 0;
 		ixj[board].pld_scrw.bits.led2 = state & 0x2 ? 1 : 0;
 		ixj[board].pld_scrw.bits.led3 = state & 0x4 ? 1 : 0;
@@ -748,12 +897,19 @@
 	case PORT_POTS:
 		j->port = PORT_POTS;
 		switch (j->cardtype) {
+		case 600:
+			if (j->flags.pcmciasct == 1)
+				SLIC_SetState(PLD_SLIC_STATE_ACTIVE, board);
+			else
+				return 11;
+			break;
 		case 500:
 			j->pld_slicw.pcib.mic = 0;
 			j->pld_slicw.pcib.spk = 0;
 			outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
 			break;
 		case 300:
+			ixj_set_pots(board, 0);
 			if (ixj_WriteDSPCommand(0xC528, board))		/* Write CODEC config to
 									   Software Control Register */
 				return 2;
@@ -791,12 +947,21 @@
 	case PORT_SPEAKER:
 		j->port = PORT_SPEAKER;
 		switch (j->cardtype) {
+		case 600:
+			if (j->flags.pcmciasct) {
+				SLIC_SetState(PLD_SLIC_STATE_OC, board);
+//                              while(SLIC_GetState(board) != PLD_SLIC_STATE_OC) {
+				//                                      SLIC_SetState(PLD_SLIC_STATE_OC,board);
+				//                              }
+			}
+			break;
 		case 500:
 			j->pld_slicw.pcib.mic = 1;
 			j->pld_slicw.pcib.spk = 1;
 			outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
 			break;
 		case 300:
+			ixj_set_pots(board, 0);
 			break;
 		case 100:
 			j->gpio.bytes.high = 0x0B;
@@ -861,8 +1026,7 @@
 		j->gpio.bits.gpio2 = 1;
 		j->gpio.bits.gpio5 = 0;
 		ixj_WriteDSPCommand(j->gpio.word, board);	/* send the ring signal */
-	} else			//  Internet LineJACK, Internet PhoneJACK Lite or
-              //  Internet PhoneJACK PCI
+	} else			// Internet LineJACK, Internet PhoneJACK Lite or Internet PhoneJACK PCI
 	 {
 		if (ixjdebug > 0)
 			printk(KERN_INFO "IXJ Ring On /dev/phone%d\n", board);
@@ -871,6 +1035,212 @@
 	}
 }
 
+static int ixj_pcmcia_cable_check(int board)
+{
+	IXJ *j = &ixj[board];
+
+	j->pccr1.byte = inb_p(j->XILINXbase + 0x03);
+	if (!j->flags.pcmciastate) {
+		j->pccr2.byte = inb_p(j->XILINXbase + 0x02);
+		if (j->pccr1.bits.drf || j->pccr2.bits.rstc) {
+			j->flags.pcmciastate = 4;
+			return 0;
+		}
+		if (j->pccr1.bits.ed) {
+			j->pccr1.bits.ed = 0;
+			j->psccr.bits.dev = 3;
+			j->psccr.bits.rw = 1;
+			outw_p(j->psccr.byte << 8, j->XILINXbase + 0x00);
+			ixj_PCcontrol_wait(board);
+			j->pslic.byte = inw_p(j->XILINXbase + 0x00) & 0xFF;
+			j->pslic.bits.led2 = j->pslic.bits.det ? 1 : 0;
+			j->psccr.bits.dev = 3;
+			j->psccr.bits.rw = 0;
+			outw_p(j->psccr.byte << 8 | j->pslic.byte, j->XILINXbase + 0x00);
+			ixj_PCcontrol_wait(board);
+			return j->pslic.bits.led2 ? 1 : 0;
+		} else if (j->flags.pcmciasct) {
+			return j->r_hook;
+		} else {
+			return 1;
+		}
+	} else if (j->flags.pcmciastate == 4) {
+		if (!j->pccr1.bits.drf) {
+			j->flags.pcmciastate = 3;
+		}
+		return 0;
+	} else if (j->flags.pcmciastate == 3) {
+		j->pccr2.bits.pwr = 0;
+		j->pccr2.bits.rstc = 1;
+		outb_p(j->pccr2.byte, j->XILINXbase + 0x02);
+		j->checkwait = jiffies + hertz * 2;
+		j->flags.incheck = 1;
+		j->flags.pcmciastate = 2;
+		return 0;
+	} else if (j->flags.pcmciastate == 2) {
+		if (j->flags.incheck) {
+			if (time_before(jiffies, j->checkwait)) {
+				return 0;
+			} else {
+				j->flags.incheck = 0;
+			}
+		}
+		j->pccr2.bits.pwr = 0;
+		j->pccr2.bits.rstc = 0;
+		outb_p(j->pccr2.byte, j->XILINXbase + 0x02);
+		j->flags.pcmciastate = 1;
+		return 0;
+	} else if (j->flags.pcmciastate == 1) {
+		j->flags.pcmciastate = 0;
+		if (!j->pccr1.bits.drf) {
+			j->psccr.bits.dev = 3;
+			j->psccr.bits.rw = 1;
+			outb_p(j->psccr.byte, j->XILINXbase + 0x01);
+			ixj_PCcontrol_wait(board);
+			j->flags.pcmciascp = 1;		// Set Cable Present Flag
+
+			j->flags.pcmciasct = (inw_p(j->XILINXbase + 0x00) >> 8) & 0x03;		// Get Cable Type
+
+			if (j->flags.pcmciasct == 3) {
+				j->flags.pcmciastate = 4;
+				return 0;
+			} else if (j->flags.pcmciasct == 0) {
+				j->pccr2.bits.pwr = 1;
+				j->pccr2.bits.rstc = 0;
+				outb_p(j->pccr2.byte, j->XILINXbase + 0x02);
+				j->port = PORT_SPEAKER;
+			} else {
+				j->port = PORT_POTS;
+			}
+			j->sic1.bits.cpd = 0;	// Chip Power Down
+
+			j->sic1.bits.mpd = 0;	// MIC Bias Power Down
+
+			j->sic1.bits.hpd = 0;	// Handset Bias Power Down
+
+			j->sic1.bits.lpd = 0;	// Line Bias Power Down
+
+			j->sic1.bits.spd = 1;	// Speaker Drive Power Down
+
+			j->psccr.bits.addr = 1;		// R/W Smart Cable Register Address
+
+			j->psccr.bits.rw = 0;	// Read / Write flag
+
+			j->psccr.bits.dev = 0;
+			outb(j->sic1.byte, j->XILINXbase + 0x00);
+			outb(j->psccr.byte, j->XILINXbase + 0x01);
+			ixj_PCcontrol_wait(board);
+			j->sic2.bits.al = 0;	// Analog Loopback DAC analog -> ADC analog
+
+			j->sic2.bits.dl2 = 0;	// Digital Loopback DAC -> ADC one bit
+
+			j->sic2.bits.dl1 = 0;	// Digital Loopback ADC -> DAC one bit
+
+			j->sic2.bits.pll = 0;	// 1 = div 10, 0 = div 5
+
+			j->sic2.bits.hpd = 0;	// HPF disable
+
+			j->psccr.bits.addr = 2;		// R/W Smart Cable Register Address
+
+			j->psccr.bits.rw = 0;	// Read / Write flag
+
+			j->psccr.bits.dev = 0;
+			outb(j->sic2.byte, j->XILINXbase + 0x00);
+			outb(j->psccr.byte, j->XILINXbase + 0x01);
+			ixj_PCcontrol_wait(board);
+			j->psccr.bits.addr = 3;		// R/W Smart Cable Register Address
+
+			j->psccr.bits.rw = 0;	// Read / Write flag
+
+			j->psccr.bits.dev = 0;
+			outb(0x00, j->XILINXbase + 0x00);	// PLL Divide N1
+
+			outb(j->psccr.byte, j->XILINXbase + 0x01);
+			ixj_PCcontrol_wait(board);
+			j->psccr.bits.addr = 4;		// R/W Smart Cable Register Address
+
+			j->psccr.bits.rw = 0;	// Read / Write flag
+
+			j->psccr.bits.dev = 0;
+			outb(0x09, j->XILINXbase + 0x00);	// PLL Multiply M1
+
+			outb(j->psccr.byte, j->XILINXbase + 0x01);
+			ixj_PCcontrol_wait(board);
+			j->sirxg.bits.lig = 1;	// Line In Gain
+
+			j->sirxg.bits.lim = 1;	// Line In Mute
+
+			j->sirxg.bits.mcg = 0;	// MIC In Gain // was 3
+
+			j->sirxg.bits.mcm = 0;	// MIC In Mute
+
+			j->sirxg.bits.him = 0;	// Handset In Mute
+
+			j->sirxg.bits.iir = 1;	// IIR
+
+			j->psccr.bits.addr = 5;		// R/W Smart Cable Register Address
+
+			j->psccr.bits.rw = 0;	// Read / Write flag
+
+			j->psccr.bits.dev = 0;
+			outb(j->sirxg.byte, j->XILINXbase + 0x00);
+			outb(j->psccr.byte, j->XILINXbase + 0x01);
+			ixj_PCcontrol_wait(board);
+			j->siadc.bits.hom = 0;	// Handset Out Mute
+
+			j->siadc.bits.lom = 0;	// Line Out Mute
+
+			j->siadc.bits.rxg = 23;		//(0xC000 - 0x41C8) / 0x4EF;    // RX PGA Gain
+
+			j->psccr.bits.addr = 6;		// R/W Smart Cable Register Address
+
+			j->psccr.bits.rw = 0;	// Read / Write flag
+
+			j->psccr.bits.dev = 0;
+			outb(j->siadc.byte, j->XILINXbase + 0x00);
+			outb(j->psccr.byte, j->XILINXbase + 0x01);
+			ixj_PCcontrol_wait(board);
+			j->sidac.bits.srm = 1;	// Speaker Right Mute
+
+			j->sidac.bits.slm = 1;	// Speaker Left Mute
+
+			j->sidac.bits.txg = (0xC000 - 0x45E4) / 0x5D3;	// TX PGA Gain
+
+			j->psccr.bits.addr = 7;		// R/W Smart Cable Register Address
+
+			j->psccr.bits.rw = 0;	// Read / Write flag
+
+			j->psccr.bits.dev = 0;
+			outb(j->sidac.byte, j->XILINXbase + 0x00);
+			outb(j->psccr.byte, j->XILINXbase + 0x01);
+			ixj_PCcontrol_wait(board);
+			j->siaatt.bits.sot = 0;
+			j->psccr.bits.addr = 9;		// R/W Smart Cable Register Address
+
+			j->psccr.bits.rw = 0;	// Read / Write flag
+
+			j->psccr.bits.dev = 0;
+			outb(j->siaatt.byte, j->XILINXbase + 0x00);
+			outb(j->psccr.byte, j->XILINXbase + 0x01);
+			ixj_PCcontrol_wait(board);
+
+			if (j->flags.pcmciasct == 1 && !j->readers && !j->writers) {
+				j->psccr.byte = j->pslic.byte = 0;
+				j->pslic.bits.powerdown = 1;
+				j->psccr.bits.dev = 3;
+				j->psccr.bits.rw = 0;
+				outw_p(j->psccr.byte << 8 | j->pslic.byte, j->XILINXbase + 0x00);
+				ixj_PCcontrol_wait(board);
+			}
+		}
+		return 0;
+	} else {
+		j->flags.pcmciascp = 0;
+		return 0;
+	}
+	return 0;
+}
+
 static int ixj_hookstate(int board)
 {
 	unsigned long det;
@@ -887,12 +1257,9 @@
 	case 500:
 		SLIC_GetState(board);
 		if (j->pld_slicr.bits.state == PLD_SLIC_STATE_ACTIVE ||
-		    j->pld_slicr.bits.state == PLD_SLIC_STATE_STANDBY) 
-		{
-			if (j->flags.ringing) 
-			{
-				if(!in_interrupt())
-				{
+		    j->pld_slicr.bits.state == PLD_SLIC_STATE_STANDBY) {
+			if (j->flags.ringing) {
+				if (!in_interrupt()) {
 					det = jiffies + (hertz / 50);
 					while (time_before(jiffies, det)) {
 						current->state = TASK_INTERRUPTIBLE;
@@ -911,14 +1278,17 @@
 				fOffHook = j->pld_slicr.bits.det ? 1 : 0;
 		}
 		break;
+	case 600:
+		fOffHook = ixj_pcmcia_cable_check(board);
+		break;
 	}
 	if (j->r_hook != fOffHook) {
 		j->r_hook = fOffHook;
 		if (j->port != PORT_POTS) {
 			j->ex.bits.hookstate = 1;
-			if (j->async_queue)
-				kill_fasync(j->async_queue, SIGIO);	// Send apps notice of change
-
+			ixj_kill_fasync(board);
+		} else if (!fOffHook) {
+			j->flash_end = jiffies + (hertz / 10 * 6);
 		}
 	}
 	if (j->port == PORT_PSTN && j->daa_mode == SOP_PU_CONVERSATION)
@@ -930,7 +1300,10 @@
 	if (j->port == PORT_HANDSET)
 		fOffHook |= 2;
 
-	return fOffHook;
+	if (fOffHook && time_before(jiffies, j->flash_end))
+		return 0;
+	else
+		return fOffHook;
 }
 
 static void ixj_ring_off(board)
@@ -952,7 +1325,7 @@
 		if (ixjdebug > 0)
 			printk(KERN_INFO "IXJ Ring Off\n");
 
-		SLIC_SetState(PLD_SLIC_STATE_STANDBY, board);	
+		SLIC_SetState(PLD_SLIC_STATE_STANDBY, board);
 
 		SLIC_GetState(board);
 	}
@@ -1002,7 +1375,7 @@
 			}
 			current->state = TASK_INTERRUPTIBLE;
 			schedule_timeout(1);
-			if(signal_pending(current))
+			if (signal_pending(current))
 				break;
 		}
 		jif = jiffies + (3 * hertz);
@@ -1013,7 +1386,7 @@
 				while (time_before(jiffies, det)) {
 					current->state = TASK_INTERRUPTIBLE;
 					schedule_timeout(1);
-					if(signal_pending(current))
+					if (signal_pending(current))
 						break;
 				}
 				if (ixj_hookstate(board) & 1) {
@@ -1023,7 +1396,7 @@
 			}
 			current->state = TASK_INTERRUPTIBLE;
 			schedule_timeout(1);
-			if(signal_pending(current))
+			if (signal_pending(current))
 				break;
 		}
 	}
@@ -1034,40 +1407,70 @@
 
 int ixj_open(struct phone_device *p, struct file *file_p)
 {
-	IXJ *j = &ixj[p->board];
+	IXJ *j = file_p->private_data = &ixj[p->board];
 
 	if (!j->DSPbase)
 		return -ENODEV;
 
-	if (file_p->f_mode & FMODE_READ)
-		j->readers++;
-	if (file_p->f_mode & FMODE_WRITE)
-		j->writers++;
+        if (file_p->f_mode & FMODE_READ) {
+		if(!j->readers) {
+	                j->readers++;
+        	} else {
+                	return -EBUSY;
+		}
+        }
+
+	if (file_p->f_mode & FMODE_WRITE) {
+		if(!j->writers) {
+			j->writers++;
+		} else {
+			if (file_p->f_mode & FMODE_READ){
+				j->readers--;
+			}
+			return -EBUSY;
+		}
+	}
 
+	if (j->cardtype == 600) {
+		j->pslic.bits.powerdown = 0;
+		j->psccr.bits.dev = 3;
+		j->psccr.bits.rw = 0;
+		outw_p(j->psccr.byte << 8 | j->pslic.byte, j->XILINXbase + 0x00);
+		ixj_PCcontrol_wait(p->board);
+	}
 	MOD_INC_USE_COUNT;
 
 	if (ixjdebug > 0)
-//    printk(KERN_INFO "Opening board %d\n", NUM(inode->i_rdev));
 		printk(KERN_INFO "Opening board %d\n", p->board);
 
+	j->framesread = j->frameswritten = 0;
 	return 0;
 }
 
 int ixj_release(struct inode *inode, struct file *file_p)
 {
 	IXJ_TONE ti;
-	int board = NUM(inode->i_rdev);
-	IXJ *j = &ixj[board];
+//	int board = NUM(inode->i_rdev);
+	IXJ *j = file_p->private_data;
+	int board = j->p.board;
+//	IXJ *j = &ixj[board];
 
 	if (ixjdebug > 0)
 		printk(KERN_INFO "Closing board %d\n", NUM(inode->i_rdev));
 
 	daa_set_mode(board, SOP_PU_SLEEP);
-	ixj_set_port(board, PORT_POTS);
+	if (j->cardtype == 600)
+		ixj_set_port(board, PORT_SPEAKER);
+	else
+		ixj_set_port(board, PORT_POTS);
 	aec_stop(board);
 	ixj_play_stop(board);
 	ixj_record_stop(board);
+	set_play_volume(board, 0x100);
+	set_rec_volume(board, 0x100);
+	ixj_ring_off(board);
 
+	// Restore the tone table to default settings.
 	ti.tone_index = 10;
 	ti.gain0 = 1;
 	ti.freq0 = hz941;
@@ -1176,6 +1579,10 @@
 
 	idle(board);
 
+//        if(j->cardtype == 600) { // && j->flags.pcmciasct == 1 && j->readers == 1 && j->writers == 1) {
+	SLIC_SetState(PLD_SLIC_STATE_OC, board);
+//      }
+
 	if (file_p->f_mode & FMODE_READ)
 		j->readers--;
 	if (file_p->f_mode & FMODE_WRITE)
@@ -1193,8 +1600,16 @@
 	}
 	j->rec_codec = j->play_codec = 0;
 	j->rec_frame_size = j->play_frame_size = 0;
+	j->flags.cidsent = j->flags.cidring = 0;
 	ixj_fasync(-1, file_p, 0);	// remove from list of async notification
 
+	if(j->cardtype == 300 && !j->readers && !j->writers) {
+		ixj_set_port(board, PORT_PSTN);
+		ixj_set_pots(board, 1);
+	}
+	ixj_WriteDSPCommand(0x0FE3, board);	// Put the DSP in 1/5 power mode.
+
+	file_p->private_data = NULL;
 	MOD_DEC_USE_COUNT;
 	return 0;
 }
@@ -1202,6 +1617,7 @@
 static int read_filters(int board)
 {
 	unsigned short fc, cnt;
+	int var;
 	IXJ *j = &ixj[board];
 
 	if (ixj_WriteDSPCommand(0x5144, board))
@@ -1213,6 +1629,11 @@
 
 	j->frame_count = fc;
 
+	if (j->dtmf_proc)
+		return 1;
+
+	var = 10;
+
 	for (cnt = 0; cnt < 4; cnt++) {
 		if (ixj_WriteDSPCommand(0x5154 + cnt, board))
 			return -1;
@@ -1221,8 +1642,108 @@
 			return -1;
 
 		j->filter_hist[cnt] = j->ssr.high << 8 | j->ssr.low;
-		if ((j->filter_hist[cnt] & 1 && !(j->filter_hist[cnt] & 2)) ||
-		(j->filter_hist[cnt] & 2 && !(j->filter_hist[cnt] & 1))) {
+
+		if (j->cadence_f[cnt].enable) {
+			if (j->filter_hist[cnt] & 3 && !(j->filter_hist[cnt] & 12)) {
+				if (j->cadence_f[cnt].state == 0) {
+					j->cadence_f[cnt].state = 1;
+					j->cadence_f[cnt].on1min = jiffies + (j->cadence_f[cnt].on1 * hertz * (100 - var) / 10000);
+					j->cadence_f[cnt].on1dot = jiffies + (j->cadence_f[cnt].on1 * hertz * (100) / 10000);
+					j->cadence_f[cnt].on1max = jiffies + (j->cadence_f[cnt].on1 * hertz * (100 + var) / 10000);
+				} else if (j->cadence_f[cnt].state == 2 &&
+					   (time_after(jiffies, j->cadence_f[cnt].off1min) &&
+					    time_before(jiffies, j->cadence_f[cnt].off1max))) {
+					if (j->cadence_f[cnt].on2) {
+						j->cadence_f[cnt].state = 3;
+						j->cadence_f[cnt].on2min = jiffies + (j->cadence_f[cnt].on2 * hertz * (100 - var) / 10000);
+						j->cadence_f[cnt].on2dot = jiffies + (j->cadence_f[cnt].on2 * hertz * (100) / 10000);
+						j->cadence_f[cnt].on2max = jiffies + (j->cadence_f[cnt].on2 * hertz * (100 + var) / 10000);
+					} else {
+						j->cadence_f[cnt].state = 6;
+					}
+				} else if (j->cadence_f[cnt].state == 4 &&
+					   (time_after(jiffies, j->cadence_f[cnt].off2min) &&
+					    time_before(jiffies, j->cadence_f[cnt].off2max))) {
+					if (j->cadence_f[cnt].on2) {
+						j->cadence_f[cnt].state = 5;
+						j->cadence_f[cnt].on3min = jiffies + (j->cadence_f[cnt].on3 * hertz * (100 - var) / 10000);
+						j->cadence_f[cnt].on3dot = jiffies + (j->cadence_f[cnt].on3 * hertz * (100) / 10000);
+						j->cadence_f[cnt].on3max = jiffies + (j->cadence_f[cnt].on3 * hertz * (100 + var) / 10000);
+					} else {
+						j->cadence_f[cnt].state = 6;
+					}
+				} else {
+					j->cadence_f[cnt].state = 0;
+				}
+			} else if (j->filter_hist[cnt] & 12 && !(j->filter_hist[cnt] & 3)) {
+				if (j->cadence_f[cnt].state == 1 &&
+				    (time_after(jiffies, j->cadence_f[cnt].on1min) &&
+				     time_before(jiffies, j->cadence_f[cnt].on1max))) {
+					j->cadence_f[cnt].state = 2;
+					j->cadence_f[cnt].off1min = jiffies + (j->cadence_f[cnt].off1 * hertz * (100 - var) / 10000);
+					j->cadence_f[cnt].off1max = jiffies + (j->cadence_f[cnt].off1 * hertz * (100 + var) / 10000);
+				} else if (j->cadence_f[cnt].state == 3 &&
+					   (time_after(jiffies, j->cadence_f[cnt].on2min) &&
+					    time_before(jiffies, j->cadence_f[cnt].on2max))) {
+					j->cadence_f[cnt].state = 4;
+					j->cadence_f[cnt].off2min = jiffies + (j->cadence_f[cnt].off2 * hertz * (100 - var) / 10000);
+					j->cadence_f[cnt].off2max = jiffies + (j->cadence_f[cnt].off2 * hertz * (100 + var) / 10000);
+				} else if (j->cadence_f[cnt].state == 5 &&
+					   (time_after(jiffies, j->cadence_f[cnt].on3min) &&
+					    time_before(jiffies, j->cadence_f[cnt].on3max))) {
+					j->cadence_f[cnt].state = 6;
+					j->cadence_f[cnt].off3min = jiffies + (j->cadence_f[cnt].off3 * hertz * (100 - var) / 10000);
+					j->cadence_f[cnt].off3max = jiffies + (j->cadence_f[cnt].off3 * hertz * (100 + var) / 10000);
+				} else {
+					j->cadence_f[cnt].state = 0;
+				}
+			} else {
+				switch(j->cadence_f[cnt].state) {
+					case 1:
+						if(time_after(jiffies, j->cadence_f[cnt].on1dot) &&
+						   !j->cadence_f[cnt].off1 &&
+						   !j->cadence_f[cnt].on2 && !j->cadence_f[cnt].off2 &&
+						   !j->cadence_f[cnt].on3 && !j->cadence_f[cnt].off3) {
+							j->cadence_f[cnt].state = 6;
+						}
+						break;
+					case 3:
+						if(time_after(jiffies, j->cadence_f[cnt].on2dot) &&
+						   !j->cadence_f[cnt].off2 &&
+						   !j->cadence_f[cnt].on3 && !j->cadence_f[cnt].off3) {
+							j->cadence_f[cnt].state = 6;
+						}
+						break;
+					case 5:
+						if(time_after(jiffies, j->cadence_f[cnt].on3dot) &&
+						   !j->cadence_f[cnt].off3) {
+							j->cadence_f[cnt].state = 6;
+						}
+						break;
+				}
+			}
+		}
+		if (j->cadence_f[cnt].state == 6) {
+			j->cadence_f[cnt].state = 0;
+			if (j->cadence_f[cnt].enable == 1)
+				j->cadence_f[cnt].enable = 0;
+			switch (cnt) {
+			case 0:
+				j->ex.bits.fc0 = 1;
+				break;
+			case 1:
+				j->ex.bits.fc1 = 1;
+				break;
+			case 2:
+				j->ex.bits.fc2 = 1;
+				break;
+			case 3:
+				j->ex.bits.fc3 = 1;
+				break;
+			}
+		}
+		if (j->filter_en[cnt] && ((j->filter_hist[cnt] & 3 && !(j->filter_hist[cnt] & 12)) ||
+					  (j->filter_hist[cnt] & 12 && !(j->filter_hist[cnt] & 3)))) {
 			switch (cnt) {
 			case 0:
 				j->ex.bits.f0 = 1;
@@ -1263,11 +1784,16 @@
 	}
 	if (j->dtmf_state && !j->dtmf.bits.dtmf_valid)	// && j->dtmf_wp != j->dtmf_rp)
 	 {
-		j->dtmfbuffer[j->dtmf_wp] = j->dtmf_current;
-		j->dtmf_wp++;
-		if (j->dtmf_wp == 79)
-			j->dtmf_wp = 0;
-		j->ex.bits.dtmf_ready = 1;
+		if(!j->flags.cidplay) {
+			j->dtmfbuffer[j->dtmf_wp] = j->dtmf_current;
+			j->dtmf_wp++;
+			if (j->dtmf_wp == 79)
+				j->dtmf_wp = 0;
+			j->ex.bits.dtmf_ready = 1;
+		}
+		else if(j->dtmf_current == 25 || j->dtmf_current == 31) {
+			j->flags.cidcw_ack = 1;
+		}
 		j->dtmf_state = 0;
 	}
 	j->dtmf_proc = 0;
@@ -1282,26 +1808,38 @@
 	struct wait_queue wait =
 	{current, NULL};
 
+	if (j->flags.inread)
+		return -EALREADY;
+
+	j->flags.inread = 1;
+
 	add_wait_queue(&j->read_q, &wait);
 	current->state = TASK_INTERRUPTIBLE;
 	mb();
 
 	while (!j->read_buffer_ready || (j->dtmf_state && j->flags.dtmf_oob)) {
 		++j->read_wait;
+		if(j->tone_state) {
+			j->flags.inread = 0;
+			return -EAGAIN;
+		}
 		if (file_p->f_flags & O_NONBLOCK) {
 			current->state = TASK_RUNNING;
 			remove_wait_queue(&j->read_q, &wait);
+			j->flags.inread = 0;
 			return -EAGAIN;
 		}
 		if (!ixj_hookstate(NUM(file_p->f_dentry->d_inode->i_rdev))) {
 			current->state = TASK_RUNNING;
 			remove_wait_queue(&j->read_q, &wait);
+			j->flags.inread = 0;
 			return 0;
 		}
 		interruptible_sleep_on(&j->read_q);
 		if (signal_pending(current)) {
 			current->state = TASK_RUNNING;
 			remove_wait_queue(&j->read_q, &wait);
+			j->flags.inread = 0;
 			return -EINTR;
 		}
 	}
@@ -1311,10 +1849,13 @@
 	/* Don't ever copy more than the user asks */
 	i = copy_to_user(buf, j->read_buffer, min(length, j->read_buffer_size));
 	j->read_buffer_ready = 0;
-	if (i)
+	if (i) {
+		j->flags.inread = 0;
 		return -EFAULT;
-	else
+	} else {
+		j->flags.inread = 0;
 		return min(length, j->read_buffer_size);
+	}
 }
 
 ssize_t ixj_enhanced_read(struct file * file_p, char *buf, size_t length,
@@ -1342,51 +1883,63 @@
 	return read_retval;
 }
 
-ssize_t ixj_write(struct file * file_p, const char *buf, size_t count, loff_t * ppos)
+ssize_t ixj_write(struct file *file_p, const char *buf, size_t count, loff_t * ppos)
 {
 	unsigned long i = *ppos;
-	int board = NUM(file_p->f_dentry->d_inode->i_rdev);
-	IXJ *j = &ixj[board];
+	IXJ *j = file_p->private_data;
 	struct wait_queue wait =
 	{current, NULL};
 
-	add_wait_queue(&j->read_q, &wait);
+	if (j->flags.inwrite)
+		return -EALREADY;
+
+	j->flags.inwrite = 1;
+
+	add_wait_queue(&j->write_q, &wait);
 	current->state = TASK_INTERRUPTIBLE;
 	mb();
 
 
 	while (!j->write_buffers_empty) {
 		++j->write_wait;
+		if(j->tone_state) {
+			j->flags.inwrite = 0;
+			return -EAGAIN;
+		}
 		if (file_p->f_flags & O_NONBLOCK) {
 			current->state = TASK_RUNNING;
-			remove_wait_queue(&j->read_q, &wait);
+			remove_wait_queue(&j->write_q, &wait);
+			j->flags.inwrite = 0;
 			return -EAGAIN;
 		}
 		if (!ixj_hookstate(NUM(file_p->f_dentry->d_inode->i_rdev))) {
 			current->state = TASK_RUNNING;
-			remove_wait_queue(&j->read_q, &wait);
+			remove_wait_queue(&j->write_q, &wait);
+			j->flags.inwrite = 0;
 			return 0;
 		}
 		interruptible_sleep_on(&j->write_q);
 		if (signal_pending(current)) {
 			current->state = TASK_RUNNING;
-			remove_wait_queue(&j->read_q, &wait);
+			remove_wait_queue(&j->write_q, &wait);
+			j->flags.inwrite = 0;
 			return -EINTR;
 		}
 	}
 	current->state = TASK_RUNNING;
-	remove_wait_queue(&j->read_q, &wait);
+	remove_wait_queue(&j->write_q, &wait);
 	if (j->write_buffer_wp + count >= j->write_buffer_end)
 		j->write_buffer_wp = j->write_buffer;
 	i = copy_from_user(j->write_buffer_wp, buf, min(count, j->write_buffer_size));
-	if (i)
+	if (i) {
+		j->flags.inwrite = 0;
 		return -EFAULT;
-
+	}
+	j->flags.inwrite = 0;
 	return min(count, j->write_buffer_size);
 }
 
-ssize_t ixj_enhanced_write(struct file * file_p, const char *buf, size_t count,
-			   loff_t * ppos)
+ssize_t ixj_enhanced_write(struct file * file_p, const char *buf, size_t count, loff_t * ppos)
 {
 	int pre_retval;
 	ssize_t write_retval = 0;
@@ -1443,9 +1996,7 @@
 			*(j->read_buffer + cnt) = inb_p(j->DSPbase + 0x0E);
 			*(j->read_buffer + cnt + 1) = inb_p(j->DSPbase + 0x0F);
 		}
-#ifdef PERFMON_STATS
 		++j->framesread;
-#endif
 		if (j->intercom != -1) {
 			if (IsTxReady(j->intercom)) {
 				for (cnt = 0; cnt < j->rec_frame_size * 2; cnt += 2) {
@@ -1462,21 +2013,478 @@
 					outb_p(*(j->read_buffer + cnt), ixj[j->intercom].DSPbase + 0x0C);
 					outb_p(*(j->read_buffer + cnt + 1), ixj[j->intercom].DSPbase + 0x0D);
 				}
-#ifdef PERFMON_STATS
 				++ixj[j->intercom].frameswritten;
-#endif
 			}
 		} else {
 			j->read_buffer_ready = 1;
 			wake_up_interruptible(&j->read_q);	// Wake any blocked readers
 
-			wake_up_interruptible(&j->poll_q);	// Wake any blocked selects
+			wake_up_interruptible(&j->poll_q);	// Wake any blocked selects
+
+			ixj_kill_fasync(board);
+		}
+	}
+}
+
+static short fsk[][6][20] =
+{
+	{
+		{
+			0, 17846, 29934, 32364, 24351, 8481, -10126, -25465, -32587, -29196,
+			-16384, 1715, 19260, 30591, 32051, 23170, 6813, -11743, -26509, -32722
+		},
+		{
+			-28377, -14876, 3425, 20621, 31163, 31650, 21925, 5126, -13328, -27481,
+			-32767, -27481, -13328, 5126, 21925, 31650, 31163, 20621, 3425, -14876
+		},
+		{
+			-28377, -32722, -26509, -11743, 6813, 23170, 32051, 30591, 19260, 1715,
+			-16384, -29196, -32587, -25465, -10126, 8481, 24351, 32364, 29934, 17846
+		},
+		{
+			0, -17846, -29934, -32364, -24351, -8481, 10126, 25465, 32587, 29196,
+			16384, -1715, -19260, -30591, -32051, -23170, -6813, 11743, 26509, 32722
+		},
+		{
+			28377, 14876, -3425, -20621, -31163, -31650, -21925, -5126, 13328, 27481,
+			32767, 27481, 13328, -5126, -21925, -31650, -31163, -20621, -3425, 14876
+		},
+		{
+			28377, 32722, 26509, 11743, -6813, -23170, -32051, -30591, -19260, -1715,
+			16384, 29196, 32587, 25465, 10126, -8481, -24351, -32364, -29934, -17846
+		}
+	},
+	{
+		{
+			0, 10126, 19260, 26509, 31163, 32767, 31163, 26509, 19260, 10126,
+			0, -10126, -19260, -26509, -31163, -32767, -31163, -26509, -19260, -10126
+		},
+		{
+			-28377, -21925, -13328, -3425, 6813, 16384, 24351, 29934, 32587, 32051,
+			28377, 21925, 13328, 3425, -6813, -16384, -24351, -29934, -32587, -32051
+		},
+		{
+			-28377, -32051, -32587, -29934, -24351, -16384, -6813, 3425, 13328, 21925,
+			28377, 32051, 32587, 29934, 24351, 16384, 6813, -3425, -13328, -21925
+		},
+		{
+			0, -10126, -19260, -26509, -31163, -32767, -31163, -26509, -19260, -10126,
+			0, 10126, 19260, 26509, 31163, 32767, 31163, 26509, 19260, 10126
+		},
+		{
+			28377, 21925, 13328, 3425, -6813, -16383, -24351, -29934, -32587, -32051,
+			-28377, -21925, -13328, -3425, 6813, 16383, 24351, 29934, 32587, 32051
+		},
+		{
+			28377, 32051, 32587, 29934, 24351, 16384, 6813, -3425, -13328, -21925,
+			-28377, -32051, -32587, -29934, -24351, -16384, -6813, 3425, 13328, 21925
+		}
+	}
+};
+
+
+static void ixj_write_cid_bit(int board, int bit)
+{
+	int dly;
+	IXJ_WORD dat;
+	IXJ *j = &ixj[board];
+
+	while (j->fskcnt < 20) {
+		if (!IsTxReady(board)) {
+			dly = 0;
+			while (!IsTxReady(board)) {
+				if (dly++ > 5) {
+					dly = 0;
+					//      break;
+					//      printk("CID delay\n");
+				}
+				udelay(10);
+			}
+		}
+		dat.word = j->fskdata[j->fskdcnt++] =
+		    fsk[bit][j->fskz][j->fskcnt];
+		outb_p(dat.bytes.low, j->DSPbase + 0x0C);
+		outb_p(dat.bytes.high, j->DSPbase + 0x0D);
+		j->fskcnt += 3;
+	}
+	j->fskcnt %= 20;
+
+	if (!bit)
+		j->fskz++;
+	if (j->fskz >= 6)
+		j->fskz = 0;
+
+}
+
+static void ixj_write_cid_byte(int board, char byte)
+{
+	IXJ_CBYTE cb;
+
+//  printk("Writing CID data %x - %c\n", byte, byte);
+	cb.cbyte = byte;
+	ixj_write_cid_bit(board, 0);
+	ixj_write_cid_bit(board, cb.cbits.b0 ? 1 : 0);
+	ixj_write_cid_bit(board, cb.cbits.b1 ? 1 : 0);
+	ixj_write_cid_bit(board, cb.cbits.b2 ? 1 : 0);
+	ixj_write_cid_bit(board, cb.cbits.b3 ? 1 : 0);
+	ixj_write_cid_bit(board, cb.cbits.b4 ? 1 : 0);
+	ixj_write_cid_bit(board, cb.cbits.b5 ? 1 : 0);
+	ixj_write_cid_bit(board, cb.cbits.b6 ? 1 : 0);
+	ixj_write_cid_bit(board, cb.cbits.b7 ? 1 : 0);
+	ixj_write_cid_bit(board, 1);
+}
+
+static void ixj_write_cid_seize(int board)
+{
+	int cnt;
+
+	for (cnt = 0; cnt < 150; cnt++) {
+		ixj_write_cid_bit(board, 0);
+		ixj_write_cid_bit(board, 1);
+	}
+	for (cnt = 0; cnt < 180; cnt++) {
+		ixj_write_cid_bit(board, 1);
+	}
+}
+
+static void ixj_write_cidcw_seize(int board)
+{
+	int cnt;
+
+	for (cnt = 0; cnt < 80; cnt++) {
+		ixj_write_cid_bit(board, 1);
+	}
+}
+
+static int ixj_write_cid_string(int board, char *s, int checksum)
+{
+	int cnt;
+
+	for (cnt = 0; cnt < strlen(s); cnt++) {
+		ixj_write_cid_byte(board, s[cnt]);
+		checksum = (checksum + s[cnt]);
+	}
+	return checksum;
+}
+
+static void ixj_pad_fsk(int board, int pad)
+{
+	int cnt, dly;
+	IXJ *j = &ixj[board];
+
+	for (cnt = 0; cnt < pad; cnt++) {
+		if (!IsTxReady(board)) {
+			dly = 0;
+			while (!IsTxReady(board)) {
+				if (dly++ > 5) {
+					dly = 0;
+				}
+				udelay(10);
+			}
+		}
+		outb_p(0x00, j->DSPbase + 0x0C);
+		outb_p(0x00, j->DSPbase + 0x0D);
+	}
+	for (cnt = 0; cnt < 720; cnt++) {
+		if (!IsTxReady(board)) {
+			dly = 0;
+			while (!IsTxReady(board)) {
+				if (dly++ > 5) {
+					dly = 0;
+				}
+				udelay(10);
+			}
+		}
+		outb_p(0x00, j->DSPbase + 0x0C);
+		outb_p(0x00, j->DSPbase + 0x0D);
+	}
+}
+
+static void ixj_write_cid(int board)
+{
+	IXJ *j = &ixj[board];
+
+	char sdmf1[50];
+	char sdmf2[50];
+	char sdmf3[80];
+	char mdmflen, len1, len2, len3;
+	int pad;
+
+	int checksum = 0;
+
+	if (ixj[board].dsp.low == 0x20)
+		return;
+
+	ixj[board].fskz = ixj[board].fskphase = ixj[board].fskcnt =
+	    ixj[board].fskdcnt = 0;
+
+	ixj[board].flags.cidplay = 1;
+
+	strcpy(sdmf1, j->cid_send.month);
+	strcat(sdmf1, j->cid_send.day);
+	strcat(sdmf1, j->cid_send.hour);
+	strcat(sdmf1, j->cid_send.min);
+	strcpy(sdmf2, j->cid_send.number);
+	strcpy(sdmf3, j->cid_send.name);
+
+	len1 = strlen(sdmf1);
+	len2 = strlen(sdmf2);
+	len3 = strlen(sdmf3);
+	mdmflen = len1 + len2 + len3 + 6;
+
+	printk("CID Lengths = %d %d %d %d\n", len1, len2, len3, mdmflen);
+
+	set_base_frame(board, 30);
+	set_play_codec(board, LINEAR16);
+
+	if (ixj[board].port == PORT_POTS)
+		if(!j->r_hook)
+			SLIC_SetState(PLD_SLIC_STATE_OHT, board);
+
+	set_play_volume(board, 0x1B);
+	ixj_play_start(board);
+	ixj_write_cid_seize(board);
+
+	ixj_write_cid_byte(board, 0x80);
+	checksum = 0x80;
+	ixj_write_cid_byte(board, mdmflen);
+	checksum = checksum + mdmflen;
+
+	ixj_write_cid_byte(board, 0x01);
+	checksum = checksum + 0x01;
+	ixj_write_cid_byte(board, len1);
+	checksum = checksum + len1;
+	checksum = ixj_write_cid_string(board, sdmf1, checksum);
+
+	ixj_write_cid_byte(board, 0x02);
+	checksum = checksum + 0x02;
+	ixj_write_cid_byte(board, len2);
+	checksum = checksum + len2;
+	checksum = ixj_write_cid_string(board, sdmf2, checksum);
+
+	ixj_write_cid_byte(board, 0x07);
+	checksum = checksum + 0x07;
+	ixj_write_cid_byte(board, len3);
+	checksum = checksum + len3;
+	checksum = ixj_write_cid_string(board, sdmf3, checksum);
+
+	checksum %= 256;
+	checksum ^= 0xFF;
+	checksum += 1;
+	printk("14Checksum = %d\n", checksum);
+
+	ixj_write_cid_byte(board, (char) checksum);
+
+	pad = j->fskdcnt % 240;
+	if (pad) {
+		pad = 240 - pad;
+	}
+	ixj_pad_fsk(board, pad);
+	SLIC_SetState(PLD_SLIC_STATE_STANDBY, board);
+	ixj[board].flags.cidplay = 0;
+	ixj_play_stop(board);
+}
+
+static void ixj_write_cidcw(int board)
+{
+	IXJ_TONE ti;
+
+	IXJ *j = &ixj[board];
+
+	char sdmf1[50];
+	char sdmf2[50];
+	char sdmf3[80];
+	char mdmflen, len1, len2, len3;
+	int pad;
+
+	int checksum = 0;
+
+	if (ixj[board].dsp.low == 0x20)
+		return;
+
+	ixj[board].fskz = ixj[board].fskphase = ixj[board].fskcnt = ixj[board].fskdcnt = 0;
+
+	ixj[board].flags.cidplay = 1;
+
+	ti.tone_index = 23;
+	ti.gain0 = 1;
+	ti.freq0 = hz440;
+	ti.gain1 = 0;
+	ti.freq1 = 0;
+	ixj_init_tone(board, &ti);
+
+	ti.tone_index = 24;
+	ti.gain0 = 1;
+	ti.freq0 = hz2130;
+	ti.gain1 = 0;
+	ti.freq1 = hz2750;
+	ixj_init_tone(board, &ti);
+
+	ixj_set_tone_on(1200, board);
+	ixj_play_tone(board, 23);
+
+	while(j->tone_state) {
+		current->state = TASK_INTERRUPTIBLE;
+		schedule_timeout(1);
+	}
+
+	ixj_set_tone_on(320, board);
+	ixj_play_tone(board, 24);
+
+	while(j->tone_state) {
+		current->state = TASK_INTERRUPTIBLE;
+		schedule_timeout(1);
+	}
+
+	j->cidcw_wait = jiffies + (200 * hertz / 100000);
+
+	while(!j->flags.cidcw_ack && time_before(jiffies, j->cidcw_wait)) {
+		current->state = TASK_INTERRUPTIBLE;
+		schedule_timeout(1);
+	}
+
+	if(!j->flags.cidcw_ack) {
+		return;
+	}
+
+	strcpy(sdmf1, j->cid_send.month);
+	strcat(sdmf1, j->cid_send.day);
+	strcat(sdmf1, j->cid_send.hour);
+	strcat(sdmf1, j->cid_send.min);
+	strcpy(sdmf2, j->cid_send.number);
+	strcpy(sdmf3, j->cid_send.name);
+
+	len1 = strlen(sdmf1);
+	len2 = strlen(sdmf2);
+	len3 = strlen(sdmf3);
+	mdmflen = len1 + len2 + len3 + 6;
+
+	printk("CID Lengths = %d %d %d %d\n", len1, len2, len3, mdmflen);
+
+	j->cid_play_codec = j->play_codec;
+	ixj_play_stop(board);
+
+	switch(j->baseframe.low) {
+		case 0xA0:
+			j->cid_base_frame_size = 20;
+			break;
+		case 0x50:
+			j->cid_base_frame_size = 10;
+			break;
+		default:
+			j->cid_base_frame_size = 30;
+			break;
+	}
+	set_base_frame(board, 30);
+	set_play_codec(board, LINEAR16);
+
+	set_play_volume(board, 0x1B);
+	ixj_play_start(board);
+	ixj_write_cidcw_seize(board);
+
+	ixj_write_cid_byte(board, 0x80);
+	checksum = 0x80;
+	ixj_write_cid_byte(board, mdmflen);
+	checksum = checksum + mdmflen;
+
+	ixj_write_cid_byte(board, 0x01);
+	checksum = checksum + 0x01;
+	ixj_write_cid_byte(board, len1);
+	checksum = checksum + len1;
+	checksum = ixj_write_cid_string(board, sdmf1, checksum);
+
+	ixj_write_cid_byte(board, 0x02);
+	checksum = checksum + 0x02;
+	ixj_write_cid_byte(board, len2);
+	checksum = checksum + len2;
+	checksum = ixj_write_cid_string(board, sdmf2, checksum);
+
+	ixj_write_cid_byte(board, 0x07);
+	checksum = checksum + 0x07;
+	ixj_write_cid_byte(board, len3);
+	checksum = checksum + len3;
+	checksum = ixj_write_cid_string(board, sdmf3, checksum);
+
+	checksum %= 256;
+	checksum ^= 0xFF;
+	checksum += 1;
+	printk("14Checksum = %d\n", checksum);
+
+	ixj_write_cid_byte(board, (char) checksum);
+
+	pad = j->fskdcnt % 240;
+	if (pad) {
+		pad = 240 - pad;
+	}
+	ixj_pad_fsk(board, pad);
+	ixj[board].flags.cidplay = 0;
+	ixj_play_stop(board);
+
+	set_base_frame(board, j->cid_base_frame_size);
+	set_play_codec(board, j->cid_play_codec);
+}
+
+static void ixj_write_vmwi(int board, int msg)
+{
+	IXJ *j = &ixj[board];
 
-			if (j->async_queue)
-				kill_fasync(j->async_queue, SIGIO);	// Send apps notice of frame
+	char mdmflen;
+	int pad;
 
-		}
+	int checksum = 0;
+
+	if (ixj[board].dsp.low == 0x20)
+		return;
+
+	ixj[board].fskz = ixj[board].fskphase = ixj[board].fskcnt = ixj[board].fskdcnt = 0;
+
+	ixj[board].flags.cidplay = 1;
+
+	mdmflen = 3;
+
+	set_base_frame(board, 30);
+	set_play_codec(board, LINEAR16);
+
+	if (ixj[board].port == PORT_POTS)
+		SLIC_SetState(PLD_SLIC_STATE_OHT, board);
+
+	set_play_volume(board, 0x1B);
+	ixj_play_start(board);
+	ixj_write_cid_seize(board);
+
+	ixj_write_cid_byte(board, 0x82);
+	checksum = 0x82;
+	ixj_write_cid_byte(board, mdmflen);
+	checksum = checksum + mdmflen;
+
+	ixj_write_cid_byte(board, 0x0B);
+	checksum = checksum + 0x0B;
+	ixj_write_cid_byte(board, 1);
+	checksum = checksum + 1;
+
+	if(msg) {
+		ixj_write_cid_byte(board, 0xFF);
+		checksum = checksum + 0xFF;
 	}
+	else {
+		ixj_write_cid_byte(board, 0x00);
+		checksum = checksum + 0x00;
+	}
+
+	checksum %= 256;
+	checksum ^= 0xFF;
+	checksum += 1;
+
+	ixj_write_cid_byte(board, (char) checksum);
+
+	pad = j->fskdcnt % 240;
+	if (pad) {
+		pad = 240 - pad;
+	}
+	ixj_pad_fsk(board, pad);
+	SLIC_SetState(PLD_SLIC_STATE_STANDBY, board);
+	ixj[board].flags.cidplay = 0;
+	ixj_play_stop(board);
 }
 
 static void ixj_write_frame(int board)
@@ -1554,15 +2562,12 @@
 				j->write_buffer_rp = j->write_buffer;
 			}
 			j->write_buffers_empty++;
-			wake_up_interruptible(&(j->write_q));	// Wake any blocked writers
+			wake_up_interruptible(&j->write_q);	// Wake any blocked writers
 
 			wake_up_interruptible(&j->poll_q);	// Wake any blocked selects
 
-			if (j->async_queue)
-				kill_fasync(j->async_queue, SIGIO);	// Send apps notice of empty buffer
-#ifdef PERFMON_STATS
+			ixj_kill_fasync(board);
 			++j->frameswritten;
-#endif
 		}
 	} else {
 		j->drybuffer++;
@@ -1795,6 +2800,12 @@
 	unsigned short cmd = 0x0000;
 	IXJ *j = &ixj[board];
 
+	if (j->read_buffer) {
+		ixj_record_stop(board);
+	}
+	j->flags.recording = 1;
+	ixj_WriteDSPCommand(0x0FE0, board);	// Put the DSP in full power mode.
+
 	if (!j->rec_mode) {
 		switch (j->rec_codec) {
 		case G723_63:
@@ -1893,10 +2904,26 @@
 {
 	IXJ *j = &ixj[board];
 
+	if (j->read_buffer) {
+		kfree(j->read_buffer);
+		j->read_buffer = NULL;
+		j->read_buffer_size = 0;
+	}
 	if (j->rec_mode > -1) {
 		ixj_WriteDSPCommand(0x5120, board);
 		j->rec_mode = -1;
 	}
+	j->flags.recording = 0;
+	if (!j->flags.playing)
+		ixj_WriteDSPCommand(0x0FE3, board);	// Put the DSP in 1/5 power mode.
+
+}
+static void ixj_vad(int board, int arg)
+{
+	if (arg)
+		ixj_WriteDSPCommand(0x513F, board);
+	else
+		ixj_WriteDSPCommand(0x513E, board);
 }
 
 static void set_rec_depth(int board, int depth)
@@ -1914,13 +2941,23 @@
 	ixj_WriteDSPCommand(volume, board);
 }
 
+static int get_rec_volume(int board)
+{
+	ixj_WriteDSPCommand(0xCF03, board);
+	return ixj[board].ssr.high << 8 | ixj[board].ssr.low;
+}
+
 static int get_rec_level(int board)
 {
+	int retval;
+
 	IXJ *j = &ixj[board];
 
 	ixj_WriteDSPCommand(0xCF88, board);
 
-	return j->ssr.high << 8 | j->ssr.low;
+	retval = j->ssr.high << 8 | j->ssr.low;
+	retval = (retval * 256) / 240;
+	return retval;
 }
 
 static void ixj_aec_start(int board, int level)
@@ -1929,7 +2966,7 @@
 
 	j->aec_level = level;
 	if (!level) {
-		ixj_WriteDSPCommand(0xB002, board);
+		aec_stop(board);
 	} else {
 		if (j->rec_codec == G729 || j->play_codec == G729) {
 			ixj_WriteDSPCommand(0xE022, board);	// Move AEC filter buffer
@@ -1941,26 +2978,41 @@
 		ixj_WriteDSPCommand(0xE013, board);	// Advanced AEC C1
 
 		switch (level) {
-		case 1:
+		case AEC_LOW:
 			ixj_WriteDSPCommand(0x0000, board);	// Advanced AEC C2 = off
 
 			ixj_WriteDSPCommand(0xE011, board);
 			ixj_WriteDSPCommand(0xFFFF, board);
 			break;
 
-		case 2:
+		case AEC_MED:
 			ixj_WriteDSPCommand(0x0600, board);	// Advanced AEC C2 = on medium
 
 			ixj_WriteDSPCommand(0xE011, board);
 			ixj_WriteDSPCommand(0x0080, board);
 			break;
 
-		case 3:
+		case AEC_HIGH:
 			ixj_WriteDSPCommand(0x0C00, board);	// Advanced AEC C2 = on high
 
 			ixj_WriteDSPCommand(0xE011, board);
 			ixj_WriteDSPCommand(0x0080, board);
 			break;
+
+		case AEC_AUTO:
+			ixj_WriteDSPCommand(0x0002, board);	// Attenuation scaling factor of 2
+
+			ixj_WriteDSPCommand(0xE011, board);
+			ixj_WriteDSPCommand(0x0100, board);	// Higher Threshold Floor
+
+			ixj_WriteDSPCommand(0xE012, board);	// Set Train and Lock
+
+			ixj_WriteDSPCommand(0x0023, board);
+
+			ixj_WriteDSPCommand(0xE014, board);
+			ixj_WriteDSPCommand(0x0003, board);	// Lock threashold at 3dB
+
+			break;
 		}
 	}
 }
@@ -1974,7 +3026,7 @@
 
 		ixj_WriteDSPCommand(0x0700, board);
 	}
-	if (ixj[board].play_mode != -1 && ixj[board].rec_mode != -1)
+	if (ixj[board].play_mode != -1 && ixj[board].rec_mode != -1);
 	{
 		ixj_WriteDSPCommand(0xB002, board);	// AEC Stop
 
@@ -2148,6 +3200,12 @@
 	unsigned short cmd = 0x0000;
 	IXJ *j = &ixj[board];
 
+	if (j->write_buffer) {
+		ixj_play_stop(board);
+	}
+	j->flags.playing = 1;
+	ixj_WriteDSPCommand(0x0FE0, board);	// Put the DSP in full power mode.
+
 	j->flags.play_first_frame = 1;
 	j->drybuffer = 0;
 
@@ -2183,12 +3241,10 @@
 		if (ixj_WriteDSPCommand(cmd, board))
 			return -1;
 	}
+	j->write_buffer = kmalloc(j->play_frame_size * 2, GFP_ATOMIC);
 	if (!j->write_buffer) {
-		j->write_buffer = kmalloc(j->play_frame_size * 2, GFP_ATOMIC);
-		if (!j->write_buffer) {
-			printk("Write buffer allocation for ixj board %d failed!\n", board);
-			return -ENOMEM;
-		}
+		printk("Write buffer allocation for ixj board %d failed!\n", board);
+		return -ENOMEM;
 	}
 	j->write_buffers_empty = 2;
 	j->write_buffer_size = j->play_frame_size * 2;
@@ -2250,11 +3306,20 @@
 {
 	IXJ *j = &ixj[board];
 
+	if (j->write_buffer) {
+		kfree(j->write_buffer);
+		j->write_buffer = NULL;
+		j->write_buffer_size = 0;
+	}
 	if (j->play_mode > -1) {
-		ixj_WriteDSPCommand(0x5221, board);	// Stop playback
+		ixj_WriteDSPCommand(0x5221, board);	// Stop playback and flush buffers.  8022 reference page 9-40
 
 		j->play_mode = -1;
 	}
+	j->flags.playing = 0;
+	if (!j->flags.recording)
+		ixj_WriteDSPCommand(0x0FE3, board);	// Put the DSP in 1/5 power mode.
+
 }
 
 extern __inline__ void set_play_depth(int board, int depth)
@@ -2266,16 +3331,15 @@
 	ixj_WriteDSPCommand(0x5280 + depth, board);
 }
 
-extern __inline__ void set_play_volume(int board, int volume)
-{
-	ixj_WriteDSPCommand(0xCF02, board);
-	ixj_WriteDSPCommand(volume, board);
-}
-
 extern __inline__ int get_play_level(int board)
 {
-	ixj_WriteDSPCommand(0xCF8F, board);
+	int retval;
+
+	ixj_WriteDSPCommand(0xCF8F, board); // 8022 Reference page 9-38
 	return ixj[board].ssr.high << 8 | ixj[board].ssr.low;
+	retval = ixj[board].ssr.high << 8 | ixj[board].ssr.low;
+	retval = (retval * 256) / 240;
+	return retval;
 }
 
 static unsigned int ixj_poll(struct file *file_p, poll_table * wait)
@@ -2484,6 +3548,8 @@
 		break;
 	}
 
+	j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg = reg;
+
 	switch (j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.bitreg.AGX) {
 	case 0:
 		j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.bitreg.AGR_Z = 0;
@@ -2653,7 +3719,7 @@
 		}
 		pIn += 5, pOut += 4;
 	}
-	memset(&j->cid, 0, sizeof(IXJ_CID));
+	memset(&j->cid, 0, sizeof(PHONE_CID));
 	pOut = j->m_DAAShadowRegs.CAO_REGS.CAO.CallerID;
 	pOut += 4;
 	strncpy(j->cid.month, pOut, 2);
@@ -2729,7 +3795,6 @@
 	//      ALIS-A part.
 	//
 
-
 	BYTES bytes;
 	IXJ *j = &ixj[board];
 
@@ -2738,6 +3803,19 @@
 
 	switch (mode) {
 	case SOP_PU_SLEEP:
+		if(j->daa_mode == SOP_PU_CONVERSATION)
+		{
+			j->pld_scrw.bits.daafsyncen = 0;	// Turn off DAA Frame Sync
+
+			outb_p(j->pld_scrw.byte, j->XILINXbase);
+			j->pld_slicw.bits.rly2 = 0;
+			outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
+			bytes.high = 0x10;
+			bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg;
+			daa_load(&bytes, board);
+			if (!SCI_Prepare(board))
+				return 0;
+		}
 		j->pld_scrw.bits.daafsyncen = 0;	// Turn off DAA Frame Sync
 
 		outb_p(j->pld_scrw.byte, j->XILINXbase);
@@ -2748,10 +3826,15 @@
 		daa_load(&bytes, board);
 		if (!SCI_Prepare(board))
 			return 0;
+
 		j->daa_mode = SOP_PU_SLEEP;
 		j->flags.pstn_ringing = 0;
-		j->pstn_sleeptil = jiffies + (hertz * 3);
-		break;
+		j->ex.bits.pstn_ring = 0;
+		j->pstn_sleeptil = jiffies + (hertz / 2);
+		wake_up_interruptible(&j->read_q);      // Wake any blocked readers
+		wake_up_interruptible(&j->write_q);     // Wake any blocked writers
+		wake_up_interruptible(&j->poll_q);      // Wake any blocked selects
+ 		break;
 	case SOP_PU_RINGING:
 		j->pld_scrw.bits.daafsyncen = 0;	// Turn off DAA Frame Sync
 
@@ -3289,14 +4372,11 @@
 int ixj_set_tone_off(unsigned short arg, int board)
 {
 	ixj[board].tone_off_time = arg;
-
 	if (ixj_WriteDSPCommand(0x6E05, board))		// Set Tone Off Period
 
 		return -1;
-
 	if (ixj_WriteDSPCommand(arg, board))
 		return -1;
-
 	return 0;
 }
 
@@ -3305,7 +4385,6 @@
 	if (ixj_WriteDSPCommand(0x6E06, board))		// Get Tone On Period
 
 		return -1;
-
 	return 0;
 }
 
@@ -3314,7 +4393,6 @@
 	if (ixj_WriteDSPCommand(0x6E07, board))		// Get Tone Off Period
 
 		return -1;
-
 	return 0;
 }
 
@@ -3323,7 +4401,6 @@
 	ixj[board].flags.ringback = 0;
 	ixj[board].flags.dialtone = 0;
 	ixj[board].flags.busytone = 1;
-
 	ixj_set_tone_on(0x07D0, board);
 	ixj_set_tone_off(0x07D0, board);
 	ixj_play_tone(board, 27);
@@ -3334,13 +4411,11 @@
 	ixj[board].flags.ringback = 0;
 	ixj[board].flags.dialtone = 1;
 	ixj[board].flags.busytone = 0;
-
 	if (ixj[board].dsp.low == 0x20) {
 		return;
 	} else {
 		ixj_set_tone_on(0xFFFF, board);
 		ixj_set_tone_off(0x0000, board);
-
 		ixj_play_tone(board, 25);
 	}
 }
@@ -3348,28 +4423,24 @@
 static void ixj_cpt_stop(board)
 {
 	IXJ *j = &ixj[board];
-
-	j->flags.dialtone = 0;
-	j->flags.busytone = 0;
-	j->flags.ringback = 0;
-
-	ixj_set_tone_on(0x0001, board);
-	ixj_set_tone_off(0x0000, board);
-
-	ixj_play_tone(board, 0);
-
-	j->tone_state = 0;
-
-	ixj_del_timer();
-	if (j->cadence_t) {
-		if (j->cadence_t->ce) {
-			kfree(j->cadence_t->ce);
+	if(j->tone_state)
+	{
+		j->flags.dialtone = 0;
+		j->flags.busytone = 0;
+		j->flags.ringback = 0;
+		ixj_set_tone_on(0x0001, board);
+		ixj_set_tone_off(0x0000, board);
+		ixj_play_tone(board, 0);
+		j->tone_state = 0;
+		if (j->cadence_t) {
+			if (j->cadence_t->ce) {
+				kfree(j->cadence_t->ce);
+			}
+			kfree(j->cadence_t);
+			j->cadence_t = NULL;
 		}
-		kfree(j->cadence_t);
-		j->cadence_t = NULL;
 	}
-	ixj_add_timer();
-	if (j->dsp.low == 0x20 || (j->play_mode == -1 && j->rec_mode == -1))
+	if (j->play_mode == -1 && j->rec_mode == -1)
 		idle(board);
 	if (j->play_mode != -1)
 		ixj_play_start(board);
@@ -3382,7 +4453,6 @@
 	ixj[board].flags.busytone = 0;
 	ixj[board].flags.dialtone = 0;
 	ixj[board].flags.ringback = 1;
-
 	ixj_set_tone_on(0x0FA0, board);
 	ixj_set_tone_off(0x2EE0, board);
 	ixj_play_tone(board, 26);
@@ -3399,14 +4469,11 @@
 	IXJ_CADENCE_ELEMENT *lcep;
 	IXJ_TONE ti;
 	IXJ *j = &ixj[board];
-
 	lcp = kmalloc(sizeof(IXJ_CADENCE), GFP_KERNEL);
 	if (lcp == NULL)
 		return -ENOMEM;
-
 	if (copy_from_user(lcp, (char *) cp, sizeof(IXJ_CADENCE)))
 		return -EFAULT;
-
 	lcep = kmalloc(sizeof(IXJ_CADENCE_ELEMENT) * lcp->elements_used, GFP_KERNEL);
 	if (lcep == NULL) {
 		kfree(lcp);
@@ -3414,13 +4481,10 @@
 	}
 	if (copy_from_user(lcep, lcp->ce, sizeof(IXJ_CADENCE_ELEMENT) * lcp->elements_used))
 		return -EFAULT;
-
-	if(j->cadence_t)
-	{
+	if (j->cadence_t) {
 		kfree(j->cadence_t->ce);
 		kfree(j->cadence_t);
 	}
-	
 	lcp->ce = (void *) lcep;
 	j->cadence_t = lcp;
 	j->tone_cadence_state = 0;
@@ -3435,16 +4499,50 @@
 		ixj_init_tone(board, &ti);
 	}
 	ixj_play_tone(board, lcp->ce[0].index);
-
 	return 1;
 }
 
+static int ixj_build_filter_cadence(int board, IXJ_FILTER_CADENCE * cp)
+{
+	IXJ_FILTER_CADENCE *lcp;
+	IXJ *j = &ixj[board];
+	lcp = kmalloc(sizeof(IXJ_CADENCE), GFP_KERNEL);
+	if (lcp == NULL)
+		return -ENOMEM;
+	if (copy_from_user(lcp, (char *) cp, sizeof(IXJ_FILTER_CADENCE)))
+		return -EFAULT;
+	if (lcp->filter > 4)
+		return -1;
+	j->cadence_f[lcp->filter].state = 0;
+	j->cadence_f[lcp->filter].enable = lcp->enable;
+	j->filter_en[lcp->filter] = j->cadence_f[lcp->filter].en_filter = lcp->en_filter;
+	j->cadence_f[lcp->filter].on1 = lcp->on1;
+	j->cadence_f[lcp->filter].on1min = 0;
+	j->cadence_f[lcp->filter].on1max = 0;
+	j->cadence_f[lcp->filter].off1 = lcp->off1;
+	j->cadence_f[lcp->filter].off1min = 0;
+	j->cadence_f[lcp->filter].off1max = 0;
+	j->cadence_f[lcp->filter].on2 = lcp->on2;
+	j->cadence_f[lcp->filter].on2min = 0;
+	j->cadence_f[lcp->filter].on2max = 0;
+	j->cadence_f[lcp->filter].off2 = lcp->off2;
+	j->cadence_f[lcp->filter].off2min = 0;
+	j->cadence_f[lcp->filter].off2max = 0;
+	j->cadence_f[lcp->filter].on3 = lcp->on3;
+	j->cadence_f[lcp->filter].on3min = 0;
+	j->cadence_f[lcp->filter].on3max = 0;
+	j->cadence_f[lcp->filter].off3 = lcp->off3;
+	j->cadence_f[lcp->filter].off3min = 0;
+	j->cadence_f[lcp->filter].off3max = 0;
+	kfree(lcp);
+	return 0;
+}
+
 static void add_caps(int board)
 {
 	IXJ *j = &ixj[board];
 	j->caps = 0;
-
-	j->caplist[j->caps].cap = vendor;
+	j->caplist[j->caps].cap = PHONE_VENDOR_QUICKNET;
 	strcpy(j->caplist[j->caps].desc, "Quicknet Technologies, Inc. (www.quicknet.net)");
 	j->caplist[j->caps].captype = vendor;
 	j->caplist[j->caps].handle = j->caps++;
@@ -3540,10 +4638,9 @@
 	int cnt;
 	IXJ *j = &ixj[board];
 	int retval = 0;
-
 	for (cnt = 0; cnt < j->caps; cnt++) {
-		if (pcreq->captype == j->caplist[cnt].captype &&
-		    pcreq->cap == j->caplist[cnt].cap) {
+		if (pcreq->captype == j->caplist[cnt].captype
+		    && pcreq->cap == j->caplist[cnt].cap) {
 			retval = 1;
 			break;
 		}
@@ -3551,8 +4648,7 @@
 	return retval;
 }
 
-int ixj_ioctl(struct inode *inode, struct file *file_p,
-	      unsigned int cmd, unsigned long arg)
+int ixj_ioctl(struct inode *inode, struct file *file_p, unsigned int cmd, unsigned long arg)
 {
 	IXJ_TONE ti;
 	IXJ_FILTER jf;
@@ -3560,16 +4656,13 @@
 	int board = NUM(inode->i_rdev);
 	IXJ *j = &ixj[NUM(inode->i_rdev)];
 	int retval = 0;
-
 	if (ixjdebug > 1)
 		printk(KERN_DEBUG "phone%d ioctl, cmd: 0x%x, arg: 0x%lx\n", minor, cmd, arg);
 	if (minor >= IXJMAX)
 		return -ENODEV;
-
 	/*
 	 *    Check ioctls only root can use.
 	 */
-
 	if (!capable(CAP_SYS_ADMIN)) {
 		switch (cmd) {
 		case IXJCTL_TESTRAM:
@@ -3588,10 +4681,33 @@
 	case IXJCTL_SERIAL:
 		retval = j->serial;
 		break;
+	case IXJCTL_VERSION:
+		if (copy_to_user((char *) arg, ixj_c_revision, strlen(ixj_c_revision)))
+			return -EFAULT;
+		break;
 	case PHONE_RING_CADENCE:
 		j->ring_cadence = arg;
 		break;
+	case IXJCTL_CIDCW:
+		if(arg) {
+			copy_from_user(&j->cid_send, (char *)arg, sizeof(PHONE_CID));
+		}
+		else {
+			memcpy(&j->cid_send, 0, sizeof(PHONE_CID));
+		}
+		ixj_write_cidcw(board);
+		break;
+	/* Binary compatbility */
+	case OLD_PHONE_RING_START:
+		arg = 0;
+		/* Fall through */
 	case PHONE_RING_START:
+		if(arg) {
+			copy_from_user(&j->cid_send, (char *)arg, sizeof(PHONE_CID));
+		}
+		else {
+			memcpy(&j->cid_send, 0, sizeof(PHONE_CID));
+		}
 		ixj_ring_start(board);
 		break;
 	case PHONE_RING_STOP:
@@ -3603,7 +4719,19 @@
 		break;
 	case PHONE_EXCEPTION:
 		retval = j->ex.bytes;
-		j->ex.bytes &= 0x03;
+		j->ex.bits.flash = 0;
+		j->ex.bits.pstn_ring = 0;
+		j->ex.bits.caller_id = 0;
+		j->ex.bits.pstn_wink = 0;
+		j->ex.bits.f0 = 0;
+		j->ex.bits.f1 = 0;
+		j->ex.bits.f2 = 0;
+		j->ex.bits.f3 = 0;
+		j->ex.bits.fc0 = 0;
+		j->ex.bits.fc1 = 0;
+		j->ex.bits.fc2 = 0;
+		j->ex.bits.fc3 = 0;
+		j->ex.bits.reserved = 0;
 		break;
 	case PHONE_HOOKSTATE:
 		j->ex.bits.hookstate = 0;
@@ -3618,6 +4746,9 @@
 	case PHONE_REC_CODEC:
 		retval = set_rec_codec(board, arg);
 		break;
+	case PHONE_VAD:
+		ixj_vad(board, arg);
+		break;
 	case PHONE_REC_START:
 		ixj_record_start(board);
 		break;
@@ -3628,7 +4759,13 @@
 		set_rec_depth(board, arg);
 		break;
 	case PHONE_REC_VOLUME:
-		set_rec_volume(board, arg);
+		if(arg == -1) {
+			retval = get_rec_volume(board);
+		}
+		else {
+			set_rec_volume(board, arg);
+			retval = arg;
+		}
 		break;
 	case PHONE_REC_LEVEL:
 		retval = get_rec_level(board);
@@ -3646,7 +4783,7 @@
 		retval = set_play_codec(board, arg);
 		break;
 	case PHONE_PLAY_START:
-		ixj_play_start(board);
+		retval = ixj_play_start(board);
 		break;
 	case PHONE_PLAY_STOP:
 		ixj_play_stop(board);
@@ -3655,7 +4792,13 @@
 		set_play_depth(board, arg);
 		break;
 	case PHONE_PLAY_VOLUME:
-		set_play_volume(board, arg);
+		if(arg == -1) {
+			retval = get_play_volume(board);
+		}
+		else {
+			set_play_volume(board, arg);
+			retval = arg;
+		}
 		break;
 	case PHONE_PLAY_LEVEL:
 		retval = get_play_level(board);
@@ -3836,41 +4979,45 @@
 		switch (arg) {
 		case DAA_US:
 			DAA_Coeff_US(board);
-			ixj_daa_write(board);
+			retval = ixj_daa_write(board);
 			break;
 		case DAA_UK:
 			DAA_Coeff_UK(board);
-			ixj_daa_write(board);
+			retval = ixj_daa_write(board);
 			break;
 		case DAA_FRANCE:
 			DAA_Coeff_France(board);
-			ixj_daa_write(board);
+			retval = ixj_daa_write(board);
 			break;
 		case DAA_GERMANY:
 			DAA_Coeff_Germany(board);
-			ixj_daa_write(board);
+			retval = ixj_daa_write(board);
 			break;
 		case DAA_AUSTRALIA:
 			DAA_Coeff_Australia(board);
-			ixj_daa_write(board);
+			retval = ixj_daa_write(board);
 			break;
 		case DAA_JAPAN:
 			DAA_Coeff_Japan(board);
-			ixj_daa_write(board);
+			retval = ixj_daa_write(board);
 			break;
 		default:
+			retval = 1;
 			break;
 		}
+		j->country = arg;
 		break;
 	case IXJCTL_DAA_AGAIN:
 		ixj_daa_cr4(board, arg | 0x02);
 		break;
 	case IXJCTL_PSTN_LINETEST:
-	case PHONE_PSTN_LINETEST:
 		retval = ixj_linetest(board);
 		break;
+	case IXJCTL_VMWI:
+		ixj_write_vmwi(board, arg);
+		break;
 	case IXJCTL_CID:
-		if (copy_to_user((char *) arg, &j->cid, sizeof(IXJ_CID)))
+		if (copy_to_user((char *) arg, &j->cid, sizeof(PHONE_CID)))
 			return -EFAULT;
 		j->ex.bits.caller_id = 0;
 		break;
@@ -3891,7 +5038,7 @@
 		break;
 	case PHONE_CAPABILITIES_LIST:
 		if (copy_to_user((char *) arg, j->caplist, sizeof(struct phone_capability) * j->caps))
-			return -EFAULT;
+			 return -EFAULT;
 		break;
 	case PHONE_CAPABILITIES_CHECK:
 		retval = capabilities_check(board, (struct phone_capability *) arg);
@@ -3904,7 +5051,7 @@
 		j->ex.bits.pstn_ring = 0;
 		break;
 	case IXJCTL_SET_FILTER:
-		if (copy_from_user(&jf, (char *) arg, sizeof(ti)))
+		if (copy_from_user(&jf, (char *) arg, sizeof(jf)))
 			return -EFAULT;
 		retval = ixj_init_filter(board, &jf);
 		break;
@@ -3918,6 +5065,9 @@
 	case IXJCTL_TONE_CADENCE:
 		retval = ixj_build_cadence(board, (IXJ_CADENCE *) arg);
 		break;
+	case IXJCTL_FILTER_CADENCE:
+		retval = ixj_build_filter_cadence(board, (IXJ_FILTER_CADENCE *) arg);
+		break;
 	case IXJCTL_INTERCOM_STOP:
 		ixj[board].intercom = -1;
 		ixj[arg].intercom = -1;
@@ -3967,14 +5117,14 @@
 	NULL,			/* revalidate */
 	NULL			/* lock */
 };
-
 static int ixj_linetest(int board)
 {
 	unsigned long jifwait;
 	IXJ *j = &ixj[board];
 
+	j->flags.incheck = 1;	// Testing
 	if (!j->flags.pots_correct) {
-		j->flags.pots_correct = 1;	// Testing
+		j->flags.pots_correct = 1;
 
 		daa_int_read(board);	//Clear DAA Interrupt flags
 		//
@@ -4026,23 +5176,23 @@
 			}
 		}
 	}
-	if (!j->flags.pstn_present) {
-		j->pld_slicw.bits.rly3 = 0;
-		outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
-		daa_set_mode(board, SOP_PU_CONVERSATION);
-		jifwait = jiffies + hertz;
-		while (time_before(jiffies, jifwait)) {
-			current->state = TASK_INTERRUPTIBLE;
-			schedule_timeout(1);
-		}
-		daa_int_read(board);
-		daa_set_mode(board, SOP_PU_SLEEP);
-		if (j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.bitreg.VDD_OK) {
-			j->flags.pstn_present = 1;
-		} else {
-			j->flags.pstn_present = 0;
-		}
+//      if (!j->flags.pstn_present) {
+	j->pld_slicw.bits.rly3 = 0;
+	outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
+	daa_set_mode(board, SOP_PU_CONVERSATION);
+	jifwait = jiffies + hertz;
+	while (time_before(jiffies, jifwait)) {
+		current->state = TASK_INTERRUPTIBLE;
+		schedule_timeout(1);
+	}
+	daa_int_read(board);
+	daa_set_mode(board, SOP_PU_SLEEP);
+	if (j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.bitreg.VDD_OK) {
+		j->flags.pstn_present = 1;
+	} else {
+		j->flags.pstn_present = 0;
 	}
+//      }
 	if (j->flags.pstn_present) {
 		if (j->flags.pots_correct) {
 			LED_SetState(0xA, board);
@@ -4056,6 +5206,7 @@
 			LED_SetState(0x5, board);
 		}
 	}
+	j->flags.incheck = 0;	// Testing
 	return j->flags.pstn_present;
 }
 
@@ -4063,46 +5214,39 @@
 {
 	unsigned short cmd;
 	unsigned long jif;
+	int cnt;
 	BYTES bytes;
 	IXJ *j = &ixj[board];
-
 	if (ixjdebug > 0)
 		printk(KERN_INFO "Write IDLE to Software Control Register\n");
+	ixj_WriteDSPCommand(0x0FE0, board);	// Put the DSP in full power mode.
 
 	if (ixj_WriteDSPCommand(0x0000, board))		/* Write IDLE to Software Control Register */
 		return -1;
-
 // The read values of the SSR should be 0x00 for the IDLE command
 	if (j->ssr.low || j->ssr.high)
 		return -1;
-
 	if (ixjdebug > 0)
 		printk(KERN_INFO "Get Device ID Code\n");
-
 	if (ixj_WriteDSPCommand(0x3400, board))		/* Get Device ID Code */
 		return -1;
-
 	j->dsp.low = j->ssr.low;
 	j->dsp.high = j->ssr.high;
-
 	if (ixjdebug > 0)
 		printk(KERN_INFO "Get Device Version Code\n");
-
 	if (ixj_WriteDSPCommand(0x3800, board))		/* Get Device Version Code */
 		return -1;
-
 	j->ver.low = j->ssr.low;
 	j->ver.high = j->ssr.high;
-
 	if (!j->cardtype) {
 		if (j->dsp.low == 0x21) {
 //      j->XILINXbase = j->DSPbase + 0x10;
 			bytes.high = bytes.low = inb_p(j->XILINXbase + 0x02);
 			outb_p(bytes.low ^ 0xFF, j->XILINXbase + 0x02);
-      // Test for Internet LineJACK or Internet PhoneJACK Lite
+// Test for Internet LineJACK or Internet PhoneJACK Lite
 			bytes.low = inb_p(j->XILINXbase + 0x02);
 			if (bytes.low == bytes.high)	//  Register is read only on
-                                    //  Internet PhoneJack Lite
+				//  Internet PhoneJack Lite
 			 {
 				j->cardtype = 400;	// Internet PhoneJACK Lite
 
@@ -4163,18 +5307,18 @@
 			j->pld_slicw.pcib.e1 = 1;
 			outb_p(j->pld_slicw.byte, j->XILINXbase);
 			break;
+		case 600:	//Internet PhoneCARD
+
+			break;
 		}
 	}
 	if (j->dsp.low == 0x20 || j->cardtype == 400 || j->cardtype == 500) {
 		if (ixjdebug > 0)
 			printk(KERN_INFO "Write CODEC config to Software Control Register\n");
-
 		if (ixj_WriteDSPCommand(0xC462, board))		/* Write CODEC config to Software Control Register */
 			return -1;
-
 		if (ixjdebug > 0)
 			printk(KERN_INFO "Write CODEC timing to Software Control Register\n");
-
 		if (j->cardtype == 100) {
 			cmd = 0x9FF2;
 		} else {
@@ -4185,17 +5329,17 @@
 	} else {
 		if (set_base_frame(board, 30) != 30)
 			return -1;
-
+		if (ixjdebug > 0)
+			printk(KERN_INFO "Write CODEC config to Software Control Register\n");
+		if (j->cardtype == 600) {
+			if (ixj_WriteDSPCommand(0xC528, board))		/* Write CODEC config to Software Control Register */
+				return -1;
+		}
 		if (j->cardtype == 300) {
-			if (ixjdebug > 0)
-				printk(KERN_INFO "Write CODEC config to Software Control Register\n");
-
 			if (ixj_WriteDSPCommand(0xC528, board))		/* Write CODEC config to Software Control Register */
 				return -1;
-
 			if (ixjdebug > 0)
 				printk(KERN_INFO "Turn on the PLD Clock at 8Khz\n");
-
 			j->pld_clock.byte = 0;
 			outb_p(j->pld_clock.byte, j->XILINXbase + 0x04);
 		}
@@ -4204,7 +5348,6 @@
 	if (j->dsp.low == 0x20) {
 		if (ixjdebug > 0)
 			printk(KERN_INFO "Configure GPIO pins\n");
-
 		j->gpio.bytes.high = 0x09;
 /*  bytes.low = 0xEF;  0xF7 */
 		j->gpio.bits.gpio1 = 1;
@@ -4215,10 +5358,8 @@
 		j->gpio.bits.gpio6 = 1;
 		j->gpio.bits.gpio7 = 1;
 		ixj_WriteDSPCommand(ixj[board].gpio.word, board);	/* Set GPIO pin directions */
-
 		if (ixjdebug > 0)
 			printk(KERN_INFO "Enable SLIC\n");
-
 		j->gpio.bytes.high = 0x0B;
 		j->gpio.bytes.low = 0x00;
 		j->gpio.bits.gpio1 = 0;
@@ -4253,23 +5394,16 @@
 				schedule_timeout(1);
 			}
 			LED_SetState(0x0, board);
-
 			daa_get_version(board);
-
 			if (ixjdebug > 0)
 				printk("Loading DAA Coefficients\n");
-
 			DAA_Coeff_US(board);
 			if (!ixj_daa_write(board))
 				printk("DAA write failed on board %d\n", board);
-
 			ixj_daa_cid_reset(board);
-
 			j->flags.pots_correct = 0;
 			j->flags.pstn_present = 0;
-
 			ixj_linetest(board);
-
 			if (j->flags.pots_correct) {
 				j->pld_scrw.bits.daafsyncen = 0;	// Turn off DAA Frame Sync
 
@@ -4280,9 +5414,10 @@
 				SLIC_SetState(PLD_SLIC_STATE_STANDBY, board);
 				j->port = PORT_POTS;
 			}
+			ixj_set_port(board, PORT_PSTN);
+			ixj_set_pots(board, 1);
 			if (ixjdebug > 0)
 				printk(KERN_INFO "Enable Mixer\n");
-
 			ixj_mixer(0x0000, board);	//Master Volume Left unmute 0db
 
 			ixj_mixer(0x0100, board);	//Master Volume Right unmute 0db
@@ -4306,43 +5441,43 @@
 			ixj_mixer(0x1800, board);	//ADC Source select
 
 		} else {
-			j->port = PORT_POTS;
-			SLIC_SetState(PLD_SLIC_STATE_STANDBY, board);
+			if (j->cardtype == 600) {
+				ixj_WriteDSPCommand(0xCF07, board);
+				ixj_WriteDSPCommand(0x00B0, board);
+				ixj_set_port(board, PORT_SPEAKER);
+			} else {
+				ixj_set_port(board, PORT_POTS);
+				SLIC_SetState(PLD_SLIC_STATE_STANDBY, board);
+			}
 		}
 	}
 
 	j->intercom = -1;
 	j->framesread = j->frameswritten = 0;
+	j->read_wait = j->write_wait = 0;
 	j->rxreadycheck = j->txreadycheck = 0;
-
+	set_play_volume(board, 0x100);
+	set_rec_volume(board, 0x100);
 	if (ixj_WriteDSPCommand(0x0000, board))		/* Write IDLE to Software Control Register */
 		return -1;
-
 // The read values of the SSR should be 0x00 for the IDLE command
 	if (j->ssr.low || j->ssr.high)
 		return -1;
-
 	if (ixjdebug > 0)
 		printk(KERN_INFO "Enable Line Monitor\n");
-
 	if (ixjdebug > 0)
 		printk(KERN_INFO "Set Line Monitor to Asyncronous Mode\n");
-
 	if (ixj_WriteDSPCommand(0x7E01, board))		// Asynchronous Line Monitor
 
 		return -1;
-
 	if (ixjdebug > 0)
 		printk(KERN_INFO "Enable DTMF Detectors\n");
-
 	if (ixj_WriteDSPCommand(0x5151, board))		// Enable DTMF detection
 
 		return -1;
-
 	if (ixj_WriteDSPCommand(0x6E01, board))		// Set Asyncronous Tone Generation
 
 		return -1;
-
 	set_rec_depth(board, 2);	// Set Record Channel Limit to 2 frames
 
 	set_play_depth(board, 2);	// Set Playback Channel Limit to 2 frames
@@ -4350,7 +5485,6 @@
 	j->ex.bits.dtmf_ready = 0;
 	j->dtmf_state = 0;
 	j->dtmf_wp = ixj[board].dtmf_rp = 0;
-
 	j->rec_mode = ixj[board].play_mode = -1;
 	j->flags.ringing = 0;
 	j->maxrings = MAXRINGS;
@@ -4358,15 +5492,16 @@
 	j->drybuffer = 0;
 	j->winktime = 320;
 	j->flags.dtmf_oob = 0;
-
+	for (cnt = 0; cnt < 4; cnt++)
+		j->cadence_f[cnt].enable = 0;
 	/* must be a device on the specified address */
+	ixj_WriteDSPCommand(0x0FE3, board);	// Put the DSP in 1/5 power mode.
 	/* Register with the Telephony for Linux subsystem */
 	j->p.f_op = &ixj_fops;
 	j->p.open = ixj_open;
+	j->p.board = board;
 	phone_register_device(&j->p, PHONE_UNIT_ANY);
-
 	add_caps(board);
-
 	return 0;
 }
 
@@ -4375,11 +5510,9 @@
 	int cnt;
 	IXJ *j;
 	len = 0;
-
 	len += sprintf(buf + len, "\n%s", ixj_c_rcsid);
 	len += sprintf(buf + len, "\n%s", ixj_h_rcsid);
 	len += sprintf(buf + len, "\n%s", ixjuser_h_rcsid);
-
 	for (cnt = 0; cnt < IXJMAX; cnt++) {
 		j = &ixj[cnt];
 		if (j->DSPbase) {
@@ -4398,6 +5531,7 @@
 				len += sprintf(buf + len, "\nCard Type = Internet LineJACK");
 				if (j->flags.g729_loaded)
 					len += sprintf(buf + len, " w/G.729 A/B");
+				len += sprintf(buf + len, " Country = %d", j->country);
 				break;
 			case (400):
 				len += sprintf(buf + len, "\nCard Type = Internet PhoneJACK Lite");
@@ -4409,18 +5543,35 @@
 				if (j->flags.g729_loaded)
 					len += sprintf(buf + len, " w/G.729 A/B");
 				break;
+			case (600):
+				len += sprintf(buf + len, "\nCard Type = Internet PhoneCARD");
+				if (j->flags.g729_loaded)
+					len += sprintf(buf + len, " w/G.729 A/B");
+				len += sprintf(buf + len, "\nSmart Cable %spresent", j->pccr1.bits.drf ? "not " : "");
+				if (!j->pccr1.bits.drf)
+					len += sprintf(buf + len, "\nSmart Cable type %d", j->flags.pcmciasct);
+				len += sprintf(buf + len, "\nSmart Cable state %d", j->flags.pcmciastate);
+				break;
 			default:
 				len += sprintf(buf + len, "\nCard Type = %d", j->cardtype);
 				break;
 			}
+			len += sprintf(buf + len, "\nReaders %d", j->readers);
+			len += sprintf(buf + len, "\nWriters %d", j->writers);
+			len += sprintf(buf + len, "\nFSK words %d", ixj[2].fskdcnt);
 			len += sprintf(buf + len, "\nCapabilities %d", j->caps);
 			if (j->dsp.low != 0x20)
 				len += sprintf(buf + len, "\nDSP Processor load %d", j->proc_load);
-//    if(j->intercom != -1)
-			//      len += sprintf(buf+len, "\nIntercom call to board %2.2x", j->intercom);
+			if (j->flags.cidsent)
+				len += sprintf(buf + len, "\nCaller ID data sent");
+			else
+				len += sprintf(buf + len, "\nCaller ID data not sent");
+
+			len += sprintf(buf + len, "\nCaller ID Date %s%s", j->cid_send.month, j->cid_send.day);
+			len += sprintf(buf + len, "\nCaller ID Time %s%s", j->cid_send.hour, j->cid_send.min);
+			len += sprintf(buf + len, "\nCaller ID Name %s", j->cid_send.name);
+			len += sprintf(buf + len, "\nCaller ID Number %s", j->cid_send.number);
 
-//    len += sprintf(buf+len, "\nRead buffer size %d", j->read_buffer_size);
-			//    len += sprintf(buf+len, "\nWrite buffer size %d", j->write_buffer_size);
 			len += sprintf(buf + len, "\nPlay CODEC ");
 			switch (j->play_codec) {
 			case G723_63:
@@ -4463,9 +5614,6 @@
 				len += sprintf(buf + len, "NO CODEC CHOSEN");
 				break;
 			}
-//    len += sprintf(buf+len, "\nPlay Frame Size %d", j->play_frame_size);
-			//    len += sprintf(buf+len, "\nInfo_write.convert_mode = %d", j->Info_write.convert_mode);
-			//    len += sprintf(buf+len, "\nInfo_write.convert_dir = %d", j->Info_write.convert_dir);
 			len += sprintf(buf + len, "\nRecord CODEC ");
 			switch (j->rec_codec) {
 			case G723_63:
@@ -4508,7 +5656,6 @@
 				len += sprintf(buf + len, "NO CODEC CHOSEN");
 				break;
 			}
-//    len += sprintf(buf+len, "\nRecord Frame Size %d", j->rec_frame_size);
 			switch (j->aec_level) {
 			case AEC_OFF:
 				len += sprintf(buf + len, "\n AEC OFF");
@@ -4523,16 +5670,13 @@
 				len += sprintf(buf + len, "\n AEC HIGH");
 				break;
 			}
-//    len += sprintf(buf+len, "\nInfo_read.convert_mode = %d", j->Info_read.convert_mode);
-			//    len += sprintf(buf+len, "\nInfo_read.convert_dir = %d", j->Info_read.convert_dir);
 			len += sprintf(buf + len, "\nHook state %d", j->r_hook);	// ixj_hookstate(cnt));
 
 			if (j->cardtype == 300) {
 				len += sprintf(buf + len, "\nPOTS Correct %d", j->flags.pots_correct);
 				len += sprintf(buf + len, "\nPSTN Present %d", j->flags.pstn_present);
 				len += sprintf(buf + len, "\nPOTS to PSTN %d", j->flags.pots_pstn);
-//      len += sprintf(buf+len, "\nDAA Interrupt flags %d", j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.reg);
-				//      len += sprintf(buf+len, "\nDAA version %d", j->m_DAAShadowRegs.SOP_REGS.SOP.cr5.reg);
+				len += sprintf(buf + len, "\nPSTN sleeptil %ld - jiffies %ld", j->pstn_sleeptil, jiffies);
 				switch (j->daa_mode) {
 				case SOP_PU_SLEEP:
 					len += sprintf(buf + len, "\nDAA PSTN On Hook");
@@ -4547,7 +5691,6 @@
 					len += sprintf(buf + len, "\nDAA PSTN Pulse Dialing");
 					break;
 				}
-//      len += sprintf(buf+len, "\nDAA PSTN Ring flag = %d", j->pstn_ringing);
 			}
 			switch (j->port) {
 			case PORT_POTS:
@@ -4598,23 +5741,8 @@
 					break;
 				}
 			}
-//    len += sprintf(buf+len, "\nRead buffers ready %d", j->read_buffer_ready);
-			//    len += sprintf(buf+len, "\nWrite buffers empty %d",j->write_buffers_empty);
-
-//    len += sprintf(buf+len, "\nDTMF ready %d", j->ex.bits.dtmf_ready);
-			//    len += sprintf(buf+len, "\nDTMF proc %d", j->dtmf_proc);
-			//    len += sprintf(buf+len, "\nDTMF wp %d", j->dtmf_wp);
-			//    len += sprintf(buf+len, "\nDTMF rp %d", j->dtmf_rp);
-			//    len += sprintf(buf+len, "\nDTMF digits ");
-			//    for(x=j->dtmf_rp; x <j->dtmf_wp; x++)
-			//    {
-			//      if(x == 79)
-			//        x = 0;
-			//      len += sprintf(buf+len, "%x", j->dtmfbuffer[x]);
-			//    }
 #ifdef PERFMON_STATS
 			len += sprintf(buf + len, "\nTimer Checks %ld", j->timerchecks);
-
 			len += sprintf(buf + len, "\nRX Ready Checks %ld", j->rxreadycheck);
 			len += sprintf(buf + len, "\nTX Ready Checks %ld", j->txreadycheck);
 			len += sprintf(buf + len, "\nBase Frame %2.2x.%2.2x", j->baseframe.high, j->baseframe.low);
@@ -4629,7 +5757,15 @@
 	}
 	return len;
 }
-
+int ixj_read_proc_fsk(char *buf, char **start, off_t offset, int len, int unused)
+{
+	len = 0;
+	if (ixj[2].fskdcnt) {
+		memcpy(buf, &ixj[2].fskdata, (ixj[2].fskdcnt) * 2);
+		len += ixj[2].fskdcnt * 2;
+	}
+	return len;
+}
 static struct proc_dir_entry ixj_proc_entry =
 {
 	0,
@@ -4640,14 +5776,310 @@
 	NULL,
 	&ixj_read_proc
 };
+static struct proc_dir_entry ixjfsk_proc_entry =
+{
+	0,
+	6, "ixjfsk",
+	S_IFREG | S_IRUGO,
+	1, 0, 0,
+	0,
+	NULL,
+	&ixj_read_proc_fsk
+};
+
+MODULE_DESCRIPTION("Internet Phone/Internet LineJack module - www.quicknet.net");
+MODULE_AUTHOR("Ed Okerson <eokerson@quicknet.net>");
+#ifdef CONFIG_PCMCIA
+#ifdef PCMCIA_DEBUG
+static int pc_debug = PCMCIA_DEBUG;
+MODULE_PARM(pc_debug, "i");
+#define DEBUG(n, args...) if (pc_debug>(n)) printk(KERN_DEBUG args)
+#else
+#define DEBUG(n, args...)
+#endif
+typedef struct ixj_info_t {
+	int ndev;
+	dev_node_t node;
+	struct ixj *port;
+} ixj_info_t;
+static dev_link_t *ixj_attach(void);
+static void ixj_detach(dev_link_t *);
+static void ixj_config(dev_link_t * link);
+static void ixj_cs_release(u_long arg);
+static int ixj_event(event_t event, int priority, event_callback_args_t * args);
+static dev_info_t dev_info = "ixj_cs";
+static dev_link_t *dev_list = NULL;
+static void cs_error(client_handle_t handle, int func, int ret)
+{
+	error_info_t err =
+	{
+		func, ret
+	};
+	CardServices(ReportError, handle, &err);
+}
+
+static dev_link_t *ixj_attach(void)
+{
+	client_reg_t client_reg;
+	dev_link_t *link;
+	int ret;
+	DEBUG(0, "ixj_attach()\n");
+	/* Create new ixj device */
+	link = kmalloc(sizeof(struct dev_link_t), GFP_KERNEL);
+	memset(link, 0, sizeof(struct dev_link_t));
+	link->release.function = &ixj_cs_release;
+	link->release.data = (u_long) link;
+	link->io.Attributes1 = IO_DATA_PATH_WIDTH_8;
+	link->io.Attributes2 = IO_DATA_PATH_WIDTH_8;
+	link->io.IOAddrLines = 3;
+	link->conf.Vcc = 50;
+	link->conf.IntType = INT_MEMORY_AND_IO;
+	link->priv = kmalloc(sizeof(struct ixj_info_t), GFP_KERNEL);
+	memset(link->priv, 0, sizeof(struct ixj_info_t));
+	/* Register with Card Services */
+	link->next = dev_list;
+	dev_list = link;
+	client_reg.dev_info = &dev_info;
+	client_reg.Attributes = INFO_IO_CLIENT | INFO_CARD_SHARE;
+	client_reg.EventMask =
+	    CS_EVENT_CARD_INSERTION | CS_EVENT_CARD_REMOVAL |
+	    CS_EVENT_RESET_PHYSICAL | CS_EVENT_CARD_RESET |
+	    CS_EVENT_PM_SUSPEND | CS_EVENT_PM_RESUME;
+	client_reg.event_handler = &ixj_event;
+	client_reg.Version = 0x0210;
+	client_reg.event_callback_args.client_data = link;
+	ret = CardServices(RegisterClient, &link->handle, &client_reg);
+	if (ret != CS_SUCCESS) {
+		cs_error(link->handle, RegisterClient, ret);
+		ixj_detach(link);
+		return NULL;
+	}
+	return link;
+}
+
+static void ixj_detach(dev_link_t * link)
+{
+	dev_link_t **linkp;
+	long flags;
+	int ret;
+	DEBUG(0, "ixj_detach(0x%p)\n", link);
+	for (linkp = &dev_list; *linkp; linkp = &(*linkp)->next)
+		if (*linkp == link)
+			break;
+	if (*linkp == NULL)
+		return;
+	save_flags(flags);
+	cli();
+	if (link->state & DEV_RELEASE_PENDING) {
+		del_timer(&link->release);
+		link->state &= ~DEV_RELEASE_PENDING;
+	}
+	restore_flags(flags);
+	if (link->state & DEV_CONFIG)
+		ixj_cs_release((u_long) link);
+	if (link->handle) {
+		ret = CardServices(DeregisterClient, link->handle);
+		if (ret != CS_SUCCESS)
+			cs_error(link->handle, DeregisterClient, ret);
+	}
+	/* Unlink device structure, free bits */
+	*linkp = link->next;
+	kfree_s(link->priv, sizeof(ixj_info_t));
+	kfree_s(link, sizeof(struct dev_link_t));
+}
+
+#define CS_CHECK(fn, args...) \
+while ((last_ret=CardServices(last_fn=(fn), args))!=0) goto cs_failed
+
+#define CFG_CHECK(fn, args...) \
+if (CardServices(fn, args) != 0) goto next_entry
+
+void ixj_get_serial(dev_link_t * link, IXJ * j)
+{
+	client_handle_t handle;
+	tuple_t tuple;
+	u_short buf[128];
+	char *str;
+	int last_ret, last_fn, i, place;
+	handle = link->handle;
+	DEBUG(0, "ixj_get_serial(0x%p)\n", link);
+	tuple.TupleData = (cisdata_t *) buf;
+	tuple.TupleOffset = 0;
+	tuple.TupleDataMax = 80;
+	tuple.Attributes = 0;
+	tuple.DesiredTuple = CISTPL_VERS_1;
+	CS_CHECK(GetFirstTuple, handle, &tuple);
+	CS_CHECK(GetTupleData, handle, &tuple);
+	str = (char *) buf;
+	printk("PCMCIA Version %d.%d\n", str[0], str[1]);
+	str += 2;
+	printk("%s", str);
+	str = str + strlen(str) + 1;
+	printk(" %s", str);
+	str = str + strlen(str) + 1;
+	place = 1;
+	for (i = strlen(str) - 1; i >= 0; i--) {
+		switch (str[i]) {
+		case '0':
+		case '1':
+		case '2':
+		case '3':
+		case '4':
+		case '5':
+		case '6':
+		case '7':
+		case '8':
+		case '9':
+			j->serial += (str[i] - 48) * place;
+			break;
+		case 'A':
+		case 'B':
+		case 'C':
+		case 'D':
+		case 'E':
+		case 'F':
+			j->serial += (str[i] - 55) * place;
+			break;
+		case 'a':
+		case 'b':
+		case 'c':
+		case 'd':
+		case 'e':
+		case 'f':
+			j->serial += (str[i] - 87) * place;
+			break;
+		}
+		place = place * 0x10;
+	}
+	str = str + strlen(str) + 1;
+	printk(" version %s\n", str);
+      cs_failed:
+	return;
+}
+
+void ixj_config(dev_link_t * link)
+{
+	client_handle_t handle;
+	ixj_info_t *info;
+	tuple_t tuple;
+	u_short buf[128];
+	cisparse_t parse;
+	config_info_t conf;
+	cistpl_cftable_entry_t *cfg = &parse.cftable_entry;
+	cistpl_cftable_entry_t dflt =
+	{
+		0
+	};
+	int last_ret, last_fn;
+	handle = link->handle;
+	info = link->priv;
+	DEBUG(0, "ixj_config(0x%p)\n", link);
+	tuple.TupleData = (cisdata_t *) buf;
+	tuple.TupleOffset = 0;
+	tuple.TupleDataMax = 255;
+	tuple.Attributes = 0;
+	tuple.DesiredTuple = CISTPL_CONFIG;
+	CS_CHECK(GetFirstTuple, handle, &tuple);
+	CS_CHECK(GetTupleData, handle, &tuple);
+	CS_CHECK(ParseTuple, handle, &tuple, &parse);
+	link->conf.ConfigBase = parse.config.base;
+	link->conf.Present = parse.config.rmask[0];
+	link->state |= DEV_CONFIG;
+	CS_CHECK(GetConfigurationInfo, handle, &conf);
+	tuple.DesiredTuple = CISTPL_CFTABLE_ENTRY;
+	tuple.Attributes = 0;
+	CS_CHECK(GetFirstTuple, handle, &tuple);
+	while (1) {
+		CFG_CHECK(GetTupleData, handle, &tuple);
+		CFG_CHECK(ParseTuple, handle, &tuple, &parse);
+		if ((cfg->io.nwin > 0) || (dflt.io.nwin > 0)) {
+			cistpl_io_t *io = (cfg->io.nwin) ? &cfg->io : &dflt.io;
+			link->conf.ConfigIndex = cfg->index;
+			link->io.BasePort1 = io->win[0].base;
+			link->io.NumPorts1 = io->win[0].len;
+			if (io->nwin == 2) {
+				link->io.BasePort2 = io->win[1].base;
+				link->io.NumPorts2 = io->win[1].len;
+			}
+			CFG_CHECK(RequestIO, link->handle, &link->io);
+			/* If we've got this far, we're done */
+			break;
+		}
+	      next_entry:
+		if (cfg->flags & CISTPL_CFTABLE_DEFAULT)
+			dflt = *cfg;
+		CS_CHECK(GetNextTuple, handle, &tuple);
+	}
+
+	CS_CHECK(RequestConfiguration, handle, &link->conf);
+	ixj[0].DSPbase = link->io.BasePort1;
+	ixj[0].XILINXbase = link->io.BasePort1 + 0x10;
+	ixj[0].cardtype = 600;
+	ixj_selfprobe(0);
+	info->ndev = 1;
+	info->node.major = PHONE_MAJOR;
+	link->dev = &info->node;
+	ixj_get_serial(link, &ixj[0]);
+	link->state &= ~DEV_CONFIG_PENDING;
+	return;
+      cs_failed:
+	cs_error(link->handle, last_fn, last_ret);
+	ixj_cs_release((u_long) link);
+}
+
+void ixj_cs_release(u_long arg)
+{
+	dev_link_t *link = (dev_link_t *) arg;
+	ixj_info_t *info = link->priv;
+	DEBUG(0, "ixj_cs_release(0x%p)\n", link);
+	info->ndev = 0;
+	link->dev = NULL;
+	CardServices(ReleaseConfiguration, link->handle);
+	CardServices(ReleaseIO, link->handle, &link->io);
+	link->state &= ~DEV_CONFIG;
+}
+
+int ixj_event(event_t event, int priority, event_callback_args_t * args)
+{
+	dev_link_t *link = args->client_data;
+	DEBUG(1, "ixj_event(0x%06x)\n", event);
+	switch (event) {
+	case CS_EVENT_CARD_REMOVAL:
+		link->state &= ~DEV_PRESENT;
+		if (link->state & DEV_CONFIG) {
+			link->release.expires = RUN_AT(HZ / 20);
+			link->state |= DEV_RELEASE_PENDING;
+			add_timer(&link->release);
+		}
+		break;
+	case CS_EVENT_CARD_INSERTION:
+		link->state |= DEV_PRESENT | DEV_CONFIG_PENDING;
+		ixj_config(link);
+		break;
+	case CS_EVENT_PM_SUSPEND:
+		link->state |= DEV_SUSPEND;
+		/* Fall through... */
+	case CS_EVENT_RESET_PHYSICAL:
+		if (link->state & DEV_CONFIG)
+			CardServices(ReleaseConfiguration, link->handle);
+		break;
+	case CS_EVENT_PM_RESUME:
+		link->state &= ~DEV_SUSPEND;
+		/* Fall through... */
+	case CS_EVENT_CARD_RESET:
+		if (DEV_OK(link))
+			CardServices(RequestConfiguration, link->handle, &link->conf);
+		break;
+	}
+	return 0;
+}
+
+#endif				// PCMCIA
 
 static void cleanup(void)
 {
 	int cnt;
-
 	del_timer(&ixj_timer);
-//  if (ixj_major)
-	//    unregister_chrdev(ixj_major, "ixj");
 	for (cnt = 0; cnt < IXJMAX; cnt++) {
 		if (ixj[cnt].cardtype == 300) {
 			ixj[cnt].pld_scrw.bits.daafsyncen = 0;	// Turn off DAA Frame Sync
@@ -4658,7 +6090,6 @@
 			ixj[cnt].pld_slicw.bits.rly3 = 0;
 			outb_p(ixj[cnt].pld_slicw.byte, ixj[cnt].XILINXbase + 0x01);
 			LED_SetState(0x0, cnt);
-
 			release_region(ixj[cnt].XILINXbase, 8);
 		}
 		if (ixj[cnt].cardtype == 400 || ixj[cnt].cardtype == 500) {
@@ -4676,17 +6107,22 @@
 		if (ixj[cnt].dev)
 			ixj[cnt].dev->deactivate(ixj[cnt].dev);
 #endif
+#ifdef CONFIG_PCMCIA
+		DEBUG(0, "ixj_cs: unloading\n");
+		unregister_pcmcia_driver(&dev_info);
+		while (dev_list != NULL)
+			ixj_detach(dev_list);
+#endif
 	}
 	proc_unregister(&proc_root, ixj_proc_entry.low_ino);
+	proc_unregister(&proc_root, ixjfsk_proc_entry.low_ino);
 }
 
-
 // Typedefs
 typedef struct {
 	BYTE length;
 	DWORD bits;
 } DATABLOCK;
-
 static void PCIEE_WriteBit(WORD wEEPROMAddress, BYTE lastLCC, BYTE byData)
 {
 	lastLCC = lastLCC & 0xfb;
@@ -4699,7 +6135,6 @@
 
 	byData = byData << 1;
 	lastLCC = lastLCC & 0xfe;
-
 	udelay(1000);
 	outb(lastLCC, wEEPROMAddress);	//after delay, SK falling edge
 
@@ -4724,11 +6159,8 @@
 	WORD wEEPROMAddress = wAddress + 3;
 	DWORD i;
 	BYTE byResult;
-
 	*pwResult = 0;
-
 	lastLCC = inb(wEEPROMAddress);
-
 	lastLCC = lastLCC | 0x02;
 	lastLCC = lastLCC & 0xfe;
 	outb(lastLCC, wEEPROMAddress);	// CS hi, SK lo
@@ -4738,7 +6170,6 @@
 	PCIEE_WriteBit(wEEPROMAddress, lastLCC, 1);
 	PCIEE_WriteBit(wEEPROMAddress, lastLCC, 1);
 	PCIEE_WriteBit(wEEPROMAddress, lastLCC, 0);
-
 	for (i = 0; i < 8; i++) {
 		PCIEE_WriteBit(wEEPROMAddress, lastLCC, wLoc & 0x80 ? 1 : 0);
 		wLoc <<= 1;
@@ -4760,27 +6191,29 @@
 static DWORD PCIEE_GetSerialNumber(WORD wAddress)
 {
 	WORD wLo, wHi;
-
 	if (PCIEE_ReadWord(wAddress, 62, &wLo))
 		return 0;
-
 	if (PCIEE_ReadWord(wAddress, 63, &wHi))
 		return 0;
-
 	return (((DWORD) wHi << 16) | wLo);
 }
 
-static int dspio[IXJMAX + 1] = {0,};
-static int xio[IXJMAX + 1] = {0,};
-
-MODULE_DESCRIPTION("Internet PhoneJACK/Internet LineJACK module - www.quicknet.net");
-MODULE_AUTHOR("Ed Okerson <eokerson@quicknet.net>");
+#ifndef CONFIG_PCMCIA
+#ifndef CONFIG_ISAPNP
+static int dspio[IXJMAX + 1] =
+{
+	0,
+};
+static int xio[IXJMAX + 1] =
+{
+	0,
+};
 
 MODULE_PARM(dspio, "1-" __MODULE_STRING(IXJMAX) "i");
 MODULE_PARM(xio, "1-" __MODULE_STRING(IXJMAX) "i");
-
+#endif
+#endif
 #ifdef MODULE
-
 void cleanup_module(void)
 {
 	cleanup();
@@ -4792,23 +6225,35 @@
 #endif
 {
 	int result;
-
-	int func = 0x110, i = 0;
+	int i = 0;
 	int cnt = 0;
 	int probe = 0;
+#ifdef CONFIG_ISAPNP
+	int func = 0x110;
 	struct pnp_dev *dev = NULL, *old_dev = NULL;
+#endif
+#ifdef CONFIG_PCI
 	struct pci_dev *pci = NULL;
-
+#endif
+#ifdef CONFIG_PCMCIA
+	servinfo_t serv;
+	DEBUG(0, "%s\n", version);
+	CardServices(GetCardServicesInfo, &serv);
+	if (serv.Revision != CS_RELEASE_CODE) {
+		printk(KERN_NOTICE "ixj_cs: Card Services release does not match!\n");
+		return -1;
+	}
+	register_pcmcia_driver(&dev_info, &ixj_attach, &ixj_detach);
+	probe = 0;
+#else
 #ifdef CONFIG_ISAPNP
 	while (1) {
 		do {
 			old_dev = dev;
 			dev = isapnp_find_dev(NULL, ISAPNP_VENDOR('Q', 'T', 'I'),
 					 ISAPNP_FUNCTION(func), old_dev);
-//(old_dev==NULL?NULL:old_dev));
 			if (!dev)
 				break;
-			printk("preparing %x\n", func);
 			result = dev->prepare(dev);
 			if (result < 0) {
 				printk("preparing failed %d \n", result);
@@ -4826,7 +6271,6 @@
 			ixj[cnt].DSPbase = dev->resource[0].start;	/* get real port */
 			if (func != 0x110)
 				ixj[cnt].XILINXbase = dev->resource[1].start;	/* get real port */
-
 			result = check_region(ixj[cnt].DSPbase, 16);
 			if (result) {
 				printk(KERN_INFO "ixj: can't get I/O address 0x%x\n", ixj[cnt].DSPbase);
@@ -4846,13 +6290,21 @@
 				break;
 			}
 			probe = ixj_selfprobe(cnt);
-
 			ixj[cnt].serial = dev->bus->serial;
 			ixj[cnt].dev = dev;
-			printk(KERN_INFO "ixj: found card at 0x%x\n", ixj[cnt].DSPbase);
+			switch (func) {
+			case 0x110:
+				printk(KERN_INFO "ixj: found Internet PhoneJACK at 0x%x\n", ixj[cnt].DSPbase);
+				break;
+			case 0x310:
+				printk(KERN_INFO "ixj: found Internet LineJACK at 0x%x\n", ixj[cnt].DSPbase);
+				break;
+			case 0x410:
+				printk(KERN_INFO "ixj: found Internet PhoneJACK Lite at 0x%x\n", ixj[cnt].DSPbase);
+				break;
+			}
 			cnt++;
 		} while (dev);
-
 		if (func == 0x410)
 			break;
 		if (func == 0x310)
@@ -4863,11 +6315,10 @@
 	}
 #else				//CONFIG_ISAPNP
 	/* Use passed parameters for older kernels without PnP */
-
-	for (cnt = 0; cnt < IXJMAX; cnt++) {
-		if (dspio[cnt]) {
-			ixj[cnt].DSPbase = dspio[cnt];
-			ixj[cnt].XILINXbase = xio[cnt];
+	for (i = 0; i < IXJMAX; i++) {
+		if (dspio[i]) {
+			ixj[cnt].DSPbase = dspio[i];
+			ixj[cnt].XILINXbase = xio[i];
 			ixj[cnt].cardtype = 0;
 			result = check_region(ixj[cnt].DSPbase, 16);
 			if (result) {
@@ -4878,9 +6329,11 @@
 			request_region(ixj[cnt].DSPbase, 16, "ixj DSP");
 			probe = ixj_selfprobe(cnt);
 			ixj[cnt].dev = NULL;
+			cnt++;
 		}
 	}
-#endif
+#endif				// !CONFIG_ISAPNP
+#endif				// CONFIG_PCMCIA
 #ifdef CONFIG_PCI
 	if (pci_present()) {
 		for (i = 0; i < IXJMAX - cnt; i++) {
@@ -4891,7 +6344,6 @@
 				ixj[cnt].DSPbase = pci->base_address[0] & PCI_BASE_ADDRESS_IO_MASK;
 				ixj[cnt].XILINXbase = ixj[cnt].DSPbase + 0x10;
 				ixj[cnt].serial = PCIEE_GetSerialNumber(pci->base_address[2] & PCI_BASE_ADDRESS_IO_MASK);
-
 				result = check_region(ixj[cnt].DSPbase, 16);
 				if (result) {
 					printk(KERN_INFO "ixj: can't get I/O address 0x%x\n", ixj[cnt].DSPbase);
@@ -4901,43 +6353,35 @@
 				request_region(ixj[cnt].DSPbase, 16, "ixj DSP");
 				ixj[cnt].cardtype = 500;
 				probe = ixj_selfprobe(cnt);
+				if (probe)
+					printk(KERN_INFO "ixj: found Internet PhoneJACK PCI at 0x%x\n", ixj[cnt].DSPbase);
 				cnt++;
 			}
 		}
 	}
 #endif
 	printk("%s\n", ixj_c_rcsid);
-
-//  result = register_chrdev(ixj_major, "ixj", &ixj_fops);
-	//  if (result < 0) {
-	//    printk(KERN_INFO "ixj: can't get major number\n");
-	//    cleanup();
-	//    return result;
-	//  }
-	//  if (ixj_major == 0)
-	//    ixj_major = result;               /* dynamic */
-
 	proc_register(&proc_root, &ixj_proc_entry);
-
+	proc_register(&proc_root, &ixjfsk_proc_entry);
 	ixj_init_timer();
-	ixj_add_timer();	
+	ixj_add_timer();
 	return probe;
 }
 
 static void DAA_Coeff_US(int board)
 {
 	IXJ *j = &ixj[board];
-
 	int i;
 
+	j->daa_country = DAA_US;
 	//-----------------------------------------------
 	// CAO
 	for (i = 0; i < ALISDAA_CALLERID_SIZE; i++) {
 		j->m_DAAShadowRegs.CAO_REGS.CAO.CallerID[i] = 0;
 	}
 
-	// Bytes for IM-filter part 1 (04): 0E,32,E2,2F,C2,5A,C0,00
-	    j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[7] = 0x0E;
+// Bytes for IM-filter part 1 (04): 0E,32,E2,2F,C2,5A,C0,00
+	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[7] = 0x0E;
 	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[6] = 0x32;
 	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[5] = 0xE2;
 	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[4] = 0x2F;
@@ -4945,7 +6389,6 @@
 	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[2] = 0x5A;
 	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[1] = 0xC0;
 	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[0] = 0x00;
-
 // Bytes for IM-filter part 2 (05): 72,85,00,0E,2B,3A,D0,08
 	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[7] = 0x72;
 	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[6] = 0x85;
@@ -4955,7 +6398,6 @@
 	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[2] = 0x3A;
 	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[1] = 0xD0;
 	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[0] = 0x08;
-
 // Bytes for FRX-filter       (08): 03,8F,48,F2,8F,48,70,08
 	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[7] = 0x03;
 	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[6] = 0x8F;
@@ -4965,7 +6407,6 @@
 	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[2] = 0x48;
 	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[1] = 0x70;
 	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[0] = 0x08;
-
 // Bytes for FRR-filter       (07): 04,8F,38,7F,9B,EA,B0,08
 	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[7] = 0x04;
 	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[6] = 0x8F;
@@ -4975,19 +6416,16 @@
 	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[2] = 0xEA;
 	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[1] = 0xB0;
 	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[0] = 0x08;
-
 // Bytes for AX-filter        (0A): 16,55,DD,CA
 	j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[3] = 0x16;
 	j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[2] = 0x55;
 	j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[1] = 0xDD;
 	j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[0] = 0xCA;
-
 // Bytes for AR-filter        (09): 52,D3,11,42
 	j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[3] = 0x52;
 	j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[2] = 0xD3;
 	j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[1] = 0x11;
 	j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[0] = 0x42;
-
 // Bytes for TH-filter part 1 (00): 00,42,48,81,B3,80,00,98
 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[7] = 0x00;
 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[6] = 0x42;
@@ -4997,7 +6435,6 @@
 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[2] = 0x80;
 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[1] = 0x00;
 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[0] = 0x98;
-
 // Bytes for TH-filter part 2 (01): 02,F2,33,A0,68,AB,8A,AD
 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[7] = 0x02;
 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[6] = 0xF2;
@@ -5007,7 +6444,6 @@
 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[2] = 0xAB;
 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[1] = 0x8A;
 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[0] = 0xAD;
-
 // Bytes for TH-filter part 3 (02): 00,88,DA,54,A4,BA,2D,BB
 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[7] = 0x00;
 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[6] = 0x88;
@@ -5017,7 +6453,6 @@
 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[2] = 0xBA;
 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[1] = 0x2D;
 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[0] = 0xBB;
-
 // ;  (10K, 0.68uF)
 	// 
 	// Bytes for Ringing part 1 (03):1B,3B,9B,BA,D4,1C,B3,23
@@ -5029,7 +6464,6 @@
 	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[2] = 0x1C;
 	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[1] = 0xB3;
 	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[0] = 0x23;
-
 // Bytes for Ringing part 2 (06):13,42,A6,BA,D4,73,CA,D5
 	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[7] = 0x13;
 	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[6] = 0x42;
@@ -5039,14 +6473,12 @@
 	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[2] = 0x73;
 	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[1] = 0xCA;
 	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[0] = 0xD5;
-
 // 
 	// Levelmetering Ringing        (0D):B2,45,0F,8E      
 	j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[3] = 0xB2;
 	j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[2] = 0x45;
 	j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[1] = 0x0F;
 	j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[0] = 0x8E;
-
 // Caller ID 1st Tone           (0E):CA,0E,CA,09,99,99,99,99
 	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[7] = 0xCA;
 	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[6] = 0x0E;
@@ -5056,7 +6488,6 @@
 	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[2] = 0x99;
 	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[1] = 0x99;
 	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[0] = 0x99;
-
 // Caller ID 2nd Tone           (0F):FD,B5,BA,07,DA,00,00,00
 	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[7] = 0xFD;
 	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[6] = 0xB5;
@@ -5066,64 +6497,52 @@
 	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[2] = 0x00;
 	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[1] = 0x00;
 	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[0] = 0x00;
-
 // 
 	// ;CR Registers
 	// Config. Reg. 0 (filters)       (cr0):FE ; CLK gen. by crystal
-	j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg = 0xFE;
-
+	j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg = 0xFF;
 // Config. Reg. 1 (dialing)       (cr1):05
 	j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.reg = 0x05;
-
 // Config. Reg. 2 (caller ID)     (cr2):04
 	j->m_DAAShadowRegs.SOP_REGS.SOP.cr2.reg = 0x04;
-
 // Config. Reg. 3 (testloops)     (cr3):03 ; SEL Bit==0, HP-disabled
 	j->m_DAAShadowRegs.SOP_REGS.SOP.cr3.reg = 0x03;
-
 // Config. Reg. 4 (analog gain)   (cr4):01
 	j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg = 0x02;		//0x01;
-
-// Config. Reg. 5 (Version)       (cr5):02
+	// Config. Reg. 5 (Version)       (cr5):02
 	// Config. Reg. 6 (Reserved)      (cr6):00
 	// Config. Reg. 7 (Reserved)      (cr7):00
 	// 
-
-// ;xr Registers
+	// ;xr Registers
 	// Ext. Reg. 0 (Interrupt Reg.)   (xr0):02
+
 	j->m_DAAShadowRegs.XOP_xr0_W.reg = 0x02;	// SO_1 set to '1' because it is inverted.
+	// Ext. Reg. 1 (Interrupt enable) (xr1):1C // Cadence, RING, Caller ID, VDD_OK
 
-// Ext. Reg. 1 (Interrupt enable) (xr1):1C // Cadence, RING, Caller ID, VDD_OK
 	j->m_DAAShadowRegs.XOP_REGS.XOP.xr1.reg = 0x3C;
-
 // Ext. Reg. 2 (Cadence Time Out) (xr2):7D
 	j->m_DAAShadowRegs.XOP_REGS.XOP.xr2.reg = 0x7D;
-
 // Ext. Reg. 3 (DC Char)          (xr3):32 ; B-Filter Off == 1
 	j->m_DAAShadowRegs.XOP_REGS.XOP.xr3.reg = 0x12;		//0x32;
+	// Ext. Reg. 4 (Cadence)          (xr4):00
 
-// Ext. Reg. 4 (Cadence)          (xr4):00
 	j->m_DAAShadowRegs.XOP_REGS.XOP.xr4.reg = 0x00;
-
 // Ext. Reg. 5 (Ring timer)       (xr5):22
 	j->m_DAAShadowRegs.XOP_REGS.XOP.xr5.reg = 0x22;
-
 // Ext. Reg. 6 (Power State)      (xr6):00
 	j->m_DAAShadowRegs.XOP_xr6_W.reg = 0x00;
-
 // Ext. Reg. 7 (Vdd)              (xr7):40
 	j->m_DAAShadowRegs.XOP_REGS.XOP.xr7.reg = 0x40;		// 0x40 ??? Should it be 0x00?
-
-// 
+	// 
 	// DTMF Tone 1                     (0B): 11,B3,5A,2C ;   697 Hz  
 	//                                       12,33,5A,C3 ;  770 Hz  
 	//                                       13,3C,5B,32 ;  852 Hz  
 	//                                       1D,1B,5C,CC ;  941 Hz  
+
 	j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[3] = 0x11;
 	j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[2] = 0xB3;
 	j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[1] = 0x5A;
 	j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[0] = 0x2C;
-
 // DTMF Tone 2                     (0C): 32,32,52,B3 ;  1209 Hz  
 	//                                       EC,1D,52,22 ;  1336 Hz  
 	//                                       AA,AC,51,D2 ;  1477 Hz  
@@ -5132,23 +6551,22 @@
 	j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[2] = 0x32;
 	j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[1] = 0x52;
 	j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[0] = 0xB3;
-
 }
 
 static void DAA_Coeff_UK(int board)
 {
 	IXJ *j = &ixj[board];
-
 	int i;
 
+	j->daa_country = DAA_UK;
 	//-----------------------------------------------
 	// CAO
 	for (i = 0; i < ALISDAA_CALLERID_SIZE; i++) {
 		j->m_DAAShadowRegs.CAO_REGS.CAO.CallerID[i] = 0;
 	}
 
-	//  Bytes for IM-filter part 1 (04): 00,C2,BB,A8,CB,81,A0,00
-	    j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[7] = 0x00;
+//  Bytes for IM-filter part 1 (04): 00,C2,BB,A8,CB,81,A0,00
+	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[7] = 0x00;
 	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[6] = 0xC2;
 	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[5] = 0xBB;
 	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[4] = 0xA8;
@@ -5156,8 +6574,7 @@
 	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[2] = 0x81;
 	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[1] = 0xA0;
 	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[0] = 0x00;
-
-	// Bytes for IM-filter part 2 (05): 40,00,00,0A,A4,33,E0,08
+// Bytes for IM-filter part 2 (05): 40,00,00,0A,A4,33,E0,08
 	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[7] = 0x40;
 	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[6] = 0x00;
 	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[5] = 0x00;
@@ -5166,7 +6583,6 @@
 	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[2] = 0x33;
 	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[1] = 0xE0;
 	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[0] = 0x08;
-
 // Bytes for FRX-filter       (08): 07,9B,ED,24,B2,A2,A0,08
 	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[7] = 0x07;
 	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[6] = 0x9B;
@@ -5176,7 +6592,6 @@
 	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[2] = 0xA2;
 	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[1] = 0xA0;
 	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[0] = 0x08;
-
 // Bytes for FRR-filter       (07): 0F,92,F2,B2,87,D2,30,08
 	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[7] = 0x0F;
 	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[6] = 0x92;
@@ -5186,19 +6601,16 @@
 	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[2] = 0xD2;
 	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[1] = 0x30;
 	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[0] = 0x08;
-
 // Bytes for AX-filter        (0A): 1B,A5,DD,CA
 	j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[3] = 0x1B;
 	j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[2] = 0xA5;
 	j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[1] = 0xDD;
 	j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[0] = 0xCA;
-
 // Bytes for AR-filter        (09): E2,27,10,D6
 	j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[3] = 0xE2;
 	j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[2] = 0x27;
 	j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[1] = 0x10;
 	j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[0] = 0xD6;
-
 // Bytes for TH-filter part 1 (00): 80,2D,38,8B,D0,00,00,98
 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[7] = 0x80;
 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[6] = 0x2D;
@@ -5208,7 +6620,6 @@
 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[2] = 0x00;
 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[1] = 0x00;
 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[0] = 0x98;
-
 // Bytes for TH-filter part 2 (01): 02,5A,53,F0,0B,5F,84,D4
 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[7] = 0x02;
 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[6] = 0x5A;
@@ -5218,7 +6629,6 @@
 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[2] = 0x5F;
 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[1] = 0x84;
 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[0] = 0xD4;
-
 // Bytes for TH-filter part 3 (02): 00,88,6A,A4,8F,52,F5,32
 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[7] = 0x00;
 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[6] = 0x88;
@@ -5228,10 +6638,8 @@
 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[2] = 0x52;
 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[1] = 0xF5;
 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[0] = 0x32;
-
 // ; idle
-
-// Bytes for Ringing part 1 (03):1B,3C,93,3A,22,12,A3,23
+	// Bytes for Ringing part 1 (03):1B,3C,93,3A,22,12,A3,23
 	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[7] = 0x1B;
 	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[6] = 0x3C;
 	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[5] = 0x93;
@@ -5240,7 +6648,6 @@
 	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[2] = 0x12;
 	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[1] = 0xA3;
 	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[0] = 0x23;
-
 // Bytes for Ringing part 2 (06):12,A2,A6,BA,22,7A,0A,D5
 	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[7] = 0x12;
 	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[6] = 0xA2;
@@ -5250,13 +6657,11 @@
 	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[2] = 0x7A;
 	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[1] = 0x0A;
 	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[0] = 0xD5;
-
 // Levelmetering Ringing           (0D):AA,35,0F,8E     ; 25Hz 30V less possible?
 	j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[3] = 0xAA;
 	j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[2] = 0x35;
 	j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[1] = 0x0F;
 	j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[0] = 0x8E;
-
 // Caller ID 1st Tone              (0E):CA,0E,CA,09,99,99,99,99
 	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[7] = 0xCA;
 	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[6] = 0x0E;
@@ -5266,7 +6671,6 @@
 	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[2] = 0x99;
 	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[1] = 0x99;
 	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[0] = 0x99;
-
 // Caller ID 2nd Tone              (0F):FD,B5,BA,07,DA,00,00,00
 	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[7] = 0xFD;
 	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[6] = 0xB5;
@@ -5276,61 +6680,49 @@
 	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[2] = 0x00;
 	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[1] = 0x00;
 	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[0] = 0x00;
-
 // ;CR Registers
 	// Config. Reg. 0 (filters)        (cr0):FF
-	j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg = 0xFF;		//0xFE;
-
+	j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg = 0xFE;
 // Config. Reg. 1 (dialing)        (cr1):05
 	j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.reg = 0x05;
-
 // Config. Reg. 2 (caller ID)      (cr2):04
 	j->m_DAAShadowRegs.SOP_REGS.SOP.cr2.reg = 0x04;
-
 // Config. Reg. 3 (testloops)      (cr3):00        ; 
 	j->m_DAAShadowRegs.SOP_REGS.SOP.cr3.reg = 0x00;
-
 // Config. Reg. 4 (analog gain)    (cr4):01
 	j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg = 0x02;		//0x01;
-
-// Config. Reg. 5 (Version)        (cr5):02
+	// Config. Reg. 5 (Version)        (cr5):02
 	// Config. Reg. 6 (Reserved)       (cr6):00
 	// Config. Reg. 7 (Reserved)       (cr7):00
-
-// ;xr Registers
+	// ;xr Registers
 	// Ext. Reg. 0 (Interrupt Reg.)    (xr0):02
+
 	j->m_DAAShadowRegs.XOP_xr0_W.reg = 0x02;	// SO_1 set to '1' because it is inverted.
+	// Ext. Reg. 1 (Interrupt enable)  (xr1):1C
 
-// Ext. Reg. 1 (Interrupt enable)  (xr1):1C
 	j->m_DAAShadowRegs.XOP_REGS.XOP.xr1.reg = 0x1C;		// RING, Caller ID, VDD_OK
+	// Ext. Reg. 2 (Cadence Time Out)  (xr2):7D
 
-// Ext. Reg. 2 (Cadence Time Out)  (xr2):7D
 	j->m_DAAShadowRegs.XOP_REGS.XOP.xr2.reg = 0x7D;
-
 // Ext. Reg. 3 (DC Char)           (xr3):36        ; 
 	j->m_DAAShadowRegs.XOP_REGS.XOP.xr3.reg = 0x36;
-
 // Ext. Reg. 4 (Cadence)           (xr4):00
 	j->m_DAAShadowRegs.XOP_REGS.XOP.xr4.reg = 0x00;
-
 // Ext. Reg. 5 (Ring timer)        (xr5):22
 	j->m_DAAShadowRegs.XOP_REGS.XOP.xr5.reg = 0x22;
-
 // Ext. Reg. 6 (Power State)       (xr6):00
 	j->m_DAAShadowRegs.XOP_xr6_W.reg = 0x00;
-
 // Ext. Reg. 7 (Vdd)               (xr7):46
 	j->m_DAAShadowRegs.XOP_REGS.XOP.xr7.reg = 0x46;		// 0x46 ??? Should it be 0x00?
-
-// DTMF Tone 1                     (0B): 11,B3,5A,2C    ;   697 Hz  
+	// DTMF Tone 1                     (0B): 11,B3,5A,2C    ;   697 Hz  
 	//                                       12,33,5A,C3    ;  770 Hz  
 	//                                       13,3C,5B,32    ;  852 Hz  
 	//                                       1D,1B,5C,CC    ;  941 Hz  
+
 	j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[3] = 0x11;
 	j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[2] = 0xB3;
 	j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[1] = 0x5A;
 	j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[0] = 0x2C;
-
 // DTMF Tone 2                     (0C): 32,32,52,B3    ;  1209 Hz  
 	//                                       EC,1D,52,22    ;  1336 Hz  
 	//                                       AA,AC,51,D2    ;  1477 Hz  
@@ -5339,24 +6731,23 @@
 	j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[2] = 0x32;
 	j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[1] = 0x52;
 	j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[0] = 0xB3;
-
 }
 
 
 static void DAA_Coeff_France(int board)
 {
 	IXJ *j = &ixj[board];
-
 	int i;
 
+	j->daa_country = DAA_FRANCE;
 	//-----------------------------------------------
 	// CAO
 	for (i = 0; i < ALISDAA_CALLERID_SIZE; i++) {
 		j->m_DAAShadowRegs.CAO_REGS.CAO.CallerID[i] = 0;
 	}
 
-	// Bytes for IM-filter part 1 (04): 02,A2,43,2C,22,AF,A0,00
-	    j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[7] = 0x02;
+// Bytes for IM-filter part 1 (04): 02,A2,43,2C,22,AF,A0,00
+	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[7] = 0x02;
 	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[6] = 0xA2;
 	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[5] = 0x43;
 	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[4] = 0x2C;
@@ -5364,7 +6755,6 @@
 	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[2] = 0xAF;
 	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[1] = 0xA0;
 	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[0] = 0x00;
-
 // Bytes for IM-filter part 2 (05): 67,CE,00,0C,22,33,E0,08
 	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[7] = 0x67;
 	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[6] = 0xCE;
@@ -5374,7 +6764,6 @@
 	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[2] = 0x33;
 	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[1] = 0xE0;
 	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[0] = 0x08;
-
 // Bytes for FRX-filter       (08): 07,9A,28,F6,23,4A,B0,08
 	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[7] = 0x07;
 	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[6] = 0x9A;
@@ -5384,7 +6773,6 @@
 	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[2] = 0x4A;
 	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[1] = 0xB0;
 	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[0] = 0x08;
-
 // Bytes for FRR-filter       (07): 03,8F,F9,2F,9E,FA,20,08
 	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[7] = 0x03;
 	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[6] = 0x8F;
@@ -5394,19 +6782,16 @@
 	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[2] = 0xFA;
 	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[1] = 0x20;
 	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[0] = 0x08;
-
 // Bytes for AX-filter        (0A): 16,B5,DD,CA
 	j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[3] = 0x16;
 	j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[2] = 0xB5;
 	j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[1] = 0xDD;
 	j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[0] = 0xCA;
-
 // Bytes for AR-filter        (09): 52,C7,10,D6
 	j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[3] = 0xE2;
 	j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[2] = 0xC7;
 	j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[1] = 0x10;
 	j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[0] = 0xD6;
-
 // Bytes for TH-filter part 1 (00): 00,42,48,81,A6,80,00,98
 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[7] = 0x00;
 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[6] = 0x42;
@@ -5416,7 +6801,6 @@
 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[2] = 0x80;
 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[1] = 0x00;
 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[0] = 0x98;
-
 // Bytes for TH-filter part 2 (01): 02,AC,2A,30,78,AC,8A,2C
 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[7] = 0x02;
 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[6] = 0xAC;
@@ -5426,7 +6810,6 @@
 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[2] = 0xAC;
 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[1] = 0x8A;
 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[0] = 0x2C;
-
 // Bytes for TH-filter part 3 (02): 00,88,DA,A5,22,BA,2C,45
 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[7] = 0x00;
 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[6] = 0x88;
@@ -5436,10 +6819,8 @@
 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[2] = 0xBA;
 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[1] = 0x2C;
 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[0] = 0x45;
-
 // ; idle
-
-// Bytes for Ringing part 1 (03):1B,3C,93,3A,22,12,A3,23
+	// Bytes for Ringing part 1 (03):1B,3C,93,3A,22,12,A3,23
 	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[7] = 0x1B;
 	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[6] = 0x3C;
 	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[5] = 0x93;
@@ -5448,7 +6829,6 @@
 	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[2] = 0x12;
 	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[1] = 0xA3;
 	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[0] = 0x23;
-
 // Bytes for Ringing part 2 (06):12,A2,A6,BA,22,7A,0A,D5
 	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[7] = 0x12;
 	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[6] = 0xA2;
@@ -5458,13 +6838,11 @@
 	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[2] = 0x7A;
 	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[1] = 0x0A;
 	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[0] = 0xD5;
-
 // Levelmetering Ringing           (0D):32,45,B5,84     ; 50Hz 20V
 	j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[3] = 0x32;
 	j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[2] = 0x45;
 	j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[1] = 0xB5;
 	j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[0] = 0x84;
-
 // Caller ID 1st Tone              (0E):CA,0E,CA,09,99,99,99,99
 	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[7] = 0xCA;
 	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[6] = 0x0E;
@@ -5474,7 +6852,6 @@
 	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[2] = 0x99;
 	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[1] = 0x99;
 	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[0] = 0x99;
-
 // Caller ID 2nd Tone              (0F):FD,B5,BA,07,DA,00,00,00
 	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[7] = 0xFD;
 	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[6] = 0xB5;
@@ -5484,61 +6861,49 @@
 	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[2] = 0x00;
 	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[1] = 0x00;
 	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[0] = 0x00;
-
 // ;CR Registers
 	// Config. Reg. 0 (filters)        (cr0):FF
-	j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg = 0xFF;
-
+	j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg = 0xFE;
 // Config. Reg. 1 (dialing)        (cr1):05
 	j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.reg = 0x05;
-
 // Config. Reg. 2 (caller ID)      (cr2):04
 	j->m_DAAShadowRegs.SOP_REGS.SOP.cr2.reg = 0x04;
-
 // Config. Reg. 3 (testloops)      (cr3):00        ; 
 	j->m_DAAShadowRegs.SOP_REGS.SOP.cr3.reg = 0x00;
-
 // Config. Reg. 4 (analog gain)    (cr4):01
 	j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg = 0x02;		//0x01;
-
-// Config. Reg. 5 (Version)        (cr5):02
+	// Config. Reg. 5 (Version)        (cr5):02
 	// Config. Reg. 6 (Reserved)       (cr6):00
 	// Config. Reg. 7 (Reserved)       (cr7):00
-
-// ;xr Registers
+	// ;xr Registers
 	// Ext. Reg. 0 (Interrupt Reg.)    (xr0):02
+
 	j->m_DAAShadowRegs.XOP_xr0_W.reg = 0x02;	// SO_1 set to '1' because it is inverted.
+	// Ext. Reg. 1 (Interrupt enable)  (xr1):1C
 
-// Ext. Reg. 1 (Interrupt enable)  (xr1):1C
 	j->m_DAAShadowRegs.XOP_REGS.XOP.xr1.reg = 0x1C;		// RING, Caller ID, VDD_OK
+	// Ext. Reg. 2 (Cadence Time Out)  (xr2):7D
 
-// Ext. Reg. 2 (Cadence Time Out)  (xr2):7D
 	j->m_DAAShadowRegs.XOP_REGS.XOP.xr2.reg = 0x7D;
-
 // Ext. Reg. 3 (DC Char)           (xr3):36        ; 
 	j->m_DAAShadowRegs.XOP_REGS.XOP.xr3.reg = 0x36;
-
 // Ext. Reg. 4 (Cadence)           (xr4):00
 	j->m_DAAShadowRegs.XOP_REGS.XOP.xr4.reg = 0x00;
-
 // Ext. Reg. 5 (Ring timer)        (xr5):22
 	j->m_DAAShadowRegs.XOP_REGS.XOP.xr5.reg = 0x22;
-
 // Ext. Reg. 6 (Power State)       (xr6):00
 	j->m_DAAShadowRegs.XOP_xr6_W.reg = 0x00;
-
 // Ext. Reg. 7 (Vdd)               (xr7):46
 	j->m_DAAShadowRegs.XOP_REGS.XOP.xr7.reg = 0x46;		// 0x46 ??? Should it be 0x00?
-
-// DTMF Tone 1                     (0B): 11,B3,5A,2C    ;   697 Hz  
+	// DTMF Tone 1                     (0B): 11,B3,5A,2C    ;   697 Hz  
 	//                                       12,33,5A,C3    ;  770 Hz  
 	//                                       13,3C,5B,32    ;  852 Hz  
 	//                                       1D,1B,5C,CC    ;  941 Hz  
+
 	j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[3] = 0x11;
 	j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[2] = 0xB3;
 	j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[1] = 0x5A;
 	j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[0] = 0x2C;
-
 // DTMF Tone 2                     (0C): 32,32,52,B3    ;  1209 Hz  
 	//                                       EC,1D,52,22    ;  1336 Hz  
 	//                                       AA,AC,51,D2    ;  1477 Hz  
@@ -5547,24 +6912,23 @@
 	j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[2] = 0x32;
 	j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[1] = 0x52;
 	j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[0] = 0xB3;
-
 }
 
 
 static void DAA_Coeff_Germany(int board)
 {
 	IXJ *j = &ixj[board];
-
 	int i;
 
+	j->daa_country = DAA_GERMANY;
 	//-----------------------------------------------
 	// CAO
 	for (i = 0; i < ALISDAA_CALLERID_SIZE; i++) {
 		j->m_DAAShadowRegs.CAO_REGS.CAO.CallerID[i] = 0;
 	}
 
-	// Bytes for IM-filter part 1 (04): 00,CE,BB,B8,D2,81,B0,00
-	    j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[7] = 0x00;
+// Bytes for IM-filter part 1 (04): 00,CE,BB,B8,D2,81,B0,00
+	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[7] = 0x00;
 	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[6] = 0xCE;
 	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[5] = 0xBB;
 	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[4] = 0xB8;
@@ -5572,7 +6936,6 @@
 	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[2] = 0x81;
 	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[1] = 0xB0;
 	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[0] = 0x00;
-
 // Bytes for IM-filter part 2 (05): 45,8F,00,0C,D2,3A,D0,08
 	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[7] = 0x45;
 	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[6] = 0x8F;
@@ -5582,7 +6945,6 @@
 	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[2] = 0x3A;
 	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[1] = 0xD0;
 	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[0] = 0x08;
-
 // Bytes for FRX-filter       (08): 07,AA,E2,34,24,89,20,08
 	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[7] = 0x07;
 	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[6] = 0xAA;
@@ -5592,7 +6954,6 @@
 	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[2] = 0x89;
 	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[1] = 0x20;
 	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[0] = 0x08;
-
 // Bytes for FRR-filter       (07): 02,87,FA,37,9A,CA,B0,08
 	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[7] = 0x02;
 	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[6] = 0x87;
@@ -5602,19 +6963,16 @@
 	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[2] = 0xCA;
 	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[1] = 0xB0;
 	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[0] = 0x08;
-
 // Bytes for AX-filter        (0A): 72,D5,DD,CA
 	j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[3] = 0x72;
 	j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[2] = 0xD5;
 	j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[1] = 0xDD;
 	j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[0] = 0xCA;
-
 // Bytes for AR-filter        (09): 72,42,13,4B
 	j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[3] = 0x72;
 	j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[2] = 0x42;
 	j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[1] = 0x13;
 	j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[0] = 0x4B;
-
 // Bytes for TH-filter part 1 (00): 80,52,48,81,AD,80,00,98
 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[7] = 0x80;
 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[6] = 0x52;
@@ -5624,7 +6982,6 @@
 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[2] = 0x80;
 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[1] = 0x00;
 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[0] = 0x98;
-
 // Bytes for TH-filter part 2 (01): 02,42,5A,20,E8,1A,81,27
 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[7] = 0x02;
 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[6] = 0x42;
@@ -5634,7 +6991,6 @@
 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[2] = 0x1A;
 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[1] = 0x81;
 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[0] = 0x27;
-
 // Bytes for TH-filter part 3 (02): 00,88,63,26,BD,4B,A3,C2
 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[7] = 0x00;
 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[6] = 0x88;
@@ -5644,10 +7000,8 @@
 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[2] = 0x4B;
 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[1] = 0xA3;
 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[0] = 0xC2;
-
 // ;  (10K, 0.68uF)
-
-// Bytes for Ringing part 1 (03):1B,3B,9B,BA,D4,1C,B3,23
+	// Bytes for Ringing part 1 (03):1B,3B,9B,BA,D4,1C,B3,23
 	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[7] = 0x1B;
 	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[6] = 0x3B;
 	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[5] = 0x9B;
@@ -5656,7 +7010,6 @@
 	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[2] = 0x1C;
 	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[1] = 0xB3;
 	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[0] = 0x23;
-
 // Bytes for Ringing part 2 (06):13,42,A6,BA,D4,73,CA,D5
 	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[7] = 0x13;
 	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[6] = 0x42;
@@ -5666,13 +7019,11 @@
 	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[2] = 0x73;
 	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[1] = 0xCA;
 	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[0] = 0xD5;
-
 // Levelmetering Ringing        (0D):B2,45,0F,8E      
 	j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[3] = 0xB2;
 	j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[2] = 0x45;
 	j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[1] = 0x0F;
 	j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[0] = 0x8E;
-
 // Caller ID 1st Tone           (0E):CA,0E,CA,09,99,99,99,99
 	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[7] = 0xCA;
 	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[6] = 0x0E;
@@ -5682,7 +7033,6 @@
 	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[2] = 0x99;
 	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[1] = 0x99;
 	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[0] = 0x99;
-
 // Caller ID 2nd Tone           (0F):FD,B5,BA,07,DA,00,00,00
 	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[7] = 0xFD;
 	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[6] = 0xB5;
@@ -5692,61 +7042,49 @@
 	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[2] = 0x00;
 	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[1] = 0x00;
 	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[0] = 0x00;
-
 // ;CR Registers
 	// Config. Reg. 0 (filters)        (cr0):FF ; all Filters enabled, CLK from ext. source
-	j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg = 0xFF;
-
+	j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg = 0xFE;
 // Config. Reg. 1 (dialing)        (cr1):05 ; Manual Ring, Ring metering enabled
 	j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.reg = 0x05;
-
 // Config. Reg. 2 (caller ID)      (cr2):04 ; Analog Gain 0dB, FSC internal
 	j->m_DAAShadowRegs.SOP_REGS.SOP.cr2.reg = 0x04;
-
 // Config. Reg. 3 (testloops)      (cr3):00 ; SEL Bit==0, HP-enabled
 	j->m_DAAShadowRegs.SOP_REGS.SOP.cr3.reg = 0x00;
-
 // Config. Reg. 4 (analog gain)    (cr4):01
 	j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg = 0x02;		//0x01;
-
-// Config. Reg. 5 (Version)        (cr5):02
+	// Config. Reg. 5 (Version)        (cr5):02
 	// Config. Reg. 6 (Reserved)       (cr6):00
 	// Config. Reg. 7 (Reserved)       (cr7):00
-
-// ;xr Registers
+	// ;xr Registers
 	// Ext. Reg. 0 (Interrupt Reg.)    (xr0):02
+
 	j->m_DAAShadowRegs.XOP_xr0_W.reg = 0x02;	// SO_1 set to '1' because it is inverted.
+	// Ext. Reg. 1 (Interrupt enable)  (xr1):1C ; Ring, CID, VDDOK Interrupts enabled
 
-// Ext. Reg. 1 (Interrupt enable)  (xr1):1C ; Ring, CID, VDDOK Interrupts enabled
 	j->m_DAAShadowRegs.XOP_REGS.XOP.xr1.reg = 0x1C;		// RING, Caller ID, VDD_OK
+	// Ext. Reg. 2 (Cadence Time Out)  (xr2):7D
 
-// Ext. Reg. 2 (Cadence Time Out)  (xr2):7D
 	j->m_DAAShadowRegs.XOP_REGS.XOP.xr2.reg = 0x7D;
-
 // Ext. Reg. 3 (DC Char)           (xr3):32 ; B-Filter Off==1, U0=3.5V, R=200Ohm
 	j->m_DAAShadowRegs.XOP_REGS.XOP.xr3.reg = 0x32;
-
 // Ext. Reg. 4 (Cadence)           (xr4):00
 	j->m_DAAShadowRegs.XOP_REGS.XOP.xr4.reg = 0x00;
-
 // Ext. Reg. 5 (Ring timer)        (xr5):22
 	j->m_DAAShadowRegs.XOP_REGS.XOP.xr5.reg = 0x22;
-
 // Ext. Reg. 6 (Power State)       (xr6):00
 	j->m_DAAShadowRegs.XOP_xr6_W.reg = 0x00;
-
 // Ext. Reg. 7 (Vdd)               (xr7):40 ; VDD=4.25 V
 	j->m_DAAShadowRegs.XOP_REGS.XOP.xr7.reg = 0x40;		// 0x40 ??? Should it be 0x00?
-
-// DTMF Tone 1                     (0B): 11,B3,5A,2C    ;   697 Hz  
+	// DTMF Tone 1                     (0B): 11,B3,5A,2C    ;   697 Hz  
 	//                                       12,33,5A,C3    ;  770 Hz  
 	//                                       13,3C,5B,32    ;  852 Hz  
 	//                                       1D,1B,5C,CC    ;  941 Hz  
+
 	j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[3] = 0x11;
 	j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[2] = 0xB3;
 	j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[1] = 0x5A;
 	j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[0] = 0x2C;
-
 // DTMF Tone 2                     (0C): 32,32,52,B3    ;  1209 Hz  
 	//                                       EC,1D,52,22    ;  1336 Hz  
 	//                                       AA,AC,51,D2    ;  1477 Hz  
@@ -5755,24 +7093,23 @@
 	j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[2] = 0x32;
 	j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[1] = 0x52;
 	j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[0] = 0xB3;
-
 }
 
 
 static void DAA_Coeff_Australia(int board)
 {
 	IXJ *j = &ixj[board];
-
 	int i;
 
+	j->daa_country = DAA_AUSTRALIA;
 	//-----------------------------------------------
 	// CAO
 	for (i = 0; i < ALISDAA_CALLERID_SIZE; i++) {
 		j->m_DAAShadowRegs.CAO_REGS.CAO.CallerID[i] = 0;
 	}
 
-	// Bytes for IM-filter part 1 (04): 00,A3,AA,28,B3,82,D0,00
-	    j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[7] = 0x00;
+// Bytes for IM-filter part 1 (04): 00,A3,AA,28,B3,82,D0,00
+	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[7] = 0x00;
 	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[6] = 0xA3;
 	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[5] = 0xAA;
 	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[4] = 0x28;
@@ -5780,7 +7117,6 @@
 	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[2] = 0x82;
 	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[1] = 0xD0;
 	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[0] = 0x00;
-
 // Bytes for IM-filter part 2 (05): 70,96,00,09,32,6B,C0,08
 	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[7] = 0x70;
 	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[6] = 0x96;
@@ -5790,7 +7126,6 @@
 	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[2] = 0x6B;
 	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[1] = 0xC0;
 	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[0] = 0x08;
-
 // Bytes for FRX-filter       (08): 07,96,E2,34,32,9B,30,08
 	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[7] = 0x07;
 	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[6] = 0x96;
@@ -5800,7 +7135,6 @@
 	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[2] = 0x9B;
 	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[1] = 0x30;
 	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[0] = 0x08;
-
 // Bytes for FRR-filter       (07): 0F,9A,E9,2F,22,CC,A0,08
 	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[7] = 0x0F;
 	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[6] = 0x9A;
@@ -5810,19 +7144,16 @@
 	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[2] = 0xCC;
 	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[1] = 0xA0;
 	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[0] = 0x08;
-
 // Bytes for AX-filter        (0A): CB,45,DD,CA
 	j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[3] = 0xCB;
 	j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[2] = 0x45;
 	j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[1] = 0xDD;
 	j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[0] = 0xCA;
-
 // Bytes for AR-filter        (09): 1B,67,10,D6
 	j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[3] = 0x1B;
 	j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[2] = 0x67;
 	j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[1] = 0x10;
 	j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[0] = 0xD6;
-
 // Bytes for TH-filter part 1 (00): 80,52,48,81,AF,80,00,98
 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[7] = 0x80;
 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[6] = 0x52;
@@ -5832,7 +7163,6 @@
 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[2] = 0x80;
 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[1] = 0x00;
 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[0] = 0x98;
-
 // Bytes for TH-filter part 2 (01): 02,DB,52,B0,38,01,82,AC
 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[7] = 0x02;
 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[6] = 0xDB;
@@ -5842,7 +7172,6 @@
 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[2] = 0x01;
 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[1] = 0x82;
 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[0] = 0xAC;
-
 // Bytes for TH-filter part 3 (02): 00,88,4A,3E,2C,3B,24,46
 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[7] = 0x00;
 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[6] = 0x88;
@@ -5852,10 +7181,8 @@
 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[2] = 0x3B;
 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[1] = 0x24;
 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[0] = 0x46;
-
 // ;  idle
-
-// Bytes for Ringing part 1 (03):1B,3C,93,3A,22,12,A3,23
+	// Bytes for Ringing part 1 (03):1B,3C,93,3A,22,12,A3,23
 	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[7] = 0x1B;
 	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[6] = 0x3C;
 	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[5] = 0x93;
@@ -5864,7 +7191,6 @@
 	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[2] = 0x12;
 	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[1] = 0xA3;
 	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[0] = 0x23;
-
 // Bytes for Ringing part 2 (06):12,A2,A6,BA,22,7A,0A,D5
 	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[7] = 0x12;
 	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[6] = 0xA2;
@@ -5874,13 +7200,11 @@
 	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[2] = 0x7A;
 	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[1] = 0x0A;
 	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[0] = 0xD5;
-
 // Levelmetering Ringing           (0D):32,45,B5,84   ; 50Hz 20V
 	j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[3] = 0x32;
 	j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[2] = 0x45;
 	j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[1] = 0xB5;
 	j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[0] = 0x84;
-
 // Caller ID 1st Tone              (0E):CA,0E,CA,09,99,99,99,99
 	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[7] = 0xCA;
 	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[6] = 0x0E;
@@ -5890,7 +7214,6 @@
 	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[2] = 0x99;
 	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[1] = 0x99;
 	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[0] = 0x99;
-
 // Caller ID 2nd Tone              (0F):FD,B5,BA,07,DA,00,00,00
 	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[7] = 0xFD;
 	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[6] = 0xB5;
@@ -5900,61 +7223,49 @@
 	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[2] = 0x00;
 	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[1] = 0x00;
 	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[0] = 0x00;
-
 // ;CR Registers
 	// Config. Reg. 0 (filters)        (cr0):FF
 	j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg = 0xFF;
-
 // Config. Reg. 1 (dialing)        (cr1):05
 	j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.reg = 0x05;
-
 // Config. Reg. 2 (caller ID)      (cr2):04
 	j->m_DAAShadowRegs.SOP_REGS.SOP.cr2.reg = 0x04;
-
 // Config. Reg. 3 (testloops)      (cr3):00        ; 
 	j->m_DAAShadowRegs.SOP_REGS.SOP.cr3.reg = 0x00;
-
 // Config. Reg. 4 (analog gain)    (cr4):01
 	j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg = 0x02;		//0x01;
-
-// Config. Reg. 5 (Version)        (cr5):02
+	// Config. Reg. 5 (Version)        (cr5):02
 	// Config. Reg. 6 (Reserved)       (cr6):00
 	// Config. Reg. 7 (Reserved)       (cr7):00
-
-// ;xr Registers
+	// ;xr Registers
 	// Ext. Reg. 0 (Interrupt Reg.)    (xr0):02
+
 	j->m_DAAShadowRegs.XOP_xr0_W.reg = 0x02;	// SO_1 set to '1' because it is inverted.
+	// Ext. Reg. 1 (Interrupt enable)  (xr1):1C
 
-// Ext. Reg. 1 (Interrupt enable)  (xr1):1C
 	j->m_DAAShadowRegs.XOP_REGS.XOP.xr1.reg = 0x1C;		// RING, Caller ID, VDD_OK
+	// Ext. Reg. 2 (Cadence Time Out)  (xr2):7D
 
-// Ext. Reg. 2 (Cadence Time Out)  (xr2):7D
 	j->m_DAAShadowRegs.XOP_REGS.XOP.xr2.reg = 0x7D;
-
 // Ext. Reg. 3 (DC Char)           (xr3):2B      ; 
 	j->m_DAAShadowRegs.XOP_REGS.XOP.xr3.reg = 0x2B;
-
 // Ext. Reg. 4 (Cadence)           (xr4):00
 	j->m_DAAShadowRegs.XOP_REGS.XOP.xr4.reg = 0x00;
-
 // Ext. Reg. 5 (Ring timer)        (xr5):22
 	j->m_DAAShadowRegs.XOP_REGS.XOP.xr5.reg = 0x22;
-
 // Ext. Reg. 6 (Power State)       (xr6):00
 	j->m_DAAShadowRegs.XOP_xr6_W.reg = 0x00;
-
 // Ext. Reg. 7 (Vdd)               (xr7):40
 	j->m_DAAShadowRegs.XOP_REGS.XOP.xr7.reg = 0x40;		// 0x40 ??? Should it be 0x00?
-
-// DTMF Tone 1                     (0B): 11,B3,5A,2C    ;   697 Hz  
+	// DTMF Tone 1                     (0B): 11,B3,5A,2C    ;   697 Hz  
 	//                                       12,33,5A,C3    ;  770 Hz  
 	//                                       13,3C,5B,32    ;  852 Hz  
 	//                                       1D,1B,5C,CC    ;  941 Hz  
+
 	j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[3] = 0x11;
 	j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[2] = 0xB3;
 	j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[1] = 0x5A;
 	j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[0] = 0x2C;
-
 // DTMF Tone 2                     (0C): 32,32,52,B3    ;  1209 Hz  
 	//                                       EC,1D,52,22    ;  1336 Hz  
 	//                                       AA,AC,51,D2    ;  1477 Hz  
@@ -5963,23 +7274,22 @@
 	j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[2] = 0x32;
 	j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[1] = 0x52;
 	j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[0] = 0xB3;
-
 }
 
 static void DAA_Coeff_Japan(int board)
 {
 	IXJ *j = &ixj[board];
-
 	int i;
 
+	j->daa_country = DAA_JAPAN;
 	//-----------------------------------------------
 	// CAO
 	for (i = 0; i < ALISDAA_CALLERID_SIZE; i++) {
 		j->m_DAAShadowRegs.CAO_REGS.CAO.CallerID[i] = 0;
 	}
 
-	// Bytes for IM-filter part 1 (04): 06,BD,E2,2D,BA,F9,A0,00
-	    j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[7] = 0x06;
+// Bytes for IM-filter part 1 (04): 06,BD,E2,2D,BA,F9,A0,00
+	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[7] = 0x06;
 	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[6] = 0xBD;
 	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[5] = 0xE2;
 	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[4] = 0x2D;
@@ -5987,7 +7297,6 @@
 	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[2] = 0xF9;
 	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[1] = 0xA0;
 	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[0] = 0x00;
-
 // Bytes for IM-filter part 2 (05): 6F,F7,00,0E,34,33,E0,08
 	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[7] = 0x6F;
 	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[6] = 0xF7;
@@ -5997,7 +7306,6 @@
 	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[2] = 0x33;
 	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[1] = 0xE0;
 	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[0] = 0x08;
-
 // Bytes for FRX-filter       (08): 02,8F,68,77,9C,58,F0,08
 	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[7] = 0x02;
 	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[6] = 0x8F;
@@ -6007,7 +7315,6 @@
 	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[2] = 0x58;
 	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[1] = 0xF0;
 	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[0] = 0x08;
-
 // Bytes for FRR-filter       (07): 03,8F,38,73,87,EA,20,08
 	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[7] = 0x03;
 	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[6] = 0x8F;
@@ -6017,19 +7324,16 @@
 	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[2] = 0xEA;
 	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[1] = 0x20;
 	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[0] = 0x08;
-
 // Bytes for AX-filter        (0A): 51,C5,DD,CA
 	j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[3] = 0x51;
 	j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[2] = 0xC5;
 	j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[1] = 0xDD;
 	j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[0] = 0xCA;
-
 // Bytes for AR-filter        (09): 25,A7,10,D6
 	j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[3] = 0x25;
 	j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[2] = 0xA7;
 	j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[1] = 0x10;
 	j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[0] = 0xD6;
-
 // Bytes for TH-filter part 1 (00): 00,42,48,81,AE,80,00,98
 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[7] = 0x00;
 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[6] = 0x42;
@@ -6039,7 +7343,6 @@
 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[2] = 0x80;
 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[1] = 0x00;
 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[0] = 0x98;
-
 // Bytes for TH-filter part 2 (01): 02,AB,2A,20,99,5B,89,28
 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[7] = 0x02;
 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[6] = 0xAB;
@@ -6049,7 +7352,6 @@
 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[2] = 0x5B;
 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[1] = 0x89;
 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[0] = 0x28;
-
 // Bytes for TH-filter part 3 (02): 00,88,DA,25,34,C5,4C,BA
 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[7] = 0x00;
 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[6] = 0x88;
@@ -6059,10 +7361,8 @@
 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[2] = 0xC5;
 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[1] = 0x4C;
 	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[0] = 0xBA;
-
 // ;  idle
-
-// Bytes for Ringing part 1 (03):1B,3C,93,3A,22,12,A3,23
+	// Bytes for Ringing part 1 (03):1B,3C,93,3A,22,12,A3,23
 	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[7] = 0x1B;
 	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[6] = 0x3C;
 	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[5] = 0x93;
@@ -6071,7 +7371,6 @@
 	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[2] = 0x12;
 	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[1] = 0xA3;
 	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[0] = 0x23;
-
 // Bytes for Ringing part 2 (06):12,A2,A6,BA,22,7A,0A,D5
 	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[7] = 0x12;
 	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[6] = 0xA2;
@@ -6081,13 +7380,11 @@
 	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[2] = 0x7A;
 	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[1] = 0x0A;
 	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[0] = 0xD5;
-
 // Levelmetering Ringing           (0D):AA,35,0F,8E    ; 25Hz 30V ?????????
 	j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[3] = 0xAA;
 	j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[2] = 0x35;
 	j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[1] = 0x0F;
 	j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[0] = 0x8E;
-
 // Caller ID 1st Tone              (0E):CA,0E,CA,09,99,99,99,99
 	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[7] = 0xCA;
 	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[6] = 0x0E;
@@ -6097,7 +7394,6 @@
 	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[2] = 0x99;
 	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[1] = 0x99;
 	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[0] = 0x99;
-
 // Caller ID 2nd Tone              (0F):FD,B5,BA,07,DA,00,00,00
 	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[7] = 0xFD;
 	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[6] = 0xB5;
@@ -6107,76 +7403,62 @@
 	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[2] = 0x00;
 	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[1] = 0x00;
 	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[0] = 0x00;
-
 // ;CR Registers
 	// Config. Reg. 0 (filters)        (cr0):FF
-	j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg = 0xFF;
-
+	j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg = 0xFE;
 // Config. Reg. 1 (dialing)        (cr1):05
 	j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.reg = 0x05;
-
 // Config. Reg. 2 (caller ID)      (cr2):04
 	j->m_DAAShadowRegs.SOP_REGS.SOP.cr2.reg = 0x04;
-
 // Config. Reg. 3 (testloops)      (cr3):00        ; 
 	j->m_DAAShadowRegs.SOP_REGS.SOP.cr3.reg = 0x00;
-
 // Config. Reg. 4 (analog gain)    (cr4):01
 	j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg = 0x02;		//0x01;
-
-// Config. Reg. 5 (Version)        (cr5):02
+	// Config. Reg. 5 (Version)        (cr5):02
 	// Config. Reg. 6 (Reserved)       (cr6):00
 	// Config. Reg. 7 (Reserved)       (cr7):00
-
-// ;xr Registers
+	// ;xr Registers
 	// Ext. Reg. 0 (Interrupt Reg.)    (xr0):02
+
 	j->m_DAAShadowRegs.XOP_xr0_W.reg = 0x02;	// SO_1 set to '1' because it is inverted.
+	// Ext. Reg. 1 (Interrupt enable)  (xr1):1C
 
-// Ext. Reg. 1 (Interrupt enable)  (xr1):1C
 	j->m_DAAShadowRegs.XOP_REGS.XOP.xr1.reg = 0x1C;		// RING, Caller ID, VDD_OK
+	// Ext. Reg. 2 (Cadence Time Out)  (xr2):7D
 
-// Ext. Reg. 2 (Cadence Time Out)  (xr2):7D
 	j->m_DAAShadowRegs.XOP_REGS.XOP.xr2.reg = 0x7D;
-
 // Ext. Reg. 3 (DC Char)           (xr3):22        ; 
 	j->m_DAAShadowRegs.XOP_REGS.XOP.xr3.reg = 0x22;
-
 // Ext. Reg. 4 (Cadence)           (xr4):00
 	j->m_DAAShadowRegs.XOP_REGS.XOP.xr4.reg = 0x00;
-
 // Ext. Reg. 5 (Ring timer)        (xr5):22
 	j->m_DAAShadowRegs.XOP_REGS.XOP.xr5.reg = 0x22;
-
 // Ext. Reg. 6 (Power State)       (xr6):00
 	j->m_DAAShadowRegs.XOP_xr6_W.reg = 0x00;
-
 // Ext. Reg. 7 (Vdd)               (xr7):40
 	j->m_DAAShadowRegs.XOP_REGS.XOP.xr7.reg = 0x40;		// 0x40 ??? Should it be 0x00?
-
-// DTMF Tone 1                     (0B): 11,B3,5A,2C    ;   697 Hz  
+	// DTMF Tone 1                     (0B): 11,B3,5A,2C    ;   697 Hz  
 	//                                       12,33,5A,C3    ;  770 Hz  
 	//                                       13,3C,5B,32    ;  852 Hz  
 	//                                       1D,1B,5C,CC    ;  941 Hz  
+
 	j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[3] = 0x11;
 	j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[2] = 0xB3;
 	j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[1] = 0x5A;
 	j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[0] = 0x2C;
-
 // DTMF Tone 2                     (0C): 32,32,52,B3    ;  1209 Hz  
 	//                                       EC,1D,52,22    ;  1336 Hz  
 	//                                       AA,AC,51,D2    ;  1477 Hz  
 	//                                       9B,3B,51,25    ;  1633 Hz  
-
 	j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[3] = 0x32;
 	j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[2] = 0x32;
 	j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[1] = 0x52;
 	j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[0] = 0xB3;
-
 }
 
 static s16 tone_table[][19] =
 {
-	{			// f20_50[]
+	{			// f20_50[] 11
 		32538,		// A1 = 1.985962
 		 -32325,	// A2 = -0.986511
 		 -343,		// B2 = -0.010493
@@ -6197,7 +7479,7 @@
 		 21,		// 21/32 in-band to broad-band ratio
 		 0x0FF5		// shift-mask 0x0FF (look at 16 half-frames) bit count = 5
 	},
-	{			// f133_200[]
+	{			// f133_200[] 12
 		32072,		// A1 = 1.95752
 		 -31896,	// A2 = -0.973419
 		 -435,		// B2 = -0.013294
@@ -6218,7 +7500,7 @@
 		 21,		// 21/32 in-band to broad-band ratio
 		 0x0FF5		// shift-mask 0x0FF (look at 16 half-frames) bit count = 5
 	},
-	{			// 300.txt
+	{			// 300.txt 13
 		31769,		// A1 = -1.939026
 		 -32584,	// A2 = 0.994385
 		 -475,		// B2 = -0.014522
@@ -6239,7 +7521,7 @@
 		 21,		// 21/32 in-band to broad-band ratio
 		 0x0FF5		// shift-mask 0x0FF (look at 16 half-frames) bit count = 5
 	},
-	{			// f300_420[]
+	{			// f300_420[] 14
 		30750,		// A1 = 1.876892
 		 -31212,	// A2 = -0.952515
 		 -804,		// B2 = -0.024541
@@ -6260,7 +7542,7 @@
 		 21,		// 21/32 in-band to broad-band ratio
 		 0x0FF5		// shift-mask 0x0FF (look at 16 half-frames) bit count = 5
 	},
-	{			// 330.txt
+	{			// 330.txt 15
 		31613,		// A1 = -1.929565
 		 -32646,	// A2 = 0.996277
 		 -185,		// B2 = -0.005657
@@ -6281,7 +7563,7 @@
 		 21,		// 21/32 in-band to broad-band ratio
 		 0x0FF5		// shift-mask 0x0FF (look at 16 half-frames) bit count = 5
 	},
-	{			// f300_425[]
+	{			// f300_425[] 16
 		30741,		// A1 = 1.876282
 		 -31475,	// A2 = -0.960541
 		 -703,		// B2 = -0.021484
@@ -6302,7 +7584,7 @@
 		 21,		// 21/32 in-band to broad-band ratio
 		 0x0FF5		// shift-mask 0x0FF (look at 16 half-frames) bit count = 5
 	},
-	{			// f330_440[]
+	{			// f330_440[] 17
 		30627,		// A1 = 1.869324
 		 -31338,	// A2 = -0.95636
 		 -843,		// B2 = -0.025749
@@ -6323,7 +7605,7 @@
 		 21,		// 21/32 in-band to broad-band ratio
 		 0x0FF5		// shift-mask 0x0FF (look at 16 half-frames) bit count = 5
 	},
-	{			// 340.txt
+	{			// 340.txt 18
 		31546,		// A1 = -1.925476
 		 -32646,	// A2 = 0.996277
 		 -445,		// B2 = -0.013588
@@ -6344,7 +7626,7 @@
 		 21,		// 21/32 in-band to broad-band ratio
 		 0x0FF5		// shift-mask 0x0FF (look at 16 half-frames) bit count = 5
 	},
-	{			// f350_400[]
+	{			// f350_400[] 19
 		31006,		// A1 = 1.892517
 		 -32029,	// A2 = -0.977448
 		 -461,		// B2 = -0.014096
@@ -7708,21 +8990,19 @@
 		 159,		// Minimum in-band energy threshold
 		 21,		// 21/32 in-band to broad-band ratio
 		 0x0FF5		// shift-mask 0x0FF (look at 16 half-frames) bit count = 5
-	},};
-
+	},
+};
 static int ixj_init_filter(int board, IXJ_FILTER * jf)
 {
 	unsigned short cmd;
 	int cnt, max;
 	IXJ *j = &ixj[board];
-
 	if (jf->filter > 3) {
 		return -1;
 	}
 	if (ixj_WriteDSPCommand(0x5154 + jf->filter, board))	// Select Filter
 
 		return -1;
-
 	if (!jf->enable) {
 		if (ixj_WriteDSPCommand(0x5152, board))		// Disable Filter
 
@@ -7733,7 +9013,6 @@
 		if (ixj_WriteDSPCommand(0x5153, board))		// Enable Filter
 
 			return -1;
-
 		// Select the filter (f0 - f3) to use.
 		if (ixj_WriteDSPCommand(0x5154 + jf->filter, board))
 			return -1;
@@ -7750,7 +9029,6 @@
 		// frequency we want.
 		if (ixj_WriteDSPCommand(0x5170 + jf->filter, board))
 			return -1;
-
 		if (j->ver.low != 0x12) {
 			cmd = 0x515B;
 			max = 19;
@@ -7760,23 +9038,12 @@
 		}
 		if (ixj_WriteDSPCommand(cmd, board))
 			return -1;
-
 		for (cnt = 0; cnt < max; cnt++) {
-			if (ixj_WriteDSPCommand(tone_table[jf->freq][cnt], board))
+			if (ixj_WriteDSPCommand(tone_table[jf->freq - 12][cnt], board))
 				return -1;
 		}
-/*    if(j->ver.low != 0x12)
-   {
-   if(ixj_WriteDSPCommand(7, board))
-   return -1;
-   if(ixj_WriteDSPCommand(159, board))
-   return -1;
-   if(ixj_WriteDSPCommand(21, board))
-   return -1;
-   if(ixj_WriteDSPCommand(0x0FF5, board))
-   return -1;
-   } */
 	}
+	j->filter_en[jf->filter] = jf->enable;
 	return 0;
 }
 
@@ -7784,7 +9051,6 @@
 {
 	int freq0, freq1;
 	unsigned short data;
-
 	if (ti->freq0) {
 		freq0 = ti->freq0;
 	} else {
@@ -7797,18 +9063,15 @@
 		freq1 = 0x7FFF;
 	}
 
-//  if(ti->tone_index > 12 && ti->tone_index < 28)
+	if(ti->tone_index > 12 && ti->tone_index < 28)
 	{
 		if (ixj_WriteDSPCommand(0x6800 + ti->tone_index, board))
 			return -1;
-
 		if (ixj_WriteDSPCommand(0x6000 + (ti->gain0 << 4) + ti->gain1, board))
 			return -1;
-
 		data = freq0;
 		if (ixj_WriteDSPCommand(data, board))
 			return -1;
-
 		data = freq1;
 		if (ixj_WriteDSPCommand(data, board))
 			return -1;
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/drivers/telephony/ixj.h linux.17p9/drivers/telephony/ixj.h
--- linux.vanilla/drivers/telephony/ixj.h	Wed May  3 22:34:44 2000
+++ linux.17p9/drivers/telephony/ixj.h	Tue Jun 27 13:13:33 2000
@@ -1,4 +1,4 @@
-/*
+/******************************************************************************
  *    ixj.h
  *
  *    Device Driver for the Internet PhoneJACK and
@@ -22,8 +22,20 @@
  * at our website:    http://www.quicknet.net
  *
  * Fixes:
- */
-static char ixj_h_rcsid[] = "$Id: ixj.h,v 3.4 1999/12/16 22:18:36 root Exp root $";
+ *
+ * IN NO EVENT SHALL QUICKNET TECHNOLOGIES, INC. BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT
+ * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF QUICKNET
+ * TECHNOLOGIES, INC.HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * QUICKNET TECHNOLOGIES, INC. SPECIFICALLY DISCLAIMS ANY WARRANTIES,
+ * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND QUICKNET TECHNOLOGIES, INC. HAS NO OBLIGATION 
+ * TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ *****************************************************************************/
+static char ixj_h_rcsid[] = "$Id: ixj.h,v 3.14 2000/03/30 22:06:48 eokerson Exp $";
 
 #ifndef _I386_TYPES_H
 #include <asm/types.h>
@@ -60,6 +72,27 @@
 	unsigned char high;
 } BYTES;
 
+typedef union {
+        BYTES bytes;
+        short word;
+} IXJ_WORD;
+
+typedef struct{
+	unsigned int b0:1;
+	unsigned int b1:1;
+	unsigned int b2:1;
+	unsigned int b3:1;
+	unsigned int b4:1;
+	unsigned int b5:1;
+	unsigned int b6:1;
+	unsigned int b7:1;
+} IXJ_CBITS;
+
+typedef union{
+	IXJ_CBITS cbits;
+	  char  cbyte;
+} IXJ_CBYTE;
+
 int ixj_WriteDSPCommand(unsigned short, int board);
 
 /******************************************************************************
@@ -327,6 +360,199 @@
 
 /******************************************************************************
 *
+*  These structures deal with the control logic on the Internet PhoneCARD
+*
+******************************************************************************/
+typedef struct {
+	unsigned int x0:4;	// unused bits
+
+	unsigned int ed:1;	// Event Detect
+
+	unsigned int drf:1;	// Smart Cable Removal Flag 1=no cable
+
+	unsigned int dspf:1;	// DSP Flag 1=DSP Ready
+
+	unsigned int crr:1;	// Control Register Ready
+
+} COMMAND_REG1;
+
+typedef union {
+	COMMAND_REG1 bits;
+	unsigned char byte;
+} PCMCIA_CR1;
+
+typedef struct {
+	unsigned int x0:4;	// unused bits
+
+	unsigned int rstc:1;	// Smart Cable Reset
+
+	unsigned int pwr:1;	// Smart Cable Power
+
+	unsigned int x1:2;	// unused bits
+
+} COMMAND_REG2;
+
+typedef union {
+	COMMAND_REG2 bits;
+	unsigned char byte;
+} PCMCIA_CR2;
+
+typedef struct {
+	unsigned int addr:5;	// R/W Smart Cable Register Address
+
+	unsigned int rw:1;	// Read / Write flag
+
+	unsigned int dev:2;	// 2 bit Smart Cable Device Address
+
+} CONTROL_REG;
+
+typedef union {
+	CONTROL_REG bits;
+	unsigned char byte;
+} PCMCIA_SCCR;
+
+typedef struct {
+	unsigned int hsw:1;
+	unsigned int det:1;
+	unsigned int led2:1;
+	unsigned int led1:1;
+	unsigned int ring1:1;
+	unsigned int ring0:1;
+	unsigned int x:1;
+	unsigned int powerdown:1;
+} PCMCIA_SLIC_REG;
+
+typedef union {
+	PCMCIA_SLIC_REG bits;
+	unsigned char byte;
+} PCMCIA_SLIC;
+
+typedef struct {
+	unsigned int cpd:1;	// Chip Power Down
+
+	unsigned int mpd:1;	// MIC Bias Power Down
+
+	unsigned int hpd:1;	// Handset Drive Power Down
+
+	unsigned int lpd:1;	// Line Drive Power Down
+
+	unsigned int spd:1;	// Speaker Drive Power Down
+
+	unsigned int x:2;	// unused bits
+
+	unsigned int sr:1;	// Software Reset
+
+} Si3CONTROL1;
+
+typedef union {
+	Si3CONTROL1 bits;
+	unsigned char byte;
+} Si3C1;
+
+typedef struct {
+	unsigned int al:1;	// Analog Loopback DAC analog -> ADC analog
+
+	unsigned int dl2:1;	// Digital Loopback DAC -> ADC one bit
+
+	unsigned int dl1:1;	// Digital Loopback ADC -> DAC one bit
+
+	unsigned int pll:1;	// 1 = div 10, 0 = div 5
+
+	unsigned int hpd:1;	// HPF disable
+
+	unsigned int x:3;	// unused bits
+
+} Si3CONTROL2;
+
+typedef union {
+	Si3CONTROL2 bits;
+	unsigned char byte;
+} Si3C2;
+
+typedef struct {
+	unsigned int iir:1;	// 1 enables IIR, 0 enables FIR
+
+	unsigned int him:1;	// Handset Input Mute
+
+	unsigned int mcm:1;	// MIC In Mute
+
+	unsigned int mcg:2;	// MIC In Gain
+
+	unsigned int lim:1;	// Line In Mute
+
+	unsigned int lig:2;	// Line In Gain
+
+} Si3RXGAIN;
+
+typedef union {
+	Si3RXGAIN bits;
+	unsigned char byte;
+} Si3RXG;
+
+typedef struct {
+	unsigned int hom:1;	// Handset Out Mute
+
+	unsigned int lom:1;	// Line Out Mute
+
+	unsigned int rxg:5;	// RX PGA Gain
+
+	unsigned int x:1;	// unused bit
+
+} Si3ADCVOLUME;
+
+typedef union {
+	Si3ADCVOLUME bits;
+	unsigned char byte;
+} Si3ADC;
+
+typedef struct {
+	unsigned int srm:1;	// Speaker Right Mute
+
+	unsigned int slm:1;	// Speaker Left Mute
+
+	unsigned int txg:5;	// TX PGA Gain
+
+	unsigned int x:1;	// unused bit
+
+} Si3DACVOLUME;
+
+typedef union {
+	Si3DACVOLUME bits;
+	unsigned char byte;
+} Si3DAC;
+
+typedef struct {
+	unsigned int x:5;	// unused bit
+
+	unsigned int losc:1;	// Line Out Short Circuit
+
+	unsigned int srsc:1;	// Speaker Right Short Circuit
+
+	unsigned int slsc:1;	// Speaker Left Short Circuit
+
+} Si3STATUSREPORT;
+
+typedef union {
+	Si3STATUSREPORT bits;
+	unsigned char byte;
+} Si3STAT;
+
+typedef struct {
+	unsigned int sot:2;	// Speaker Out Attenuation
+
+	unsigned int lot:2;	// Line Out Attenuation
+
+	unsigned int x:4;	// unused bits
+
+} Si3ANALOGATTN;
+
+typedef union {
+	Si3ANALOGATTN bits;
+	unsigned char byte;
+} Si3AATT;
+
+/******************************************************************************
+*
 *  These structures deal with the DAA on the Internet LineJACK
 *
 ******************************************************************************/
@@ -854,10 +1080,49 @@
 };
 
 typedef struct {
+	char enable;
+	char en_filter;
+	unsigned int filter;
+	unsigned int state;	// State 0 when cadence has not started.
+
+	unsigned int on1;	// State 1
+
+	unsigned long on1min;	// State 1 - 10% + jiffies
+ 	unsigned long on1dot;	// State 1 + jiffies
+
+	unsigned long on1max;	// State 1 + 10% + jiffies
+
+	unsigned int off1;	// State 2
+
+	unsigned long off1min;
+	unsigned long off1max;
+	unsigned int on2;	// State 3
+
+	unsigned long on2min;
+	unsigned long on2dot;
+	unsigned long on2max;
+	unsigned int off2;	// State 4
+
+	unsigned long off2min;
+	unsigned long off2max;
+	unsigned int on3;	// State 5
+
+	unsigned long on3min;
+	unsigned long on3dot;
+	unsigned long on3max;
+	unsigned int off3;	// State 6
+
+	unsigned long off3min;
+	unsigned long off3max;
+} IXJ_CADENCE_F;
+
+typedef struct {
 	unsigned int busytone:1;
 	unsigned int dialtone:1;
 	unsigned int ringback:1;
 	unsigned int ringing:1;
+	unsigned int playing:1;
+	unsigned int recording:1;
 	unsigned int cringing:1;
 	unsigned int play_first_frame:1;
 	unsigned int pstn_present:1;
@@ -868,6 +1133,28 @@
 	unsigned int ts85_loaded:1;
 	unsigned int dtmf_oob:1;	// DTMF Out-Of-Band
 
+	unsigned int pcmciascp:1;	// Smart Cable Present
+
+	unsigned int pcmciasct:2;	// Smart Cable Type
+
+	unsigned int pcmciastate:3;	// Smart Cable Init State
+
+	unsigned int inwrite:1;	// Currently writing
+
+	unsigned int inread:1;	// Currently reading
+
+	unsigned int incheck:1;	// Currently checking the smart cable
+
+	unsigned int cidplay:1; // Currently playing Caller ID
+
+	unsigned int cidring:1; // This is the ring for Caller ID
+
+	unsigned int cidsent:1; // Caller ID has been sent
+
+	unsigned int cidcw_ack:1; // Caller ID CW ACK (from CPE)
+
+	unsigned int x:6;	// unsed bits
+
 } IXJ_FLAGS;
 
 /******************************************************************************
@@ -884,15 +1171,19 @@
 	unsigned int serial;
 	struct phone_capability caplist[30];
 	unsigned int caps;
+	unsigned int country;
 	struct pnp_dev *dev;
 	unsigned int cardtype;
 	unsigned int rec_codec;
 	char rec_mode;
 	unsigned int play_codec;
+	unsigned int cid_play_codec;
 	char play_mode;
 	IXJ_FLAGS flags;
 	unsigned int rec_frame_size;
 	unsigned int play_frame_size;
+	unsigned int cid_base_frame_size;
+	unsigned long cidcw_wait;
 	int aec_level;
 	int readers, writers;
 	struct wait_queue *poll_q;
@@ -919,6 +1210,7 @@
 	char maxrings;
 	IXJ_CADENCE *cadence_t;
 	int tone_cadence_state;
+	IXJ_CADENCE_F cadence_f[4];
 	DTMF dtmf;
 	CPTF cptf;
 	BYTES dsp;
@@ -933,30 +1225,50 @@
 	PLD_SLICW pld_slicw;
 	PLD_SLICR pld_slicr;
 	PLD_CLOCK pld_clock;
+	PCMCIA_CR1 pccr1;
+	PCMCIA_CR2 pccr2;
+	PCMCIA_SCCR psccr;
+	PCMCIA_SLIC pslic;
+	char pscdd;
+	Si3C1 sic1;
+	Si3C2 sic2;
+	Si3RXG sirxg;
+	Si3ADC siadc;
+	Si3DAC sidac;
+	Si3STAT sistat;
+	Si3AATT siaatt;
 	MIX mix;
 	unsigned short ring_cadence;
 	int ring_cadence_t;
 	unsigned long ring_cadence_jif;
+	unsigned long checkwait;
 	int intercom;
 	int m_hook;
 	int r_hook;
 	char pstn_envelope;
 	char pstn_cid_intr;
+	unsigned char fskz;
+	unsigned char fskphase;
+	unsigned char fskcnt;
 	unsigned pstn_cid_recieved;
-	IXJ_CID cid;
+	PHONE_CID cid;
+	PHONE_CID cid_send;
 	unsigned long pstn_ring_start;
+	unsigned long pstn_ring_stop;
 	unsigned long pstn_winkstart;
 	unsigned int winktime;
+	unsigned long flash_end;
 	char port;
 	union telephony_exception ex;
 	char daa_mode;
+	char daa_country;
 	unsigned long pstn_sleeptil;
 	DAA_REGS m_DAAShadowRegs;
 	Proc_Info_Type Info_read;
 	Proc_Info_Type Info_write;
 	unsigned short frame_count;
-	unsigned int filter_cadence;
 	unsigned int filter_hist[4];
+	unsigned char filter_en[4];
 	unsigned short proc_load;
 	unsigned long framesread;
 	unsigned long frameswritten;
@@ -965,6 +1277,8 @@
 	unsigned long timerchecks;
 	unsigned long txreadycheck;
 	unsigned long rxreadycheck;
+	short fskdata[8000];
+	int fskdcnt;
 } IXJ;
 
 typedef int (*IXJ_REGFUNC) (IXJ * j, unsigned long arg);
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/drivers/video/Config.in linux.17p9/drivers/video/Config.in
--- linux.vanilla/drivers/video/Config.in	Fri Apr 21 12:46:38 2000
+++ linux.17p9/drivers/video/Config.in	Fri Jun 23 11:33:43 2000
@@ -49,6 +49,8 @@
   fi
   if [ "$CONFIG_ATARI" = "y" ]; then
     bool 'Atari native chipset support' CONFIG_FB_ATARI
+  fi
+  if [ "$CONFIG_ATARI" = "y" -o "$CONFIG_PCI" != "n" ]; then
     bool 'ATI Mach64 display support' CONFIG_FB_ATY
   fi
   if [ "$CONFIG_PPC" = "y" ]; then
@@ -60,6 +62,7 @@
       bool 'IMS Twin Turbo display support' CONFIG_FB_IMSTT
       bool 'Chips 65550 display support' CONFIG_FB_CT65550
       bool 'S3 Trio display support' CONFIG_FB_S3TRIO
+      bool 'Backward compatibility mode for Xpmac' CONFIG_FB_COMPAT_XPMAC
     fi
   fi
   if [ "$CONFIG_MAC" = "y" ]; then
@@ -89,7 +92,7 @@
         bool '  G100/G200 support' CONFIG_FB_MATROX_G100
         bool '  Multihead support' CONFIG_FB_MATROX_MULTIHEAD
       fi
-      bool 'ATI Mach64 display support' CONFIG_FB_ATY
+      #bool 'ATI Rage128 display support' CONFIG_FB_ATY128
     fi
   fi
   if [ "$ARCH" = "sparc" -o "$ARCH" = "sparc64" ]; then
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/drivers/video/Makefile linux.17p9/drivers/video/Makefile
--- linux.vanilla/drivers/video/Makefile	Fri Apr 21 12:46:39 2000
+++ linux.17p9/drivers/video/Makefile	Thu Jun 22 22:53:08 2000
@@ -104,6 +104,10 @@
 L_OBJS += atyfb.o
 endif
 
+ifeq ($(CONFIG_FB_ATY128),y)
+  L_OBJS += aty128fb.o
+endif
+
 ifeq ($(CONFIG_FB_IGA),y)
 L_OBJS += igafb.o
 endif
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/drivers/video/aty.h linux.17p9/drivers/video/aty.h
--- linux.vanilla/drivers/video/aty.h	Fri Apr 21 12:46:38 2000
+++ linux.17p9/drivers/video/aty.h	Thu Jun 22 22:52:19 2000
@@ -67,6 +67,8 @@
 #define CUR_HORZ_VERT_POSN	0x006C	/* Dword offset 0_1B */
 #define CUR_HORZ_VERT_OFF	0x0070	/* Dword offset 0_1C */
 
+#define CONFIG_PANEL_LG		0x0074	/* Dword offset 0_1D */
+
 #define GP_IO			0x0078	/* Dword offset 0_1E */
 
 #define HW_DEBUG		0x007C	/* Dword offset 0_1F */
@@ -82,6 +84,9 @@
 
 #define BUS_CNTL		0x00A0	/* Dword offset 0_28 */
 
+#define LCD_INDEX		0x00A4	/* Dword offset 0_29 */
+#define LCD_DATA		0x00A8	/* Dword offset 0_2A */
+
 #define EXT_MEM_CNTL		0x00AC	/* Dword offset 0_2B */
 #define MEM_CNTL		0x00B0	/* Dword offset 0_2C */
 
@@ -100,8 +105,9 @@
 #define GEN_TEST_CNTL		0x00D0	/* Dword offset 0_34 */
 
 #define CUSTOM_MACRO_CNTL	0x00D4	/* Dword offset 0_35 */
+#define LCD_GEN_CNTL_LG		0x00D4	/* Dword offset 0_35 */
 
-#define POWER_MANAGEMENT	0x00D8	/* Dword offset 0_36 (LG) */
+#define POWER_MANAGEMENT_LG	0x00D8	/* Dword offset 0_36 (LG) */
 
 #define CONFIG_CNTL		0x00DC	/* Dword offset 0_37 (CT, ET, VT) */
 #define CONFIG_CHIP_ID		0x00E0	/* Dword offset 0_38 */
@@ -725,7 +731,7 @@
 /* mach64CT family / mach64GT (3D RAGE) class */
 #define LB_CHIP_ID	0x4c42	/* RAGE LT PRO, AGP */
 #define LD_CHIP_ID	0x4c44	/* RAGE LT PRO */
-#define LG_CHIP_ID	0x4c47	/* RAGE LT PRO */
+#define LG_CHIP_ID	0x4c47	/* RAGE LT */
 #define LI_CHIP_ID	0x4c49	/* RAGE LT PRO */
 #define LP_CHIP_ID	0x4c50	/* RAGE LT PRO */
 #define LT_CHIP_ID	0x4c54	/* RAGE LT */
@@ -739,6 +745,7 @@
 #define GI_CHIP_ID	0x4749	/* RAGE PRO, BGA, PCI33 only */
 #define GP_CHIP_ID	0x4750	/* RAGE PRO, PQFP, PCI33, full 3D */
 #define GQ_CHIP_ID	0x4751	/* RAGE PRO, PQFP, PCI33, limited 3D */
+#define LN_CHIP_ID	0x4c4d	/* RAGE Mobility AGP */
 
 
 /* Mach64 major ASIC revisions */
@@ -951,15 +958,43 @@
 #define MACH64_NUM_CLOCKS	16
 #define MACH64_NUM_FREQS	50
 
-/* Power Management register constants (LTG and LT Pro) */
+/* Power Management register constants (LT & LT Pro) */
 #define PWR_MGT_ON		0x00000001
 #define PWR_MGT_MODE_MASK	0x00000006
 #define AUTO_PWR_UP		0x00000008
+#define USE_F32KHZ		0x00000400
+#define TRISTATE_MEM_EN		0x00000800
 #define SELF_REFRESH		0x00000080
 #define PWR_BLON		0x02000000
 #define STANDBY_NOW		0x10000000
 #define SUSPEND_NOW		0x20000000
 #define PWR_MGT_STATUS_MASK	0xC0000000
 #define PWR_MGT_STATUS_SUSPEND	0x80000000
+
+/* PM Mode constants  */
+#define PWR_MGT_MODE_PIN	0x00000000
+#define PWR_MGT_MODE_REG	0x00000002
+#define PWR_MGT_MODE_TIMER	0x00000004
+#define PWR_MGT_MODE_PCI	0x00000006
+
+/* LCD registers (LT Pro) */
+
+/* LCD Index register */
+#define LCD_INDEX_MASK		0x0000003F
+#define LCD_DISPLAY_DIS		0x00000100
+#define LCD_SRC_SEL		0x00000200
+#define CRTC2_DISPLAY_DIS	0x00000400
+
+/* LCD register indices */
+#define LCD_CONFIG_PANEL	0x00
+#define LCD_GEN_CTRL		0x01
+#define LCD_DSTN_CONTROL	0x02
+#define LCD_HFB_PITCH_ADDR	0x03
+#define LCD_HORZ_STRETCHING	0x04
+#define LCD_VERT_STRETCHING	0x05
+#define LCD_EXT_VERT_STRETCH	0x06
+#define LCD_LT_GIO		0x07
+#define LCD_POWER_MANAGEMENT	0x08
+#define LCD_ZVGPIO		0x09
 
 #endif /* REGMACH64_H */
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/drivers/video/aty128.h linux.17p9/drivers/video/aty128.h
--- linux.vanilla/drivers/video/aty128.h	Thu Jan  1 01:00:00 1970
+++ linux.17p9/drivers/video/aty128.h	Sun Jun 25 17:35:07 2000
@@ -0,0 +1,342 @@
+/*  $Id: aty128.h,v 1.1 1999/10/12 11:00:40 geert Exp $
+ *  linux/drivers/video/aty128.h
+ *  Register definitions for ATI Rage128 boards
+ *
+ *  Anthony Tong <atong@uiuc.edu>, 1999
+ *  Brad Douglas <brad@neruo.com>, 2000
+ */
+
+#ifndef REG_RAGE128_H
+#define REG_RAGE128_H
+
+#define CLOCK_CNTL_INDEX			0x0008
+#define CLOCK_CNTL_DATA				0x000c
+#define BIOS_0_SCRATCH				0x0010
+#define BUS_CNTL				0x0030
+#define GEN_INT_CNTL				0x0040
+#define CRTC_GEN_CNTL				0x0050
+#define CRTC_EXT_CNTL				0x0054
+#define DAC_CNTL				0x0058
+#define I2C_CNTL_1				0x0094
+#define PALETTE_INDEX				0x00b0
+#define PALETTE_DATA				0x00b4
+#define CONFIG_CNTL				0x00e0
+#define GEN_RESET_CNTL				0x00f0
+#define CONFIG_MEMSIZE				0x00f8
+#define MEM_CNTL				0x0140
+#define AGP_BASE				0x0170
+#define AGP_CNTL				0x0174
+#define AGP_APER_OFFSET				0x0178
+#define PCI_GART_PAGE				0x017c
+#define PC_NGUI_MODE				0x0180
+#define PC_NGUI_CTLSTAT				0x0184
+#define MPP_TB_CONFIG				0x01C0
+#define MPP_GP_CONFIG				0x01C8
+#define VIPH_CONTROL				0x01D0
+#define CRTC_H_TOTAL_DISP			0x0200
+#define CRTC_H_SYNC_STRT_WID			0x0204
+#define CRTC_V_TOTAL_DISP			0x0208
+#define CRTC_V_SYNC_STRT_WID			0x020c
+#define CRTC_OFFSET				0x0224
+#define CRTC_OFFSET_CNTL			0x0228
+#define CRTC_PITCH				0x022c
+#define OVR_CLR					0x0230
+#define OVR_WID_LEFT_RIGHT			0x0234
+#define OVR_WID_TOP_BOTTOM			0x0238
+#define DDA_CONFIG				0x02e0
+#define DDA_ON_OFF				0x02e4
+#define VGA_DDA_CONFIG				0x02e8
+#define VGA_DDA_ON_OFF				0x02ec
+#define OV0_SCALE_CNTL				0x0420
+#define SUBPIC_CNTL				0x0540
+#define PM4_BUFFER_OFFSET			0x0700
+#define PM4_BUFFER_CNTL				0x0704
+#define PM4_BUFFER_WM_CNTL			0x0708
+#define PM4_BUFFER_DL_RPTR_ADDR			0x070c
+#define PM4_BUFFER_DL_RPTR			0x0710
+#define PM4_BUFFER_DL_WPTR			0x0714
+#define PM4_VC_FPU_SETUP			0x071c
+#define PM4_FPU_CNTL				0x0720
+#define PM4_VC_FORMAT				0x0724
+#define PM4_VC_CNTL				0x0728
+#define PM4_VC_I01				0x072c
+#define PM4_VC_VLOFF				0x0730
+#define PM4_VC_VLSIZE				0x0734
+#define PM4_IW_INDOFF				0x0738
+#define PM4_IW_INDSIZE				0x073c
+#define PM4_FPU_FPX0				0x0740
+#define PM4_FPU_FPY0				0x0744
+#define PM4_FPU_FPX1				0x0748
+#define PM4_FPU_FPY1				0x074c
+#define PM4_FPU_FPX2				0x0750
+#define PM4_FPU_FPY2				0x0754
+#define PM4_FPU_FPY3				0x0758
+#define PM4_FPU_FPY4				0x075c
+#define PM4_FPU_FPY5				0x0760
+#define PM4_FPU_FPY6				0x0764
+#define PM4_FPU_FPR				0x0768
+#define PM4_FPU_FPG				0x076c
+#define PM4_FPU_FPB				0x0770
+#define PM4_FPU_FPA				0x0774
+#define PM4_FPU_INTXY0				0x0780
+#define PM4_FPU_INTXY1				0x0784
+#define PM4_FPU_INTXY2				0x0788
+#define PM4_FPU_INTARGB				0x078c
+#define PM4_FPU_FPTWICEAREA			0x0790
+#define PM4_FPU_DMAJOR01			0x0794
+#define PM4_FPU_DMAJOR12			0x0798
+#define PM4_FPU_DMAJOR02			0x079c
+#define PM4_FPU_STAT				0x07a0
+#define PM4_STAT				0x07b8
+#define PM4_TEST_CNTL				0x07d0
+#define PM4_MICROCODE_ADDR			0x07d4
+#define PM4_MICROCODE_RADDR			0x07d8
+#define PM4_MICROCODE_DATAH			0x07dc
+#define PM4_MICROCODE_DATAL			0x07e0
+#define PM4_CMDFIFO_ADDR			0x07e4
+#define PM4_CMDFIFO_DATAH			0x07e8
+#define PM4_CMDFIFO_DATAL			0x07ec
+#define PM4_BUFFER_ADDR				0x07f0
+#define PM4_BUFFER_DATAH			0x07f4
+#define PM4_BUFFER_DATAL			0x07f8
+#define PM4_MICRO_CNTL				0x07fc
+#define CAP0_TRIG_CNTL				0x0950
+#define CAP1_TRIG_CNTL				0x09c0
+
+/******************************************************************************
+ *                  GUI Block Memory Mapped Registers                         *
+ *                     These registers are FIFOed.                            *
+ *****************************************************************************/
+#define PM4_FIFO_DATA_EVEN			0x1000
+#define PM4_FIFO_DATA_ODD			0x1004
+
+#define DST_OFFSET				0x1404
+#define DST_PITCH				0x1408
+#define DST_WIDTH				0x140c
+#define DST_HEIGHT				0x1410
+#define SRC_X					0x1414
+#define SRC_Y					0x1418
+#define DST_X					0x141c
+#define DST_Y					0x1420
+#define SRC_PITCH_OFFSET			0x1428
+#define DST_PITCH_OFFSET			0x142c
+#define SRC_Y_X					0x1434
+#define DST_Y_X					0x1438
+#define DST_HEIGHT_WIDTH			0x143c
+#define DP_GUI_MASTER_CNTL			0x146c
+#define BRUSH_SCALE				0x1470
+#define BRUSH_Y_X				0x1474
+#define DP_BRUSH_BKGD_CLR			0x1478
+#define DP_BRUSH_FRGD_CLR			0x147c
+#define DST_WIDTH_X				0x1588
+#define DST_HEIGHT_WIDTH_8			0x158c
+#define SRC_X_Y					0x1590
+#define DST_X_Y					0x1594
+#define DST_WIDTH_HEIGHT			0x1598
+#define DST_WIDTH_X_INCY			0x159c
+#define DST_HEIGHT_Y				0x15a0
+#define DST_X_SUB				0x15a4
+#define DST_Y_SUB				0x15a8
+#define SRC_OFFSET				0x15ac
+#define SRC_PITCH				0x15b0
+#define DST_HEIGHT_WIDTH_BW			0x15b4
+#define CLR_CMP_CNTL				0x15c0
+#define CLR_CMP_CLR_SRC				0x15c4
+#define CLR_CMP_CLR_DST				0x15c8
+#define CLR_CMP_MASK				0x15cc
+#define DP_SRC_FRGD_CLR				0x15d8
+#define DP_SRC_BKGD_CLR				0x15dc
+#define DST_BRES_ERR				0x1628
+#define DST_BRES_INC				0x162c
+#define DST_BRES_DEC				0x1630
+#define DST_BRES_LNTH				0x1634
+#define DST_BRES_LNTH_SUB			0x1638
+#define SC_LEFT					0x1640
+#define SC_RIGHT				0x1644
+#define SC_TOP					0x1648
+#define SC_BOTTOM				0x164c
+#define SRC_SC_RIGHT				0x1654
+#define SRC_SC_BOTTOM				0x165c
+#define GUI_DEBUG0				0x16a0
+#define GUI_DEBUG1				0x16a4
+#define GUI_TIMEOUT				0x16b0
+#define GUI_TIMEOUT0				0x16b4
+#define GUI_TIMEOUT1				0x16b8
+#define GUI_PROBE				0x16bc
+#define DP_CNTL					0x16c0
+#define DP_DATATYPE				0x16c4
+#define DP_MIX					0x16c8
+#define DP_WRITE_MASK				0x16cc
+#define DP_CNTL_XDIR_YDIR_YMAJOR		0x16d0
+#define DEFAULT_OFFSET				0x16e0
+#define DEFAULT_PITCH				0x16e4
+#define DEFAULT_SC_BOTTOM_RIGHT			0x16e8
+#define SC_TOP_LEFT				0x16ec
+#define SC_BOTTOM_RIGHT				0x16f0
+#define SRC_SC_BOTTOM_RIGHT			0x16f4
+#define WAIT_UNTIL				0x1720
+#define CACHE_CNTL				0x1724
+#define GUI_STAT				0x1740
+#define PC_GUI_MODE				0x1744
+#define PC_GUI_CTLSTAT				0x1748
+#define PC_DEBUG_MODE				0x1760
+#define BRES_DST_ERR_DEC			0x1780
+#define TRAIL_BRES_T12_ERR_DEC			0x1784
+#define TRAIL_BRES_T12_INC			0x1788
+#define DP_T12_CNTL				0x178c
+#define DST_BRES_T1_LNTH			0x1790
+#define DST_BRES_T2_LNTH			0x1794
+#define SCALE_SRC_HEIGHT_WIDTH			0x1994
+#define SCALE_OFFSET_0				0x1998
+#define SCALE_PITCH				0x199c
+#define SCALE_X_INC				0x19a0
+#define SCALE_Y_INC				0x19a4
+#define SCALE_HACC				0x19a8
+#define SCALE_VACC				0x19ac
+#define SCALE_DST_X_Y				0x19b0
+#define SCALE_DST_HEIGHT_WIDTH			0x19b4
+#define SCALE_3D_CNTL				0x1a00
+#define SCALE_3D_DATATYPE			0x1a20
+#define SETUP_CNTL				0x1bc4
+#define SOLID_COLOR				0x1bc8
+#define WINDOW_XY_OFFSET			0x1bcc
+#define DRAW_LINE_POINT				0x1bd0
+#define SETUP_CNTL_PM4				0x1bd4
+#define DST_PITCH_OFFSET_C			0x1c80
+#define DP_GUI_MASTER_CNTL_C			0x1c84
+#define SC_TOP_LEFT_C				0x1c88
+#define SC_BOTTOM_RIGHT_C			0x1c8c
+
+#define CLR_CMP_MASK_3D				0x1A28
+#define MISC_3D_STATE_CNTL_REG			0x1CA0
+#define MC_SRC1_CNTL				0x19D8
+#define TEX_CNTL				0x1800
+
+/* CONSTANTS */
+#define GUI_ACTIVE				0x80000000
+#define ENGINE_IDLE				0x0
+
+#define PLL_WR_EN				0x00000080
+
+#define CLK_PIN_CNTL				0x0001
+#define PPLL_CNTL				0x0002
+#define PPLL_REF_DIV				0x0003
+#define PPLL_DIV_0				0x0004
+#define PPLL_DIV_1				0x0005
+#define PPLL_DIV_2				0x0006
+#define PPLL_DIV_3				0x0007
+#define VCLK_ECP_CNTL				0x0008
+#define HTOTAL_CNTL				0x0009
+#define X_MPLL_REF_FB_DIV			0x000a
+#define XPLL_CNTL				0x000b
+#define XDLL_CNTL				0x000c
+#define XCLK_CNTL				0x000d
+#define MPLL_CNTL				0x000e
+#define MCLK_CNTL				0x000f
+#define AGP_PLL_CNTL				0x0010
+#define FCP_CNTL				0x0012
+#define PLL_TEST_CNTL				0x0013
+
+#define PPLL_RESET				0x01
+#define PPLL_ATOMIC_UPDATE_EN			0x10000
+#define PPLL_VGA_ATOMIC_UPDATE_EN		0x20000
+#define PPLL_REF_DIV_MASK			0x3FF
+#define PPLL_FB3_DIV_MASK			0x7FF
+#define PPLL_POST3_DIV_MASK			0x70000
+#define PPLL_ATOMIC_UPDATE_R			0x8000
+#define PPLL_ATOMIC_UPDATE_W			0x8000
+#define MEM_CFG_TYPE_MASK			0x3
+#define XCLK_SRC_SEL_MASK			0x7
+#define XPLL_FB_DIV_MASK			0xFF00
+#define X_MPLL_REF_DIV_MASK			0xFF
+
+/* CRTC control values (CRTC_GEN_CNTL) */
+#define CRTC_CSYNC_EN				0x00000010
+
+#define CRTC_PIX_WIDTH_MASK			0x00000700
+#define CRTC_PIX_WIDTH_4BPP			0x00000100
+#define CRTC_PIX_WIDTH_8BPP			0x00000200
+#define CRTC_PIX_WIDTH_15BPP			0x00000300
+#define CRTC_PIX_WIDTH_16BPP			0x00000400
+#define CRTC_PIX_WIDTH_24BPP			0x00000500
+#define CRTC_PIX_WIDTH_32BPP			0x00000600
+
+/* DAC_CNTL bit constants */                       
+#define DAC_8BIT_EN				0x00000100
+#define DAC_MASK				0xFF000000
+#define DAC_BLANKING				0x00000004
+#define DAC_RANGE_CNTL				0x00000003
+#define PALETTE_ACCESS_CNTL			0x00000020
+
+/* GEN_RESET_CNTL bit constants */
+#define SOFT_RESET_GUI				0x00000001
+#define SOFT_RESET_VCLK				0x00000100
+#define SOFT_RESET_PCLK				0x00000200
+#define SOFT_RESET_ECP				0x00000400
+#define SOFT_RESET_DISPENG_XCLK			0x00000800
+
+/* PC_GUI_CTLSTAT bit constants */
+#define PC_BUSY_INIT				0x10000000                 
+#define PC_BUSY_GUI				0x20000000                 
+#define PC_BUSY_NGUI				0x40000000
+#define PC_BUSY					0x80000000
+
+#define BUS_MASTER_DIS				0x00000040
+#define PM4_BUFFER_CNTL_NONPM4			0x00000000
+
+/* DP_DATATYPE bit constants */
+#define DST_8BPP				0x00000002
+#define DST_15BPP				0x00000003
+#define DST_16BPP				0x00000004
+#define DST_24BPP				0x00000005
+#define DST_32BPP				0x00000006
+
+#define BRUSH_SOLIDCOLOR			0x00000d00
+
+/* DP_GUI_MASTER_CNTL bit constants */
+#define	GMC_SRC_PITCH_OFFSET_DEFAULT		0x00000000
+#define GMC_DST_PITCH_OFFSET_DEFAULT		0x00000000
+#define GMC_SRC_CLIP_DEFAULT			0x00000000
+#define GMC_DST_CLIP_DEFAULT			0x00000000
+#define GMC_BRUSH_SOLIDCOLOR			0x000000d0
+#define GMC_SRC_DSTCOLOR			0x00003000
+#define GMC_BYTE_ORDER_MSB_TO_LSB		0x00000000
+#define GMC_DP_SRC_RECT				0x02000000
+#define GMC_3D_FCN_EN_CLR			0x00000000
+#define GMC_AUX_CLIP_CLEAR			0x20000000
+#define GMC_DST_CLR_CMP_FCN_CLEAR		0x10000000
+#define GMC_WRITE_MASK_SET			0x40000000
+#define GMC_DP_CONVERSION_TEMP_6500		0x00000000
+
+/* DP_GUI_MASTER_CNTL ROP3 named constants */
+#define	ROP3_PATCOPY				0x00f00000
+#define ROP3_SRCCOPY				0x00cc0000
+
+#define SRC_DSTCOLOR				0x00030000
+
+/* DP_CNTL bit constants */
+#define DST_X_RIGHT_TO_LEFT			0x00000000
+#define DST_X_LEFT_TO_RIGHT			0x00000001
+#define DST_Y_BOTTOM_TO_TOP			0x00000000
+#define DST_Y_TOP_TO_BOTTOM			0x00000002
+#define DST_X_MAJOR				0x00000000
+#define DST_Y_MAJOR				0x00000004
+#define DST_X_TILE				0x00000008
+#define DST_Y_TILE				0x00000010
+#define DST_LAST_PEL				0x00000020
+#define DST_TRAIL_X_RIGHT_TO_LEFT		0x00000000
+#define DST_TRAIL_X_LEFT_TO_RIGHT		0x00000040
+#define DST_TRAP_FILL_RIGHT_TO_LEFT		0x00000000
+#define DST_TRAP_FILL_LEFT_TO_RIGHT		0x00000080
+#define DST_BRES_SIGN				0x00000100
+#define DST_HOST_BIG_ENDIAN_EN			0x00000200
+#define DST_POLYLINE_NONLAST			0x00008000
+#define DST_RASTER_STALL			0x00010000
+#define DST_POLY_EDGE				0x00040000
+
+/* DP_MIX bit constants */
+#define DP_SRC_RECT				0x00000200
+#define DP_SRC_HOST				0x00000300
+#define DP_SRC_HOST_BYTEALIGN			0x00000400
+
+#endif /* REG_RAGE128_H */
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/drivers/video/aty128fb.c linux.17p9/drivers/video/aty128fb.c
--- linux.vanilla/drivers/video/aty128fb.c	Thu Jan  1 01:00:00 1970
+++ linux.17p9/drivers/video/aty128fb.c	Sun Jun 25 17:35:07 2000
@@ -0,0 +1,2644 @@
+/* $Id: aty128fb.c,v 1.1.1.1.36.1 1999/12/11 09:03:05 Exp $
+ *  linux/drivers/video/aty128fb.c -- Frame buffer device for ATI Rage128
+ *
+ *  Copyright (C) 1999-2000, Brad Douglas <brad@neruo.com>
+ *  Copyright (C) 1999, Anthony Tong <atong@uiuc.edu>
+ *
+ *                Ani Joshi / Jeff Garzik
+ *                      - Code cleanup
+ *
+ *  Based off of Geert's atyfb.c and vfb.c.
+ *
+ *  TODO:
+ *		- panning
+ *		- monitor sensing (DDC)
+ *              - virtual display
+ *		- other platform support (only ppc/x86 supported)
+ *		- PPLL_REF_DIV & XTALIN calculation    -done for x86
+ *		- determine MCLK from previous setting -done for x86            
+ *              - calculate XCLK, rather than probe BIOS
+ *		- hardware cursor support
+ *              - acceleration ( do not use with Rage128 Pro!)
+ *		- ioctl()'s
+ */
+
+/*
+ * A special note of gratitude to ATI's devrel for providing documentation,
+ * example code and hardware. Thanks Nitya.	-atong and brad
+ */
+
+#include <linux/module.h>
+#include <linux/kernel.h>
+#include <linux/errno.h>
+#include <linux/string.h>
+#include <linux/mm.h>
+#include <linux/tty.h>
+#include <linux/malloc.h>
+#include <linux/vmalloc.h>
+#include <linux/delay.h>
+#include <linux/interrupt.h>
+#include <asm/uaccess.h>
+#include <linux/fb.h>
+#include <linux/init.h>
+#include <linux/selection.h>
+#include <linux/pci.h>
+#include <linux/ioport.h>
+#include <asm/io.h>
+
+#ifdef CONFIG_PPC
+#include <asm/prom.h>
+#include <asm/pci-bridge.h>
+#include <linux/nvram.h>
+#include <video/macmodes.h>
+#endif
+
+#ifdef CONFIG_FB_COMPAT_XPMAC
+#include <asm/vc_ioctl.h>
+#endif
+
+#include <video/fbcon.h>
+#include <video/fbcon-cfb8.h>
+#include <video/fbcon-cfb16.h>
+#include <video/fbcon-cfb24.h>
+#include <video/fbcon-cfb32.h>
+
+#ifdef CONFIG_MTRR
+#include <asm/mtrr.h>
+#endif /* CONFIG_MTRR */
+
+#include "aty128.h"
+
+/* Debug flag */
+#undef DEBUG
+
+#ifdef DEBUG
+#define DBG(x)		printk(KERN_DEBUG "aty128fb: %s\n",(x));
+#else
+#define DBG(x)
+#endif
+
+#ifndef CONFIG_PPC
+/* default mode */
+static struct fb_var_screeninfo default_var = {
+    /* 640x480, 60 Hz, Non-Interlaced (25.175 MHz dotclock) */
+    640, 480, 640, 480, 0, 0, 8, 0,
+    {0, 8, 0}, {0, 8, 0}, {0, 8, 0}, {0, 0, 0},
+    0, 0, -1, -1, 0, 39722, 48, 16, 33, 10, 96, 2,
+    0, FB_VMODE_NONINTERLACED
+};
+
+#else /* CONFIG_PPC */
+/* default to 1024x768 at 75Hz on PPC - this will work
+ * on the iMac, the usual 640x480 @ 60Hz doesn't. */
+static struct fb_var_screeninfo default_var = {
+    /* 1024x768, 75 Hz, Non-Interlaced (78.75 MHz dotclock) */
+    1024, 768, 1024, 768, 0, 0, 8, 0,
+    {0, 8, 0}, {0, 8, 0}, {0, 8, 0}, {0, 0, 0},
+    0, 0, -1, -1, 0, 12699, 160, 32, 28, 1, 96, 3,
+    FB_SYNC_HOR_HIGH_ACT|FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED
+};
+
+#endif /* CONFIG_PPC */
+
+/* struct to hold chip description information */
+struct aty128_chip_info {
+    const char *name;
+    unsigned short device;
+    int chip_gen;
+};
+
+/* Chip generations */
+enum {
+	rage_128,
+	rage_128_pro,
+	rage_M3
+};
+
+/* supported Rage128 chipsets */
+static const struct aty128_chip_info aty128_pci_probe_list[] __initdata =
+{
+    {"Rage128 RE (PCI)", PCI_DEVICE_ID_ATI_RAGE128_RE, rage_128},
+    {"Rage128 RF (AGP)", PCI_DEVICE_ID_ATI_RAGE128_RF, rage_128},
+    {"Rage128 RK (PCI)", PCI_DEVICE_ID_ATI_RAGE128_RK, rage_128},
+    {"Rage128 RL (AGP)", PCI_DEVICE_ID_ATI_RAGE128_RL, rage_128},
+    {"Rage128 Pro PF (AGP)", PCI_DEVICE_ID_ATI_RAGE128_PF, rage_128_pro},
+    {"Rage128 Pro PR (PCI)", PCI_DEVICE_ID_ATI_RAGE128_PR, rage_128_pro},
+    {"Rage Mobility M3 (PCI)", PCI_DEVICE_ID_ATI_RAGE128_LE, rage_M3},
+    {"Rage Mobility M3 (AGP)", PCI_DEVICE_ID_ATI_RAGE128_LF, rage_M3},
+    {NULL, 0, rage_128}
+ };
+
+/* packed BIOS settings */
+#pragma pack(1)
+typedef struct {
+    u8 clock_chip_type;
+    u8 struct_size;
+    u8 accelerator_entry;
+    u8 VGA_entry;
+    u16 VGA_table_offset;
+    u16 POST_table_offset;
+    u16 XCLK;
+    u16 MCLK;
+    u8 num_PLL_blocks;
+    u8 size_PLL_blocks;
+    u16 PCLK_ref_freq;
+    u16 PCLK_ref_divider;
+    u32 PCLK_min_freq;
+    u32 PCLK_max_freq;
+    u16 MCLK_ref_freq;
+    u16 MCLK_ref_divider;
+    u32 MCLK_min_freq;
+    u32 MCLK_max_freq;
+    u16 XCLK_ref_freq;
+    u16 XCLK_ref_divider;
+    u32 XCLK_min_freq;
+    u32 XCLK_max_freq;
+} PLL_BLOCK;
+#pragma pack()
+
+/* onboard memory information */
+struct aty128_meminfo {
+    u8 ML;
+    u8 MB;
+    u8 Trcd;
+    u8 Trp;
+    u8 Twr;
+    u8 CL;
+    u8 Tr2w;
+    u8 LoopLatency;
+    u8 DspOn;
+    u8 Rloop;
+    const char *name;
+};
+
+/* various memory configurations */
+const struct aty128_meminfo sdr_128   =
+    { 4, 4, 3, 3, 1, 3, 1, 16, 30, 16, "128-bit SDR SGRAM (1:1)" };
+const struct aty128_meminfo sdr_64    =
+    { 4, 8, 3, 3, 1, 3, 1, 17, 46, 17, "64-bit SDR SGRAM (1:1)" };
+const struct aty128_meminfo sdr_sgram =
+    { 4, 4, 1, 2, 1, 2, 1, 16, 24, 16, "64-bit SDR SGRAM (2:1)" };
+const struct aty128_meminfo ddr_sgram =
+    { 4, 4, 3, 3, 2, 3, 1, 16, 31, 16, "64-bit DDR SGRAM" };
+
+static int currcon = 0;
+static char *aty128fb_name = "ATY Rage128";
+static char fontname[40]  = { 0 };
+static char noaccel = 1;
+static unsigned int initdepth = 8;
+
+#ifndef MODULE
+static const char *mode_option = NULL;
+#endif
+
+#ifndef CONFIG_PPC
+static void *bios_seg = NULL;
+#endif
+
+#if defined(CONFIG_PPC)
+static int default_vmode = VMODE_CHOOSE;
+static int default_cmode = CMODE_8;
+#endif
+
+#ifdef CONFIG_MTRR
+static int mtrr = 1;
+#endif /* CONFIG_MTRR */
+
+/* PLL constants */
+struct aty128_constants {
+    u32 dotclock;
+    u32 ppll_min;
+    u32 ppll_max;
+    u32 ref_divider;
+    u32 xclk;
+    u32 fifo_width;
+    u32 fifo_depth;
+};
+
+struct aty128_crtc {
+    u32 gen_cntl;
+    u32 ext_cntl;
+    u32 h_total, h_sync_strt_wid;
+    u32 v_total, v_sync_strt_wid;
+    u32 pitch;
+    u32 offset, offset_cntl;
+    u32 xoffset, yoffset;
+    u32 vxres, vyres;
+    u32 bpp;
+};
+
+struct aty128_pll {
+    u32 post_divider;
+    u32 feedback_divider;
+    u32 vclk;
+};
+
+struct aty128_ddafifo {
+    u32 dda_config;
+    u32 dda_on_off;
+};
+
+/* register values for a specific mode */
+struct aty128fb_par {
+    struct aty128_crtc crtc;
+    struct aty128_pll pll;
+    struct aty128_ddafifo fifo_reg;
+    u32 accel_flags;
+};
+
+struct fb_info_aty128 {
+    struct fb_info fb_info;
+    struct fb_info_aty128 *next;
+    struct aty128_constants constants;  /* PLL and others      */
+    unsigned long regbase_phys;         /* physical mmio       */
+    void *regbase;                      /* remapped mmio       */
+    unsigned long frame_buffer_phys;    /* physical fb memory  */
+    unsigned long frame_buffer;         /* remaped framebuffer */
+    const struct aty128_meminfo *mem;   /* onboard mem info    */
+    u32 vram_size;                      /* onboard video ram   */
+    int chip_gen;
+    struct aty128fb_par default_par, current_par;
+    struct display disp;
+    struct display_switch dispsw;       /* for cursor and font */
+    struct { u8 red, green, blue, pad; } palette[256];
+    union {
+#ifdef FBCON_HAS_CFB16
+    u16 cfb16[16];
+#endif
+#ifdef FBCON_HAS_CFB24
+    u32 cfb24[16];
+#endif
+#ifdef FBCON_HAS_CFB32
+    u32 cfb32[16];
+#endif
+    } fbcon_cmap;
+    int blitter_may_be_busy;
+#ifdef CONFIG_PCI
+    struct pci_dev *pdev;
+#endif
+#ifdef CONFIG_MTRR
+    struct { int vram; int vram_valid; } mtrr;
+#endif
+    int fifo_slots;
+};
+
+static struct fb_info_aty128 *board_list = NULL;
+
+#define round_div(n, d) ((n+(d/2))/d)
+
+    /*
+     *  Interface used by the world
+     */
+
+int aty128fb_setup(char *options);
+
+static int aty128fb_open(struct fb_info *info, int user);
+static int aty128fb_release(struct fb_info *info, int user);
+static int aty128fb_get_fix(struct fb_fix_screeninfo *fix, int con,
+		       struct fb_info *info);
+static int aty128fb_get_var(struct fb_var_screeninfo *var, int con,
+		       struct fb_info *info);
+static int aty128fb_set_var(struct fb_var_screeninfo *var, int con,
+		       struct fb_info *info);
+static int aty128fb_get_cmap(struct fb_cmap *cmap, int kspc, int con,
+			struct fb_info *info);
+static int aty128fb_set_cmap(struct fb_cmap *cmap, int kspc, int con,
+			struct fb_info *info);
+static int aty128fb_pan_display(struct fb_var_screeninfo *var, int con,
+			   struct fb_info *fb);
+static int aty128fb_ioctl(struct inode *inode, struct file *file, u_int cmd,
+		     u_long arg, int con, struct fb_info *info);
+
+
+    /*
+     *  Interface to the low level console driver
+     */
+
+#ifdef CONFIG_FB_OF
+void aty128fb_of_init(struct device_node *dp);
+#endif
+int aty128fb_init(void);
+static int aty128fbcon_switch(int con, struct fb_info *info);
+static void aty128fbcon_blank(int blank, struct fb_info *info);
+
+
+    /*
+     *  Internal routines
+     */
+
+static void aty128_encode_fix(struct fb_fix_screeninfo *fix,
+				struct aty128fb_par *par,
+				const struct fb_info_aty128 *info);
+static void aty128_set_disp(struct display *disp,
+			struct fb_info_aty128 *info, int bpp, int accel);
+static int aty128_getcolreg(u_int regno, u_int *red, u_int *green, u_int *blue,
+				u_int *transp, struct fb_info *info);
+static int aty128_setcolreg(u_int regno, u_int red, u_int green, u_int blue,
+				u_int transp, struct fb_info *info);
+static void do_install_cmap(int con, struct fb_info *info);
+#ifndef CONFIG_FB_OF
+static int aty128_pci_register(struct pci_dev *pdev,
+                               const struct aty128_chip_info *aci);
+#endif
+
+static int aty128_encode_var(struct fb_var_screeninfo *var,
+                             const struct aty128fb_par *par,
+                             const struct fb_info_aty128 *info);
+static int aty128_decode_var(struct fb_var_screeninfo *var,
+                             struct aty128fb_par *par,
+                             const struct fb_info_aty128 *info);
+static struct fb_info_aty128 *aty128_board_list_add(struct fb_info_aty128
+				*board_list, struct fb_info_aty128 *new_node);
+static int aty128find_ROM(struct fb_info_aty128 *info);
+#ifndef CONFIG_PPC
+static void aty128_get_pllinfo(struct fb_info_aty128 *info);
+#endif
+static void aty128_timings(struct fb_info_aty128 *info);
+static void aty128_init_engine(const struct aty128fb_par *par, 
+				struct fb_info_aty128 *info);
+static void aty128_reset_engine(const struct fb_info_aty128 *info);
+static void aty128_flush_pixel_cache(const struct fb_info_aty128 *info);
+static void do_wait_for_fifo(u16 entries, struct fb_info_aty128 *info);
+static void wait_for_fifo(u16 entries, struct fb_info_aty128 *info);
+static void wait_for_idle(struct fb_info_aty128 *info);
+static u32 bpp_to_depth(u32 bpp);
+
+#ifdef FBCON_HAS_CFB8
+static struct display_switch fbcon_aty128_8;
+static void fbcon_aty8_putc(struct vc_data *conp, struct display *p,
+                            int c, int yy, int xx);
+static void fbcon_aty8_putcs(struct vc_data *conp, struct display *p,
+                             const unsigned short *s, int count,
+                             int yy, int xx);
+#endif
+#ifdef FBCON_HAS_CFB16
+static struct display_switch fbcon_aty128_16;
+static void fbcon_aty16_putc(struct vc_data *conp, struct display *p,
+                            int c, int yy, int xx);
+static void fbcon_aty16_putcs(struct vc_data *conp, struct display *p,
+                             const unsigned short *s, int count,
+                             int yy, int xx);
+#endif
+#ifdef FBCON_HAS_CFB24
+static struct display_switch fbcon_aty128_24;
+static void fbcon_aty24_putc(struct vc_data *conp, struct display *p,
+                            int c, int yy, int xx);
+static void fbcon_aty24_putcs(struct vc_data *conp, struct display *p,
+                             const unsigned short *s, int count,
+                             int yy, int xx);
+#endif
+#ifdef FBCON_HAS_CFB32
+static struct display_switch fbcon_aty128_32;
+static void fbcon_aty32_putc(struct vc_data *conp, struct display *p,
+                            int c, int yy, int xx);
+static void fbcon_aty32_putcs(struct vc_data *conp, struct display *p,
+                             const unsigned short *s, int count,
+                             int yy, int xx);
+#endif
+
+static struct fb_ops aty128fb_ops = {
+    aty128fb_open, aty128fb_release, aty128fb_get_fix,
+    aty128fb_get_var, aty128fb_set_var, aty128fb_get_cmap,
+    aty128fb_set_cmap, aty128fb_pan_display, aty128fb_ioctl
+};
+
+
+    /*
+     * Functions to read from/write to the mmio registers
+     *	- endian conversions may possibly be avoided by flipping CONFIG_CNTL
+     *  or using the other register aperture? TODO.
+     */
+static inline u32
+_aty_ld_le32(volatile unsigned int regindex, 
+                              const struct fb_info_aty128 *info)
+{
+    unsigned long *temp;
+    u32 val;
+
+#if defined(__powerpc__)
+    temp = info->regbase;
+    __asm__ __volatile__("eieio;lwbrx %0,%1,%2" : "=b"(val) : "b" (regindex), "b" (temp));
+#else
+    temp = info->regbase+regindex;
+    val = readl (temp);
+#endif
+
+    return val;
+}
+
+static inline void
+_aty_st_le32(volatile unsigned int regindex, u32 val, 
+                               const struct fb_info_aty128 *info)
+{
+    unsigned long *temp;
+
+#if defined(__powerpc__)
+    temp = info->regbase;
+    __asm__ __volatile__("eieio; stwbrx %0,%1,%2" : : "r" (val), "b" (regindex), "r" (temp) :
+        "memory");
+#elif defined(__mc68000__)
+    *((volatile u32 *)(info->regbase+regindex)) = cpu_to_le32(val);
+#else
+    temp = info->regbase+regindex;
+    writel (val, temp);
+#endif
+}
+
+static inline u8
+_aty_ld_8(unsigned int regindex, const struct fb_info_aty128 *info)
+{
+#if defined(__powerpc__)
+    eieio();
+#endif
+    return readb (info->regbase + regindex);
+}
+
+static inline void
+_aty_st_8(unsigned int regindex, u8 val, const struct fb_info_aty128 *info)
+{
+#if defined(__powerpc__)
+    eieio();
+#endif
+    writeb (val, info->regbase + regindex);
+}
+
+#define aty_ld_le32(regindex)		_aty_ld_le32(regindex, info)
+#define aty_st_le32(regindex, val)	_aty_st_le32(regindex, val, info)
+#define aty_ld_8(regindex)		_aty_ld_8(regindex, info)
+#define aty_st_8(regindex, val)		_aty_st_8(regindex, val, info)
+
+    /*
+     * Functions to read from/write to the pll registers
+     */
+
+#define aty_ld_pll(pll_index)		_aty_ld_pll(pll_index, info)
+#define aty_st_pll(pll_index, val)	_aty_st_pll(pll_index, val, info)
+
+
+static u32
+_aty_ld_pll(unsigned int pll_index,
+			const struct fb_info_aty128 *info)
+{       
+    aty_st_8(CLOCK_CNTL_INDEX, pll_index & 0x1F);
+    return aty_ld_le32(CLOCK_CNTL_DATA);
+}
+
+    
+static void
+_aty_st_pll(unsigned int pll_index, u32 val,
+			const struct fb_info_aty128 *info)
+{   
+    aty_st_8(CLOCK_CNTL_INDEX, (pll_index & 0x1F) | PLL_WR_EN);
+    aty_st_le32(CLOCK_CNTL_DATA, val);
+}
+ 
+/* return true when the PLL has completed an atomic update */
+static int
+aty_pll_readupdate(const struct fb_info_aty128 *info)
+{
+    return !(aty_ld_pll(PPLL_REF_DIV) & PPLL_ATOMIC_UPDATE_R);
+}
+
+
+static void
+aty_pll_wait_readupdate(const struct fb_info_aty128 *info)
+{
+    unsigned long timeout = jiffies + HZ/100;	// should be more than enough
+    int reset = 1;
+
+    while (time_before(jiffies, timeout))
+	if (aty_pll_readupdate(info)) {
+	    reset = 0;
+	    break;
+	}
+
+#ifdef DEBUG
+    if (reset)	/* reset engine?? */
+	DBG("PLL write timeout!");
+#endif
+}
+
+
+/* tell PLL to update */
+static void
+aty_pll_writeupdate(const struct fb_info_aty128 *info)
+{
+    aty_pll_wait_readupdate(info);
+
+    aty_st_pll(PPLL_REF_DIV,
+	aty_ld_pll(PPLL_REF_DIV) | PPLL_ATOMIC_UPDATE_W);
+}
+
+    /*
+     * Accelerator engine functions
+     */
+static void
+do_wait_for_fifo(u16 entries, struct fb_info_aty128 *info)
+{
+    int i;
+
+    for (;;) {
+        for (i = 0; i < 2000000; i++) {
+            info->fifo_slots = aty_ld_le32(GUI_STAT) & 0x0fff;
+            if (info->fifo_slots >= entries)
+                return;
+        }
+	aty128_reset_engine(info);
+    }
+}
+
+static void
+wait_for_idle(struct fb_info_aty128 *info)
+{
+    int i;
+
+    do_wait_for_fifo(64, info);
+
+    for (;;) {
+        for (i = 0; i < 2000000; i++) {
+            if (!(aty_ld_le32(GUI_STAT) & (1 << 31))) {
+                aty128_flush_pixel_cache(info);
+                info->blitter_may_be_busy = 0;
+                return;
+            }
+        }
+        aty128_reset_engine(info);
+    }
+}
+
+
+static void
+aty128_flush_pixel_cache(const struct fb_info_aty128 *info)
+{
+    int i;
+    u32 tmp;
+
+    tmp = aty_ld_le32(PC_NGUI_CTLSTAT);
+    tmp &= ~(0x00ff);
+    tmp |= 0x00ff;
+    aty_st_le32(PC_NGUI_CTLSTAT, tmp);
+
+    for (i = 0; i < 2000000; i++)
+        if (!(aty_ld_le32(PC_NGUI_CTLSTAT) & PC_BUSY))
+            break;
+}
+
+
+static void
+wait_for_fifo(u16 entries, struct fb_info_aty128 *info)
+{
+    if (info->fifo_slots < entries)
+        do_wait_for_fifo(64, info);
+    info->fifo_slots -= entries;
+}
+
+
+static void
+aty128_reset_engine(const struct fb_info_aty128 *info)
+{
+    u32 gen_reset_cntl, clock_cntl_index, mclk_cntl;
+
+    aty128_flush_pixel_cache(info);
+
+    clock_cntl_index = aty_ld_le32(CLOCK_CNTL_INDEX);
+    mclk_cntl = aty_ld_pll(MCLK_CNTL);
+
+    aty_st_pll(MCLK_CNTL, mclk_cntl | 0x00030000);
+
+    gen_reset_cntl = aty_ld_le32(GEN_RESET_CNTL);
+    aty_st_le32(GEN_RESET_CNTL, gen_reset_cntl | SOFT_RESET_GUI);
+    aty_ld_le32(GEN_RESET_CNTL);
+    aty_st_le32(GEN_RESET_CNTL, gen_reset_cntl & ~(SOFT_RESET_GUI));
+    aty_ld_le32(GEN_RESET_CNTL);
+
+    aty_st_pll(MCLK_CNTL, mclk_cntl);
+    aty_st_le32(CLOCK_CNTL_INDEX, clock_cntl_index);
+    aty_st_le32(GEN_RESET_CNTL, gen_reset_cntl);
+
+    /* use old pio mode */
+    aty_st_le32(PM4_BUFFER_CNTL, PM4_BUFFER_CNTL_NONPM4);
+
+#ifdef DEBUG
+    DBG("engine reset");
+#endif
+}
+
+
+static void
+aty128_init_engine(const struct aty128fb_par *par,
+		struct fb_info_aty128 *info)
+{
+    u32 pitch_value;
+
+    wait_for_idle(info);
+
+    /* 3D scaler not spoken here */
+    aty_st_le32(SCALE_3D_CNTL, 0x00000000);
+
+    aty128_reset_engine(info);
+
+    pitch_value = par->crtc.pitch;	/* fix this up */
+    if (par->crtc.bpp == 24) {
+        pitch_value = pitch_value * 3;
+    }
+
+    /* setup engine offset registers */
+    wait_for_fifo(4, info);
+    aty_st_le32(DEFAULT_OFFSET, 0x00000000);
+
+    /* setup engine pitch registers */
+    aty_st_le32(DEFAULT_PITCH, pitch_value);
+
+    /* set the default scissor register to max dimensions */
+    wait_for_fifo(1, info);
+    aty_st_le32(DEFAULT_SC_BOTTOM_RIGHT, (0x1FFF << 16) | 0x1FFF);
+
+    /* set the drawing controls registers */
+    wait_for_fifo(1, info);
+    aty_st_le32(DP_GUI_MASTER_CNTL,
+		GMC_SRC_PITCH_OFFSET_DEFAULT		|
+		GMC_DST_PITCH_OFFSET_DEFAULT		|
+		GMC_SRC_CLIP_DEFAULT			|
+		GMC_DST_CLIP_DEFAULT			|
+		GMC_BRUSH_SOLIDCOLOR			|
+		(bpp_to_depth(par->crtc.bpp) << 8)	|
+		GMC_SRC_DSTCOLOR			|
+		GMC_BYTE_ORDER_MSB_TO_LSB		|
+		GMC_DP_CONVERSION_TEMP_6500		|
+		ROP3_PATCOPY				|
+		GMC_DP_SRC_RECT				|
+		GMC_3D_FCN_EN_CLR			|
+		GMC_DST_CLR_CMP_FCN_CLEAR		|
+		GMC_AUX_CLIP_CLEAR			|
+		GMC_WRITE_MASK_SET);
+    wait_for_fifo(8, info);
+
+    /* clear the line drawing registers */
+    aty_st_le32(DST_BRES_ERR, 0);
+    aty_st_le32(DST_BRES_INC, 0);
+    aty_st_le32(DST_BRES_DEC, 0);
+
+    /* set brush color registers */
+    aty_st_le32(DP_BRUSH_FRGD_CLR, 0xFFFFFFFF); /* white */
+    aty_st_le32(DP_BRUSH_BKGD_CLR, 0x00000000); /* black */
+
+    /* set source color registers */
+    aty_st_le32(DP_SRC_FRGD_CLR, 0xFFFFFFFF);   /* white */
+    aty_st_le32(DP_SRC_BKGD_CLR, 0x00000000);   /* black */
+
+    /* default write mask */
+    aty_st_le32(DP_WRITE_MASK, 0xFFFFFFFF);
+
+    /* Wait for all the writes to be completed before returning */
+    wait_for_idle(info);
+}
+
+
+/* convert bpp values to their register representation */
+static u32
+bpp_to_depth(u32 bpp)
+{
+    if (bpp <= 8)
+	return DST_8BPP;
+    else if (bpp <= 16)
+        return DST_15BPP;
+    else if (bpp <= 24)
+	return DST_24BPP;
+    else if (bpp <= 32)
+	return DST_32BPP;
+
+    return -EINVAL;
+}
+
+    /*
+     * CRTC programming
+     */
+
+
+/* Program the CRTC registers */
+static void
+aty128_set_crtc(const struct aty128_crtc *crtc,
+		const struct fb_info_aty128 *info)
+{
+    aty_st_le32(CRTC_GEN_CNTL, crtc->gen_cntl);
+    aty_st_le32(CRTC_H_TOTAL_DISP, crtc->h_total);
+    aty_st_le32(CRTC_H_SYNC_STRT_WID, crtc->h_sync_strt_wid);
+    aty_st_le32(CRTC_V_TOTAL_DISP, crtc->v_total);
+    aty_st_le32(CRTC_V_SYNC_STRT_WID, crtc->v_sync_strt_wid);
+    aty_st_le32(CRTC_PITCH, crtc->pitch);
+    aty_st_le32(CRTC_OFFSET, crtc->offset);
+    aty_st_le32(CRTC_OFFSET_CNTL, crtc->offset_cntl);
+    /* Disable ATOMIC updating.  Is this the right place?
+     * -- BenH: Breaks on my G4
+     */
+#if 0
+    aty_st_le32(PPLL_CNTL, aty_ld_le32(PPLL_CNTL) & ~(0x00030000));
+#endif
+}
+
+
+static int
+aty128_var_to_crtc(const struct fb_var_screeninfo *var,
+			struct aty128_crtc *crtc,
+			const struct fb_info_aty128 *info)
+{
+    u32 xres, yres, vxres, vyres, xoffset, yoffset, bpp;
+    u32 left, right, upper, lower, hslen, vslen, sync, vmode;
+    u32 h_total, h_disp, h_sync_strt, h_sync_wid, h_sync_pol;
+    u32 v_total, v_disp, v_sync_strt, v_sync_wid, v_sync_pol, c_sync;
+    u32 depth, bytpp;
+    u8 hsync_strt_pix[5] = { 0, 0x12, 9, 6, 5 };
+    u8 mode_bytpp[7] = { 0, 0, 1, 2, 2, 3, 4 };
+
+    /* input */
+    xres = var->xres;
+    yres = var->yres;
+    vxres = var->xres_virtual;
+    vyres = var->yres_virtual;
+    xoffset = var->xoffset;
+    yoffset = var->yoffset;
+    bpp = var->bits_per_pixel;
+    left = var->left_margin;
+    right = var->right_margin;
+    upper = var->upper_margin;
+    lower = var->lower_margin;
+    hslen = var->hsync_len;
+    vslen = var->vsync_len;
+    sync = var->sync;
+    vmode = var->vmode;
+
+    /* check for mode eligibility */
+
+    /* accept only non interlaced modes */
+    if ((vmode & FB_VMODE_MASK) != FB_VMODE_NONINTERLACED)
+	return -EINVAL;
+
+    /* convert (and round up) and validate */
+    xres = (xres + 7) & ~7;
+    xoffset = (xoffset + 7) & ~7;
+
+    if (vxres < xres + xoffset)
+	vxres = xres + xoffset;
+
+    if (vyres < yres + yoffset)
+	vyres = yres + yoffset;
+
+    depth = bpp_to_depth(bpp);
+
+    /* make sure we didn't get an invalid depth */
+    if (depth == -EINVAL) {
+        printk(KERN_ERR "aty128fb: Invalid depth\n");
+        return -EINVAL;
+    }
+
+   bytpp = mode_bytpp[depth];
+
+    /* make sure there is enough video ram for the mode */
+    if ((u32)(vxres * vyres * bytpp) > info->vram_size) {
+        printk(KERN_ERR "aty128fb: Not enough memory for mode\n");
+        return -EINVAL;
+    }
+
+    h_disp = (xres >> 3) - 1;
+    h_total = (((xres + right + hslen + left) / 8) - 1) & 0xFFFFL;
+
+    v_disp = yres - 1;
+    v_total = (yres + upper + vslen + lower - 1) & 0xFFFFL;
+
+    /* check to make sure h_total and v_total are in range */
+    if ((h_total/8 - 1) > 0x1ff || (v_total - 1) > 0x7FF) {
+        printk(KERN_ERR "aty128fb: invalid width ranges\n");
+        return -EINVAL;
+    }
+
+    h_sync_wid = (hslen+7)/8;
+    if (h_sync_wid == 0)
+	h_sync_wid = 1;
+    else if (h_sync_wid > 0x3f)        /* 0x3f = max hwidth */
+	h_sync_wid = 0x3f;
+
+    h_sync_strt = h_disp + (right/8);
+
+    v_sync_wid = vslen;
+    if (v_sync_wid == 0)
+	v_sync_wid = 1;
+    else if (v_sync_wid > 0x1f)        /* 0x1f = max vwidth */
+	v_sync_wid = 0x1f;
+    
+    v_sync_strt = v_disp + lower;
+
+    h_sync_pol = sync & FB_SYNC_HOR_HIGH_ACT ? 0 : 1;
+    v_sync_pol = sync & FB_SYNC_VERT_HIGH_ACT ? 0 : 1;
+    
+    c_sync = sync & FB_SYNC_COMP_HIGH_ACT ? (1 << 4) : 0;
+
+    crtc->gen_cntl = 0x03000000L | c_sync | (depth << 8);
+
+    crtc->h_total = h_total | (h_disp << 16);
+    crtc->v_total = v_total | (v_disp << 16);
+
+    crtc->h_sync_strt_wid = hsync_strt_pix[bytpp] | (h_sync_strt << 3) |
+                (h_sync_wid << 16) | (h_sync_pol << 23);
+    crtc->v_sync_strt_wid = v_sync_strt | (v_sync_wid << 16) |
+                (v_sync_pol << 23);
+
+    crtc->pitch = xres >> 3;
+
+    crtc->offset = 0;
+    crtc->offset_cntl = 0;
+
+    crtc->vxres = vxres;
+    crtc->vyres = vyres;
+    crtc->xoffset = xoffset;
+    crtc->yoffset = yoffset;
+    crtc->bpp = bpp;
+
+    return 0;
+}
+
+
+static int
+aty128_bpp_to_var(int pix_width, struct fb_var_screeninfo *var)
+{
+
+    /* fill in pixel info */
+    switch (pix_width) {
+    case CRTC_PIX_WIDTH_8BPP:
+        var->bits_per_pixel = 8;
+	var->red.offset = 0;
+	var->red.length = 8;
+	var->green.offset = 0;
+	var->green.length = 8;
+	var->blue.offset = 0;
+	var->blue.length = 8;
+	var->transp.offset = 0;
+	var->transp.length = 0;
+	break;
+    case CRTC_PIX_WIDTH_15BPP:
+    case CRTC_PIX_WIDTH_16BPP:
+	var->bits_per_pixel = 16;
+	var->red.offset = 10;
+	var->red.length = 5;
+	var->green.offset = 5;
+	var->green.length = 5;
+	var->blue.offset = 0;
+	var->blue.length = 5;
+	var->transp.offset = 0;
+	var->transp.length = 0;
+	break;
+    case CRTC_PIX_WIDTH_24BPP:
+        var->bits_per_pixel = 24;
+        var->red.offset = 16;
+        var->red.length = 8;
+        var->green.offset = 8;
+        var->green.length = 8;
+        var->blue.offset = 0;
+        var->blue.length = 8;
+        var->transp.offset = 0;
+        var->transp.length = 0;
+        break;
+    case CRTC_PIX_WIDTH_32BPP:
+        var->bits_per_pixel = 32;
+	var->red.offset = 16;
+	var->red.length = 8;
+	var->green.offset = 8;
+	var->green.length = 8;
+	var->blue.offset = 0;
+	var->blue.length = 8;
+	var->transp.offset = 24;
+	var->transp.length = 8;
+	break;
+    default:
+        printk(KERN_ERR "Invalid pixel width\n");
+        return -EINVAL;
+    }
+
+    return 0;
+}
+
+
+static int
+aty128_crtc_to_var(const struct aty128_crtc *crtc,
+			struct fb_var_screeninfo *var)
+{
+    u32 xres, yres, left, right, upper, lower, hslen, vslen, sync;
+    u32 h_total, h_disp, h_sync_strt, h_sync_dly, h_sync_wid, h_sync_pol;
+    u32 v_total, v_disp, v_sync_strt, v_sync_wid, v_sync_pol, c_sync;
+    u32 pix_width;
+
+    /* fun with masking */
+    h_total     = crtc->h_total & 0x1ff;
+    h_disp      = (crtc->h_total>>16) & 0xff;
+    h_sync_strt = (crtc->h_sync_strt_wid>>3) & 0x1ff;
+    h_sync_dly  = crtc->h_sync_strt_wid & 0x7;
+    h_sync_wid  = (crtc->h_sync_strt_wid>>16) & 0x3f;
+    h_sync_pol  = (crtc->h_sync_strt_wid>>23) & 0x1;
+    v_total     = crtc->v_total & 0x7ff;
+    v_disp      = (crtc->v_total>>16) & 0x7ff;
+    v_sync_strt = crtc->v_sync_strt_wid & 0x7ff;
+    v_sync_wid  = (crtc->v_sync_strt_wid>>16) & 0x1f;
+    v_sync_pol  = (crtc->v_sync_strt_wid>>23) & 0x1;
+    c_sync      = crtc->gen_cntl & CRTC_CSYNC_EN ? 1 : 0;
+    pix_width   = crtc->gen_cntl & CRTC_PIX_WIDTH_MASK;
+
+    xres  = (h_disp+1) << 3;
+    yres  = v_disp+1;
+    left  = (h_total-h_sync_strt-h_sync_wid)*8-h_sync_dly;
+    right = (h_sync_strt-h_disp)*8+h_sync_dly;
+    hslen = h_sync_wid*8;
+    upper = v_total-v_sync_strt-v_sync_wid;
+    lower = v_sync_strt-v_disp;
+    vslen = v_sync_wid;
+    sync  = (h_sync_pol ? 0 : FB_SYNC_HOR_HIGH_ACT) |
+            (v_sync_pol ? 0 : FB_SYNC_VERT_HIGH_ACT) |
+            (c_sync ? FB_SYNC_COMP_HIGH_ACT : 0);
+
+    aty128_bpp_to_var(pix_width, var);
+
+    var->xres = xres;
+    var->yres = yres;
+    var->xres_virtual = crtc->vxres;
+    var->yres_virtual = crtc->vyres;
+    var->xoffset = crtc->xoffset;
+    var->yoffset = crtc->yoffset;
+    var->left_margin = left;
+    var->right_margin = right;
+    var->upper_margin = upper;
+    var->lower_margin = lower;
+    var->hsync_len = hslen;
+    var->vsync_len = vslen;
+    var->sync = sync;
+    var->vmode = FB_VMODE_NONINTERLACED;
+
+    return 0;
+}
+
+static void
+aty128_set_pll(struct aty128_pll *pll, const struct fb_info_aty128 *info)
+{
+    int div3;
+
+    unsigned char post_conv[] =	/* register values for post dividers */
+        { 2, 0, 1, 4, 2, 2, 6, 2, 3, 2, 2, 2, 7 };
+
+    /* select PPLL_DIV_3 */
+    aty_st_le32(CLOCK_CNTL_INDEX, aty_ld_le32(CLOCK_CNTL_INDEX) | (3 << 8));
+
+    /* reset PLL */
+    aty_st_pll(PPLL_CNTL,
+		aty_ld_pll(PPLL_CNTL) | PPLL_RESET | PPLL_ATOMIC_UPDATE_EN);
+
+    /* write the reference divider */
+    aty_st_pll(PPLL_REF_DIV, info->constants.ref_divider & 0x3ff);
+    aty_pll_writeupdate(info);
+    aty_pll_wait_readupdate(info);
+
+    div3 = aty_ld_pll(PPLL_DIV_3);
+
+    div3 &= ~PPLL_FB3_DIV_MASK;
+    div3 |= pll->feedback_divider;
+
+    div3 &= ~PPLL_POST3_DIV_MASK;
+    div3 |= post_conv[pll->post_divider] << 16;
+
+    /* write feedback and post dividers */
+    aty_st_pll(PPLL_DIV_3, div3);
+    aty_pll_writeupdate(info);
+    aty_pll_wait_readupdate(info);
+
+    aty_st_pll(HTOTAL_CNTL, 0);	/* no horiz crtc adjustment */
+
+    aty_pll_writeupdate(info);
+
+    /* clear the reset, just in case */
+    aty_st_pll(PPLL_CNTL, aty_ld_pll(PPLL_CNTL) & ~PPLL_RESET);
+}
+
+
+static int
+aty128_var_to_pll(u32 period_in_ps, struct aty128_pll *pll,
+			const struct fb_info_aty128 *info)
+{
+    const struct aty128_constants c = info->constants;
+    unsigned char post_dividers[] = {1,2,4,8,3,6,12};
+    u32 output_freq;
+    u32 vclk;        /* in .01 MHz */
+    int i;
+    u32 n, d;
+
+    vclk = 100000000 / period_in_ps;	/* convert units to 10 kHz */
+
+    /* adjust pixel clock if necessary */
+    if (vclk > c.ppll_max)
+	vclk = c.ppll_max;
+    if (vclk * 12 < c.ppll_min)
+	vclk = c.ppll_min/12;
+
+    /* now, find an acceptable divider */
+    for (i = 0; i < sizeof(post_dividers); i++) {
+	output_freq = post_dividers[i] * vclk;
+	if (output_freq >= c.ppll_min && output_freq <= c.ppll_max)
+	    break;
+    }
+
+    /* calculate feedback divider */
+    n = c.ref_divider * output_freq;
+    d = c.dotclock;
+
+    pll->post_divider = post_dividers[i];
+    pll->feedback_divider = round_div(n, d);
+    pll->vclk = vclk;
+
+#ifdef DEBUG
+    printk(KERN_DEBUG "var_to_pll: post %d feedback %d vlck %d output %d ref_divider %d\n", 
+           pll->post_divider, pll->feedback_divider, vclk, output_freq,
+           c.ref_divider);
+    printk(KERN_DEBUG "var_to_pll: vclk_per: %d\n", period_in_ps);
+#endif
+
+    return 0;
+}
+
+
+static int
+aty128_pll_to_var(const struct aty128_pll *pll, struct fb_var_screeninfo *var,
+		const struct fb_info_aty128 *info)
+{
+    var->pixclock = 100000000 / pll->vclk;
+
+    return 0;
+}
+
+
+static void
+aty128_set_fifo(const struct aty128_ddafifo *dsp,
+			const struct fb_info_aty128 *info)
+{
+    aty_st_le32(DDA_CONFIG, dsp->dda_config);
+    aty_st_le32(DDA_ON_OFF, dsp->dda_on_off);
+}
+
+
+static int
+aty128_ddafifo(struct aty128_ddafifo *dsp,
+		const struct aty128_pll *pll,
+		u32 bpp,
+		const struct fb_info_aty128 *info)
+{
+    const struct aty128_meminfo *m = info->mem;
+    u32 xclk = info->constants.xclk;
+    u32 fifo_width = info->constants.fifo_width;
+    u32 fifo_depth = info->constants.fifo_depth;
+    s32 x, b, p, ron, roff;
+    u32 n, d;
+
+    /* 15bpp is really 16bpp */
+    if (bpp == 15)
+	bpp = 16;
+
+    n = xclk * fifo_width;
+    d = pll->vclk*bpp;
+    x = round_div(n, d);
+
+    ron = 4 * m->MB +
+	3 * ((m->Trcd - 2 > 0) ? m->Trcd - 2 : 0) +
+	2 * m->Trp +
+	m->Twr +
+	m->CL +
+	m->Tr2w +
+	x;
+
+#ifdef DEBUG
+    printk(KERN_DEBUG "aty128fb: x %x\n", x);
+#endif
+    b = 0;
+    while (x) {
+	x >>= 1;
+	b++;
+    }
+    p = b + 1;
+
+    ron <<= (11 - p);
+
+    n <<= (11 - p);
+    x = round_div(n, d);
+    roff = x * (fifo_depth - 4);
+    if ((ron + m->Rloop) >= roff) {
+	printk(KERN_ERR "aty128fb: Mode out of range!\n");
+	return -EINVAL;
+    }
+
+#ifdef DEBUG
+    printk(KERN_DEBUG "aty128fb: p: %x rloop: %x x: %x ron: %x roff: %x\n",
+                       p, m->Rloop, x, ron, roff);
+#endif
+    dsp->dda_config = p << 16 | m->Rloop << 20 | x;
+    dsp->dda_on_off = ron << 16 | roff;
+
+    return 0;
+}
+
+
+/*
+ * This actually sets the video mode.
+ */
+static void
+aty128_set_par(struct aty128fb_par *par,
+			struct fb_info_aty128 *info)
+{ 
+    u32 config;
+#ifdef CONFIG_FB_COMPAT_XPMAC
+    struct fb_var_screeninfo var;
+    int cmode, vmode;
+#endif
+    
+    info->current_par = *par;
+    
+    if (info->blitter_may_be_busy)
+        wait_for_idle(info);
+
+    /* clear all registers that may interfere with mode setting */
+    aty_st_le32(OVR_CLR, 0);
+    aty_st_le32(OVR_WID_LEFT_RIGHT, 0);
+    aty_st_le32(OVR_WID_TOP_BOTTOM, 0);
+    aty_st_le32(OV0_SCALE_CNTL, 0);
+    aty_st_le32(MPP_TB_CONFIG, 0);
+    aty_st_le32(MPP_GP_CONFIG, 0);
+    aty_st_le32(SUBPIC_CNTL, 0);
+    aty_st_le32(VIPH_CONTROL, 0);
+    aty_st_le32(I2C_CNTL_1, 0);         /* turn off i2c */
+    aty_st_le32(GEN_INT_CNTL, 0);	/* turn off interrupts */
+    aty_st_le32(CAP0_TRIG_CNTL, 0);
+    aty_st_le32(CAP1_TRIG_CNTL, 0);
+
+    aty_st_8(CRTC_EXT_CNTL + 1, 4);	/* turn video off */
+
+    aty128_set_crtc(&par->crtc, info);
+    aty128_set_pll(&par->pll, info);
+    aty128_set_fifo(&par->fifo_reg, info);
+
+    config = aty_ld_le32(CONFIG_CNTL) & ~3;
+
+#if defined(__BIG_ENDIAN)
+    if (par->crtc.bpp >= 24)
+	config |= 2;	/* make aperture do 32 byte swapping */
+    else if (par->crtc.bpp > 8)
+	config |= 1;	/* make aperture do 16 byte swapping */
+#endif
+
+    aty_st_le32(CONFIG_CNTL, config);
+    aty_st_8(CRTC_EXT_CNTL + 1, 0);	/* turn the video back on */
+
+    if (par->accel_flags & FB_ACCELF_TEXT)
+        aty128_init_engine(par, info);
+
+#ifdef CONFIG_FB_COMPAT_XPMAC
+    if (!console_fb_info || console_fb_info == &info->fb_info) {
+	display_info.height = ((par->crtc.v_total >> 16) & 0x7ff)+1;
+	display_info.width = (((par->crtc.h_total >> 16) & 0xff)+1) << 3;
+	display_info.depth = par->crtc.bpp;
+	display_info.pitch = par->crtc.vxres*par->crtc.bpp >> 3;
+        aty128_encode_var(&var, par, info);
+	if (mac_var_to_vmode(&var, &vmode, &cmode))
+	    display_info.mode = 0;
+	else
+	    display_info.mode = vmode;
+	strcpy(display_info.name, aty128fb_name);
+	display_info.fb_address = info->frame_buffer_phys;
+	display_info.cmap_adr_address = 0;
+	display_info.cmap_data_address = 0;
+	display_info.disp_reg_address = info->regbase_phys;
+    }
+#endif /* CONFIG_FB_COMPAT_XPMAC */
+}
+
+
+    /*
+     *  Open/Release the frame buffer device
+     */
+
+static int aty128fb_open(struct fb_info *info, int user)
+{
+    MOD_INC_USE_COUNT;
+    return(0);                              
+}
+        
+
+static int aty128fb_release(struct fb_info *info, int user)
+{
+    MOD_DEC_USE_COUNT;
+    return(0);                                                    
+}
+
+
+    /*
+     *  encode/decode the User Defined Part of the Display
+     */
+
+static int
+aty128_decode_var(struct fb_var_screeninfo *var, struct aty128fb_par *par,
+			const struct fb_info_aty128 *info)
+{
+    int err;
+
+    if ((err = aty128_var_to_crtc(var, &par->crtc, info)))
+ 	return err;
+
+    if ((err = aty128_var_to_pll(var->pixclock, &par->pll, info)))
+	return err;
+
+    if ((err = aty128_ddafifo(&par->fifo_reg, &par->pll, par->crtc.bpp, info)))
+	return err;
+
+    if (var->accel_flags & FB_ACCELF_TEXT)
+	par->accel_flags = FB_ACCELF_TEXT;
+    else
+	par->accel_flags = 0;
+
+    return 0;
+}
+
+
+static int
+aty128_encode_var(struct fb_var_screeninfo *var,
+			const struct aty128fb_par *par,
+			const struct fb_info_aty128 *info)
+{
+    int err;
+
+    if ((err = aty128_crtc_to_var(&par->crtc, var)))
+	return err;
+
+    if ((err = aty128_pll_to_var(&par->pll, var, info)))
+	return err;
+
+    var->red.msb_right = 0;
+    var->green.msb_right = 0;
+    var->blue.msb_right = 0;
+    var->transp.msb_right = 0;
+
+    var->nonstd = 0;
+    var->activate = 0;
+
+    var->height = -1;
+    var->width = -1;
+    var->accel_flags = par->accel_flags;
+
+    return 0;
+}           
+
+
+    /*
+     *  Get the User Defined Part of the Display
+     */
+
+static int
+aty128fb_get_var(struct fb_var_screeninfo *var, int con, struct fb_info *fb)
+{
+    const struct fb_info_aty128 *info = (struct fb_info_aty128 *)fb;
+
+    if (con == -1)
+	aty128_encode_var(var, &info->default_par, info); 
+    else
+	*var = fb_display[con].var;
+    return 0;
+}
+
+
+    /*
+     *  Set the User Defined Part of the Display
+     */
+
+static int
+aty128fb_set_var(struct fb_var_screeninfo *var, int con, struct fb_info *fb)
+{
+    struct fb_info_aty128 *info = (struct fb_info_aty128 *)fb;
+    struct aty128fb_par par;
+    struct display *display;
+    int oldxres, oldyres, oldvxres, oldvyres, oldbpp, oldaccel;
+    int accel, err;
+
+    display = (con >= 0) ? &fb_display[con] : fb->disp;
+
+    /* basic (in)sanity checks */
+    if (!var->xres)
+        var->xres = 1;
+    if (!var->yres)
+        var->yres = 1;
+    if (var->xres > var->xres_virtual)
+        var->xres_virtual = var->xres;
+    if (var->yres > var->yres_virtual)
+        var->yres_virtual = var->yres;
+    switch (var->bits_per_pixel) {
+        case 0 ... 8:
+            var->bits_per_pixel = 8;
+            break;
+        case 9 ... 16:
+            var->bits_per_pixel = 16;
+            break;
+        case 17 ... 24:
+            var->bits_per_pixel = 24;
+            break;
+       case 25 ... 32:
+            var->bits_per_pixel = 32;
+            break;
+        default:
+            return -EINVAL;
+    }
+
+    if ((err = aty128_decode_var(var, &par, info)))
+	return err;
+
+    aty128_encode_var(var, &par, info);
+
+    if ((var->activate & FB_ACTIVATE_MASK) != FB_ACTIVATE_NOW)
+	return 0;
+
+    oldxres = display->var.xres;
+    oldyres = display->var.yres;
+    oldvxres = display->var.xres_virtual;
+    oldvyres = display->var.yres_virtual;
+    oldbpp = display->var.bits_per_pixel;
+    oldaccel = display->var.accel_flags;
+    display->var = *var;
+    if (oldxres != var->xres || oldyres != var->yres ||
+	oldvxres != var->xres_virtual || oldvyres != var->yres_virtual ||
+	oldbpp != var->bits_per_pixel || oldaccel != var->accel_flags) {
+
+	struct fb_fix_screeninfo fix;
+
+	aty128_encode_fix(&fix, &par, info);
+        display->screen_base = (char *)info->frame_buffer;
+	display->visual = fix.visual;
+	display->type = fix.type;
+	display->type_aux = fix.type_aux;
+	display->ypanstep = fix.ypanstep;
+	display->ywrapstep = fix.ywrapstep;
+	display->line_length = fix.line_length;
+	display->can_soft_blank = 1;
+	display->inverse = 0;
+
+	accel = var->accel_flags & FB_ACCELF_TEXT;
+        aty128_set_disp(display, info, par.crtc.bpp, accel);
+
+	if (accel)
+	    display->scrollmode = SCROLL_YNOMOVE;
+	else
+	    display->scrollmode = SCROLL_YREDRAW;
+
+	if (info->fb_info.changevar)
+	    (*info->fb_info.changevar)(con);
+    }
+
+    if (!info->fb_info.display_fg || info->fb_info.display_fg->vc_num == con)
+	aty128_set_par(&par, info);
+
+    if (oldbpp != var->bits_per_pixel) {
+	if ((err = fb_alloc_cmap(&display->cmap, 0, 0)))
+	    return err;
+	do_install_cmap(con, &info->fb_info);
+    } 
+
+    return 0;
+}
+
+
+static void
+aty128_set_disp(struct display *disp,
+			struct fb_info_aty128 *info, int bpp, int accel)
+{
+    switch (bpp) {
+#ifdef FBCON_HAS_CFB8
+    case 8:
+	info->dispsw = accel ? fbcon_aty128_8 : fbcon_cfb8;
+        disp->dispsw = &info->dispsw;
+	break;
+#endif
+#ifdef FBCON_HAS_CFB16
+    case 15:
+    case 16:
+	info->dispsw = accel ? fbcon_aty128_16 : fbcon_cfb16;
+        disp->dispsw = &info->dispsw;
+	disp->dispsw_data = info->fbcon_cmap.cfb16;
+	break;
+#endif
+#ifdef FBCON_HAS_CFB24
+    case 24:
+	info->dispsw = accel ? fbcon_aty128_24 : fbcon_cfb24;
+        disp->dispsw = &info->dispsw;
+	disp->dispsw_data = info->fbcon_cmap.cfb24;
+	break;
+#endif
+#ifdef FBCON_HAS_CFB32
+    case 32:
+	info->dispsw = accel ? fbcon_aty128_32 : fbcon_cfb32;
+        disp->dispsw = &info->dispsw;
+	disp->dispsw_data = info->fbcon_cmap.cfb32;
+	break;
+#endif
+    default:
+	disp->dispsw = &fbcon_dummy;
+    }
+}
+
+
+static void
+aty128_encode_fix(struct fb_fix_screeninfo *fix,
+			struct aty128fb_par *par,
+			const struct fb_info_aty128 *info)
+{
+    memset(fix, 0, sizeof(struct fb_fix_screeninfo));
+    
+    strcpy(fix->id, aty128fb_name);
+
+    fix->smem_start = (void *)info->frame_buffer_phys;
+    fix->mmio_start = (void *)info->regbase_phys;
+
+    fix->smem_len = (u32)info->vram_size;
+    fix->mmio_len = 0x1fff;
+
+    fix->type = FB_TYPE_PACKED_PIXELS;
+    fix->type_aux = 0;
+    fix->line_length = par->crtc.vxres*par->crtc.bpp/8;
+    fix->visual = par->crtc.bpp <= 8 ? FB_VISUAL_PSEUDOCOLOR
+                                     : FB_VISUAL_DIRECTCOLOR;
+    fix->ywrapstep = 0;
+    fix->xpanstep = 8;
+    fix->ypanstep = 1;
+
+    fix->accel = FB_ACCEL_ATI_RAGE128;
+
+    return;
+}
+
+
+    /*
+     *  Get the Fixed Part of the Display
+     */
+static int
+aty128fb_get_fix(struct fb_fix_screeninfo *fix, int con, struct fb_info *fb)
+{
+    const struct fb_info_aty128 *info = (struct fb_info_aty128 *)fb;
+    struct aty128fb_par par;
+
+    if (con == -1)
+	par = info->default_par;
+    else
+	aty128_decode_var(&fb_display[con].var, &par, info); 
+
+    aty128_encode_fix(fix, &par, info);
+
+    return 0;            
+}
+
+
+    /*
+     *  Pan or Wrap the Display
+     *
+     *  Not supported (yet!)
+     */
+static int
+aty128fb_pan_display(struct fb_var_screeninfo *var, int con,
+			   struct fb_info *fb)
+{
+    struct fb_info_aty128 *info = (struct fb_info_aty128 *)fb;
+    struct aty128fb_par *par = &info->current_par;
+    u32 xoffset, yoffset;
+    u32 offset;
+    u32 xres, yres;
+
+    xres = (((par->crtc.h_total >> 16) & 0xff) + 1) * 8;
+    yres = ((par->crtc.v_total >> 16) & 0x7ff) + 1;
+
+    xoffset = (var->xoffset +7) & ~7;
+    yoffset = var->yoffset;
+
+    if (xoffset+xres > par->crtc.vxres || yoffset+yres > par->crtc.vyres)
+        return -EINVAL;
+
+    par->crtc.xoffset = xoffset;
+    par->crtc.yoffset = yoffset;
+
+    offset = ((yoffset * par->crtc.vxres + xoffset) * par->crtc.bpp) >> 6;
+
+    aty_st_le32(CRTC_OFFSET, offset);
+
+    return 0;
+}
+
+
+    /*
+     *  Get the Colormap
+     */
+
+static int
+aty128fb_get_cmap(struct fb_cmap *cmap, int kspc, int con,
+			struct fb_info *info)
+{
+    if (con == currcon) /* current console? */
+	return fb_get_cmap(cmap, kspc, aty128_getcolreg, info);
+    else if (fb_display[con].cmap.len) /* non default colormap? */
+	fb_copy_cmap(&fb_display[con].cmap, cmap, kspc ? 0 : 2);
+    else {  
+	int size = (fb_display[con].var.bits_per_pixel <= 8) ? 256 : 32;
+	fb_copy_cmap(fb_default_cmap(size), cmap, kspc ? 0 : 2);
+    }
+
+    return 0;
+}
+
+    /*
+     *  Set the Colormap
+     */
+
+static int
+aty128fb_set_cmap(struct fb_cmap *cmap, int kspc, int con,
+			struct fb_info *info)
+{
+    int err;
+    struct display *disp;  
+
+    if (con >= 0)
+	disp = &fb_display[con];
+    else
+	disp = info->disp;
+    if (!disp->cmap.len) {      /* no colormap allocated? */
+        int size = (disp->var.bits_per_pixel <= 8) ? 256 : 32;
+	if ((err = fb_alloc_cmap(&disp->cmap, size, 0)))
+	    return err;
+    }
+
+    if (con == currcon) /* current console? */
+	return fb_set_cmap(cmap, kspc, aty128_setcolreg, info);
+    else
+	fb_copy_cmap(cmap, &disp->cmap, kspc ? 0 : 1);
+
+    return 0;                
+}
+
+
+    /*
+     *  Frame Buffer Specific ioctls
+     */
+
+static int
+aty128fb_ioctl(struct inode *inode, struct file *file, u_int cmd,
+		     u_long arg, int con, struct fb_info *info)
+{
+    return -EINVAL;
+}
+
+
+#ifndef MODULE
+int __init
+aty128fb_setup(char *options)
+{
+    char *this_opt;
+
+    if (!options || !*options)
+	return 0;
+
+    for (this_opt = strtok(options, ","); this_opt;
+	 this_opt = strtok(NULL, ",")) {
+	if (!strncmp(this_opt, "font:", 5)) {
+	    char *p;
+	    int i;
+	    
+	    p = this_opt +5;
+	    for (i = 0; i < sizeof(fontname) - 1; i++)
+		if (!*p || *p == ' ' || *p == ',')
+		    break;
+	    memcpy(fontname, this_opt + 5, i);
+	    fontname[i] = 0;
+	} else if (!strncmp(this_opt, "noaccel", 7)) {
+	    noaccel = 1;
+	} else if (!strncmp(this_opt, "depth:", 6)) {
+            unsigned int depth = simple_strtoul(this_opt+6, NULL, 0);
+            switch (depth) {
+            case 0 ... 8:
+                initdepth = 8;
+#ifdef CONFIG_PPC
+                default_cmode = CMODE_8;
+#endif
+                break;
+            case 9 ... 16:
+                initdepth = 16;
+#ifdef CONFIG_PPC
+                default_cmode = CMODE_16;
+#endif
+                break;
+            case 17 ... 24:
+                initdepth = 24;
+                break;
+            case 25 ... 32:
+                initdepth = 32;
+#ifdef CONFIG_PPC
+                default_cmode = CMODE_32;
+#endif
+                break;
+            default:
+                initdepth = 8;
+            }
+        }
+#ifdef CONFIG_MTRR
+        else if(!strncmp(this_opt, "nomtrr", 6)) {
+            mtrr = 0;
+        }
+#endif /* CONFIG_MTRR */
+#ifdef CONFIG_PPC
+        /* vmode and cmode depreciated */
+	else if (!strncmp(this_opt, "vmode:", 6)) {
+            unsigned int vmode = simple_strtoul(this_opt+6, NULL, 0);
+            if (vmode > 0 && vmode <= VMODE_MAX)
+                default_vmode = vmode;
+        } else if (!strncmp(this_opt, "cmode:", 6)) {
+            unsigned int cmode = simple_strtoul(this_opt+6, NULL, 0);
+            switch (cmode) {
+	    case 0:
+	    case 8:
+		default_cmode = CMODE_8;
+		break;
+	    case 15:
+	    case 16:
+		default_cmode = CMODE_16;
+		break;
+	    case 24:
+	    case 32:
+		default_cmode = CMODE_32;
+		break;
+            }
+        }
+#endif /* CONFIG_PPC */
+        else
+            mode_option = this_opt;
+    }
+    return 0;
+}
+#endif /* !MODULE */
+
+
+    /*
+     *  Initialisation
+     */
+
+static int __init
+aty128_init(struct fb_info_aty128 *info, const char *name)
+{
+    struct fb_var_screeninfo var;
+    u32 dac;
+    int j, k;
+    u8 chip_rev;
+    const struct aty128_chip_info *aci = &aty128_pci_probe_list[0];
+    char *video_card = "Rage128";
+
+    if (!info->vram_size)	/* may have already been probed */
+	info->vram_size = aty_ld_le32(CONFIG_MEMSIZE) & 0x03FFFFFF;
+
+    /* Get the chip revision */
+    chip_rev = (aty_ld_le32(CONFIG_CNTL) >> 16) & 0x1F;
+
+    /* put a name with the face */
+    while (aci->name && info->pdev->device != aci->device) { aci++; }
+    video_card = (char *)aci->name;
+    info->chip_gen = aci->chip_gen;
+
+    printk(KERN_INFO "aty128fb: %s [chip rev 0x%x] ", video_card, chip_rev);
+
+    if (info->vram_size % (1024 * 1024) == 0)
+	printk("%dM %s\n", info->vram_size / (1024*1024), info->mem->name);
+    else
+	printk("%dk %s\n", info->vram_size / 1024, info->mem->name);
+
+    /* fill in info */
+    strcpy(info->fb_info.modename, aty128fb_name);
+    info->fb_info.node = -1;
+    info->fb_info.fbops = &aty128fb_ops;
+    info->fb_info.disp = &info->disp;
+    strcpy(info->fb_info.fontname, fontname);
+    info->fb_info.changevar = NULL;
+    info->fb_info.switch_con = &aty128fbcon_switch;
+    info->fb_info.blank = &aty128fbcon_blank;
+    info->fb_info.flags = FBINFO_FLAG_DEFAULT;
+    
+#ifdef MODULE
+    var = default_var;
+#else
+    memset(&var, 0, sizeof(var));
+
+#ifdef CONFIG_PMAC
+    if (default_vmode == VMODE_CHOOSE) {
+#endif /* CONFIG_PMAC */
+        var = default_var;
+
+#ifdef CONFIG_PMAC
+    } else {
+	if (mac_vmode_to_var(default_vmode, default_cmode, &var))
+	    var = default_var;
+    }
+#endif /* CONFIG_PMAC */
+
+#endif /* MODULE */
+
+    if (noaccel)
+        var.accel_flags &= ~FB_ACCELF_TEXT;
+    else
+        var.accel_flags |= FB_ACCELF_TEXT;
+
+    if (aty128_decode_var(&var, &info->default_par, info)) {
+	printk(KERN_ERR "aty128fb: Cannot set default mode.\n");
+	return 0;
+    }
+
+    /* load up the palette with default colors */
+    for (j = 0; j < 16; j++) {
+        k = color_table[j];
+        info->palette[j].red = default_red[k];
+        info->palette[j].green = default_grn[k];
+        info->palette[j].blue = default_blu[k];
+    }
+
+    dac = aty_ld_le32(DAC_CNTL);
+    dac |= (DAC_8BIT_EN | DAC_RANGE_CNTL | DAC_BLANKING);
+    dac |= DAC_8BIT_EN;			/* set 8 bit dac             */
+    dac |= DAC_MASK;			/* set DAC mask              */
+    aty_st_le32(DAC_CNTL, dac);
+
+    /* turn off bus mastering, just in case */
+    aty_st_le32(BUS_CNTL, aty_ld_le32(BUS_CNTL) | BUS_MASTER_DIS);
+
+    aty128fb_set_var(&var, -1, &info->fb_info);
+    aty128_init_engine(&info->default_par, info);
+
+    board_list = aty128_board_list_add(board_list, info);
+
+    if (register_framebuffer(&info->fb_info) < 0)
+	return 0;
+
+    printk(KERN_INFO "fb%d: %s frame buffer device on %s\n",
+	   GET_FB_IDX(info->fb_info.node), aty128fb_name, name);
+
+    return 1;	/* success! */
+}
+
+
+/* add a new card to the list  ++ajoshi */
+static struct
+fb_info_aty128 *aty128_board_list_add(struct fb_info_aty128 *board_list,
+                                       struct fb_info_aty128 *new_node)
+{
+    struct fb_info_aty128 *i_p = board_list;
+
+    new_node->next = NULL;
+    if(board_list == NULL)
+	return new_node;
+    while(i_p->next != NULL)
+	i_p = i_p->next;
+    i_p->next = new_node;
+
+    return board_list;
+}
+
+
+int __init
+aty128fb_init(void)
+{
+#if defined(CONFIG_FB_OF)
+    /* let offb handle init */
+#elif defined (CONFIG_PCI)
+    struct pci_dev *pdev = NULL;
+    const struct aty128_chip_info *aci = &aty128_pci_probe_list[0];
+
+    while (aci->name != NULL) {
+        pdev = pci_find_device(PCI_VENDOR_ID_ATI, aci->device, pdev);
+        while (pdev != NULL) {
+            if (aty128_pci_register(pdev, aci) == 0)
+                return 0;
+            pdev = pci_find_device(PCI_VENDOR_ID_ATI, aci->device, pdev);
+        }
+ 	aci++;
+    }
+#endif
+    return 0;
+}
+
+
+#if defined(CONFIG_PCI) && !defined(CONFIG_FB_OF)
+
+/* register a card    ++ajoshi */
+static int __init
+aty128_pci_register(struct pci_dev *pdev,
+                               const struct aty128_chip_info *aci)
+{
+    struct fb_info_aty128 *info = NULL;
+    unsigned long fb_addr, reg_addr;
+    u16 tmp;
+
+    fb_addr = pdev->base_address[0] & PCI_BASE_ADDRESS_MEM_MASK;
+    reg_addr = pdev->base_address[2] & PCI_BASE_ADDRESS_MEM_MASK;
+    if (!reg_addr)
+	return -1;
+
+    info = kmalloc(sizeof(struct fb_info_aty128), GFP_ATOMIC);
+    if(!info) {
+        printk(KERN_ERR "aty128fb: can't alloc fb_info_aty128\n");
+	goto unmap_out;
+    }
+    memset(info, 0, sizeof(struct fb_info_aty128));
+
+    info->pdev = pdev;
+
+    info->regbase_phys = reg_addr;
+    info->regbase = ioremap(reg_addr, 0x1FFF);
+
+    if (!info->regbase)
+        goto err_out;
+
+    info->vram_size = aty_ld_le32(CONFIG_MEMSIZE) & 0x03FFFFFF;
+
+    info->frame_buffer_phys = fb_addr;
+    info->frame_buffer = (unsigned long)ioremap(fb_addr, info->vram_size);
+
+    if (!info->frame_buffer)
+        goto err_out;
+
+    pci_read_config_word(pdev, PCI_COMMAND, &tmp);
+    if (!(tmp & PCI_COMMAND_MEMORY)) {
+        tmp |= PCI_COMMAND_MEMORY;
+        pci_write_config_word(pdev, PCI_COMMAND, tmp);
+    }
+
+    if (!aty128find_ROM(info)) {
+       printk(KERN_INFO "aty128fb: Rage128 BIOS not located. Guessing...\n");
+       aty128_timings(info);
+    }
+#ifndef CONFIG_PPC
+   else
+        aty128_get_pllinfo(info);
+
+    /* free up to-be unused resources. bios_seg is mapped by
+     * aty128find_ROM() and used by aty128_get_pllinfo()
+     *
+     * TODO: make more elegant. doesn't need to be global
+     */
+   if (bios_seg)
+        iounmap(bios_seg);
+#endif
+#ifdef CONFIG_MTRR
+    if (mtrr) {
+        info->mtrr.vram = mtrr_add(info->frame_buffer_phys, info->vram_size,
+                                   MTRR_TYPE_WRCOMB, 1);
+        info->mtrr.vram_valid = 1;
+        /* let there be speed */
+        printk(KERN_INFO "aty128fb: Rage128 MTRR set to ON\n");
+    }
+#endif /* CONFIG_MTRR */
+    if (!aty128_init(info, "PCI"))
+        goto err_out;
+
+    return 0;
+
+err_out:
+    kfree (info);
+unmap_out:
+
+    return -1;
+}
+#endif /* ! CONFIG_FB_OF */
+
+static int __init
+aty128find_ROM(struct fb_info_aty128 *info)
+{
+    int  flag = 0;
+#ifndef CONFIG_PPC
+    u32  segstart;
+    char *rom_base;
+    char *rom;
+    int  stage;
+    int  i;
+    char aty_rom_sig[] = "761295520";   /* ATI ROM Signature      */
+    char R128_sig[] = "R128";           /* Rage128 ROM identifier */
+
+    for (segstart=0x000c0000; segstart<0x000f0000; segstart+=0x00001000) {
+        stage = 1;
+
+        rom_base = (char *) ioremap(segstart, 0x1000);
+
+        if ((*rom_base == 0x55) && (((*(rom_base + 1)) & 0xff) == 0xaa))
+            stage = 2;
+
+        if (stage != 2) {
+            iounmap(rom_base);
+            continue;
+        }
+        rom = rom_base;
+
+        for (i = 0; (i < 128 - strlen(aty_rom_sig)) && (stage != 3); i++) {
+            if (aty_rom_sig[0] == *rom) {
+                if (strncmp(aty_rom_sig, rom, strlen(aty_rom_sig)) == 0) {
+                    stage = 3;
+                }
+            }
+            rom++;
+        }
+        if (stage != 3) {
+            iounmap(rom_base);
+            continue;
+        }
+        rom = rom_base;
+
+        /* ATI signature found.  Let's see if it's a Rage128 */
+        for (i = 0; (i < 512) && (stage != 4); i++) {
+            if (R128_sig[0] == *rom) {
+                if (strncmp(R128_sig, rom, strlen(R128_sig)) == 0) {
+                    stage = 4;
+                }
+            }
+            rom++;
+        }
+        if (stage != 4) {
+            iounmap(rom_base);
+            continue;
+        }
+
+        bios_seg = rom_base;
+        printk(KERN_INFO "aty128fb: Rage128 BIOS located at segment %4.4X\n",
+                         (unsigned int)rom_base);
+
+        flag = 1;
+        break;
+    }
+#endif /* !CONFIG_PPC */
+    return (flag);
+}
+
+#ifndef CONFIG_PPC
+static void __init
+aty128_get_pllinfo(struct fb_info_aty128 *info)
+{   
+    void *bios_header;
+    void *header_ptr;
+    u16 bios_header_offset, pll_info_offset;
+    PLL_BLOCK pll;
+
+    bios_header = bios_seg + 0x48L;
+    header_ptr  = bios_header;
+
+    bios_header_offset = readw(header_ptr);
+    bios_header = bios_seg + bios_header_offset;
+    bios_header += 0x30;
+
+    header_ptr = bios_header;
+    pll_info_offset = readw(header_ptr);
+    header_ptr = bios_seg + pll_info_offset;
+
+    memcpy_fromio(&pll, header_ptr, 50);
+
+    info->constants.ppll_max = pll.PCLK_max_freq;
+    info->constants.ppll_min = pll.PCLK_min_freq;
+    info->constants.xclk = (u32)pll.XCLK;
+    info->constants.ref_divider = (u32)pll.PCLK_ref_divider;
+    info->constants.dotclock = (u32)pll.PCLK_ref_freq;
+
+    aty_st_pll(PPLL_REF_DIV, info->constants.ref_divider);
+    aty_pll_writeupdate(info);
+
+    info->constants.fifo_width = 128;
+    info->constants.fifo_depth = 32;
+
+#ifdef DEBUG
+    printk(KERN_DEBUG "get_pllinfo: ppll_max %d ppll_min %d xclk %d "
+                      "ref_divider %d dotclock %d\n", 
+                   info->constants.ppll_max, info->constants.ppll_min,
+                   info->constants.xclk, info->constants.ref_divider,
+                   info->constants.dotclock);
+#endif
+
+    switch(aty_ld_le32(MEM_CNTL) & 0x03) {
+    case 0:
+        info->mem = &sdr_128; 
+        break;
+    case 1:
+        info->mem = &sdr_sgram;
+        break;  
+    case 2: 
+        info->mem = &ddr_sgram;
+        break;  
+    default:        
+        info->mem = &sdr_sgram;
+    }       
+
+    return;
+}           
+#endif /* ! CONFIG_PPC */
+
+
+#ifdef CONFIG_FB_OF
+void __init
+aty128fb_get_of_val(struct device_node *dp, char *property, int *value)
+{
+    int *result, size = 0;
+
+    result = (int *) get_property(dp, property, &size);
+    if (size)
+	*value = *result;
+}
+
+void __init
+aty128fb_of_init(struct device_node *dp)
+{
+    unsigned long addr, reg_addr, fb_addr;
+    struct fb_info_aty128 *info;
+    u8 bus, devfn;
+    u16 cmd;
+
+    if (device_is_compatible(dp, "ATY,RageM3p")) {
+	/* XXX kludge for now */
+	if (dp->name == 0 || strcmp(dp->name, "ATY,RageM3pA") != 0
+	    || dp->parent == 0)
+	    return;
+	dp = dp->parent;
+    }
+
+    switch (dp->n_addrs) {
+    case 3:
+	fb_addr = dp->addrs[0].address;
+	reg_addr = dp->addrs[2].address;
+	break;
+    default:
+	printk(KERN_ERR "aty128fb: TODO unexpected addresses\n");
+	return;
+    }
+
+    addr = (unsigned long) ioremap(reg_addr, 0x1FFF);
+    if (!addr) {
+	printk(KERN_ERR "aty128fb: can't map memory registers\n");
+	return;
+    }
+
+    info = kmalloc(sizeof(struct fb_info_aty128), GFP_ATOMIC);
+    if (!info) {
+	printk(KERN_ERR "aty128fb: can't alloc fb_info_aty128\n");
+	return;
+    }
+    memset((void *) info, 0, sizeof(struct fb_info_aty128));
+
+    info->regbase_phys = reg_addr;
+    info->regbase = (void *) addr;
+
+    /* enabled memory-space accesses using config-space command register */
+    if (pci_device_loc(dp, &bus, &devfn) == 0) {
+	pcibios_read_config_word(bus, devfn, PCI_COMMAND, &cmd);
+	if (!(cmd & PCI_COMMAND_MEMORY)) {
+	    cmd |= PCI_COMMAND_MEMORY;
+	    pcibios_write_config_word(bus, devfn, PCI_COMMAND, cmd);
+	}
+	info->pdev = pci_find_slot(bus, devfn);
+    }
+
+    info->vram_size = aty_ld_le32(CONFIG_MEMSIZE) & 0x03FFFFFF;
+    info->frame_buffer_phys = fb_addr;
+    info->frame_buffer = (unsigned long)ioremap(fb_addr, info->vram_size);
+
+    if (!info->frame_buffer) {
+	printk(KERN_ERR "aty128fb: can't map frame buffer\n");
+	kfree(info);
+	return;
+    }
+
+    /* fall back to defaults */
+    aty128_timings(info);
+
+    if (!aty128_init(info, dp->full_name)) {
+	kfree(info);
+	return;
+    }
+
+#ifdef CONFIG_FB_COMPAT_XPMAC
+    if (!console_fb_info)
+	console_fb_info = &info->fb_info;
+#endif
+}
+#endif /* CONFIG_FB_OF */
+
+
+/* fill in known card constants if pll_block is not available */
+static void __init
+aty128_timings(struct fb_info_aty128 *info)
+{
+#if defined(__powerpc__)
+    /* instead of a table lookup assume OF has properly set up
+       the PLL registers and use their values to set the XCLK
+       values and reference divider values */
+
+    u32 x_mpll_ref_fb_div;
+    u32 xclk_cntl;
+    u32 Nx, M;
+    unsigned PostDivSet[] = {0, 1, 2, 4, 8, 3, 6, 12};
+  
+    /* Assume REF clock is 2950 (in units of 10khz) */
+    /* and that all pllclk must be between 125 Mhz and 250Mhz */
+    info->constants.dotclock = 2950; 
+    info->constants.ppll_min = 12500;
+    info->constants.ppll_max = 25000;
+
+    x_mpll_ref_fb_div = aty_ld_pll(X_MPLL_REF_FB_DIV);
+    xclk_cntl = aty_ld_pll(XCLK_CNTL) & 0x7;
+    Nx = (x_mpll_ref_fb_div & 0x00FF00) >> 8;
+    M =  (x_mpll_ref_fb_div & 0x0000FF);
+
+    info->constants.xclk =  round_div((2 * Nx * info->constants.dotclock), 
+			  (M * PostDivSet[xclk_cntl]));
+
+    info->constants.ref_divider = aty_ld_pll(PPLL_REF_DIV) & PPLL_REF_DIV_MASK;
+
+    printk("aty128fb: detected XCLK=0x%x, ref_div=0x%x\n",
+    	info->constants.xclk, info->constants.ref_divider);
+#else
+    
+    /* TODO make an attempt at probing */
+    if (!info->constants.dotclock)
+	info->constants.dotclock = 2950;
+
+    /* from documentation */
+    if (!info->constants.ppll_min)
+	info->constants.ppll_min = 12500;
+    if (!info->constants.ppll_max)
+	info->constants.ppll_max = 25000;	/* 23000 on some cards? */
+
+    /* XXX TODO. Calculuate properly. */
+    if (!info->constants.ref_divider)
+	info->constants.ref_divider = 0x3b;
+    aty_st_pll(PPLL_REF_DIV, info->constants.ref_divider);
+    aty_pll_writeupdate(info);
+
+    info->constants.xclk = 0x1d4d;
+    aty_st_pll(X_MPLL_REF_FB_DIV, 0x004c4c1e);
+    aty_pll_writeupdate(info);
+ 
+#endif
+
+    info->constants.fifo_width = 128;
+    info->constants.fifo_depth = 32;
+
+    switch (aty_ld_le32(MEM_CNTL) & 0x3) {
+    case 0:
+	info->mem = &sdr_128;
+	break;
+    case 1:
+	info->mem = &sdr_sgram;
+	break;
+    case 2:
+	info->mem = &ddr_sgram;
+	break;
+    default:
+	info->mem = &sdr_sgram;
+    }
+}
+
+
+static int
+aty128fbcon_switch(int con, struct fb_info *fb)
+{
+    struct fb_info_aty128 *info = (struct fb_info_aty128 *)fb;
+    struct aty128fb_par par;
+
+    /* Do we have to save the colormap? */
+    if (fb_display[currcon].cmap.len)
+    	fb_get_cmap(&fb_display[currcon].cmap, 1, aty128_getcolreg, fb);
+
+    /* set the current console */
+    currcon = con;
+
+    aty128_decode_var(&fb_display[con].var, &par, info);
+    aty128_set_par(&par, info);
+
+    aty128_set_disp(&fb_display[con], info, par.crtc.bpp,
+        par.accel_flags & FB_ACCELF_TEXT);
+
+    do_install_cmap(con, fb);
+
+    return 1;
+}
+
+
+    /*
+     *  Blank the display.
+     */
+static void
+aty128fbcon_blank(int blank, struct fb_info *fb)
+{
+    struct fb_info_aty128 *info = (struct fb_info_aty128 *)fb;
+    u8 state = 0;
+
+    if (blank & VESA_VSYNC_SUSPEND)
+	state |= 2;
+    if (blank & VESA_HSYNC_SUSPEND)
+	state |= 1;
+    if (blank & VESA_POWERDOWN)
+	state |= 4;
+
+    aty_st_8(CRTC_EXT_CNTL+1, state);
+}
+
+
+    /*
+     *  Read a single color register and split it into
+     *  colors/transparent. Return != 0 for invalid regno.
+     */
+static int
+aty128_getcolreg(u_int regno, u_int *red, u_int *green, u_int *blue,
+                         u_int *transp, struct fb_info *fb)
+{
+    struct fb_info_aty128 *info = (struct fb_info_aty128 *) fb;
+
+    if (regno > 255)
+	return 1;
+
+    *red = (info->palette[regno].red<<8) | info->palette[regno].red;
+    *green = (info->palette[regno].green<<8) | info->palette[regno].green;
+    *blue = (info->palette[regno].blue<<8) | info->palette[regno].blue;
+    *transp = 0;
+
+    return 0;
+}
+
+
+    /*
+     *  Set a single color register. The values supplied are already
+     *  rounded down to the hardware's capabilities (according to the
+     *  entries in the var structure). Return != 0 for invalid regno.
+     */
+static int
+aty128_setcolreg(u_int regno, u_int red, u_int green, u_int blue,
+                         u_int transp, struct fb_info *fb)
+{
+    struct fb_info_aty128 *info = (struct fb_info_aty128 *)fb;
+    u32 col;
+
+    if (regno > 255)
+	return 1;
+
+    red >>= 8;
+    green >>= 8;
+    blue >>= 8;
+    info->palette[regno].red = red;
+    info->palette[regno].green = green;
+    info->palette[regno].blue = blue;
+    	
+    /* Note: For now, on M3, we set palette on both heads, which may
+     * be useless. Can someone with a M3 check this ? */    	
+    	
+    /* initialize gamma ramp for hi-color+ */
+
+    if ((info->current_par.crtc.bpp > 8) && (regno == 0)) {
+        int i;
+
+        if (info->chip_gen == rage_M3)
+            aty_st_le32(DAC_CNTL, aty_ld_le32(DAC_CNTL) & ~PALETTE_ACCESS_CNTL);
+
+        for (i=16; i<256; i++) {
+            aty_st_8(PALETTE_INDEX, i);
+            col = (i << 16) | (i << 8) | i;
+            aty_st_le32(PALETTE_DATA, col);
+        }
+
+        if (info->chip_gen == rage_M3) {
+            aty_st_le32(DAC_CNTL, aty_ld_le32(DAC_CNTL) | PALETTE_ACCESS_CNTL);
+
+            for (i=16; i<256; i++) {
+                aty_st_8(PALETTE_INDEX, i);
+                col = (i << 16) | (i << 8) | i;
+                aty_st_le32(PALETTE_DATA, col);
+            }
+        }
+    }
+
+    /* initialize palette */
+
+    if (info->chip_gen == rage_M3)
+        aty_st_le32(DAC_CNTL, aty_ld_le32(DAC_CNTL) & ~PALETTE_ACCESS_CNTL);
+
+    if (info->current_par.crtc.bpp == 16)
+        aty_st_8(PALETTE_INDEX, (regno << 3));
+    else
+        aty_st_8(PALETTE_INDEX, regno);
+    col = (red << 16) | (green << 8) | blue;
+    aty_st_le32(PALETTE_DATA, col);
+    if (info->chip_gen == rage_M3) {
+    	aty_st_le32(DAC_CNTL, aty_ld_le32(DAC_CNTL) | PALETTE_ACCESS_CNTL);
+        if (info->current_par.crtc.bpp == 16)
+            aty_st_8(PALETTE_INDEX, (regno << 3));
+        else
+            aty_st_8(PALETTE_INDEX, regno);
+        aty_st_le32(PALETTE_DATA, col);
+    }
+    
+    if (regno < 16)
+	switch (info->current_par.crtc.bpp) {
+#ifdef FBCON_HAS_CFB16
+	case 9 ... 16:
+	    info->fbcon_cmap.cfb16[regno] = (regno << 10) | (regno << 5) |
+                regno;
+	    break;
+#endif
+#ifdef FBCON_HAS_CFB24
+	case 17 ... 24:
+	    info->fbcon_cmap.cfb24[regno] = (regno << 16) | (regno << 8) |
+		regno;
+	    break;
+#endif
+#ifdef FBCON_HAS_CFB32
+	case 25 ... 32: {
+            u32 i;
+
+            i = (regno << 8) | regno;
+            info->fbcon_cmap.cfb32[regno] = (i << 16) | i;
+	    break;
+        }
+#endif
+	}
+    return 0;
+}
+
+
+static void
+do_install_cmap(int con, struct fb_info *info)
+{
+    if (con != currcon)
+	return;
+
+    if (fb_display[con].cmap.len)
+	fb_set_cmap(&fb_display[con].cmap, 1, aty128_setcolreg, info);
+    else {
+	int size = (fb_display[con].var.bits_per_pixel <= 8) ? 256 : 16;
+	fb_set_cmap(fb_default_cmap(size), 1, aty128_setcolreg, info);
+    }
+}
+
+
+    /*
+     *  Accelerated functions
+     */
+
+static void
+aty128_rectcopy(int srcx, int srcy, int dstx, int dsty,
+		u_int width, u_int height,
+		struct fb_info_aty128 *info)
+{
+    u32 save_dp_datatype, save_dp_cntl;
+
+    wait_for_fifo(1, info);
+    aty_st_le32(CLR_CMP_CNTL, 0);
+    
+    wait_for_fifo(2, info);
+    save_dp_datatype = aty_ld_le32(DP_DATATYPE);
+    save_dp_cntl     = aty_ld_le32(DP_CNTL);
+
+    wait_for_fifo(6, info);
+    aty_st_le32(DP_DATATYPE, (BRUSH_SOLIDCOLOR << 16) | SRC_DSTCOLOR);
+    aty_st_le32(DP_MIX, ROP3_SRCCOPY | DP_SRC_RECT);
+    aty_st_le32(DP_CNTL, DST_X_LEFT_TO_RIGHT | DST_Y_TOP_TO_BOTTOM);
+    aty_st_le32(SRC_Y_X, (srcy << 16) | srcx);
+    aty_st_le32(DST_Y_X, (dsty << 16) | dstx);
+    aty_st_le32(DST_HEIGHT_WIDTH, (height << 16) | width);
+
+    info->blitter_may_be_busy = 1;
+
+    wait_for_fifo(2, info);
+    aty_st_le32(DP_DATATYPE, save_dp_datatype);
+    aty_st_le32(DP_CNTL, save_dp_cntl); 
+
+    wait_for_idle(info);
+}
+
+
+    /*
+     * Text mode accelerated functions
+     */
+
+
+static void
+fbcon_aty128_bmove(struct display *p, int sy, int sx, int dy, int dx,
+			int height, int width)
+{
+    sx     *= fontwidth(p);
+    sy     *= fontheight(p);
+    dx     *= fontwidth(p);
+    dy     *= fontheight(p);
+    width  *= fontwidth(p);
+    height *= fontheight(p);
+
+    aty128_rectcopy(sx, sy, dx, dy, width, height,
+			(struct fb_info_aty128 *)p->fb_info);
+}
+
+
+#ifdef FBCON_HAS_CFB8
+static void fbcon_aty8_putc(struct vc_data *conp, struct display *p,
+                            int c, int yy, int xx)
+{
+    struct fb_info_aty128 *fb = (struct fb_info_aty128 *)(p->fb_info);
+
+    if (fb->blitter_may_be_busy)
+        wait_for_idle(fb);
+
+    fbcon_cfb8_putc(conp, p, c, yy, xx);
+}
+
+
+static void fbcon_aty8_putcs(struct vc_data *conp, struct display *p,
+                             const unsigned short *s, int count,
+                             int yy, int xx)
+{
+    struct fb_info_aty128 *fb = (struct fb_info_aty128 *)(p->fb_info);
+
+    if (fb->blitter_may_be_busy)
+        wait_for_idle(fb);
+
+    fbcon_cfb8_putcs(conp, p, s, count, yy, xx);
+}
+
+
+static void fbcon_aty8_clear_margins(struct vc_data *conp,
+                                     struct display *p, int bottom_only)
+{
+    struct fb_info_aty128 *fb = (struct fb_info_aty128 *)(p->fb_info);
+
+    if (fb->blitter_may_be_busy)
+        wait_for_idle(fb);
+
+    fbcon_cfb8_clear_margins(conp, p, bottom_only);
+}
+
+static struct display_switch fbcon_aty128_8 = {
+    fbcon_cfb8_setup, fbcon_aty128_bmove, fbcon_cfb8_clear,
+    fbcon_aty8_putc, fbcon_aty8_putcs, fbcon_cfb8_revc, NULL, NULL,
+    fbcon_aty8_clear_margins,
+    FONTWIDTH(4)|FONTWIDTH(8)|FONTWIDTH(12)|FONTWIDTH(16)
+};
+#endif
+#ifdef FBCON_HAS_CFB16
+static void fbcon_aty16_putc(struct vc_data *conp, struct display *p,
+                            int c, int yy, int xx)
+{
+    struct fb_info_aty128 *fb = (struct fb_info_aty128 *)(p->fb_info);
+
+    if (fb->blitter_may_be_busy)
+        wait_for_idle(fb);
+
+    fbcon_cfb16_putc(conp, p, c, yy, xx);
+}
+
+
+static void fbcon_aty16_putcs(struct vc_data *conp, struct display *p,
+                             const unsigned short *s, int count,
+                             int yy, int xx)
+{
+    struct fb_info_aty128 *fb = (struct fb_info_aty128 *)(p->fb_info);
+
+    if (fb->blitter_may_be_busy)
+        wait_for_idle(fb);
+
+    fbcon_cfb16_putcs(conp, p, s, count, yy, xx);
+}
+
+
+static void fbcon_aty16_clear_margins(struct vc_data *conp,
+                                     struct display *p, int bottom_only)
+{
+    struct fb_info_aty128 *fb = (struct fb_info_aty128 *)(p->fb_info);
+
+    if (fb->blitter_may_be_busy)
+        wait_for_idle(fb);
+
+    fbcon_cfb16_clear_margins(conp, p, bottom_only);
+}
+
+static struct display_switch fbcon_aty128_16 = {
+    fbcon_cfb16_setup, fbcon_aty128_bmove, fbcon_cfb16_clear,
+    fbcon_aty16_putc, fbcon_aty16_putcs, fbcon_cfb16_revc, NULL, NULL,
+    fbcon_aty16_clear_margins,
+    FONTWIDTH(4)|FONTWIDTH(8)|FONTWIDTH(12)|FONTWIDTH(16)
+};
+#endif
+#ifdef FBCON_HAS_CFB24
+static void fbcon_aty24_putc(struct vc_data *conp, struct display *p,
+                            int c, int yy, int xx)
+{
+    struct fb_info_aty128 *fb = (struct fb_info_aty128 *)(p->fb_info);
+
+    if (fb->blitter_may_be_busy)
+        wait_for_idle(fb);
+
+    fbcon_cfb24_putc(conp, p, c, yy, xx);
+}
+
+
+static void fbcon_aty24_putcs(struct vc_data *conp, struct display *p,
+                             const unsigned short *s, int count,
+                             int yy, int xx)
+{
+    struct fb_info_aty128 *fb = (struct fb_info_aty128 *)(p->fb_info);
+
+    if (fb->blitter_may_be_busy)
+        wait_for_idle(fb);
+
+    fbcon_cfb24_putcs(conp, p, s, count, yy, xx);
+}
+
+
+static void fbcon_aty24_clear_margins(struct vc_data *conp,
+                                     struct display *p, int bottom_only)
+{
+    struct fb_info_aty128 *fb = (struct fb_info_aty128 *)(p->fb_info);
+
+    if (fb->blitter_may_be_busy)
+        wait_for_idle(fb);
+
+    fbcon_cfb24_clear_margins(conp, p, bottom_only);
+}
+
+static struct display_switch fbcon_aty128_24 = {
+    fbcon_cfb24_setup, fbcon_aty128_bmove, fbcon_cfb24_clear,
+    fbcon_aty24_putc, fbcon_aty24_putcs, fbcon_cfb24_revc, NULL, NULL,
+    fbcon_aty24_clear_margins,
+    FONTWIDTH(4)|FONTWIDTH(8)|FONTWIDTH(12)|FONTWIDTH(16)
+};
+#endif
+#ifdef FBCON_HAS_CFB32
+static void fbcon_aty32_putc(struct vc_data *conp, struct display *p,
+                            int c, int yy, int xx)
+{
+    struct fb_info_aty128 *fb = (struct fb_info_aty128 *)(p->fb_info);
+
+    if (fb->blitter_may_be_busy)
+        wait_for_idle(fb);
+
+    fbcon_cfb32_putc(conp, p, c, yy, xx);
+}
+
+
+static void fbcon_aty32_putcs(struct vc_data *conp, struct display *p,
+                             const unsigned short *s, int count,
+                             int yy, int xx)
+{
+    struct fb_info_aty128 *fb = (struct fb_info_aty128 *)(p->fb_info);
+
+    if (fb->blitter_may_be_busy)
+        wait_for_idle(fb);
+
+    fbcon_cfb32_putcs(conp, p, s, count, yy, xx);
+}
+
+
+static void fbcon_aty32_clear_margins(struct vc_data *conp,
+                                     struct display *p, int bottom_only)
+{
+    struct fb_info_aty128 *fb = (struct fb_info_aty128 *)(p->fb_info);
+
+    if (fb->blitter_may_be_busy)
+        wait_for_idle(fb);
+
+    fbcon_cfb32_clear_margins(conp, p, bottom_only);
+}
+
+static struct display_switch fbcon_aty128_32 = {
+    fbcon_cfb32_setup, fbcon_aty128_bmove, fbcon_cfb32_clear,
+    fbcon_aty32_putc, fbcon_aty32_putcs, fbcon_cfb32_revc, NULL, NULL,
+    fbcon_aty32_clear_margins,
+    FONTWIDTH(4)|FONTWIDTH(8)|FONTWIDTH(12)|FONTWIDTH(16)
+};
+#endif
+
+#ifdef MODULE
+MODULE_AUTHOR("(c)1999-2000 Brad Douglas <brad@neruo.com>");
+MODULE_DESCRIPTION("FBDev driver for ATI Rage128 / Pro cards");
+
+int __init
+init_module(void)
+{
+    aty128fb_init();
+    return 0;
+}
+
+void __exit
+cleanup_module(void)
+{
+    struct fb_info_aty128 *info = board_list;
+
+    while (board_list) {
+        info = board_list;
+        board_list = board_list->next;
+
+        unregister_framebuffer(&info->fb_info);
+#ifdef CONFIG_MTRR
+        if (info->mtrr.vram_valid)
+            mtrr_del(info->mtrr.vram, info->frame_buffer_phys,
+                     info->vram_size);
+#endif /* CONFIG_MTRR */
+        iounmap (tmp->regbase);
+        iounmap (tmp->frame_buffer);
+        kfree (tmp);
+    }
+}
+#endif /* MODULE */
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/drivers/video/atyfb.c linux.17p9/drivers/video/atyfb.c
--- linux.vanilla/drivers/video/atyfb.c	Sun Jun 11 21:44:18 2000
+++ linux.17p9/drivers/video/atyfb.c	Thu Jun 22 22:52:19 2000
@@ -87,7 +87,7 @@
 /*
  * Debug flags.
  */
-#undef DEBUG
+#define DEBUG
 
 #define GUI_RESERVE	0x00001000
 
@@ -419,7 +419,7 @@
 static int default_mclk __initdata = 0;
 
 #if defined(CONFIG_PPC)
-static int default_vmode __initdata = VMODE_NVRAM;
+static int default_vmode __initdata = VMODE_CHOOSE;
 static int default_cmode __initdata = CMODE_NVRAM;
 #endif
 
@@ -452,7 +452,7 @@
     /* mach64CT family / mach64GT (3D RAGE) class */
     { 0x4c42, 0x4c42, "3D RAGE LT PRO (AGP)" },
     { 0x4c44, 0x4c44, "3D RAGE LT PRO" },
-    { 0x4c47, 0x4c47, "3D RAGE LT PRO" },
+    { 0x4c47, 0x4c47, "3D RAGE LT-G" },
     { 0x4c49, 0x4c49, "3D RAGE LT PRO" },
     { 0x4c50, 0x4c50, "3D RAGE LT PRO" },
     { 0x4c54, 0x4c54, "3D RAGE LT" },
@@ -466,6 +466,7 @@
     { 0x4749, 0x4749, "3D RAGE PRO (BGA, PCI)" },
     { 0x4750, 0x4750, "3D RAGE PRO (PQFP, PCI)" },
     { 0x4751, 0x4751, "3D RAGE PRO (PQFP, PCI, limited 3D)" },
+    { 0x4c4e, 0x4c4e, "3D RAGE Mobility (AGP)" }, /* Doesn't quite work yet */
 };
 
 static const char *aty_gx_ram[8] __initdata = {
@@ -485,7 +486,7 @@
 
 #if defined(__powerpc__)
     temp = info->ati_regbase;
-    asm("lwbrx %0,%1,%2" : "=r"(val) : "b" (regindex), "r" (temp));
+     __asm__ __volatile__("lwbrx %0,%1,%2;eieio" : "=r"(val) : "b" (regindex), "r" (temp));
 #elif defined(__sparc_v9__)
     temp = info->ati_regbase + regindex;
     asm("lduwa [%1] %2, %0" : "=r" (val) : "r" (temp), "i" (ASI_PL));
@@ -503,7 +504,7 @@
 
 #if defined(__powerpc__)
     temp = info->ati_regbase;
-    asm("stwbrx %0,%1,%2" : : "r" (val), "b" (regindex), "r" (temp) :
+     __asm__ __volatile__("stwbrx %0,%1,%2;eieio" : : "r" (val), "b" (regindex), "r" (temp) :
 	"memory");
 #elif defined(__sparc_v9__)
     temp = info->ati_regbase + regindex;
@@ -517,15 +518,43 @@
 static inline u8 aty_ld_8(volatile unsigned int regindex,
 			  const struct fb_info_aty *info)
 {
-    return *(volatile u8 *)(info->ati_regbase+regindex);
+    u8 val = *(volatile u8 *)(info->ati_regbase+regindex);
+#if defined(__powerpc__)
+    eieio();
+#endif
+    return val;
 }
 
 static inline void aty_st_8(volatile unsigned int regindex, u8 val,
 			    const struct fb_info_aty *info)
 {
     *(volatile u8 *)(info->ati_regbase+regindex) = val;
+#if defined(__powerpc__)
+    eieio();
+#endif
+}
+
+static void aty_st_lcd(int index, u32 val, const struct fb_info_aty *info)
+{
+    unsigned long temp;
+    
+    /* write addr byte */
+    temp = aty_ld_le32(LCD_INDEX, info);
+    aty_st_le32(LCD_INDEX, (temp & ~LCD_INDEX_MASK) | index, info);
+    /* write the register value */
+    aty_st_le32(LCD_DATA, val, info);
 }
 
+static u32 aty_ld_lcd(int index, const struct fb_info_aty *info)
+{
+    unsigned long temp;
+    
+    /* write addr byte */
+    temp = aty_ld_le32(LCD_INDEX, info);
+    aty_st_le32(LCD_INDEX, (temp & ~LCD_INDEX_MASK) | index, info);
+    /* read the register value */
+    return aty_ld_le32(LCD_DATA, info);
+}
 
     /*
      *  Generic Mach64 routines
@@ -683,9 +712,7 @@
     aty_st_8(DAC_W_INDEX, offset & 0xff, info);
     /* left addr byte */
     aty_st_8(DAC_DATA, (offset >> 8) & 0xff, info);
-    eieio();
     aty_st_8(DAC_MASK, val, info);
-    eieio();
     aty_st_8(DAC_CNTL, 0, info);
 }
 
@@ -693,10 +720,8 @@
 {
     /* write addr byte */
     aty_st_8(CLOCK_CNTL + 1, (offset << 2) | PLL_WR_EN, info);
-    eieio();
     /* write the register value */
     aty_st_8(CLOCK_CNTL + 2, val, info);
-    eieio();
     aty_st_8(CLOCK_CNTL + 1, (offset << 2) & ~PLL_WR_EN, info);
 }
 
@@ -706,10 +731,8 @@
 
     /* write addr byte */
     aty_st_8(CLOCK_CNTL + 1, (offset << 2), info);
-    eieio();
     /* read the register value */
     res = aty_ld_8(CLOCK_CNTL + 2, info);
-    eieio();
     return res;
 }
 
@@ -1772,6 +1795,9 @@
 	} else if ((Gx == VT_CHIP_ID) || (Gx == VU_CHIP_ID)) {
 	    aty_st_le32(DAC_CNTL, 0x87010184, info);
 	    aty_st_le32(BUS_CNTL, 0x680000f9, info);
+	} else if (Gx == LN_CHIP_ID) {
+	    aty_st_le32(DAC_CNTL, 0x80010102, info);
+	    aty_st_le32(BUS_CNTL, 0x7b33a040, info);
 	} else {
 	    /* GT */
 	    aty_st_le32(DAC_CNTL, 0x86010102, info);
@@ -1788,7 +1814,7 @@
 	init_engine(par, info);
 
 #ifdef CONFIG_FB_COMPAT_XPMAC
-    if (console_fb_info == &info->fb_info) {
+    if (!console_fb_info || console_fb_info == &info->fb_info) {
 	struct fb_var_screeninfo var;
 	int vmode, cmode;
 	display_info.height = ((par->crtc.v_tot_disp>>16) & 0x7ff)+1;
@@ -2406,7 +2432,6 @@
 			tmp |= 0x2;
 		aty_st_8(DAC_CNTL, tmp, info);
 		aty_st_8(DAC_MASK, 0xff, info);
-		eieio();
 		scale = ((Gx != GX_CHIP_ID) && (Gx != CX_CHIP_ID) &&
 			(info->current_par.crtc.bpp == 16)) ? 3 : 0;
 		info->aty_cmap_regs->rindex = i << scale;
@@ -2549,11 +2574,19 @@
 	    } else if (Gx == GB_CHIP_ID || Gx == GD_CHIP_ID ||
 		       Gx == GI_CHIP_ID || Gx == GP_CHIP_ID ||
 		       Gx == GQ_CHIP_ID || Gx == LB_CHIP_ID ||
-		       Gx == LD_CHIP_ID || Gx == LG_CHIP_ID ||
+		       Gx == LD_CHIP_ID ||
 		       Gx == LI_CHIP_ID || Gx == LP_CHIP_ID) {
 		/* RAGE PRO or LT PRO */
 		pll = 230;
 		mclk = 100;
+	    } else if (Gx == LG_CHIP_ID) {
+		/* Rage LT */
+		pll = 230;
+		mclk = 63;
+	    } else if (Gx == LN_CHIP_ID) {
+	    	/* Rage mobility */
+	    	pll = 230;
+	    	mclk = 100;
 	    } else {
 		/* other RAGE */
 		pll = 135;
@@ -2706,24 +2739,43 @@
 	}
 
 #if defined(CONFIG_PPC)
+    if (Gx == LI_CHIP_ID && machine_is_compatible("PowerBook1,1")) {
+	/* these bits let the 101 powerbook wake up from sleep -- paulus */
+	aty_st_lcd(LCD_POWER_MANAGEMENT, aty_ld_lcd(LCD_POWER_MANAGEMENT, info)
+		| (USE_F32KHZ | TRISTATE_MEM_EN), info);
+    }
+
     if (default_vmode == VMODE_NVRAM) {
+#if 0 /* This is not really supported */
 	default_vmode = nvram_read_byte(NV_VMODE);
 	if (default_vmode <= 0 || default_vmode > VMODE_MAX)
+#endif
 	    default_vmode = VMODE_CHOOSE;
     }
+    /*
+     * The default video mode is 1024x768 @ 75Hz, as that
+     * works on iMacs as well as the G3 powerbooks. - paulus
+     */
     if (default_vmode == VMODE_CHOOSE) {
 	if (Gx == LG_CHIP_ID)
 	    /* G3 PowerBook with 1024x768 LCD */
 	    default_vmode = VMODE_1024_768_60;
-	else {
-	    sense = read_aty_sense(info);
-	    default_vmode = mac_map_monitor_sense(sense);
-	}
+	else if (Gx == LN_CHIP_ID)
+	    /* iBook with 800x600 LCD */
+	    default_vmode = VMODE_800_600_60;
+	else
+	    default_vmode = VMODE_1024_768_75;
+	/* 'twould be nice to get this going - paulus */
+	sense = read_aty_sense(info);
+	printk(KERN_INFO "atyfb: monitor sense=%x, maps to mode %d\n",
+	       sense, mac_map_monitor_sense(sense));
     }
     if (default_vmode <= 0 || default_vmode > VMODE_MAX)
-	default_vmode = VMODE_640_480_60;
+	default_vmode = VMODE_1024_768_75;
+#if 0
     if (default_cmode == CMODE_NVRAM)
 	default_cmode = nvram_read_byte(NV_CMODE);
+#endif
     if (default_cmode < CMODE_8 || default_cmode > CMODE_32)
 	default_cmode = CMODE_8;
     if (mac_vmode_to_var(default_vmode, default_cmode, &var))
@@ -3476,11 +3528,10 @@
     if (Gx == GT_CHIP_ID || Gx == GU_CHIP_ID || Gx == GV_CHIP_ID ||
 	Gx == GW_CHIP_ID || Gx == GZ_CHIP_ID || Gx == LG_CHIP_ID ||
 	Gx == GB_CHIP_ID || Gx == GD_CHIP_ID || Gx == GI_CHIP_ID ||
-	Gx == GP_CHIP_ID || Gx == GQ_CHIP_ID)
+	Gx == GP_CHIP_ID || Gx == GQ_CHIP_ID || Gx == LI_CHIP_ID)
 	i |= 0x2;	/*DAC_CNTL|0x2 turns off the extra brightness for gt*/
     aty_st_8(DAC_CNTL, i, info);
     aty_st_8(DAC_MASK, 0xff, info);
-    eieio();
     scale = ((Gx != GX_CHIP_ID) && (Gx != CX_CHIP_ID) &&
 	     (info->current_par.crtc.bpp == 16)) ? 3 : 0;
     info->aty_cmap_regs->windex = regno << scale;
@@ -3930,6 +3981,124 @@
 #endif
 
 #ifdef CONFIG_PMAC_PBOOK
+
+/* Power management routines. Those are used for PowerBook sleep.
+ *
+ * It appears that Rage LT and Rage LT Pro have different power
+ * management registers. There's is some confusion about which
+ * chipID is a Rage LT or LT pro :(
+ */
+static int
+aty_power_mgmt_LT(int sleep, struct fb_info_aty *info)
+{
+ 	unsigned int pm;
+	int timeout;
+	
+	pm = aty_ld_le32(POWER_MANAGEMENT_LG, info);
+	pm = (pm & ~PWR_MGT_MODE_MASK) | PWR_MGT_MODE_REG;
+	aty_st_le32(POWER_MANAGEMENT_LG, pm, info);
+	pm = aty_ld_le32(POWER_MANAGEMENT_LG, info);
+	
+	timeout = 200000;
+	if (sleep) {
+		/* Sleep */
+		pm &= ~PWR_MGT_ON;
+		aty_st_le32(POWER_MANAGEMENT_LG, pm, info);
+		pm = aty_ld_le32(POWER_MANAGEMENT_LG, info);
+		udelay(10);
+		pm &= ~(PWR_BLON | AUTO_PWR_UP);
+		pm |= SUSPEND_NOW;
+		aty_st_le32(POWER_MANAGEMENT_LG, pm, info);
+		pm = aty_ld_le32(POWER_MANAGEMENT_LG, info);
+		udelay(10);
+		pm |= PWR_MGT_ON;
+		aty_st_le32(POWER_MANAGEMENT_LG, pm, info);
+		do {
+			pm = aty_ld_le32(POWER_MANAGEMENT_LG, info);
+			udelay(10);
+			if ((--timeout) == 0)
+				break;
+		} while ((pm & PWR_MGT_STATUS_MASK) != PWR_MGT_STATUS_SUSPEND);
+	} else {
+		/* Wakeup */
+		pm &= ~PWR_MGT_ON;
+		aty_st_le32(POWER_MANAGEMENT_LG, pm, info);
+		pm = aty_ld_le32(POWER_MANAGEMENT_LG, info);
+		udelay(10);
+		pm |=  (PWR_BLON | AUTO_PWR_UP);
+		pm &= ~SUSPEND_NOW;
+		aty_st_le32(POWER_MANAGEMENT_LG, pm, info);
+		pm = aty_ld_le32(POWER_MANAGEMENT_LG, info);
+		udelay(10);
+		pm |= PWR_MGT_ON;
+		aty_st_le32(POWER_MANAGEMENT_LG, pm, info);
+		do {
+			pm = aty_ld_le32(POWER_MANAGEMENT_LG, info);
+			udelay(10);
+			if ((--timeout) == 0)
+				break;
+		} while ((pm & PWR_MGT_STATUS_MASK) != 0);
+	}
+	mdelay(500);
+
+	return timeout ? PBOOK_SLEEP_OK : PBOOK_SLEEP_REFUSE;
+}
+
+static int
+aty_power_mgmt_LTPro(int sleep, struct fb_info_aty *info)
+{
+ 	unsigned int pm;
+	int timeout;
+	
+	pm = aty_ld_lcd(LCD_POWER_MANAGEMENT, info);
+	pm = (pm & ~PWR_MGT_MODE_MASK) | PWR_MGT_MODE_REG;
+	aty_st_lcd(LCD_POWER_MANAGEMENT, pm, info);
+	pm = aty_ld_lcd(LCD_POWER_MANAGEMENT, info);
+
+	timeout = 200;
+	if (sleep) {
+		/* Sleep */
+		pm &= ~PWR_MGT_ON;
+		aty_st_lcd(LCD_POWER_MANAGEMENT, pm, info);
+		pm = aty_ld_lcd(LCD_POWER_MANAGEMENT, info);
+		udelay(10);
+		pm &= ~(PWR_BLON | AUTO_PWR_UP);
+		pm |= SUSPEND_NOW;
+		aty_st_lcd(LCD_POWER_MANAGEMENT, pm, info);
+		pm = aty_ld_lcd(LCD_POWER_MANAGEMENT, info);
+		udelay(10);
+		pm |= PWR_MGT_ON;
+		aty_st_lcd(LCD_POWER_MANAGEMENT, pm, info);
+		do {
+			pm = aty_ld_lcd(LCD_POWER_MANAGEMENT, info);
+			udelay(1000);
+			if ((--timeout) == 0)
+				break;
+		} while ((pm & PWR_MGT_STATUS_MASK) != PWR_MGT_STATUS_SUSPEND);
+	} else {
+		/* Wakeup */
+		pm &= ~PWR_MGT_ON;
+		aty_st_lcd(LCD_POWER_MANAGEMENT, pm, info);
+		pm = aty_ld_lcd(LCD_POWER_MANAGEMENT, info);
+		udelay(10);
+		pm &= ~SUSPEND_NOW;
+		pm |= (PWR_BLON | AUTO_PWR_UP);
+		aty_st_lcd(LCD_POWER_MANAGEMENT, pm, info);
+		pm = aty_ld_lcd(LCD_POWER_MANAGEMENT, info);
+		udelay(10);
+		pm |= PWR_MGT_ON;
+		aty_st_lcd(LCD_POWER_MANAGEMENT, pm, info);
+		do {
+			pm = aty_ld_lcd(LCD_POWER_MANAGEMENT, info);			
+			udelay(1000);
+			if ((--timeout) == 0)
+				break;
+		} while ((pm & PWR_MGT_STATUS_MASK) != 0);
+	}
+
+	return timeout ? PBOOK_SLEEP_OK : PBOOK_SLEEP_REFUSE;
+}
+
 /*
  * Save the contents of the frame buffer when we go to sleep,
  * and restore it when we wake up again.
@@ -3938,7 +4107,9 @@
 aty_sleep_notify(struct pmu_sleep_notifier *self, int when)
 {
 	struct fb_info_aty *info;
- 	unsigned int pm;
+ 	int result;
+
+	result = PBOOK_SLEEP_OK;
 
 	for (info = first_display; info != NULL; info = info->next) {
 		struct fb_fix_screeninfo fix;
@@ -3950,6 +4121,8 @@
 		switch (when) {
 		case PBOOK_SLEEP_REQUEST:
 			info->save_framebuffer = vmalloc(nb);
+			if (info->save_framebuffer == NULL)
+				return PBOOK_SLEEP_REFUSE;
 			break;
 		case PBOOK_SLEEP_REJECT:
 			if (info->save_framebuffer) {
@@ -3966,80 +4139,38 @@
 
 			/* Backup fb content */	
 			if (info->save_framebuffer)
-				memcpy(info->save_framebuffer,
+				memcpy_fromio(info->save_framebuffer,
 				       (void *)info->frame_buffer, nb);
 
 			/* Blank display and LCD */
 			atyfbcon_blank(VESA_POWERDOWN+1, (struct fb_info *)info);
 
-			/* Set chip to "suspend" mode. Note: There's a HW bug
-			   in the chip which prevents proper resync on wakeup
-			   with automatic power management, we handle suspend
-			   manually using the following (weird) sequence
-			   described by ATI.
-			   Note2:
-			   We could enable this for all Rage LT Pro chip ids */
-			if ((Gx == LG_CHIP_ID) || (Gx == LT_CHIP_ID)
-			    || (Gx == LP_CHIP_ID)) {
-				pm = aty_ld_le32(POWER_MANAGEMENT, info);
-				pm &= ~PWR_MGT_ON;
-				aty_st_le32(POWER_MANAGEMENT, pm, info);
-				pm = aty_ld_le32(POWER_MANAGEMENT, info);
-				mdelay(1);
-				pm &= ~(PWR_BLON | AUTO_PWR_UP);
-				pm |= SUSPEND_NOW;
-				aty_st_le32(POWER_MANAGEMENT, pm, info);
-				pm = aty_ld_le32(POWER_MANAGEMENT, info);
-				mdelay(1);
-				pm |= PWR_MGT_ON;
-				aty_st_le32(POWER_MANAGEMENT, pm, info);
-				do {
-					pm = aty_ld_le32(POWER_MANAGEMENT, info);
-					/* Fix a problem with revision 4c50 of the chip */
-					if (Gx == LP_CHIP_ID)
-						break;
-				} while ((pm & PWR_MGT_STATUS_MASK) != PWR_MGT_STATUS_SUSPEND);
-				mdelay(500);
-			}
+			/* Set chip to "suspend" mode */
+			if (Gx == LG_CHIP_ID)
+				result = aty_power_mgmt_LT(1, info);
+			else
+				result = aty_power_mgmt_LTPro(1, info);
 			break;
 		case PBOOK_WAKE:
 			/* Wakeup chip */
-			if ((Gx == LG_CHIP_ID) || (Gx == LT_CHIP_ID) || (Gx == LP_CHIP_ID)) {
-				pm = aty_ld_le32(POWER_MANAGEMENT, info);
-				pm &= ~PWR_MGT_ON;
-				aty_st_le32(POWER_MANAGEMENT, pm, info);
-				pm = aty_ld_le32(POWER_MANAGEMENT, info);
-				mdelay(1);
-				pm |=  (PWR_BLON | AUTO_PWR_UP);
-				pm &= ~SUSPEND_NOW;
-				aty_st_le32(POWER_MANAGEMENT, pm, info);
-				pm = aty_ld_le32(POWER_MANAGEMENT, info);
-				mdelay(1);
-				pm |= PWR_MGT_ON;
-				aty_st_le32(POWER_MANAGEMENT, pm, info);
-				do {
-					pm = aty_ld_le32(POWER_MANAGEMENT, info);
-					/* Fix a problem with revision 4c50 of the chip */
-					if (Gx == LP_CHIP_ID)
-						break;
-				} while ((pm & PWR_MGT_STATUS_MASK) != 0);
-				mdelay(500);
-			}
+			if (Gx == LG_CHIP_ID)
+				result = aty_power_mgmt_LT(0, info);
+			else
+				result = aty_power_mgmt_LTPro(0, info);
 
 			/* Restore fb content */			
 			if (info->save_framebuffer) {
-				memcpy((void *)info->frame_buffer,
+				memcpy_toio((void *)info->frame_buffer,
 				       info->save_framebuffer, nb);
 				vfree(info->save_framebuffer);
 				info->save_framebuffer = 0;
 			}
-
-			/* Restore display */			
+			/* Restore display */
 			atyfb_set_par(&info->current_par, info);
 			atyfbcon_blank(0, (struct fb_info *)info);
 			break;
 		}
 	}
-	return PBOOK_SLEEP_OK;
+	return result;
 }
 #endif /* CONFIG_PMAC_PBOOK */
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/drivers/video/chipsfb.c linux.17p9/drivers/video/chipsfb.c
--- linux.vanilla/drivers/video/chipsfb.c	Fri Apr 21 12:46:38 2000
+++ linux.17p9/drivers/video/chipsfb.c	Thu Jun 22 22:48:10 2000
@@ -728,6 +728,8 @@
 		switch (when) {
 		case PBOOK_SLEEP_REQUEST:
 			p->save_framebuffer = vmalloc(nb);
+			if (p->save_framebuffer == NULL)
+				return PBOOK_SLEEP_REFUSE;
 			break;
 		case PBOOK_SLEEP_REJECT:
 			if (p->save_framebuffer) {
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/drivers/video/controlfb.c linux.17p9/drivers/video/controlfb.c
--- linux.vanilla/drivers/video/controlfb.c	Fri Apr 21 12:46:38 2000
+++ linux.17p9/drivers/video/controlfb.c	Thu Jun 22 22:50:05 2000
@@ -531,18 +531,26 @@
 
 	p->sense = read_control_sense(p);
 	printk(KERN_INFO "Monitor sense value = 0x%x, ", p->sense);
+	
 	/* Try to pick a video mode out of NVRAM if we have one. */
-	par->vmode = nvram_read_byte(NV_VMODE);
-	if(par->vmode <= 0 || par->vmode > VMODE_MAX || !control_reg_init[par->vmode - 1])
-		par->vmode = VMODE_CHOOSE;
-	if(par->vmode == VMODE_CHOOSE)
-		par->vmode = mac_map_monitor_sense(p->sense);
-	if(!control_reg_init[par->vmode - 1])
-		par->vmode = VMODE_640_480_60;
+	if (default_vmode == VMODE_NVRAM) {
+		par->vmode = nvram_read_byte(NV_VMODE);
+		if(par->vmode <= 0 || par->vmode > VMODE_MAX || !control_reg_init[par->vmode - 1])
+			par->vmode = VMODE_CHOOSE;
+		if(par->vmode == VMODE_CHOOSE)
+			par->vmode = mac_map_monitor_sense(p->sense);
+		if(!control_reg_init[par->vmode - 1])
+			par->vmode = VMODE_640_480_60;
+	} else
+		par->vmode=default_vmode;
+
+	if (default_cmode == CMODE_NVRAM){
+		par->cmode = nvram_read_byte(NV_CMODE);
+		if(par->cmode < CMODE_8 || par->cmode > CMODE_32)
+			par->cmode = CMODE_8;}
+	else
+		par->cmode=default_cmode;
 
-	par->cmode = nvram_read_byte(NV_CMODE);
-	if(par->cmode < CMODE_8 || par->cmode > CMODE_32)
-		par->cmode = CMODE_8;
 	/*
 	 * Reduce the pixel size if we don't have enough VRAM.
 	 */
@@ -780,14 +788,10 @@
      *  bitfields, horizontal timing, vertical timing.
      */
 	/* swiped by jonh from atyfb.c */
-	if (xres <= 512 && yres <= 384)
-		par->vmode = VMODE_512_384_60;		/* 512x384, 60Hz */
-	else if (xres <= 640 && yres <= 480)
+	if (xres <= 640 && yres <= 480)
 		par->vmode = VMODE_640_480_67;		/* 640x480, 67Hz */
 	else if (xres <= 640 && yres <= 870)
 		par->vmode = VMODE_640_870_75P;		/* 640x870, 75Hz (portrait) */
-	else if (xres <= 768 && yres <= 576)
-		par->vmode = VMODE_768_576_50I;		/* 768x576, 50Hz (PAL full frame) */
 	else if (xres <= 800 && yres <= 600)
 		par->vmode = VMODE_800_600_75;		/* 800x600, 75Hz */
 	else if (xres <= 832 && yres <= 624)
@@ -1176,8 +1180,8 @@
 		}
 		if (!strncmp(this_opt, "vmode:", 6)) {
 			int vmode = simple_strtoul(this_opt+6, NULL, 0);
-		if (vmode > 0 && vmode <= VMODE_MAX)
-			default_vmode = vmode;
+			if (vmode > 0 && vmode <= VMODE_MAX)
+				default_vmode = vmode;
 		} else if (!strncmp(this_opt, "cmode:", 6)) {
 			int depth = simple_strtoul(this_opt+6, NULL, 0);
 			switch (depth) {
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/drivers/video/fbcon.c linux.17p9/drivers/video/fbcon.c
--- linux.vanilla/drivers/video/fbcon.c	Fri Apr 21 12:46:38 2000
+++ linux.17p9/drivers/video/fbcon.c	Tue Jun 27 12:10:39 2000
@@ -526,7 +526,7 @@
     	q = (unsigned short *)(conp->vc_origin + conp->vc_size_row * old_rows);
     	step = logo_lines * old_cols;
     	for (r = q - logo_lines * old_cols; r < q; r++)
-    	    if (*r != conp->vc_video_erase_char)
+    	    if (scr_readw(r) != conp->vc_video_erase_char)
     	    	break;
 	if (r != q && nr_rows >= old_rows + logo_lines) {
     	    save = kmalloc(logo_lines * nr_cols * 2, GFP_KERNEL);
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/drivers/video/fbmem.c linux.17p9/drivers/video/fbmem.c
--- linux.vanilla/drivers/video/fbmem.c	Fri Apr 21 12:46:39 2000
+++ linux.17p9/drivers/video/fbmem.c	Thu Jun 22 22:52:39 2000
@@ -68,6 +68,8 @@
 extern void offb_setup(char *options, int *ints);
 extern void atyfb_init(void);
 extern void atyfb_setup(char *options, int *ints);
+extern void aty128fb_init(void);
+extern void aty128fb_setup(char *options, int *ints);
 extern void igafb_init(void);
 extern void igafb_setup(char *options, int *ints);
 extern void imsttfb_init(void);
@@ -92,6 +94,8 @@
 extern void sbusfb_setup(char *options, int *ints);
 extern void valkyriefb_init(void);
 extern void valkyriefb_setup(char *options, int *ints);
+extern void control_init(void);
+extern void control_setup(char *options, int *ints);
 extern void g364fb_init(void);
 extern void fm2fb_init(void);
 extern void fm2fb_setup(char *options, int *ints);
@@ -143,6 +147,9 @@
 #ifdef CONFIG_FB_ATY
 	{ "atyfb", atyfb_init, atyfb_setup },
 #endif
+#ifdef CONFIG_FB_ATY128
+	{ "aty128fb", aty128fb_init, aty128fb_setup },
+#endif
 #ifdef CONFIG_FB_IGA
         { "igafb", igafb_init, igafb_setup },
 #endif
@@ -178,6 +185,9 @@
 #endif 
 #ifdef CONFIG_FB_VALKYRIE
 	{ "valkyriefb", valkyriefb_init, valkyriefb_setup },
+#endif
+#ifdef CONFIG_FB_CONTROL
+	{ "controlfb", control_init, control_setup },
 #endif
 #ifdef CONFIG_FB_G364
 	{ "g364", g364fb_init, NULL },
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/drivers/video/macmodes.c linux.17p9/drivers/video/macmodes.c
--- linux.vanilla/drivers/video/macmodes.c	Fri Apr 21 12:46:39 2000
+++ linux.17p9/drivers/video/macmodes.c	Thu Jun 22 22:48:23 2000
@@ -367,8 +367,10 @@
 	    continue;
 	if (var->pixclock > mode->pixclock)
 	    continue;
+#if 0
 	if ((var->vmode & FB_VMODE_MASK) != mode->vmode)
 	    continue;
+#endif
 	*vmode = mode->number;
 	return 0;
     }
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/drivers/video/matroxfb.c linux.17p9/drivers/video/matroxfb.c
--- linux.vanilla/drivers/video/matroxfb.c	Fri Apr 21 12:46:39 2000
+++ linux.17p9/drivers/video/matroxfb.c	Tue Jun 27 12:10:39 2000
@@ -4693,7 +4693,12 @@
 	}
 	display->var = *var;
 	/* cmap */
+#ifdef __alpha__
+	display->screen_base = vaddr_va(ACCESS_FBINFO(video.vbase)) + ydstorg
+		+ dense_mem(vaddr_va(ACCESS_FBINFO(video.vbase)));
+#else
 	display->screen_base = vaddr_va(ACCESS_FBINFO(video.vbase)) + ydstorg;
+#endif
 	display->visual = visual;
 	display->ypanstep = 1;
 	display->ywrapstep = 0;
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/drivers/video/offb.c linux.17p9/drivers/video/offb.c
--- linux.vanilla/drivers/video/offb.c	Fri Apr 21 12:46:39 2000
+++ linux.17p9/drivers/video/offb.c	Thu Jun 22 22:49:06 2000
@@ -42,6 +42,15 @@
 
 static int currcon = 0;
 
+/* Supported palette hacks */
+enum {
+	cmap_unknown,
+	cmap_m64,	/* ATI Mach64 */
+	cmap_r128,	/* ATI Rage128 */
+	cmap_M3A,	/* ATI Rage Mobility M3 Head A */
+	cmap_M3B	/* ATI Rage Mobility M3 Head B */
+};
+
 struct fb_info_offb {
     struct fb_info info;
     struct fb_fix_screeninfo fix;
@@ -50,6 +59,7 @@
     struct { u_char red, green, blue, pad; } palette[256];
     volatile unsigned char *cmap_adr;
     volatile unsigned char *cmap_data;
+    int cmap_type;
     union {
 #ifdef FBCON_HAS_CFB16
 	u16 cfb16[16];
@@ -106,7 +116,8 @@
 static int offb_init_driver(struct device_node *);
 static void offb_init_nodriver(struct device_node *);
 static void offb_init_fb(const char *name, const char *full_name, int width,
-		      int height, int depth, int pitch, unsigned long address);
+		      int height, int depth, int pitch, unsigned long address,
+		      struct device_node *dp);
 
     /*
      *  Interface to the low level console driver
@@ -293,6 +304,9 @@
 #ifdef CONFIG_FB_ATY
 extern void atyfb_of_init(struct device_node *dp);
 #endif /* CONFIG_FB_ATY */
+#if defined(CONFIG_FB_ATY128)
+extern void aty128fb_of_init(struct device_node *dp);
+#endif /* CONFIG_FB_ATY128 */
 #ifdef CONFIG_FB_S3TRIO
 extern void s3triofb_init_of(struct device_node *dp);
 #endif /* CONFIG_FB_S3TRIO */
@@ -362,6 +376,20 @@
 	    }
 
 	    /*
+	     * The M3 on the Pismo powerbook has no addresses
+	     * on the display nodes, they are on their parent.
+	     */
+	    if (dp->n_addrs == 0 && device_is_compatible(dp, "ATY,RageM3p")) {
+		int na;
+		unsigned int *ap = (unsigned int *)
+		    get_property(dp, "AAPL,address", &na);
+		if (ap != 0)
+		    for (na /= sizeof(unsigned int); na > 0; --na, ++ap)
+			if (*ap <= addr && addr < *ap + 0x1000000)
+			    goto foundit;
+	    }
+
+	    /*
 	     * See if the display address is in one of the address
 	     * ranges for this display.
 	     */
@@ -386,7 +414,7 @@
 			 boot_infos->dispDeviceRect[2],
 			 boot_infos->dispDeviceRect[3],
 			 boot_infos->dispDeviceDepth,
-			 boot_infos->dispDeviceRowBytes, addr);
+			 boot_infos->dispDeviceRowBytes, addr, 0);
 	}
     }
 
@@ -409,6 +437,15 @@
 
 __initfunc(static int offb_init_driver(struct device_node *dp))
 {
+#ifdef CONFIG_FB_ATY128
+    if (!strncmp(dp->name, "ATY,Rage128", 11) ||
+    	!strncmp(dp->name, "ATY,RageM3pA", 12)) {
+	aty128fb_of_init(dp);
+	return 1;
+    }
+    if (!strncmp(dp->name, "ATY,RageM3pB", 12))
+    	return 0;
+#endif /* CONFIG_FB_ATY128*/
 #ifdef CONFIG_FB_ATY
     if (!strncmp(dp->name, "ATY", 3)) {
 	atyfb_of_init(dp);
@@ -477,9 +514,11 @@
 	&& len == sizeof(int))
 	height = *pp;
     if ((pp = (int *)get_property(dp, "linebytes", &len)) != NULL
-	&& len == sizeof(int))
+	&& len == sizeof(int)) {
 	pitch = *pp;
-    else
+	if (pitch == 1)
+	    pitch = 0x1000;
+    } else
 	pitch = width;
     if ((up = (unsigned *)get_property(dp, "address", &len)) != NULL
 	&& len == sizeof(unsigned))
@@ -500,13 +539,14 @@
 	    address += 0x1000;
     }
     offb_init_fb(dp->name, dp->full_name, width, height, depth,
-		 pitch, address);
+		 pitch, address, dp);
     
 }
 
 __initfunc(static void offb_init_fb(const char *name, const char *full_name,
 				    int width, int height, int depth,
-				    int pitch, unsigned long address))
+				    int pitch, unsigned long address,
+				    struct device_node *dp))
 {
     int i;
     struct fb_fix_screeninfo *fix;
@@ -543,13 +583,27 @@
     fix->type = FB_TYPE_PACKED_PIXELS;
     fix->type_aux = 0;
 
+    info->cmap_type = cmap_unknown;
     if (depth == 8)
     {
     	/* XXX kludge for ati */
-    	if (strncmp(name, "ATY,", 4) == 0) {
+	if (dp && !strncmp(name, "ATY,Rage128", 11)) {
+		unsigned long regbase = dp->addrs[2].address;
+		info->cmap_adr = ioremap(regbase, 0x1FFF);
+		info->cmap_type = cmap_r128;
+	} else if (dp && !strncmp(name, "ATY,RageM3pA", 12)) {
+		unsigned long regbase = dp->parent->addrs[2].address;
+		info->cmap_adr = ioremap(regbase, 0x1FFF);
+		info->cmap_type = cmap_M3A;
+	} else if (dp && !strncmp(name, "ATY,RageM3pB", 12)) {
+		unsigned long regbase = dp->parent->addrs[2].address;
+		info->cmap_adr = ioremap(regbase, 0x1FFF);
+		info->cmap_type = cmap_M3B;
+	} else if (!strncmp(name, "ATY,", 4)) {
 		unsigned long base = address & 0xff000000UL;
 		info->cmap_adr = ioremap(base + 0x7ff000, 0x1000) + 0xcc0;
 		info->cmap_data = info->cmap_adr + 1;
+		info->cmap_type = cmap_m64;
 	}
         fix->visual = info->cmap_adr ? FB_VISUAL_PSEUDOCOLOR
 				     : FB_VISUAL_STATIC_PSEUDOCOLOR;
@@ -706,7 +760,7 @@
 	display_info.cmap_data_address = 0;
 	display_info.disp_reg_address = 0;
 	/* XXX kludge for ati */
-	if (strncmp(name, "ATY,", 4) == 0) {
+	if (info->cmap_type == cmap_m64) {
 	    unsigned long base = address & 0xff000000UL;
 	    display_info.disp_reg_address = base + 0x7ffc00;
 	    display_info.cmap_adr_address = base + 0x7ffcc0;
@@ -767,12 +821,33 @@
 	return;
 
     if (blank)
-	for (i = 0; i < 256; i++) {
-	    *info2->cmap_adr = i;
-	    mach_eieio();
-	    for (j = 0; j < 3; j++) {
-		*info2->cmap_data = 0;
-		mach_eieio();
+        for (i = 0; i < 256; i++) {
+	    switch(info2->cmap_type) {
+	    case cmap_m64:
+	        *info2->cmap_adr = i;
+	  	mach_eieio();
+	  	for (j = 0; j < 3; j++) {
+		    *info2->cmap_data = 0;
+		    mach_eieio();
+	    	}
+	    	break;
+	    case cmap_M3A:
+	        /* Clear PALETTE_ACCESS_CNTL in DAC_CNTL */
+	    	out_le32((unsigned *)(info2->cmap_adr + 0x58),
+	    		in_le32((unsigned *)(info2->cmap_adr + 0x58)) & ~0x20);
+	    case cmap_r128:
+	    	/* Set palette index & data */
+    	        out_8(info2->cmap_adr + 0xb0, i);
+	    	out_le32((unsigned *)(info2->cmap_adr + 0xb4), 0);
+	    	break;
+	    case cmap_M3B:
+	        /* Set PALETTE_ACCESS_CNTL in DAC_CNTL */
+	    	out_le32((unsigned *)(info2->cmap_adr + 0x58),
+	    		in_le32((unsigned *)(info2->cmap_adr + 0x58)) | 0x20);
+	    	/* Set palette index & data */
+	    	out_8(info2->cmap_adr + 0xb0, i);
+	    	out_le32((unsigned *)(info2->cmap_adr + 0xb4), 0);
+	    	break;
 	    }
 	}
     else
@@ -823,14 +898,37 @@
     info2->palette[regno].green = green;
     info2->palette[regno].blue = blue;
 
-    *info2->cmap_adr = regno;/* On some chipsets, add << 3 in 15 bits */
-    mach_eieio();
-    *info2->cmap_data = red;
-    mach_eieio();
-    *info2->cmap_data = green;
-    mach_eieio();
-    *info2->cmap_data = blue;
-    mach_eieio();
+    switch(info2->cmap_type) {
+    case cmap_m64:
+        *info2->cmap_adr = regno;
+	mach_eieio();
+	*info2->cmap_data = red;
+	mach_eieio();
+	*info2->cmap_data = green;
+	mach_eieio();
+	*info2->cmap_data = blue;
+	mach_eieio();
+	break;
+    case cmap_M3A:
+	/* Clear PALETTE_ACCESS_CNTL in DAC_CNTL */
+	out_le32((unsigned *)(info2->cmap_adr + 0x58),
+		in_le32((unsigned *)(info2->cmap_adr + 0x58)) & ~0x20);
+    case cmap_r128:
+	/* Set palette index & data */
+	out_8(info2->cmap_adr + 0xb0, regno);
+	out_le32((unsigned *)(info2->cmap_adr + 0xb4),
+		(red << 16 | green << 8 | blue));
+	break;
+    case cmap_M3B:
+        /* Set PALETTE_ACCESS_CNTL in DAC_CNTL */
+    	out_le32((unsigned *)(info2->cmap_adr + 0x58),
+    		in_le32((unsigned *)(info2->cmap_adr + 0x58)) | 0x20);
+    	/* Set palette index & data */
+    	out_8(info2->cmap_adr + 0xb0, regno);
+  	out_le32((unsigned *)(info2->cmap_adr + 0xb4),
+    		(red << 16 | green << 8 | blue));
+    	break;
+    }
 
     if (regno < 16)
 	switch (info2->var.bits_per_pixel) {
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/drivers/video/pm2fb.c linux.17p9/drivers/video/pm2fb.c
--- linux.vanilla/drivers/video/pm2fb.c	Fri Apr 21 12:46:40 2000
+++ linux.17p9/drivers/video/pm2fb.c	Tue Jun 27 12:10:39 2000
@@ -1272,7 +1272,13 @@
 }
 
 static struct display_switch pm2_cfb8 = {
-	fbcon_cfb8_setup, pm2fb_pp_bmove, pm2fb_clear8,
+	fbcon_cfb8_setup, pm2fb_pp_bmove,
+#ifdef __alpha__
+	/* No idea why, but pm2fb_clear8 does not always work on Alpha. */
+	fbcon_cfb8_clear,
+#else
+	pm2fb_clear8,
+#endif
 	fbcon_cfb8_putc, fbcon_cfb8_putcs, fbcon_cfb8_revc,
 	pm2fb_cursor, pm2fb_set_font,
 	pm2fb_clear_margins8,
@@ -1769,7 +1775,11 @@
 
 	save_flags(flags);
 	cli();
+#ifdef __alpha__
+	disp->screen_base=i->regions.v_fb + dense_mem(i->regions.v_fb);
+#else
 	disp->screen_base=i->regions.v_fb;
+#endif
 	switch (depth=((struct pm2fb_par* )par)->depth) {
 #ifdef FBCON_HAS_CFB8
 		case 8:
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/fs/affs/file.c linux.17p9/fs/affs/file.c
--- linux.vanilla/fs/affs/file.c	Fri Apr 21 12:46:40 2000
+++ linux.17p9/fs/affs/file.c	Thu Jun 15 15:31:46 2000
@@ -221,6 +221,8 @@
 
 	for (index = 0; index < 4; index++) {
 		kc = &inode->u.affs_i.i_ec->kc[index];
+		if (kc->kc_last == -1)		/* don't look in cache if invalid */
+			continue;
 		if (*ext == kc->kc_this_seq) {
 			return kc->kc_this_key;
 		} else if (*ext == kc->kc_this_seq + 1) {
@@ -893,7 +895,7 @@
 	/* Invalidate cache */
 	if (inode->u.affs_i.i_ec) {
 		inode->u.affs_i.i_ec->max_ext = 0;
-		for (key = 0; key < 3; key++) {
+		for (key = 0; key < 4; key++) {
 			inode->u.affs_i.i_ec->kc[key].kc_next_key = 0;
 			inode->u.affs_i.i_ec->kc[key].kc_last     = -1;
 		}
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/fs/buffer.c linux.17p9/fs/buffer.c
--- linux.vanilla/fs/buffer.c	Sun Jun 11 21:44:18 2000
+++ linux.17p9/fs/buffer.c	Mon Jun 26 15:49:46 2000
@@ -27,6 +27,10 @@
 /* invalidate_buffers/set_blocksize/sync_dev race conditions and
    fs corruption fixes, 1999, Andrea Arcangeli <andrea@suse.de> */
 
+/* Wait for dirty buffers to sync in sync_page_buffers.
+ * 2000, Marcelo Tosatti <marcelo@conectiva.com.br>
+ */
+
 #include <linux/malloc.h>
 #include <linux/locks.h>
 #include <linux/errno.h>
@@ -1464,6 +1468,30 @@
 #define BUFFER_BUSY_BITS	((1<<BH_Dirty) | (1<<BH_Lock) | (1<<BH_Protected))
 #define buffer_busy(bh)		((bh)->b_count || ((bh)->b_state & BUFFER_BUSY_BITS))
 
+static int sync_page_buffers(struct buffer_head *bh, int wait)
+{
+	struct buffer_head * tmp = bh;
+
+	do {
+		struct buffer_head *p = tmp;
+		tmp = tmp->b_this_page;
+		if (buffer_locked(p)) {
+			if (wait)
+				__wait_on_buffer(p);
+		} else if (buffer_dirty(p))
+			ll_rw_block(WRITE, 1, &p);
+	} while (tmp != bh);
+
+	do {
+		struct buffer_head *p = tmp;
+		tmp = tmp->b_this_page;
+		if (buffer_busy(p))
+			return 1;
+	} while (tmp != bh);
+
+	return 0;
+}
+
 /*
  * try_to_free_buffers() checks if all the buffers on this particular page
  * are unused, and free's the page if so.
@@ -1471,22 +1499,19 @@
  * Wake up bdflush() if this fails - if we're running low on memory due
  * to dirty buffers, we need to flush them out as quickly as possible.
  */
-int try_to_free_buffers(struct page * page_map)
+int try_to_free_buffers(struct page * page_map, int wait)
 {
 	struct buffer_head * tmp, * bh = page_map->buffers;
+	int too_many;
 
 	tmp = bh;
 	do {
-		struct buffer_head * p = tmp;
-
+		if (buffer_busy(tmp))
+			goto busy;
 		tmp = tmp->b_this_page;
-		if (!buffer_busy(p))
-			continue;
-
-		wakeup_bdflush(0);
-		return 0;
 	} while (tmp != bh);
 
+ succeed:
 	tmp = bh;
 	do {
 		struct buffer_head * p = tmp;
@@ -1504,6 +1529,28 @@
 	page_map->buffers = NULL;
 	__free_page(page_map);
 	return 1;
+
+ busy:
+	too_many = (nr_buffers * bdf_prm.b_un.nfract/100);
+
+	if (!sync_page_buffers(bh, wait)) {
+
+		/* If a high percentage of the buffers are dirty, 
+		 * wake kflushd 
+		 */
+		if (nr_buffers_type[BUF_DIRTY] > too_many)
+			wakeup_bdflush(0);
+			
+		/*
+		 * We can jump after the busy check because
+		 * we rely on the kernel lock.
+		 */
+		goto succeed;
+	}
+
+	if(nr_buffers_type[BUF_DIRTY] > too_many)
+		wakeup_bdflush(0);
+	return 0;
 }
 
 /* ================== Debugging =================== */
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/fs/ext2/namei.c linux.17p9/fs/ext2/namei.c
--- linux.vanilla/fs/ext2/namei.c	Fri Apr 21 12:46:42 2000
+++ linux.17p9/fs/ext2/namei.c	Fri Jun 16 16:36:25 2000
@@ -418,6 +418,10 @@
 		if (EXT2_HAS_INCOMPAT_FEATURE(dir->i_sb,
 					      EXT2_FEATURE_INCOMPAT_FILETYPE))
 			de->file_type = EXT2_FT_REG_FILE;
+	} else if (S_ISSOCK(inode->i_mode)) {
+		if (EXT2_HAS_INCOMPAT_FEATURE(dir->i_sb,
+					      EXT2_FEATURE_INCOMPAT_FILETYPE))
+			de->file_type = EXT2_FT_SOCK;
 	} else if (S_ISCHR(inode->i_mode)) {
 		inode->i_op = &chrdev_inode_operations;
 		if (EXT2_HAS_INCOMPAT_FEATURE(dir->i_sb,
@@ -793,6 +797,8 @@
 			de->file_type = EXT2_FT_DIR;
 		else if (S_ISLNK(inode->i_mode))
 			de->file_type = EXT2_FT_SYMLINK;
+		else if (S_ISSOCK(inode->i_mode))  
+			de->file_type = EXT2_FT_SOCK;
 		else if (S_ISCHR(inode->i_mode))
 			de->file_type = EXT2_FT_CHRDEV;
 		else if (S_ISBLK(inode->i_mode))
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/fs/lockd/svc.c linux.17p9/fs/lockd/svc.c
--- linux.vanilla/fs/lockd/svc.c	Fri Apr 21 12:46:43 2000
+++ linux.17p9/fs/lockd/svc.c	Sun Jun 11 21:56:59 2000
@@ -236,7 +236,10 @@
 	}
 
 	if ((error = svc_makesock(serv, IPPROTO_UDP, 0)) < 0 
-	 || (error = svc_makesock(serv, IPPROTO_TCP, 0)) < 0) {
+#ifdef CONFIG_NFSD_TCP
+	 || (error = svc_makesock(serv, IPPROTO_TCP, 0)) < 0
+#endif
+		) {
 		if (warned++ == 0) 
 			printk(KERN_WARNING
 				"lockd_up: makesock failed, error=%d\n", error);
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/fs/nls/nls_base.c linux.17p9/fs/nls/nls_base.c
--- linux.vanilla/fs/nls/nls_base.c	Sun Jun 11 21:44:19 2000
+++ linux.17p9/fs/nls/nls_base.c	Sun Jun 11 22:11:26 2000
@@ -514,6 +514,7 @@
 	init_nls_cp874();
 #endif
 #ifdef CONFIG_NLS_CODEPAGE_932
+	init_nls_euc_jp();
 	init_nls_cp932();
 #endif
 #ifdef CONFIG_NLS_CODEPAGE_936
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/fs/nls/nls_cp932.c linux.17p9/fs/nls/nls_cp932.c
--- linux.vanilla/fs/nls/nls_cp932.c	Sun Jun 11 21:44:19 2000
+++ linux.17p9/fs/nls/nls_cp932.c	Sun Jun 25 17:50:05 2000
@@ -2,7 +2,9 @@
  * linux/fs/nls_cp932.c
  *
  * Charset cp932 translation tables.
- * Generated automatically from the Microsoft
+ * This translation table was generated automatically, the
+ * original table can be download from the Microsoft website.
+ * (http://www.microsoft.com/typography/unicode/unicodecp.htm)
  */
 
 #include <linux/module.h>
@@ -2889,7 +2891,7 @@
 	{0x21, 0x78}, {0x21, 0x79}, {0x21, 0x60}, {0x21, 0x61}, /* 0x48-0x4B */
 	{0x21, 0x62}, {0x21, 0x63}, {0x21, 0x64}, {0x21, 0x65}, /* 0x4C-0x4F */
 	{0x21, 0x66}, {0x21, 0x67}, {0x21, 0x68}, {0x21, 0x69}, /* 0x50-0x53 */
-	{0xFF, 0xE2}, {0xFF, 0xE4}, {0xFF, 0x07}, {0xFF, 0x02}, /* 0x54-0x57 */
+	{0x00, 0x3F}, {0xFF, 0xE4}, {0xFF, 0x07}, {0xFF, 0x02}, /* 0x54-0x57 */
 	{0x32, 0x31}, {0x21, 0x16}, {0x21, 0x21}, {0x22, 0x35}, /* 0x58-0x5B */
 	{0x7E, 0x8A}, {0x89, 0x1C}, {0x93, 0x48}, {0x92, 0x88}, /* 0x5C-0x5F */
 	{0x84, 0xDC}, {0x4F, 0xC9}, {0x70, 0xBB}, {0x66, 0x31}, /* 0x60-0x63 */
@@ -3144,21 +3146,21 @@
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x88-0x8B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */
-	0x3F, 0x3F, 0x83, 0x9F, 0x83, 0x00, 0x83, 0x00, /* 0x90-0x93 */
-	0x83, 0x00, 0x83, 0x00, 0x83, 0x00, 0x83, 0x00, /* 0x94-0x97 */
-	0x83, 0x00, 0x83, 0x00, 0x83, 0x00, 0x83, 0x00, /* 0x98-0x9B */
-	0x83, 0x00, 0x83, 0x00, 0x83, 0x00, 0x83, 0x00, /* 0x9C-0x9F */
-	0x83, 0x00, 0x83, 0x00, 0x3F, 0x3F, 0x83, 0x00, /* 0xA0-0xA3 */
-	0x83, 0x00, 0x83, 0x00, 0x83, 0x00, 0x83, 0x00, /* 0xA4-0xA7 */
-	0x83, 0x00, 0x83, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */
+	0x3F, 0x3F, 0x83, 0x9F, 0x83, 0xA0, 0x83, 0xA1, /* 0x90-0x93 */
+	0x83, 0xA2, 0x83, 0xA3, 0x83, 0xA4, 0x83, 0xA5, /* 0x94-0x97 */
+	0x83, 0xA6, 0x83, 0xA7, 0x83, 0xA8, 0x83, 0xA9, /* 0x98-0x9B */
+	0x83, 0xAA, 0x83, 0xAB, 0x83, 0xAC, 0x83, 0xAD, /* 0x9C-0x9F */
+	0x83, 0xAE, 0x83, 0xAF, 0x3F, 0x3F, 0x83, 0xB0, /* 0xA0-0xA3 */
+	0x83, 0xB1, 0x83, 0xB2, 0x83, 0xB3, 0x83, 0xB4, /* 0xA4-0xA7 */
+	0x83, 0xB5, 0x83, 0xB6, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */
-	0x3F, 0x3F, 0x83, 0x00, 0x83, 0x00, 0x83, 0x00, /* 0xB0-0xB3 */
-	0x83, 0x00, 0x83, 0x00, 0x83, 0x00, 0x83, 0x00, /* 0xB4-0xB7 */
-	0x83, 0x00, 0x83, 0x00, 0x83, 0x00, 0x83, 0x00, /* 0xB8-0xBB */
-	0x83, 0x00, 0x83, 0x00, 0x83, 0x00, 0x83, 0x00, /* 0xBC-0xBF */
-	0x83, 0x00, 0x83, 0x00, 0x3F, 0x3F, 0x83, 0x00, /* 0xC0-0xC3 */
-	0x83, 0x00, 0x83, 0x00, 0x83, 0x00, 0x83, 0x00, /* 0xC4-0xC7 */
-	0x83, 0x00, 0x83, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC8-0xCB */
+	0x3F, 0x3F, 0x83, 0xBF, 0x83, 0xC0, 0x83, 0xC1, /* 0xB0-0xB3 */
+	0x83, 0xC2, 0x83, 0xC3, 0x83, 0xC4, 0x83, 0xC5, /* 0xB4-0xB7 */
+	0x83, 0xC6, 0x83, 0xC7, 0x83, 0xC8, 0x83, 0xC9, /* 0xB8-0xBB */
+	0x83, 0xCA, 0x83, 0xCB, 0x83, 0xCC, 0x83, 0xCD, /* 0xBC-0xBF */
+	0x83, 0xCE, 0x83, 0xCF, 0x3F, 0x3F, 0x83, 0xD0, /* 0xC0-0xC3 */
+	0x83, 0xD1, 0x83, 0xD2, 0x83, 0xD3, 0x83, 0xD4, /* 0xC4-0xC7 */
+	0x83, 0xD5, 0x83, 0xD6, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC8-0xCB */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */
@@ -3251,13 +3253,13 @@
 	0x3F, 0x3F, 0x81, 0x5C, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */
 	0x81, 0x65, 0x81, 0x66, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x18-0x1B */
 	0x81, 0x67, 0x81, 0x68, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */
-	0x81, 0x00, 0x81, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */
+	0x81, 0xF5, 0x81, 0xF6, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */
 	0x3F, 0x3F, 0x81, 0x64, 0x81, 0x63, 0x3F, 0x3F, /* 0x24-0x27 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */
-	0x81, 0x00, 0x3F, 0x3F, 0x81, 0x8C, 0x81, 0x8D, /* 0x30-0x33 */
+	0x81, 0xF1, 0x3F, 0x3F, 0x81, 0x8C, 0x81, 0x8D, /* 0x30-0x33 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x81, 0x00, /* 0x38-0x3B */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x81, 0xA6, /* 0x38-0x3B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */
@@ -3316,12 +3318,12 @@
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x08-0x0B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x59, 0x3F, 0x3F, /* 0x14-0x17 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xFA, 0x59, 0x3F, 0x3F, /* 0x14-0x17 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x18-0x1B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */
-	0x3F, 0x3F, 0x00, 0x5A, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */
+	0x3F, 0x3F, 0xFA, 0x5A, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x81, 0x00, /* 0x28-0x2B */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x81, 0xF0, /* 0x28-0x2B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */
@@ -3335,20 +3337,20 @@
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x5C-0x5F */
-	0x00, 0x4A, 0x00, 0x4B, 0x00, 0x4C, 0x00, 0x4D, /* 0x60-0x63 */
-	0x00, 0x4E, 0x00, 0x4F, 0x00, 0x50, 0x00, 0x51, /* 0x64-0x67 */
-	0x00, 0x52, 0x00, 0x53, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x68-0x6B */
+	0xFA, 0x4A, 0xFA, 0x4B, 0xFA, 0x4C, 0xFA, 0x4D, /* 0x60-0x63 */
+	0xFA, 0x4E, 0xFA, 0x4F, 0xFA, 0x50, 0xFA, 0x51, /* 0x64-0x67 */
+	0xFA, 0x52, 0xFA, 0x53, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x68-0x6B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */
-	0x00, 0x40, 0x00, 0x41, 0x00, 0x42, 0x00, 0x43, /* 0x70-0x73 */
-	0x00, 0x44, 0x00, 0x45, 0x00, 0x46, 0x00, 0x47, /* 0x74-0x77 */
-	0x00, 0x48, 0x00, 0x49, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */
+	0xEE, 0xEF, 0xEE, 0xF0, 0xEE, 0xF1, 0xEE, 0xF2, /* 0x70-0x73 */
+	0xEE, 0xF3, 0xEE, 0xF4, 0xEE, 0xF5, 0xEE, 0xF6, /* 0x74-0x77 */
+	0xEE, 0xF7, 0xEE, 0xF8, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */
 	
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x88-0x8B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */
-	0x81, 0x00, 0x81, 0x00, 0x81, 0x00, 0x81, 0x00, /* 0x90-0x93 */
+	0x81, 0xA9, 0x81, 0xAA, 0x81, 0xA8, 0x81, 0xAB, /* 0x90-0x93 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */
@@ -3364,8 +3366,8 @@
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC4-0xC7 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC8-0xCB */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x81, 0x00, 0x3F, 0x3F, /* 0xD0-0xD3 */
-	0x81, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x81, 0xCB, 0x3F, 0x3F, /* 0xD0-0xD3 */
+	0x81, 0xCC, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xDC-0xDF */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */
@@ -3379,22 +3381,22 @@
 };
 
 static unsigned char u2c_22[512] = {
-	0x81, 0x00, 0x3F, 0x3F, 0x81, 0x00, 0x81, 0x00, /* 0x00-0x03 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x81, 0x00, /* 0x04-0x07 */
-	0x81, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x81, 0x00, /* 0x08-0x0B */
+	0x81, 0xCD, 0x3F, 0x3F, 0x81, 0xDD, 0x81, 0xCE, /* 0x00-0x03 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x81, 0xDE, /* 0x04-0x07 */
+	0x81, 0xB8, 0x3F, 0x3F, 0x3F, 0x3F, 0x81, 0xB9, /* 0x08-0x0B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */
 	0x3F, 0x3F, 0x87, 0x94, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x87, 0x95, 0x3F, 0x3F, /* 0x18-0x1B */
-	0x3F, 0x3F, 0x81, 0x00, 0x81, 0x87, 0x87, 0x98, /* 0x1C-0x1F */
+	0x3F, 0x3F, 0x81, 0xE5, 0x81, 0x87, 0x87, 0x98, /* 0x1C-0x1F */
 	0x87, 0x97, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */
-	0x3F, 0x3F, 0x81, 0x61, 0x3F, 0x3F, 0x81, 0x00, /* 0x24-0x27 */
-	0x81, 0x00, 0x87, 0x9B, 0x87, 0x9C, 0x87, 0x92, /* 0x28-0x2B */
-	0x81, 0x00, 0x3F, 0x3F, 0x87, 0x93, 0x3F, 0x3F, /* 0x2C-0x2F */
+	0x3F, 0x3F, 0x81, 0x61, 0x3F, 0x3F, 0x81, 0xC8, /* 0x24-0x27 */
+	0x81, 0xC9, 0x87, 0x9B, 0x87, 0x9C, 0x87, 0x92, /* 0x28-0x2B */
+	0x81, 0xE8, 0x3F, 0x3F, 0x87, 0x93, 0x3F, 0x3F, /* 0x2C-0x2F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */
-	0x81, 0x88, 0x00, 0x5B, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */
+	0x81, 0x88, 0xFA, 0x5B, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x38-0x3B */
-	0x3F, 0x3F, 0x81, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */
+	0x3F, 0x3F, 0x81, 0xE4, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */
@@ -3405,15 +3407,15 @@
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x5C-0x5F */
 	0x81, 0x82, 0x87, 0x91, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x60-0x63 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x81, 0x85, 0x81, 0x86, /* 0x64-0x67 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x81, 0x00, 0x81, 0x00, /* 0x68-0x6B */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x81, 0xE1, 0x81, 0xE2, /* 0x68-0x6B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x74-0x77 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */
 	
-	0x3F, 0x3F, 0x3F, 0x3F, 0x81, 0x00, 0x81, 0x00, /* 0x80-0x83 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x81, 0x00, 0x81, 0x00, /* 0x84-0x87 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x81, 0xBC, 0x81, 0xBD, /* 0x80-0x83 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x81, 0xBA, 0x81, 0xBB, /* 0x84-0x87 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x88-0x8B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */
@@ -3451,7 +3453,7 @@
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x04-0x07 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x08-0x0B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x81, 0x00, 0x3F, 0x3F, /* 0x10-0x13 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x81, 0xDC, 0x3F, 0x3F, /* 0x10-0x13 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x18-0x1B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */
@@ -3583,25 +3585,25 @@
 };
 
 static unsigned char u2c_25[512] = {
-	0x84, 0x9F, 0x84, 0x00, 0x84, 0x00, 0x84, 0x00, /* 0x00-0x03 */
+	0x84, 0x9F, 0x84, 0xAA, 0x84, 0xA0, 0x84, 0xAB, /* 0x00-0x03 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x04-0x07 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x08-0x0B */
-	0x84, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x84, 0x00, /* 0x0C-0x0F */
-	0x84, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x84, 0x00, /* 0x10-0x13 */
-	0x84, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x84, 0x00, /* 0x14-0x17 */
-	0x84, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x84, 0x00, /* 0x18-0x1B */
-	0x84, 0x00, 0x84, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */
-	0x84, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x84, 0x00, /* 0x20-0x23 */
-	0x84, 0x00, 0x84, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */
-	0x84, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x84, 0x00, /* 0x28-0x2B */
-	0x84, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x84, 0x00, /* 0x2C-0x2F */
-	0x84, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x84, 0x00, /* 0x30-0x33 */
-	0x84, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x84, 0x00, /* 0x34-0x37 */
-	0x84, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x84, 0x00, /* 0x38-0x3B */
-	0x84, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x84, 0x00, /* 0x3C-0x3F */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x84, 0x00, 0x3F, 0x3F, /* 0x40-0x43 */
+	0x84, 0xA1, 0x3F, 0x3F, 0x3F, 0x3F, 0x84, 0xAC, /* 0x0C-0x0F */
+	0x84, 0xA2, 0x3F, 0x3F, 0x3F, 0x3F, 0x84, 0xAD, /* 0x10-0x13 */
+	0x84, 0xA4, 0x3F, 0x3F, 0x3F, 0x3F, 0x84, 0xAF, /* 0x14-0x17 */
+	0x84, 0xA3, 0x3F, 0x3F, 0x3F, 0x3F, 0x84, 0xAE, /* 0x18-0x1B */
+	0x84, 0xA5, 0x84, 0xBA, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */
+	0x84, 0xB5, 0x3F, 0x3F, 0x3F, 0x3F, 0x84, 0xB0, /* 0x20-0x23 */
+	0x84, 0xA7, 0x84, 0xBC, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */
+	0x84, 0xB7, 0x3F, 0x3F, 0x3F, 0x3F, 0x84, 0xB2, /* 0x28-0x2B */
+	0x84, 0xA6, 0x3F, 0x3F, 0x3F, 0x3F, 0x84, 0xB6, /* 0x2C-0x2F */
+	0x84, 0xBB, 0x3F, 0x3F, 0x3F, 0x3F, 0x84, 0xB1, /* 0x30-0x33 */
+	0x84, 0xA8, 0x3F, 0x3F, 0x3F, 0x3F, 0x84, 0xB8, /* 0x34-0x37 */
+	0x84, 0xBD, 0x3F, 0x3F, 0x3F, 0x3F, 0x84, 0xB3, /* 0x38-0x3B */
+	0x84, 0xA9, 0x3F, 0x3F, 0x3F, 0x3F, 0x84, 0xB9, /* 0x3C-0x3F */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x84, 0xBE, 0x3F, 0x3F, /* 0x40-0x43 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x84, 0x00, /* 0x48-0x4B */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x84, 0xB4, /* 0x48-0x4B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x4C-0x4F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */
@@ -3624,14 +3626,14 @@
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */
-	0x81, 0x00, 0x81, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */
+	0x81, 0xA1, 0x81, 0xA0, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x81, 0x00, 0x81, 0x00, /* 0xB0-0xB3 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x81, 0xA3, 0x81, 0xA2, /* 0xB0-0xB3 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */
-	0x81, 0x00, 0x81, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */
+	0x81, 0xA5, 0x81, 0xA4, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x81, 0x9F, 0x81, 0x9E, /* 0xC4-0xC7 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x81, 0x9B, /* 0xC8-0xCB */
@@ -3643,7 +3645,7 @@
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x81, 0x00, /* 0xEC-0xEF */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x81, 0xFC, /* 0xEC-0xEF */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF8-0xFB */
@@ -3677,8 +3679,8 @@
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x5C-0x5F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x60-0x63 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x81, 0x00, 0x3F, 0x3F, /* 0x68-0x6B */
-	0x3F, 0x3F, 0x81, 0x00, 0x3F, 0x3F, 0x81, 0x00, /* 0x6C-0x6F */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x81, 0xF4, 0x3F, 0x3F, /* 0x68-0x6B */
+	0x3F, 0x3F, 0x81, 0xF3, 0x3F, 0x3F, 0x81, 0xF2, /* 0x6C-0x6F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x74-0x77 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */
@@ -3723,7 +3725,7 @@
 	0x3F, 0x3F, 0x81, 0x58, 0x81, 0x59, 0x81, 0x5A, /* 0x04-0x07 */
 	0x81, 0x71, 0x81, 0x72, 0x81, 0x73, 0x81, 0x74, /* 0x08-0x0B */
 	0x81, 0x75, 0x81, 0x76, 0x81, 0x77, 0x81, 0x78, /* 0x0C-0x0F */
-	0x81, 0x79, 0x81, 0x7A, 0x81, 0x00, 0x81, 0x00, /* 0x10-0x13 */
+	0x81, 0x79, 0x81, 0x7A, 0x81, 0xA7, 0x81, 0xAC, /* 0x10-0x13 */
 	0x81, 0x6B, 0x81, 0x6C, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x18-0x1B */
 	0x3F, 0x3F, 0x87, 0x80, 0x3F, 0x3F, 0x87, 0x81, /* 0x1C-0x1F */
@@ -3735,29 +3737,29 @@
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x38-0x3B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */
-	0x3F, 0x3F, 0x82, 0x9F, 0x82, 0x00, 0x82, 0x00, /* 0x40-0x43 */
-	0x82, 0x00, 0x82, 0x00, 0x82, 0x00, 0x82, 0x00, /* 0x44-0x47 */
-	0x82, 0x00, 0x82, 0x00, 0x82, 0x00, 0x82, 0x00, /* 0x48-0x4B */
-	0x82, 0x00, 0x82, 0x00, 0x82, 0x00, 0x82, 0x00, /* 0x4C-0x4F */
-	0x82, 0x00, 0x82, 0x00, 0x82, 0x00, 0x82, 0x00, /* 0x50-0x53 */
-	0x82, 0x00, 0x82, 0x00, 0x82, 0x00, 0x82, 0x00, /* 0x54-0x57 */
-	0x82, 0x00, 0x82, 0x00, 0x82, 0x00, 0x82, 0x00, /* 0x58-0x5B */
-	0x82, 0x00, 0x82, 0x00, 0x82, 0x00, 0x82, 0x00, /* 0x5C-0x5F */
-	0x82, 0x00, 0x82, 0x00, 0x82, 0x00, 0x82, 0x00, /* 0x60-0x63 */
-	0x82, 0x00, 0x82, 0x00, 0x82, 0x00, 0x82, 0x00, /* 0x64-0x67 */
-	0x82, 0x00, 0x82, 0x00, 0x82, 0x00, 0x82, 0x00, /* 0x68-0x6B */
-	0x82, 0x00, 0x82, 0x00, 0x82, 0x00, 0x82, 0x00, /* 0x6C-0x6F */
-	0x82, 0x00, 0x82, 0x00, 0x82, 0x00, 0x82, 0x00, /* 0x70-0x73 */
-	0x82, 0x00, 0x82, 0x00, 0x82, 0x00, 0x82, 0x00, /* 0x74-0x77 */
-	0x82, 0x00, 0x82, 0x00, 0x82, 0x00, 0x82, 0x00, /* 0x78-0x7B */
-	0x82, 0x00, 0x82, 0x00, 0x82, 0x00, 0x82, 0x00, /* 0x7C-0x7F */
-	
-	0x82, 0x00, 0x82, 0x00, 0x82, 0x00, 0x82, 0x00, /* 0x80-0x83 */
-	0x82, 0x00, 0x82, 0x00, 0x82, 0x00, 0x82, 0x00, /* 0x84-0x87 */
-	0x82, 0x00, 0x82, 0x00, 0x82, 0x00, 0x82, 0x00, /* 0x88-0x8B */
-	0x82, 0x00, 0x82, 0x00, 0x82, 0x00, 0x82, 0x00, /* 0x8C-0x8F */
-	0x82, 0x00, 0x82, 0x00, 0x82, 0x00, 0x82, 0x00, /* 0x90-0x93 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */
+	0x3F, 0x3F, 0x82, 0x9F, 0x82, 0xA0, 0x82, 0xA1, /* 0x40-0x43 */
+	0x82, 0xA2, 0x82, 0xA3, 0x82, 0xA4, 0x82, 0xA5, /* 0x44-0x47 */
+	0x82, 0xA6, 0x82, 0xA7, 0x82, 0xA8, 0x82, 0xA9, /* 0x48-0x4B */
+	0x82, 0xAA, 0x82, 0xAB, 0x82, 0xAC, 0x82, 0xAD, /* 0x4C-0x4F */
+	0x82, 0xAE, 0x82, 0xAF, 0x82, 0xB0, 0x82, 0xB1, /* 0x50-0x53 */
+	0x82, 0xB2, 0x82, 0xB3, 0x82, 0xB4, 0x82, 0xB5, /* 0x54-0x57 */
+	0x82, 0xB6, 0x82, 0xB7, 0x82, 0xB8, 0x82, 0xB9, /* 0x58-0x5B */
+	0x82, 0xBA, 0x82, 0xBB, 0x82, 0xBC, 0x82, 0xBD, /* 0x5C-0x5F */
+	0x82, 0xBE, 0x82, 0xBF, 0x82, 0xC0, 0x82, 0xC1, /* 0x60-0x63 */
+	0x82, 0xC2, 0x82, 0xC3, 0x82, 0xC4, 0x82, 0xC5, /* 0x64-0x67 */
+	0x82, 0xC6, 0x82, 0xC7, 0x82, 0xC8, 0x82, 0xC9, /* 0x68-0x6B */
+	0x82, 0xCA, 0x82, 0xCB, 0x82, 0xCC, 0x82, 0xCD, /* 0x6C-0x6F */
+	0x82, 0xCE, 0x82, 0xCF, 0x82, 0xD0, 0x82, 0xD1, /* 0x70-0x73 */
+	0x82, 0xD2, 0x82, 0xD3, 0x82, 0xD4, 0x82, 0xD5, /* 0x74-0x77 */
+	0x82, 0xD6, 0x82, 0xD7, 0x82, 0xD8, 0x82, 0xD9, /* 0x78-0x7B */
+	0x82, 0xDA, 0x82, 0xDB, 0x82, 0xDC, 0x82, 0xDD, /* 0x7C-0x7F */
+	
+	0x82, 0xDE, 0x82, 0xDF, 0x82, 0xE0, 0x82, 0xE1, /* 0x80-0x83 */
+	0x82, 0xE2, 0x82, 0xE3, 0x82, 0xE4, 0x82, 0xE5, /* 0x84-0x87 */
+	0x82, 0xE6, 0x82, 0xE7, 0x82, 0xE8, 0x82, 0xE9, /* 0x88-0x8B */
+	0x82, 0xEA, 0x82, 0xEB, 0x82, 0xEC, 0x82, 0xED, /* 0x8C-0x8F */
+	0x82, 0xEE, 0x82, 0xEF, 0x82, 0xF0, 0x82, 0xF1, /* 0x90-0x93 */
+	0x83, 0x94, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x81, 0x4A, /* 0x98-0x9B */
 	0x81, 0x4B, 0x81, 0x54, 0x81, 0x55, 0x3F, 0x3F, /* 0x9C-0x9F */
 	0x3F, 0x3F, 0x83, 0x40, 0x83, 0x41, 0x83, 0x42, /* 0xA0-0xA3 */
@@ -3799,7 +3801,7 @@
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */
-	0x3F, 0x3F, 0x00, 0x58, 0x87, 0x8B, 0x3F, 0x3F, /* 0x30-0x33 */
+	0x3F, 0x3F, 0xFA, 0x58, 0x87, 0x8B, 0x3F, 0x3F, /* 0x30-0x33 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */
 	0x3F, 0x3F, 0x87, 0x8C, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x38-0x3B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */
@@ -3923,502 +3925,502 @@
 };
 
 static unsigned char u2c_4E[512] = {
-	0x88, 0x00, 0x92, 0x9A, 0x3F, 0x3F, 0x8E, 0x00, /* 0x00-0x03 */
+	0x88, 0xEA, 0x92, 0x9A, 0x3F, 0x3F, 0x8E, 0xB5, /* 0x00-0x03 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x96, 0x9C, /* 0x04-0x07 */
-	0x8F, 0x00, 0x8E, 0x4F, 0x8F, 0x00, 0x89, 0x00, /* 0x08-0x0B */
+	0x8F, 0xE4, 0x8E, 0x4F, 0x8F, 0xE3, 0x89, 0xBA, /* 0x08-0x0B */
 	0x3F, 0x3F, 0x95, 0x73, 0x97, 0x5E, 0x3F, 0x3F, /* 0x0C-0x0F */
-	0x98, 0x00, 0x89, 0x4E, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */
-	0x8A, 0x8E, 0x98, 0x00, 0x90, 0x00, 0x99, 0x00, /* 0x14-0x17 */
-	0x8B, 0x75, 0x95, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x18-0x1B */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x8F, 0x00, 0x3F, 0x3F, /* 0x1C-0x1F */
-	0x3F, 0x3F, 0x97, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x95, 0x00, 0x3F, 0x3F, /* 0x24-0x27 */
-	0x00, 0x68, 0x3F, 0x3F, 0x98, 0x00, 0x3F, 0x3F, /* 0x28-0x2B */
+	0x98, 0xA0, 0x89, 0x4E, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */
+	0x8A, 0x8E, 0x98, 0xA1, 0x90, 0xA2, 0x99, 0xC0, /* 0x14-0x17 */
+	0x8B, 0x75, 0x95, 0xB8, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x18-0x1B */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x8F, 0xE5, 0x3F, 0x3F, /* 0x1C-0x1F */
+	0x3F, 0x3F, 0x97, 0xBC, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x95, 0xC0, 0x3F, 0x3F, /* 0x24-0x27 */
+	0xED, 0x4C, 0x3F, 0x3F, 0x98, 0xA2, 0x3F, 0x3F, /* 0x28-0x2B */
 	0x3F, 0x3F, 0x92, 0x86, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */
-	0x3F, 0x3F, 0x98, 0x00, 0x8B, 0x00, 0x3F, 0x3F, /* 0x30-0x33 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x98, 0x00, 0x3F, 0x3F, /* 0x34-0x37 */
-	0x8A, 0x00, 0x92, 0x4F, 0x3F, 0x3F, 0x8E, 0x00, /* 0x38-0x3B */
-	0x98, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x98, 0x00, /* 0x3C-0x3F */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x98, 0x00, 0x94, 0x54, /* 0x40-0x43 */
+	0x3F, 0x3F, 0x98, 0xA3, 0x8B, 0xF8, 0x3F, 0x3F, /* 0x30-0x33 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x98, 0xA4, 0x3F, 0x3F, /* 0x34-0x37 */
+	0x8A, 0xDB, 0x92, 0x4F, 0x3F, 0x3F, 0x8E, 0xE5, /* 0x38-0x3B */
+	0x98, 0xA5, 0x3F, 0x3F, 0x3F, 0x3F, 0x98, 0xA6, /* 0x3C-0x3F */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x98, 0xA7, 0x94, 0x54, /* 0x40-0x43 */
 	0x3F, 0x3F, 0x8B, 0x76, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x94, 0x56, /* 0x48-0x4B */
-	0x3F, 0x3F, 0x93, 0x00, 0x8C, 0x00, 0x96, 0x52, /* 0x4C-0x4F */
+	0x3F, 0x3F, 0x93, 0xE1, 0x8C, 0xC1, 0x96, 0x52, /* 0x4C-0x4F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */
-	0x3F, 0x3F, 0x00, 0x68, 0x98, 0x00, 0x8F, 0x00, /* 0x54-0x57 */
-	0x98, 0x00, 0x89, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */
-	0x3F, 0x3F, 0x8B, 0x00, 0x8C, 0x00, 0x96, 0x00, /* 0x5C-0x5F */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x9B, 0x00, 0x3F, 0x3F, /* 0x60-0x63 */
+	0x3F, 0x3F, 0xE5, 0x68, 0x98, 0xA8, 0x8F, 0xE6, /* 0x54-0x57 */
+	0x98, 0xA9, 0x89, 0xB3, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */
+	0x3F, 0x3F, 0x8B, 0xE3, 0x8C, 0xEE, 0x96, 0xE7, /* 0x5C-0x5F */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x9B, 0xA4, 0x3F, 0x3F, /* 0x60-0x63 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x68-0x6B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */
-	0x3F, 0x3F, 0x97, 0x90, 0x3F, 0x3F, 0x93, 0x00, /* 0x70-0x73 */
+	0x3F, 0x3F, 0x97, 0x90, 0x3F, 0x3F, 0x93, 0xFB, /* 0x70-0x73 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x74-0x77 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x8A, 0x00, 0x3F, 0x3F, /* 0x7C-0x7F */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x8A, 0xA3, 0x3F, 0x3F, /* 0x7C-0x7F */
 	
-	0x8B, 0x54, 0x3F, 0x3F, 0x98, 0x00, 0x3F, 0x3F, /* 0x80-0x83 */
-	0x3F, 0x3F, 0x98, 0x00, 0x97, 0x00, 0x3F, 0x3F, /* 0x84-0x87 */
-	0x97, 0x5C, 0x91, 0x88, 0x98, 0x00, 0x8E, 0x96, /* 0x88-0x8B */
-	0x93, 0x00, 0x3F, 0x3F, 0x98, 0x00, 0x3F, 0x3F, /* 0x8C-0x8F */
-	0x3F, 0x3F, 0x89, 0x5D, 0x8C, 0x00, 0x3F, 0x3F, /* 0x90-0x93 */
-	0x8C, 0x00, 0x88, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */
-	0x98, 0x6A, 0x98, 0x69, 0x3F, 0x3F, 0x8D, 0x00, /* 0x98-0x9B */
-	0x88, 0x9F, 0x3F, 0x3F, 0x98, 0x00, 0x98, 0x00, /* 0x9C-0x9F */
-	0x98, 0x00, 0x96, 0x53, 0x98, 0x00, 0x3F, 0x3F, /* 0xA0-0xA3 */
-	0x8C, 0x00, 0x88, 0x00, 0x96, 0x92, 0x3F, 0x3F, /* 0xA4-0xA7 */
+	0x8B, 0x54, 0x3F, 0x3F, 0x98, 0xAA, 0x3F, 0x3F, /* 0x80-0x83 */
+	0x3F, 0x3F, 0x98, 0xAB, 0x97, 0xB9, 0x3F, 0x3F, /* 0x84-0x87 */
+	0x97, 0x5C, 0x91, 0x88, 0x98, 0xAD, 0x8E, 0x96, /* 0x88-0x8B */
+	0x93, 0xF1, 0x3F, 0x3F, 0x98, 0xB0, 0x3F, 0x3F, /* 0x8C-0x8F */
+	0x3F, 0x3F, 0x89, 0x5D, 0x8C, 0xDD, 0x3F, 0x3F, /* 0x90-0x93 */
+	0x8C, 0xDC, 0x88, 0xE4, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */
+	0x98, 0x6A, 0x98, 0x69, 0x3F, 0x3F, 0x8D, 0xB1, /* 0x98-0x9B */
+	0x88, 0x9F, 0x3F, 0x3F, 0x98, 0xB1, 0x98, 0xB2, /* 0x9C-0x9F */
+	0x98, 0xB3, 0x96, 0x53, 0x98, 0xB4, 0x3F, 0x3F, /* 0xA0-0xA3 */
+	0x8C, 0xF0, 0x88, 0xE5, 0x96, 0x92, 0x3F, 0x3F, /* 0xA4-0xA7 */
 	0x8B, 0x9C, 0x3F, 0x3F, 0x3F, 0x3F, 0x8B, 0x9D, /* 0xA8-0xAB */
-	0x8B, 0x9E, 0x92, 0x00, 0x97, 0x00, 0x3F, 0x3F, /* 0xAC-0xAF */
-	0x98, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x98, 0x00, /* 0xB0-0xB3 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x98, 0x00, 0x3F, 0x3F, /* 0xB4-0xB7 */
+	0x8B, 0x9E, 0x92, 0xE0, 0x97, 0xBA, 0x3F, 0x3F, /* 0xAC-0xAF */
+	0x98, 0xB5, 0x3F, 0x3F, 0x3F, 0x3F, 0x98, 0xB6, /* 0xB0-0xB3 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x98, 0xB7, 0x3F, 0x3F, /* 0xB4-0xB7 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x90, 0x6C, 0x3F, 0x3F, /* 0xB8-0xBB */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */
-	0x8F, 0x59, 0x90, 0x6D, 0x98, 0x00, 0x3F, 0x3F, /* 0xC0-0xC3 */
-	0x98, 0x00, 0x3F, 0x3F, 0x98, 0x00, 0x8B, 0x77, /* 0xC4-0xC7 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x8D, 0x00, 0x89, 0x00, /* 0xC8-0xCB */
-	0x3F, 0x3F, 0x98, 0x00, 0x98, 0x00, 0x95, 0x00, /* 0xCC-0xCF */
+	0x8F, 0x59, 0x90, 0x6D, 0x98, 0xBC, 0x3F, 0x3F, /* 0xC0-0xC3 */
+	0x98, 0xBA, 0x3F, 0x3F, 0x98, 0xBB, 0x8B, 0x77, /* 0xC4-0xC7 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x8D, 0xA1, 0x89, 0xEE, /* 0xC8-0xCB */
+	0x3F, 0x3F, 0x98, 0xB9, 0x98, 0xB8, 0x95, 0xA7, /* 0xCC-0xCF */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */
-	0x8E, 0x65, 0x8E, 0x64, 0x91, 0x00, 0x98, 0x00, /* 0xD4-0xD7 */
-	0x95, 0x74, 0x90, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */
-	0x3F, 0x3F, 0x81, 0x57, 0x98, 0x00, 0x98, 0x00, /* 0xDC-0xDF */
-	0x3F, 0x3F, 0x00, 0x69, 0x3F, 0x3F, 0x91, 0x00, /* 0xE0-0xE3 */
-	0x97, 0x00, 0x88, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */
-	0x3F, 0x3F, 0x98, 0x00, 0x89, 0x00, 0x3F, 0x3F, /* 0xEC-0xEF */
-	0x8B, 0x00, 0x3F, 0x3F, 0x92, 0x87, 0x3F, 0x3F, /* 0xF0-0xF3 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x8C, 0x8F, 0x98, 0x00, /* 0xF4-0xF7 */
+	0x8E, 0x65, 0x8E, 0x64, 0x91, 0xBC, 0x98, 0xBD, /* 0xD4-0xD7 */
+	0x95, 0x74, 0x90, 0xE5, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */
+	0x3F, 0x3F, 0x81, 0x57, 0x98, 0xBE, 0x98, 0xC0, /* 0xDC-0xDF */
+	0x3F, 0x3F, 0xED, 0x4D, 0x3F, 0x3F, 0x91, 0xE3, /* 0xE0-0xE3 */
+	0x97, 0xDF, 0x88, 0xC8, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */
+	0x3F, 0x3F, 0x98, 0xBF, 0x89, 0xBC, 0x3F, 0x3F, /* 0xEC-0xEF */
+	0x8B, 0xC2, 0x3F, 0x3F, 0x92, 0x87, 0x3F, 0x3F, /* 0xF0-0xF3 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x8C, 0x8F, 0x98, 0xC1, /* 0xF4-0xF7 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x94, 0x43, /* 0xF8-0xFB */
-	0x00, 0x6A, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */
+	0xED, 0x4E, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */
 };
 
 static unsigned char u2c_4F[512] = {
-	0x00, 0x6B, 0x8A, 0x00, 0x3F, 0x3F, 0x00, 0x6C, /* 0x00-0x03 */
+	0xED, 0x4F, 0x8A, 0xE9, 0x3F, 0x3F, 0xED, 0x50, /* 0x00-0x03 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x04-0x07 */
-	0x3F, 0x3F, 0x98, 0x00, 0x88, 0x00, 0x3F, 0x3F, /* 0x08-0x0B */
-	0x3F, 0x3F, 0x8C, 0x00, 0x8A, 0x00, 0x95, 0x9A, /* 0x0C-0x0F */
-	0x94, 0x00, 0x8B, 0x78, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */
+	0x3F, 0x3F, 0x98, 0xC2, 0x88, 0xC9, 0x3F, 0x3F, /* 0x08-0x0B */
+	0x3F, 0x3F, 0x8C, 0xDE, 0x8A, 0xEA, 0x95, 0x9A, /* 0x0C-0x0F */
+	0x94, 0xB0, 0x8B, 0x78, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x89, 0x00, 0x3F, 0x3F, /* 0x18-0x1B */
-	0x98, 0x00, 0x93, 0x60, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x89, 0xEF, 0x3F, 0x3F, /* 0x18-0x1B */
+	0x98, 0xE5, 0x93, 0x60, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x94, 0x8C, /* 0x2C-0x2F */
-	0x98, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */
-	0x94, 0x00, 0x3F, 0x3F, 0x97, 0x00, 0x3F, 0x3F, /* 0x34-0x37 */
-	0x90, 0x4C, 0x00, 0x6D, 0x8E, 0x66, 0x3F, 0x3F, /* 0x38-0x3B */
-	0x8E, 0x97, 0x89, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x92, 0x00, /* 0x40-0x43 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x92, 0x41, 0x98, 0x00, /* 0x44-0x47 */
+	0x98, 0xC4, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */
+	0x94, 0xBA, 0x3F, 0x3F, 0x97, 0xE0, 0x3F, 0x3F, /* 0x34-0x37 */
+	0x90, 0x4C, 0xED, 0x51, 0x8E, 0x66, 0x3F, 0x3F, /* 0x38-0x3B */
+	0x8E, 0x97, 0x89, 0xBE, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x92, 0xCF, /* 0x40-0x43 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x92, 0x41, 0x98, 0xC8, /* 0x44-0x47 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */
-	0x3F, 0x3F, 0x88, 0x00, 0x92, 0x00, 0x8F, 0x5A, /* 0x4C-0x4F */
-	0x8D, 0x00, 0x97, 0x43, 0x3F, 0x3F, 0x91, 0x00, /* 0x50-0x53 */
-	0x3F, 0x3F, 0x89, 0x00, 0x00, 0x6E, 0x98, 0x00, /* 0x54-0x57 */
-	0x3F, 0x3F, 0x97, 0x5D, 0x98, 0x00, 0x98, 0x00, /* 0x58-0x5B */
-	0x8D, 0x00, 0x98, 0x00, 0x9B, 0x43, 0x3F, 0x3F, /* 0x5C-0x5F */
+	0x3F, 0x3F, 0x88, 0xCA, 0x92, 0xE1, 0x8F, 0x5A, /* 0x4C-0x4F */
+	0x8D, 0xB2, 0x97, 0x43, 0x3F, 0x3F, 0x91, 0xCC, /* 0x50-0x53 */
+	0x3F, 0x3F, 0x89, 0xBD, 0xED, 0x52, 0x98, 0xC7, /* 0x54-0x57 */
+	0x3F, 0x3F, 0x97, 0x5D, 0x98, 0xC3, 0x98, 0xC5, /* 0x58-0x5B */
+	0x8D, 0xEC, 0x98, 0xC6, 0x9B, 0x43, 0x3F, 0x3F, /* 0x5C-0x5F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x60-0x63 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */
-	0x3F, 0x3F, 0x98, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x68-0x6B */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x98, 0x00, /* 0x6C-0x6F */
-	0x98, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x89, 0x00, /* 0x70-0x73 */
-	0x3F, 0x3F, 0x95, 0x00, 0x98, 0x00, 0x3F, 0x3F, /* 0x74-0x77 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x98, 0x00, /* 0x78-0x7B */
-	0x8C, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x8E, 0x67, /* 0x7C-0x7F */
-	
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x8A, 0x00, /* 0x80-0x83 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x98, 0x00, 0x3F, 0x3F, /* 0x84-0x87 */
-	0x98, 0x00, 0x3F, 0x3F, 0x00, 0x70, 0x97, 0x00, /* 0x88-0x8B */
-	0x3F, 0x3F, 0x8E, 0x98, 0x3F, 0x3F, 0x98, 0x00, /* 0x8C-0x8F */
-	0x3F, 0x3F, 0x98, 0x00, 0x00, 0x6F, 0x3F, 0x3F, /* 0x90-0x93 */
-	0x00, 0x72, 0x3F, 0x3F, 0x98, 0x00, 0x3F, 0x3F, /* 0x94-0x97 */
-	0x98, 0x00, 0x3F, 0x3F, 0x00, 0x71, 0x8B, 0x9F, /* 0x98-0x9B */
-	0x3F, 0x3F, 0x88, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */
-	0x8B, 0x00, 0x89, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */
+	0x3F, 0x3F, 0x98, 0xCE, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x68-0x6B */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x98, 0xD1, /* 0x6C-0x6F */
+	0x98, 0xCF, 0x3F, 0x3F, 0x3F, 0x3F, 0x89, 0xC0, /* 0x70-0x73 */
+	0x3F, 0x3F, 0x95, 0xB9, 0x98, 0xC9, 0x3F, 0x3F, /* 0x74-0x77 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x98, 0xCD, /* 0x78-0x7B */
+	0x8C, 0xF1, 0x3F, 0x3F, 0x3F, 0x3F, 0x8E, 0x67, /* 0x7C-0x7F */
+	
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x8A, 0xA4, /* 0x80-0x83 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x98, 0xD2, 0x3F, 0x3F, /* 0x84-0x87 */
+	0x98, 0xCA, 0x3F, 0x3F, 0xED, 0x54, 0x97, 0xE1, /* 0x88-0x8B */
+	0x3F, 0x3F, 0x8E, 0x98, 0x3F, 0x3F, 0x98, 0xCB, /* 0x8C-0x8F */
+	0x3F, 0x3F, 0x98, 0xD0, 0xED, 0x53, 0x3F, 0x3F, /* 0x90-0x93 */
+	0xED, 0x56, 0x3F, 0x3F, 0x98, 0xD3, 0x3F, 0x3F, /* 0x94-0x97 */
+	0x98, 0xCC, 0x3F, 0x3F, 0xED, 0x55, 0x8B, 0x9F, /* 0x98-0x9B */
+	0x3F, 0x3F, 0x88, 0xCB, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */
+	0x8B, 0xA0, 0x89, 0xBF, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x9B, 0x44, /* 0xA8-0xAB */
-	0x3F, 0x3F, 0x96, 0x99, 0x95, 0x8E, 0x8C, 0x00, /* 0xAC-0xAF */
+	0x3F, 0x3F, 0x96, 0x99, 0x95, 0x8E, 0x8C, 0xF2, /* 0xAC-0xAF */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB0-0xB3 */
-	0x3F, 0x3F, 0x90, 0x4E, 0x97, 0x00, 0x3F, 0x3F, /* 0xB4-0xB7 */
+	0x3F, 0x3F, 0x90, 0x4E, 0x97, 0xB5, 0x3F, 0x3F, /* 0xB4-0xB7 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x95, 0x00, /* 0xBC-0xBF */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x8C, 0x57, 0x91, 0x00, /* 0xC0-0xC3 */
-	0x89, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC4-0xC7 */
-	0x3F, 0x3F, 0x00, 0x61, 0x8F, 0x72, 0x3F, 0x3F, /* 0xC8-0xCB */
-	0x3F, 0x3F, 0x00, 0x73, 0x98, 0x00, 0x3F, 0x3F, /* 0xCC-0xCF */
-	0x98, 0x00, 0x98, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */
-	0x98, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x91, 0x00, /* 0xD4-0xD7 */
-	0x98, 0x00, 0x3F, 0x3F, 0x98, 0x00, 0x98, 0x00, /* 0xD8-0xDB */
-	0x3F, 0x3F, 0x95, 0x00, 0x3F, 0x3F, 0x98, 0x00, /* 0xDC-0xDF */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x95, 0xD6, /* 0xBC-0xBF */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x8C, 0x57, 0x91, 0xA3, /* 0xC0-0xC3 */
+	0x89, 0xE2, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC4-0xC7 */
+	0x3F, 0x3F, 0xED, 0x45, 0x8F, 0x72, 0x3F, 0x3F, /* 0xC8-0xCB */
+	0x3F, 0x3F, 0xED, 0x57, 0x98, 0xD7, 0x3F, 0x3F, /* 0xCC-0xCF */
+	0x98, 0xDC, 0x98, 0xDA, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */
+	0x98, 0xD5, 0x3F, 0x3F, 0x3F, 0x3F, 0x91, 0xAD, /* 0xD4-0xD7 */
+	0x98, 0xD8, 0x3F, 0x3F, 0x98, 0xDB, 0x98, 0xD9, /* 0xD8-0xDB */
+	0x3F, 0x3F, 0x95, 0xDB, 0x3F, 0x3F, 0x98, 0xD6, /* 0xDC-0xDF */
 	0x3F, 0x3F, 0x90, 0x4D, 0x3F, 0x3F, 0x96, 0x93, /* 0xE0-0xE3 */
-	0x98, 0x00, 0x98, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */
+	0x98, 0xDD, 0x98, 0xDE, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x8F, 0x43, 0x98, 0x00, /* 0xEC-0xEF */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x8F, 0x43, 0x98, 0xEB, /* 0xEC-0xEF */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x94, 0x6F, /* 0xF0-0xF3 */
-	0x3F, 0x3F, 0x95, 0x55, 0x98, 0x00, 0x3F, 0x3F, /* 0xF4-0xF7 */
-	0x95, 0x00, 0x3F, 0x3F, 0x89, 0x00, 0x3F, 0x3F, /* 0xF8-0xFB */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x98, 0x00, 0x00, 0x76, /* 0xFC-0xFF */
+	0x3F, 0x3F, 0x95, 0x55, 0x98, 0xE6, 0x3F, 0x3F, /* 0xF4-0xF7 */
+	0x95, 0xEE, 0x3F, 0x3F, 0x89, 0xB4, 0x3F, 0x3F, /* 0xF8-0xFB */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x98, 0xEA, 0xED, 0x5A, /* 0xFC-0xFF */
 };
 
 static unsigned char u2c_50[512] = {
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */
-	0x3F, 0x3F, 0x98, 0x00, 0x98, 0x00, 0x3F, 0x3F, /* 0x04-0x07 */
-	0x3F, 0x3F, 0x91, 0x71, 0x3F, 0x3F, 0x8C, 0x00, /* 0x08-0x0B */
-	0x3F, 0x3F, 0x94, 0x7B, 0x3F, 0x3F, 0x00, 0x00, /* 0x0C-0x0F */
-	0x3F, 0x3F, 0x98, 0x00, 0x93, 0x7C, 0x3F, 0x3F, /* 0x10-0x13 */
-	0x98, 0x00, 0x3F, 0x3F, 0x8C, 0x00, 0x3F, 0x3F, /* 0x14-0x17 */
-	0x3F, 0x3F, 0x8C, 0x00, 0x98, 0x00, 0x3F, 0x3F, /* 0x18-0x1B */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x77, 0x8E, 0x00, /* 0x1C-0x1F */
-	0x3F, 0x3F, 0x98, 0x00, 0x00, 0x75, 0x95, 0x00, /* 0x20-0x23 */
-	0x92, 0x6C, 0x98, 0x00, 0x8C, 0x91, 0x3F, 0x3F, /* 0x24-0x27 */
-	0x98, 0x00, 0x98, 0x00, 0x98, 0x00, 0x97, 0x00, /* 0x28-0x2B */
-	0x98, 0x00, 0x98, 0x60, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */
+	0x3F, 0x3F, 0x98, 0xE4, 0x98, 0xED, 0x3F, 0x3F, /* 0x04-0x07 */
+	0x3F, 0x3F, 0x91, 0x71, 0x3F, 0x3F, 0x8C, 0xC2, /* 0x08-0x0B */
+	0x3F, 0x3F, 0x94, 0x7B, 0x3F, 0x3F, 0xE0, 0xC5, /* 0x0C-0x0F */
+	0x3F, 0x3F, 0x98, 0xEC, 0x93, 0x7C, 0x3F, 0x3F, /* 0x10-0x13 */
+	0x98, 0xE1, 0x3F, 0x3F, 0x8C, 0xF4, 0x3F, 0x3F, /* 0x14-0x17 */
+	0x3F, 0x3F, 0x8C, 0xF3, 0x98, 0xDF, 0x3F, 0x3F, /* 0x18-0x1B */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xED, 0x5B, 0x8E, 0xD8, /* 0x1C-0x1F */
+	0x3F, 0x3F, 0x98, 0xE7, 0xED, 0x59, 0x95, 0xED, /* 0x20-0x23 */
+	0x92, 0x6C, 0x98, 0xE3, 0x8C, 0x91, 0x3F, 0x3F, /* 0x24-0x27 */
+	0x98, 0xE0, 0x98, 0xE8, 0x98, 0xE2, 0x97, 0xCF, /* 0x28-0x2B */
+	0x98, 0xE9, 0x98, 0x60, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x8B, 0x00, 0x3F, 0x3F, /* 0x34-0x37 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x8B, 0xE4, 0x3F, 0x3F, /* 0x34-0x37 */
 	0x3F, 0x3F, 0x8C, 0x90, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x38-0x3B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */
-	0x00, 0x74, 0x3F, 0x3F, 0x00, 0x7A, 0x98, 0x00, /* 0x40-0x43 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x78, 0x98, 0x00, /* 0x44-0x47 */
-	0x98, 0x00, 0x88, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x95, 0x00, /* 0x4C-0x4F */
-	0x98, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */
-	0x3F, 0x3F, 0x98, 0x00, 0x98, 0x00, 0x3F, 0x3F, /* 0x54-0x57 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x98, 0x00, 0x3F, 0x3F, /* 0x58-0x5B */
-	0x92, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x5C-0x5F */
+	0xED, 0x58, 0x3F, 0x3F, 0xED, 0x5E, 0x98, 0xEE, /* 0x40-0x43 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xED, 0x5C, 0x98, 0xEF, /* 0x44-0x47 */
+	0x98, 0xF3, 0x88, 0xCC, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x95, 0xCE, /* 0x4C-0x4F */
+	0x98, 0xF2, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */
+	0x3F, 0x3F, 0x98, 0xF1, 0x98, 0xF5, 0x3F, 0x3F, /* 0x54-0x57 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x98, 0xF4, 0x3F, 0x3F, /* 0x58-0x5B */
+	0x92, 0xE2, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x5C-0x5F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x60-0x63 */
 	0x3F, 0x3F, 0x8C, 0x92, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x68-0x6B */
-	0x98, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */
-	0x00, 0x79, 0x3F, 0x3F, 0x8E, 0x00, 0x3F, 0x3F, /* 0x70-0x73 */
-	0x91, 0x00, 0x92, 0x00, 0x8B, 0x00, 0x3F, 0x3F, /* 0x74-0x77 */
-	0x98, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */
+	0x98, 0xF6, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */
+	0xED, 0x5D, 0x3F, 0x3F, 0x8E, 0xC3, 0x3F, 0x3F, /* 0x70-0x73 */
+	0x91, 0xA4, 0x92, 0xE3, 0x8B, 0xF4, 0x3F, 0x3F, /* 0x74-0x77 */
+	0x98, 0xF7, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */
 	0x3F, 0x3F, 0x8B, 0x55, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */
 	
-	0x98, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */
-	0x3F, 0x3F, 0x98, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */
+	0x98, 0xF8, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */
+	0x3F, 0x3F, 0x98, 0xFA, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x88-0x8B */
 	0x3F, 0x3F, 0x96, 0x54, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */
 	0x3F, 0x3F, 0x8C, 0x86, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */
-	0x00, 0x7B, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */
-	0x8E, 0x50, 0x94, 0x00, 0x98, 0x00, 0x3F, 0x3F, /* 0x98-0x9B */
+	0xED, 0x5F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */
+	0x8E, 0x50, 0x94, 0xF5, 0x98, 0xF9, 0x3F, 0x3F, /* 0x98-0x9B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */
-	0x8D, 0x00, 0x97, 0x62, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x98, 0x00, 0x99, 0x42, /* 0xB0-0xB3 */
-	0x98, 0x00, 0x8D, 0x00, 0x3F, 0x3F, 0x8F, 0x9D, /* 0xB4-0xB7 */
+	0x8D, 0xC3, 0x97, 0x62, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x98, 0xFC, 0x99, 0x42, /* 0xB0-0xB3 */
+	0x98, 0xFB, 0x8D, 0xC2, 0x3F, 0x3F, 0x8F, 0x9D, /* 0xB4-0xB7 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x8C, 0x58, 0x3F, 0x3F, /* 0xBC-0xBF */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x99, 0x43, 0x3F, 0x3F, /* 0xC0-0xC3 */
-	0x3F, 0x3F, 0x8B, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC4-0xC7 */
+	0x3F, 0x3F, 0x8B, 0xCD, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC4-0xC7 */
 	0x3F, 0x3F, 0x99, 0x40, 0x99, 0x41, 0x3F, 0x3F, /* 0xC8-0xCB */
-	0x3F, 0x3F, 0x93, 0x00, 0x3F, 0x3F, 0x91, 0x9C, /* 0xCC-0xCF */
-	0x3F, 0x3F, 0x8B, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */
+	0x3F, 0x3F, 0x93, 0xAD, 0x3F, 0x3F, 0x91, 0x9C, /* 0xCC-0xCF */
+	0x3F, 0x3F, 0x8B, 0xA1, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */
 	0x3F, 0x3F, 0x96, 0x6C, 0x99, 0x44, 0x3F, 0x3F, /* 0xD4-0xD7 */
-	0x00, 0x7D, 0x3F, 0x3F, 0x97, 0x00, 0x3F, 0x3F, /* 0xD8-0xDB */
+	0xED, 0x61, 0x3F, 0x3F, 0x97, 0xBB, 0x3F, 0x3F, /* 0xD8-0xDB */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x99, 0x45, 0x3F, 0x3F, /* 0xDC-0xDF */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x99, 0x48, /* 0xE0-0xE3 */
 	0x3F, 0x3F, 0x99, 0x46, 0x3F, 0x3F, 0x91, 0x6D, /* 0xE4-0xE7 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */
 	0x3F, 0x3F, 0x99, 0x47, 0x99, 0x49, 0x3F, 0x3F, /* 0xEC-0xEF */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */
-	0x00, 0x7C, 0x99, 0x4B, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */
-	0x3F, 0x3F, 0x99, 0x4A, 0x3F, 0x3F, 0x95, 0x00, /* 0xF8-0xFB */
+	0xED, 0x60, 0x99, 0x4B, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */
+	0x3F, 0x3F, 0x99, 0x4A, 0x3F, 0x3F, 0x95, 0xC6, /* 0xF8-0xFB */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */
 };
 
 static unsigned char u2c_51[512] = {
 	0x8B, 0x56, 0x99, 0x4D, 0x99, 0x4E, 0x3F, 0x3F, /* 0x00-0x03 */
-	0x89, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x04-0x07 */
+	0x89, 0xAD, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x04-0x07 */
 	0x3F, 0x3F, 0x99, 0x4C, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x08-0x0B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x8E, 0x00, 0x3F, 0x3F, /* 0x10-0x13 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x8E, 0xF2, 0x3F, 0x3F, /* 0x10-0x13 */
 	0x99, 0x51, 0x99, 0x50, 0x99, 0x4F, 0x3F, 0x3F, /* 0x14-0x17 */
-	0x98, 0x00, 0x3F, 0x3F, 0x99, 0x52, 0x3F, 0x3F, /* 0x18-0x1B */
+	0x98, 0xD4, 0x3F, 0x3F, 0x99, 0x52, 0x3F, 0x3F, /* 0x18-0x1B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x8F, 0x9E, /* 0x1C-0x1F */
 	0x3F, 0x3F, 0x99, 0x53, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x97, 0x44, 0x3F, 0x3F, /* 0x28-0x2B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x96, 0x00, 0x3F, 0x3F, /* 0x30-0x33 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x96, 0xD7, 0x3F, 0x3F, /* 0x30-0x33 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x99, 0x55, /* 0x34-0x37 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x99, 0x54, 0x99, 0x57, /* 0x38-0x3B */
 	0x99, 0x56, 0x3F, 0x3F, 0x3F, 0x3F, 0x99, 0x58, /* 0x3C-0x3F */
-	0x99, 0x59, 0x88, 0x00, 0x3F, 0x3F, 0x8C, 0x00, /* 0x40-0x43 */
-	0x8C, 0x5A, 0x8F, 0x5B, 0x92, 0x9B, 0x8B, 0x00, /* 0x44-0x47 */
-	0x90, 0x00, 0x8C, 0x00, 0x00, 0x7E, 0x8D, 0x8E, /* 0x48-0x4B */
-	0x99, 0x5B, 0x96, 0x00, 0x93, 0x65, 0x3F, 0x3F, /* 0x4C-0x4F */
+	0x99, 0x59, 0x88, 0xF2, 0x3F, 0x3F, 0x8C, 0xB3, /* 0x40-0x43 */
+	0x8C, 0x5A, 0x8F, 0x5B, 0x92, 0x9B, 0x8B, 0xA2, /* 0x44-0x47 */
+	0x90, 0xE6, 0x8C, 0xF5, 0xED, 0x62, 0x8D, 0x8E, /* 0x48-0x4B */
+	0x99, 0x5B, 0x96, 0xC6, 0x93, 0x65, 0x3F, 0x3F, /* 0x4C-0x4F */
 	0x8E, 0x99, 0x3F, 0x3F, 0x99, 0x5A, 0x3F, 0x3F, /* 0x50-0x53 */
 	0x99, 0x5C, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x93, 0x7D, 0x3F, 0x3F, /* 0x58-0x5B */
 	0x8A, 0x95, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x5C-0x5F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x99, 0x5D, 0x3F, 0x3F, /* 0x60-0x63 */
-	0x00, 0x80, 0x93, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */
-	0x91, 0x53, 0x99, 0x5F, 0x99, 0x60, 0x94, 0x00, /* 0x68-0x6B */
-	0x8C, 0x00, 0x98, 0x5A, 0x99, 0x61, 0x3F, 0x3F, /* 0x6C-0x6F */
-	0x3F, 0x3F, 0x8B, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */
-	0x3F, 0x3F, 0x95, 0x00, 0x91, 0x00, 0x8B, 0x00, /* 0x74-0x77 */
+	0xED, 0x63, 0x93, 0xFC, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */
+	0x91, 0x53, 0x99, 0x5F, 0x99, 0x60, 0x94, 0xAA, /* 0x68-0x6B */
+	0x8C, 0xF6, 0x98, 0x5A, 0x99, 0x61, 0x3F, 0x3F, /* 0x6C-0x6F */
+	0x3F, 0x3F, 0x8B, 0xA4, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */
+	0x3F, 0x3F, 0x95, 0xBA, 0x91, 0xB4, 0x8B, 0xEF, /* 0x74-0x77 */
 	0x93, 0x54, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */
 	0x8C, 0x93, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */
 	
 	0x99, 0x62, 0x3F, 0x3F, 0x99, 0x63, 0x3F, 0x3F, /* 0x80-0x83 */
-	0x3F, 0x3F, 0x93, 0x00, 0x89, 0x7E, 0x3F, 0x3F, /* 0x84-0x87 */
-	0x3F, 0x3F, 0x99, 0x66, 0x8D, 0x00, 0x3F, 0x3F, /* 0x88-0x8B */
-	0x99, 0x65, 0x8D, 0x00, 0x3F, 0x3F, 0x99, 0x67, /* 0x8C-0x8F */
-	0x00, 0x00, 0x99, 0x68, 0x96, 0x60, 0x99, 0x69, /* 0x90-0x93 */
-	0x3F, 0x3F, 0x99, 0x6A, 0x99, 0x6B, 0x8F, 0x00, /* 0x94-0x97 */
-	0x3F, 0x3F, 0x8E, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */
-	0x3F, 0x3F, 0x00, 0x81, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */
-	0x8A, 0x00, 0x3F, 0x3F, 0x99, 0x6E, 0x3F, 0x3F, /* 0xA0-0xA3 */
-	0x99, 0x6C, 0x96, 0x00, 0x99, 0x6D, 0x3F, 0x3F, /* 0xA4-0xA7 */
+	0x3F, 0x3F, 0x93, 0xE0, 0x89, 0x7E, 0x3F, 0x3F, /* 0x84-0x87 */
+	0x3F, 0x3F, 0x99, 0x66, 0x8D, 0xFB, 0x3F, 0x3F, /* 0x88-0x8B */
+	0x99, 0x65, 0x8D, 0xC4, 0x3F, 0x3F, 0x99, 0x67, /* 0x8C-0x8F */
+	0xE3, 0xEC, 0x99, 0x68, 0x96, 0x60, 0x99, 0x69, /* 0x90-0x93 */
+	0x3F, 0x3F, 0x99, 0x6A, 0x99, 0x6B, 0x8F, 0xE7, /* 0x94-0x97 */
+	0x3F, 0x3F, 0x8E, 0xCA, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */
+	0x3F, 0x3F, 0xED, 0x64, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */
+	0x8A, 0xA5, 0x3F, 0x3F, 0x99, 0x6E, 0x3F, 0x3F, /* 0xA0-0xA3 */
+	0x99, 0x6C, 0x96, 0xBB, 0x99, 0x6D, 0x3F, 0x3F, /* 0xA4-0xA7 */
 	0x95, 0x79, 0x99, 0x6F, 0x99, 0x70, 0x99, 0x71, /* 0xA8-0xAB */
 	0x93, 0x7E, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */
 	0x99, 0x75, 0x99, 0x73, 0x99, 0x74, 0x99, 0x72, /* 0xB0-0xB3 */
-	0x8D, 0x00, 0x99, 0x76, 0x96, 0x00, 0x97, 0x00, /* 0xB4-0xB7 */
+	0x8D, 0xE1, 0x99, 0x76, 0x96, 0xE8, 0x97, 0xE2, /* 0xB4-0xB7 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */
-	0x3F, 0x3F, 0x99, 0x77, 0x00, 0x82, 0x3F, 0x3F, /* 0xBC-0xBF */
+	0x3F, 0x3F, 0x99, 0x77, 0xED, 0x65, 0x3F, 0x3F, /* 0xBC-0xBF */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */
-	0x90, 0x00, 0x99, 0x78, 0x8F, 0x79, 0x3F, 0x3F, /* 0xC4-0xC7 */
+	0x90, 0xA6, 0x99, 0x78, 0x8F, 0x79, 0x3F, 0x3F, /* 0xC4-0xC7 */
 	0x3F, 0x3F, 0x99, 0x79, 0x3F, 0x3F, 0x92, 0x9C, /* 0xC8-0xCB */
-	0x97, 0x00, 0x93, 0x80, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */
+	0x97, 0xBD, 0x93, 0x80, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x99, 0x00, 0x3F, 0x3F, /* 0xD4-0xD7 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x99, 0xC3, 0x3F, 0x3F, /* 0xD4-0xD7 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x99, 0x7A, /* 0xD8-0xDB */
-	0x00, 0x00, 0x8B, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xDC-0xDF */
+	0xEA, 0xA3, 0x8B, 0xC3, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xDC-0xDF */
 	0x99, 0x7B, 0x96, 0x7D, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x8F, 0x88, 0x91, 0x00, /* 0xE4-0xE7 */
-	0x3F, 0x3F, 0x99, 0x7D, 0x93, 0x00, 0x3F, 0x3F, /* 0xE8-0xEB */
-	0x00, 0x83, 0x99, 0x7E, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x8F, 0x88, 0x91, 0xFA, /* 0xE4-0xE7 */
+	0x3F, 0x3F, 0x99, 0x7D, 0x93, 0xE2, 0x3F, 0x3F, /* 0xE8-0xEB */
+	0xED, 0x66, 0x99, 0x7E, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */
 	0x99, 0x80, 0x8A, 0x4D, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */
-	0x3F, 0x3F, 0x99, 0x81, 0x8B, 0x00, 0x3F, 0x3F, /* 0xF4-0xF7 */
-	0x93, 0x00, 0x89, 0x9A, 0x8F, 0x6F, 0x3F, 0x3F, /* 0xF8-0xFB */
+	0x3F, 0x3F, 0x99, 0x81, 0x8B, 0xA5, 0x3F, 0x3F, /* 0xF4-0xF7 */
+	0x93, 0xCA, 0x89, 0x9A, 0x8F, 0x6F, 0x3F, 0x3F, /* 0xF8-0xFB */
 	0x3F, 0x3F, 0x94, 0x9F, 0x99, 0x82, 0x3F, 0x3F, /* 0xFC-0xFF */
 };
 
 static unsigned char u2c_52[512] = {
 	0x93, 0x81, 0x3F, 0x3F, 0x3F, 0x3F, 0x90, 0x6E, /* 0x00-0x03 */
-	0x99, 0x83, 0x3F, 0x3F, 0x95, 0x00, 0x90, 0x00, /* 0x04-0x07 */
-	0x8A, 0x00, 0x3F, 0x3F, 0x8A, 0x00, 0x99, 0x84, /* 0x08-0x0B */
+	0x99, 0x83, 0x3F, 0x3F, 0x95, 0xAA, 0x90, 0xD8, /* 0x04-0x07 */
+	0x8A, 0xA0, 0x3F, 0x3F, 0x8A, 0xA7, 0x99, 0x84, /* 0x08-0x0B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x99, 0x86, 0x3F, 0x3F, /* 0x0C-0x0F */
 	0x3F, 0x3F, 0x8C, 0x59, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */
-	0x99, 0x85, 0x00, 0x84, 0x3F, 0x3F, 0x97, 0x00, /* 0x14-0x17 */
+	0x99, 0x85, 0xED, 0x67, 0x3F, 0x3F, 0x97, 0xF1, /* 0x14-0x17 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x18-0x1B */
 	0x3F, 0x3F, 0x8F, 0x89, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */
-	0x94, 0x00, 0x95, 0x00, 0x3F, 0x3F, 0x99, 0x87, /* 0x24-0x27 */
+	0x94, 0xBB, 0x95, 0xCA, 0x3F, 0x3F, 0x99, 0x87, /* 0x24-0x27 */
 	0x3F, 0x3F, 0x97, 0x98, 0x99, 0x88, 0x3F, 0x3F, /* 0x28-0x2B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x99, 0x89, 0x3F, 0x3F, /* 0x2C-0x2F */
 	0x93, 0x9E, 0x3F, 0x3F, 0x3F, 0x3F, 0x99, 0x8A, /* 0x30-0x33 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x90, 0x00, 0x8D, 0x00, /* 0x34-0x37 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x90, 0xA7, 0x8D, 0xFC, /* 0x34-0x37 */
 	0x8C, 0x94, 0x99, 0x8B, 0x8E, 0x68, 0x8D, 0x8F, /* 0x38-0x3B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x92, 0x00, /* 0x40-0x43 */
-	0x99, 0x8D, 0x3F, 0x3F, 0x3F, 0x3F, 0x91, 0x00, /* 0x44-0x47 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x8D, 0x00, 0x99, 0x8E, /* 0x48-0x4B */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x92, 0xE4, /* 0x40-0x43 */
+	0x99, 0x8D, 0x3F, 0x3F, 0x3F, 0x3F, 0x91, 0xA5, /* 0x44-0x47 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x8D, 0xED, 0x99, 0x8E, /* 0x48-0x4B */
 	0x99, 0x8F, 0x91, 0x4F, 0x3F, 0x3F, 0x99, 0x8C, /* 0x4C-0x4F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */
 	0x99, 0x91, 0x3F, 0x3F, 0x96, 0x55, 0x3F, 0x3F, /* 0x54-0x57 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x8D, 0x84, /* 0x58-0x5B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x99, 0x90, 0x3F, 0x3F, /* 0x5C-0x5F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x8C, 0x95, /* 0x60-0x63 */
-	0x8D, 0x00, 0x94, 0x8D, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */
+	0x8D, 0xDC, 0x94, 0x8D, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */
 	0x3F, 0x3F, 0x99, 0x94, 0x99, 0x92, 0x3F, 0x3F, /* 0x68-0x6B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x95, 0x9B, /* 0x6C-0x6F */
-	0x8F, 0x00, 0x99, 0x9B, 0x8A, 0x84, 0x99, 0x95, /* 0x70-0x73 */
+	0x8F, 0xE8, 0x99, 0x9B, 0x8A, 0x84, 0x99, 0x95, /* 0x70-0x73 */
 	0x99, 0x93, 0x91, 0x6E, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x74-0x77 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */
 	0x3F, 0x3F, 0x99, 0x97, 0x3F, 0x3F, 0x99, 0x96, /* 0x7C-0x7F */
 	
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x8A, 0x63, /* 0x80-0x83 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x8C, 0x80, /* 0x84-0x87 */
-	0x99, 0x9C, 0x97, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x88-0x8B */
+	0x99, 0x9C, 0x97, 0xAB, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x88-0x8B */
 	0x3F, 0x3F, 0x99, 0x98, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */
 	0x3F, 0x3F, 0x99, 0x9D, 0x99, 0x9A, 0x3F, 0x3F, /* 0x90-0x93 */
 	0x99, 0x99, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x97, 0x00, /* 0x98-0x9B */
-	0x00, 0x85, 0x3F, 0x3F, 0x3F, 0x3F, 0x8C, 0x00, /* 0x9C-0x9F */
-	0x89, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x97, 0x00, /* 0xA0-0xA3 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x86, 0x3F, 0x3F, /* 0xA4-0xA7 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x97, 0xCD, /* 0x98-0x9B */
+	0xED, 0x68, 0x3F, 0x3F, 0x3F, 0x3F, 0x8C, 0xF7, /* 0x9C-0x9F */
+	0x89, 0xC1, 0x3F, 0x3F, 0x3F, 0x3F, 0x97, 0xF2, /* 0xA0-0xA3 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xED, 0x69, 0x3F, 0x3F, /* 0xA4-0xA7 */
 	0x3F, 0x3F, 0x8F, 0x95, 0x93, 0x77, 0x8D, 0x85, /* 0xA8-0xAB */
-	0x99, 0x00, 0x99, 0x00, 0x3F, 0x3F, 0x00, 0x77, /* 0xAC-0xAF */
-	0x3F, 0x3F, 0x97, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB0-0xB3 */
-	0x98, 0x4A, 0x99, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */
-	0x3F, 0x3F, 0x8C, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */
-	0x99, 0x00, 0x3F, 0x3F, 0x8A, 0x4E, 0x3F, 0x3F, /* 0xBC-0xBF */
-	0x00, 0x87, 0x99, 0x00, 0x3F, 0x3F, 0x96, 0x75, /* 0xC0-0xC3 */
-	0x3F, 0x3F, 0x92, 0x00, 0x3F, 0x3F, 0x97, 0x45, /* 0xC4-0xC7 */
-	0x3F, 0x3F, 0x95, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC8-0xCB */
-	0x3F, 0x3F, 0x99, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0xD0-0xD3 */
-	0x3F, 0x3F, 0x93, 0x00, 0x3F, 0x3F, 0x99, 0x00, /* 0xD4-0xD7 */
-	0x8A, 0x00, 0x96, 0x00, 0x3F, 0x3F, 0x00, 0x88, /* 0xD8-0xDB */
-	0x3F, 0x3F, 0x8F, 0x9F, 0x99, 0x00, 0x95, 0x00, /* 0xDC-0xDF */
-	0x99, 0x00, 0x3F, 0x3F, 0x90, 0x00, 0x99, 0x00, /* 0xE0-0xE3 */
-	0x8B, 0x00, 0x3F, 0x3F, 0x99, 0x00, 0x8A, 0x00, /* 0xE4-0xE7 */
+	0x99, 0xA0, 0x99, 0xA1, 0x3F, 0x3F, 0xEE, 0x5B, /* 0xAC-0xAF */
+	0x3F, 0x3F, 0x97, 0xE3, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB0-0xB3 */
+	0x98, 0x4A, 0x99, 0xA3, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */
+	0x3F, 0x3F, 0x8C, 0xF8, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */
+	0x99, 0xA2, 0x3F, 0x3F, 0x8A, 0x4E, 0x3F, 0x3F, /* 0xBC-0xBF */
+	0xED, 0x6A, 0x99, 0xA4, 0x3F, 0x3F, 0x96, 0x75, /* 0xC0-0xC3 */
+	0x3F, 0x3F, 0x92, 0xBA, 0x3F, 0x3F, 0x97, 0x45, /* 0xC4-0xC7 */
+	0x3F, 0x3F, 0x95, 0xD7, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC8-0xCB */
+	0x3F, 0x3F, 0x99, 0xA5, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE8, 0xD3, 0x3F, 0x3F, /* 0xD0-0xD3 */
+	0x3F, 0x3F, 0x93, 0xAE, 0x3F, 0x3F, 0x99, 0xA6, /* 0xD4-0xD7 */
+	0x8A, 0xA8, 0x96, 0xB1, 0x3F, 0x3F, 0xED, 0x6B, /* 0xD8-0xDB */
+	0x3F, 0x3F, 0x8F, 0x9F, 0x99, 0xA7, 0x95, 0xE5, /* 0xDC-0xDF */
+	0x99, 0xAB, 0x3F, 0x3F, 0x90, 0xA8, 0x99, 0xA8, /* 0xE0-0xE3 */
+	0x8B, 0xCE, 0x3F, 0x3F, 0x99, 0xA9, 0x8A, 0xA9, /* 0xE4-0xE7 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x8C, 0x4D, 0x99, 0x00, /* 0xF0-0xF3 */
-	0x3F, 0x3F, 0x99, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */
-	0x99, 0x00, 0x99, 0x00, 0x8E, 0x00, 0x3F, 0x3F, /* 0xF8-0xFB */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x8C, 0x00, 0x96, 0x00, /* 0xFC-0xFF */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x8C, 0x4D, 0x99, 0xAC, /* 0xF0-0xF3 */
+	0x3F, 0x3F, 0x99, 0xAD, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */
+	0x99, 0xAE, 0x99, 0xAF, 0x8E, 0xD9, 0x3F, 0x3F, /* 0xF8-0xFB */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x8C, 0xF9, 0x96, 0xDC, /* 0xFC-0xFF */
 };
 
 static unsigned char u2c_53[512] = {
-	0x00, 0x89, 0x96, 0x00, 0x93, 0x00, 0x3F, 0x3F, /* 0x00-0x03 */
-	0x3F, 0x3F, 0x95, 0x00, 0x99, 0x00, 0x00, 0x8A, /* 0x04-0x07 */
-	0x99, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x08-0x0B */
-	0x3F, 0x3F, 0x99, 0x00, 0x3F, 0x3F, 0x99, 0x00, /* 0x0C-0x0F */
-	0x99, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */
-	0x3F, 0x3F, 0x99, 0x00, 0x89, 0x00, 0x96, 0x6B, /* 0x14-0x17 */
-	0x3F, 0x3F, 0x8D, 0x00, 0x99, 0x00, 0x3F, 0x3F, /* 0x18-0x1B */
+	0xED, 0x6C, 0x96, 0xE6, 0x93, 0xF5, 0x3F, 0x3F, /* 0x00-0x03 */
+	0x3F, 0x3F, 0x95, 0xEF, 0x99, 0xB0, 0xED, 0x6D, /* 0x04-0x07 */
+	0x99, 0xB1, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x08-0x0B */
+	0x3F, 0x3F, 0x99, 0xB3, 0x3F, 0x3F, 0x99, 0xB5, /* 0x0C-0x0F */
+	0x99, 0xB4, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */
+	0x3F, 0x3F, 0x99, 0xB6, 0x89, 0xBB, 0x96, 0x6B, /* 0x14-0x17 */
+	0x3F, 0x3F, 0x8D, 0xFA, 0x99, 0xB7, 0x3F, 0x3F, /* 0x18-0x1B */
 	0x3F, 0x3F, 0x91, 0x78, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */
-	0x8F, 0x00, 0x8B, 0x00, 0x3F, 0x3F, 0x99, 0x00, /* 0x20-0x23 */
-	0x00, 0x8B, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x94, 0x00, 0x3F, 0x3F, /* 0x28-0x2B */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x99, 0x00, /* 0x2C-0x2F */
-	0x3F, 0x3F, 0x99, 0x00, 0x3F, 0x3F, 0x99, 0x00, /* 0x30-0x33 */
+	0x8F, 0xA0, 0x8B, 0xA7, 0x3F, 0x3F, 0x99, 0xB8, /* 0x20-0x23 */
+	0xED, 0x6E, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x94, 0xD9, 0x3F, 0x3F, /* 0x28-0x2B */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x99, 0xB9, /* 0x2C-0x2F */
+	0x3F, 0x3F, 0x99, 0xBA, 0x3F, 0x3F, 0x99, 0xBB, /* 0x30-0x33 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */
-	0x99, 0x00, 0x95, 0x43, 0x8B, 0x00, 0x88, 0x00, /* 0x38-0x3B */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x93, 0x00, /* 0x3C-0x3F */
-	0x99, 0x00, 0x8F, 0x5C, 0x3F, 0x3F, 0x90, 0x00, /* 0x40-0x43 */
-	0x3F, 0x3F, 0x99, 0x00, 0x99, 0x00, 0x8F, 0x00, /* 0x44-0x47 */
-	0x8C, 0x00, 0x99, 0x00, 0x94, 0x00, 0x3F, 0x3F, /* 0x48-0x4B */
-	0x3F, 0x3F, 0x99, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x4C-0x4F */
-	0x3F, 0x3F, 0x94, 0x00, 0x91, 0x00, 0x91, 0x00, /* 0x50-0x53 */
-	0x8B, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x93, 0x00, /* 0x54-0x57 */
+	0x99, 0xBC, 0x95, 0x43, 0x8B, 0xE6, 0x88, 0xE3, /* 0x38-0x3B */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x93, 0xBD, /* 0x3C-0x3F */
+	0x99, 0xBD, 0x8F, 0x5C, 0x3F, 0x3F, 0x90, 0xE7, /* 0x40-0x43 */
+	0x3F, 0x3F, 0x99, 0xBF, 0x99, 0xBE, 0x8F, 0xA1, /* 0x44-0x47 */
+	0x8C, 0xDF, 0x99, 0xC1, 0x94, 0xBC, 0x3F, 0x3F, /* 0x48-0x4B */
+	0x3F, 0x3F, 0x99, 0xC2, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x4C-0x4F */
+	0x3F, 0x3F, 0x94, 0xDA, 0x91, 0xB2, 0x91, 0xEC, /* 0x50-0x53 */
+	0x8B, 0xA6, 0x3F, 0x3F, 0x3F, 0x3F, 0x93, 0xEC, /* 0x54-0x57 */
 	0x92, 0x50, 0x3F, 0x3F, 0x94, 0x8E, 0x3F, 0x3F, /* 0x58-0x5B */
-	0x96, 0x6D, 0x3F, 0x3F, 0x99, 0x00, 0x3F, 0x3F, /* 0x5C-0x5F */
-	0x90, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x60-0x63 */
+	0x96, 0x6D, 0x3F, 0x3F, 0x99, 0xC4, 0x3F, 0x3F, /* 0x5C-0x5F */
+	0x90, 0xE8, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x60-0x63 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x8C, 0x54, 0x3F, 0x3F, /* 0x64-0x67 */
-	0x3F, 0x3F, 0x99, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x68-0x6B */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x99, 0x00, 0x89, 0x4B, /* 0x6C-0x6F */
-	0x88, 0x00, 0x8A, 0x00, 0x00, 0x8C, 0x91, 0x00, /* 0x70-0x73 */
-	0x8B, 0x70, 0x97, 0x91, 0x3F, 0x3F, 0x99, 0x00, /* 0x74-0x77 */
-	0x89, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x99, 0x00, /* 0x78-0x7B */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x8B, 0x00, /* 0x7C-0x7F */
+	0x3F, 0x3F, 0x99, 0xC5, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x68-0x6B */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x99, 0xC6, 0x89, 0x4B, /* 0x6C-0x6F */
+	0x88, 0xF3, 0x8A, 0xEB, 0xED, 0x6F, 0x91, 0xA6, /* 0x70-0x73 */
+	0x8B, 0x70, 0x97, 0x91, 0x3F, 0x3F, 0x99, 0xC9, /* 0x74-0x77 */
+	0x89, 0xB5, 0x3F, 0x3F, 0x3F, 0x3F, 0x99, 0xC8, /* 0x78-0x7B */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x8B, 0xA8, /* 0x7C-0x7F */
 	
-	0x3F, 0x3F, 0x3F, 0x3F, 0x99, 0x00, 0x3F, 0x3F, /* 0x80-0x83 */
-	0x96, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x99, 0xCA, 0x3F, 0x3F, /* 0x80-0x83 */
+	0x96, 0xEF, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x88-0x8B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x8D, /* 0x90-0x93 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x99, 0x00, 0x3F, 0x3F, /* 0x94-0x97 */
-	0x97, 0x00, 0x3F, 0x3F, 0x8C, 0x00, 0x3F, 0x3F, /* 0x98-0x9B */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x8C, 0x00, /* 0x9C-0x9F */
-	0x99, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */
-	0x3F, 0x3F, 0x99, 0x00, 0x99, 0x00, 0x3F, 0x3F, /* 0xA4-0xA7 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xED, 0x70, /* 0x90-0x93 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x99, 0xCB, 0x3F, 0x3F, /* 0x94-0x97 */
+	0x97, 0xD0, 0x3F, 0x3F, 0x8C, 0xFA, 0x3F, 0x3F, /* 0x98-0x9B */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x8C, 0xB4, /* 0x9C-0x9F */
+	0x99, 0xCC, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */
+	0x3F, 0x3F, 0x99, 0xCE, 0x99, 0xCD, 0x3F, 0x3F, /* 0xA4-0xA7 */
 	0x90, 0x7E, 0x89, 0x58, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */
-	0x3F, 0x3F, 0x89, 0x7D, 0x99, 0x00, 0x3F, 0x3F, /* 0xAC-0xAF */
-	0x99, 0x00, 0x3F, 0x3F, 0x00, 0x8E, 0x8C, 0x00, /* 0xB0-0xB3 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x99, 0x00, 0x3F, 0x3F, /* 0xB4-0xB7 */
+	0x3F, 0x3F, 0x89, 0x7D, 0x99, 0xCF, 0x3F, 0x3F, /* 0xAC-0xAF */
+	0x99, 0xD0, 0x3F, 0x3F, 0xED, 0x71, 0x8C, 0xB5, /* 0xB0-0xB3 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x99, 0xD1, 0x3F, 0x3F, /* 0xB4-0xB7 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x8B, 0x8E, /* 0xB8-0xBB */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x8E, 0x51, 0x99, 0x00, /* 0xC0-0xC3 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x8E, 0x51, 0x99, 0xD2, /* 0xC0-0xC3 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC4-0xC7 */
-	0x96, 0x94, 0x8D, 0x00, 0x8B, 0x79, 0x97, 0x46, /* 0xC8-0xCB */
-	0x91, 0x6F, 0x94, 0x00, 0x8E, 0x00, 0x3F, 0x3F, /* 0xCC-0xCF */
+	0x96, 0x94, 0x8D, 0xB3, 0x8B, 0x79, 0x97, 0x46, /* 0xC8-0xCB */
+	0x91, 0x6F, 0x94, 0xBD, 0x8E, 0xFB, 0x3F, 0x3F, /* 0xCC-0xCF */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */
-	0x8F, 0x66, 0x3F, 0x3F, 0x8E, 0x00, 0x8E, 0x00, /* 0xD4-0xD7 */
-	0x3F, 0x3F, 0x8F, 0x96, 0x3F, 0x3F, 0x94, 0x00, /* 0xD8-0xDB */
-	0x3F, 0x3F, 0x00, 0x8F, 0x3F, 0x3F, 0x99, 0x00, /* 0xDC-0xDF */
-	0x3F, 0x3F, 0x89, 0x62, 0x91, 0x70, 0x8C, 0x00, /* 0xE0-0xE3 */
-	0x8C, 0x00, 0x8B, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */
-	0x99, 0x00, 0x92, 0x40, 0x91, 0x00, 0x8B, 0x00, /* 0xE8-0xEB */
-	0x8F, 0x00, 0x99, 0x00, 0x99, 0x00, 0x89, 0x00, /* 0xEC-0xEF */
-	0x91, 0x00, 0x8E, 0x00, 0x8E, 0x6A, 0x89, 0x45, /* 0xF0-0xF3 */
+	0x8F, 0x66, 0x3F, 0x3F, 0x8E, 0xE6, 0x8E, 0xF3, /* 0xD4-0xD7 */
+	0x3F, 0x3F, 0x8F, 0x96, 0x3F, 0x3F, 0x94, 0xBE, /* 0xD8-0xDB */
+	0x3F, 0x3F, 0xED, 0x72, 0x3F, 0x3F, 0x99, 0xD5, /* 0xDC-0xDF */
+	0x3F, 0x3F, 0x89, 0x62, 0x91, 0x70, 0x8C, 0xFB, /* 0xE0-0xE3 */
+	0x8C, 0xC3, 0x8B, 0xE5, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */
+	0x99, 0xD9, 0x92, 0x40, 0x91, 0xFC, 0x8B, 0xA9, /* 0xE8-0xEB */
+	0x8F, 0xA2, 0x99, 0xDA, 0x99, 0xD8, 0x89, 0xC2, /* 0xEC-0xEF */
+	0x91, 0xE4, 0x8E, 0xB6, 0x8E, 0x6A, 0x89, 0x45, /* 0xF0-0xF3 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x8A, 0x90, 0x8D, 0x86, /* 0xF4-0xF7 */
-	0x8E, 0x69, 0x3F, 0x3F, 0x99, 0x00, 0x3F, 0x3F, /* 0xF8-0xFB */
+	0x8E, 0x69, 0x3F, 0x3F, 0x99, 0xDB, 0x3F, 0x3F, /* 0xF8-0xFB */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */
 };
 
 static unsigned char u2c_54[512] = {
-	0x3F, 0x3F, 0x99, 0x00, 0x3F, 0x3F, 0x8B, 0x68, /* 0x00-0x03 */
+	0x3F, 0x3F, 0x99, 0xDC, 0x3F, 0x3F, 0x8B, 0x68, /* 0x00-0x03 */
 	0x8A, 0x65, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x04-0x07 */
-	0x8D, 0x87, 0x8B, 0x67, 0x92, 0x00, 0x89, 0x44, /* 0x08-0x0B */
-	0x93, 0x00, 0x96, 0x00, 0x8D, 0x40, 0x97, 0x99, /* 0x0C-0x0F */
-	0x93, 0x66, 0x8C, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */
+	0x8D, 0x87, 0x8B, 0x67, 0x92, 0xDD, 0x89, 0x44, /* 0x08-0x0B */
+	0x93, 0xAF, 0x96, 0xBC, 0x8D, 0x40, 0x97, 0x99, /* 0x0C-0x0F */
+	0x93, 0x66, 0x8C, 0xFC, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x8C, 0x4E, /* 0x18-0x1B */
-	0x3F, 0x3F, 0x99, 0x00, 0x3F, 0x3F, 0x8B, 0x00, /* 0x1C-0x1F */
+	0x3F, 0x3F, 0x99, 0xE5, 0x3F, 0x3F, 0x8B, 0xE1, /* 0x1C-0x1F */
 	0x96, 0x69, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x94, 0x00, 0x3F, 0x3F, /* 0x24-0x27 */
-	0x3F, 0x3F, 0x99, 0x00, 0x3F, 0x3F, 0x8A, 0x00, /* 0x28-0x2B */
-	0x99, 0x00, 0x99, 0x00, 0x99, 0x00, 0x3F, 0x3F, /* 0x2C-0x2F */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x94, 0xDB, 0x3F, 0x3F, /* 0x24-0x27 */
+	0x3F, 0x3F, 0x99, 0xE4, 0x3F, 0x3F, 0x8A, 0xDC, /* 0x28-0x2B */
+	0x99, 0xDF, 0x99, 0xE0, 0x99, 0xE2, 0x3F, 0x3F, /* 0x2C-0x2F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x99, 0x00, 0x3F, 0x3F, /* 0x34-0x37 */
-	0x8B, 0x7A, 0x90, 0x81, 0x3F, 0x3F, 0x95, 0x00, /* 0x38-0x3B */
-	0x99, 0x00, 0x99, 0x00, 0x8C, 0x00, 0x3F, 0x3F, /* 0x3C-0x3F */
-	0x99, 0x00, 0x3F, 0x3F, 0x98, 0x43, 0x3F, 0x3F, /* 0x40-0x43 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x95, 0x00, 0x3F, 0x3F, /* 0x44-0x47 */
-	0x92, 0x00, 0x8C, 0x00, 0x8D, 0x90, 0x3F, 0x3F, /* 0x48-0x4B */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x99, 0x00, 0x3F, 0x3F, /* 0x4C-0x4F */
-	0x3F, 0x3F, 0x93, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x99, 0xE3, 0x3F, 0x3F, /* 0x34-0x37 */
+	0x8B, 0x7A, 0x90, 0x81, 0x3F, 0x3F, 0x95, 0xAB, /* 0x38-0x3B */
+	0x99, 0xE1, 0x99, 0xDD, 0x8C, 0xE1, 0x3F, 0x3F, /* 0x3C-0x3F */
+	0x99, 0xDE, 0x3F, 0x3F, 0x98, 0x43, 0x3F, 0x3F, /* 0x40-0x43 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x95, 0xF0, 0x3F, 0x3F, /* 0x44-0x47 */
+	0x92, 0xE6, 0x8C, 0xE0, 0x8D, 0x90, 0x3F, 0x3F, /* 0x48-0x4B */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x99, 0xE6, 0x3F, 0x3F, /* 0x4C-0x4F */
+	0x3F, 0x3F, 0x93, 0xDB, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x99, 0x00, /* 0x5C-0x5F */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x99, 0xEA, /* 0x5C-0x5F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x60-0x63 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */
-	0x8E, 0x00, 0x3F, 0x3F, 0x8E, 0x00, 0x3F, 0x3F, /* 0x68-0x6B */
+	0x8E, 0xFC, 0x3F, 0x3F, 0x8E, 0xF4, 0x3F, 0x3F, /* 0x68-0x6B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */
-	0x99, 0x00, 0x99, 0x00, 0x3F, 0x3F, 0x96, 0x00, /* 0x70-0x73 */
-	0x3F, 0x3F, 0x99, 0x00, 0x99, 0x00, 0x99, 0x00, /* 0x74-0x77 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x99, 0x00, /* 0x78-0x7B */
-	0x8C, 0x00, 0x96, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */
-	
-	0x99, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */
-	0x99, 0x00, 0x3F, 0x3F, 0x99, 0x00, 0x3F, 0x3F, /* 0x84-0x87 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x92, 0x8D, 0x00, /* 0x88-0x8B */
-	0x98, 0x61, 0x3F, 0x3F, 0x99, 0x00, 0x99, 0x00, /* 0x8C-0x8F */
-	0x99, 0x00, 0x3F, 0x3F, 0x99, 0x00, 0x3F, 0x3F, /* 0x90-0x93 */
+	0x99, 0xED, 0x99, 0xEB, 0x3F, 0x3F, 0x96, 0xA1, /* 0x70-0x73 */
+	0x3F, 0x3F, 0x99, 0xE8, 0x99, 0xF1, 0x99, 0xEC, /* 0x74-0x77 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x99, 0xEF, /* 0x78-0x7B */
+	0x8C, 0xC4, 0x96, 0xBD, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */
+	
+	0x99, 0xF0, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */
+	0x99, 0xF2, 0x3F, 0x3F, 0x99, 0xF4, 0x3F, 0x3F, /* 0x84-0x87 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xED, 0x75, 0x8D, 0xEE, /* 0x88-0x8B */
+	0x98, 0x61, 0x3F, 0x3F, 0x99, 0xE9, 0x99, 0xE7, /* 0x8C-0x8F */
+	0x99, 0xF3, 0x3F, 0x3F, 0x99, 0xEE, 0x3F, 0x3F, /* 0x90-0x93 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */
-	0x00, 0x91, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x99, 0x00, 0x3F, 0x3F, /* 0xA0-0xA3 */
-	0x9A, 0x42, 0x99, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */
-	0x99, 0x00, 0x00, 0x93, 0x3F, 0x3F, 0x9A, 0x40, /* 0xA8-0xAB */
-	0x99, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x9A, 0x5D, /* 0xAC-0xAF */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x8D, 0x00, 0x8A, 0x50, /* 0xB0-0xB3 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */
-	0x99, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */
-	0x9A, 0x44, 0x88, 0x00, 0x9A, 0x43, 0x3F, 0x3F, /* 0xBC-0xBF */
-	0x88, 0x00, 0x95, 0x69, 0x9A, 0x41, 0x3F, 0x3F, /* 0xC0-0xC3 */
-	0x99, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x99, 0x00, /* 0xC4-0xC7 */
-	0x99, 0x00, 0x8D, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC8-0xCB */
+	0xED, 0x74, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x99, 0xF6, 0x3F, 0x3F, /* 0xA0-0xA3 */
+	0x9A, 0x42, 0x99, 0xF8, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */
+	0x99, 0xFC, 0xED, 0x76, 0x3F, 0x3F, 0x9A, 0x40, /* 0xA8-0xAB */
+	0x99, 0xF9, 0x3F, 0x3F, 0x3F, 0x3F, 0x9A, 0x5D, /* 0xAC-0xAF */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x8D, 0xE7, 0x8A, 0x50, /* 0xB0-0xB3 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */
+	0x99, 0xF7, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */
+	0x9A, 0x44, 0x88, 0xF4, 0x9A, 0x43, 0x3F, 0x3F, /* 0xBC-0xBF */
+	0x88, 0xA3, 0x95, 0x69, 0x9A, 0x41, 0x3F, 0x3F, /* 0xC0-0xC3 */
+	0x99, 0xFA, 0x3F, 0x3F, 0x3F, 0x3F, 0x99, 0xF5, /* 0xC4-0xC7 */
+	0x99, 0xFB, 0x8D, 0xC6, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC8-0xCB */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */
 	0x9A, 0x45, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xDC-0xDF */
-	0x3F, 0x3F, 0x88, 0x00, 0x9A, 0x4E, 0x3F, 0x3F, /* 0xE0-0xE3 */
+	0x3F, 0x3F, 0x88, 0xF5, 0x9A, 0x4E, 0x3F, 0x3F, /* 0xE0-0xE3 */
 	0x3F, 0x3F, 0x9A, 0x46, 0x9A, 0x47, 0x3F, 0x3F, /* 0xE4-0xE7 */
-	0x8F, 0x00, 0x96, 0x89, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */
+	0x8F, 0xA3, 0x96, 0x89, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */
 	0x3F, 0x3F, 0x9A, 0x4C, 0x9A, 0x4B, 0x3F, 0x3F, /* 0xEC-0xEF */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x93, 0x4E, 0x3F, 0x3F, /* 0xF0-0xF3 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x9A, 0x4D, 0x3F, 0x3F, /* 0xF8-0xFB */
-	0x3F, 0x3F, 0x9A, 0x4A, 0x3F, 0x3F, 0x00, 0x94, /* 0xFC-0xFF */
+	0x3F, 0x3F, 0x9A, 0x4A, 0x3F, 0x3F, 0xED, 0x77, /* 0xFC-0xFF */
 };
 
 static unsigned char u2c_55[512] = {
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */
-	0x89, 0x53, 0x3F, 0x3F, 0x8D, 0x00, 0x90, 0x4F, /* 0x04-0x07 */
+	0x89, 0x53, 0x3F, 0x3F, 0x8D, 0xB4, 0x90, 0x4F, /* 0x04-0x07 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x08-0x0B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x9A, 0x48, /* 0x0C-0x0F */
 	0x93, 0x82, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */
-	0x9A, 0x49, 0x3F, 0x3F, 0x88, 0x00, 0x3F, 0x3F, /* 0x14-0x17 */
+	0x9A, 0x49, 0x3F, 0x3F, 0x88, 0xA0, 0x3F, 0x3F, /* 0x14-0x17 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x18-0x1B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x9A, 0x53, 0x97, 0x42, /* 0x2C-0x2F */
-	0x3F, 0x3F, 0x8F, 0x00, 0x3F, 0x3F, 0x9A, 0x59, /* 0x30-0x33 */
+	0x3F, 0x3F, 0x8F, 0xA5, 0x3F, 0x3F, 0x9A, 0x59, /* 0x30-0x33 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */
 	0x9A, 0x58, 0x9A, 0x4F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x38-0x3B */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x91, 0x00, 0x3F, 0x3F, /* 0x3C-0x3F */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x91, 0xC1, 0x3F, 0x3F, /* 0x3C-0x3F */
 	0x9A, 0x50, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */
-	0x91, 0x00, 0x9A, 0x55, 0x8F, 0x00, 0x3F, 0x3F, /* 0x44-0x47 */
+	0x91, 0xED, 0x9A, 0x55, 0x8F, 0xA4, 0x3F, 0x3F, /* 0x44-0x47 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */
-	0x9A, 0x52, 0x3F, 0x3F, 0x3F, 0x3F, 0x96, 0x00, /* 0x4C-0x4F */
+	0x9A, 0x52, 0x3F, 0x3F, 0x3F, 0x3F, 0x96, 0xE2, /* 0x4C-0x4F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x8C, 0x5B, /* 0x50-0x53 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x9A, 0x56, 0x9A, 0x57, /* 0x54-0x57 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */
@@ -4433,23 +4435,23 @@
 	0x9A, 0x65, 0x3F, 0x3F, 0x9A, 0x61, 0x3F, 0x3F, /* 0x7C-0x7F */
 	
 	0x9A, 0x5C, 0x3F, 0x3F, 0x3F, 0x3F, 0x9A, 0x66, /* 0x80-0x83 */
-	0x91, 0x50, 0x3F, 0x3F, 0x00, 0x95, 0x9A, 0x68, /* 0x84-0x87 */
+	0x91, 0x50, 0x3F, 0x3F, 0xED, 0x78, 0x9A, 0x68, /* 0x84-0x87 */
 	0x3F, 0x3F, 0x8D, 0x41, 0x9A, 0x5E, 0x92, 0x9D, /* 0x88-0x8B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */
-	0x9A, 0x62, 0x9A, 0x5B, 0x8A, 0x00, 0x3F, 0x3F, /* 0x98-0x9B */
-	0x8A, 0x00, 0x8A, 0x85, 0x9A, 0x63, 0x9A, 0x5F, /* 0x9C-0x9F */
+	0x9A, 0x62, 0x9A, 0x5B, 0x8A, 0xAB, 0x3F, 0x3F, /* 0x98-0x9B */
+	0x8A, 0xEC, 0x8A, 0x85, 0x9A, 0x63, 0x9A, 0x5F, /* 0x9C-0x9F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x8C, 0x96, /* 0xA4-0xA7 */
 	0x9A, 0x69, 0x9A, 0x67, 0x91, 0x72, 0x8B, 0x69, /* 0xA8-0xAB */
-	0x8B, 0x00, 0x3F, 0x3F, 0x9A, 0x64, 0x3F, 0x3F, /* 0xAC-0xAF */
-	0x8B, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB0-0xB3 */
+	0x8B, 0xAA, 0x3F, 0x3F, 0x9A, 0x64, 0x3F, 0x3F, /* 0xAC-0xAF */
+	0x8B, 0xF2, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB0-0xB3 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x89, 0x63, 0x3F, 0x3F, /* 0xB4-0xB7 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */
-	0x9A, 0x6D, 0x9A, 0x6B, 0x3F, 0x3F, 0x9A, 0x00, /* 0xC4-0xC7 */
+	0x9A, 0x6D, 0x9A, 0x6B, 0x3F, 0x3F, 0x9A, 0xA5, /* 0xC4-0xC7 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC8-0xCB */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */
@@ -4469,17 +4471,17 @@
 static unsigned char u2c_56[512] = {
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x92, 0x51, 0x3F, 0x3F, /* 0x04-0x07 */
-	0x3F, 0x3F, 0x89, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x08-0x0B */
+	0x3F, 0x3F, 0x89, 0xC3, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x08-0x0B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */
-	0x9A, 0x71, 0x3F, 0x3F, 0x9A, 0x73, 0x8F, 0x00, /* 0x14-0x17 */
+	0x9A, 0x71, 0x3F, 0x3F, 0x9A, 0x73, 0x8F, 0xA6, /* 0x14-0x17 */
 	0x89, 0x52, 0x3F, 0x3F, 0x3F, 0x3F, 0x9A, 0x76, /* 0x18-0x1B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */
-	0x3F, 0x3F, 0x89, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */
+	0x3F, 0x3F, 0x89, 0xDC, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x9A, 0x82, /* 0x2C-0x2F */
-	0x3F, 0x3F, 0x8F, 0x00, 0x9A, 0x7D, 0x3F, 0x3F, /* 0x30-0x33 */
+	0x3F, 0x3F, 0x8F, 0xFA, 0x9A, 0x7D, 0x3F, 0x3F, /* 0x30-0x33 */
 	0x9A, 0x7B, 0x3F, 0x3F, 0x9A, 0x7C, 0x3F, 0x3F, /* 0x34-0x37 */
 	0x9A, 0x7E, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x38-0x3B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */
@@ -4493,11 +4495,11 @@
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x5C-0x5F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x60-0x63 */
 	0x9A, 0x81, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */
-	0x8A, 0x00, 0x3F, 0x3F, 0x9A, 0x84, 0x9A, 0x80, /* 0x68-0x6B */
+	0x8A, 0xED, 0x3F, 0x3F, 0x9A, 0x84, 0x9A, 0x80, /* 0x68-0x6B */
 	0x9A, 0x83, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */
-	0x95, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x74-0x77 */
-	0x93, 0x00, 0x3F, 0x3F, 0x94, 0x00, 0x3F, 0x3F, /* 0x78-0x7B */
+	0x95, 0xAC, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x74-0x77 */
+	0x93, 0xD3, 0x3F, 0x3F, 0x94, 0xB6, 0x3F, 0x3F, /* 0x78-0x7B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */
 	
 	0x9A, 0x86, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */
@@ -4522,246 +4524,246 @@
 	0x3F, 0x3F, 0x3F, 0x3F, 0x9A, 0x95, 0x3F, 0x3F, /* 0xCC-0xCF */
 	0x3F, 0x3F, 0x9A, 0x96, 0x3F, 0x3F, 0x9A, 0x97, /* 0xD0-0xD3 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x9A, 0x98, /* 0xD4-0xD7 */
-	0x99, 0x64, 0x3F, 0x3F, 0x8E, 0x00, 0x8E, 0x6C, /* 0xD8-0xDB */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x89, 0x00, 0x3F, 0x3F, /* 0xDC-0xDF */
-	0x88, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x92, 0x63, /* 0xE0-0xE3 */
+	0x99, 0x64, 0x3F, 0x3F, 0x8E, 0xFA, 0x8E, 0x6C, /* 0xD8-0xDB */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x89, 0xF1, 0x3F, 0x3F, /* 0xDC-0xDF */
+	0x88, 0xF6, 0x3F, 0x3F, 0x3F, 0x3F, 0x92, 0x63, /* 0xE0-0xE3 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x9A, 0x99, 0x3F, 0x3F, /* 0xEC-0xEF */
-	0x8D, 0x00, 0x3F, 0x3F, 0x88, 0x00, 0x90, 0x7D, /* 0xF0-0xF3 */
+	0x8D, 0xA2, 0x3F, 0x3F, 0x88, 0xCD, 0x90, 0x7D, /* 0xF0-0xF3 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */
-	0x3F, 0x3F, 0x9A, 0x9A, 0x8C, 0x00, 0x3F, 0x3F, /* 0xF8-0xFB */
+	0x3F, 0x3F, 0x9A, 0x9A, 0x8C, 0xC5, 0x3F, 0x3F, /* 0xF8-0xFB */
 	0x3F, 0x3F, 0x8D, 0x91, 0x3F, 0x3F, 0x9A, 0x9C, /* 0xFC-0xFF */
 };
 
 static unsigned char u2c_57[512] = {
-	0x9A, 0x9B, 0x3F, 0x3F, 0x3F, 0x3F, 0x95, 0x00, /* 0x00-0x03 */
+	0x9A, 0x9B, 0x3F, 0x3F, 0x3F, 0x3F, 0x95, 0xDE, /* 0x00-0x03 */
 	0x9A, 0x9D, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x04-0x07 */
-	0x9A, 0x9F, 0x9A, 0x9E, 0x3F, 0x3F, 0x9A, 0x00, /* 0x08-0x0B */
-	0x3F, 0x3F, 0x9A, 0x00, 0x3F, 0x3F, 0x8C, 0x97, /* 0x0C-0x0F */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x89, 0x80, 0x9A, 0x00, /* 0x10-0x13 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x9A, 0x00, 0x3F, 0x3F, /* 0x14-0x17 */
-	0x9A, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x18-0x1B */
-	0x9A, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x93, 0x79, /* 0x1C-0x1F */
+	0x9A, 0x9F, 0x9A, 0x9E, 0x3F, 0x3F, 0x9A, 0xA0, /* 0x08-0x0B */
+	0x3F, 0x3F, 0x9A, 0xA1, 0x3F, 0x3F, 0x8C, 0x97, /* 0x0C-0x0F */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x89, 0x80, 0x9A, 0xA2, /* 0x10-0x13 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x9A, 0xA4, 0x3F, 0x3F, /* 0x14-0x17 */
+	0x9A, 0xA3, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x18-0x1B */
+	0x9A, 0xA6, 0x3F, 0x3F, 0x3F, 0x3F, 0x93, 0x79, /* 0x1C-0x1F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x9A, 0x00, 0x88, 0x00, /* 0x24-0x27 */
-	0x8D, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x9A, 0xA7, 0x88, 0xB3, /* 0x24-0x27 */
+	0x8D, 0xDD, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */
 	0x3F, 0x3F, 0x8C, 0x5C, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */
 	0x92, 0x6E, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x9A, 0x00, /* 0x34-0x37 */
-	0x9A, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x9A, 0x00, /* 0x38-0x3B */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x9A, 0xA8, /* 0x34-0x37 */
+	0x9A, 0xA9, 0x3F, 0x3F, 0x3F, 0x3F, 0x9A, 0xAB, /* 0x38-0x3B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */
-	0x9A, 0x00, 0x3F, 0x3F, 0x8D, 0x00, 0x3F, 0x3F, /* 0x40-0x43 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x8B, 0x00, /* 0x44-0x47 */
+	0x9A, 0xAC, 0x3F, 0x3F, 0x8D, 0xE2, 0x3F, 0x3F, /* 0x40-0x43 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x8B, 0xCF, /* 0x44-0x47 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x96, 0x56, 0x3F, 0x3F, /* 0x48-0x4B */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x9A, 0x00, 0x9A, 0x00, /* 0x4C-0x4F */
-	0x8D, 0x00, 0x8D, 0x42, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x9A, 0xAA, 0x9A, 0xAD, /* 0x4C-0x4F */
+	0x8D, 0xBF, 0x8D, 0x42, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */
-	0x3F, 0x3F, 0x00, 0x96, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */
+	0x3F, 0x3F, 0xED, 0x79, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x5C-0x5F */
-	0x3F, 0x3F, 0x9A, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x60-0x63 */
-	0x8D, 0x00, 0x00, 0x97, 0x92, 0x52, 0x3F, 0x3F, /* 0x64-0x67 */
-	0x3F, 0x3F, 0x9A, 0x00, 0x92, 0x00, 0x3F, 0x3F, /* 0x68-0x6B */
+	0x3F, 0x3F, 0x9A, 0xB1, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x60-0x63 */
+	0x8D, 0xA3, 0xED, 0x7A, 0x92, 0x52, 0x3F, 0x3F, /* 0x64-0x67 */
+	0x3F, 0x3F, 0x9A, 0xAE, 0x92, 0xD8, 0x3F, 0x3F, /* 0x68-0x6B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x74-0x77 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x9A, 0x00, /* 0x7C-0x7F */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x9A, 0xB2, /* 0x7C-0x7F */
 	
 	0x3F, 0x3F, 0x3F, 0x3F, 0x90, 0x82, 0x3F, 0x3F, /* 0x80-0x83 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */
-	0x9A, 0x00, 0x9A, 0x00, 0x3F, 0x3F, 0x8C, 0x5E, /* 0x88-0x8B */
+	0x9A, 0xB0, 0x9A, 0xB3, 0x3F, 0x3F, 0x8C, 0x5E, /* 0x88-0x8B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x9A, 0x00, /* 0x90-0x93 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x9A, 0xB4, /* 0x90-0x93 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */
-	0x9A, 0x00, 0x3F, 0x3F, 0x8D, 0x43, 0x8A, 0x5F, /* 0xA0-0xA3 */
-	0x9A, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x9A, 0x00, 0x3F, 0x3F, /* 0xA8-0xAB */
-	0x00, 0x98, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */
-	0x9A, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x9A, 0x00, /* 0xB0-0xB3 */
+	0x9A, 0xB5, 0x3F, 0x3F, 0x8D, 0x43, 0x8A, 0x5F, /* 0xA0-0xA3 */
+	0x9A, 0xB7, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x9A, 0xB8, 0x3F, 0x3F, /* 0xA8-0xAB */
+	0xED, 0x7B, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */
+	0x9A, 0xB9, 0x3F, 0x3F, 0x3F, 0x3F, 0x9A, 0xB6, /* 0xB0-0xB3 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */
-	0x9A, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x9A, 0x00, /* 0xC0-0xC3 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x9A, 0x00, 0x00, 0x9A, /* 0xC4-0xC7 */
-	0x00, 0x99, 0x3F, 0x3F, 0x3F, 0x3F, 0x96, 0x84, /* 0xC8-0xCB */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x8F, 0x00, 0x3F, 0x3F, /* 0xCC-0xCF */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x9A, 0x00, 0x9A, 0x00, /* 0xD0-0xD3 */
-	0x9A, 0x00, 0x3F, 0x3F, 0x9A, 0x00, 0x3F, 0x3F, /* 0xD4-0xD7 */
+	0x9A, 0xAF, 0x3F, 0x3F, 0x3F, 0x3F, 0x9A, 0xBA, /* 0xC0-0xC3 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x9A, 0xBB, 0xED, 0x7D, /* 0xC4-0xC7 */
+	0xED, 0x7C, 0x3F, 0x3F, 0x3F, 0x3F, 0x96, 0x84, /* 0xC8-0xCB */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x8F, 0xE9, 0x3F, 0x3F, /* 0xCC-0xCF */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x9A, 0xBD, 0x9A, 0xBE, /* 0xD0-0xD3 */
+	0x9A, 0xBC, 0x3F, 0x3F, 0x9A, 0xC0, 0x3F, 0x3F, /* 0xD4-0xD7 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */
-	0x94, 0x57, 0x3F, 0x3F, 0x3F, 0x3F, 0x88, 0x00, /* 0xDC-0xDF */
-	0x95, 0x75, 0x3F, 0x3F, 0x3F, 0x3F, 0x9A, 0x00, /* 0xE0-0xE3 */
+	0x94, 0x57, 0x3F, 0x3F, 0x3F, 0x3F, 0x88, 0xE6, /* 0xDC-0xDF */
+	0x95, 0x75, 0x3F, 0x3F, 0x3F, 0x3F, 0x9A, 0xC1, /* 0xE0-0xE3 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */
-	0x8F, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x8E, 0x00, /* 0xF4-0xF7 */
-	0x3F, 0x3F, 0x94, 0x7C, 0x8A, 0x00, 0x3F, 0x3F, /* 0xF8-0xFB */
-	0x8D, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */
+	0x8F, 0xFB, 0x3F, 0x3F, 0x3F, 0x3F, 0x8E, 0xB7, /* 0xF4-0xF7 */
+	0x3F, 0x3F, 0x94, 0x7C, 0x8A, 0xEE, 0x3F, 0x3F, /* 0xF8-0xFB */
+	0x8D, 0xE9, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */
 };
 
 static unsigned char u2c_58[512] = {
-	0x96, 0x78, 0x3F, 0x3F, 0x93, 0x00, 0x3F, 0x3F, /* 0x00-0x03 */
-	0x3F, 0x3F, 0x8C, 0x98, 0x91, 0x00, 0x3F, 0x3F, /* 0x04-0x07 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x9A, 0x00, 0x9A, 0x00, /* 0x08-0x0B */
+	0x96, 0x78, 0x3F, 0x3F, 0x93, 0xB0, 0x3F, 0x3F, /* 0x00-0x03 */
+	0x3F, 0x3F, 0x8C, 0x98, 0x91, 0xCD, 0x3F, 0x3F, /* 0x04-0x07 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x9A, 0xBF, 0x9A, 0xC2, /* 0x08-0x0B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */
-	0x3F, 0x3F, 0x91, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */
-	0x3F, 0x3F, 0x9A, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x18-0x1B */
-	0x3F, 0x3F, 0x9A, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */
-	0x3F, 0x3F, 0x9A, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */
-	0x92, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x8A, 0x00, 0x3F, 0x3F, /* 0x28-0x2B */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x9F, /* 0x2C-0x2F */
-	0x89, 0x81, 0x95, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */
-	0x8F, 0x00, 0x93, 0x67, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x8D, 0x00, 0x3F, 0x3F, /* 0x38-0x3B */
-	0x3F, 0x3F, 0x9A, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */
-	0x95, 0x00, 0x97, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */
+	0x3F, 0x3F, 0x91, 0xC2, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */
+	0x3F, 0x3F, 0x9A, 0xC3, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x18-0x1B */
+	0x3F, 0x3F, 0x9A, 0xC4, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */
+	0x3F, 0x3F, 0x9A, 0xC6, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */
+	0x92, 0xE7, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x8A, 0xAC, 0x3F, 0x3F, /* 0x28-0x2B */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xEA, 0x9F, /* 0x2C-0x2F */
+	0x89, 0x81, 0x95, 0xF1, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */
+	0x8F, 0xEA, 0x93, 0x67, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x8D, 0xE4, 0x3F, 0x3F, /* 0x38-0x3B */
+	0x3F, 0x3F, 0x9A, 0xCC, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */
+	0x95, 0xBB, 0x97, 0xDB, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x89, 0x00, 0x9A, 0x00, /* 0x48-0x4B */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x89, 0xF2, 0x9A, 0xC8, /* 0x48-0x4B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x4C-0x4F */
-	0x3F, 0x3F, 0x91, 0x59, 0x9A, 0x00, 0x3F, 0x3F, /* 0x50-0x53 */
+	0x3F, 0x3F, 0x91, 0x59, 0x9A, 0xCB, 0x3F, 0x3F, /* 0x50-0x53 */
 	0x93, 0x83, 0x3F, 0x3F, 0x3F, 0x3F, 0x93, 0x68, /* 0x54-0x57 */
-	0x93, 0x84, 0x94, 0x00, 0x92, 0x00, 0x3F, 0x3F, /* 0x58-0x5B */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x8D, 0x00, 0x3F, 0x3F, /* 0x5C-0x5F */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x9A, 0x00, 0x3F, 0x3F, /* 0x60-0x63 */
+	0x93, 0x84, 0x94, 0xB7, 0x92, 0xCB, 0x3F, 0x3F, /* 0x58-0x5B */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x8D, 0xC7, 0x3F, 0x3F, /* 0x5C-0x5F */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x9A, 0xC7, 0x3F, 0x3F, /* 0x60-0x63 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */
 	0x3F, 0x3F, 0x89, 0x96, 0x3F, 0x3F, 0x93, 0x55, /* 0x68-0x6B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */
-	0x9A, 0x00, 0x3F, 0x3F, 0x9A, 0x00, 0x3F, 0x3F, /* 0x70-0x73 */
+	0x9A, 0xC9, 0x3F, 0x3F, 0x9A, 0xC5, 0x3F, 0x3F, /* 0x70-0x73 */
 	0x3F, 0x3F, 0x90, 0x6F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x74-0x77 */
-	0x3F, 0x3F, 0x9A, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */
+	0x3F, 0x3F, 0x9A, 0xCD, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x8F, 0x6D, 0x3F, 0x3F, /* 0x7C-0x7F */
 	
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x8B, 0x00, /* 0x80-0x83 */
-	0x3F, 0x3F, 0x9A, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x8B, 0xAB, /* 0x80-0x83 */
+	0x3F, 0x3F, 0x9A, 0xCE, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x88-0x8B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x95, 0x00, /* 0x90-0x93 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x95, 0xE6, /* 0x90-0x93 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x91, 0x9D, /* 0x94-0x97 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */
-	0x92, 0x00, 0x3F, 0x3F, 0x00, 0x9D, 0x9A, 0x00, /* 0x9C-0x9F */
+	0x92, 0xC4, 0x3F, 0x3F, 0xED, 0x81, 0x9A, 0xD0, /* 0x9C-0x9F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */
-	0x96, 0x6E, 0x3F, 0x3F, 0x3F, 0x3F, 0x9A, 0x00, /* 0xA8-0xAB */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x9A, 0x00, 0x3F, 0x3F, /* 0xAC-0xAF */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x9E, 0x95, 0x00, /* 0xB0-0xB3 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */
-	0x9A, 0x00, 0x9A, 0x00, 0x9A, 0x00, 0x9A, 0x00, /* 0xB8-0xBB */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x8D, 0x00, 0x3F, 0x3F, /* 0xBC-0xBF */
-	0x3F, 0x3F, 0x95, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */
-	0x3F, 0x3F, 0x9A, 0x00, 0x3F, 0x3F, 0x92, 0x64, /* 0xC4-0xC7 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x89, 0x00, 0x3F, 0x3F, /* 0xC8-0xCB */
-	0x8F, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */
-	0x3F, 0x3F, 0x9A, 0x00, 0x3F, 0x3F, 0x9A, 0x00, /* 0xD0-0xD3 */
-	0x3F, 0x3F, 0x8D, 0x88, 0x3F, 0x3F, 0x9A, 0x00, /* 0xD4-0xD7 */
-	0x9A, 0x00, 0x9A, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */
-	0x9A, 0x00, 0x3F, 0x3F, 0x9A, 0x00, 0x9A, 0x00, /* 0xDC-0xDF */
+	0x96, 0x6E, 0x3F, 0x3F, 0x3F, 0x3F, 0x9A, 0xD1, /* 0xA8-0xAB */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x9A, 0xD6, 0x3F, 0x3F, /* 0xAC-0xAF */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xED, 0x82, 0x95, 0xAD, /* 0xB0-0xB3 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */
+	0x9A, 0xD5, 0x9A, 0xCF, 0x9A, 0xD2, 0x9A, 0xD4, /* 0xB8-0xBB */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x8D, 0xA4, 0x3F, 0x3F, /* 0xBC-0xBF */
+	0x3F, 0x3F, 0x95, 0xC7, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */
+	0x3F, 0x3F, 0x9A, 0xD7, 0x3F, 0x3F, 0x92, 0x64, /* 0xC4-0xC7 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x89, 0xF3, 0x3F, 0x3F, /* 0xC8-0xCB */
+	0x8F, 0xEB, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */
+	0x3F, 0x3F, 0x9A, 0xD9, 0x3F, 0x3F, 0x9A, 0xD8, /* 0xD0-0xD3 */
+	0x3F, 0x3F, 0x8D, 0x88, 0x3F, 0x3F, 0x9A, 0xDA, /* 0xD4-0xD7 */
+	0x9A, 0xDC, 0x9A, 0xDB, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */
+	0x9A, 0xDE, 0x3F, 0x3F, 0x9A, 0xD3, 0x9A, 0xE0, /* 0xDC-0xDF */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */
-	0x9A, 0x00, 0x9A, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */
+	0x9A, 0xDF, 0x9A, 0xDD, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x8E, 0x6D, /* 0xE8-0xEB */
-	0x90, 0x70, 0x3F, 0x3F, 0x91, 0x73, 0x9A, 0x00, /* 0xEC-0xEF */
-	0x90, 0x00, 0x88, 0x00, 0x94, 0x84, 0x3F, 0x3F, /* 0xF0-0xF3 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x92, 0x00, /* 0xF4-0xF7 */
-	0x3F, 0x3F, 0x9A, 0x00, 0x9A, 0x00, 0x9A, 0x00, /* 0xF8-0xFB */
-	0x9A, 0x00, 0x9A, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */
+	0x90, 0x70, 0x3F, 0x3F, 0x91, 0x73, 0x9A, 0xE1, /* 0xEC-0xEF */
+	0x90, 0xBA, 0x88, 0xEB, 0x94, 0x84, 0x3F, 0x3F, /* 0xF0-0xF3 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x92, 0xD9, /* 0xF4-0xF7 */
+	0x3F, 0x3F, 0x9A, 0xE3, 0x9A, 0xE2, 0x9A, 0xE4, /* 0xF8-0xFB */
+	0x9A, 0xE5, 0x9A, 0xE6, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */
 };
 
 static unsigned char u2c_59[512] = {
-	0x3F, 0x3F, 0x3F, 0x3F, 0x9A, 0x00, 0x3F, 0x3F, /* 0x00-0x03 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x9A, 0xE7, 0x3F, 0x3F, /* 0x00-0x03 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x04-0x07 */
-	0x3F, 0x3F, 0x95, 0x00, 0x9A, 0x00, 0x00, 0x9F, /* 0x08-0x0B */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x89, 0x00, /* 0x0C-0x0F */
-	0x9A, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */
+	0x3F, 0x3F, 0x95, 0xCF, 0x9A, 0xE8, 0xED, 0x83, /* 0x08-0x0B */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x89, 0xC4, /* 0x0C-0x0F */
+	0x9A, 0xE9, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */
 	0x3F, 0x3F, 0x97, 0x5B, 0x8A, 0x4F, 0x3F, 0x3F, /* 0x14-0x17 */
-	0x99, 0x00, 0x8F, 0x67, 0x91, 0x00, 0x9A, 0x00, /* 0x18-0x1B */
-	0x96, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x96, 0x00, 0x3F, 0x3F, /* 0x20-0x23 */
-	0x3F, 0x3F, 0x9A, 0x00, 0x3F, 0x3F, 0x91, 0x00, /* 0x24-0x27 */
-	0x3F, 0x3F, 0x93, 0x56, 0x91, 0x00, 0x95, 0x76, /* 0x28-0x2B */
-	0x9A, 0x00, 0x9A, 0x00, 0x89, 0x9B, 0x3F, 0x3F, /* 0x2C-0x2F */
-	0x3F, 0x3F, 0x8E, 0x00, 0x9A, 0x00, 0x3F, 0x3F, /* 0x30-0x33 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x88, 0x00, /* 0x34-0x37 */
-	0x9A, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x38-0x3B */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x9A, 0x00, 0x3F, 0x3F, /* 0x3C-0x3F */
+	0x99, 0xC7, 0x8F, 0x67, 0x91, 0xBD, 0x9A, 0xEA, /* 0x18-0x1B */
+	0x96, 0xE9, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x96, 0xB2, 0x3F, 0x3F, /* 0x20-0x23 */
+	0x3F, 0x3F, 0x9A, 0xEC, 0x3F, 0x3F, 0x91, 0xE5, /* 0x24-0x27 */
+	0x3F, 0x3F, 0x93, 0x56, 0x91, 0xBE, 0x95, 0x76, /* 0x28-0x2B */
+	0x9A, 0xED, 0x9A, 0xEE, 0x89, 0x9B, 0x3F, 0x3F, /* 0x2C-0x2F */
+	0x3F, 0x3F, 0x8E, 0xB8, 0x9A, 0xEF, 0x3F, 0x3F, /* 0x30-0x33 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x88, 0xCE, /* 0x34-0x37 */
+	0x9A, 0xF0, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x38-0x3B */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x9A, 0xF1, 0x3F, 0x3F, /* 0x3C-0x3F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */
-	0x89, 0x82, 0x3F, 0x3F, 0x3F, 0x3F, 0x8A, 0x00, /* 0x44-0x47 */
-	0x93, 0x00, 0x95, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x9A, 0x00, 0x91, 0x74, /* 0x4C-0x4F */
-	0x9A, 0x00, 0x8C, 0x5F, 0x3F, 0x3F, 0x00, 0x00, /* 0x50-0x53 */
-	0x96, 0x7A, 0x9A, 0x00, 0x3F, 0x3F, 0x93, 0x85, /* 0x54-0x57 */
-	0x9A, 0x00, 0x3F, 0x3F, 0x9A, 0x00, 0x00, 0x00, /* 0x58-0x5B */
-	0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x5C-0x5F */
-	0x9A, 0x00, 0x3F, 0x3F, 0x9A, 0x00, 0x00, 0x00, /* 0x60-0x63 */
-	0x3F, 0x3F, 0x89, 0x9C, 0x3F, 0x3F, 0x9A, 0x00, /* 0x64-0x67 */
-	0x8F, 0x00, 0x9A, 0x00, 0x92, 0x44, 0x3F, 0x3F, /* 0x68-0x6B */
-	0x9A, 0x00, 0x3F, 0x3F, 0x95, 0x00, 0x3F, 0x3F, /* 0x6C-0x6F */
+	0x89, 0x82, 0x3F, 0x3F, 0x3F, 0x3F, 0x8A, 0xEF, /* 0x44-0x47 */
+	0x93, 0xDE, 0x95, 0xF2, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x9A, 0xF5, 0x91, 0x74, /* 0x4C-0x4F */
+	0x9A, 0xF4, 0x8C, 0x5F, 0x3F, 0x3F, 0xED, 0x84, /* 0x50-0x53 */
+	0x96, 0x7A, 0x9A, 0xF3, 0x3F, 0x3F, 0x93, 0x85, /* 0x54-0x57 */
+	0x9A, 0xF7, 0x3F, 0x3F, 0x9A, 0xF6, 0xED, 0x85, /* 0x58-0x5B */
+	0x3F, 0x3F, 0xED, 0x86, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x5C-0x5F */
+	0x9A, 0xF9, 0x3F, 0x3F, 0x9A, 0xF8, 0xED, 0x87, /* 0x60-0x63 */
+	0x3F, 0x3F, 0x89, 0x9C, 0x3F, 0x3F, 0x9A, 0xFA, /* 0x64-0x67 */
+	0x8F, 0xA7, 0x9A, 0xFC, 0x92, 0x44, 0x3F, 0x3F, /* 0x68-0x6B */
+	0x9A, 0xFB, 0x3F, 0x3F, 0x95, 0xB1, 0x3F, 0x3F, /* 0x6C-0x6F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x8F, 0x97, /* 0x70-0x73 */
 	0x93, 0x7A, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x74-0x77 */
 	0x9B, 0x40, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */
 	0x3F, 0x3F, 0x8D, 0x44, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */
 	
-	0x3F, 0x3F, 0x9B, 0x41, 0x94, 0x40, 0x94, 0x00, /* 0x80-0x83 */
-	0x96, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */
+	0x3F, 0x3F, 0x9B, 0x41, 0x94, 0x40, 0x94, 0xDC, /* 0x80-0x83 */
+	0x96, 0xCF, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x94, 0x44, 0x3F, 0x3F, /* 0x88-0x8B */
 	0x3F, 0x3F, 0x9B, 0x4A, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x8B, 0x57, /* 0x90-0x93 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x97, 0x64, 0x3F, 0x3F, /* 0x94-0x97 */
-	0x3F, 0x3F, 0x96, 0x00, 0x3F, 0x3F, 0x9B, 0x00, /* 0x98-0x9B */
+	0x3F, 0x3F, 0x96, 0xAD, 0x3F, 0x3F, 0x9B, 0xAA, /* 0x98-0x9B */
 	0x3F, 0x3F, 0x9B, 0x42, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x9B, 0x45, /* 0xA0-0xA3 */
-	0x00, 0x00, 0x91, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */
+	0xED, 0x88, 0x91, 0xC3, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */
 	0x96, 0x57, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */
 	0x93, 0x69, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x9B, 0x46, 0x3F, 0x3F, /* 0xB0-0xB3 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */
-	0x3F, 0x3F, 0x96, 0x85, 0x00, 0x00, 0x8D, 0x00, /* 0xB8-0xBB */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x8F, 0x00, 0x3F, 0x3F, /* 0xBC-0xBF */
+	0x3F, 0x3F, 0x96, 0x85, 0xED, 0x89, 0x8D, 0xC8, /* 0xB8-0xBB */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x8F, 0xA8, 0x3F, 0x3F, /* 0xBC-0xBF */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x9B, 0x47, 0x3F, 0x3F, /* 0xC4-0xC7 */
 	0x3F, 0x3F, 0x8E, 0x6F, 0x3F, 0x3F, 0x8E, 0x6E, /* 0xC8-0xCB */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */
-	0x88, 0x00, 0x8C, 0x00, 0x3F, 0x3F, 0x90, 0x00, /* 0xD0-0xD3 */
-	0x88, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */
+	0x88, 0xB7, 0x8C, 0xC6, 0x3F, 0x3F, 0x90, 0xA9, /* 0xD0-0xD3 */
+	0x88, 0xCF, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */
 	0x3F, 0x3F, 0x9B, 0x4B, 0x9B, 0x4C, 0x3F, 0x3F, /* 0xD8-0xDB */
 	0x9B, 0x49, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xDC-0xDF */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */
-	0x3F, 0x3F, 0x89, 0x57, 0x8A, 0x00, 0x3F, 0x3F, /* 0xE4-0xE7 */
-	0x9B, 0x48, 0x3F, 0x3F, 0x96, 0x00, 0x95, 0x50, /* 0xE8-0xEB */
+	0x3F, 0x3F, 0x89, 0x57, 0x8A, 0xAD, 0x3F, 0x3F, /* 0xE4-0xE7 */
+	0x9B, 0x48, 0x3F, 0x3F, 0x96, 0xC3, 0x95, 0x50, /* 0xE8-0xEB */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x88, 0x00, 0x3F, 0x3F, /* 0xF4-0xF7 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x88, 0x00, /* 0xF8-0xFB */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x88, 0xA6, 0x3F, 0x3F, /* 0xF4-0xF7 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x88, 0xF7, /* 0xF8-0xFB */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x8E, 0x70, /* 0xFC-0xFF */
 };
 
 static unsigned char u2c_5A[512] = {
-	0x3F, 0x3F, 0x88, 0x00, 0x3F, 0x3F, 0x88, 0x00, /* 0x00-0x03 */
+	0x3F, 0x3F, 0x88, 0xD0, 0x3F, 0x3F, 0x88, 0xA1, /* 0x00-0x03 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x04-0x07 */
 	0x3F, 0x3F, 0x9B, 0x51, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x08-0x0B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */
 	0x3F, 0x3F, 0x9B, 0x4F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */
-	0x96, 0x00, 0x3F, 0x3F, 0x9B, 0x52, 0x3F, 0x3F, /* 0x18-0x1B */
+	0x96, 0xBA, 0x3F, 0x3F, 0x9B, 0x52, 0x3F, 0x3F, /* 0x18-0x1B */
 	0x9B, 0x50, 0x3F, 0x3F, 0x3F, 0x3F, 0x9B, 0x4E, /* 0x1C-0x1F */
 	0x90, 0x50, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */
 	0x3F, 0x3F, 0x9B, 0x4D, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */
-	0x3F, 0x3F, 0x95, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x8C, 0x00, /* 0x2C-0x2F */
+	0x3F, 0x3F, 0x95, 0xD8, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x8C, 0xE2, /* 0x2C-0x2F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */
 	0x3F, 0x3F, 0x9B, 0x56, 0x9B, 0x57, 0x3F, 0x3F, /* 0x34-0x37 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x38-0x3B */
-	0x8F, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */
+	0x8F, 0xA9, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */
 	0x9B, 0x53, 0x98, 0x4B, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x94, 0x6B, 0x3F, 0x3F, /* 0x44-0x47 */
 	0x3F, 0x3F, 0x9B, 0x55, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x4C-0x4F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x8D, 0x00, 0x3F, 0x3F, /* 0x58-0x5B */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x8D, 0xA5, 0x3F, 0x3F, /* 0x58-0x5B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x5C-0x5F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x9B, 0x58, 0x3F, 0x3F, /* 0x60-0x63 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x95, 0x77, 0x3F, 0x3F, /* 0x64-0x67 */
@@ -4770,7 +4772,7 @@
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x74-0x77 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x96, 0x00, /* 0x7C-0x7F */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x96, 0xB9, /* 0x7C-0x7F */
 	
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */
@@ -4788,9 +4790,9 @@
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */
 	0x9B, 0x5B, 0x9B, 0x5F, 0x9B, 0x5C, 0x3F, 0x3F, /* 0xBC-0xBF */
-	0x3F, 0x3F, 0x89, 0x00, 0x9B, 0x5E, 0x3F, 0x3F, /* 0xC0-0xC3 */
+	0x3F, 0x3F, 0x89, 0xC5, 0x9B, 0x5E, 0x3F, 0x3F, /* 0xC0-0xC3 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC4-0xC7 */
-	0x3F, 0x3F, 0x8E, 0x00, 0x3F, 0x3F, 0x9B, 0x5D, /* 0xC8-0xCB */
+	0x3F, 0x3F, 0x8E, 0xB9, 0x3F, 0x3F, 0x9B, 0x5D, /* 0xC8-0xCB */
 	0x8C, 0x99, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */
 	0x9B, 0x6B, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x9B, 0x64, 0x9B, 0x61, /* 0xD4-0xD7 */
@@ -4809,16 +4811,16 @@
 static unsigned char u2c_5B[512] = {
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x04-0x07 */
-	0x3F, 0x3F, 0x8A, 0x00, 0x3F, 0x3F, 0x9B, 0x68, /* 0x08-0x0B */
+	0x3F, 0x3F, 0x8A, 0xF0, 0x3F, 0x3F, 0x9B, 0x68, /* 0x08-0x0B */
 	0x9B, 0x67, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x9B, 0x69, 0x3F, 0x3F, /* 0x14-0x17 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x18-0x1B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x8F, 0x00, 0x3F, 0x3F, /* 0x20-0x23 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x8F, 0xEC, 0x3F, 0x3F, /* 0x20-0x23 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x9B, 0x6C, 0x3F, 0x3F, /* 0x28-0x2B */
-	0x92, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */
+	0x92, 0xDA, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */
 	0x89, 0x64, 0x3F, 0x3F, 0x9B, 0x6A, 0x3F, 0x3F, /* 0x30-0x33 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x9B, 0x6D, 0x3F, 0x3F, /* 0x34-0x37 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x38-0x3B */
@@ -4828,319 +4830,319 @@
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x4C-0x4F */
 	0x8E, 0x71, 0x9B, 0x72, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */
-	0x8D, 0x45, 0x9B, 0x73, 0x00, 0x00, 0x8E, 0x9A, /* 0x54-0x57 */
-	0x91, 0x00, 0x3F, 0x3F, 0x9B, 0x74, 0x9B, 0x75, /* 0x58-0x5B */
-	0x8E, 0x79, 0x8D, 0x46, 0x3F, 0x3F, 0x96, 0x00, /* 0x5C-0x5F */
+	0x8D, 0x45, 0x9B, 0x73, 0xED, 0x8A, 0x8E, 0x9A, /* 0x54-0x57 */
+	0x91, 0xB6, 0x3F, 0x3F, 0x9B, 0x74, 0x9B, 0x75, /* 0x58-0x5B */
+	0x8E, 0x79, 0x8D, 0x46, 0x3F, 0x3F, 0x96, 0xD0, /* 0x5C-0x5F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x8B, 0x47, /* 0x60-0x63 */
-	0x8C, 0x00, 0x9B, 0x76, 0x8A, 0x77, 0x3F, 0x3F, /* 0x64-0x67 */
-	0x3F, 0x3F, 0x9B, 0x77, 0x3F, 0x3F, 0x91, 0x00, /* 0x68-0x6B */
+	0x8C, 0xC7, 0x9B, 0x76, 0x8A, 0x77, 0x3F, 0x3F, /* 0x64-0x67 */
+	0x3F, 0x3F, 0x9B, 0x77, 0x3F, 0x3F, 0x91, 0xB7, /* 0x68-0x6B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */
-	0x9B, 0x78, 0x9B, 0x00, 0x3F, 0x3F, 0x9B, 0x79, /* 0x70-0x73 */
+	0x9B, 0x78, 0x9B, 0xA1, 0x3F, 0x3F, 0x9B, 0x79, /* 0x70-0x73 */
 	0x3F, 0x3F, 0x9B, 0x7A, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x74-0x77 */
 	0x9B, 0x7B, 0x3F, 0x3F, 0x9B, 0x7D, 0x3F, 0x3F, /* 0x78-0x7B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */
 	
 	0x9B, 0x7E, 0x3F, 0x3F, 0x3F, 0x3F, 0x9B, 0x80, /* 0x80-0x83 */
-	0x3F, 0x3F, 0x91, 0x00, 0x3F, 0x3F, 0x89, 0x46, /* 0x84-0x87 */
-	0x8E, 0x00, 0x88, 0x00, 0x3F, 0x3F, 0x91, 0x76, /* 0x88-0x8B */
-	0x8A, 0x00, 0x8E, 0x00, 0x3F, 0x3F, 0x8D, 0x47, /* 0x8C-0x8F */
+	0x3F, 0x3F, 0x91, 0xEE, 0x3F, 0x3F, 0x89, 0x46, /* 0x84-0x87 */
+	0x8E, 0xE7, 0x88, 0xC0, 0x3F, 0x3F, 0x91, 0x76, /* 0x88-0x8B */
+	0x8A, 0xAE, 0x8E, 0xB3, 0x3F, 0x3F, 0x8D, 0x47, /* 0x8C-0x8F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */
 	0x3F, 0x3F, 0x93, 0x86, 0x3F, 0x3F, 0x8F, 0x40, /* 0x94-0x97 */
-	0x8A, 0x00, 0x92, 0x88, 0x92, 0x00, 0x88, 0x00, /* 0x98-0x9B */
-	0x8B, 0x58, 0x95, 0x00, 0x3F, 0x3F, 0x8E, 0x00, /* 0x9C-0x9F */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x8B, 0x71, 0x90, 0x00, /* 0xA0-0xA3 */
-	0x8E, 0x00, 0x97, 0x47, 0x9B, 0x81, 0x3F, 0x3F, /* 0xA4-0xA7 */
+	0x8A, 0xAF, 0x92, 0x88, 0x92, 0xE8, 0x88, 0xB6, /* 0x98-0x9B */
+	0x8B, 0x58, 0x95, 0xF3, 0x3F, 0x3F, 0x8E, 0xC0, /* 0x9C-0x9F */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x8B, 0x71, 0x90, 0xE9, /* 0xA0-0xA3 */
+	0x8E, 0xBA, 0x97, 0x47, 0x9B, 0x81, 0x3F, 0x3F, /* 0xA4-0xA7 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x8B, 0x7B, 0x3F, 0x3F, /* 0xAC-0xAF */
-	0x8D, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x8A, 0x51, /* 0xB0-0xB3 */
-	0x89, 0x83, 0x8F, 0x00, 0x89, 0x00, 0x3F, 0x3F, /* 0xB4-0xB7 */
+	0x8D, 0xC9, 0x3F, 0x3F, 0x3F, 0x3F, 0x8A, 0x51, /* 0xB0-0xB3 */
+	0x89, 0x83, 0x8F, 0xAA, 0x89, 0xC6, 0x3F, 0x3F, /* 0xB4-0xB7 */
 	0x9B, 0x82, 0x97, 0x65, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x8F, 0x68, /* 0xBC-0xBF */
-	0x00, 0x00, 0x3F, 0x3F, 0x8E, 0x00, 0x9B, 0x83, /* 0xC0-0xC3 */
-	0x8A, 0x00, 0x93, 0x00, 0x96, 0x00, 0x9B, 0x84, /* 0xC4-0xC7 */
+	0xED, 0x8B, 0x3F, 0x3F, 0x8E, 0xE2, 0x9B, 0x83, /* 0xC0-0xC3 */
+	0x8A, 0xF1, 0x93, 0xD0, 0x96, 0xA7, 0x9B, 0x84, /* 0xC4-0xC7 */
 	0x3F, 0x3F, 0x9B, 0x85, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC8-0xCB */
 	0x95, 0x78, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */
-	0x9B, 0x87, 0x3F, 0x3F, 0x8A, 0x00, 0x8B, 0x00, /* 0xD0-0xD3 */
+	0x9B, 0x87, 0x3F, 0x3F, 0x8A, 0xA6, 0x8B, 0xF5, /* 0xD0-0xD3 */
 	0x9B, 0x86, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */
-	0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x8A, 0x00, /* 0xD8-0xDB */
+	0xED, 0x8D, 0x3F, 0x3F, 0x3F, 0x3F, 0x8A, 0xB0, /* 0xD8-0xDB */
 	0x3F, 0x3F, 0x90, 0x51, 0x9B, 0x8B, 0x8E, 0x40, /* 0xDC-0xDF */
-	0x3F, 0x3F, 0x89, 0x00, 0x9B, 0x8A, 0x3F, 0x3F, /* 0xE0-0xE3 */
+	0x3F, 0x3F, 0x89, 0xC7, 0x9B, 0x8A, 0x3F, 0x3F, /* 0xE0-0xE3 */
 	0x9B, 0x88, 0x9B, 0x8C, 0x9B, 0x89, 0x94, 0x4A, /* 0xE4-0xE7 */
-	0x9E, 0x00, 0x90, 0x52, 0x3F, 0x3F, 0x9B, 0x8D, /* 0xE8-0xEB */
-	0x00, 0x00, 0x3F, 0x3F, 0x97, 0x00, 0x3F, 0x3F, /* 0xEC-0xEF */
+	0x9E, 0xCB, 0x90, 0x52, 0x3F, 0x3F, 0x9B, 0x8D, /* 0xE8-0xEB */
+	0xED, 0x8E, 0x3F, 0x3F, 0x97, 0xBE, 0x3F, 0x3F, /* 0xEC-0xEF */
 	0x9B, 0x8E, 0x3F, 0x3F, 0x3F, 0x3F, 0x9B, 0x90, /* 0xF0-0xF3 */
 	0x3F, 0x3F, 0x92, 0x9E, 0x9B, 0x8F, 0x3F, 0x3F, /* 0xF4-0xF7 */
-	0x90, 0x00, 0x3F, 0x3F, 0x8E, 0x9B, 0x3F, 0x3F, /* 0xF8-0xFB */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x91, 0x00, 0x8E, 0x00, /* 0xFC-0xFF */
+	0x90, 0xA1, 0x3F, 0x3F, 0x8E, 0x9B, 0x3F, 0x3F, /* 0xF8-0xFB */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x91, 0xCE, 0x8E, 0xF5, /* 0xFC-0xFF */
 };
 
 static unsigned char u2c_5C[512] = {
-	0x3F, 0x3F, 0x95, 0x95, 0x90, 0x00, 0x3F, 0x3F, /* 0x00-0x03 */
-	0x8E, 0x00, 0x9B, 0x91, 0x8F, 0x00, 0x9B, 0x92, /* 0x04-0x07 */
-	0x9B, 0x93, 0x88, 0x00, 0x91, 0x00, 0x90, 0x71, /* 0x08-0x0B */
-	0x3F, 0x3F, 0x9B, 0x94, 0x93, 0x00, 0x8F, 0x00, /* 0x0C-0x0F */
-	0x3F, 0x3F, 0x8F, 0x00, 0x3F, 0x3F, 0x9B, 0x95, /* 0x10-0x13 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x90, 0x00, 0x3F, 0x3F, /* 0x14-0x17 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x8F, 0x00, 0x3F, 0x3F, /* 0x18-0x1B */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0x1C-0x1F */
+	0x3F, 0x3F, 0x95, 0x95, 0x90, 0xEA, 0x3F, 0x3F, /* 0x00-0x03 */
+	0x8E, 0xCB, 0x9B, 0x91, 0x8F, 0xAB, 0x9B, 0x92, /* 0x04-0x07 */
+	0x9B, 0x93, 0x88, 0xD1, 0x91, 0xB8, 0x90, 0x71, /* 0x08-0x0B */
+	0x3F, 0x3F, 0x9B, 0x94, 0x93, 0xB1, 0x8F, 0xAC, /* 0x0C-0x0F */
+	0x3F, 0x3F, 0x8F, 0xAD, 0x3F, 0x3F, 0x9B, 0x95, /* 0x10-0x13 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x90, 0xEB, 0x3F, 0x3F, /* 0x14-0x17 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x8F, 0xAE, 0x3F, 0x3F, /* 0x18-0x1B */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xED, 0x8F, 0x3F, 0x3F, /* 0x1C-0x1F */
 	0x9B, 0x96, 0x3F, 0x3F, 0x9B, 0x97, 0x3F, 0x3F, /* 0x20-0x23 */
-	0x96, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */
+	0x96, 0xDE, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */
 	0x9B, 0x98, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */
-	0x3F, 0x3F, 0x8B, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */
+	0x3F, 0x3F, 0x8B, 0xC4, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */
 	0x3F, 0x3F, 0x8F, 0x41, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */
-	0x9B, 0x99, 0x9B, 0x9A, 0x8E, 0x00, 0x90, 0x4B, /* 0x38-0x3B */
-	0x93, 0x00, 0x90, 0x73, 0x94, 0x00, 0x94, 0x41, /* 0x3C-0x3F */
-	0x8B, 0x00, 0x9B, 0x9B, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */
+	0x9B, 0x99, 0x9B, 0x9A, 0x8E, 0xDA, 0x90, 0x4B, /* 0x38-0x3B */
+	0x93, 0xF2, 0x90, 0x73, 0x94, 0xF6, 0x94, 0x41, /* 0x3C-0x3F */
+	0x8B, 0xC7, 0x9B, 0x9B, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */
 	0x3F, 0x3F, 0x8B, 0x8F, 0x9B, 0x9C, 0x3F, 0x3F, /* 0x44-0x47 */
-	0x8B, 0x00, 0x3F, 0x3F, 0x93, 0x00, 0x89, 0x00, /* 0x48-0x4B */
-	0x3F, 0x3F, 0x8E, 0x72, 0x9B, 0x9D, 0x9B, 0x00, /* 0x4C-0x4F */
-	0x9B, 0x9F, 0x8B, 0x00, 0x3F, 0x3F, 0x9B, 0x9E, /* 0x50-0x53 */
+	0x8B, 0xFC, 0x3F, 0x3F, 0x93, 0xCD, 0x89, 0xAE, /* 0x48-0x4B */
+	0x3F, 0x3F, 0x8E, 0x72, 0x9B, 0x9D, 0x9B, 0xA0, /* 0x4C-0x4F */
+	0x9B, 0x9F, 0x8B, 0xFB, 0x3F, 0x3F, 0x9B, 0x9E, /* 0x50-0x53 */
 	0x3F, 0x3F, 0x93, 0x57, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x91, 0x00, 0x3F, 0x3F, /* 0x5C-0x5F */
-	0x93, 0x6A, 0x8E, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x60-0x63 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x91, 0xAE, 0x3F, 0x3F, /* 0x5C-0x5F */
+	0x93, 0x6A, 0x8E, 0xC6, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x60-0x63 */
 	0x91, 0x77, 0x97, 0x9A, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x68-0x6B */
-	0x9B, 0x00, 0x3F, 0x3F, 0x9B, 0x00, 0x93, 0x00, /* 0x6C-0x6F */
+	0x9B, 0xA2, 0x3F, 0x3F, 0x9B, 0xA3, 0x93, 0xD4, /* 0x6C-0x6F */
 	0x3F, 0x3F, 0x8E, 0x52, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x9B, 0x00, 0x3F, 0x3F, /* 0x74-0x77 */
-	0x3F, 0x3F, 0x9B, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x9B, 0xA5, 0x3F, 0x3F, /* 0x74-0x77 */
+	0x3F, 0x3F, 0x9B, 0xA6, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */
 	
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x88-0x8B */
-	0x9B, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */
-	0x8A, 0x00, 0x9B, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */
-	0x9B, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */
+	0x9B, 0xA7, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */
+	0x8A, 0xF2, 0x9B, 0xA8, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */
+	0x9B, 0xA9, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */
-	0x3F, 0x3F, 0x89, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0xA4-0xA7 */
-	0x91, 0x5A, 0x8A, 0x00, 0x3F, 0x3F, 0x9B, 0x00, /* 0xA8-0xAB */
-	0x96, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */
-	0x3F, 0x3F, 0x91, 0x00, 0x3F, 0x3F, 0x8A, 0x78, /* 0xB0-0xB3 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x9B, 0x00, 0x9B, 0x00, /* 0xB4-0xB7 */
-	0x8A, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x9B, 0x00, /* 0xB8-0xBB */
-	0x9B, 0x00, 0x3F, 0x3F, 0x9B, 0x00, 0x3F, 0x3F, /* 0xBC-0xBF */
+	0x3F, 0x3F, 0x89, 0xAA, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xED, 0x90, 0x3F, 0x3F, /* 0xA4-0xA7 */
+	0x91, 0x5A, 0x8A, 0xE2, 0x3F, 0x3F, 0x9B, 0xAB, /* 0xA8-0xAB */
+	0x96, 0xA6, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */
+	0x3F, 0x3F, 0x91, 0xD0, 0x3F, 0x3F, 0x8A, 0x78, /* 0xB0-0xB3 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x9B, 0xAD, 0x9B, 0xAF, /* 0xB4-0xB7 */
+	0x8A, 0xDD, 0x3F, 0x3F, 0xED, 0x91, 0x9B, 0xAC, /* 0xB8-0xBB */
+	0x9B, 0xAE, 0x3F, 0x3F, 0x9B, 0xB1, 0x3F, 0x3F, /* 0xBC-0xBF */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */
-	0x3F, 0x3F, 0x9B, 0x00, 0x3F, 0x3F, 0x9B, 0x00, /* 0xC4-0xC7 */
+	0x3F, 0x3F, 0x9B, 0xB0, 0x3F, 0x3F, 0x9B, 0xB2, /* 0xC4-0xC7 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC8-0xCB */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */
-	0x3F, 0x3F, 0x9B, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */
+	0x3F, 0x3F, 0x9B, 0xB3, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xDC-0xDF */
-	0x93, 0x00, 0x8B, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */
+	0x93, 0xBB, 0x8B, 0xAC, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */
-	0x89, 0x00, 0x9B, 0x00, 0x9B, 0x00, 0x3F, 0x3F, /* 0xE8-0xEB */
-	0x3F, 0x3F, 0x9B, 0x00, 0x3F, 0x3F, 0x95, 0x00, /* 0xEC-0xEF */
-	0x95, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */
-	0x3F, 0x3F, 0x00, 0x00, 0x93, 0x87, 0x3F, 0x3F, /* 0xF4-0xF7 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x9B, 0x00, 0x8F, 0x73, /* 0xF8-0xFB */
-	0x3F, 0x3F, 0x9B, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */
+	0x89, 0xE3, 0x9B, 0xB4, 0x9B, 0xB9, 0x3F, 0x3F, /* 0xE8-0xEB */
+	0x3F, 0x3F, 0x9B, 0xB7, 0x3F, 0x3F, 0x95, 0xF5, /* 0xEC-0xEF */
+	0x95, 0xF4, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */
+	0x3F, 0x3F, 0xED, 0x92, 0x93, 0x87, 0x3F, 0x3F, /* 0xF4-0xF7 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x9B, 0xB6, 0x8F, 0x73, /* 0xF8-0xFB */
+	0x3F, 0x3F, 0x9B, 0xB5, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */
 };
 
 static unsigned char u2c_5D[512] = {
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x90, 0x92, /* 0x04-0x07 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x9B, 0x00, /* 0x08-0x0B */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x8D, 0x00, 0x3F, 0x3F, /* 0x0C-0x0F */
-	0x3F, 0x3F, 0x9B, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */
-	0x9B, 0x00, 0x9B, 0x00, 0x8A, 0x52, 0x9B, 0x00, /* 0x14-0x17 */
-	0x9B, 0x00, 0x9B, 0x00, 0x9B, 0x00, 0x9B, 0x00, /* 0x18-0x1B */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x9B, 0x00, /* 0x1C-0x1F */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x9B, 0x00, 0x3F, 0x3F, /* 0x20-0x23 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0x24-0x27 */
-	0x3F, 0x3F, 0x95, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x9B, 0xBA, /* 0x08-0x0B */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x8D, 0xE8, 0x3F, 0x3F, /* 0x0C-0x0F */
+	0x3F, 0x3F, 0x9B, 0xC0, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */
+	0x9B, 0xC1, 0x9B, 0xBB, 0x8A, 0x52, 0x9B, 0xBC, /* 0x14-0x17 */
+	0x9B, 0xC5, 0x9B, 0xC4, 0x9B, 0xC3, 0x9B, 0xBF, /* 0x18-0x1B */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x9B, 0xBE, /* 0x1C-0x1F */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x9B, 0xC2, 0x3F, 0x3F, /* 0x20-0x23 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xED, 0x93, /* 0x24-0x27 */
+	0x3F, 0x3F, 0x95, 0xF6, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x38-0x3B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0x40-0x43 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xED, 0x96, 0x3F, 0x3F, /* 0x40-0x43 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x9B, 0x00, /* 0x48-0x4B */
-	0x9B, 0x00, 0x3F, 0x3F, 0x9B, 0x00, 0x3F, 0x3F, /* 0x4C-0x4F */
-	0x97, 0x92, 0x3F, 0x3F, 0x9B, 0x00, 0x00, 0x00, /* 0x50-0x53 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x9B, 0xC9, /* 0x48-0x4B */
+	0x9B, 0xC6, 0x3F, 0x3F, 0x9B, 0xC8, 0x3F, 0x3F, /* 0x4C-0x4F */
+	0x97, 0x92, 0x3F, 0x3F, 0x9B, 0xC7, 0xED, 0x94, /* 0x50-0x53 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */
-	0x9B, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x5C-0x5F */
+	0x9B, 0xBD, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x5C-0x5F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x60-0x63 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */
 	0x3F, 0x3F, 0x90, 0x93, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x68-0x6B */
-	0x9B, 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x8D, 0x00, /* 0x6C-0x6F */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x9B, 0x00, /* 0x70-0x73 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x9B, 0x00, 0x3F, 0x3F, /* 0x74-0x77 */
+	0x9B, 0xCA, 0xED, 0x97, 0x3F, 0x3F, 0x8D, 0xB5, /* 0x6C-0x6F */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x9B, 0xCB, /* 0x70-0x73 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x9B, 0xCC, 0x3F, 0x3F, /* 0x74-0x77 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */
 	
-	0x3F, 0x3F, 0x3F, 0x3F, 0x9B, 0x00, 0x3F, 0x3F, /* 0x80-0x83 */
-	0x9B, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x9B, 0x00, /* 0x84-0x87 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x9B, 0xCF, 0x3F, 0x3F, /* 0x80-0x83 */
+	0x9B, 0xCE, 0x3F, 0x3F, 0x3F, 0x3F, 0x9B, 0xCD, /* 0x84-0x87 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x93, 0x88, /* 0x88-0x8B */
-	0x9B, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */
-	0x9B, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */
+	0x9B, 0xB8, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */
+	0x9B, 0xD5, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */
-	0x3F, 0x3F, 0x9B, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x9B, 0x00, 0x3F, 0x3F, /* 0xA0-0xA3 */
+	0x3F, 0x3F, 0x9B, 0xD1, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x9B, 0xD0, 0x3F, 0x3F, /* 0xA0-0xA3 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */
-	0x9B, 0x00, 0x3F, 0x3F, 0x9B, 0x00, 0x3F, 0x3F, /* 0xAC-0xAF */
+	0x9B, 0xD2, 0x3F, 0x3F, 0x9B, 0xD3, 0x3F, 0x3F, /* 0xAC-0xAF */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB0-0xB3 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x9B, 0x00, /* 0xB4-0xB7 */
-	0x00, 0x00, 0x00, 0x00, 0x97, 0x00, 0x3F, 0x3F, /* 0xB8-0xBB */
-	0x9B, 0x00, 0x9B, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x9B, 0xD6, /* 0xB4-0xB7 */
+	0xED, 0x98, 0xED, 0x99, 0x97, 0xE4, 0x3F, 0x3F, /* 0xB8-0xBB */
+	0x9B, 0xD7, 0x9B, 0xD4, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC4-0xC7 */
-	0x3F, 0x3F, 0x9B, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC8-0xCB */
-	0x8A, 0x00, 0x9B, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */
-	0x00, 0x00, 0x3F, 0x3F, 0x9B, 0x00, 0x9B, 0x00, /* 0xD0-0xD3 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x9B, 0x00, 0x3F, 0x3F, /* 0xD4-0xD7 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x9B, 0x00, /* 0xD8-0xDB */
-	0x3F, 0x3F, 0x90, 0x00, 0x8F, 0x42, 0x3F, 0x3F, /* 0xDC-0xDF */
+	0x3F, 0x3F, 0x9B, 0xD8, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC8-0xCB */
+	0x8A, 0xDE, 0x9B, 0xD9, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */
+	0xED, 0x9A, 0x3F, 0x3F, 0x9B, 0xDB, 0x9B, 0xDA, /* 0xD0-0xD3 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x9B, 0xDC, 0x3F, 0x3F, /* 0xD4-0xD7 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x9B, 0xDD, /* 0xD8-0xDB */
+	0x3F, 0x3F, 0x90, 0xEC, 0x8F, 0x42, 0x3F, 0x3F, /* 0xDC-0xDF */
 	0x3F, 0x3F, 0x8F, 0x84, 0x3F, 0x3F, 0x91, 0x83, /* 0xE0-0xE3 */
-	0x3F, 0x3F, 0x8D, 0x48, 0x8D, 0x00, 0x8D, 0x49, /* 0xE4-0xE7 */
-	0x8B, 0x90, 0x3F, 0x3F, 0x3F, 0x3F, 0x9B, 0x00, /* 0xE8-0xEB */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x8D, 0x00, 0x3F, 0x3F, /* 0xEC-0xEF */
-	0x3F, 0x3F, 0x8C, 0x00, 0x9B, 0x00, 0x96, 0x00, /* 0xF0-0xF3 */
-	0x94, 0x62, 0x9B, 0x00, 0x3F, 0x3F, 0x8D, 0x4A, /* 0xF4-0xF7 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x8A, 0x00, /* 0xF8-0xFB */
-	0x3F, 0x3F, 0x92, 0x46, 0x8B, 0x00, 0x3F, 0x3F, /* 0xFC-0xFF */
+	0x3F, 0x3F, 0x8D, 0x48, 0x8D, 0xB6, 0x8D, 0x49, /* 0xE4-0xE7 */
+	0x8B, 0x90, 0x3F, 0x3F, 0x3F, 0x3F, 0x9B, 0xDE, /* 0xE8-0xEB */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x8D, 0xB7, 0x3F, 0x3F, /* 0xEC-0xEF */
+	0x3F, 0x3F, 0x8C, 0xC8, 0x9B, 0xDF, 0x96, 0xA4, /* 0xF0-0xF3 */
+	0x94, 0x62, 0x9B, 0xE0, 0x3F, 0x3F, 0x8D, 0x4A, /* 0xF4-0xF7 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x8A, 0xAA, /* 0xF8-0xFB */
+	0x3F, 0x3F, 0x92, 0x46, 0x8B, 0xD0, 0x3F, 0x3F, /* 0xFC-0xFF */
 };
 
 static unsigned char u2c_5E[512] = {
 	0x3F, 0x3F, 0x3F, 0x3F, 0x8E, 0x73, 0x95, 0x7A, /* 0x00-0x03 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x94, 0x00, 0x3F, 0x3F, /* 0x04-0x07 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x9B, 0x00, /* 0x08-0x0B */
-	0x8A, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */
-	0x3F, 0x3F, 0x9B, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x94, 0xBF, 0x3F, 0x3F, /* 0x04-0x07 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x9B, 0xE1, /* 0x08-0x0B */
+	0x8A, 0xF3, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */
+	0x3F, 0x3F, 0x9B, 0xE4, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x92, 0x9F, 0x3F, 0x3F, /* 0x14-0x17 */
-	0x3F, 0x3F, 0x9B, 0x00, 0x9B, 0x00, 0x9B, 0x00, /* 0x18-0x1B */
-	0x3F, 0x3F, 0x92, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */
+	0x3F, 0x3F, 0x9B, 0xE3, 0x9B, 0xE2, 0x9B, 0xE5, /* 0x18-0x1B */
+	0x3F, 0x3F, 0x92, 0xE9, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */
 	0x3F, 0x3F, 0x90, 0x83, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x8E, 0x74, /* 0x28-0x2B */
-	0x3F, 0x3F, 0x90, 0x00, 0x3F, 0x3F, 0x91, 0x00, /* 0x2C-0x2F */
-	0x8B, 0x41, 0x3F, 0x3F, 0x3F, 0x3F, 0x92, 0x00, /* 0x30-0x33 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x9B, 0x00, 0x9B, 0x00, /* 0x34-0x37 */
-	0x8F, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x38-0x3B */
+	0x3F, 0x3F, 0x90, 0xC8, 0x3F, 0x3F, 0x91, 0xD1, /* 0x2C-0x2F */
+	0x8B, 0x41, 0x3F, 0x3F, 0x3F, 0x3F, 0x92, 0xA0, /* 0x30-0x33 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x9B, 0xE6, 0x9B, 0xE7, /* 0x34-0x37 */
+	0x8F, 0xED, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x38-0x3B */
 	0x3F, 0x3F, 0x96, 0x58, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */
-	0x9B, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x9B, 0x00, /* 0x40-0x43 */
-	0x9B, 0x00, 0x95, 0x9D, 0x3F, 0x3F, 0x9B, 0x00, /* 0x44-0x47 */
+	0x9B, 0xEA, 0x3F, 0x3F, 0x3F, 0x3F, 0x9B, 0xE9, /* 0x40-0x43 */
+	0x9B, 0xE8, 0x95, 0x9D, 0x3F, 0x3F, 0x9B, 0xF1, /* 0x44-0x47 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */
-	0x96, 0x79, 0x3F, 0x3F, 0x9B, 0x00, 0x3F, 0x3F, /* 0x4C-0x4F */
+	0x96, 0x79, 0x3F, 0x3F, 0x9B, 0xEB, 0x3F, 0x3F, /* 0x4C-0x4F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */
-	0x9B, 0x00, 0x96, 0x8B, 0x3F, 0x3F, 0x9B, 0x00, /* 0x54-0x57 */
+	0x9B, 0xED, 0x96, 0x8B, 0x3F, 0x3F, 0x9B, 0xEC, /* 0x54-0x57 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x9B, 0x00, /* 0x5C-0x5F */
-	0x3F, 0x3F, 0x94, 0x00, 0x9B, 0x00, 0x95, 0x00, /* 0x60-0x63 */
-	0x9B, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x9B, 0xEE, /* 0x5C-0x5F */
+	0x3F, 0x3F, 0x94, 0xA6, 0x9B, 0xEF, 0x95, 0xBC, /* 0x60-0x63 */
+	0x9B, 0xF0, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x68-0x6B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x8A, 0x00, 0x95, 0x00, /* 0x70-0x73 */
-	0x94, 0x4E, 0x9B, 0x00, 0x9B, 0x00, 0x3F, 0x3F, /* 0x74-0x77 */
-	0x8D, 0x4B, 0x8A, 0x00, 0x9B, 0x00, 0x8C, 0x00, /* 0x78-0x7B */
-	0x97, 0x63, 0x97, 0x48, 0x8A, 0x00, 0x9B, 0x00, /* 0x7C-0x7F */
-	
-	0x3F, 0x3F, 0x92, 0x00, 0x3F, 0x3F, 0x8D, 0x4C, /* 0x80-0x83 */
-	0x8F, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x94, 0x00, /* 0x84-0x87 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x8F, 0x00, 0x3F, 0x3F, /* 0x88-0x8B */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x8A, 0xB1, 0x95, 0xBD, /* 0x70-0x73 */
+	0x94, 0x4E, 0x9B, 0xF2, 0x9B, 0xF3, 0x3F, 0x3F, /* 0x74-0x77 */
+	0x8D, 0x4B, 0x8A, 0xB2, 0x9B, 0xF4, 0x8C, 0xB6, /* 0x78-0x7B */
+	0x97, 0x63, 0x97, 0x48, 0x8A, 0xF4, 0x9B, 0xF6, /* 0x7C-0x7F */
+	
+	0x3F, 0x3F, 0x92, 0xA1, 0x3F, 0x3F, 0x8D, 0x4C, /* 0x80-0x83 */
+	0x8F, 0xAF, 0x3F, 0x3F, 0x3F, 0x3F, 0x94, 0xDD, /* 0x84-0x87 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x8F, 0xB0, 0x3F, 0x3F, /* 0x88-0x8B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x8F, 0x98, /* 0x8C-0x8F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */
-	0x3F, 0x3F, 0x92, 0x00, 0x95, 0x00, 0x93, 0x58, /* 0x94-0x97 */
+	0x3F, 0x3F, 0x92, 0xEA, 0x95, 0xF7, 0x93, 0x58, /* 0x94-0x97 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x8D, 0x4D, 0x3F, 0x3F, /* 0x98-0x9B */
 	0x95, 0x7B, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */
-	0x9B, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x93, 0x78, 0x8D, 0x00, /* 0xA4-0xA7 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x8C, 0x00, /* 0xA8-0xAB */
-	0x3F, 0x3F, 0x92, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */
+	0x9B, 0xF7, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x93, 0x78, 0x8D, 0xC0, /* 0xA4-0xA7 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x8C, 0xC9, /* 0xA8-0xAB */
+	0x3F, 0x3F, 0x92, 0xEB, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB0-0xB3 */
-	0x3F, 0x3F, 0x88, 0x00, 0x8F, 0x8E, 0x8D, 0x4E, /* 0xB4-0xB7 */
+	0x3F, 0x3F, 0x88, 0xC1, 0x8F, 0x8E, 0x8D, 0x4E, /* 0xB4-0xB7 */
 	0x97, 0x66, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */
-	0x3F, 0x3F, 0x9B, 0x00, 0x9B, 0x00, 0x94, 0x70, /* 0xC0-0xC3 */
+	0x3F, 0x3F, 0x9B, 0xF8, 0x9B, 0xF9, 0x94, 0x70, /* 0xC0-0xC3 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC4-0xC7 */
-	0x9B, 0x00, 0x97, 0x00, 0x98, 0x4C, 0x3F, 0x3F, /* 0xC8-0xCB */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x9B, 0x00, /* 0xCC-0xCF */
-	0x9B, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x8A, 0x66, /* 0xD0-0xD3 */
+	0x9B, 0xFA, 0x97, 0xF5, 0x98, 0x4C, 0x3F, 0x3F, /* 0xC8-0xCB */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x9B, 0xFC, /* 0xCC-0xCF */
+	0x9B, 0xFB, 0x3F, 0x3F, 0x3F, 0x3F, 0x8A, 0x66, /* 0xD0-0xD3 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x9C, 0x40, 0x3F, 0x3F, /* 0xD4-0xD7 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x9C, 0x43, 0x9C, 0x44, /* 0xD8-0xDB */
 	0x3F, 0x3F, 0x9C, 0x42, 0x3F, 0x3F, 0x95, 0x5F, /* 0xDC-0xDF */
-	0x8F, 0x00, 0x9C, 0x46, 0x9C, 0x45, 0x9C, 0x41, /* 0xE0-0xE3 */
+	0x8F, 0xB1, 0x9C, 0x46, 0x9C, 0x45, 0x9C, 0x41, /* 0xE0-0xE3 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */
 	0x9C, 0x47, 0x9C, 0x48, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */
 	0x9C, 0x49, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */
 	0x9C, 0x4C, 0x9C, 0x4A, 0x3F, 0x3F, 0x9C, 0x4B, /* 0xF0-0xF3 */
-	0x9C, 0x4D, 0x3F, 0x3F, 0x89, 0x84, 0x92, 0x00, /* 0xF4-0xF7 */
-	0x9C, 0x4E, 0x3F, 0x3F, 0x8C, 0x9A, 0x89, 0x00, /* 0xF8-0xFB */
-	0x94, 0x55, 0x3F, 0x3F, 0x9C, 0x4F, 0x93, 0x00, /* 0xFC-0xFF */
+	0x9C, 0x4D, 0x3F, 0x3F, 0x89, 0x84, 0x92, 0xEC, /* 0xF4-0xF7 */
+	0x9C, 0x4E, 0x3F, 0x3F, 0x8C, 0x9A, 0x89, 0xF4, /* 0xF8-0xFB */
+	0x94, 0x55, 0x3F, 0x3F, 0x9C, 0x4F, 0x93, 0xF9, /* 0xFC-0xFF */
 };
 
 static unsigned char u2c_5F[512] = {
-	0x3F, 0x3F, 0x95, 0x00, 0x3F, 0x3F, 0x9C, 0x50, /* 0x00-0x03 */
+	0x3F, 0x3F, 0x95, 0xD9, 0x3F, 0x3F, 0x9C, 0x50, /* 0x00-0x03 */
 	0x98, 0x4D, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x04-0x07 */
-	0x3F, 0x3F, 0x9C, 0x51, 0x95, 0x00, 0x9C, 0x54, /* 0x08-0x0B */
-	0x98, 0x9F, 0x98, 0x00, 0x3F, 0x3F, 0x8E, 0x00, /* 0x0C-0x0F */
-	0x93, 0x00, 0x9C, 0x55, 0x3F, 0x3F, 0x8B, 0x7C, /* 0x10-0x13 */
-	0x92, 0x00, 0x88, 0x00, 0x9C, 0x56, 0x95, 0x00, /* 0x14-0x17 */
+	0x3F, 0x3F, 0x9C, 0x51, 0x95, 0xBE, 0x9C, 0x54, /* 0x08-0x0B */
+	0x98, 0x9F, 0x98, 0xAF, 0x3F, 0x3F, 0x8E, 0xAE, /* 0x0C-0x0F */
+	0x93, 0xF3, 0x9C, 0x55, 0x3F, 0x3F, 0x8B, 0x7C, /* 0x10-0x13 */
+	0x92, 0xA2, 0x88, 0xF8, 0x9C, 0x56, 0x95, 0xA4, /* 0x14-0x17 */
 	0x8D, 0x4F, 0x3F, 0x3F, 0x3F, 0x3F, 0x92, 0x6F, /* 0x18-0x1B */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x92, 0x00, /* 0x1C-0x1F */
-	0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */
-	0x3F, 0x3F, 0x96, 0x00, 0x8C, 0x00, 0x8C, 0x00, /* 0x24-0x27 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x92, 0xED, /* 0x1C-0x1F */
+	0x3F, 0x3F, 0xED, 0x9B, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */
+	0x3F, 0x3F, 0x96, 0xED, 0x8C, 0xB7, 0x8C, 0xCA, /* 0x24-0x27 */
 	0x3F, 0x3F, 0x9C, 0x57, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */
 	0x3F, 0x3F, 0x9C, 0x58, 0x3F, 0x3F, 0x9C, 0x5E, /* 0x2C-0x2F */
-	0x3F, 0x3F, 0x8E, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */
-	0x00, 0x00, 0x92, 0x00, 0x3F, 0x3F, 0x8B, 0x00, /* 0x34-0x37 */
+	0x3F, 0x3F, 0x8E, 0xE3, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */
+	0xED, 0x9C, 0x92, 0xA3, 0x3F, 0x3F, 0x8B, 0xAD, /* 0x34-0x37 */
 	0x9C, 0x59, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x38-0x3B */
 	0x95, 0x4A, 0x3F, 0x3F, 0x92, 0x65, 0x3F, 0x3F, /* 0x3C-0x3F */
 	0x3F, 0x3F, 0x9C, 0x5A, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */
-	0x3F, 0x3F, 0x00, 0x67, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */
-	0x9C, 0x5B, 0x3F, 0x3F, 0x8B, 0x00, 0x3F, 0x3F, /* 0x48-0x4B */
+	0x3F, 0x3F, 0xED, 0x4B, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */
+	0x9C, 0x5B, 0x3F, 0x3F, 0x8B, 0xAE, 0x3F, 0x3F, /* 0x48-0x4B */
 	0x9C, 0x5C, 0x3F, 0x3F, 0x9C, 0x5D, 0x3F, 0x3F, /* 0x4C-0x4F */
 	0x3F, 0x3F, 0x9C, 0x5F, 0x3F, 0x3F, 0x93, 0x96, /* 0x50-0x53 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x9C, 0x60, 0x9C, 0x61, /* 0x54-0x57 */
 	0x3F, 0x3F, 0x9C, 0x62, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */
 	0x9C, 0x53, 0x9C, 0x52, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x5C-0x5F */
 	0x3F, 0x3F, 0x9C, 0x63, 0x8C, 0x60, 0x3F, 0x3F, /* 0x60-0x63 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x95, 0x46, 0x00, 0x00, /* 0x64-0x67 */
-	0x3F, 0x3F, 0x8D, 0x00, 0x95, 0x56, 0x92, 0x00, /* 0x68-0x6B */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x95, 0x46, 0xED, 0x9D, /* 0x64-0x67 */
+	0x3F, 0x3F, 0x8D, 0xCA, 0x95, 0x56, 0x92, 0xA4, /* 0x68-0x6B */
 	0x95, 0x6A, 0x9C, 0x64, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */
-	0x8F, 0x00, 0x89, 0x65, 0x3F, 0x3F, 0x9C, 0x65, /* 0x70-0x73 */
+	0x8F, 0xB2, 0x89, 0x65, 0x3F, 0x3F, 0x9C, 0x65, /* 0x70-0x73 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x9C, 0x66, /* 0x74-0x77 */
-	0x3F, 0x3F, 0x96, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */
-	0x94, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x9C, 0x69, /* 0x7C-0x7F */
+	0x3F, 0x3F, 0x96, 0xF0, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */
+	0x94, 0xDE, 0x3F, 0x3F, 0x3F, 0x3F, 0x9C, 0x69, /* 0x7C-0x7F */
 	
-	0x89, 0x9D, 0x90, 0x00, 0x9C, 0x68, 0x9C, 0x67, /* 0x80-0x83 */
-	0x8C, 0x61, 0x91, 0x00, 0x3F, 0x3F, 0x9C, 0x6D, /* 0x84-0x87 */
-	0x9C, 0x6B, 0x3F, 0x3F, 0x9C, 0x6A, 0x97, 0x00, /* 0x88-0x8B */
-	0x8C, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */
+	0x89, 0x9D, 0x90, 0xAA, 0x9C, 0x68, 0x9C, 0x67, /* 0x80-0x83 */
+	0x8C, 0x61, 0x91, 0xD2, 0x3F, 0x3F, 0x9C, 0x6D, /* 0x84-0x87 */
+	0x9C, 0x6B, 0x3F, 0x3F, 0x9C, 0x6A, 0x97, 0xA5, /* 0x88-0x8B */
+	0x8C, 0xE3, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */
 	0x8F, 0x99, 0x9C, 0x6C, 0x93, 0x6B, 0x8F, 0x5D, /* 0x90-0x93 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x93, 0x00, /* 0x94-0x97 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x93, 0xBE, /* 0x94-0x97 */
 	0x9C, 0x70, 0x9C, 0x6F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x9C, 0x6E, 0x3F, 0x3F, /* 0x9C-0x9F */
-	0x9C, 0x71, 0x8C, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */
+	0x9C, 0x71, 0x8C, 0xE4, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */
 	0x9C, 0x72, 0x95, 0x9C, 0x8F, 0x7A, 0x3F, 0x3F, /* 0xA8-0xAB */
-	0x3F, 0x3F, 0x9C, 0x73, 0x94, 0x00, 0x3F, 0x3F, /* 0xAC-0xAF */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x93, 0x00, /* 0xB0-0xB3 */
-	0x92, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0xB4-0xB7 */
+	0x3F, 0x3F, 0x9C, 0x73, 0x94, 0xF7, 0x3F, 0x3F, /* 0xAC-0xAF */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x93, 0xBF, /* 0xB0-0xB3 */
+	0x92, 0xA5, 0x3F, 0x3F, 0x3F, 0x3F, 0xED, 0x9E, /* 0xB4-0xB7 */
 	0x3F, 0x3F, 0x93, 0x4F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */
 	0x9C, 0x74, 0x8B, 0x4A, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x90, 0x53, /* 0xC0-0xC3 */
 	0x3F, 0x3F, 0x95, 0x4B, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC4-0xC7 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC8-0xCB */
-	0x8A, 0x00, 0x94, 0x45, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */
+	0x8A, 0xF5, 0x94, 0x45, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x9C, 0x75, 0x8E, 0x75, /* 0xD4-0xD7 */
 	0x96, 0x59, 0x96, 0x5A, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */
-	0x89, 0x9E, 0x9C, 0x7A, 0x00, 0x00, 0x3F, 0x3F, /* 0xDC-0xDF */
+	0x89, 0x9E, 0x9C, 0x7A, 0xED, 0x9F, 0x3F, 0x3F, /* 0xDC-0xDF */
 	0x92, 0x89, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */
 	0x9C, 0x77, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x89, 0x00, /* 0xE8-0xEB */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x89, 0xF5, /* 0xE8-0xEB */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */
-	0x9C, 0x00, 0x9C, 0x79, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */
+	0x9C, 0xAB, 0x9C, 0x79, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */
 	0x3F, 0x3F, 0x94, 0x4F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */
 	0x9C, 0x78, 0x3F, 0x3F, 0x3F, 0x3F, 0x9C, 0x76, /* 0xF8-0xFB */
 	0x3F, 0x3F, 0x8D, 0x9A, 0x3F, 0x3F, 0x9C, 0x7C, /* 0xFC-0xFF */
@@ -5154,191 +5156,191 @@
 	0x9C, 0x81, 0x3F, 0x3F, 0x93, 0x7B, 0x3F, 0x3F, /* 0x10-0x13 */
 	0x3F, 0x3F, 0x9C, 0x86, 0x95, 0x7C, 0x3F, 0x3F, /* 0x14-0x17 */
 	0x3F, 0x3F, 0x9C, 0x80, 0x3F, 0x3F, 0x9C, 0x85, /* 0x18-0x1B */
-	0x97, 0x00, 0x8E, 0x76, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */
-	0x91, 0x00, 0x9C, 0x7D, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */
-	0x3F, 0x3F, 0x8B, 0x7D, 0x9C, 0x88, 0x90, 0x00, /* 0x24-0x27 */
-	0x89, 0x85, 0x9C, 0x82, 0x89, 0x00, 0x9C, 0x87, /* 0x28-0x2B */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x8B, 0x00, /* 0x2C-0x2F */
+	0x97, 0xE5, 0x8E, 0x76, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */
+	0x91, 0xD3, 0x9C, 0x7D, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */
+	0x3F, 0x3F, 0x8B, 0x7D, 0x9C, 0x88, 0x90, 0xAB, /* 0x24-0x27 */
+	0x89, 0x85, 0x9C, 0x82, 0x89, 0xF6, 0x9C, 0x87, /* 0x28-0x2B */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x8B, 0xAF, /* 0x2C-0x2F */
 	0x3F, 0x3F, 0x9C, 0x84, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x9C, 0x8A, 0x3F, 0x3F, /* 0x38-0x3B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */
 	0x3F, 0x3F, 0x9C, 0x8C, 0x9C, 0x96, 0x9C, 0x94, /* 0x40-0x43 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x9C, 0x91, 0x3F, 0x3F, /* 0x44-0x47 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x9C, 0x90, 0x97, 0x00, /* 0x48-0x4B */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x9C, 0x90, 0x97, 0xF6, /* 0x48-0x4B */
 	0x3F, 0x3F, 0x9C, 0x92, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x4C-0x4F */
-	0x8B, 0x00, 0x3F, 0x3F, 0x8D, 0x50, 0x3F, 0x3F, /* 0x50-0x53 */
+	0x8B, 0xB0, 0x3F, 0x3F, 0x8D, 0x50, 0x3F, 0x3F, /* 0x50-0x53 */
 	0x3F, 0x3F, 0x8F, 0x9A, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */
 	0x3F, 0x3F, 0x9C, 0x99, 0x9C, 0x8B, 0x3F, 0x3F, /* 0x58-0x5B */
-	0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, 0x9C, 0x8F, /* 0x5C-0x5F */
-	0x9C, 0x7E, 0x3F, 0x3F, 0x89, 0x00, 0x9C, 0x93, /* 0x60-0x63 */
+	0x3F, 0x3F, 0xED, 0xA0, 0x3F, 0x3F, 0x9C, 0x8F, /* 0x5C-0x5F */
+	0x9C, 0x7E, 0x3F, 0x3F, 0x89, 0xF8, 0x9C, 0x93, /* 0x60-0x63 */
 	0x9C, 0x95, 0x92, 0x70, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */
-	0x8D, 0x00, 0x89, 0x00, 0x9C, 0x8D, 0x9C, 0x98, /* 0x68-0x6B */
-	0x9C, 0x97, 0x8B, 0x00, 0x3F, 0x3F, 0x91, 0x00, /* 0x6C-0x6F */
+	0x8D, 0xA6, 0x89, 0xB6, 0x9C, 0x8D, 0x9C, 0x98, /* 0x68-0x6B */
+	0x9C, 0x97, 0x8B, 0xB1, 0x3F, 0x3F, 0x91, 0xA7, /* 0x6C-0x6F */
 	0x8A, 0x86, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */
 	0x3F, 0x3F, 0x8C, 0x62, 0x3F, 0x3F, 0x9C, 0x8E, /* 0x74-0x77 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */
 	
 	0x3F, 0x3F, 0x9C, 0x9A, 0x3F, 0x3F, 0x9C, 0x9D, /* 0x80-0x83 */
-	0x9C, 0x9F, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */
-	0x3F, 0x3F, 0x8E, 0x00, 0x00, 0x00, 0x9C, 0x00, /* 0x88-0x8B */
-	0x92, 0x00, 0x9C, 0x9B, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x9C, 0x00, 0x3F, 0x3F, /* 0x90-0x93 */
-	0x89, 0x00, 0x3F, 0x3F, 0x9C, 0x00, 0x9C, 0x00, /* 0x94-0x97 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x9C, 0x9E, 0x9C, 0x00, /* 0x98-0x9B */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x8C, 0x00, /* 0x9C-0x9F */
-	0x97, 0x49, 0x3F, 0x3F, 0x3F, 0x3F, 0x8A, 0x00, /* 0xA0-0xA3 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x89, 0x78, 0x9C, 0x00, /* 0xA4-0xA7 */
-	0x3F, 0x3F, 0x94, 0x59, 0x88, 0x00, 0x3F, 0x3F, /* 0xA8-0xAB */
+	0x9C, 0x9F, 0xED, 0xA1, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */
+	0x3F, 0x3F, 0x8E, 0xBB, 0xED, 0xA2, 0x9C, 0xA5, /* 0x88-0x8B */
+	0x92, 0xEE, 0x9C, 0x9B, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x9C, 0xA3, 0x3F, 0x3F, /* 0x90-0x93 */
+	0x89, 0xF7, 0x3F, 0x3F, 0x9C, 0xA1, 0x9C, 0xA2, /* 0x94-0x97 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x9C, 0x9E, 0x9C, 0xA0, /* 0x98-0x9B */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x8C, 0xE5, /* 0x9C-0x9F */
+	0x97, 0x49, 0x3F, 0x3F, 0x3F, 0x3F, 0x8A, 0xB3, /* 0xA0-0xA3 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x89, 0x78, 0x9C, 0xA4, /* 0xA4-0xA7 */
+	0x3F, 0x3F, 0x94, 0x59, 0x88, 0xAB, 0x3F, 0x3F, /* 0xA8-0xAB */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x94, 0x00, 0x9C, 0x7B, /* 0xB0-0xB3 */
-	0x9C, 0x00, 0x9C, 0x00, 0x96, 0x00, 0x3F, 0x3F, /* 0xB4-0xB7 */
-	0x9C, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */
-	0x93, 0x89, 0x9C, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x94, 0xDF, 0x9C, 0x7B, /* 0xB0-0xB3 */
+	0x9C, 0xAA, 0x9C, 0xAE, 0x96, 0xE3, 0x3F, 0x3F, /* 0xB4-0xB7 */
+	0x9C, 0xA7, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */
+	0x93, 0x89, 0x9C, 0xAC, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */
-	0x3F, 0x3F, 0x8F, 0x00, 0x9C, 0x00, 0x93, 0x00, /* 0xC4-0xC7 */
+	0x3F, 0x3F, 0x8F, 0xEE, 0x9C, 0xAD, 0x93, 0xD5, /* 0xC4-0xC7 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC8-0xCB */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */
-	0x3F, 0x3F, 0x98, 0x66, 0x3F, 0x3F, 0x9C, 0x00, /* 0xD0-0xD3 */
-	0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */
-	0x9C, 0x00, 0x3F, 0x3F, 0x8D, 0x9B, 0x3F, 0x3F, /* 0xD8-0xDB */
-	0x90, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x88, 0x00, /* 0xDC-0xDF */
-	0x9C, 0x00, 0x9C, 0x00, 0x3F, 0x3F, 0x91, 0x79, /* 0xE0-0xE3 */
+	0x3F, 0x3F, 0x98, 0x66, 0x3F, 0x3F, 0x9C, 0xA9, /* 0xD0-0xD3 */
+	0x3F, 0x3F, 0xED, 0xA4, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */
+	0x9C, 0xAF, 0x3F, 0x3F, 0x8D, 0x9B, 0x3F, 0x3F, /* 0xD8-0xDB */
+	0x90, 0xC9, 0x3F, 0x3F, 0xED, 0xA3, 0x88, 0xD2, /* 0xDC-0xDF */
+	0x9C, 0xA8, 0x9C, 0xA6, 0x3F, 0x3F, 0x91, 0x79, /* 0xE0-0xE3 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x9C, 0x9C, /* 0xE4-0xE7 */
 	0x8E, 0x53, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */
-	0x91, 0x00, 0x9C, 0x00, 0x00, 0x00, 0x91, 0x7A, /* 0xF0-0xF3 */
-	0x9C, 0x00, 0x3F, 0x3F, 0x9C, 0x00, 0x9C, 0x00, /* 0xF4-0xF7 */
-	0x3F, 0x3F, 0x8E, 0x00, 0x9C, 0x00, 0x9C, 0x00, /* 0xF8-0xFB */
+	0x91, 0xC4, 0x9C, 0xBB, 0xED, 0xA6, 0x91, 0x7A, /* 0xF0-0xF3 */
+	0x9C, 0xB6, 0x3F, 0x3F, 0x9C, 0xB3, 0x9C, 0xB4, /* 0xF4-0xF7 */
+	0x3F, 0x3F, 0x8E, 0xE4, 0x9C, 0xB7, 0x9C, 0xBA, /* 0xF8-0xFB */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */
 };
 
 static unsigned char u2c_61[512] = {
-	0x9C, 0x00, 0x8F, 0x44, 0x3F, 0x3F, 0x9C, 0x00, /* 0x00-0x03 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x9C, 0x00, 0x3F, 0x3F, /* 0x04-0x07 */
-	0x96, 0x00, 0x96, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x08-0x0B */
-	0x3F, 0x3F, 0x9C, 0x00, 0x9C, 0x00, 0x88, 0x00, /* 0x0C-0x0F */
-	0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */
-	0x3F, 0x3F, 0x9C, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x8B, 0x00, 0x88, 0x00, /* 0x18-0x1B */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x8A, 0x00, /* 0x1C-0x1F */
-	0x00, 0x00, 0x9C, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x9C, 0x00, /* 0x24-0x27 */
-	0x9C, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */
-	0x9C, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */
-	0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */
-	0x9C, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0x34-0x37 */
+	0x9C, 0xB5, 0x8F, 0x44, 0x3F, 0x3F, 0x9C, 0xB8, /* 0x00-0x03 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x9C, 0xB2, 0x3F, 0x3F, /* 0x04-0x07 */
+	0x96, 0xFA, 0x96, 0xF9, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x08-0x0B */
+	0x3F, 0x3F, 0x9C, 0xBC, 0x9C, 0xBD, 0x88, 0xD3, /* 0x0C-0x0F */
+	0x3F, 0x3F, 0xED, 0xA7, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */
+	0x3F, 0x3F, 0x9C, 0xB1, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x8B, 0xF0, 0x88, 0xA4, /* 0x18-0x1B */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x8A, 0xB4, /* 0x1C-0x1F */
+	0xED, 0xA5, 0x9C, 0xB9, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x9C, 0xC1, /* 0x24-0x27 */
+	0x9C, 0xC0, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */
+	0x9C, 0xC5, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */
+	0xED, 0xA9, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */
+	0x9C, 0xC6, 0x3F, 0x3F, 0x3F, 0x3F, 0xED, 0xA8, /* 0x34-0x37 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x38-0x3B */
-	0x9C, 0x00, 0x9C, 0x00, 0x9C, 0x00, 0x9C, 0x00, /* 0x3C-0x3F */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x9C, 0x00, 0x3F, 0x3F, /* 0x40-0x43 */
-	0x9C, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x9C, 0x00, /* 0x44-0x47 */
-	0x8E, 0x9C, 0x3F, 0x3F, 0x9C, 0x00, 0x91, 0x00, /* 0x48-0x4B */
-	0x8D, 0x51, 0x9C, 0x00, 0x90, 0x54, 0x3F, 0x3F, /* 0x4C-0x4F */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x9C, 0x00, /* 0x50-0x53 */
-	0x3F, 0x3F, 0x95, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */
-	0x9C, 0x00, 0x9C, 0x00, 0x9C, 0x00, 0x3F, 0x3F, /* 0x58-0x5B */
-	0x3F, 0x3F, 0x9C, 0x00, 0x3F, 0x3F, 0x9C, 0x00, /* 0x5C-0x5F */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x96, 0x9D, 0x8A, 0x00, /* 0x60-0x63 */
-	0x3F, 0x3F, 0x9C, 0x00, 0x3F, 0x3F, 0x8C, 0x64, /* 0x64-0x67 */
-	0x8A, 0x53, 0x3F, 0x3F, 0x3F, 0x3F, 0x9C, 0x00, /* 0x68-0x6B */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x97, 0x00, 0x9C, 0x00, /* 0x6C-0x6F */
-	0x88, 0x00, 0x9C, 0x00, 0x3F, 0x3F, 0x9C, 0x00, /* 0x70-0x73 */
-	0x9C, 0x00, 0x9C, 0x00, 0x8C, 0x63, 0x9C, 0x00, /* 0x74-0x77 */
+	0x9C, 0xC4, 0x9C, 0xC7, 0x9C, 0xBF, 0x9C, 0xC3, /* 0x3C-0x3F */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x9C, 0xC8, 0x3F, 0x3F, /* 0x40-0x43 */
+	0x9C, 0xC9, 0x3F, 0x3F, 0x3F, 0x3F, 0x9C, 0xBE, /* 0x44-0x47 */
+	0x8E, 0x9C, 0x3F, 0x3F, 0x9C, 0xC2, 0x91, 0xD4, /* 0x48-0x4B */
+	0x8D, 0x51, 0x9C, 0xB0, 0x90, 0x54, 0x3F, 0x3F, /* 0x4C-0x4F */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x9C, 0xD6, /* 0x50-0x53 */
+	0x3F, 0x3F, 0x95, 0xE7, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */
+	0x9C, 0xCC, 0x9C, 0xCD, 0x9C, 0xCE, 0x3F, 0x3F, /* 0x58-0x5B */
+	0x3F, 0x3F, 0x9C, 0xD5, 0x3F, 0x3F, 0x9C, 0xD4, /* 0x5C-0x5F */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x96, 0x9D, 0x8A, 0xB5, /* 0x60-0x63 */
+	0x3F, 0x3F, 0x9C, 0xD2, 0x3F, 0x3F, 0x8C, 0x64, /* 0x64-0x67 */
+	0x8A, 0x53, 0x3F, 0x3F, 0x3F, 0x3F, 0x9C, 0xCF, /* 0x68-0x6B */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x97, 0xB6, 0x9C, 0xD1, /* 0x6C-0x6F */
+	0x88, 0xD4, 0x9C, 0xD3, 0x3F, 0x3F, 0x9C, 0xCA, /* 0x70-0x73 */
+	0x9C, 0xD0, 0x9C, 0xD7, 0x8C, 0x63, 0x9C, 0xCB, /* 0x74-0x77 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x97, 0x7C, 0x3F, 0x3F, /* 0x7C-0x7F */
 	
 	0x3F, 0x3F, 0x3F, 0x3F, 0x97, 0x4A, 0x3F, 0x3F, /* 0x80-0x83 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x9C, 0x00, /* 0x84-0x87 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x9C, 0x00, 0x3F, 0x3F, /* 0x88-0x8B */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x9C, 0xDA, /* 0x84-0x87 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x9C, 0xDE, 0x3F, 0x3F, /* 0x88-0x8B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x91, 0x9E, 0x3F, 0x3F, /* 0x8C-0x8F */
-	0x97, 0x00, 0x9C, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */
-	0x9C, 0x00, 0x3F, 0x3F, 0x9C, 0x00, 0x3F, 0x3F, /* 0x94-0x97 */
-	0x00, 0x00, 0x9C, 0x00, 0x9C, 0x00, 0x3F, 0x3F, /* 0x98-0x9B */
+	0x97, 0xF7, 0x9C, 0xDF, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */
+	0x9C, 0xDC, 0x3F, 0x3F, 0x9C, 0xD9, 0x3F, 0x3F, /* 0x94-0x97 */
+	0xED, 0xAA, 0x9C, 0xD8, 0x9C, 0xDD, 0x3F, 0x3F, /* 0x98-0x9B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */
-	0x95, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x93, 0x00, /* 0xA4-0xA7 */
-	0x3F, 0x3F, 0x8C, 0x65, 0x3F, 0x3F, 0x9C, 0x00, /* 0xA8-0xAB */
-	0x9C, 0x00, 0x3F, 0x3F, 0x9C, 0x00, 0x3F, 0x3F, /* 0xAC-0xAF */
+	0x95, 0xAE, 0x3F, 0x3F, 0x3F, 0x3F, 0x93, 0xB2, /* 0xA4-0xA7 */
+	0x3F, 0x3F, 0x8C, 0x65, 0x3F, 0x3F, 0x9C, 0xE0, /* 0xA8-0xAB */
+	0x9C, 0xDB, 0x3F, 0x3F, 0x9C, 0xE1, 0x3F, 0x3F, /* 0xAC-0xAF */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x8C, 0x9B, 0x3F, 0x3F, /* 0xB0-0xB3 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x89, 0x00, 0x3F, 0x3F, /* 0xB4-0xB7 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x9C, 0x00, 0x3F, 0x3F, /* 0xB8-0xBB */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x8A, 0x00, 0x3F, 0x3F, /* 0xBC-0xBF */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x9C, 0x00, /* 0xC0-0xC3 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x9C, 0x00, 0x8D, 0x00, /* 0xC4-0xC7 */
-	0x9C, 0x00, 0x9C, 0x00, 0x9C, 0x00, 0x9C, 0x00, /* 0xC8-0xCB */
-	0x9C, 0x00, 0x9C, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */
-	0x89, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x89, 0xAF, 0x3F, 0x3F, /* 0xB4-0xB7 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x9C, 0xE9, 0x3F, 0x3F, /* 0xB8-0xBB */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x8A, 0xB6, 0x3F, 0x3F, /* 0xBC-0xBF */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x9C, 0xE7, /* 0xC0-0xC3 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x9C, 0xE8, 0x8D, 0xA7, /* 0xC4-0xC7 */
+	0x9C, 0xE6, 0x9C, 0xE4, 0x9C, 0xE3, 0x9C, 0xEA, /* 0xC8-0xCB */
+	0x9C, 0xE2, 0x9C, 0xEC, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */
+	0x89, 0xF9, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xDC-0xDF */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x9C, 0x00, /* 0xE0-0xE3 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x9C, 0x00, 0x3F, 0x3F, /* 0xE4-0xE7 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x9C, 0xEE, /* 0xE0-0xE3 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x9C, 0xED, 0x3F, 0x3F, /* 0xE4-0xE7 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x92, 0x00, 0x3F, 0x3F, /* 0xF0-0xF3 */
-	0x9C, 0x00, 0x3F, 0x3F, 0x9C, 0x00, 0x9C, 0x00, /* 0xF4-0xF7 */
-	0x8C, 0x9C, 0x3F, 0x3F, 0x9C, 0x00, 0x3F, 0x3F, /* 0xF8-0xFB */
-	0x9C, 0x00, 0x9C, 0x00, 0x9C, 0x00, 0x9C, 0x00, /* 0xFC-0xFF */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x92, 0xA6, 0x3F, 0x3F, /* 0xF0-0xF3 */
+	0x9C, 0xF1, 0x3F, 0x3F, 0x9C, 0xEF, 0x9C, 0xE5, /* 0xF4-0xF7 */
+	0x8C, 0x9C, 0x3F, 0x3F, 0x9C, 0xF0, 0x3F, 0x3F, /* 0xF8-0xFB */
+	0x9C, 0xF4, 0x9C, 0xF3, 0x9C, 0xF5, 0x9C, 0xF2, /* 0xFC-0xFF */
 };
 
 static unsigned char u2c_62[512] = {
-	0x9C, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */
+	0x9C, 0xF6, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x04-0x07 */
-	0x9C, 0x00, 0x9C, 0x00, 0x95, 0x00, 0x3F, 0x3F, /* 0x08-0x0B */
-	0x9C, 0x00, 0x9C, 0x00, 0x8F, 0x5E, 0x3F, 0x3F, /* 0x0C-0x0F */
-	0x90, 0x00, 0x89, 0x00, 0x89, 0x00, 0x00, 0x00, /* 0x10-0x13 */
-	0x9C, 0x00, 0x3F, 0x3F, 0x88, 0x00, 0x3F, 0x3F, /* 0x14-0x17 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x90, 0x00, 0x9C, 0x00, /* 0x18-0x1B */
-	0x3F, 0x3F, 0x00, 0x00, 0x9D, 0x40, 0x8C, 0x81, /* 0x1C-0x1F */
+	0x9C, 0xF7, 0x9C, 0xF8, 0x95, 0xE8, 0x3F, 0x3F, /* 0x08-0x0B */
+	0x9C, 0xFA, 0x9C, 0xF9, 0x8F, 0x5E, 0x3F, 0x3F, /* 0x0C-0x0F */
+	0x90, 0xAC, 0x89, 0xE4, 0x89, 0xFA, 0xED, 0xAB, /* 0x10-0x13 */
+	0x9C, 0xFB, 0x3F, 0x3F, 0x88, 0xBD, 0x3F, 0x3F, /* 0x14-0x17 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x90, 0xCA, 0x9C, 0xFC, /* 0x18-0x1B */
+	0x3F, 0x3F, 0xE6, 0xC1, 0x9D, 0x40, 0x8C, 0x81, /* 0x1C-0x1F */
 	0x3F, 0x3F, 0x9D, 0x41, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x90, 0x00, 0x3F, 0x3F, /* 0x24-0x27 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x90, 0xED, 0x3F, 0x3F, /* 0x24-0x27 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x9D, 0x42, 0x3F, 0x3F, /* 0x28-0x2B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x9D, 0x43, 0x8B, 0x59, /* 0x2C-0x2F */
 	0x9D, 0x44, 0x3F, 0x3F, 0x9D, 0x45, 0x9D, 0x46, /* 0x30-0x33 */
-	0x91, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */
-	0x8C, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x96, 0x00, /* 0x38-0x3B */
+	0x91, 0xD5, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */
+	0x8C, 0xCB, 0x3F, 0x3F, 0x3F, 0x3F, 0x96, 0xDF, /* 0x38-0x3B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x96, 0x5B, /* 0x3C-0x3F */
 	0x8F, 0x8A, 0x9D, 0x47, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x90, 0x00, /* 0x44-0x47 */
-	0x00, 0x00, 0x94, 0x00, 0x3F, 0x3F, 0x8E, 0x00, /* 0x48-0x4B */
-	0x3F, 0x3F, 0x8D, 0x00, 0x9D, 0x48, 0x3F, 0x3F, /* 0x4C-0x4F */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x91, 0x00, /* 0x50-0x53 */
-	0x3F, 0x3F, 0x95, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */
-	0x91, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x9D, 0x4B, /* 0x58-0x5B */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x90, 0xEE, /* 0x44-0x47 */
+	0xE7, 0xBB, 0x94, 0xE0, 0x3F, 0x3F, 0x8E, 0xE8, /* 0x48-0x4B */
+	0x3F, 0x3F, 0x8D, 0xCB, 0x9D, 0x48, 0x3F, 0x3F, /* 0x4C-0x4F */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x91, 0xC5, /* 0x50-0x53 */
+	0x3F, 0x3F, 0x95, 0xA5, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */
+	0x91, 0xEF, 0x3F, 0x3F, 0x3F, 0x3F, 0x9D, 0x4B, /* 0x58-0x5B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x9D, 0x49, 0x3F, 0x3F, /* 0x5C-0x5F */
 	0x9D, 0x4C, 0x3F, 0x3F, 0x3F, 0x3F, 0x9D, 0x4A, /* 0x60-0x63 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */
 	0x9D, 0x4D, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x68-0x6B */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x95, 0x00, 0x3F, 0x3F, /* 0x6C-0x6F */
-	0x3F, 0x3F, 0x88, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x95, 0xAF, 0x3F, 0x3F, /* 0x6C-0x6F */
+	0x3F, 0x3F, 0x88, 0xB5, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x95, 0x7D, 0x3F, 0x3F, /* 0x74-0x77 */
-	0x3F, 0x3F, 0x94, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */
-	0x9D, 0x4E, 0x3F, 0x3F, 0x9D, 0x51, 0x8F, 0x00, /* 0x7C-0x7F */
+	0x3F, 0x3F, 0x94, 0xE1, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */
+	0x9D, 0x4E, 0x3F, 0x3F, 0x9D, 0x51, 0x8F, 0xB3, /* 0x7C-0x7F */
 	
 	0x8B, 0x5A, 0x3F, 0x3F, 0x9D, 0x4F, 0x9D, 0x56, /* 0x80-0x83 */
-	0x8F, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */
+	0x8F, 0xB4, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */
 	0x3F, 0x3F, 0x9D, 0x50, 0x94, 0x63, 0x3F, 0x3F, /* 0x88-0x8B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */
 	0x3F, 0x3F, 0x97, 0x7D, 0x9D, 0x52, 0x9D, 0x53, /* 0x90-0x93 */
 	0x9D, 0x57, 0x93, 0x8A, 0x9D, 0x54, 0x8D, 0x52, /* 0x94-0x97 */
-	0x90, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x9D, 0x65, /* 0x98-0x9B */
-	0x94, 0x00, 0x3F, 0x3F, 0x91, 0x00, 0x3F, 0x3F, /* 0x9C-0x9F */
+	0x90, 0xDC, 0x3F, 0x3F, 0x3F, 0x3F, 0x9D, 0x65, /* 0x98-0x9B */
+	0x94, 0xB2, 0x3F, 0x3F, 0x91, 0xF0, 0x3F, 0x3F, /* 0x9C-0x9F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0xA4-0xA7 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x94, 0x00, /* 0xA8-0xAB */
-	0x9D, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */
-	0x3F, 0x3F, 0x95, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB0-0xB3 */
-	0x3F, 0x3F, 0x92, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xED, 0xAC, 0x3F, 0x3F, /* 0xA4-0xA7 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x94, 0xE2, /* 0xA8-0xAB */
+	0x9D, 0xAB, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */
+	0x3F, 0x3F, 0x95, 0xF8, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB0-0xB3 */
+	0x3F, 0x3F, 0x92, 0xEF, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */
 	0x3F, 0x3F, 0x96, 0x95, 0x3F, 0x3F, 0x9D, 0x5A, /* 0xB8-0xBB */
 	0x89, 0x9F, 0x92, 0x8A, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x9D, 0x63, 0x3F, 0x3F, /* 0xC0-0xC3 */
 	0x3F, 0x3F, 0x92, 0x53, 0x9D, 0x5D, 0x9D, 0x64, /* 0xC4-0xC7 */
 	0x9D, 0x5F, 0x9D, 0x66, 0x9D, 0x62, 0x3F, 0x3F, /* 0xC8-0xCB */
 	0x9D, 0x61, 0x94, 0x8F, 0x3F, 0x3F, 0x9D, 0x5B, /* 0xCC-0xCF */
-	0x89, 0x00, 0x9D, 0x59, 0x8B, 0x91, 0x91, 0x00, /* 0xD0-0xD3 */
+	0x89, 0xFB, 0x9D, 0x59, 0x8B, 0x91, 0x91, 0xF1, /* 0xD0-0xD3 */
 	0x9D, 0x55, 0x3F, 0x3F, 0x3F, 0x3F, 0x9D, 0x58, /* 0xD4-0xD7 */
-	0x8D, 0x53, 0x90, 0x00, 0x3F, 0x3F, 0x8F, 0x00, /* 0xD8-0xDB */
+	0x8D, 0x53, 0x90, 0xD9, 0x3F, 0x3F, 0x8F, 0xB5, /* 0xD8-0xDB */
 	0x9D, 0x60, 0x94, 0x71, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xDC-0xDF */
 	0x8B, 0x92, 0x8A, 0x67, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */
@@ -5353,67 +5355,67 @@
 static unsigned char u2c_63[512] = {
 	0x3F, 0x3F, 0x8E, 0x9D, 0x9D, 0x6B, 0x3F, 0x3F, /* 0x00-0x03 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x8E, 0x77, /* 0x04-0x07 */
-	0x9D, 0x6C, 0x88, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x08-0x0B */
+	0x9D, 0x6C, 0x88, 0xC2, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x08-0x0B */
 	0x9D, 0x67, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */
-	0x3F, 0x3F, 0x92, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */
+	0x3F, 0x3F, 0x92, 0xA7, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */
 	0x3F, 0x3F, 0x8B, 0x93, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x18-0x1B */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x8B, 0x00, /* 0x1C-0x1F */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x8B, 0xB2, /* 0x1C-0x1F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x9D, 0x6A, /* 0x24-0x27 */
-	0x88, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x8D, 0x00, /* 0x28-0x2B */
+	0x88, 0xA5, 0x3F, 0x3F, 0x3F, 0x3F, 0x8D, 0xC1, /* 0x28-0x2B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x90, 0x55, /* 0x2C-0x2F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x92, 0x00, 0x3F, 0x3F, /* 0x38-0x3B */
-	0x3F, 0x3F, 0x94, 0x00, 0x9D, 0x70, 0x91, 0x7D, /* 0x3C-0x3F */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x92, 0xF0, 0x3F, 0x3F, /* 0x38-0x3B */
+	0x3F, 0x3F, 0x94, 0xD2, 0x9D, 0x70, 0x91, 0x7D, /* 0x3C-0x3F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */
-	0x3F, 0x3F, 0x91, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */
+	0x3F, 0x3F, 0x91, 0xA8, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */
 	0x8E, 0x4A, 0x9D, 0x71, 0x3F, 0x3F, 0x9D, 0x73, /* 0x4C-0x4F */
 	0x9D, 0x6F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */
-	0x3F, 0x3F, 0x95, 0x00, 0x3F, 0x3F, 0x92, 0x00, /* 0x54-0x57 */
+	0x3F, 0x3F, 0x95, 0xDF, 0x3F, 0x3F, 0x92, 0xBB, /* 0x54-0x57 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */
 	0x91, 0x7B, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x5C-0x5F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x60-0x63 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x95, 0x00, /* 0x64-0x67 */
-	0x8E, 0x00, 0x9D, 0x80, 0x3F, 0x3F, 0x9D, 0x7E, /* 0x68-0x6B */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x95, 0xF9, /* 0x64-0x67 */
+	0x8E, 0xCC, 0x9D, 0x80, 0x3F, 0x3F, 0x9D, 0x7E, /* 0x68-0x6B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x90, 0x98, 0x3F, 0x3F, /* 0x6C-0x6F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x8C, 0x9E, 0x3F, 0x3F, /* 0x70-0x73 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x9D, 0x78, 0x8F, 0x00, /* 0x74-0x77 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x93, 0x00, 0x94, 0x50, /* 0x78-0x7B */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x9D, 0x78, 0x8F, 0xB7, /* 0x74-0x77 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x93, 0xE6, 0x94, 0x50, /* 0x78-0x7B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */
 	
 	0x9D, 0x76, 0x3F, 0x3F, 0x3F, 0x3F, 0x91, 0x7C, /* 0x80-0x83 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */
-	0x8E, 0x00, 0x9D, 0x7B, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x88-0x8B */
-	0x8F, 0x00, 0x3F, 0x3F, 0x9D, 0x75, 0x9D, 0x7A, /* 0x8C-0x8F */
+	0x8E, 0xF6, 0x9D, 0x7B, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x88-0x8B */
+	0x8F, 0xB6, 0x3F, 0x3F, 0x9D, 0x75, 0x9D, 0x7A, /* 0x8C-0x8F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x94, 0x72, 0x3F, 0x3F, /* 0x90-0x93 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x9D, 0x74, 0x3F, 0x3F, /* 0x94-0x97 */
 	0x8C, 0x40, 0x3F, 0x3F, 0x3F, 0x3F, 0x8A, 0x7C, /* 0x98-0x9B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x9D, 0x7C, /* 0x9C-0x9F */
-	0x97, 0x00, 0x8D, 0x00, 0x92, 0x54, 0x9D, 0x79, /* 0xA0-0xA3 */
-	0x3F, 0x3F, 0x90, 0x00, 0x3F, 0x3F, 0x8D, 0x54, /* 0xA4-0xA7 */
+	0x97, 0xA9, 0x8D, 0xCC, 0x92, 0x54, 0x9D, 0x79, /* 0xA0-0xA3 */
+	0x3F, 0x3F, 0x90, 0xDA, 0x3F, 0x3F, 0x8D, 0x54, /* 0xA4-0xA7 */
 	0x90, 0x84, 0x89, 0x86, 0x91, 0x5B, 0x9D, 0x77, /* 0xA8-0xAB */
 	0x8B, 0x64, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x8C, 0x66, 0x3F, 0x3F, /* 0xB0-0xB3 */
-	0x92, 0x00, 0x9D, 0x7D, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */
+	0x92, 0xCD, 0x9D, 0x7D, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x91, 0x7E, /* 0xB8-0xBB */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x9D, 0x81, 0x3F, 0x3F, /* 0xBC-0xBF */
-	0x9D, 0x83, 0x3F, 0x3F, 0x3F, 0x3F, 0x91, 0x00, /* 0xC0-0xC3 */
+	0x9D, 0x83, 0x3F, 0x3F, 0x3F, 0x3F, 0x91, 0xB5, /* 0xC0-0xC3 */
 	0x9D, 0x89, 0x3F, 0x3F, 0x9D, 0x84, 0x3F, 0x3F, /* 0xC4-0xC7 */
 	0x3F, 0x3F, 0x9D, 0x86, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC8-0xCB */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x95, 0x60, /* 0xCC-0xCF */
-	0x92, 0x00, 0x3F, 0x3F, 0x9D, 0x87, 0x3F, 0x3F, /* 0xD0-0xD3 */
+	0x92, 0xF1, 0x3F, 0x3F, 0x9D, 0x87, 0x3F, 0x3F, /* 0xD0-0xD3 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x97, 0x4B, 0x3F, 0x3F, /* 0xD4-0xD7 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x97, 0x67, 0x8A, 0x00, /* 0xD8-0xDB */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x97, 0x67, 0x8A, 0xB7, /* 0xD8-0xDB */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xDC-0xDF */
-	0x3F, 0x3F, 0x88, 0x00, 0x3F, 0x3F, 0x9D, 0x85, /* 0xE0-0xE3 */
+	0x3F, 0x3F, 0x88, 0xAC, 0x3F, 0x3F, 0x9D, 0x85, /* 0xE0-0xE3 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */
 	0x3F, 0x3F, 0x9D, 0x82, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x8A, 0x00, 0x3F, 0x3F, /* 0xEC-0xEF */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x8A, 0xF6, 0x3F, 0x3F, /* 0xEC-0xEF */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */
-	0x89, 0x87, 0x00, 0x00, 0x9D, 0x88, 0x3F, 0x3F, /* 0xF4-0xF7 */
+	0x89, 0x87, 0xED, 0xAD, 0x9D, 0x88, 0x3F, 0x3F, /* 0xF4-0xF7 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x97, 0x68, 0x3F, 0x3F, /* 0xF8-0xFB */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */
 };
@@ -5422,7 +5424,7 @@
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x9D, 0x8C, 0x3F, 0x3F, /* 0x04-0x07 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x08-0x0B */
-	0x3F, 0x3F, 0x91, 0x00, 0x3F, 0x3F, 0x9D, 0x93, /* 0x0C-0x0F */
+	0x3F, 0x3F, 0x91, 0xB9, 0x3F, 0x3F, 0x9D, 0x93, /* 0x0C-0x0F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x9D, 0x8D, /* 0x10-0x13 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x9D, 0x8A, 0x9D, 0x91, /* 0x14-0x17 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x18-0x1B */
@@ -5430,12 +5432,12 @@
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x9D, 0x8E, 0x3F, 0x3F, /* 0x24-0x27 */
 	0x9D, 0x92, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */
-	0x94, 0x00, 0x93, 0x8B, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */
+	0x94, 0xC0, 0x93, 0x8B, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */
 	0x9D, 0x8B, 0x3F, 0x3F, 0x9D, 0x8F, 0x3F, 0x3F, /* 0x34-0x37 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x8C, 0x67, 0x3F, 0x3F, /* 0x38-0x3B */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x8D, 0x00, 0x3F, 0x3F, /* 0x3C-0x3F */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x90, 0x00, 0x3F, 0x3F, /* 0x40-0x43 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x8D, 0xEF, 0x3F, 0x3F, /* 0x3C-0x3F */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x90, 0xDB, 0x3F, 0x3F, /* 0x40-0x43 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x9D, 0x97, 0x3F, 0x3F, /* 0x4C-0x4F */
@@ -5443,13 +5445,13 @@
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */
 	0x93, 0x45, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x5C-0x5F */
-	0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x60-0x63 */
+	0xED, 0xAE, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x60-0x63 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x9D, 0x94, /* 0x64-0x67 */
 	0x3F, 0x3F, 0x96, 0x80, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x68-0x6B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x9D, 0x95, /* 0x6C-0x6F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x9D, 0x96, 0x3F, 0x3F, /* 0x74-0x77 */
-	0x96, 0x00, 0x3F, 0x3F, 0x90, 0x00, 0x3F, 0x3F, /* 0x78-0x7B */
+	0x96, 0xCC, 0x3F, 0x3F, 0x90, 0xA0, 0x3F, 0x3F, /* 0x78-0x7B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */
 	
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x8C, 0x82, /* 0x80-0x83 */
@@ -5459,154 +5461,154 @@
 	0x3F, 0x3F, 0x3F, 0x3F, 0x8E, 0x54, 0x9D, 0x9A, /* 0x90-0x93 */
 	0x3F, 0x3F, 0x9D, 0x99, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x94, 0x51, 0x3F, 0x3F, /* 0x98-0x9B */
-	0x3F, 0x3F, 0x00, 0x00, 0x93, 0x00, 0x3F, 0x3F, /* 0x9C-0x9F */
+	0x3F, 0x3F, 0xED, 0xAF, 0x93, 0xB3, 0x3F, 0x3F, /* 0x9C-0x9F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */
 	0x93, 0x50, 0x9D, 0x9B, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */
 	0x3F, 0x3F, 0x9D, 0x9C, 0x3F, 0x3F, 0x95, 0x8F, /* 0xA8-0xAB */
 	0x3F, 0x3F, 0x94, 0x64, 0x8E, 0x42, 0x3F, 0x3F, /* 0xAC-0xAF */
-	0x90, 0x00, 0x3F, 0x3F, 0x96, 0x6F, 0x3F, 0x3F, /* 0xB0-0xB3 */
+	0x90, 0xEF, 0x3F, 0x3F, 0x96, 0x6F, 0x3F, 0x3F, /* 0xB0-0xB3 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */
-	0x3F, 0x3F, 0x8A, 0x68, 0x3F, 0x3F, 0x9D, 0x00, /* 0xB8-0xBB */
+	0x3F, 0x3F, 0x8A, 0x68, 0x3F, 0x3F, 0x9D, 0xA3, /* 0xB8-0xBB */
 	0x9D, 0x9E, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */
-	0x3F, 0x3F, 0x97, 0x69, 0x9D, 0x00, 0x3F, 0x3F, /* 0xC0-0xC3 */
-	0x3F, 0x3F, 0x9D, 0x00, 0x3F, 0x3F, 0x9D, 0x00, /* 0xC4-0xC7 */
+	0x3F, 0x3F, 0x97, 0x69, 0x9D, 0xA5, 0x3F, 0x3F, /* 0xC0-0xC3 */
+	0x3F, 0x3F, 0x9D, 0xA1, 0x3F, 0x3F, 0x9D, 0xA2, /* 0xC4-0xC7 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC8-0xCB */
-	0x3F, 0x3F, 0x91, 0x80, 0x00, 0x00, 0x3F, 0x3F, /* 0xCC-0xCF */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x9D, 0x00, 0x3F, 0x3F, /* 0xD0-0xD3 */
+	0x3F, 0x3F, 0x91, 0x80, 0xED, 0xB0, 0x3F, 0x3F, /* 0xCC-0xCF */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x9D, 0xA0, 0x3F, 0x3F, /* 0xD0-0xD3 */
 	0x9D, 0x5E, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */
-	0x9D, 0x00, 0x3F, 0x3F, 0x9D, 0x9F, 0x3F, 0x3F, /* 0xD8-0xDB */
+	0x9D, 0xA4, 0x3F, 0x3F, 0x9D, 0x9F, 0x3F, 0x3F, /* 0xD8-0xDB */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xDC-0xDF */
-	0x9D, 0x00, 0x9D, 0x00, 0x93, 0x46, 0x9D, 0x00, /* 0xE0-0xE3 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x8E, 0x43, 0x9D, 0x00, /* 0xE4-0xE7 */
+	0x9D, 0xA9, 0x9D, 0xAA, 0x93, 0x46, 0x9D, 0xAC, /* 0xE0-0xE3 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x8E, 0x43, 0x9D, 0xA7, /* 0xE4-0xE7 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */
-	0x8B, 0x5B, 0x3F, 0x3F, 0x3F, 0x3F, 0x9D, 0x00, /* 0xEC-0xEF */
-	0x3F, 0x3F, 0x9D, 0x00, 0x9D, 0x00, 0x3F, 0x3F, /* 0xF0-0xF3 */
-	0x9D, 0x00, 0x3F, 0x3F, 0x9D, 0x00, 0x3F, 0x3F, /* 0xF4-0xF7 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x9D, 0x00, 0x3F, 0x3F, /* 0xF8-0xFB */
-	0x3F, 0x3F, 0x9D, 0x00, 0x8F, 0x00, 0x3F, 0x3F, /* 0xFC-0xFF */
+	0x8B, 0x5B, 0x3F, 0x3F, 0x3F, 0x3F, 0x9D, 0xAD, /* 0xEC-0xEF */
+	0x3F, 0x3F, 0x9D, 0xA6, 0x9D, 0xB1, 0x3F, 0x3F, /* 0xF0-0xF3 */
+	0x9D, 0xB0, 0x3F, 0x3F, 0x9D, 0xAF, 0x3F, 0x3F, /* 0xF4-0xF7 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x9D, 0xB2, 0x3F, 0x3F, /* 0xF8-0xFB */
+	0x3F, 0x3F, 0x9D, 0xB4, 0x8F, 0xEF, 0x3F, 0x3F, /* 0xFC-0xFF */
 };
 
 static unsigned char u2c_65[512] = {
-	0x9D, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */
-	0x3F, 0x3F, 0x9D, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x04-0x07 */
+	0x9D, 0xB3, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */
+	0x3F, 0x3F, 0x9D, 0xB7, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x04-0x07 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x08-0x0B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */
-	0x9D, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x18-0x1B */
-	0x9D, 0x00, 0x9D, 0x90, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x9D, 0x00, /* 0x20-0x23 */
-	0x9D, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x9D, 0x98, 0x9D, 0x00, /* 0x28-0x2B */
-	0x9D, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x8E, 0x78, /* 0x2C-0x2F */
+	0x9D, 0xB5, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x18-0x1B */
+	0x9D, 0xB6, 0x9D, 0x90, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x9D, 0xB9, /* 0x20-0x23 */
+	0x9D, 0xB8, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x9D, 0x98, 0x9D, 0xBA, /* 0x28-0x2B */
+	0x9D, 0xAE, 0x3F, 0x3F, 0x3F, 0x3F, 0x8E, 0x78, /* 0x2C-0x2F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */
-	0x9D, 0x00, 0x9D, 0x00, 0x9D, 0x00, 0x9D, 0x00, /* 0x34-0x37 */
-	0x9D, 0x00, 0x89, 0x00, 0x3F, 0x3F, 0x8D, 0x55, /* 0x38-0x3B */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x95, 0x00, 0x90, 0x00, /* 0x3C-0x3F */
+	0x9D, 0xBB, 0x9D, 0xBC, 0x9D, 0xBE, 0x9D, 0xBD, /* 0x34-0x37 */
+	0x9D, 0xBF, 0x89, 0xFC, 0x3F, 0x3F, 0x8D, 0x55, /* 0x38-0x3B */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x95, 0xFA, 0x90, 0xAD, /* 0x3C-0x3F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */
-	0x3F, 0x3F, 0x8C, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */
-	0x9D, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */
-	0x3F, 0x3F, 0x9D, 0x00, 0x00, 0x00, 0x95, 0x71, /* 0x4C-0x4F */
+	0x3F, 0x3F, 0x8C, 0xCC, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */
+	0x9D, 0xC1, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */
+	0x3F, 0x3F, 0x9D, 0xC4, 0xED, 0xB1, 0x95, 0x71, /* 0x4C-0x4F */
 	0x3F, 0x3F, 0x8B, 0x7E, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */
-	0x3F, 0x3F, 0x9D, 0x00, 0x9D, 0x00, 0x94, 0x73, /* 0x54-0x57 */
-	0x9D, 0x00, 0x8B, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */
-	0x3F, 0x3F, 0x9D, 0x00, 0x9D, 0x00, 0x3F, 0x3F, /* 0x5C-0x5F */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x8A, 0x00, 0x8E, 0x55, /* 0x60-0x63 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x93, 0x00, 0x3F, 0x3F, /* 0x64-0x67 */
+	0x3F, 0x3F, 0x9D, 0xC3, 0x9D, 0xC2, 0x94, 0x73, /* 0x54-0x57 */
+	0x9D, 0xC5, 0x8B, 0xB3, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */
+	0x3F, 0x3F, 0x9D, 0xC7, 0x9D, 0xC6, 0x3F, 0x3F, /* 0x5C-0x5F */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x8A, 0xB8, 0x8E, 0x55, /* 0x60-0x63 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x93, 0xD6, 0x3F, 0x3F, /* 0x64-0x67 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x68-0x6B */
 	0x8C, 0x68, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */
-	0x90, 0x94, 0x3F, 0x3F, 0x9D, 0x00, 0x3F, 0x3F, /* 0x70-0x73 */
-	0x90, 0x00, 0x93, 0x47, 0x3F, 0x3F, 0x95, 0x7E, /* 0x74-0x77 */
-	0x9D, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */
+	0x90, 0x94, 0x3F, 0x3F, 0x9D, 0xC8, 0x3F, 0x3F, /* 0x70-0x73 */
+	0x90, 0xAE, 0x93, 0x47, 0x3F, 0x3F, 0x95, 0x7E, /* 0x74-0x77 */
+	0x9D, 0xC9, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */
 	
-	0x3F, 0x3F, 0x3F, 0x3F, 0x9D, 0x00, 0x9D, 0x00, /* 0x80-0x83 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x95, 0x00, /* 0x84-0x87 */
-	0x9B, 0x7C, 0x90, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x88-0x8B */
-	0x95, 0x6B, 0x3F, 0x3F, 0x8D, 0x00, 0x3F, 0x3F, /* 0x8C-0x8F */
-	0x94, 0x00, 0x94, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x9D, 0xCA, 0x9D, 0xCB, /* 0x80-0x83 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x95, 0xB6, /* 0x84-0x87 */
+	0x9B, 0x7C, 0x90, 0xC4, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x88-0x8B */
+	0x95, 0x6B, 0x3F, 0x3F, 0x8D, 0xD6, 0x3F, 0x3F, /* 0x8C-0x8F */
+	0x94, 0xE3, 0x94, 0xC1, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x93, 0x6C, /* 0x94-0x97 */
-	0x3F, 0x3F, 0x97, 0x00, 0x3F, 0x3F, 0x9D, 0x00, /* 0x98-0x9B */
-	0x8E, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x9D, 0x00, /* 0x9C-0x9F */
-	0x3F, 0x3F, 0x88, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */
-	0x8B, 0x00, 0x90, 0x00, 0x3F, 0x3F, 0x95, 0x80, /* 0xA4-0xA7 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x9D, 0x00, /* 0xA8-0xAB */
+	0x3F, 0x3F, 0x97, 0xBF, 0x3F, 0x3F, 0x9D, 0xCD, /* 0x98-0x9B */
+	0x8E, 0xCE, 0x3F, 0x3F, 0x3F, 0x3F, 0x9D, 0xCE, /* 0x9C-0x9F */
+	0x3F, 0x3F, 0x88, 0xB4, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */
+	0x8B, 0xD2, 0x90, 0xCB, 0x3F, 0x3F, 0x95, 0x80, /* 0xA4-0xA7 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x9D, 0xCF, /* 0xA8-0xAB */
 	0x8E, 0x61, 0x92, 0x66, 0x3F, 0x3F, 0x8E, 0x7A, /* 0xAC-0xAF */
 	0x90, 0x56, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB0-0xB3 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x9D, 0x00, /* 0xB4-0xB7 */
-	0x3F, 0x3F, 0x95, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x9D, 0xD0, /* 0xB4-0xB7 */
+	0x3F, 0x3F, 0x95, 0xFB, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */
 	0x89, 0x97, 0x8E, 0x7B, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */
-	0x3F, 0x3F, 0x9D, 0x00, 0x3F, 0x3F, 0x9D, 0x00, /* 0xC0-0xC3 */
-	0x9D, 0x00, 0x97, 0x00, 0x9D, 0x00, 0x3F, 0x3F, /* 0xC4-0xC7 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x90, 0x00, /* 0xC8-0xCB */
-	0x9D, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x91, 0x00, /* 0xCC-0xCF */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x9D, 0x00, 0x3F, 0x3F, /* 0xD0-0xD3 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x8A, 0x00, /* 0xD4-0xD7 */
-	0x3F, 0x3F, 0x9D, 0x00, 0x3F, 0x3F, 0x9D, 0x00, /* 0xD8-0xDB */
+	0x3F, 0x3F, 0x9D, 0xD3, 0x3F, 0x3F, 0x9D, 0xD1, /* 0xC0-0xC3 */
+	0x9D, 0xD4, 0x97, 0xB7, 0x9D, 0xD2, 0x3F, 0x3F, /* 0xC4-0xC7 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x90, 0xF9, /* 0xC8-0xCB */
+	0x9D, 0xD5, 0x3F, 0x3F, 0x3F, 0x3F, 0x91, 0xB0, /* 0xCC-0xCF */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x9D, 0xD6, 0x3F, 0x3F, /* 0xD0-0xD3 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x8A, 0xF8, /* 0xD4-0xD7 */
+	0x3F, 0x3F, 0x9D, 0xD8, 0x3F, 0x3F, 0x9D, 0xD7, /* 0xD8-0xDB */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xDC-0xDF */
-	0x9D, 0x00, 0x9D, 0x00, 0x8A, 0x00, 0x3F, 0x3F, /* 0xE0-0xE3 */
-	0x3F, 0x3F, 0x93, 0x00, 0x92, 0x55, 0x8B, 0x8C, /* 0xE4-0xE7 */
+	0x9D, 0xD9, 0x9D, 0xDA, 0x8A, 0xF9, 0x3F, 0x3F, /* 0xE0-0xE3 */
+	0x3F, 0x3F, 0x93, 0xFA, 0x92, 0x55, 0x8B, 0x8C, /* 0xE4-0xE7 */
 	0x8E, 0x7C, 0x91, 0x81, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */
-	0x8F, 0x7B, 0x88, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */
-	0x3F, 0x3F, 0x9D, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */
+	0x8F, 0x7B, 0x88, 0xAE, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */
+	0x3F, 0x3F, 0x9D, 0xDB, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x89, 0x00, 0x9D, 0x00, /* 0xF8-0xFB */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x89, 0xA0, 0x9D, 0xDF, /* 0xF8-0xFB */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */
 };
 
 static unsigned char u2c_66[512] = {
-	0x00, 0x00, 0x3F, 0x3F, 0x8D, 0x56, 0x9D, 0x00, /* 0x00-0x03 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x8D, 0x00, 0x8F, 0x00, /* 0x04-0x07 */
-	0x3F, 0x3F, 0x00, 0x00, 0x9D, 0x00, 0x3F, 0x3F, /* 0x08-0x0B */
-	0x8F, 0x00, 0x3F, 0x3F, 0x96, 0x00, 0x8D, 0x00, /* 0x0C-0x0F */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x88, 0x00, /* 0x10-0x13 */
-	0x90, 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */
+	0xED, 0xB2, 0x3F, 0x3F, 0x8D, 0x56, 0x9D, 0xDE, /* 0x00-0x03 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x8D, 0xA9, 0x8F, 0xB8, /* 0x04-0x07 */
+	0x3F, 0x3F, 0xED, 0xB5, 0x9D, 0xDD, 0x3F, 0x3F, /* 0x08-0x0B */
+	0x8F, 0xB9, 0x3F, 0x3F, 0x96, 0xBE, 0x8D, 0xA8, /* 0x0C-0x0F */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x88, 0xD5, /* 0x10-0x13 */
+	0x90, 0xCC, 0xED, 0xB3, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x18-0x1B */
-	0x9D, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x90, 0x00, /* 0x1C-0x1F */
+	0x9D, 0xE4, 0x3F, 0x3F, 0xED, 0xB7, 0x90, 0xAF, /* 0x1C-0x1F */
 	0x89, 0x66, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */
-	0x00, 0x00, 0x8F, 0x74, 0x3F, 0x3F, 0x96, 0x86, /* 0x24-0x27 */
-	0x8D, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */
-	0x3F, 0x3F, 0x8F, 0x00, 0x00, 0x00, 0x90, 0x00, /* 0x2C-0x2F */
-	0x3F, 0x3F, 0x00, 0x63, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */
-	0x9D, 0x00, 0x9D, 0x00, 0x9D, 0x00, 0x3F, 0x3F, /* 0x34-0x37 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0x38-0x3B */
+	0xED, 0xB8, 0x8F, 0x74, 0x3F, 0x3F, 0x96, 0x86, /* 0x24-0x27 */
+	0x8D, 0xF0, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */
+	0x3F, 0x3F, 0x8F, 0xBA, 0xED, 0xB6, 0x90, 0xA5, /* 0x2C-0x2F */
+	0x3F, 0x3F, 0xED, 0x47, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */
+	0x9D, 0xE3, 0x9D, 0xE1, 0x9D, 0xE2, 0x3F, 0x3F, /* 0x34-0x37 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xED, 0xB4, /* 0x38-0x3B */
 	0x92, 0x8B, 0x3F, 0x3F, 0x3F, 0x3F, 0x9E, 0x45, /* 0x3C-0x3F */
-	0x3F, 0x3F, 0x9D, 0x00, 0x8E, 0x9E, 0x8D, 0x57, /* 0x40-0x43 */
-	0x9D, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */
-	0x3F, 0x3F, 0x9D, 0x00, 0x3F, 0x3F, 0x90, 0x57, /* 0x48-0x4B */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x9D, 0x00, /* 0x4C-0x4F */
+	0x3F, 0x3F, 0x9D, 0xE8, 0x8E, 0x9E, 0x8D, 0x57, /* 0x40-0x43 */
+	0x9D, 0xE6, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */
+	0x3F, 0x3F, 0x9D, 0xE7, 0x3F, 0x3F, 0x90, 0x57, /* 0x48-0x4B */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x9D, 0xE5, /* 0x4C-0x4F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x8E, 0x4E, 0x3F, 0x3F, /* 0x50-0x53 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0x54-0x57 */
-	0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */
-	0x3F, 0x3F, 0x9D, 0x00, 0x9D, 0x00, 0x9D, 0x00, /* 0x5C-0x5F */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x9D, 0x00, 0x3F, 0x3F, /* 0x60-0x63 */
-	0x9D, 0x00, 0x00, 0x00, 0x8A, 0x41, 0x9D, 0x00, /* 0x64-0x67 */
-	0x9D, 0x00, 0x94, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x68-0x6B */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xED, 0xBA, /* 0x54-0x57 */
+	0x3F, 0x3F, 0xED, 0xBB, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */
+	0x3F, 0x3F, 0x9D, 0xEA, 0x9D, 0xE9, 0x9D, 0xEE, /* 0x5C-0x5F */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x9D, 0xEF, 0x3F, 0x3F, /* 0x60-0x63 */
+	0x9D, 0xEB, 0xED, 0xB9, 0x8A, 0x41, 0x9D, 0xEC, /* 0x64-0x67 */
+	0x9D, 0xED, 0x94, 0xD3, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x68-0x6B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x95, 0x81, 0x8C, 0x69, /* 0x6C-0x6F */
-	0x9D, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0x70-0x73 */
-	0x90, 0x00, 0x3F, 0x3F, 0x8F, 0x00, 0x3F, 0x3F, /* 0x74-0x77 */
+	0x9D, 0xF0, 0x3F, 0x3F, 0x3F, 0x3F, 0xED, 0xBD, /* 0x70-0x73 */
+	0x90, 0xB0, 0x3F, 0x3F, 0x8F, 0xBB, 0x3F, 0x3F, /* 0x74-0x77 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x92, 0x71, 0x3F, 0x3F, /* 0x78-0x7B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */
 	
-	0x3F, 0x3F, 0x8B, 0x00, 0x3F, 0x3F, 0x9D, 0x00, /* 0x80-0x83 */
-	0x9D, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x89, 0x00, /* 0x84-0x87 */
-	0x9D, 0x00, 0x9D, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x88-0x8B */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x9D, 0x00, 0x3F, 0x3F, /* 0x8C-0x8F */
+	0x3F, 0x3F, 0x8B, 0xC5, 0x3F, 0x3F, 0x9D, 0xF1, /* 0x80-0x83 */
+	0x9D, 0xF5, 0x3F, 0x3F, 0x3F, 0x3F, 0x89, 0xC9, /* 0x84-0x87 */
+	0x9D, 0xF2, 0x9D, 0xF4, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x88-0x8B */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x9D, 0xF3, 0x3F, 0x3F, /* 0x8C-0x8F */
 	0x3F, 0x3F, 0x8F, 0x8B, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x92, 0x67, 0x88, 0x00, /* 0x94-0x97 */
-	0x9D, 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */
-	0x3F, 0x3F, 0x9D, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */
-	0x00, 0x00, 0x3F, 0x3F, 0x92, 0x00, 0x3F, 0x3F, /* 0xA0-0xA3 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x97, 0x00, 0x3F, 0x3F, /* 0xA4-0xA7 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x92, 0x67, 0x88, 0xC3, /* 0x94-0x97 */
+	0x9D, 0xF6, 0xED, 0xBE, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */
+	0x3F, 0x3F, 0x9D, 0xF7, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */
+	0xED, 0xBF, 0x3F, 0x3F, 0x92, 0xA8, 0x3F, 0x3F, /* 0xA0-0xA3 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x97, 0xEF, 0x3F, 0x3F, /* 0xA4-0xA7 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x8E, 0x62, /* 0xA8-0xAB */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x95, 0x00, 0x3F, 0x3F, /* 0xAC-0xAF */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0xB0-0xB3 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x95, 0xE9, 0x3F, 0x3F, /* 0xAC-0xAF */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xED, 0xC0, 0x3F, 0x3F, /* 0xB0-0xB3 */
 	0x96, 0x5C, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */
-	0x9E, 0x41, 0x9D, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */
-	0x9D, 0x00, 0x3F, 0x3F, 0x9D, 0x00, 0x00, 0x00, /* 0xBC-0xBF */
-	0x3F, 0x3F, 0x9D, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */
-	0x9E, 0x40, 0x3F, 0x3F, 0x3F, 0x3F, 0x93, 0x00, /* 0xC4-0xC7 */
-	0x3F, 0x3F, 0x9D, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC8-0xCB */
+	0x9E, 0x41, 0x9D, 0xF9, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */
+	0x9D, 0xFC, 0x3F, 0x3F, 0x9D, 0xFB, 0xED, 0xC1, /* 0xBC-0xBF */
+	0x3F, 0x3F, 0x9D, 0xF8, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */
+	0x9E, 0x40, 0x3F, 0x3F, 0x3F, 0x3F, 0x93, 0xDC, /* 0xC4-0xC7 */
+	0x3F, 0x3F, 0x9D, 0xFA, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC8-0xCB */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x9E, 0x42, 0x3F, 0x3F, /* 0xD4-0xD7 */
@@ -5616,87 +5618,87 @@
 	0x3F, 0x3F, 0x3F, 0x3F, 0x9E, 0x46, 0x3F, 0x3F, /* 0xE4-0xE7 */
 	0x3F, 0x3F, 0x9E, 0x47, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */
-	0x9E, 0x48, 0x3F, 0x3F, 0x8B, 0x00, 0x89, 0x67, /* 0xF0-0xF3 */
+	0x9E, 0x48, 0x3F, 0x3F, 0x8B, 0xC8, 0x89, 0x67, /* 0xF0-0xF3 */
 	0x8D, 0x58, 0x9E, 0x49, 0x3F, 0x3F, 0x9E, 0x4A, /* 0xF4-0xF7 */
-	0x8F, 0x91, 0x91, 0x82, 0x00, 0x00, 0x00, 0x66, /* 0xF8-0xFB */
-	0x99, 0x00, 0x91, 0x5D, 0x91, 0x5C, 0x91, 0x00, /* 0xFC-0xFF */
+	0x8F, 0x91, 0x91, 0x82, 0xED, 0xC2, 0xED, 0x4A, /* 0xF8-0xFB */
+	0x99, 0xD6, 0x91, 0x5D, 0x91, 0x5C, 0x91, 0xD6, /* 0xFC-0xFF */
 };
 
 static unsigned char u2c_67[512] = {
-	0x8D, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x98, 0x00, /* 0x00-0x03 */
+	0x8D, 0xC5, 0x3F, 0x3F, 0x3F, 0x3F, 0x98, 0xF0, /* 0x00-0x03 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x04-0x07 */
-	0x8C, 0x8E, 0x97, 0x4C, 0x3F, 0x3F, 0x95, 0x00, /* 0x08-0x0B */
-	0x3F, 0x3F, 0x95, 0x9E, 0x00, 0x00, 0x9E, 0x4B, /* 0x0C-0x0F */
+	0x8C, 0x8E, 0x97, 0x4C, 0x3F, 0x3F, 0x95, 0xFC, /* 0x08-0x0B */
+	0x3F, 0x3F, 0x95, 0x9E, 0xED, 0xC3, 0x9E, 0x4B, /* 0x0C-0x0F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */
-	0x8D, 0x00, 0x92, 0x00, 0x9E, 0x4C, 0x98, 0x4E, /* 0x14-0x17 */
+	0x8D, 0xF1, 0x92, 0xBD, 0x9E, 0x4C, 0x98, 0x4E, /* 0x14-0x17 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x96, 0x5D, /* 0x18-0x1B */
-	0x3F, 0x3F, 0x92, 0x00, 0x9E, 0x4D, 0x8A, 0x00, /* 0x1C-0x1F */
+	0x3F, 0x3F, 0x92, 0xA9, 0x9E, 0x4D, 0x8A, 0xFA, /* 0x1C-0x1F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x9E, 0x4E, 0x9E, 0x4F, /* 0x24-0x27 */
-	0x96, 0x00, 0x3F, 0x3F, 0x96, 0x00, 0x96, 0x96, /* 0x28-0x2B */
+	0x96, 0xD8, 0x3F, 0x3F, 0x96, 0xA2, 0x96, 0x96, /* 0x28-0x2B */
 	0x96, 0x7B, 0x8E, 0x44, 0x9E, 0x51, 0x3F, 0x3F, /* 0x2C-0x2F */
-	0x3F, 0x3F, 0x8E, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */
+	0x3F, 0x3F, 0x8E, 0xE9, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */
 	0x96, 0x70, 0x3F, 0x3F, 0x9E, 0x53, 0x9E, 0x56, /* 0x34-0x37 */
-	0x9E, 0x55, 0x3F, 0x3F, 0x8A, 0x00, 0x3F, 0x3F, /* 0x38-0x3B */
+	0x9E, 0x55, 0x3F, 0x3F, 0x8A, 0xF7, 0x3F, 0x3F, /* 0x38-0x3B */
 	0x3F, 0x3F, 0x8B, 0x80, 0x3F, 0x3F, 0x9E, 0x52, /* 0x3C-0x3F */
 	0x3F, 0x3F, 0x9E, 0x54, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x9E, 0x57, 0x3F, 0x3F, /* 0x44-0x47 */
 	0x3F, 0x3F, 0x90, 0x99, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x97, 0x9B, 0x88, 0x00, /* 0x4C-0x4F */
-	0x8D, 0x00, 0x91, 0x00, 0x3F, 0x3F, 0x8E, 0x00, /* 0x50-0x53 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x8F, 0x00, 0x3F, 0x3F, /* 0x54-0x57 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x97, 0x9B, 0x88, 0xC7, /* 0x4C-0x4F */
+	0x8D, 0xDE, 0x91, 0xBA, 0x3F, 0x3F, 0x8E, 0xDB, /* 0x50-0x53 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x8F, 0xF1, 0x3F, 0x3F, /* 0x54-0x57 */
 	0x3F, 0x3F, 0x9E, 0x5A, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */
-	0x93, 0x6D, 0x3F, 0x3F, 0x9E, 0x58, 0x91, 0x00, /* 0x5C-0x5F */
-	0x9E, 0x59, 0x8F, 0x00, 0x96, 0x00, 0x9E, 0x5B, /* 0x60-0x63 */
-	0x9E, 0x5C, 0x97, 0x88, 0x00, 0x00, 0x3F, 0x3F, /* 0x64-0x67 */
+	0x93, 0x6D, 0x3F, 0x3F, 0x9E, 0x58, 0x91, 0xA9, /* 0x5C-0x5F */
+	0x9E, 0x59, 0x8F, 0xF0, 0x96, 0xDB, 0x9E, 0x5B, /* 0x60-0x63 */
+	0x9E, 0x5C, 0x97, 0x88, 0xED, 0xC5, 0x3F, 0x3F, /* 0x64-0x67 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x9E, 0x61, 0x3F, 0x3F, /* 0x68-0x6B */
 	0x3F, 0x3F, 0x8D, 0x59, 0x3F, 0x3F, 0x94, 0x74, /* 0x6C-0x6F */
-	0x9E, 0x5E, 0x93, 0x8C, 0x9D, 0x00, 0x9D, 0x00, /* 0x70-0x73 */
+	0x9E, 0x5E, 0x93, 0x8C, 0x9D, 0xDC, 0x9D, 0xE0, /* 0x70-0x73 */
 	0x3F, 0x3F, 0x8B, 0x6E, 0x3F, 0x3F, 0x94, 0x66, /* 0x74-0x77 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */
-	0x9E, 0x60, 0x3F, 0x3F, 0x8F, 0x00, 0x94, 0x00, /* 0x7C-0x7F */
+	0x9E, 0x60, 0x3F, 0x3F, 0x8F, 0xBC, 0x94, 0xC2, /* 0x7C-0x7F */
 	
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */
-	0x3F, 0x3F, 0x9E, 0x66, 0x3F, 0x3F, 0x94, 0x00, /* 0x84-0x87 */
+	0x3F, 0x3F, 0x9E, 0x66, 0x3F, 0x3F, 0x94, 0xF8, /* 0x84-0x87 */
 	0x3F, 0x3F, 0x9E, 0x5D, 0x3F, 0x3F, 0x9E, 0x63, /* 0x88-0x8B */
 	0x9E, 0x62, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */
-	0x90, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */
-	0x3F, 0x3F, 0x96, 0x8D, 0x3F, 0x3F, 0x97, 0x00, /* 0x94-0x97 */
+	0x90, 0xCD, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */
+	0x3F, 0x3F, 0x96, 0x8D, 0x3F, 0x3F, 0x97, 0xD1, /* 0x94-0x97 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x96, 0x87, 0x3F, 0x3F, /* 0x98-0x9B */
-	0x89, 0x00, 0x8E, 0x7D, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */
+	0x89, 0xCA, 0x8E, 0x7D, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */
 	0x98, 0x67, 0x9E, 0x65, 0x90, 0x95, 0x3F, 0x3F, /* 0xA0-0xA3 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x9E, 0x64, 0x3F, 0x3F, /* 0xA4-0xA7 */
 	0x3F, 0x3F, 0x9E, 0x5F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x8C, 0x00, /* 0xAC-0xAF */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x8C, 0xCD, /* 0xAC-0xAF */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x9E, 0x6B, /* 0xB0-0xB3 */
-	0x9E, 0x69, 0x3F, 0x3F, 0x89, 0x00, 0x9E, 0x67, /* 0xB4-0xB7 */
-	0x9E, 0x6D, 0x9E, 0x73, 0x3F, 0x3F, 0x00, 0x00, /* 0xB8-0xBB */
+	0x9E, 0x69, 0x3F, 0x3F, 0x89, 0xCB, 0x9E, 0x67, /* 0xB4-0xB7 */
+	0x9E, 0x6D, 0x9E, 0x73, 0x3F, 0x3F, 0xED, 0xC6, /* 0xB8-0xBB */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */
-	0x00, 0x00, 0x91, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */
-	0x95, 0x00, 0x3F, 0x3F, 0x9E, 0x75, 0x3F, 0x3F, /* 0xC4-0xC7 */
+	0xED, 0xC8, 0x91, 0xC6, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */
+	0x95, 0xBF, 0x3F, 0x3F, 0x9E, 0x75, 0x3F, 0x3F, /* 0xC4-0xC7 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x95, 0x41, 0x3F, 0x3F, /* 0xC8-0xCB */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x9E, 0x74, 0x94, 0x90, /* 0xCC-0xCF */
-	0x96, 0x5E, 0x8A, 0x00, 0x3F, 0x3F, 0x90, 0x00, /* 0xD0-0xD3 */
+	0x96, 0x5E, 0x8A, 0xB9, 0x3F, 0x3F, 0x90, 0xF5, /* 0xD0-0xD3 */
 	0x8F, 0x5F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */
-	0x92, 0x00, 0x3F, 0x3F, 0x97, 0x4D, 0x3F, 0x3F, /* 0xD8-0xDB */
+	0x92, 0xD1, 0x3F, 0x3F, 0x97, 0x4D, 0x3F, 0x3F, /* 0xD8-0xDB */
 	0x3F, 0x3F, 0x9E, 0x70, 0x9E, 0x6F, 0x3F, 0x3F, /* 0xDC-0xDF */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x9E, 0x71, 0x3F, 0x3F, /* 0xE0-0xE3 */
 	0x9E, 0x6E, 0x3F, 0x3F, 0x3F, 0x3F, 0x9E, 0x76, /* 0xE4-0xE7 */
 	0x3F, 0x3F, 0x9E, 0x6C, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */
 	0x9E, 0x6A, 0x3F, 0x3F, 0x9E, 0x72, 0x9E, 0x68, /* 0xEC-0xEF */
-	0x3F, 0x3F, 0x92, 0x8C, 0x3F, 0x3F, 0x96, 0x00, /* 0xF0-0xF3 */
-	0x8E, 0x00, 0x8D, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x8D, 0x00, /* 0xF8-0xFB */
+	0x3F, 0x3F, 0x92, 0x8C, 0x3F, 0x3F, 0x96, 0xF6, /* 0xF0-0xF3 */
+	0x8E, 0xC4, 0x8D, 0xF2, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x8D, 0xB8, /* 0xF8-0xFB */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x96, 0x8F, 0x8A, 0x60, /* 0xFC-0xFF */
 };
 
 static unsigned char u2c_68[512] = {
-	0x3F, 0x3F, 0x00, 0x00, 0x92, 0x00, 0x93, 0x00, /* 0x00-0x03 */
+	0x3F, 0x3F, 0xED, 0xC9, 0x92, 0xCC, 0x93, 0xC8, /* 0x00-0x03 */
 	0x89, 0x68, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x04-0x07 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x08-0x0B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x90, 0x00, /* 0x10-0x13 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x90, 0x00, 0x8C, 0x49, /* 0x14-0x17 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x90, 0xF0, /* 0x10-0x13 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x90, 0xB2, 0x8C, 0x49, /* 0x14-0x17 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x18-0x1B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x9E, 0x78, 0x3F, 0x3F, /* 0x1C-0x1F */
 	0x3F, 0x3F, 0x8D, 0x5A, 0x8A, 0x9C, 0x3F, 0x3F, /* 0x20-0x23 */
@@ -5704,171 +5706,171 @@
 	0x3F, 0x3F, 0x9E, 0x7A, 0x8A, 0x94, 0x9E, 0x81, /* 0x28-0x2B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x9E, 0x7D, 0x3F, 0x3F, /* 0x30-0x33 */
-	0x90, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */
-	0x8A, 0x6A, 0x8D, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x38-0x3B */
-	0x8A, 0x69, 0x8D, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */
+	0x90, 0xF1, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */
+	0x8A, 0x6A, 0x8D, 0xAA, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x38-0x3B */
+	0x8A, 0x69, 0x8D, 0xCD, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */
 	0x9E, 0x7B, 0x8C, 0x85, 0x8C, 0x6A, 0x93, 0x8D, /* 0x40-0x43 */
-	0x00, 0x00, 0x3F, 0x3F, 0x9E, 0x79, 0x3F, 0x3F, /* 0x44-0x47 */
-	0x88, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */
+	0xED, 0xCA, 0x3F, 0x3F, 0x9E, 0x79, 0x3F, 0x3F, /* 0x44-0x47 */
+	0x88, 0xC4, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */
 	0x3F, 0x3F, 0x9E, 0x7C, 0x9E, 0x7E, 0x3F, 0x3F, /* 0x4C-0x4F */
-	0x8B, 0x00, 0x8C, 0x4B, 0x00, 0x00, 0x8A, 0x00, /* 0x50-0x53 */
+	0x8B, 0xCB, 0x8C, 0x4B, 0xED, 0xC7, 0x8A, 0xBA, /* 0x50-0x53 */
 	0x8B, 0x6A, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */
 	0x3F, 0x3F, 0x9E, 0x82, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */
-	0x8D, 0x00, 0x96, 0x91, 0x3F, 0x3F, 0x8E, 0x56, /* 0x5C-0x5F */
+	0x8D, 0xF7, 0x96, 0x91, 0x3F, 0x3F, 0x8E, 0x56, /* 0x5C-0x5F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x9E, 0x83, /* 0x60-0x63 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x95, 0x4F, /* 0x64-0x67 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x68-0x6B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */
-	0x9E, 0x8F, 0x3F, 0x3F, 0x89, 0x00, 0x9E, 0x84, /* 0x74-0x77 */
+	0x9E, 0x8F, 0x3F, 0x3F, 0x89, 0xB1, 0x9E, 0x84, /* 0x74-0x77 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x9E, 0x95, 0x9E, 0x85, /* 0x7C-0x7F */
 	
-	0x3F, 0x3F, 0x97, 0x00, 0x3F, 0x3F, 0x9E, 0x8C, /* 0x80-0x83 */
+	0x3F, 0x3F, 0x97, 0xC0, 0x3F, 0x3F, 0x9E, 0x8C, /* 0x80-0x83 */
 	0x3F, 0x3F, 0x94, 0x7E, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x88-0x8B */
 	0x3F, 0x3F, 0x9E, 0x94, 0x3F, 0x3F, 0x9E, 0x87, /* 0x8C-0x8F */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x88, 0x00, /* 0x90-0x93 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x88, 0xB2, /* 0x90-0x93 */
 	0x9E, 0x89, 0x3F, 0x3F, 0x3F, 0x3F, 0x8D, 0x5B, /* 0x94-0x97 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x9E, 0x8B, /* 0x98-0x9B */
 	0x3F, 0x3F, 0x9E, 0x8A, 0x3F, 0x3F, 0x9E, 0x86, /* 0x9C-0x9F */
-	0x9E, 0x91, 0x3F, 0x3F, 0x8F, 0x00, 0x3F, 0x3F, /* 0xA0-0xA3 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x9A, 0x00, 0x8C, 0x00, /* 0xA4-0xA7 */
+	0x9E, 0x91, 0x3F, 0x3F, 0x8F, 0xBD, 0x3F, 0x3F, /* 0xA0-0xA3 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x9A, 0xEB, 0x8C, 0xE6, /* 0xA4-0xA7 */
 	0x97, 0x9C, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */
-	0x3F, 0x3F, 0x9E, 0x88, 0x3F, 0x3F, 0x92, 0x00, /* 0xAC-0xAF */
-	0x8A, 0x42, 0x8D, 0x00, 0x3F, 0x3F, 0x9E, 0x80, /* 0xB0-0xB3 */
+	0x3F, 0x3F, 0x9E, 0x88, 0x3F, 0x3F, 0x92, 0xF2, /* 0xAC-0xAF */
+	0x8A, 0x42, 0x8D, 0xAB, 0x3F, 0x3F, 0x9E, 0x80, /* 0xB0-0xB3 */
 	0x3F, 0x3F, 0x9E, 0x90, 0x8A, 0x81, 0x3F, 0x3F, /* 0xB4-0xB7 */
 	0x3F, 0x3F, 0x9E, 0x8E, 0x9E, 0x92, 0x3F, 0x3F, /* 0xB8-0xBB */
 	0x93, 0x8E, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */
-	0x8A, 0x00, 0x3F, 0x3F, 0x9E, 0x00, 0x3F, 0x3F, /* 0xC4-0xC7 */
-	0x00, 0x64, 0x96, 0x00, 0x9E, 0x97, 0x8A, 0x00, /* 0xC8-0xCB */
-	0x3F, 0x3F, 0x9E, 0x9E, 0x3F, 0x3F, 0x00, 0x00, /* 0xCC-0xCF */
+	0x8A, 0xFC, 0x3F, 0x3F, 0x9E, 0xB0, 0x3F, 0x3F, /* 0xC4-0xC7 */
+	0xED, 0x48, 0x96, 0xC7, 0x9E, 0x97, 0x8A, 0xFB, /* 0xC8-0xCB */
+	0x3F, 0x3F, 0x9E, 0x9E, 0x3F, 0x3F, 0xED, 0xCB, /* 0xCC-0xCF */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x96, 0x5F, 0x3F, 0x3F, /* 0xD0-0xD3 */
-	0x9E, 0x9F, 0x9E, 0x00, 0x3F, 0x3F, 0x9E, 0x00, /* 0xD4-0xD7 */
+	0x9E, 0x9F, 0x9E, 0xA1, 0x3F, 0x3F, 0x9E, 0xA5, /* 0xD4-0xD7 */
 	0x9E, 0x99, 0x3F, 0x3F, 0x92, 0x49, 0x3F, 0x3F, /* 0xD8-0xDB */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x93, 0x8F, /* 0xDC-0xDF */
-	0x9E, 0x00, 0x9E, 0x9C, 0x3F, 0x3F, 0x9E, 0x00, /* 0xE0-0xE3 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x9E, 0x00, /* 0xE4-0xE7 */
+	0x9E, 0xA9, 0x9E, 0x9C, 0x3F, 0x3F, 0x9E, 0xA6, /* 0xE0-0xE3 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x9E, 0xA0, /* 0xE4-0xE7 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x90, 0x58, 0x9E, 0x00, /* 0xEC-0xEF */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x90, 0x00, 0x3F, 0x3F, /* 0xF0-0xF3 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x90, 0x58, 0x9E, 0xAA, /* 0xEC-0xEF */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x90, 0xB1, 0x3F, 0x3F, /* 0xF0-0xF3 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */
-	0x3F, 0x3F, 0x9E, 0x00, 0x8A, 0x00, 0x3F, 0x3F, /* 0xF8-0xFB */
+	0x3F, 0x3F, 0x9E, 0xA8, 0x8A, 0xBB, 0x3F, 0x3F, /* 0xF8-0xFB */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */
 };
 
 static unsigned char u2c_69[512] = {
 	0x98, 0x6F, 0x9E, 0x96, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */
-	0x9E, 0x00, 0x88, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x04-0x07 */
-	0x9E, 0x98, 0x3F, 0x3F, 0x3F, 0x3F, 0x96, 0x00, /* 0x08-0x0B */
-	0x9E, 0x9D, 0x90, 0x41, 0x92, 0x00, 0x9E, 0x93, /* 0x0C-0x0F */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x9E, 0x00, 0x3F, 0x3F, /* 0x10-0x13 */
+	0x9E, 0xA4, 0x88, 0xD6, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x04-0x07 */
+	0x9E, 0x98, 0x3F, 0x3F, 0x3F, 0x3F, 0x96, 0xB8, /* 0x08-0x0B */
+	0x9E, 0x9D, 0x90, 0x41, 0x92, 0xC5, 0x9E, 0x93, /* 0x0C-0x0F */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x9E, 0xA3, 0x3F, 0x3F, /* 0x10-0x13 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */
-	0x3F, 0x3F, 0x90, 0x9A, 0x9E, 0x00, 0x8A, 0x91, /* 0x18-0x1B */
+	0x3F, 0x3F, 0x90, 0x9A, 0x9E, 0xAD, 0x8A, 0x91, /* 0x18-0x1B */
 	0x8C, 0x9F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */
-	0x3F, 0x3F, 0x9E, 0x00, 0x9E, 0x9A, 0x9E, 0x00, /* 0x20-0x23 */
-	0x3F, 0x3F, 0x9E, 0x00, 0x9E, 0x9B, 0x3F, 0x3F, /* 0x24-0x27 */
-	0x9E, 0x00, 0x3F, 0x3F, 0x9E, 0x00, 0x3F, 0x3F, /* 0x28-0x2B */
+	0x3F, 0x3F, 0x9E, 0xAF, 0x9E, 0x9A, 0x9E, 0xAE, /* 0x20-0x23 */
+	0x3F, 0x3F, 0x9E, 0xA7, 0x9E, 0x9B, 0x3F, 0x3F, /* 0x24-0x27 */
+	0x9E, 0xAB, 0x3F, 0x3F, 0x9E, 0xAC, 0x3F, 0x3F, /* 0x28-0x2B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */
-	0x9E, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */
-	0x93, 0x00, 0x3F, 0x3F, 0x9E, 0x00, 0x3F, 0x3F, /* 0x34-0x37 */
-	0x3F, 0x3F, 0x9E, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x38-0x3B */
-	0x3F, 0x3F, 0x9E, 0x00, 0x3F, 0x3F, 0x92, 0x00, /* 0x3C-0x3F */
+	0x9E, 0xBD, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */
+	0x93, 0xCC, 0x3F, 0x3F, 0x9E, 0xA2, 0x3F, 0x3F, /* 0x34-0x37 */
+	0x3F, 0x3F, 0x9E, 0xB9, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x38-0x3B */
+	0x3F, 0x3F, 0x9E, 0xBB, 0x3F, 0x3F, 0x92, 0xD6, /* 0x3C-0x3F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x97, 0x6B, 0x3F, 0x3F, /* 0x48-0x4B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x4C-0x4F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x95, 0x96, /* 0x50-0x53 */
-	0x9E, 0x00, 0x91, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */
-	0x3F, 0x3F, 0x9E, 0x00, 0x91, 0x5E, 0x3F, 0x3F, /* 0x58-0x5B */
-	0x9E, 0x00, 0x9E, 0x00, 0x9E, 0x00, 0x3F, 0x3F, /* 0x5C-0x5F */
-	0x93, 0x00, 0x9E, 0x00, 0x93, 0x00, 0x3F, 0x3F, /* 0x60-0x63 */
+	0x9E, 0xB6, 0x91, 0xC8, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */
+	0x3F, 0x3F, 0x9E, 0xBC, 0x91, 0x5E, 0x3F, 0x3F, /* 0x58-0x5B */
+	0x9E, 0xB3, 0x9E, 0xC0, 0x9E, 0xBF, 0x3F, 0x3F, /* 0x5C-0x5F */
+	0x93, 0xED, 0x9E, 0xBE, 0x93, 0xE8, 0x3F, 0x3F, /* 0x60-0x63 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */
-	0x00, 0x00, 0x3F, 0x3F, 0x9E, 0x00, 0x9E, 0x00, /* 0x68-0x6B */
-	0x3F, 0x3F, 0x8B, 0x00, 0x9E, 0x00, 0x8F, 0x7C, /* 0x6C-0x6F */
+	0xED, 0xCD, 0x3F, 0x3F, 0x9E, 0xC2, 0x9E, 0xB5, /* 0x68-0x6B */
+	0x3F, 0x3F, 0x8B, 0xC6, 0x9E, 0xB8, 0x8F, 0x7C, /* 0x6C-0x6F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x94, 0x80, /* 0x70-0x73 */
-	0x9E, 0x00, 0x8B, 0x00, 0x3F, 0x3F, 0x9E, 0x00, /* 0x74-0x77 */
-	0x9E, 0x00, 0x9E, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */
-	0x98, 0x4F, 0x8A, 0x79, 0x9E, 0x00, 0x3F, 0x3F, /* 0x7C-0x7F */
+	0x9E, 0xBA, 0x8B, 0xC9, 0x3F, 0x3F, 0x9E, 0xB2, /* 0x74-0x77 */
+	0x9E, 0xB4, 0x9E, 0xB1, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */
+	0x98, 0x4F, 0x8A, 0x79, 0x9E, 0xB7, 0x3F, 0x3F, /* 0x7C-0x7F */
 	
-	0x3F, 0x3F, 0x9E, 0x00, 0x8A, 0x54, 0x3F, 0x3F, /* 0x80-0x83 */
+	0x3F, 0x3F, 0x9E, 0xC1, 0x8A, 0x54, 0x3F, 0x3F, /* 0x80-0x83 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x8D, 0x00, 0x3F, 0x3F, /* 0x88-0x8B */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x8D, 0xE5, 0x3F, 0x3F, /* 0x88-0x8B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x89, 0x7C, 0x3F, 0x3F, /* 0x8C-0x8F */
-	0x3F, 0x3F, 0x9E, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */
-	0x98, 0x50, 0x9E, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */
-	0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x90, 0x59, /* 0x98-0x9B */
-	0x9E, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */
-	0x9E, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x9E, 0x00, /* 0xA4-0xA7 */
+	0x3F, 0x3F, 0x9E, 0xD2, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */
+	0x98, 0x50, 0x9E, 0xD5, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */
+	0xED, 0xCF, 0x3F, 0x3F, 0x3F, 0x3F, 0x90, 0x59, /* 0x98-0x9B */
+	0x9E, 0xD4, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */
+	0x9E, 0xD3, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x9E, 0xD0, /* 0xA4-0xA7 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x9E, 0x00, 0x3F, 0x3F, /* 0xAC-0xAF */
-	0x3F, 0x3F, 0x9E, 0x00, 0x9E, 0x00, 0x3F, 0x3F, /* 0xB0-0xB3 */
-	0x9E, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x9E, 0x00, /* 0xB8-0xBB */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x9E, 0x00, 0x9E, 0x00, /* 0xBC-0xBF */
-	0x3F, 0x3F, 0x9E, 0x00, 0x3F, 0x3F, 0x9E, 0x00, /* 0xC0-0xC3 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0xC4-0xC7 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x9E, 0x00, 0x8D, 0x5C, /* 0xC8-0xCB */
-	0x92, 0x00, 0x91, 0x84, 0x9E, 0x00, 0x3F, 0x3F, /* 0xCC-0xCF */
-	0x9E, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x9E, 0x00, /* 0xD0-0xD3 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x9E, 0xC4, 0x3F, 0x3F, /* 0xAC-0xAF */
+	0x3F, 0x3F, 0x9E, 0xE1, 0x9E, 0xC3, 0x3F, 0x3F, /* 0xB0-0xB3 */
+	0x9E, 0xD6, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x9E, 0xCE, /* 0xB8-0xBB */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x9E, 0xC9, 0x9E, 0xC6, /* 0xBC-0xBF */
+	0x3F, 0x3F, 0x9E, 0xC7, 0x3F, 0x3F, 0x9E, 0xCF, /* 0xC0-0xC3 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xEA, 0xA0, /* 0xC4-0xC7 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x9E, 0xCC, 0x8D, 0x5C, /* 0xC8-0xCB */
+	0x92, 0xC6, 0x91, 0x84, 0x9E, 0xCA, 0x3F, 0x3F, /* 0xCC-0xCF */
+	0x9E, 0xC5, 0x3F, 0x3F, 0x3F, 0x3F, 0x9E, 0xC8, /* 0xD0-0xD3 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */
 	0x97, 0x6C, 0x96, 0x8A, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */
-	0x3F, 0x3F, 0x9E, 0x00, 0x9E, 0x00, 0x3F, 0x3F, /* 0xDC-0xDF */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0xE0-0xE3 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x9E, 0x00, /* 0xE4-0xE7 */
-	0x9E, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x9E, 0x00, /* 0xE8-0xEB */
-	0x3F, 0x3F, 0x9E, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x9E, 0x00, 0x3F, 0x3F, /* 0xF0-0xF3 */
+	0x3F, 0x3F, 0x9E, 0xCD, 0x9E, 0xD7, 0x3F, 0x3F, /* 0xDC-0xDF */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xED, 0xD0, 0x3F, 0x3F, /* 0xE0-0xE3 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x9E, 0xDF, /* 0xE4-0xE7 */
+	0x9E, 0xD8, 0x3F, 0x3F, 0x3F, 0x3F, 0x9E, 0xE5, /* 0xE8-0xEB */
+	0x3F, 0x3F, 0x9E, 0xE3, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x9E, 0xDE, 0x3F, 0x3F, /* 0xF0-0xF3 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */
-	0x3F, 0x3F, 0x9E, 0x00, 0x3F, 0x3F, 0x92, 0x00, /* 0xF8-0xFB */
-	0x3F, 0x3F, 0x91, 0x85, 0x3F, 0x3F, 0x9E, 0x00, /* 0xFC-0xFF */
+	0x3F, 0x3F, 0x9E, 0xDD, 0x3F, 0x3F, 0x92, 0xCE, /* 0xF8-0xFB */
+	0x3F, 0x3F, 0x91, 0x85, 0x3F, 0x3F, 0x9E, 0xDB, /* 0xFC-0xFF */
 };
 
 static unsigned char u2c_6A[512] = {
-	0x3F, 0x3F, 0x3F, 0x3F, 0x9E, 0x00, 0x3F, 0x3F, /* 0x00-0x03 */
-	0x3F, 0x3F, 0x9E, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x04-0x07 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x9E, 0x00, 0x94, 0x00, /* 0x08-0x0B */
-	0x9E, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x9E, 0x00, 0x9E, 0x00, /* 0x10-0x13 */
-	0x9E, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x92, 0x94, /* 0x14-0x17 */
-	0x3F, 0x3F, 0x95, 0x57, 0x3F, 0x3F, 0x9E, 0x00, /* 0x18-0x1B */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x9E, 0x00, 0x8F, 0x00, /* 0x1C-0x1F */
-	0x3F, 0x3F, 0x96, 0x00, 0x9E, 0x00, 0x9E, 0x00, /* 0x20-0x23 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x9E, 0xD9, 0x3F, 0x3F, /* 0x00-0x03 */
+	0x3F, 0x3F, 0x9E, 0xE0, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x04-0x07 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x9E, 0xE6, 0x94, 0xF3, /* 0x08-0x0B */
+	0x9E, 0xEC, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x9E, 0xE7, 0x9E, 0xEA, /* 0x10-0x13 */
+	0x9E, 0xE4, 0x3F, 0x3F, 0x3F, 0x3F, 0x92, 0x94, /* 0x14-0x17 */
+	0x3F, 0x3F, 0x95, 0x57, 0x3F, 0x3F, 0x9E, 0xDA, /* 0x18-0x1B */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x9E, 0xE2, 0x8F, 0xBE, /* 0x1C-0x1F */
+	0x3F, 0x3F, 0x96, 0xCD, 0x9E, 0xF6, 0x9E, 0xE9, /* 0x20-0x23 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */
-	0x3F, 0x3F, 0x8C, 0x00, 0x89, 0x00, 0x8A, 0x7E, /* 0x28-0x2B */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x9E, 0x00, 0x3F, 0x3F, /* 0x2C-0x2F */
-	0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */
-	0x3F, 0x3F, 0x8F, 0x00, 0x9E, 0x00, 0x3F, 0x3F, /* 0x34-0x37 */
-	0x9E, 0x00, 0x8E, 0x00, 0x8A, 0x92, 0x3F, 0x3F, /* 0x38-0x3B */
+	0x3F, 0x3F, 0x8C, 0xA0, 0x89, 0xA1, 0x8A, 0x7E, /* 0x28-0x2B */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x9E, 0xD1, 0x3F, 0x3F, /* 0x2C-0x2F */
+	0xED, 0xD1, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */
+	0x3F, 0x3F, 0x8F, 0xBF, 0x9E, 0xEE, 0x3F, 0x3F, /* 0x34-0x37 */
+	0x9E, 0xF5, 0x8E, 0xF7, 0x8A, 0x92, 0x3F, 0x3F, /* 0x38-0x3B */
 	0x3F, 0x3F, 0x92, 0x4D, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */
-	0x9E, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x9E, 0x00, /* 0x44-0x47 */
-	0x9E, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x8B, 0x00, /* 0x48-0x4B */
+	0x9E, 0xEB, 0x3F, 0x3F, 0xED, 0xD3, 0x9E, 0xF0, /* 0x44-0x47 */
+	0x9E, 0xF4, 0x3F, 0x3F, 0x3F, 0x3F, 0x8B, 0xB4, /* 0x48-0x4B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x4C-0x4F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */
-	0x8B, 0x6B, 0x9E, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */
+	0x8B, 0x6B, 0x9E, 0xF2, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x8B, 0x40, /* 0x5C-0x5F */
-	0x3F, 0x3F, 0x93, 0x00, 0x9E, 0x00, 0x3F, 0x3F, /* 0x60-0x63 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x9E, 0x00, 0x3F, 0x3F, /* 0x64-0x67 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0x68-0x6B */
+	0x3F, 0x3F, 0x93, 0xC9, 0x9E, 0xF1, 0x3F, 0x3F, /* 0x60-0x63 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x9E, 0xF3, 0x3F, 0x3F, /* 0x64-0x67 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xED, 0xD2, /* 0x68-0x6B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x9E, 0x00, 0x00, 0x00, /* 0x70-0x73 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x9E, 0xED, 0xED, 0xD4, /* 0x70-0x73 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x74-0x77 */
-	0x9E, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x8A, 0x80, /* 0x7C-0x7F */
+	0x9E, 0xEF, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xED, 0xD5, 0x8A, 0x80, /* 0x7C-0x7F */
 	
 	0x92, 0x68, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */
-	0x9E, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */
+	0x9E, 0xFA, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x88-0x8B */
-	0x3F, 0x3F, 0x9E, 0x00, 0x8C, 0x00, 0x3F, 0x3F, /* 0x8C-0x8F */
-	0x9E, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */
+	0x3F, 0x3F, 0x9E, 0xF8, 0x8C, 0xE7, 0x3F, 0x3F, /* 0x8C-0x8F */
+	0x9E, 0xF7, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x9F, 0x40, /* 0x94-0x97 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */
 	0x9E, 0x77, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */
-	0x9E, 0x00, 0x3F, 0x3F, 0x9E, 0x00, 0x9E, 0x00, /* 0xA0-0xA3 */
+	0x9E, 0xF9, 0x3F, 0x3F, 0x9E, 0xFB, 0x9E, 0xFC, /* 0xA0-0xA3 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x9F, 0x4B, 0x3F, 0x3F, /* 0xA8-0xAB */
 	0x9F, 0x47, 0x3F, 0x3F, 0x9E, 0x8D, 0x3F, 0x3F, /* 0xAC-0xAF */
@@ -5876,17 +5878,17 @@
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */
 	0x9F, 0x45, 0x3F, 0x3F, 0x3F, 0x3F, 0x9F, 0x42, /* 0xB8-0xBB */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */
-	0x3F, 0x3F, 0x9E, 0x00, 0x9F, 0x44, 0x9F, 0x43, /* 0xC0-0xC3 */
+	0x3F, 0x3F, 0x9E, 0xE8, 0x9F, 0x44, 0x9F, 0x43, /* 0xC0-0xC3 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC4-0xC7 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC8-0xCB */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */
 	0x3F, 0x3F, 0x9F, 0x49, 0x3F, 0x3F, 0x98, 0x45, /* 0xD0-0xD3 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x9F, 0x4C, 0x8B, 0x00, /* 0xD8-0xDB */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x9F, 0x4C, 0x8B, 0xF9, /* 0xD8-0xDB */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x9F, 0x48, 0x9F, 0x4A, /* 0xDC-0xDF */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0xE0-0xE3 */
-	0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */
-	0x94, 0x00, 0x3F, 0x3F, 0x9F, 0x4D, 0x3F, 0x3F, /* 0xE8-0xEB */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xED, 0xD6, 0x3F, 0x3F, /* 0xE0-0xE3 */
+	0xED, 0xD7, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */
+	0x94, 0xA5, 0x3F, 0x3F, 0x9F, 0x4D, 0x3F, 0x3F, /* 0xE8-0xEB */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */
@@ -5897,40 +5899,40 @@
 static unsigned char u2c_6B[512] = {
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */
 	0x97, 0x93, 0x9F, 0x4F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x04-0x07 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x9E, 0x00, 0x3F, 0x3F, /* 0x08-0x0B */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x9E, 0xDC, 0x3F, 0x3F, /* 0x08-0x0B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x9F, 0x52, 0x3F, 0x3F, /* 0x10-0x13 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x9F, 0x53, 0x3F, 0x3F, /* 0x14-0x17 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x18-0x1B */
 	0x3F, 0x3F, 0x89, 0x54, 0x3F, 0x3F, 0x9F, 0x55, /* 0x1C-0x1F */
-	0x8C, 0x87, 0x8E, 0x9F, 0x3F, 0x3F, 0x8B, 0x00, /* 0x20-0x23 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x89, 0x00, /* 0x24-0x27 */
+	0x8C, 0x87, 0x8E, 0x9F, 0x3F, 0x3F, 0x8B, 0xD3, /* 0x20-0x23 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x89, 0xA2, /* 0x24-0x27 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x97, 0x7E, 0x3F, 0x3F, /* 0x30-0x33 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x9F, 0x57, /* 0x34-0x37 */
 	0x9F, 0x56, 0x9F, 0x59, 0x8B, 0x5C, 0x3F, 0x3F, /* 0x38-0x3B */
-	0x3F, 0x3F, 0x8B, 0x00, 0x8A, 0x00, 0x3F, 0x3F, /* 0x3C-0x3F */
+	0x3F, 0x3F, 0x8B, 0xD4, 0x8A, 0xBC, 0x3F, 0x3F, /* 0x3C-0x3F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x9F, 0x5C, /* 0x40-0x43 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x9F, 0x5B, /* 0x44-0x47 */
 	0x3F, 0x3F, 0x9F, 0x5D, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */
-	0x89, 0x00, 0x3F, 0x3F, 0x92, 0x56, 0x3F, 0x3F, /* 0x4C-0x4F */
-	0x9F, 0x5E, 0x3F, 0x3F, 0x3F, 0x3F, 0x8A, 0x00, /* 0x50-0x53 */
+	0x89, 0xCC, 0x3F, 0x3F, 0x92, 0x56, 0x3F, 0x3F, /* 0x4C-0x4F */
+	0x9F, 0x5E, 0x3F, 0x3F, 0x3F, 0x3F, 0x8A, 0xBD, /* 0x50-0x53 */
 	0x9F, 0x60, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */
 	0x3F, 0x3F, 0x9F, 0x5F, 0x3F, 0x3F, 0x9F, 0x61, /* 0x58-0x5B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x9F, 0x62, /* 0x5C-0x5F */
-	0x3F, 0x3F, 0x9F, 0x63, 0x8E, 0x7E, 0x90, 0x00, /* 0x60-0x63 */
+	0x3F, 0x3F, 0x9F, 0x63, 0x8E, 0x7E, 0x90, 0xB3, /* 0x60-0x63 */
 	0x8D, 0x9F, 0x3F, 0x3F, 0x95, 0x90, 0x3F, 0x3F, /* 0x64-0x67 */
-	0x3F, 0x3F, 0x95, 0x00, 0x98, 0x63, 0x3F, 0x3F, /* 0x68-0x6B */
+	0x3F, 0x3F, 0x95, 0xE0, 0x98, 0x63, 0x3F, 0x3F, /* 0x68-0x6B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x8E, 0x95, /* 0x6C-0x6F */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x8D, 0x00, /* 0x70-0x73 */
-	0x97, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x74-0x77 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x8D, 0xCE, /* 0x70-0x73 */
+	0x97, 0xF0, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x74-0x77 */
 	0x9F, 0x64, 0x9F, 0x65, 0x3F, 0x3F, 0x8E, 0x80, /* 0x78-0x7B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x9F, 0x66, /* 0x7C-0x7F */
 	
 	0x9F, 0x67, 0x3F, 0x3F, 0x3F, 0x3F, 0x9F, 0x69, /* 0x80-0x83 */
 	0x9F, 0x68, 0x3F, 0x3F, 0x96, 0x77, 0x3F, 0x3F, /* 0x84-0x87 */
-	0x3F, 0x3F, 0x8F, 0x7D, 0x8E, 0x00, 0x8E, 0x63, /* 0x88-0x8B */
+	0x3F, 0x3F, 0x8F, 0x7D, 0x8E, 0xEA, 0x8E, 0x63, /* 0x88-0x8B */
 	0x3F, 0x3F, 0x9F, 0x6A, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */
 	0x3F, 0x3F, 0x9F, 0x6C, 0x90, 0x42, 0x3F, 0x3F, /* 0x94-0x97 */
@@ -5941,16 +5943,16 @@
 	0x3F, 0x3F, 0x3F, 0x3F, 0x9F, 0x6F, 0x9F, 0x70, /* 0xA8-0xAB */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x9F, 0x71, /* 0xAC-0xAF */
 	0x3F, 0x3F, 0x9F, 0x73, 0x9F, 0x72, 0x9F, 0x74, /* 0xB0-0xB3 */
-	0x89, 0x00, 0x92, 0x69, 0x3F, 0x3F, 0x9F, 0x75, /* 0xB4-0xB7 */
+	0x89, 0xA3, 0x92, 0x69, 0x3F, 0x3F, 0x9F, 0x75, /* 0xB4-0xB7 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x8E, 0x45, 0x8A, 0x6B, /* 0xB8-0xBB */
 	0x9F, 0x76, 0x3F, 0x3F, 0x3F, 0x3F, 0x93, 0x61, /* 0xBC-0xBF */
-	0x9A, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */
+	0x9A, 0xCA, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */
 	0x3F, 0x3F, 0x8B, 0x42, 0x9F, 0x77, 0x3F, 0x3F, /* 0xC4-0xC7 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x9F, 0x78, /* 0xC8-0xCB */
-	0x3F, 0x3F, 0x95, 0x00, 0x96, 0x88, 0x3F, 0x3F, /* 0xCC-0xCF */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x93, 0x00, 0x9F, 0x79, /* 0xD0-0xD3 */
-	0x94, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0xD4-0xD7 */
-	0x94, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x96, 0x00, /* 0xD8-0xDB */
+	0x3F, 0x3F, 0x95, 0xEA, 0x96, 0x88, 0x3F, 0x3F, /* 0xCC-0xCF */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x93, 0xC5, 0x9F, 0x79, /* 0xD0-0xD3 */
+	0x94, 0xE4, 0x3F, 0x3F, 0xED, 0xD8, 0x3F, 0x3F, /* 0xD4-0xD7 */
+	0x94, 0xF9, 0x3F, 0x3F, 0x3F, 0x3F, 0x96, 0xD1, /* 0xD8-0xDB */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x9F, 0x7A, /* 0xDC-0xDF */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */
@@ -5967,7 +5969,7 @@
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x04-0x07 */
 	0x9F, 0x81, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x08-0x0B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x8E, 0x81, /* 0x0C-0x0F */
-	0x3F, 0x3F, 0x96, 0x00, 0x3F, 0x3F, 0x9F, 0x82, /* 0x10-0x13 */
+	0x3F, 0x3F, 0x96, 0xAF, 0x3F, 0x3F, 0x9F, 0x82, /* 0x10-0x13 */
 	0x9F, 0x83, 0x3F, 0x3F, 0x3F, 0x3F, 0x8B, 0x43, /* 0x14-0x17 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x9F, 0x84, /* 0x18-0x1B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */
@@ -5978,53 +5980,53 @@
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */
 	0x90, 0x85, 0x3F, 0x3F, 0x3F, 0x3F, 0x95, 0x58, /* 0x34-0x37 */
 	0x89, 0x69, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x38-0x3B */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x94, 0x00, 0x00, 0x00, /* 0x3C-0x3F */
-	0x92, 0x00, 0x8F, 0x60, 0x8B, 0x81, 0x3F, 0x3F, /* 0x40-0x43 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x94, 0xC3, 0xED, 0xD9, /* 0x3C-0x3F */
+	0x92, 0xF3, 0x8F, 0x60, 0x8B, 0x81, 0x3F, 0x3F, /* 0x40-0x43 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x94, 0x00, 0x3F, 0x3F, /* 0x4C-0x4F */
-	0x8E, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */
-	0x3F, 0x3F, 0x9F, 0x88, 0x3F, 0x3F, 0x8A, 0x00, /* 0x54-0x57 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x94, 0xC4, 0x3F, 0x3F, /* 0x4C-0x4F */
+	0x8E, 0xAC, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */
+	0x3F, 0x3F, 0x9F, 0x88, 0x3F, 0x3F, 0x8A, 0xBE, /* 0x54-0x57 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x89, 0x98, 0x3F, 0x3F, /* 0x58-0x5B */
-	0x00, 0x00, 0x93, 0x00, 0x9F, 0x87, 0x8D, 0x5D, /* 0x5C-0x5F */
+	0xED, 0xDA, 0x93, 0xF0, 0x9F, 0x87, 0x8D, 0x5D, /* 0x5C-0x5F */
 	0x92, 0x72, 0x3F, 0x3F, 0x9F, 0x89, 0x3F, 0x3F, /* 0x60-0x63 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */
 	0x9F, 0x91, 0x3F, 0x3F, 0x9F, 0x8A, 0x3F, 0x3F, /* 0x68-0x6B */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0x6C-0x6F */
-	0x91, 0x00, 0x3F, 0x3F, 0x8B, 0x82, 0x9F, 0x92, /* 0x70-0x73 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xED, 0xDC, /* 0x6C-0x6F */
+	0x91, 0xBF, 0x3F, 0x3F, 0x8B, 0x82, 0x9F, 0x92, /* 0x70-0x73 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x74-0x77 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x8C, 0x88, 0x3F, 0x3F, /* 0x78-0x7B */
 	0x3F, 0x3F, 0x8B, 0x44, 0x9F, 0x90, 0x3F, 0x3F, /* 0x7C-0x7F */
 	
 	0x3F, 0x3F, 0x9F, 0x8E, 0x9F, 0x8B, 0x97, 0x80, /* 0x80-0x83 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0x84-0x87 */
-	0x92, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x88-0x8B */
-	0x93, 0x00, 0x9F, 0x8C, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xED, 0xDB, 0x3F, 0x3F, /* 0x84-0x87 */
+	0x92, 0xBE, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x88-0x8B */
+	0x93, 0xD7, 0x9F, 0x8C, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */
 	0x9F, 0x94, 0x3F, 0x3F, 0x9F, 0x93, 0x8C, 0x42, /* 0x90-0x93 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x89, 0x00, 0x3F, 0x3F, /* 0x94-0x97 */
-	0x3F, 0x3F, 0x8D, 0x00, 0x9F, 0x8D, 0x9F, 0x8F, /* 0x98-0x9B */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x89, 0xAB, 0x3F, 0x3F, /* 0x94-0x97 */
+	0x3F, 0x3F, 0x8D, 0xB9, 0x9F, 0x8D, 0x9F, 0x8F, /* 0x98-0x9B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */
-	0x3F, 0x3F, 0x96, 0x76, 0x91, 0x00, 0x3F, 0x3F, /* 0xA0-0xA3 */
+	0x3F, 0x3F, 0x96, 0x76, 0x91, 0xF2, 0x3F, 0x3F, /* 0xA0-0xA3 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x96, 0x97, /* 0xA8-0xAB */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x9F, 0x9C, 0x3F, 0x3F, /* 0xAC-0xAF */
-	0x3F, 0x3F, 0x9F, 0x9D, 0x3F, 0x3F, 0x89, 0x00, /* 0xB0-0xB3 */
+	0x3F, 0x3F, 0x9F, 0x9D, 0x3F, 0x3F, 0x89, 0xCD, /* 0xB0-0xB3 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */
-	0x95, 0x00, 0x96, 0x00, 0x9F, 0x9F, 0x8E, 0x00, /* 0xB8-0xBB */
-	0x8F, 0x00, 0x9F, 0x98, 0x9F, 0x9E, 0x89, 0x88, /* 0xBC-0xBF */
-	0x3F, 0x3F, 0x8B, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */
+	0x95, 0xA6, 0x96, 0xFB, 0x9F, 0x9F, 0x8E, 0xA1, /* 0xB8-0xBB */
+	0x8F, 0xC0, 0x9F, 0x98, 0x9F, 0x9E, 0x89, 0x88, /* 0xBC-0xBF */
+	0x3F, 0x3F, 0x8B, 0xB5, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */
 	0x9F, 0x95, 0x9F, 0x9A, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC4-0xC7 */
-	0x3F, 0x3F, 0x90, 0x00, 0x94, 0x91, 0x3F, 0x3F, /* 0xC8-0xCB */
-	0x94, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */
+	0x3F, 0x3F, 0x90, 0xF2, 0x94, 0x91, 0x3F, 0x3F, /* 0xC8-0xCB */
+	0x94, 0xE5, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x9F, 0x97, /* 0xD0-0xD3 */
 	0x3F, 0x3F, 0x96, 0x40, 0x3F, 0x3F, 0x9F, 0x99, /* 0xD4-0xD7 */
-	0x3F, 0x3F, 0x9F, 0x00, 0x00, 0x00, 0x9F, 0x00, /* 0xD8-0xDB */
+	0x3F, 0x3F, 0x9F, 0xA2, 0xED, 0xDD, 0x9F, 0xA0, /* 0xD8-0xDB */
 	0x3F, 0x3F, 0x9F, 0x9B, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xDC-0xDF */
 	0x3F, 0x3F, 0x96, 0x41, 0x94, 0x67, 0x8B, 0x83, /* 0xE0-0xE3 */
 	0x3F, 0x3F, 0x93, 0x44, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */
-	0x92, 0x8D, 0x3F, 0x3F, 0x9F, 0x00, 0x3F, 0x3F, /* 0xE8-0xEB */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x9F, 0x00, /* 0xEC-0xEF */
-	0x91, 0x00, 0x9F, 0x96, 0x3F, 0x3F, 0x89, 0x6A, /* 0xF0-0xF3 */
+	0x92, 0x8D, 0x3F, 0x3F, 0x9F, 0xA3, 0x3F, 0x3F, /* 0xE8-0xEB */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x9F, 0xA1, /* 0xEC-0xEF */
+	0x91, 0xD7, 0x9F, 0x96, 0x3F, 0x3F, 0x89, 0x6A, /* 0xF0-0xF3 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF8-0xFB */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */
@@ -6032,763 +6034,763 @@
 
 static unsigned char u2c_6D[512] = {
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */
-	0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x04-0x07 */
+	0xED, 0xDE, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x04-0x07 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x97, 0x6D, /* 0x08-0x0B */
-	0x9F, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x9F, 0x00, 0x3F, 0x3F, /* 0x10-0x13 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x90, 0x00, /* 0x14-0x17 */
-	0x3F, 0x3F, 0x9F, 0x00, 0x3F, 0x3F, 0x97, 0x8C, /* 0x18-0x1B */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x93, 0x00, 0x9F, 0x00, /* 0x1C-0x1F */
+	0x9F, 0xAE, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x9F, 0xAD, 0x3F, 0x3F, /* 0x10-0x13 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x90, 0xF4, /* 0x14-0x17 */
+	0x3F, 0x3F, 0x9F, 0xAA, 0x3F, 0x3F, 0x97, 0x8C, /* 0x18-0x1B */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x93, 0xB4, 0x9F, 0xA4, /* 0x1C-0x1F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */
-	0x3F, 0x3F, 0x92, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */
-	0x3F, 0x3F, 0x89, 0x6B, 0x8D, 0x5E, 0x9F, 0x00, /* 0x28-0x2B */
+	0x3F, 0x3F, 0x92, 0xC3, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */
+	0x3F, 0x3F, 0x89, 0x6B, 0x8D, 0x5E, 0x9F, 0xA7, /* 0x28-0x2B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x8F, 0x46, 0x9F, 0x00, /* 0x30-0x33 */
-	0x3F, 0x3F, 0x9F, 0x00, 0x9F, 0x00, 0x3F, 0x3F, /* 0x34-0x37 */
-	0x9F, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x8A, 0x88, /* 0x38-0x3B */
-	0x3F, 0x3F, 0x9F, 0x00, 0x94, 0x68, 0x3F, 0x3F, /* 0x3C-0x3F */
-	0x3F, 0x3F, 0x97, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */
-	0x8F, 0x00, 0x90, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x8F, 0x46, 0x9F, 0xAC, /* 0x30-0x33 */
+	0x3F, 0x3F, 0x9F, 0xAB, 0x9F, 0xA6, 0x3F, 0x3F, /* 0x34-0x37 */
+	0x9F, 0xA9, 0x3F, 0x3F, 0x3F, 0x3F, 0x8A, 0x88, /* 0x38-0x3B */
+	0x3F, 0x3F, 0x9F, 0xA8, 0x94, 0x68, 0x3F, 0x3F, /* 0x3C-0x3F */
+	0x3F, 0x3F, 0x97, 0xAC, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */
+	0x8F, 0xF2, 0x90, 0xF3, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x4C-0x4F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */
-	0x3F, 0x3F, 0x9F, 0x00, 0x9F, 0x00, 0x3F, 0x3F, /* 0x58-0x5B */
+	0x3F, 0x3F, 0x9F, 0xB4, 0x9F, 0xB2, 0x3F, 0x3F, /* 0x58-0x5B */
 	0x95, 0x6C, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x5C-0x5F */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x9F, 0x00, /* 0x60-0x63 */
-	0x9F, 0x00, 0x3F, 0x3F, 0x89, 0x59, 0x3F, 0x3F, /* 0x64-0x67 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x9F, 0xAF, /* 0x60-0x63 */
+	0x9F, 0xB1, 0x3F, 0x3F, 0x89, 0x59, 0x3F, 0x3F, /* 0x64-0x67 */
 	0x3F, 0x3F, 0x8D, 0x5F, 0x98, 0x51, 0x3F, 0x3F, /* 0x68-0x6B */
-	0x8A, 0x5C, 0x3F, 0x3F, 0x95, 0x82, 0x00, 0x00, /* 0x6C-0x6F */
+	0x8A, 0x5C, 0x3F, 0x3F, 0x95, 0x82, 0xED, 0xE0, /* 0x6C-0x6F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */
 	0x97, 0x81, 0x3F, 0x3F, 0x3F, 0x3F, 0x8A, 0x43, /* 0x74-0x77 */
-	0x90, 0x5A, 0x9F, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */
+	0x90, 0x5A, 0x9F, 0xB3, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */
 	
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */
-	0x3F, 0x3F, 0x9F, 0x00, 0x3F, 0x3F, 0x00, 0x00, /* 0x84-0x87 */
-	0x8F, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x88-0x8B */
-	0x97, 0x4F, 0x3F, 0x3F, 0x9F, 0x00, 0x3F, 0x3F, /* 0x8C-0x8F */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x9F, 0x00, /* 0x90-0x93 */
-	0x3F, 0x3F, 0x9F, 0x00, 0x00, 0x40, 0x3F, 0x3F, /* 0x94-0x97 */
-	0x3F, 0x3F, 0x97, 0x00, 0x3F, 0x3F, 0x93, 0x93, /* 0x98-0x9B */
-	0x93, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */
+	0x3F, 0x3F, 0x9F, 0xB8, 0x3F, 0x3F, 0xED, 0xDF, /* 0x84-0x87 */
+	0x8F, 0xC1, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x88-0x8B */
+	0x97, 0x4F, 0x3F, 0x3F, 0x9F, 0xB5, 0x3F, 0x3F, /* 0x8C-0x8F */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x9F, 0xB0, /* 0x90-0x93 */
+	0x3F, 0x3F, 0x9F, 0xB6, 0xED, 0xE1, 0x3F, 0x3F, /* 0x94-0x97 */
+	0x3F, 0x3F, 0x97, 0xDC, 0x3F, 0x3F, 0x93, 0x93, /* 0x98-0x9B */
+	0x93, 0xC0, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */
-	0x00, 0x41, 0x3F, 0x3F, 0x3F, 0x3F, 0x8A, 0x55, /* 0xAC-0xAF */
+	0xED, 0xE2, 0x3F, 0x3F, 0x3F, 0x3F, 0x8A, 0x55, /* 0xAC-0xAF */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x89, 0x74, 0x3F, 0x3F, /* 0xB0-0xB3 */
-	0x3F, 0x3F, 0x9F, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */
-	0x9F, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */
-	0x97, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */
+	0x3F, 0x3F, 0x9F, 0xBC, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */
+	0x9F, 0xBF, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */
+	0x97, 0xC1, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */
 	0x97, 0x84, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */
-	0x3F, 0x3F, 0x9F, 0x00, 0x9F, 0x00, 0x9F, 0x00, /* 0xC4-0xC7 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x97, 0x00, /* 0xC8-0xCB */
-	0x9F, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x42, /* 0xCC-0xCF */
-	0x3F, 0x3F, 0x8F, 0x69, 0x9F, 0x00, 0x3F, 0x3F, /* 0xD0-0xD3 */
-	0x3F, 0x3F, 0x9F, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */
-	0x93, 0x91, 0x9F, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x9F, 0x00, 0x3F, 0x3F, /* 0xDC-0xDF */
+	0x3F, 0x3F, 0x9F, 0xC6, 0x9F, 0xC0, 0x9F, 0xBD, /* 0xC4-0xC7 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x97, 0xD2, /* 0xC8-0xCB */
+	0x9F, 0xC3, 0x3F, 0x3F, 0x3F, 0x3F, 0xED, 0xE3, /* 0xCC-0xCF */
+	0x3F, 0x3F, 0x8F, 0x69, 0x9F, 0xC5, 0x3F, 0x3F, /* 0xD0-0xD3 */
+	0x3F, 0x3F, 0x9F, 0xCA, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */
+	0x93, 0x91, 0x9F, 0xC8, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x9F, 0xC2, 0x3F, 0x3F, /* 0xDC-0xDF */
 	0x3F, 0x3F, 0x92, 0x57, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */
-	0x9F, 0x00, 0x3F, 0x3F, 0x9F, 0x00, 0x3F, 0x3F, /* 0xE4-0xE7 */
-	0x9F, 0x00, 0x3F, 0x3F, 0x9F, 0x00, 0x88, 0x00, /* 0xE8-0xEB */
-	0x9F, 0x00, 0x3F, 0x3F, 0x9F, 0x00, 0x3F, 0x3F, /* 0xEC-0xEF */
-	0x3F, 0x3F, 0x90, 0x5B, 0x00, 0x44, 0x8F, 0x7E, /* 0xF0-0xF3 */
-	0x3F, 0x3F, 0x95, 0x00, 0x3F, 0x3F, 0x8D, 0x00, /* 0xF4-0xF7 */
-	0x00, 0x43, 0x9F, 0x00, 0x9F, 0x00, 0x93, 0x59, /* 0xF8-0xFB */
-	0x00, 0x45, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */
+	0x9F, 0xC9, 0x3F, 0x3F, 0x9F, 0xBE, 0x3F, 0x3F, /* 0xE4-0xE7 */
+	0x9F, 0xC4, 0x3F, 0x3F, 0x9F, 0xCB, 0x88, 0xFA, /* 0xE8-0xEB */
+	0x9F, 0xC1, 0x3F, 0x3F, 0x9F, 0xCC, 0x3F, 0x3F, /* 0xEC-0xEF */
+	0x3F, 0x3F, 0x90, 0x5B, 0xED, 0xE5, 0x8F, 0x7E, /* 0xF0-0xF3 */
+	0x3F, 0x3F, 0x95, 0xA3, 0x3F, 0x3F, 0x8D, 0xAC, /* 0xF4-0xF7 */
+	0xED, 0xE4, 0x9F, 0xB9, 0x9F, 0xC7, 0x93, 0x59, /* 0xF8-0xFB */
+	0xED, 0xE6, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */
 };
 
 static unsigned char u2c_6E[512] = {
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */
-	0x3F, 0x3F, 0x90, 0x00, 0x3F, 0x3F, 0x8A, 0x89, /* 0x04-0x07 */
-	0x8D, 0x00, 0x8F, 0x00, 0x9F, 0x00, 0x8F, 0x61, /* 0x08-0x0B */
+	0x3F, 0x3F, 0x90, 0xB4, 0x3F, 0x3F, 0x8A, 0x89, /* 0x04-0x07 */
+	0x8D, 0xCF, 0x8F, 0xC2, 0x9F, 0xBB, 0x8F, 0x61, /* 0x08-0x0B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x8C, 0x6B, /* 0x10-0x13 */
-	0x3F, 0x3F, 0x9F, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */
-	0x3F, 0x3F, 0x9F, 0x00, 0x8F, 0x8D, 0x8C, 0x00, /* 0x18-0x1B */
-	0x3F, 0x3F, 0x9F, 0x00, 0x3F, 0x3F, 0x9F, 0x00, /* 0x1C-0x1F */
-	0x8B, 0x94, 0x93, 0x6E, 0x3F, 0x3F, 0x9F, 0x00, /* 0x20-0x23 */
-	0x9F, 0x00, 0x88, 0x00, 0x89, 0x51, 0x00, 0x48, /* 0x24-0x27 */
-	0x3F, 0x3F, 0x89, 0x00, 0x3F, 0x3F, 0x9F, 0x00, /* 0x28-0x2B */
-	0x91, 0x00, 0x9F, 0x00, 0x9F, 0x00, 0x8D, 0x60, /* 0x2C-0x2F */
+	0x3F, 0x3F, 0x9F, 0xBA, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */
+	0x3F, 0x3F, 0x9F, 0xD0, 0x8F, 0x8D, 0x8C, 0xB8, /* 0x18-0x1B */
+	0x3F, 0x3F, 0x9F, 0xDF, 0x3F, 0x3F, 0x9F, 0xD9, /* 0x1C-0x1F */
+	0x8B, 0x94, 0x93, 0x6E, 0x3F, 0x3F, 0x9F, 0xD4, /* 0x20-0x23 */
+	0x9F, 0xDD, 0x88, 0xAD, 0x89, 0x51, 0xED, 0xE9, /* 0x24-0x27 */
+	0x3F, 0x3F, 0x89, 0xB7, 0x3F, 0x3F, 0x9F, 0xD6, /* 0x28-0x2B */
+	0x91, 0xAA, 0x9F, 0xCD, 0x9F, 0xCF, 0x8D, 0x60, /* 0x2C-0x2F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */
-	0x9F, 0x00, 0x00, 0x46, 0x9F, 0x00, 0x3F, 0x3F, /* 0x38-0x3B */
-	0x00, 0x49, 0x3F, 0x3F, 0x9F, 0x00, 0x3F, 0x3F, /* 0x3C-0x3F */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x9F, 0x00, /* 0x40-0x43 */
+	0x9F, 0xE0, 0xED, 0xE7, 0x9F, 0xDB, 0x3F, 0x3F, /* 0x38-0x3B */
+	0xED, 0xEA, 0x3F, 0x3F, 0x9F, 0xD3, 0x3F, 0x3F, /* 0x3C-0x3F */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x9F, 0xDA, /* 0x40-0x43 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x96, 0x00, 0x3F, 0x3F, /* 0x48-0x4B */
-	0x3F, 0x3F, 0x9F, 0x00, 0x9F, 0x00, 0x3F, 0x3F, /* 0x4C-0x4F */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x96, 0xA9, 0x3F, 0x3F, /* 0x48-0x4B */
+	0x3F, 0x3F, 0x9F, 0xD8, 0x9F, 0xDC, 0x3F, 0x3F, /* 0x4C-0x4F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x8C, 0x00, 0x3F, 0x3F, /* 0x54-0x57 */
-	0x8F, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x92, 0x58, /* 0x58-0x5B */
-	0x00, 0x47, 0x3F, 0x3F, 0x3F, 0x3F, 0x9F, 0x00, /* 0x5C-0x5F */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x8C, 0xCE, 0x3F, 0x3F, /* 0x54-0x57 */
+	0x8F, 0xC3, 0x3F, 0x3F, 0x3F, 0x3F, 0x92, 0x58, /* 0x58-0x5B */
+	0xED, 0xE8, 0x3F, 0x3F, 0x3F, 0x3F, 0x9F, 0xD2, /* 0x5C-0x5F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x60-0x63 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x97, 0x4E, /* 0x64-0x67 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x9F, 0x00, /* 0x68-0x6B */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x9F, 0x00, 0x93, 0x92, /* 0x6C-0x6F */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x9F, 0x00, 0x3F, 0x3F, /* 0x70-0x73 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x9F, 0x00, 0x3F, 0x3F, /* 0x74-0x77 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x9F, 0xD5, /* 0x68-0x6B */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x9F, 0xCE, 0x93, 0x92, /* 0x6C-0x6F */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x9F, 0xD1, 0x3F, 0x3F, /* 0x70-0x73 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x9F, 0xD7, 0x3F, 0x3F, /* 0x74-0x77 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x98, 0x70, 0x8E, 0x00, /* 0x7C-0x7F */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x98, 0x70, 0x8E, 0xBC, /* 0x7C-0x7F */
 	
-	0x96, 0x9E, 0x3F, 0x3F, 0x9F, 0x00, 0x3F, 0x3F, /* 0x80-0x83 */
+	0x96, 0x9E, 0x3F, 0x3F, 0x9F, 0xE1, 0x3F, 0x3F, /* 0x80-0x83 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x88-0x8B */
-	0x94, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x9F, 0x00, /* 0x8C-0x8F */
-	0x8C, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */
+	0x94, 0xAC, 0x3F, 0x3F, 0x3F, 0x3F, 0x9F, 0xED, /* 0x8C-0x8F */
+	0x8C, 0xB9, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x8F, 0x80, 0x3F, 0x3F, /* 0x94-0x97 */
-	0x9F, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */
-	0x97, 0x00, 0x8D, 0x61, 0x3F, 0x3F, 0x9F, 0x00, /* 0x9C-0x9F */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x88, 0x00, 0x3F, 0x3F, /* 0xA0-0xA3 */
-	0x3F, 0x3F, 0x9F, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x9F, 0x00, 0x3F, 0x3F, /* 0xA8-0xAB */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x9F, 0x00, /* 0xAC-0xAF */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x9F, 0x00, 0x3F, 0x3F, /* 0xB0-0xB3 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x97, 0x6E, 0x9F, 0x00, /* 0xB4-0xB7 */
+	0x9F, 0xE3, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */
+	0x97, 0xAD, 0x8D, 0x61, 0x3F, 0x3F, 0x9F, 0xF0, /* 0x9C-0x9F */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x88, 0xEC, 0x3F, 0x3F, /* 0xA0-0xA3 */
+	0x3F, 0x3F, 0x9F, 0xEE, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x9F, 0xE2, 0x3F, 0x3F, /* 0xA8-0xAB */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x9F, 0xE8, /* 0xAC-0xAF */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x9F, 0xEA, 0x3F, 0x3F, /* 0xB0-0xB3 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x97, 0x6E, 0x9F, 0xE5, /* 0xB4-0xB7 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x93, 0x4D, 0x3F, 0x3F, /* 0xB8-0xBB */
-	0x3F, 0x3F, 0x9F, 0x00, 0x3F, 0x3F, 0x00, 0x4A, /* 0xBC-0xBF */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x9F, 0x00, 0x3F, 0x3F, /* 0xC0-0xC3 */
-	0x9F, 0x00, 0x96, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC4-0xC7 */
-	0x3F, 0x3F, 0x9F, 0x00, 0x3F, 0x3F, 0x8E, 0x00, /* 0xC8-0xCB */
-	0x9F, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */
-	0x3F, 0x3F, 0x8A, 0x8A, 0x3F, 0x3F, 0x9F, 0x00, /* 0xD0-0xD3 */
-	0x9F, 0x00, 0x9F, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */
+	0x3F, 0x3F, 0x9F, 0xE7, 0x3F, 0x3F, 0xED, 0xEB, /* 0xBC-0xBF */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x9F, 0xEF, 0x3F, 0x3F, /* 0xC0-0xC3 */
+	0x9F, 0xE9, 0x96, 0xC5, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC4-0xC7 */
+	0x3F, 0x3F, 0x9F, 0xE4, 0x3F, 0x3F, 0x8E, 0xA0, /* 0xC8-0xCB */
+	0x9F, 0xFC, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */
+	0x3F, 0x3F, 0x8A, 0x8A, 0x3F, 0x3F, 0x9F, 0xE6, /* 0xD0-0xD3 */
+	0x9F, 0xEB, 0x9F, 0xEC, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */
-	0x3F, 0x3F, 0x91, 0x00, 0x91, 0x00, 0x3F, 0x3F, /* 0xDC-0xDF */
+	0x3F, 0x3F, 0x91, 0xEA, 0x91, 0xD8, 0x3F, 0x3F, /* 0xDC-0xDF */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */
-	0x9F, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x9F, 0x00, /* 0xEC-0xEF */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x9F, 0x00, 0x3F, 0x3F, /* 0xF0-0xF3 */
-	0x93, 0x48, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x42, /* 0xF4-0xF7 */
-	0x9F, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF8-0xFB */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x9F, 0x00, 0x9F, 0x00, /* 0xFC-0xFF */
+	0x9F, 0xF4, 0x3F, 0x3F, 0x3F, 0x3F, 0x9F, 0xFA, /* 0xEC-0xEF */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x9F, 0xF8, 0x3F, 0x3F, /* 0xF0-0xF3 */
+	0x93, 0x48, 0x3F, 0x3F, 0x3F, 0x3F, 0xE0, 0x42, /* 0xF4-0xF7 */
+	0x9F, 0xF5, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF8-0xFB */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x9F, 0xF6, 0x9F, 0xDE, /* 0xFC-0xFF */
 };
 
 static unsigned char u2c_6F[512] = {
 	0x3F, 0x3F, 0x8B, 0x99, 0x95, 0x59, 0x3F, 0x3F, /* 0x00-0x03 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x8E, 0x00, 0x3F, 0x3F, /* 0x04-0x07 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x8E, 0xBD, 0x3F, 0x3F, /* 0x04-0x07 */
 	0x3F, 0x3F, 0x8D, 0x97, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x08-0x0B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x98, 0x52, /* 0x0C-0x0F */
-	0x3F, 0x3F, 0x9F, 0x00, 0x3F, 0x3F, 0x00, 0x41, /* 0x10-0x13 */
+	0x3F, 0x3F, 0x9F, 0xF2, 0x3F, 0x3F, 0xE0, 0x41, /* 0x10-0x13 */
 	0x89, 0x89, 0x91, 0x86, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x18-0x1B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */
-	0x94, 0x99, 0x3F, 0x3F, 0x8A, 0x00, 0x97, 0x00, /* 0x20-0x23 */
+	0x94, 0x99, 0x3F, 0x3F, 0x8A, 0xBF, 0x97, 0xF8, /* 0x20-0x23 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x96, 0x9F, /* 0x28-0x2B */
-	0x92, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */
-	0x3F, 0x3F, 0x9F, 0x00, 0x9F, 0x00, 0x3F, 0x3F, /* 0x30-0x33 */
+	0x92, 0xD0, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */
+	0x3F, 0x3F, 0x9F, 0xF9, 0x9F, 0xFB, 0x3F, 0x3F, /* 0x30-0x33 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */
 	0x91, 0x51, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x38-0x3B */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x40, 0x9F, 0x00, /* 0x3C-0x3F */
-	0x3F, 0x3F, 0x9F, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */
-	0x3F, 0x3F, 0x8A, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE0, 0x40, 0x9F, 0xF7, /* 0x3C-0x3F */
+	0x3F, 0x3F, 0x9F, 0xF1, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */
+	0x3F, 0x3F, 0x8A, 0xC1, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x4C-0x4F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */
 	0x8C, 0x89, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */
-	0x00, 0x4E, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x49, /* 0x58-0x5B */
-	0x90, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x8A, 0x83, /* 0x5C-0x5F */
+	0xE0, 0x4E, 0x3F, 0x3F, 0x3F, 0x3F, 0xE0, 0x49, /* 0x58-0x5B */
+	0x90, 0xF6, 0x3F, 0x3F, 0x3F, 0x3F, 0x8A, 0x83, /* 0x5C-0x5F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x60-0x63 */
-	0x8F, 0x81, 0x3F, 0x3F, 0x00, 0x52, 0x3F, 0x3F, /* 0x64-0x67 */
+	0x8F, 0x81, 0x3F, 0x3F, 0xE0, 0x52, 0x3F, 0x3F, /* 0x64-0x67 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x68-0x6B */
-	0x3F, 0x3F, 0x00, 0x4B, 0x92, 0x00, 0x00, 0x48, /* 0x6C-0x6F */
-	0x92, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */
-	0x00, 0x6B, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x74-0x77 */
-	0x00, 0x45, 0x3F, 0x3F, 0x00, 0x44, 0x3F, 0x3F, /* 0x78-0x7B */
-	0x00, 0x4D, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */
-	
-	0x00, 0x47, 0x00, 0x46, 0x00, 0x4C, 0x3F, 0x3F, /* 0x80-0x83 */
-	0x90, 0x9F, 0x3F, 0x3F, 0x00, 0x43, 0x3F, 0x3F, /* 0x84-0x87 */
-	0x00, 0x4B, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x88-0x8B */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x4F, 0x3F, 0x3F, /* 0x8C-0x8F */
-	0x3F, 0x3F, 0x00, 0x50, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x8A, 0x00, /* 0x94-0x97 */
+	0x3F, 0x3F, 0xE0, 0x4B, 0x92, 0xAA, 0xE0, 0x48, /* 0x6C-0x6F */
+	0x92, 0xD7, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */
+	0xE0, 0x6B, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x74-0x77 */
+	0xE0, 0x45, 0x3F, 0x3F, 0xE0, 0x44, 0x3F, 0x3F, /* 0x78-0x7B */
+	0xE0, 0x4D, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */
+	
+	0xE0, 0x47, 0xE0, 0x46, 0xE0, 0x4C, 0x3F, 0x3F, /* 0x80-0x83 */
+	0x90, 0x9F, 0x3F, 0x3F, 0xE0, 0x43, 0x3F, 0x3F, /* 0x84-0x87 */
+	0xED, 0xEC, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x88-0x8B */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE0, 0x4F, 0x3F, 0x3F, /* 0x8C-0x8F */
+	0x3F, 0x3F, 0xE0, 0x50, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x8A, 0xC0, /* 0x94-0x97 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */
-	0x3F, 0x3F, 0x00, 0x55, 0x3F, 0x3F, 0x00, 0x54, /* 0xA0-0xA3 */
-	0x00, 0x56, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x59, 0x3F, 0x3F, /* 0xA8-0xAB */
+	0x3F, 0x3F, 0xE0, 0x55, 0x3F, 0x3F, 0xE0, 0x54, /* 0xA0-0xA3 */
+	0xE0, 0x56, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE0, 0x59, 0x3F, 0x3F, /* 0xA8-0xAB */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */
-	0x3F, 0x3F, 0x93, 0x62, 0x3F, 0x3F, 0x00, 0x53, /* 0xB0-0xB3 */
-	0x3F, 0x3F, 0x00, 0x4C, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */
-	0x3F, 0x3F, 0x00, 0x57, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */
+	0x3F, 0x3F, 0x93, 0x62, 0x3F, 0x3F, 0xE0, 0x53, /* 0xB0-0xB3 */
+	0x3F, 0x3F, 0xED, 0xED, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */
+	0x3F, 0x3F, 0xE0, 0x57, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */
-	0x8C, 0x83, 0x91, 0x00, 0x00, 0x51, 0x94, 0x5A, /* 0xC0-0xC3 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x58, 0x3F, 0x3F, /* 0xC4-0xC7 */
+	0x8C, 0x83, 0x91, 0xF7, 0xE0, 0x51, 0x94, 0x5A, /* 0xC0-0xC3 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE0, 0x58, 0x3F, 0x3F, /* 0xC4-0xC7 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC8-0xCB */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */
-	0x00, 0x5D, 0x00, 0x5B, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */
-	0x00, 0x5E, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x61, /* 0xD8-0xDB */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x5A, /* 0xDC-0xDF */
+	0xE0, 0x5D, 0xE0, 0x5B, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */
+	0xE0, 0x5E, 0x3F, 0x3F, 0x3F, 0x3F, 0xE0, 0x61, /* 0xD8-0xDB */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE0, 0x5A, /* 0xDC-0xDF */
 	0x8D, 0x8A, 0x94, 0x47, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */
-	0x9F, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */
+	0x9F, 0xB7, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x97, 0x94, /* 0xE8-0xEB */
-	0x00, 0x5C, 0x3F, 0x3F, 0x00, 0x60, 0x91, 0x00, /* 0xEC-0xEF */
-	0x3F, 0x3F, 0x00, 0x5F, 0x3F, 0x3F, 0x00, 0x4A, /* 0xF0-0xF3 */
-	0x3F, 0x3F, 0x00, 0x4D, 0x00, 0x89, 0x3F, 0x3F, /* 0xF4-0xF7 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x64, 0x3F, 0x3F, /* 0xF8-0xFB */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x68, 0x3F, 0x3F, /* 0xFC-0xFF */
+	0xE0, 0x5C, 0x3F, 0x3F, 0xE0, 0x60, 0x91, 0xF3, /* 0xEC-0xEF */
+	0x3F, 0x3F, 0xE0, 0x5F, 0x3F, 0x3F, 0xE0, 0x4A, /* 0xF0-0xF3 */
+	0x3F, 0x3F, 0xED, 0xEE, 0xE8, 0x89, 0x3F, 0x3F, /* 0xF4-0xF7 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE0, 0x64, 0x3F, 0x3F, /* 0xF8-0xFB */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE0, 0x68, 0x3F, 0x3F, /* 0xFC-0xFF */
 };
 
 static unsigned char u2c_70[512] = {
-	0x3F, 0x3F, 0x00, 0x66, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */
-	0x3F, 0x3F, 0x00, 0x4E, 0x3F, 0x3F, 0x00, 0x4F, /* 0x04-0x07 */
-	0x3F, 0x3F, 0x00, 0x62, 0x3F, 0x3F, 0x00, 0x63, /* 0x08-0x0B */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x67, /* 0x0C-0x0F */
-	0x3F, 0x3F, 0x00, 0x65, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */
+	0x3F, 0x3F, 0xE0, 0x66, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */
+	0x3F, 0x3F, 0xED, 0xEF, 0x3F, 0x3F, 0xED, 0xF0, /* 0x04-0x07 */
+	0x3F, 0x3F, 0xE0, 0x62, 0x3F, 0x3F, 0xE0, 0x63, /* 0x08-0x0B */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE0, 0x67, /* 0x0C-0x0F */
+	0x3F, 0x3F, 0xE0, 0x65, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */
 	0x3F, 0x3F, 0x95, 0x6D, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */
-	0x00, 0x6D, 0x3F, 0x3F, 0x00, 0x6A, 0x00, 0x69, /* 0x18-0x1B */
-	0x3F, 0x3F, 0x00, 0x6C, 0x93, 0x00, 0x00, 0x6E, /* 0x1C-0x1F */
+	0xE0, 0x6D, 0x3F, 0x3F, 0xE0, 0x6A, 0xE0, 0x69, /* 0x18-0x1B */
+	0x3F, 0x3F, 0xE0, 0x6C, 0x93, 0xD2, 0xE0, 0x6E, /* 0x1C-0x1F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x92, 0x95, 0x91, 0x00, /* 0x24-0x27 */
-	0x00, 0x50, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */
-	0x90, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */
-	0x00, 0x6F, 0x3F, 0x3F, 0x00, 0x71, 0x3F, 0x3F, /* 0x30-0x33 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x92, 0x95, 0x91, 0xEB, /* 0x24-0x27 */
+	0xED, 0xF1, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */
+	0x90, 0xA3, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */
+	0xE0, 0x6F, 0x3F, 0x3F, 0xE0, 0x71, 0x3F, 0x3F, /* 0x30-0x33 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x38-0x3B */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x70, 0x3F, 0x3F, /* 0x3C-0x3F */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE0, 0x70, 0x3F, 0x3F, /* 0x3C-0x3F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */
-	0x9F, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x4C-0x4F */
-	0x3F, 0x3F, 0x00, 0x72, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */
+	0x9F, 0xF3, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x4C-0x4F */
+	0x3F, 0x3F, 0xE0, 0x72, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */
-	0x93, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */
+	0x93, 0xE5, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x5C-0x5F */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x73, /* 0x60-0x63 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE0, 0x73, /* 0x60-0x63 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x89, 0x00, /* 0x68-0x6B */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x89, 0xCE, /* 0x68-0x6B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x93, 0x94, /* 0x6C-0x6F */
 	0x8A, 0x44, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x74-0x77 */
 	0x8B, 0x84, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */
-	0x8E, 0x00, 0x8D, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */
+	0x8E, 0xDC, 0x8D, 0xD0, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */
 	
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */
-	0x3F, 0x3F, 0x00, 0x51, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */
+	0x3F, 0x3F, 0xED, 0xF2, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */
 	0x3F, 0x3F, 0x98, 0x46, 0x90, 0x86, 0x3F, 0x3F, /* 0x88-0x8B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x89, 0x8A, 0x3F, 0x3F, /* 0x8C-0x8F */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x75, 0x3F, 0x3F, /* 0x90-0x93 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE0, 0x75, 0x3F, 0x3F, /* 0x90-0x93 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */
-	0x3F, 0x3F, 0x00, 0x74, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */
+	0x3F, 0x3F, 0xE0, 0x74, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x52, /* 0xA8-0xAB */
-	0x00, 0x78, 0x92, 0x59, 0x00, 0x7B, 0x00, 0x76, /* 0xAC-0xAF */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x7A, /* 0xB0-0xB3 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xED, 0xF3, /* 0xA8-0xAB */
+	0xE0, 0x78, 0x92, 0x59, 0xE0, 0x7B, 0xE0, 0x76, /* 0xAC-0xAF */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE0, 0x7A, /* 0xB0-0xB3 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */
-	0x00, 0x79, 0x93, 0x5F, 0x88, 0x00, 0x00, 0x62, /* 0xB8-0xBB */
+	0xE0, 0x79, 0x93, 0x5F, 0x88, 0xD7, 0xED, 0x46, /* 0xB8-0xBB */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC4-0xC7 */
-	0x97, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x7D, /* 0xC8-0xCB */
+	0x97, 0xF3, 0x3F, 0x3F, 0x3F, 0x3F, 0xE0, 0x7D, /* 0xC8-0xCB */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x89, 0x47, /* 0xCC-0xCF */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */
-	0x3F, 0x3F, 0x00, 0x80, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */
-	0x3F, 0x3F, 0x00, 0x7E, 0x3F, 0x3F, 0x00, 0x7C, /* 0xDC-0xDF */
+	0x3F, 0x3F, 0xE0, 0x80, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */
+	0x3F, 0x3F, 0xE0, 0x7E, 0x3F, 0x3F, 0xE0, 0x7C, /* 0xDC-0xDF */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */
-	0x3F, 0x3F, 0x00, 0x77, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */
+	0x3F, 0x3F, 0xE0, 0x77, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */
 	0x3F, 0x3F, 0x96, 0x42, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF8-0xFB */
-	0x3F, 0x3F, 0x00, 0x82, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */
+	0x3F, 0x3F, 0xE0, 0x82, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */
 };
 
 static unsigned char u2c_71[512] = {
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */
-	0x00, 0x54, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x04-0x07 */
-	0x3F, 0x3F, 0x00, 0x81, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x08-0x0B */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x53, /* 0x0C-0x0F */
+	0xED, 0xF5, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x04-0x07 */
+	0x3F, 0x3F, 0xE0, 0x81, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x08-0x0B */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xED, 0xF4, /* 0x0C-0x0F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */
 	0x89, 0x8B, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */
-	0x3F, 0x3F, 0x00, 0x84, 0x95, 0x00, 0x3F, 0x3F, /* 0x18-0x1B */
-	0x00, 0x83, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */
-	0x3F, 0x3F, 0x96, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x8F, 0x00, 0x3F, 0x3F, /* 0x24-0x27 */
+	0x3F, 0x3F, 0xE0, 0x84, 0x95, 0xB0, 0x3F, 0x3F, /* 0x18-0x1B */
+	0xE0, 0x83, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */
+	0x3F, 0x3F, 0x96, 0xB3, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x8F, 0xC5, 0x3F, 0x3F, /* 0x24-0x27 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x91, 0x52, 0x3F, 0x3F, /* 0x34-0x37 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x38-0x3B */
-	0x8F, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */
+	0x8F, 0xC4, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x56, 0x00, 0x57, /* 0x44-0x47 */
-	0x3F, 0x3F, 0x97, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */
-	0x00, 0x8A, 0x3F, 0x3F, 0x90, 0x00, 0x3F, 0x3F, /* 0x4C-0x4F */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xED, 0xF7, 0xED, 0xF8, /* 0x44-0x47 */
+	0x3F, 0x3F, 0x97, 0xF9, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */
+	0xE0, 0x8A, 0x3F, 0x3F, 0x90, 0xF7, 0x3F, 0x3F, /* 0x4C-0x4F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */
-	0x3F, 0x3F, 0x00, 0x86, 0x00, 0x8B, 0x3F, 0x3F, /* 0x54-0x57 */
+	0x3F, 0x3F, 0xE0, 0x86, 0xE0, 0x8B, 0x3F, 0x3F, /* 0x54-0x57 */
 	0x3F, 0x3F, 0x89, 0x8C, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */
-	0x00, 0x55, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x5C-0x5F */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x89, 0x3F, 0x3F, /* 0x60-0x63 */
-	0x94, 0x81, 0x00, 0x85, 0x00, 0x88, 0x8F, 0x00, /* 0x64-0x67 */
-	0x3F, 0x3F, 0x94, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x68-0x6B */
-	0x00, 0x8C, 0x3F, 0x3F, 0x8E, 0x00, 0x3F, 0x3F, /* 0x6C-0x6F */
+	0xED, 0xF6, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x5C-0x5F */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE0, 0x89, 0x3F, 0x3F, /* 0x60-0x63 */
+	0x94, 0x81, 0xE0, 0x85, 0xE0, 0x88, 0x8F, 0xC6, /* 0x64-0x67 */
+	0x3F, 0x3F, 0x94, 0xCF, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x68-0x6B */
+	0xE0, 0x8C, 0x3F, 0x3F, 0x8E, 0xCF, 0x3F, 0x3F, /* 0x6C-0x6F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x74-0x77 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */
-	0x3F, 0x3F, 0x90, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */
+	0x3F, 0x3F, 0x90, 0xF8, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */
 	
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */
-	0x00, 0x8F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */
-	0x00, 0x87, 0x3F, 0x3F, 0x8C, 0x46, 0x3F, 0x3F, /* 0x88-0x8B */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x8D, /* 0x8C-0x8F */
+	0xE0, 0x8F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */
+	0xE0, 0x87, 0x3F, 0x3F, 0x8C, 0x46, 0x3F, 0x3F, /* 0x88-0x8B */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE0, 0x8D, /* 0x8C-0x8F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */
-	0x97, 0x6F, 0x00, 0x90, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */
-	0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */
+	0x97, 0x6F, 0xE0, 0x90, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */
+	0x3F, 0x3F, 0xEA, 0xA4, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x8F, 0x6E, /* 0x9C-0x9F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */
-	0x00, 0x91, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */
-	0x00, 0x92, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */
+	0xE0, 0x91, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */
+	0xE0, 0x92, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */
 	0x3F, 0x3F, 0x94, 0x4D, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB0-0xB3 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */
-	0x3F, 0x3F, 0x00, 0x94, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x95, 0x3F, 0x3F, /* 0xBC-0xBF */
-	0x3F, 0x3F, 0x00, 0x59, 0x3F, 0x3F, 0x94, 0x52, /* 0xC0-0xC3 */
+	0x3F, 0x3F, 0xE0, 0x94, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE0, 0x95, 0x3F, 0x3F, /* 0xBC-0xBF */
+	0x3F, 0x3F, 0xED, 0xFA, 0x3F, 0x3F, 0x94, 0x52, /* 0xC0-0xC3 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC4-0xC7 */
-	0x93, 0x95, 0x00, 0x97, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC8-0xCB */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x99, 0x3F, 0x3F, /* 0xCC-0xCF */
-	0x97, 0x00, 0x3F, 0x3F, 0x00, 0x96, 0x3F, 0x3F, /* 0xD0-0xD3 */
-	0x00, 0x98, 0x89, 0x8D, 0x3F, 0x3F, 0x00, 0x93, /* 0xD4-0xD7 */
+	0x93, 0x95, 0xE0, 0x97, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC8-0xCB */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE0, 0x99, 0x3F, 0x3F, /* 0xCC-0xCF */
+	0x97, 0xD3, 0x3F, 0x3F, 0xE0, 0x96, 0x3F, 0x3F, /* 0xD0-0xD3 */
+	0xE0, 0x98, 0x89, 0x8D, 0x3F, 0x3F, 0xE0, 0x93, /* 0xD4-0xD7 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x9A, 0x7A, /* 0xDC-0xDF */
-	0x00, 0x9A, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */
-	0x3F, 0x3F, 0x91, 0x87, 0x8E, 0x57, 0x00, 0x9C, /* 0xE4-0xE7 */
+	0xE0, 0x9A, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */
+	0x3F, 0x3F, 0x91, 0x87, 0x8E, 0x57, 0xE0, 0x9C, /* 0xE4-0xE7 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */
-	0x00, 0x9B, 0x90, 0x43, 0x99, 0x00, 0x3F, 0x3F, /* 0xEC-0xEF */
+	0xE0, 0x9B, 0x90, 0x43, 0x99, 0xD7, 0x3F, 0x3F, /* 0xEC-0xEF */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */
-	0x3F, 0x3F, 0x00, 0x9D, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */
-	0x3F, 0x3F, 0x00, 0x9F, 0x3F, 0x3F, 0x00, 0x8E, /* 0xF8-0xFB */
-	0x00, 0x9E, 0x3F, 0x3F, 0x00, 0x5A, 0x00, 0x00, /* 0xFC-0xFF */
+	0x3F, 0x3F, 0xE0, 0x9D, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */
+	0x3F, 0x3F, 0xE0, 0x9F, 0x3F, 0x3F, 0xE0, 0x8E, /* 0xF8-0xFB */
+	0xE0, 0x9E, 0x3F, 0x3F, 0xED, 0xFB, 0xE0, 0xA0, /* 0xFC-0xFF */
 };
 
 static unsigned char u2c_72[512] = {
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x94, 0x9A, 0x3F, 0x3F, /* 0x04-0x07 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x08-0x0B */
-	0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */
-	0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */
+	0x3F, 0x3F, 0xE0, 0xA1, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */
+	0xE0, 0xA2, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0x18-0x1B */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE0, 0xA3, /* 0x18-0x1B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */
-	0x00, 0x00, 0x3F, 0x3F, 0x92, 0x00, 0x3F, 0x3F, /* 0x28-0x2B */
-	0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */
-	0x00, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0x30-0x33 */
-	0x3F, 0x3F, 0x8E, 0x00, 0x95, 0x83, 0x3F, 0x3F, /* 0x34-0x37 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x96, 0x00, 0x00, 0x00, /* 0x38-0x3B */
-	0x00, 0x00, 0x91, 0x75, 0x8E, 0x00, 0x00, 0x00, /* 0x3C-0x3F */
-	0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x95, 0x00, /* 0x44-0x47 */
-	0x94, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0x48-0x4B */
+	0xE0, 0xA4, 0x3F, 0x3F, 0x92, 0xDC, 0x3F, 0x3F, /* 0x28-0x2B */
+	0xE0, 0xA6, 0xE0, 0xA5, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */
+	0xE0, 0xA7, 0x3F, 0x3F, 0xE0, 0xA8, 0x3F, 0x3F, /* 0x30-0x33 */
+	0x3F, 0x3F, 0x8E, 0xDD, 0x95, 0x83, 0x3F, 0x3F, /* 0x34-0x37 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x96, 0xEA, 0xE0, 0xA9, /* 0x38-0x3B */
+	0xE0, 0xAA, 0x91, 0x75, 0x8E, 0xA2, 0xE0, 0xAB, /* 0x3C-0x3F */
+	0xE0, 0xAC, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE0, 0xAD, 0x95, 0xD0, /* 0x44-0x47 */
+	0x94, 0xC5, 0x3F, 0x3F, 0x3F, 0x3F, 0xE0, 0xAE, /* 0x48-0x4B */
 	0x94, 0x76, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x4C-0x4F */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x92, 0x00, 0x3F, 0x3F, /* 0x50-0x53 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x92, 0xAB, 0x3F, 0x3F, /* 0x50-0x53 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */
-	0x00, 0x00, 0x89, 0x00, 0x3F, 0x3F, 0x8B, 0x8D, /* 0x58-0x5B */
-	0x3F, 0x3F, 0x96, 0x00, 0x3F, 0x3F, 0x96, 0x00, /* 0x5C-0x5F */
-	0x3F, 0x3F, 0x89, 0x00, 0x98, 0x53, 0x3F, 0x3F, /* 0x60-0x63 */
+	0xE0, 0xAF, 0x89, 0xE5, 0x3F, 0x3F, 0x8B, 0x8D, /* 0x58-0x5B */
+	0x3F, 0x3F, 0x96, 0xC4, 0x3F, 0x3F, 0x96, 0xB4, /* 0x5C-0x5F */
+	0x3F, 0x3F, 0x89, 0xB2, 0x98, 0x53, 0x3F, 0x3F, /* 0x60-0x63 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x96, 0x71, /* 0x64-0x67 */
-	0x3F, 0x3F, 0x95, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x68-0x6B */
+	0x3F, 0x3F, 0x95, 0xA8, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x68-0x6B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x90, 0x00, 0x3F, 0x3F, /* 0x70-0x73 */
-	0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x74-0x77 */
-	0x3F, 0x3F, 0x93, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */
-	0x3F, 0x3F, 0x8C, 0x00, 0x00, 0x00, 0x3F, 0x3F, /* 0x7C-0x7F */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x90, 0xB5, 0x3F, 0x3F, /* 0x70-0x73 */
+	0xE0, 0xB0, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x74-0x77 */
+	0x3F, 0x3F, 0x93, 0xC1, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */
+	0x3F, 0x3F, 0x8C, 0xA1, 0xE0, 0xB1, 0x3F, 0x3F, /* 0x7C-0x7F */
 	
-	0x8D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, /* 0x80-0x83 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0x84-0x87 */
+	0x8D, 0xD2, 0xE0, 0xB3, 0xE0, 0xB2, 0x3F, 0x3F, /* 0x80-0x83 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE0, 0xB4, /* 0x84-0x87 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x88-0x8B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0x90-0x93 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0x94-0x97 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE0, 0xB5, 0x3F, 0x3F, /* 0x90-0x93 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE0, 0xB6, 0x3F, 0x3F, /* 0x94-0x97 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */
-	0x8B, 0x5D, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0xA0-0xA3 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0xA4-0xA7 */
+	0x8B, 0x5D, 0x3F, 0x3F, 0xE0, 0xB7, 0x3F, 0x3F, /* 0xA0-0xA3 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE0, 0xB8, /* 0xA4-0xA7 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */
-	0x8C, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x94, 0x00, /* 0xAC-0xAF */
-	0x3F, 0x3F, 0x00, 0x5B, 0x00, 0x00, 0x3F, 0x3F, /* 0xB0-0xB3 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x8F, 0x00, 0x3F, 0x3F, /* 0xB4-0xB7 */
-	0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x5C, 0x3F, 0x3F, /* 0xBC-0xBF */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x8B, 0x00, 0x00, 0x00, /* 0xC0-0xC3 */
-	0x00, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0xC4-0xC7 */
+	0x8C, 0xA2, 0x3F, 0x3F, 0x3F, 0x3F, 0x94, 0xC6, /* 0xAC-0xAF */
+	0x3F, 0x3F, 0xED, 0xFC, 0xE0, 0xBA, 0x3F, 0x3F, /* 0xB0-0xB3 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x8F, 0xF3, 0x3F, 0x3F, /* 0xB4-0xB7 */
+	0x3F, 0x3F, 0xE0, 0xB9, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xEE, 0x40, 0x3F, 0x3F, /* 0xBC-0xBF */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x8B, 0xB6, 0xE0, 0xBB, /* 0xC0-0xC3 */
+	0xE0, 0xBD, 0x3F, 0x3F, 0xE0, 0xBC, 0x3F, 0x3F, /* 0xC4-0xC7 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC8-0xCB */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0xCC-0xCF */
-	0x8C, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0xD0-0xD3 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x8B, 0x00, /* 0xD4-0xD7 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE0, 0xBE, 0x3F, 0x3F, /* 0xCC-0xCF */
+	0x8C, 0xCF, 0x3F, 0x3F, 0xE0, 0xBF, 0x3F, 0x3F, /* 0xD0-0xD3 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x8B, 0xE7, /* 0xD4-0xD7 */
 	0x3F, 0x3F, 0x91, 0x5F, 0x3F, 0x3F, 0x8D, 0x9D, /* 0xD8-0xDB */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xDC-0xDF */
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, /* 0xE0-0xE3 */
+	0xE0, 0xC1, 0xE0, 0xC2, 0xE0, 0xC0, 0x3F, 0x3F, /* 0xE0-0xE3 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */
-	0x3F, 0x3F, 0x8E, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */
-	0x93, 0x00, 0x8B, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */
+	0x3F, 0x3F, 0x8E, 0xEB, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */
+	0x93, 0xC6, 0x8B, 0xB7, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0xF4-0xF7 */
-	0x92, 0x4B, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF8-0xFB */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE0, 0xC4, /* 0xF4-0xF7 */
+	0x92, 0x4B, 0xE0, 0xC3, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF8-0xFB */
 	0x98, 0x54, 0x94, 0x82, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */
 };
 
 static unsigned char u2c_73[512] = {
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x04-0x07 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0x08-0x0B */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE0, 0xC7, 0x3F, 0x3F, /* 0x08-0x0B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, /* 0x14-0x17 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x96, 0x00, /* 0x18-0x1B */
-	0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x97, 0x00, /* 0x1C-0x1F */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE0, 0xC9, 0xE0, 0xC6, /* 0x14-0x17 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x96, 0xD2, /* 0x18-0x1B */
+	0xE0, 0xC8, 0xE0, 0xCA, 0x3F, 0x3F, 0x97, 0xC2, /* 0x1C-0x1F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */
-	0x00, 0x5D, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */
-	0x3F, 0x3F, 0x00, 0x00, 0x92, 0x96, 0x94, 0x4C, /* 0x28-0x2B */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x8C, 0x00, 0x00, 0x00, /* 0x2C-0x2F */
+	0xEE, 0x41, 0xE0, 0xCE, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */
+	0x3F, 0x3F, 0xE0, 0xCD, 0x92, 0x96, 0x94, 0x4C, /* 0x28-0x2B */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x8C, 0xA3, 0xE0, 0xCC, /* 0x2C-0x2F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */
-	0x00, 0x00, 0x3F, 0x3F, 0x97, 0x50, 0x97, 0x51, /* 0x34-0x37 */
+	0xE0, 0xCB, 0x3F, 0x3F, 0x97, 0x50, 0x97, 0x51, /* 0x34-0x37 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x38-0x3B */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x89, 0x8E, /* 0x3C-0x3F */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE0, 0xCF, 0x89, 0x8E, /* 0x3C-0x3F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */
 	0x8D, 0x96, 0x8E, 0x82, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, /* 0x4C-0x4F */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE0, 0xD0, 0xE0, 0xD1, /* 0x4C-0x4F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0x54-0x57 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE0, 0xD3, /* 0x54-0x57 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x5C-0x5F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x8F, 0x62, /* 0x60-0x63 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */
-	0x00, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0x68-0x6B */
+	0xE0, 0xD5, 0x3F, 0x3F, 0xE0, 0xD4, 0x3F, 0x3F, /* 0x68-0x6B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */
-	0x00, 0x00, 0x3F, 0x3F, 0x8A, 0x6C, 0x3F, 0x3F, /* 0x70-0x73 */
-	0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x5F, /* 0x74-0x77 */
-	0x00, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7B */
+	0xE0, 0xD6, 0x3F, 0x3F, 0x8A, 0x6C, 0x3F, 0x3F, /* 0x70-0x73 */
+	0x3F, 0x3F, 0xE0, 0xD8, 0x3F, 0x3F, 0xEE, 0x43, /* 0x74-0x77 */
+	0xE0, 0xD7, 0x3F, 0x3F, 0xE0, 0xDA, 0xE0, 0xD9, /* 0x78-0x7B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */
 	
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */
-	0x8C, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x97, 0x00, /* 0x84-0x87 */
-	0x3F, 0x3F, 0x8B, 0x00, 0x3F, 0x3F, 0x89, 0x00, /* 0x88-0x8B */
+	0x8C, 0xBA, 0x3F, 0x3F, 0x3F, 0x3F, 0x97, 0xA6, /* 0x84-0x87 */
+	0x3F, 0x3F, 0x8B, 0xCA, 0x3F, 0x3F, 0x89, 0xA4, /* 0x88-0x8B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x8B, 0x00, 0x3F, 0x3F, /* 0x94-0x97 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x8B, 0xE8, 0x3F, 0x3F, /* 0x94-0x97 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */
-	0x3F, 0x3F, 0x8A, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */
+	0x3F, 0x3F, 0x8A, 0xDF, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x97, 0x00, 0x00, 0x00, /* 0xB0-0xB3 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x97, 0xE6, 0xE0, 0xDC, /* 0xB0-0xB3 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0xB8-0xBB */
-	0x3F, 0x3F, 0x00, 0x60, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */
-	0x00, 0x00, 0x3F, 0x3F, 0x89, 0x00, 0x3F, 0x3F, /* 0xC0-0xC3 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE0, 0xDE, /* 0xB8-0xBB */
+	0x3F, 0x3F, 0xEE, 0x44, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */
+	0xE0, 0xDF, 0x3F, 0x3F, 0x89, 0xCF, 0x3F, 0x3F, /* 0xC0-0xC3 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC4-0xC7 */
-	0x00, 0x00, 0x00, 0x61, 0x8E, 0x58, 0x3F, 0x3F, /* 0xC8-0xCB */
-	0x3F, 0x3F, 0x92, 0x00, 0x00, 0x00, 0x3F, 0x3F, /* 0xCC-0xCF */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x64, 0x3F, 0x3F, /* 0xD0-0xD3 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x62, 0x3F, 0x3F, /* 0xD4-0xD7 */
+	0xE0, 0xDB, 0xEE, 0x45, 0x8E, 0x58, 0x3F, 0x3F, /* 0xC8-0xCB */
+	0x3F, 0x3F, 0x92, 0xBF, 0xE0, 0xDD, 0x3F, 0x3F, /* 0xCC-0xCF */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xEE, 0x48, 0x3F, 0x3F, /* 0xD0-0xD3 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xEE, 0x46, 0x3F, 0x3F, /* 0xD4-0xD7 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0xDC-0xDF */
-	0x8E, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x63, /* 0xE0-0xE3 */
-	0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE0, 0xE2, 0x3F, 0x3F, /* 0xDC-0xDF */
+	0x8E, 0xEC, 0x3F, 0x3F, 0x3F, 0x3F, 0xEE, 0x47, /* 0xE0-0xE3 */
+	0x3F, 0x3F, 0xE0, 0xE0, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x8C, 0x5D, 0x3F, 0x3F, /* 0xE8-0xEB */
-	0x3F, 0x3F, 0x94, 0x00, 0x00, 0x00, 0x3F, 0x3F, /* 0xEC-0xEF */
-	0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */
-	0x3F, 0x3F, 0x00, 0x66, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */
-	0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF8-0xFB */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x8C, 0x00, 0x3F, 0x3F, /* 0xFC-0xFF */
+	0x3F, 0x3F, 0x94, 0xC7, 0xE0, 0xE1, 0x3F, 0x3F, /* 0xEC-0xEF */
+	0x3F, 0x3F, 0xE0, 0xFC, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */
+	0x3F, 0x3F, 0xEE, 0x4A, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */
+	0xE0, 0xE7, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF8-0xFB */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x8C, 0xBB, 0x3F, 0x3F, /* 0xFC-0xFF */
 };
 
 static unsigned char u2c_74[512] = {
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x8B, 0x85, /* 0x00-0x03 */
-	0x3F, 0x3F, 0x00, 0x00, 0x97, 0x9D, 0x00, 0x65, /* 0x04-0x07 */
-	0x3F, 0x3F, 0x97, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x08-0x0B */
+	0x3F, 0x3F, 0xE0, 0xE4, 0x97, 0x9D, 0xEE, 0x49, /* 0x04-0x07 */
+	0x3F, 0x3F, 0x97, 0xAE, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x08-0x0B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x18-0x1B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x91, 0x00, 0x3F, 0x3F, /* 0x20-0x23 */
-	0x3F, 0x3F, 0x00, 0x00, 0x00, 0x67, 0x3F, 0x3F, /* 0x24-0x27 */
-	0x3F, 0x3F, 0x00, 0x69, 0x00, 0x68, 0x3F, 0x3F, /* 0x28-0x2B */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x6A, 0x3F, 0x3F, /* 0x2C-0x2F */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x97, 0x00, /* 0x30-0x33 */
-	0x8B, 0x00, 0x94, 0x00, 0x94, 0x69, 0x3F, 0x3F, /* 0x34-0x37 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0x38-0x3B */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0x3C-0x3F */
-	0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x91, 0xF4, 0x3F, 0x3F, /* 0x20-0x23 */
+	0x3F, 0x3F, 0xE0, 0xE6, 0xEE, 0x4B, 0x3F, 0x3F, /* 0x24-0x27 */
+	0x3F, 0x3F, 0xEE, 0x4D, 0xEE, 0x4C, 0x3F, 0x3F, /* 0x28-0x2B */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xEE, 0x4E, 0x3F, 0x3F, /* 0x2C-0x2F */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE0, 0xE8, 0x97, 0xD4, /* 0x30-0x33 */
+	0x8B, 0xD5, 0x94, 0xFA, 0x94, 0x69, 0x3F, 0x3F, /* 0x34-0x37 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE0, 0xE9, 0x3F, 0x3F, /* 0x38-0x3B */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE0, 0xEB, /* 0x3C-0x3F */
+	0x3F, 0x3F, 0xE0, 0xEE, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x4C-0x4F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */
-	0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */
-	0x3F, 0x3F, 0x00, 0x00, 0x8C, 0x00, 0x89, 0x6C, /* 0x58-0x5B */
-	0x00, 0x00, 0x3F, 0x3F, 0x90, 0x90, 0x00, 0x00, /* 0x5C-0x5F */
-	0x97, 0x00, 0x3F, 0x3F, 0x00, 0x6B, 0x00, 0x00, /* 0x60-0x63 */
-	0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */
-	0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, /* 0x68-0x6B */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0x6C-0x6F */
-	0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x8D, 0x00, /* 0x70-0x73 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0x74-0x77 */
+	0x3F, 0x3F, 0xE0, 0xEA, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */
+	0x3F, 0x3F, 0xE0, 0xED, 0x8C, 0xE8, 0x89, 0x6C, /* 0x58-0x5B */
+	0xE0, 0xEF, 0x3F, 0x3F, 0x90, 0x90, 0xE0, 0xEC, /* 0x5C-0x5F */
+	0x97, 0xDA, 0x3F, 0x3F, 0xEE, 0x4F, 0xE0, 0xF2, /* 0x60-0x63 */
+	0xEA, 0xA2, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */
+	0x3F, 0x3F, 0xE0, 0xF0, 0xE0, 0xF3, 0x3F, 0x3F, /* 0x68-0x6B */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE0, 0xE5, /* 0x6C-0x6F */
+	0xE0, 0xF1, 0x3F, 0x3F, 0x3F, 0x3F, 0x8D, 0xBA, /* 0x70-0x73 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE0, 0xF4, 0x3F, 0x3F, /* 0x74-0x77 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0x7C-0x7F */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE0, 0xF5, 0x3F, 0x3F, /* 0x7C-0x7F */
 	
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x97, 0x9E, /* 0x80-0x83 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */
-	0x3F, 0x3F, 0x00, 0x6C, 0x3F, 0x3F, 0x00, 0x00, /* 0x88-0x8B */
+	0x3F, 0x3F, 0xEE, 0x50, 0x3F, 0x3F, 0xE0, 0xF6, /* 0x88-0x8B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x6D, /* 0x9C-0x9F */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0xA0-0xA3 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0xA4-0xA7 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE0, 0xF7, 0xEE, 0x51, /* 0x9C-0x9F */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE0, 0xE3, 0x3F, 0x3F, /* 0xA0-0xA3 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE0, 0xF8, /* 0xA4-0xA7 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */
-	0x8A, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB0-0xB3 */
+	0x8A, 0xC2, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB0-0xB3 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */
-	0x3F, 0x3F, 0x8E, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */
+	0x3F, 0x3F, 0x8E, 0xA3, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC4-0xC7 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0xC8-0xCB */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0xCC-0xCF */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE0, 0xF9, 0x3F, 0x3F, /* 0xC8-0xCB */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE0, 0xFA, /* 0xCC-0xCF */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */
-	0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */
+	0xE0, 0xFB, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */
 	0x89, 0x5A, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xDC-0xDF */
-	0x00, 0x40, 0x3F, 0x3F, 0x95, 0x5A, 0x00, 0x41, /* 0xE0-0xE3 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x8A, 0x00, 0x00, 0x42, /* 0xE4-0xE7 */
-	0x3F, 0x3F, 0x00, 0x43, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x44, 0x3F, 0x3F, /* 0xEC-0xEF */
-	0x00, 0x46, 0x00, 0x47, 0x00, 0x45, 0x3F, 0x3F, /* 0xF0-0xF3 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x95, 0x72, 0x00, 0x49, /* 0xF4-0xF7 */
-	0x00, 0x48, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF8-0xFB */
+	0xE1, 0x40, 0x3F, 0x3F, 0x95, 0x5A, 0xE1, 0x41, /* 0xE0-0xE3 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x8A, 0xA2, 0xE1, 0x42, /* 0xE4-0xE7 */
+	0x3F, 0x3F, 0xE1, 0x43, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE1, 0x44, 0x3F, 0x3F, /* 0xEC-0xEF */
+	0xE1, 0x46, 0xE1, 0x47, 0xE1, 0x45, 0x3F, 0x3F, /* 0xF0-0xF3 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x95, 0x72, 0xE1, 0x49, /* 0xF4-0xF7 */
+	0xE1, 0x48, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF8-0xFB */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */
 };
 
 static unsigned char u2c_75[512] = {
-	0x3F, 0x3F, 0x00, 0x6E, 0x3F, 0x3F, 0x00, 0x4B, /* 0x00-0x03 */
-	0x00, 0x4A, 0x00, 0x4C, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x04-0x07 */
+	0x3F, 0x3F, 0xEE, 0x52, 0x3F, 0x3F, 0xE1, 0x4B, /* 0x00-0x03 */
+	0xE1, 0x4A, 0xE1, 0x4C, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x04-0x07 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x08-0x0B */
-	0x00, 0x4D, 0x00, 0x4F, 0x00, 0x4E, 0x3F, 0x3F, /* 0x0C-0x0F */
-	0x3F, 0x3F, 0x8D, 0x99, 0x3F, 0x3F, 0x00, 0x51, /* 0x10-0x13 */
-	0x3F, 0x3F, 0x00, 0x50, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */
-	0x8A, 0x00, 0x3F, 0x3F, 0x90, 0x72, 0x3F, 0x3F, /* 0x18-0x1B */
-	0x93, 0x5B, 0x3F, 0x3F, 0x00, 0x52, 0x90, 0x00, /* 0x1C-0x1F */
+	0xE1, 0x4D, 0xE1, 0x4F, 0xE1, 0x4E, 0x3F, 0x3F, /* 0x0C-0x0F */
+	0x3F, 0x3F, 0x8D, 0x99, 0x3F, 0x3F, 0xE1, 0x51, /* 0x10-0x13 */
+	0x3F, 0x3F, 0xE1, 0x50, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */
+	0x8A, 0xC3, 0x3F, 0x3F, 0x90, 0x72, 0x3F, 0x3F, /* 0x18-0x1B */
+	0x93, 0x5B, 0x3F, 0x3F, 0xE1, 0x52, 0x90, 0xB6, /* 0x1C-0x1F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x8E, 0x59, /* 0x20-0x23 */
-	0x3F, 0x3F, 0x89, 0x99, 0x00, 0x53, 0x3F, 0x3F, /* 0x24-0x27 */
-	0x97, 0x70, 0x3F, 0x3F, 0x3F, 0x3F, 0x95, 0x00, /* 0x28-0x2B */
-	0x00, 0x54, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0x2C-0x2F */
+	0x3F, 0x3F, 0x89, 0x99, 0xE1, 0x53, 0x3F, 0x3F, /* 0x24-0x27 */
+	0x97, 0x70, 0x3F, 0x3F, 0x3F, 0x3F, 0x95, 0xE1, /* 0x28-0x2B */
+	0xE1, 0x54, 0x3F, 0x3F, 0x3F, 0x3F, 0xED, 0x8C, /* 0x2C-0x2F */
 	0x93, 0x63, 0x97, 0x52, 0x8D, 0x62, 0x90, 0x5C, /* 0x30-0x33 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x92, 0x6A, /* 0x34-0x37 */
-	0x99, 0x00, 0x3F, 0x3F, 0x92, 0x00, 0x89, 0x00, /* 0x38-0x3B */
-	0x00, 0x55, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */
+	0x99, 0xB2, 0x3F, 0x3F, 0x92, 0xAC, 0x89, 0xE6, /* 0x38-0x3B */
+	0xE1, 0x55, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */
-	0x00, 0x56, 0x3F, 0x3F, 0x00, 0x5B, 0x3F, 0x3F, /* 0x44-0x47 */
-	0x3F, 0x3F, 0x00, 0x59, 0x00, 0x58, 0x9D, 0x00, /* 0x48-0x4B */
-	0x8A, 0x45, 0x00, 0x57, 0x3F, 0x3F, 0x88, 0x00, /* 0x4C-0x4F */
-	0x3F, 0x3F, 0x94, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */
-	0x94, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */
-	0x3F, 0x3F, 0x97, 0x00, 0x00, 0x5C, 0x00, 0x5A, /* 0x58-0x5B */
-	0x92, 0x7B, 0x90, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x5C-0x5F */
-	0x94, 0x00, 0x3F, 0x3F, 0x95, 0x4C, 0x3F, 0x3F, /* 0x60-0x63 */
-	0x00, 0x5E, 0x97, 0x00, 0x8C, 0x6C, 0x00, 0x5F, /* 0x64-0x67 */
-	0x3F, 0x3F, 0x00, 0x5D, 0x94, 0x00, 0x00, 0x60, /* 0x68-0x6B */
-	0x3F, 0x3F, 0x00, 0x61, 0x3F, 0x3F, 0x00, 0x6F, /* 0x6C-0x6F */
-	0x88, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x8F, 0x00, /* 0x70-0x73 */
-	0x00, 0x66, 0x3F, 0x3F, 0x00, 0x63, 0x93, 0x00, /* 0x74-0x77 */
-	0x00, 0x62, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */
+	0xE1, 0x56, 0x3F, 0x3F, 0xE1, 0x5B, 0x3F, 0x3F, /* 0x44-0x47 */
+	0x3F, 0x3F, 0xE1, 0x59, 0xE1, 0x58, 0x9D, 0xC0, /* 0x48-0x4B */
+	0x8A, 0x45, 0xE1, 0x57, 0x3F, 0x3F, 0x88, 0xD8, /* 0x4C-0x4F */
+	0x3F, 0x3F, 0x94, 0xA8, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */
+	0x94, 0xC8, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */
+	0x3F, 0x3F, 0x97, 0xAF, 0xE1, 0x5C, 0xE1, 0x5A, /* 0x58-0x5B */
+	0x92, 0x7B, 0x90, 0xA4, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x5C-0x5F */
+	0x94, 0xA9, 0x3F, 0x3F, 0x95, 0x4C, 0x3F, 0x3F, /* 0x60-0x63 */
+	0xE1, 0x5E, 0x97, 0xAA, 0x8C, 0x6C, 0xE1, 0x5F, /* 0x64-0x67 */
+	0x3F, 0x3F, 0xE1, 0x5D, 0x94, 0xD4, 0xE1, 0x60, /* 0x68-0x6B */
+	0x3F, 0x3F, 0xE1, 0x61, 0x3F, 0x3F, 0xEE, 0x53, /* 0x6C-0x6F */
+	0x88, 0xD9, 0x3F, 0x3F, 0x3F, 0x3F, 0x8F, 0xF4, /* 0x70-0x73 */
+	0xE1, 0x66, 0x3F, 0x3F, 0xE1, 0x63, 0x93, 0xEB, /* 0x74-0x77 */
+	0xE1, 0x62, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x8B, 0x45, /* 0x7C-0x7F */
 	
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x69, 0x3F, 0x3F, /* 0x80-0x83 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x64, 0x00, 0x65, /* 0x84-0x87 */
-	0x3F, 0x3F, 0x00, 0x68, 0x00, 0x67, 0x95, 0x44, /* 0x88-0x8B */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE1, 0x69, 0x3F, 0x3F, /* 0x80-0x83 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE1, 0x64, 0xE1, 0x65, /* 0x84-0x87 */
+	0x3F, 0x3F, 0xE1, 0x68, 0xE1, 0x67, 0x95, 0x44, /* 0x88-0x8B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x91, 0x61, 0x91, 0x60, /* 0x8C-0x8F */
 	0x3F, 0x3F, 0x8B, 0x5E, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */
-	0x00, 0x6A, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x6B, 0x3F, 0x3F, /* 0x98-0x9B */
-	0x3F, 0x3F, 0x00, 0x6C, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x6E, /* 0xA0-0xA3 */
-	0x3F, 0x3F, 0x00, 0x6D, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */
+	0xE1, 0x6A, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE1, 0x6B, 0x3F, 0x3F, /* 0x98-0x9B */
+	0x3F, 0x3F, 0xE1, 0x6C, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE1, 0x6E, /* 0xA0-0xA3 */
+	0x3F, 0x3F, 0xE1, 0x6D, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x89, 0x75, /* 0xA8-0xAB */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */
-	0x3F, 0x3F, 0x00, 0x76, 0x94, 0x00, 0x00, 0x70, /* 0xB0-0xB3 */
-	0x3F, 0x3F, 0x00, 0x72, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */
-	0x00, 0x74, 0x90, 0x5D, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */
-	0x00, 0x75, 0x00, 0x73, 0x8E, 0x00, 0x3F, 0x3F, /* 0xBC-0xBF */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x6F, 0x00, 0x71, /* 0xC0-0xC3 */
-	0x3F, 0x3F, 0x95, 0x61, 0x3F, 0x3F, 0x8F, 0x00, /* 0xC4-0xC7 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x78, 0x3F, 0x3F, /* 0xC8-0xCB */
-	0x3F, 0x3F, 0x00, 0x77, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x79, 0x3F, 0x3F, /* 0xD0-0xD3 */
-	0x8E, 0x00, 0x8D, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */
-	0x93, 0x97, 0x00, 0x7A, 0x3F, 0x3F, 0x92, 0x00, /* 0xD8-0xDB */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x7C, 0x3F, 0x3F, /* 0xDC-0xDF */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x97, 0x9F, 0x00, 0x7B, /* 0xE0-0xE3 */
+	0x3F, 0x3F, 0xE1, 0x76, 0x94, 0xE6, 0xE1, 0x70, /* 0xB0-0xB3 */
+	0x3F, 0x3F, 0xE1, 0x72, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */
+	0xE1, 0x74, 0x90, 0x5D, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */
+	0xE1, 0x75, 0xE1, 0x73, 0x8E, 0xBE, 0x3F, 0x3F, /* 0xBC-0xBF */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE1, 0x6F, 0xE1, 0x71, /* 0xC0-0xC3 */
+	0x3F, 0x3F, 0x95, 0x61, 0x3F, 0x3F, 0x8F, 0xC7, /* 0xC4-0xC7 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE1, 0x78, 0x3F, 0x3F, /* 0xC8-0xCB */
+	0x3F, 0x3F, 0xE1, 0x77, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE1, 0x79, 0x3F, 0x3F, /* 0xD0-0xD3 */
+	0x8E, 0xA4, 0x8D, 0xAD, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */
+	0x93, 0x97, 0xE1, 0x7A, 0x3F, 0x3F, 0x92, 0xC9, /* 0xD8-0xDB */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE1, 0x7C, 0x3F, 0x3F, /* 0xDC-0xDF */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x97, 0x9F, 0xE1, 0x7B, /* 0xE0-0xE3 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */
 	0x3F, 0x3F, 0x91, 0x89, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */
-	0x00, 0x82, 0x3F, 0x3F, 0x00, 0x84, 0x00, 0x85, /* 0xF0-0xF3 */
+	0xE1, 0x82, 0x3F, 0x3F, 0xE1, 0x84, 0xE1, 0x85, /* 0xF0-0xF3 */
 	0x92, 0x73, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x83, 0x3F, 0x3F, /* 0xF8-0xFB */
-	0x00, 0x80, 0x3F, 0x3F, 0x00, 0x7D, 0x00, 0x7E, /* 0xFC-0xFF */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE1, 0x83, 0x3F, 0x3F, /* 0xF8-0xFB */
+	0xE1, 0x80, 0x3F, 0x3F, 0xE1, 0x7D, 0xE1, 0x7E, /* 0xFC-0xFF */
 };
 
 static unsigned char u2c_76[512] = {
-	0x3F, 0x3F, 0x00, 0x81, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */
+	0x3F, 0x3F, 0xE1, 0x81, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x04-0x07 */
-	0x3F, 0x3F, 0x00, 0x88, 0x3F, 0x3F, 0x00, 0x86, /* 0x08-0x0B */
-	0x3F, 0x3F, 0x00, 0x87, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */
+	0x3F, 0x3F, 0xE1, 0x88, 0x3F, 0x3F, 0xE1, 0x86, /* 0x08-0x0B */
+	0x3F, 0x3F, 0xE1, 0x87, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x18-0x1B */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x89, /* 0x1C-0x1F */
-	0x00, 0x8B, 0x00, 0x8C, 0x00, 0x8D, 0x3F, 0x3F, /* 0x20-0x23 */
-	0x00, 0x8E, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x8A, /* 0x24-0x27 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE1, 0x89, /* 0x1C-0x1F */
+	0xE1, 0x8B, 0xE1, 0x8C, 0xE1, 0x8D, 0x3F, 0x3F, /* 0x20-0x23 */
+	0xE1, 0x8E, 0x3F, 0x3F, 0x3F, 0x3F, 0xE1, 0x8A, /* 0x24-0x27 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */
-	0x00, 0x90, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */
-	0x00, 0x8F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x91, /* 0x38-0x3B */
+	0xE1, 0x90, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */
+	0xE1, 0x8F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE1, 0x91, /* 0x38-0x3B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x97, 0x00, 0x3F, 0x3F, /* 0x40-0x43 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x94, 0x00, 0x92, /* 0x44-0x47 */
-	0x00, 0x93, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */
-	0x8A, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x4C-0x4F */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x96, 0x00, 0x3F, 0x3F, /* 0x50-0x53 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x95, 0x00, 0x3F, 0x3F, /* 0x54-0x57 */
-	0x00, 0x96, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */
-	0x00, 0x95, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x5C-0x5F */
-	0x3F, 0x3F, 0x00, 0x97, 0x00, 0x98, 0x3F, 0x3F, /* 0x60-0x63 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x9C, /* 0x64-0x67 */
-	0x00, 0x99, 0x00, 0x9A, 0x00, 0x9B, 0x3F, 0x3F, /* 0x68-0x6B */
-	0x00, 0x9D, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */
-	0x00, 0x9E, 0x3F, 0x3F, 0x00, 0x9F, 0x3F, 0x3F, /* 0x70-0x73 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0x74-0x77 */
-	0x00, 0x00, 0x3F, 0x3F, 0x94, 0x00, 0x93, 0x6F, /* 0x78-0x7B */
-	0x00, 0x00, 0x94, 0x92, 0x95, 0x53, 0x3F, 0x3F, /* 0x7C-0x7F */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x97, 0xC3, 0x3F, 0x3F, /* 0x40-0x43 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE1, 0x94, 0xE1, 0x92, /* 0x44-0x47 */
+	0xE1, 0x93, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */
+	0x8A, 0xE0, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x4C-0x4F */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x96, 0xFC, 0x3F, 0x3F, /* 0x50-0x53 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x95, 0xC8, 0x3F, 0x3F, /* 0x54-0x57 */
+	0xE1, 0x96, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */
+	0xE1, 0x95, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x5C-0x5F */
+	0x3F, 0x3F, 0xE1, 0x97, 0xE1, 0x98, 0x3F, 0x3F, /* 0x60-0x63 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE1, 0x9C, /* 0x64-0x67 */
+	0xE1, 0x99, 0xE1, 0x9A, 0xE1, 0x9B, 0x3F, 0x3F, /* 0x68-0x6B */
+	0xE1, 0x9D, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */
+	0xE1, 0x9E, 0x3F, 0x3F, 0xE1, 0x9F, 0x3F, 0x3F, /* 0x70-0x73 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE1, 0xA0, 0x3F, 0x3F, /* 0x74-0x77 */
+	0xE1, 0xA1, 0x3F, 0x3F, 0x94, 0xAD, 0x93, 0x6F, /* 0x78-0x7B */
+	0xE1, 0xA2, 0x94, 0x92, 0x95, 0x53, 0x3F, 0x3F, /* 0x7C-0x7F */
 	
-	0x00, 0x00, 0x3F, 0x3F, 0x00, 0x70, 0x00, 0x00, /* 0x80-0x83 */
+	0xE1, 0xA3, 0x3F, 0x3F, 0xEE, 0x54, 0xE1, 0xA4, /* 0x80-0x83 */
 	0x93, 0x49, 0x3F, 0x3F, 0x8A, 0x46, 0x8D, 0x63, /* 0x84-0x87 */
-	0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0x88-0x8B */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0x8C-0x8F */
-	0x8E, 0x48, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0x90-0x93 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0x94-0x97 */
-	0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x73, /* 0x98-0x9B */
-	0x00, 0x71, 0x3F, 0x3F, 0x00, 0x72, 0x3F, 0x3F, /* 0x9C-0x9F */
+	0xE1, 0xA5, 0x3F, 0x3F, 0x3F, 0x3F, 0xE1, 0xA6, /* 0x88-0x8B */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE1, 0xA7, 0x3F, 0x3F, /* 0x8C-0x8F */
+	0x8E, 0x48, 0x3F, 0x3F, 0x3F, 0x3F, 0xE1, 0xA9, /* 0x90-0x93 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE1, 0xA8, 0x3F, 0x3F, /* 0x94-0x97 */
+	0x3F, 0x3F, 0xE1, 0xAA, 0xE1, 0xAB, 0xEE, 0x57, /* 0x98-0x9B */
+	0xEE, 0x55, 0x3F, 0x3F, 0xEE, 0x56, 0x3F, 0x3F, /* 0x9C-0x9F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x74, 0x3F, 0x3F, /* 0xA4-0xA7 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xEE, 0x58, 0x3F, 0x3F, /* 0xA4-0xA7 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x94, 0x00, 0x3F, 0x3F, /* 0xAC-0xAF */
-	0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB0-0xB3 */
-	0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x89, /* 0xB4-0xB7 */
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, /* 0xB8-0xBB */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x94, 0xE7, 0x3F, 0x3F, /* 0xAC-0xAF */
+	0xE1, 0xAC, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB0-0xB3 */
+	0xE1, 0xAD, 0x3F, 0x3F, 0x3F, 0x3F, 0xEA, 0x89, /* 0xB4-0xB7 */
+	0xE1, 0xAE, 0xE1, 0xAF, 0xE1, 0xB0, 0x3F, 0x3F, /* 0xB8-0xBB */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x8E, 0x4D, /* 0xBC-0xBF */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x94, 0x75, /* 0xC0-0xC3 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE1, 0xB1, 0x94, 0x75, /* 0xC0-0xC3 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x96, 0x7E, 0x3F, 0x3F, /* 0xC4-0xC7 */
 	0x89, 0x6D, 0x3F, 0x3F, 0x89, 0x76, 0x3F, 0x3F, /* 0xC8-0xCB */
-	0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0xD0-0xD3 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x93, 0x90, /* 0xD4-0xD7 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x90, 0x00, /* 0xD8-0xDB */
-	0x9F, 0x58, 0x3F, 0x3F, 0x00, 0x00, 0x96, 0x00, /* 0xDC-0xDF */
-	0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, 0x8A, 0x00, /* 0xE0-0xE3 */
-	0x94, 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x00, /* 0xE4-0xE7 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0xE8-0xEB */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x96, 0x00, 0x3F, 0x3F, /* 0xEC-0xEF */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x96, 0x00, 0x3F, 0x3F, /* 0xF0-0xF3 */
-	0x92, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */
-	0x91, 0x8A, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0xF8-0xFB */
+	0x3F, 0x3F, 0xE1, 0xB2, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE1, 0xB4, 0x3F, 0x3F, /* 0xD0-0xD3 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE1, 0xB3, 0x93, 0x90, /* 0xD4-0xD7 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x90, 0xB7, /* 0xD8-0xDB */
+	0x9F, 0x58, 0x3F, 0x3F, 0xE1, 0xB5, 0x96, 0xBF, /* 0xDC-0xDF */
+	0x3F, 0x3F, 0xE1, 0xB6, 0x3F, 0x3F, 0x8A, 0xC4, /* 0xE0-0xE3 */
+	0x94, 0xD5, 0xE1, 0xB7, 0x3F, 0x3F, 0xE1, 0xB8, /* 0xE4-0xE7 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE1, 0xB9, 0x3F, 0x3F, /* 0xE8-0xEB */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x96, 0xDA, 0x3F, 0x3F, /* 0xEC-0xEF */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x96, 0xD3, 0x3F, 0x3F, /* 0xF0-0xF3 */
+	0x92, 0xBC, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */
+	0x91, 0x8A, 0x3F, 0x3F, 0x3F, 0x3F, 0xE1, 0xBB, /* 0xF8-0xFB */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x8F, 0x82, 0x3F, 0x3F, /* 0xFC-0xFF */
 };
 
 static unsigned char u2c_77[512] = {
-	0x3F, 0x3F, 0x8F, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */
-	0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0x04-0x07 */
-	0x00, 0x00, 0x94, 0x00, 0x3F, 0x3F, 0x8A, 0x00, /* 0x08-0x0B */
-	0x8C, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */
+	0x3F, 0x3F, 0x8F, 0xC8, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */
+	0xE1, 0xBE, 0x3F, 0x3F, 0x3F, 0x3F, 0xE1, 0xBD, /* 0x04-0x07 */
+	0xE1, 0xBC, 0x94, 0xFB, 0x3F, 0x3F, 0x8A, 0xC5, /* 0x08-0x0B */
+	0x8C, 0xA7, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0x18-0x1B */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x90, 0x5E, /* 0x1C-0x1F */
-	0x96, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, /* 0x24-0x27 */
-	0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE1, 0xC4, /* 0x18-0x1B */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE1, 0xC1, 0x90, 0x5E, /* 0x1C-0x1F */
+	0x96, 0xB0, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */
+	0xE1, 0xC0, 0xE1, 0xC2, 0xE1, 0xC3, 0x3F, 0x3F, /* 0x24-0x27 */
+	0x3F, 0x3F, 0xE1, 0xBF, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0x34-0x37 */
-	0x00, 0x00, 0x3F, 0x3F, 0x92, 0x00, 0x3F, 0x3F, /* 0x38-0x3B */
-	0x8A, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE1, 0xC5, /* 0x34-0x37 */
+	0xE1, 0xC6, 0x3F, 0x3F, 0x92, 0xAD, 0x3F, 0x3F, /* 0x38-0x3B */
+	0x8A, 0xE1, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */
 	0x92, 0x85, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x76, 0x00, 0x00, /* 0x44-0x47 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xEE, 0x5A, 0xE1, 0xC7, /* 0x44-0x47 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x4C-0x4F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5B */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE1, 0xC8, 0xE1, 0xCB, /* 0x58-0x5B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x5C-0x5F */
-	0x3F, 0x3F, 0x90, 0x87, 0x3F, 0x3F, 0x93, 0x00, /* 0x60-0x63 */
-	0x3F, 0x3F, 0x00, 0x00, 0x96, 0x72, 0x3F, 0x3F, /* 0x64-0x67 */
-	0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0x68-0x6B */
+	0x3F, 0x3F, 0x90, 0x87, 0x3F, 0x3F, 0x93, 0xC2, /* 0x60-0x63 */
+	0x3F, 0x3F, 0xE1, 0xCC, 0x96, 0x72, 0x3F, 0x3F, /* 0x64-0x67 */
+	0xE1, 0xC9, 0x3F, 0x3F, 0x3F, 0x3F, 0xE1, 0xCA, /* 0x68-0x6B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x74-0x77 */
-	0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, /* 0x7C-0x7F */
+	0x3F, 0x3F, 0xE1, 0xCF, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE1, 0xCE, 0xE1, 0xCD, /* 0x7C-0x7F */
 	
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0x88-0x8B */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0x8C-0x8F */
-	0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE1, 0xD1, /* 0x88-0x8B */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE1, 0xD0, 0x3F, 0x3F, /* 0x8C-0x8F */
+	0x3F, 0x3F, 0xE1, 0xD2, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0x9C-0x9F */
-	0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */
-	0x3F, 0x3F, 0x95, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE1, 0xD4, 0x3F, 0x3F, /* 0x9C-0x9F */
+	0xE1, 0xD3, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */
+	0x3F, 0x3F, 0x95, 0xCB, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */
-	0x8F, 0x75, 0x97, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */
-	0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x93, 0x00, /* 0xB0-0xB3 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0xB4-0xB7 */
-	0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x00, /* 0xB8-0xBB */
-	0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x00, /* 0xBC-0xBF */
+	0x8F, 0x75, 0x97, 0xC4, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */
+	0xE1, 0xD5, 0x3F, 0x3F, 0x3F, 0x3F, 0x93, 0xB5, /* 0xB0-0xB3 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE1, 0xD6, 0x3F, 0x3F, /* 0xB4-0xB7 */
+	0x3F, 0x3F, 0xE1, 0xD7, 0x3F, 0x3F, 0xE1, 0xDB, /* 0xB8-0xBB */
+	0xE1, 0xD9, 0xE1, 0xDA, 0x3F, 0x3F, 0xE1, 0xD8, /* 0xBC-0xBF */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0xC4-0xC7 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE1, 0xDC, /* 0xC4-0xC7 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC8-0xCB */
-	0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */
+	0x3F, 0x3F, 0xE1, 0xDD, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0xD4-0xD7 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x96, 0x00, /* 0xD8-0xDB */
-	0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xDC-0xDF */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x96, 0x00, 0x00, 0x00, /* 0xE0-0xE3 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE1, 0xDE, /* 0xD4-0xD7 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE1, 0xDF, 0x96, 0xB5, /* 0xD8-0xDB */
+	0xE1, 0xE0, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xDC-0xDF */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x96, 0xEE, 0xE1, 0xE1, /* 0xE0-0xE3 */
 	0x3F, 0x3F, 0x92, 0x6D, 0x3F, 0x3F, 0x94, 0x8A, /* 0xE4-0xE7 */
-	0x3F, 0x3F, 0x8B, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */
-	0x3F, 0x3F, 0x92, 0x5A, 0x00, 0x00, 0x8B, 0x00, /* 0xEC-0xEF */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x90, 0x00, /* 0xF0-0xF3 */
+	0x3F, 0x3F, 0x8B, 0xE9, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */
+	0x3F, 0x3F, 0x92, 0x5A, 0xE1, 0xE2, 0x8B, 0xB8, /* 0xEC-0xEF */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x90, 0xCE, /* 0xF0-0xF3 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF8-0xFB */
-	0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */
+	0xE1, 0xE3, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */
 };
 
 static unsigned char u2c_78[512] = {
-	0x3F, 0x3F, 0x3F, 0x3F, 0x8D, 0x00, 0x3F, 0x3F, /* 0x00-0x03 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x8D, 0xBB, 0x3F, 0x3F, /* 0x00-0x03 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x04-0x07 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x08-0x0B */
-	0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0x10-0x13 */
-	0x8C, 0x00, 0x8D, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */
+	0xE1, 0xE4, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE1, 0xE5, 0x3F, 0x3F, /* 0x10-0x13 */
+	0x8C, 0xA4, 0x8D, 0xD3, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x18-0x1B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */
-	0x00, 0x00, 0x00, 0x78, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */
-	0x3F, 0x3F, 0x93, 0x75, 0x8D, 0x00, 0x8B, 0x6D, /* 0x24-0x27 */
+	0xE1, 0xE7, 0xEE, 0x5C, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */
+	0x3F, 0x3F, 0x93, 0x75, 0x8D, 0xD4, 0x8B, 0x6D, /* 0x24-0x27 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x96, 0x43, 0x3F, 0x3F, /* 0x30-0x33 */
@@ -6796,438 +6798,438 @@
 	0x3F, 0x3F, 0x3F, 0x3F, 0x93, 0x76, 0x3F, 0x3F, /* 0x38-0x3B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x8D, 0x7B, /* 0x3C-0x3F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */
-	0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */
+	0x3F, 0x3F, 0xE1, 0xE9, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x79, 0x3F, 0x3F, /* 0x4C-0x4F */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xEE, 0x5D, 0x3F, 0x3F, /* 0x4C-0x4F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */
-	0x3F, 0x3F, 0x8F, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x5C-0x5F */
+	0x3F, 0x3F, 0x8F, 0xC9, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x5C-0x5F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x60-0x63 */
-	0x00, 0x7A, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x97, 0x00, /* 0x68-0x6B */
-	0x8D, 0x64, 0x3F, 0x3F, 0x3F, 0x3F, 0x8C, 0x00, /* 0x6C-0x6F */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x94, 0x00, 0x3F, 0x3F, /* 0x70-0x73 */
-	0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x74-0x77 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x7B, 0x3F, 0x3F, /* 0x78-0x7B */
-	0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */
+	0xEE, 0x5E, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x97, 0xB0, /* 0x68-0x6B */
+	0x8D, 0x64, 0x3F, 0x3F, 0x3F, 0x3F, 0x8C, 0xA5, /* 0x6C-0x6F */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x94, 0xA1, 0x3F, 0x3F, /* 0x70-0x73 */
+	0xE1, 0xEB, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x74-0x77 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xEE, 0x5F, 0x3F, 0x3F, /* 0x78-0x7B */
+	0xE1, 0xED, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */
 	
-	0x3F, 0x3F, 0x8C, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x92, 0x00, /* 0x84-0x87 */
+	0x3F, 0x3F, 0x8C, 0xE9, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE1, 0xEC, 0x92, 0xF4, /* 0x84-0x87 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x88-0x8B */
-	0x00, 0x00, 0x8A, 0x56, 0x00, 0x00, 0x3F, 0x3F, /* 0x8C-0x8F */
-	0x3F, 0x3F, 0x94, 0x00, 0x3F, 0x3F, 0x89, 0x4F, /* 0x90-0x93 */
-	0x3F, 0x3F, 0x8D, 0x00, 0x3F, 0x3F, 0x98, 0x71, /* 0x94-0x97 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0x98-0x9B */
+	0xE1, 0xEF, 0x8A, 0x56, 0xE1, 0xEA, 0x3F, 0x3F, /* 0x8C-0x8F */
+	0x3F, 0x3F, 0x94, 0xE8, 0x3F, 0x3F, 0x89, 0x4F, /* 0x90-0x93 */
+	0x3F, 0x3F, 0x8D, 0xEA, 0x3F, 0x3F, 0x98, 0x71, /* 0x94-0x97 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE1, 0xEE, 0x3F, 0x3F, /* 0x98-0x9B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0xA0-0xA3 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x95, 0x00, /* 0xA4-0xA7 */
-	0x3F, 0x3F, 0x90, 0x00, 0x00, 0x00, 0x3F, 0x3F, /* 0xA8-0xAB */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0xAC-0xAF */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE1, 0xF0, /* 0xA0-0xA3 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x95, 0xC9, /* 0xA4-0xA7 */
+	0x3F, 0x3F, 0x90, 0xD7, 0xE1, 0xF2, 0x3F, 0x3F, /* 0xA8-0xAB */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE1, 0xF3, /* 0xAC-0xAF */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB0-0xB3 */
-	0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */
+	0x3F, 0x3F, 0xE1, 0xF1, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x8A, 0x6D, 0x3F, 0x3F, /* 0xB8-0xBB */
-	0x00, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0xBC-0xBF */
-	0x3F, 0x3F, 0x8E, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */
-	0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, /* 0xC4-0xC7 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, /* 0xC8-0xCB */
+	0xE1, 0xF9, 0x3F, 0x3F, 0xE1, 0xF8, 0x3F, 0x3F, /* 0xBC-0xBF */
+	0x3F, 0x3F, 0x8E, 0xA5, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */
+	0x3F, 0x3F, 0xE1, 0xFA, 0xE1, 0xF5, 0x3F, 0x3F, /* 0xC4-0xC7 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE1, 0xFB, 0xE1, 0xF6, /* 0xC8-0xCB */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */
-	0x94, 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */
-	0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x41, 0x3F, 0x3F, /* 0xD8-0xDB */
+	0x94, 0xD6, 0xE1, 0xF4, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */
+	0xE1, 0xF7, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE2, 0x41, 0x3F, 0x3F, /* 0xD8-0xDB */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xDC-0xDF */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x40, /* 0xE4-0xE7 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE2, 0x40, /* 0xE4-0xE7 */
 	0x96, 0x81, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */
-	0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x88, 0x00, /* 0xEC-0xEF */
+	0xE1, 0xFC, 0x3F, 0x3F, 0x3F, 0x3F, 0x88, 0xE9, /* 0xEC-0xEF */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */
-	0x00, 0x43, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */
+	0xE2, 0x43, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF8-0xFB */
-	0x3F, 0x3F, 0x00, 0x42, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */
+	0x3F, 0x3F, 0xE2, 0x42, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */
 };
 
 static unsigned char u2c_79[512] = {
-	0x3F, 0x3F, 0x8F, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x44, /* 0x04-0x07 */
+	0x3F, 0x3F, 0x8F, 0xCA, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE2, 0x44, /* 0x04-0x07 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x08-0x0B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x91, 0x62, 0x3F, 0x3F, /* 0x0C-0x0F */
-	0x3F, 0x3F, 0x00, 0x46, 0x00, 0x45, 0x3F, 0x3F, /* 0x10-0x13 */
+	0x3F, 0x3F, 0xE2, 0x46, 0xE2, 0x45, 0x3F, 0x3F, /* 0x10-0x13 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */
-	0x3F, 0x3F, 0x00, 0x47, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x18-0x1B */
+	0x3F, 0x3F, 0xE2, 0x47, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x18-0x1B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0x24-0x27 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x49, /* 0x28-0x2B */
-	0x00, 0x48, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */
-	0x00, 0x7C, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE1, 0xE6, 0x3F, 0x3F, /* 0x24-0x27 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE1, 0xE8, 0xE2, 0x49, /* 0x28-0x2B */
+	0xE2, 0x48, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */
+	0xEE, 0x60, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x8E, 0x00, 0x3F, 0x3F, /* 0x38-0x3B */
-	0x97, 0x00, 0x3F, 0x3F, 0x8E, 0x00, 0x3F, 0x3F, /* 0x3C-0x3F */
-	0x00, 0x4A, 0x8C, 0x56, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x8E, 0xA6, 0x3F, 0x3F, /* 0x38-0x3B */
+	0x97, 0xE7, 0x3F, 0x3F, 0x8E, 0xD0, 0x3F, 0x3F, /* 0x3C-0x3F */
+	0xE2, 0x4A, 0x8C, 0x56, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x8B, 0x5F, /* 0x44-0x47 */
 	0x8B, 0x46, 0x8E, 0x83, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x4C-0x4F */
-	0x97, 0x53, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x50, /* 0x50-0x53 */
-	0x3F, 0x3F, 0x00, 0x4F, 0x91, 0x63, 0x00, 0x4C, /* 0x54-0x57 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x4E, 0x3F, 0x3F, /* 0x58-0x5B */
-	0x3F, 0x3F, 0x8F, 0x6A, 0x90, 0x5F, 0x00, 0x4D, /* 0x5C-0x5F */
-	0x00, 0x4B, 0x3F, 0x3F, 0x94, 0x49, 0x3F, 0x3F, /* 0x60-0x63 */
-	0x3F, 0x3F, 0x8F, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */
+	0x97, 0x53, 0x3F, 0x3F, 0x3F, 0x3F, 0xE2, 0x50, /* 0x50-0x53 */
+	0x3F, 0x3F, 0xE2, 0x4F, 0x91, 0x63, 0xE2, 0x4C, /* 0x54-0x57 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE2, 0x4E, 0x3F, 0x3F, /* 0x58-0x5B */
+	0x3F, 0x3F, 0x8F, 0x6A, 0x90, 0x5F, 0xE2, 0x4D, /* 0x5C-0x5F */
+	0xE2, 0x4B, 0x3F, 0x3F, 0x94, 0x49, 0x3F, 0x3F, /* 0x60-0x63 */
+	0x3F, 0x3F, 0x8F, 0xCB, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */
 	0x95, 0x5B, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x68-0x6B */
-	0x3F, 0x3F, 0x8D, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */
+	0x3F, 0x3F, 0x8D, 0xD5, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x93, 0x98, /* 0x74-0x77 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x51, 0x3F, 0x3F, /* 0x78-0x7B */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x52, /* 0x7C-0x7F */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE2, 0x51, 0x3F, 0x3F, /* 0x78-0x7B */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE2, 0x52, /* 0x7C-0x7F */
 	
-	0x00, 0x68, 0x8B, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */
+	0xE2, 0x68, 0x8B, 0xD6, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */
 	0x98, 0x5C, 0x91, 0x54, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x53, 0x3F, 0x3F, /* 0x88-0x8B */
-	0x3F, 0x3F, 0x89, 0x00, 0x92, 0x00, 0x95, 0x9F, /* 0x8C-0x8F */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE2, 0x53, 0x3F, 0x3F, /* 0x88-0x8B */
+	0x3F, 0x3F, 0x89, 0xD0, 0x92, 0xF5, 0x95, 0x9F, /* 0x8C-0x8F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */
-	0x00, 0x81, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x83, /* 0x98-0x9B */
-	0x3F, 0x3F, 0x00, 0x54, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */
+	0xEE, 0x64, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xEE, 0x66, /* 0x98-0x9B */
+	0x3F, 0x3F, 0xE2, 0x54, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x8B, 0x9A, 0x00, 0x55, /* 0xA4-0xA7 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x57, 0x3F, 0x3F, /* 0xA8-0xAB */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x58, 0x3F, 0x3F, /* 0xAC-0xAF */
-	0x94, 0x48, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x59, /* 0xB0-0xB3 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x8B, 0x9A, 0xE2, 0x55, /* 0xA4-0xA7 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE2, 0x57, 0x3F, 0x3F, /* 0xA8-0xAB */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE2, 0x58, 0x3F, 0x3F, /* 0xAC-0xAF */
+	0x94, 0x48, 0x3F, 0x3F, 0x3F, 0x3F, 0xE2, 0x59, /* 0xB0-0xB3 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */
-	0x3F, 0x3F, 0x00, 0x5A, 0x00, 0x5B, 0x3F, 0x3F, /* 0xB8-0xBB */
-	0x3F, 0x3F, 0x8B, 0x00, 0x89, 0x00, 0x93, 0x00, /* 0xBC-0xBF */
+	0x3F, 0x3F, 0xE2, 0x5A, 0xE2, 0x5B, 0x3F, 0x3F, /* 0xB8-0xBB */
+	0x3F, 0x3F, 0x8B, 0xD7, 0x89, 0xD1, 0x93, 0xC3, /* 0xBC-0xBF */
 	0x8F, 0x47, 0x8E, 0x84, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC4-0xC7 */
-	0x3F, 0x3F, 0x00, 0x5C, 0x3F, 0x3F, 0x8F, 0x48, /* 0xC8-0xCB */
+	0x3F, 0x3F, 0xE2, 0x5C, 0x3F, 0x3F, 0x8F, 0x48, /* 0xC8-0xCB */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */
-	0x3F, 0x3F, 0x89, 0x00, 0x95, 0x62, 0x3F, 0x3F, /* 0xD0-0xD3 */
-	0x3F, 0x3F, 0x00, 0x5D, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */
-	0x94, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */
+	0x3F, 0x3F, 0x89, 0xC8, 0x95, 0x62, 0x3F, 0x3F, /* 0xD0-0xD3 */
+	0x3F, 0x3F, 0xE2, 0x5D, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */
+	0x94, 0xE9, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x91, 0x64, /* 0xDC-0xDF */
-	0x3F, 0x3F, 0x00, 0x60, 0x3F, 0x3F, 0x00, 0x61, /* 0xE0-0xE3 */
-	0x94, 0x89, 0x3F, 0x3F, 0x90, 0x60, 0x00, 0x5E, /* 0xE4-0xE7 */
+	0x3F, 0x3F, 0xE2, 0x60, 0x3F, 0x3F, 0xE2, 0x61, /* 0xE0-0xE3 */
+	0x94, 0x89, 0x3F, 0x3F, 0x90, 0x60, 0xE2, 0x5E, /* 0xE4-0xE7 */
 	0x3F, 0x3F, 0x92, 0x81, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */
-	0x00, 0x5F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */
-	0x8F, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */
+	0xE2, 0x5F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */
+	0x8F, 0xCC, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x88, 0x00, /* 0xF8-0xFB */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x88, 0xDA, /* 0xF8-0xFB */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */
 };
 
 static unsigned char u2c_7A[512] = {
 	0x8B, 0x48, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x04-0x07 */
-	0x00, 0x62, 0x3F, 0x3F, 0x3F, 0x3F, 0x92, 0x00, /* 0x08-0x0B */
-	0x3F, 0x3F, 0x00, 0x63, 0x90, 0x00, 0x3F, 0x3F, /* 0x0C-0x0F */
+	0xE2, 0x62, 0x3F, 0x3F, 0x3F, 0x3F, 0x92, 0xF6, /* 0x08-0x0B */
+	0x3F, 0x3F, 0xE2, 0x63, 0x90, 0xC5, 0x3F, 0x3F, /* 0x0C-0x0F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */
-	0x96, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x95, 0x42, /* 0x14-0x17 */
-	0x00, 0x64, 0x00, 0x65, 0x92, 0x74, 0x3F, 0x3F, /* 0x18-0x1B */
-	0x97, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x67, /* 0x1C-0x1F */
-	0x00, 0x66, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */
+	0x96, 0xAB, 0x3F, 0x3F, 0x3F, 0x3F, 0x95, 0x42, /* 0x14-0x17 */
+	0xE2, 0x64, 0xE2, 0x65, 0x92, 0x74, 0x3F, 0x3F, /* 0x18-0x1B */
+	0x97, 0xC5, 0x3F, 0x3F, 0x3F, 0x3F, 0xE2, 0x67, /* 0x1C-0x1F */
+	0xE2, 0x66, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x8E, 0x00, 0x3F, 0x3F, /* 0x2C-0x2F */
-	0x3F, 0x3F, 0x00, 0x69, 0x88, 0x00, 0x3F, 0x3F, /* 0x30-0x33 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x6C, /* 0x34-0x37 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x6A, /* 0x38-0x3B */
-	0x89, 0x00, 0x8C, 0x6D, 0x00, 0x6B, 0x8D, 0x65, /* 0x3C-0x3F */
-	0x8D, 0x92, 0x3F, 0x3F, 0x95, 0x00, 0x00, 0x6D, /* 0x40-0x43 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x8E, 0xED, 0x3F, 0x3F, /* 0x2C-0x2F */
+	0x3F, 0x3F, 0xE2, 0x69, 0x88, 0xEE, 0x3F, 0x3F, /* 0x30-0x33 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE2, 0x6C, /* 0x34-0x37 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE2, 0x6A, /* 0x38-0x3B */
+	0x89, 0xD2, 0x8C, 0x6D, 0xE2, 0x6B, 0x8D, 0x65, /* 0x3C-0x3F */
+	0x8D, 0x92, 0x3F, 0x3F, 0x95, 0xE4, 0xE2, 0x6D, /* 0x40-0x43 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x96, 0x73, 0x3F, 0x3F, /* 0x44-0x47 */
-	0x3F, 0x3F, 0x00, 0x6F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */
-	0x3F, 0x3F, 0x90, 0x00, 0x89, 0x6E, 0x89, 0x00, /* 0x4C-0x4F */
-	0x88, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x6E, /* 0x54-0x57 */
+	0x3F, 0x3F, 0xE2, 0x6F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */
+	0x3F, 0x3F, 0x90, 0xCF, 0x89, 0x6E, 0x89, 0xB8, /* 0x4C-0x4F */
+	0x88, 0xAA, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE2, 0x6E, /* 0x54-0x57 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x5C-0x5F */
-	0x3F, 0x3F, 0x00, 0x70, 0x00, 0x71, 0x8F, 0x00, /* 0x60-0x63 */
+	0x3F, 0x3F, 0xE2, 0x70, 0xE2, 0x71, 0x8F, 0xF5, /* 0x60-0x63 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */
-	0x3F, 0x3F, 0x00, 0x72, 0x3F, 0x3F, 0x8A, 0x6E, /* 0x68-0x6B */
+	0x3F, 0x3F, 0xE2, 0x72, 0x3F, 0x3F, 0x8A, 0x6E, /* 0x68-0x6B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */
-	0x00, 0x74, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */
+	0xE2, 0x74, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */
 	0x8C, 0x8A, 0x3F, 0x3F, 0x8B, 0x86, 0x3F, 0x3F, /* 0x74-0x77 */
-	0x3F, 0x3F, 0x00, 0x75, 0x8B, 0x00, 0x3F, 0x3F, /* 0x78-0x7B */
-	0x3F, 0x3F, 0x00, 0x76, 0x3F, 0x3F, 0x90, 0x00, /* 0x7C-0x7F */
+	0x3F, 0x3F, 0xE2, 0x75, 0x8B, 0xF3, 0x3F, 0x3F, /* 0x78-0x7B */
+	0x3F, 0x3F, 0xE2, 0x76, 0x3F, 0x3F, 0x90, 0xFA, /* 0x7C-0x7F */
 	
-	0x3F, 0x3F, 0x93, 0x00, 0x3F, 0x3F, 0x90, 0x00, /* 0x80-0x83 */
-	0x8D, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */
-	0x00, 0x77, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x88-0x8B */
+	0x3F, 0x3F, 0x93, 0xCB, 0x3F, 0x3F, 0x90, 0xDE, /* 0x80-0x83 */
+	0x8D, 0xF3, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */
+	0xE2, 0x77, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x88-0x8B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x92, 0x82, 0x91, 0x8B, /* 0x90-0x93 */
-	0x3F, 0x3F, 0x00, 0x79, 0x00, 0x7B, 0x00, 0x78, /* 0x94-0x97 */
-	0x00, 0x7A, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */
+	0x3F, 0x3F, 0xE2, 0x79, 0xE2, 0x7B, 0xE2, 0x78, /* 0x94-0x97 */
+	0xE2, 0x7A, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x8C, 0x41, /* 0x9C-0x9F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */
-	0x3F, 0x3F, 0x00, 0x7C, 0x8C, 0x45, 0x3F, 0x3F, /* 0xA8-0xAB */
+	0x3F, 0x3F, 0xE2, 0x7C, 0x8C, 0x45, 0x3F, 0x3F, /* 0xA8-0xAB */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x8B, 0x87, 0x97, 0x71, /* 0xAC-0xAF */
-	0x00, 0x7E, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB0-0xB3 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x80, 0x3F, 0x3F, /* 0xB4-0xB7 */
+	0xE2, 0x7E, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB0-0xB3 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE2, 0x80, 0x3F, 0x3F, /* 0xB4-0xB7 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x89, 0x4D, 0x3F, 0x3F, /* 0xB8-0xBB */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x83, /* 0xBC-0xBF */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE2, 0x83, /* 0xBC-0xBF */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x8A, 0x96, /* 0xC0-0xC3 */
-	0x00, 0x82, 0x00, 0x81, 0x3F, 0x3F, 0x00, 0x85, /* 0xC4-0xC7 */
-	0x00, 0x7D, 0x3F, 0x3F, 0x00, 0x86, 0x97, 0x00, /* 0xC8-0xCB */
-	0x3F, 0x3F, 0x00, 0x87, 0x3F, 0x3F, 0x00, 0x88, /* 0xCC-0xCF */
-	0x3F, 0x3F, 0x00, 0x84, 0x9A, 0x00, 0x00, 0x8A, /* 0xD0-0xD3 */
-	0x3F, 0x3F, 0x00, 0x89, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */
-	0x3F, 0x3F, 0x00, 0x8B, 0x00, 0x8C, 0x3F, 0x3F, /* 0xD8-0xDB */
-	0x97, 0x00, 0x00, 0x8D, 0x3F, 0x3F, 0x00, 0x00, /* 0xDC-0xDF */
-	0x8F, 0x00, 0x00, 0x8E, 0x00, 0x8F, 0x8F, 0x76, /* 0xE0-0xE3 */
-	0x3F, 0x3F, 0x93, 0x00, 0x00, 0x90, 0x00, 0x85, /* 0xE4-0xE7 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x92, 0x47, 0x00, 0x87, /* 0xE8-0xEB */
-	0x3F, 0x3F, 0x00, 0x91, 0x3F, 0x3F, 0x92, 0x5B, /* 0xEC-0xEF */
-	0x00, 0x92, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x8B, 0x00, 0x3F, 0x3F, /* 0xF4-0xF7 */
-	0x99, 0x5E, 0x92, 0x7C, 0x8E, 0x00, 0x3F, 0x3F, /* 0xF8-0xFB */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x8A, 0x00, /* 0xFC-0xFF */
+	0xE2, 0x82, 0xE2, 0x81, 0x3F, 0x3F, 0xE2, 0x85, /* 0xC4-0xC7 */
+	0xE2, 0x7D, 0x3F, 0x3F, 0xE2, 0x86, 0x97, 0xA7, /* 0xC8-0xCB */
+	0x3F, 0x3F, 0xE2, 0x87, 0x3F, 0x3F, 0xE2, 0x88, /* 0xCC-0xCF */
+	0x3F, 0x3F, 0xEE, 0x67, 0x9A, 0xF2, 0xE2, 0x8A, /* 0xD0-0xD3 */
+	0x3F, 0x3F, 0xE2, 0x89, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */
+	0x3F, 0x3F, 0xE2, 0x8B, 0xE2, 0x8C, 0x3F, 0x3F, /* 0xD8-0xDB */
+	0x97, 0xB3, 0xE2, 0x8D, 0x3F, 0x3F, 0xE8, 0xED, /* 0xDC-0xDF */
+	0x8F, 0xCD, 0xE2, 0x8E, 0xE2, 0x8F, 0x8F, 0x76, /* 0xE0-0xE3 */
+	0x3F, 0x3F, 0x93, 0xB6, 0xE2, 0x90, 0xEE, 0x68, /* 0xE4-0xE7 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x92, 0x47, 0xEE, 0x6A, /* 0xE8-0xEB */
+	0x3F, 0x3F, 0xE2, 0x91, 0x3F, 0x3F, 0x92, 0x5B, /* 0xEC-0xEF */
+	0xE2, 0x92, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x8B, 0xA3, 0x3F, 0x3F, /* 0xF4-0xF7 */
+	0x99, 0x5E, 0x92, 0x7C, 0x8E, 0xB1, 0x3F, 0x3F, /* 0xF8-0xFB */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x8A, 0xC6, /* 0xFC-0xFF */
 };
 
 static unsigned char u2c_7B[512] = {
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x93, 0x3F, 0x3F, /* 0x00-0x03 */
-	0x00, 0x00, 0x3F, 0x3F, 0x00, 0x96, 0x3F, 0x3F, /* 0x04-0x07 */
-	0x8B, 0x88, 0x3F, 0x3F, 0x00, 0x95, 0x00, 0x00, /* 0x08-0x0B */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x94, /* 0x0C-0x0F */
-	0x3F, 0x3F, 0x8F, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE2, 0x93, 0x3F, 0x3F, /* 0x00-0x03 */
+	0xE2, 0xA0, 0x3F, 0x3F, 0xE2, 0x96, 0x3F, 0x3F, /* 0x04-0x07 */
+	0x8B, 0x88, 0x3F, 0x3F, 0xE2, 0x95, 0xE2, 0xA2, /* 0x08-0x0B */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE2, 0x94, /* 0x0C-0x0F */
+	0x3F, 0x3F, 0x8F, 0xCE, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */
-	0x00, 0x98, 0x00, 0x99, 0x3F, 0x3F, 0x93, 0x4A, /* 0x18-0x1B */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x9A, 0x3F, 0x3F, /* 0x1C-0x1F */
+	0xE2, 0x98, 0xE2, 0x99, 0x3F, 0x3F, 0x93, 0x4A, /* 0x18-0x1B */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE2, 0x9A, 0x3F, 0x3F, /* 0x1C-0x1F */
 	0x8A, 0x7D, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */
 	0x3F, 0x3F, 0x90, 0x79, 0x95, 0x84, 0x3F, 0x3F, /* 0x24-0x27 */
-	0x00, 0x9C, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */
-	0x91, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x97, /* 0x30-0x33 */
-	0x3F, 0x3F, 0x00, 0x9B, 0x00, 0x9D, 0x3F, 0x3F, /* 0x34-0x37 */
-	0x3F, 0x3F, 0x8D, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x38-0x3B */
+	0xE2, 0x9C, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */
+	0x91, 0xE6, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE2, 0x97, /* 0x30-0x33 */
+	0x3F, 0x3F, 0xE2, 0x9B, 0xE2, 0x9D, 0x3F, 0x3F, /* 0x34-0x37 */
+	0x3F, 0x3F, 0x8D, 0xF9, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x38-0x3B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */
-	0x3F, 0x3F, 0x00, 0x00, 0x95, 0x4D, 0x3F, 0x3F, /* 0x44-0x47 */
-	0x94, 0x00, 0x93, 0x99, 0x3F, 0x3F, 0x8B, 0x00, /* 0x48-0x4B */
-	0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x94, 0x00, /* 0x4C-0x4F */
-	0x00, 0x9E, 0x92, 0x7D, 0x93, 0x9B, 0x3F, 0x3F, /* 0x50-0x53 */
-	0x93, 0x9A, 0x3F, 0x3F, 0x8D, 0x00, 0x3F, 0x3F, /* 0x54-0x57 */
+	0x3F, 0x3F, 0xE2, 0xA4, 0x95, 0x4D, 0x3F, 0x3F, /* 0x44-0x47 */
+	0x94, 0xA4, 0x93, 0x99, 0x3F, 0x3F, 0x8B, 0xD8, /* 0x48-0x4B */
+	0xE2, 0xA3, 0xE2, 0xA1, 0x3F, 0x3F, 0x94, 0xB3, /* 0x4C-0x4F */
+	0xE2, 0x9E, 0x92, 0x7D, 0x93, 0x9B, 0x3F, 0x3F, /* 0x50-0x53 */
+	0x93, 0x9A, 0x3F, 0x3F, 0x8D, 0xF4, 0x3F, 0x3F, /* 0x54-0x57 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */
-	0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x5C-0x5F */
+	0x3F, 0x3F, 0xE2, 0xB6, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x5C-0x5F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x60-0x63 */
-	0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x00, /* 0x64-0x67 */
+	0x3F, 0x3F, 0xE2, 0xA6, 0x3F, 0x3F, 0xE2, 0xA8, /* 0x64-0x67 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x68-0x6B */
-	0x00, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0x6C-0x6F */
-	0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */
-	0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x74-0x77 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x9F, 0x3F, 0x3F, /* 0x78-0x7B */
+	0xE2, 0xAB, 0x3F, 0x3F, 0xE2, 0xAC, 0x3F, 0x3F, /* 0x6C-0x6F */
+	0xE2, 0xA9, 0xE2, 0xAA, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */
+	0xE2, 0xA7, 0xE2, 0xA5, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x74-0x77 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE2, 0x9F, 0x3F, 0x3F, /* 0x78-0x7B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */
 	
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x95, 0x00, 0x89, 0x00, /* 0x84-0x87 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0x88-0x8B */
-	0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x00, /* 0x8C-0x8F */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0x90-0x93 */
-	0x94, 0x93, 0x96, 0x00, 0x3F, 0x3F, 0x8E, 0x5A, /* 0x94-0x97 */
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, /* 0x98-0x9B */
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x00, 0x00, /* 0x9C-0x9F */
-	0x3F, 0x3F, 0x8A, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x95, 0xCD, 0x89, 0xD3, /* 0x84-0x87 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE2, 0xB3, /* 0x88-0x8B */
+	0x3F, 0x3F, 0xE2, 0xB0, 0x3F, 0x3F, 0xE2, 0xB5, /* 0x8C-0x8F */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE2, 0xB4, 0x3F, 0x3F, /* 0x90-0x93 */
+	0x94, 0x93, 0x96, 0xA5, 0x3F, 0x3F, 0x8E, 0x5A, /* 0x94-0x97 */
+	0xE2, 0xAE, 0xE2, 0xB7, 0xE2, 0xB2, 0x3F, 0x3F, /* 0x98-0x9B */
+	0xE2, 0xB1, 0xE2, 0xAD, 0xEE, 0x6B, 0xE2, 0xAF, /* 0x9C-0x9F */
+	0x3F, 0x3F, 0x8A, 0xC7, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x92, 0x5C, 0x3F, 0x3F, /* 0xA8-0xAB */
-	0x3F, 0x3F, 0x90, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */
-	0x3F, 0x3F, 0x94, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB0-0xB3 */
-	0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */
-	0x94, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */
+	0x3F, 0x3F, 0x90, 0xFB, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */
+	0x3F, 0x3F, 0x94, 0xA0, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB0-0xB3 */
+	0xE2, 0xBC, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */
+	0x94, 0xA2, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */
-	0x90, 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */
-	0x94, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x95, 0x00, /* 0xC4-0xC7 */
-	0x3F, 0x3F, 0x92, 0x7A, 0x3F, 0x3F, 0x00, 0x00, /* 0xC8-0xCB */
-	0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0xCC-0xCF */
+	0x90, 0xDF, 0xE2, 0xB9, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */
+	0x94, 0xCD, 0x3F, 0x3F, 0xE2, 0xBD, 0x95, 0xD1, /* 0xC4-0xC7 */
+	0x3F, 0x3F, 0x92, 0x7A, 0x3F, 0x3F, 0xE2, 0xB8, /* 0xC8-0xCB */
+	0xE2, 0xBA, 0x3F, 0x3F, 0x3F, 0x3F, 0xE2, 0xBB, /* 0xCC-0xCF */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */
-	0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xDC-0xDF */
-	0x8E, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */
-	0x93, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, /* 0xE4-0xE7 */
-	0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */
+	0x3F, 0x3F, 0xE2, 0xBE, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xDC-0xDF */
+	0x8E, 0xC2, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */
+	0x93, 0xC4, 0xE2, 0xC3, 0xE2, 0xC2, 0x3F, 0x3F, /* 0xE4-0xE7 */
+	0x3F, 0x3F, 0xE2, 0xBF, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */
 	0x3F, 0x3F, 0x98, 0x55, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0xF0-0xF3 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, /* 0xF4-0xF7 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE2, 0xC8, /* 0xF0-0xF3 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE2, 0xCC, 0xE2, 0xC9, /* 0xF4-0xF7 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF8-0xFB */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */
 };
 
 static unsigned char u2c_7C[512] = {
-	0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0x04-0x07 */
+	0xE2, 0xC5, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE2, 0xC6, /* 0x04-0x07 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x08-0x0B */
-	0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */
-	0x3F, 0x3F, 0x00, 0x00, 0x99, 0x00, 0x00, 0x00, /* 0x10-0x13 */
-	0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0x14-0x17 */
+	0x3F, 0x3F, 0xE2, 0xCB, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */
+	0x3F, 0x3F, 0xE2, 0xC0, 0x99, 0xD3, 0xE2, 0xC7, /* 0x10-0x13 */
+	0xE2, 0xC1, 0x3F, 0x3F, 0x3F, 0x3F, 0xE2, 0xCA, /* 0x14-0x17 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x18-0x1B */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0x1C-0x1F */
-	0x3F, 0x3F, 0x8A, 0x00, 0x3F, 0x3F, 0x00, 0x00, /* 0x20-0x23 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0x24-0x27 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2B */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE2, 0xD0, /* 0x1C-0x1F */
+	0x3F, 0x3F, 0x8A, 0xC8, 0x3F, 0x3F, 0xE2, 0xCD, /* 0x20-0x23 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE2, 0xCE, /* 0x24-0x27 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE2, 0xCF, 0xE2, 0xD2, /* 0x28-0x2B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0x34-0x37 */
-	0x94, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x38-0x3B */
-	0x3F, 0x3F, 0x00, 0x00, 0x97, 0x00, 0x95, 0x00, /* 0x3C-0x3F */
-	0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0x40-0x43 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE2, 0xD1, /* 0x34-0x37 */
+	0x94, 0xF4, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x38-0x3B */
+	0x3F, 0x3F, 0xE2, 0xD3, 0x97, 0xFA, 0x95, 0xEB, /* 0x3C-0x3F */
+	0xE2, 0xD8, 0x3F, 0x3F, 0x3F, 0x3F, 0xE2, 0xD5, /* 0x40-0x43 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */
-	0x00, 0x00, 0x90, 0x00, 0x3F, 0x3F, 0x00, 0x00, /* 0x4C-0x4F */
-	0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */
-	0x00, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0x54-0x57 */
-	0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0x5C-0x5F */
-	0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x60-0x63 */
-	0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */
+	0xE2, 0xD4, 0x90, 0xD0, 0x3F, 0x3F, 0xE2, 0xD7, /* 0x4C-0x4F */
+	0xE2, 0xD9, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */
+	0xE2, 0xD6, 0x3F, 0x3F, 0xE2, 0xDD, 0x3F, 0x3F, /* 0x54-0x57 */
+	0xE2, 0xDA, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE2, 0xDB, /* 0x5C-0x5F */
+	0xE2, 0xC4, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x60-0x63 */
+	0xE2, 0xDC, 0xE2, 0xDE, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x68-0x6B */
-	0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x95, 0x00, /* 0x70-0x73 */
-	0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x74-0x77 */
+	0xE2, 0xDF, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x95, 0xC4, /* 0x70-0x73 */
+	0x3F, 0x3F, 0xE2, 0xE0, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x74-0x77 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x96, 0x00, 0x3F, 0x3F, /* 0x7C-0x7F */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x96, 0xE0, 0x3F, 0x3F, /* 0x7C-0x7F */
 	
-	0x3F, 0x3F, 0x8B, 0x00, 0x8C, 0x48, 0x00, 0x00, /* 0x80-0x83 */
+	0x3F, 0x3F, 0x8B, 0xCC, 0x8C, 0x48, 0xE2, 0xE1, /* 0x80-0x83 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */
-	0x3F, 0x3F, 0x95, 0x00, 0x3F, 0x3F, 0x90, 0x88, /* 0x88-0x8B */
-	0x3F, 0x3F, 0x96, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */
-	0x00, 0x00, 0x3F, 0x3F, 0x97, 0x00, 0x3F, 0x3F, /* 0x90-0x93 */
+	0x3F, 0x3F, 0x95, 0xB2, 0x3F, 0x3F, 0x90, 0x88, /* 0x88-0x8B */
+	0x3F, 0x3F, 0x96, 0xAE, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */
+	0xE2, 0xE2, 0x3F, 0x3F, 0x97, 0xB1, 0x3F, 0x3F, /* 0x90-0x93 */
 	0x3F, 0x3F, 0x94, 0x94, 0x3F, 0x3F, 0x91, 0x65, /* 0x94-0x97 */
 	0x94, 0x53, 0x3F, 0x3F, 0x3F, 0x3F, 0x8F, 0x6C, /* 0x98-0x9B */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x88, 0x00, /* 0x9C-0x9F */
-	0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, /* 0xA0-0xA3 */
-	0x00, 0x00, 0x8A, 0x9F, 0x3F, 0x3F, 0x8F, 0x00, /* 0xA4-0xA7 */
-	0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0xA8-0xAB */
-	0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, /* 0xAC-0xAF */
-	0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xB0-0xB3 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */
-	0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */
-	0x3F, 0x3F, 0x00, 0x00, 0x90, 0x00, 0x3F, 0x3F, /* 0xBC-0xBF */
-	0x00, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0xC0-0xC3 */
-	0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC4-0xC7 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x8C, 0x00, 0x3F, 0x3F, /* 0xC8-0xCB */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x88, 0xBE, /* 0x9C-0x9F */
+	0x3F, 0x3F, 0xE2, 0xE7, 0xE2, 0xE5, 0x3F, 0x3F, /* 0xA0-0xA3 */
+	0xE2, 0xE3, 0x8A, 0x9F, 0x3F, 0x3F, 0x8F, 0xCF, /* 0xA4-0xA7 */
+	0xE2, 0xE8, 0x3F, 0x3F, 0x3F, 0x3F, 0xE2, 0xE6, /* 0xA8-0xAB */
+	0x3F, 0x3F, 0xE2, 0xE4, 0xE2, 0xEC, 0x3F, 0x3F, /* 0xAC-0xAF */
+	0x3F, 0x3F, 0xE2, 0xEB, 0xE2, 0xEA, 0xE2, 0xE9, /* 0xB0-0xB3 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */
+	0x3F, 0x3F, 0xE2, 0xED, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */
+	0x3F, 0x3F, 0xE2, 0xEE, 0x90, 0xB8, 0x3F, 0x3F, /* 0xBC-0xBF */
+	0xE2, 0xEF, 0x3F, 0x3F, 0xE2, 0xF1, 0x3F, 0x3F, /* 0xC0-0xC3 */
+	0x3F, 0x3F, 0xE2, 0xF0, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC4-0xC7 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x8C, 0xD0, 0x3F, 0x3F, /* 0xC8-0xCB */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x91, 0x57, 0x3F, 0x3F, /* 0xCC-0xCF */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0xD0-0xD3 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE2, 0xF3, 0x3F, 0x3F, /* 0xD0-0xD3 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x93, 0x9C, 0x3F, 0x3F, /* 0xD4-0xD7 */
-	0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */
-	0x00, 0x00, 0x3F, 0x3F, 0x95, 0x00, 0x91, 0x8C, /* 0xDC-0xDF */
-	0x8D, 0x66, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0xE0-0xE3 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x97, 0x00, /* 0xE4-0xE7 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0xEC-0xEF */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0xF0-0xF3 */
-	0x00, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0xF4-0xF7 */
-	0x8E, 0x85, 0x3F, 0x3F, 0x00, 0x00, 0x8C, 0x6E, /* 0xF8-0xFB */
+	0xE2, 0xF2, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */
+	0xE2, 0xF4, 0x3F, 0x3F, 0x95, 0xB3, 0x91, 0x8C, /* 0xDC-0xDF */
+	0x8D, 0x66, 0x3F, 0x3F, 0xE2, 0xF5, 0x3F, 0x3F, /* 0xE0-0xE3 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x97, 0xC6, /* 0xE4-0xE7 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE2, 0xF7, /* 0xEC-0xEF */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE2, 0xF8, 0x3F, 0x3F, /* 0xF0-0xF3 */
+	0xE2, 0xF9, 0x3F, 0x3F, 0xE2, 0xFA, 0x3F, 0x3F, /* 0xF4-0xF7 */
+	0x8E, 0x85, 0x3F, 0x3F, 0xE2, 0xFB, 0x8C, 0x6E, /* 0xF8-0xFB */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x8B, 0x8A, 0x3F, 0x3F, /* 0xFC-0xFF */
 };
 
 static unsigned char u2c_7D[512] = {
-	0x8B, 0x49, 0x3F, 0x3F, 0x00, 0x40, 0x3F, 0x3F, /* 0x00-0x03 */
-	0x96, 0x00, 0x8D, 0x67, 0x00, 0x00, 0x3F, 0x3F, /* 0x04-0x07 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x43, 0x96, 0x00, /* 0x08-0x0B */
+	0x8B, 0x49, 0x3F, 0x3F, 0xE3, 0x40, 0x3F, 0x3F, /* 0x00-0x03 */
+	0x96, 0xF1, 0x8D, 0x67, 0xE2, 0xFC, 0x3F, 0x3F, /* 0x04-0x07 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE3, 0x43, 0x96, 0xE4, /* 0x08-0x0B */
 	0x3F, 0x3F, 0x94, 0x5B, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */
 	0x95, 0x52, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */
-	0x8F, 0x83, 0x00, 0x42, 0x3F, 0x3F, 0x8E, 0x00, /* 0x14-0x17 */
-	0x8D, 0x68, 0x8E, 0x86, 0x8B, 0x89, 0x95, 0x00, /* 0x18-0x1B */
-	0x00, 0x41, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */
-	0x91, 0x66, 0x96, 0x61, 0x8D, 0x00, 0x3F, 0x3F, /* 0x20-0x23 */
+	0x8F, 0x83, 0xE3, 0x42, 0x3F, 0x3F, 0x8E, 0xD1, /* 0x14-0x17 */
+	0x8D, 0x68, 0x8E, 0x86, 0x8B, 0x89, 0x95, 0xB4, /* 0x18-0x1B */
+	0xE3, 0x41, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */
+	0x91, 0x66, 0x96, 0x61, 0x8D, 0xF5, 0x3F, 0x3F, /* 0x20-0x23 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x8E, 0x87, /* 0x28-0x2B */
-	0x92, 0x00, 0x3F, 0x3F, 0x00, 0x46, 0x97, 0x00, /* 0x2C-0x2F */
-	0x8D, 0x00, 0x3F, 0x3F, 0x00, 0x47, 0x90, 0x61, /* 0x30-0x33 */
-	0x3F, 0x3F, 0x00, 0x49, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */
-	0x3F, 0x3F, 0x8F, 0x00, 0x8D, 0x00, 0x3F, 0x3F, /* 0x38-0x3B */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x48, /* 0x3C-0x3F */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x8F, 0x49, 0x8C, 0x00, /* 0x40-0x43 */
-	0x91, 0x67, 0x00, 0x44, 0x00, 0x4A, 0x3F, 0x3F, /* 0x44-0x47 */
-	0x00, 0x8A, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x45, /* 0x48-0x4B */
-	0x8C, 0x6F, 0x3F, 0x3F, 0x00, 0x4D, 0x00, 0x51, /* 0x4C-0x4F */
+	0x92, 0xDB, 0x3F, 0x3F, 0xE3, 0x46, 0x97, 0xDD, /* 0x2C-0x2F */
+	0x8D, 0xD7, 0x3F, 0x3F, 0xE3, 0x47, 0x90, 0x61, /* 0x30-0x33 */
+	0x3F, 0x3F, 0xE3, 0x49, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */
+	0x3F, 0x3F, 0x8F, 0xD0, 0x8D, 0xAE, 0x3F, 0x3F, /* 0x38-0x3B */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE3, 0x48, /* 0x3C-0x3F */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x8F, 0x49, 0x8C, 0xBC, /* 0x40-0x43 */
+	0x91, 0x67, 0xE3, 0x44, 0xE3, 0x4A, 0x3F, 0x3F, /* 0x44-0x47 */
+	0xEE, 0x6D, 0x3F, 0x3F, 0x3F, 0x3F, 0xE3, 0x45, /* 0x48-0x4B */
+	0x8C, 0x6F, 0x3F, 0x3F, 0xE3, 0x4D, 0xE3, 0x51, /* 0x4C-0x4F */
 	0x8C, 0x8B, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x4C, 0x3F, 0x3F, /* 0x54-0x57 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x55, /* 0x58-0x5B */
-	0x00, 0x8B, 0x3F, 0x3F, 0x8D, 0x69, 0x3F, 0x3F, /* 0x5C-0x5F */
-	0x3F, 0x3F, 0x97, 0x8D, 0x88, 0x00, 0x00, 0x52, /* 0x60-0x63 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE3, 0x4C, 0x3F, 0x3F, /* 0x54-0x57 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE3, 0x55, /* 0x58-0x5B */
+	0xEE, 0x6E, 0x3F, 0x3F, 0x8D, 0x69, 0x3F, 0x3F, /* 0x5C-0x5F */
+	0x3F, 0x3F, 0x97, 0x8D, 0x88, 0xBA, 0xE3, 0x52, /* 0x60-0x63 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x8B, 0x8B, 0x3F, 0x3F, /* 0x64-0x67 */
-	0x00, 0x4F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x68-0x6B */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x50, 0x3F, 0x3F, /* 0x6C-0x6F */
-	0x3F, 0x3F, 0x93, 0x9D, 0x00, 0x4E, 0x00, 0x4B, /* 0x70-0x73 */
-	0x3F, 0x3F, 0x8A, 0x47, 0x90, 0x00, 0x3F, 0x3F, /* 0x74-0x77 */
-	0x3F, 0x3F, 0x8C, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */
-	0x3F, 0x3F, 0x00, 0x57, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */
+	0xE3, 0x4F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x68-0x6B */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE3, 0x50, 0x3F, 0x3F, /* 0x6C-0x6F */
+	0x3F, 0x3F, 0x93, 0x9D, 0xE3, 0x4E, 0xE3, 0x4B, /* 0x70-0x73 */
+	0x3F, 0x3F, 0x8A, 0x47, 0x90, 0xE2, 0x3F, 0x3F, /* 0x74-0x77 */
+	0x3F, 0x3F, 0x8C, 0xA6, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */
+	0x3F, 0x3F, 0xE3, 0x57, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */
 	
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */
-	0x3F, 0x3F, 0x00, 0x54, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x88-0x8B */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x56, /* 0x8C-0x8F */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x53, /* 0x90-0x93 */
+	0x3F, 0x3F, 0xE3, 0x54, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x88-0x8B */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE3, 0x56, /* 0x8C-0x8F */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE3, 0x53, /* 0x90-0x93 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */
-	0x3F, 0x3F, 0x8C, 0x70, 0x91, 0x00, 0x00, 0x58, /* 0x98-0x9B */
-	0x91, 0x8E, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x65, /* 0x9C-0x9F */
-	0x00, 0x8D, 0x3F, 0x3F, 0x00, 0x61, 0x00, 0x5B, /* 0xA0-0xA3 */
+	0x3F, 0x3F, 0x8C, 0x70, 0x91, 0xB1, 0xE3, 0x58, /* 0x98-0x9B */
+	0x91, 0x8E, 0x3F, 0x3F, 0x3F, 0x3F, 0xE3, 0x65, /* 0x9C-0x9F */
+	0xEE, 0x70, 0x3F, 0x3F, 0xE3, 0x61, 0xE3, 0x5B, /* 0xA0-0xA3 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x5F, /* 0xA8-0xAB */
-	0x8E, 0x00, 0x88, 0x00, 0x00, 0x5A, 0x00, 0x62, /* 0xAC-0xAF */
-	0x00, 0x66, 0x8D, 0x6A, 0x96, 0x00, 0x3F, 0x3F, /* 0xB0-0xB3 */
-	0x92, 0x00, 0x00, 0x5C, 0x3F, 0x3F, 0x00, 0x8C, /* 0xB4-0xB7 */
-	0x00, 0x64, 0x3F, 0x3F, 0x00, 0x59, 0x92, 0x5D, /* 0xB8-0xBB */
-	0x3F, 0x3F, 0x00, 0x5E, 0x88, 0x00, 0x96, 0x00, /* 0xBC-0xBF */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE3, 0x5F, /* 0xA8-0xAB */
+	0x8E, 0xF8, 0x88, 0xDB, 0xE3, 0x5A, 0xE3, 0x62, /* 0xAC-0xAF */
+	0xE3, 0x66, 0x8D, 0x6A, 0x96, 0xD4, 0x3F, 0x3F, /* 0xB0-0xB3 */
+	0x92, 0xD4, 0xE3, 0x5C, 0x3F, 0x3F, 0xEE, 0x6F, /* 0xB4-0xB7 */
+	0xE3, 0x64, 0x3F, 0x3F, 0xE3, 0x59, 0x92, 0x5D, /* 0xB8-0xBB */
+	0x3F, 0x3F, 0xE3, 0x5E, 0x88, 0xBB, 0x96, 0xC8, /* 0xBC-0xBF */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x5D, /* 0xC4-0xC7 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x8B, 0x00, 0x94, 0x00, /* 0xC8-0xCB */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE3, 0x5D, /* 0xC4-0xC7 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x8B, 0xD9, 0x94, 0xEA, /* 0xC8-0xCB */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x91, 0x8D, /* 0xCC-0xCF */
-	0x3F, 0x3F, 0x97, 0x00, 0x8F, 0x8F, 0x3F, 0x3F, /* 0xD0-0xD3 */
-	0x3F, 0x3F, 0x00, 0x8E, 0x00, 0x8E, 0x3F, 0x3F, /* 0xD4-0xD7 */
-	0x00, 0x67, 0x3F, 0x3F, 0x90, 0x00, 0x3F, 0x3F, /* 0xD8-0xDB */
-	0x00, 0x63, 0x00, 0x68, 0x00, 0x6A, 0x3F, 0x3F, /* 0xDC-0xDF */
-	0x92, 0x00, 0x00, 0x6D, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */
-	0x00, 0x69, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */
-	0x95, 0x00, 0x8A, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */
-	0x96, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x88, 0x00, /* 0xEC-0xEF */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x6C, 0x3F, 0x3F, /* 0xF0-0xF3 */
-	0x97, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x6B, /* 0xF8-0xFB */
+	0x3F, 0x3F, 0x97, 0xCE, 0x8F, 0x8F, 0x3F, 0x3F, /* 0xD0-0xD3 */
+	0x3F, 0x3F, 0xE3, 0x8E, 0xEE, 0x71, 0x3F, 0x3F, /* 0xD4-0xD7 */
+	0xE3, 0x67, 0x3F, 0x3F, 0x90, 0xFC, 0x3F, 0x3F, /* 0xD8-0xDB */
+	0xE3, 0x63, 0xE3, 0x68, 0xE3, 0x6A, 0x3F, 0x3F, /* 0xDC-0xDF */
+	0x92, 0xF7, 0xE3, 0x6D, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */
+	0xE3, 0x69, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */
+	0x95, 0xD2, 0x8A, 0xC9, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */
+	0x96, 0xC9, 0x3F, 0x3F, 0x3F, 0x3F, 0x88, 0xDC, /* 0xEC-0xEF */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE3, 0x6C, 0x3F, 0x3F, /* 0xF0-0xF3 */
+	0x97, 0xFB, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE3, 0x6B, /* 0xF8-0xFB */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */
 };
 
 static unsigned char u2c_7E[512] = {
 	0x3F, 0x3F, 0x89, 0x8F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */
-	0x93, 0x00, 0x00, 0x6E, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x04-0x07 */
-	0x3F, 0x3F, 0x00, 0x75, 0x00, 0x6F, 0x00, 0x76, /* 0x08-0x0B */
+	0x93, 0xEA, 0xE3, 0x6E, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x04-0x07 */
+	0x3F, 0x3F, 0xE3, 0x75, 0xE3, 0x6F, 0xE3, 0x76, /* 0x08-0x0B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x72, 0x3F, 0x3F, /* 0x10-0x13 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE3, 0x72, 0x3F, 0x3F, /* 0x10-0x13 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x94, 0x9B, /* 0x18-0x1B */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x8E, 0x00, 0x00, 0x74, /* 0x1C-0x1F */
-	0x3F, 0x3F, 0x00, 0x71, 0x00, 0x77, 0x00, 0x70, /* 0x20-0x23 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x8E, 0xC8, 0xE3, 0x74, /* 0x1C-0x1F */
+	0x3F, 0x3F, 0xE3, 0x71, 0xE3, 0x77, 0xE3, 0x70, /* 0x20-0x23 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x8F, 0x63, 0x3F, 0x3F, /* 0x24-0x27 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x96, 0x44, /* 0x28-0x2B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x8F, 0x6B, 0x3F, 0x3F, /* 0x2C-0x2F */
-	0x3F, 0x3F, 0x00, 0x73, 0x00, 0x80, 0x3F, 0x3F, /* 0x30-0x33 */
-	0x3F, 0x3F, 0x00, 0x7B, 0x3F, 0x3F, 0x00, 0x7E, /* 0x34-0x37 */
-	0x3F, 0x3F, 0x00, 0x7C, 0x00, 0x81, 0x00, 0x7A, /* 0x38-0x3B */
-	0x3F, 0x3F, 0x00, 0x60, 0x90, 0x00, 0x3F, 0x3F, /* 0x3C-0x3F */
-	0x3F, 0x3F, 0x94, 0x00, 0x3F, 0x3F, 0x00, 0x7D, /* 0x40-0x43 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x78, 0x3F, 0x3F, /* 0x44-0x47 */
+	0x3F, 0x3F, 0xE3, 0x73, 0xE3, 0x80, 0x3F, 0x3F, /* 0x30-0x33 */
+	0x3F, 0x3F, 0xE3, 0x7B, 0x3F, 0x3F, 0xE3, 0x7E, /* 0x34-0x37 */
+	0x3F, 0x3F, 0xE3, 0x7C, 0xE3, 0x81, 0xE3, 0x7A, /* 0x38-0x3B */
+	0x3F, 0x3F, 0xE3, 0x60, 0x90, 0xD1, 0x3F, 0x3F, /* 0x3C-0x3F */
+	0x3F, 0x3F, 0x94, 0xC9, 0x3F, 0x3F, 0xE3, 0x7D, /* 0x40-0x43 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE3, 0x78, 0x3F, 0x3F, /* 0x44-0x47 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x91, 0x40, 0x8C, 0x71, /* 0x48-0x4B */
 	0x3F, 0x3F, 0x8F, 0x4A, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x4C-0x4F */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x8F, 0x3F, 0x3F, /* 0x50-0x53 */
-	0x90, 0x44, 0x91, 0x55, 0x00, 0x84, 0x3F, 0x3F, /* 0x54-0x57 */
-	0x3F, 0x3F, 0x00, 0x86, 0x00, 0x87, 0x3F, 0x3F, /* 0x58-0x5B */
-	0x3F, 0x3F, 0x00, 0x83, 0x00, 0x85, 0x3F, 0x3F, /* 0x5C-0x5F */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xEE, 0x72, 0x3F, 0x3F, /* 0x50-0x53 */
+	0x90, 0x44, 0x91, 0x55, 0xE3, 0x84, 0x3F, 0x3F, /* 0x54-0x57 */
+	0x3F, 0x3F, 0xE3, 0x86, 0xE3, 0x87, 0x3F, 0x3F, /* 0x58-0x5B */
+	0x3F, 0x3F, 0xE3, 0x83, 0xE3, 0x85, 0x3F, 0x3F, /* 0x5C-0x5F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x60-0x63 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x79, 0x00, 0x82, /* 0x64-0x67 */
-	0x3F, 0x3F, 0x00, 0x8A, 0x00, 0x89, 0x3F, 0x3F, /* 0x68-0x6B */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE3, 0x79, 0xE3, 0x82, /* 0x64-0x67 */
+	0x3F, 0x3F, 0xE3, 0x8A, 0xE3, 0x89, 0x3F, 0x3F, /* 0x68-0x6B */
 	0x3F, 0x3F, 0x96, 0x9A, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */
 	0x8C, 0x4A, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x74-0x77 */
-	0x3F, 0x3F, 0x00, 0x88, 0x3F, 0x3F, 0x00, 0x8C, /* 0x78-0x7B */
-	0x00, 0x8B, 0x00, 0x8F, 0x3F, 0x3F, 0x00, 0x91, /* 0x7C-0x7F */
+	0x3F, 0x3F, 0xE3, 0x88, 0x3F, 0x3F, 0xE3, 0x8C, /* 0x78-0x7B */
+	0xE3, 0x8B, 0xE3, 0x8F, 0x3F, 0x3F, 0xE3, 0x91, /* 0x7C-0x7F */
 	
-	0x3F, 0x3F, 0x3F, 0x3F, 0x8E, 0x5B, 0x00, 0x8D, /* 0x80-0x83 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x8E, 0x5B, 0xE3, 0x8D, /* 0x80-0x83 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */
-	0x00, 0x92, 0x00, 0x93, 0x00, 0x5C, 0x3F, 0x3F, /* 0x88-0x8B */
-	0x00, 0x94, 0x3F, 0x3F, 0x00, 0x9A, 0x93, 0x5A, /* 0x8C-0x8F */
-	0x00, 0x96, 0x3F, 0x3F, 0x00, 0x95, 0x00, 0x97, /* 0x90-0x93 */
-	0x00, 0x98, 0x3F, 0x3F, 0x00, 0x99, 0x3F, 0x3F, /* 0x94-0x97 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x9B, /* 0x98-0x9B */
-	0x00, 0x9C, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */
+	0xE3, 0x92, 0xE3, 0x93, 0xED, 0x40, 0x3F, 0x3F, /* 0x88-0x8B */
+	0xE3, 0x94, 0x3F, 0x3F, 0xE3, 0x9A, 0x93, 0x5A, /* 0x8C-0x8F */
+	0xE3, 0x96, 0x3F, 0x3F, 0xE3, 0x95, 0xE3, 0x97, /* 0x90-0x93 */
+	0xE3, 0x98, 0x3F, 0x3F, 0xE3, 0x99, 0x3F, 0x3F, /* 0x94-0x97 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE3, 0x9B, /* 0x98-0x9B */
+	0xE3, 0x9C, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */
@@ -7268,849 +7270,849 @@
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x8A, 0x00, 0x3F, 0x3F, /* 0x34-0x37 */
-	0x00, 0x9D, 0x3F, 0x3F, 0x00, 0x9E, 0x3F, 0x3F, /* 0x38-0x3B */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x8A, 0xCA, 0x3F, 0x3F, /* 0x34-0x37 */
+	0xE3, 0x9D, 0x3F, 0x3F, 0xE3, 0x9E, 0x3F, 0x3F, /* 0x38-0x3B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */
-	0x3F, 0x3F, 0x00, 0x9F, 0x3F, 0x3F, 0x00, 0x90, /* 0x44-0x47 */
+	0x3F, 0x3F, 0xE3, 0x9F, 0x3F, 0x3F, 0xEE, 0x73, /* 0x44-0x47 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, /* 0x4C-0x4F */
-	0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */
-	0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */
-	0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0x5C-0x5F */
-	0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x60-0x63 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0x64-0x67 */
-	0x00, 0x00, 0x00, 0x00, 0x8D, 0x00, 0x8C, 0x72, /* 0x68-0x6B */
+	0xE3, 0xA0, 0xE3, 0xA1, 0xE3, 0xA2, 0x3F, 0x3F, /* 0x4C-0x4F */
+	0xE3, 0xA3, 0xE3, 0xA4, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */
+	0xE3, 0xA6, 0xE3, 0xA5, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */
+	0xE3, 0xA7, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE3, 0xA8, /* 0x5C-0x5F */
+	0xE3, 0xA9, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x60-0x63 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE3, 0xAC, /* 0x64-0x67 */
+	0xE3, 0xAA, 0xE3, 0xAB, 0x8D, 0xDF, 0x8C, 0x72, /* 0x68-0x6B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x92, 0x75, 0x3F, 0x3F, /* 0x6C-0x6F */
-	0x94, 0x00, 0x3F, 0x3F, 0x8F, 0x90, 0x3F, 0x3F, /* 0x70-0x73 */
-	0x3F, 0x3F, 0x94, 0x6C, 0x3F, 0x3F, 0x94, 0x00, /* 0x74-0x77 */
-	0x00, 0x00, 0x9C, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */
+	0x94, 0xB1, 0x3F, 0x3F, 0x8F, 0x90, 0x3F, 0x3F, /* 0x70-0x73 */
+	0x3F, 0x3F, 0x94, 0x6C, 0x3F, 0x3F, 0x94, 0xEB, /* 0x74-0x77 */
+	0xE3, 0xAD, 0x9C, 0xEB, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */
 	
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, /* 0x80-0x83 */
-	0x3F, 0x3F, 0x97, 0x85, 0x00, 0x00, 0x00, 0x00, /* 0x84-0x87 */
-	0x00, 0x00, 0x3F, 0x3F, 0x97, 0x72, 0x3F, 0x3F, /* 0x88-0x8B */
-	0x00, 0x00, 0x3F, 0x3F, 0x94, 0x00, 0x3F, 0x3F, /* 0x8C-0x8F */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE3, 0xAE, 0xE3, 0xB0, /* 0x80-0x83 */
+	0x3F, 0x3F, 0x97, 0x85, 0xE3, 0xAF, 0xE3, 0xB2, /* 0x84-0x87 */
+	0xE3, 0xB1, 0x3F, 0x3F, 0x97, 0x72, 0x3F, 0x3F, /* 0x88-0x8B */
+	0xE3, 0xB3, 0x3F, 0x3F, 0x94, 0xFC, 0x3F, 0x3F, /* 0x8C-0x8F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */
-	0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0x98-0x9B */
-	0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, /* 0x9C-0x9F */
-	0x3F, 0x3F, 0x00, 0x91, 0x3F, 0x3F, 0x00, 0x00, /* 0xA0-0xA3 */
+	0xE3, 0xB4, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE3, 0xB7, 0x3F, 0x3F, /* 0x98-0x9B */
+	0x3F, 0x3F, 0xE3, 0xB6, 0xE3, 0xB5, 0x3F, 0x3F, /* 0x9C-0x9F */
+	0x3F, 0x3F, 0xEE, 0x74, 0x3F, 0x3F, 0xE3, 0xB8, /* 0xA0-0xA3 */
 	0x8C, 0x51, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */
 	0x91, 0x41, 0x8B, 0x60, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, /* 0xAC-0xAF */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0xB0-0xB3 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0xB4-0xB7 */
-	0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE3, 0xBC, 0xE3, 0xB9, /* 0xAC-0xAF */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE3, 0xBA, 0x3F, 0x3F, /* 0xB0-0xB3 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE3, 0xBD, 0x3F, 0x3F, /* 0xB4-0xB7 */
+	0xE3, 0xBE, 0xE3, 0xBB, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */
 	0x3F, 0x3F, 0x89, 0x48, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */
-	0x3F, 0x3F, 0x89, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */
-	0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, /* 0xC4-0xC7 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0xC8-0xCB */
+	0x3F, 0x3F, 0x89, 0xA5, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */
+	0x3F, 0x3F, 0xE3, 0xC0, 0xE3, 0xC1, 0x3F, 0x3F, /* 0xC4-0xC7 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE3, 0xC2, 0x3F, 0x3F, /* 0xC8-0xCB */
 	0x97, 0x82, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x8F, 0x4B, 0x3F, 0x3F, /* 0xD0-0xD3 */
-	0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */
+	0xE3, 0xC4, 0xE3, 0xC3, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xDC-0xDF */
-	0x90, 0x89, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0xE4-0xE7 */
-	0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, 0x8A, 0x00, /* 0xE8-0xEB */
+	0x90, 0x89, 0xE3, 0xC5, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE3, 0xC6, 0x3F, 0x3F, /* 0xE4-0xE7 */
+	0x3F, 0x3F, 0xE3, 0xC7, 0x3F, 0x3F, 0x8A, 0xE3, /* 0xE8-0xEB */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */
-	0x8A, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0xF0-0xF3 */
+	0x8A, 0xCB, 0x3F, 0x3F, 0x3F, 0x3F, 0xE3, 0xC8, /* 0xF0-0xF3 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */
-	0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, 0x96, 0x7C, /* 0xF8-0xFB */
+	0x3F, 0x3F, 0xE3, 0xC9, 0x3F, 0x3F, 0x96, 0x7C, /* 0xF8-0xFB */
 	0x97, 0x83, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */
 };
 
 static unsigned char u2c_80[512] = {
 	0x97, 0x73, 0x98, 0x56, 0x3F, 0x3F, 0x8D, 0x6C, /* 0x00-0x03 */
-	0x00, 0x00, 0x8E, 0x00, 0x00, 0x00, 0x3F, 0x3F, /* 0x04-0x07 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0x08-0x0B */
-	0x8E, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */
-	0x91, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0x10-0x13 */
-	0x3F, 0x3F, 0x8D, 0x6B, 0x3F, 0x3F, 0x96, 0x00, /* 0x14-0x17 */
-	0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x18-0x1B */
-	0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */
-	0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */
+	0xE3, 0xCC, 0x8E, 0xD2, 0xE3, 0xCB, 0x3F, 0x3F, /* 0x04-0x07 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE3, 0xCD, /* 0x08-0x0B */
+	0x8E, 0xA7, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */
+	0x91, 0xCF, 0x3F, 0x3F, 0xE3, 0xCE, 0x3F, 0x3F, /* 0x10-0x13 */
+	0x3F, 0x3F, 0x8D, 0x6B, 0x3F, 0x3F, 0x96, 0xD5, /* 0x14-0x17 */
+	0xE3, 0xCF, 0xE3, 0xD0, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x18-0x1B */
+	0xE3, 0xD1, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */
+	0x3F, 0x3F, 0xE3, 0xD2, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */
-	0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */
+	0xE3, 0xD3, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x8E, 0x00, /* 0x30-0x33 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x96, 0x00, 0x3F, 0x3F, /* 0x34-0x37 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0x38-0x3B */
-	0x3F, 0x3F, 0x92, 0x5E, 0x3F, 0x3F, 0x00, 0x00, /* 0x3C-0x3F */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x8E, 0xA8, /* 0x30-0x33 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x96, 0xEB, 0x3F, 0x3F, /* 0x34-0x37 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE3, 0xD5, /* 0x38-0x3B */
+	0x3F, 0x3F, 0x92, 0x5E, 0x3F, 0x3F, 0xE3, 0xD4, /* 0x3C-0x3F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0x44-0x47 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0x48-0x4B */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE3, 0xD7, 0x3F, 0x3F, /* 0x44-0x47 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE3, 0xD6, 0x3F, 0x3F, /* 0x48-0x4B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x4C-0x4F */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0x50-0x53 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x90, 0x00, 0x3F, 0x3F, /* 0x54-0x57 */
-	0x00, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0x58-0x5B */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x95, 0x00, 0x00, 0x00, /* 0x5C-0x5F */
-	0x3F, 0x3F, 0x91, 0x8F, 0x00, 0x00, 0x3F, 0x3F, /* 0x60-0x63 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE3, 0xD8, 0x3F, 0x3F, /* 0x50-0x53 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x90, 0xB9, 0x3F, 0x3F, /* 0x54-0x57 */
+	0xE3, 0xD9, 0x3F, 0x3F, 0xE3, 0xDA, 0x3F, 0x3F, /* 0x58-0x5B */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x95, 0xB7, 0xE3, 0xDB, /* 0x5C-0x5F */
+	0x3F, 0x3F, 0x91, 0x8F, 0xE3, 0xDC, 0x3F, 0x3F, /* 0x60-0x63 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */
-	0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x68-0x6B */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x97, 0x00, /* 0x6C-0x6F */
-	0x00, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x73 */
-	0x92, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x90, 0x45, /* 0x74-0x77 */
-	0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */
-	0x3F, 0x3F, 0x00, 0x00, 0x98, 0x57, 0x00, 0x00, /* 0x7C-0x7F */
+	0xE3, 0xDD, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x68-0x6B */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x97, 0xFC, /* 0x6C-0x6F */
+	0xE3, 0xE0, 0x3F, 0x3F, 0xE3, 0xDF, 0xE3, 0xDE, /* 0x70-0x73 */
+	0x92, 0xAE, 0x3F, 0x3F, 0xE3, 0xE1, 0x90, 0x45, /* 0x74-0x77 */
+	0x3F, 0x3F, 0xE3, 0xE2, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */
+	0x3F, 0x3F, 0xE3, 0xE3, 0x98, 0x57, 0xE3, 0xE4, /* 0x7C-0x7F */
 	
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x94, 0x00, /* 0x84-0x87 */
-	0x3F, 0x3F, 0x93, 0x00, 0x3F, 0x3F, 0x98, 0x5D, /* 0x88-0x8B */
-	0x94, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0x90-0x93 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x8F, 0x00, 0x3F, 0x3F, /* 0x94-0x97 */
-	0x95, 0x49, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, /* 0x98-0x9B */
-	0x3F, 0x3F, 0x8A, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */
-	0x3F, 0x3F, 0x8C, 0x00, 0x8E, 0x88, 0x3F, 0x3F, /* 0xA0-0xA3 */
-	0x3F, 0x3F, 0x94, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */
-	0x3F, 0x3F, 0x8C, 0x00, 0x96, 0x62, 0x3F, 0x3F, /* 0xA8-0xAB */
-	0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x8D, 0x6D, /* 0xAC-0xAF */
-	0x3F, 0x3F, 0x8D, 0x6E, 0x88, 0x00, 0x3F, 0x3F, /* 0xB0-0xB3 */
-	0x8D, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */
+	0xE3, 0xE5, 0xE3, 0xE7, 0xE3, 0xE6, 0x94, 0xA3, /* 0x84-0x87 */
+	0x3F, 0x3F, 0x93, 0xF7, 0x3F, 0x3F, 0x98, 0x5D, /* 0x88-0x8B */
+	0x94, 0xA7, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE3, 0xE9, /* 0x90-0x93 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x8F, 0xD1, 0x3F, 0x3F, /* 0x94-0x97 */
+	0x95, 0x49, 0x3F, 0x3F, 0xE3, 0xEA, 0xE3, 0xE8, /* 0x98-0x9B */
+	0x3F, 0x3F, 0x8A, 0xCC, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */
+	0x3F, 0x3F, 0x8C, 0xD2, 0x8E, 0x88, 0x3F, 0x3F, /* 0xA0-0xA3 */
+	0x3F, 0x3F, 0x94, 0xEC, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */
+	0x3F, 0x3F, 0x8C, 0xA8, 0x96, 0x62, 0x3F, 0x3F, /* 0xA8-0xAB */
+	0xE3, 0xED, 0xE3, 0xEB, 0x3F, 0x3F, 0x8D, 0x6D, /* 0xAC-0xAF */
+	0x3F, 0x3F, 0x8D, 0x6E, 0x88, 0xE7, 0x3F, 0x3F, /* 0xB0-0xB3 */
+	0x8D, 0xE6, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x94, 0x78, 0x3F, 0x3F, /* 0xB8-0xBB */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x88, 0x00, /* 0xC0-0xC3 */
-	0x00, 0x00, 0x3F, 0x3F, 0x92, 0x5F, 0x3F, 0x3F, /* 0xC4-0xC7 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x88, 0xDD, /* 0xC0-0xC3 */
+	0xE3, 0xF2, 0x3F, 0x3F, 0x92, 0x5F, 0x3F, 0x3F, /* 0xC4-0xC7 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC8-0xCB */
-	0x94, 0x77, 0x3F, 0x3F, 0x91, 0x00, 0x3F, 0x3F, /* 0xCC-0xCF */
+	0x94, 0x77, 0x3F, 0x3F, 0x91, 0xD9, 0x3F, 0x3F, /* 0xCC-0xCF */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0xD4-0xD7 */
-	0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xD8-0xDB */
-	0x3F, 0x3F, 0x00, 0x00, 0x96, 0x45, 0x3F, 0x3F, /* 0xDC-0xDF */
-	0x3F, 0x3F, 0x8C, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */
-	0x88, 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0xEC-0xEF */
-	0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */
-	0x93, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */
-	0x8B, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF8-0xFB */
-	0x00, 0x45, 0x94, 0x5C, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE3, 0xF4, 0x3F, 0x3F, /* 0xD4-0xD7 */
+	0x3F, 0x3F, 0xE3, 0xF0, 0xE3, 0xF3, 0xE3, 0xEE, /* 0xD8-0xDB */
+	0x3F, 0x3F, 0xE3, 0xF1, 0x96, 0x45, 0x3F, 0x3F, /* 0xDC-0xDF */
+	0x3F, 0x3F, 0x8C, 0xD3, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */
+	0x88, 0xFB, 0xE3, 0xEF, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE3, 0xF6, /* 0xEC-0xEF */
+	0x3F, 0x3F, 0xE3, 0xF7, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */
+	0x93, 0xB7, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */
+	0x8B, 0xB9, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF8-0xFB */
+	0xE4, 0x45, 0x94, 0x5C, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */
 };
 
 static unsigned char u2c_81[512] = {
 	0x3F, 0x3F, 0x3F, 0x3F, 0x8E, 0x89, 0x3F, 0x3F, /* 0x00-0x03 */
-	0x3F, 0x3F, 0x8B, 0x00, 0x90, 0x00, 0x98, 0x65, /* 0x04-0x07 */
-	0x96, 0x00, 0x00, 0x00, 0x90, 0x00, 0x3F, 0x3F, /* 0x08-0x0B */
+	0x3F, 0x3F, 0x8B, 0xBA, 0x90, 0xC6, 0x98, 0x65, /* 0x04-0x07 */
+	0x96, 0xAC, 0xE3, 0xF5, 0x90, 0xD2, 0x3F, 0x3F, /* 0x08-0x0B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x8B, 0x72, 0x00, 0x00, /* 0x18-0x1B */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x8B, 0x72, 0xE3, 0xF8, /* 0x18-0x1B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0x20-0x23 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE3, 0xFA, /* 0x20-0x23 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */
-	0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0x2C-0x2F */
+	0x3F, 0x3F, 0xE3, 0xF9, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE3, 0xFB, /* 0x2C-0x2F */
 	0x3F, 0x3F, 0x92, 0x45, 0x3F, 0x3F, 0x94, 0x5D, /* 0x30-0x33 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */
-	0x3F, 0x3F, 0x92, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x38-0x3B */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x42, 0x3F, 0x3F, /* 0x3C-0x3F */
+	0x3F, 0x3F, 0x92, 0xAF, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x38-0x3B */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE4, 0x42, 0x3F, 0x3F, /* 0x3C-0x3F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x41, 0x3F, 0x3F, /* 0x44-0x47 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0x48-0x4B */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE4, 0x41, 0x3F, 0x3F, /* 0x44-0x47 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE3, 0xFC, /* 0x48-0x4B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x90, 0x74, 0x3F, 0x3F, /* 0x4C-0x4F */
-	0x95, 0x85, 0x00, 0x44, 0x3F, 0x3F, 0x00, 0x43, /* 0x50-0x53 */
+	0x95, 0x85, 0xE4, 0x44, 0x3F, 0x3F, 0xE4, 0x43, /* 0x50-0x53 */
 	0x8D, 0x6F, 0x98, 0x72, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x54, /* 0x5C-0x5F */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE4, 0x54, /* 0x5C-0x5F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x60-0x63 */
-	0x3F, 0x3F, 0x00, 0x48, 0x00, 0x49, 0x3F, 0x3F, /* 0x64-0x67 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x8E, 0x00, /* 0x68-0x6B */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x47, 0x3F, 0x3F, /* 0x6C-0x6F */
-	0x8D, 0x98, 0x00, 0x46, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */
-	0x00, 0x4A, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x74-0x77 */
-	0x92, 0x00, 0x95, 0x00, 0x91, 0x42, 0x3F, 0x3F, /* 0x78-0x7B */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x91, 0x00, /* 0x7C-0x7F */
+	0x3F, 0x3F, 0xE4, 0x48, 0xE4, 0x49, 0x3F, 0x3F, /* 0x64-0x67 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x8E, 0xEE, /* 0x68-0x6B */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE4, 0x47, 0x3F, 0x3F, /* 0x6C-0x6F */
+	0x8D, 0x98, 0xE4, 0x46, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */
+	0xE4, 0x4A, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x74-0x77 */
+	0x92, 0xB0, 0x95, 0xA0, 0x91, 0x42, 0x3F, 0x3F, /* 0x78-0x7B */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x91, 0xDA, /* 0x7C-0x7F */
 	
-	0x00, 0x4E, 0x3F, 0x3F, 0x00, 0x4F, 0x00, 0x4B, /* 0x80-0x83 */
+	0xE4, 0x4E, 0x3F, 0x3F, 0xE4, 0x4F, 0xE4, 0x4B, /* 0x80-0x83 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */
-	0x00, 0x4C, 0x3F, 0x3F, 0x00, 0x4D, 0x3F, 0x3F, /* 0x88-0x8B */
+	0xE4, 0x4C, 0x3F, 0x3F, 0xE4, 0x4D, 0x3F, 0x3F, /* 0x88-0x8B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x8D, 0x70, /* 0x8C-0x8F */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x55, /* 0x90-0x93 */
-	0x3F, 0x3F, 0x00, 0x51, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE4, 0x55, /* 0x90-0x93 */
+	0x3F, 0x3F, 0xE4, 0x51, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x95, 0x86, 0x3F, 0x3F, /* 0x98-0x9B */
 	0x96, 0x8C, 0x95, 0x47, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */
-	0x00, 0x50, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x53, /* 0xA0-0xA3 */
-	0x00, 0x52, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */
-	0x96, 0x63, 0x00, 0x56, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */
+	0xE4, 0x50, 0x3F, 0x3F, 0x3F, 0x3F, 0xE4, 0x53, /* 0xA0-0xA3 */
+	0xE4, 0x52, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */
+	0x96, 0x63, 0xE4, 0x56, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */
-	0x00, 0x57, 0x3F, 0x3F, 0x3F, 0x3F, 0x91, 0x56, /* 0xB0-0xB3 */
-	0x3F, 0x3F, 0x00, 0x58, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */
-	0x00, 0x5A, 0x3F, 0x3F, 0x00, 0x5E, 0x3F, 0x3F, /* 0xB8-0xBB */
-	0x3F, 0x3F, 0x00, 0x5B, 0x00, 0x59, 0x94, 0x5E, /* 0xBC-0xBF */
-	0x00, 0x5C, 0x3F, 0x3F, 0x00, 0x5D, 0x3F, 0x3F, /* 0xC0-0xC3 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x89, 0x00, 0x3F, 0x3F, /* 0xC4-0xC7 */
-	0x00, 0x64, 0x00, 0x5F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC8-0xCB */
-	0x3F, 0x3F, 0x00, 0x60, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */
-	0x3F, 0x3F, 0x00, 0x61, 0x3F, 0x3F, 0x91, 0x9F, /* 0xD0-0xD3 */
+	0xE4, 0x57, 0x3F, 0x3F, 0x3F, 0x3F, 0x91, 0x56, /* 0xB0-0xB3 */
+	0x3F, 0x3F, 0xE4, 0x58, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */
+	0xE4, 0x5A, 0x3F, 0x3F, 0xE4, 0x5E, 0x3F, 0x3F, /* 0xB8-0xBB */
+	0x3F, 0x3F, 0xE4, 0x5B, 0xE4, 0x59, 0x94, 0x5E, /* 0xBC-0xBF */
+	0xE4, 0x5C, 0x3F, 0x3F, 0xE4, 0x5D, 0x3F, 0x3F, /* 0xC0-0xC3 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x89, 0xB0, 0x3F, 0x3F, /* 0xC4-0xC7 */
+	0xE4, 0x64, 0xE4, 0x5F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC8-0xCB */
+	0x3F, 0x3F, 0xE4, 0x60, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */
+	0x3F, 0x3F, 0xE4, 0x61, 0x3F, 0x3F, 0x91, 0x9F, /* 0xD0-0xD3 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */
-	0x00, 0x63, 0x00, 0x62, 0x00, 0x65, 0x3F, 0x3F, /* 0xD8-0xDB */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x66, /* 0xDC-0xDF */
-	0x00, 0x67, 0x3F, 0x3F, 0x3F, 0x3F, 0x90, 0x62, /* 0xE0-0xE3 */
-	0x3F, 0x3F, 0x89, 0x00, 0x3F, 0x3F, 0x00, 0x68, /* 0xE4-0xE7 */
-	0x97, 0x00, 0x3F, 0x3F, 0x8E, 0x00, 0x3F, 0x3F, /* 0xE8-0xEB */
+	0xE4, 0x63, 0xE4, 0x62, 0xE4, 0x65, 0x3F, 0x3F, /* 0xD8-0xDB */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE4, 0x66, /* 0xDC-0xDF */
+	0xE4, 0x67, 0x3F, 0x3F, 0x3F, 0x3F, 0x90, 0x62, /* 0xE0-0xE3 */
+	0x3F, 0x3F, 0x89, 0xE7, 0x3F, 0x3F, 0xE4, 0x68, /* 0xE4-0xE7 */
+	0x97, 0xD5, 0x3F, 0x3F, 0x8E, 0xA9, 0x3F, 0x3F, /* 0xE8-0xEB */
 	0x3F, 0x3F, 0x8F, 0x4C, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x8E, 0x8A, /* 0xF0-0xF3 */
 	0x92, 0x76, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x69, 0x00, 0x6A, /* 0xF8-0xFB */
-	0x89, 0x50, 0x3F, 0x3F, 0x00, 0x6B, 0x3F, 0x3F, /* 0xFC-0xFF */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE4, 0x69, 0xE4, 0x6A, /* 0xF8-0xFB */
+	0x89, 0x50, 0x3F, 0x3F, 0xE4, 0x6B, 0x3F, 0x3F, /* 0xFC-0xFF */
 };
 
 static unsigned char u2c_82[512] = {
-	0x3F, 0x3F, 0x00, 0x6C, 0x00, 0x6D, 0x3F, 0x3F, /* 0x00-0x03 */
-	0x3F, 0x3F, 0x00, 0x6E, 0x3F, 0x3F, 0x00, 0x6F, /* 0x04-0x07 */
-	0x8B, 0x00, 0x9D, 0x00, 0x00, 0x70, 0x3F, 0x3F, /* 0x08-0x0B */
-	0x90, 0x00, 0x00, 0x71, 0x8E, 0x00, 0x3F, 0x3F, /* 0x0C-0x0F */
-	0x00, 0x72, 0x3F, 0x3F, 0x98, 0x00, 0x3F, 0x3F, /* 0x10-0x13 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x73, 0x95, 0x00, /* 0x14-0x17 */
-	0x8A, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x91, 0x43, /* 0x18-0x1B */
+	0x3F, 0x3F, 0xE4, 0x6C, 0xE4, 0x6D, 0x3F, 0x3F, /* 0x00-0x03 */
+	0x3F, 0x3F, 0xE4, 0x6E, 0x3F, 0x3F, 0xE4, 0x6F, /* 0x04-0x07 */
+	0x8B, 0xBB, 0x9D, 0xA8, 0xE4, 0x70, 0x3F, 0x3F, /* 0x08-0x0B */
+	0x90, 0xE3, 0xE4, 0x71, 0x8E, 0xC9, 0x3F, 0x3F, /* 0x0C-0x0F */
+	0xE4, 0x72, 0x3F, 0x3F, 0x98, 0xAE, 0x3F, 0x3F, /* 0x10-0x13 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE4, 0x73, 0x95, 0xDC, /* 0x14-0x17 */
+	0x8A, 0xDA, 0x3F, 0x3F, 0x3F, 0x3F, 0x91, 0x43, /* 0x18-0x1B */
 	0x8F, 0x77, 0x3F, 0x3F, 0x95, 0x91, 0x8F, 0x4D, /* 0x1C-0x1F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */
-	0x3F, 0x3F, 0x00, 0x74, 0x8D, 0x71, 0x00, 0x75, /* 0x28-0x2B */
-	0x94, 0x00, 0x3F, 0x3F, 0x00, 0x84, 0x3F, 0x3F, /* 0x2C-0x2F */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x77, /* 0x30-0x33 */
-	0x3F, 0x3F, 0x91, 0x00, 0x94, 0x95, 0x8C, 0x00, /* 0x34-0x37 */
-	0x00, 0x76, 0x91, 0x44, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x38-0x3B */
+	0x3F, 0x3F, 0xE4, 0x74, 0x8D, 0x71, 0xE4, 0x75, /* 0x28-0x2B */
+	0x94, 0xCA, 0x3F, 0x3F, 0xE4, 0x84, 0x3F, 0x3F, /* 0x2C-0x2F */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE4, 0x77, /* 0x30-0x33 */
+	0x3F, 0x3F, 0x91, 0xC7, 0x94, 0x95, 0x8C, 0xBD, /* 0x34-0x37 */
+	0xE4, 0x76, 0x91, 0x44, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x38-0x3B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */
-	0x00, 0x78, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x92, 0x00, /* 0x44-0x47 */
+	0xE4, 0x78, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x92, 0xF8, /* 0x44-0x47 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x4C-0x4F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */
-	0x00, 0x7A, 0x00, 0x79, 0x00, 0x7C, 0x3F, 0x3F, /* 0x58-0x5B */
-	0x3F, 0x3F, 0x00, 0x7B, 0x3F, 0x3F, 0x00, 0x7D, /* 0x5C-0x5F */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x80, 0x3F, 0x3F, /* 0x60-0x63 */
-	0x00, 0x7E, 0x3F, 0x3F, 0x8A, 0x00, 0x3F, 0x3F, /* 0x64-0x67 */
-	0x00, 0x81, 0x3F, 0x3F, 0x00, 0x82, 0x00, 0x83, /* 0x68-0x6B */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x8D, 0x00, 0x97, 0x00, /* 0x6C-0x6F */
-	0x3F, 0x3F, 0x00, 0x85, 0x90, 0x46, 0x3F, 0x3F, /* 0x70-0x73 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x89, 0x90, 0x00, 0x86, /* 0x74-0x77 */
-	0x00, 0x87, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x88, 0x3F, 0x3F, /* 0x7C-0x7F */
+	0xE4, 0x7A, 0xE4, 0x79, 0xE4, 0x7C, 0x3F, 0x3F, /* 0x58-0x5B */
+	0x3F, 0x3F, 0xE4, 0x7B, 0x3F, 0x3F, 0xE4, 0x7D, /* 0x5C-0x5F */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE4, 0x80, 0x3F, 0x3F, /* 0x60-0x63 */
+	0xE4, 0x7E, 0x3F, 0x3F, 0x8A, 0xCD, 0x3F, 0x3F, /* 0x64-0x67 */
+	0xE4, 0x81, 0x3F, 0x3F, 0xE4, 0x82, 0xE4, 0x83, /* 0x68-0x6B */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x8D, 0xAF, 0x97, 0xC7, /* 0x6C-0x6F */
+	0x3F, 0x3F, 0xE4, 0x85, 0x90, 0x46, 0x3F, 0x3F, /* 0x70-0x73 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x89, 0x90, 0xE4, 0x86, /* 0x74-0x77 */
+	0xE4, 0x87, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE4, 0x88, 0x3F, 0x3F, /* 0x7C-0x7F */
 	
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x88, 0x00, /* 0x88-0x8B */
-	0x3F, 0x3F, 0x00, 0x89, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x8A, 0x3F, 0x3F, /* 0x90-0x93 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x88, 0xF0, /* 0x88-0x8B */
+	0x3F, 0x3F, 0xE4, 0x89, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE4, 0x8A, 0x3F, 0x3F, /* 0x90-0x93 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */
 	0x3F, 0x3F, 0x95, 0x87, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */
-	0x3F, 0x3F, 0x8E, 0x00, 0x3F, 0x3F, 0x00, 0x8C, /* 0x9C-0x9F */
+	0x3F, 0x3F, 0x8E, 0xC5, 0x3F, 0x3F, 0xE4, 0x8C, /* 0x9C-0x9F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */
-	0x3F, 0x3F, 0x8A, 0x48, 0x88, 0x00, 0x3F, 0x3F, /* 0xA4-0xA7 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x8B, /* 0xA8-0xAB */
-	0x00, 0x8E, 0x94, 0x6D, 0x3F, 0x3F, 0x90, 0x63, /* 0xAC-0xAF */
-	0x3F, 0x3F, 0x89, 0x00, 0x3F, 0x3F, 0x96, 0x46, /* 0xB0-0xB3 */
+	0x3F, 0x3F, 0x8A, 0x48, 0x88, 0xB0, 0x3F, 0x3F, /* 0xA4-0xA7 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE4, 0x8B, /* 0xA8-0xAB */
+	0xE4, 0x8E, 0x94, 0x6D, 0x3F, 0x3F, 0x90, 0x63, /* 0xAC-0xAF */
+	0x3F, 0x3F, 0x89, 0xD4, 0x3F, 0x3F, 0x96, 0x46, /* 0xB0-0xB3 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */
-	0x8C, 0x7C, 0x8B, 0x00, 0x3F, 0x3F, 0x00, 0x8D, /* 0xB8-0xBB */
-	0x3F, 0x3F, 0x89, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */
+	0x8C, 0x7C, 0x8B, 0xDA, 0x3F, 0x3F, 0xE4, 0x8D, /* 0xB8-0xBB */
+	0x3F, 0x3F, 0x89, 0xE8, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */
-	0x3F, 0x3F, 0x8A, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC4-0xC7 */
+	0x3F, 0x3F, 0x8A, 0xA1, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC4-0xC7 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC8-0xCB */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */
-	0x3F, 0x3F, 0x89, 0x91, 0x00, 0x92, 0x97, 0x00, /* 0xD0-0xD3 */
-	0x91, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x95, 0x63, /* 0xD4-0xD7 */
-	0x3F, 0x3F, 0x00, 0x9E, 0x3F, 0x3F, 0x89, 0x00, /* 0xD8-0xDB */
-	0x00, 0x9C, 0x3F, 0x3F, 0x00, 0x9A, 0x00, 0x91, /* 0xDC-0xDF */
-	0x3F, 0x3F, 0x00, 0x8F, 0x3F, 0x3F, 0x00, 0x90, /* 0xE0-0xE3 */
-	0x3F, 0x3F, 0x8E, 0x00, 0x8B, 0x00, 0x92, 0x97, /* 0xE4-0xE7 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x93, 0x00, /* 0xE8-0xEB */
+	0x3F, 0x3F, 0x89, 0x91, 0xE4, 0x92, 0x97, 0xE8, /* 0xD0-0xD3 */
+	0x91, 0xDB, 0x3F, 0x3F, 0x3F, 0x3F, 0x95, 0x63, /* 0xD4-0xD7 */
+	0x3F, 0x3F, 0xE4, 0x9E, 0x3F, 0x3F, 0x89, 0xD5, /* 0xD8-0xDB */
+	0xE4, 0x9C, 0x3F, 0x3F, 0xE4, 0x9A, 0xE4, 0x91, /* 0xDC-0xDF */
+	0x3F, 0x3F, 0xE4, 0x8F, 0x3F, 0x3F, 0xE4, 0x90, /* 0xE0-0xE3 */
+	0x3F, 0x3F, 0x8E, 0xE1, 0x8B, 0xEA, 0x92, 0x97, /* 0xE4-0xE7 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x93, 0xCF, /* 0xE8-0xEB */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */
-	0x3F, 0x3F, 0x89, 0x70, 0x3F, 0x3F, 0x00, 0x94, /* 0xF0-0xF3 */
-	0x00, 0x93, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */
-	0x3F, 0x3F, 0x00, 0x99, 0x00, 0x95, 0x00, 0x98, /* 0xF8-0xFB */
+	0x3F, 0x3F, 0x89, 0x70, 0x3F, 0x3F, 0xE4, 0x94, /* 0xF0-0xF3 */
+	0xE4, 0x93, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */
+	0x3F, 0x3F, 0xE4, 0x99, 0xE4, 0x95, 0xE4, 0x98, /* 0xF8-0xFB */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */
 };
 
 static unsigned char u2c_83[512] = {
-	0x3F, 0x3F, 0x00, 0x93, 0x96, 0x00, 0x00, 0x97, /* 0x00-0x03 */
-	0x89, 0x00, 0x8A, 0x9D, 0x00, 0x9B, 0x3F, 0x3F, /* 0x04-0x07 */
-	0x3F, 0x3F, 0x00, 0x9D, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x08-0x0B */
+	0x3F, 0x3F, 0xEE, 0x76, 0x96, 0xCE, 0xE4, 0x97, /* 0x00-0x03 */
+	0x89, 0xD6, 0x8A, 0x9D, 0xE4, 0x9B, 0x3F, 0x3F, /* 0x04-0x07 */
+	0x3F, 0x3F, 0xE4, 0x9D, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x08-0x0B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x8C, 0x73, 0x3F, 0x3F, /* 0x0C-0x0F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, /* 0x14-0x17 */
-	0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x18-0x1B */
-	0x88, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0x20-0x23 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE4, 0xA1, 0xE4, 0xAA, /* 0x14-0x17 */
+	0xE4, 0xAB, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x18-0x1B */
+	0x88, 0xA9, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE4, 0xB2, /* 0x20-0x23 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */
-	0x88, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0x28-0x2B */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0x2C-0x2F */
-	0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, /* 0x30-0x33 */
-	0x00, 0x00, 0x00, 0x9F, 0x92, 0x83, 0x3F, 0x3F, /* 0x34-0x37 */
-	0x91, 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x38-0x3B */
+	0x88, 0xEF, 0x3F, 0x3F, 0x3F, 0x3F, 0xE4, 0xA9, /* 0x28-0x2B */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE4, 0xA8, /* 0x2C-0x2F */
+	0x3F, 0x3F, 0xE4, 0xA3, 0xE4, 0xA2, 0x3F, 0x3F, /* 0x30-0x33 */
+	0xE4, 0xA0, 0xE4, 0x9F, 0x92, 0x83, 0x3F, 0x3F, /* 0x34-0x37 */
+	0x91, 0xF9, 0xE4, 0xA5, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x38-0x3B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */
-	0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */
-	0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */
+	0xE4, 0xA4, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */
+	0x3F, 0x3F, 0xE4, 0xA7, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */
 	0x3F, 0x3F, 0x91, 0x90, 0x8C, 0x74, 0x3F, 0x3F, /* 0x48-0x4B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x89, 0x60, /* 0x4C-0x4F */
-	0x00, 0x00, 0x3F, 0x3F, 0x8D, 0x72, 0x3F, 0x3F, /* 0x50-0x53 */
+	0xE4, 0xA6, 0x3F, 0x3F, 0x8D, 0x72, 0x3F, 0x3F, /* 0x50-0x53 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */
 	0x91, 0x91, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x5C-0x5F */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x94, 0x3F, 0x3F, /* 0x60-0x63 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xEE, 0x77, 0x3F, 0x3F, /* 0x60-0x63 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x68-0x6B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0x70-0x73 */
-	0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, 0x89, 0x00, /* 0x74-0x77 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x89, 0x00, /* 0x78-0x7B */
-	0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x95, /* 0x7C-0x7F */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE4, 0xB8, /* 0x70-0x73 */
+	0x3F, 0x3F, 0xE4, 0xB9, 0x3F, 0x3F, 0x89, 0xD7, /* 0x74-0x77 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x89, 0xAC, /* 0x78-0x7B */
+	0xE4, 0xB6, 0x3F, 0x3F, 0x3F, 0x3F, 0xEE, 0x78, /* 0x7C-0x7F */
 	
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */
-	0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x00, /* 0x84-0x87 */
-	0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, /* 0x88-0x8B */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0x8C-0x8F */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x96, /* 0x90-0x93 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0x94-0x97 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0x98-0x9B */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x8A, 0x00, 0x00, 0x00, /* 0x9C-0x9F */
-	0x00, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0xA0-0xA3 */
+	0x3F, 0x3F, 0xE4, 0xAC, 0x3F, 0x3F, 0xE4, 0xB4, /* 0x84-0x87 */
+	0x3F, 0x3F, 0xE4, 0xBB, 0xE4, 0xB5, 0x3F, 0x3F, /* 0x88-0x8B */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE4, 0xB3, 0x3F, 0x3F, /* 0x8C-0x8F */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE4, 0x96, /* 0x90-0x93 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE4, 0xB1, 0x3F, 0x3F, /* 0x94-0x97 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE4, 0xAD, 0x3F, 0x3F, /* 0x98-0x9B */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x8A, 0xCE, 0xE4, 0xAF, /* 0x9C-0x9F */
+	0xE4, 0xBA, 0x3F, 0x3F, 0xE4, 0xB0, 0x3F, 0x3F, /* 0xA0-0xA3 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */
-	0x00, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x94, 0x9C, /* 0xA8-0xAB */
+	0xE4, 0xBC, 0x3F, 0x3F, 0xE4, 0xAE, 0x94, 0x9C, /* 0xA8-0xAB */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */
 	0x3F, 0x3F, 0x97, 0x89, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB0-0xB3 */
-	0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */
+	0x3F, 0x3F, 0xE4, 0xB7, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */
-	0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */
-	0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */
-	0x3F, 0x3F, 0x90, 0x9B, 0x3F, 0x3F, 0x00, 0x96, /* 0xC4-0xC7 */
+	0x3F, 0x3F, 0xE4, 0xCD, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */
+	0x3F, 0x3F, 0xE4, 0xC5, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */
+	0x3F, 0x3F, 0x90, 0x9B, 0x3F, 0x3F, 0xEE, 0x79, /* 0xC4-0xC7 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x8B, 0x65, 0x3F, 0x3F, /* 0xC8-0xCB */
-	0x8B, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0xCC-0xCF */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x89, 0x00, /* 0xD0-0xD3 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x8F, 0x00, 0x3F, 0x3F, /* 0xD4-0xD7 */
-	0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */
-	0x8D, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x93, 0x70, /* 0xDC-0xDF */
-	0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */
+	0x8B, 0xDB, 0x3F, 0x3F, 0xE4, 0xC0, 0x3F, 0x3F, /* 0xCC-0xCF */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x89, 0xD9, /* 0xD0-0xD3 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x8F, 0xD2, 0x3F, 0x3F, /* 0xD4-0xD7 */
+	0xE4, 0xC3, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */
+	0x8D, 0xD8, 0x3F, 0x3F, 0x3F, 0x3F, 0x93, 0x70, /* 0xDC-0xDF */
+	0xE4, 0xC8, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */
-	0x3F, 0x3F, 0x95, 0x00, 0x3F, 0x3F, 0x00, 0x00, /* 0xE8-0xEB */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x89, 0x00, /* 0xEC-0xEF */
-	0x8C, 0x00, 0x95, 0x48, 0x00, 0x00, 0x3F, 0x3F, /* 0xF0-0xF3 */
-	0x00, 0x00, 0x3F, 0x3F, 0x00, 0x97, 0x00, 0x00, /* 0xF4-0xF7 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0xF8-0xFB */
-	0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */
+	0x3F, 0x3F, 0x95, 0xEC, 0x3F, 0x3F, 0xE4, 0xBF, /* 0xE8-0xEB */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x89, 0xD8, /* 0xEC-0xEF */
+	0x8C, 0xD4, 0x95, 0x48, 0xE4, 0xC9, 0x3F, 0x3F, /* 0xF0-0xF3 */
+	0xE4, 0xBD, 0x3F, 0x3F, 0xEE, 0x7A, 0xE4, 0xC6, /* 0xF4-0xF7 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE4, 0xD0, /* 0xF8-0xFB */
+	0x3F, 0x3F, 0xE4, 0xC1, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */
 };
 
 static unsigned char u2c_84[512] = {
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0x00-0x03 */
-	0x93, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0x04-0x07 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0x08-0x0B */
-	0x96, 0x47, 0x00, 0x00, 0x88, 0x00, 0x3F, 0x3F, /* 0x0C-0x0F */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0x10-0x13 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE4, 0xC2, /* 0x00-0x03 */
+	0x93, 0xB8, 0x3F, 0x3F, 0x3F, 0x3F, 0xE4, 0xC7, /* 0x04-0x07 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE4, 0xC4, /* 0x08-0x0B */
+	0x96, 0x47, 0xE4, 0xCA, 0x88, 0xDE, 0x3F, 0x3F, /* 0x0C-0x0F */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE4, 0xBE, /* 0x10-0x13 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x18-0x1B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */
-	0x00, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0x20-0x23 */
+	0xE4, 0xCC, 0x3F, 0x3F, 0xE4, 0xCB, 0x3F, 0x3F, /* 0x20-0x23 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */
-	0x3F, 0x3F, 0x94, 0x8B, 0x00, 0x00, 0x3F, 0x3F, /* 0x28-0x2B */
-	0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */
+	0x3F, 0x3F, 0x94, 0x8B, 0xE4, 0xD2, 0x3F, 0x3F, /* 0x28-0x2B */
+	0xE4, 0xDD, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */
 	0x3F, 0x3F, 0x8A, 0x9E, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */
-	0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */
-	0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x38-0x3B */
-	0x00, 0x00, 0x97, 0x8E, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */
+	0x3F, 0x3F, 0xE4, 0xE0, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */
+	0xE4, 0xCE, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x38-0x3B */
+	0xE4, 0xD3, 0x97, 0x8E, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0x44-0x47 */
-	0x00, 0x98, 0x97, 0x74, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x97, 0x00, 0x3F, 0x3F, /* 0x4C-0x4F */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE4, 0xDC, 0x3F, 0x3F, /* 0x44-0x47 */
+	0xEE, 0x7B, 0x97, 0x74, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x97, 0xA8, 0x3F, 0x3F, /* 0x4C-0x4F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x92, 0x98, /* 0x54-0x57 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x8A, 0x8B, /* 0x58-0x5B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x5C-0x5F */
-	0x3F, 0x3F, 0x95, 0x92, 0x00, 0x00, 0x93, 0x9F, /* 0x60-0x63 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x88, 0x00, 0x3F, 0x3F, /* 0x64-0x67 */
-	0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x00, /* 0x68-0x6B */
-	0x91, 0x92, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x6C-0x6F */
+	0x3F, 0x3F, 0x95, 0x92, 0xE4, 0xE2, 0x93, 0x9F, /* 0x60-0x63 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x88, 0xAF, 0x3F, 0x3F, /* 0x64-0x67 */
+	0x3F, 0x3F, 0xE4, 0xDB, 0x3F, 0x3F, 0xE4, 0xD7, /* 0x68-0x6B */
+	0x91, 0x92, 0xE4, 0xD1, 0xE4, 0xD9, 0xE4, 0xDE, /* 0x6C-0x6F */
 	0x3F, 0x3F, 0x94, 0x4B, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */
-	0x3F, 0x3F, 0x88, 0x00, 0x3F, 0x3F, 0x00, 0x00, /* 0x74-0x77 */
-	0x3F, 0x3F, 0x00, 0x00, 0x95, 0x98, 0x3F, 0x3F, /* 0x78-0x7B */
+	0x3F, 0x3F, 0x88, 0xA8, 0x3F, 0x3F, 0xE4, 0xD6, /* 0x74-0x77 */
+	0x3F, 0x3F, 0xE4, 0xDF, 0x95, 0x98, 0x3F, 0x3F, /* 0x78-0x7B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */
 	
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0x80-0x83 */
-	0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x8F, 0x00, /* 0x88-0x8B */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE4, 0xDA, 0x3F, 0x3F, /* 0x80-0x83 */
+	0xE4, 0xD5, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x8F, 0xD3, /* 0x88-0x8B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */
 	0x8F, 0x4E, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */
-	0x8E, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */
-	0x3F, 0x3F, 0x96, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */
-	0x95, 0x66, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0x9C-0x9F */
-	0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */
+	0x8E, 0xAA, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */
+	0x3F, 0x3F, 0x96, 0xD6, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */
+	0x95, 0x66, 0x3F, 0x3F, 0x3F, 0x3F, 0xE4, 0xE5, /* 0x9C-0x9F */
+	0x3F, 0x3F, 0xE4, 0xEE, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */
-	0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */
+	0x3F, 0x3F, 0xE4, 0xD8, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x8A, 0x97, 0x3F, 0x3F, /* 0xB0-0xB3 */
-	0x00, 0x99, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */
-	0x8F, 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x00, /* 0xB8-0xBB */
-	0x91, 0x93, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0xBC-0xBF */
-	0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */
-	0x92, 0x7E, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0xC4-0xC7 */
-	0x3F, 0x3F, 0x97, 0x75, 0x00, 0x00, 0x8A, 0x57, /* 0xC8-0xCB */
-	0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */
-	0x00, 0x00, 0x96, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0xD4-0xD7 */
-	0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, /* 0xD8-0xDB */
-	0x00, 0x60, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xDC-0xDF */
+	0xEE, 0x7C, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */
+	0x8F, 0xF6, 0xE4, 0xE3, 0x3F, 0x3F, 0xE4, 0xE8, /* 0xB8-0xBB */
+	0x91, 0x93, 0x3F, 0x3F, 0x3F, 0x3F, 0xE4, 0xE4, /* 0xBC-0xBF */
+	0x3F, 0x3F, 0xE4, 0xEB, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */
+	0x92, 0x7E, 0x3F, 0x3F, 0xE4, 0xEC, 0x3F, 0x3F, /* 0xC4-0xC7 */
+	0x3F, 0x3F, 0x97, 0x75, 0xE4, 0xE1, 0x8A, 0x57, /* 0xC8-0xCB */
+	0x3F, 0x3F, 0xE4, 0xE7, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */
+	0xE4, 0xEA, 0x96, 0xAA, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE4, 0xED, 0x3F, 0x3F, /* 0xD4-0xD7 */
+	0x3F, 0x3F, 0xE4, 0xE6, 0xE4, 0xE9, 0x3F, 0x3F, /* 0xD8-0xDB */
+	0xED, 0x44, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xDC-0xDF */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */
 	0x96, 0x48, 0x3F, 0x3F, 0x98, 0x40, 0x3F, 0x3F, /* 0xEC-0xEF */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */
-	0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */
+	0xE4, 0xF1, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF8-0xFB */
-	0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0xFC-0xFF */
+	0xE4, 0xF8, 0x3F, 0x3F, 0x3F, 0x3F, 0xE4, 0xF0, /* 0xFC-0xFF */
 };
 
 static unsigned char u2c_85[512] = {
-	0x8E, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0x04-0x07 */
+	0x8E, 0xC1, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE4, 0xCF, 0x3F, 0x3F, /* 0x04-0x07 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x08-0x0B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */
-	0x3F, 0x3F, 0x95, 0x00, 0x3F, 0x3F, 0x96, 0x00, /* 0x10-0x13 */
-	0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x00, /* 0x14-0x17 */
-	0x00, 0x00, 0x3F, 0x3F, 0x89, 0x55, 0x3F, 0x3F, /* 0x18-0x1B */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0x1C-0x1F */
-	0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x92, 0x00, 0x3F, 0x3F, /* 0x24-0x27 */
+	0x3F, 0x3F, 0x95, 0xCC, 0x3F, 0x3F, 0x96, 0xA0, /* 0x10-0x13 */
+	0xE4, 0xF7, 0xE4, 0xF6, 0x3F, 0x3F, 0xE4, 0xF2, /* 0x14-0x17 */
+	0xE4, 0xF3, 0x3F, 0x3F, 0x89, 0x55, 0x3F, 0x3F, /* 0x18-0x1B */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE4, 0xF5, /* 0x1C-0x1F */
+	0x3F, 0x3F, 0xE4, 0xEF, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x92, 0xD3, 0x3F, 0x3F, /* 0x24-0x27 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */
-	0x00, 0x00, 0x88, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */
+	0xE4, 0xF4, 0x88, 0xFC, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */
-	0x3F, 0x3F, 0x91, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */
+	0x3F, 0x3F, 0x91, 0xA0, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x38-0x3B */
-	0x3F, 0x3F, 0x95, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */
-	0x00, 0x00, 0x00, 0x40, 0x3F, 0x3F, 0x94, 0x00, /* 0x40-0x43 */
+	0x3F, 0x3F, 0x95, 0xC1, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */
+	0xE4, 0xF9, 0xE5, 0x40, 0x3F, 0x3F, 0x94, 0xD7, /* 0x40-0x43 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */
-	0x00, 0x00, 0x8F, 0x00, 0x8E, 0x00, 0x00, 0x42, /* 0x48-0x4B */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x8B, 0x00, 0x3F, 0x3F, /* 0x4C-0x4F */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x9A, /* 0x50-0x53 */
-	0x3F, 0x3F, 0x00, 0x43, 0x3F, 0x3F, 0x95, 0x99, /* 0x54-0x57 */
-	0x00, 0x00, 0x00, 0x9B, 0x00, 0x00, 0x3F, 0x3F, /* 0x58-0x5B */
+	0xE4, 0xFC, 0x8F, 0xD4, 0x8E, 0xC7, 0xE5, 0x42, /* 0x48-0x4B */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x8B, 0xBC, 0x3F, 0x3F, /* 0x4C-0x4F */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xEE, 0x7D, /* 0x50-0x53 */
+	0x3F, 0x3F, 0xE5, 0x43, 0x3F, 0x3F, 0x95, 0x99, /* 0x54-0x57 */
+	0xE4, 0xFB, 0xEE, 0x7E, 0xE4, 0xD4, 0x3F, 0x3F, /* 0x58-0x5B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x5C-0x5F */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0x60-0x63 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE4, 0xFA, /* 0x60-0x63 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */
-	0x98, 0x6E, 0x93, 0x00, 0x95, 0x93, 0x00, 0x9C, /* 0x68-0x6B */
-	0x3F, 0x3F, 0x00, 0x4A, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */
+	0x98, 0x6E, 0x93, 0xA0, 0x95, 0x93, 0xEE, 0x80, /* 0x68-0x6B */
+	0x3F, 0x3F, 0xE5, 0x4A, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x50, /* 0x74-0x77 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE5, 0x50, /* 0x74-0x77 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x51, 0x3F, 0x3F, /* 0x7C-0x7F */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE5, 0x51, 0x3F, 0x3F, /* 0x7C-0x7F */
 	
-	0x00, 0x44, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */
-	0x94, 0x96, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x4E, /* 0x84-0x87 */
-	0x00, 0x46, 0x3F, 0x3F, 0x00, 0x48, 0x3F, 0x3F, /* 0x88-0x8B */
+	0xE5, 0x44, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */
+	0x94, 0x96, 0x3F, 0x3F, 0x3F, 0x3F, 0xE5, 0x4E, /* 0x84-0x87 */
+	0xE5, 0x46, 0x3F, 0x3F, 0xE5, 0x48, 0x3F, 0x3F, /* 0x88-0x8B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */
-	0x00, 0x52, 0x00, 0x47, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */
-	0x00, 0x4B, 0x3F, 0x3F, 0x3F, 0x3F, 0x89, 0x92, /* 0x94-0x97 */
-	0x3F, 0x3F, 0x93, 0x00, 0x3F, 0x3F, 0x00, 0x4C, /* 0x98-0x9B */
-	0x00, 0x4F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */
+	0xE5, 0x52, 0xE5, 0x47, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */
+	0xE5, 0x4B, 0x3F, 0x3F, 0x3F, 0x3F, 0x89, 0x92, /* 0x94-0x97 */
+	0x3F, 0x3F, 0x93, 0xE3, 0x3F, 0x3F, 0xE5, 0x4C, /* 0x98-0x9B */
+	0xE5, 0x4F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */
-	0x00, 0x45, 0x3F, 0x3F, 0x91, 0x45, 0x3F, 0x3F, /* 0xA4-0xA7 */
-	0x00, 0x49, 0x8E, 0x46, 0x90, 0x64, 0x8C, 0x4F, /* 0xA8-0xAB */
-	0x96, 0x00, 0x3F, 0x3F, 0x96, 0x00, 0x8F, 0x92, /* 0xAC-0xAF */
-	0x00, 0x9E, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB0-0xB3 */
+	0xE5, 0x45, 0x3F, 0x3F, 0x91, 0x45, 0x3F, 0x3F, /* 0xA4-0xA7 */
+	0xE5, 0x49, 0x8E, 0x46, 0x90, 0x64, 0x8C, 0x4F, /* 0xA8-0xAB */
+	0x96, 0xF2, 0x3F, 0x3F, 0x96, 0xF7, 0x8F, 0x92, /* 0xAC-0xAF */
+	0xEE, 0x82, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB0-0xB3 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */
-	0x3F, 0x3F, 0x00, 0x56, 0x00, 0x54, 0x3F, 0x3F, /* 0xB8-0xBB */
+	0x3F, 0x3F, 0xE5, 0x56, 0xE5, 0x54, 0x3F, 0x3F, /* 0xB8-0xBB */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */
 	0x3F, 0x3F, 0x98, 0x6D, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC4-0xC7 */
-	0x3F, 0x3F, 0x00, 0x53, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC8-0xCB */
-	0x3F, 0x3F, 0x97, 0x95, 0x3F, 0x3F, 0x00, 0x55, /* 0xCC-0xCF */
-	0x00, 0x57, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */
-	0x3F, 0x3F, 0x00, 0x58, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */
+	0x3F, 0x3F, 0xE5, 0x53, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC8-0xCB */
+	0x3F, 0x3F, 0x97, 0x95, 0x3F, 0x3F, 0xE5, 0x55, /* 0xCC-0xCF */
+	0xE5, 0x57, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */
+	0x3F, 0x3F, 0xE5, 0x58, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */
-	0x00, 0x5B, 0x00, 0x59, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xDC-0xDF */
+	0xE5, 0x5B, 0xE5, 0x59, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xDC-0xDF */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */
-	0x93, 0x00, 0x00, 0x5A, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */
-	0x3F, 0x3F, 0x94, 0x00, 0x00, 0x4D, 0x3F, 0x3F, /* 0xE8-0xEB */
+	0x93, 0xA1, 0xE5, 0x5A, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */
+	0x3F, 0x3F, 0x94, 0xCB, 0xE5, 0x4D, 0x3F, 0x3F, /* 0xE8-0xEB */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x8F, 0x93, /* 0xF4-0xF7 */
-	0x3F, 0x3F, 0x00, 0x5C, 0x00, 0x61, 0x91, 0x94, /* 0xF8-0xFB */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x60, 0x3F, 0x3F, /* 0xFC-0xFF */
+	0x3F, 0x3F, 0xE5, 0x5C, 0xE5, 0x61, 0x91, 0x94, /* 0xF8-0xFB */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE5, 0x60, 0x3F, 0x3F, /* 0xFC-0xFF */
 };
 
 static unsigned char u2c_86[512] = {
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x41, 0x3F, 0x3F, /* 0x00-0x03 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x62, 0x91, 0x68, /* 0x04-0x07 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x5D, 0x00, 0x5F, /* 0x08-0x0B */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE5, 0x41, 0x3F, 0x3F, /* 0x00-0x03 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE5, 0x62, 0x91, 0x68, /* 0x04-0x07 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE5, 0x5D, 0xE5, 0x5F, /* 0x08-0x0B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x5E, /* 0x10-0x13 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE5, 0x5E, /* 0x10-0x13 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x9F, 0x50, 0x9F, 0x41, /* 0x14-0x17 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x64, 0x3F, 0x3F, /* 0x18-0x1B */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE5, 0x64, 0x3F, 0x3F, /* 0x18-0x1B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x63, 0x3F, 0x3F, /* 0x20-0x23 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE5, 0x63, 0x3F, 0x3F, /* 0x20-0x23 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */
-	0x3F, 0x3F, 0x97, 0x96, 0x3F, 0x3F, 0x00, 0x00, /* 0x2C-0x2F */
-	0x00, 0x65, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */
+	0x3F, 0x3F, 0x97, 0x96, 0x3F, 0x3F, 0xE1, 0xBA, /* 0x2C-0x2F */
+	0xE5, 0x65, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x38-0x3B */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x66, /* 0x3C-0x3F */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE5, 0x66, /* 0x3C-0x3F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */
-	0x3F, 0x3F, 0x00, 0x67, 0x8C, 0x00, 0x3F, 0x3F, /* 0x4C-0x4F */
+	0x3F, 0x3F, 0xE5, 0x67, 0x8C, 0xD5, 0x3F, 0x3F, /* 0x4C-0x4F */
 	0x8B, 0x73, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */
-	0x00, 0x69, 0x99, 0x7C, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */
+	0xE5, 0x69, 0x99, 0x7C, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x8B, 0x95, 0x3F, 0x3F, /* 0x58-0x5B */
-	0x97, 0x00, 0x3F, 0x3F, 0x8B, 0x00, 0x00, 0x6A, /* 0x5C-0x5F */
+	0x97, 0xB8, 0x3F, 0x3F, 0x8B, 0xF1, 0xE5, 0x6A, /* 0x5C-0x5F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x60-0x63 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x6B, /* 0x64-0x67 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE5, 0x6B, /* 0x64-0x67 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x92, 0x8E, /* 0x68-0x6B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */
-	0x3F, 0x3F, 0x00, 0x6C, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */
+	0x3F, 0x3F, 0xE5, 0x6C, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x74-0x77 */
-	0x3F, 0x3F, 0x93, 0x00, 0x3F, 0x3F, 0x88, 0x00, /* 0x78-0x7B */
+	0x3F, 0x3F, 0x93, 0xF8, 0x3F, 0x3F, 0x88, 0xB8, /* 0x78-0x7B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */
 	
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x89, 0x00, 0x00, 0x71, /* 0x88-0x8B */
-	0x00, 0x72, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x6D, /* 0x90-0x93 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x89, 0xE1, 0xE5, 0x71, /* 0x88-0x8B */
+	0xE5, 0x72, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE5, 0x6D, /* 0x90-0x93 */
 	0x3F, 0x3F, 0x8E, 0x5C, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x6E, /* 0xA0-0xA3 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE5, 0x6E, /* 0xA0-0xA3 */
 	0x94, 0x61, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */
-	0x3F, 0x3F, 0x00, 0x6F, 0x00, 0x70, 0x00, 0x7A, /* 0xA8-0xAB */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x74, /* 0xAC-0xAF */
-	0x00, 0x77, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB0-0xB3 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x73, 0x3F, 0x3F, /* 0xB4-0xB7 */
+	0x3F, 0x3F, 0xE5, 0x6F, 0xE5, 0x70, 0xE5, 0x7A, /* 0xA8-0xAB */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE5, 0x74, /* 0xAC-0xAF */
+	0xE5, 0x77, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB0-0xB3 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE5, 0x73, 0x3F, 0x3F, /* 0xB4-0xB7 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */
-	0x00, 0x75, 0x3F, 0x3F, 0x00, 0x76, 0x8E, 0x00, /* 0xC4-0xC7 */
-	0x3F, 0x3F, 0x00, 0x78, 0x3F, 0x3F, 0x92, 0x60, /* 0xC8-0xCB */
+	0xE5, 0x75, 0x3F, 0x3F, 0xE5, 0x76, 0x8E, 0xD6, /* 0xC4-0xC7 */
+	0x3F, 0x3F, 0xE5, 0x78, 0x3F, 0x3F, 0x92, 0x60, /* 0xC8-0xCB */
 	0x3F, 0x3F, 0x8C, 0x75, 0x8A, 0x61, 0x3F, 0x3F, /* 0xCC-0xCF */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */
-	0x00, 0x7B, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */
-	0x3F, 0x3F, 0x8A, 0x5E, 0x3F, 0x3F, 0x00, 0x81, /* 0xD8-0xDB */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x7C, 0x00, 0x80, /* 0xDC-0xDF */
+	0xE5, 0x7B, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */
+	0x3F, 0x3F, 0x8A, 0x5E, 0x3F, 0x3F, 0xE5, 0x81, /* 0xD8-0xDB */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE5, 0x7C, 0xE5, 0x80, /* 0xDC-0xDF */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */
-	0x94, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */
-	0x3F, 0x3F, 0x00, 0x7D, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */
-	0x00, 0x7E, 0x95, 0x67, 0x94, 0x00, 0x00, 0x82, /* 0xEC-0xEF */
+	0x94, 0xB8, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */
+	0x3F, 0x3F, 0xE5, 0x7D, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */
+	0xE5, 0x7E, 0x95, 0x67, 0x94, 0xD8, 0xE5, 0x82, /* 0xEC-0xEF */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */
-	0x91, 0x00, 0x00, 0x8C, 0x3F, 0x3F, 0x00, 0x88, /* 0xF8-0xFB */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x89, 0x00, 0x3F, 0x3F, /* 0xFC-0xFF */
+	0x91, 0xFB, 0xE5, 0x8C, 0x3F, 0x3F, 0xE5, 0x88, /* 0xF8-0xFB */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x89, 0xE9, 0x3F, 0x3F, /* 0xFC-0xFF */
 };
 
 static unsigned char u2c_87[512] = {
-	0x00, 0x86, 0x3F, 0x3F, 0x96, 0x49, 0x00, 0x87, /* 0x00-0x03 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x84, 0x3F, 0x3F, /* 0x04-0x07 */
-	0x00, 0x85, 0x00, 0x8A, 0x00, 0x8D, 0x3F, 0x3F, /* 0x08-0x0B */
-	0x3F, 0x3F, 0x00, 0x8B, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */
-	0x3F, 0x3F, 0x00, 0x89, 0x00, 0x83, 0x3F, 0x3F, /* 0x10-0x13 */
+	0xE5, 0x86, 0x3F, 0x3F, 0x96, 0x49, 0xE5, 0x87, /* 0x00-0x03 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE5, 0x84, 0x3F, 0x3F, /* 0x04-0x07 */
+	0xE5, 0x85, 0xE5, 0x8A, 0xE5, 0x8D, 0x3F, 0x3F, /* 0x08-0x0B */
+	0x3F, 0x3F, 0xE5, 0x8B, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */
+	0x3F, 0x3F, 0xE5, 0x89, 0xE5, 0x83, 0x3F, 0x3F, /* 0x10-0x13 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */
-	0x92, 0x77, 0x3F, 0x3F, 0x00, 0x94, 0x3F, 0x3F, /* 0x18-0x1B */
-	0x96, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */
+	0x92, 0x77, 0x3F, 0x3F, 0xE5, 0x94, 0x3F, 0x3F, /* 0x18-0x1B */
+	0x96, 0xA8, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */
-	0x3F, 0x3F, 0x00, 0x92, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */
-	0x3F, 0x3F, 0x00, 0x93, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */
+	0x3F, 0x3F, 0xE5, 0x92, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */
+	0x3F, 0x3F, 0xE5, 0x93, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */
-	0x00, 0x8E, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x90, /* 0x34-0x37 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x91, /* 0x38-0x3B */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x8F, /* 0x3C-0x3F */
+	0xE5, 0x8E, 0x3F, 0x3F, 0x3F, 0x3F, 0xE5, 0x90, /* 0x34-0x37 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE5, 0x91, /* 0x38-0x3B */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE5, 0x8F, /* 0x3C-0x3F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */
-	0x3F, 0x3F, 0x90, 0x00, 0x3F, 0x3F, 0x98, 0x58, /* 0x48-0x4B */
-	0x00, 0x98, 0x3F, 0x3F, 0x00, 0x99, 0x3F, 0x3F, /* 0x4C-0x4F */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x9F, /* 0x50-0x53 */
-	0x3F, 0x3F, 0x90, 0x49, 0x3F, 0x3F, 0x00, 0x9B, /* 0x54-0x57 */
-	0x3F, 0x3F, 0x00, 0x9E, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x96, /* 0x5C-0x5F */
-	0x00, 0x95, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0x60-0x63 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x89, 0x00, 0x3F, 0x3F, /* 0x64-0x67 */
-	0x00, 0x9C, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0x68-0x6B */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x9D, 0x3F, 0x3F, /* 0x6C-0x6F */
+	0x3F, 0x3F, 0x90, 0xE4, 0x3F, 0x3F, 0x98, 0x58, /* 0x48-0x4B */
+	0xE5, 0x98, 0x3F, 0x3F, 0xE5, 0x99, 0x3F, 0x3F, /* 0x4C-0x4F */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE5, 0x9F, /* 0x50-0x53 */
+	0x3F, 0x3F, 0x90, 0x49, 0x3F, 0x3F, 0xE5, 0x9B, /* 0x54-0x57 */
+	0x3F, 0x3F, 0xE5, 0x9E, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE5, 0x96, /* 0x5C-0x5F */
+	0xE5, 0x95, 0x3F, 0x3F, 0x3F, 0x3F, 0xE5, 0xA0, /* 0x60-0x63 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x89, 0xDA, 0x3F, 0x3F, /* 0x64-0x67 */
+	0xE5, 0x9C, 0x3F, 0x3F, 0xE5, 0xA1, 0x3F, 0x3F, /* 0x68-0x6B */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE5, 0x9D, 0x3F, 0x3F, /* 0x6C-0x6F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */
-	0x00, 0x9A, 0x3F, 0x3F, 0x92, 0x00, 0x3F, 0x3F, /* 0x74-0x77 */
-	0x00, 0x97, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */
+	0xE5, 0x9A, 0x3F, 0x3F, 0x92, 0xB1, 0x3F, 0x3F, /* 0x74-0x77 */
+	0xE5, 0x97, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x94, 0x88, /* 0x7C-0x7F */
 	
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0x80-0x83 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE5, 0xA5, 0x3F, 0x3F, /* 0x80-0x83 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x88-0x8B */
 	0x3F, 0x3F, 0x97, 0x5A, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0x9C-0x9F */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0xA0-0xA3 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE5, 0xA4, /* 0x9C-0x9F */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE5, 0xA3, 0x3F, 0x3F, /* 0xA0-0xA3 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0xA8-0xAB */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0xAC-0xAF */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0xB0-0xB3 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x97, 0x86, 0x00, 0x00, /* 0xB8-0xBB */
-	0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */
-	0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */
-	0x00, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, /* 0xC4-0xC7 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0xC8-0xCB */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE5, 0xAC, /* 0xA8-0xAB */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE5, 0xA6, /* 0xAC-0xAF */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE5, 0xAE, /* 0xB0-0xB3 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x97, 0x86, 0xE5, 0xB1, /* 0xB8-0xBB */
+	0x3F, 0x3F, 0xE5, 0xA8, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */
+	0xE5, 0xA9, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */
+	0xE5, 0xAD, 0x3F, 0x3F, 0xE5, 0xB0, 0xE5, 0xAF, /* 0xC4-0xC7 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE5, 0xA7, /* 0xC8-0xCB */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */
-	0x00, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0xD0-0xD3 */
+	0xE5, 0xAA, 0x3F, 0x3F, 0xE5, 0xBB, 0x3F, 0x3F, /* 0xD0-0xD3 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xDC-0xDF */
-	0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */
+	0xE5, 0xB4, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0xEC-0xEF */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0xF0-0xF3 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, /* 0xF4-0xF7 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE5, 0xB2, /* 0xEC-0xEF */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE5, 0xB3, 0x3F, 0x3F, /* 0xF0-0xF3 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE5, 0xB8, 0xE5, 0xB9, /* 0xF4-0xF7 */
 	0x3F, 0x3F, 0x8A, 0x49, 0x3F, 0x3F, 0x8B, 0x61, /* 0xF8-0xFB */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0xFC-0xFF */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE5, 0xB7, 0x3F, 0x3F, /* 0xFC-0xFF */
 };
 
 static unsigned char u2c_88[512] = {
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */
-	0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x00, /* 0x04-0x07 */
+	0x3F, 0x3F, 0xE5, 0xA2, 0x3F, 0x3F, 0xEE, 0x85, /* 0x04-0x07 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x08-0x0B */
-	0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x0C-0x0F */
-	0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */
-	0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, /* 0x14-0x17 */
+	0x3F, 0x3F, 0xE5, 0xB6, 0xE5, 0xBA, 0xE5, 0xB5, /* 0x0C-0x0F */
+	0x3F, 0x3F, 0xE5, 0xBC, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */
+	0x3F, 0x3F, 0xE5, 0xBE, 0xE5, 0xBD, 0x3F, 0x3F, /* 0x14-0x17 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x18-0x1B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */
-	0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x79, /* 0x20-0x23 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0x24-0x27 */
+	0x3F, 0x3F, 0xE5, 0xC0, 0xE5, 0xBF, 0xE5, 0x79, /* 0x20-0x23 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE5, 0xC4, /* 0x24-0x27 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */
-	0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0x34-0x37 */
-	0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x00, /* 0x38-0x3B */
+	0x3F, 0x3F, 0xE5, 0xC1, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE5, 0xC2, 0x3F, 0x3F, /* 0x34-0x37 */
+	0x3F, 0x3F, 0xE5, 0xC3, 0x3F, 0x3F, 0xE5, 0xC5, /* 0x38-0x3B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */
-	0x8C, 0x8C, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0x40-0x43 */
-	0x00, 0x00, 0x3F, 0x3F, 0x8F, 0x4F, 0x3F, 0x3F, /* 0x44-0x47 */
+	0x8C, 0x8C, 0x3F, 0x3F, 0xE5, 0xC7, 0x3F, 0x3F, /* 0x40-0x43 */
+	0xE5, 0xC6, 0x3F, 0x3F, 0x8F, 0x4F, 0x3F, 0x3F, /* 0x44-0x47 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */
-	0x8D, 0x73, 0x9F, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x4C-0x4F */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x8F, 0x70, /* 0x50-0x53 */
+	0x8D, 0x73, 0x9F, 0xA5, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x4C-0x4F */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE5, 0xC8, 0x8F, 0x70, /* 0x50-0x53 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x8A, 0x58, /* 0x54-0x57 */
-	0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, 0x89, 0x71, /* 0x58-0x5B */
-	0x3F, 0x3F, 0x8F, 0x00, 0x00, 0x00, 0x3F, 0x3F, /* 0x5C-0x5F */
-	0x3F, 0x3F, 0x8D, 0x74, 0x00, 0x00, 0x88, 0x00, /* 0x60-0x63 */
+	0x3F, 0x3F, 0xE5, 0xC9, 0x3F, 0x3F, 0x89, 0x71, /* 0x58-0x5B */
+	0x3F, 0x3F, 0x8F, 0xD5, 0xE5, 0xCA, 0x3F, 0x3F, /* 0x5C-0x5F */
+	0x3F, 0x3F, 0x8D, 0x74, 0xE5, 0xCB, 0x88, 0xDF, /* 0x60-0x63 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */
-	0x95, 0x5C, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0x68-0x6B */
+	0x95, 0x5C, 0x3F, 0x3F, 0x3F, 0x3F, 0xE5, 0xCC, /* 0x68-0x6B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */
-	0x90, 0x8A, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0x70-0x73 */
-	0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, 0x92, 0x8F, /* 0x74-0x77 */
+	0x90, 0x8A, 0x3F, 0x3F, 0xE5, 0xD3, 0x3F, 0x3F, /* 0x70-0x73 */
+	0x3F, 0x3F, 0xE5, 0xD0, 0x3F, 0x3F, 0x92, 0x8F, /* 0x74-0x77 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */
-	0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x8B, 0x00, /* 0x7C-0x7F */
+	0x3F, 0x3F, 0xE5, 0xD1, 0xE5, 0xCE, 0x8B, 0xDC, /* 0x7C-0x7F */
 	
-	0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, /* 0x80-0x83 */
+	0x3F, 0x3F, 0xE5, 0xCD, 0xE5, 0xD4, 0x3F, 0x3F, /* 0x80-0x83 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */
-	0x8C, 0x55, 0x3F, 0x3F, 0x3F, 0x3F, 0x91, 0x00, /* 0x88-0x8B */
-	0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0x90-0x93 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x91, 0x00, 0x00, 0x00, /* 0x94-0x97 */
-	0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0x9C-0x9F */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0xA0-0xA3 */
-	0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x94, 0x00, /* 0xA8-0xAB */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0xAC-0xAF */
-	0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB0-0xB3 */
-	0x8C, 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x88, 0x00, /* 0xB4-0xB7 */
+	0x8C, 0x55, 0x3F, 0x3F, 0x3F, 0x3F, 0x91, 0xDC, /* 0x88-0x8B */
+	0x3F, 0x3F, 0xE5, 0xDA, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE5, 0xD6, 0x3F, 0x3F, /* 0x90-0x93 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x91, 0xB3, 0xE5, 0xD5, /* 0x94-0x97 */
+	0x3F, 0x3F, 0xE5, 0xD8, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE5, 0xCF, 0x3F, 0x3F, /* 0x9C-0x9F */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE5, 0xD9, 0x3F, 0x3F, /* 0xA0-0xA3 */
+	0xE5, 0xDB, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x94, 0xED, /* 0xA8-0xAB */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE5, 0xD7, 0x3F, 0x3F, /* 0xAC-0xAF */
+	0xE5, 0xDC, 0xE5, 0xDE, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB0-0xB3 */
+	0x8C, 0xD1, 0xE5, 0xD2, 0x3F, 0x3F, 0x88, 0xBF, /* 0xB4-0xB7 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0xBC-0xBF */
-	0x3F, 0x3F, 0x8D, 0x00, 0x97, 0x00, 0x00, 0x00, /* 0xC0-0xC3 */
-	0x00, 0x00, 0x91, 0x95, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC4-0xC7 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE5, 0xDD, /* 0xBC-0xBF */
+	0x3F, 0x3F, 0x8D, 0xD9, 0x97, 0xF4, 0xE5, 0xDF, /* 0xC0-0xC3 */
+	0xE5, 0xE0, 0x91, 0x95, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC4-0xC7 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC8-0xCB */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x97, 0x00, /* 0xCC-0xCF */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x97, 0xA0, /* 0xCC-0xCF */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */
-	0x00, 0x00, 0x97, 0x54, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */
-	0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */
-	0x95, 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x8D, 0x00, /* 0xDC-0xDF */
-	0x3F, 0x3F, 0x97, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */
+	0xE5, 0xE1, 0x97, 0x54, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */
+	0xE5, 0xE2, 0xE5, 0xE3, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */
+	0x95, 0xE2, 0xE5, 0xE4, 0x3F, 0x3F, 0x8D, 0xBE, /* 0xDC-0xDF */
+	0x3F, 0x3F, 0x97, 0xA1, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */
-	0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */
+	0xE5, 0xE9, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x8F, 0x00, /* 0xF0-0xF3 */
-	0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */
-	0x97, 0x87, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF8-0xFB */
-	0x00, 0x00, 0x90, 0x00, 0x90, 0x9E, 0x3F, 0x3F, /* 0xFC-0xFF */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE5, 0xEA, 0x8F, 0xD6, /* 0xF0-0xF3 */
+	0xE5, 0xE8, 0xEE, 0x86, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */
+	0x97, 0x87, 0xE5, 0xE5, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF8-0xFB */
+	0xE5, 0xE7, 0x90, 0xBB, 0x90, 0x9E, 0x3F, 0x3F, /* 0xFC-0xFF */
 };
 
 static unsigned char u2c_89[512] = {
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0x00-0x03 */
-	0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x95, 0x00, /* 0x04-0x07 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0x08-0x0B */
-	0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */
-	0x8A, 0x8C, 0x3F, 0x3F, 0x96, 0x4A, 0x00, 0x00, /* 0x10-0x13 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE5, 0xE6, 0x3F, 0x3F, /* 0x00-0x03 */
+	0xE5, 0xEB, 0x3F, 0x3F, 0x3F, 0x3F, 0x95, 0xA1, /* 0x04-0x07 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE5, 0xED, 0x3F, 0x3F, /* 0x08-0x0B */
+	0xE5, 0xEC, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */
+	0x8A, 0x8C, 0x3F, 0x3F, 0x96, 0x4A, 0xE5, 0xEE, /* 0x10-0x13 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x18-0x1B */
-	0x00, 0x5D, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, /* 0x1C-0x1F */
+	0xED, 0x41, 0xE5, 0xFA, 0xE5, 0xF0, 0x3F, 0x3F, /* 0x1C-0x1F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */
-	0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2B */
+	0x3F, 0x3F, 0xE5, 0xF1, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE5, 0xF2, 0xE5, 0xF3, /* 0x28-0x2B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0x34-0x37 */
-	0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0x38-0x3B */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE5, 0xF7, 0x3F, 0x3F, /* 0x34-0x37 */
+	0xE5, 0xF8, 0x3F, 0x3F, 0x3F, 0x3F, 0xE5, 0xF6, /* 0x38-0x3B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */
-	0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x00, /* 0x40-0x43 */
-	0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */
+	0x3F, 0x3F, 0xE5, 0xF4, 0x3F, 0x3F, 0xE5, 0xEF, /* 0x40-0x43 */
+	0xE5, 0xF5, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */
-	0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x4C-0x4F */
+	0xE5, 0xF9, 0xE8, 0xB5, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x4C-0x4F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x89, 0x00, 0x3F, 0x3F, /* 0x54-0x57 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x89, 0xA6, 0x3F, 0x3F, /* 0x54-0x57 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x8B, 0x00, /* 0x5C-0x5F */
-	0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x60-0x63 */
-	0x00, 0x41, 0x3F, 0x3F, 0x00, 0x40, 0x3F, 0x3F, /* 0x64-0x67 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x43, 0x3F, 0x3F, /* 0x68-0x6B */
-	0x3F, 0x3F, 0x00, 0x42, 0x3F, 0x3F, 0x00, 0x44, /* 0x6C-0x6F */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE5, 0xFC, 0x8B, 0xDD, /* 0x5C-0x5F */
+	0xE5, 0xFB, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x60-0x63 */
+	0xE6, 0x41, 0x3F, 0x3F, 0xE6, 0x40, 0x3F, 0x3F, /* 0x64-0x67 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE6, 0x43, 0x3F, 0x3F, /* 0x68-0x6B */
+	0x3F, 0x3F, 0xE6, 0x42, 0x3F, 0x3F, 0xE6, 0x44, /* 0x6C-0x6F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x8F, 0x50, 0x3F, 0x3F, /* 0x70-0x73 */
-	0x00, 0x45, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x46, /* 0x74-0x77 */
+	0xE6, 0x45, 0x3F, 0x3F, 0x3F, 0x3F, 0xE6, 0x46, /* 0x74-0x77 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x47, 0x90, 0x00, /* 0x7C-0x7F */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE6, 0x47, 0x90, 0xBC, /* 0x7C-0x7F */
 	
-	0x3F, 0x3F, 0x97, 0x76, 0x3F, 0x3F, 0x00, 0x48, /* 0x80-0x83 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x95, 0x00, 0x94, 0x65, /* 0x84-0x87 */
-	0x00, 0x49, 0x3F, 0x3F, 0x00, 0x4A, 0x8C, 0x00, /* 0x88-0x8B */
+	0x3F, 0x3F, 0x97, 0x76, 0x3F, 0x3F, 0xE6, 0x48, /* 0x80-0x83 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x95, 0xA2, 0x94, 0x65, /* 0x84-0x87 */
+	0xE6, 0x49, 0x3F, 0x3F, 0xE6, 0x4A, 0x8C, 0xA9, /* 0x88-0x8B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x8B, 0x4B, /* 0x8C-0x8F */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x4B, /* 0x90-0x93 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE6, 0x4B, /* 0x90-0x93 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x8E, 0x8B, 0x94, 0x60, /* 0x94-0x97 */
-	0x00, 0x4C, 0x3F, 0x3F, 0x8A, 0x6F, 0x3F, 0x3F, /* 0x98-0x9B */
+	0xE6, 0x4C, 0x3F, 0x3F, 0x8A, 0x6F, 0x3F, 0x3F, /* 0x98-0x9B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */
-	0x3F, 0x3F, 0x00, 0x4D, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x4F, 0x97, 0x97, /* 0xA4-0xA7 */
-	0x3F, 0x3F, 0x00, 0x4E, 0x90, 0x65, 0x3F, 0x3F, /* 0xA8-0xAB */
-	0x00, 0x50, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x51, /* 0xAC-0xAF */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x52, 0x8A, 0x00, /* 0xB0-0xB3 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x53, 0x3F, 0x3F, /* 0xB8-0xBB */
-	0x3F, 0x3F, 0x00, 0x54, 0x3F, 0x3F, 0x00, 0x55, /* 0xBC-0xBF */
-	0x00, 0x56, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */
+	0x3F, 0x3F, 0xE6, 0x4D, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE6, 0x4F, 0x97, 0x97, /* 0xA4-0xA7 */
+	0x3F, 0x3F, 0xE6, 0x4E, 0x90, 0x65, 0x3F, 0x3F, /* 0xA8-0xAB */
+	0xE6, 0x50, 0x3F, 0x3F, 0x3F, 0x3F, 0xE6, 0x51, /* 0xAC-0xAF */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE6, 0x52, 0x8A, 0xCF, /* 0xB0-0xB3 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE6, 0x53, 0x3F, 0x3F, /* 0xB8-0xBB */
+	0x3F, 0x3F, 0xE6, 0x54, 0x3F, 0x3F, 0xE6, 0x55, /* 0xBC-0xBF */
+	0xE6, 0x56, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC4-0xC7 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC8-0xCB */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x8A, 0x70, 0x3F, 0x3F, /* 0xD0-0xD3 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x57, 0x3F, 0x3F, /* 0xD8-0xDB */
-	0x00, 0x58, 0x00, 0x59, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xDC-0xDF */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x89, 0x00, /* 0xE0-0xE3 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x90, 0x47, 0x00, 0x5A, /* 0xE4-0xE7 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE6, 0x57, 0x3F, 0x3F, /* 0xD8-0xDB */
+	0xE6, 0x58, 0xE6, 0x59, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xDC-0xDF */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x89, 0xF0, /* 0xE0-0xE3 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x90, 0x47, 0xE6, 0x5A, /* 0xE4-0xE7 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */
-	0x00, 0x5B, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */
-	0x00, 0x5C, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF8-0xFB */
+	0xE6, 0x5B, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */
+	0xE6, 0x5C, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF8-0xFB */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */
 };
 
 static unsigned char u2c_8A[512] = {
-	0x8C, 0x00, 0x3F, 0x3F, 0x92, 0x00, 0x00, 0x5D, /* 0x00-0x03 */
+	0x8C, 0xBE, 0x3F, 0x3F, 0x92, 0xF9, 0xE6, 0x5D, /* 0x00-0x03 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x04-0x07 */
 	0x8C, 0x76, 0x3F, 0x3F, 0x90, 0x75, 0x3F, 0x3F, /* 0x08-0x0B */
-	0x00, 0x60, 0x3F, 0x3F, 0x93, 0x00, 0x3F, 0x3F, /* 0x0C-0x0F */
-	0x00, 0x5F, 0x3F, 0x3F, 0x00, 0x00, 0x8C, 0x50, /* 0x10-0x13 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x5E, 0x91, 0x00, /* 0x14-0x17 */
-	0x8B, 0x4C, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x61, /* 0x18-0x1B */
-	0x3F, 0x3F, 0x00, 0x62, 0x3F, 0x3F, 0x8F, 0x00, /* 0x1C-0x1F */
+	0xE6, 0x60, 0x3F, 0x3F, 0x93, 0xA2, 0x3F, 0x3F, /* 0x0C-0x0F */
+	0xE6, 0x5F, 0x3F, 0x3F, 0xEE, 0x87, 0x8C, 0x50, /* 0x10-0x13 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE6, 0x5E, 0x91, 0xF5, /* 0x14-0x17 */
+	0x8B, 0x4C, 0x3F, 0x3F, 0x3F, 0x3F, 0xE6, 0x61, /* 0x18-0x1B */
+	0x3F, 0x3F, 0xE6, 0x62, 0x3F, 0x3F, 0x8F, 0xD7, /* 0x1C-0x1F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x8C, 0x8D, /* 0x20-0x23 */
-	0x3F, 0x3F, 0x00, 0x63, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */
+	0x3F, 0x3F, 0xE6, 0x63, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x96, 0x4B, 0x3F, 0x3F, /* 0x28-0x2B */
-	0x3F, 0x3F, 0x90, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */
-	0x3F, 0x3F, 0x8B, 0x96, 0x3F, 0x3F, 0x96, 0x00, /* 0x30-0x33 */
-	0x91, 0x69, 0x3F, 0x3F, 0x00, 0x64, 0x00, 0x00, /* 0x34-0x37 */
+	0x3F, 0x3F, 0x90, 0xDD, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */
+	0x3F, 0x3F, 0x8B, 0x96, 0x3F, 0x3F, 0x96, 0xF3, /* 0x30-0x33 */
+	0x91, 0x69, 0x3F, 0x3F, 0xE6, 0x64, 0xEE, 0x88, /* 0x34-0x37 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x90, 0x66, 0x92, 0x90, /* 0x38-0x3B */
-	0x8F, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */
-	0x3F, 0x3F, 0x00, 0x65, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x68, 0x3F, 0x3F, /* 0x44-0x47 */
-	0x00, 0x69, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */
+	0x8F, 0xD8, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */
+	0x3F, 0x3F, 0xE6, 0x65, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE6, 0x68, 0x3F, 0x3F, /* 0x44-0x47 */
+	0xE6, 0x69, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x4C-0x4F */
-	0x8D, 0x00, 0x91, 0x00, 0x00, 0x67, 0x3F, 0x3F, /* 0x50-0x53 */
-	0x8F, 0x00, 0x95, 0x5D, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x66, /* 0x58-0x5B */
+	0x8D, 0xBC, 0x91, 0xC0, 0xE6, 0x67, 0x3F, 0x3F, /* 0x50-0x53 */
+	0x8F, 0xD9, 0x95, 0x5D, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE6, 0x66, /* 0x58-0x5B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x8E, 0x8C, 0x3F, 0x3F, /* 0x5C-0x5F */
-	0x89, 0x72, 0x3F, 0x3F, 0x00, 0x6D, 0x8C, 0x77, /* 0x60-0x63 */
+	0x89, 0x72, 0x3F, 0x3F, 0xE6, 0x6D, 0x8C, 0x77, /* 0x60-0x63 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x8E, 0x8E, 0x3F, 0x3F, /* 0x64-0x67 */
 	0x3F, 0x3F, 0x8E, 0x8D, 0x3F, 0x3F, 0x98, 0x6C, /* 0x68-0x6B */
-	0x00, 0x6C, 0x00, 0x6B, 0x91, 0x46, 0x3F, 0x3F, /* 0x6C-0x6F */
-	0x8B, 0x6C, 0x98, 0x62, 0x8A, 0x59, 0x8F, 0x00, /* 0x70-0x73 */
+	0xE6, 0x6C, 0xE6, 0x6B, 0x91, 0x46, 0x3F, 0x3F, /* 0x6C-0x6F */
+	0x8B, 0x6C, 0x98, 0x62, 0x8A, 0x59, 0x8F, 0xDA, /* 0x70-0x73 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x74-0x77 */
-	0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */
-	0x00, 0x6A, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */
+	0x3F, 0x3F, 0xEE, 0x89, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */
+	0xE6, 0x6A, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */
 	
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x6F, 0x3F, 0x3F, /* 0x80-0x83 */
-	0x00, 0x70, 0x00, 0x6E, 0x3F, 0x3F, 0x8C, 0x00, /* 0x84-0x87 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE6, 0x6F, 0x3F, 0x3F, /* 0x80-0x83 */
+	0xE6, 0x70, 0xE6, 0x6E, 0x3F, 0x3F, 0x8C, 0xD6, /* 0x84-0x87 */
 	0x3F, 0x3F, 0x97, 0x5F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x88-0x8B */
 	0x8E, 0x8F, 0x94, 0x46, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */
-	0x3F, 0x3F, 0x00, 0x73, 0x3F, 0x3F, 0x90, 0x00, /* 0x90-0x93 */
+	0x3F, 0x3F, 0xE6, 0x73, 0x3F, 0x3F, 0x90, 0xBE, /* 0x90-0x93 */
 	0x3F, 0x3F, 0x92, 0x61, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */
-	0x97, 0x55, 0x3F, 0x3F, 0x00, 0x76, 0x3F, 0x3F, /* 0x98-0x9B */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x8C, 0x00, 0x3F, 0x3F, /* 0x9C-0x9F */
-	0x90, 0x00, 0x00, 0x72, 0x3F, 0x3F, 0x00, 0x77, /* 0xA0-0xA3 */
-	0x8C, 0x00, 0x00, 0x74, 0x00, 0x75, 0x00, 0x00, /* 0xA4-0xA7 */
-	0x00, 0x71, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */
-	0x90, 0x00, 0x93, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */
-	0x92, 0x4E, 0x3F, 0x3F, 0x89, 0x00, 0x3F, 0x3F, /* 0xB0-0xB3 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */
-	0x3F, 0x3F, 0x94, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */
-	0x8B, 0x62, 0x3F, 0x3F, 0x00, 0x00, 0x92, 0x00, /* 0xBC-0xBF */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x7A, 0x3F, 0x3F, /* 0xC0-0xC3 */
-	0x00, 0x78, 0x3F, 0x3F, 0x3F, 0x3F, 0x92, 0x6B, /* 0xC4-0xC7 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x90, 0x00, /* 0xC8-0xCB */
-	0x8A, 0x00, 0x00, 0x79, 0x3F, 0x3F, 0x90, 0x7A, /* 0xCC-0xCF */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x97, 0x00, 0x3F, 0x3F, /* 0xD0-0xD3 */
+	0x97, 0x55, 0x3F, 0x3F, 0xE6, 0x76, 0x3F, 0x3F, /* 0x98-0x9B */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x8C, 0xEA, 0x3F, 0x3F, /* 0x9C-0x9F */
+	0x90, 0xBD, 0xE6, 0x72, 0x3F, 0x3F, 0xE6, 0x77, /* 0xA0-0xA3 */
+	0x8C, 0xEB, 0xE6, 0x74, 0xE6, 0x75, 0xEE, 0x8A, /* 0xA4-0xA7 */
+	0xE6, 0x71, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */
+	0x90, 0xE0, 0x93, 0xC7, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */
+	0x92, 0x4E, 0x3F, 0x3F, 0x89, 0xDB, 0x3F, 0x3F, /* 0xB0-0xB3 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */
+	0x3F, 0x3F, 0x94, 0xEE, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */
+	0x8B, 0x62, 0x3F, 0x3F, 0xEE, 0x8B, 0x92, 0xB2, /* 0xBC-0xBF */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE6, 0x7A, 0x3F, 0x3F, /* 0xC0-0xC3 */
+	0xE6, 0x78, 0x3F, 0x3F, 0x3F, 0x3F, 0x92, 0x6B, /* 0xC4-0xC7 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x90, 0xBF, /* 0xC8-0xCB */
+	0x8A, 0xD0, 0xE6, 0x79, 0x3F, 0x3F, 0x90, 0x7A, /* 0xCC-0xCF */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x97, 0xC8, 0x3F, 0x3F, /* 0xD0-0xD3 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x98, 0x5F, 0x3F, 0x3F, /* 0xD4-0xD7 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x7B, 0x00, 0x87, /* 0xD8-0xDB */
-	0x92, 0x00, 0x3F, 0x3F, 0x00, 0x86, 0x00, 0x00, /* 0xDC-0xDF */
-	0x00, 0x83, 0x00, 0x8B, 0x00, 0x84, 0x3F, 0x3F, /* 0xE0-0xE3 */
-	0x00, 0x80, 0x3F, 0x3F, 0x92, 0x00, 0x00, 0x7E, /* 0xE4-0xE7 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x7C, /* 0xE8-0xEB */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE6, 0x7B, 0xE6, 0x87, /* 0xD8-0xDB */
+	0x92, 0xB3, 0x3F, 0x3F, 0xE6, 0x86, 0xEE, 0x8C, /* 0xDC-0xDF */
+	0xE6, 0x83, 0xE6, 0x8B, 0xE6, 0x84, 0x3F, 0x3F, /* 0xE0-0xE3 */
+	0xE6, 0x80, 0x3F, 0x3F, 0x92, 0xFA, 0xE6, 0x7E, /* 0xE4-0xE7 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE6, 0x7C, /* 0xE8-0xEB */
 	0x3F, 0x3F, 0x97, 0x40, 0x8E, 0x90, 0x3F, 0x3F, /* 0xEC-0xEF */
-	0x3F, 0x3F, 0x00, 0x81, 0x3F, 0x3F, 0x00, 0x7D, /* 0xF0-0xF3 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x85, /* 0xF4-0xF7 */
-	0x8F, 0x94, 0x3F, 0x3F, 0x8C, 0x00, 0x3F, 0x3F, /* 0xF8-0xFB */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x91, 0x00, 0x3F, 0x3F, /* 0xFC-0xFF */
+	0x3F, 0x3F, 0xE6, 0x81, 0x3F, 0x3F, 0xE6, 0x7D, /* 0xF0-0xF3 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xEE, 0x8E, 0xE6, 0x85, /* 0xF4-0xF7 */
+	0x8F, 0x94, 0x3F, 0x3F, 0x8C, 0xBF, 0x3F, 0x3F, /* 0xF8-0xFB */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x91, 0xF8, 0x3F, 0x3F, /* 0xFC-0xFF */
 };
 
 static unsigned char u2c_8B[512] = {
-	0x96, 0x64, 0x89, 0x79, 0x88, 0x00, 0x3F, 0x3F, /* 0x00-0x03 */
-	0x93, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x89, /* 0x04-0x07 */
+	0x96, 0x64, 0x89, 0x79, 0x88, 0xE0, 0x3F, 0x3F, /* 0x00-0x03 */
+	0x93, 0xA3, 0x3F, 0x3F, 0x3F, 0x3F, 0xE6, 0x89, /* 0x04-0x07 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x08-0x0B */
-	0x00, 0x88, 0x3F, 0x3F, 0x93, 0x00, 0x3F, 0x3F, /* 0x0C-0x0F */
-	0x00, 0x8D, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */
-	0x00, 0x82, 0x3F, 0x3F, 0x00, 0x8C, 0x00, 0x8E, /* 0x14-0x17 */
-	0x3F, 0x3F, 0x8C, 0x00, 0x00, 0x8A, 0x8D, 0x75, /* 0x18-0x1B */
-	0x3F, 0x3F, 0x8E, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */
-	0x00, 0x8F, 0x97, 0x77, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x92, 0x3F, 0x3F, /* 0x24-0x27 */
-	0x00, 0x95, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x93, /* 0x28-0x2B */
+	0xE6, 0x88, 0x3F, 0x3F, 0x93, 0xE4, 0x3F, 0x3F, /* 0x0C-0x0F */
+	0xE6, 0x8D, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */
+	0xE6, 0x82, 0x3F, 0x3F, 0xE6, 0x8C, 0xE6, 0x8E, /* 0x14-0x17 */
+	0x3F, 0x3F, 0x8C, 0xAA, 0xE6, 0x8A, 0x8D, 0x75, /* 0x18-0x1B */
+	0x3F, 0x3F, 0x8E, 0xD3, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */
+	0xE6, 0x8F, 0x97, 0x77, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE6, 0x92, 0x3F, 0x3F, /* 0x24-0x27 */
+	0xE6, 0x95, 0x3F, 0x3F, 0x3F, 0x3F, 0xE6, 0x93, /* 0x28-0x2B */
 	0x95, 0x54, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x90, /* 0x30-0x33 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE6, 0x90, /* 0x30-0x33 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */
-	0x3F, 0x3F, 0x8B, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x38-0x3B */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x94, 0x3F, 0x3F, /* 0x3C-0x3F */
-	0x3F, 0x3F, 0x00, 0x96, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */
+	0x3F, 0x3F, 0x8B, 0xDE, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x38-0x3B */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE6, 0x94, 0x3F, 0x3F, /* 0x3C-0x3F */
+	0x3F, 0x3F, 0xE6, 0x96, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */
-	0x3F, 0x3F, 0x00, 0x9A, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */
-	0x00, 0x97, 0x3F, 0x3F, 0x00, 0x99, 0x00, 0x98, /* 0x4C-0x4F */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0x50-0x53 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x9B, 0x3F, 0x3F, /* 0x54-0x57 */
-	0x8E, 0x00, 0x3F, 0x3F, 0x00, 0x9D, 0x00, 0x9C, /* 0x58-0x5B */
-	0x95, 0x88, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x9F, /* 0x5C-0x5F */
+	0x3F, 0x3F, 0xE6, 0x9A, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */
+	0xE6, 0x97, 0x3F, 0x3F, 0xE6, 0x99, 0xE6, 0x98, /* 0x4C-0x4F */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xEE, 0x8F, /* 0x50-0x53 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE6, 0x9B, 0x3F, 0x3F, /* 0x54-0x57 */
+	0x8E, 0xAF, 0x3F, 0x3F, 0xE6, 0x9D, 0xE6, 0x9C, /* 0x58-0x5B */
+	0x95, 0x88, 0x3F, 0x3F, 0x3F, 0x3F, 0xE6, 0x9F, /* 0x5C-0x5F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x60-0x63 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x8C, 0x78, 0x3F, 0x3F, /* 0x64-0x67 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x9E, /* 0x68-0x6B */
-	0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0x6C-0x6F */
-	0x8B, 0x63, 0x00, 0x00, 0x8F, 0x00, 0x3F, 0x3F, /* 0x70-0x73 */
-	0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x8C, 0x00, /* 0x74-0x77 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE6, 0x9E, /* 0x68-0x6B */
+	0xE6, 0xA0, 0x3F, 0x3F, 0x3F, 0x3F, 0xE6, 0xA1, /* 0x6C-0x6F */
+	0x8B, 0x63, 0xE3, 0xBF, 0x8F, 0xF7, 0x3F, 0x3F, /* 0x70-0x73 */
+	0xE6, 0xA2, 0x3F, 0x3F, 0x3F, 0x3F, 0x8C, 0xEC, /* 0x74-0x77 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */
-	0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x00, /* 0x7C-0x7F */
+	0x3F, 0x3F, 0xE6, 0xA3, 0x3F, 0x3F, 0xEE, 0x90, /* 0x7C-0x7F */
 	
-	0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x8E, 0x5D, /* 0x80-0x83 */
+	0xE6, 0xA4, 0x3F, 0x3F, 0x3F, 0x3F, 0x8E, 0x5D, /* 0x80-0x83 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x9D, 0x00, 0x3F, 0x3F, /* 0x88-0x8B */
-	0x00, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0x8C-0x8F */
-	0x8F, 0x51, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x93 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0x94-0x97 */
-	0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, /* 0x98-0x9B */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x9D, 0xCC, 0x3F, 0x3F, /* 0x88-0x8B */
+	0xE6, 0xA5, 0x3F, 0x3F, 0xE6, 0xA6, 0x3F, 0x3F, /* 0x8C-0x8F */
+	0x8F, 0x51, 0x3F, 0x3F, 0xE6, 0xA7, 0xE6, 0xA8, /* 0x90-0x93 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE6, 0xA9, 0x3F, 0x3F, /* 0x94-0x97 */
+	0x3F, 0x3F, 0xE6, 0xAA, 0xE6, 0xAB, 0x3F, 0x3F, /* 0x98-0x9B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */
@@ -8153,66 +8155,66 @@
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x92, 0x4A, /* 0x34-0x37 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0x38-0x3B */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0x3C-0x3F */
-	0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x93, 0x00, 0x3F, 0x3F, /* 0x44-0x47 */
-	0x00, 0x00, 0x3F, 0x3F, 0x96, 0x4C, 0x3F, 0x3F, /* 0x48-0x4B */
-	0x00, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0x4C-0x4F */
-	0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */
-	0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x93, 0x00, 0x3F, 0x3F, /* 0x58-0x5B */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE6, 0xAC, 0x3F, 0x3F, /* 0x38-0x3B */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE6, 0xAE, /* 0x3C-0x3F */
+	0x3F, 0x3F, 0xE6, 0xAD, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x93, 0xA4, 0x3F, 0x3F, /* 0x44-0x47 */
+	0xE6, 0xAF, 0x3F, 0x3F, 0x96, 0x4C, 0x3F, 0x3F, /* 0x48-0x4B */
+	0xE6, 0xB0, 0x3F, 0x3F, 0xE6, 0xB1, 0x3F, 0x3F, /* 0x4C-0x4F */
+	0xE6, 0xB2, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */
+	0x3F, 0x3F, 0xE6, 0xB3, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x93, 0xD8, 0x3F, 0x3F, /* 0x58-0x5B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x5C-0x5F */
-	0x3F, 0x3F, 0x8F, 0x00, 0x00, 0x00, 0x3F, 0x3F, /* 0x60-0x63 */
+	0x3F, 0x3F, 0x8F, 0xDB, 0xE6, 0xB4, 0x3F, 0x3F, /* 0x60-0x63 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x8D, 0x8B, 0x98, 0x00, /* 0x68-0x6B */
-	0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x8D, 0x8B, 0x98, 0xAC, /* 0x68-0x6B */
+	0xE6, 0xB5, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x74-0x77 */
-	0x00, 0x00, 0x95, 0x5E, 0x00, 0x00, 0x3F, 0x3F, /* 0x78-0x7B */
-	0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */
+	0xE6, 0xB6, 0x95, 0x5E, 0xE6, 0xB7, 0x3F, 0x3F, /* 0x78-0x7B */
+	0xE6, 0xBF, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */
 	
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0x80-0x83 */
-	0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */
-	0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, /* 0x88-0x8B */
-	0x96, 0x65, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, /* 0x8C-0x8F */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE6, 0xB8, 0x3F, 0x3F, /* 0x80-0x83 */
+	0x3F, 0x3F, 0xE6, 0xBA, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */
+	0x3F, 0x3F, 0xE6, 0xB9, 0xE6, 0xBB, 0x3F, 0x3F, /* 0x88-0x8B */
+	0x96, 0x65, 0xE6, 0xBC, 0xE6, 0xBD, 0x3F, 0x3F, /* 0x8C-0x8F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */
-	0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */
-	0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */
-	0x3F, 0x3F, 0x8A, 0x4C, 0x92, 0x00, 0x3F, 0x3F, /* 0x9C-0x9F */
-	0x95, 0x89, 0x8D, 0x00, 0x8D, 0x76, 0x3F, 0x3F, /* 0xA0-0xA3 */
+	0xE6, 0xBE, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */
+	0xE6, 0xC0, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */
+	0x3F, 0x3F, 0x8A, 0x4C, 0x92, 0xE5, 0x3F, 0x3F, /* 0x9C-0x9F */
+	0x95, 0x89, 0x8D, 0xE0, 0x8D, 0x76, 0x3F, 0x3F, /* 0xA0-0xA3 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x95, 0x6E, /* 0xA4-0xA7 */
-	0x89, 0x00, 0x94, 0x00, 0x00, 0x00, 0x8A, 0x00, /* 0xA8-0xAB */
-	0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x92, 0x99, /* 0xAC-0xAF */
-	0x96, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, /* 0xB0-0xB3 */
-	0x8B, 0x4D, 0x3F, 0x3F, 0x00, 0x00, 0x94, 0x83, /* 0xB4-0xB7 */
-	0x91, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x94, 0x00, /* 0xB8-0xBB */
-	0x93, 0x5C, 0x00, 0x00, 0x3F, 0x3F, 0x96, 0x66, /* 0xBC-0xBF */
-	0x89, 0x00, 0x00, 0x00, 0x98, 0x47, 0x92, 0x00, /* 0xC0-0xC3 */
+	0x89, 0xDD, 0x94, 0xCC, 0xE6, 0xC3, 0x8A, 0xD1, /* 0xA8-0xAB */
+	0x90, 0xD3, 0xE6, 0xC2, 0xE6, 0xC7, 0x92, 0x99, /* 0xAC-0xAF */
+	0x96, 0xE1, 0x3F, 0x3F, 0xE6, 0xC5, 0xE6, 0xC6, /* 0xB0-0xB3 */
+	0x8B, 0x4D, 0x3F, 0x3F, 0xE6, 0xC8, 0x94, 0x83, /* 0xB4-0xB7 */
+	0x91, 0xDD, 0x3F, 0x3F, 0x3F, 0x3F, 0x94, 0xEF, /* 0xB8-0xBB */
+	0x93, 0x5C, 0xE6, 0xC4, 0x3F, 0x3F, 0x96, 0x66, /* 0xBC-0xBF */
+	0x89, 0xEA, 0xE6, 0xCA, 0x98, 0x47, 0x92, 0xC0, /* 0xC0-0xC3 */
 	0x98, 0x64, 0x3F, 0x3F, 0x3F, 0x3F, 0x8E, 0x91, /* 0xC4-0xC7 */
-	0x00, 0x00, 0x3F, 0x3F, 0x91, 0x00, 0x3F, 0x3F, /* 0xC8-0xCB */
-	0x3F, 0x3F, 0x00, 0x00, 0x91, 0x47, 0x3F, 0x3F, /* 0xCC-0xCF */
-	0x3F, 0x3F, 0x93, 0x00, 0x3F, 0x3F, 0x95, 0x6F, /* 0xD0-0xD3 */
+	0xE6, 0xC9, 0x3F, 0x3F, 0x91, 0xAF, 0x3F, 0x3F, /* 0xC8-0xCB */
+	0x3F, 0x3F, 0xE6, 0xDA, 0x91, 0x47, 0x3F, 0x3F, /* 0xCC-0xCF */
+	0x3F, 0x3F, 0x93, 0xF6, 0x3F, 0x3F, 0x95, 0x6F, /* 0xD0-0xD3 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x8E, 0x5E, /* 0xD8-0xDB */
-	0x8E, 0x92, 0x3F, 0x3F, 0x8F, 0x00, 0x3F, 0x3F, /* 0xDC-0xDF */
-	0x94, 0x85, 0x3F, 0x3F, 0x8C, 0x00, 0x00, 0x00, /* 0xE0-0xE3 */
-	0x00, 0x00, 0x3F, 0x3F, 0x95, 0x8A, 0x3F, 0x3F, /* 0xE4-0xE7 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x8E, 0x00, 0x3F, 0x3F, /* 0xE8-0xEB */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE6, 0xCD, 0x8E, 0x5E, /* 0xD8-0xDB */
+	0x8E, 0x92, 0x3F, 0x3F, 0x8F, 0xDC, 0x3F, 0x3F, /* 0xDC-0xDF */
+	0x94, 0x85, 0x3F, 0x3F, 0x8C, 0xAB, 0xE6, 0xCC, /* 0xE0-0xE3 */
+	0xE6, 0xCB, 0x3F, 0x3F, 0x95, 0x8A, 0x3F, 0x3F, /* 0xE4-0xE7 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x8E, 0xBF, 0x3F, 0x3F, /* 0xE8-0xEB */
 	0x3F, 0x3F, 0x93, 0x71, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */
-	0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */
-	0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, /* 0xF8-0xFB */
-	0x8D, 0x77, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */
+	0xEE, 0x91, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */
+	0xEE, 0x92, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE6, 0xCF, 0xE6, 0xD0, /* 0xF8-0xFB */
+	0x8D, 0x77, 0xE6, 0xCE, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */
 };
 
 static unsigned char u2c_8D[512] = {
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */
-	0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x00, /* 0x04-0x07 */
-	0x91, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x8A, 0x00, /* 0x08-0x0B */
-	0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x00, /* 0x0C-0x0F */
-	0x00, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, /* 0x10-0x13 */
-	0x00, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0x14-0x17 */
+	0xE6, 0xD1, 0xE6, 0xD2, 0x3F, 0x3F, 0xE6, 0xD4, /* 0x04-0x07 */
+	0x91, 0xA1, 0x3F, 0x3F, 0xE6, 0xD3, 0x8A, 0xE4, /* 0x08-0x0B */
+	0x3F, 0x3F, 0xE6, 0xD6, 0x3F, 0x3F, 0xE6, 0xD5, /* 0x0C-0x0F */
+	0xE6, 0xD7, 0x3F, 0x3F, 0xEE, 0x93, 0xE6, 0xD9, /* 0x10-0x13 */
+	0xE6, 0xDB, 0x3F, 0x3F, 0xE6, 0xDC, 0x3F, 0x3F, /* 0x14-0x17 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x18-0x1B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */
@@ -8232,143 +8234,143 @@
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x5C-0x5F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x60-0x63 */
-	0x90, 0x00, 0x3F, 0x3F, 0x8E, 0x00, 0x00, 0x00, /* 0x64-0x67 */
+	0x90, 0xD4, 0x3F, 0x3F, 0x8E, 0xCD, 0xE6, 0xDD, /* 0x64-0x67 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x8A, 0x71, /* 0x68-0x6B */
-	0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */
-	0x91, 0x96, 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x00, /* 0x70-0x73 */
-	0x95, 0x8B, 0x3F, 0x3F, 0x00, 0x00, 0x8B, 0x4E, /* 0x74-0x77 */
+	0x3F, 0x3F, 0xE6, 0xDE, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */
+	0x91, 0x96, 0xE6, 0xDF, 0x3F, 0x3F, 0xE6, 0xE0, /* 0x70-0x73 */
+	0x95, 0x8B, 0x3F, 0x3F, 0xEE, 0x94, 0x8B, 0x4E, /* 0x74-0x77 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */
 	
-	0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */
-	0x3F, 0x3F, 0x92, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */
+	0x3F, 0x3F, 0xE6, 0xE1, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */
+	0x3F, 0x3F, 0x92, 0xB4, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x89, 0x7A, 0x3F, 0x3F, /* 0x88-0x8B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */
-	0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */
+	0x3F, 0x3F, 0xE6, 0xE2, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x8E, 0x00, /* 0xA0-0xA3 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x8E, 0xEF, /* 0xA0-0xA3 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */
 	0x90, 0x96, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x91, 0x00, /* 0xB0-0xB3 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x91, 0xAB, /* 0xB0-0xB3 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0xB8-0xBB */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0xBC-0xBF */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0xC0-0xC3 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE6, 0xE5, 0x3F, 0x3F, /* 0xB8-0xBB */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE6, 0xE4, 0x3F, 0x3F, /* 0xBC-0xBF */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE6, 0xE3, 0x3F, 0x3F, /* 0xC0-0xC3 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC4-0xC7 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0xC8-0xCB */
-	0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0xCC-0xCF */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE6, 0xEB, /* 0xC8-0xCB */
+	0xE6, 0xE9, 0x3F, 0x3F, 0x3F, 0x3F, 0xE6, 0xE6, /* 0xCC-0xCF */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0xD4-0xD7 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, /* 0xD8-0xDB */
-	0x3F, 0x3F, 0x8B, 0x97, 0x3F, 0x3F, 0x00, 0x00, /* 0xDC-0xDF */
-	0x3F, 0x3F, 0x90, 0x00, 0x3F, 0x3F, 0x00, 0x00, /* 0xE0-0xE3 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE6, 0xE8, 0x3F, 0x3F, /* 0xD4-0xD7 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE6, 0xE7, 0xE6, 0xEA, /* 0xD8-0xDB */
+	0x3F, 0x3F, 0x8B, 0x97, 0x3F, 0x3F, 0xE6, 0xEE, /* 0xDC-0xDF */
+	0x3F, 0x3F, 0x90, 0xD5, 0x3F, 0x3F, 0xE6, 0xEF, /* 0xE0-0xE3 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */
-	0x8C, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, /* 0xE8-0xEB */
+	0x8C, 0xD7, 0x3F, 0x3F, 0xE6, 0xEC, 0xE6, 0xED, /* 0xE8-0xEB */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x98, 0x48, /* 0xEC-0xEF */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x92, 0x00, /* 0xF0-0xF3 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x92, 0xB5, /* 0xF0-0xF3 */
 	0x3F, 0x3F, 0x91, 0x48, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF8-0xFB */
-	0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0xFC-0xFF */
+	0xE6, 0xF0, 0x3F, 0x3F, 0x3F, 0x3F, 0xE6, 0xF3, /* 0xFC-0xFF */
 };
 
 static unsigned char u2c_8E[512] = {
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x04-0x07 */
-	0x00, 0x00, 0x00, 0x00, 0x97, 0x78, 0x3F, 0x3F, /* 0x08-0x0B */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x93, 0x00, /* 0x0C-0x0F */
-	0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */
+	0xE6, 0xF1, 0xE6, 0xF2, 0x97, 0x78, 0x3F, 0x3F, /* 0x08-0x0B */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x93, 0xA5, /* 0x0C-0x0F */
+	0xE6, 0xF6, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x18-0x1B */
-	0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1C-0x1F */
+	0x3F, 0x3F, 0xE6, 0xF4, 0xE6, 0xF5, 0xE6, 0xF7, /* 0x1C-0x1F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x48, 0x3F, 0x3F, /* 0x28-0x2B */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE7, 0x48, 0x3F, 0x3F, /* 0x28-0x2B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */
-	0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */
-	0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */
+	0xE6, 0xFA, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */
+	0xE6, 0xFB, 0xE6, 0xF9, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x38-0x3B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0x40-0x43 */
-	0x92, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x40, /* 0x44-0x47 */
-	0x00, 0x44, 0x00, 0x41, 0x00, 0x00, 0x3F, 0x3F, /* 0x48-0x4B */
-	0x00, 0x42, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x4C-0x4F */
-	0x00, 0x43, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */
-	0x3F, 0x3F, 0x00, 0x4A, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */
-	0x3F, 0x3F, 0x00, 0x45, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x90, 0x00, /* 0x5C-0x5F */
-	0x00, 0x47, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x49, /* 0x60-0x63 */
-	0x00, 0x46, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE6, 0xF8, 0x3F, 0x3F, /* 0x40-0x43 */
+	0x92, 0xFB, 0x3F, 0x3F, 0x3F, 0x3F, 0xE7, 0x40, /* 0x44-0x47 */
+	0xE7, 0x44, 0xE7, 0x41, 0xE6, 0xFC, 0x3F, 0x3F, /* 0x48-0x4B */
+	0xE7, 0x42, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x4C-0x4F */
+	0xE7, 0x43, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */
+	0x3F, 0x3F, 0xE7, 0x4A, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */
+	0x3F, 0x3F, 0xE7, 0x45, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x90, 0xD6, /* 0x5C-0x5F */
+	0xE7, 0x47, 0x3F, 0x3F, 0x3F, 0x3F, 0xE7, 0x49, /* 0x60-0x63 */
+	0xE7, 0x46, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x68-0x6B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x4C, 0x3F, 0x3F, /* 0x70-0x73 */
-	0x8F, 0x52, 0x3F, 0x3F, 0x00, 0x4B, 0x3F, 0x3F, /* 0x74-0x77 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE7, 0x4C, 0x3F, 0x3F, /* 0x70-0x73 */
+	0x8F, 0x52, 0x3F, 0x3F, 0xE7, 0x4B, 0x3F, 0x3F, /* 0x74-0x77 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */
-	0x00, 0x4D, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */
+	0xE7, 0x4D, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */
 	
-	0x3F, 0x3F, 0x00, 0x4E, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */
-	0x00, 0x51, 0x00, 0x50, 0x3F, 0x3F, 0x00, 0x4F, /* 0x84-0x87 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x53, 0x00, 0x52, /* 0x88-0x8B */
-	0x3F, 0x3F, 0x96, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */
-	0x3F, 0x3F, 0x00, 0x55, 0x3F, 0x3F, 0x00, 0x54, /* 0x90-0x93 */
-	0x00, 0x56, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */
-	0x3F, 0x3F, 0x00, 0x57, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */
+	0x3F, 0x3F, 0xE7, 0x4E, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */
+	0xE7, 0x51, 0xE7, 0x50, 0x3F, 0x3F, 0xE7, 0x4F, /* 0x84-0x87 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE7, 0x53, 0xE7, 0x52, /* 0x88-0x8B */
+	0x3F, 0x3F, 0x96, 0xF4, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */
+	0x3F, 0x3F, 0xE7, 0x55, 0x3F, 0x3F, 0xE7, 0x54, /* 0x90-0x93 */
+	0xE7, 0x56, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */
+	0x3F, 0x3F, 0xE7, 0x57, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */
-	0x3F, 0x3F, 0x00, 0x59, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */
+	0x3F, 0x3F, 0xE7, 0x59, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x58, 0x90, 0x67, /* 0xA8-0xAB */
-	0x00, 0x5A, 0x3F, 0x3F, 0x3F, 0x3F, 0x8B, 0x00, /* 0xAC-0xAF */
-	0x00, 0x5B, 0x00, 0x5D, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB0-0xB3 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE7, 0x58, 0x90, 0x67, /* 0xA8-0xAB */
+	0xE7, 0x5A, 0x3F, 0x3F, 0x3F, 0x3F, 0x8B, 0xEB, /* 0xAC-0xAF */
+	0xE7, 0x5B, 0xE7, 0x5D, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB0-0xB3 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x5E, 0x3F, 0x3F, /* 0xBC-0xBF */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE7, 0x5E, 0x3F, 0x3F, /* 0xBC-0xBF */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */
-	0x3F, 0x3F, 0x00, 0x5F, 0x00, 0x5C, 0x3F, 0x3F, /* 0xC4-0xC7 */
-	0x00, 0x60, 0x3F, 0x3F, 0x8E, 0x00, 0x00, 0x61, /* 0xC8-0xCB */
-	0x8B, 0x4F, 0x8C, 0x52, 0x3F, 0x3F, 0x00, 0x00, /* 0xCC-0xCF */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x8C, 0x00, 0x3F, 0x3F, /* 0xD0-0xD3 */
+	0x3F, 0x3F, 0xE7, 0x5F, 0xE7, 0x5C, 0x3F, 0x3F, /* 0xC4-0xC7 */
+	0xE7, 0x60, 0x3F, 0x3F, 0x8E, 0xD4, 0xE7, 0x61, /* 0xC8-0xCB */
+	0x8B, 0x4F, 0x8C, 0x52, 0x3F, 0x3F, 0xEE, 0x96, /* 0xCC-0xCF */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x8C, 0xAC, 0x3F, 0x3F, /* 0xD0-0xD3 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x62, /* 0xD8-0xDB */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x93, 0x00, /* 0xDC-0xDF */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x93, 0x5D, 0x00, 0x63, /* 0xE0-0xE3 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE7, 0x62, /* 0xD8-0xDB */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x93, 0xEE, /* 0xDC-0xDF */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x93, 0x5D, 0xE7, 0x63, /* 0xE0-0xE3 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x66, /* 0xE8-0xEB */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE7, 0x66, /* 0xE8-0xEB */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */
-	0x8E, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x65, /* 0xF8-0xFB */
-	0x00, 0x64, 0x8C, 0x79, 0x00, 0x67, 0x3F, 0x3F, /* 0xFC-0xFF */
+	0x8E, 0xB2, 0x3F, 0x3F, 0x3F, 0x3F, 0xE7, 0x65, /* 0xF8-0xFB */
+	0xE7, 0x64, 0x8C, 0x79, 0xE7, 0x67, 0x3F, 0x3F, /* 0xFC-0xFF */
 };
 
 static unsigned char u2c_8F[512] = {
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x8A, 0x72, /* 0x00-0x03 */
-	0x3F, 0x3F, 0x00, 0x69, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x04-0x07 */
-	0x3F, 0x3F, 0x8D, 0x00, 0x00, 0x68, 0x3F, 0x3F, /* 0x08-0x0B */
-	0x00, 0x71, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x6B, 0x00, 0x6D, /* 0x10-0x13 */
-	0x95, 0x00, 0x00, 0x6A, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */
-	0x3F, 0x3F, 0x00, 0x6C, 0x3F, 0x3F, 0x00, 0x70, /* 0x18-0x1B */
-	0x00, 0x6E, 0x8B, 0x50, 0x3F, 0x3F, 0x00, 0x6F, /* 0x1C-0x1F */
+	0x3F, 0x3F, 0xE7, 0x69, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x04-0x07 */
+	0x3F, 0x3F, 0x8D, 0xDA, 0xE7, 0x68, 0x3F, 0x3F, /* 0x08-0x0B */
+	0xE7, 0x71, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE7, 0x6B, 0xE7, 0x6D, /* 0x10-0x13 */
+	0x95, 0xE3, 0xE7, 0x6A, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */
+	0x3F, 0x3F, 0xE7, 0x6C, 0x3F, 0x3F, 0xE7, 0x70, /* 0x18-0x1B */
+	0xE7, 0x6E, 0x8B, 0x50, 0x3F, 0x3F, 0xE7, 0x6F, /* 0x1C-0x1F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x72, 0x3F, 0x3F, /* 0x24-0x27 */
-	0x3F, 0x3F, 0x94, 0x79, 0x97, 0x00, 0x3F, 0x3F, /* 0x28-0x2B */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE7, 0x72, 0x3F, 0x3F, /* 0x24-0x27 */
+	0x3F, 0x3F, 0x94, 0x79, 0x97, 0xD6, 0x3F, 0x3F, /* 0x28-0x2B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x8F, 0x53, /* 0x2C-0x2F */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x73, /* 0x30-0x33 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE7, 0x73, /* 0x30-0x33 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */
-	0x97, 0x41, 0x00, 0x75, 0x3F, 0x3F, 0x00, 0x74, /* 0x38-0x3B */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x78, 0x97, 0x60, /* 0x3C-0x3F */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x77, 0x3F, 0x3F, /* 0x40-0x43 */
-	0x8A, 0x8D, 0x00, 0x76, 0x00, 0x7B, 0x3F, 0x3F, /* 0x44-0x47 */
-	0x3F, 0x3F, 0x00, 0x7A, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */
-	0x00, 0x79, 0x93, 0x51, 0x00, 0x7C, 0x3F, 0x3F, /* 0x4C-0x4F */
+	0x97, 0x41, 0xE7, 0x75, 0x3F, 0x3F, 0xE7, 0x74, /* 0x38-0x3B */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE7, 0x78, 0x97, 0x60, /* 0x3C-0x3F */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE7, 0x77, 0x3F, 0x3F, /* 0x40-0x43 */
+	0x8A, 0x8D, 0xE7, 0x76, 0xE7, 0x7B, 0x3F, 0x3F, /* 0x44-0x47 */
+	0x3F, 0x3F, 0xE7, 0x7A, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */
+	0xE7, 0x79, 0x93, 0x51, 0xE7, 0x7C, 0x3F, 0x3F, /* 0x4C-0x4F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x7D, /* 0x54-0x57 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE7, 0x7D, /* 0x54-0x57 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */
-	0x00, 0x7E, 0x3F, 0x3F, 0x3F, 0x3F, 0x8D, 0x8C, /* 0x5C-0x5F */
-	0x3F, 0x3F, 0x8C, 0x44, 0x00, 0x80, 0x00, 0x81, /* 0x60-0x63 */
-	0x00, 0x82, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */
+	0xE7, 0x7E, 0x3F, 0x3F, 0x3F, 0x3F, 0x8D, 0x8C, /* 0x5C-0x5F */
+	0x3F, 0x3F, 0x8C, 0x44, 0xE7, 0x80, 0xE7, 0x81, /* 0x60-0x63 */
+	0xE7, 0x82, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x68-0x6B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */
@@ -8383,340 +8385,340 @@
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x90, 0x68, /* 0x98-0x9B */
-	0x00, 0x83, 0x3F, 0x3F, 0x8E, 0x00, 0x00, 0x84, /* 0x9C-0x9F */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x85, /* 0xA0-0xA3 */
+	0xE7, 0x83, 0x3F, 0x3F, 0x8E, 0xAB, 0xE7, 0x84, /* 0x9C-0x9F */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE7, 0x85, /* 0xA0-0xA3 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x99, 0x9F, /* 0xA4-0xA7 */
 	0x99, 0x9E, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */
-	0x3F, 0x3F, 0x00, 0x86, 0x00, 0x90, 0x00, 0x87, /* 0xAC-0xAF */
+	0x3F, 0x3F, 0xE7, 0x86, 0xE3, 0x90, 0xE7, 0x87, /* 0xAC-0xAF */
 	0x92, 0x43, 0x90, 0x4A, 0x94, 0x5F, 0x3F, 0x3F, /* 0xB0-0xB3 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x88, /* 0xB4-0xB7 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x95, 0x00, 0x92, 0x00, /* 0xB8-0xBB */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE7, 0x88, /* 0xB4-0xB7 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x95, 0xD3, 0x92, 0xD2, /* 0xB8-0xBB */
 	0x8D, 0x9E, 0x3F, 0x3F, 0x3F, 0x3F, 0x92, 0x48, /* 0xBC-0xBF */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x89, 0x49, 0x3F, 0x3F, /* 0xC0-0xC3 */
 	0x96, 0x98, 0x90, 0x76, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC4-0xC7 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC8-0xCB */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x8C, 0x7D, 0x3F, 0x3F, /* 0xCC-0xCF */
-	0x3F, 0x3F, 0x8B, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */
-	0x95, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x89, 0x3F, 0x3F, /* 0xD8-0xDB */
+	0x3F, 0x3F, 0x8B, 0xDF, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */
+	0x95, 0xD4, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE7, 0x89, 0x3F, 0x3F, /* 0xD8-0xDB */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xDC-0xDF */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x8B, 0x3F, 0x3F, /* 0xE0-0xE3 */
-	0x3F, 0x3F, 0x00, 0x8A, 0x89, 0x00, 0x3F, 0x3F, /* 0xE4-0xE7 */
-	0x3F, 0x3F, 0x93, 0x00, 0x00, 0x8C, 0x94, 0x97, /* 0xE8-0xEB */
-	0x3F, 0x3F, 0x93, 0x52, 0x3F, 0x3F, 0x00, 0x8D, /* 0xEC-0xEF */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE7, 0x8B, 0x3F, 0x3F, /* 0xE0-0xE3 */
+	0x3F, 0x3F, 0xE7, 0x8A, 0x89, 0xDE, 0x3F, 0x3F, /* 0xE4-0xE7 */
+	0x3F, 0x3F, 0x93, 0xF4, 0xE7, 0x8C, 0x94, 0x97, /* 0xE8-0xEB */
+	0x3F, 0x3F, 0x93, 0x52, 0x3F, 0x3F, 0xE7, 0x8D, /* 0xEC-0xEF */
 	0x8F, 0x71, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */
-	0x00, 0x8F, 0x3F, 0x3F, 0x3F, 0x3F, 0x96, 0x00, /* 0xF4-0xF7 */
-	0x00, 0x9E, 0x00, 0x91, 0x00, 0x92, 0x3F, 0x3F, /* 0xF8-0xFB */
-	0x3F, 0x3F, 0x92, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */
+	0xE7, 0x8F, 0x3F, 0x3F, 0x3F, 0x3F, 0x96, 0xC0, /* 0xF4-0xF7 */
+	0xE7, 0x9E, 0xE7, 0x91, 0xE7, 0x92, 0x3F, 0x3F, /* 0xF8-0xFB */
+	0x3F, 0x3F, 0x92, 0xC7, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */
 };
 
 static unsigned char u2c_90[512] = {
-	0x91, 0x00, 0x91, 0x97, 0x3F, 0x3F, 0x93, 0x00, /* 0x00-0x03 */
-	0x3F, 0x3F, 0x00, 0x90, 0x8B, 0x74, 0x3F, 0x3F, /* 0x04-0x07 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x99, /* 0x08-0x0B */
-	0x3F, 0x3F, 0x00, 0x96, 0x00, 0x00, 0x93, 0x00, /* 0x0C-0x0F */
-	0x92, 0x80, 0x00, 0x93, 0x3F, 0x3F, 0x92, 0x00, /* 0x10-0x13 */
-	0x93, 0x72, 0x00, 0x94, 0x00, 0x98, 0x90, 0x80, /* 0x14-0x17 */
-	0x3F, 0x3F, 0x94, 0x87, 0x92, 0x00, 0x3F, 0x3F, /* 0x18-0x1B */
-	0x3F, 0x3F, 0x90, 0x00, 0x00, 0x97, 0x91, 0x00, /* 0x1C-0x1F */
-	0x91, 0x00, 0x00, 0x95, 0x88, 0x00, 0x98, 0x41, /* 0x20-0x23 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x9A, /* 0x24-0x27 */
+	0x91, 0xDE, 0x91, 0x97, 0x3F, 0x3F, 0x93, 0xA6, /* 0x00-0x03 */
+	0x3F, 0x3F, 0xE7, 0x90, 0x8B, 0x74, 0x3F, 0x3F, /* 0x04-0x07 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE7, 0x99, /* 0x08-0x0B */
+	0x3F, 0x3F, 0xE7, 0x96, 0xE7, 0xA3, 0x93, 0xA7, /* 0x0C-0x0F */
+	0x92, 0x80, 0xE7, 0x93, 0x3F, 0x3F, 0x92, 0xFC, /* 0x10-0x13 */
+	0x93, 0x72, 0xE7, 0x94, 0xE7, 0x98, 0x90, 0x80, /* 0x14-0x17 */
+	0x3F, 0x3F, 0x94, 0x87, 0x92, 0xCA, 0x3F, 0x3F, /* 0x18-0x1B */
+	0x3F, 0x3F, 0x90, 0xC0, 0xE7, 0x97, 0x91, 0xAC, /* 0x1C-0x1F */
+	0x91, 0xA2, 0xE7, 0x95, 0x88, 0xA7, 0x98, 0x41, /* 0x20-0x23 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE7, 0x9A, /* 0x24-0x27 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x91, 0x00, 0x3F, 0x3F, /* 0x2C-0x2F */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x91, 0xDF, 0x3F, 0x3F, /* 0x2C-0x2F */
 	0x3F, 0x3F, 0x8F, 0x54, 0x90, 0x69, 0x3F, 0x3F, /* 0x30-0x33 */
-	0x3F, 0x3F, 0x00, 0x9C, 0x00, 0x9B, 0x3F, 0x3F, /* 0x34-0x37 */
-	0x88, 0x00, 0x00, 0x9D, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x38-0x3B */
-	0x95, 0x4E, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0x3C-0x3F */
-	0x3F, 0x3F, 0x93, 0x00, 0x90, 0x8B, 0x3F, 0x3F, /* 0x40-0x43 */
-	0x3F, 0x3F, 0x92, 0x78, 0x3F, 0x3F, 0x8B, 0x00, /* 0x44-0x47 */
-	0x3F, 0x3F, 0x00, 0x00, 0x97, 0x56, 0x89, 0x5E, /* 0x48-0x4B */
-	0x3F, 0x3F, 0x95, 0x00, 0x89, 0x00, 0x00, 0x9F, /* 0x4C-0x4F */
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x93, 0x00, /* 0x50-0x53 */
-	0x92, 0x42, 0x88, 0x00, 0x00, 0x00, 0x3F, 0x3F, /* 0x54-0x57 */
-	0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */
-	0x91, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0x5C-0x5F */
-	0x89, 0x93, 0x91, 0x6B, 0x3F, 0x3F, 0x8C, 0x00, /* 0x60-0x63 */
-	0x3F, 0x3F, 0x97, 0x79, 0x3F, 0x3F, 0x00, 0x00, /* 0x64-0x67 */
-	0x00, 0x00, 0x93, 0x4B, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x68-0x6B */
-	0x3F, 0x3F, 0x91, 0x98, 0x8E, 0x00, 0x00, 0x00, /* 0x6C-0x6F */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0x70-0x73 */
-	0x3F, 0x3F, 0x8F, 0x85, 0x00, 0x00, 0x91, 0x4A, /* 0x74-0x77 */
-	0x91, 0x49, 0x3F, 0x3F, 0x88, 0x00, 0x3F, 0x3F, /* 0x78-0x7B */
-	0x97, 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x94, 0x00, /* 0x7C-0x7F */
-	
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x84, /* 0x80-0x83 */
-	0x8A, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x8E, /* 0x84-0x87 */
-	0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, /* 0x88-0x8B */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0x8C-0x8F */
+	0x3F, 0x3F, 0xE7, 0x9C, 0xE7, 0x9B, 0x3F, 0x3F, /* 0x34-0x37 */
+	0x88, 0xED, 0xE7, 0x9D, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x38-0x3B */
+	0x95, 0x4E, 0x3F, 0x3F, 0xE7, 0xA5, 0x3F, 0x3F, /* 0x3C-0x3F */
+	0x3F, 0x3F, 0x93, 0xD9, 0x90, 0x8B, 0x3F, 0x3F, /* 0x40-0x43 */
+	0x3F, 0x3F, 0x92, 0x78, 0x3F, 0x3F, 0x8B, 0xF6, /* 0x44-0x47 */
+	0x3F, 0x3F, 0xE7, 0xA4, 0x97, 0x56, 0x89, 0x5E, /* 0x48-0x4B */
+	0x3F, 0x3F, 0x95, 0xD5, 0x89, 0xDF, 0xE7, 0x9F, /* 0x4C-0x4F */
+	0xE7, 0xA0, 0xE7, 0xA1, 0xE7, 0xA2, 0x93, 0xB9, /* 0x50-0x53 */
+	0x92, 0x42, 0x88, 0xE1, 0xE7, 0xA6, 0x3F, 0x3F, /* 0x54-0x57 */
+	0xE7, 0xA7, 0xEA, 0xA1, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */
+	0x91, 0xBB, 0x3F, 0x3F, 0xE7, 0xA8, 0x3F, 0x3F, /* 0x5C-0x5F */
+	0x89, 0x93, 0x91, 0x6B, 0x3F, 0x3F, 0x8C, 0xAD, /* 0x60-0x63 */
+	0x3F, 0x3F, 0x97, 0x79, 0x3F, 0x3F, 0xEE, 0x99, /* 0x64-0x67 */
+	0xE7, 0xA9, 0x93, 0x4B, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x68-0x6B */
+	0x3F, 0x3F, 0x91, 0x98, 0x8E, 0xD5, 0xE7, 0xAA, /* 0x6C-0x6F */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE7, 0xAD, 0x3F, 0x3F, /* 0x70-0x73 */
+	0x3F, 0x3F, 0x8F, 0x85, 0xE7, 0xAB, 0x91, 0x4A, /* 0x74-0x77 */
+	0x91, 0x49, 0x3F, 0x3F, 0x88, 0xE2, 0x3F, 0x3F, /* 0x78-0x7B */
+	0x97, 0xC9, 0xE7, 0xAF, 0x3F, 0x3F, 0x94, 0xF0, /* 0x7C-0x7F */
+	
+	0xE7, 0xB1, 0xE7, 0xB0, 0xE7, 0xAE, 0xE2, 0x84, /* 0x80-0x83 */
+	0x8A, 0xD2, 0x3F, 0x3F, 0x3F, 0x3F, 0xE7, 0x8E, /* 0x84-0x87 */
+	0x3F, 0x3F, 0xE7, 0xB3, 0xE7, 0xB2, 0x3F, 0x3F, /* 0x88-0x8B */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE7, 0xB4, /* 0x8C-0x8F */
 	0x3F, 0x3F, 0x97, 0x57, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x93, 0x00, /* 0xA0-0xA3 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x93, 0xDF, /* 0xA0-0xA3 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x96, 0x4D, 0x3F, 0x3F, /* 0xA4-0xA7 */
-	0x00, 0x00, 0x3F, 0x3F, 0x8E, 0x00, 0x3F, 0x3F, /* 0xA8-0xAB */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0xAC-0xAF */
-	0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB0-0xB3 */
-	0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */
+	0xE7, 0xB5, 0x3F, 0x3F, 0x8E, 0xD7, 0x3F, 0x3F, /* 0xA8-0xAB */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE7, 0xB6, /* 0xAC-0xAF */
+	0x3F, 0x3F, 0xE7, 0xB7, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB0-0xB3 */
+	0x3F, 0x3F, 0xE7, 0xB8, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */
 	0x93, 0x40, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */
-	0x3F, 0x3F, 0x88, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */
+	0x3F, 0x3F, 0x88, 0xE8, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC4-0xC7 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x8D, 0x78, 0x3F, 0x3F, /* 0xC8-0xCB */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x98, 0x59, 0x3F, 0x3F, /* 0xCC-0xCF */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0xD8-0xDB */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0xDC-0xDF */
-	0x3F, 0x3F, 0x8C, 0x53, 0x00, 0x00, 0x3F, 0x3F, /* 0xE0-0xE3 */
-	0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE7, 0xBC, /* 0xD8-0xDB */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xEE, 0x9A, 0x3F, 0x3F, /* 0xDC-0xDF */
+	0x3F, 0x3F, 0x8C, 0x53, 0xE7, 0xB9, 0x3F, 0x3F, /* 0xE0-0xE3 */
+	0xE7, 0xBA, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */
 	0x95, 0x94, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */
 	0x3F, 0x3F, 0x8A, 0x73, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */
-	0x3F, 0x3F, 0x97, 0x58, 0x3F, 0x3F, 0x8B, 0x00, /* 0xF4-0xF7 */
+	0x3F, 0x3F, 0x97, 0x58, 0x3F, 0x3F, 0x8B, 0xBD, /* 0xF4-0xF7 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF8-0xFB */
 	0x3F, 0x3F, 0x93, 0x73, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */
 };
 
 static unsigned char u2c_91[512] = {
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0x00-0x03 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE7, 0xBD, 0x3F, 0x3F, /* 0x00-0x03 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x04-0x07 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x08-0x0B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0x10-0x13 */
-	0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */
-	0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x18-0x1B */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE7, 0xBE, 0x3F, 0x3F, /* 0x10-0x13 */
+	0x3F, 0x3F, 0xEE, 0x9C, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */
+	0x3F, 0x3F, 0xE7, 0xBF, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x18-0x1B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0x24-0x27 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xEE, 0x9D, /* 0x24-0x27 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */
 	0x3F, 0x3F, 0x93, 0x41, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */
-	0x00, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0x30-0x33 */
+	0xE7, 0xC1, 0x3F, 0x3F, 0xE7, 0xC0, 0x3F, 0x3F, /* 0x30-0x33 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x38-0x3B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */
-	0x3F, 0x3F, 0x93, 0x00, 0x00, 0x00, 0x8F, 0x55, /* 0x48-0x4B */
-	0x8E, 0x00, 0x94, 0x7A, 0x92, 0x91, 0x3F, 0x3F, /* 0x4C-0x4F */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x8E, 0x00, 0x3F, 0x3F, /* 0x50-0x53 */
-	0x90, 0x8C, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0x54-0x57 */
-	0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */
+	0x3F, 0x3F, 0x93, 0xD1, 0xE7, 0xC2, 0x8F, 0x55, /* 0x48-0x4B */
+	0x8E, 0xDE, 0x94, 0x7A, 0x92, 0x91, 0x3F, 0x3F, /* 0x4C-0x4F */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x8E, 0xF0, 0x3F, 0x3F, /* 0x50-0x53 */
+	0x90, 0x8C, 0x3F, 0x3F, 0xE7, 0xC3, 0x3F, 0x3F, /* 0x54-0x57 */
+	0xE7, 0xC4, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x5C-0x5F */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x90, 0x7C, 0x00, 0x00, /* 0x60-0x63 */
-	0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */
-	0x3F, 0x3F, 0x00, 0x00, 0x97, 0x8F, 0x3F, 0x3F, /* 0x68-0x6B */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x90, 0x7C, 0xE7, 0xC5, /* 0x60-0x63 */
+	0x3F, 0x3F, 0xE7, 0xC6, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */
+	0x3F, 0x3F, 0xE7, 0xC7, 0x97, 0x8F, 0x3F, 0x3F, /* 0x68-0x6B */
 	0x8F, 0x56, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x73 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE7, 0xC9, 0xE7, 0xC8, /* 0x70-0x73 */
 	0x3F, 0x3F, 0x8D, 0x79, 0x3F, 0x3F, 0x8D, 0x93, /* 0x74-0x77 */
 	0x8E, 0x5F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */
 	
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0x80-0x83 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE7, 0xCC, 0x3F, 0x3F, /* 0x80-0x83 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x8F, 0x86, /* 0x84-0x87 */
-	0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x00, /* 0x88-0x8B */
-	0x3F, 0x3F, 0x91, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */
-	0x8C, 0x00, 0x3F, 0x3F, 0x90, 0x00, 0x3F, 0x3F, /* 0x90-0x93 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x94, 0x00, /* 0x94-0x97 */
+	0x3F, 0x3F, 0xE7, 0xCB, 0x3F, 0x3F, 0xE7, 0xCA, /* 0x88-0x8B */
+	0x3F, 0x3F, 0x91, 0xE7, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */
+	0x8C, 0xED, 0x3F, 0x3F, 0x90, 0xC1, 0x3F, 0x3F, /* 0x90-0x93 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x94, 0xAE, /* 0x94-0x97 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */
 	0x8F, 0x58, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0xA0-0xA3 */
-	0x8F, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, /* 0xA8-0xAB */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0xAC-0xAF */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE7, 0xCD, 0x3F, 0x3F, /* 0xA0-0xA3 */
+	0x8F, 0xDD, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE7, 0xD0, 0xE7, 0xCE, /* 0xA8-0xAB */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE7, 0xCF, /* 0xAC-0xAF */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB0-0xB3 */
-	0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */
-	0x8F, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0xB8-0xBB */
+	0xE7, 0xD2, 0xE7, 0xD1, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */
+	0x8F, 0xF8, 0x3F, 0x3F, 0xE7, 0xD3, 0x3F, 0x3F, /* 0xB8-0xBB */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */
-	0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x94, 0x00, 0x8D, 0x00, /* 0xC4-0xC7 */
-	0x8E, 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x00, /* 0xC8-0xCB */
-	0x97, 0x00, 0x8F, 0x64, 0x96, 0x00, 0x97, 0x00, /* 0xCC-0xCF */
-	0x00, 0x00, 0x8B, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, /* 0xD4-0xD7 */
-	0x93, 0x42, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, /* 0xD8-0xDB */
-	0x8A, 0x98, 0x90, 0x6A, 0x00, 0x00, 0x00, 0x00, /* 0xDC-0xDF */
-	0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, 0x92, 0x00, /* 0xE0-0xE3 */
-	0x00, 0x00, 0x00, 0x00, 0x96, 0x74, 0x8B, 0x00, /* 0xE4-0xE7 */
+	0xE7, 0xD4, 0xE7, 0xD5, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x94, 0xCE, 0x8D, 0xD1, /* 0xC4-0xC7 */
+	0x8E, 0xDF, 0xE7, 0xD6, 0x3F, 0x3F, 0xE7, 0xD7, /* 0xC8-0xCB */
+	0x97, 0xA2, 0x8F, 0x64, 0x96, 0xEC, 0x97, 0xCA, /* 0xCC-0xCF */
+	0xE7, 0xD8, 0x8B, 0xE0, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE7, 0xD9, 0xEE, 0x9F, /* 0xD4-0xD7 */
+	0x93, 0x42, 0x3F, 0x3F, 0xEE, 0x9E, 0xE7, 0xDC, /* 0xD8-0xDB */
+	0x8A, 0x98, 0x90, 0x6A, 0xEE, 0xA0, 0xE7, 0xDA, /* 0xDC-0xDF */
+	0x3F, 0x3F, 0xE7, 0xDB, 0x3F, 0x3F, 0x92, 0xDE, /* 0xE0-0xE3 */
+	0xEE, 0xA3, 0xEE, 0xA4, 0x96, 0x74, 0x8B, 0xFA, /* 0xE4-0xE7 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */
-	0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, /* 0xEC-0xEF */
+	0x3F, 0x3F, 0xEE, 0xA1, 0xEE, 0xA2, 0x3F, 0x3F, /* 0xEC-0xEF */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */
-	0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, /* 0xF4-0xF7 */
+	0x3F, 0x3F, 0xE7, 0xDE, 0xE7, 0xDF, 0x3F, 0x3F, /* 0xF4-0xF7 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF8-0xFB */
-	0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0xFC-0xFF */
+	0xE7, 0xDD, 0x3F, 0x3F, 0x3F, 0x3F, 0xE7, 0xE1, /* 0xFC-0xFF */
 };
 
 static unsigned char u2c_92[512] = {
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0x04-0x07 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0x08-0x0B */
-	0x3F, 0x3F, 0x93, 0x00, 0x8A, 0x62, 0x3F, 0x3F, /* 0x0C-0x0F */
-	0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */
-	0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xEE, 0xA5, 0x3F, 0x3F, /* 0x04-0x07 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xEE, 0xA7, 0x3F, 0x3F, /* 0x08-0x0B */
+	0x3F, 0x3F, 0x93, 0xDD, 0x8A, 0x62, 0x3F, 0x3F, /* 0x0C-0x0F */
+	0xEE, 0xA6, 0xE7, 0xE5, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */
+	0xE7, 0xE2, 0xE7, 0xE4, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x18-0x1B */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0x1C-0x1F */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE7, 0xE0, 0x3F, 0x3F, /* 0x1C-0x1F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */
-	0x3F, 0x3F, 0x00, 0x6E, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */
-	0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */
+	0x3F, 0x3F, 0xE8, 0x6E, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */
+	0xE7, 0xE3, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */
-	0x97, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x8C, 0x00, /* 0x34-0x37 */
-	0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, /* 0x38-0x3B */
-	0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0x3C-0x3F */
-	0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */
-	0x93, 0x53, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */
-	0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x00, /* 0x48-0x4B */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0x4C-0x4F */
-	0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0x54-0x57 */
-	0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x89, 0x94, /* 0x58-0x5B */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0x5C-0x5F */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x94, 0x00, 0x3F, 0x3F, /* 0x60-0x63 */
-	0x00, 0x00, 0x3F, 0x3F, 0x8F, 0x00, 0x00, 0x00, /* 0x64-0x67 */
+	0x97, 0xE9, 0x3F, 0x3F, 0x3F, 0x3F, 0x8C, 0xD8, /* 0x34-0x37 */
+	0x3F, 0x3F, 0xEE, 0xAE, 0xEE, 0xA8, 0x3F, 0x3F, /* 0x38-0x3B */
+	0xEE, 0xAA, 0x3F, 0x3F, 0x3F, 0x3F, 0xE7, 0xED, /* 0x3C-0x3F */
+	0xEE, 0xA9, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */
+	0x93, 0x53, 0xE7, 0xE8, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */
+	0xE7, 0xEB, 0xE7, 0xE9, 0x3F, 0x3F, 0xE7, 0xEE, /* 0x48-0x4B */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xEE, 0xAB, 0x3F, 0x3F, /* 0x4C-0x4F */
+	0xE7, 0xEF, 0xEE, 0xAD, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE7, 0xE7, /* 0x54-0x57 */
+	0x3F, 0x3F, 0xEE, 0xAC, 0xE7, 0xF4, 0x89, 0x94, /* 0x58-0x5B */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE7, 0xE6, 0x3F, 0x3F, /* 0x5C-0x5F */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x94, 0xAB, 0x3F, 0x3F, /* 0x60-0x63 */
+	0xE7, 0xEA, 0x3F, 0x3F, 0x8F, 0xDE, 0xEE, 0xAF, /* 0x64-0x67 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x68-0x6B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */
 	0x3F, 0x3F, 0x8D, 0x7A, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0x74-0x77 */
-	0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xEE, 0xB1, /* 0x74-0x77 */
+	0xEE, 0xB2, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x96, 0x67, 0x3F, 0x3F, /* 0x7C-0x7F */
 	
-	0x8B, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x8F, 0x65, /* 0x80-0x83 */
-	0x3F, 0x3F, 0x93, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */
-	0x00, 0x5F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x88-0x8B */
+	0x8B, 0xE2, 0x3F, 0x3F, 0x3F, 0x3F, 0x8F, 0x65, /* 0x80-0x83 */
+	0x3F, 0x3F, 0x93, 0xBA, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */
+	0xED, 0x43, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x88-0x8B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */
-	0x3F, 0x3F, 0x91, 0x4C, 0x3F, 0x3F, 0x00, 0x00, /* 0x90-0x93 */
-	0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, /* 0x94-0x97 */
-	0x96, 0x00, 0x3F, 0x3F, 0x92, 0x00, 0x00, 0x00, /* 0x98-0x9B */
-	0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */
+	0x3F, 0x3F, 0x91, 0x4C, 0x3F, 0x3F, 0xE7, 0xF2, /* 0x90-0x93 */
+	0x3F, 0x3F, 0xE7, 0xEC, 0xE7, 0xF1, 0x3F, 0x3F, /* 0x94-0x97 */
+	0x96, 0xC1, 0x3F, 0x3F, 0x92, 0xB6, 0xE7, 0xF3, /* 0x98-0x9B */
+	0xE7, 0xF0, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0xA4-0xA7 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xEE, 0xB0, /* 0xA4-0xA7 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */
 	0x3F, 0x3F, 0x91, 0x4B, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB0-0xB3 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0xB4-0xB7 */
-	0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE7, 0xF7, /* 0xB4-0xB7 */
+	0x3F, 0x3F, 0xE7, 0xF6, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC4-0xC7 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC8-0xCB */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0xCC-0xCF */
-	0x00, 0x00, 0x3F, 0x3F, 0x96, 0x4E, 0x00, 0x00, /* 0xD0-0xD3 */
-	0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x00, /* 0xD4-0xD7 */
-	0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE7, 0xF5, /* 0xCC-0xCF */
+	0xEE, 0xB6, 0x3F, 0x3F, 0x96, 0x4E, 0xEE, 0xBA, /* 0xD0-0xD3 */
+	0x3F, 0x3F, 0xEE, 0xB8, 0x3F, 0x3F, 0xEE, 0xB4, /* 0xD4-0xD7 */
+	0x3F, 0x3F, 0xEE, 0xB5, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xDC-0xDF */
-	0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */
-	0x8F, 0x9B, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0xE4-0xE7 */
-	0x3F, 0x3F, 0x00, 0x00, 0x95, 0x00, 0x3F, 0x3F, /* 0xE8-0xEB */
+	0xEE, 0xB9, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */
+	0x8F, 0x9B, 0x3F, 0x3F, 0x3F, 0x3F, 0xEE, 0xB3, /* 0xE4-0xE7 */
+	0x3F, 0x3F, 0xE7, 0xF8, 0x95, 0xDD, 0x3F, 0x3F, /* 0xE8-0xEB */
 	0x3F, 0x3F, 0x89, 0x73, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x95, 0x65, 0x92, 0x92, /* 0xF0-0xF3 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */
-	0x8B, 0x98, 0x00, 0x65, 0x00, 0x00, 0x00, 0x00, /* 0xF8-0xFB */
-	0x8D, 0x7C, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0xFC-0xFF */
+	0x8B, 0x98, 0xED, 0x49, 0xE7, 0xFA, 0xEE, 0xBD, /* 0xF8-0xFB */
+	0x8D, 0x7C, 0x3F, 0x3F, 0x3F, 0x3F, 0xEE, 0xC0, /* 0xFC-0xFF */
 };
 
 static unsigned char u2c_93[512] = {
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0x00-0x03 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xEE, 0xC2, 0x3F, 0x3F, /* 0x00-0x03 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x8E, 0x4B, 0x3F, 0x3F, /* 0x04-0x07 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x08-0x0B */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0x0C-0x0F */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE7, 0xF9, /* 0x0C-0x0F */
 	0x90, 0x8D, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */
-	0x90, 0x8E, 0x00, 0x40, 0x00, 0x42, 0x3F, 0x3F, /* 0x18-0x1B */
-	0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, /* 0x1C-0x1F */
-	0x8F, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x43, /* 0x20-0x23 */
-	0x3F, 0x3F, 0x00, 0x00, 0x8B, 0x00, 0x3F, 0x3F, /* 0x24-0x27 */
-	0x95, 0x64, 0x3F, 0x3F, 0x3F, 0x3F, 0x8E, 0x00, /* 0x28-0x2B */
-	0x98, 0x42, 0x3F, 0x3F, 0x00, 0x00, 0x8D, 0x00, /* 0x2C-0x2F */
+	0x90, 0x8E, 0xE8, 0x40, 0xE8, 0x42, 0x3F, 0x3F, /* 0x18-0x1B */
+	0x3F, 0x3F, 0xEE, 0xC1, 0xEE, 0xBF, 0x3F, 0x3F, /* 0x1C-0x1F */
+	0x8F, 0xF9, 0xEE, 0xBC, 0xE8, 0x41, 0xE8, 0x43, /* 0x20-0x23 */
+	0x3F, 0x3F, 0xEE, 0xBB, 0x8B, 0xD1, 0x3F, 0x3F, /* 0x24-0x27 */
+	0x95, 0x64, 0x3F, 0x3F, 0x3F, 0x3F, 0x8E, 0xE0, /* 0x28-0x2B */
+	0x98, 0x42, 0x3F, 0x3F, 0xE7, 0xFC, 0x8D, 0xF6, /* 0x2C-0x2F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x98, 0x5E, 0x3F, 0x3F, /* 0x30-0x33 */
-	0x3F, 0x3F, 0x00, 0x45, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x44, 0x00, 0x46, /* 0x38-0x3B */
+	0x3F, 0x3F, 0xE8, 0x45, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE8, 0x44, 0xE8, 0x46, /* 0x38-0x3B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */
-	0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */
-	0x00, 0x5E, 0x3F, 0x3F, 0x3F, 0x3F, 0x93, 0x00, /* 0x48-0x4B */
+	0xE7, 0xFB, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */
+	0xED, 0x42, 0x3F, 0x3F, 0x3F, 0x3F, 0x93, 0xE7, /* 0x48-0x4B */
 	0x3F, 0x3F, 0x93, 0x74, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x4C-0x4F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */
-	0x92, 0x00, 0x3F, 0x3F, 0x00, 0x4B, 0x00, 0x00, /* 0x54-0x57 */
+	0x92, 0xD5, 0x3F, 0x3F, 0xE8, 0x4B, 0xEE, 0xC4, /* 0x54-0x57 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x92, 0x62, /* 0x58-0x5B */
-	0x00, 0x47, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x5C-0x5F */
-	0x00, 0x48, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x60-0x63 */
+	0xE8, 0x47, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x5C-0x5F */
+	0xE8, 0x48, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x60-0x63 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x68-0x6B */
-	0x8C, 0x4C, 0x3F, 0x3F, 0x00, 0x4A, 0x3F, 0x3F, /* 0x6C-0x6F */
-	0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */
-	0x3F, 0x3F, 0x8C, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x74-0x77 */
+	0x8C, 0x4C, 0x3F, 0x3F, 0xE8, 0x4A, 0x3F, 0x3F, /* 0x6C-0x6F */
+	0xEE, 0xC3, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */
+	0x3F, 0x3F, 0x8C, 0xAE, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x74-0x77 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */
-	0x00, 0x49, 0x3F, 0x3F, 0x8F, 0x00, 0x3F, 0x3F, /* 0x7C-0x7F */
+	0xE8, 0x49, 0x3F, 0x3F, 0x8F, 0xDF, 0x3F, 0x3F, /* 0x7C-0x7F */
 	
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x88-0x8B */
 	0x8A, 0x99, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */
-	0x00, 0x4F, 0x3F, 0x3F, 0x8D, 0x00, 0x91, 0x99, /* 0x94-0x97 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x92, 0x00, 0x3F, 0x3F, /* 0x98-0x9B */
+	0xE8, 0x4F, 0x3F, 0x3F, 0x8D, 0xBD, 0x91, 0x99, /* 0x94-0x97 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x92, 0xC8, 0x3F, 0x3F, /* 0x98-0x9B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */
-	0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x8A, 0x5A, /* 0xA4-0xA7 */
+	0xEE, 0xC5, 0x3F, 0x3F, 0x3F, 0x3F, 0x8A, 0x5A, /* 0xA4-0xA7 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */
-	0x00, 0x4D, 0x00, 0x4E, 0x92, 0x00, 0x3F, 0x3F, /* 0xAC-0xAF */
-	0x00, 0x4C, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB0-0xB3 */
+	0xE8, 0x4D, 0xE8, 0x4E, 0x92, 0xC1, 0x3F, 0x3F, /* 0xAC-0xAF */
+	0xE8, 0x4C, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB0-0xB3 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */
-	0x3F, 0x3F, 0x00, 0x50, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */
+	0x3F, 0x3F, 0xE8, 0x50, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x56, /* 0xC0-0xC3 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0xC4-0xC7 */
-	0x00, 0x59, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC8-0xCB */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE8, 0x56, /* 0xC0-0xC3 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xEE, 0xC6, 0x3F, 0x3F, /* 0xC4-0xC7 */
+	0xE8, 0x59, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC8-0xCB */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */
-	0x00, 0x58, 0x93, 0x4C, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x51, 0x00, 0x52, /* 0xD4-0xD7 */
-	0x00, 0x55, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */
-	0x3F, 0x3F, 0x00, 0x57, 0x00, 0x00, 0x3F, 0x3F, /* 0xDC-0xDF */
-	0x3F, 0x3F, 0x8B, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */
-	0x00, 0x5A, 0x00, 0x54, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */
-	0x00, 0x53, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */
+	0xE8, 0x58, 0x93, 0x4C, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE8, 0x51, 0xE8, 0x52, /* 0xD4-0xD7 */
+	0xE8, 0x55, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */
+	0x3F, 0x3F, 0xE8, 0x57, 0xEE, 0xC7, 0x3F, 0x3F, /* 0xDC-0xDF */
+	0x3F, 0x3F, 0x8B, 0xBE, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */
+	0xE8, 0x5A, 0xE8, 0x54, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */
+	0xE8, 0x53, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */
-	0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF8-0xFB */
+	0xEE, 0xC8, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF8-0xFB */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */
 };
 
 static unsigned char u2c_94[512] = {
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x5E, /* 0x00-0x03 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x5F, /* 0x04-0x07 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE8, 0x5E, /* 0x00-0x03 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE8, 0x5F, /* 0x04-0x07 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x08-0x0B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */
-	0x00, 0x60, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x5D, /* 0x10-0x13 */
-	0x00, 0x5C, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */
-	0x8F, 0x00, 0x93, 0x00, 0x00, 0x5B, 0x3F, 0x3F, /* 0x18-0x1B */
+	0xE8, 0x60, 0x3F, 0x3F, 0x3F, 0x3F, 0xE8, 0x5D, /* 0x10-0x13 */
+	0xE8, 0x5C, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */
+	0x8F, 0xE0, 0x93, 0xA8, 0xE8, 0x5B, 0x3F, 0x3F, /* 0x18-0x1B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */
-	0x3F, 0x3F, 0x00, 0x64, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */
+	0x3F, 0x3F, 0xE8, 0x64, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x62, /* 0x28-0x2B */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE8, 0x62, /* 0x28-0x2B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */
-	0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */
-	0x3F, 0x3F, 0x00, 0x63, 0x00, 0x61, 0x3F, 0x3F, /* 0x34-0x37 */
-	0x91, 0x00, 0x3F, 0x3F, 0x00, 0x65, 0x3F, 0x3F, /* 0x38-0x3B */
+	0x3F, 0x3F, 0xEE, 0xC9, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */
+	0x3F, 0x3F, 0xE8, 0x63, 0xE8, 0x61, 0x3F, 0x3F, /* 0x34-0x37 */
+	0x91, 0xF6, 0x3F, 0x3F, 0xE8, 0x65, 0x3F, 0x3F, /* 0x38-0x3B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */
-	0x3F, 0x3F, 0x00, 0x66, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */
-	0x00, 0x68, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */
-	0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */
+	0x3F, 0x3F, 0xE8, 0x66, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */
+	0xE8, 0x68, 0xEE, 0xCA, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */
+	0xEE, 0xCB, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x4C-0x4F */
-	0x3F, 0x3F, 0x8A, 0x00, 0x00, 0x67, 0x96, 0x00, /* 0x50-0x53 */
+	0x3F, 0x3F, 0x8A, 0xD3, 0xE8, 0x67, 0x96, 0xF8, /* 0x50-0x53 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x73, 0x00, 0x69, /* 0x58-0x5B */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x6C, 0x3F, 0x3F, /* 0x5C-0x5F */
-	0x00, 0x6A, 0x3F, 0x3F, 0x00, 0x6B, 0x3F, 0x3F, /* 0x60-0x63 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE8, 0x73, 0xE8, 0x69, /* 0x58-0x5B */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE8, 0x6C, 0x3F, 0x3F, /* 0x5C-0x5F */
+	0xE8, 0x6A, 0x3F, 0x3F, 0xE8, 0x6B, 0x3F, 0x3F, /* 0x60-0x63 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x6D, 0x3F, 0x3F, /* 0x68-0x6B */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE8, 0x6D, 0x3F, 0x3F, /* 0x68-0x6B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */
-	0x00, 0x6F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */
-	0x3F, 0x3F, 0x00, 0x70, 0x3F, 0x3F, 0x00, 0x71, /* 0x74-0x77 */
+	0xE8, 0x6F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */
+	0x3F, 0x3F, 0xE8, 0x70, 0x3F, 0x3F, 0xE8, 0x71, /* 0x74-0x77 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */
-	0x00, 0x74, 0x00, 0x72, 0x00, 0x75, 0x00, 0x77, /* 0x7C-0x7F */
+	0xE8, 0x74, 0xE8, 0x72, 0xE8, 0x75, 0xE8, 0x77, /* 0x7C-0x7F */
 	
-	0x3F, 0x3F, 0x00, 0x76, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */
+	0x3F, 0x3F, 0xE8, 0x76, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x88-0x8B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */
@@ -8780,36 +8782,36 @@
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x68-0x6B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x92, 0x00, /* 0x74-0x77 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x92, 0xB7, /* 0x74-0x77 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */
 	
-	0x96, 0x00, 0x3F, 0x3F, 0x00, 0x78, 0x91, 0x4D, /* 0x80-0x83 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x79, /* 0x84-0x87 */
-	0x3F, 0x3F, 0x95, 0x00, 0x00, 0x7A, 0x8A, 0x4A, /* 0x88-0x8B */
+	0x96, 0xE5, 0x3F, 0x3F, 0xE8, 0x78, 0x91, 0x4D, /* 0x80-0x83 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE8, 0x79, /* 0x84-0x87 */
+	0x3F, 0x3F, 0x95, 0xC2, 0xE8, 0x7A, 0x8A, 0x4A, /* 0x88-0x8B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x89, 0x5B, /* 0x8C-0x8F */
-	0x3F, 0x3F, 0x8A, 0x00, 0x00, 0x00, 0x8A, 0x00, /* 0x90-0x93 */
-	0x00, 0x7B, 0x3F, 0x3F, 0x00, 0x7C, 0x3F, 0x3F, /* 0x94-0x97 */
-	0x00, 0x7D, 0x00, 0x7E, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */
+	0x3F, 0x3F, 0x8A, 0xD5, 0xEE, 0xCC, 0x8A, 0xD4, /* 0x90-0x93 */
+	0xE8, 0x7B, 0x3F, 0x3F, 0xE8, 0x7C, 0x3F, 0x3F, /* 0x94-0x97 */
+	0xE8, 0x7D, 0xE8, 0x7E, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */
-	0x00, 0x80, 0x3F, 0x3F, 0x8A, 0x00, 0x8A, 0x74, /* 0xA0-0xA3 */
-	0x8D, 0x7D, 0x94, 0x00, 0x3F, 0x3F, 0x00, 0x82, /* 0xA4-0xA7 */
-	0x00, 0x81, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */
-	0x3F, 0x3F, 0x00, 0x83, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */
+	0xE8, 0x80, 0x3F, 0x3F, 0x8A, 0xD6, 0x8A, 0x74, /* 0xA0-0xA3 */
+	0x8D, 0x7D, 0x94, 0xB4, 0x3F, 0x3F, 0xE8, 0x82, /* 0xA4-0xA7 */
+	0xE8, 0x81, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */
+	0x3F, 0x3F, 0xE8, 0x83, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x89, 0x7B, 0x3F, 0x3F, /* 0xB0-0xB3 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */
-	0x3F, 0x3F, 0x00, 0x86, 0x3F, 0x3F, 0x00, 0x85, /* 0xB8-0xBB */
-	0x00, 0x84, 0x3F, 0x3F, 0x00, 0x87, 0x3F, 0x3F, /* 0xBC-0xBF */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x8A, /* 0xC0-0xC3 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x88, 0x00, /* 0xC4-0xC7 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x88, 0x3F, 0x3F, /* 0xC8-0xCB */
-	0x00, 0x8C, 0x00, 0x8B, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */
+	0x3F, 0x3F, 0xE8, 0x86, 0x3F, 0x3F, 0xE8, 0x85, /* 0xB8-0xBB */
+	0xE8, 0x84, 0x3F, 0x3F, 0xE8, 0x87, 0x3F, 0x3F, /* 0xBC-0xBF */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE8, 0x8A, /* 0xC0-0xC3 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x88, 0xC5, /* 0xC4-0xC7 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE8, 0x88, 0x3F, 0x3F, /* 0xC8-0xCB */
+	0xE8, 0x8C, 0xE8, 0x8B, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */
-	0x00, 0x8E, 0x00, 0x8D, 0x00, 0x8F, 0x3F, 0x3F, /* 0xD4-0xD7 */
-	0x93, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */
-	0x00, 0x90, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xDC-0xDF */
-	0x3F, 0x3F, 0x00, 0x91, 0x00, 0x93, 0x3F, 0x3F, /* 0xE0-0xE3 */
-	0x3F, 0x3F, 0x00, 0x92, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */
+	0xE8, 0x8E, 0xE8, 0x8D, 0xE8, 0x8F, 0x3F, 0x3F, /* 0xD4-0xD7 */
+	0x93, 0xAC, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */
+	0xE8, 0x90, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xDC-0xDF */
+	0x3F, 0x3F, 0xE8, 0x91, 0xE8, 0x93, 0x3F, 0x3F, /* 0xE0-0xE3 */
+	0x3F, 0x3F, 0xE8, 0x92, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */
@@ -8827,164 +8829,164 @@
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x18-0x1B */
 	0x95, 0x8C, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */
-	0x3F, 0x3F, 0x00, 0x94, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */
+	0x3F, 0x3F, 0xE8, 0x94, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */
-	0x00, 0x95, 0x3F, 0x3F, 0x8D, 0x00, 0x3F, 0x3F, /* 0x28-0x2B */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x96, 0x00, 0x97, /* 0x2C-0x2F */
+	0xE8, 0x95, 0x3F, 0x3F, 0x8D, 0xE3, 0x3F, 0x3F, /* 0x28-0x2B */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE8, 0x96, 0xE8, 0x97, /* 0x2C-0x2F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x96, 0x68, 0x3F, 0x3F, /* 0x30-0x33 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x91, 0x6A, /* 0x38-0x3B */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x88, 0x00, /* 0x3C-0x3F */
-	0x91, 0x00, 0x3F, 0x3F, 0x00, 0x98, 0x3F, 0x3F, /* 0x40-0x43 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x88, 0xA2, /* 0x3C-0x3F */
+	0x91, 0xC9, 0x3F, 0x3F, 0xE8, 0x98, 0x3F, 0x3F, /* 0x40-0x43 */
 	0x95, 0x8D, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x9B, /* 0x48-0x4B */
-	0x00, 0x99, 0x8D, 0x7E, 0x3F, 0x3F, 0x00, 0x9A, /* 0x4C-0x4F */
-	0x8C, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE8, 0x9B, /* 0x48-0x4B */
+	0xE8, 0x99, 0x8D, 0x7E, 0x3F, 0x3F, 0xE8, 0x9A, /* 0x4C-0x4F */
+	0x8C, 0xC0, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x95, 0x00, /* 0x58-0x5B */
-	0x00, 0x9D, 0x00, 0x9F, 0x00, 0x9E, 0x00, 0x00, /* 0x5C-0x5F */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x95, 0xC3, /* 0x58-0x5B */
+	0xE8, 0x9D, 0xE8, 0x9F, 0xE8, 0x9E, 0xE8, 0xA0, /* 0x5C-0x5F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x89, 0x40, 0x90, 0x77, /* 0x60-0x63 */
-	0x8F, 0x9C, 0x8A, 0x00, 0x00, 0x00, 0x3F, 0x3F, /* 0x64-0x67 */
+	0x8F, 0x9C, 0x8A, 0xD7, 0xE8, 0xA1, 0x3F, 0x3F, /* 0x64-0x67 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x94, 0x86, 0x3F, 0x3F, /* 0x68-0x6B */
-	0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */
-	0x89, 0x41, 0x3F, 0x3F, 0x00, 0x00, 0x92, 0x00, /* 0x70-0x73 */
-	0x3F, 0x3F, 0x97, 0x00, 0x93, 0x00, 0x00, 0x9C, /* 0x74-0x77 */
-	0x97, 0x00, 0x3F, 0x3F, 0x8C, 0x00, 0x3F, 0x3F, /* 0x78-0x7B */
+	0xE8, 0xA3, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */
+	0x89, 0x41, 0x3F, 0x3F, 0xE8, 0xA2, 0x92, 0xC2, /* 0x70-0x73 */
+	0x3F, 0x3F, 0x97, 0xCB, 0x93, 0xA9, 0xE8, 0x9C, /* 0x74-0x77 */
+	0x97, 0xA4, 0x3F, 0x3F, 0x8C, 0xAF, 0x3F, 0x3F, /* 0x78-0x7B */
 	0x3F, 0x3F, 0x97, 0x7A, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */
 	
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */
-	0x3F, 0x3F, 0x8B, 0x00, 0x97, 0x00, 0x3F, 0x3F, /* 0x84-0x87 */
-	0x8C, 0x47, 0x3F, 0x3F, 0x91, 0x00, 0x00, 0x40, /* 0x88-0x8B */
-	0x3F, 0x3F, 0x00, 0x00, 0x8A, 0x4B, 0x90, 0x8F, /* 0x8C-0x8F */
+	0x3F, 0x3F, 0x8B, 0xF7, 0x97, 0xB2, 0x3F, 0x3F, /* 0x84-0x87 */
+	0x8C, 0x47, 0x3F, 0x3F, 0x91, 0xE0, 0xE4, 0x40, /* 0x88-0x8B */
+	0x3F, 0x3F, 0xE8, 0xA4, 0x8A, 0x4B, 0x90, 0x8F, /* 0x8C-0x8F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */
-	0x8A, 0x75, 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x00, /* 0x94-0x97 */
-	0x00, 0x00, 0x8C, 0x84, 0x3F, 0x3F, 0x8D, 0x00, /* 0x98-0x9B */
-	0x8F, 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */
-	0x89, 0x42, 0x3F, 0x3F, 0x3F, 0x3F, 0x97, 0x00, /* 0xA0-0xA3 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0xA4-0xA7 */
-	0x00, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0xA8-0xAB */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0xAC-0xAF */
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, /* 0xB0-0xB3 */
-	0x00, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x97, 0x00, /* 0xB4-0xB7 */
-	0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x90, 0x00, /* 0xB8-0xBB */
-	0x94, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */
-	0x90, 0x9D, 0x8A, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */
-	0x97, 0x59, 0x89, 0x00, 0x8F, 0x57, 0x8C, 0x00, /* 0xC4-0xC7 */
-	0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x00, /* 0xC8-0xCB */
-	0x8E, 0x93, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, /* 0xCC-0xCF */
+	0x8A, 0x75, 0xE8, 0xA6, 0x3F, 0x3F, 0xE8, 0xA7, /* 0x94-0x97 */
+	0xE8, 0xA5, 0x8C, 0x84, 0x3F, 0x3F, 0x8D, 0xDB, /* 0x98-0x9B */
+	0x8F, 0xE1, 0xEE, 0xCF, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */
+	0x89, 0x42, 0x3F, 0x3F, 0x3F, 0x3F, 0x97, 0xD7, /* 0xA0-0xA3 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE8, 0xA9, /* 0xA4-0xA7 */
+	0xE7, 0xAC, 0x3F, 0x3F, 0xE8, 0xA8, 0x3F, 0x3F, /* 0xA8-0xAB */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xEE, 0xD0, /* 0xAC-0xAF */
+	0xE8, 0xAC, 0xE8, 0xAA, 0xE8, 0xAB, 0x3F, 0x3F, /* 0xB0-0xB3 */
+	0xE8, 0xAD, 0x3F, 0x3F, 0xE8, 0xAE, 0x97, 0xEA, /* 0xB4-0xB7 */
+	0xE8, 0xAF, 0xE8, 0xB0, 0x3F, 0x3F, 0x90, 0xC7, /* 0xB8-0xBB */
+	0x94, 0xB9, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */
+	0x90, 0x9D, 0x8A, 0xE5, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */
+	0x97, 0x59, 0x89, 0xEB, 0x8F, 0x57, 0x8C, 0xD9, /* 0xC4-0xC7 */
+	0x3F, 0x3F, 0xE8, 0xB3, 0x3F, 0x3F, 0xE8, 0xB2, /* 0xC8-0xCB */
+	0x8E, 0x93, 0xE8, 0xB4, 0xE8, 0xB1, 0x3F, 0x3F, /* 0xCC-0xCF */
 	0x3F, 0x3F, 0x8E, 0x47, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */
-	0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, /* 0xD4-0xD7 */
-	0x3F, 0x3F, 0x99, 0x00, 0x3F, 0x3F, 0x90, 0x97, /* 0xD8-0xDB */
-	0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xDC-0xDF */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x97, 0x00, 0x93, 0x00, /* 0xE0-0xE3 */
+	0x3F, 0x3F, 0xE8, 0xB8, 0xE5, 0xAB, 0x3F, 0x3F, /* 0xD4-0xD7 */
+	0x3F, 0x3F, 0x99, 0xD4, 0x3F, 0x3F, 0x90, 0x97, /* 0xD8-0xDB */
+	0xE8, 0xB6, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xDC-0xDF */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x97, 0xA3, 0x93, 0xEF, /* 0xE0-0xE3 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */
-	0x89, 0x4A, 0x3F, 0x3F, 0x90, 0x00, 0x8E, 0x00, /* 0xE8-0xEB */
+	0x89, 0x4A, 0x3F, 0x3F, 0x90, 0xE1, 0x8E, 0xB4, /* 0xE8-0xEB */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */
-	0x95, 0x00, 0x3F, 0x3F, 0x89, 0x5F, 0x3F, 0x3F, /* 0xF0-0xF3 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x97, 0x00, 0x97, 0x8B, /* 0xF4-0xF7 */
-	0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, 0x93, 0x64, /* 0xF8-0xFB */
+	0x95, 0xB5, 0x3F, 0x3F, 0x89, 0x5F, 0x3F, 0x3F, /* 0xF0-0xF3 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x97, 0xEB, 0x97, 0x8B, /* 0xF4-0xF7 */
+	0x3F, 0x3F, 0xE8, 0xB9, 0x3F, 0x3F, 0x93, 0x64, /* 0xF8-0xFB */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */
 };
 
 static unsigned char u2c_97[512] = {
-	0x8E, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */
-	0x00, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x90, 0x6B, /* 0x04-0x07 */
-	0x00, 0x00, 0x3F, 0x3F, 0x97, 0x00, 0x3F, 0x3F, /* 0x08-0x0B */
-	0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x0C-0x0F */
-	0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x00, /* 0x10-0x13 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0x14-0x17 */
-	0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x18-0x1B */
-	0x91, 0x9A, 0x3F, 0x3F, 0x89, 0x00, 0x3F, 0x3F, /* 0x1C-0x1F */
+	0x8E, 0xF9, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */
+	0xE8, 0xBA, 0x3F, 0x3F, 0xE8, 0xBB, 0x90, 0x6B, /* 0x04-0x07 */
+	0xE8, 0xBC, 0x3F, 0x3F, 0x97, 0xEC, 0x3F, 0x3F, /* 0x08-0x0B */
+	0x3F, 0x3F, 0xE8, 0xB7, 0xE8, 0xBE, 0xE8, 0xC0, /* 0x0C-0x0F */
+	0x3F, 0x3F, 0xE8, 0xBF, 0x3F, 0x3F, 0xE8, 0xBD, /* 0x10-0x13 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE8, 0xC1, 0x3F, 0x3F, /* 0x14-0x17 */
+	0x3F, 0x3F, 0xE8, 0xC2, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x18-0x1B */
+	0x91, 0x9A, 0x3F, 0x3F, 0x89, 0xE0, 0x3F, 0x3F, /* 0x1C-0x1F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */
-	0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x96, 0x00, /* 0x24-0x27 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0x28-0x2B */
+	0xE8, 0xC3, 0x3F, 0x3F, 0x3F, 0x3F, 0x96, 0xB6, /* 0x24-0x27 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE8, 0xC4, 0x3F, 0x3F, /* 0x28-0x2B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */
-	0x00, 0x00, 0x3F, 0x3F, 0x98, 0x49, 0x00, 0x00, /* 0x30-0x33 */
+	0xE8, 0xC5, 0x3F, 0x3F, 0x98, 0x49, 0xEE, 0xD1, /* 0x30-0x33 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */
-	0x9E, 0x50, 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x00, /* 0x38-0x3B */
-	0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, /* 0x3C-0x3F */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x43 */
-	0x00, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0x44-0x47 */
-	0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */
-	0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x00, /* 0x4C-0x4F */
-	0x3F, 0x3F, 0x00, 0x00, 0x90, 0x00, 0x3F, 0x3F, /* 0x50-0x53 */
-	0x3F, 0x3F, 0x00, 0x00, 0x96, 0x00, 0x3F, 0x3F, /* 0x54-0x57 */
-	0x3F, 0x3F, 0x90, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */
-	0x00, 0x00, 0x3F, 0x3F, 0x94, 0x00, 0x3F, 0x3F, /* 0x5C-0x5F */
-	0x00, 0x00, 0x00, 0x72, 0x96, 0x00, 0x3F, 0x3F, /* 0x60-0x63 */
-	0x00, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0x64-0x67 */
-	0x00, 0x00, 0x8A, 0x76, 0x3F, 0x3F, 0x00, 0x00, /* 0x68-0x6B */
+	0x9E, 0x50, 0xE8, 0xC6, 0x3F, 0x3F, 0xEE, 0xD2, /* 0x38-0x3B */
+	0x3F, 0x3F, 0xE8, 0xC7, 0xE8, 0xC8, 0x3F, 0x3F, /* 0x3C-0x3F */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE8, 0xCC, 0xEE, 0xD3, /* 0x40-0x43 */
+	0xE8, 0xC9, 0x3F, 0x3F, 0xE8, 0xCA, 0x3F, 0x3F, /* 0x44-0x47 */
+	0xE8, 0xCB, 0xE8, 0xCD, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */
+	0x3F, 0x3F, 0xEE, 0xD4, 0x3F, 0x3F, 0xEE, 0xD5, /* 0x4C-0x4F */
+	0x3F, 0x3F, 0xEE, 0xD6, 0x90, 0xC2, 0x3F, 0x3F, /* 0x50-0x53 */
+	0x3F, 0x3F, 0xEE, 0xD7, 0x96, 0xF5, 0x3F, 0x3F, /* 0x54-0x57 */
+	0x3F, 0x3F, 0x90, 0xC3, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */
+	0xE8, 0xCE, 0x3F, 0x3F, 0x94, 0xF1, 0x3F, 0x3F, /* 0x5C-0x5F */
+	0xE8, 0xCF, 0xEA, 0x72, 0x96, 0xCA, 0x3F, 0x3F, /* 0x60-0x63 */
+	0xE8, 0xD0, 0x3F, 0x3F, 0xE8, 0xD1, 0x3F, 0x3F, /* 0x64-0x67 */
+	0xE8, 0xD2, 0x8A, 0x76, 0x3F, 0x3F, 0xE8, 0xD4, /* 0x68-0x6B */
 	0x3F, 0x3F, 0x90, 0x78, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */
-	0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */
+	0x3F, 0x3F, 0xE8, 0xD5, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */
 	0x8C, 0x43, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x74-0x77 */
-	0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, /* 0x78-0x7B */
-	0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */
+	0x3F, 0x3F, 0xE8, 0xD6, 0xE8, 0xDA, 0x3F, 0x3F, /* 0x78-0x7B */
+	0xE8, 0xD8, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */
 	
-	0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */
-	0x8A, 0x93, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, /* 0x84-0x87 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0x88-0x8B */
-	0x3F, 0x3F, 0x88, 0x00, 0x3F, 0x3F, 0x00, 0x00, /* 0x8C-0x8F */
-	0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */
+	0x3F, 0x3F, 0xE8, 0xD9, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */
+	0x8A, 0x93, 0xE8, 0xD7, 0xE8, 0xDB, 0x3F, 0x3F, /* 0x84-0x87 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE8, 0xDC, /* 0x88-0x8B */
+	0x3F, 0x3F, 0x88, 0xC6, 0x3F, 0x3F, 0xE8, 0xDD, /* 0x8C-0x8F */
+	0xE8, 0xDE, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */
-	0x8F, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */
-	0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */
-	0x8B, 0x66, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0xA0-0xA3 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0xA4-0xA7 */
-	0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x91, /* 0xA8-0xAB */
-	0x3F, 0x3F, 0x95, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0xB0-0xB3 */
-	0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */
+	0x8F, 0xE2, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */
+	0xE8, 0xDF, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */
+	0x8B, 0x66, 0x3F, 0x3F, 0x3F, 0x3F, 0xE8, 0xE2, /* 0xA0-0xA3 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE8, 0xE1, 0x3F, 0x3F, /* 0xA4-0xA7 */
+	0xE8, 0xE0, 0x3F, 0x3F, 0x3F, 0x3F, 0xE6, 0x91, /* 0xA8-0xAB */
+	0x3F, 0x3F, 0x95, 0xDA, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE8, 0xE3, /* 0xB0-0xB3 */
+	0xE8, 0xE4, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0xC0-0xC3 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0xC4-0xC7 */
-	0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0xC8-0xCB */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE8, 0xE5, /* 0xC0-0xC3 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE8, 0xE6, 0x3F, 0x3F, /* 0xC4-0xC7 */
+	0xE8, 0xE7, 0x3F, 0x3F, 0x3F, 0x3F, 0xE8, 0xE8, /* 0xC8-0xCB */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x8A, 0x00, /* 0xD0-0xD3 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x8A, 0xD8, /* 0xD0-0xD3 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */
-	0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xDC-0xDF */
+	0xE8, 0xE9, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xDC-0xDF */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */
-	0x3F, 0x3F, 0x00, 0x00, 0x94, 0x42, 0x3F, 0x3F, /* 0xEC-0xEF */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x89, 0x00, /* 0xF0-0xF3 */
-	0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, /* 0xF4-0xF7 */
+	0x3F, 0x3F, 0xE8, 0xEA, 0x94, 0x42, 0x3F, 0x3F, /* 0xEC-0xEF */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE8, 0xEC, 0x89, 0xB9, /* 0xF0-0xF3 */
+	0x3F, 0x3F, 0xE8, 0xEF, 0xE8, 0xEE, 0x3F, 0x3F, /* 0xF4-0xF7 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x89, 0x43, /* 0xF8-0xFB */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x8B, 0x00, /* 0xFC-0xFF */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x8B, 0xBF, /* 0xFC-0xFF */
 };
 
 static unsigned char u2c_98[512] = {
-	0x3F, 0x3F, 0x95, 0x00, 0x92, 0x00, 0x8D, 0x00, /* 0x00-0x03 */
+	0x3F, 0x3F, 0x95, 0xC5, 0x92, 0xB8, 0x8D, 0xA0, /* 0x00-0x03 */
 	0x3F, 0x3F, 0x8D, 0x80, 0x8F, 0x87, 0x3F, 0x3F, /* 0x04-0x07 */
 	0x90, 0x7B, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x08-0x0B */
-	0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0x0C-0x0F */
-	0x97, 0x61, 0x8A, 0x00, 0x94, 0x00, 0x93, 0x00, /* 0x10-0x13 */
+	0xE8, 0xF1, 0x3F, 0x3F, 0x3F, 0x3F, 0xE8, 0xF0, /* 0x0C-0x0F */
+	0x97, 0x61, 0x8A, 0xE6, 0x94, 0xD0, 0x93, 0xDA, /* 0x10-0x13 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x90, 0x9C, /* 0x14-0x17 */
-	0x97, 0x00, 0x3F, 0x3F, 0x8C, 0x7A, 0x3F, 0x3F, /* 0x18-0x1B */
+	0x97, 0xCC, 0x3F, 0x3F, 0x8C, 0x7A, 0x3F, 0x3F, /* 0x18-0x1B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */
-	0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */
-	0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */
+	0x3F, 0x3F, 0xE8, 0xF4, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */
+	0xE8, 0xF3, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */
-	0x96, 0x6A, 0x93, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */
+	0x96, 0x6A, 0x93, 0xAA, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */
-	0x89, 0x6F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0x34-0x37 */
-	0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x95, 0x70, /* 0x38-0x3B */
-	0x97, 0x8A, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */
+	0x89, 0x6F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE8, 0xF5, /* 0x34-0x37 */
+	0xE8, 0xF2, 0x3F, 0x3F, 0x3F, 0x3F, 0x95, 0x70, /* 0x38-0x3B */
+	0x97, 0x8A, 0xE8, 0xF6, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0x44-0x47 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0x48-0x4B */
-	0x91, 0x00, 0x8A, 0x7A, 0x8A, 0x7B, 0x00, 0x00, /* 0x4C-0x4F */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE8, 0xF7, 0x3F, 0x3F, /* 0x44-0x47 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE8, 0xF9, /* 0x48-0x4B */
+	0x91, 0xE8, 0x8A, 0x7A, 0x8A, 0x7B, 0xE8, 0xF8, /* 0x4C-0x4F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */
-	0x8A, 0x00, 0x8C, 0x00, 0x3F, 0x3F, 0x00, 0x00, /* 0x54-0x57 */
-	0x8A, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x93, 0x5E, /* 0x58-0x5B */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x97, 0x00, 0x3F, 0x3F, /* 0x5C-0x5F */
+	0x8A, 0xE7, 0x8C, 0xB0, 0x3F, 0x3F, 0xEE, 0xD8, /* 0x54-0x57 */
+	0x8A, 0xE8, 0x3F, 0x3F, 0x3F, 0x3F, 0x93, 0x5E, /* 0x58-0x5B */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x97, 0xDE, 0x3F, 0x3F, /* 0x5C-0x5F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x60-0x63 */
-	0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, 0x8C, 0x00, /* 0x64-0x67 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0x68-0x6B */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0x6C-0x6F */
-	0x00, 0x00, 0x00, 0x40, 0x3F, 0x3F, 0x00, 0x42, /* 0x70-0x73 */
-	0x00, 0x41, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x74-0x77 */
+	0x3F, 0x3F, 0xEE, 0xD9, 0x3F, 0x3F, 0x8C, 0xDA, /* 0x64-0x67 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE8, 0xFA, /* 0x68-0x6B */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE8, 0xFB, /* 0x6C-0x6F */
+	0xE8, 0xFC, 0xE9, 0x40, 0x3F, 0x3F, 0xE9, 0x42, /* 0x70-0x73 */
+	0xE9, 0x41, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x74-0x77 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */
 	
@@ -8998,53 +9000,53 @@
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */
-	0x95, 0x97, 0x3F, 0x3F, 0x00, 0x43, 0x3F, 0x3F, /* 0xA8-0xAB */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x44, /* 0xAC-0xAF */
-	0x3F, 0x3F, 0x00, 0x45, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB0-0xB3 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x46, 0x3F, 0x3F, /* 0xB4-0xB7 */
+	0x95, 0x97, 0x3F, 0x3F, 0xE9, 0x43, 0x3F, 0x3F, /* 0xA8-0xAB */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE9, 0x44, /* 0xAC-0xAF */
+	0x3F, 0x3F, 0xE9, 0x45, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB0-0xB3 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE9, 0x46, 0x3F, 0x3F, /* 0xB4-0xB7 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x48, /* 0xC0-0xC3 */
-	0x00, 0x47, 0x3F, 0x3F, 0x00, 0x49, 0x3F, 0x3F, /* 0xC4-0xC7 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE9, 0x48, /* 0xC0-0xC3 */
+	0xE9, 0x47, 0x3F, 0x3F, 0xE9, 0x49, 0x3F, 0x3F, /* 0xC4-0xC7 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC8-0xCB */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x94, 0x00, /* 0xD8-0xDB */
-	0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x90, 0x48, /* 0xDC-0xDF */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x94, 0xF2, /* 0xD8-0xDB */
+	0xE3, 0xCA, 0x3F, 0x3F, 0x3F, 0x3F, 0x90, 0x48, /* 0xDC-0xDF */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x8B, 0x51, 0x3F, 0x3F, /* 0xE0-0xE3 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */
-	0x3F, 0x3F, 0x00, 0x4A, 0x3F, 0x3F, 0x00, 0x4B, /* 0xE8-0xEB */
-	0x3F, 0x3F, 0x99, 0x00, 0x9F, 0x5A, 0x94, 0x00, /* 0xEC-0xEF */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x88, 0x00, 0x3F, 0x3F, /* 0xF0-0xF3 */
-	0x88, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */
+	0x3F, 0x3F, 0xE9, 0x4A, 0x3F, 0x3F, 0xE9, 0x4B, /* 0xE8-0xEB */
+	0x3F, 0x3F, 0x99, 0xAA, 0x9F, 0x5A, 0x94, 0xD1, /* 0xEC-0xEF */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x88, 0xF9, 0x3F, 0x3F, /* 0xF0-0xF3 */
+	0x88, 0xB9, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF8-0xFB */
-	0x8E, 0x94, 0x96, 0x4F, 0x8F, 0x00, 0x3F, 0x3F, /* 0xFC-0xFF */
+	0x8E, 0x94, 0x96, 0x4F, 0x8F, 0xFC, 0x3F, 0x3F, /* 0xFC-0xFF */
 };
 
 static unsigned char u2c_99[512] = {
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x4C, /* 0x00-0x03 */
-	0x3F, 0x3F, 0x96, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x04-0x07 */
-	0x3F, 0x3F, 0x00, 0x4D, 0x97, 0x7B, 0x3F, 0x3F, /* 0x08-0x0B */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE9, 0x4C, /* 0x00-0x03 */
+	0x3F, 0x3F, 0x96, 0xDD, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x04-0x07 */
+	0x3F, 0x3F, 0xE9, 0x4D, 0x97, 0x7B, 0x3F, 0x3F, /* 0x08-0x0B */
 	0x89, 0x61, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */
-	0x8E, 0x60, 0x3F, 0x3F, 0x00, 0x4E, 0x89, 0x00, /* 0x10-0x13 */
-	0x00, 0x4F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */
-	0x00, 0x50, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x18-0x1B */
-	0x3F, 0x3F, 0x00, 0x52, 0x00, 0x53, 0x3F, 0x3F, /* 0x1C-0x1F */
-	0x00, 0x55, 0x00, 0x51, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */
-	0x00, 0x54, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0x24-0x27 */
-	0x8A, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */
-	0x00, 0x56, 0x3F, 0x3F, 0x00, 0x57, 0x3F, 0x3F, /* 0x2C-0x2F */
+	0x8E, 0x60, 0x3F, 0x3F, 0xE9, 0x4E, 0x89, 0xEC, /* 0x10-0x13 */
+	0xE9, 0x4F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */
+	0xE9, 0x50, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x18-0x1B */
+	0x3F, 0x3F, 0xE9, 0x52, 0xE9, 0x53, 0x3F, 0x3F, /* 0x1C-0x1F */
+	0xE9, 0x55, 0xE9, 0x51, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */
+	0xE9, 0x54, 0x3F, 0x3F, 0x3F, 0x3F, 0xEE, 0xDC, /* 0x24-0x27 */
+	0x8A, 0xD9, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */
+	0xE9, 0x56, 0x3F, 0x3F, 0xE9, 0x57, 0x3F, 0x3F, /* 0x2C-0x2F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x38-0x3B */
-	0x3F, 0x3F, 0x00, 0x58, 0x00, 0x59, 0x3F, 0x3F, /* 0x3C-0x3F */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x5A, 0x3F, 0x3F, /* 0x40-0x43 */
-	0x3F, 0x3F, 0x00, 0x5C, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */
-	0x3F, 0x3F, 0x00, 0x5B, 0x3F, 0x3F, 0x00, 0x5E, /* 0x48-0x4B */
-	0x00, 0x61, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x4C-0x4F */
-	0x00, 0x5D, 0x00, 0x5F, 0x00, 0x60, 0x3F, 0x3F, /* 0x50-0x53 */
-	0x3F, 0x3F, 0x00, 0x62, 0x3F, 0x3F, 0x8B, 0x00, /* 0x54-0x57 */
+	0x3F, 0x3F, 0xE9, 0x58, 0xE9, 0x59, 0x3F, 0x3F, /* 0x3C-0x3F */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE9, 0x5A, 0x3F, 0x3F, /* 0x40-0x43 */
+	0x3F, 0x3F, 0xE9, 0x5C, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */
+	0x3F, 0x3F, 0xE9, 0x5B, 0x3F, 0x3F, 0xE9, 0x5E, /* 0x48-0x4B */
+	0xE9, 0x61, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x4C-0x4F */
+	0xE9, 0x5D, 0xE9, 0x5F, 0xE9, 0x60, 0x3F, 0x3F, /* 0x50-0x53 */
+	0x3F, 0x3F, 0xE9, 0x62, 0x3F, 0x3F, 0x8B, 0xC0, /* 0x54-0x57 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x5C-0x5F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x60-0x63 */
@@ -9061,63 +9063,63 @@
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x88-0x8B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x8E, 0x00, 0x00, 0x63, /* 0x94-0x97 */
-	0x00, 0x64, 0x8D, 0x81, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0x9C-0x9F */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x8E, 0xF1, 0xE9, 0x63, /* 0x94-0x97 */
+	0xE9, 0x64, 0x8D, 0x81, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xEE, 0xDE, 0x3F, 0x3F, /* 0x9C-0x9F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */
-	0x3F, 0x3F, 0x00, 0x65, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */
+	0x3F, 0x3F, 0xE9, 0x65, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */
 	0x8A, 0x5D, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */
-	0x94, 0x6E, 0x00, 0x66, 0x00, 0x67, 0x3F, 0x3F, /* 0xAC-0xAF */
+	0x94, 0x6E, 0xE9, 0x66, 0xE9, 0x67, 0x3F, 0x3F, /* 0xAC-0xAF */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x92, 0x79, /* 0xB0-0xB3 */
-	0x93, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */
+	0x93, 0xE9, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */
-	0x00, 0x68, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */
+	0xE9, 0x68, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */
 	0x3F, 0x3F, 0x94, 0x9D, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */
-	0x91, 0x00, 0x89, 0x77, 0x8B, 0x00, 0x3F, 0x3F, /* 0xC4-0xC7 */
-	0x8B, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC8-0xCB */
+	0x91, 0xCA, 0x89, 0x77, 0x8B, 0xEC, 0x3F, 0x3F, /* 0xC4-0xC7 */
+	0x8B, 0xED, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC8-0xCB */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */
-	0x92, 0x93, 0x00, 0x6D, 0x8B, 0x00, 0x3F, 0x3F, /* 0xD0-0xD3 */
-	0x3F, 0x3F, 0x89, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */
-	0x00, 0x6C, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x6A, /* 0xD8-0xDB */
-	0x3F, 0x3F, 0x00, 0x6B, 0x3F, 0x3F, 0x00, 0x69, /* 0xDC-0xDF */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x77, 0x3F, 0x3F, /* 0xE0-0xE3 */
+	0x92, 0x93, 0xE9, 0x6D, 0x8B, 0xEE, 0x3F, 0x3F, /* 0xD0-0xD3 */
+	0x3F, 0x3F, 0x89, 0xED, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */
+	0xE9, 0x6C, 0x3F, 0x3F, 0x3F, 0x3F, 0xE9, 0x6A, /* 0xD8-0xDB */
+	0x3F, 0x3F, 0xE9, 0x6B, 0x3F, 0x3F, 0xE9, 0x69, /* 0xDC-0xDF */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE9, 0x77, 0x3F, 0x3F, /* 0xE0-0xE3 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */
-	0x3F, 0x3F, 0x00, 0x6E, 0x00, 0x6F, 0x3F, 0x3F, /* 0xEC-0xEF */
-	0x3F, 0x3F, 0x00, 0x70, 0x00, 0x71, 0x3F, 0x3F, /* 0xF0-0xF3 */
+	0x3F, 0x3F, 0xE9, 0x6E, 0xE9, 0x6F, 0x3F, 0x3F, /* 0xEC-0xEF */
+	0x3F, 0x3F, 0xE9, 0x70, 0xE9, 0x71, 0x3F, 0x3F, /* 0xF0-0xF3 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */
-	0x00, 0x73, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x72, /* 0xF8-0xFB */
+	0xE9, 0x73, 0x3F, 0x3F, 0x3F, 0x3F, 0xE9, 0x72, /* 0xF8-0xFB */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x8F, 0x78, /* 0xFC-0xFF */
 };
 
 static unsigned char u2c_9A[512] = {
-	0x3F, 0x3F, 0x00, 0x74, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */
-	0x3F, 0x3F, 0x00, 0x76, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x04-0x07 */
+	0x3F, 0x3F, 0xE9, 0x74, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */
+	0x3F, 0x3F, 0xE9, 0x76, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x04-0x07 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x08-0x0B */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x8B, 0x52, 0x00, 0x75, /* 0x0C-0x0F */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x91, 0x9B, 0x8C, 0x00, /* 0x10-0x13 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x8B, 0x52, 0xE9, 0x75, /* 0x0C-0x0F */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x91, 0x9B, 0x8C, 0xB1, /* 0x10-0x13 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */
-	0x3F, 0x3F, 0x00, 0x78, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x18-0x1B */
+	0x3F, 0x3F, 0xE9, 0x78, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x18-0x1B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */
-	0x91, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x79, /* 0x28-0x2B */
+	0x91, 0xCB, 0x3F, 0x3F, 0x3F, 0x3F, 0xE9, 0x79, /* 0x28-0x2B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */
-	0x93, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x7A, /* 0x34-0x37 */
+	0x93, 0xAB, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE9, 0x7A, /* 0x34-0x37 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x38-0x3B */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x80, 0x3F, 0x3F, /* 0x3C-0x3F */
-	0x00, 0x7D, 0x3F, 0x3F, 0x00, 0x7C, 0x00, 0x7E, /* 0x40-0x43 */
-	0x3F, 0x3F, 0x00, 0x7B, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE9, 0x80, 0x3F, 0x3F, /* 0x3C-0x3F */
+	0xE9, 0x7D, 0x3F, 0x3F, 0xE9, 0x7C, 0xE9, 0x7E, /* 0x40-0x43 */
+	0x3F, 0x3F, 0xE9, 0x7B, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */
-	0x3F, 0x3F, 0x00, 0x82, 0x00, 0x00, 0x3F, 0x3F, /* 0x4C-0x4F */
+	0x3F, 0x3F, 0xE9, 0x82, 0xEE, 0xDF, 0x3F, 0x3F, /* 0x4C-0x4F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */
-	0x3F, 0x3F, 0x00, 0x81, 0x3F, 0x3F, 0x00, 0x84, /* 0x54-0x57 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x8B, 0x00, 0x00, 0x83, /* 0x58-0x5B */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x85, /* 0x5C-0x5F */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x86, 0x3F, 0x3F, /* 0x60-0x63 */
-	0x00, 0x88, 0x00, 0x87, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */
-	0x3F, 0x3F, 0x00, 0x89, 0x00, 0x8B, 0x00, 0x8A, /* 0x68-0x6B */
+	0x3F, 0x3F, 0xE9, 0x81, 0x3F, 0x3F, 0xE9, 0x84, /* 0x54-0x57 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x8B, 0xC1, 0xE9, 0x83, /* 0x58-0x5B */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE9, 0x85, /* 0x5C-0x5F */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE9, 0x86, 0x3F, 0x3F, /* 0x60-0x63 */
+	0xE9, 0x88, 0xE9, 0x87, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */
+	0x3F, 0x3F, 0xE9, 0x89, 0xE9, 0x8B, 0xE9, 0x8A, /* 0x68-0x6B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x74-0x77 */
@@ -9135,129 +9137,129 @@
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */
 	0x8D, 0x9C, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */
-	0x3F, 0x3F, 0x00, 0x8C, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */
-	0x00, 0x8D, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB0-0xB3 */
+	0x3F, 0x3F, 0xE9, 0x8C, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */
+	0xE9, 0x8D, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB0-0xB3 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */
 	0x8A, 0x5B, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */
-	0x00, 0x8E, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */
-	0x00, 0x8F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */
+	0xE9, 0x8E, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */
+	0xE9, 0x8F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */
 	0x90, 0x91, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC4-0xC7 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC8-0xCB */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x90, /* 0xCC-0xCF */
-	0x3F, 0x3F, 0x00, 0x91, 0x3F, 0x3F, 0x00, 0x92, /* 0xD0-0xD3 */
-	0x00, 0x93, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */
-	0x8D, 0x82, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */
-	0x00, 0x40, 0x3F, 0x3F, 0x00, 0x94, 0x00, 0x95, /* 0xDC-0xDF */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x96, 0x00, 0x97, /* 0xE0-0xE3 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x98, 0x3F, 0x3F, /* 0xE4-0xE7 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x94, 0x00, 0x00, 0x9A, /* 0xE8-0xEB */
-	0x3F, 0x3F, 0x95, 0x45, 0x00, 0x9B, 0x00, 0x99, /* 0xEC-0xEF */
-	0x3F, 0x3F, 0x00, 0x9D, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */
-	0x00, 0x9C, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x9E, /* 0xF4-0xF7 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x9F, /* 0xF8-0xFB */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE9, 0x90, /* 0xCC-0xCF */
+	0x3F, 0x3F, 0xE9, 0x91, 0x3F, 0x3F, 0xE9, 0x92, /* 0xD0-0xD3 */
+	0xE9, 0x93, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */
+	0x8D, 0x82, 0xEE, 0xE0, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */
+	0xEE, 0xE1, 0x3F, 0x3F, 0xE9, 0x94, 0xE9, 0x95, /* 0xDC-0xDF */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE9, 0x96, 0xE9, 0x97, /* 0xE0-0xE3 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE9, 0x98, 0x3F, 0x3F, /* 0xE4-0xE7 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x94, 0xAF, 0xE9, 0x9A, /* 0xE8-0xEB */
+	0x3F, 0x3F, 0x95, 0x45, 0xE9, 0x9B, 0xE9, 0x99, /* 0xEC-0xEF */
+	0x3F, 0x3F, 0xE9, 0x9D, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */
+	0xE9, 0x9C, 0x3F, 0x3F, 0x3F, 0x3F, 0xE9, 0x9E, /* 0xF4-0xF7 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE9, 0x9F, /* 0xF8-0xFB */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */
 };
 
 static unsigned char u2c_9B[512] = {
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0x04-0x07 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE9, 0xA0, 0x3F, 0x3F, /* 0x04-0x07 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x08-0x0B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */
-	0x00, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0x18-0x1B */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0x1C-0x1F */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x23 */
-	0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x00, /* 0x24-0x27 */
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, /* 0x28-0x2B */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, /* 0x2C-0x2F */
-	0x3F, 0x3F, 0x9F, 0x54, 0x00, 0x00, 0x3F, 0x3F, /* 0x30-0x33 */
+	0xE9, 0xA1, 0x3F, 0x3F, 0xE9, 0xA2, 0x3F, 0x3F, /* 0x18-0x1B */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE9, 0xA3, /* 0x1C-0x1F */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE9, 0xA4, 0xE9, 0xA5, /* 0x20-0x23 */
+	0x3F, 0x3F, 0xE9, 0xA6, 0x3F, 0x3F, 0xE9, 0xA7, /* 0x24-0x27 */
+	0xE9, 0xA8, 0xE9, 0xA9, 0xE9, 0xAA, 0x3F, 0x3F, /* 0x28-0x2B */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE9, 0xAB, 0xE9, 0xAC, /* 0x2C-0x2F */
+	0x3F, 0x3F, 0x9F, 0x54, 0xE9, 0xAD, 0x3F, 0x3F, /* 0x30-0x33 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0x38-0x3B */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE2, 0xF6, /* 0x38-0x3B */
 	0x8B, 0x53, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */
-	0x3F, 0x3F, 0x8A, 0x40, 0x8D, 0x00, 0x00, 0x00, /* 0x40-0x43 */
-	0x00, 0x00, 0x96, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */
+	0x3F, 0x3F, 0x8A, 0x40, 0x8D, 0xB0, 0xE9, 0xAF, /* 0x40-0x43 */
+	0xE9, 0xAE, 0x96, 0xA3, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */
-	0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x4C-0x4F */
-	0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */
+	0x3F, 0x3F, 0xE9, 0xB1, 0xE9, 0xB2, 0xE9, 0xB0, /* 0x4C-0x4F */
+	0x3F, 0x3F, 0xE9, 0xB3, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */
 	0x96, 0x82, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */
-	0x00, 0x00, 0x3F, 0x3F, 0x8B, 0x9B, 0x3F, 0x3F, /* 0x58-0x5B */
+	0xE9, 0xB4, 0x3F, 0x3F, 0x8B, 0x9B, 0x3F, 0x3F, /* 0x58-0x5B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x5C-0x5F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x60-0x63 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x68-0x6B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x98, 0x44, /* 0x6C-0x6F */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x42, 0x3F, 0x3F, /* 0x70-0x73 */
-	0x00, 0x00, 0x00, 0x41, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x74-0x77 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xEE, 0xE3, 0x3F, 0x3F, /* 0x70-0x73 */
+	0xE9, 0xB5, 0xEE, 0xE2, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x74-0x77 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */
 	
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0x80-0x83 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE9, 0xB7, /* 0x80-0x83 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x88-0x8B */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x88, 0x00, 0x00, 0x43, /* 0x8C-0x8F */
-	0x3F, 0x3F, 0x00, 0x00, 0x95, 0x00, 0x00, 0x00, /* 0x90-0x93 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, /* 0x94-0x97 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x88, 0xBC, 0xEE, 0xE4, /* 0x8C-0x8F */
+	0x3F, 0x3F, 0xE9, 0xB8, 0x95, 0xA9, 0xE9, 0xB6, /* 0x90-0x93 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE9, 0xB9, 0xE9, 0xBA, /* 0x94-0x97 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0x9C-0x9F */
-	0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE9, 0xBB, /* 0x9C-0x9F */
+	0xE9, 0xBC, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */
-	0x00, 0x00, 0x3F, 0x3F, 0x96, 0x8E, 0x8E, 0x4C, /* 0xA8-0xAB */
-	0x3F, 0x3F, 0x8D, 0x00, 0x91, 0x4E, 0x3F, 0x3F, /* 0xAC-0xAF */
-	0x3F, 0x3F, 0x00, 0x44, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB0-0xB3 */
-	0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */
-	0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x45, /* 0xB8-0xBB */
+	0xE9, 0xBD, 0x3F, 0x3F, 0x96, 0x8E, 0x8E, 0x4C, /* 0xA8-0xAB */
+	0x3F, 0x3F, 0x8D, 0xF8, 0x91, 0x4E, 0x3F, 0x3F, /* 0xAC-0xAF */
+	0x3F, 0x3F, 0xEE, 0xE5, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB0-0xB3 */
+	0xE9, 0xBE, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */
+	0x3F, 0x3F, 0xE9, 0xC1, 0x3F, 0x3F, 0xEE, 0xE6, /* 0xB8-0xBB */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */
-	0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0xC4-0xC7 */
-	0x3F, 0x3F, 0x8C, 0x00, 0x00, 0x00, 0x3F, 0x3F, /* 0xC8-0xCB */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0xCC-0xCF */
-	0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, /* 0xD0-0xD3 */
-	0x00, 0x00, 0x3F, 0x3F, 0x8E, 0x49, 0x3F, 0x3F, /* 0xD4-0xD7 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x91, 0x00, /* 0xD8-0xDB */
+	0xE9, 0xBF, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE9, 0xC2, 0x3F, 0x3F, /* 0xC4-0xC7 */
+	0x3F, 0x3F, 0x8C, 0xEF, 0xE9, 0xC0, 0x3F, 0x3F, /* 0xC8-0xCB */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE9, 0xC3, /* 0xCC-0xCF */
+	0x3F, 0x3F, 0xE9, 0xC4, 0xE9, 0xC5, 0x3F, 0x3F, /* 0xD0-0xD3 */
+	0xE9, 0xC9, 0x3F, 0x3F, 0x8E, 0x49, 0x3F, 0x3F, /* 0xD4-0xD7 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x91, 0xE2, /* 0xD8-0xDB */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xDC-0xDF */
-	0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xE0-0xE3 */
-	0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */
+	0x3F, 0x3F, 0xE9, 0xCA, 0xE9, 0xC7, 0xE9, 0xC6, /* 0xE0-0xE3 */
+	0xE9, 0xC8, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */
 	0x8C, 0x7E, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, /* 0xF0-0xF3 */
-	0x3F, 0x3F, 0x88, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */
+	0xE9, 0xCE, 0xE9, 0xCD, 0xE9, 0xCC, 0x3F, 0x3F, /* 0xF0-0xF3 */
+	0x3F, 0x3F, 0x88, 0xB1, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF8-0xFB */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */
 };
 
 static unsigned char u2c_9C[512] = {
-	0x00, 0x46, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */
-	0x00, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0x04-0x07 */
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, /* 0x08-0x0B */
-	0x00, 0x00, 0x8A, 0x82, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */
-	0x98, 0x6B, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, /* 0x10-0x13 */
-	0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0x18-0x1B */
+	0xEE, 0xE7, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */
+	0xE9, 0xD8, 0x3F, 0x3F, 0xE9, 0xD4, 0x3F, 0x3F, /* 0x04-0x07 */
+	0xE9, 0xD5, 0xE9, 0xD1, 0xE9, 0xD7, 0x3F, 0x3F, /* 0x08-0x0B */
+	0xE9, 0xD3, 0x8A, 0x82, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */
+	0x98, 0x6B, 0x3F, 0x3F, 0xE9, 0xD6, 0xE9, 0xD2, /* 0x10-0x13 */
+	0xE9, 0xD0, 0xE9, 0xCF, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE9, 0xDA, /* 0x18-0x1B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */
-	0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */
-	0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */
+	0x3F, 0x3F, 0xE9, 0xDD, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */
+	0xE9, 0xDC, 0xE9, 0xDB, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */
-	0x3F, 0x3F, 0x95, 0x68, 0x00, 0x00, 0x88, 0x00, /* 0x2C-0x2F */
-	0x00, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0x30-0x33 */
+	0x3F, 0x3F, 0x95, 0x68, 0xE9, 0xD9, 0x88, 0xF1, /* 0x2C-0x2F */
+	0xE9, 0xDE, 0x3F, 0x3F, 0xE9, 0xE0, 0x3F, 0x3F, /* 0x30-0x33 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */
-	0x3F, 0x3F, 0x8A, 0x8F, 0x00, 0x00, 0x89, 0x56, /* 0x38-0x3B */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0x3C-0x3F */
+	0x3F, 0x3F, 0x8A, 0x8F, 0xE9, 0xCB, 0x89, 0x56, /* 0x38-0x3B */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE9, 0xE2, 0x3F, 0x3F, /* 0x3C-0x3F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, /* 0x44-0x47 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE9, 0xE1, 0xE9, 0xDF, /* 0x44-0x47 */
 	0x92, 0x4C, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x4C-0x4F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x96, 0x90, 0x3F, 0x3F, /* 0x50-0x53 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x97, 0x00, /* 0x54-0x57 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0x58-0x5B */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x97, 0xD8, /* 0x54-0x57 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE9, 0xE3, 0x3F, 0x3F, /* 0x58-0x5B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x5C-0x5F */
-	0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x60-0x63 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0x64-0x67 */
+	0xE9, 0xE4, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x60-0x63 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE9, 0xE5, /* 0x64-0x67 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x68-0x6B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0x74-0x77 */
-	0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE9, 0xE6, 0x3F, 0x3F, /* 0x74-0x77 */
+	0xE9, 0xE7, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */
 	
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */
@@ -9285,81 +9287,81 @@
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xDC-0xDF */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */
-	0x3F, 0x3F, 0x92, 0x00, 0x3F, 0x3F, 0x00, 0x00, /* 0xE4-0xE7 */
-	0x3F, 0x3F, 0x94, 0x00, 0x3F, 0x3F, 0x00, 0x00, /* 0xE8-0xEB */
-	0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */
-	0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x96, 0x50, /* 0xF0-0xF3 */
-	0x96, 0x00, 0x3F, 0x3F, 0x93, 0x00, 0x3F, 0x3F, /* 0xF4-0xF7 */
+	0x3F, 0x3F, 0x92, 0xB9, 0x3F, 0x3F, 0xE9, 0xE8, /* 0xE4-0xE7 */
+	0x3F, 0x3F, 0x94, 0xB5, 0x3F, 0x3F, 0xE9, 0xED, /* 0xE8-0xEB */
+	0xE9, 0xE9, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */
+	0xE9, 0xEA, 0x3F, 0x3F, 0x3F, 0x3F, 0x96, 0x50, /* 0xF0-0xF3 */
+	0x96, 0xC2, 0x3F, 0x3F, 0x93, 0xCE, 0x3F, 0x3F, /* 0xF4-0xF7 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF8-0xFB */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */
 };
 
 static unsigned char u2c_9D[512] = {
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0x00-0x03 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x93, 0x00, /* 0x04-0x07 */
-	0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x08-0x0B */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x89, 0x00, 0x3F, 0x3F, /* 0x0C-0x0F */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0x10-0x13 */
-	0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE9, 0xEE, /* 0x00-0x03 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE9, 0xEF, 0x93, 0xBC, /* 0x04-0x07 */
+	0xE9, 0xEC, 0xE9, 0xEB, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x08-0x0B */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x89, 0xA8, 0x3F, 0x3F, /* 0x0C-0x0F */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE9, 0xF7, 0x3F, 0x3F, /* 0x10-0x13 */
+	0x3F, 0x3F, 0xE9, 0xF6, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x89, 0x95, /* 0x18-0x1B */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0x1C-0x1F */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0x20-0x23 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0x24-0x27 */
-	0x8A, 0x9B, 0x3F, 0x3F, 0x00, 0x00, 0x8E, 0x00, /* 0x28-0x2B */
-	0x89, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE9, 0xF4, /* 0x1C-0x1F */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE9, 0xF3, /* 0x20-0x23 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE9, 0xF1, 0x3F, 0x3F, /* 0x24-0x27 */
+	0x8A, 0x9B, 0x3F, 0x3F, 0xE9, 0xF0, 0x8E, 0xB0, /* 0x28-0x2B */
+	0x89, 0xA7, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x8D, 0x83, /* 0x38-0x3B */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, /* 0x3C-0x3F */
-	0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */
-	0x00, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0x44-0x47 */
-	0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE9, 0xFA, 0xE9, 0xF9, /* 0x3C-0x3F */
+	0x3F, 0x3F, 0xE9, 0xF8, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */
+	0xE9, 0xF5, 0x3F, 0x3F, 0xE9, 0xFB, 0x3F, 0x3F, /* 0x44-0x47 */
+	0xE9, 0xFC, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x4C-0x4F */
-	0x00, 0x44, 0x00, 0x43, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */
+	0xEA, 0x44, 0xEA, 0x43, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */
-	0x3F, 0x3F, 0x00, 0x45, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */
-	0x89, 0x4C, 0x00, 0x40, 0x00, 0x41, 0x3F, 0x3F, /* 0x5C-0x5F */
-	0x8D, 0x94, 0x96, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x60-0x63 */
-	0x00, 0x42, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x48, /* 0x68-0x6B */
-	0x96, 0x51, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x4A, /* 0x6C-0x6F */
-	0x00, 0x47, 0x3F, 0x3F, 0x00, 0x46, 0x3F, 0x3F, /* 0x70-0x73 */
+	0x3F, 0x3F, 0xEA, 0x45, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */
+	0x89, 0x4C, 0xEA, 0x40, 0xEA, 0x41, 0x3F, 0x3F, /* 0x5C-0x5F */
+	0x8D, 0x94, 0x96, 0xB7, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x60-0x63 */
+	0xEA, 0x42, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xEE, 0xE9, /* 0x68-0x6B */
+	0x96, 0x51, 0x3F, 0x3F, 0x3F, 0x3F, 0xEA, 0x4A, /* 0x6C-0x6F */
+	0xEE, 0xE8, 0x3F, 0x3F, 0xEA, 0x46, 0x3F, 0x3F, /* 0x70-0x73 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x74-0x77 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x4B, 0x3F, 0x3F, /* 0x78-0x7B */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xEA, 0x4B, 0x3F, 0x3F, /* 0x78-0x7B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */
 	
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x48, /* 0x84-0x87 */
-	0x3F, 0x3F, 0x00, 0x47, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x88-0x8B */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xEA, 0x48, /* 0x84-0x87 */
+	0x3F, 0x3F, 0xEA, 0x47, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x88-0x8B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x8C, 0x7B, /* 0x8C-0x8F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x4C, 0x3F, 0x3F, /* 0x98-0x9B */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xEA, 0x4C, 0x3F, 0x3F, /* 0x98-0x9B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */
-	0x00, 0x4D, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */
-	0x3F, 0x3F, 0x00, 0x4E, 0x3F, 0x3F, 0x00, 0x49, /* 0xA8-0xAB */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0xAC-0xAF */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x4F, 0x3F, 0x3F, /* 0xB0-0xB3 */
-	0x92, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */
-	0x00, 0x53, 0x3F, 0x3F, 0x00, 0x54, 0x00, 0x52, /* 0xB8-0xBB */
+	0xEA, 0x4D, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */
+	0x3F, 0x3F, 0xEA, 0x4E, 0x3F, 0x3F, 0xEA, 0x49, /* 0xA8-0xAB */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE9, 0xF2, /* 0xAC-0xAF */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xEA, 0x4F, 0x3F, 0x3F, /* 0xB0-0xB3 */
+	0x92, 0xDF, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */
+	0xEA, 0x53, 0x3F, 0x3F, 0xEA, 0x54, 0xEA, 0x52, /* 0xB8-0xBB */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */
-	0x3F, 0x3F, 0x00, 0x51, 0x00, 0x57, 0x3F, 0x3F, /* 0xC0-0xC3 */
-	0x00, 0x50, 0x3F, 0x3F, 0x00, 0x55, 0x3F, 0x3F, /* 0xC4-0xC7 */
+	0x3F, 0x3F, 0xEA, 0x51, 0xEA, 0x57, 0x3F, 0x3F, /* 0xC0-0xC3 */
+	0xEA, 0x50, 0x3F, 0x3F, 0xEA, 0x55, 0x3F, 0x3F, /* 0xC4-0xC7 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC8-0xCB */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x56, /* 0xCC-0xCF */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x59, /* 0xD0-0xD3 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xEA, 0x56, /* 0xCC-0xCF */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xEA, 0x59, /* 0xD0-0xD3 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */
-	0x3F, 0x3F, 0x00, 0x58, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */
+	0x3F, 0x3F, 0xEA, 0x58, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xDC-0xDF */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x5B, 0x3F, 0x3F, /* 0xE4-0xE7 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xEA, 0x5B, 0x3F, 0x3F, /* 0xE4-0xE7 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */
-	0x3F, 0x3F, 0x00, 0x5C, 0x3F, 0x3F, 0x00, 0x5D, /* 0xEC-0xEF */
+	0x3F, 0x3F, 0xEA, 0x5C, 0x3F, 0x3F, 0xEA, 0x5D, /* 0xEC-0xEF */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x98, 0x68, 0x3F, 0x3F, /* 0xF0-0xF3 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */
-	0x00, 0x5A, 0x91, 0x00, 0x8D, 0x00, 0x3F, 0x3F, /* 0xF8-0xFB */
-	0x3F, 0x3F, 0x00, 0x5E, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */
+	0xEA, 0x5A, 0x91, 0xE9, 0x8D, 0xEB, 0x3F, 0x3F, /* 0xF8-0xFB */
+	0x3F, 0x3F, 0xEA, 0x5E, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */
 };
 
 static unsigned char u2c_9E[512] = {
@@ -9369,8 +9371,8 @@
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */
-	0x3F, 0x3F, 0x00, 0x4A, 0x00, 0x5F, 0x00, 0x60, /* 0x18-0x1B */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x61, 0x3F, 0x3F, /* 0x1C-0x1F */
+	0x3F, 0x3F, 0xEE, 0xEB, 0xEA, 0x5F, 0xEA, 0x60, /* 0x18-0x1B */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xEA, 0x61, 0x3F, 0x3F, /* 0x1C-0x1F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */
@@ -9392,87 +9394,155 @@
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x68-0x6B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */
-	0x3F, 0x3F, 0x00, 0x62, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x74-0x77 */
-	0x8C, 0x00, 0x00, 0x63, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */
-	0x3F, 0x3F, 0x00, 0x64, 0x3F, 0x3F, 0x8E, 0x00, /* 0x7C-0x7F */
-	
-	0x3F, 0x3F, 0x00, 0x65, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */
-	0x00, 0x66, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x67, /* 0x88-0x8B */
-	0x00, 0x68, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */
-	0x3F, 0x3F, 0x00, 0x6B, 0x00, 0x69, 0x98, 0x5B, /* 0x90-0x93 */
-	0x3F, 0x3F, 0x00, 0x6A, 0x3F, 0x3F, 0x97, 0x00, /* 0x94-0x97 */
+	0x3F, 0x3F, 0xEA, 0x62, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x74-0x77 */
+	0x8C, 0xB2, 0xEA, 0x63, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */
+	0x3F, 0x3F, 0xEA, 0x64, 0x3F, 0x3F, 0x8E, 0xAD, /* 0x7C-0x7F */
+	
+	0x3F, 0x3F, 0xEA, 0x65, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */
+	0xEA, 0x66, 0x3F, 0x3F, 0x3F, 0x3F, 0xEA, 0x67, /* 0x88-0x8B */
+	0xEA, 0x68, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */
+	0x3F, 0x3F, 0xEA, 0x6B, 0xEA, 0x69, 0x98, 0x5B, /* 0x90-0x93 */
+	0x3F, 0x3F, 0xEA, 0x6A, 0x3F, 0x3F, 0x97, 0xED, /* 0x94-0x97 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */
-	0x3F, 0x3F, 0x00, 0x6C, 0x3F, 0x3F, 0x97, 0x00, /* 0x9C-0x9F */
+	0x3F, 0x3F, 0xEA, 0x6C, 0x3F, 0x3F, 0x97, 0xD9, /* 0x9C-0x9F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */
-	0x3F, 0x3F, 0x00, 0x6D, 0x94, 0x9E, 0x3F, 0x3F, /* 0xA4-0xA7 */
-	0x3F, 0x3F, 0x00, 0x6E, 0x00, 0x70, 0x3F, 0x3F, /* 0xA8-0xAB */
-	0x3F, 0x3F, 0x00, 0x71, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */
+	0x3F, 0x3F, 0xEA, 0x6D, 0x94, 0x9E, 0x3F, 0x3F, /* 0xA4-0xA7 */
+	0x3F, 0x3F, 0xEA, 0x6E, 0xEA, 0x70, 0x3F, 0x3F, /* 0xA8-0xAB */
+	0x3F, 0x3F, 0xEA, 0x71, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB0-0xB3 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */
-	0x00, 0x6F, 0x8D, 0x8D, 0x96, 0x00, 0x96, 0x83, /* 0xB8-0xBB */
-	0x9B, 0x00, 0x3F, 0x3F, 0x9F, 0x80, 0x96, 0x9B, /* 0xBC-0xBF */
+	0xEA, 0x6F, 0x8D, 0x8D, 0x96, 0xCB, 0x96, 0x83, /* 0xB8-0xBB */
+	0x9B, 0xF5, 0x3F, 0x3F, 0x9F, 0x80, 0x96, 0x9B, /* 0xBC-0xBF */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */
-	0x89, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC4-0xC7 */
+	0x89, 0xA9, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC4-0xC7 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC8-0xCB */
-	0x00, 0x73, 0x8B, 0x6F, 0x00, 0x74, 0x00, 0x75, /* 0xCC-0xCF */
-	0x00, 0x76, 0x00, 0x4B, 0x8D, 0x95, 0x3F, 0x3F, /* 0xD0-0xD3 */
-	0x00, 0x77, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */
-	0x00, 0x00, 0x96, 0x00, 0x3F, 0x3F, 0x91, 0x00, /* 0xD8-0xDB */
-	0x00, 0x78, 0x00, 0x7A, 0x00, 0x79, 0x3F, 0x3F, /* 0xDC-0xDF */
-	0x00, 0x7B, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */
-	0x3F, 0x3F, 0x00, 0x7C, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */
-	0x00, 0x7D, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x7E, /* 0xEC-0xEF */
+	0xEA, 0x73, 0x8B, 0x6F, 0xEA, 0x74, 0xEA, 0x75, /* 0xCC-0xCF */
+	0xEA, 0x76, 0xEE, 0xEC, 0x8D, 0x95, 0x3F, 0x3F, /* 0xD0-0xD3 */
+	0xEA, 0x77, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */
+	0xE0, 0xD2, 0x96, 0xD9, 0x3F, 0x3F, 0x91, 0xE1, /* 0xD8-0xDB */
+	0xEA, 0x78, 0xEA, 0x7A, 0xEA, 0x79, 0x3F, 0x3F, /* 0xDC-0xDF */
+	0xEA, 0x7B, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */
+	0x3F, 0x3F, 0xEA, 0x7C, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */
+	0xEA, 0x7D, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xEA, 0x7E, /* 0xEC-0xEF */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */
-	0x00, 0x80, 0x3F, 0x3F, 0x00, 0x81, 0x00, 0x82, /* 0xF4-0xF7 */
-	0x3F, 0x3F, 0x00, 0x83, 0x3F, 0x3F, 0x00, 0x84, /* 0xF8-0xFB */
-	0x00, 0x85, 0x00, 0x86, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */
+	0xEA, 0x80, 0x3F, 0x3F, 0xEA, 0x81, 0xEA, 0x82, /* 0xF4-0xF7 */
+	0x3F, 0x3F, 0xEA, 0x83, 0x3F, 0x3F, 0xEA, 0x84, /* 0xF8-0xFB */
+	0xEA, 0x85, 0xEA, 0x86, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */
 };
 
 static unsigned char u2c_9F[512] = {
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x87, /* 0x04-0x07 */
-	0x00, 0x88, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x08-0x0B */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xEA, 0x87, /* 0x04-0x07 */
+	0xEA, 0x88, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x08-0x0B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x93, 0x43, 0x3F, 0x3F, /* 0x0C-0x0F */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x8C, 0x00, /* 0x10-0x13 */
-	0x3F, 0x3F, 0x00, 0x8A, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x8C, 0xDB, /* 0x10-0x13 */
+	0x3F, 0x3F, 0xEA, 0x8A, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x18-0x1B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */
-	0x91, 0x6C, 0x00, 0x8B, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */
+	0x91, 0x6C, 0xEA, 0x8B, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */
-	0x00, 0x8C, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */
+	0xEA, 0x8C, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x95, 0x40, /* 0x38-0x3B */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x8D, 0x3F, 0x3F, /* 0x3C-0x3F */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xEA, 0x8D, 0x3F, 0x3F, /* 0x3C-0x3F */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xEA, 0x8E, 0xE2, 0x56, /* 0x48-0x4B */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xE6, 0xD8, 0xE8, 0xEB, /* 0x4C-0x4F */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xEA, 0x8F, 0x3F, 0x3F, /* 0x50-0x53 */
+	0xEA, 0x90, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xEA, 0x92, /* 0x5C-0x5F */
+	0xEA, 0x93, 0xEA, 0x94, 0x97, 0xEE, 0xEA, 0x91, /* 0x60-0x63 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xEA, 0x95, 0xEA, 0x96, /* 0x64-0x67 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xEA, 0x98, 0x3F, 0x3F, /* 0x68-0x6B */
+	0xEA, 0x97, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xEA, 0x9A, 0x3F, 0x3F, /* 0x70-0x73 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xEA, 0x9B, 0xEA, 0x99, /* 0x74-0x77 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */
+	
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x88-0x8B */
+	0x3F, 0x3F, 0x97, 0xB4, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */
+	0x3F, 0x3F, 0xEA, 0x9C, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */
+	0xEA, 0x9D, 0xE2, 0x73, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */
+	0xEA, 0x9E, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB0-0xB3 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC4-0xC7 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC8-0xCB */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xDC-0xDF */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF8-0xFB */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */
+};
+
+static unsigned char u2c_DC[512] = {
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x04-0x07 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x08-0x0B */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x18-0x1B */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x38-0x3B */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x8E, 0x00, 0x56, /* 0x48-0x4B */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, /* 0x4C-0x4F */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x8F, 0x3F, 0x3F, /* 0x50-0x53 */
-	0x00, 0x90, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x4C-0x4F */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x92, /* 0x5C-0x5F */
-	0x00, 0x93, 0x00, 0x94, 0x97, 0x00, 0x00, 0x91, /* 0x60-0x63 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x95, 0x00, 0x96, /* 0x64-0x67 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x98, 0x3F, 0x3F, /* 0x68-0x6B */
-	0x00, 0x97, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x9A, 0x3F, 0x3F, /* 0x70-0x73 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x9B, 0x00, 0x99, /* 0x74-0x77 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x5C-0x5F */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x60-0x63 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x68-0x6B */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x74-0x77 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */
 	
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x88-0x8B */
-	0x3F, 0x3F, 0x97, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */
-	0x3F, 0x3F, 0x00, 0x9C, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */
-	0x00, 0x9D, 0x00, 0x73, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */
-	0x00, 0x9E, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */
@@ -9509,7 +9579,7 @@
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */
-	0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */
+	0x3F, 0x3F, 0xED, 0xC4, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */
@@ -9555,7 +9625,7 @@
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */
-	0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xDC-0xDF */
+	0xEE, 0xCD, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xDC-0xDF */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */
@@ -9570,15 +9640,15 @@
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x04-0x07 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x08-0x0B */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x90, 0x00, 0x9B, /* 0x0C-0x0F */
-	0x00, 0x9C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10-0x13 */
-	0x00, 0x00, 0x00, 0x58, 0x00, 0x5E, 0x00, 0x75, /* 0x14-0x17 */
-	0x00, 0x7D, 0x00, 0x7E, 0x00, 0x80, 0x00, 0x82, /* 0x18-0x1B */
-	0x00, 0x86, 0x00, 0x89, 0x00, 0x92, 0x00, 0x9D, /* 0x1C-0x1F */
-	0x00, 0x9F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x23 */
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x24-0x27 */
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2B */
-	0x00, 0x00, 0x00, 0x49, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xED, 0x73, 0xED, 0x7E, /* 0x0C-0x0F */
+	0xED, 0x80, 0xED, 0x95, 0xED, 0xBC, 0xED, 0xCC, /* 0x10-0x13 */
+	0xED, 0xCE, 0xED, 0xF9, 0xEE, 0x42, 0xEE, 0x59, /* 0x14-0x17 */
+	0xEE, 0x61, 0xEE, 0x62, 0xEE, 0x63, 0xEE, 0x65, /* 0x18-0x1B */
+	0xEE, 0x69, 0xEE, 0x6C, 0xEE, 0x75, 0xEE, 0x81, /* 0x1C-0x1F */
+	0xEE, 0x83, 0xEE, 0x84, 0xEE, 0x8D, 0xEE, 0x95, /* 0x20-0x23 */
+	0xEE, 0x97, 0xEE, 0x98, 0xEE, 0x9B, 0xEE, 0xB7, /* 0x24-0x27 */
+	0xEE, 0xBE, 0xEE, 0xCE, 0xEE, 0xDA, 0xEE, 0xDB, /* 0x28-0x2B */
+	0xEE, 0xDD, 0xEE, 0xEA, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x38-0x3B */
@@ -9635,8 +9705,8 @@
 };
 
 static unsigned char u2c_FF[512] = {
-	0x3F, 0x3F, 0x81, 0x49, 0x00, 0x57, 0x81, 0x94, /* 0x00-0x03 */
-	0x81, 0x90, 0x81, 0x93, 0x81, 0x95, 0x00, 0x56, /* 0x04-0x07 */
+	0x3F, 0x3F, 0x81, 0x49, 0xEE, 0xFC, 0x81, 0x94, /* 0x00-0x03 */
+	0x81, 0x90, 0x81, 0x93, 0x81, 0x95, 0xEE, 0xFB, /* 0x04-0x07 */
 	0x81, 0x69, 0x81, 0x6A, 0x81, 0x96, 0x81, 0x7B, /* 0x08-0x0B */
 	0x81, 0x43, 0x81, 0x7C, 0x81, 0x44, 0x81, 0x5E, /* 0x0C-0x0F */
 	0x82, 0x4F, 0x82, 0x50, 0x82, 0x51, 0x82, 0x52, /* 0x10-0x13 */
@@ -9659,23 +9729,23 @@
 	0x82, 0x94, 0x82, 0x95, 0x82, 0x96, 0x82, 0x97, /* 0x54-0x57 */
 	0x82, 0x98, 0x82, 0x99, 0x82, 0x9A, 0x81, 0x6F, /* 0x58-0x5B */
 	0x81, 0x62, 0x81, 0x70, 0x81, 0x60, 0x3F, 0x3F, /* 0x5C-0x5F */
-	0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x63 */
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x64-0x67 */
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6B */
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x6C-0x6F */
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x73 */
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x74-0x77 */
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7B */
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x7C-0x7F */
-	
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x80-0x83 */
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x84-0x87 */
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8B */
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x8C-0x8F */
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x93 */
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x94-0x97 */
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x98-0x9B */
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x9C-0x9F */
+	0x3F, 0x3F, 0x00, 0xA1, 0x00, 0xA2, 0x00, 0xA3, /* 0x60-0x63 */
+	0x00, 0xA4, 0x00, 0xA5, 0x00, 0xA6, 0x00, 0xA7, /* 0x64-0x67 */
+	0x00, 0xA8, 0x00, 0xA9, 0x00, 0xAA, 0x00, 0xAB, /* 0x68-0x6B */
+	0x00, 0xAC, 0x00, 0xAD, 0x00, 0xAE, 0x00, 0xAF, /* 0x6C-0x6F */
+	0x00, 0xB0, 0x00, 0xB1, 0x00, 0xB2, 0x00, 0xB3, /* 0x70-0x73 */
+	0x00, 0xB4, 0x00, 0xB5, 0x00, 0xB6, 0x00, 0xB7, /* 0x74-0x77 */
+	0x00, 0xB8, 0x00, 0xB9, 0x00, 0xBA, 0x00, 0xBB, /* 0x78-0x7B */
+	0x00, 0xBC, 0x00, 0xBD, 0x00, 0xBE, 0x00, 0xBF, /* 0x7C-0x7F */
+	
+	0x00, 0xC0, 0x00, 0xC1, 0x00, 0xC2, 0x00, 0xC3, /* 0x80-0x83 */
+	0x00, 0xC4, 0x00, 0xC5, 0x00, 0xC6, 0x00, 0xC7, /* 0x84-0x87 */
+	0x00, 0xC8, 0x00, 0xC9, 0x00, 0xCA, 0x00, 0xCB, /* 0x88-0x8B */
+	0x00, 0xCC, 0x00, 0xCD, 0x00, 0xCE, 0x00, 0xCF, /* 0x8C-0x8F */
+	0x00, 0xD0, 0x00, 0xD1, 0x00, 0xD2, 0x00, 0xD3, /* 0x90-0x93 */
+	0x00, 0xD4, 0x00, 0xD5, 0x00, 0xD6, 0x00, 0xD7, /* 0x94-0x97 */
+	0x00, 0xD8, 0x00, 0xD9, 0x00, 0xDA, 0x00, 0xDB, /* 0x98-0x9B */
+	0x00, 0xDC, 0x00, 0xDD, 0x00, 0xDE, 0x00, 0xDF, /* 0x9C-0x9F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */
@@ -9692,8 +9762,8 @@
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xDC-0xDF */
-	0x81, 0x91, 0x81, 0x92, 0x00, 0x54, 0x81, 0x50, /* 0xE0-0xE3 */
-	0x00, 0x55, 0x81, 0x8F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */
+	0x81, 0x91, 0x81, 0x92, 0xEE, 0xF9, 0x81, 0x50, /* 0xE0-0xE3 */
+	0xEE, 0xFA, 0x81, 0x8F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */
@@ -9730,7 +9800,7 @@
 	NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   
 	NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   
 	NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   
-	NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   
+	NULL,   NULL,   NULL,   NULL,   u2c_DC, NULL,   NULL,   NULL,   
 	NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   
 	NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   
 	NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   
@@ -9742,12 +9812,11 @@
 
 	if (boundlen <= 0)
 		return;
-	if (ch == 0xFF && 0x60 < cl && cl < 0xA0){
+	if (ch == 0xFF && 0x61 <= cl && cl <= 0x9F){
 		out[0] = cl + 0x40;
 		*outlen = 1;
 		return;
 	}
-
 	uni2charset = page_uni2charset[ch];
 	*outlen = 0;
 	if (uni2charset){
@@ -9771,13 +9840,12 @@
 
 	ch = rawstring[0];
 	cl = rawstring[1];
-	if (0xA0 < ch && ch < 0xE0){
-		*uni1 = 0xFF;
-		*uni2 = ch - 0x40;
+	if (0xA1 <= ch && ch <= 0xDF){
+		*uni1 = ch - 0x40;
+		*uni2 = 0xFF;
 		*offset = 1;
 		return;
 	}
-
 	charset2uni = page_charset2uni[ch];
 	if (charset2uni && cl){
 		*uni1 = charset2uni[cl].uni2;
@@ -9810,20 +9878,99 @@
 	NULL
 };
 
+static struct nls_table alias_table = {
+	"sjis",
+	uni2char,
+	char2uni,
+	inc_use_count,
+	dec_use_count,
+	NULL
+};
+
+static void uni2char_euc_jp(unsigned char ch, unsigned char cl, unsigned char * out, int boundlen, int *outlen)
+{
+	if (boundlen <= 0)
+		return;
+	if (ch == 0xFF && 0x61 <= cl && cl <= 0x9F){
+		if (boundlen <= 1)
+			return;
+		out[0] = 0x8E; /* EUCHANKAKU */
+		out[1] = cl + 0x40;
+		*outlen = 2;
+		return;
+	}
+	uni2char(ch, cl, out, boundlen, outlen);
+	if (*outlen == 2) {
+		/* translate SJIS into EUC-JP */ 
+		out[0] = (out[0]^0xA0)*2 + 0x5F;
+		if (out[1] > 0x9E)
+			out[0]++;
+
+		if (out[1] < 0x7F)
+			out[1] = out[1] + 0x61;
+		else if (out[1] < 0x9F)
+			out[1] = out[1] + 0x60;
+		else
+			out[1] = out[1] + 0x02;
+	}
+}
+
+static void char2uni_euc_jp(unsigned char *rawstring, int *offset, unsigned char *uni1, unsigned char *uni2)
+{
+	unsigned char sjis_temp[2];
+
+	if (rawstring[0] == 0x8E) {
+		if (0xA1 <= rawstring[1] && rawstring[1] <= 0xDF){
+			*uni1 = rawstring[1] - 0x40;
+			*uni2 = 0xFF;
+			*offset = 2;
+			return;
+		}
+	}
+	/* translate EUC-JP into SJIS */
+	sjis_temp[0] = ((rawstring[0]-0x5f)/2) ^ 0xA0;
+	if (!(rawstring[0]&1))
+		sjis_temp[1] = rawstring[1] - 0x02;
+	else if (rawstring[1] < 0xE0)
+		sjis_temp[1] = rawstring[1] - 0x61;
+	else
+		sjis_temp[1] = rawstring[1] - 0x60;
+
+	char2uni(sjis_temp, offset, uni1, uni2);
+}
+
+static struct nls_table euc_jp_table = {
+	"euc-jp",
+	uni2char_euc_jp,
+	char2uni_euc_jp,
+	inc_use_count,
+	dec_use_count,
+	NULL
+};
+
+int __init init_nls_euc_jp(void)
+{
+	return register_nls(&euc_jp_table);
+}
+
 int __init init_nls_cp932(void)
 {
+	register_nls(&alias_table);
 	return register_nls(&table);
 }
 
 #ifdef MODULE
 int init_module(void)
 {
+	init_nls_euc_jp();
 	return init_nls_cp932();
 }
 
 
 void cleanup_module(void)
 {
+	unregister_nls(&euc_jp_table);
+	unregister_nls(&alias_table);
 	unregister_nls(&table);
 	return;
 }
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/fs/nls/nls_cp936.c linux.17p9/fs/nls/nls_cp936.c
--- linux.vanilla/fs/nls/nls_cp936.c	Sun Jun 11 21:44:20 2000
+++ linux.17p9/fs/nls/nls_cp936.c	Sun Jun 11 22:11:27 2000
@@ -2,7 +2,9 @@
  * linux/fs/nls_cp936.c
  *
  * Charset cp936 translation tables.
- * Generated automatically from the Microsoft
+ * This translation table was generated automatically, the
+ * original table can be download from the Microsoft website.
+ * (http://www.microsoft.com/typography/unicode/unicodecp.htm)
  */
 
 #include <linux/module.h>
@@ -42,7 +44,7 @@
 	{0x4E, 0x74}, {0x4E, 0x75}, {0x4E, 0x76}, {0x4E, 0x77}, /* 0x6C-0x6F */
 	{0x4E, 0x78}, {0x4E, 0x79}, {0x4E, 0x7A}, {0x4E, 0x7B}, /* 0x70-0x73 */
 	{0x4E, 0x7C}, {0x4E, 0x7D}, {0x4E, 0x7F}, {0x4E, 0x80}, /* 0x74-0x77 */
-	{0x4E, 0x81}, {0x4E, 0x82}, {0x4E, 0x83}, {0x4E, 0x84}, /* 0x78-0x7B */
+	{0x4E, 0x81}, {0xF9, 0x1B}, {0x4E, 0x83}, {0x4E, 0x84}, /* 0x78-0x7B */
 	{0x4E, 0x85}, {0x4E, 0x87}, {0x4E, 0x8A}, {0x00, 0x3F}, /* 0x7C-0x7F */
 	
 	{0x4E, 0x90}, {0x4E, 0x96}, {0x4E, 0x97}, {0x4E, 0x99}, /* 0x80-0x83 */
@@ -72,7 +74,7 @@
 	{0x4F, 0x6E}, {0x4F, 0x71}, {0x4F, 0x72}, {0x4F, 0x75}, /* 0xE0-0xE3 */
 	{0x4F, 0x77}, {0x4F, 0x78}, {0x4F, 0x79}, {0x4F, 0x7A}, /* 0xE4-0xE7 */
 	{0x4F, 0x7D}, {0x4F, 0x80}, {0x4F, 0x81}, {0x4F, 0x82}, /* 0xE8-0xEB */
-	{0x4F, 0x85}, {0x4F, 0x86}, {0x4F, 0x87}, {0x4F, 0x8A}, /* 0xEC-0xEF */
+	{0x4F, 0x85}, {0xF9, 0x2D}, {0x4F, 0x87}, {0x4F, 0x8A}, /* 0xEC-0xEF */
 	{0x4F, 0x8C}, {0x4F, 0x8E}, {0x4F, 0x90}, {0x4F, 0x92}, /* 0xF0-0xF3 */
 	{0x4F, 0x93}, {0x4F, 0x95}, {0x4F, 0x96}, {0x4F, 0x98}, /* 0xF4-0xF7 */
 	{0x4F, 0x99}, {0x4F, 0x9A}, {0x4F, 0x9C}, {0x4F, 0x9E}, /* 0xF8-0xFB */
@@ -117,7 +119,7 @@
 	{0x50, 0x13}, {0x50, 0x15}, {0x50, 0x16}, {0x50, 0x17}, /* 0x84-0x87 */
 	{0x50, 0x1B}, {0x50, 0x1D}, {0x50, 0x1E}, {0x50, 0x20}, /* 0x88-0x8B */
 	{0x50, 0x22}, {0x50, 0x23}, {0x50, 0x24}, {0x50, 0x27}, /* 0x8C-0x8F */
-	{0x50, 0x2B}, {0x50, 0x2F}, {0x50, 0x30}, {0x50, 0x31}, /* 0x90-0x93 */
+	{0xF9, 0xD4}, {0x50, 0x2F}, {0x50, 0x30}, {0x50, 0x31}, /* 0x90-0x93 */
 	{0x50, 0x32}, {0x50, 0x33}, {0x50, 0x34}, {0x50, 0x35}, /* 0x94-0x97 */
 	{0x50, 0x36}, {0x50, 0x37}, {0x50, 0x38}, {0x50, 0x39}, /* 0x98-0x9B */
 	{0x50, 0x3B}, {0x50, 0x3D}, {0x50, 0x3F}, {0x50, 0x40}, /* 0x9C-0x9F */
@@ -199,7 +201,7 @@
 	{0x51, 0x57}, {0x51, 0x58}, {0x51, 0x59}, {0x51, 0x5B}, /* 0xBC-0xBF */
 	{0x51, 0x5D}, {0x51, 0x5E}, {0x51, 0x5F}, {0x51, 0x60}, /* 0xC0-0xC3 */
 	{0x51, 0x61}, {0x51, 0x63}, {0x51, 0x64}, {0x51, 0x66}, /* 0xC4-0xC7 */
-	{0x51, 0x67}, {0x51, 0x69}, {0x51, 0x6A}, {0x51, 0x6F}, /* 0xC8-0xCB */
+	{0x51, 0x67}, {0xF9, 0x78}, {0x51, 0x6A}, {0x51, 0x6F}, /* 0xC8-0xCB */
 	{0x51, 0x72}, {0x51, 0x7A}, {0x51, 0x7E}, {0x51, 0x7F}, /* 0xCC-0xCF */
 	{0x51, 0x83}, {0x51, 0x84}, {0x51, 0x86}, {0x51, 0x87}, /* 0xD0-0xD3 */
 	{0x51, 0x8A}, {0x51, 0x8B}, {0x51, 0x8E}, {0x51, 0x8F}, /* 0xD4-0xD7 */
@@ -232,8 +234,8 @@
 	{0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */
 	{0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */
 	{0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */
-	{0x51, 0xD8}, {0x51, 0xD9}, {0x51, 0xDA}, {0x51, 0xDC}, /* 0x40-0x43 */
-	{0x51, 0xDE}, {0x51, 0xDF}, {0x51, 0xE2}, {0x51, 0xE3}, /* 0x44-0x47 */
+	{0x51, 0xD8}, {0x51, 0xD9}, {0x51, 0xDA}, {0xF9, 0x54}, /* 0x40-0x43 */
+	{0xFA, 0x15}, {0x51, 0xDF}, {0x51, 0xE2}, {0x51, 0xE3}, /* 0x44-0x47 */
 	{0x51, 0xE5}, {0x51, 0xE6}, {0x51, 0xE7}, {0x51, 0xE8}, /* 0x48-0x4B */
 	{0x51, 0xE9}, {0x51, 0xEA}, {0x51, 0xEC}, {0x51, 0xEE}, /* 0x4C-0x4F */
 	{0x51, 0xF1}, {0x51, 0xF2}, {0x51, 0xF4}, {0x51, 0xF7}, /* 0x50-0x53 */
@@ -257,7 +259,7 @@
 	{0x52, 0x76}, {0x52, 0x77}, {0x52, 0x78}, {0x52, 0x79}, /* 0x94-0x97 */
 	{0x52, 0x7A}, {0x52, 0x7B}, {0x52, 0x7C}, {0x52, 0x7E}, /* 0x98-0x9B */
 	{0x52, 0x80}, {0x52, 0x83}, {0x52, 0x84}, {0x52, 0x85}, /* 0x9C-0x9F */
-	{0x52, 0x86}, {0x52, 0x87}, {0x52, 0x89}, {0x52, 0x8A}, /* 0xA0-0xA3 */
+	{0x52, 0x86}, {0x52, 0x87}, {0xF9, 0xC7}, {0x52, 0x8A}, /* 0xA0-0xA3 */
 	{0x52, 0x8B}, {0x52, 0x8C}, {0x52, 0x8D}, {0x52, 0x8E}, /* 0xA4-0xA7 */
 	{0x52, 0x8F}, {0x52, 0x91}, {0x52, 0x92}, {0x52, 0x94}, /* 0xA8-0xAB */
 	{0x52, 0x95}, {0x52, 0x96}, {0x52, 0x97}, {0x52, 0x98}, /* 0xAC-0xAF */
@@ -271,12 +273,12 @@
 	{0x52, 0xCC}, {0x52, 0xCD}, {0x52, 0xCE}, {0x52, 0xCF}, /* 0xCC-0xCF */
 	{0x52, 0xD1}, {0x52, 0xD3}, {0x52, 0xD4}, {0x52, 0xD5}, /* 0xD0-0xD3 */
 	{0x52, 0xD7}, {0x52, 0xD9}, {0x52, 0xDA}, {0x52, 0xDB}, /* 0xD4-0xD7 */
-	{0x52, 0xDC}, {0x52, 0xDD}, {0x52, 0xDE}, {0x52, 0xE0}, /* 0xD8-0xDB */
+	{0x52, 0xDC}, {0x52, 0xDD}, {0xF9, 0x2F}, {0x52, 0xE0}, /* 0xD8-0xDB */
 	{0x52, 0xE1}, {0x52, 0xE2}, {0x52, 0xE3}, {0x52, 0xE5}, /* 0xDC-0xDF */
 	{0x52, 0xE6}, {0x52, 0xE7}, {0x52, 0xE8}, {0x52, 0xE9}, /* 0xE0-0xE3 */
 	{0x52, 0xEA}, {0x52, 0xEB}, {0x52, 0xEC}, {0x52, 0xED}, /* 0xE4-0xE7 */
 	{0x52, 0xEE}, {0x52, 0xEF}, {0x52, 0xF1}, {0x52, 0xF2}, /* 0xE8-0xEB */
-	{0x52, 0xF3}, {0x52, 0xF4}, {0x52, 0xF5}, {0x52, 0xF6}, /* 0xEC-0xEF */
+	{0x52, 0xF3}, {0x52, 0xF4}, {0xF9, 0x7F}, {0x52, 0xF6}, /* 0xEC-0xEF */
 	{0x52, 0xF7}, {0x52, 0xF8}, {0x52, 0xFB}, {0x52, 0xFC}, /* 0xF0-0xF3 */
 	{0x52, 0xFD}, {0x53, 0x01}, {0x53, 0x02}, {0x53, 0x03}, /* 0xF4-0xF7 */
 	{0x53, 0x04}, {0x53, 0x07}, {0x53, 0x09}, {0x53, 0x0A}, /* 0xF8-0xFB */
@@ -325,7 +327,7 @@
 	{0x53, 0xB0}, {0x53, 0xB1}, {0x53, 0xB2}, {0x53, 0xB3}, /* 0x94-0x97 */
 	{0x53, 0xB4}, {0x53, 0xB5}, {0x53, 0xB7}, {0x53, 0xB8}, /* 0x98-0x9B */
 	{0x53, 0xB9}, {0x53, 0xBA}, {0x53, 0xBC}, {0x53, 0xBD}, /* 0x9C-0x9F */
-	{0x53, 0xBE}, {0x53, 0xC0}, {0x53, 0xC3}, {0x53, 0xC4}, /* 0xA0-0xA3 */
+	{0x53, 0xBE}, {0x53, 0xC0}, {0xF9, 0x6B}, {0x53, 0xC4}, /* 0xA0-0xA3 */
 	{0x53, 0xC5}, {0x53, 0xC6}, {0x53, 0xC7}, {0x53, 0xCE}, /* 0xA4-0xA7 */
 	{0x53, 0xCF}, {0x53, 0xD0}, {0x53, 0xD2}, {0x53, 0xD3}, /* 0xA8-0xAB */
 	{0x53, 0xD5}, {0x53, 0xDA}, {0x53, 0xDC}, {0x53, 0xDD}, /* 0xAC-0xAF */
@@ -336,7 +338,7 @@
 	{0x54, 0x1A}, {0x54, 0x1C}, {0x54, 0x22}, {0x54, 0x24}, /* 0xC0-0xC3 */
 	{0x54, 0x25}, {0x54, 0x2A}, {0x54, 0x30}, {0x54, 0x33}, /* 0xC4-0xC7 */
 	{0x54, 0x36}, {0x54, 0x37}, {0x54, 0x3A}, {0x54, 0x3D}, /* 0xC8-0xCB */
-	{0x54, 0x3F}, {0x54, 0x41}, {0x54, 0x42}, {0x54, 0x44}, /* 0xCC-0xCF */
+	{0x54, 0x3F}, {0x54, 0x41}, {0xF9, 0x80}, {0x54, 0x44}, /* 0xCC-0xCF */
 	{0x54, 0x45}, {0x54, 0x47}, {0x54, 0x49}, {0x54, 0x4C}, /* 0xD0-0xD3 */
 	{0x54, 0x4D}, {0x54, 0x4E}, {0x54, 0x4F}, {0x54, 0x51}, /* 0xD4-0xD7 */
 	{0x54, 0x5A}, {0x54, 0x5D}, {0x54, 0x5E}, {0x54, 0x5F}, /* 0xD8-0xDB */
@@ -577,7 +579,7 @@
 	{0x58, 0x47}, {0x58, 0x48}, {0x58, 0x49}, {0x58, 0x4A}, /* 0x48-0x4B */
 	{0x58, 0x4B}, {0x58, 0x4E}, {0x58, 0x4F}, {0x58, 0x50}, /* 0x4C-0x4F */
 	{0x58, 0x52}, {0x58, 0x53}, {0x58, 0x55}, {0x58, 0x56}, /* 0x50-0x53 */
-	{0x58, 0x57}, {0x58, 0x59}, {0x58, 0x5A}, {0x58, 0x5B}, /* 0x54-0x57 */
+	{0x58, 0x57}, {0x58, 0x59}, {0xFA, 0x10}, {0x58, 0x5B}, /* 0x54-0x57 */
 	{0x58, 0x5C}, {0x58, 0x5D}, {0x58, 0x5F}, {0x58, 0x60}, /* 0x58-0x5B */
 	{0x58, 0x61}, {0x58, 0x62}, {0x58, 0x63}, {0x58, 0x64}, /* 0x5C-0x5F */
 	{0x58, 0x66}, {0x58, 0x67}, {0x58, 0x68}, {0x58, 0x69}, /* 0x60-0x63 */
@@ -604,9 +606,9 @@
 	{0x58, 0xC8}, {0x58, 0xC9}, {0x58, 0xCA}, {0x58, 0xCB}, /* 0xB0-0xB3 */
 	{0x58, 0xCC}, {0x58, 0xCD}, {0x58, 0xCE}, {0x58, 0xCF}, /* 0xB4-0xB7 */
 	{0x58, 0xD0}, {0x58, 0xD2}, {0x58, 0xD3}, {0x58, 0xD4}, /* 0xB8-0xBB */
-	{0x58, 0xD6}, {0x58, 0xD7}, {0x58, 0xD8}, {0x58, 0xD9}, /* 0xBC-0xBF */
+	{0x58, 0xD6}, {0x58, 0xD7}, {0xF9, 0x4A}, {0x58, 0xD9}, /* 0xBC-0xBF */
 	{0x58, 0xDA}, {0x58, 0xDB}, {0x58, 0xDC}, {0x58, 0xDD}, /* 0xC0-0xC3 */
-	{0x58, 0xDE}, {0x58, 0xDF}, {0x58, 0xE0}, {0x58, 0xE1}, /* 0xC4-0xC7 */
+	{0x58, 0xDE}, {0xF9, 0x42}, {0x58, 0xE0}, {0x58, 0xE1}, /* 0xC4-0xC7 */
 	{0x58, 0xE2}, {0x58, 0xE3}, {0x58, 0xE5}, {0x58, 0xE6}, /* 0xC8-0xCB */
 	{0x58, 0xE7}, {0x58, 0xE8}, {0x58, 0xE9}, {0x58, 0xEA}, /* 0xCC-0xCF */
 	{0x58, 0xED}, {0x58, 0xEF}, {0x58, 0xF1}, {0x58, 0xF2}, /* 0xD0-0xD3 */
@@ -796,7 +798,7 @@
 	{0x5B, 0xD1}, {0x5B, 0xD4}, {0x5B, 0xD5}, {0x5B, 0xD6}, /* 0x80-0x83 */
 	{0x5B, 0xD7}, {0x5B, 0xD8}, {0x5B, 0xD9}, {0x5B, 0xDA}, /* 0x84-0x87 */
 	{0x5B, 0xDB}, {0x5B, 0xDC}, {0x5B, 0xE0}, {0x5B, 0xE2}, /* 0x88-0x8B */
-	{0x5B, 0xE3}, {0x5B, 0xE6}, {0x5B, 0xE7}, {0x5B, 0xE9}, /* 0x8C-0x8F */
+	{0x5B, 0xE3}, {0x5B, 0xE6}, {0xF9, 0xAA}, {0x5B, 0xE9}, /* 0x8C-0x8F */
 	{0x5B, 0xEA}, {0x5B, 0xEB}, {0x5B, 0xEC}, {0x5B, 0xED}, /* 0x90-0x93 */
 	{0x5B, 0xEF}, {0x5B, 0xF1}, {0x5B, 0xF2}, {0x5B, 0xF3}, /* 0x94-0x97 */
 	{0x5B, 0xF4}, {0x5B, 0xF5}, {0x5B, 0xF6}, {0x5B, 0xF7}, /* 0x98-0x9B */
@@ -813,7 +815,7 @@
 	{0x5C, 0x47}, {0x5C, 0x4C}, {0x5C, 0x4D}, {0x5C, 0x52}, /* 0xC4-0xC7 */
 	{0x5C, 0x53}, {0x5C, 0x54}, {0x5C, 0x56}, {0x5C, 0x57}, /* 0xC8-0xCB */
 	{0x5C, 0x58}, {0x5C, 0x5A}, {0x5C, 0x5B}, {0x5C, 0x5C}, /* 0xCC-0xCF */
-	{0x5C, 0x5D}, {0x5C, 0x5F}, {0x5C, 0x62}, {0x5C, 0x64}, /* 0xD0-0xD3 */
+	{0x5C, 0x5D}, {0x5C, 0x5F}, {0xF9, 0x4B}, {0x5C, 0x64}, /* 0xD0-0xD3 */
 	{0x5C, 0x67}, {0x5C, 0x68}, {0x5C, 0x69}, {0x5C, 0x6A}, /* 0xD4-0xD7 */
 	{0x5C, 0x6B}, {0x5C, 0x6C}, {0x5C, 0x6D}, {0x5C, 0x70}, /* 0xD8-0xDB */
 	{0x5C, 0x72}, {0x5C, 0x73}, {0x5C, 0x74}, {0x5C, 0x75}, /* 0xDC-0xDF */
@@ -865,7 +867,7 @@
 	{0x5D, 0x09}, {0x5D, 0x0A}, {0x5D, 0x0B}, {0x5D, 0x0C}, /* 0x84-0x87 */
 	{0x5D, 0x0D}, {0x5D, 0x0F}, {0x5D, 0x10}, {0x5D, 0x11}, /* 0x88-0x8B */
 	{0x5D, 0x12}, {0x5D, 0x13}, {0x5D, 0x15}, {0x5D, 0x17}, /* 0x8C-0x8F */
-	{0x5D, 0x18}, {0x5D, 0x19}, {0x5D, 0x1A}, {0x5D, 0x1C}, /* 0x90-0x93 */
+	{0x5D, 0x18}, {0xF9, 0xD5}, {0x5D, 0x1A}, {0x5D, 0x1C}, /* 0x90-0x93 */
 	{0x5D, 0x1D}, {0x5D, 0x1F}, {0x5D, 0x20}, {0x5D, 0x21}, /* 0x94-0x97 */
 	{0x5D, 0x22}, {0x5D, 0x23}, {0x5D, 0x25}, {0x5D, 0x28}, /* 0x98-0x9B */
 	{0x5D, 0x2A}, {0x5D, 0x2B}, {0x5D, 0x2C}, {0x5D, 0x2F}, /* 0x9C-0x9F */
@@ -875,7 +877,7 @@
 	{0x5D, 0x3F}, {0x5D, 0x40}, {0x5D, 0x41}, {0x5D, 0x42}, /* 0xAC-0xAF */
 	{0x5D, 0x43}, {0x5D, 0x44}, {0x5D, 0x45}, {0x5D, 0x46}, /* 0xB0-0xB3 */
 	{0x5D, 0x48}, {0x5D, 0x49}, {0x5D, 0x4D}, {0x5D, 0x4E}, /* 0xB4-0xB7 */
-	{0x5D, 0x4F}, {0x5D, 0x50}, {0x5D, 0x51}, {0x5D, 0x52}, /* 0xB8-0xBB */
+	{0x5D, 0x4F}, {0xF9, 0x21}, {0x5D, 0x51}, {0x5D, 0x52}, /* 0xB8-0xBB */
 	{0x5D, 0x53}, {0x5D, 0x54}, {0x5D, 0x55}, {0x5D, 0x56}, /* 0xBC-0xBF */
 	{0x5D, 0x57}, {0x5D, 0x59}, {0x5D, 0x5A}, {0x5D, 0x5C}, /* 0xC0-0xC3 */
 	{0x5D, 0x5E}, {0x5D, 0x5F}, {0x5D, 0x60}, {0x5D, 0x61}, /* 0xC4-0xC7 */
@@ -918,7 +920,7 @@
 	{0x5D, 0xAD}, {0x5D, 0xAE}, {0x5D, 0xAF}, {0x5D, 0xB0}, /* 0x4C-0x4F */
 	{0x5D, 0xB1}, {0x5D, 0xB2}, {0x5D, 0xB3}, {0x5D, 0xB4}, /* 0x50-0x53 */
 	{0x5D, 0xB5}, {0x5D, 0xB6}, {0x5D, 0xB8}, {0x5D, 0xB9}, /* 0x54-0x57 */
-	{0x5D, 0xBA}, {0x5D, 0xBB}, {0x5D, 0xBC}, {0x5D, 0xBD}, /* 0x58-0x5B */
+	{0xF9, 0xAB}, {0x5D, 0xBB}, {0x5D, 0xBC}, {0x5D, 0xBD}, /* 0x58-0x5B */
 	{0x5D, 0xBE}, {0x5D, 0xBF}, {0x5D, 0xC0}, {0x5D, 0xC1}, /* 0x5C-0x5F */
 	{0x5D, 0xC2}, {0x5D, 0xC3}, {0x5D, 0xC4}, {0x5D, 0xC6}, /* 0x60-0x63 */
 	{0x5D, 0xC7}, {0x5D, 0xC8}, {0x5D, 0xC9}, {0x5D, 0xCA}, /* 0x64-0x67 */
@@ -987,7 +989,7 @@
 	{0x5E, 0xDD}, {0x5E, 0xDE}, {0x5E, 0xDF}, {0x5E, 0xE0}, /* 0x50-0x53 */
 	{0x5E, 0xE1}, {0x5E, 0xE2}, {0x5E, 0xE3}, {0x5E, 0xE4}, /* 0x54-0x57 */
 	{0x5E, 0xE5}, {0x5E, 0xE6}, {0x5E, 0xE7}, {0x5E, 0xE9}, /* 0x58-0x5B */
-	{0x5E, 0xEB}, {0x5E, 0xEC}, {0x5E, 0xED}, {0x5E, 0xEE}, /* 0x5C-0x5F */
+	{0x5E, 0xEB}, {0xF9, 0x82}, {0x5E, 0xED}, {0x5E, 0xEE}, /* 0x5C-0x5F */
 	{0x5E, 0xEF}, {0x5E, 0xF0}, {0x5E, 0xF1}, {0x5E, 0xF2}, /* 0x60-0x63 */
 	{0x5E, 0xF3}, {0x5E, 0xF5}, {0x5E, 0xF8}, {0x5E, 0xF9}, /* 0x64-0x67 */
 	{0x5E, 0xFB}, {0x5E, 0xFC}, {0x5E, 0xFD}, {0x5F, 0x05}, /* 0x68-0x6B */
@@ -1016,7 +1018,7 @@
 	{0x5F, 0x96}, {0x5F, 0x9A}, {0x5F, 0x9B}, {0x5F, 0x9D}, /* 0xC0-0xC3 */
 	{0x5F, 0x9E}, {0x5F, 0x9F}, {0x5F, 0xA0}, {0x5F, 0xA2}, /* 0xC4-0xC7 */
 	{0x5F, 0xA3}, {0x5F, 0xA4}, {0x5F, 0xA5}, {0x5F, 0xA6}, /* 0xC8-0xCB */
-	{0x5F, 0xA7}, {0x5F, 0xA9}, {0x5F, 0xAB}, {0x5F, 0xAC}, /* 0xCC-0xCF */
+	{0x5F, 0xA7}, {0xF9, 0x66}, {0x5F, 0xAB}, {0x5F, 0xAC}, /* 0xCC-0xCF */
 	{0x5F, 0xAF}, {0x5F, 0xB0}, {0x5F, 0xB1}, {0x5F, 0xB2}, /* 0xD0-0xD3 */
 	{0x5F, 0xB3}, {0x5F, 0xB4}, {0x5F, 0xB6}, {0x5F, 0xB8}, /* 0xD4-0xD7 */
 	{0x5F, 0xB9}, {0x5F, 0xBA}, {0x5F, 0xBB}, {0x5F, 0xBE}, /* 0xD8-0xDB */
@@ -1079,7 +1081,7 @@
 	{0x60, 0xC9}, {0x60, 0xCC}, {0x60, 0xCD}, {0x60, 0xCE}, /* 0xAC-0xAF */
 	{0x60, 0xCF}, {0x60, 0xD0}, {0x60, 0xD2}, {0x60, 0xD3}, /* 0xB0-0xB3 */
 	{0x60, 0xD4}, {0x60, 0xD6}, {0x60, 0xD7}, {0x60, 0xD9}, /* 0xB4-0xB7 */
-	{0x60, 0xDB}, {0x60, 0xDE}, {0x60, 0xE1}, {0x60, 0xE2}, /* 0xB8-0xBB */
+	{0x60, 0xDB}, {0x60, 0xDE}, {0xF9, 0xB9}, {0x60, 0xE2}, /* 0xB8-0xBB */
 	{0x60, 0xE3}, {0x60, 0xE4}, {0x60, 0xE5}, {0x60, 0xEA}, /* 0xBC-0xBF */
 	{0x60, 0xF1}, {0x60, 0xF2}, {0x60, 0xF5}, {0x60, 0xF7}, /* 0xC0-0xC3 */
 	{0x60, 0xF8}, {0x60, 0xFB}, {0x60, 0xFC}, {0x60, 0xFD}, /* 0xC4-0xC7 */
@@ -1096,7 +1098,7 @@
 	{0x61, 0x37}, {0x61, 0x38}, {0x61, 0x39}, {0x61, 0x3A}, /* 0xF0-0xF3 */
 	{0x61, 0x3B}, {0x61, 0x3C}, {0x61, 0x3D}, {0x61, 0x3E}, /* 0xF4-0xF7 */
 	{0x61, 0x40}, {0x61, 0x41}, {0x61, 0x42}, {0x61, 0x43}, /* 0xF8-0xFB */
-	{0x61, 0x44}, {0x61, 0x45}, {0x61, 0x46}, {0x00, 0x3F}, /* 0xFC-0xFF */
+	{0xF9, 0xD9}, {0x61, 0x45}, {0x61, 0x46}, {0x00, 0x3F}, /* 0xFC-0xFF */
 };
 
 static struct nls_unicode c2u_91[256] = {
@@ -1130,7 +1132,7 @@
 	{0x61, 0x80}, {0x61, 0x81}, {0x61, 0x82}, {0x61, 0x83}, /* 0x6C-0x6F */
 	{0x61, 0x84}, {0x61, 0x85}, {0x61, 0x86}, {0x61, 0x87}, /* 0x70-0x73 */
 	{0x61, 0x88}, {0x61, 0x89}, {0x61, 0x8A}, {0x61, 0x8C}, /* 0x74-0x77 */
-	{0x61, 0x8D}, {0x61, 0x8F}, {0x61, 0x90}, {0x61, 0x91}, /* 0x78-0x7B */
+	{0x61, 0x8D}, {0x61, 0x8F}, {0xF9, 0x8F}, {0x61, 0x91}, /* 0x78-0x7B */
 	{0x61, 0x92}, {0x61, 0x93}, {0x61, 0x95}, {0x00, 0x3F}, /* 0x7C-0x7F */
 	
 	{0x61, 0x96}, {0x61, 0x97}, {0x61, 0x98}, {0x61, 0x99}, /* 0x80-0x83 */
@@ -1153,9 +1155,9 @@
 	{0x61, 0xE9}, {0x61, 0xEA}, {0x61, 0xEB}, {0x61, 0xEC}, /* 0xC4-0xC7 */
 	{0x61, 0xED}, {0x61, 0xEE}, {0x61, 0xEF}, {0x61, 0xF0}, /* 0xC8-0xCB */
 	{0x61, 0xF1}, {0x61, 0xF2}, {0x61, 0xF3}, {0x61, 0xF4}, /* 0xCC-0xCF */
-	{0x61, 0xF6}, {0x61, 0xF7}, {0x61, 0xF8}, {0x61, 0xF9}, /* 0xD0-0xD3 */
+	{0xF9, 0x0D}, {0x61, 0xF7}, {0x61, 0xF8}, {0x61, 0xF9}, /* 0xD0-0xD3 */
 	{0x61, 0xFA}, {0x61, 0xFB}, {0x61, 0xFC}, {0x61, 0xFD}, /* 0xD4-0xD7 */
-	{0x61, 0xFE}, {0x62, 0x00}, {0x62, 0x01}, {0x62, 0x02}, /* 0xD8-0xDB */
+	{0x61, 0xFE}, {0xF9, 0x90}, {0x62, 0x01}, {0x62, 0x02}, /* 0xD8-0xDB */
 	{0x62, 0x03}, {0x62, 0x04}, {0x62, 0x05}, {0x62, 0x07}, /* 0xDC-0xDF */
 	{0x62, 0x09}, {0x62, 0x13}, {0x62, 0x14}, {0x62, 0x19}, /* 0xE0-0xE3 */
 	{0x62, 0x1C}, {0x62, 0x1D}, {0x62, 0x1E}, {0x62, 0x20}, /* 0xE4-0xE7 */
@@ -1201,7 +1203,7 @@
 	{0x62, 0xB6}, {0x62, 0xB7}, {0x62, 0xB8}, {0x62, 0xBA}, /* 0x78-0x7B */
 	{0x62, 0xBE}, {0x62, 0xC0}, {0x62, 0xC1}, {0x00, 0x3F}, /* 0x7C-0x7F */
 	
-	{0x62, 0xC3}, {0x62, 0xCB}, {0x62, 0xCF}, {0x62, 0xD1}, /* 0x80-0x83 */
+	{0x62, 0xC3}, {0x62, 0xCB}, {0xF9, 0x5B}, {0x62, 0xD1}, /* 0x80-0x83 */
 	{0x62, 0xD5}, {0x62, 0xDD}, {0x62, 0xDE}, {0x62, 0xE0}, /* 0x84-0x87 */
 	{0x62, 0xE1}, {0x62, 0xE4}, {0x62, 0xEA}, {0x62, 0xEB}, /* 0x88-0x8B */
 	{0x62, 0xF0}, {0x62, 0xF2}, {0x62, 0xF5}, {0x62, 0xF8}, /* 0x8C-0x8F */
@@ -1289,14 +1291,14 @@
 	{0x64, 0x83}, {0x64, 0x86}, {0x64, 0x88}, {0x64, 0x89}, /* 0xC4-0xC7 */
 	{0x64, 0x8A}, {0x64, 0x8B}, {0x64, 0x8C}, {0x64, 0x8D}, /* 0xC8-0xCB */
 	{0x64, 0x8E}, {0x64, 0x8F}, {0x64, 0x90}, {0x64, 0x93}, /* 0xCC-0xCF */
-	{0x64, 0x94}, {0x64, 0x97}, {0x64, 0x98}, {0x64, 0x9A}, /* 0xD0-0xD3 */
+	{0x64, 0x94}, {0x64, 0x97}, {0x64, 0x98}, {0xF9, 0x91}, /* 0xD0-0xD3 */
 	{0x64, 0x9B}, {0x64, 0x9C}, {0x64, 0x9D}, {0x64, 0x9F}, /* 0xD4-0xD7 */
 	{0x64, 0xA0}, {0x64, 0xA1}, {0x64, 0xA2}, {0x64, 0xA3}, /* 0xD8-0xDB */
 	{0x64, 0xA5}, {0x64, 0xA6}, {0x64, 0xA7}, {0x64, 0xA8}, /* 0xDC-0xDF */
 	{0x64, 0xAA}, {0x64, 0xAB}, {0x64, 0xAF}, {0x64, 0xB1}, /* 0xE0-0xE3 */
 	{0x64, 0xB2}, {0x64, 0xB3}, {0x64, 0xB4}, {0x64, 0xB6}, /* 0xE4-0xE7 */
 	{0x64, 0xB9}, {0x64, 0xBB}, {0x64, 0xBD}, {0x64, 0xBE}, /* 0xE8-0xEB */
-	{0x64, 0xBF}, {0x64, 0xC1}, {0x64, 0xC3}, {0x64, 0xC4}, /* 0xEC-0xEF */
+	{0x64, 0xBF}, {0x64, 0xC1}, {0x64, 0xC3}, {0xF9, 0x30}, /* 0xEC-0xEF */
 	{0x64, 0xC6}, {0x64, 0xC7}, {0x64, 0xC8}, {0x64, 0xC9}, /* 0xF0-0xF3 */
 	{0x64, 0xCA}, {0x64, 0xCB}, {0x64, 0xCC}, {0x64, 0xCF}, /* 0xF4-0xF7 */
 	{0x64, 0xD1}, {0x64, 0xD3}, {0x64, 0xD4}, {0x64, 0xD5}, /* 0xF8-0xFB */
@@ -1350,7 +1352,7 @@
 	{0x65, 0x64}, {0x65, 0x65}, {0x65, 0x67}, {0x65, 0x68}, /* 0xA8-0xAB */
 	{0x65, 0x69}, {0x65, 0x6A}, {0x65, 0x6D}, {0x65, 0x6E}, /* 0xAC-0xAF */
 	{0x65, 0x6F}, {0x65, 0x71}, {0x65, 0x73}, {0x65, 0x75}, /* 0xB0-0xB3 */
-	{0x65, 0x76}, {0x65, 0x78}, {0x65, 0x79}, {0x65, 0x7A}, /* 0xB4-0xB7 */
+	{0x65, 0x76}, {0xF9, 0x69}, {0x65, 0x79}, {0x65, 0x7A}, /* 0xB4-0xB7 */
 	{0x65, 0x7B}, {0x65, 0x7C}, {0x65, 0x7D}, {0x65, 0x7E}, /* 0xB8-0xBB */
 	{0x65, 0x7F}, {0x65, 0x80}, {0x65, 0x81}, {0x65, 0x82}, /* 0xBC-0xBF */
 	{0x65, 0x83}, {0x65, 0x84}, {0x65, 0x85}, {0x65, 0x86}, /* 0xC0-0xC3 */
@@ -1412,7 +1414,7 @@
 	{0x66, 0x72}, {0x66, 0x73}, {0x66, 0x75}, {0x66, 0x78}, /* 0x90-0x93 */
 	{0x66, 0x79}, {0x66, 0x7B}, {0x66, 0x7C}, {0x66, 0x7D}, /* 0x94-0x97 */
 	{0x66, 0x7F}, {0x66, 0x80}, {0x66, 0x81}, {0x66, 0x83}, /* 0x98-0x9B */
-	{0x66, 0x85}, {0x66, 0x86}, {0x66, 0x88}, {0x66, 0x89}, /* 0x9C-0x9F */
+	{0x66, 0x85}, {0x66, 0x86}, {0xF9, 0xC5}, {0x66, 0x89}, /* 0x9C-0x9F */
 	{0x66, 0x8A}, {0x66, 0x8B}, {0x66, 0x8D}, {0x66, 0x8E}, /* 0xA0-0xA3 */
 	{0x66, 0x8F}, {0x66, 0x90}, {0x66, 0x92}, {0x66, 0x93}, /* 0xA4-0xA7 */
 	{0x66, 0x94}, {0x66, 0x95}, {0x66, 0x98}, {0x66, 0x99}, /* 0xA8-0xAB */
@@ -1425,7 +1427,7 @@
 	{0x66, 0xB7}, {0x66, 0xB8}, {0x66, 0xBA}, {0x66, 0xBB}, /* 0xC4-0xC7 */
 	{0x66, 0xBC}, {0x66, 0xBD}, {0x66, 0xBF}, {0x66, 0xC0}, /* 0xC8-0xCB */
 	{0x66, 0xC1}, {0x66, 0xC2}, {0x66, 0xC3}, {0x66, 0xC4}, /* 0xCC-0xCF */
-	{0x66, 0xC5}, {0x66, 0xC6}, {0x66, 0xC7}, {0x66, 0xC8}, /* 0xD0-0xD3 */
+	{0x66, 0xC5}, {0xF9, 0x8B}, {0x66, 0xC7}, {0x66, 0xC8}, /* 0xD0-0xD3 */
 	{0x66, 0xC9}, {0x66, 0xCA}, {0x66, 0xCB}, {0x66, 0xCC}, /* 0xD4-0xD7 */
 	{0x66, 0xCD}, {0x66, 0xCE}, {0x66, 0xCF}, {0x66, 0xD0}, /* 0xD8-0xDB */
 	{0x66, 0xD1}, {0x66, 0xD2}, {0x66, 0xD3}, {0x66, 0xD4}, /* 0xDC-0xDF */
@@ -1473,7 +1475,7 @@
 	{0x67, 0x67}, {0x67, 0x6B}, {0x67, 0x6C}, {0x67, 0x6E}, /* 0x78-0x7B */
 	{0x67, 0x71}, {0x67, 0x74}, {0x67, 0x76}, {0x00, 0x3F}, /* 0x7C-0x7F */
 	
-	{0x67, 0x78}, {0x67, 0x79}, {0x67, 0x7A}, {0x67, 0x7B}, /* 0x80-0x83 */
+	{0x67, 0x78}, {0x67, 0x79}, {0x67, 0x7A}, {0xF9, 0xC8}, /* 0x80-0x83 */
 	{0x67, 0x7D}, {0x67, 0x80}, {0x67, 0x82}, {0x67, 0x83}, /* 0x84-0x87 */
 	{0x67, 0x85}, {0x67, 0x86}, {0x67, 0x88}, {0x67, 0x8A}, /* 0x88-0x8B */
 	{0x67, 0x8C}, {0x67, 0x8D}, {0x67, 0x8E}, {0x67, 0x8F}, /* 0x8C-0x8F */
@@ -1622,11 +1624,11 @@
 	{0x69, 0xF0}, {0x69, 0xF1}, {0x69, 0xF3}, {0x69, 0xF4}, /* 0xA8-0xAB */
 	{0x69, 0xF5}, {0x69, 0xF6}, {0x69, 0xF7}, {0x69, 0xF8}, /* 0xAC-0xAF */
 	{0x69, 0xF9}, {0x69, 0xFA}, {0x69, 0xFB}, {0x69, 0xFC}, /* 0xB0-0xB3 */
-	{0x69, 0xFE}, {0x6A, 0x00}, {0x6A, 0x01}, {0x6A, 0x02}, /* 0xB4-0xB7 */
+	{0x69, 0xFE}, {0x6A, 0x00}, {0x6A, 0x01}, {0xF9, 0xBF}, /* 0xB4-0xB7 */
 	{0x6A, 0x03}, {0x6A, 0x04}, {0x6A, 0x05}, {0x6A, 0x06}, /* 0xB8-0xBB */
 	{0x6A, 0x07}, {0x6A, 0x08}, {0x6A, 0x09}, {0x6A, 0x0B}, /* 0xBC-0xBF */
 	{0x6A, 0x0C}, {0x6A, 0x0D}, {0x6A, 0x0E}, {0x6A, 0x0F}, /* 0xC0-0xC3 */
-	{0x6A, 0x10}, {0x6A, 0x11}, {0x6A, 0x12}, {0x6A, 0x13}, /* 0xC4-0xC7 */
+	{0x6A, 0x10}, {0x6A, 0x11}, {0x6A, 0x12}, {0xF9, 0x4C}, /* 0xC4-0xC7 */
 	{0x6A, 0x14}, {0x6A, 0x15}, {0x6A, 0x16}, {0x6A, 0x19}, /* 0xC8-0xCB */
 	{0x6A, 0x1A}, {0x6A, 0x1B}, {0x6A, 0x1C}, {0x6A, 0x1D}, /* 0xCC-0xCF */
 	{0x6A, 0x1E}, {0x6A, 0x20}, {0x6A, 0x22}, {0x6A, 0x23}, /* 0xD0-0xD3 */
@@ -1687,7 +1689,7 @@
 	{0x6A, 0xC6}, {0x6A, 0xC7}, {0x6A, 0xC8}, {0x6A, 0xC9}, /* 0x9C-0x9F */
 	{0x6A, 0xCA}, {0x6A, 0xCB}, {0x6A, 0xCC}, {0x6A, 0xCD}, /* 0xA0-0xA3 */
 	{0x6A, 0xCE}, {0x6A, 0xCF}, {0x6A, 0xD0}, {0x6A, 0xD1}, /* 0xA4-0xA7 */
-	{0x6A, 0xD2}, {0x6A, 0xD3}, {0x6A, 0xD4}, {0x6A, 0xD5}, /* 0xA8-0xAB */
+	{0x6A, 0xD2}, {0xF9, 0x31}, {0x6A, 0xD4}, {0x6A, 0xD5}, /* 0xA8-0xAB */
 	{0x6A, 0xD6}, {0x6A, 0xD7}, {0x6A, 0xD8}, {0x6A, 0xD9}, /* 0xAC-0xAF */
 	{0x6A, 0xDA}, {0x6A, 0xDB}, {0x6A, 0xDC}, {0x6A, 0xDD}, /* 0xB0-0xB3 */
 	{0x6A, 0xDE}, {0x6A, 0xDF}, {0x6A, 0xE0}, {0x6A, 0xE1}, /* 0xB4-0xB7 */
@@ -1699,7 +1701,7 @@
 	{0x6A, 0xF6}, {0x6A, 0xF7}, {0x6A, 0xF8}, {0x6A, 0xF9}, /* 0xCC-0xCF */
 	{0x6A, 0xFA}, {0x6A, 0xFB}, {0x6A, 0xFC}, {0x6A, 0xFD}, /* 0xD0-0xD3 */
 	{0x6A, 0xFE}, {0x6A, 0xFF}, {0x6B, 0x00}, {0x6B, 0x01}, /* 0xD4-0xD7 */
-	{0x6B, 0x02}, {0x6B, 0x03}, {0x6B, 0x04}, {0x6B, 0x05}, /* 0xD8-0xDB */
+	{0x6B, 0x02}, {0x6B, 0x03}, {0xF9, 0x1D}, {0x6B, 0x05}, /* 0xD8-0xDB */
 	{0x6B, 0x06}, {0x6B, 0x07}, {0x6B, 0x08}, {0x6B, 0x09}, /* 0xDC-0xDF */
 	{0x6B, 0x0A}, {0x6B, 0x0B}, {0x6B, 0x0C}, {0x6B, 0x0D}, /* 0xE0-0xE3 */
 	{0x6B, 0x0E}, {0x6B, 0x0F}, {0x6B, 0x10}, {0x6B, 0x11}, /* 0xE4-0xE7 */
@@ -1741,7 +1743,7 @@
 	{0x6B, 0x68}, {0x6B, 0x69}, {0x6B, 0x6B}, {0x6B, 0x6C}, /* 0x68-0x6B */
 	{0x6B, 0x6D}, {0x6B, 0x6E}, {0x6B, 0x6F}, {0x6B, 0x70}, /* 0x6C-0x6F */
 	{0x6B, 0x71}, {0x6B, 0x72}, {0x6B, 0x73}, {0x6B, 0x74}, /* 0x70-0x73 */
-	{0x6B, 0x75}, {0x6B, 0x76}, {0x6B, 0x77}, {0x6B, 0x78}, /* 0x74-0x77 */
+	{0x6B, 0x75}, {0x6B, 0x76}, {0xF9, 0x8C}, {0x6B, 0x78}, /* 0x74-0x77 */
 	{0x6B, 0x7A}, {0x6B, 0x7D}, {0x6B, 0x7E}, {0x6B, 0x7F}, /* 0x78-0x7B */
 	{0x6B, 0x80}, {0x6B, 0x85}, {0x6B, 0x88}, {0x00, 0x3F}, /* 0x7C-0x7F */
 	
@@ -1751,9 +1753,9 @@
 	{0x6B, 0x9E}, {0x6B, 0x9F}, {0x6B, 0xA0}, {0x6B, 0xA2}, /* 0x8C-0x8F */
 	{0x6B, 0xA3}, {0x6B, 0xA4}, {0x6B, 0xA5}, {0x6B, 0xA6}, /* 0x90-0x93 */
 	{0x6B, 0xA7}, {0x6B, 0xA8}, {0x6B, 0xA9}, {0x6B, 0xAB}, /* 0x94-0x97 */
-	{0x6B, 0xAC}, {0x6B, 0xAD}, {0x6B, 0xAE}, {0x6B, 0xAF}, /* 0x98-0x9B */
+	{0x6B, 0xAC}, {0x6B, 0xAD}, {0xF9, 0xA5}, {0x6B, 0xAF}, /* 0x98-0x9B */
 	{0x6B, 0xB0}, {0x6B, 0xB1}, {0x6B, 0xB2}, {0x6B, 0xB6}, /* 0x9C-0x9F */
-	{0x6B, 0xB8}, {0x6B, 0xB9}, {0x6B, 0xBA}, {0x6B, 0xBB}, /* 0xA0-0xA3 */
+	{0x6B, 0xB8}, {0x6B, 0xB9}, {0xF9, 0x70}, {0x6B, 0xBB}, /* 0xA0-0xA3 */
 	{0x6B, 0xBC}, {0x6B, 0xBD}, {0x6B, 0xBE}, {0x6B, 0xC0}, /* 0xA4-0xA7 */
 	{0x6B, 0xC3}, {0x6B, 0xC4}, {0x6B, 0xC6}, {0x6B, 0xC7}, /* 0xA8-0xAB */
 	{0x6B, 0xC8}, {0x6B, 0xC9}, {0x6B, 0xCA}, {0x6B, 0xCC}, /* 0xAC-0xAF */
@@ -1866,9 +1868,9 @@
 	{0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */
 	{0x6D, 0xCD}, {0x6D, 0xCE}, {0x6D, 0xCF}, {0x6D, 0xD0}, /* 0x40-0x43 */
 	{0x6D, 0xD2}, {0x6D, 0xD3}, {0x6D, 0xD4}, {0x6D, 0xD5}, /* 0x44-0x47 */
-	{0x6D, 0xD7}, {0x6D, 0xDA}, {0x6D, 0xDB}, {0x6D, 0xDC}, /* 0x48-0x4B */
+	{0x6D, 0xD7}, {0xF9, 0x4D}, {0x6D, 0xDB}, {0x6D, 0xDC}, /* 0x48-0x4B */
 	{0x6D, 0xDF}, {0x6D, 0xE2}, {0x6D, 0xE3}, {0x6D, 0xE5}, /* 0x4C-0x4F */
-	{0x6D, 0xE7}, {0x6D, 0xE8}, {0x6D, 0xE9}, {0x6D, 0xEA}, /* 0x50-0x53 */
+	{0x6D, 0xE7}, {0x6D, 0xE8}, {0x6D, 0xE9}, {0xF9, 0xD6}, /* 0x50-0x53 */
 	{0x6D, 0xED}, {0x6D, 0xEF}, {0x6D, 0xF0}, {0x6D, 0xF2}, /* 0x54-0x57 */
 	{0x6D, 0xF4}, {0x6D, 0xF5}, {0x6D, 0xF6}, {0x6D, 0xF8}, /* 0x58-0x5B */
 	{0x6D, 0xFA}, {0x6D, 0xFD}, {0x6D, 0xFE}, {0x6D, 0xFF}, /* 0x5C-0x5F */
@@ -1942,7 +1944,7 @@
 	{0x6F, 0x12}, {0x6F, 0x16}, {0x6F, 0x17}, {0x6F, 0x18}, /* 0x5C-0x5F */
 	{0x6F, 0x19}, {0x6F, 0x1A}, {0x6F, 0x1B}, {0x6F, 0x1C}, /* 0x60-0x63 */
 	{0x6F, 0x1D}, {0x6F, 0x1E}, {0x6F, 0x1F}, {0x6F, 0x21}, /* 0x64-0x67 */
-	{0x6F, 0x22}, {0x6F, 0x23}, {0x6F, 0x25}, {0x6F, 0x26}, /* 0x68-0x6B */
+	{0x6F, 0x22}, {0xF9, 0x92}, {0x6F, 0x25}, {0x6F, 0x26}, /* 0x68-0x6B */
 	{0x6F, 0x27}, {0x6F, 0x28}, {0x6F, 0x2C}, {0x6F, 0x2E}, /* 0x6C-0x6F */
 	{0x6F, 0x30}, {0x6F, 0x32}, {0x6F, 0x34}, {0x6F, 0x35}, /* 0x70-0x73 */
 	{0x6F, 0x37}, {0x6F, 0x38}, {0x6F, 0x39}, {0x6F, 0x3A}, /* 0x74-0x77 */
@@ -2001,11 +2003,11 @@
 	{0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */
 	{0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */
 	{0x6F, 0xE6}, {0x6F, 0xE7}, {0x6F, 0xE8}, {0x6F, 0xE9}, /* 0x40-0x43 */
-	{0x6F, 0xEA}, {0x6F, 0xEB}, {0x6F, 0xEC}, {0x6F, 0xED}, /* 0x44-0x47 */
+	{0x6F, 0xEA}, {0xF9, 0x22}, {0x6F, 0xEC}, {0x6F, 0xED}, /* 0x44-0x47 */
 	{0x6F, 0xF0}, {0x6F, 0xF1}, {0x6F, 0xF2}, {0x6F, 0xF3}, /* 0x48-0x4B */
 	{0x6F, 0xF4}, {0x6F, 0xF5}, {0x6F, 0xF6}, {0x6F, 0xF7}, /* 0x4C-0x4F */
 	{0x6F, 0xF8}, {0x6F, 0xF9}, {0x6F, 0xFA}, {0x6F, 0xFB}, /* 0x50-0x53 */
-	{0x6F, 0xFC}, {0x6F, 0xFD}, {0x6F, 0xFE}, {0x6F, 0xFF}, /* 0x54-0x57 */
+	{0x6F, 0xFC}, {0x6F, 0xFD}, {0xF9, 0x84}, {0x6F, 0xFF}, /* 0x54-0x57 */
 	{0x70, 0x00}, {0x70, 0x01}, {0x70, 0x02}, {0x70, 0x03}, /* 0x58-0x5B */
 	{0x70, 0x04}, {0x70, 0x05}, {0x70, 0x06}, {0x70, 0x07}, /* 0x5C-0x5F */
 	{0x70, 0x08}, {0x70, 0x09}, {0x70, 0x0A}, {0x70, 0x0B}, /* 0x60-0x63 */
@@ -2089,7 +2091,7 @@
 	{0x71, 0x3A}, {0x71, 0x3B}, {0x71, 0x3C}, {0x71, 0x3D}, /* 0x84-0x87 */
 	{0x71, 0x3E}, {0x71, 0x3F}, {0x71, 0x40}, {0x71, 0x41}, /* 0x88-0x8B */
 	{0x71, 0x42}, {0x71, 0x43}, {0x71, 0x44}, {0x71, 0x46}, /* 0x8C-0x8F */
-	{0x71, 0x47}, {0x71, 0x48}, {0x71, 0x49}, {0x71, 0x4B}, /* 0x90-0x93 */
+	{0x71, 0x47}, {0x71, 0x48}, {0xF9, 0x93}, {0x71, 0x4B}, /* 0x90-0x93 */
 	{0x71, 0x4D}, {0x71, 0x4F}, {0x71, 0x50}, {0x71, 0x51}, /* 0x94-0x97 */
 	{0x71, 0x52}, {0x71, 0x53}, {0x71, 0x54}, {0x71, 0x55}, /* 0x98-0x9B */
 	{0x71, 0x56}, {0x71, 0x57}, {0x71, 0x58}, {0x71, 0x59}, /* 0x9C-0x9F */
@@ -2115,7 +2117,7 @@
 	{0x71, 0xBF}, {0x71, 0xC0}, {0x71, 0xC1}, {0x71, 0xC2}, /* 0xEC-0xEF */
 	{0x71, 0xC4}, {0x71, 0xC5}, {0x71, 0xC6}, {0x71, 0xC7}, /* 0xF0-0xF3 */
 	{0x71, 0xC8}, {0x71, 0xC9}, {0x71, 0xCA}, {0x71, 0xCB}, /* 0xF4-0xF7 */
-	{0x71, 0xCC}, {0x71, 0xCD}, {0x71, 0xCF}, {0x71, 0xD0}, /* 0xF8-0xFB */
+	{0x71, 0xCC}, {0x71, 0xCD}, {0x71, 0xCF}, {0xF9, 0xEE}, /* 0xF8-0xFB */
 	{0x71, 0xD1}, {0x71, 0xD2}, {0x71, 0xD3}, {0x00, 0x3F}, /* 0xFC-0xFF */
 };
 
@@ -2149,11 +2151,11 @@
 	{0x72, 0x03}, {0x72, 0x04}, {0x72, 0x05}, {0x72, 0x07}, /* 0x68-0x6B */
 	{0x72, 0x08}, {0x72, 0x09}, {0x72, 0x0A}, {0x72, 0x0B}, /* 0x6C-0x6F */
 	{0x72, 0x0C}, {0x72, 0x0D}, {0x72, 0x0E}, {0x72, 0x0F}, /* 0x70-0x73 */
-	{0x72, 0x10}, {0x72, 0x11}, {0x72, 0x12}, {0x72, 0x13}, /* 0x74-0x77 */
+	{0xF9, 0x32}, {0x72, 0x11}, {0x72, 0x12}, {0x72, 0x13}, /* 0x74-0x77 */
 	{0x72, 0x14}, {0x72, 0x15}, {0x72, 0x16}, {0x72, 0x17}, /* 0x78-0x7B */
 	{0x72, 0x18}, {0x72, 0x19}, {0x72, 0x1A}, {0x00, 0x3F}, /* 0x7C-0x7F */
 	
-	{0x72, 0x1B}, {0x72, 0x1C}, {0x72, 0x1E}, {0x72, 0x1F}, /* 0x80-0x83 */
+	{0xF9, 0x1E}, {0x72, 0x1C}, {0x72, 0x1E}, {0x72, 0x1F}, /* 0x80-0x83 */
 	{0x72, 0x20}, {0x72, 0x21}, {0x72, 0x22}, {0x72, 0x23}, /* 0x84-0x87 */
 	{0x72, 0x24}, {0x72, 0x25}, {0x72, 0x26}, {0x72, 0x27}, /* 0x88-0x8B */
 	{0x72, 0x29}, {0x72, 0x2B}, {0x72, 0x2D}, {0x72, 0x2E}, /* 0x8C-0x8F */
@@ -2180,7 +2182,7 @@
 	{0x72, 0xA9}, {0x72, 0xAA}, {0x72, 0xAB}, {0x72, 0xAE}, /* 0xE0-0xE3 */
 	{0x72, 0xB1}, {0x72, 0xB2}, {0x72, 0xB3}, {0x72, 0xB5}, /* 0xE4-0xE7 */
 	{0x72, 0xBA}, {0x72, 0xBB}, {0x72, 0xBC}, {0x72, 0xBD}, /* 0xE8-0xEB */
-	{0x72, 0xBE}, {0x72, 0xBF}, {0x72, 0xC0}, {0x72, 0xC5}, /* 0xEC-0xEF */
+	{0x72, 0xBE}, {0x72, 0xBF}, {0xF9, 0xFA}, {0x72, 0xC5}, /* 0xEC-0xEF */
 	{0x72, 0xC6}, {0x72, 0xC7}, {0x72, 0xC9}, {0x72, 0xCA}, /* 0xF0-0xF3 */
 	{0x72, 0xCB}, {0x72, 0xCC}, {0x72, 0xCF}, {0x72, 0xD1}, /* 0xF4-0xF7 */
 	{0x72, 0xD3}, {0x72, 0xD4}, {0x72, 0xD5}, {0x72, 0xD6}, /* 0xF8-0xFB */
@@ -2245,7 +2247,7 @@
 	{0x22, 0x61}, {0x22, 0x4C}, {0x22, 0x48}, {0x22, 0x3D}, /* 0xD4-0xD7 */
 	{0x22, 0x1D}, {0x22, 0x60}, {0x22, 0x6E}, {0x22, 0x6F}, /* 0xD8-0xDB */
 	{0x22, 0x64}, {0x22, 0x65}, {0x22, 0x1E}, {0x22, 0x35}, /* 0xDC-0xDF */
-	{0x22, 0x34}, {0x26, 0x42}, {0x26, 0x40}, {0x00, 0xB0}, /* 0xE0-0xE3 */
+	{0x22, 0x34}, {0x26, 0x42}, {0x26, 0x40}, {0x22, 0x18}, /* 0xE0-0xE3 */
 	{0x20, 0x32}, {0x20, 0x33}, {0x21, 0x03}, {0xFF, 0x04}, /* 0xE4-0xE7 */
 	{0x00, 0xA4}, {0xFF, 0xE0}, {0xFF, 0xE1}, {0x20, 0x30}, /* 0xE8-0xEB */
 	{0x00, 0xA7}, {0x21, 0x16}, {0x26, 0x06}, {0x26, 0x05}, /* 0xEC-0xEF */
@@ -2884,7 +2886,7 @@
 	{0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */
 	{0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */
 	{0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */
-	{0x73, 0x72}, {0x73, 0x73}, {0x73, 0x74}, {0x73, 0x75}, /* 0x40-0x43 */
+	{0x73, 0x72}, {0x73, 0x73}, {0x73, 0x74}, {0xF9, 0xA7}, /* 0x40-0x43 */
 	{0x73, 0x76}, {0x73, 0x77}, {0x73, 0x78}, {0x73, 0x79}, /* 0x44-0x47 */
 	{0x73, 0x7A}, {0x73, 0x7B}, {0x73, 0x7C}, {0x73, 0x7D}, /* 0x48-0x4B */
 	{0x73, 0x7F}, {0x73, 0x80}, {0x73, 0x81}, {0x73, 0x82}, /* 0x4C-0x4F */
@@ -2973,7 +2975,7 @@
 	{0x74, 0x52}, {0x74, 0x53}, {0x74, 0x54}, {0x74, 0x56}, /* 0x84-0x87 */
 	{0x74, 0x58}, {0x74, 0x5D}, {0x74, 0x60}, {0x74, 0x61}, /* 0x88-0x8B */
 	{0x74, 0x62}, {0x74, 0x63}, {0x74, 0x64}, {0x74, 0x65}, /* 0x8C-0x8F */
-	{0x74, 0x66}, {0x74, 0x67}, {0x74, 0x68}, {0x74, 0x69}, /* 0x90-0x93 */
+	{0x74, 0x66}, {0x74, 0x67}, {0x74, 0x68}, {0xF9, 0xAE}, /* 0x90-0x93 */
 	{0x74, 0x6A}, {0x74, 0x6B}, {0x74, 0x6C}, {0x74, 0x6E}, /* 0x94-0x97 */
 	{0x74, 0x6F}, {0x74, 0x71}, {0x74, 0x72}, {0x74, 0x73}, /* 0x98-0x9B */
 	{0x74, 0x74}, {0x74, 0x75}, {0x74, 0x78}, {0x74, 0x79}, /* 0x9C-0x9F */
@@ -3022,10 +3024,10 @@
 	{0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */
 	{0x74, 0x7B}, {0x74, 0x7C}, {0x74, 0x7D}, {0x74, 0x7F}, /* 0x40-0x43 */
 	{0x74, 0x82}, {0x74, 0x84}, {0x74, 0x85}, {0x74, 0x86}, /* 0x44-0x47 */
-	{0x74, 0x88}, {0x74, 0x89}, {0x74, 0x8A}, {0x74, 0x8C}, /* 0x48-0x4B */
+	{0x74, 0x88}, {0xF9, 0x94}, {0x74, 0x8A}, {0x74, 0x8C}, /* 0x48-0x4B */
 	{0x74, 0x8D}, {0x74, 0x8F}, {0x74, 0x91}, {0x74, 0x92}, /* 0x4C-0x4F */
 	{0x74, 0x93}, {0x74, 0x94}, {0x74, 0x95}, {0x74, 0x96}, /* 0x50-0x53 */
-	{0x74, 0x97}, {0x74, 0x98}, {0x74, 0x99}, {0x74, 0x9A}, /* 0x54-0x57 */
+	{0x74, 0x97}, {0xF9, 0xEF}, {0x74, 0x99}, {0x74, 0x9A}, /* 0x54-0x57 */
 	{0x74, 0x9B}, {0x74, 0x9D}, {0x74, 0x9F}, {0x74, 0xA0}, /* 0x58-0x5B */
 	{0x74, 0xA1}, {0x74, 0xA2}, {0x74, 0xA3}, {0x74, 0xA4}, /* 0x5C-0x5F */
 	{0x74, 0xA5}, {0x74, 0xA6}, {0x74, 0xAA}, {0x74, 0xAB}, /* 0x60-0x63 */
@@ -3109,7 +3111,7 @@
 	{0x75, 0x61}, {0x75, 0x62}, {0x75, 0x63}, {0x75, 0x64}, /* 0x84-0x87 */
 	{0x75, 0x67}, {0x75, 0x68}, {0x75, 0x69}, {0x75, 0x6B}, /* 0x88-0x8B */
 	{0x75, 0x6C}, {0x75, 0x6D}, {0x75, 0x6E}, {0x75, 0x6F}, /* 0x8C-0x8F */
-	{0x75, 0x70}, {0x75, 0x71}, {0x75, 0x73}, {0x75, 0x75}, /* 0x90-0x93 */
+	{0xF9, 0x62}, {0x75, 0x71}, {0x75, 0x73}, {0x75, 0x75}, /* 0x90-0x93 */
 	{0x75, 0x76}, {0x75, 0x77}, {0x75, 0x7A}, {0x75, 0x7B}, /* 0x94-0x97 */
 	{0x75, 0x7C}, {0x75, 0x7D}, {0x75, 0x7E}, {0x75, 0x80}, /* 0x98-0x9B */
 	{0x75, 0x81}, {0x75, 0x82}, {0x75, 0x84}, {0x75, 0x85}, /* 0x9C-0x9F */
@@ -3180,7 +3182,7 @@
 	{0x76, 0x23}, {0x76, 0x27}, {0x76, 0x28}, {0x76, 0x2C}, /* 0x90-0x93 */
 	{0x76, 0x2E}, {0x76, 0x2F}, {0x76, 0x31}, {0x76, 0x32}, /* 0x94-0x97 */
 	{0x76, 0x36}, {0x76, 0x37}, {0x76, 0x39}, {0x76, 0x3A}, /* 0x98-0x9B */
-	{0x76, 0x3B}, {0x76, 0x3D}, {0x76, 0x41}, {0x76, 0x42}, /* 0x9C-0x9F */
+	{0x76, 0x3B}, {0x76, 0x3D}, {0x76, 0x41}, {0xF9, 0xC1}, /* 0x9C-0x9F */
 	{0x76, 0x44}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xA0-0xA3 */
 	{0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xA4-0xA7 */
 	{0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xA8-0xAB */
@@ -3231,7 +3233,7 @@
 	{0x76, 0x59}, {0x76, 0x5A}, {0x76, 0x5B}, {0x76, 0x5D}, /* 0x50-0x53 */
 	{0x76, 0x5F}, {0x76, 0x60}, {0x76, 0x61}, {0x76, 0x62}, /* 0x54-0x57 */
 	{0x76, 0x64}, {0x76, 0x65}, {0x76, 0x66}, {0x76, 0x67}, /* 0x58-0x5B */
-	{0x76, 0x68}, {0x76, 0x69}, {0x76, 0x6A}, {0x76, 0x6C}, /* 0x5C-0x5F */
+	{0x76, 0x68}, {0xF9, 0x0E}, {0x76, 0x6A}, {0x76, 0x6C}, /* 0x5C-0x5F */
 	{0x76, 0x6D}, {0x76, 0x6E}, {0x76, 0x70}, {0x76, 0x71}, /* 0x60-0x63 */
 	{0x76, 0x72}, {0x76, 0x73}, {0x76, 0x74}, {0x76, 0x75}, /* 0x64-0x67 */
 	{0x76, 0x76}, {0x76, 0x77}, {0x76, 0x79}, {0x76, 0x7A}, /* 0x68-0x6B */
@@ -3296,7 +3298,7 @@
 	{0x76, 0xCC}, {0x76, 0xD3}, {0x76, 0xD5}, {0x76, 0xD9}, /* 0x44-0x47 */
 	{0x76, 0xDA}, {0x76, 0xDC}, {0x76, 0xDD}, {0x76, 0xDE}, /* 0x48-0x4B */
 	{0x76, 0xE0}, {0x76, 0xE1}, {0x76, 0xE2}, {0x76, 0xE3}, /* 0x4C-0x4F */
-	{0x76, 0xE4}, {0x76, 0xE6}, {0x76, 0xE7}, {0x76, 0xE8}, /* 0x50-0x53 */
+	{0x76, 0xE4}, {0x76, 0xE6}, {0xF9, 0x33}, {0x76, 0xE8}, /* 0x50-0x53 */
 	{0x76, 0xE9}, {0x76, 0xEA}, {0x76, 0xEB}, {0x76, 0xEC}, /* 0x54-0x57 */
 	{0x76, 0xED}, {0x76, 0xF0}, {0x76, 0xF3}, {0x76, 0xF5}, /* 0x58-0x5B */
 	{0x76, 0xF6}, {0x76, 0xF7}, {0x76, 0xFA}, {0x76, 0xFB}, /* 0x5C-0x5F */
@@ -3319,9 +3321,9 @@
 	{0x77, 0x56}, {0x77, 0x57}, {0x77, 0x58}, {0x77, 0x59}, /* 0x9C-0x9F */
 	{0x77, 0x5C}, {0x85, 0x84}, {0x96, 0xF9}, {0x4F, 0xDD}, /* 0xA0-0xA3 */
 	{0x58, 0x21}, {0x99, 0x71}, {0x5B, 0x9D}, {0x62, 0xB1}, /* 0xA4-0xA7 */
-	{0x62, 0xA5}, {0x66, 0xB4}, {0x8C, 0x79}, {0x9C, 0x8D}, /* 0xA8-0xAB */
+	{0x62, 0xA5}, {0xFA, 0x06}, {0x8C, 0x79}, {0x9C, 0x8D}, /* 0xA8-0xAB */
 	{0x72, 0x06}, {0x67, 0x6F}, {0x78, 0x91}, {0x60, 0xB2}, /* 0xAC-0xAF */
-	{0x53, 0x51}, {0x53, 0x17}, {0x8F, 0x88}, {0x80, 0xCC}, /* 0xB0-0xB3 */
+	{0x53, 0x51}, {0xF9, 0x63}, {0x8F, 0x88}, {0x80, 0xCC}, /* 0xB0-0xB3 */
 	{0x8D, 0x1D}, {0x94, 0xA1}, {0x50, 0x0D}, {0x72, 0xC8}, /* 0xB4-0xB7 */
 	{0x59, 0x07}, {0x60, 0xEB}, {0x71, 0x19}, {0x88, 0xAB}, /* 0xB8-0xBB */
 	{0x59, 0x54}, {0x82, 0xEF}, {0x67, 0x2C}, {0x7B, 0x28}, /* 0xBC-0xBF */
@@ -3333,7 +3335,7 @@
 	{0x75, 0xF9}, {0x95, 0xED}, {0x65, 0x5D}, {0x5F, 0x0A}, /* 0xD4-0xD7 */
 	{0x5F, 0xC5}, {0x8F, 0x9F}, {0x58, 0xC1}, {0x81, 0xC2}, /* 0xD8-0xDB */
 	{0x90, 0x7F}, {0x96, 0x5B}, {0x97, 0xAD}, {0x8F, 0xB9}, /* 0xDC-0xDF */
-	{0x7F, 0x16}, {0x8D, 0x2C}, {0x62, 0x41}, {0x4F, 0xBF}, /* 0xE0-0xE3 */
+	{0x7F, 0x16}, {0x8D, 0x2C}, {0x62, 0x41}, {0xF9, 0x65}, /* 0xE0-0xE3 */
 	{0x53, 0xD8}, {0x53, 0x5E}, {0x8F, 0xA8}, {0x8F, 0xA9}, /* 0xE4-0xE7 */
 	{0x8F, 0xAB}, {0x90, 0x4D}, {0x68, 0x07}, {0x5F, 0x6A}, /* 0xE8-0xEB */
 	{0x81, 0x98}, {0x88, 0x68}, {0x9C, 0xD6}, {0x61, 0x8B}, /* 0xEC-0xEF */
@@ -3391,7 +3393,7 @@
 	{0x94, 0xC2}, {0x7B, 0x94}, {0x4F, 0x2F}, {0x5E, 0x1B}, /* 0xAC-0xAF */
 	{0x82, 0x36}, {0x81, 0x16}, {0x81, 0x8A}, {0x6E, 0x24}, /* 0xB0-0xB3 */
 	{0x6C, 0xCA}, {0x9A, 0x73}, {0x63, 0x55}, {0x53, 0x5C}, /* 0xB4-0xB7 */
-	{0x54, 0xFA}, {0x88, 0x65}, {0x57, 0xE0}, {0x4E, 0x0D}, /* 0xB8-0xBB */
+	{0x54, 0xFA}, {0x88, 0x65}, {0x57, 0xE0}, {0xF9, 0x67}, /* 0xB8-0xBB */
 	{0x5E, 0x03}, {0x6B, 0x65}, {0x7C, 0x3F}, {0x90, 0xE8}, /* 0xBC-0xBF */
 	{0x60, 0x16}, {0x64, 0xE6}, {0x73, 0x1C}, {0x88, 0xC1}, /* 0xC0-0xC3 */
 	{0x67, 0x50}, {0x62, 0x4D}, {0x8D, 0x22}, {0x77, 0x6C}, /* 0xC4-0xC7 */
@@ -3403,7 +3405,7 @@
 	{0x66, 0xF9}, {0x83, 0x49}, {0x53, 0x95}, {0x7B, 0x56}, /* 0xDC-0xDF */
 	{0x4F, 0xA7}, {0x51, 0x8C}, {0x6D, 0x4B}, {0x5C, 0x42}, /* 0xE0-0xE3 */
 	{0x8E, 0x6D}, {0x63, 0xD2}, {0x53, 0xC9}, {0x83, 0x2C}, /* 0xE4-0xE7 */
-	{0x83, 0x36}, {0x67, 0xE5}, {0x78, 0xB4}, {0x64, 0x3D}, /* 0xE8-0xEB */
+	{0xF9, 0xFE}, {0x67, 0xE5}, {0x78, 0xB4}, {0x64, 0x3D}, /* 0xE8-0xEB */
 	{0x5B, 0xDF}, {0x5C, 0x94}, {0x5D, 0xEE}, {0x8B, 0xE7}, /* 0xEC-0xEF */
 	{0x62, 0xC6}, {0x67, 0xF4}, {0x8C, 0x7A}, {0x64, 0x00}, /* 0xF0-0xF3 */
 	{0x63, 0xBA}, {0x87, 0x49}, {0x99, 0x8B}, {0x8C, 0x17}, /* 0xF4-0xF7 */
@@ -3460,7 +3462,7 @@
 	{0x56, 0x32}, {0x6F, 0x6E}, {0x5D, 0xE2}, {0x54, 0x35}, /* 0xB0-0xB3 */
 	{0x70, 0x92}, {0x8F, 0x66}, {0x62, 0x6F}, {0x64, 0xA4}, /* 0xB4-0xB7 */
 	{0x63, 0xA3}, {0x5F, 0x7B}, {0x6F, 0x88}, {0x90, 0xF4}, /* 0xB8-0xBB */
-	{0x81, 0xE3}, {0x8F, 0xB0}, {0x5C, 0x18}, {0x66, 0x68}, /* 0xBC-0xBF */
+	{0x81, 0xE3}, {0xF9, 0x71}, {0x5C, 0x18}, {0x66, 0x68}, /* 0xBC-0xBF */
 	{0x5F, 0xF1}, {0x6C, 0x89}, {0x96, 0x48}, {0x8D, 0x81}, /* 0xC0-0xC3 */
 	{0x88, 0x6C}, {0x64, 0x91}, {0x79, 0xF0}, {0x57, 0xCE}, /* 0xC4-0xC7 */
 	{0x6A, 0x59}, {0x62, 0x10}, {0x54, 0x48}, {0x4E, 0x58}, /* 0xC8-0xCB */
@@ -3517,14 +3519,14 @@
 	{0x78, 0xE9}, {0x78, 0xEA}, {0x78, 0xEB}, {0x78, 0xED}, /* 0x84-0x87 */
 	{0x78, 0xEE}, {0x78, 0xEF}, {0x78, 0xF0}, {0x78, 0xF1}, /* 0x88-0x8B */
 	{0x78, 0xF3}, {0x78, 0xF5}, {0x78, 0xF6}, {0x78, 0xF8}, /* 0x8C-0x8F */
-	{0x78, 0xF9}, {0x78, 0xFB}, {0x78, 0xFC}, {0x78, 0xFD}, /* 0x90-0x93 */
+	{0x78, 0xF9}, {0xF9, 0x64}, {0x78, 0xFC}, {0x78, 0xFD}, /* 0x90-0x93 */
 	{0x78, 0xFE}, {0x78, 0xFF}, {0x79, 0x00}, {0x79, 0x02}, /* 0x94-0x97 */
 	{0x79, 0x03}, {0x79, 0x04}, {0x79, 0x06}, {0x79, 0x07}, /* 0x98-0x9B */
 	{0x79, 0x08}, {0x79, 0x09}, {0x79, 0x0A}, {0x79, 0x0B}, /* 0x9C-0x9F */
 	{0x79, 0x0C}, {0x78, 0x40}, {0x50, 0xA8}, {0x77, 0xD7}, /* 0xA0-0xA3 */
 	{0x64, 0x10}, {0x89, 0xE6}, {0x59, 0x04}, {0x63, 0xE3}, /* 0xA4-0xA7 */
 	{0x5D, 0xDD}, {0x7A, 0x7F}, {0x69, 0x3D}, {0x4F, 0x20}, /* 0xA8-0xAB */
-	{0x82, 0x39}, {0x55, 0x98}, {0x4E, 0x32}, {0x75, 0xAE}, /* 0xAC-0xAF */
+	{0x82, 0x39}, {0x55, 0x98}, {0xF9, 0x05}, {0x75, 0xAE}, /* 0xAC-0xAF */
 	{0x7A, 0x97}, {0x5E, 0x62}, {0x5E, 0x8A}, {0x95, 0xEF}, /* 0xB0-0xB3 */
 	{0x52, 0x1B}, {0x54, 0x39}, {0x70, 0x8A}, {0x63, 0x76}, /* 0xB4-0xB7 */
 	{0x95, 0x24}, {0x57, 0x82}, {0x66, 0x25}, {0x69, 0x3F}, /* 0xB8-0xBB */
@@ -3532,7 +3534,7 @@
 	{0x88, 0x22}, {0x62, 0x33}, {0x7E, 0xF0}, {0x75, 0xB5}, /* 0xC0-0xC3 */
 	{0x83, 0x28}, {0x78, 0xC1}, {0x96, 0xCC}, {0x8F, 0x9E}, /* 0xC4-0xC7 */
 	{0x61, 0x48}, {0x74, 0xF7}, {0x8B, 0xCD}, {0x6B, 0x64}, /* 0xC8-0xCB */
-	{0x52, 0x3A}, {0x8D, 0x50}, {0x6B, 0x21}, {0x80, 0x6A}, /* 0xCC-0xCF */
+	{0xF9, 0xFF}, {0x8D, 0x50}, {0x6B, 0x21}, {0x80, 0x6A}, /* 0xCC-0xCF */
 	{0x84, 0x71}, {0x56, 0xF1}, {0x53, 0x06}, {0x4E, 0xCE}, /* 0xD0-0xD3 */
 	{0x4E, 0x1B}, {0x51, 0xD1}, {0x7C, 0x97}, {0x91, 0x8B}, /* 0xD4-0xD7 */
 	{0x7C, 0x07}, {0x4F, 0xC3}, {0x8E, 0x7F}, {0x7B, 0xE1}, /* 0xD8-0xDB */
@@ -3570,7 +3572,7 @@
 	{0x79, 0x1A}, {0x79, 0x1B}, {0x79, 0x1C}, {0x79, 0x1D}, /* 0x4C-0x4F */
 	{0x79, 0x1F}, {0x79, 0x20}, {0x79, 0x21}, {0x79, 0x22}, /* 0x50-0x53 */
 	{0x79, 0x23}, {0x79, 0x25}, {0x79, 0x26}, {0x79, 0x27}, /* 0x54-0x57 */
-	{0x79, 0x28}, {0x79, 0x29}, {0x79, 0x2A}, {0x79, 0x2B}, /* 0x58-0x5B */
+	{0x79, 0x28}, {0x79, 0x29}, {0xF9, 0x85}, {0x79, 0x2B}, /* 0x58-0x5B */
 	{0x79, 0x2C}, {0x79, 0x2D}, {0x79, 0x2E}, {0x79, 0x2F}, /* 0x5C-0x5F */
 	{0x79, 0x30}, {0x79, 0x31}, {0x79, 0x32}, {0x79, 0x33}, /* 0x60-0x63 */
 	{0x79, 0x35}, {0x79, 0x36}, {0x79, 0x37}, {0x79, 0x38}, /* 0x64-0x67 */
@@ -3585,12 +3587,12 @@
 	{0x79, 0x6B}, {0x79, 0x6C}, {0x79, 0x6E}, {0x79, 0x70}, /* 0x84-0x87 */
 	{0x79, 0x71}, {0x79, 0x72}, {0x79, 0x73}, {0x79, 0x74}, /* 0x88-0x8B */
 	{0x79, 0x75}, {0x79, 0x76}, {0x79, 0x79}, {0x79, 0x7B}, /* 0x8C-0x8F */
-	{0x79, 0x7C}, {0x79, 0x7D}, {0x79, 0x7E}, {0x79, 0x7F}, /* 0x90-0x93 */
+	{0x79, 0x7C}, {0x79, 0x7D}, {0x79, 0x7E}, {0xF9, 0x3C}, /* 0x90-0x93 */
 	{0x79, 0x82}, {0x79, 0x83}, {0x79, 0x86}, {0x79, 0x87}, /* 0x94-0x97 */
 	{0x79, 0x88}, {0x79, 0x89}, {0x79, 0x8B}, {0x79, 0x8C}, /* 0x98-0x9B */
 	{0x79, 0x8D}, {0x79, 0x8E}, {0x79, 0x90}, {0x79, 0x91}, /* 0x9C-0x9F */
 	{0x79, 0x92}, {0x60, 0x20}, {0x80, 0x3D}, {0x62, 0xC5}, /* 0xA0-0xA3 */
-	{0x4E, 0x39}, {0x53, 0x55}, {0x90, 0xF8}, {0x63, 0xB8}, /* 0xA4-0xA7 */
+	{0xF9, 0x5E}, {0x53, 0x55}, {0x90, 0xF8}, {0x63, 0xB8}, /* 0xA4-0xA7 */
 	{0x80, 0xC6}, {0x65, 0xE6}, {0x6C, 0x2E}, {0x4F, 0x46}, /* 0xA8-0xAB */
 	{0x60, 0xEE}, {0x6D, 0xE1}, {0x8B, 0xDE}, {0x5F, 0x39}, /* 0xAC-0xAF */
 	{0x86, 0xCB}, {0x5F, 0x53}, {0x63, 0x21}, {0x51, 0x5A}, /* 0xB0-0xB3 */
@@ -3638,7 +3640,7 @@
 	{0x79, 0xA0}, {0x79, 0xA1}, {0x79, 0xA2}, {0x79, 0xA3}, /* 0x4C-0x4F */
 	{0x79, 0xA4}, {0x79, 0xA5}, {0x79, 0xA6}, {0x79, 0xA8}, /* 0x50-0x53 */
 	{0x79, 0xA9}, {0x79, 0xAA}, {0x79, 0xAB}, {0x79, 0xAC}, /* 0x54-0x57 */
-	{0x79, 0xAD}, {0x79, 0xAE}, {0x79, 0xAF}, {0x79, 0xB0}, /* 0x58-0x5B */
+	{0x79, 0xAD}, {0xF9, 0xB6}, {0x79, 0xAF}, {0x79, 0xB0}, /* 0x58-0x5B */
 	{0x79, 0xB1}, {0x79, 0xB2}, {0x79, 0xB4}, {0x79, 0xB5}, /* 0x5C-0x5F */
 	{0x79, 0xB6}, {0x79, 0xB7}, {0x79, 0xB8}, {0x79, 0xBC}, /* 0x60-0x63 */
 	{0x79, 0xBF}, {0x79, 0xC2}, {0x79, 0xC4}, {0x79, 0xC5}, /* 0x64-0x67 */
@@ -3657,17 +3659,17 @@
 	{0x7A, 0x0A}, {0x7A, 0x0C}, {0x7A, 0x0F}, {0x7A, 0x10}, /* 0x94-0x97 */
 	{0x7A, 0x11}, {0x7A, 0x12}, {0x7A, 0x13}, {0x7A, 0x15}, /* 0x98-0x9B */
 	{0x7A, 0x16}, {0x7A, 0x18}, {0x7A, 0x19}, {0x7A, 0x1B}, /* 0x9C-0x9F */
-	{0x7A, 0x1C}, {0x4E, 0x01}, {0x76, 0xEF}, {0x53, 0xEE}, /* 0xA0-0xA3 */
+	{0xF9, 0x56}, {0x4E, 0x01}, {0x76, 0xEF}, {0x53, 0xEE}, /* 0xA0-0xA3 */
 	{0x94, 0x89}, {0x98, 0x76}, {0x9F, 0x0E}, {0x95, 0x2D}, /* 0xA4-0xA7 */
 	{0x5B, 0x9A}, {0x8B, 0xA2}, {0x4E, 0x22}, {0x4E, 0x1C}, /* 0xA8-0xAB */
 	{0x51, 0xAC}, {0x84, 0x63}, {0x61, 0xC2}, {0x52, 0xA8}, /* 0xAC-0xAF */
 	{0x68, 0x0B}, {0x4F, 0x97}, {0x60, 0x6B}, {0x51, 0xBB}, /* 0xB0-0xB3 */
-	{0x6D, 0x1E}, {0x51, 0x5C}, {0x62, 0x96}, {0x65, 0x97}, /* 0xB4-0xB7 */
+	{0xFA, 0x05}, {0x51, 0x5C}, {0x62, 0x96}, {0x65, 0x97}, /* 0xB4-0xB7 */
 	{0x96, 0x61}, {0x8C, 0x46}, {0x90, 0x17}, {0x75, 0xD8}, /* 0xB8-0xBB */
-	{0x90, 0xFD}, {0x77, 0x63}, {0x6B, 0xD2}, {0x72, 0x8A}, /* 0xBC-0xBF */
+	{0xFA, 0x26}, {0x77, 0x63}, {0x6B, 0xD2}, {0x72, 0x8A}, /* 0xBC-0xBF */
 	{0x72, 0xEC}, {0x8B, 0xFB}, {0x58, 0x35}, {0x77, 0x79}, /* 0xC0-0xC3 */
 	{0x8D, 0x4C}, {0x67, 0x5C}, {0x95, 0x40}, {0x80, 0x9A}, /* 0xC4-0xC7 */
-	{0x5E, 0xA6}, {0x6E, 0x21}, {0x59, 0x92}, {0x7A, 0xEF}, /* 0xC8-0xCB */
+	{0xFA, 0x01}, {0x6E, 0x21}, {0x59, 0x92}, {0x7A, 0xEF}, /* 0xC8-0xCB */
 	{0x77, 0xED}, {0x95, 0x3B}, {0x6B, 0xB5}, {0x65, 0xAD}, /* 0xCC-0xCF */
 	{0x7F, 0x0E}, {0x58, 0x06}, {0x51, 0x51}, {0x96, 0x1F}, /* 0xD0-0xD3 */
 	{0x5B, 0xF9}, {0x58, 0xA9}, {0x54, 0x28}, {0x8E, 0x72}, /* 0xD4-0xD7 */
@@ -3793,7 +3795,7 @@
 	{0x7B, 0x16}, {0x7B, 0x17}, {0x7B, 0x18}, {0x7B, 0x1A}, /* 0x94-0x97 */
 	{0x7B, 0x1C}, {0x7B, 0x1D}, {0x7B, 0x1F}, {0x7B, 0x21}, /* 0x98-0x9B */
 	{0x7B, 0x22}, {0x7B, 0x23}, {0x7B, 0x27}, {0x7B, 0x29}, /* 0x9C-0x9F */
-	{0x7B, 0x2D}, {0x6D, 0x6E}, {0x6D, 0xAA}, {0x79, 0x8F}, /* 0xA0-0xA3 */
+	{0x7B, 0x2D}, {0x6D, 0x6E}, {0x6D, 0xAA}, {0xFA, 0x1B}, /* 0xA0-0xA3 */
 	{0x88, 0xB1}, {0x5F, 0x17}, {0x75, 0x2B}, {0x62, 0x9A}, /* 0xA4-0xA7 */
 	{0x8F, 0x85}, {0x4F, 0xEF}, {0x91, 0xDC}, {0x65, 0xA7}, /* 0xA8-0xAB */
 	{0x81, 0x2F}, {0x81, 0x51}, {0x5E, 0x9C}, {0x81, 0x50}, /* 0xAC-0xAF */
@@ -3816,7 +3818,7 @@
 	{0x84, 0x5B}, {0x68, 0x3C}, {0x86, 0xE4}, {0x96, 0x01}, /* 0xF0-0xF3 */
 	{0x96, 0x94}, {0x94, 0xEC}, {0x4E, 0x2A}, {0x54, 0x04}, /* 0xF4-0xF7 */
 	{0x7E, 0xD9}, {0x68, 0x39}, {0x8D, 0xDF}, {0x80, 0x15}, /* 0xF8-0xFB */
-	{0x66, 0xF4}, {0x5E, 0x9A}, {0x7F, 0xB9}, {0x00, 0x3F}, /* 0xFC-0xFF */
+	{0xF9, 0x01}, {0x5E, 0x9A}, {0x7F, 0xB9}, {0x00, 0x3F}, /* 0xFC-0xFF */
 };
 
 static struct nls_unicode c2u_B9[256] = {
@@ -3928,7 +3930,7 @@
 	{0x7C, 0x2E}, {0x7C, 0x2F}, {0x7C, 0x30}, {0x7C, 0x31}, /* 0x90-0x93 */
 	{0x7C, 0x32}, {0x7C, 0x33}, {0x7C, 0x34}, {0x7C, 0x35}, /* 0x94-0x97 */
 	{0x7C, 0x36}, {0x7C, 0x37}, {0x7C, 0x39}, {0x7C, 0x3A}, /* 0x98-0x9B */
-	{0x7C, 0x3B}, {0x7C, 0x3C}, {0x7C, 0x3D}, {0x7C, 0x3E}, /* 0x9C-0x9F */
+	{0x7C, 0x3B}, {0x7C, 0x3C}, {0x7C, 0x3D}, {0xF9, 0xA6}, /* 0x9C-0x9F */
 	{0x7C, 0x42}, {0x9A, 0xB8}, {0x5B, 0x69}, {0x6D, 0x77}, /* 0xA0-0xA3 */
 	{0x6C, 0x26}, {0x4E, 0xA5}, {0x5B, 0xB3}, {0x9A, 0x87}, /* 0xA4-0xA7 */
 	{0x91, 0x63}, {0x61, 0xA8}, {0x90, 0xAF}, {0x97, 0xE9}, /* 0xA8-0xAB */
@@ -3979,7 +3981,7 @@
 	{0x7C, 0x54}, {0x7C, 0x55}, {0x7C, 0x56}, {0x7C, 0x57}, /* 0x50-0x53 */
 	{0x7C, 0x58}, {0x7C, 0x59}, {0x7C, 0x5A}, {0x7C, 0x5B}, /* 0x54-0x57 */
 	{0x7C, 0x5C}, {0x7C, 0x5D}, {0x7C, 0x5E}, {0x7C, 0x5F}, /* 0x58-0x5B */
-	{0x7C, 0x60}, {0x7C, 0x61}, {0x7C, 0x62}, {0x7C, 0x63}, /* 0x5C-0x5F */
+	{0xF9, 0x44}, {0x7C, 0x61}, {0x7C, 0x62}, {0x7C, 0x63}, /* 0x5C-0x5F */
 	{0x7C, 0x64}, {0x7C, 0x65}, {0x7C, 0x66}, {0x7C, 0x67}, /* 0x60-0x63 */
 	{0x7C, 0x68}, {0x7C, 0x69}, {0x7C, 0x6A}, {0x7C, 0x6B}, /* 0x64-0x67 */
 	{0x7C, 0x6C}, {0x7C, 0x6D}, {0x7C, 0x6E}, {0x7C, 0x6F}, /* 0x68-0x6B */
@@ -4000,7 +4002,7 @@
 	{0x7C, 0xBB}, {0x5F, 0x27}, {0x86, 0x4E}, {0x55, 0x2C}, /* 0xA0-0xA3 */
 	{0x62, 0xA4}, {0x4E, 0x92}, {0x6C, 0xAA}, {0x62, 0x37}, /* 0xA4-0xA7 */
 	{0x82, 0xB1}, {0x54, 0xD7}, {0x53, 0x4E}, {0x73, 0x3E}, /* 0xA8-0xAB */
-	{0x6E, 0xD1}, {0x75, 0x3B}, {0x52, 0x12}, {0x53, 0x16}, /* 0xAC-0xAF */
+	{0xF9, 0x04}, {0x75, 0x3B}, {0x52, 0x12}, {0x53, 0x16}, /* 0xAC-0xAF */
 	{0x8B, 0xDD}, {0x69, 0xD0}, {0x5F, 0x8A}, {0x60, 0x00}, /* 0xB0-0xB3 */
 	{0x6D, 0xEE}, {0x57, 0x4F}, {0x6B, 0x22}, {0x73, 0xAF}, /* 0xB4-0xB7 */
 	{0x68, 0x53}, {0x8F, 0xD8}, {0x7F, 0x13}, {0x63, 0x62}, /* 0xB8-0xBB */
@@ -4046,7 +4048,7 @@
 	{0x7C, 0xD2}, {0x7C, 0xD3}, {0x7C, 0xD4}, {0x7C, 0xD8}, /* 0x4C-0x4F */
 	{0x7C, 0xDA}, {0x7C, 0xDB}, {0x7C, 0xDD}, {0x7C, 0xDE}, /* 0x50-0x53 */
 	{0x7C, 0xE1}, {0x7C, 0xE2}, {0x7C, 0xE3}, {0x7C, 0xE4}, /* 0x54-0x57 */
-	{0x7C, 0xE5}, {0x7C, 0xE6}, {0x7C, 0xE7}, {0x7C, 0xE9}, /* 0x58-0x5B */
+	{0x7C, 0xE5}, {0x7C, 0xE6}, {0xF9, 0x7B}, {0x7C, 0xE9}, /* 0x58-0x5B */
 	{0x7C, 0xEA}, {0x7C, 0xEB}, {0x7C, 0xEC}, {0x7C, 0xED}, /* 0x5C-0x5F */
 	{0x7C, 0xEE}, {0x7C, 0xF0}, {0x7C, 0xF1}, {0x7C, 0xF2}, /* 0x60-0x63 */
 	{0x7C, 0xF3}, {0x7C, 0xF4}, {0x7C, 0xF5}, {0x7C, 0xF6}, /* 0x64-0x67 */
@@ -4055,7 +4057,7 @@
 	{0x7D, 0x01}, {0x7D, 0x02}, {0x7D, 0x03}, {0x7D, 0x04}, /* 0x70-0x73 */
 	{0x7D, 0x05}, {0x7D, 0x06}, {0x7D, 0x07}, {0x7D, 0x08}, /* 0x74-0x77 */
 	{0x7D, 0x09}, {0x7D, 0x0B}, {0x7D, 0x0C}, {0x7D, 0x0D}, /* 0x78-0x7B */
-	{0x7D, 0x0E}, {0x7D, 0x0F}, {0x7D, 0x10}, {0x00, 0x3F}, /* 0x7C-0x7F */
+	{0x7D, 0x0E}, {0x7D, 0x0F}, {0xF9, 0xCF}, {0x00, 0x3F}, /* 0x7C-0x7F */
 	
 	{0x7D, 0x11}, {0x7D, 0x12}, {0x7D, 0x13}, {0x7D, 0x14}, /* 0x80-0x83 */
 	{0x7D, 0x15}, {0x7D, 0x16}, {0x7D, 0x17}, {0x7D, 0x18}, /* 0x84-0x87 */
@@ -4138,7 +4140,7 @@
 	{0x5E, 0xFA}, {0x50, 0xF5}, {0x59, 0xDC}, {0x5C, 0x06}, /* 0xA8-0xAB */
 	{0x6D, 0x46}, {0x6C, 0x5F}, {0x75, 0x86}, {0x84, 0x8B}, /* 0xAC-0xAF */
 	{0x68, 0x68}, {0x59, 0x56}, {0x8B, 0xB2}, {0x53, 0x20}, /* 0xB0-0xB3 */
-	{0x91, 0x71}, {0x96, 0x4D}, {0x85, 0x49}, {0x69, 0x12}, /* 0xB4-0xB7 */
+	{0x91, 0x71}, {0xFA, 0x09}, {0x85, 0x49}, {0x69, 0x12}, /* 0xB4-0xB7 */
 	{0x79, 0x01}, {0x71, 0x26}, {0x80, 0xF6}, {0x4E, 0xA4}, /* 0xB8-0xBB */
 	{0x90, 0xCA}, {0x6D, 0x47}, {0x9A, 0x84}, {0x5A, 0x07}, /* 0xBC-0xBF */
 	{0x56, 0xBC}, {0x64, 0x05}, {0x94, 0xF0}, {0x77, 0xEB}, /* 0xC0-0xC3 */
@@ -4153,7 +4155,7 @@
 	{0x62, 0x12}, {0x85, 0xC9}, {0x82, 0xA5}, {0x75, 0x4C}, /* 0xE4-0xE7 */
 	{0x50, 0x1F}, {0x4E, 0xCB}, {0x75, 0xA5}, {0x8B, 0xEB}, /* 0xE8-0xEB */
 	{0x5C, 0x4A}, {0x5D, 0xFE}, {0x7B, 0x4B}, {0x65, 0xA4}, /* 0xEC-0xEF */
-	{0x91, 0xD1}, {0x4E, 0xCA}, {0x6D, 0x25}, {0x89, 0x5F}, /* 0xF0-0xF3 */
+	{0xF9, 0x0A}, {0x4E, 0xCA}, {0x6D, 0x25}, {0x89, 0x5F}, /* 0xF0-0xF3 */
 	{0x7D, 0x27}, {0x95, 0x26}, {0x4E, 0xC5}, {0x8C, 0x28}, /* 0xF4-0xF7 */
 	{0x8F, 0xDB}, {0x97, 0x73}, {0x66, 0x4B}, {0x79, 0x81}, /* 0xF8-0xFB */
 	{0x8F, 0xD1}, {0x70, 0xEC}, {0x6D, 0x78}, {0x00, 0x3F}, /* 0xFC-0xFF */
@@ -4177,14 +4179,14 @@
 	{0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */
 	{0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */
 	{0x7D, 0x99}, {0x7D, 0x9A}, {0x7D, 0x9B}, {0x7D, 0x9C}, /* 0x40-0x43 */
-	{0x7D, 0x9D}, {0x7D, 0x9E}, {0x7D, 0x9F}, {0x7D, 0xA0}, /* 0x44-0x47 */
+	{0x7D, 0x9D}, {0x7D, 0x9E}, {0x7D, 0x9F}, {0xF9, 0x3D}, /* 0x44-0x47 */
 	{0x7D, 0xA1}, {0x7D, 0xA2}, {0x7D, 0xA3}, {0x7D, 0xA4}, /* 0x48-0x4B */
 	{0x7D, 0xA5}, {0x7D, 0xA7}, {0x7D, 0xA8}, {0x7D, 0xA9}, /* 0x4C-0x4F */
 	{0x7D, 0xAA}, {0x7D, 0xAB}, {0x7D, 0xAC}, {0x7D, 0xAD}, /* 0x50-0x53 */
 	{0x7D, 0xAF}, {0x7D, 0xB0}, {0x7D, 0xB1}, {0x7D, 0xB2}, /* 0x54-0x57 */
 	{0x7D, 0xB3}, {0x7D, 0xB4}, {0x7D, 0xB5}, {0x7D, 0xB6}, /* 0x58-0x5B */
 	{0x7D, 0xB7}, {0x7D, 0xB8}, {0x7D, 0xB9}, {0x7D, 0xBA}, /* 0x5C-0x5F */
-	{0x7D, 0xBB}, {0x7D, 0xBC}, {0x7D, 0xBD}, {0x7D, 0xBE}, /* 0x60-0x63 */
+	{0x7D, 0xBB}, {0x7D, 0xBC}, {0x7D, 0xBD}, {0xF9, 0x57}, /* 0x60-0x63 */
 	{0x7D, 0xBF}, {0x7D, 0xC0}, {0x7D, 0xC1}, {0x7D, 0xC2}, /* 0x64-0x67 */
 	{0x7D, 0xC3}, {0x7D, 0xC4}, {0x7D, 0xC5}, {0x7D, 0xC6}, /* 0x68-0x6B */
 	{0x7D, 0xC7}, {0x7D, 0xC8}, {0x7D, 0xC9}, {0x7D, 0xCA}, /* 0x6C-0x6F */
@@ -4199,15 +4201,15 @@
 	{0x7D, 0xE6}, {0x7D, 0xE7}, {0x7D, 0xE8}, {0x7D, 0xE9}, /* 0x8C-0x8F */
 	{0x7D, 0xEA}, {0x7D, 0xEB}, {0x7D, 0xEC}, {0x7D, 0xED}, /* 0x90-0x93 */
 	{0x7D, 0xEE}, {0x7D, 0xEF}, {0x7D, 0xF0}, {0x7D, 0xF1}, /* 0x94-0x97 */
-	{0x7D, 0xF2}, {0x7D, 0xF3}, {0x7D, 0xF4}, {0x7D, 0xF5}, /* 0x98-0x9B */
+	{0x7D, 0xF2}, {0x7D, 0xF3}, {0xF9, 0x96}, {0x7D, 0xF5}, /* 0x98-0x9B */
 	{0x7D, 0xF6}, {0x7D, 0xF7}, {0x7D, 0xF8}, {0x7D, 0xF9}, /* 0x9C-0x9F */
 	{0x7D, 0xFA}, {0x5C, 0x3D}, {0x52, 0xB2}, {0x83, 0x46}, /* 0xA0-0xA3 */
 	{0x51, 0x62}, {0x83, 0x0E}, {0x77, 0x5B}, {0x66, 0x76}, /* 0xA4-0xA7 */
-	{0x9C, 0xB8}, {0x4E, 0xAC}, {0x60, 0xCA}, {0x7C, 0xBE}, /* 0xA8-0xAB */
+	{0x9C, 0xB8}, {0x4E, 0xAC}, {0x60, 0xCA}, {0xFA, 0x1D}, /* 0xA8-0xAB */
 	{0x7C, 0xB3}, {0x7E, 0xCF}, {0x4E, 0x95}, {0x8B, 0x66}, /* 0xAC-0xAF */
 	{0x66, 0x6F}, {0x98, 0x88}, {0x97, 0x59}, {0x58, 0x83}, /* 0xB0-0xB3 */
 	{0x65, 0x6C}, {0x95, 0x5C}, {0x5F, 0x84}, {0x75, 0xC9}, /* 0xB4-0xB7 */
-	{0x97, 0x56}, {0x7A, 0xDF}, {0x7A, 0xDE}, {0x51, 0xC0}, /* 0xB8-0xBB */
+	{0xFA, 0x1C}, {0x7A, 0xDF}, {0x7A, 0xDE}, {0x51, 0xC0}, /* 0xB8-0xBB */
 	{0x70, 0xAF}, {0x7A, 0x98}, {0x63, 0xEA}, {0x7A, 0x76}, /* 0xBC-0xBF */
 	{0x7E, 0xA0}, {0x73, 0x96}, {0x97, 0xED}, {0x4E, 0x45}, /* 0xC0-0xC3 */
 	{0x70, 0x78}, {0x4E, 0x5D}, {0x91, 0x52}, {0x53, 0xA9}, /* 0xC4-0xC7 */
@@ -4218,7 +4220,7 @@
 	{0x77, 0xE9}, {0x4E, 0x3E}, {0x6C, 0xAE}, {0x80, 0x5A}, /* 0xD8-0xDB */
 	{0x62, 0xD2}, {0x63, 0x6E}, {0x5D, 0xE8}, {0x51, 0x77}, /* 0xDC-0xDF */
 	{0x8D, 0xDD}, {0x8E, 0x1E}, {0x95, 0x2F}, {0x4F, 0xF1}, /* 0xE0-0xE3 */
-	{0x53, 0xE5}, {0x60, 0xE7}, {0x70, 0xAC}, {0x52, 0x67}, /* 0xE4-0xE7 */
+	{0xF9, 0x06}, {0x60, 0xE7}, {0x70, 0xAC}, {0x52, 0x67}, /* 0xE4-0xE7 */
 	{0x63, 0x50}, {0x9E, 0x43}, {0x5A, 0x1F}, {0x50, 0x26}, /* 0xE8-0xEB */
 	{0x77, 0x37}, {0x53, 0x77}, {0x7E, 0xE2}, {0x64, 0x85}, /* 0xEC-0xEF */
 	{0x65, 0x2B}, {0x62, 0x89}, {0x63, 0x98}, {0x50, 0x14}, /* 0xF0-0xF3 */
@@ -4259,7 +4261,7 @@
 	{0x7E, 0x2B}, {0x7E, 0x2C}, {0x7E, 0x2D}, {0x7E, 0x2E}, /* 0x70-0x73 */
 	{0x7E, 0x2F}, {0x7E, 0x30}, {0x7E, 0x31}, {0x7E, 0x32}, /* 0x74-0x77 */
 	{0x7E, 0x33}, {0x7E, 0x34}, {0x7E, 0x35}, {0x7E, 0x36}, /* 0x78-0x7B */
-	{0x7E, 0x37}, {0x7E, 0x38}, {0x7E, 0x39}, {0x00, 0x3F}, /* 0x7C-0x7F */
+	{0xF9, 0x50}, {0x7E, 0x38}, {0x7E, 0x39}, {0x00, 0x3F}, /* 0x7C-0x7F */
 	
 	{0x7E, 0x3A}, {0x7E, 0x3C}, {0x7E, 0x3D}, {0x7E, 0x3E}, /* 0x80-0x83 */
 	{0x7E, 0x3F}, {0x7E, 0x40}, {0x7E, 0x42}, {0x7E, 0x43}, /* 0x84-0x87 */
@@ -4339,28 +4341,28 @@
 	{0x7F, 0x4D}, {0x7F, 0x4E}, {0x7F, 0x4F}, {0x7F, 0x52}, /* 0x9C-0x9F */
 	{0x7F, 0x53}, {0x99, 0x88}, {0x61, 0x27}, {0x6E, 0x83}, /* 0xA0-0xA3 */
 	{0x57, 0x64}, {0x66, 0x06}, {0x63, 0x46}, {0x56, 0xF0}, /* 0xA4-0xA7 */
-	{0x62, 0xEC}, {0x62, 0x69}, {0x5E, 0xD3}, {0x96, 0x14}, /* 0xA8-0xAB */
-	{0x57, 0x83}, {0x62, 0xC9}, {0x55, 0x87}, {0x87, 0x21}, /* 0xAC-0xAF */
+	{0x62, 0xEC}, {0x62, 0x69}, {0xFA, 0x0B}, {0x96, 0x14}, /* 0xA8-0xAB */
+	{0x57, 0x83}, {0xF9, 0x25}, {0xF9, 0x0B}, {0x87, 0x21}, /* 0xAC-0xAF */
 	{0x81, 0x4A}, {0x8F, 0xA3}, {0x55, 0x66}, {0x83, 0xB1}, /* 0xB0-0xB3 */
 	{0x67, 0x65}, {0x8D, 0x56}, {0x84, 0xDD}, {0x5A, 0x6A}, /* 0xB4-0xB7 */
 	{0x68, 0x0F}, {0x62, 0xE6}, {0x7B, 0xEE}, {0x96, 0x11}, /* 0xB8-0xBB */
 	{0x51, 0x70}, {0x6F, 0x9C}, {0x8C, 0x30}, {0x63, 0xFD}, /* 0xBC-0xBF */
 	{0x89, 0xC8}, {0x61, 0xD2}, {0x7F, 0x06}, {0x70, 0xC2}, /* 0xC0-0xC3 */
-	{0x6E, 0xE5}, {0x74, 0x05}, {0x69, 0x94}, {0x72, 0xFC}, /* 0xC4-0xC7 */
-	{0x5E, 0xCA}, {0x90, 0xCE}, {0x67, 0x17}, {0x6D, 0x6A}, /* 0xC8-0xCB */
-	{0x63, 0x5E}, {0x52, 0xB3}, {0x72, 0x62}, {0x80, 0x01}, /* 0xCC-0xCF */
-	{0x4F, 0x6C}, {0x59, 0xE5}, {0x91, 0x6A}, {0x70, 0xD9}, /* 0xD0-0xD3 */
-	{0x6D, 0x9D}, {0x52, 0xD2}, {0x4E, 0x50}, {0x96, 0xF7}, /* 0xD4-0xD7 */
-	{0x95, 0x6D}, {0x85, 0x7E}, {0x78, 0xCA}, {0x7D, 0x2F}, /* 0xD8-0xDB */
-	{0x51, 0x21}, {0x57, 0x92}, {0x64, 0xC2}, {0x80, 0x8B}, /* 0xDC-0xDF */
+	{0x6E, 0xE5}, {0x74, 0x05}, {0x69, 0x94}, {0xF9, 0x2B}, /* 0xC4-0xC7 */
+	{0xF9, 0x28}, {0x90, 0xCE}, {0xF9, 0x29}, {0xF9, 0x2A}, /* 0xC8-0xCB */
+	{0x63, 0x5E}, {0x52, 0xB3}, {0xF9, 0x46}, {0xF9, 0x34}, /* 0xCC-0xCF */
+	{0x4F, 0x6C}, {0x59, 0xE5}, {0xF9, 0x19}, {0xF9, 0x16}, /* 0xD0-0xD3 */
+	{0x6D, 0x9D}, {0xF9, 0x52}, {0x4E, 0x50}, {0xF9, 0x49}, /* 0xD4-0xD7 */
+	{0x95, 0x6D}, {0x85, 0x7E}, {0xF9, 0x47}, {0xF9, 0x4F}, /* 0xD8-0xDB */
+	{0x51, 0x21}, {0x57, 0x92}, {0x64, 0xC2}, {0xF9, 0x53}, /* 0xDC-0xDF */
 	{0x7C, 0x7B}, {0x6C, 0xEA}, {0x68, 0xF1}, {0x69, 0x5E}, /* 0xE0-0xE3 */
-	{0x51, 0xB7}, {0x53, 0x98}, {0x68, 0xA8}, {0x72, 0x81}, /* 0xE4-0xE7 */
-	{0x9E, 0xCE}, {0x7B, 0xF1}, {0x72, 0xF8}, {0x79, 0xBB}, /* 0xE8-0xEB */
-	{0x6F, 0x13}, {0x74, 0x06}, {0x67, 0x4E}, {0x91, 0xCC}, /* 0xEC-0xEF */
+	{0xF9, 0x2E}, {0x53, 0x98}, {0xF9, 0xE2}, {0x72, 0x81}, /* 0xE4-0xE7 */
+	{0xF9, 0x89}, {0x7B, 0xF1}, {0x72, 0xF8}, {0x79, 0xBB}, /* 0xE8-0xEB */
+	{0x6F, 0x13}, {0xF9, 0xE4}, {0xF9, 0xE1}, {0xF9, 0xE9}, /* 0xEC-0xEF */
 	{0x9C, 0xA4}, {0x79, 0x3C}, {0x83, 0x89}, {0x83, 0x54}, /* 0xF0-0xF3 */
-	{0x54, 0x0F}, {0x68, 0x17}, {0x4E, 0x3D}, {0x53, 0x89}, /* 0xF4-0xF7 */
-	{0x52, 0xB1}, {0x78, 0x3E}, {0x53, 0x86}, {0x52, 0x29}, /* 0xF8-0xFB */
-	{0x50, 0x88}, {0x4F, 0x8B}, {0x4F, 0xD0}, {0x00, 0x3F}, /* 0xFC-0xFF */
+	{0xF9, 0xDE}, {0xF9, 0xDA}, {0x4E, 0x3D}, {0x53, 0x89}, /* 0xF4-0xF7 */
+	{0x52, 0xB1}, {0x78, 0x3E}, {0x53, 0x86}, {0xF9, 0xDD}, /* 0xF8-0xFB */
+	{0x50, 0x88}, {0xF9, 0xB5}, {0x4F, 0xD0}, {0x00, 0x3F}, /* 0xFC-0xFF */
 };
 
 static struct nls_unicode c2u_C1[256] = {
@@ -4387,7 +4389,7 @@
 	{0x7F, 0x70}, {0x7F, 0x73}, {0x7F, 0x75}, {0x7F, 0x76}, /* 0x50-0x53 */
 	{0x7F, 0x77}, {0x7F, 0x78}, {0x7F, 0x7A}, {0x7F, 0x7B}, /* 0x54-0x57 */
 	{0x7F, 0x7C}, {0x7F, 0x7D}, {0x7F, 0x7F}, {0x7F, 0x80}, /* 0x58-0x5B */
-	{0x7F, 0x82}, {0x7F, 0x83}, {0x7F, 0x84}, {0x7F, 0x85}, /* 0x5C-0x5F */
+	{0x7F, 0x82}, {0x7F, 0x83}, {0x7F, 0x84}, {0xF9, 0x0F}, /* 0x5C-0x5F */
 	{0x7F, 0x86}, {0x7F, 0x87}, {0x7F, 0x88}, {0x7F, 0x89}, /* 0x60-0x63 */
 	{0x7F, 0x8B}, {0x7F, 0x8D}, {0x7F, 0x8F}, {0x7F, 0x90}, /* 0x64-0x67 */
 	{0x7F, 0x91}, {0x7F, 0x92}, {0x7F, 0x93}, {0x7F, 0x95}, /* 0x68-0x6B */
@@ -4405,29 +4407,29 @@
 	{0x7F, 0xD1}, {0x7F, 0xD2}, {0x7F, 0xD3}, {0x7F, 0xD6}, /* 0x94-0x97 */
 	{0x7F, 0xD7}, {0x7F, 0xD9}, {0x7F, 0xDA}, {0x7F, 0xDB}, /* 0x98-0x9B */
 	{0x7F, 0xDC}, {0x7F, 0xDD}, {0x7F, 0xDE}, {0x7F, 0xE2}, /* 0x9C-0x9F */
-	{0x7F, 0xE3}, {0x75, 0xE2}, {0x7A, 0xCB}, {0x7C, 0x92}, /* 0xA0-0xA3 */
-	{0x6C, 0xA5}, {0x96, 0xB6}, {0x52, 0x9B}, {0x74, 0x83}, /* 0xA4-0xA7 */
+	{0x7F, 0xE3}, {0xF9, 0xE5}, {0xF9, 0xF7}, {0xF9, 0xF9}, /* 0xA0-0xA3 */
+	{0x6C, 0xA5}, {0x96, 0xB6}, {0xF9, 0x8A}, {0x74, 0x83}, /* 0xA4-0xA7 */
 	{0x54, 0xE9}, {0x4F, 0xE9}, {0x80, 0x54}, {0x83, 0xB2}, /* 0xA8-0xAB */
-	{0x8F, 0xDE}, {0x95, 0x70}, {0x5E, 0xC9}, {0x60, 0x1C}, /* 0xAC-0xAF */
+	{0x8F, 0xDE}, {0x95, 0x70}, {0xF9, 0xA2}, {0xF9, 0xAC}, /* 0xAC-0xAF */
 	{0x6D, 0x9F}, {0x5E, 0x18}, {0x65, 0x5B}, {0x81, 0x38}, /* 0xB0-0xB3 */
 	{0x94, 0xFE}, {0x60, 0x4B}, {0x70, 0xBC}, {0x7E, 0xC3}, /* 0xB4-0xB7 */
-	{0x7C, 0xAE}, {0x51, 0xC9}, {0x68, 0x81}, {0x7C, 0xB1}, /* 0xB8-0xBB */
-	{0x82, 0x6F}, {0x4E, 0x24}, {0x8F, 0x86}, {0x91, 0xCF}, /* 0xBC-0xBF */
-	{0x66, 0x7E}, {0x4E, 0xAE}, {0x8C, 0x05}, {0x64, 0xA9}, /* 0xC0-0xC3 */
-	{0x80, 0x4A}, {0x50, 0xDA}, {0x75, 0x97}, {0x71, 0xCE}, /* 0xC4-0xC7 */
-	{0x5B, 0xE5}, {0x8F, 0xBD}, {0x6F, 0x66}, {0x4E, 0x86}, /* 0xC8-0xCB */
-	{0x64, 0x82}, {0x95, 0x63}, {0x5E, 0xD6}, {0x65, 0x99}, /* 0xCC-0xCF */
-	{0x52, 0x17}, {0x88, 0xC2}, {0x70, 0xC8}, {0x52, 0xA3}, /* 0xD0-0xD3 */
-	{0x73, 0x0E}, {0x74, 0x33}, {0x67, 0x97}, {0x78, 0xF7}, /* 0xD4-0xD7 */
+	{0x7C, 0xAE}, {0x51, 0xC9}, {0xF9, 0x7A}, {0x7C, 0xB1}, /* 0xB8-0xBB */
+	{0xF9, 0x7C}, {0x4E, 0x24}, {0x8F, 0x86}, {0xF9, 0x7E}, /* 0xBC-0xBF */
+	{0x66, 0x7E}, {0xF9, 0x77}, {0x8C, 0x05}, {0x64, 0xA9}, /* 0xC0-0xC3 */
+	{0x80, 0x4A}, {0xF9, 0xBB}, {0x75, 0x97}, {0xF9, 0xC0}, /* 0xC4-0xC7 */
+	{0x5B, 0xE5}, {0x8F, 0xBD}, {0x6F, 0x66}, {0xF9, 0xBA}, /* 0xC8-0xCB */
+	{0x64, 0x82}, {0x95, 0x63}, {0x5E, 0xD6}, {0xF9, 0xBE}, /* 0xCC-0xCF */
+	{0xF9, 0x9C}, {0xF9, 0xA0}, {0xF9, 0x9F}, {0xF9, 0x9D}, /* 0xD0-0xD3 */
+	{0x73, 0x0E}, {0x74, 0x33}, {0xF9, 0xF4}, {0x78, 0xF7}, /* 0xD4-0xD7 */
 	{0x97, 0x16}, {0x4E, 0x34}, {0x90, 0xBB}, {0x9C, 0xDE}, /* 0xD8-0xDB */
-	{0x6D, 0xCB}, {0x51, 0xDB}, {0x8D, 0x41}, {0x54, 0x1D}, /* 0xDC-0xDF */
-	{0x62, 0xCE}, {0x73, 0xB2}, {0x83, 0xF1}, {0x96, 0xF6}, /* 0xE0-0xE3 */
-	{0x9F, 0x84}, {0x94, 0xC3}, {0x4F, 0x36}, {0x7F, 0x9A}, /* 0xE4-0xE7 */
-	{0x51, 0xCC}, {0x70, 0x75}, {0x96, 0x75}, {0x5C, 0xAD}, /* 0xE8-0xEB */
-	{0x98, 0x86}, {0x53, 0xE6}, {0x4E, 0xE4}, {0x6E, 0x9C}, /* 0xEC-0xEF */
-	{0x74, 0x09}, {0x69, 0xB4}, {0x78, 0x6B}, {0x99, 0x8F}, /* 0xF0-0xF3 */
-	{0x75, 0x59}, {0x52, 0x18}, {0x76, 0x24}, {0x6D, 0x41}, /* 0xF4-0xF7 */
-	{0x67, 0xF3}, {0x51, 0x6D}, {0x9F, 0x99}, {0x80, 0x4B}, /* 0xF8-0xFB */
+	{0xF9, 0xF5}, {0x51, 0xDB}, {0x8D, 0x41}, {0xF9, 0xED}, /* 0xDC-0xDF */
+	{0x62, 0xCE}, {0xF9, 0xAD}, {0xF9, 0x58}, {0xF9, 0xB2}, /* 0xE0-0xE3 */
+	{0x9F, 0x84}, {0x94, 0xC3}, {0x4F, 0x36}, {0xF9, 0xAF}, /* 0xE4-0xE7 */
+	{0xF9, 0x55}, {0x70, 0x75}, {0xF9, 0x59}, {0x5C, 0xAD}, /* 0xE8-0xEB */
+	{0x98, 0x86}, {0x53, 0xE6}, {0xF9, 0xA8}, {0xF9, 0xCB}, /* 0xEC-0xEF */
+	{0xF9, 0xCC}, {0x69, 0xB4}, {0xF9, 0xCE}, {0x99, 0x8F}, /* 0xF0-0xF3 */
+	{0xF9, 0xCD}, {0x52, 0x18}, {0x76, 0x24}, {0xF9, 0xCA}, /* 0xF4-0xF7 */
+	{0xF9, 0xC9}, {0xF9, 0xD1}, {0x9F, 0x99}, {0x80, 0x4B}, /* 0xF8-0xFB */
 	{0x54, 0x99}, {0x7B, 0x3C}, {0x7A, 0xBF}, {0x00, 0x3F}, /* 0xFC-0xFF */
 };
 
@@ -4469,28 +4471,28 @@
 	{0x80, 0x5E}, {0x80, 0x5F}, {0x80, 0x60}, {0x80, 0x61}, /* 0x84-0x87 */
 	{0x80, 0x62}, {0x80, 0x63}, {0x80, 0x64}, {0x80, 0x65}, /* 0x88-0x8B */
 	{0x80, 0x66}, {0x80, 0x67}, {0x80, 0x68}, {0x80, 0x6B}, /* 0x8C-0x8F */
-	{0x80, 0x6C}, {0x80, 0x6D}, {0x80, 0x6E}, {0x80, 0x6F}, /* 0x90-0x93 */
+	{0x80, 0x6C}, {0x80, 0x6D}, {0x80, 0x6E}, {0xF9, 0x97}, /* 0x90-0x93 */
 	{0x80, 0x70}, {0x80, 0x72}, {0x80, 0x73}, {0x80, 0x74}, /* 0x94-0x97 */
 	{0x80, 0x75}, {0x80, 0x76}, {0x80, 0x77}, {0x80, 0x78}, /* 0x98-0x9B */
 	{0x80, 0x79}, {0x80, 0x7A}, {0x80, 0x7B}, {0x80, 0x7C}, /* 0x9C-0x9F */
-	{0x80, 0x7D}, {0x96, 0x86}, {0x57, 0x84}, {0x62, 0xE2}, /* 0xA0-0xA3 */
+	{0x80, 0x7D}, {0xF9, 0xDC}, {0x57, 0x84}, {0x62, 0xE2}, /* 0xA0-0xA3 */
 	{0x96, 0x47}, {0x69, 0x7C}, {0x5A, 0x04}, {0x64, 0x02}, /* 0xA4-0xA7 */
-	{0x7B, 0xD3}, {0x6F, 0x0F}, {0x96, 0x4B}, {0x82, 0xA6}, /* 0xA8-0xAB */
+	{0x7B, 0xD3}, {0xF9, 0x4E}, {0xF9, 0x51}, {0x82, 0xA6}, /* 0xA8-0xAB */
 	{0x53, 0x62}, {0x98, 0x85}, {0x5E, 0x90}, {0x70, 0x89}, /* 0xAC-0xAF */
 	{0x63, 0xB3}, {0x53, 0x64}, {0x86, 0x4F}, {0x9C, 0x81}, /* 0xB0-0xB3 */
-	{0x9E, 0x93}, {0x78, 0x8C}, {0x97, 0x32}, {0x8D, 0xEF}, /* 0xB4-0xB7 */
-	{0x8D, 0x42}, {0x9E, 0x7F}, {0x6F, 0x5E}, {0x79, 0x84}, /* 0xB8-0xBB */
-	{0x5F, 0x55}, {0x96, 0x46}, {0x62, 0x2E}, {0x9A, 0x74}, /* 0xBC-0xBF */
-	{0x54, 0x15}, {0x94, 0xDD}, {0x4F, 0xA3}, {0x65, 0xC5}, /* 0xC0-0xC3 */
-	{0x5C, 0x65}, {0x5C, 0x61}, {0x7F, 0x15}, {0x86, 0x51}, /* 0xC4-0xC7 */
-	{0x6C, 0x2F}, {0x5F, 0x8B}, {0x73, 0x87}, {0x6E, 0xE4}, /* 0xC8-0xCB */
+	{0x9E, 0x93}, {0xF9, 0x3B}, {0xF9, 0x38}, {0xF9, 0x37}, /* 0xB4-0xB7 */
+	{0x8D, 0x42}, {0xF9, 0x40}, {0x6F, 0x5E}, {0x79, 0x84}, /* 0xB8-0xBB */
+	{0x5F, 0x55}, {0x96, 0x46}, {0xF9, 0xD2}, {0x9A, 0x74}, /* 0xBC-0xBF */
+	{0x54, 0x15}, {0x94, 0xDD}, {0x4F, 0xA3}, {0xF9, 0x83}, /* 0xC0-0xC3 */
+	{0xF9, 0xDF}, {0x5C, 0x61}, {0x7F, 0x15}, {0x86, 0x51}, /* 0xC4-0xC7 */
+	{0x6C, 0x2F}, {0xF9, 0xD8}, {0xF9, 0xDB}, {0x6E, 0xE4}, /* 0xC8-0xCB */
 	{0x7E, 0xFF}, {0x5C, 0xE6}, {0x63, 0x1B}, {0x5B, 0x6A}, /* 0xCC-0xCF */
-	{0x6E, 0xE6}, {0x53, 0x75}, {0x4E, 0x71}, {0x63, 0xA0}, /* 0xD0-0xD3 */
-	{0x75, 0x65}, {0x62, 0xA1}, {0x8F, 0x6E}, {0x4F, 0x26}, /* 0xD4-0xD7 */
+	{0x6E, 0xE6}, {0xF9, 0x1C}, {0x4E, 0x71}, {0xF9, 0x75}, /* 0xD0-0xD3 */
+	{0xF9, 0x76}, {0x62, 0xA1}, {0x8F, 0x6E}, {0x4F, 0x26}, /* 0xD4-0xD7 */
 	{0x4E, 0xD1}, {0x6C, 0xA6}, {0x7E, 0xB6}, {0x8B, 0xBA}, /* 0xD8-0xDB */
-	{0x84, 0x1D}, {0x87, 0xBA}, {0x7F, 0x57}, {0x90, 0x3B}, /* 0xDC-0xDF */
-	{0x95, 0x23}, {0x7B, 0xA9}, {0x9A, 0xA1}, {0x88, 0xF8}, /* 0xE0-0xE3 */
-	{0x84, 0x3D}, {0x6D, 0x1B}, {0x9A, 0x86}, {0x7E, 0xDC}, /* 0xE4-0xE7 */
+	{0x84, 0x1D}, {0xF9, 0x11}, {0x7F, 0x57}, {0x90, 0x3B}, /* 0xDC-0xDF */
+	{0x95, 0x23}, {0x7B, 0xA9}, {0x9A, 0xA1}, {0xF9, 0x12}, /* 0xE0-0xE3 */
+	{0xF9, 0x18}, {0xF9, 0x15}, {0x9A, 0x86}, {0x7E, 0xDC}, /* 0xE4-0xE7 */
 	{0x59, 0x88}, {0x9E, 0xBB}, {0x73, 0x9B}, {0x78, 0x01}, /* 0xE8-0xEB */
 	{0x86, 0x82}, {0x9A, 0x6C}, {0x9A, 0x82}, {0x56, 0x1B}, /* 0xEC-0xEF */
 	{0x54, 0x17}, {0x57, 0xCB}, {0x4E, 0x70}, {0x9E, 0xA6}, /* 0xF0-0xF3 */
@@ -4516,7 +4518,7 @@
 	{0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */
 	{0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */
 	{0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */
-	{0x80, 0x7E}, {0x80, 0x81}, {0x80, 0x82}, {0x80, 0x85}, /* 0x40-0x43 */
+	{0xF9, 0x45}, {0x80, 0x81}, {0x80, 0x82}, {0x80, 0x85}, /* 0x40-0x43 */
 	{0x80, 0x88}, {0x80, 0x8A}, {0x80, 0x8D}, {0x80, 0x8E}, /* 0x44-0x47 */
 	{0x80, 0x8F}, {0x80, 0x90}, {0x80, 0x91}, {0x80, 0x92}, /* 0x48-0x4B */
 	{0x80, 0x94}, {0x80, 0x95}, {0x80, 0x97}, {0x80, 0x99}, /* 0x4C-0x4F */
@@ -4555,7 +4557,7 @@
 	{0x95, 0x30}, {0x73, 0x1B}, {0x68, 0xA6}, {0x5B, 0x5F}, /* 0xCC-0xCF */
 	{0x77, 0x2F}, {0x91, 0x9A}, {0x97, 0x61}, {0x7C, 0xDC}, /* 0xD0-0xD3 */
 	{0x8F, 0xF7}, {0x8C, 0x1C}, {0x5F, 0x25}, {0x7C, 0x73}, /* 0xD4-0xD7 */
-	{0x79, 0xD8}, {0x89, 0xC5}, {0x6C, 0xCC}, {0x87, 0x1C}, /* 0xD8-0xDB */
+	{0x79, 0xD8}, {0x89, 0xC5}, {0xF9, 0x68}, {0x87, 0x1C}, /* 0xD8-0xDB */
 	{0x5B, 0xC6}, {0x5E, 0x42}, {0x68, 0xC9}, {0x77, 0x20}, /* 0xDC-0xDF */
 	{0x7E, 0xF5}, {0x51, 0x95}, {0x51, 0x4D}, {0x52, 0xC9}, /* 0xE0-0xE3 */
 	{0x5A, 0x29}, {0x7F, 0x05}, {0x97, 0x62}, {0x82, 0xD7}, /* 0xE4-0xE7 */
@@ -4620,16 +4622,16 @@
 	{0x77, 0x66}, {0x72, 0x67}, {0x7A, 0x46}, {0x62, 0xFF}, /* 0xC0-0xC3 */
 	{0x54, 0xEA}, {0x54, 0x50}, {0x94, 0xA0}, {0x90, 0xA3}, /* 0xC4-0xC7 */
 	{0x5A, 0x1C}, {0x7E, 0xB3}, {0x6C, 0x16}, {0x4E, 0x43}, /* 0xC8-0xCB */
-	{0x59, 0x76}, {0x80, 0x10}, {0x59, 0x48}, {0x53, 0x57}, /* 0xCC-0xCF */
+	{0x59, 0x76}, {0x80, 0x10}, {0xF9, 0x0C}, {0x53, 0x57}, /* 0xCC-0xCF */
 	{0x75, 0x37}, {0x96, 0xBE}, {0x56, 0xCA}, {0x63, 0x20}, /* 0xD0-0xD3 */
 	{0x81, 0x11}, {0x60, 0x7C}, {0x95, 0xF9}, {0x6D, 0xD6}, /* 0xD4-0xD7 */
 	{0x54, 0x62}, {0x99, 0x81}, {0x51, 0x85}, {0x5A, 0xE9}, /* 0xD8-0xDB */
 	{0x80, 0xFD}, {0x59, 0xAE}, {0x97, 0x13}, {0x50, 0x2A}, /* 0xDC-0xDF */
-	{0x6C, 0xE5}, {0x5C, 0x3C}, {0x62, 0xDF}, {0x4F, 0x60}, /* 0xE0-0xE3 */
-	{0x53, 0x3F}, {0x81, 0x7B}, {0x90, 0x06}, {0x6E, 0xBA}, /* 0xE4-0xE7 */
-	{0x85, 0x2B}, {0x62, 0xC8}, {0x5E, 0x74}, {0x78, 0xBE}, /* 0xE8-0xEB */
-	{0x64, 0xB5}, {0x63, 0x7B}, {0x5F, 0xF5}, {0x5A, 0x18}, /* 0xEC-0xEF */
-	{0x91, 0x7F}, {0x9E, 0x1F}, {0x5C, 0x3F}, {0x63, 0x4F}, /* 0xF0-0xF3 */
+	{0xF9, 0xE3}, {0x5C, 0x3C}, {0x62, 0xDF}, {0x4F, 0x60}, /* 0xE0-0xE3 */
+	{0xF9, 0xEB}, {0x81, 0x7B}, {0x90, 0x06}, {0xF9, 0xEC}, /* 0xE4-0xE7 */
+	{0x85, 0x2B}, {0x62, 0xC8}, {0xF9, 0x8E}, {0x78, 0xBE}, /* 0xE8-0xEB */
+	{0x64, 0xB5}, {0xF9, 0xA4}, {0xF9, 0xA3}, {0x5A, 0x18}, /* 0xEC-0xEF */
+	{0x91, 0x7F}, {0x9E, 0x1F}, {0xF9, 0xBD}, {0x63, 0x4F}, /* 0xF0-0xF3 */
 	{0x80, 0x42}, {0x5B, 0x7D}, {0x55, 0x6E}, {0x95, 0x4A}, /* 0xF4-0xF7 */
 	{0x95, 0x4D}, {0x6D, 0x85}, {0x60, 0xA8}, {0x67, 0xE0}, /* 0xF8-0xFB */
 	{0x72, 0xDE}, {0x51, 0xDD}, {0x5B, 0x81}, {0x00, 0x3F}, /* 0xFC-0xFF */
@@ -4653,10 +4655,10 @@
 	{0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */
 	{0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */
 	{0x81, 0xD4}, {0x81, 0xD5}, {0x81, 0xD6}, {0x81, 0xD7}, /* 0x40-0x43 */
-	{0x81, 0xD8}, {0x81, 0xD9}, {0x81, 0xDA}, {0x81, 0xDB}, /* 0x44-0x47 */
+	{0xF9, 0x26}, {0x81, 0xD9}, {0x81, 0xDA}, {0x81, 0xDB}, /* 0x44-0x47 */
 	{0x81, 0xDC}, {0x81, 0xDD}, {0x81, 0xDE}, {0x81, 0xDF}, /* 0x48-0x4B */
 	{0x81, 0xE0}, {0x81, 0xE1}, {0x81, 0xE2}, {0x81, 0xE4}, /* 0x4C-0x4F */
-	{0x81, 0xE5}, {0x81, 0xE6}, {0x81, 0xE8}, {0x81, 0xE9}, /* 0x50-0x53 */
+	{0x81, 0xE5}, {0x81, 0xE6}, {0xF9, 0xF6}, {0x81, 0xE9}, /* 0x50-0x53 */
 	{0x81, 0xEB}, {0x81, 0xEE}, {0x81, 0xEF}, {0x81, 0xF0}, /* 0x54-0x57 */
 	{0x81, 0xF1}, {0x81, 0xF2}, {0x81, 0xF5}, {0x81, 0xF6}, /* 0x58-0x5B */
 	{0x81, 0xF7}, {0x81, 0xF8}, {0x81, 0xF9}, {0x81, 0xFA}, /* 0x5C-0x5F */
@@ -4679,8 +4681,8 @@
 	{0x82, 0x64}, {0x82, 0x65}, {0x82, 0x66}, {0x82, 0x67}, /* 0x9C-0x9F */
 	{0x82, 0x69}, {0x62, 0xE7}, {0x6C, 0xDE}, {0x72, 0x5B}, /* 0xA0-0xA3 */
 	{0x62, 0x6D}, {0x94, 0xAE}, {0x7E, 0xBD}, {0x81, 0x13}, /* 0xA4-0xA7 */
-	{0x6D, 0x53}, {0x51, 0x9C}, {0x5F, 0x04}, {0x59, 0x74}, /* 0xA8-0xAB */
-	{0x52, 0xAA}, {0x60, 0x12}, {0x59, 0x73}, {0x66, 0x96}, /* 0xAC-0xAF */
+	{0x6D, 0x53}, {0x51, 0x9C}, {0xF9, 0x43}, {0x59, 0x74}, /* 0xA8-0xAB */
+	{0x52, 0xAA}, {0xF9, 0x60}, {0xF9, 0x81}, {0x66, 0x96}, /* 0xAC-0xAF */
 	{0x86, 0x50}, {0x75, 0x9F}, {0x63, 0x2A}, {0x61, 0xE6}, /* 0xB0-0xB3 */
 	{0x7C, 0xEF}, {0x8B, 0xFA}, {0x54, 0xE6}, {0x6B, 0x27}, /* 0xB4-0xB7 */
 	{0x9E, 0x25}, {0x6B, 0xB4}, {0x85, 0xD5}, {0x54, 0x55}, /* 0xB8-0xBB */
@@ -4766,7 +4768,7 @@
 	{0x75, 0x66}, {0x5D, 0x0E}, {0x81, 0x10}, {0x9F, 0x50}, /* 0xE8-0xEB */
 	{0x65, 0xD7}, {0x79, 0x48}, {0x79, 0x41}, {0x9A, 0x91}, /* 0xEC-0xEF */
 	{0x8D, 0x77}, {0x5C, 0x82}, {0x4E, 0x5E}, {0x4F, 0x01}, /* 0xF0-0xF3 */
-	{0x54, 0x2F}, {0x59, 0x51}, {0x78, 0x0C}, {0x56, 0x68}, /* 0xF4-0xF7 */
+	{0x54, 0x2F}, {0xF9, 0x09}, {0x78, 0x0C}, {0x56, 0x68}, /* 0xF4-0xF7 */
 	{0x6C, 0x14}, {0x8F, 0xC4}, {0x5F, 0x03}, {0x6C, 0x7D}, /* 0xF8-0xFB */
 	{0x6C, 0xE3}, {0x8B, 0xAB}, {0x63, 0x90}, {0x00, 0x3F}, /* 0xFC-0xFF */
 };
@@ -4807,7 +4809,7 @@
 	
 	{0x83, 0xAF}, {0x83, 0xB5}, {0x83, 0xBB}, {0x83, 0xBE}, /* 0x80-0x83 */
 	{0x83, 0xBF}, {0x83, 0xC2}, {0x83, 0xC3}, {0x83, 0xC4}, /* 0x84-0x87 */
-	{0x83, 0xC6}, {0x83, 0xC8}, {0x83, 0xC9}, {0x83, 0xCB}, /* 0x88-0x8B */
+	{0x83, 0xC6}, {0x83, 0xC8}, {0xF9, 0x3E}, {0x83, 0xCB}, /* 0x88-0x8B */
 	{0x83, 0xCD}, {0x83, 0xCE}, {0x83, 0xD0}, {0x83, 0xD1}, /* 0x8C-0x8F */
 	{0x83, 0xD2}, {0x83, 0xD3}, {0x83, 0xD5}, {0x83, 0xD7}, /* 0x90-0x93 */
 	{0x83, 0xD9}, {0x83, 0xDA}, {0x83, 0xDB}, {0x83, 0xDE}, /* 0x94-0x97 */
@@ -4825,12 +4827,12 @@
 	{0x60, 0x84}, {0x68, 0x65}, {0x77, 0xA7}, {0x4E, 0x54}, /* 0xC4-0xC7 */
 	{0x4F, 0xA8}, {0x5D, 0xE7}, {0x97, 0x98}, {0x64, 0xAC}, /* 0xC8-0xCB */
 	{0x7F, 0xD8}, {0x5C, 0xED}, {0x4F, 0xCF}, {0x7A, 0x8D}, /* 0xCC-0xCF */
-	{0x52, 0x07}, {0x83, 0x04}, {0x4E, 0x14}, {0x60, 0x2F}, /* 0xD0-0xD3 */
+	{0xFA, 0x00}, {0x83, 0x04}, {0x4E, 0x14}, {0x60, 0x2F}, /* 0xD0-0xD3 */
 	{0x7A, 0x83}, {0x94, 0xA6}, {0x4F, 0xB5}, {0x4E, 0xB2}, /* 0xD4-0xD7 */
 	{0x79, 0xE6}, {0x74, 0x34}, {0x52, 0xE4}, {0x82, 0xB9}, /* 0xD8-0xDB */
 	{0x64, 0xD2}, {0x79, 0xBD}, {0x5B, 0xDD}, {0x6C, 0x81}, /* 0xDC-0xDF */
 	{0x97, 0x52}, {0x8F, 0x7B}, {0x6C, 0x22}, {0x50, 0x3E}, /* 0xE0-0xE3 */
-	{0x53, 0x7F}, {0x6E, 0x05}, {0x64, 0xCE}, {0x66, 0x74}, /* 0xE4-0xE7 */
+	{0x53, 0x7F}, {0x6E, 0x05}, {0x64, 0xCE}, {0xFA, 0x12}, /* 0xE4-0xE7 */
 	{0x6C, 0x30}, {0x60, 0xC5}, {0x98, 0x77}, {0x8B, 0xF7}, /* 0xE8-0xEB */
 	{0x5E, 0x86}, {0x74, 0x3C}, {0x7A, 0x77}, {0x79, 0xCB}, /* 0xEC-0xEF */
 	{0x4E, 0x18}, {0x90, 0xB1}, {0x74, 0x03}, {0x6C, 0x42}, /* 0xF0-0xF3 */
@@ -4871,7 +4873,7 @@
 	{0x84, 0x37}, {0x84, 0x39}, {0x84, 0x3A}, {0x84, 0x3B}, /* 0x70-0x73 */
 	{0x84, 0x3E}, {0x84, 0x3F}, {0x84, 0x40}, {0x84, 0x41}, /* 0x74-0x77 */
 	{0x84, 0x42}, {0x84, 0x43}, {0x84, 0x44}, {0x84, 0x45}, /* 0x78-0x7B */
-	{0x84, 0x47}, {0x84, 0x48}, {0x84, 0x49}, {0x00, 0x3F}, /* 0x7C-0x7F */
+	{0x84, 0x47}, {0x84, 0x48}, {0xF9, 0x6E}, {0x00, 0x3F}, /* 0x7C-0x7F */
 	
 	{0x84, 0x4A}, {0x84, 0x4B}, {0x84, 0x4C}, {0x84, 0x4D}, /* 0x80-0x83 */
 	{0x84, 0x4E}, {0x84, 0x4F}, {0x84, 0x50}, {0x84, 0x52}, /* 0x84-0x87 */
@@ -4900,10 +4902,10 @@
 	{0x63, 0xC9}, {0x67, 0xD4}, {0x80, 0x89}, {0x83, 0x39}, /* 0xE0-0xE3 */
 	{0x88, 0x15}, {0x51, 0x12}, {0x5B, 0x7A}, {0x59, 0x82}, /* 0xE4-0xE7 */
 	{0x8F, 0xB1}, {0x4E, 0x73}, {0x6C, 0x5D}, {0x51, 0x65}, /* 0xE8-0xEB */
-	{0x89, 0x25}, {0x8F, 0x6F}, {0x96, 0x2E}, {0x85, 0x4A}, /* 0xEC-0xEF */
+	{0x89, 0x25}, {0x8F, 0x6F}, {0xF9, 0xC6}, {0x85, 0x4A}, /* 0xEC-0xEF */
 	{0x74, 0x5E}, {0x95, 0x10}, {0x95, 0xF0}, {0x6D, 0xA6}, /* 0xF0-0xF3 */
-	{0x82, 0xE5}, {0x5F, 0x31}, {0x64, 0x92}, {0x6D, 0x12}, /* 0xF4-0xF7 */
-	{0x84, 0x28}, {0x81, 0x6E}, {0x9C, 0xC3}, {0x58, 0x5E}, /* 0xF8-0xFB */
+	{0xF9, 0x74}, {0x5F, 0x31}, {0x64, 0x92}, {0x6D, 0x12}, /* 0xF4-0xF7 */
+	{0x84, 0x28}, {0x81, 0x6E}, {0x9C, 0xC3}, {0xF9, 0x6C}, /* 0xF8-0xFB */
 	{0x8D, 0x5B}, {0x4E, 0x09}, {0x53, 0xC1}, {0x00, 0x3F}, /* 0xFC-0xFF */
 };
 
@@ -4944,7 +4946,7 @@
 	{0x84, 0xD8}, {0x84, 0xD9}, {0x84, 0xDA}, {0x84, 0xDB}, /* 0x80-0x83 */
 	{0x84, 0xDC}, {0x84, 0xDE}, {0x84, 0xE1}, {0x84, 0xE2}, /* 0x84-0x87 */
 	{0x84, 0xE4}, {0x84, 0xE7}, {0x84, 0xE8}, {0x84, 0xE9}, /* 0x88-0x8B */
-	{0x84, 0xEA}, {0x84, 0xEB}, {0x84, 0xED}, {0x84, 0xEE}, /* 0x8C-0x8F */
+	{0x84, 0xEA}, {0x84, 0xEB}, {0x84, 0xED}, {0xF9, 0x99}, /* 0x8C-0x8F */
 	{0x84, 0xEF}, {0x84, 0xF1}, {0x84, 0xF2}, {0x84, 0xF3}, /* 0x90-0x93 */
 	{0x84, 0xF4}, {0x84, 0xF5}, {0x84, 0xF6}, {0x84, 0xF7}, /* 0x94-0x97 */
 	{0x84, 0xF8}, {0x84, 0xF9}, {0x84, 0xFA}, {0x84, 0xFB}, /* 0x98-0x9B */
@@ -4969,7 +4971,7 @@
 	{0x5C, 0x04}, {0x61, 0x51}, {0x6D, 0x89}, {0x79, 0x3E}, /* 0xE4-0xE7 */
 	{0x8B, 0xBE}, {0x78, 0x37}, {0x75, 0x33}, {0x54, 0x7B}, /* 0xE8-0xEB */
 	{0x4F, 0x38}, {0x8E, 0xAB}, {0x6D, 0xF1}, {0x5A, 0x20}, /* 0xEC-0xEF */
-	{0x7E, 0xC5}, {0x79, 0x5E}, {0x6C, 0x88}, {0x5B, 0xA1}, /* 0xF0-0xF3 */
+	{0x7E, 0xC5}, {0xFA, 0x19}, {0xF9, 0x72}, {0x5B, 0xA1}, /* 0xF0-0xF3 */
 	{0x5A, 0x76}, {0x75, 0x1A}, {0x80, 0xBE}, {0x61, 0x4E}, /* 0xF4-0xF7 */
 	{0x6E, 0x17}, {0x58, 0xF0}, {0x75, 0x1F}, {0x75, 0x25}, /* 0xF8-0xFB */
 	{0x72, 0x72}, {0x53, 0x47}, {0x7E, 0xF3}, {0x00, 0x3F}, /* 0xFC-0xFF */
@@ -5017,11 +5019,11 @@
 	{0x85, 0x6F}, {0x85, 0x70}, {0x85, 0x71}, {0x85, 0x73}, /* 0x94-0x97 */
 	{0x85, 0x75}, {0x85, 0x76}, {0x85, 0x77}, {0x85, 0x78}, /* 0x98-0x9B */
 	{0x85, 0x7C}, {0x85, 0x7D}, {0x85, 0x7F}, {0x85, 0x80}, /* 0x9C-0x9F */
-	{0x85, 0x81}, {0x77, 0x01}, {0x76, 0xDB}, {0x52, 0x69}, /* 0xA0-0xA3 */
+	{0x85, 0x81}, {0xF9, 0x6D}, {0x76, 0xDB}, {0x52, 0x69}, /* 0xA0-0xA3 */
 	{0x80, 0xDC}, {0x57, 0x23}, {0x5E, 0x08}, {0x59, 0x31}, /* 0xA4-0xA7 */
 	{0x72, 0xEE}, {0x65, 0xBD}, {0x6E, 0x7F}, {0x8B, 0xD7}, /* 0xA8-0xAB */
 	{0x5C, 0x38}, {0x86, 0x71}, {0x53, 0x41}, {0x77, 0xF3}, /* 0xAC-0xAF */
-	{0x62, 0xFE}, {0x65, 0xF6}, {0x4E, 0xC0}, {0x98, 0xDF}, /* 0xB0-0xB3 */
+	{0xF9, 0x73}, {0x65, 0xF6}, {0xF9, 0xFD}, {0x98, 0xDF}, /* 0xB0-0xB3 */
 	{0x86, 0x80}, {0x5B, 0x9E}, {0x8B, 0xC6}, {0x53, 0xF2}, /* 0xB4-0xB7 */
 	{0x77, 0xE2}, {0x4F, 0x7F}, {0x5C, 0x4E}, {0x9A, 0x76}, /* 0xB8-0xBB */
 	{0x59, 0xCB}, {0x5F, 0x0F}, {0x79, 0x3A}, {0x58, 0xEB}, /* 0xBC-0xBF */
@@ -5074,7 +5076,7 @@
 	{0x85, 0xBC}, {0x85, 0xBD}, {0x85, 0xBE}, {0x85, 0xBF}, /* 0x6C-0x6F */
 	{0x85, 0xC0}, {0x85, 0xC2}, {0x85, 0xC3}, {0x85, 0xC4}, /* 0x70-0x73 */
 	{0x85, 0xC5}, {0x85, 0xC6}, {0x85, 0xC7}, {0x85, 0xC8}, /* 0x74-0x77 */
-	{0x85, 0xCA}, {0x85, 0xCB}, {0x85, 0xCC}, {0x85, 0xCD}, /* 0x78-0x7B */
+	{0x85, 0xCA}, {0x85, 0xCB}, {0x85, 0xCC}, {0xF9, 0x23}, /* 0x78-0x7B */
 	{0x85, 0xCE}, {0x85, 0xD1}, {0x85, 0xD2}, {0x00, 0x3F}, /* 0x7C-0x7F */
 	
 	{0x85, 0xD4}, {0x85, 0xD6}, {0x85, 0xD7}, {0x85, 0xD8}, /* 0x80-0x83 */
@@ -5106,7 +5108,7 @@
 	{0x9A, 0xD3}, {0x78, 0x8E}, {0x5C, 0x81}, {0x7A, 0x57}, /* 0xE8-0xEB */
 	{0x90, 0x42}, {0x96, 0xA7}, {0x79, 0x5F}, {0x5B, 0x59}, /* 0xEC-0xEF */
 	{0x63, 0x5F}, {0x7B, 0x0B}, {0x84, 0xD1}, {0x68, 0xAD}, /* 0xF0-0xF3 */
-	{0x55, 0x06}, {0x7F, 0x29}, {0x74, 0x10}, {0x7D, 0x22}, /* 0xF4-0xF7 */
+	{0x55, 0x06}, {0x7F, 0x29}, {0x74, 0x10}, {0xF9, 0x6A}, /* 0xF4-0xF7 */
 	{0x95, 0x01}, {0x62, 0x40}, {0x58, 0x4C}, {0x4E, 0xD6}, /* 0xF8-0xFB */
 	{0x5B, 0x83}, {0x59, 0x79}, {0x58, 0x54}, {0x00, 0x3F}, /* 0xFC-0xFF */
 };
@@ -5128,9 +5130,9 @@
 	{0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */
 	{0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */
 	{0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */
-	{0x85, 0xF9}, {0x85, 0xFA}, {0x85, 0xFC}, {0x85, 0xFD}, /* 0x40-0x43 */
+	{0x85, 0xF9}, {0xF9, 0xF0}, {0x85, 0xFC}, {0x85, 0xFD}, /* 0x40-0x43 */
 	{0x85, 0xFE}, {0x86, 0x00}, {0x86, 0x01}, {0x86, 0x02}, /* 0x44-0x47 */
-	{0x86, 0x03}, {0x86, 0x04}, {0x86, 0x06}, {0x86, 0x07}, /* 0x48-0x4B */
+	{0x86, 0x03}, {0x86, 0x04}, {0xF9, 0x35}, {0x86, 0x07}, /* 0x48-0x4B */
 	{0x86, 0x08}, {0x86, 0x09}, {0x86, 0x0A}, {0x86, 0x0B}, /* 0x4C-0x4F */
 	{0x86, 0x0C}, {0x86, 0x0D}, {0x86, 0x0E}, {0x86, 0x0F}, /* 0x50-0x53 */
 	{0x86, 0x10}, {0x86, 0x12}, {0x86, 0x13}, {0x86, 0x14}, /* 0x54-0x57 */
@@ -5139,18 +5141,18 @@
 	{0x86, 0x1E}, {0x86, 0x1F}, {0x86, 0x20}, {0x86, 0x21}, /* 0x60-0x63 */
 	{0x86, 0x22}, {0x86, 0x23}, {0x86, 0x24}, {0x86, 0x25}, /* 0x64-0x67 */
 	{0x86, 0x26}, {0x86, 0x28}, {0x86, 0x2A}, {0x86, 0x2B}, /* 0x68-0x6B */
-	{0x86, 0x2C}, {0x86, 0x2D}, {0x86, 0x2E}, {0x86, 0x2F}, /* 0x6C-0x6F */
+	{0x86, 0x2C}, {0xF9, 0x1F}, {0x86, 0x2E}, {0x86, 0x2F}, /* 0x6C-0x6F */
 	{0x86, 0x30}, {0x86, 0x31}, {0x86, 0x32}, {0x86, 0x33}, /* 0x70-0x73 */
 	{0x86, 0x34}, {0x86, 0x35}, {0x86, 0x36}, {0x86, 0x37}, /* 0x74-0x77 */
 	{0x86, 0x39}, {0x86, 0x3A}, {0x86, 0x3B}, {0x86, 0x3D}, /* 0x78-0x7B */
-	{0x86, 0x3E}, {0x86, 0x3F}, {0x86, 0x40}, {0x00, 0x3F}, /* 0x7C-0x7F */
+	{0x86, 0x3E}, {0xF9, 0x10}, {0x86, 0x40}, {0x00, 0x3F}, /* 0x7C-0x7F */
 	
 	{0x86, 0x41}, {0x86, 0x42}, {0x86, 0x43}, {0x86, 0x44}, /* 0x80-0x83 */
 	{0x86, 0x45}, {0x86, 0x46}, {0x86, 0x47}, {0x86, 0x48}, /* 0x84-0x87 */
 	{0x86, 0x49}, {0x86, 0x4A}, {0x86, 0x4B}, {0x86, 0x4C}, /* 0x88-0x8B */
 	{0x86, 0x52}, {0x86, 0x53}, {0x86, 0x55}, {0x86, 0x56}, /* 0x8C-0x8F */
 	{0x86, 0x57}, {0x86, 0x58}, {0x86, 0x59}, {0x86, 0x5B}, /* 0x90-0x93 */
-	{0x86, 0x5C}, {0x86, 0x5D}, {0x86, 0x5F}, {0x86, 0x60}, /* 0x94-0x97 */
+	{0xF9, 0x36}, {0x86, 0x5D}, {0x86, 0x5F}, {0x86, 0x60}, /* 0x94-0x97 */
 	{0x86, 0x61}, {0x86, 0x63}, {0x86, 0x64}, {0x86, 0x65}, /* 0x98-0x9B */
 	{0x86, 0x66}, {0x86, 0x67}, {0x86, 0x68}, {0x86, 0x69}, /* 0x9C-0x9F */
 	{0x86, 0x6A}, {0x73, 0x6D}, {0x63, 0x1E}, {0x8E, 0x4B}, /* 0xA0-0xA3 */
@@ -5162,7 +5164,7 @@
 	{0x8C, 0x08}, {0x57, 0x66}, {0x6B, 0xEF}, {0x88, 0x92}, /* 0xB8-0xBB */
 	{0x78, 0xB3}, {0x63, 0xA2}, {0x53, 0xF9}, {0x70, 0xAD}, /* 0xBC-0xBF */
 	{0x6C, 0x64}, {0x58, 0x58}, {0x64, 0x2A}, {0x58, 0x02}, /* 0xC0-0xC3 */
-	{0x68, 0xE0}, {0x81, 0x9B}, {0x55, 0x10}, {0x7C, 0xD6}, /* 0xC4-0xC7 */
+	{0x68, 0xE0}, {0x81, 0x9B}, {0x55, 0x10}, {0xFA, 0x03}, /* 0xC4-0xC7 */
 	{0x50, 0x18}, {0x8E, 0xBA}, {0x6D, 0xCC}, {0x8D, 0x9F}, /* 0xC8-0xCB */
 	{0x70, 0xEB}, {0x63, 0x8F}, {0x6D, 0x9B}, {0x6E, 0xD4}, /* 0xCC-0xCF */
 	{0x7E, 0xE6}, {0x84, 0x04}, {0x68, 0x43}, {0x90, 0x03}, /* 0xD0-0xD3 */
@@ -5235,7 +5237,7 @@
 	{0x54, 0x1E}, {0x5C, 0x6F}, {0x81, 0xC0}, {0x62, 0xD6}, /* 0xCC-0xCF */
 	{0x62, 0x58}, {0x81, 0x31}, {0x9E, 0x35}, {0x96, 0x40}, /* 0xD0-0xD3 */
 	{0x9A, 0x6E}, {0x9A, 0x7C}, {0x69, 0x2D}, {0x59, 0xA5}, /* 0xD4-0xD7 */
-	{0x62, 0xD3}, {0x55, 0x3E}, {0x63, 0x16}, {0x54, 0xC7}, /* 0xD8-0xDB */
+	{0xFA, 0x02}, {0x55, 0x3E}, {0x63, 0x16}, {0x54, 0xC7}, /* 0xD8-0xDB */
 	{0x86, 0xD9}, {0x6D, 0x3C}, {0x5A, 0x03}, {0x74, 0xE6}, /* 0xDC-0xDF */
 	{0x88, 0x9C}, {0x6B, 0x6A}, {0x59, 0x16}, {0x8C, 0x4C}, /* 0xE0-0xE3 */
 	{0x5F, 0x2F}, {0x6E, 0x7E}, {0x73, 0xA9}, {0x98, 0x7D}, /* 0xE4-0xE7 */
@@ -5356,7 +5358,7 @@
 	{0x88, 0x0D}, {0x88, 0x0E}, {0x88, 0x0F}, {0x88, 0x10}, /* 0x90-0x93 */
 	{0x88, 0x11}, {0x88, 0x12}, {0x88, 0x14}, {0x88, 0x17}, /* 0x94-0x97 */
 	{0x88, 0x18}, {0x88, 0x19}, {0x88, 0x1A}, {0x88, 0x1C}, /* 0x98-0x9B */
-	{0x88, 0x1D}, {0x88, 0x1E}, {0x88, 0x1F}, {0x88, 0x20}, /* 0x9C-0x9F */
+	{0x88, 0x1D}, {0x88, 0x1E}, {0xF9, 0x27}, {0x88, 0x20}, /* 0x9C-0x9F */
 	{0x88, 0x23}, {0x7A, 0x00}, {0x60, 0x6F}, {0x5E, 0x0C}, /* 0xA0-0xA3 */
 	{0x60, 0x89}, {0x81, 0x9D}, {0x59, 0x15}, {0x60, 0xDC}, /* 0xA4-0xA7 */
 	{0x71, 0x84}, {0x70, 0xEF}, {0x6E, 0xAA}, {0x6C, 0x50}, /* 0xA8-0xAB */
@@ -5375,7 +5377,7 @@
 	{0x5B, 0xAA}, {0x96, 0x77}, {0x96, 0x50}, {0x7E, 0xBF}, /* 0xDC-0xDF */
 	{0x76, 0xF8}, {0x53, 0xA2}, {0x95, 0x76}, {0x99, 0x99}, /* 0xE0-0xE3 */
 	{0x7B, 0xB1}, {0x89, 0x44}, {0x6E, 0x58}, {0x4E, 0x61}, /* 0xE4-0xE7 */
-	{0x7F, 0xD4}, {0x79, 0x65}, {0x8B, 0xE6}, {0x60, 0xF3}, /* 0xE8-0xEB */
+	{0x7F, 0xD4}, {0xFA, 0x1A}, {0x8B, 0xE6}, {0x60, 0xF3}, /* 0xE8-0xEB */
 	{0x54, 0xCD}, {0x4E, 0xAB}, {0x98, 0x79}, {0x5D, 0xF7}, /* 0xEC-0xEF */
 	{0x6A, 0x61}, {0x50, 0xCF}, {0x54, 0x11}, {0x8C, 0x61}, /* 0xF0-0xF3 */
 	{0x84, 0x27}, {0x78, 0x5D}, {0x97, 0x04}, {0x52, 0x4A}, /* 0xF4-0xF7 */
@@ -5437,7 +5439,7 @@
 	{0x5F, 0xC3}, {0x4F, 0xE1}, {0x88, 0x45}, {0x66, 0x1F}, /* 0xC4-0xC7 */
 	{0x81, 0x65}, {0x73, 0x29}, {0x60, 0xFA}, {0x51, 0x74}, /* 0xC8-0xCB */
 	{0x52, 0x11}, {0x57, 0x8B}, {0x5F, 0x62}, {0x90, 0xA2}, /* 0xCC-0xCF */
-	{0x88, 0x4C}, {0x91, 0x92}, {0x5E, 0x78}, {0x67, 0x4F}, /* 0xD0-0xD3 */
+	{0xFA, 0x08}, {0x91, 0x92}, {0x5E, 0x78}, {0x67, 0x4F}, /* 0xD0-0xD3 */
 	{0x60, 0x27}, {0x59, 0xD3}, {0x51, 0x44}, {0x51, 0xF6}, /* 0xD4-0xD7 */
 	{0x80, 0xF8}, {0x53, 0x08}, {0x6C, 0x79}, {0x96, 0xC4}, /* 0xD8-0xDB */
 	{0x71, 0x8A}, {0x4F, 0x11}, {0x4F, 0xEE}, {0x7F, 0x9E}, /* 0xDC-0xDF */
@@ -5477,7 +5479,7 @@
 	{0x88, 0xCD}, {0x88, 0xCF}, {0x88, 0xD0}, {0x88, 0xD1}, /* 0x58-0x5B */
 	{0x88, 0xD3}, {0x88, 0xD6}, {0x88, 0xD7}, {0x88, 0xDA}, /* 0x5C-0x5F */
 	{0x88, 0xDB}, {0x88, 0xDC}, {0x88, 0xDD}, {0x88, 0xDE}, /* 0x60-0x63 */
-	{0x88, 0xE0}, {0x88, 0xE1}, {0x88, 0xE6}, {0x88, 0xE7}, /* 0x64-0x67 */
+	{0x88, 0xE0}, {0xF9, 0xE8}, {0x88, 0xE6}, {0x88, 0xE7}, /* 0x64-0x67 */
 	{0x88, 0xE9}, {0x88, 0xEA}, {0x88, 0xEB}, {0x88, 0xEC}, /* 0x68-0x6B */
 	{0x88, 0xED}, {0x88, 0xEE}, {0x88, 0xEF}, {0x88, 0xF2}, /* 0x6C-0x6F */
 	{0x88, 0xF5}, {0x88, 0xF6}, {0x88, 0xF7}, {0x88, 0xFA}, /* 0x70-0x73 */
@@ -5503,7 +5505,7 @@
 	{0x9E, 0x2D}, {0x54, 0x40}, {0x4E, 0x2B}, {0x82, 0xBD}, /* 0xBC-0xBF */
 	{0x72, 0x59}, {0x86, 0x9C}, {0x5D, 0x16}, {0x88, 0x59}, /* 0xC0-0xC3 */
 	{0x6D, 0xAF}, {0x96, 0xC5}, {0x54, 0xD1}, {0x4E, 0x9A}, /* 0xC4-0xC7 */
-	{0x8B, 0xB6}, {0x71, 0x09}, {0x54, 0xBD}, {0x96, 0x09}, /* 0xC8-0xCB */
+	{0x8B, 0xB6}, {0x71, 0x09}, {0xF9, 0x9E}, {0x96, 0x09}, /* 0xC8-0xCB */
 	{0x70, 0xDF}, {0x6D, 0xF9}, {0x76, 0xD0}, {0x4E, 0x25}, /* 0xCC-0xCF */
 	{0x78, 0x14}, {0x87, 0x12}, {0x5C, 0xA9}, {0x5E, 0xF6}, /* 0xD0-0xD3 */
 	{0x8A, 0x00}, {0x98, 0x9C}, {0x96, 0x0E}, {0x70, 0x8E}, /* 0xD4-0xD7 */
@@ -5546,7 +5548,7 @@
 	{0x89, 0x56}, {0x89, 0x57}, {0x89, 0x58}, {0x89, 0x59}, /* 0x5C-0x5F */
 	{0x89, 0x5A}, {0x89, 0x5B}, {0x89, 0x5C}, {0x89, 0x5D}, /* 0x60-0x63 */
 	{0x89, 0x60}, {0x89, 0x61}, {0x89, 0x62}, {0x89, 0x63}, /* 0x64-0x67 */
-	{0x89, 0x64}, {0x89, 0x65}, {0x89, 0x67}, {0x89, 0x68}, /* 0x68-0x6B */
+	{0xF9, 0x24}, {0x89, 0x65}, {0x89, 0x67}, {0x89, 0x68}, /* 0x68-0x6B */
 	{0x89, 0x69}, {0x89, 0x6A}, {0x89, 0x6B}, {0x89, 0x6C}, /* 0x6C-0x6F */
 	{0x89, 0x6D}, {0x89, 0x6E}, {0x89, 0x6F}, {0x89, 0x70}, /* 0x70-0x73 */
 	{0x89, 0x71}, {0x89, 0x72}, {0x89, 0x73}, {0x89, 0x74}, /* 0x74-0x77 */
@@ -5555,7 +5557,7 @@
 	
 	{0x89, 0x7D}, {0x89, 0x7E}, {0x89, 0x80}, {0x89, 0x82}, /* 0x80-0x83 */
 	{0x89, 0x84}, {0x89, 0x85}, {0x89, 0x87}, {0x89, 0x88}, /* 0x84-0x87 */
-	{0x89, 0x89}, {0x89, 0x8A}, {0x89, 0x8B}, {0x89, 0x8C}, /* 0x88-0x8B */
+	{0x89, 0x89}, {0x89, 0x8A}, {0xFA, 0x0A}, {0x89, 0x8C}, /* 0x88-0x8B */
 	{0x89, 0x8D}, {0x89, 0x8E}, {0x89, 0x8F}, {0x89, 0x90}, /* 0x8C-0x8F */
 	{0x89, 0x91}, {0x89, 0x92}, {0x89, 0x93}, {0x89, 0x94}, /* 0x90-0x93 */
 	{0x89, 0x95}, {0x89, 0x96}, {0x89, 0x97}, {0x89, 0x98}, /* 0x94-0x97 */
@@ -5574,11 +5576,11 @@
 	{0x80, 0xF0}, {0x75, 0x91}, {0x6C, 0x82}, {0x5B, 0x9C}, /* 0xC8-0xCB */
 	{0x59, 0xE8}, {0x5F, 0x5D}, {0x69, 0x05}, {0x86, 0x81}, /* 0xCC-0xCF */
 	{0x50, 0x1A}, {0x5D, 0xF2}, {0x4E, 0x59}, {0x77, 0xE3}, /* 0xD0-0xD3 */
-	{0x4E, 0xE5}, {0x82, 0x7A}, {0x62, 0x91}, {0x66, 0x13}, /* 0xD4-0xD7 */
+	{0x4E, 0xE5}, {0x82, 0x7A}, {0x62, 0x91}, {0xF9, 0xE0}, /* 0xD4-0xD7 */
 	{0x90, 0x91}, {0x5C, 0x79}, {0x4E, 0xBF}, {0x5F, 0x79}, /* 0xD8-0xDB */
-	{0x81, 0xC6}, {0x90, 0x38}, {0x80, 0x84}, {0x75, 0xAB}, /* 0xDC-0xDF */
+	{0x81, 0xC6}, {0xFA, 0x25}, {0x80, 0x84}, {0x75, 0xAB}, /* 0xDC-0xDF */
 	{0x4E, 0xA6}, {0x88, 0xD4}, {0x61, 0x0F}, {0x6B, 0xC5}, /* 0xE0-0xE3 */
-	{0x5F, 0xC6}, {0x4E, 0x49}, {0x76, 0xCA}, {0x6E, 0xA2}, /* 0xE4-0xE7 */
+	{0x5F, 0xC6}, {0x4E, 0x49}, {0xFA, 0x17}, {0x6E, 0xA2}, /* 0xE4-0xE7 */
 	{0x8B, 0xE3}, {0x8B, 0xAE}, {0x8C, 0x0A}, {0x8B, 0xD1}, /* 0xE8-0xEB */
 	{0x5F, 0x02}, {0x7F, 0xFC}, {0x7F, 0xCC}, {0x7E, 0xCE}, /* 0xEC-0xEF */
 	{0x83, 0x35}, {0x83, 0x6B}, {0x56, 0xE0}, {0x6B, 0xB7}, /* 0xF0-0xF3 */
@@ -5649,7 +5651,7 @@
 	{0x61, 0x09}, {0x6E, 0x1D}, {0x6E, 0x14}, {0x96, 0x85}, /* 0xE4-0xE7 */
 	{0x4E, 0x88}, {0x5A, 0x31}, {0x96, 0xE8}, {0x4E, 0x0E}, /* 0xE8-0xEB */
 	{0x5C, 0x7F}, {0x79, 0xB9}, {0x5B, 0x87}, {0x8B, 0xED}, /* 0xEC-0xEF */
-	{0x7F, 0xBD}, {0x73, 0x89}, {0x57, 0xDF}, {0x82, 0x8B}, /* 0xF0-0xF3 */
+	{0xFA, 0x1E}, {0x73, 0x89}, {0x57, 0xDF}, {0x82, 0x8B}, /* 0xF0-0xF3 */
 	{0x90, 0xC1}, {0x54, 0x01}, {0x90, 0x47}, {0x55, 0xBB}, /* 0xF4-0xF7 */
 	{0x5C, 0xEA}, {0x5F, 0xA1}, {0x61, 0x08}, {0x6B, 0x32}, /* 0xF8-0xFB */
 	{0x72, 0xF1}, {0x80, 0xB2}, {0x8A, 0x89}, {0x00, 0x3F}, /* 0xFC-0xFF */
@@ -5749,7 +5751,7 @@
 	{0x8A, 0x9C}, {0x8A, 0x9D}, {0x8A, 0x9E}, {0x8A, 0x9F}, /* 0x58-0x5B */
 	{0x8A, 0xA0}, {0x8A, 0xA1}, {0x8A, 0xA2}, {0x8A, 0xA3}, /* 0x5C-0x5F */
 	{0x8A, 0xA4}, {0x8A, 0xA5}, {0x8A, 0xA6}, {0x8A, 0xA7}, /* 0x60-0x63 */
-	{0x8A, 0xA8}, {0x8A, 0xA9}, {0x8A, 0xAA}, {0x8A, 0xAB}, /* 0x64-0x67 */
+	{0x8A, 0xA8}, {0x8A, 0xA9}, {0xF9, 0xA1}, {0x8A, 0xAB}, /* 0x64-0x67 */
 	{0x8A, 0xAC}, {0x8A, 0xAD}, {0x8A, 0xAE}, {0x8A, 0xAF}, /* 0x68-0x6B */
 	{0x8A, 0xB0}, {0x8A, 0xB1}, {0x8A, 0xB2}, {0x8A, 0xB3}, /* 0x6C-0x6F */
 	{0x8A, 0xB4}, {0x8A, 0xB5}, {0x8A, 0xB6}, {0x8A, 0xB7}, /* 0x70-0x73 */
@@ -5760,15 +5762,15 @@
 	{0x8A, 0xC3}, {0x8A, 0xC4}, {0x8A, 0xC5}, {0x8A, 0xC6}, /* 0x80-0x83 */
 	{0x8A, 0xC7}, {0x8A, 0xC8}, {0x8A, 0xC9}, {0x8A, 0xCA}, /* 0x84-0x87 */
 	{0x8A, 0xCB}, {0x8A, 0xCC}, {0x8A, 0xCD}, {0x8A, 0xCE}, /* 0x88-0x8B */
-	{0x8A, 0xCF}, {0x8A, 0xD0}, {0x8A, 0xD1}, {0x8A, 0xD2}, /* 0x8C-0x8F */
-	{0x8A, 0xD3}, {0x8A, 0xD4}, {0x8A, 0xD5}, {0x8A, 0xD6}, /* 0x90-0x93 */
+	{0x8A, 0xCF}, {0x8A, 0xD0}, {0x8A, 0xD1}, {0xF9, 0x7D}, /* 0x8C-0x8F */
+	{0x8A, 0xD3}, {0x8A, 0xD4}, {0x8A, 0xD5}, {0xF9, 0x41}, /* 0x90-0x93 */
 	{0x8A, 0xD7}, {0x8A, 0xD8}, {0x8A, 0xD9}, {0x8A, 0xDA}, /* 0x94-0x97 */
 	{0x8A, 0xDB}, {0x8A, 0xDC}, {0x8A, 0xDD}, {0x8A, 0xDE}, /* 0x98-0x9B */
 	{0x8A, 0xDF}, {0x8A, 0xE0}, {0x8A, 0xE1}, {0x8A, 0xE2}, /* 0x9C-0x9F */
 	{0x8A, 0xE3}, {0x94, 0xE1}, {0x95, 0xF8}, {0x77, 0x28}, /* 0xA0-0xA3 */
 	{0x68, 0x05}, {0x69, 0xA8}, {0x54, 0x8B}, {0x4E, 0x4D}, /* 0xA4-0xA7 */
 	{0x70, 0xB8}, {0x8B, 0xC8}, {0x64, 0x58}, {0x65, 0x8B}, /* 0xA8-0xAB */
-	{0x5B, 0x85}, {0x7A, 0x84}, {0x50, 0x3A}, {0x5B, 0xE8}, /* 0xAC-0xAF */
+	{0xFA, 0x04}, {0x7A, 0x84}, {0x50, 0x3A}, {0x5B, 0xE8}, /* 0xAC-0xAF */
 	{0x77, 0xBB}, {0x6B, 0xE1}, {0x8A, 0x79}, {0x7C, 0x98}, /* 0xB0-0xB3 */
 	{0x6C, 0xBE}, {0x76, 0xCF}, {0x65, 0xA9}, {0x8F, 0x97}, /* 0xB4-0xB7 */
 	{0x5D, 0x2D}, {0x5C, 0x55}, {0x86, 0x38}, {0x68, 0x08}, /* 0xB8-0xBB */
@@ -5813,8 +5815,8 @@
 	{0x8A, 0xEC}, {0x8A, 0xED}, {0x8A, 0xEE}, {0x8A, 0xEF}, /* 0x48-0x4B */
 	{0x8A, 0xF0}, {0x8A, 0xF1}, {0x8A, 0xF2}, {0x8A, 0xF3}, /* 0x4C-0x4F */
 	{0x8A, 0xF4}, {0x8A, 0xF5}, {0x8A, 0xF6}, {0x8A, 0xF7}, /* 0x50-0x53 */
-	{0x8A, 0xF8}, {0x8A, 0xF9}, {0x8A, 0xFA}, {0x8A, 0xFB}, /* 0x54-0x57 */
-	{0x8A, 0xFC}, {0x8A, 0xFD}, {0x8A, 0xFE}, {0x8A, 0xFF}, /* 0x58-0x5B */
+	{0xFA, 0x22}, {0x8A, 0xF9}, {0x8A, 0xFA}, {0x8A, 0xFB}, /* 0x54-0x57 */
+	{0x8A, 0xFC}, {0x8A, 0xFD}, {0xF9, 0x5D}, {0x8A, 0xFF}, /* 0x58-0x5B */
 	{0x8B, 0x00}, {0x8B, 0x01}, {0x8B, 0x02}, {0x8B, 0x03}, /* 0x5C-0x5F */
 	{0x8B, 0x04}, {0x8B, 0x05}, {0x8B, 0x06}, {0x8B, 0x08}, /* 0x60-0x63 */
 	{0x8B, 0x09}, {0x8B, 0x0A}, {0x8B, 0x0B}, {0x8B, 0x0C}, /* 0x64-0x67 */
@@ -5843,7 +5845,7 @@
 	{0x65, 0xE8}, {0x7E, 0xB8}, {0x5F, 0xD7}, {0x63, 0x1A}, /* 0xBC-0xBF */
 	{0x63, 0xB7}, {0x81, 0xF3}, {0x81, 0xF4}, {0x7F, 0x6E}, /* 0xC0-0xC3 */
 	{0x5E, 0x1C}, {0x5C, 0xD9}, {0x52, 0x36}, {0x66, 0x7A}, /* 0xC4-0xC7 */
-	{0x79, 0xE9}, {0x7A, 0x1A}, {0x8D, 0x28}, {0x70, 0x99}, /* 0xC8-0xCB */
+	{0x79, 0xE9}, {0x7A, 0x1A}, {0x8D, 0x28}, {0xF9, 0xFB}, /* 0xC8-0xCB */
 	{0x75, 0xD4}, {0x6E, 0xDE}, {0x6C, 0xBB}, {0x7A, 0x92}, /* 0xCC-0xCF */
 	{0x4E, 0x2D}, {0x76, 0xC5}, {0x5F, 0xE0}, {0x94, 0x9F}, /* 0xD0-0xD3 */
 	{0x88, 0x77}, {0x7E, 0xC8}, {0x79, 0xCD}, {0x80, 0xBF}, /* 0xD4-0xD7 */
@@ -5880,7 +5882,7 @@
 	{0x8B, 0x4A}, {0x8B, 0x4B}, {0x8B, 0x4C}, {0x8B, 0x4D}, /* 0x44-0x47 */
 	{0x8B, 0x4E}, {0x8B, 0x4F}, {0x8B, 0x50}, {0x8B, 0x51}, /* 0x48-0x4B */
 	{0x8B, 0x52}, {0x8B, 0x53}, {0x8B, 0x54}, {0x8B, 0x55}, /* 0x4C-0x4F */
-	{0x8B, 0x56}, {0x8B, 0x57}, {0x8B, 0x58}, {0x8B, 0x59}, /* 0x50-0x53 */
+	{0x8B, 0x56}, {0x8B, 0x57}, {0xF9, 0xFC}, {0x8B, 0x59}, /* 0x50-0x53 */
 	{0x8B, 0x5A}, {0x8B, 0x5B}, {0x8B, 0x5C}, {0x8B, 0x5D}, /* 0x54-0x57 */
 	{0x8B, 0x5E}, {0x8B, 0x5F}, {0x8B, 0x60}, {0x8B, 0x61}, /* 0x58-0x5B */
 	{0x8B, 0x62}, {0x8B, 0x63}, {0x8B, 0x64}, {0x8B, 0x65}, /* 0x5C-0x5F */
@@ -5890,7 +5892,7 @@
 	{0x8B, 0x74}, {0x8B, 0x75}, {0x8B, 0x76}, {0x8B, 0x77}, /* 0x6C-0x6F */
 	{0x8B, 0x78}, {0x8B, 0x79}, {0x8B, 0x7A}, {0x8B, 0x7B}, /* 0x70-0x73 */
 	{0x8B, 0x7C}, {0x8B, 0x7D}, {0x8B, 0x7E}, {0x8B, 0x7F}, /* 0x74-0x77 */
-	{0x8B, 0x80}, {0x8B, 0x81}, {0x8B, 0x82}, {0x8B, 0x83}, /* 0x78-0x7B */
+	{0xF9, 0x5A}, {0x8B, 0x81}, {0x8B, 0x82}, {0x8B, 0x83}, /* 0x78-0x7B */
 	{0x8B, 0x84}, {0x8B, 0x85}, {0x8B, 0x86}, {0x00, 0x3F}, /* 0x7C-0x7F */
 	
 	{0x8B, 0x87}, {0x8B, 0x88}, {0x8B, 0x89}, {0x8B, 0x8A}, /* 0x80-0x83 */
@@ -5947,14 +5949,14 @@
 	{0x8C, 0x38}, {0x8C, 0x39}, {0x8C, 0x3A}, {0x8C, 0x3B}, /* 0x40-0x43 */
 	{0x8C, 0x3C}, {0x8C, 0x3D}, {0x8C, 0x3E}, {0x8C, 0x3F}, /* 0x44-0x47 */
 	{0x8C, 0x40}, {0x8C, 0x42}, {0x8C, 0x43}, {0x8C, 0x44}, /* 0x48-0x4B */
-	{0x8C, 0x45}, {0x8C, 0x48}, {0x8C, 0x4A}, {0x8C, 0x4B}, /* 0x4C-0x4F */
+	{0x8C, 0x45}, {0xF9, 0x00}, {0x8C, 0x4A}, {0x8C, 0x4B}, /* 0x4C-0x4F */
 	{0x8C, 0x4D}, {0x8C, 0x4E}, {0x8C, 0x4F}, {0x8C, 0x50}, /* 0x50-0x53 */
 	{0x8C, 0x51}, {0x8C, 0x52}, {0x8C, 0x53}, {0x8C, 0x54}, /* 0x54-0x57 */
 	{0x8C, 0x56}, {0x8C, 0x57}, {0x8C, 0x58}, {0x8C, 0x59}, /* 0x58-0x5B */
 	{0x8C, 0x5B}, {0x8C, 0x5C}, {0x8C, 0x5D}, {0x8C, 0x5E}, /* 0x5C-0x5F */
 	{0x8C, 0x5F}, {0x8C, 0x60}, {0x8C, 0x63}, {0x8C, 0x64}, /* 0x60-0x63 */
 	{0x8C, 0x65}, {0x8C, 0x66}, {0x8C, 0x67}, {0x8C, 0x68}, /* 0x64-0x67 */
-	{0x8C, 0x69}, {0x8C, 0x6C}, {0x8C, 0x6D}, {0x8C, 0x6E}, /* 0x68-0x6B */
+	{0x8C, 0x69}, {0xFA, 0x16}, {0x8C, 0x6D}, {0x8C, 0x6E}, /* 0x68-0x6B */
 	{0x8C, 0x6F}, {0x8C, 0x70}, {0x8C, 0x71}, {0x8C, 0x72}, /* 0x6C-0x6F */
 	{0x8C, 0x74}, {0x8C, 0x75}, {0x8C, 0x76}, {0x8C, 0x77}, /* 0x70-0x73 */
 	{0x8C, 0x7B}, {0x8C, 0x7C}, {0x8C, 0x7D}, {0x8C, 0x7E}, /* 0x74-0x77 */
@@ -6017,8 +6019,8 @@
 	{0x8C, 0xB6}, {0x8C, 0xB7}, {0x8C, 0xB8}, {0x8C, 0xB9}, /* 0x48-0x4B */
 	{0x8C, 0xBA}, {0x8C, 0xBB}, {0x8C, 0xBC}, {0x8C, 0xBD}, /* 0x4C-0x4F */
 	{0x8C, 0xBE}, {0x8C, 0xBF}, {0x8C, 0xC0}, {0x8C, 0xC1}, /* 0x50-0x53 */
-	{0x8C, 0xC2}, {0x8C, 0xC3}, {0x8C, 0xC4}, {0x8C, 0xC5}, /* 0x54-0x57 */
-	{0x8C, 0xC6}, {0x8C, 0xC7}, {0x8C, 0xC8}, {0x8C, 0xC9}, /* 0x58-0x5B */
+	{0xF9, 0x48}, {0x8C, 0xC3}, {0x8C, 0xC4}, {0x8C, 0xC5}, /* 0x54-0x57 */
+	{0x8C, 0xC6}, {0x8C, 0xC7}, {0xF9, 0x03}, {0x8C, 0xC9}, /* 0x58-0x5B */
 	{0x8C, 0xCA}, {0x8C, 0xCB}, {0x8C, 0xCC}, {0x8C, 0xCD}, /* 0x5C-0x5F */
 	{0x8C, 0xCE}, {0x8C, 0xCF}, {0x8C, 0xD0}, {0x8C, 0xD1}, /* 0x60-0x63 */
 	{0x8C, 0xD2}, {0x8C, 0xD3}, {0x8C, 0xD4}, {0x8C, 0xD5}, /* 0x64-0x67 */
@@ -6234,7 +6236,7 @@
 	{0x8E, 0xC0}, {0x8E, 0xC1}, {0x8E, 0xC2}, {0x00, 0x3F}, /* 0x7C-0x7F */
 	
 	{0x8E, 0xC3}, {0x8E, 0xC4}, {0x8E, 0xC5}, {0x8E, 0xC6}, /* 0x80-0x83 */
-	{0x8E, 0xC7}, {0x8E, 0xC8}, {0x8E, 0xC9}, {0x8E, 0xCA}, /* 0x84-0x87 */
+	{0x8E, 0xC7}, {0x8E, 0xC8}, {0x8E, 0xC9}, {0xF9, 0x02}, /* 0x84-0x87 */
 	{0x8E, 0xCB}, {0x8E, 0xCC}, {0x8E, 0xCD}, {0x8E, 0xCF}, /* 0x88-0x8B */
 	{0x8E, 0xD0}, {0x8E, 0xD1}, {0x8E, 0xD2}, {0x8E, 0xD3}, /* 0x8C-0x8F */
 	{0x8E, 0xD4}, {0x8E, 0xD5}, {0x8E, 0xD6}, {0x8E, 0xD7}, /* 0x90-0x93 */
@@ -6301,12 +6303,12 @@
 	{0x8F, 0x1D}, {0x8F, 0x1E}, {0x8F, 0x1F}, {0x8F, 0x20}, /* 0x78-0x7B */
 	{0x8F, 0x21}, {0x8F, 0x22}, {0x8F, 0x23}, {0x00, 0x3F}, /* 0x7C-0x7F */
 	
-	{0x8F, 0x24}, {0x8F, 0x25}, {0x8F, 0x26}, {0x8F, 0x27}, /* 0x80-0x83 */
-	{0x8F, 0x28}, {0x8F, 0x29}, {0x8F, 0x2A}, {0x8F, 0x2B}, /* 0x84-0x87 */
+	{0x8F, 0x24}, {0x8F, 0x25}, {0xF9, 0x98}, {0x8F, 0x27}, /* 0x80-0x83 */
+	{0x8F, 0x28}, {0x8F, 0x29}, {0xF9, 0xD7}, {0x8F, 0x2B}, /* 0x84-0x87 */
 	{0x8F, 0x2C}, {0x8F, 0x2D}, {0x8F, 0x2E}, {0x8F, 0x2F}, /* 0x88-0x8B */
 	{0x8F, 0x30}, {0x8F, 0x31}, {0x8F, 0x32}, {0x8F, 0x33}, /* 0x8C-0x8F */
 	{0x8F, 0x34}, {0x8F, 0x35}, {0x8F, 0x36}, {0x8F, 0x37}, /* 0x90-0x93 */
-	{0x8F, 0x38}, {0x8F, 0x39}, {0x8F, 0x3A}, {0x8F, 0x3B}, /* 0x94-0x97 */
+	{0x8F, 0x38}, {0x8F, 0x39}, {0x8F, 0x3A}, {0xFA, 0x07}, /* 0x94-0x97 */
 	{0x8F, 0x3C}, {0x8F, 0x3D}, {0x8F, 0x3E}, {0x8F, 0x3F}, /* 0x98-0x9B */
 	{0x8F, 0x40}, {0x8F, 0x41}, {0x8F, 0x42}, {0x8F, 0x43}, /* 0x9C-0x9F */
 	{0x8F, 0x44}, {0x83, 0x68}, {0x83, 0x1B}, {0x83, 0x69}, /* 0xA0-0xA3 */
@@ -6359,7 +6361,7 @@
 	{0x8F, 0x55}, {0x8F, 0x56}, {0x8F, 0x57}, {0x8F, 0x58}, /* 0x50-0x53 */
 	{0x8F, 0x59}, {0x8F, 0x5A}, {0x8F, 0x5B}, {0x8F, 0x5C}, /* 0x54-0x57 */
 	{0x8F, 0x5D}, {0x8F, 0x5E}, {0x8F, 0x5F}, {0x8F, 0x60}, /* 0x58-0x5B */
-	{0x8F, 0x61}, {0x8F, 0x62}, {0x8F, 0x63}, {0x8F, 0x64}, /* 0x5C-0x5F */
+	{0x8F, 0x61}, {0xF9, 0x8D}, {0x8F, 0x63}, {0x8F, 0x64}, /* 0x5C-0x5F */
 	{0x8F, 0x65}, {0x8F, 0x6A}, {0x8F, 0x80}, {0x8F, 0x8C}, /* 0x60-0x63 */
 	{0x8F, 0x92}, {0x8F, 0x9D}, {0x8F, 0xA0}, {0x8F, 0xA1}, /* 0x64-0x67 */
 	{0x8F, 0xA2}, {0x8F, 0xA4}, {0x8F, 0xA5}, {0x8F, 0xA6}, /* 0x68-0x6B */
@@ -6378,7 +6380,7 @@
 	{0x8F, 0xFE}, {0x8F, 0xFF}, {0x90, 0x07}, {0x90, 0x08}, /* 0x98-0x9B */
 	{0x90, 0x0C}, {0x90, 0x0E}, {0x90, 0x13}, {0x90, 0x15}, /* 0x9C-0x9F */
 	{0x90, 0x18}, {0x85, 0x56}, {0x85, 0x3B}, {0x84, 0xFF}, /* 0xA0-0xA3 */
-	{0x84, 0xFC}, {0x85, 0x59}, {0x85, 0x48}, {0x85, 0x68}, /* 0xA4-0xA7 */
+	{0xF9, 0xC2}, {0x85, 0x59}, {0x85, 0x48}, {0x85, 0x68}, /* 0xA4-0xA7 */
 	{0x85, 0x64}, {0x85, 0x5E}, {0x85, 0x7A}, {0x77, 0xA2}, /* 0xA8-0xAB */
 	{0x85, 0x43}, {0x85, 0x72}, {0x85, 0x7B}, {0x85, 0xA4}, /* 0xAC-0xAF */
 	{0x85, 0xA8}, {0x85, 0x87}, {0x85, 0x8F}, {0x85, 0x79}, /* 0xB0-0xB3 */
@@ -6420,7 +6422,7 @@
 	{0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */
 	{0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */
 	{0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */
-	{0x90, 0x19}, {0x90, 0x1C}, {0x90, 0x23}, {0x90, 0x24}, /* 0x40-0x43 */
+	{0x90, 0x19}, {0x90, 0x1C}, {0xF9, 0x9A}, {0x90, 0x24}, /* 0x40-0x43 */
 	{0x90, 0x25}, {0x90, 0x27}, {0x90, 0x28}, {0x90, 0x29}, /* 0x44-0x47 */
 	{0x90, 0x2A}, {0x90, 0x2B}, {0x90, 0x2C}, {0x90, 0x30}, /* 0x48-0x4B */
 	{0x90, 0x31}, {0x90, 0x32}, {0x90, 0x33}, {0x90, 0x34}, /* 0x4C-0x4F */
@@ -6435,11 +6437,11 @@
 	{0x90, 0x6C}, {0x90, 0x6F}, {0x90, 0x70}, {0x90, 0x71}, /* 0x70-0x73 */
 	{0x90, 0x72}, {0x90, 0x73}, {0x90, 0x76}, {0x90, 0x77}, /* 0x74-0x77 */
 	{0x90, 0x78}, {0x90, 0x79}, {0x90, 0x7A}, {0x90, 0x7B}, /* 0x78-0x7B */
-	{0x90, 0x7C}, {0x90, 0x7E}, {0x90, 0x81}, {0x00, 0x3F}, /* 0x7C-0x7F */
+	{0xF9, 0xC3}, {0x90, 0x7E}, {0x90, 0x81}, {0x00, 0x3F}, /* 0x7C-0x7F */
 	
 	{0x90, 0x84}, {0x90, 0x85}, {0x90, 0x86}, {0x90, 0x87}, /* 0x80-0x83 */
 	{0x90, 0x89}, {0x90, 0x8A}, {0x90, 0x8C}, {0x90, 0x8D}, /* 0x84-0x87 */
-	{0x90, 0x8E}, {0x90, 0x8F}, {0x90, 0x90}, {0x90, 0x92}, /* 0x88-0x8B */
+	{0x90, 0x8E}, {0xF9, 0x13}, {0x90, 0x90}, {0x90, 0x92}, /* 0x88-0x8B */
 	{0x90, 0x94}, {0x90, 0x96}, {0x90, 0x98}, {0x90, 0x9A}, /* 0x8C-0x8F */
 	{0x90, 0x9C}, {0x90, 0x9E}, {0x90, 0x9F}, {0x90, 0xA0}, /* 0x90-0x93 */
 	{0x90, 0xA4}, {0x90, 0xA5}, {0x90, 0xA7}, {0x90, 0xA8}, /* 0x94-0x97 */
@@ -6533,7 +6535,7 @@
 	{0x56, 0x64}, {0x56, 0x71}, {0x56, 0x6B}, {0x56, 0x7B}, /* 0xE4-0xE7 */
 	{0x56, 0x7C}, {0x56, 0x85}, {0x56, 0x93}, {0x56, 0xAF}, /* 0xE8-0xEB */
 	{0x56, 0xD4}, {0x56, 0xD7}, {0x56, 0xDD}, {0x56, 0xE1}, /* 0xEC-0xEF */
-	{0x56, 0xF5}, {0x56, 0xEB}, {0x56, 0xF9}, {0x56, 0xFF}, /* 0xF0-0xF3 */
+	{0x56, 0xF5}, {0x56, 0xEB}, {0xF9, 0xA9}, {0x56, 0xFF}, /* 0xF0-0xF3 */
 	{0x57, 0x04}, {0x57, 0x0A}, {0x57, 0x09}, {0x57, 0x1C}, /* 0xF4-0xF7 */
 	{0x5E, 0x0F}, {0x5E, 0x19}, {0x5E, 0x14}, {0x5E, 0x11}, /* 0xF8-0xFB */
 	{0x5E, 0x31}, {0x5E, 0x3B}, {0x5E, 0x3C}, {0x00, 0x3F}, /* 0xFC-0xFF */
@@ -6644,7 +6646,7 @@
 	{0x92, 0x25}, {0x92, 0x26}, {0x92, 0x27}, {0x92, 0x28}, /* 0x80-0x83 */
 	{0x92, 0x29}, {0x92, 0x2A}, {0x92, 0x2B}, {0x92, 0x2C}, /* 0x84-0x87 */
 	{0x92, 0x2D}, {0x92, 0x2E}, {0x92, 0x2F}, {0x92, 0x30}, /* 0x88-0x8B */
-	{0x92, 0x31}, {0x92, 0x32}, {0x92, 0x33}, {0x92, 0x34}, /* 0x8C-0x8F */
+	{0x92, 0x31}, {0x92, 0x32}, {0x92, 0x33}, {0xF9, 0xB1}, /* 0x8C-0x8F */
 	{0x92, 0x35}, {0x92, 0x36}, {0x92, 0x37}, {0x92, 0x38}, /* 0x90-0x93 */
 	{0x92, 0x39}, {0x92, 0x3A}, {0x92, 0x3B}, {0x92, 0x3C}, /* 0x94-0x97 */
 	{0x92, 0x3D}, {0x92, 0x3E}, {0x92, 0x3F}, {0x92, 0x40}, /* 0x98-0x9B */
@@ -6783,7 +6785,7 @@
 	{0x92, 0xF5}, {0x92, 0xF6}, {0x92, 0xF7}, {0x92, 0xF8}, /* 0x8C-0x8F */
 	{0x92, 0xF9}, {0x92, 0xFA}, {0x92, 0xFB}, {0x92, 0xFC}, /* 0x90-0x93 */
 	{0x92, 0xFD}, {0x92, 0xFE}, {0x92, 0xFF}, {0x93, 0x00}, /* 0x94-0x97 */
-	{0x93, 0x01}, {0x93, 0x02}, {0x93, 0x03}, {0x93, 0x04}, /* 0x98-0x9B */
+	{0x93, 0x01}, {0x93, 0x02}, {0x93, 0x03}, {0xF9, 0x3F}, /* 0x98-0x9B */
 	{0x93, 0x05}, {0x93, 0x06}, {0x93, 0x07}, {0x93, 0x08}, /* 0x9C-0x9F */
 	{0x93, 0x09}, {0x6D, 0x39}, {0x6D, 0x27}, {0x6D, 0x0C}, /* 0xA0-0xA3 */
 	{0x6D, 0x43}, {0x6D, 0x48}, {0x6D, 0x07}, {0x6D, 0x04}, /* 0xA4-0xA7 */
@@ -6845,7 +6847,7 @@
 	{0x93, 0x43}, {0x93, 0x44}, {0x93, 0x45}, {0x93, 0x46}, /* 0x78-0x7B */
 	{0x93, 0x47}, {0x93, 0x48}, {0x93, 0x49}, {0x00, 0x3F}, /* 0x7C-0x7F */
 	
-	{0x93, 0x4A}, {0x93, 0x4B}, {0x93, 0x4C}, {0x93, 0x4D}, /* 0x80-0x83 */
+	{0xF9, 0x9B}, {0x93, 0x4B}, {0x93, 0x4C}, {0x93, 0x4D}, /* 0x80-0x83 */
 	{0x93, 0x4E}, {0x93, 0x4F}, {0x93, 0x50}, {0x93, 0x51}, /* 0x84-0x87 */
 	{0x93, 0x52}, {0x93, 0x53}, {0x93, 0x54}, {0x93, 0x55}, /* 0x88-0x8B */
 	{0x93, 0x56}, {0x93, 0x57}, {0x93, 0x58}, {0x93, 0x59}, /* 0x8C-0x8F */
@@ -6860,7 +6862,7 @@
 	{0x70, 0x4F}, {0x70, 0x5E}, {0x5B, 0x80}, {0x5B, 0x84}, /* 0xB0-0xB3 */
 	{0x5B, 0x95}, {0x5B, 0x93}, {0x5B, 0xA5}, {0x5B, 0xB8}, /* 0xB4-0xB7 */
 	{0x75, 0x2F}, {0x9A, 0x9E}, {0x64, 0x34}, {0x5B, 0xE4}, /* 0xB8-0xBB */
-	{0x5B, 0xEE}, {0x89, 0x30}, {0x5B, 0xF0}, {0x8E, 0x47}, /* 0xBC-0xBF */
+	{0xF9, 0xBC}, {0x89, 0x30}, {0x5B, 0xF0}, {0x8E, 0x47}, /* 0xBC-0xBF */
 	{0x8B, 0x07}, {0x8F, 0xB6}, {0x8F, 0xD3}, {0x8F, 0xD5}, /* 0xC0-0xC3 */
 	{0x8F, 0xE5}, {0x8F, 0xEE}, {0x8F, 0xE4}, {0x8F, 0xE9}, /* 0xC4-0xC7 */
 	{0x8F, 0xE6}, {0x8F, 0xF3}, {0x8F, 0xE8}, {0x90, 0x05}, /* 0xC8-0xCB */
@@ -7009,7 +7011,7 @@
 	{0x73, 0x9F}, {0x73, 0xCF}, {0x73, 0xC2}, {0x73, 0xD1}, /* 0xE4-0xE7 */
 	{0x73, 0xB7}, {0x73, 0xB3}, {0x73, 0xC0}, {0x73, 0xC9}, /* 0xE8-0xEB */
 	{0x73, 0xC8}, {0x73, 0xE5}, {0x73, 0xD9}, {0x98, 0x7C}, /* 0xEC-0xEF */
-	{0x74, 0x0A}, {0x73, 0xE9}, {0x73, 0xE7}, {0x73, 0xDE}, /* 0xF0-0xF3 */
+	{0x74, 0x0A}, {0x73, 0xE9}, {0x73, 0xE7}, {0xF9, 0x17}, /* 0xF0-0xF3 */
 	{0x73, 0xBA}, {0x73, 0xF2}, {0x74, 0x0F}, {0x74, 0x2A}, /* 0xF4-0xF7 */
 	{0x74, 0x5B}, {0x74, 0x26}, {0x74, 0x25}, {0x74, 0x28}, /* 0xF8-0xFB */
 	{0x74, 0x30}, {0x74, 0x2E}, {0x74, 0x2C}, {0x00, 0x3F}, /* 0xFC-0xFF */
@@ -7117,7 +7119,7 @@
 	{0x95, 0xA4}, {0x95, 0xA5}, {0x95, 0xA6}, {0x95, 0xA7}, /* 0x78-0x7B */
 	{0x95, 0xA8}, {0x95, 0xA9}, {0x95, 0xAA}, {0x00, 0x3F}, /* 0x7C-0x7F */
 	
-	{0x95, 0xAB}, {0x95, 0xAC}, {0x95, 0xAD}, {0x95, 0xAE}, /* 0x80-0x83 */
+	{0x95, 0xAB}, {0x95, 0xAC}, {0xF9, 0x86}, {0x95, 0xAE}, /* 0x80-0x83 */
 	{0x95, 0xAF}, {0x95, 0xB0}, {0x95, 0xB1}, {0x95, 0xB2}, /* 0x84-0x87 */
 	{0x95, 0xB3}, {0x95, 0xB4}, {0x95, 0xB5}, {0x95, 0xB6}, /* 0x88-0x8B */
 	{0x95, 0xB7}, {0x95, 0xB8}, {0x95, 0xB9}, {0x95, 0xBA}, /* 0x8C-0x8F */
@@ -7189,7 +7191,7 @@
 	{0x96, 0x5D}, {0x96, 0x5E}, {0x96, 0x60}, {0x96, 0x63}, /* 0x84-0x87 */
 	{0x96, 0x65}, {0x96, 0x66}, {0x96, 0x6B}, {0x96, 0x6D}, /* 0x88-0x8B */
 	{0x96, 0x6E}, {0x96, 0x6F}, {0x96, 0x70}, {0x96, 0x71}, /* 0x8C-0x8F */
-	{0x96, 0x73}, {0x96, 0x78}, {0x96, 0x79}, {0x96, 0x7A}, /* 0x90-0x93 */
+	{0x96, 0x73}, {0xF9, 0xD3}, {0x96, 0x79}, {0x96, 0x7A}, /* 0x90-0x93 */
 	{0x96, 0x7B}, {0x96, 0x7C}, {0x96, 0x7D}, {0x96, 0x7E}, /* 0x94-0x97 */
 	{0x96, 0x7F}, {0x96, 0x80}, {0x96, 0x81}, {0x96, 0x82}, /* 0x98-0x9B */
 	{0x96, 0x83}, {0x96, 0x84}, {0x96, 0x87}, {0x96, 0x89}, /* 0x9C-0x9F */
@@ -7244,13 +7246,13 @@
 	{0x96, 0xA9}, {0x96, 0xAA}, {0x96, 0xAB}, {0x96, 0xAC}, /* 0x54-0x57 */
 	{0x96, 0xAD}, {0x96, 0xAE}, {0x96, 0xAF}, {0x96, 0xB1}, /* 0x58-0x5B */
 	{0x96, 0xB2}, {0x96, 0xB4}, {0x96, 0xB5}, {0x96, 0xB7}, /* 0x5C-0x5F */
-	{0x96, 0xB8}, {0x96, 0xBA}, {0x96, 0xBB}, {0x96, 0xBF}, /* 0x60-0x63 */
+	{0xF9, 0xB8}, {0x96, 0xBA}, {0x96, 0xBB}, {0x96, 0xBF}, /* 0x60-0x63 */
 	{0x96, 0xC2}, {0x96, 0xC3}, {0x96, 0xC8}, {0x96, 0xCA}, /* 0x64-0x67 */
 	{0x96, 0xCB}, {0x96, 0xD0}, {0x96, 0xD1}, {0x96, 0xD3}, /* 0x68-0x6B */
 	{0x96, 0xD4}, {0x96, 0xD6}, {0x96, 0xD7}, {0x96, 0xD8}, /* 0x6C-0x6F */
 	{0x96, 0xD9}, {0x96, 0xDA}, {0x96, 0xDB}, {0x96, 0xDC}, /* 0x70-0x73 */
 	{0x96, 0xDD}, {0x96, 0xDE}, {0x96, 0xDF}, {0x96, 0xE1}, /* 0x74-0x77 */
-	{0x96, 0xE2}, {0x96, 0xE3}, {0x96, 0xE4}, {0x96, 0xE5}, /* 0x78-0x7B */
+	{0xF9, 0xEA}, {0x96, 0xE3}, {0x96, 0xE4}, {0x96, 0xE5}, /* 0x78-0x7B */
 	{0x96, 0xE6}, {0x96, 0xE7}, {0x96, 0xEB}, {0x00, 0x3F}, /* 0x7C-0x7F */
 	
 	{0x96, 0xEC}, {0x96, 0xED}, {0x96, 0xEE}, {0x96, 0xF0}, /* 0x80-0x83 */
@@ -7312,7 +7314,7 @@
 	{0x97, 0x3B}, {0x97, 0x3C}, {0x97, 0x3D}, {0x97, 0x3F}, /* 0x54-0x57 */
 	{0x97, 0x40}, {0x97, 0x41}, {0x97, 0x42}, {0x97, 0x43}, /* 0x58-0x5B */
 	{0x97, 0x44}, {0x97, 0x45}, {0x97, 0x46}, {0x97, 0x47}, /* 0x5C-0x5F */
-	{0x97, 0x48}, {0x97, 0x49}, {0x97, 0x4A}, {0x97, 0x4B}, /* 0x60-0x63 */
+	{0xF9, 0xB3}, {0x97, 0x49}, {0x97, 0x4A}, {0x97, 0x4B}, /* 0x60-0x63 */
 	{0x97, 0x4C}, {0x97, 0x4D}, {0x97, 0x4E}, {0x97, 0x4F}, /* 0x64-0x67 */
 	{0x97, 0x50}, {0x97, 0x51}, {0x97, 0x54}, {0x97, 0x55}, /* 0x68-0x6B */
 	{0x97, 0x57}, {0x97, 0x58}, {0x97, 0x5A}, {0x97, 0x5C}, /* 0x6C-0x6F */
@@ -7442,7 +7444,7 @@
 	{0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */
 	{0x98, 0x0F}, {0x98, 0x10}, {0x98, 0x11}, {0x98, 0x12}, /* 0x40-0x43 */
 	{0x98, 0x13}, {0x98, 0x14}, {0x98, 0x15}, {0x98, 0x16}, /* 0x44-0x47 */
-	{0x98, 0x17}, {0x98, 0x18}, {0x98, 0x19}, {0x98, 0x1A}, /* 0x48-0x4B */
+	{0x98, 0x17}, {0xF9, 0xB4}, {0x98, 0x19}, {0x98, 0x1A}, /* 0x48-0x4B */
 	{0x98, 0x1B}, {0x98, 0x1C}, {0x98, 0x1D}, {0x98, 0x1E}, /* 0x4C-0x4F */
 	{0x98, 0x1F}, {0x98, 0x20}, {0x98, 0x21}, {0x98, 0x22}, /* 0x50-0x53 */
 	{0x98, 0x23}, {0x98, 0x24}, {0x98, 0x25}, {0x98, 0x26}, /* 0x54-0x57 */
@@ -7461,7 +7463,7 @@
 	{0x98, 0x52}, {0x98, 0x53}, {0x98, 0x54}, {0x98, 0x55}, /* 0x84-0x87 */
 	{0x98, 0x56}, {0x98, 0x57}, {0x98, 0x58}, {0x98, 0x59}, /* 0x88-0x8B */
 	{0x98, 0x5A}, {0x98, 0x5B}, {0x98, 0x5C}, {0x98, 0x5D}, /* 0x8C-0x8F */
-	{0x98, 0x5E}, {0x98, 0x5F}, {0x98, 0x60}, {0x98, 0x61}, /* 0x90-0x93 */
+	{0xF9, 0xD0}, {0x98, 0x5F}, {0x98, 0x60}, {0x98, 0x61}, /* 0x90-0x93 */
 	{0x98, 0x62}, {0x98, 0x63}, {0x98, 0x64}, {0x98, 0x65}, /* 0x94-0x97 */
 	{0x98, 0x66}, {0x98, 0x67}, {0x98, 0x68}, {0x98, 0x69}, /* 0x98-0x9B */
 	{0x98, 0x6A}, {0x98, 0x6B}, {0x98, 0x6C}, {0x98, 0x6D}, /* 0x9C-0x9F */
@@ -7472,7 +7474,7 @@
 	{0x75, 0x4E}, {0x75, 0x4B}, {0x75, 0x48}, {0x75, 0x5B}, /* 0xB0-0xB3 */
 	{0x75, 0x72}, {0x75, 0x79}, {0x75, 0x83}, {0x7F, 0x58}, /* 0xB4-0xB7 */
 	{0x7F, 0x61}, {0x7F, 0x5F}, {0x8A, 0x48}, {0x7F, 0x68}, /* 0xB8-0xBB */
-	{0x7F, 0x74}, {0x7F, 0x71}, {0x7F, 0x79}, {0x7F, 0x81}, /* 0xBC-0xBF */
+	{0x7F, 0x74}, {0x7F, 0x71}, {0xF9, 0xE6}, {0x7F, 0x81}, /* 0xBC-0xBF */
 	{0x7F, 0x7E}, {0x76, 0xCD}, {0x76, 0xE5}, {0x88, 0x32}, /* 0xC0-0xC3 */
 	{0x94, 0x85}, {0x94, 0x86}, {0x94, 0x87}, {0x94, 0x8B}, /* 0xC4-0xC7 */
 	{0x94, 0x8A}, {0x94, 0x8C}, {0x94, 0x8D}, {0x94, 0x8F}, /* 0xC8-0xCB */
@@ -7527,10 +7529,10 @@
 	
 	{0x98, 0xE5}, {0x98, 0xE6}, {0x98, 0xE9}, {0x98, 0xEA}, /* 0x80-0x83 */
 	{0x98, 0xEB}, {0x98, 0xEC}, {0x98, 0xED}, {0x98, 0xEE}, /* 0x84-0x87 */
-	{0x98, 0xEF}, {0x98, 0xF0}, {0x98, 0xF1}, {0x98, 0xF2}, /* 0x88-0x8B */
+	{0xFA, 0x2A}, {0x98, 0xF0}, {0x98, 0xF1}, {0x98, 0xF2}, /* 0x88-0x8B */
 	{0x98, 0xF3}, {0x98, 0xF4}, {0x98, 0xF5}, {0x98, 0xF6}, /* 0x8C-0x8F */
 	{0x98, 0xF7}, {0x98, 0xF8}, {0x98, 0xF9}, {0x98, 0xFA}, /* 0x90-0x93 */
-	{0x98, 0xFB}, {0x98, 0xFC}, {0x98, 0xFD}, {0x98, 0xFE}, /* 0x94-0x97 */
+	{0x98, 0xFB}, {0xFA, 0x2B}, {0x98, 0xFD}, {0x98, 0xFE}, /* 0x94-0x97 */
 	{0x98, 0xFF}, {0x99, 0x00}, {0x99, 0x01}, {0x99, 0x02}, /* 0x98-0x9B */
 	{0x99, 0x03}, {0x99, 0x04}, {0x99, 0x05}, {0x99, 0x06}, /* 0x9C-0x9F */
 	{0x99, 0x07}, {0x94, 0xE9}, {0x94, 0xEB}, {0x94, 0xEE}, /* 0xA0-0xA3 */
@@ -7583,7 +7585,7 @@
 	{0x99, 0x1A}, {0x99, 0x1B}, {0x99, 0x1C}, {0x99, 0x1D}, /* 0x50-0x53 */
 	{0x99, 0x1E}, {0x99, 0x1F}, {0x99, 0x20}, {0x99, 0x21}, /* 0x54-0x57 */
 	{0x99, 0x22}, {0x99, 0x23}, {0x99, 0x24}, {0x99, 0x25}, /* 0x58-0x5B */
-	{0x99, 0x26}, {0x99, 0x27}, {0x99, 0x28}, {0x99, 0x29}, /* 0x5C-0x5F */
+	{0x99, 0x26}, {0x99, 0x27}, {0xFA, 0x2C}, {0x99, 0x29}, /* 0x5C-0x5F */
 	{0x99, 0x2A}, {0x99, 0x2B}, {0x99, 0x2C}, {0x99, 0x2D}, /* 0x60-0x63 */
 	{0x99, 0x2F}, {0x99, 0x30}, {0x99, 0x31}, {0x99, 0x32}, /* 0x64-0x67 */
 	{0x99, 0x33}, {0x99, 0x34}, {0x99, 0x35}, {0x99, 0x36}, /* 0x68-0x6B */
@@ -7667,7 +7669,7 @@
 	{0x99, 0xE5}, {0x99, 0xE6}, {0x99, 0xE7}, {0x99, 0xE8}, /* 0x8C-0x8F */
 	{0x99, 0xE9}, {0x99, 0xEA}, {0x99, 0xEB}, {0x99, 0xEC}, /* 0x90-0x93 */
 	{0x99, 0xED}, {0x99, 0xEE}, {0x99, 0xEF}, {0x99, 0xF0}, /* 0x94-0x97 */
-	{0x99, 0xF1}, {0x99, 0xF2}, {0x99, 0xF3}, {0x99, 0xF4}, /* 0x98-0x9B */
+	{0xF9, 0x1A}, {0x99, 0xF2}, {0x99, 0xF3}, {0x99, 0xF4}, /* 0x98-0x9B */
 	{0x99, 0xF5}, {0x99, 0xF6}, {0x99, 0xF7}, {0x99, 0xF8}, /* 0x9C-0x9F */
 	{0x99, 0xF9}, {0x76, 0x1B}, {0x76, 0x3C}, {0x76, 0x22}, /* 0xA0-0xA3 */
 	{0x76, 0x20}, {0x76, 0x40}, {0x76, 0x2D}, {0x76, 0x30}, /* 0xA4-0xA7 */
@@ -7690,7 +7692,7 @@
 	{0x80, 0x14}, {0x80, 0x16}, {0x80, 0x1C}, {0x80, 0x20}, /* 0xE8-0xEB */
 	{0x80, 0x22}, {0x80, 0x25}, {0x80, 0x26}, {0x80, 0x27}, /* 0xEC-0xEF */
 	{0x80, 0x29}, {0x80, 0x28}, {0x80, 0x31}, {0x80, 0x0B}, /* 0xF0-0xF3 */
-	{0x80, 0x35}, {0x80, 0x43}, {0x80, 0x46}, {0x80, 0x4D}, /* 0xF4-0xF7 */
+	{0x80, 0x35}, {0x80, 0x43}, {0xF9, 0xB0}, {0x80, 0x4D}, /* 0xF4-0xF7 */
 	{0x80, 0x52}, {0x80, 0x69}, {0x80, 0x71}, {0x89, 0x83}, /* 0xF8-0xFB */
 	{0x98, 0x78}, {0x98, 0x80}, {0x98, 0x83}, {0x00, 0x3F}, /* 0xFC-0xFF */
 };
@@ -7784,7 +7786,7 @@
 	{0x9A, 0x5E}, {0x9A, 0x5F}, {0x9A, 0x60}, {0x9A, 0x61}, /* 0x44-0x47 */
 	{0x9A, 0x62}, {0x9A, 0x63}, {0x9A, 0x64}, {0x9A, 0x65}, /* 0x48-0x4B */
 	{0x9A, 0x66}, {0x9A, 0x67}, {0x9A, 0x68}, {0x9A, 0x69}, /* 0x4C-0x4F */
-	{0x9A, 0x6A}, {0x9A, 0x6B}, {0x9A, 0x72}, {0x9A, 0x83}, /* 0x50-0x53 */
+	{0xF9, 0x87}, {0x9A, 0x6B}, {0x9A, 0x72}, {0x9A, 0x83}, /* 0x50-0x53 */
 	{0x9A, 0x89}, {0x9A, 0x8D}, {0x9A, 0x8E}, {0x9A, 0x94}, /* 0x54-0x57 */
 	{0x9A, 0x95}, {0x9A, 0x99}, {0x9A, 0xA6}, {0x9A, 0xA9}, /* 0x58-0x5B */
 	{0x9A, 0xAA}, {0x9A, 0xAB}, {0x9A, 0xAC}, {0x9A, 0xAD}, /* 0x5C-0x5F */
@@ -7817,7 +7819,7 @@
 	{0x7A, 0xFD}, {0x7B, 0x08}, {0x7B, 0x03}, {0x7B, 0x04}, /* 0xC4-0xC7 */
 	{0x7B, 0x15}, {0x7B, 0x0A}, {0x7B, 0x2B}, {0x7B, 0x0F}, /* 0xC8-0xCB */
 	{0x7B, 0x47}, {0x7B, 0x38}, {0x7B, 0x2A}, {0x7B, 0x19}, /* 0xCC-0xCF */
-	{0x7B, 0x2E}, {0x7B, 0x31}, {0x7B, 0x20}, {0x7B, 0x25}, /* 0xD0-0xD3 */
+	{0x7B, 0x2E}, {0x7B, 0x31}, {0xF9, 0xF8}, {0x7B, 0x25}, /* 0xD0-0xD3 */
 	{0x7B, 0x24}, {0x7B, 0x33}, {0x7B, 0x3E}, {0x7B, 0x1E}, /* 0xD4-0xD7 */
 	{0x7B, 0x58}, {0x7B, 0x5A}, {0x7B, 0x45}, {0x7B, 0x75}, /* 0xD8-0xDB */
 	{0x7B, 0x4C}, {0x7B, 0x5D}, {0x7B, 0x60}, {0x7B, 0x6E}, /* 0xDC-0xDF */
@@ -7870,7 +7872,7 @@
 	{0x9B, 0x63}, {0x9B, 0x64}, {0x9B, 0x65}, {0x9B, 0x66}, /* 0x88-0x8B */
 	{0x9B, 0x67}, {0x9B, 0x68}, {0x9B, 0x69}, {0x9B, 0x6A}, /* 0x8C-0x8F */
 	{0x9B, 0x6B}, {0x9B, 0x6C}, {0x9B, 0x6D}, {0x9B, 0x6E}, /* 0x90-0x93 */
-	{0x9B, 0x6F}, {0x9B, 0x70}, {0x9B, 0x71}, {0x9B, 0x72}, /* 0x94-0x97 */
+	{0xF9, 0x39}, {0x9B, 0x70}, {0x9B, 0x71}, {0x9B, 0x72}, /* 0x94-0x97 */
 	{0x9B, 0x73}, {0x9B, 0x74}, {0x9B, 0x75}, {0x9B, 0x76}, /* 0x98-0x9B */
 	{0x9B, 0x77}, {0x9B, 0x78}, {0x9B, 0x79}, {0x9B, 0x7A}, /* 0x9C-0x9F */
 	{0x9B, 0x7B}, {0x7C, 0x1F}, {0x7C, 0x2A}, {0x7C, 0x26}, /* 0xA0-0xA3 */
@@ -7946,7 +7948,7 @@
 	{0x91, 0x72}, {0x91, 0x74}, {0x91, 0x79}, {0x91, 0x8C}, /* 0xA8-0xAB */
 	{0x91, 0x85}, {0x91, 0x90}, {0x91, 0x8D}, {0x91, 0x91}, /* 0xAC-0xAF */
 	{0x91, 0xA2}, {0x91, 0xA3}, {0x91, 0xAA}, {0x91, 0xAD}, /* 0xB0-0xB3 */
-	{0x91, 0xAE}, {0x91, 0xAF}, {0x91, 0xB5}, {0x91, 0xB4}, /* 0xB4-0xB7 */
+	{0x91, 0xAE}, {0x91, 0xAF}, {0x91, 0xB5}, {0xF9, 0xB7}, /* 0xB4-0xB7 */
 	{0x91, 0xBA}, {0x8C, 0x55}, {0x9E, 0x7E}, {0x8D, 0xB8}, /* 0xB8-0xBB */
 	{0x8D, 0xEB}, {0x8E, 0x05}, {0x8E, 0x59}, {0x8E, 0x69}, /* 0xBC-0xBF */
 	{0x8D, 0xB5}, {0x8D, 0xBF}, {0x8D, 0xBC}, {0x8D, 0xBA}, /* 0xC0-0xC3 */
@@ -8058,7 +8060,7 @@
 	{0x9C, 0x48}, {0x9C, 0x49}, {0x9C, 0x4A}, {0x9C, 0x4B}, /* 0x4C-0x4F */
 	{0x9C, 0x4C}, {0x9C, 0x4D}, {0x9C, 0x4E}, {0x9C, 0x4F}, /* 0x50-0x53 */
 	{0x9C, 0x50}, {0x9C, 0x51}, {0x9C, 0x52}, {0x9C, 0x53}, /* 0x54-0x57 */
-	{0x9C, 0x54}, {0x9C, 0x55}, {0x9C, 0x56}, {0x9C, 0x57}, /* 0x58-0x5B */
+	{0x9C, 0x54}, {0x9C, 0x55}, {0x9C, 0x56}, {0xF9, 0xF2}, /* 0x58-0x5B */
 	{0x9C, 0x58}, {0x9C, 0x59}, {0x9C, 0x5A}, {0x9C, 0x5B}, /* 0x5C-0x5F */
 	{0x9C, 0x5C}, {0x9C, 0x5D}, {0x9C, 0x5E}, {0x9C, 0x5F}, /* 0x60-0x63 */
 	{0x9C, 0x60}, {0x9C, 0x61}, {0x9C, 0x62}, {0x9C, 0x63}, /* 0x64-0x67 */
@@ -8095,7 +8097,7 @@
 	{0x9B, 0x08}, {0x9B, 0x0F}, {0x9B, 0x13}, {0x9B, 0x1F}, /* 0xDC-0xDF */
 	{0x9B, 0x23}, {0x9E, 0xBD}, {0x9E, 0xBE}, {0x7E, 0x3B}, /* 0xE0-0xE3 */
 	{0x9E, 0x82}, {0x9E, 0x87}, {0x9E, 0x88}, {0x9E, 0x8B}, /* 0xE4-0xE7 */
-	{0x9E, 0x92}, {0x93, 0xD6}, {0x9E, 0x9D}, {0x9E, 0x9F}, /* 0xE8-0xEB */
+	{0x9E, 0x92}, {0x93, 0xD6}, {0x9E, 0x9D}, {0xF9, 0xF3}, /* 0xE8-0xEB */
 	{0x9E, 0xDB}, {0x9E, 0xDC}, {0x9E, 0xDD}, {0x9E, 0xE0}, /* 0xEC-0xEF */
 	{0x9E, 0xDF}, {0x9E, 0xE2}, {0x9E, 0xE9}, {0x9E, 0xE7}, /* 0xF0-0xF3 */
 	{0x9E, 0xE5}, {0x9E, 0xEA}, {0x9E, 0xEF}, {0x9F, 0x22}, /* 0xF4-0xF7 */
@@ -8260,7 +8262,7 @@
 	{0x9D, 0xA7}, {0x9D, 0xA8}, {0x9D, 0xA9}, {0x9D, 0xAA}, /* 0x44-0x47 */
 	{0x9D, 0xAB}, {0x9D, 0xAC}, {0x9D, 0xAD}, {0x9D, 0xAE}, /* 0x48-0x4B */
 	{0x9D, 0xAF}, {0x9D, 0xB0}, {0x9D, 0xB1}, {0x9D, 0xB2}, /* 0x4C-0x4F */
-	{0x9D, 0xB3}, {0x9D, 0xB4}, {0x9D, 0xB5}, {0x9D, 0xB6}, /* 0x50-0x53 */
+	{0x9D, 0xB3}, {0xFA, 0x2D}, {0x9D, 0xB5}, {0x9D, 0xB6}, /* 0x50-0x53 */
 	{0x9D, 0xB7}, {0x9D, 0xB8}, {0x9D, 0xB9}, {0x9D, 0xBA}, /* 0x54-0x57 */
 	{0x9D, 0xBB}, {0x9D, 0xBC}, {0x9D, 0xBD}, {0x9D, 0xBE}, /* 0x58-0x5B */
 	{0x9D, 0xBF}, {0x9D, 0xC0}, {0x9D, 0xC1}, {0x9D, 0xC2}, /* 0x5C-0x5F */
@@ -8279,7 +8281,7 @@
 	{0x9D, 0xEE}, {0x9D, 0xEF}, {0x9D, 0xF0}, {0x9D, 0xF1}, /* 0x8C-0x8F */
 	{0x9D, 0xF2}, {0x9D, 0xF3}, {0x9D, 0xF4}, {0x9D, 0xF5}, /* 0x90-0x93 */
 	{0x9D, 0xF6}, {0x9D, 0xF7}, {0x9D, 0xF8}, {0x9D, 0xF9}, /* 0x94-0x97 */
-	{0x9D, 0xFA}, {0x9D, 0xFB}, {0x9D, 0xFC}, {0x9D, 0xFD}, /* 0x98-0x9B */
+	{0xF9, 0x3A}, {0x9D, 0xFB}, {0x9D, 0xFC}, {0x9D, 0xFD}, /* 0x98-0x9B */
 	{0x9D, 0xFE}, {0x9D, 0xFF}, {0x9E, 0x00}, {0x9E, 0x01}, /* 0x9C-0x9F */
 	{0x9E, 0x02}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xA0-0xA3 */
 	{0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xA4-0xA7 */
@@ -8330,7 +8332,7 @@
 	{0x9E, 0x0F}, {0x9E, 0x10}, {0x9E, 0x11}, {0x9E, 0x12}, /* 0x4C-0x4F */
 	{0x9E, 0x13}, {0x9E, 0x14}, {0x9E, 0x15}, {0x9E, 0x16}, /* 0x50-0x53 */
 	{0x9E, 0x17}, {0x9E, 0x18}, {0x9E, 0x19}, {0x9E, 0x1A}, /* 0x54-0x57 */
-	{0x9E, 0x1B}, {0x9E, 0x1C}, {0x9E, 0x1D}, {0x9E, 0x1E}, /* 0x58-0x5B */
+	{0x9E, 0x1B}, {0x9E, 0x1C}, {0x9E, 0x1D}, {0xF9, 0x20}, /* 0x58-0x5B */
 	{0x9E, 0x24}, {0x9E, 0x27}, {0x9E, 0x2E}, {0x9E, 0x30}, /* 0x5C-0x5F */
 	{0x9E, 0x34}, {0x9E, 0x3B}, {0x9E, 0x3C}, {0x9E, 0x40}, /* 0x60-0x63 */
 	{0x9E, 0x4D}, {0x9E, 0x50}, {0x9E, 0x52}, {0x9E, 0x53}, /* 0x64-0x67 */
@@ -8345,7 +8347,7 @@
 	{0x9E, 0x86}, {0x9E, 0x89}, {0x9E, 0x8A}, {0x9E, 0x8C}, /* 0x84-0x87 */
 	{0x9E, 0x8D}, {0x9E, 0x8E}, {0x9E, 0x8F}, {0x9E, 0x90}, /* 0x88-0x8B */
 	{0x9E, 0x91}, {0x9E, 0x94}, {0x9E, 0x95}, {0x9E, 0x96}, /* 0x8C-0x8F */
-	{0x9E, 0x97}, {0x9E, 0x98}, {0x9E, 0x99}, {0x9E, 0x9A}, /* 0x90-0x93 */
+	{0xF9, 0x88}, {0x9E, 0x98}, {0x9E, 0x99}, {0x9E, 0x9A}, /* 0x90-0x93 */
 	{0x9E, 0x9B}, {0x9E, 0x9C}, {0x9E, 0x9E}, {0x9E, 0xA0}, /* 0x94-0x97 */
 	{0x9E, 0xA1}, {0x9E, 0xA2}, {0x9E, 0xA3}, {0x9E, 0xA4}, /* 0x98-0x9B */
 	{0x9E, 0xA5}, {0x9E, 0xA7}, {0x9E, 0xA8}, {0x9E, 0xA9}, /* 0x9C-0x9F */
@@ -8479,10 +8481,10 @@
 	
 	{0x9F, 0x79}, {0x9F, 0x7A}, {0x9F, 0x7B}, {0x9F, 0x7C}, /* 0x80-0x83 */
 	{0x9F, 0x7D}, {0x9F, 0x7E}, {0x9F, 0x81}, {0x9F, 0x82}, /* 0x84-0x87 */
-	{0x9F, 0x8D}, {0x9F, 0x8E}, {0x9F, 0x8F}, {0x9F, 0x90}, /* 0x88-0x8B */
+	{0xF9, 0xC4}, {0x9F, 0x8E}, {0x9F, 0x8F}, {0x9F, 0x90}, /* 0x88-0x8B */
 	{0x9F, 0x91}, {0x9F, 0x92}, {0x9F, 0x93}, {0x9F, 0x94}, /* 0x8C-0x8F */
 	{0x9F, 0x95}, {0x9F, 0x96}, {0x9F, 0x97}, {0x9F, 0x98}, /* 0x90-0x93 */
-	{0x9F, 0x9C}, {0x9F, 0x9D}, {0x9F, 0x9E}, {0x9F, 0xA1}, /* 0x94-0x97 */
+	{0xF9, 0x08}, {0x9F, 0x9D}, {0x9F, 0x9E}, {0x9F, 0xA1}, /* 0x94-0x97 */
 	{0x9F, 0xA2}, {0x9F, 0xA3}, {0x9F, 0xA4}, {0x9F, 0xA5}, /* 0x98-0x9B */
 	{0xF9, 0x2C}, {0xF9, 0x79}, {0xF9, 0x95}, {0xF9, 0xE7}, /* 0x9C-0x9F */
 	{0xF9, 0xF1}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xA0-0xA3 */
@@ -8615,17 +8617,17 @@
 };
 
 static unsigned char u2c_01[512] = {
-	0x3F, 0x3F, 0xA8, 0xA1, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */
+	0xA8, 0xA1, 0xA8, 0xA1, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x04-0x07 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x08-0x0B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xA8, 0xA5, /* 0x10-0x13 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xA8, 0xA5, 0xA8, 0xA5, /* 0x10-0x13 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xA8, 0xA7, /* 0x18-0x1B */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xA8, 0xA7, 0xA8, 0xA7, /* 0x18-0x1B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xA8, 0xA9, /* 0x28-0x2B */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xA8, 0xA9, 0xA8, 0xA9, /* 0x28-0x2B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */
@@ -8634,14 +8636,14 @@
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */
 	0xA8, 0xBD, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */
 	0xA8, 0xBE, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */
-	0x3F, 0x3F, 0xA8, 0xAD, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x4C-0x4F */
+	0xA8, 0xAD, 0xA8, 0xAD, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x4C-0x4F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x5C-0x5F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x60-0x63 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xA8, 0xB1, /* 0x68-0x6B */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xA8, 0xB1, 0xA8, 0xB1, /* 0x68-0x6B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x74-0x77 */
@@ -8664,13 +8666,13 @@
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */
+	0x3F, 0x3F, 0xA1, 0xCE, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC4-0xC7 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC8-0xCB */
-	0x3F, 0x3F, 0x3F, 0x3F, 0xA8, 0xA3, 0x3F, 0x3F, /* 0xCC-0xCF */
-	0xA8, 0xAB, 0x3F, 0x3F, 0xA8, 0xAF, 0x3F, 0x3F, /* 0xD0-0xD3 */
-	0xA8, 0xB3, 0x3F, 0x3F, 0xA8, 0xB5, 0x3F, 0x3F, /* 0xD4-0xD7 */
-	0xA8, 0xB6, 0x3F, 0x3F, 0xA8, 0xB7, 0x3F, 0x3F, /* 0xD8-0xDB */
+	0x3F, 0x3F, 0xA8, 0xA3, 0xA8, 0xA3, 0xA8, 0xAB, /* 0xCC-0xCF */
+	0xA8, 0xAB, 0xA8, 0xAF, 0xA8, 0xAF, 0xA8, 0xB3, /* 0xD0-0xD3 */
+	0xA8, 0xB3, 0xA8, 0xB5, 0xA8, 0xB5, 0xA8, 0xB6, /* 0xD4-0xD7 */
+	0xA8, 0xB6, 0xA8, 0xB7, 0xA8, 0xB7, 0xA8, 0xB8, /* 0xD8-0xDB */
 	0xA8, 0xB8, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xDC-0xDF */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */
@@ -8902,7 +8904,7 @@
 	0xA1, 0xEB, 0x3F, 0x3F, 0xA1, 0xE4, 0xA1, 0xE5, /* 0x30-0x33 */
 	0x3F, 0x3F, 0xA8, 0x46, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xA1, 0xF9, /* 0x38-0x3B */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xA3, 0xFE, 0x3F, 0x3F, /* 0x3C-0x3F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */
@@ -9029,7 +9031,7 @@
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xA1, 0xC7, /* 0x0C-0x0F */
 	0x3F, 0x3F, 0xA1, 0xC6, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */
 	0x3F, 0x3F, 0xA8, 0x4D, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0xA1, 0xCC, 0x3F, 0x3F, /* 0x18-0x1B */
+	0xA1, 0xE3, 0x3F, 0x3F, 0xA1, 0xCC, 0x3F, 0x3F, /* 0x18-0x1B */
 	0x3F, 0x3F, 0xA1, 0xD8, 0xA1, 0xDE, 0xA8, 0x4E, /* 0x1C-0x1F */
 	0xA1, 0xCF, 0x3F, 0x3F, 0x3F, 0x3F, 0xA8, 0x4F, /* 0x20-0x23 */
 	0x3F, 0x3F, 0xA1, 0xCE, 0x3F, 0x3F, 0xA1, 0xC4, /* 0x24-0x27 */
@@ -9038,7 +9040,7 @@
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */
 	0xA1, 0xE0, 0xA1, 0xDF, 0xA1, 0xC3, 0xA1, 0xCB, /* 0x34-0x37 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x38-0x3B */
-	0x3F, 0x3F, 0xA1, 0xD7, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */
+	0xA1, 0xAB, 0xA1, 0xD7, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */
 	0xA1, 0xD6, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */
@@ -9468,10 +9470,10 @@
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x88-0x8B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xD2, 0xBB, 0xB6, 0xFE, /* 0x90-0x93 */
+	0xC8, 0xFD, 0xCB, 0xC4, 0xC9, 0xCF, 0xD6, 0xD0, /* 0x94-0x97 */
+	0xCF, 0xC2, 0xBC, 0xD7, 0xD2, 0xD2, 0xB1, 0xFB, /* 0x98-0x9B */
+	0xB6, 0xA1, 0xCC, 0xEC, 0xB5, 0xD8, 0xC8, 0xCB, /* 0x9C-0x9F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */
@@ -9509,13 +9511,13 @@
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */
 	0xA2, 0xE5, 0xA2, 0xE6, 0xA2, 0xE7, 0xA2, 0xE8, /* 0x20-0x23 */
 	0xA2, 0xE9, 0xA2, 0xEA, 0xA2, 0xEB, 0xA2, 0xEC, /* 0x24-0x27 */
-	0xA2, 0xED, 0xA2, 0xEE, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */
-	0x3F, 0x3F, 0xA9, 0x5A, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x38-0x3B */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */
+	0xA2, 0xED, 0xA2, 0xEE, 0xD4, 0xC2, 0xBB, 0xF0, /* 0x28-0x2B */
+	0xCB, 0xAE, 0xC4, 0xBE, 0xBD, 0xF0, 0xCD, 0xC1, /* 0x2C-0x2F */
+	0xC8, 0xD5, 0xA9, 0x5A, 0xD3, 0xD0, 0xC9, 0xE7, /* 0x30-0x33 */
+	0xC3, 0xFB, 0xCC, 0xD8, 0xB2, 0xC6, 0xD7, 0xA3, /* 0x34-0x37 */
+	0xC0, 0xCD, 0xB4, 0xFA, 0xBA, 0xF4, 0xD1, 0xA7, /* 0x38-0x3B */
+	0xBC, 0xE0, 0xC6, 0xF3, 0xD7, 0xCA, 0xD0, 0xAD, /* 0x3C-0x3F */
+	0xBC, 0xC0, 0xD0, 0xDD, 0xD7, 0xD4, 0xD6, 0xC1, /* 0x40-0x43 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x4C-0x4F */
@@ -9532,19 +9534,19 @@
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */
 	
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x88-0x8B */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xA9, 0x49, /* 0xA0-0xA3 */
+	0xD2, 0xBB, 0xB6, 0xFE, 0xC8, 0xFD, 0xCB, 0xC4, /* 0x80-0x83 */
+	0xCE, 0xE5, 0xC1, 0xF9, 0xC6, 0xDF, 0xB0, 0xCB, /* 0x84-0x87 */
+	0xBE, 0xC5, 0xCA, 0xAE, 0xD4, 0xC2, 0xBB, 0xF0, /* 0x88-0x8B */
+	0xCB, 0xAE, 0xC4, 0xBE, 0xBD, 0xF0, 0xCD, 0xC1, /* 0x8C-0x8F */
+	0xC8, 0xD5, 0xD6, 0xEA, 0xD3, 0xD0, 0xC9, 0xE7, /* 0x90-0x93 */
+	0xC3, 0xFB, 0xCC, 0xD8, 0xB2, 0xC6, 0xD7, 0xA3, /* 0x94-0x97 */
+	0xC0, 0xCD, 0xC3, 0xD8, 0xC4, 0xD0, 0xC5, 0xAE, /* 0x98-0x9B */
+	0xCA, 0xCA, 0xD3, 0xC5, 0x3F, 0x3F, 0xD7, 0xA2, /* 0x9C-0x9F */
+	0xCF, 0xEE, 0xD0, 0xDD, 0xD0, 0xB4, 0xA9, 0x49, /* 0xA0-0xA3 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB0-0xB3 */
+	0x3F, 0x3F, 0xD2, 0xBD, 0xD7, 0xDA, 0xD1, 0xA7, /* 0xA8-0xAB */
+	0xBC, 0xE0, 0xC6, 0xF3, 0xD7, 0xCA, 0xD0, 0xAD, /* 0xAC-0xAF */
+	0xD2, 0xB9, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB0-0xB3 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */
@@ -15210,7 +15212,7 @@
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */
 };
 
-static unsigned char u2c_F9[512] = {
+static unsigned char u2c_DC[512] = {
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x04-0x07 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x08-0x0B */
@@ -15222,7 +15224,7 @@
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */
-	0xFD, 0x9C, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x38-0x3B */
@@ -15241,7 +15243,7 @@
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x74-0x77 */
-	0x3F, 0x3F, 0xFD, 0x9D, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */
 	
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */
@@ -15249,7 +15251,7 @@
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x88-0x8B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */
-	0x3F, 0x3F, 0xFD, 0x9E, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */
@@ -15269,28 +15271,96 @@
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xDC-0xDF */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xFD, 0x9F, /* 0xE4-0xE7 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */
-	0x3F, 0x3F, 0xFD, 0xA0, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF8-0xFB */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */
 };
 
+static unsigned char u2c_F9[512] = {
+	0xD8, 0x4D, 0xB8, 0xFC, 0xDC, 0x87, 0xD9, 0x5A, /* 0x00-0x03 */
+	0xBB, 0xAC, 0xB4, 0xAE, 0xBE, 0xE4, 0xFD, 0x94, /* 0x04-0x07 */
+	0xFD, 0x94, 0xC6, 0xF5, 0xBD, 0xF0, 0xC0, 0xAE, /* 0x08-0x0B */
+	0xC4, 0xCE, 0x91, 0xD0, 0xB0, 0x5D, 0xC1, 0x5F, /* 0x0C-0x0F */
+	0xCC, 0x7D, 0xC2, 0xDD, 0xC2, 0xE3, 0xDF, 0x89, /* 0x10-0x13 */
+	0x98, 0xB7, 0xC2, 0xE5, 0xC0, 0xD3, 0xE7, 0xF3, /* 0x14-0x17 */
+	0xC2, 0xE4, 0xC0, 0xD2, 0xF1, 0x98, 0x81, 0x79, /* 0x18-0x1B */
+	0xC2, 0xD1, 0x99, 0xDA, 0xA0, 0x80, 0xCC, 0x6D, /* 0x1C-0x1F */
+	0xFB, 0x5B, 0x8D, 0xB9, 0x9E, 0x45, 0xCB, 0x7B, /* 0x20-0x23 */
+	0xD2, 0x68, 0xC0, 0xAD, 0xC5, 0x44, 0xCF, 0x9E, /* 0x24-0x27 */
+	0xC0, 0xC8, 0xC0, 0xCA, 0xC0, 0xCB, 0xC0, 0xC7, /* 0x28-0x2B */
+	0xFD, 0x9C, 0x81, 0xED, 0xC0, 0xE4, 0x84, 0xDA, /* 0x2C-0x2F */
+	0x93, 0xEF, 0x99, 0xA9, 0xA0, 0x74, 0xB1, 0x52, /* 0x30-0x33 */
+	0xC0, 0xCF, 0xCC, 0x4A, 0xCC, 0x94, 0xC2, 0xB7, /* 0x34-0x37 */
+	0xC2, 0xB6, 0xF4, 0x94, 0xFA, 0x98, 0xC2, 0xB5, /* 0x38-0x3B */
+	0xB5, 0x93, 0xBE, 0x47, 0xC7, 0x8A, 0xE4, 0x9B, /* 0x3C-0x3F */
+	0xC2, 0xB9, 0xD5, 0x93, 0x89, 0xC5, 0xC5, 0xAA, /* 0x40-0x43 */
+	0xBB, 0x5C, 0xC3, 0x40, 0xC0, 0xCE, 0xC0, 0xDA, /* 0x44-0x47 */
+	0xD9, 0x54, 0xC0, 0xD7, 0x89, 0xBE, 0x8C, 0xD2, /* 0x48-0x4B */
+	0x98, 0xC7, 0x9C, 0x49, 0xC2, 0xA9, 0xC0, 0xDB, /* 0x4C-0x4F */
+	0xBF, 0x7C, 0xC2, 0xAA, 0xC0, 0xD5, 0xC0, 0xDF, /* 0x50-0x53 */
+	0x84, 0x43, 0xC1, 0xE8, 0xB6, 0xA0, 0xBE, 0x63, /* 0x54-0x57 */
+	0xC1, 0xE2, 0xC1, 0xEA, 0xD7, 0x78, 0x92, 0x82, /* 0x58-0x5B */
+	0x98, 0xB7, 0xD6, 0x5A, 0xB5, 0xA4, 0x8C, 0x8E, /* 0x5C-0x5F */
+	0xC5, 0xAD, 0xC2, 0xCA, 0xAE, 0x90, 0xB1, 0xB1, /* 0x60-0x63 */
+	0xB4, 0x91, 0xB1, 0xE3, 0x8F, 0xCD, 0xB2, 0xBB, /* 0x64-0x67 */
+	0xC3, 0xDA, 0x94, 0xB5, 0xCB, 0xF7, 0x85, 0xA2, /* 0x68-0x6B */
+	0xC8, 0xFB, 0xCA, 0xA1, 0xC8, 0x7E, 0xD5, 0x66, /* 0x6C-0x6F */
+	0x9A, 0xA2, 0xB3, 0xBD, 0xC9, 0xF2, 0xCA, 0xB0, /* 0x70-0x73 */
+	0xC8, 0xF4, 0xC2, 0xD3, 0xC2, 0xD4, 0xC1, 0xC1, /* 0x74-0x77 */
+	0x83, 0xC9, 0xFD, 0x9D, 0xC1, 0xBA, 0xBC, 0x5A, /* 0x78-0x7B */
+	0xC1, 0xBC, 0xD5, 0x8F, 0xC1, 0xBF, 0x84, 0xEE, /* 0x7C-0x7F */
+	
+	0x85, 0xCE, 0xC5, 0xAE, 0x8F, 0x5D, 0xC2, 0xC3, /* 0x80-0x83 */
+	0x9E, 0x56, 0xB5, 0x5A, 0xE9, 0x82, 0xF3, 0x50, /* 0x84-0x87 */
+	0xFB, 0x90, 0xC0, 0xE8, 0xC1, 0xA6, 0x95, 0xD1, /* 0x88-0x8B */
+	0x9A, 0x76, 0xDE, 0x5D, 0xC4, 0xEA, 0x91, 0x7A, /* 0x8C-0x8F */
+	0x91, 0xD9, 0x93, 0xD3, 0x9D, 0x69, 0x9F, 0x92, /* 0x90-0x93 */
+	0xAD, 0x49, 0xFD, 0x9E, 0xBE, 0x9A, 0xC2, 0x93, /* 0x94-0x97 */
+	0xDD, 0x82, 0xC9, 0x8F, 0xDF, 0x42, 0xE5, 0x80, /* 0x98-0x9B */
+	0xC1, 0xD0, 0xC1, 0xD3, 0xD1, 0xCA, 0xC1, 0xD2, /* 0x9C-0x9F */
+	0xC1, 0xD1, 0xD5, 0x66, 0xC1, 0xAE, 0xC4, 0xEE, /* 0xA0-0xA3 */
+	0xC4, 0xED, 0x9A, 0x9A, 0xBA, 0x9F, 0xAB, 0x43, /* 0xA4-0xA7 */
+	0xC1, 0xEE, 0xE0, 0xF2, 0x8C, 0x8E, 0x8E, 0x58, /* 0xA8-0xAB */
+	0xC1, 0xAF, 0xC1, 0xE1, 0xAC, 0x93, 0xC1, 0xE7, /* 0xAC-0xAF */
+	0xF1, 0xF6, 0xE2, 0x8F, 0xC1, 0xE3, 0xEC, 0x60, /* 0xB0-0xB3 */
+	0xEE, 0x49, 0xC0, 0xFD, 0xB6, 0x59, 0xF5, 0xB7, /* 0xB4-0xB7 */
+	0xEB, 0x60, 0x90, 0xBA, 0xC1, 0xCB, 0xC1, 0xC5, /* 0xB8-0xBB */
+	0xE5, 0xBC, 0xC4, 0xF2, 0xC1, 0xCF, 0x98, 0xB7, /* 0xBC-0xBF */
+	0xC1, 0xC7, 0xAF, 0x9F, 0xDE, 0xA4, 0xDF, 0x7C, /* 0xC0-0xC3 */
+	0xFD, 0x88, 0x95, 0x9E, 0xC8, 0xEE, 0x84, 0xA2, /* 0xC4-0xC7 */
+	0x96, 0x83, 0xC1, 0xF8, 0xC1, 0xF7, 0xC1, 0xEF, /* 0xC8-0xCB */
+	0xC1, 0xF0, 0xC1, 0xF4, 0xC1, 0xF2, 0xBC, 0x7E, /* 0xCC-0xCF */
+	0xEE, 0x90, 0xC1, 0xF9, 0xC2, 0xBE, 0xEA, 0x91, /* 0xD0-0xD3 */
+	0x82, 0x90, 0x8D, 0x91, 0x9C, 0x53, 0xDD, 0x86, /* 0xD4-0xD7 */
+	0xC2, 0xC9, 0x90, 0xFC, 0xC0, 0xF5, 0xC2, 0xCA, /* 0xD8-0xDB */
+	0xC2, 0xA1, 0xC0, 0xFB, 0xC0, 0xF4, 0xC2, 0xC4, /* 0xDC-0xDF */
+	0xD2, 0xD7, 0xC0, 0xEE, 0xC0, 0xE6, 0xC4, 0xE0, /* 0xE0-0xE3 */
+	0xC0, 0xED, 0xC1, 0xA1, 0xEE, 0xBE, 0xFD, 0x9F, /* 0xE4-0xE7 */
+	0xD1, 0x65, 0xC0, 0xEF, 0xEB, 0x78, 0xC4, 0xE4, /* 0xE8-0xEB */
+	0xC4, 0xE7, 0xC1, 0xDF, 0x9F, 0xFB, 0xAD, 0x55, /* 0xEC-0xEF */
+	0xCC, 0x41, 0xFD, 0xA0, 0xF7, 0x5B, 0xF7, 0xEB, /* 0xF0-0xF3 */
+	0xC1, 0xD6, 0xC1, 0xDC, 0xC5, 0x52, 0xC1, 0xA2, /* 0xF4-0xF7 */
+	0xF3, 0xD2, 0xC1, 0xA3, 0xA0, 0xEE, 0xD6, 0xCB, /* 0xF8-0xFB */
+	0xD7, 0x52, 0xCA, 0xB2, 0xB2, 0xE8, 0xB4, 0xCC, /* 0xFC-0xFF */
+};
+
 static unsigned char u2c_FA[512] = {
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x04-0x07 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x08-0x0B */
+	0xC7, 0xD0, 0xB6, 0xC8, 0xCD, 0xD8, 0xCC, 0xC7, /* 0x00-0x03 */
+	0xD5, 0xAC, 0xB6, 0xB4, 0xB1, 0xA9, 0xDD, 0x97, /* 0x04-0x07 */
+	0xD0, 0xD0, 0xBD, 0xB5, 0xD2, 0x8A, 0xC0, 0xAA, /* 0x08-0x0B */
 	0xFE, 0x40, 0xFE, 0x41, 0xFE, 0x42, 0xFE, 0x43, /* 0x0C-0x0F */
-	0x3F, 0x3F, 0xFE, 0x44, 0x3F, 0x3F, 0xFE, 0x45, /* 0x10-0x13 */
-	0xFE, 0x46, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */
-	0xFE, 0x47, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x18-0x1B */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xFE, 0x48, /* 0x1C-0x1F */
-	0xFE, 0x49, 0xFE, 0x4A, 0x3F, 0x3F, 0xFE, 0x4B, /* 0x20-0x23 */
-	0xFE, 0x4C, 0x3F, 0x3F, 0x3F, 0x3F, 0xFE, 0x4D, /* 0x24-0x27 */
-	0xFE, 0x4E, 0xFE, 0x4F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */
+	0x89, 0x56, 0xFE, 0x44, 0xC7, 0xE7, 0xFE, 0x45, /* 0x10-0x13 */
+	0xFE, 0x46, 0x84, 0x44, 0xD8, 0x69, 0xD2, 0xE6, /* 0x14-0x17 */
+	0xFE, 0x47, 0xC9, 0xF1, 0xCF, 0xE9, 0xB8, 0xA3, /* 0x18-0x1B */
+	0xBE, 0xB8, 0xBE, 0xAB, 0xD3, 0xF0, 0xFE, 0x48, /* 0x1C-0x1F */
+	0xFE, 0x49, 0xFE, 0x4A, 0xD6, 0x54, 0xFE, 0x4B, /* 0x20-0x23 */
+	0xFE, 0x4C, 0xD2, 0xDD, 0xB6, 0xBC, 0xFE, 0x4D, /* 0x24-0x27 */
+	0xFE, 0x4E, 0xFE, 0x4F, 0xEF, 0x88, 0xEF, 0x95, /* 0x28-0x2B */
+	0xF0, 0x5E, 0xFA, 0x51, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x38-0x3B */
@@ -15510,7 +15580,7 @@
 	NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   
 	NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   
 	NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   
-	NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   
+	NULL,   NULL,   NULL,   NULL,   u2c_DC, NULL,   NULL,   NULL,   
 	NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   
 	NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   
 	NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   
@@ -15522,6 +15592,7 @@
 
 	if (boundlen <= 0)
 		return;
+
 	uni2charset = page_uni2charset[ch];
 	*outlen = 0;
 	if (uni2charset){
@@ -15545,6 +15616,7 @@
 
 	ch = rawstring[0];
 	cl = rawstring[1];
+
 	charset2uni = page_charset2uni[ch];
 	if (charset2uni && cl){
 		*uni1 = charset2uni[cl].uni2;
@@ -15577,20 +15649,34 @@
 	NULL
 };
 
+static struct nls_table alias_table = {
+	"gb2312",
+	uni2char,
+	char2uni,
+	inc_use_count,
+	dec_use_count,
+	NULL
+};
+
+
 int __init init_nls_cp936(void)
 {
+	register_nls(&alias_table);
 	return register_nls(&table);
 }
 
 #ifdef MODULE
 int init_module(void)
 {
+
 	return init_nls_cp936();
 }
 
 
 void cleanup_module(void)
 {
+
+	unregister_nls(&alias_table);
 	unregister_nls(&table);
 	return;
 }
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/fs/nls/nls_cp949.c linux.17p9/fs/nls/nls_cp949.c
--- linux.vanilla/fs/nls/nls_cp949.c	Sun Jun 11 21:44:21 2000
+++ linux.17p9/fs/nls/nls_cp949.c	Sun Jun 11 22:11:27 2000
@@ -2,7 +2,9 @@
  * linux/fs/nls_cp949.c
  *
  * Charset cp949 translation tables.
- * Generated automatically from the Microsoft
+ * This translation table was generated automatically, the
+ * original table can be download from the Microsoft website.
+ * (http://www.microsoft.com/typography/unicode/unicodecp.htm)
  */
 
 #include <linux/module.h>
@@ -2433,20 +2435,20 @@
 	{0xCA, 0x3A}, {0xCA, 0x3B}, {0xCA, 0x3C}, {0xCA, 0x3D}, /* 0x94-0x97 */
 	{0xCA, 0x3E}, {0xCA, 0x3F}, {0xCA, 0x40}, {0xCA, 0x41}, /* 0x98-0x9B */
 	{0xCA, 0x42}, {0xCA, 0x43}, {0xCA, 0x44}, {0xCA, 0x45}, /* 0x9C-0x9F */
-	{0xCA, 0x46}, {0x31, 0x31}, {0x31, 0x32}, {0x31, 0x33}, /* 0xA0-0xA3 */
-	{0x31, 0x34}, {0x31, 0x35}, {0x31, 0x36}, {0x31, 0x37}, /* 0xA4-0xA7 */
-	{0x31, 0x38}, {0x31, 0x39}, {0x31, 0x3A}, {0x31, 0x3B}, /* 0xA8-0xAB */
-	{0x31, 0x3C}, {0x31, 0x3D}, {0x31, 0x3E}, {0x31, 0x3F}, /* 0xAC-0xAF */
-	{0x31, 0x40}, {0x31, 0x41}, {0x31, 0x42}, {0x31, 0x43}, /* 0xB0-0xB3 */
-	{0x31, 0x44}, {0x31, 0x45}, {0x31, 0x46}, {0x31, 0x47}, /* 0xB4-0xB7 */
-	{0x31, 0x48}, {0x31, 0x49}, {0x31, 0x4A}, {0x31, 0x4B}, /* 0xB8-0xBB */
-	{0x31, 0x4C}, {0x31, 0x4D}, {0x31, 0x4E}, {0x31, 0x4F}, /* 0xBC-0xBF */
-	{0x31, 0x50}, {0x31, 0x51}, {0x31, 0x52}, {0x31, 0x53}, /* 0xC0-0xC3 */
-	{0x31, 0x54}, {0x31, 0x55}, {0x31, 0x56}, {0x31, 0x57}, /* 0xC4-0xC7 */
-	{0x31, 0x58}, {0x31, 0x59}, {0x31, 0x5A}, {0x31, 0x5B}, /* 0xC8-0xCB */
-	{0x31, 0x5C}, {0x31, 0x5D}, {0x31, 0x5E}, {0x31, 0x5F}, /* 0xCC-0xCF */
-	{0x31, 0x60}, {0x31, 0x61}, {0x31, 0x62}, {0x31, 0x63}, /* 0xD0-0xD3 */
-	{0x31, 0x64}, {0x31, 0x65}, {0x31, 0x66}, {0x31, 0x67}, /* 0xD4-0xD7 */
+	{0xCA, 0x46}, {0xFF, 0xA1}, {0xFF, 0xA2}, {0xFF, 0xA3}, /* 0xA0-0xA3 */
+	{0xFF, 0xA4}, {0xFF, 0xA5}, {0xFF, 0xA6}, {0xFF, 0xA7}, /* 0xA4-0xA7 */
+	{0xFF, 0xA8}, {0xFF, 0xA9}, {0xFF, 0xAA}, {0xFF, 0xAB}, /* 0xA8-0xAB */
+	{0xFF, 0xAC}, {0xFF, 0xAD}, {0xFF, 0xAE}, {0xFF, 0xAF}, /* 0xAC-0xAF */
+	{0xFF, 0xB0}, {0xFF, 0xB1}, {0xFF, 0xB2}, {0xFF, 0xB3}, /* 0xB0-0xB3 */
+	{0xFF, 0xB4}, {0xFF, 0xB5}, {0xFF, 0xB6}, {0xFF, 0xB7}, /* 0xB4-0xB7 */
+	{0xFF, 0xB8}, {0xFF, 0xB9}, {0xFF, 0xBA}, {0xFF, 0xBB}, /* 0xB8-0xBB */
+	{0xFF, 0xBC}, {0xFF, 0xBD}, {0xFF, 0xBE}, {0xFF, 0xC2}, /* 0xBC-0xBF */
+	{0xFF, 0xC3}, {0xFF, 0xC4}, {0xFF, 0xC5}, {0xFF, 0xC6}, /* 0xC0-0xC3 */
+	{0xFF, 0xC7}, {0xFF, 0xCA}, {0xFF, 0xCB}, {0xFF, 0xCC}, /* 0xC4-0xC7 */
+	{0xFF, 0xCD}, {0xFF, 0xCE}, {0xFF, 0xCF}, {0xFF, 0xD2}, /* 0xC8-0xCB */
+	{0xFF, 0xD3}, {0xFF, 0xD4}, {0xFF, 0xD5}, {0xFF, 0xD6}, /* 0xCC-0xCF */
+	{0xFF, 0xD7}, {0xFF, 0xDA}, {0xFF, 0xDB}, {0xFF, 0xDC}, /* 0xD0-0xD3 */
+	{0xFF, 0xA0}, {0x31, 0x65}, {0x31, 0x66}, {0x31, 0x67}, /* 0xD4-0xD7 */
 	{0x31, 0x68}, {0x31, 0x69}, {0x31, 0x6A}, {0x31, 0x6B}, /* 0xD8-0xDB */
 	{0x31, 0x6C}, {0x31, 0x6D}, {0x31, 0x6E}, {0x31, 0x6F}, /* 0xDC-0xDF */
 	{0x31, 0x70}, {0x31, 0x71}, {0x31, 0x72}, {0x31, 0x73}, /* 0xE0-0xE3 */
@@ -5228,7 +5230,7 @@
 	{0x5B, 0xEC}, {0x61, 0x63}, {0x68, 0xFA}, {0x6B, 0x3E}, /* 0xB0-0xB3 */
 	{0x70, 0x4C}, {0x74, 0x2F}, {0x74, 0xD8}, {0x7B, 0xA1}, /* 0xB4-0xB7 */
 	{0x7F, 0x50}, {0x83, 0xC5}, {0x89, 0xC0}, {0x8C, 0xAB}, /* 0xB8-0xBB */
-	{0x95, 0xDC}, {0x99, 0x28}, {0x52, 0x2E}, {0x60, 0x5D}, /* 0xBC-0xBF */
+	{0x95, 0xDC}, {0xFA, 0x2C}, {0x52, 0x2E}, {0x60, 0x5D}, /* 0xBC-0xBF */
 	{0x62, 0xEC}, {0x90, 0x02}, {0x4F, 0x8A}, {0x51, 0x49}, /* 0xC0-0xC3 */
 	{0x53, 0x21}, {0x58, 0xD9}, {0x5E, 0xE3}, {0x66, 0xE0}, /* 0xC4-0xC7 */
 	{0x6D, 0x38}, {0x70, 0x9A}, {0x72, 0xC2}, {0x73, 0xD6}, /* 0xC8-0xCB */
@@ -5634,7 +5636,7 @@
 	{0x76, 0xDC}, {0x77, 0x79}, {0x79, 0xB1}, {0x7A, 0x3B}, /* 0xA8-0xAB */
 	{0x84, 0x04}, {0x89, 0xA9}, {0x8C, 0xED}, {0x8D, 0xF3}, /* 0xAC-0xAF */
 	{0x8E, 0x48}, {0x90, 0x03}, {0x90, 0x14}, {0x90, 0x53}, /* 0xB0-0xB3 */
-	{0x90, 0xFD}, {0x93, 0x4D}, {0x96, 0x76}, {0x97, 0xDC}, /* 0xB4-0xB7 */
+	{0xFA, 0x26}, {0x93, 0x4D}, {0x96, 0x76}, {0x97, 0xDC}, /* 0xB4-0xB7 */
 	{0x6B, 0xD2}, {0x70, 0x06}, {0x72, 0x58}, {0x72, 0xA2}, /* 0xB8-0xBB */
 	{0x73, 0x68}, {0x77, 0x63}, {0x79, 0xBF}, {0x7B, 0xE4}, /* 0xBC-0xBF */
 	{0x7E, 0x9B}, {0x8B, 0x80}, {0x58, 0xA9}, {0x60, 0xC7}, /* 0xC0-0xC3 */
@@ -6059,7 +6061,7 @@
 	{0x73, 0xED}, {0x75, 0x54}, {0x76, 0x22}, {0x76, 0xE4}, /* 0xEC-0xEF */
 	{0x76, 0xFC}, {0x78, 0xD0}, {0x78, 0xFB}, {0x79, 0x2C}, /* 0xF0-0xF3 */
 	{0x7D, 0x46}, {0x82, 0x2C}, {0x87, 0xE0}, {0x8F, 0xD4}, /* 0xF4-0xF7 */
-	{0x98, 0x12}, {0x98, 0xEF}, {0x52, 0xC3}, {0x62, 0xD4}, /* 0xF8-0xFB */
+	{0x98, 0x12}, {0xFA, 0x2A}, {0x52, 0xC3}, {0x62, 0xD4}, /* 0xF8-0xFB */
 	{0x64, 0xA5}, {0x6E, 0x24}, {0x6F, 0x51}, {0x00, 0x3F}, /* 0xFC-0xFF */
 };
 
@@ -6187,7 +6189,7 @@
 	{0x83, 0xE9}, {0x88, 0xDC}, {0x89, 0x13}, {0x8B, 0x5C}, /* 0xCC-0xCF */
 	{0x8F, 0x14}, {0x4F, 0x0F}, {0x50, 0xD5}, {0x53, 0x10}, /* 0xD0-0xD3 */
 	{0x53, 0x5C}, {0x5B, 0x93}, {0x5F, 0xA9}, {0x67, 0x0D}, /* 0xD4-0xD7 */
-	{0x79, 0x8F}, {0x81, 0x79}, {0x83, 0x2F}, {0x85, 0x14}, /* 0xD8-0xDB */
+	{0xFA, 0x1B}, {0x81, 0x79}, {0x83, 0x2F}, {0x85, 0x14}, /* 0xD8-0xDB */
 	{0x89, 0x07}, {0x89, 0x86}, {0x8F, 0x39}, {0x8F, 0x3B}, /* 0xDC-0xDF */
 	{0x99, 0xA5}, {0x9C, 0x12}, {0x67, 0x2C}, {0x4E, 0x76}, /* 0xE0-0xE3 */
 	{0x4F, 0xF8}, {0x59, 0x49}, {0x5C, 0x01}, {0x5C, 0xEF}, /* 0xE4-0xE7 */
@@ -6331,7 +6333,7 @@
 	{0x82, 0x0D}, {0x83, 0x8E}, {0x84, 0xD1}, {0x86, 0xC7}, /* 0xEC-0xEF */
 	{0x88, 0xDF}, {0x8A, 0x50}, {0x8A, 0x5E}, {0x8B, 0x1D}, /* 0xF0-0xF3 */
 	{0x8C, 0xDC}, {0x8D, 0x66}, {0x8F, 0xAD}, {0x90, 0xAA}, /* 0xF4-0xF7 */
-	{0x98, 0xFC}, {0x99, 0xDF}, {0x9E, 0x9D}, {0x52, 0x4A}, /* 0xF8-0xFB */
+	{0xFA, 0x2B}, {0x99, 0xDF}, {0x9E, 0x9D}, {0x52, 0x4A}, /* 0xF8-0xFB */
 	{0xF9, 0x69}, {0x67, 0x14}, {0xF9, 0x6A}, {0x00, 0x3F}, /* 0xFC-0xFF */
 };
 
@@ -6390,7 +6392,7 @@
 	{0x5E, 0x38}, {0x5E, 0x8A}, {0x5E, 0xA0}, {0x5E, 0xC2}, /* 0xC8-0xCB */
 	{0x60, 0xF3}, {0x68, 0x51}, {0x6A, 0x61}, {0x6E, 0x58}, /* 0xCC-0xCF */
 	{0x72, 0x3D}, {0x72, 0x40}, {0x72, 0xC0}, {0x76, 0xF8}, /* 0xD0-0xD3 */
-	{0x79, 0x65}, {0x7B, 0xB1}, {0x7F, 0xD4}, {0x88, 0xF3}, /* 0xD4-0xD7 */
+	{0xFA, 0x1A}, {0x7B, 0xB1}, {0x7F, 0xD4}, {0x88, 0xF3}, /* 0xD4-0xD7 */
 	{0x89, 0xF4}, {0x8A, 0x73}, {0x8C, 0x61}, {0x8C, 0xDE}, /* 0xD8-0xDB */
 	{0x97, 0x1C}, {0x58, 0x5E}, {0x74, 0xBD}, {0x8C, 0xFD}, /* 0xDC-0xDF */
 	{0x55, 0xC7}, {0xF9, 0x6C}, {0x7A, 0x61}, {0x7D, 0x22}, /* 0xE0-0xE3 */
@@ -6667,7 +6669,7 @@
 	{0x8E, 0xFE}, {0x98, 0xDF}, {0x98, 0xFE}, {0x4F, 0x38}, /* 0xDC-0xDF */
 	{0x4F, 0x81}, {0x4F, 0xE1}, {0x54, 0x7B}, {0x5A, 0x20}, /* 0xE0-0xE3 */
 	{0x5B, 0xB8}, {0x61, 0x3C}, {0x65, 0xB0}, {0x66, 0x68}, /* 0xE4-0xE7 */
-	{0x71, 0xFC}, {0x75, 0x33}, {0x79, 0x5E}, {0x7D, 0x33}, /* 0xE8-0xEB */
+	{0x71, 0xFC}, {0x75, 0x33}, {0xFA, 0x19}, {0x7D, 0x33}, /* 0xE8-0xEB */
 	{0x81, 0x4E}, {0x81, 0xE3}, {0x83, 0x98}, {0x85, 0xAA}, /* 0xEC-0xEF */
 	{0x85, 0xCE}, {0x87, 0x03}, {0x8A, 0x0A}, {0x8E, 0xAB}, /* 0xF0-0xF3 */
 	{0x8F, 0x9B}, {0xF9, 0x71}, {0x8F, 0xC5}, {0x59, 0x31}, /* 0xF4-0xF7 */
@@ -6994,7 +6996,7 @@
 	{0x9F, 0x07}, {0x5C, 0x4B}, {0x6C, 0x83}, {0x73, 0x44}, /* 0xA8-0xAB */
 	{0x73, 0x89}, {0x92, 0x3A}, {0x6E, 0xAB}, {0x74, 0x65}, /* 0xAC-0xAF */
 	{0x76, 0x1F}, {0x7A, 0x69}, {0x7E, 0x15}, {0x86, 0x0A}, /* 0xB0-0xB3 */
-	{0x51, 0x40}, {0x58, 0xC5}, {0x64, 0xC1}, {0x74, 0xEE}, /* 0xB4-0xB7 */
+	{0xFA, 0x0C}, {0x58, 0xC5}, {0x64, 0xC1}, {0x74, 0xEE}, /* 0xB4-0xB7 */
 	{0x75, 0x15}, {0x76, 0x70}, {0x7F, 0xC1}, {0x90, 0x95}, /* 0xB8-0xBB */
 	{0x96, 0xCD}, {0x99, 0x54}, {0x6E, 0x26}, {0x74, 0xE6}, /* 0xBC-0xBF */
 	{0x7A, 0xA9}, {0x7A, 0xAA}, {0x81, 0xE5}, {0x86, 0xD9}, /* 0xC0-0xC3 */
@@ -7073,7 +7075,7 @@
 	{0x5B, 0x87}, {0x5B, 0xD3}, {0x5C, 0x24}, {0x61, 0x1A}, /* 0xD4-0xD7 */
 	{0x61, 0x82}, {0x65, 0xF4}, {0x72, 0x5B}, {0x73, 0x97}, /* 0xD8-0xDB */
 	{0x74, 0x40}, {0x76, 0xC2}, {0x79, 0x50}, {0x79, 0x91}, /* 0xDC-0xDF */
-	{0x79, 0xB9}, {0x7D, 0x06}, {0x7F, 0xBD}, {0x82, 0x8B}, /* 0xE0-0xE3 */
+	{0x79, 0xB9}, {0x7D, 0x06}, {0xFA, 0x1E}, {0x82, 0x8B}, /* 0xE0-0xE3 */
 	{0x85, 0xD5}, {0x86, 0x5E}, {0x8F, 0xC2}, {0x90, 0x47}, /* 0xE4-0xE7 */
 	{0x90, 0xF5}, {0x91, 0xEA}, {0x96, 0x85}, {0x96, 0xE8}, /* 0xE8-0xEB */
 	{0x96, 0xE9}, {0x52, 0xD6}, {0x5F, 0x67}, {0x65, 0xED}, /* 0xEC-0xEF */
@@ -7272,7 +7274,7 @@
 	{0xF9, 0xE7}, {0xF9, 0xE8}, {0x8C, 0xBD}, {0x8C, 0xB3}, /* 0xC0-0xC3 */
 	{0x90, 0x87}, {0xF9, 0xE9}, {0xF9, 0xEA}, {0x98, 0xF4}, /* 0xC4-0xC7 */
 	{0x99, 0x0C}, {0xF9, 0xEB}, {0xF9, 0xEC}, {0x70, 0x37}, /* 0xC8-0xCB */
-	{0x76, 0xCA}, {0x7F, 0xCA}, {0x7F, 0xCC}, {0x7F, 0xFC}, /* 0xCC-0xCF */
+	{0xFA, 0x17}, {0x7F, 0xCA}, {0x7F, 0xCC}, {0x7F, 0xFC}, /* 0xCC-0xCF */
 	{0x8B, 0x1A}, {0x4E, 0xBA}, {0x4E, 0xC1}, {0x52, 0x03}, /* 0xD0-0xD3 */
 	{0x53, 0x70}, {0xF9, 0xED}, {0x54, 0xBD}, {0x56, 0xE0}, /* 0xD4-0xD7 */
 	{0x59, 0xFB}, {0x5B, 0xC5}, {0x5F, 0x15}, {0x5F, 0xCD}, /* 0xD8-0xDB */
@@ -7280,7 +7282,7 @@
 	{0x83, 0x35}, {0xF9, 0xF0}, {0x86, 0x93}, {0x8A, 0x8D}, /* 0xE0-0xE3 */
 	{0xF9, 0xF1}, {0x97, 0x6D}, {0x97, 0x77}, {0xF9, 0xF2}, /* 0xE4-0xE7 */
 	{0xF9, 0xF3}, {0x4E, 0x00}, {0x4F, 0x5A}, {0x4F, 0x7E}, /* 0xE8-0xEB */
-	{0x58, 0xF9}, {0x65, 0xE5}, {0x6E, 0xA2}, {0x90, 0x38}, /* 0xEC-0xEF */
+	{0x58, 0xF9}, {0x65, 0xE5}, {0x6E, 0xA2}, {0xFA, 0x25}, /* 0xEC-0xEF */
 	{0x93, 0xB0}, {0x99, 0xB9}, {0x4E, 0xFB}, {0x58, 0xEC}, /* 0xF0-0xF3 */
 	{0x59, 0x8A}, {0x59, 0xD9}, {0x60, 0x41}, {0xF9, 0xF4}, /* 0xF4-0xF7 */
 	{0xF9, 0xF5}, {0x7A, 0x14}, {0xF9, 0xF6}, {0x83, 0x4F}, /* 0xF8-0xFB */
@@ -7485,10 +7487,10 @@
 	{0x6D, 0xE8}, {0x6E, 0x1F}, {0x6E, 0x5E}, {0x70, 0x1E}, /* 0xE4-0xE7 */
 	{0x70, 0xA1}, {0x73, 0x8E}, {0x73, 0xFD}, {0x75, 0x3A}, /* 0xE8-0xEB */
 	{0x77, 0x5B}, {0x78, 0x87}, {0x79, 0x8E}, {0x7A, 0x0B}, /* 0xEC-0xEF */
-	{0x7A, 0x7D}, {0x7C, 0xBE}, {0x7D, 0x8E}, {0x82, 0x47}, /* 0xF0-0xF3 */
+	{0x7A, 0x7D}, {0xFA, 0x1D}, {0x7D, 0x8E}, {0x82, 0x47}, /* 0xF0-0xF3 */
 	{0x8A, 0x02}, {0x8A, 0xEA}, {0x8C, 0x9E}, {0x91, 0x2D}, /* 0xF4-0xF7 */
 	{0x91, 0x4A}, {0x91, 0xD8}, {0x92, 0x66}, {0x92, 0xCC}, /* 0xF8-0xFB */
-	{0x93, 0x20}, {0x97, 0x06}, {0x97, 0x56}, {0x00, 0x3F}, /* 0xFC-0xFF */
+	{0x93, 0x20}, {0x97, 0x06}, {0xFA, 0x1C}, {0x00, 0x3F}, /* 0xFC-0xFF */
 };
 
 static struct nls_unicode c2u_F0[256] = {
@@ -7537,7 +7539,7 @@
 	{0x52, 0x36}, {0x52, 0x91}, {0x55, 0x7C}, {0x58, 0x24}, /* 0xA4-0xA7 */
 	{0x5E, 0x1D}, {0x5F, 0x1F}, {0x60, 0x8C}, {0x63, 0xD0}, /* 0xA8-0xAB */
 	{0x68, 0xAF}, {0x6F, 0xDF}, {0x79, 0x6D}, {0x7B, 0x2C}, /* 0xAC-0xAF */
-	{0x81, 0xCD}, {0x85, 0xBA}, {0x88, 0xFD}, {0x8A, 0xF8}, /* 0xB0-0xB3 */
+	{0x81, 0xCD}, {0x85, 0xBA}, {0x88, 0xFD}, {0xFA, 0x22}, /* 0xB0-0xB3 */
 	{0x8E, 0x44}, {0x91, 0x8D}, {0x96, 0x64}, {0x96, 0x9B}, /* 0xB4-0xB7 */
 	{0x97, 0x3D}, {0x98, 0x4C}, {0x9F, 0x4A}, {0x4F, 0xCE}, /* 0xB8-0xBB */
 	{0x51, 0x46}, {0x51, 0xCB}, {0x52, 0xA9}, {0x56, 0x32}, /* 0xBC-0xBF */
@@ -7822,7 +7824,7 @@
 	{0x7C, 0x3D}, {0x7C, 0x64}, {0x8A, 0x79}, {0x8A, 0xC2}, /* 0xD8-0xDB */
 	{0x58, 0x1E}, {0x59, 0xBE}, {0x5E, 0x16}, {0x63, 0x77}, /* 0xDC-0xDF */
 	{0x72, 0x52}, {0x75, 0x8A}, {0x77, 0x6B}, {0x8A, 0xDC}, /* 0xE0-0xE3 */
-	{0x8C, 0xBC}, {0x8F, 0x12}, {0x5E, 0xF3}, {0x66, 0x74}, /* 0xE4-0xE7 */
+	{0x8C, 0xBC}, {0x8F, 0x12}, {0x5E, 0xF3}, {0xFA, 0x12}, /* 0xE4-0xE7 */
 	{0x6D, 0xF8}, {0x80, 0x7D}, {0x83, 0xC1}, {0x8A, 0xCB}, /* 0xE8-0xEB */
 	{0x97, 0x51}, {0x9B, 0xD6}, {0xFA, 0x00}, {0x52, 0x43}, /* 0xEC-0xEF */
 	{0x66, 0xFF}, {0x6D, 0x95}, {0x6E, 0xEF}, {0x7D, 0xE0}, /* 0xF0-0xF3 */
@@ -7881,7 +7883,7 @@
 	{0x91, 0xAE}, {0x4F, 0xC3}, {0x56, 0xD1}, {0x71, 0xED}, /* 0xB4-0xB7 */
 	{0x77, 0xD7}, {0x87, 0x00}, {0x89, 0xF8}, {0x5B, 0xF8}, /* 0xB8-0xBB */
 	{0x5F, 0xD6}, {0x67, 0x51}, {0x90, 0xA8}, {0x53, 0xE2}, /* 0xBC-0xBF */
-	{0x58, 0x5A}, {0x5B, 0xF5}, {0x60, 0xA4}, {0x61, 0x81}, /* 0xC0-0xC3 */
+	{0xFA, 0x10}, {0x5B, 0xF5}, {0x60, 0xA4}, {0x61, 0x81}, /* 0xC0-0xC3 */
 	{0x64, 0x60}, {0x7E, 0x3D}, {0x80, 0x70}, {0x85, 0x25}, /* 0xC4-0xC7 */
 	{0x92, 0x83}, {0x64, 0xAE}, {0x50, 0xAC}, {0x5D, 0x14}, /* 0xC8-0xCB */
 	{0x67, 0x00}, {0x58, 0x9C}, {0x62, 0xBD}, {0x63, 0xA8}, /* 0xCC-0xCF */
@@ -8156,7 +8158,7 @@
 	{0x66, 0x30}, {0x6C, 0xB3}, {0x74, 0x55}, {0x83, 0x77}, /* 0xC0-0xC3 */
 	{0x87, 0x66}, {0x8C, 0xC0}, {0x90, 0x50}, {0x97, 0x1E}, /* 0xC4-0xC7 */
 	{0x9C, 0x15}, {0x58, 0xD1}, {0x5B, 0x78}, {0x86, 0x50}, /* 0xC8-0xCB */
-	{0x8B, 0x14}, {0x9D, 0xB4}, {0x5B, 0xD2}, {0x60, 0x68}, /* 0xCC-0xCF */
+	{0x8B, 0x14}, {0xFA, 0x2D}, {0x5B, 0xD2}, {0x60, 0x68}, /* 0xCC-0xCF */
 	{0x60, 0x8D}, {0x65, 0xF1}, {0x6C, 0x57}, {0x6F, 0x22}, /* 0xD0-0xD3 */
 	{0x6F, 0xA3}, {0x70, 0x1A}, {0x7F, 0x55}, {0x7F, 0xF0}, /* 0xD4-0xD7 */
 	{0x95, 0x91}, {0x95, 0x92}, {0x96, 0x50}, {0x97, 0xD3}, /* 0xD8-0xDB */
@@ -8435,7 +8437,7 @@
 	{0x70, 0x98}, {0x75, 0xD5}, {0x54, 0x03}, {0x5C, 0x79}, /* 0xDC-0xDF */
 	{0x7D, 0x07}, {0x8A, 0x16}, {0x6B, 0x20}, {0x6B, 0x3D}, /* 0xE0-0xE3 */
 	{0x6B, 0x46}, {0x54, 0x38}, {0x60, 0x70}, {0x6D, 0x3D}, /* 0xE4-0xE7 */
-	{0x7F, 0xD5}, {0x82, 0x08}, {0x50, 0xD6}, {0x51, 0xDE}, /* 0xE8-0xEB */
+	{0x7F, 0xD5}, {0x82, 0x08}, {0x50, 0xD6}, {0xFA, 0x15}, /* 0xE8-0xEB */
 	{0x55, 0x9C}, {0x56, 0x6B}, {0x56, 0xCD}, {0x59, 0xEC}, /* 0xEC-0xEF */
 	{0x5B, 0x09}, {0x5E, 0x0C}, {0x61, 0x99}, {0x61, 0x98}, /* 0xF0-0xF3 */
 	{0x62, 0x31}, {0x66, 0x5E}, {0x66, 0xE6}, {0x71, 0x99}, /* 0xF4-0xF7 */
@@ -8483,7 +8485,7 @@
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x04-0x07 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x08-0x0B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */
-	0x3F, 0x3F, 0xA9, 0xA2, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */
+	0xA9, 0xA2, 0xA9, 0xA2, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x18-0x1B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */
@@ -8750,6 +8752,74 @@
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */
 };
 
+static unsigned char u2c_11[512] = {
+	0xA4, 0xA1, 0xA4, 0xA2, 0xA4, 0xA4, 0xA4, 0xA7, /* 0x00-0x03 */
+	0xA4, 0xA8, 0xA4, 0xA9, 0xA4, 0xB1, 0xA4, 0xB2, /* 0x04-0x07 */
+	0xA4, 0xB3, 0xA4, 0xB5, 0xA4, 0xB6, 0xA4, 0xB7, /* 0x08-0x0B */
+	0xA4, 0xB8, 0xA4, 0xB9, 0xA4, 0xBA, 0xA4, 0xBB, /* 0x0C-0x0F */
+	0xA4, 0xBC, 0xA4, 0xBD, 0xA4, 0xBE, 0x3F, 0x3F, /* 0x10-0x13 */
+	0xA4, 0xD5, 0xA4, 0xD6, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xA4, 0xDD, 0x3F, 0x3F, /* 0x18-0x1B */
+	0xA4, 0xDE, 0xA4, 0xE1, 0xA4, 0xE2, 0x3F, 0x3F, /* 0x1C-0x1F */
+	0xA4, 0xE3, 0xA4, 0xB4, 0xA4, 0xE4, 0xA4, 0xE5, /* 0x20-0x23 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xA4, 0xE6, /* 0x24-0x27 */
+	0x3F, 0x3F, 0xA4, 0xE7, 0x3F, 0x3F, 0xA4, 0xE8, /* 0x28-0x2B */
+	0xA4, 0xE9, 0xA4, 0xEA, 0xA4, 0xEB, 0xA4, 0xEC, /* 0x2C-0x2F */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xA4, 0xED, 0x3F, 0x3F, /* 0x30-0x33 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xA4, 0xEE, 0x3F, 0x3F, /* 0x34-0x37 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x38-0x3B */
+	0xA4, 0xB5, 0xA4, 0xB6, 0xA4, 0xB5, 0xA4, 0xB6, /* 0x3C-0x3F */
+	0xA4, 0xEF, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */
+	0x3F, 0x3F, 0xA4, 0xF2, 0xA4, 0xF3, 0xA4, 0xF0, /* 0x44-0x47 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */
+	0xA4, 0xB7, 0x3F, 0x3F, 0xA4, 0xB8, 0xA4, 0xB9, /* 0x4C-0x4F */
+	0xA4, 0xB8, 0xA4, 0xB9, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */
+	0xA4, 0xBA, 0xA4, 0xBA, 0x3F, 0x3F, 0xA4, 0xF4, /* 0x54-0x57 */
+	0xA4, 0xF5, 0xA4, 0xF6, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xA4, 0xD4, /* 0x5C-0x5F */
+	0x3F, 0x3F, 0xA4, 0xBF, 0xA4, 0xC0, 0xA4, 0xC1, /* 0x60-0x63 */
+	0xA4, 0xC2, 0xA4, 0xC3, 0xA4, 0xC4, 0xA4, 0xC5, /* 0x64-0x67 */
+	0xA4, 0xC6, 0xA4, 0xC7, 0xA4, 0xC8, 0xA4, 0xC9, /* 0x68-0x6B */
+	0xA4, 0xCA, 0xA4, 0xCB, 0xA4, 0xCC, 0xA4, 0xCD, /* 0x6C-0x6F */
+	0xA4, 0xCE, 0xA4, 0xCF, 0xA4, 0xD0, 0xA4, 0xD1, /* 0x70-0x73 */
+	0xA4, 0xD2, 0xA4, 0xD3, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x74-0x77 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */
+	
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */
+	0xA4, 0xF7, 0xA4, 0xF8, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */
+	0xA4, 0xF9, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x88-0x8B */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */
+	0x3F, 0x3F, 0xA4, 0xFA, 0xA4, 0xFB, 0x3F, 0x3F, /* 0x90-0x93 */
+	0xA4, 0xFC, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xA4, 0xFD, 0x3F, 0x3F, /* 0x9C-0x9F */
+	0x3F, 0x3F, 0xA4, 0xFE, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */
+	0xA4, 0xA1, 0xA4, 0xA2, 0xA4, 0xA3, 0xA4, 0xA4, /* 0xA8-0xAB */
+	0xA4, 0xA5, 0xA4, 0xA6, 0xA4, 0xA7, 0xA4, 0xA9, /* 0xAC-0xAF */
+	0xA4, 0xAA, 0xA4, 0xAB, 0xA4, 0xAC, 0xA4, 0xAD, /* 0xB0-0xB3 */
+	0xA4, 0xAE, 0xA4, 0xAF, 0xA4, 0xB0, 0xA4, 0xB1, /* 0xB4-0xB7 */
+	0xA4, 0xB2, 0xA4, 0xB4, 0xA4, 0xB5, 0xA4, 0xB6, /* 0xB8-0xBB */
+	0xA4, 0xB7, 0xA4, 0xB8, 0xA4, 0xBA, 0xA4, 0xBB, /* 0xBC-0xBF */
+	0xA4, 0xBC, 0xA4, 0xBD, 0xA4, 0xBE, 0x3F, 0x3F, /* 0xC0-0xC3 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xA4, 0xD6, 0xA4, 0xD7, /* 0xC4-0xC7 */
+	0xA4, 0xD8, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC8-0xCB */
+	0xA4, 0xD9, 0x3F, 0x3F, 0xA4, 0xDA, 0x3F, 0x3F, /* 0xCC-0xCF */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xA4, 0xDB, /* 0xD0-0xD3 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xA4, 0xDC, /* 0xD4-0xD7 */
+	0x3F, 0x3F, 0xA4, 0xDD, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */
+	0xA4, 0xDE, 0xA4, 0xDF, 0x3F, 0x3F, 0xA4, 0xE0, /* 0xDC-0xDF */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xA4, 0xE8, 0xA4, 0xEA, /* 0xE4-0xE7 */
+	0xA4, 0xEC, 0x3F, 0x3F, 0xA4, 0xED, 0xA4, 0xEF, /* 0xE8-0xEB */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xA4, 0xF0, 0x3F, 0x3F, /* 0xEC-0xEF */
+	0xA4, 0xB7, 0xA4, 0xF2, 0xA4, 0xF3, 0x3F, 0x3F, /* 0xF0-0xF3 */
+	0xA4, 0xF4, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */
+	0x3F, 0x3F, 0xA4, 0xF6, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF8-0xFB */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */
+};
+
 static unsigned char u2c_20[512] = {
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x04-0x07 */
@@ -8794,7 +8864,7 @@
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */
+	0x3F, 0x3F, 0x00, 0x5C, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB0-0xB3 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */
@@ -9069,13 +9139,13 @@
 	0xA9, 0xD9, 0xA9, 0xDA, 0xA9, 0xDB, 0xA9, 0xDC, /* 0xA8-0xAB */
 	0xA9, 0xDD, 0xA9, 0xDE, 0xA9, 0xDF, 0xA9, 0xE0, /* 0xAC-0xAF */
 	0xA9, 0xE1, 0xA9, 0xE2, 0xA9, 0xE3, 0xA9, 0xE4, /* 0xB0-0xB3 */
-	0xA9, 0xE5, 0xA9, 0xE6, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC4-0xC7 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC8-0xCB */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */
+	0xA9, 0xE5, 0xA9, 0xE6, 0xA8, 0xCD, 0xA8, 0xCE, /* 0xB4-0xB7 */
+	0xA8, 0xCF, 0xA8, 0xD0, 0xA8, 0xD1, 0xA8, 0xD2, /* 0xB8-0xBB */
+	0xA8, 0xD3, 0xA8, 0xD4, 0xA8, 0xD5, 0xA8, 0xD6, /* 0xBC-0xBF */
+	0xA8, 0xD7, 0xA8, 0xD8, 0xA8, 0xD9, 0xA8, 0xDA, /* 0xC0-0xC3 */
+	0xA8, 0xDB, 0xA8, 0xDC, 0xA8, 0xDD, 0xA8, 0xDE, /* 0xC4-0xC7 */
+	0xA8, 0xDF, 0xA8, 0xE0, 0xA8, 0xE1, 0xA8, 0xE2, /* 0xC8-0xCB */
+	0xA8, 0xE3, 0xA8, 0xE4, 0xA8, 0xE5, 0xA8, 0xE6, /* 0xCC-0xCF */
 	0xA8, 0xCD, 0xA8, 0xCE, 0xA8, 0xCF, 0xA8, 0xD0, /* 0xD0-0xD3 */
 	0xA8, 0xD1, 0xA8, 0xD2, 0xA8, 0xD3, 0xA8, 0xD4, /* 0xD4-0xD7 */
 	0xA8, 0xD5, 0xA8, 0xD6, 0xA8, 0xD7, 0xA8, 0xD8, /* 0xD8-0xDB */
@@ -9332,10 +9402,10 @@
 	0xA4, 0xF4, 0xA4, 0xF5, 0xA4, 0xF6, 0xA4, 0xF7, /* 0x84-0x87 */
 	0xA4, 0xF8, 0xA4, 0xF9, 0xA4, 0xFA, 0xA4, 0xFB, /* 0x88-0x8B */
 	0xA4, 0xFC, 0xA4, 0xFD, 0xA4, 0xFE, 0x3F, 0x3F, /* 0x8C-0x8F */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xEC, 0xE9, 0xEC, 0xA3, /* 0x90-0x93 */
+	0xDF, 0xB2, 0xDE, 0xCC, 0xDF, 0xBE, 0xF1, 0xE9, /* 0x94-0x97 */
+	0xF9, 0xBB, 0xCB, 0xA3, 0xEB, 0xE0, 0xDC, 0xB0, /* 0x98-0x9B */
+	0xEF, 0xCB, 0xF4, 0xB8, 0xF2, 0xA2, 0xEC, 0xD1, /* 0x9C-0x9F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */
@@ -9371,15 +9441,15 @@
 	0xA9, 0xC5, 0xA9, 0xC6, 0xA9, 0xC7, 0xA9, 0xC8, /* 0x14-0x17 */
 	0xA9, 0xC9, 0xA9, 0xCA, 0xA9, 0xCB, 0xA9, 0xCC, /* 0x18-0x1B */
 	0xA2, 0xDF, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x38-0x3B */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */
+	0xEC, 0xE9, 0xEC, 0xA3, 0xDF, 0xB2, 0xDE, 0xCC, /* 0x20-0x23 */
+	0xE7, 0xE9, 0xD7, 0xBF, 0xF6, 0xD2, 0xF8, 0xA2, /* 0x24-0x27 */
+	0xCE, 0xFA, 0xE4, 0xA8, 0xEA, 0xC5, 0xFB, 0xFD, /* 0x28-0x2B */
+	0xE2, 0xA9, 0xD9, 0xCA, 0xD1, 0xD1, 0xF7, 0xCF, /* 0x2C-0x2F */
+	0xEC, 0xED, 0xF1, 0xBB, 0xEA, 0xF3, 0xDE, 0xE4, /* 0x30-0x33 */
+	0xD9, 0xA3, 0xF7, 0xE5, 0xEE, 0xAF, 0xF5, 0xE6, /* 0x34-0x37 */
+	0xD6, 0xCC, 0xD3, 0xDB, 0xFB, 0xBC, 0xF9, 0xCA, /* 0x38-0x3B */
+	0xCA, 0xF8, 0xD0, 0xEA, 0xED, 0xC0, 0xFA, 0xF0, /* 0x3C-0x3F */
+	0xF0, 0xAE, 0xFD, 0xCC, 0xED, 0xBB, 0xF2, 0xB8, /* 0x40-0x43 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x4C-0x4F */
@@ -9396,19 +9466,19 @@
 	0xA8, 0xC9, 0xA8, 0xCA, 0xA8, 0xCB, 0xA8, 0xCC, /* 0x78-0x7B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xA2, 0xDE, /* 0x7C-0x7F */
 	
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x88-0x8B */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB0-0xB3 */
+	0xEC, 0xE9, 0xEC, 0xA3, 0xDF, 0xB2, 0xDE, 0xCC, /* 0x80-0x83 */
+	0xE7, 0xE9, 0xD7, 0xBF, 0xF6, 0xD2, 0xF8, 0xA2, /* 0x84-0x87 */
+	0xCE, 0xFA, 0xE4, 0xA8, 0xEA, 0xC5, 0xFB, 0xFD, /* 0x88-0x8B */
+	0xE2, 0xA9, 0xD9, 0xCA, 0xD1, 0xD1, 0xF7, 0xCF, /* 0x8C-0x8F */
+	0xEC, 0xED, 0xF1, 0xBB, 0xEA, 0xF3, 0xDE, 0xE4, /* 0x90-0x93 */
+	0xD9, 0xA3, 0xF7, 0xE5, 0xEE, 0xAF, 0xF5, 0xE6, /* 0x94-0x97 */
+	0xD6, 0xCC, 0xDD, 0xFA, 0xD1, 0xFB, 0xD2, 0xB3, /* 0x98-0x9B */
+	0xEE, 0xEA, 0xE9, 0xD0, 0xEC, 0xD4, 0xF1, 0xBC, /* 0x9C-0x9F */
+	0xFA, 0xA3, 0xFD, 0xCC, 0xDE, 0xD0, 0xEF, 0xE1, /* 0xA0-0xA3 */
+	0xDF, 0xBE, 0xF1, 0xE9, 0xF9, 0xBB, 0xF1, 0xA7, /* 0xA4-0xA7 */
+	0xE9, 0xD3, 0xEC, 0xA2, 0xF0, 0xF3, 0xF9, 0xCA, /* 0xA8-0xAB */
+	0xCA, 0xF8, 0xD0, 0xEA, 0xED, 0xC0, 0xFA, 0xF0, /* 0xAC-0xAF */
+	0xE5, 0xA8, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB0-0xB3 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */
@@ -18066,6 +18136,74 @@
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */
 };
 
+static unsigned char u2c_DC[512] = {
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x04-0x07 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x08-0x0B */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x18-0x1B */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x38-0x3B */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x4C-0x4F */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x5C-0x5F */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x60-0x63 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x68-0x6B */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x74-0x77 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */
+	
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x88-0x8B */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB0-0xB3 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC4-0xC7 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC8-0xCB */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xDC-0xDF */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF8-0xFB */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */
+};
+
 static unsigned char u2c_F9[512] = {
 	0xCB, 0xD0, 0xCB, 0xD6, 0xCB, 0xE7, 0xCD, 0xCF, /* 0x00-0x03 */
 	0xCD, 0xE8, 0xCE, 0xAD, 0xCF, 0xFB, 0xD0, 0xA2, /* 0x04-0x07 */
@@ -18138,15 +18276,15 @@
 	0xF4, 0xEE, 0xF6, 0xF4, 0xF6, 0xF6, 0xF7, 0xB8, /* 0x00-0x03 */
 	0xF7, 0xC8, 0xF7, 0xD3, 0xF8, 0xDB, 0xF8, 0xF0, /* 0x04-0x07 */
 	0xFA, 0xA1, 0xFA, 0xA2, 0xFA, 0xE6, 0xFC, 0xA9, /* 0x08-0x0B */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x18-0x1B */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */
+	0xE8, 0xB4, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */
+	0xF5, 0xC0, 0x3F, 0x3F, 0xF4, 0xE7, 0x3F, 0x3F, /* 0x10-0x13 */
+	0x3F, 0x3F, 0xFD, 0xEB, 0x3F, 0x3F, 0xEC, 0xCC, /* 0x14-0x17 */
+	0x3F, 0x3F, 0xE3, 0xEA, 0xDF, 0xD4, 0xDC, 0xD8, /* 0x18-0x1B */
+	0xEF, 0xFE, 0xEF, 0xF1, 0xE9, 0xE2, 0x3F, 0x3F, /* 0x1C-0x1F */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xF0, 0xB3, 0x3F, 0x3F, /* 0x20-0x23 */
+	0x3F, 0x3F, 0xEC, 0xEF, 0xD4, 0xB4, 0x3F, 0x3F, /* 0x24-0x27 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xDA, 0xF9, 0xDE, 0xF8, /* 0x28-0x2B */
+	0xCE, 0xBD, 0xF9, 0xCD, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x38-0x3B */
@@ -18244,22 +18382,22 @@
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB0-0xB3 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC4-0xC7 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC8-0xCB */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xDC-0xDF */
+	0xA4, 0xD4, 0xA4, 0xA1, 0xA4, 0xA2, 0xA4, 0xA3, /* 0xA0-0xA3 */
+	0xA4, 0xA4, 0xA4, 0xA5, 0xA4, 0xA6, 0xA4, 0xA7, /* 0xA4-0xA7 */
+	0xA4, 0xA8, 0xA4, 0xA9, 0xA4, 0xAA, 0xA4, 0xAB, /* 0xA8-0xAB */
+	0xA4, 0xAC, 0xA4, 0xAD, 0xA4, 0xAE, 0xA4, 0xAF, /* 0xAC-0xAF */
+	0xA4, 0xB0, 0xA4, 0xB1, 0xA4, 0xB2, 0xA4, 0xB3, /* 0xB0-0xB3 */
+	0xA4, 0xB4, 0xA4, 0xB5, 0xA4, 0xB6, 0xA4, 0xB7, /* 0xB4-0xB7 */
+	0xA4, 0xB8, 0xA4, 0xB9, 0xA4, 0xBA, 0xA4, 0xBB, /* 0xB8-0xBB */
+	0xA4, 0xBC, 0xA4, 0xBD, 0xA4, 0xBE, 0x3F, 0x3F, /* 0xBC-0xBF */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xA4, 0xBF, 0xA4, 0xC0, /* 0xC0-0xC3 */
+	0xA4, 0xC1, 0xA4, 0xC2, 0xA4, 0xC3, 0xA4, 0xC4, /* 0xC4-0xC7 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xA4, 0xC5, 0xA4, 0xC6, /* 0xC8-0xCB */
+	0xA4, 0xC7, 0xA4, 0xC8, 0xA4, 0xC9, 0xA4, 0xCA, /* 0xCC-0xCF */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xA4, 0xCB, 0xA4, 0xCC, /* 0xD0-0xD3 */
+	0xA4, 0xCD, 0xA4, 0xCE, 0xA4, 0xCF, 0xA4, 0xD0, /* 0xD4-0xD7 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xA4, 0xD1, 0xA4, 0xD2, /* 0xD8-0xDB */
+	0xA4, 0xD3, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xDC-0xDF */
 	0xA1, 0xCB, 0xA1, 0xCC, 0xA1, 0xFE, 0xA3, 0xFE, /* 0xE0-0xE3 */
 	0x3F, 0x3F, 0xA1, 0xCD, 0xA3, 0xDC, 0x3F, 0x3F, /* 0xE4-0xE7 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */
@@ -18273,7 +18411,7 @@
 static unsigned char *page_uni2charset[256] = {
 	NULL,   u2c_01, u2c_02, u2c_03, u2c_04, NULL,   NULL,   NULL,   
 	NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   
-	NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   
+	NULL,   u2c_11, NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   
 	NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   
 	u2c_20, u2c_21, u2c_22, u2c_23, u2c_24, u2c_25, u2c_26, NULL,   
 	NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   
@@ -18298,7 +18436,7 @@
 	u2c_C0, u2c_C1, u2c_C2, u2c_C3, u2c_C4, u2c_C5, u2c_C6, u2c_C7, 
 	u2c_C8, u2c_C9, u2c_CA, u2c_CB, u2c_CC, u2c_CD, u2c_CE, u2c_CF, 
 	u2c_D0, u2c_D1, u2c_D2, u2c_D3, u2c_D4, u2c_D5, u2c_D6, u2c_D7, 
-	NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   
+	NULL,   NULL,   NULL,   NULL,   u2c_DC, NULL,   NULL,   NULL,   
 	NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   
 	NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   
 	NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   
@@ -18310,6 +18448,7 @@
 
 	if (boundlen <= 0)
 		return;
+
 	uni2charset = page_uni2charset[ch];
 	*outlen = 0;
 	if (uni2charset){
@@ -18333,6 +18472,7 @@
 
 	ch = rawstring[0];
 	cl = rawstring[1];
+
 	charset2uni = page_charset2uni[ch];
 	if (charset2uni && cl){
 		*uni1 = charset2uni[cl].uni2;
@@ -18365,20 +18505,34 @@
 	NULL
 };
 
+static struct nls_table alias_table = {
+	"euc-kr",
+	uni2char,
+	char2uni,
+	inc_use_count,
+	dec_use_count,
+	NULL
+};
+
+
 int __init init_nls_cp949(void)
 {
+	register_nls(&alias_table);
 	return register_nls(&table);
 }
 
 #ifdef MODULE
 int init_module(void)
 {
+
 	return init_nls_cp949();
 }
 
 
 void cleanup_module(void)
 {
+
+	unregister_nls(&alias_table);
 	unregister_nls(&table);
 	return;
 }
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/fs/nls/nls_cp950.c linux.17p9/fs/nls/nls_cp950.c
--- linux.vanilla/fs/nls/nls_cp950.c	Sun Jun 11 21:44:21 2000
+++ linux.17p9/fs/nls/nls_cp950.c	Sun Jun 11 22:11:27 2000
@@ -2,7 +2,9 @@
  * linux/fs/nls_cp950.c
  *
  * Charset cp950 translation tables.
- * Generated automatically from the Microsoft
+ * This translation table was generated automatically, the
+ * original table can be download from the Microsoft website.
+ * (http://www.microsoft.com/typography/unicode/unicodecp.htm)
  */
 
 #include <linux/module.h>
@@ -31,16 +33,16 @@
 	{0x30, 0x00}, {0xFF, 0x0C}, {0x30, 0x01}, {0x30, 0x02}, /* 0x40-0x43 */
 	{0xFF, 0x0E}, {0x20, 0x27}, {0xFF, 0x1B}, {0xFF, 0x1A}, /* 0x44-0x47 */
 	{0xFF, 0x1F}, {0xFF, 0x01}, {0xFE, 0x30}, {0x20, 0x26}, /* 0x48-0x4B */
-	{0x20, 0x25}, {0xFE, 0x50}, {0xFE, 0x51}, {0xFE, 0x52}, /* 0x4C-0x4F */
+	{0x20, 0x25}, {0xFE, 0x50}, {0xFF, 0x64}, {0xFE, 0x52}, /* 0x4C-0x4F */
 	{0x00, 0xB7}, {0xFE, 0x54}, {0xFE, 0x55}, {0xFE, 0x56}, /* 0x50-0x53 */
 	{0xFE, 0x57}, {0xFF, 0x5C}, {0x20, 0x13}, {0xFE, 0x31}, /* 0x54-0x57 */
 	{0x20, 0x14}, {0xFE, 0x33}, {0x25, 0x74}, {0xFE, 0x34}, /* 0x58-0x5B */
 	{0xFE, 0x4F}, {0xFF, 0x08}, {0xFF, 0x09}, {0xFE, 0x35}, /* 0x5C-0x5F */
 	{0xFE, 0x36}, {0xFF, 0x5B}, {0xFF, 0x5D}, {0xFE, 0x37}, /* 0x60-0x63 */
-	{0xFE, 0x38}, {0x30, 0x14}, {0x30, 0x15}, {0xFE, 0x39}, /* 0x64-0x67 */
+	{0xFE, 0x38}, {0xFF, 0x3B}, {0xFF, 0x3D}, {0xFE, 0x39}, /* 0x64-0x67 */
 	{0xFE, 0x3A}, {0x30, 0x10}, {0x30, 0x11}, {0xFE, 0x3B}, /* 0x68-0x6B */
 	{0xFE, 0x3C}, {0x30, 0x0A}, {0x30, 0x0B}, {0xFE, 0x3D}, /* 0x6C-0x6F */
-	{0xFE, 0x3E}, {0x30, 0x08}, {0x30, 0x09}, {0xFE, 0x3F}, /* 0x70-0x73 */
+	{0xFE, 0x3E}, {0x30, 0x08}, {0x30, 0x09}, {0xFF, 0x3E}, /* 0x70-0x73 */
 	{0xFE, 0x40}, {0x30, 0x0C}, {0x30, 0x0D}, {0xFE, 0x41}, /* 0x74-0x77 */
 	{0xFE, 0x42}, {0x30, 0x0E}, {0x30, 0x0F}, {0xFE, 0x43}, /* 0x78-0x7B */
 	{0xFE, 0x44}, {0xFE, 0x59}, {0xFE, 0x5A}, {0x00, 0x3F}, /* 0x7C-0x7F */
@@ -54,26 +56,26 @@
 	{0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x98-0x9B */
 	{0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x9C-0x9F */
 	{0x00, 0x3F}, {0xFE, 0x5B}, {0xFE, 0x5C}, {0xFE, 0x5D}, /* 0xA0-0xA3 */
-	{0xFE, 0x5E}, {0x20, 0x18}, {0x20, 0x19}, {0x20, 0x1C}, /* 0xA4-0xA7 */
-	{0x20, 0x1D}, {0x30, 0x1D}, {0x30, 0x1E}, {0x20, 0x35}, /* 0xA8-0xAB */
+	{0xFE, 0x5E}, {0xFF, 0x40}, {0xFF, 0x07}, {0x20, 0x1C}, /* 0xA4-0xA7 */
+	{0xFF, 0x02}, {0x30, 0x1D}, {0x30, 0x1E}, {0x20, 0x35}, /* 0xA8-0xAB */
 	{0x20, 0x32}, {0xFF, 0x03}, {0xFF, 0x06}, {0xFF, 0x0A}, /* 0xAC-0xAF */
 	{0x20, 0x3B}, {0x00, 0xA7}, {0x30, 0x03}, {0x25, 0xCB}, /* 0xB0-0xB3 */
 	{0x25, 0xCF}, {0x25, 0xB3}, {0x25, 0xB2}, {0x25, 0xCE}, /* 0xB4-0xB7 */
 	{0x26, 0x06}, {0x26, 0x05}, {0x25, 0xC7}, {0x25, 0xC6}, /* 0xB8-0xBB */
 	{0x25, 0xA1}, {0x25, 0xA0}, {0x25, 0xBD}, {0x25, 0xBC}, /* 0xBC-0xBF */
-	{0x32, 0xA3}, {0x21, 0x05}, {0x00, 0xAF}, {0xFF, 0xE3}, /* 0xC0-0xC3 */
+	{0x32, 0xA3}, {0x21, 0x05}, {0x03, 0x05}, {0xFF, 0xE3}, /* 0xC0-0xC3 */
 	{0xFF, 0x3F}, {0x02, 0xCD}, {0xFE, 0x49}, {0xFE, 0x4A}, /* 0xC4-0xC7 */
 	{0xFE, 0x4D}, {0xFE, 0x4E}, {0xFE, 0x4B}, {0xFE, 0x4C}, /* 0xC8-0xCB */
 	{0xFE, 0x5F}, {0xFE, 0x60}, {0xFE, 0x61}, {0xFF, 0x0B}, /* 0xCC-0xCF */
 	{0xFF, 0x0D}, {0x00, 0xD7}, {0x00, 0xF7}, {0x00, 0xB1}, /* 0xD0-0xD3 */
 	{0x22, 0x1A}, {0xFF, 0x1C}, {0xFF, 0x1E}, {0xFF, 0x1D}, /* 0xD4-0xD7 */
 	{0x22, 0x66}, {0x22, 0x67}, {0x22, 0x60}, {0x22, 0x1E}, /* 0xD8-0xDB */
-	{0x22, 0x52}, {0x22, 0x61}, {0xFE, 0x62}, {0xFE, 0x63}, /* 0xDC-0xDF */
+	{0x22, 0x52}, {0x22, 0x63}, {0xFE, 0x62}, {0xFE, 0x63}, /* 0xDC-0xDF */
 	{0xFE, 0x64}, {0xFE, 0x65}, {0xFE, 0x66}, {0xFF, 0x5E}, /* 0xE0-0xE3 */
 	{0x22, 0x29}, {0x22, 0x2A}, {0x22, 0xA5}, {0x22, 0x20}, /* 0xE4-0xE7 */
 	{0x22, 0x1F}, {0x22, 0xBF}, {0x33, 0xD2}, {0x33, 0xD1}, /* 0xE8-0xEB */
 	{0x22, 0x2B}, {0x22, 0x2E}, {0x22, 0x35}, {0x22, 0x34}, /* 0xEC-0xEF */
-	{0x26, 0x40}, {0x26, 0x42}, {0x22, 0x95}, {0x22, 0x99}, /* 0xF0-0xF3 */
+	{0x26, 0x40}, {0x26, 0x42}, {0x26, 0x41}, {0x26, 0x09}, /* 0xF0-0xF3 */
 	{0x21, 0x91}, {0x21, 0x93}, {0x21, 0x90}, {0x21, 0x92}, /* 0xF4-0xF7 */
 	{0x21, 0x96}, {0x21, 0x97}, {0x21, 0x99}, {0x21, 0x98}, /* 0xF8-0xFB */
 	{0x22, 0x25}, {0x22, 0x23}, {0xFF, 0x0F}, {0x00, 0x3F}, /* 0xFC-0xFF */
@@ -102,7 +104,7 @@
 	{0xFE, 0x69}, {0xFE, 0x6A}, {0xFE, 0x6B}, {0x33, 0xD5}, /* 0x4C-0x4F */
 	{0x33, 0x9C}, {0x33, 0x9D}, {0x33, 0x9E}, {0x33, 0xCE}, /* 0x50-0x53 */
 	{0x33, 0xA1}, {0x33, 0x8E}, {0x33, 0x8F}, {0x33, 0xC4}, /* 0x54-0x57 */
-	{0x00, 0xB0}, {0x51, 0x59}, {0x51, 0x5B}, {0x51, 0x5E}, /* 0x58-0x5B */
+	{0x22, 0x18}, {0x51, 0x59}, {0x51, 0x5B}, {0x51, 0x5E}, /* 0x58-0x5B */
 	{0x51, 0x5D}, {0x51, 0x61}, {0x51, 0x63}, {0x55, 0xE7}, /* 0x5C-0x5F */
 	{0x74, 0xE9}, {0x7C, 0xCE}, {0x25, 0x81}, {0x25, 0x82}, /* 0x60-0x63 */
 	{0x25, 0x83}, {0x25, 0x84}, {0x25, 0x85}, {0x25, 0x86}, /* 0x64-0x67 */
@@ -122,7 +124,7 @@
 	{0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x98-0x9B */
 	{0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x9C-0x9F */
 	{0x00, 0x3F}, {0x25, 0x6E}, {0x25, 0x70}, {0x25, 0x6F}, /* 0xA0-0xA3 */
-	{0x25, 0x50}, {0x25, 0x5E}, {0x25, 0x6A}, {0x25, 0x61}, /* 0xA4-0xA7 */
+	{0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xA4-0xA7 */
 	{0x25, 0xE2}, {0x25, 0xE3}, {0x25, 0xE5}, {0x25, 0xE4}, /* 0xA8-0xAB */
 	{0x25, 0x71}, {0x25, 0x72}, {0x25, 0x73}, {0xFF, 0x10}, /* 0xAC-0xAF */
 	{0xFF, 0x11}, {0xFF, 0x12}, {0xFF, 0x13}, {0xFF, 0x14}, /* 0xB0-0xB3 */
@@ -132,7 +134,7 @@
 	{0x21, 0x67}, {0x21, 0x68}, {0x21, 0x69}, {0x30, 0x21}, /* 0xC0-0xC3 */
 	{0x30, 0x22}, {0x30, 0x23}, {0x30, 0x24}, {0x30, 0x25}, /* 0xC4-0xC7 */
 	{0x30, 0x26}, {0x30, 0x27}, {0x30, 0x28}, {0x30, 0x29}, /* 0xC8-0xCB */
-	{0x53, 0x41}, {0x53, 0x44}, {0x53, 0x45}, {0xFF, 0x21}, /* 0xCC-0xCF */
+	{0x00, 0x3F}, {0x53, 0x44}, {0x00, 0x3F}, {0xFF, 0x21}, /* 0xCC-0xCF */
 	{0xFF, 0x22}, {0xFF, 0x23}, {0xFF, 0x24}, {0xFF, 0x25}, /* 0xD0-0xD3 */
 	{0xFF, 0x26}, {0xFF, 0x27}, {0xFF, 0x28}, {0xFF, 0x29}, /* 0xD4-0xD7 */
 	{0xFF, 0x2A}, {0xFF, 0x2B}, {0xFF, 0x2C}, {0xFF, 0x2D}, /* 0xD8-0xDB */
@@ -195,7 +197,7 @@
 	{0x31, 0x1B}, {0x31, 0x1C}, {0x31, 0x1D}, {0x31, 0x1E}, /* 0xAC-0xAF */
 	{0x31, 0x1F}, {0x31, 0x20}, {0x31, 0x21}, {0x31, 0x22}, /* 0xB0-0xB3 */
 	{0x31, 0x23}, {0x31, 0x24}, {0x31, 0x25}, {0x31, 0x26}, /* 0xB4-0xB7 */
-	{0x31, 0x27}, {0x31, 0x28}, {0x31, 0x29}, {0x02, 0xD9}, /* 0xB8-0xBB */
+	{0x31, 0x27}, {0x31, 0x28}, {0x31, 0x29}, {0x20, 0x24}, /* 0xB8-0xBB */
 	{0x02, 0xC9}, {0x02, 0xCA}, {0x02, 0xC7}, {0x02, 0xCB}, /* 0xBC-0xBF */
 	{0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xC0-0xC3 */
 	{0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xC4-0xC7 */
@@ -233,16 +235,16 @@
 	{0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */
 	{0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */
 	{0x4E, 0x00}, {0x4E, 0x59}, {0x4E, 0x01}, {0x4E, 0x03}, /* 0x40-0x43 */
-	{0x4E, 0x43}, {0x4E, 0x5D}, {0x4E, 0x86}, {0x4E, 0x8C}, /* 0x44-0x47 */
+	{0x4E, 0x43}, {0x4E, 0x5D}, {0xF9, 0xBA}, {0x4E, 0x8C}, /* 0x44-0x47 */
 	{0x4E, 0xBA}, {0x51, 0x3F}, {0x51, 0x65}, {0x51, 0x6B}, /* 0x48-0x4B */
-	{0x51, 0xE0}, {0x52, 0x00}, {0x52, 0x01}, {0x52, 0x9B}, /* 0x4C-0x4F */
+	{0x51, 0xE0}, {0x52, 0x00}, {0x52, 0x01}, {0xF9, 0x8A}, /* 0x4C-0x4F */
 	{0x53, 0x15}, {0x53, 0x41}, {0x53, 0x5C}, {0x53, 0xC8}, /* 0x50-0x53 */
 	{0x4E, 0x09}, {0x4E, 0x0B}, {0x4E, 0x08}, {0x4E, 0x0A}, /* 0x54-0x57 */
 	{0x4E, 0x2B}, {0x4E, 0x38}, {0x51, 0xE1}, {0x4E, 0x45}, /* 0x58-0x5B */
 	{0x4E, 0x48}, {0x4E, 0x5F}, {0x4E, 0x5E}, {0x4E, 0x8E}, /* 0x5C-0x5F */
 	{0x4E, 0xA1}, {0x51, 0x40}, {0x52, 0x03}, {0x52, 0xFA}, /* 0x60-0x63 */
 	{0x53, 0x43}, {0x53, 0xC9}, {0x53, 0xE3}, {0x57, 0x1F}, /* 0x64-0x67 */
-	{0x58, 0xEB}, {0x59, 0x15}, {0x59, 0x27}, {0x59, 0x73}, /* 0x68-0x6B */
+	{0x58, 0xEB}, {0x59, 0x15}, {0x59, 0x27}, {0xF9, 0x81}, /* 0x68-0x6B */
 	{0x5B, 0x50}, {0x5B, 0x51}, {0x5B, 0x53}, {0x5B, 0xF8}, /* 0x6C-0x6F */
 	{0x5C, 0x0F}, {0x5C, 0x22}, {0x5C, 0x38}, {0x5C, 0x71}, /* 0x70-0x73 */
 	{0x5D, 0xDD}, {0x5D, 0xE5}, {0x5D, 0xF1}, {0x5D, 0xF2}, /* 0x74-0x77 */
@@ -257,15 +259,15 @@
 	{0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x94-0x97 */
 	{0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x98-0x9B */
 	{0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x9C-0x9F */
-	{0x00, 0x3F}, {0x4E, 0x11}, {0x4E, 0x10}, {0x4E, 0x0D}, /* 0xA0-0xA3 */
-	{0x4E, 0x2D}, {0x4E, 0x30}, {0x4E, 0x39}, {0x4E, 0x4B}, /* 0xA4-0xA7 */
+	{0x00, 0x3F}, {0x4E, 0x11}, {0x4E, 0x10}, {0xF9, 0x67}, /* 0xA0-0xA3 */
+	{0x4E, 0x2D}, {0x4E, 0x30}, {0xF9, 0x5E}, {0x4E, 0x4B}, /* 0xA4-0xA7 */
 	{0x5C, 0x39}, {0x4E, 0x88}, {0x4E, 0x91}, {0x4E, 0x95}, /* 0xA8-0xAB */
 	{0x4E, 0x92}, {0x4E, 0x94}, {0x4E, 0xA2}, {0x4E, 0xC1}, /* 0xAC-0xAF */
-	{0x4E, 0xC0}, {0x4E, 0xC3}, {0x4E, 0xC6}, {0x4E, 0xC7}, /* 0xB0-0xB3 */
+	{0xF9, 0xFD}, {0x4E, 0xC3}, {0x4E, 0xC6}, {0x4E, 0xC7}, /* 0xB0-0xB3 */
 	{0x4E, 0xCD}, {0x4E, 0xCA}, {0x4E, 0xCB}, {0x4E, 0xC4}, /* 0xB4-0xB7 */
-	{0x51, 0x43}, {0x51, 0x41}, {0x51, 0x67}, {0x51, 0x6D}, /* 0xB8-0xBB */
+	{0x51, 0x43}, {0x51, 0x41}, {0x51, 0x67}, {0xF9, 0xD1}, /* 0xB8-0xBB */
 	{0x51, 0x6E}, {0x51, 0x6C}, {0x51, 0x97}, {0x51, 0xF6}, /* 0xBC-0xBF */
-	{0x52, 0x06}, {0x52, 0x07}, {0x52, 0x08}, {0x52, 0xFB}, /* 0xC0-0xC3 */
+	{0x52, 0x06}, {0xFA, 0x00}, {0x52, 0x08}, {0x52, 0xFB}, /* 0xC0-0xC3 */
 	{0x52, 0xFE}, {0x52, 0xFF}, {0x53, 0x16}, {0x53, 0x39}, /* 0xC4-0xC7 */
 	{0x53, 0x48}, {0x53, 0x47}, {0x53, 0x45}, {0x53, 0x5E}, /* 0xC8-0xCB */
 	{0x53, 0x84}, {0x53, 0xCB}, {0x53, 0xCA}, {0x53, 0xCD}, /* 0xCC-0xCF */
@@ -303,18 +305,18 @@
 	{0x4E, 0x16}, {0x4E, 0x15}, {0x4E, 0x14}, {0x4E, 0x18}, /* 0x40-0x43 */
 	{0x4E, 0x3B}, {0x4E, 0x4D}, {0x4E, 0x4F}, {0x4E, 0x4E}, /* 0x44-0x47 */
 	{0x4E, 0xE5}, {0x4E, 0xD8}, {0x4E, 0xD4}, {0x4E, 0xD5}, /* 0x48-0x4B */
-	{0x4E, 0xD6}, {0x4E, 0xD7}, {0x4E, 0xE3}, {0x4E, 0xE4}, /* 0x4C-0x4F */
+	{0x4E, 0xD6}, {0x4E, 0xD7}, {0x4E, 0xE3}, {0xF9, 0xA8}, /* 0x4C-0x4F */
 	{0x4E, 0xD9}, {0x4E, 0xDE}, {0x51, 0x45}, {0x51, 0x44}, /* 0x50-0x53 */
 	{0x51, 0x89}, {0x51, 0x8A}, {0x51, 0xAC}, {0x51, 0xF9}, /* 0x54-0x57 */
 	{0x51, 0xFA}, {0x51, 0xF8}, {0x52, 0x0A}, {0x52, 0xA0}, /* 0x58-0x5B */
-	{0x52, 0x9F}, {0x53, 0x05}, {0x53, 0x06}, {0x53, 0x17}, /* 0x5C-0x5F */
+	{0x52, 0x9F}, {0x53, 0x05}, {0x53, 0x06}, {0xF9, 0x63}, /* 0x5C-0x5F */
 	{0x53, 0x1D}, {0x4E, 0xDF}, {0x53, 0x4A}, {0x53, 0x49}, /* 0x60-0x63 */
 	{0x53, 0x61}, {0x53, 0x60}, {0x53, 0x6F}, {0x53, 0x6E}, /* 0x64-0x67 */
 	{0x53, 0xBB}, {0x53, 0xEF}, {0x53, 0xE4}, {0x53, 0xF3}, /* 0x68-0x6B */
 	{0x53, 0xEC}, {0x53, 0xEE}, {0x53, 0xE9}, {0x53, 0xE8}, /* 0x6C-0x6F */
 	{0x53, 0xFC}, {0x53, 0xF8}, {0x53, 0xF5}, {0x53, 0xEB}, /* 0x70-0x73 */
 	{0x53, 0xE6}, {0x53, 0xEA}, {0x53, 0xF2}, {0x53, 0xF1}, /* 0x74-0x77 */
-	{0x53, 0xF0}, {0x53, 0xE5}, {0x53, 0xED}, {0x53, 0xFB}, /* 0x78-0x7B */
+	{0x53, 0xF0}, {0xF9, 0x06}, {0x53, 0xED}, {0x53, 0xFB}, /* 0x78-0x7B */
 	{0x56, 0xDB}, {0x56, 0xDA}, {0x59, 0x16}, {0x00, 0x3F}, /* 0x7C-0x7F */
 	
 	{0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x80-0x83 */
@@ -340,7 +342,7 @@
 	{0x75, 0x30}, {0x75, 0x31}, {0x75, 0x32}, {0x75, 0x33}, /* 0xD0-0xD3 */
 	{0x75, 0x8B}, {0x76, 0x7D}, {0x76, 0xAE}, {0x76, 0xBF}, /* 0xD4-0xD7 */
 	{0x76, 0xEE}, {0x77, 0xDB}, {0x77, 0xE2}, {0x77, 0xF3}, /* 0xD8-0xDB */
-	{0x79, 0x3A}, {0x79, 0xBE}, {0x7A, 0x74}, {0x7A, 0xCB}, /* 0xDC-0xDF */
+	{0x79, 0x3A}, {0x79, 0xBE}, {0x7A, 0x74}, {0xF9, 0xF7}, /* 0xDC-0xDF */
 	{0x4E, 0x1E}, {0x4E, 0x1F}, {0x4E, 0x52}, {0x4E, 0x53}, /* 0xE0-0xE3 */
 	{0x4E, 0x69}, {0x4E, 0x99}, {0x4E, 0xA4}, {0x4E, 0xA6}, /* 0xE4-0xE7 */
 	{0x4E, 0xA5}, {0x4E, 0xFF}, {0x4F, 0x09}, {0x4F, 0x19}, /* 0xE8-0xEB */
@@ -368,10 +370,10 @@
 	{0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */
 	{0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */
 	{0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */
-	{0x51, 0x71}, {0x51, 0x8D}, {0x51, 0xB0}, {0x52, 0x17}, /* 0x40-0x43 */
+	{0x51, 0x71}, {0x51, 0x8D}, {0x51, 0xB0}, {0xF9, 0x9C}, /* 0x40-0x43 */
 	{0x52, 0x11}, {0x52, 0x12}, {0x52, 0x0E}, {0x52, 0x16}, /* 0x44-0x47 */
-	{0x52, 0xA3}, {0x53, 0x08}, {0x53, 0x21}, {0x53, 0x20}, /* 0x48-0x4B */
-	{0x53, 0x70}, {0x53, 0x71}, {0x54, 0x09}, {0x54, 0x0F}, /* 0x4C-0x4F */
+	{0xF9, 0x9D}, {0x53, 0x08}, {0x53, 0x21}, {0x53, 0x20}, /* 0x48-0x4B */
+	{0x53, 0x70}, {0x53, 0x71}, {0x54, 0x09}, {0xF9, 0xDE}, /* 0x4C-0x4F */
 	{0x54, 0x0C}, {0x54, 0x0A}, {0x54, 0x10}, {0x54, 0x01}, /* 0x50-0x53 */
 	{0x54, 0x0B}, {0x54, 0x04}, {0x54, 0x11}, {0x54, 0x0D}, /* 0x54-0x57 */
 	{0x54, 0x08}, {0x54, 0x03}, {0x54, 0x0E}, {0x54, 0x06}, /* 0x58-0x5B */
@@ -381,9 +383,9 @@
 	{0x59, 0x1A}, {0x59, 0x37}, {0x59, 0x38}, {0x59, 0x84}, /* 0x68-0x6B */
 	{0x59, 0x78}, {0x59, 0x83}, {0x59, 0x7D}, {0x59, 0x79}, /* 0x6C-0x6F */
 	{0x59, 0x82}, {0x59, 0x81}, {0x5B, 0x57}, {0x5B, 0x58}, /* 0x70-0x73 */
-	{0x5B, 0x87}, {0x5B, 0x88}, {0x5B, 0x85}, {0x5B, 0x89}, /* 0x74-0x77 */
+	{0x5B, 0x87}, {0x5B, 0x88}, {0xFA, 0x04}, {0x5B, 0x89}, /* 0x74-0x77 */
 	{0x5B, 0xFA}, {0x5C, 0x16}, {0x5C, 0x79}, {0x5D, 0xDE}, /* 0x78-0x7B */
-	{0x5E, 0x06}, {0x5E, 0x76}, {0x5E, 0x74}, {0x00, 0x3F}, /* 0x7C-0x7F */
+	{0x5E, 0x06}, {0x5E, 0x76}, {0xF9, 0x8E}, {0x00, 0x3F}, /* 0x7C-0x7F */
 	
 	{0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x80-0x83 */
 	{0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x84-0x87 */
@@ -405,13 +407,13 @@
 	{0x6C, 0x5B}, {0x6C, 0x4D}, {0x6C, 0x4E}, {0x70, 0x70}, /* 0xC4-0xC7 */
 	{0x72, 0x5F}, {0x72, 0x5D}, {0x76, 0x7E}, {0x7A, 0xF9}, /* 0xC8-0xCB */
 	{0x7C, 0x73}, {0x7C, 0xF8}, {0x7F, 0x36}, {0x7F, 0x8A}, /* 0xCC-0xCF */
-	{0x7F, 0xBD}, {0x80, 0x01}, {0x80, 0x03}, {0x80, 0x0C}, /* 0xD0-0xD3 */
+	{0xFA, 0x1E}, {0xF9, 0x34}, {0x80, 0x03}, {0x80, 0x0C}, /* 0xD0-0xD3 */
 	{0x80, 0x12}, {0x80, 0x33}, {0x80, 0x7F}, {0x80, 0x89}, /* 0xD4-0xD7 */
-	{0x80, 0x8B}, {0x80, 0x8C}, {0x81, 0xE3}, {0x81, 0xEA}, /* 0xD8-0xDB */
+	{0xF9, 0x53}, {0x80, 0x8C}, {0x81, 0xE3}, {0x81, 0xEA}, /* 0xD8-0xDB */
 	{0x81, 0xF3}, {0x81, 0xFC}, {0x82, 0x0C}, {0x82, 0x1B}, /* 0xDC-0xDF */
 	{0x82, 0x1F}, {0x82, 0x6E}, {0x82, 0x72}, {0x82, 0x7E}, /* 0xE0-0xE3 */
-	{0x86, 0x6B}, {0x88, 0x40}, {0x88, 0x4C}, {0x88, 0x63}, /* 0xE4-0xE7 */
-	{0x89, 0x7F}, {0x96, 0x21}, {0x4E, 0x32}, {0x4E, 0xA8}, /* 0xE8-0xEB */
+	{0x86, 0x6B}, {0x88, 0x40}, {0xFA, 0x08}, {0x88, 0x63}, /* 0xE4-0xE7 */
+	{0x89, 0x7F}, {0x96, 0x21}, {0xF9, 0x05}, {0x4E, 0xA8}, /* 0xE8-0xEB */
 	{0x4F, 0x4D}, {0x4F, 0x4F}, {0x4F, 0x47}, {0x4F, 0x57}, /* 0xEC-0xEF */
 	{0x4F, 0x5E}, {0x4F, 0x34}, {0x4F, 0x5B}, {0x4F, 0x55}, /* 0xF0-0xF3 */
 	{0x4F, 0x30}, {0x4F, 0x50}, {0x4F, 0x51}, {0x4F, 0x3D}, /* 0xF4-0xF7 */
@@ -439,13 +441,13 @@
 	{0x4F, 0x5C}, {0x4F, 0x60}, {0x4F, 0x2F}, {0x4F, 0x4E}, /* 0x40-0x43 */
 	{0x4F, 0x36}, {0x4F, 0x59}, {0x4F, 0x5D}, {0x4F, 0x48}, /* 0x44-0x47 */
 	{0x4F, 0x5A}, {0x51, 0x4C}, {0x51, 0x4B}, {0x51, 0x4D}, /* 0x48-0x4B */
-	{0x51, 0x75}, {0x51, 0xB6}, {0x51, 0xB7}, {0x52, 0x25}, /* 0x4C-0x4F */
-	{0x52, 0x24}, {0x52, 0x29}, {0x52, 0x2A}, {0x52, 0x28}, /* 0x50-0x53 */
+	{0x51, 0x75}, {0x51, 0xB6}, {0xF9, 0x2E}, {0x52, 0x25}, /* 0x4C-0x4F */
+	{0x52, 0x24}, {0xF9, 0xDD}, {0x52, 0x2A}, {0x52, 0x28}, /* 0x50-0x53 */
 	{0x52, 0xAB}, {0x52, 0xA9}, {0x52, 0xAA}, {0x52, 0xAC}, /* 0x54-0x57 */
-	{0x53, 0x23}, {0x53, 0x73}, {0x53, 0x75}, {0x54, 0x1D}, /* 0x58-0x5B */
+	{0x53, 0x23}, {0x53, 0x73}, {0xF9, 0x1C}, {0xF9, 0xED}, /* 0x58-0x5B */
 	{0x54, 0x2D}, {0x54, 0x1E}, {0x54, 0x3E}, {0x54, 0x26}, /* 0x5C-0x5F */
 	{0x54, 0x4E}, {0x54, 0x27}, {0x54, 0x46}, {0x54, 0x43}, /* 0x60-0x63 */
-	{0x54, 0x33}, {0x54, 0x48}, {0x54, 0x42}, {0x54, 0x1B}, /* 0x64-0x67 */
+	{0x54, 0x33}, {0x54, 0x48}, {0xF9, 0x80}, {0x54, 0x1B}, /* 0x64-0x67 */
 	{0x54, 0x29}, {0x54, 0x4A}, {0x54, 0x39}, {0x54, 0x3B}, /* 0x68-0x6B */
 	{0x54, 0x38}, {0x54, 0x2E}, {0x54, 0x35}, {0x54, 0x36}, /* 0x6C-0x6F */
 	{0x54, 0x20}, {0x54, 0x3C}, {0x54, 0x40}, {0x54, 0x31}, /* 0x70-0x73 */
@@ -468,10 +470,10 @@
 	{0x59, 0x8D}, {0x59, 0xA4}, {0x59, 0x93}, {0x59, 0x8A}, /* 0xB0-0xB3 */
 	{0x59, 0xA5}, {0x5B, 0x5D}, {0x5B, 0x5C}, {0x5B, 0x5A}, /* 0xB4-0xB7 */
 	{0x5B, 0x5B}, {0x5B, 0x8C}, {0x5B, 0x8B}, {0x5B, 0x8F}, /* 0xB8-0xBB */
-	{0x5C, 0x2C}, {0x5C, 0x40}, {0x5C, 0x41}, {0x5C, 0x3F}, /* 0xBC-0xBF */
+	{0x5C, 0x2C}, {0x5C, 0x40}, {0x5C, 0x41}, {0xF9, 0xBD}, /* 0xBC-0xBF */
 	{0x5C, 0x3E}, {0x5C, 0x90}, {0x5C, 0x91}, {0x5C, 0x94}, /* 0xC0-0xC3 */
 	{0x5C, 0x8C}, {0x5D, 0xEB}, {0x5E, 0x0C}, {0x5E, 0x8F}, /* 0xC4-0xC7 */
-	{0x5E, 0x87}, {0x5E, 0x8A}, {0x5E, 0xF7}, {0x5F, 0x04}, /* 0xC8-0xCB */
+	{0x5E, 0x87}, {0x5E, 0x8A}, {0x5E, 0xF7}, {0xF9, 0x43}, /* 0xC8-0xCB */
 	{0x5F, 0x1F}, {0x5F, 0x64}, {0x5F, 0x62}, {0x5F, 0x77}, /* 0xCC-0xCF */
 	{0x5F, 0x79}, {0x5F, 0xD8}, {0x5F, 0xCC}, {0x5F, 0xD7}, /* 0xD0-0xD3 */
 	{0x5F, 0xCD}, {0x5F, 0xF1}, {0x5F, 0xEB}, {0x5F, 0xF8}, /* 0xD4-0xD7 */
@@ -481,8 +483,8 @@
 	{0x62, 0x7E}, {0x62, 0x79}, {0x62, 0x73}, {0x62, 0x92}, /* 0xE4-0xE7 */
 	{0x62, 0x6F}, {0x62, 0x98}, {0x62, 0x6E}, {0x62, 0x95}, /* 0xE8-0xEB */
 	{0x62, 0x93}, {0x62, 0x91}, {0x62, 0x86}, {0x65, 0x39}, /* 0xEC-0xEF */
-	{0x65, 0x3B}, {0x65, 0x38}, {0x65, 0xF1}, {0x66, 0xF4}, /* 0xF0-0xF3 */
-	{0x67, 0x5F}, {0x67, 0x4E}, {0x67, 0x4F}, {0x67, 0x50}, /* 0xF4-0xF7 */
+	{0x65, 0x3B}, {0x65, 0x38}, {0x65, 0xF1}, {0xF9, 0x01}, /* 0xF0-0xF3 */
+	{0x67, 0x5F}, {0xF9, 0xE1}, {0x67, 0x4F}, {0x67, 0x50}, /* 0xF4-0xF7 */
 	{0x67, 0x51}, {0x67, 0x5C}, {0x67, 0x56}, {0x67, 0x5E}, /* 0xF8-0xFB */
 	{0x67, 0x49}, {0x67, 0x46}, {0x67, 0x60}, {0x00, 0x3F}, /* 0xFC-0xFF */
 };
@@ -506,20 +508,20 @@
 	{0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */
 	{0x67, 0x53}, {0x67, 0x57}, {0x6B, 0x65}, {0x6B, 0xCF}, /* 0x40-0x43 */
 	{0x6C, 0x42}, {0x6C, 0x5E}, {0x6C, 0x99}, {0x6C, 0x81}, /* 0x44-0x47 */
-	{0x6C, 0x88}, {0x6C, 0x89}, {0x6C, 0x85}, {0x6C, 0x9B}, /* 0x48-0x4B */
+	{0xF9, 0x72}, {0x6C, 0x89}, {0x6C, 0x85}, {0x6C, 0x9B}, /* 0x48-0x4B */
 	{0x6C, 0x6A}, {0x6C, 0x7A}, {0x6C, 0x90}, {0x6C, 0x70}, /* 0x4C-0x4F */
 	{0x6C, 0x8C}, {0x6C, 0x68}, {0x6C, 0x96}, {0x6C, 0x92}, /* 0x50-0x53 */
 	{0x6C, 0x7D}, {0x6C, 0x83}, {0x6C, 0x72}, {0x6C, 0x7E}, /* 0x54-0x57 */
 	{0x6C, 0x74}, {0x6C, 0x86}, {0x6C, 0x76}, {0x6C, 0x8D}, /* 0x58-0x5B */
 	{0x6C, 0x94}, {0x6C, 0x98}, {0x6C, 0x82}, {0x70, 0x76}, /* 0x5C-0x5F */
-	{0x70, 0x7C}, {0x70, 0x7D}, {0x70, 0x78}, {0x72, 0x62}, /* 0x60-0x63 */
+	{0x70, 0x7C}, {0x70, 0x7D}, {0x70, 0x78}, {0xF9, 0x46}, /* 0x60-0x63 */
 	{0x72, 0x61}, {0x72, 0x60}, {0x72, 0xC4}, {0x72, 0xC2}, /* 0x64-0x67 */
 	{0x73, 0x96}, {0x75, 0x2C}, {0x75, 0x2B}, {0x75, 0x37}, /* 0x68-0x6B */
 	{0x75, 0x38}, {0x76, 0x82}, {0x76, 0xEF}, {0x77, 0xE3}, /* 0x6C-0x6F */
 	{0x79, 0xC1}, {0x79, 0xC0}, {0x79, 0xBF}, {0x7A, 0x76}, /* 0x70-0x73 */
 	{0x7C, 0xFB}, {0x7F, 0x55}, {0x80, 0x96}, {0x80, 0x93}, /* 0x74-0x77 */
 	{0x80, 0x9D}, {0x80, 0x98}, {0x80, 0x9B}, {0x80, 0x9A}, /* 0x78-0x7B */
-	{0x80, 0xB2}, {0x82, 0x6F}, {0x82, 0x92}, {0x00, 0x3F}, /* 0x7C-0x7F */
+	{0x80, 0xB2}, {0xF9, 0x7C}, {0x82, 0x92}, {0x00, 0x3F}, /* 0x7C-0x7F */
 	
 	{0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x80-0x83 */
 	{0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x84-0x87 */
@@ -529,25 +531,25 @@
 	{0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x94-0x97 */
 	{0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x98-0x9B */
 	{0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x9C-0x9F */
-	{0x00, 0x3F}, {0x82, 0x8B}, {0x82, 0x8D}, {0x89, 0x8B}, /* 0xA0-0xA3 */
+	{0x00, 0x3F}, {0x82, 0x8B}, {0x82, 0x8D}, {0xFA, 0x0A}, /* 0xA0-0xA3 */
 	{0x89, 0xD2}, {0x8A, 0x00}, {0x8C, 0x37}, {0x8C, 0x46}, /* 0xA4-0xA7 */
 	{0x8C, 0x55}, {0x8C, 0x9D}, {0x8D, 0x64}, {0x8D, 0x70}, /* 0xA8-0xAB */
-	{0x8D, 0xB3}, {0x8E, 0xAB}, {0x8E, 0xCA}, {0x8F, 0x9B}, /* 0xAC-0xAF */
-	{0x8F, 0xB0}, {0x8F, 0xC2}, {0x8F, 0xC6}, {0x8F, 0xC5}, /* 0xB0-0xB3 */
+	{0x8D, 0xB3}, {0x8E, 0xAB}, {0xF9, 0x02}, {0x8F, 0x9B}, /* 0xAC-0xAF */
+	{0xF9, 0x71}, {0x8F, 0xC2}, {0x8F, 0xC6}, {0x8F, 0xC5}, /* 0xB0-0xB3 */
 	{0x8F, 0xC4}, {0x5D, 0xE1}, {0x90, 0x91}, {0x90, 0xA2}, /* 0xB4-0xB7 */
 	{0x90, 0xAA}, {0x90, 0xA6}, {0x90, 0xA3}, {0x91, 0x49}, /* 0xB8-0xBB */
-	{0x91, 0xC6}, {0x91, 0xCC}, {0x96, 0x32}, {0x96, 0x2E}, /* 0xBC-0xBF */
+	{0x91, 0xC6}, {0xF9, 0xE9}, {0x96, 0x32}, {0xF9, 0xC6}, /* 0xBC-0xBF */
 	{0x96, 0x31}, {0x96, 0x2A}, {0x96, 0x2C}, {0x4E, 0x26}, /* 0xC0-0xC3 */
 	{0x4E, 0x56}, {0x4E, 0x73}, {0x4E, 0x8B}, {0x4E, 0x9B}, /* 0xC4-0xC7 */
 	{0x4E, 0x9E}, {0x4E, 0xAB}, {0x4E, 0xAC}, {0x4F, 0x6F}, /* 0xC8-0xCB */
 	{0x4F, 0x9D}, {0x4F, 0x8D}, {0x4F, 0x73}, {0x4F, 0x7F}, /* 0xCC-0xCF */
-	{0x4F, 0x6C}, {0x4F, 0x9B}, {0x4F, 0x8B}, {0x4F, 0x86}, /* 0xD0-0xD3 */
+	{0x4F, 0x6C}, {0x4F, 0x9B}, {0xF9, 0xB5}, {0xF9, 0x2D}, /* 0xD0-0xD3 */
 	{0x4F, 0x83}, {0x4F, 0x70}, {0x4F, 0x75}, {0x4F, 0x88}, /* 0xD4-0xD7 */
 	{0x4F, 0x69}, {0x4F, 0x7B}, {0x4F, 0x96}, {0x4F, 0x7E}, /* 0xD8-0xDB */
 	{0x4F, 0x8F}, {0x4F, 0x91}, {0x4F, 0x7A}, {0x51, 0x54}, /* 0xDC-0xDF */
-	{0x51, 0x52}, {0x51, 0x55}, {0x51, 0x69}, {0x51, 0x77}, /* 0xE0-0xE3 */
+	{0x51, 0x52}, {0x51, 0x55}, {0xF9, 0x78}, {0x51, 0x77}, /* 0xE0-0xE3 */
 	{0x51, 0x76}, {0x51, 0x78}, {0x51, 0xBD}, {0x51, 0xFD}, /* 0xE4-0xE7 */
-	{0x52, 0x3B}, {0x52, 0x38}, {0x52, 0x37}, {0x52, 0x3A}, /* 0xE8-0xEB */
+	{0x52, 0x3B}, {0x52, 0x38}, {0x52, 0x37}, {0xF9, 0xFF}, /* 0xE8-0xEB */
 	{0x52, 0x30}, {0x52, 0x2E}, {0x52, 0x36}, {0x52, 0x41}, /* 0xEC-0xEF */
 	{0x52, 0xBE}, {0x52, 0xBB}, {0x53, 0x52}, {0x53, 0x54}, /* 0xF0-0xF3 */
 	{0x53, 0x53}, {0x53, 0x51}, {0x53, 0x66}, {0x53, 0x77}, /* 0xF4-0xF7 */
@@ -580,7 +582,7 @@
 	{0x56, 0xFA}, {0x57, 0x83}, {0x57, 0x77}, {0x57, 0x6A}, /* 0x54-0x57 */
 	{0x57, 0x69}, {0x57, 0x61}, {0x57, 0x66}, {0x57, 0x64}, /* 0x58-0x5B */
 	{0x57, 0x7C}, {0x59, 0x1C}, {0x59, 0x49}, {0x59, 0x47}, /* 0x5C-0x5F */
-	{0x59, 0x48}, {0x59, 0x44}, {0x59, 0x54}, {0x59, 0xBE}, /* 0x60-0x63 */
+	{0xF9, 0x0C}, {0x59, 0x44}, {0x59, 0x54}, {0x59, 0xBE}, /* 0x60-0x63 */
 	{0x59, 0xBB}, {0x59, 0xD4}, {0x59, 0xB9}, {0x59, 0xAE}, /* 0x64-0x67 */
 	{0x59, 0xD1}, {0x59, 0xC6}, {0x59, 0xD0}, {0x59, 0xCD}, /* 0x68-0x6B */
 	{0x59, 0xCB}, {0x59, 0xD3}, {0x59, 0xCA}, {0x59, 0xAF}, /* 0x6C-0x6F */
@@ -605,20 +607,20 @@
 	{0x5E, 0x96}, {0x5E, 0xF6}, {0x5F, 0x26}, {0x5F, 0x27}, /* 0xB4-0xB7 */
 	{0x5F, 0x29}, {0x5F, 0x80}, {0x5F, 0x81}, {0x5F, 0x7F}, /* 0xB8-0xBB */
 	{0x5F, 0x7C}, {0x5F, 0xDD}, {0x5F, 0xE0}, {0x5F, 0xFD}, /* 0xBC-0xBF */
-	{0x5F, 0xF5}, {0x5F, 0xFF}, {0x60, 0x0F}, {0x60, 0x14}, /* 0xC0-0xC3 */
+	{0xF9, 0xA3}, {0x5F, 0xFF}, {0x60, 0x0F}, {0x60, 0x14}, /* 0xC0-0xC3 */
 	{0x60, 0x2F}, {0x60, 0x35}, {0x60, 0x16}, {0x60, 0x2A}, /* 0xC4-0xC7 */
 	{0x60, 0x15}, {0x60, 0x21}, {0x60, 0x27}, {0x60, 0x29}, /* 0xC8-0xCB */
 	{0x60, 0x2B}, {0x60, 0x1B}, {0x62, 0x16}, {0x62, 0x15}, /* 0xCC-0xCF */
 	{0x62, 0x3F}, {0x62, 0x3E}, {0x62, 0x40}, {0x62, 0x7F}, /* 0xD0-0xD3 */
-	{0x62, 0xC9}, {0x62, 0xCC}, {0x62, 0xC4}, {0x62, 0xBF}, /* 0xD4-0xD7 */
+	{0xF9, 0x25}, {0x62, 0xCC}, {0x62, 0xC4}, {0x62, 0xBF}, /* 0xD4-0xD7 */
 	{0x62, 0xC2}, {0x62, 0xB9}, {0x62, 0xD2}, {0x62, 0xDB}, /* 0xD8-0xDB */
-	{0x62, 0xAB}, {0x62, 0xD3}, {0x62, 0xD4}, {0x62, 0xCB}, /* 0xDC-0xDF */
+	{0x62, 0xAB}, {0xFA, 0x02}, {0x62, 0xD4}, {0x62, 0xCB}, /* 0xDC-0xDF */
 	{0x62, 0xC8}, {0x62, 0xA8}, {0x62, 0xBD}, {0x62, 0xBC}, /* 0xE0-0xE3 */
 	{0x62, 0xD0}, {0x62, 0xD9}, {0x62, 0xC7}, {0x62, 0xCD}, /* 0xE4-0xE7 */
 	{0x62, 0xB5}, {0x62, 0xDA}, {0x62, 0xB1}, {0x62, 0xD8}, /* 0xE8-0xEB */
 	{0x62, 0xD6}, {0x62, 0xD7}, {0x62, 0xC6}, {0x62, 0xAC}, /* 0xEC-0xEF */
 	{0x62, 0xCE}, {0x65, 0x3E}, {0x65, 0xA7}, {0x65, 0xBC}, /* 0xF0-0xF3 */
-	{0x65, 0xFA}, {0x66, 0x14}, {0x66, 0x13}, {0x66, 0x0C}, /* 0xF4-0xF7 */
+	{0x65, 0xFA}, {0x66, 0x14}, {0xF9, 0xE0}, {0x66, 0x0C}, /* 0xF4-0xF7 */
 	{0x66, 0x06}, {0x66, 0x02}, {0x66, 0x0E}, {0x66, 0x00}, /* 0xF8-0xFB */
 	{0x66, 0x0F}, {0x66, 0x15}, {0x66, 0x0A}, {0x00, 0x3F}, /* 0xFC-0xFF */
 };
@@ -643,13 +645,13 @@
 	{0x66, 0x07}, {0x67, 0x0D}, {0x67, 0x0B}, {0x67, 0x6D}, /* 0x40-0x43 */
 	{0x67, 0x8B}, {0x67, 0x95}, {0x67, 0x71}, {0x67, 0x9C}, /* 0x44-0x47 */
 	{0x67, 0x73}, {0x67, 0x77}, {0x67, 0x87}, {0x67, 0x9D}, /* 0x48-0x4B */
-	{0x67, 0x97}, {0x67, 0x6F}, {0x67, 0x70}, {0x67, 0x7F}, /* 0x4C-0x4F */
+	{0xF9, 0xF4}, {0x67, 0x6F}, {0x67, 0x70}, {0x67, 0x7F}, /* 0x4C-0x4F */
 	{0x67, 0x89}, {0x67, 0x7E}, {0x67, 0x90}, {0x67, 0x75}, /* 0x50-0x53 */
 	{0x67, 0x9A}, {0x67, 0x93}, {0x67, 0x7C}, {0x67, 0x6A}, /* 0x54-0x57 */
 	{0x67, 0x72}, {0x6B, 0x23}, {0x6B, 0x66}, {0x6B, 0x67}, /* 0x58-0x5B */
 	{0x6B, 0x7F}, {0x6C, 0x13}, {0x6C, 0x1B}, {0x6C, 0xE3}, /* 0x5C-0x5F */
-	{0x6C, 0xE8}, {0x6C, 0xF3}, {0x6C, 0xB1}, {0x6C, 0xCC}, /* 0x60-0x63 */
-	{0x6C, 0xE5}, {0x6C, 0xB3}, {0x6C, 0xBD}, {0x6C, 0xBE}, /* 0x64-0x67 */
+	{0x6C, 0xE8}, {0x6C, 0xF3}, {0x6C, 0xB1}, {0xF9, 0x68}, /* 0x60-0x63 */
+	{0xF9, 0xE3}, {0x6C, 0xB3}, {0x6C, 0xBD}, {0x6C, 0xBE}, /* 0x64-0x67 */
 	{0x6C, 0xBC}, {0x6C, 0xE2}, {0x6C, 0xAB}, {0x6C, 0xD5}, /* 0x68-0x6B */
 	{0x6C, 0xD3}, {0x6C, 0xB8}, {0x6C, 0xC4}, {0x6C, 0xB9}, /* 0x6C-0x6F */
 	{0x6C, 0xC1}, {0x6C, 0xAE}, {0x6C, 0xD7}, {0x6C, 0xC5}, /* 0x70-0x73 */
@@ -666,9 +668,9 @@
 	{0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x98-0x9B */
 	{0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x9C-0x9F */
 	{0x00, 0x3F}, {0x70, 0x95}, {0x70, 0x8E}, {0x70, 0x92}, /* 0xA0-0xA3 */
-	{0x70, 0x8A}, {0x70, 0x99}, {0x72, 0x2C}, {0x72, 0x2D}, /* 0xA4-0xA7 */
+	{0x70, 0x8A}, {0xF9, 0xFB}, {0x72, 0x2C}, {0x72, 0x2D}, /* 0xA4-0xA7 */
 	{0x72, 0x38}, {0x72, 0x48}, {0x72, 0x67}, {0x72, 0x69}, /* 0xA8-0xAB */
-	{0x72, 0xC0}, {0x72, 0xCE}, {0x72, 0xD9}, {0x72, 0xD7}, /* 0xAC-0xAF */
+	{0xF9, 0xFA}, {0x72, 0xCE}, {0x72, 0xD9}, {0x72, 0xD7}, /* 0xAC-0xAF */
 	{0x72, 0xD0}, {0x73, 0xA9}, {0x73, 0xA8}, {0x73, 0x9F}, /* 0xB0-0xB3 */
 	{0x73, 0xAB}, {0x73, 0xA5}, {0x75, 0x3D}, {0x75, 0x9D}, /* 0xB4-0xB7 */
 	{0x75, 0x99}, {0x75, 0x9A}, {0x76, 0x84}, {0x76, 0xC2}, /* 0xB8-0xBB */
@@ -686,7 +688,7 @@
 	{0x82, 0xBE}, {0x82, 0xB7}, {0x86, 0x4E}, {0x86, 0x71}, /* 0xE8-0xEB */
 	{0x52, 0x1D}, {0x88, 0x68}, {0x8E, 0xCB}, {0x8F, 0xCE}, /* 0xEC-0xEF */
 	{0x8F, 0xD4}, {0x8F, 0xD1}, {0x90, 0xB5}, {0x90, 0xB8}, /* 0xF0-0xF3 */
-	{0x90, 0xB1}, {0x90, 0xB6}, {0x91, 0xC7}, {0x91, 0xD1}, /* 0xF4-0xF7 */
+	{0x90, 0xB1}, {0x90, 0xB6}, {0x91, 0xC7}, {0xF9, 0x0A}, /* 0xF4-0xF7 */
 	{0x95, 0x77}, {0x95, 0x80}, {0x96, 0x1C}, {0x96, 0x40}, /* 0xF8-0xFB */
 	{0x96, 0x3F}, {0x96, 0x3B}, {0x96, 0x44}, {0x00, 0x3F}, /* 0xFC-0xFF */
 };
@@ -709,8 +711,8 @@
 	{0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */
 	{0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */
 	{0x96, 0x42}, {0x96, 0xB9}, {0x96, 0xE8}, {0x97, 0x52}, /* 0x40-0x43 */
-	{0x97, 0x5E}, {0x4E, 0x9F}, {0x4E, 0xAD}, {0x4E, 0xAE}, /* 0x44-0x47 */
-	{0x4F, 0xE1}, {0x4F, 0xB5}, {0x4F, 0xAF}, {0x4F, 0xBF}, /* 0x48-0x4B */
+	{0x97, 0x5E}, {0x4E, 0x9F}, {0x4E, 0xAD}, {0xF9, 0x77}, /* 0x44-0x47 */
+	{0x4F, 0xE1}, {0x4F, 0xB5}, {0x4F, 0xAF}, {0xF9, 0x65}, /* 0x48-0x4B */
 	{0x4F, 0xE0}, {0x4F, 0xD1}, {0x4F, 0xCF}, {0x4F, 0xDD}, /* 0x4C-0x4F */
 	{0x4F, 0xC3}, {0x4F, 0xB6}, {0x4F, 0xD8}, {0x4F, 0xDF}, /* 0x50-0x53 */
 	{0x4F, 0xCA}, {0x4F, 0xD7}, {0x4F, 0xAE}, {0x4F, 0xD0}, /* 0x54-0x57 */
@@ -723,7 +725,7 @@
 	{0x53, 0x9A}, {0x53, 0xDB}, {0x54, 0xAC}, {0x54, 0xC0}, /* 0x70-0x73 */
 	{0x54, 0xA8}, {0x54, 0xCE}, {0x54, 0xC9}, {0x54, 0xB8}, /* 0x74-0x77 */
 	{0x54, 0xA6}, {0x54, 0xB3}, {0x54, 0xC7}, {0x54, 0xC2}, /* 0x78-0x7B */
-	{0x54, 0xBD}, {0x54, 0xAA}, {0x54, 0xC1}, {0x00, 0x3F}, /* 0x7C-0x7F */
+	{0xF9, 0x9E}, {0x54, 0xAA}, {0x54, 0xC1}, {0x00, 0x3F}, /* 0x7C-0x7F */
 	
 	{0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x80-0x83 */
 	{0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x84-0x87 */
@@ -738,7 +740,7 @@
 	{0x54, 0xA7}, {0x54, 0xBF}, {0x56, 0xFF}, {0x57, 0x82}, /* 0xA8-0xAB */
 	{0x57, 0x8B}, {0x57, 0xA0}, {0x57, 0xA3}, {0x57, 0xA2}, /* 0xAC-0xAF */
 	{0x57, 0xCE}, {0x57, 0xAE}, {0x57, 0x93}, {0x59, 0x55}, /* 0xB0-0xB3 */
-	{0x59, 0x51}, {0x59, 0x4F}, {0x59, 0x4E}, {0x59, 0x50}, /* 0xB4-0xB7 */
+	{0xF9, 0x09}, {0x59, 0x4F}, {0x59, 0x4E}, {0x59, 0x50}, /* 0xB4-0xB7 */
 	{0x59, 0xDC}, {0x59, 0xD8}, {0x59, 0xFF}, {0x59, 0xE3}, /* 0xB8-0xBB */
 	{0x59, 0xE8}, {0x5A, 0x03}, {0x59, 0xE5}, {0x59, 0xEA}, /* 0xBC-0xBF */
 	{0x59, 0xDA}, {0x59, 0xE6}, {0x5A, 0x01}, {0x59, 0xFB}, /* 0xC0-0xC3 */
@@ -746,10 +748,10 @@
 	{0x5B, 0xA2}, {0x5B, 0xA5}, {0x5C, 0x01}, {0x5C, 0x4E}, /* 0xC8-0xCB */
 	{0x5C, 0x4F}, {0x5C, 0x4D}, {0x5C, 0x4B}, {0x5C, 0xD9}, /* 0xCC-0xCF */
 	{0x5C, 0xD2}, {0x5D, 0xF7}, {0x5E, 0x1D}, {0x5E, 0x25}, /* 0xD0-0xD3 */
-	{0x5E, 0x1F}, {0x5E, 0x7D}, {0x5E, 0xA0}, {0x5E, 0xA6}, /* 0xD4-0xD7 */
+	{0x5E, 0x1F}, {0x5E, 0x7D}, {0x5E, 0xA0}, {0xFA, 0x01}, /* 0xD4-0xD7 */
 	{0x5E, 0xFA}, {0x5F, 0x08}, {0x5F, 0x2D}, {0x5F, 0x65}, /* 0xD8-0xDB */
-	{0x5F, 0x88}, {0x5F, 0x85}, {0x5F, 0x8A}, {0x5F, 0x8B}, /* 0xDC-0xDF */
-	{0x5F, 0x87}, {0x5F, 0x8C}, {0x5F, 0x89}, {0x60, 0x12}, /* 0xE0-0xE3 */
+	{0x5F, 0x88}, {0x5F, 0x85}, {0x5F, 0x8A}, {0xF9, 0xD8}, /* 0xDC-0xDF */
+	{0x5F, 0x87}, {0x5F, 0x8C}, {0x5F, 0x89}, {0xF9, 0x60}, /* 0xE0-0xE3 */
 	{0x60, 0x1D}, {0x60, 0x20}, {0x60, 0x25}, {0x60, 0x0E}, /* 0xE4-0xE7 */
 	{0x60, 0x28}, {0x60, 0x4D}, {0x60, 0x70}, {0x60, 0x68}, /* 0xE8-0xEB */
 	{0x60, 0x62}, {0x60, 0x46}, {0x60, 0x43}, {0x60, 0x6C}, /* 0xEC-0xEF */
@@ -776,7 +778,7 @@
 	{0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */
 	{0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */
 	{0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */
-	{0x62, 0xEF}, {0x62, 0xEC}, {0x62, 0xFE}, {0x62, 0xF4}, /* 0x40-0x43 */
+	{0x62, 0xEF}, {0x62, 0xEC}, {0xF9, 0x73}, {0x62, 0xF4}, /* 0x40-0x43 */
 	{0x63, 0x11}, {0x63, 0x02}, {0x65, 0x3F}, {0x65, 0x45}, /* 0x44-0x47 */
 	{0x65, 0xAB}, {0x65, 0xBD}, {0x65, 0xE2}, {0x66, 0x25}, /* 0x48-0x4B */
 	{0x66, 0x2D}, {0x66, 0x20}, {0x66, 0x27}, {0x66, 0x2F}, /* 0x4C-0x4F */
@@ -786,12 +788,12 @@
 	{0x67, 0xAF}, {0x67, 0xF5}, {0x67, 0xE9}, {0x67, 0xEF}, /* 0x5C-0x5F */
 	{0x67, 0xC4}, {0x67, 0xD1}, {0x67, 0xB4}, {0x67, 0xDA}, /* 0x60-0x63 */
 	{0x67, 0xE5}, {0x67, 0xB8}, {0x67, 0xCF}, {0x67, 0xDE}, /* 0x64-0x67 */
-	{0x67, 0xF3}, {0x67, 0xB0}, {0x67, 0xD9}, {0x67, 0xE2}, /* 0x68-0x6B */
+	{0xF9, 0xC9}, {0x67, 0xB0}, {0x67, 0xD9}, {0x67, 0xE2}, /* 0x68-0x6B */
 	{0x67, 0xDD}, {0x67, 0xD2}, {0x6B, 0x6A}, {0x6B, 0x83}, /* 0x6C-0x6F */
 	{0x6B, 0x86}, {0x6B, 0xB5}, {0x6B, 0xD2}, {0x6B, 0xD7}, /* 0x70-0x73 */
 	{0x6C, 0x1F}, {0x6C, 0xC9}, {0x6D, 0x0B}, {0x6D, 0x32}, /* 0x74-0x77 */
-	{0x6D, 0x2A}, {0x6D, 0x41}, {0x6D, 0x25}, {0x6D, 0x0C}, /* 0x78-0x7B */
-	{0x6D, 0x31}, {0x6D, 0x1E}, {0x6D, 0x17}, {0x00, 0x3F}, /* 0x7C-0x7F */
+	{0x6D, 0x2A}, {0xF9, 0xCA}, {0x6D, 0x25}, {0x6D, 0x0C}, /* 0x78-0x7B */
+	{0x6D, 0x31}, {0xFA, 0x05}, {0x6D, 0x17}, {0x00, 0x3F}, /* 0x7C-0x7F */
 	
 	{0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x80-0x83 */
 	{0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x84-0x87 */
@@ -802,20 +804,20 @@
 	{0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x98-0x9B */
 	{0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x9C-0x9F */
 	{0x00, 0x3F}, {0x6D, 0x3B}, {0x6D, 0x3D}, {0x6D, 0x3E}, /* 0xA0-0xA3 */
-	{0x6D, 0x36}, {0x6D, 0x1B}, {0x6C, 0xF5}, {0x6D, 0x39}, /* 0xA4-0xA7 */
+	{0x6D, 0x36}, {0xF9, 0x15}, {0x6C, 0xF5}, {0x6D, 0x39}, /* 0xA4-0xA7 */
 	{0x6D, 0x27}, {0x6D, 0x38}, {0x6D, 0x29}, {0x6D, 0x2E}, /* 0xA8-0xAB */
 	{0x6D, 0x35}, {0x6D, 0x0E}, {0x6D, 0x2B}, {0x70, 0xAB}, /* 0xAC-0xAF */
 	{0x70, 0xBA}, {0x70, 0xB3}, {0x70, 0xAC}, {0x70, 0xAF}, /* 0xB0-0xB3 */
 	{0x70, 0xAD}, {0x70, 0xB8}, {0x70, 0xAE}, {0x70, 0xA4}, /* 0xB4-0xB7 */
 	{0x72, 0x30}, {0x72, 0x72}, {0x72, 0x6F}, {0x72, 0x74}, /* 0xB8-0xBB */
 	{0x72, 0xE9}, {0x72, 0xE0}, {0x72, 0xE1}, {0x73, 0xB7}, /* 0xBC-0xBF */
-	{0x73, 0xCA}, {0x73, 0xBB}, {0x73, 0xB2}, {0x73, 0xCD}, /* 0xC0-0xC3 */
+	{0x73, 0xCA}, {0x73, 0xBB}, {0xF9, 0xAD}, {0x73, 0xCD}, /* 0xC0-0xC3 */
 	{0x73, 0xC0}, {0x73, 0xB3}, {0x75, 0x1A}, {0x75, 0x2D}, /* 0xC4-0xC7 */
 	{0x75, 0x4F}, {0x75, 0x4C}, {0x75, 0x4E}, {0x75, 0x4B}, /* 0xC8-0xCB */
 	{0x75, 0xAB}, {0x75, 0xA4}, {0x75, 0xA5}, {0x75, 0xA2}, /* 0xCC-0xCF */
 	{0x75, 0xA3}, {0x76, 0x78}, {0x76, 0x86}, {0x76, 0x87}, /* 0xD0-0xD3 */
 	{0x76, 0x88}, {0x76, 0xC8}, {0x76, 0xC6}, {0x76, 0xC3}, /* 0xD4-0xD7 */
-	{0x76, 0xC5}, {0x77, 0x01}, {0x76, 0xF9}, {0x76, 0xF8}, /* 0xD8-0xDB */
+	{0x76, 0xC5}, {0xF9, 0x6D}, {0x76, 0xF9}, {0x76, 0xF8}, /* 0xD8-0xDB */
 	{0x77, 0x09}, {0x77, 0x0B}, {0x76, 0xFE}, {0x76, 0xFC}, /* 0xDC-0xDF */
 	{0x77, 0x07}, {0x77, 0xDC}, {0x78, 0x02}, {0x78, 0x14}, /* 0xE0-0xE3 */
 	{0x78, 0x0C}, {0x78, 0x0D}, {0x79, 0x46}, {0x79, 0x49}, /* 0xE4-0xE7 */
@@ -850,7 +852,7 @@
 	{0x80, 0xCE}, {0x80, 0xDE}, {0x80, 0xE4}, {0x80, 0xDD}, /* 0x4C-0x4F */
 	{0x81, 0xF4}, {0x82, 0x22}, {0x82, 0xE7}, {0x83, 0x03}, /* 0x50-0x53 */
 	{0x83, 0x05}, {0x82, 0xE3}, {0x82, 0xDB}, {0x82, 0xE6}, /* 0x54-0x57 */
-	{0x83, 0x04}, {0x82, 0xE5}, {0x83, 0x02}, {0x83, 0x09}, /* 0x58-0x5B */
+	{0x83, 0x04}, {0xF9, 0x74}, {0x83, 0x02}, {0x83, 0x09}, /* 0x58-0x5B */
 	{0x82, 0xD2}, {0x82, 0xD7}, {0x82, 0xF1}, {0x83, 0x01}, /* 0x5C-0x5F */
 	{0x82, 0xDC}, {0x82, 0xD4}, {0x82, 0xD1}, {0x82, 0xDE}, /* 0x60-0x63 */
 	{0x82, 0xD3}, {0x82, 0xDF}, {0x82, 0xEF}, {0x83, 0x06}, /* 0x64-0x67 */
@@ -872,8 +874,8 @@
 	{0x00, 0x3F}, {0x8F, 0xED}, {0x8F, 0xEB}, {0x8F, 0xE4}, /* 0xA0-0xA3 */
 	{0x8F, 0xE8}, {0x90, 0xCA}, {0x90, 0xCE}, {0x90, 0xC1}, /* 0xA4-0xA7 */
 	{0x90, 0xC3}, {0x91, 0x4B}, {0x91, 0x4A}, {0x91, 0xCD}, /* 0xA8-0xAB */
-	{0x95, 0x82}, {0x96, 0x50}, {0x96, 0x4B}, {0x96, 0x4C}, /* 0xAC-0xAF */
-	{0x96, 0x4D}, {0x97, 0x62}, {0x97, 0x69}, {0x97, 0xCB}, /* 0xB0-0xB3 */
+	{0x95, 0x82}, {0x96, 0x50}, {0xF9, 0x51}, {0x96, 0x4C}, /* 0xAC-0xAF */
+	{0xFA, 0x09}, {0x97, 0x62}, {0x97, 0x69}, {0x97, 0xCB}, /* 0xB0-0xB3 */
 	{0x97, 0xED}, {0x97, 0xF3}, {0x98, 0x01}, {0x98, 0xA8}, /* 0xB4-0xB7 */
 	{0x98, 0xDB}, {0x98, 0xDF}, {0x99, 0x96}, {0x99, 0x99}, /* 0xB8-0xBB */
 	{0x4E, 0x58}, {0x4E, 0xB3}, {0x50, 0x0C}, {0x50, 0x0D}, /* 0xBC-0xBF */
@@ -883,9 +885,9 @@
 	{0x50, 0x11}, {0x4F, 0xFA}, {0x50, 0x00}, {0x50, 0x14}, /* 0xCC-0xCF */
 	{0x50, 0x28}, {0x4F, 0xF1}, {0x50, 0x21}, {0x50, 0x0B}, /* 0xD0-0xD3 */
 	{0x50, 0x19}, {0x50, 0x18}, {0x4F, 0xF3}, {0x4F, 0xEE}, /* 0xD4-0xD7 */
-	{0x50, 0x2D}, {0x50, 0x2A}, {0x4F, 0xFE}, {0x50, 0x2B}, /* 0xD8-0xDB */
+	{0x50, 0x2D}, {0x50, 0x2A}, {0x4F, 0xFE}, {0xF9, 0xD4}, /* 0xD8-0xDB */
 	{0x50, 0x09}, {0x51, 0x7C}, {0x51, 0xA4}, {0x51, 0xA5}, /* 0xDC-0xDF */
-	{0x51, 0xA2}, {0x51, 0xCD}, {0x51, 0xCC}, {0x51, 0xC6}, /* 0xE0-0xE3 */
+	{0x51, 0xA2}, {0x51, 0xCD}, {0xF9, 0x55}, {0x51, 0xC6}, /* 0xE0-0xE3 */
 	{0x51, 0xCB}, {0x52, 0x56}, {0x52, 0x5C}, {0x52, 0x54}, /* 0xE4-0xE7 */
 	{0x52, 0x5B}, {0x52, 0x5D}, {0x53, 0x2A}, {0x53, 0x7F}, /* 0xE8-0xEB */
 	{0x53, 0x9F}, {0x53, 0x9D}, {0x53, 0xDF}, {0x54, 0xE8}, /* 0xEC-0xEF */
@@ -946,19 +948,19 @@
 	{0x63, 0x42}, {0x63, 0x46}, {0x63, 0x4F}, {0x63, 0x49}, /* 0xB8-0xBB */
 	{0x63, 0x3A}, {0x63, 0x50}, {0x63, 0x3D}, {0x63, 0x2A}, /* 0xBC-0xBF */
 	{0x63, 0x2B}, {0x63, 0x28}, {0x63, 0x4D}, {0x63, 0x4C}, /* 0xC0-0xC3 */
-	{0x65, 0x48}, {0x65, 0x49}, {0x65, 0x99}, {0x65, 0xC1}, /* 0xC4-0xC7 */
-	{0x65, 0xC5}, {0x66, 0x42}, {0x66, 0x49}, {0x66, 0x4F}, /* 0xC8-0xCB */
+	{0x65, 0x48}, {0x65, 0x49}, {0xF9, 0xBE}, {0x65, 0xC1}, /* 0xC4-0xC7 */
+	{0xF9, 0x83}, {0x66, 0x42}, {0x66, 0x49}, {0x66, 0x4F}, /* 0xC8-0xCB */
 	{0x66, 0x43}, {0x66, 0x52}, {0x66, 0x4C}, {0x66, 0x45}, /* 0xCC-0xCF */
 	{0x66, 0x41}, {0x66, 0xF8}, {0x67, 0x14}, {0x67, 0x15}, /* 0xD0-0xD3 */
-	{0x67, 0x17}, {0x68, 0x21}, {0x68, 0x38}, {0x68, 0x48}, /* 0xD4-0xD7 */
+	{0xF9, 0x29}, {0x68, 0x21}, {0x68, 0x38}, {0x68, 0x48}, /* 0xD4-0xD7 */
 	{0x68, 0x46}, {0x68, 0x53}, {0x68, 0x39}, {0x68, 0x42}, /* 0xD8-0xDB */
-	{0x68, 0x54}, {0x68, 0x29}, {0x68, 0xB3}, {0x68, 0x17}, /* 0xDC-0xDF */
+	{0x68, 0x54}, {0x68, 0x29}, {0x68, 0xB3}, {0xF9, 0xDA}, /* 0xDC-0xDF */
 	{0x68, 0x4C}, {0x68, 0x51}, {0x68, 0x3D}, {0x67, 0xF4}, /* 0xE0-0xE3 */
 	{0x68, 0x50}, {0x68, 0x40}, {0x68, 0x3C}, {0x68, 0x43}, /* 0xE4-0xE7 */
 	{0x68, 0x2A}, {0x68, 0x45}, {0x68, 0x13}, {0x68, 0x18}, /* 0xE8-0xEB */
 	{0x68, 0x41}, {0x6B, 0x8A}, {0x6B, 0x89}, {0x6B, 0xB7}, /* 0xEC-0xEF */
 	{0x6C, 0x23}, {0x6C, 0x27}, {0x6C, 0x28}, {0x6C, 0x26}, /* 0xF0-0xF3 */
-	{0x6C, 0x24}, {0x6C, 0xF0}, {0x6D, 0x6A}, {0x6D, 0x95}, /* 0xF4-0xF7 */
+	{0x6C, 0x24}, {0x6C, 0xF0}, {0xF9, 0x2A}, {0x6D, 0x95}, /* 0xF4-0xF7 */
 	{0x6D, 0x88}, {0x6D, 0x87}, {0x6D, 0x66}, {0x6D, 0x78}, /* 0xF8-0xFB */
 	{0x6D, 0x77}, {0x6D, 0x59}, {0x6D, 0x93}, {0x00, 0x3F}, /* 0xFC-0xFF */
 };
@@ -983,16 +985,16 @@
 	{0x6D, 0x6C}, {0x6D, 0x89}, {0x6D, 0x6E}, {0x6D, 0x5A}, /* 0x40-0x43 */
 	{0x6D, 0x74}, {0x6D, 0x69}, {0x6D, 0x8C}, {0x6D, 0x8A}, /* 0x44-0x47 */
 	{0x6D, 0x79}, {0x6D, 0x85}, {0x6D, 0x65}, {0x6D, 0x94}, /* 0x48-0x4B */
-	{0x70, 0xCA}, {0x70, 0xD8}, {0x70, 0xE4}, {0x70, 0xD9}, /* 0x4C-0x4F */
-	{0x70, 0xC8}, {0x70, 0xCF}, {0x72, 0x39}, {0x72, 0x79}, /* 0x50-0x53 */
-	{0x72, 0xFC}, {0x72, 0xF9}, {0x72, 0xFD}, {0x72, 0xF8}, /* 0x54-0x57 */
-	{0x72, 0xF7}, {0x73, 0x86}, {0x73, 0xED}, {0x74, 0x09}, /* 0x58-0x5B */
-	{0x73, 0xEE}, {0x73, 0xE0}, {0x73, 0xEA}, {0x73, 0xDE}, /* 0x5C-0x5F */
+	{0x70, 0xCA}, {0x70, 0xD8}, {0x70, 0xE4}, {0xF9, 0x16}, /* 0x4C-0x4F */
+	{0xF9, 0x9F}, {0x70, 0xCF}, {0x72, 0x39}, {0x72, 0x79}, /* 0x50-0x53 */
+	{0xF9, 0x2B}, {0x72, 0xF9}, {0x72, 0xFD}, {0x72, 0xF8}, /* 0x54-0x57 */
+	{0x72, 0xF7}, {0x73, 0x86}, {0x73, 0xED}, {0xF9, 0xCC}, /* 0x58-0x5B */
+	{0x73, 0xEE}, {0x73, 0xE0}, {0x73, 0xEA}, {0xF9, 0x17}, /* 0x5C-0x5F */
 	{0x75, 0x54}, {0x75, 0x5D}, {0x75, 0x5C}, {0x75, 0x5A}, /* 0x60-0x63 */
-	{0x75, 0x59}, {0x75, 0xBE}, {0x75, 0xC5}, {0x75, 0xC7}, /* 0x64-0x67 */
+	{0xF9, 0xCD}, {0x75, 0xBE}, {0x75, 0xC5}, {0x75, 0xC7}, /* 0x64-0x67 */
 	{0x75, 0xB2}, {0x75, 0xB3}, {0x75, 0xBD}, {0x75, 0xBC}, /* 0x68-0x6B */
 	{0x75, 0xB9}, {0x75, 0xC2}, {0x75, 0xB8}, {0x76, 0x8B}, /* 0x6C-0x6F */
-	{0x76, 0xB0}, {0x76, 0xCA}, {0x76, 0xCD}, {0x76, 0xCE}, /* 0x70-0x73 */
+	{0x76, 0xB0}, {0xFA, 0x17}, {0x76, 0xCD}, {0x76, 0xCE}, /* 0x70-0x73 */
 	{0x77, 0x29}, {0x77, 0x1F}, {0x77, 0x20}, {0x77, 0x28}, /* 0x74-0x77 */
 	{0x77, 0xE9}, {0x78, 0x30}, {0x78, 0x27}, {0x78, 0x38}, /* 0x78-0x7B */
 	{0x78, 0x1D}, {0x78, 0x34}, {0x78, 0x37}, {0x00, 0x3F}, /* 0x7C-0x7F */
@@ -1007,13 +1009,13 @@
 	{0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x9C-0x9F */
 	{0x00, 0x3F}, {0x78, 0x25}, {0x78, 0x2D}, {0x78, 0x20}, /* 0xA0-0xA3 */
 	{0x78, 0x1F}, {0x78, 0x32}, {0x79, 0x55}, {0x79, 0x50}, /* 0xA4-0xA7 */
-	{0x79, 0x60}, {0x79, 0x5F}, {0x79, 0x56}, {0x79, 0x5E}, /* 0xA8-0xAB */
+	{0x79, 0x60}, {0x79, 0x5F}, {0x79, 0x56}, {0xFA, 0x19}, /* 0xA8-0xAB */
 	{0x79, 0x5D}, {0x79, 0x57}, {0x79, 0x5A}, {0x79, 0xE4}, /* 0xAC-0xAF */
 	{0x79, 0xE3}, {0x79, 0xE7}, {0x79, 0xDF}, {0x79, 0xE6}, /* 0xB0-0xB3 */
 	{0x79, 0xE9}, {0x79, 0xD8}, {0x7A, 0x84}, {0x7A, 0x88}, /* 0xB4-0xB7 */
 	{0x7A, 0xD9}, {0x7B, 0x06}, {0x7B, 0x11}, {0x7C, 0x89}, /* 0xB8-0xBB */
 	{0x7D, 0x21}, {0x7D, 0x17}, {0x7D, 0x0B}, {0x7D, 0x0A}, /* 0xBC-0xBF */
-	{0x7D, 0x20}, {0x7D, 0x22}, {0x7D, 0x14}, {0x7D, 0x10}, /* 0xC0-0xC3 */
+	{0x7D, 0x20}, {0xF9, 0x6A}, {0x7D, 0x14}, {0xF9, 0xCF}, /* 0xC0-0xC3 */
 	{0x7D, 0x15}, {0x7D, 0x1A}, {0x7D, 0x1C}, {0x7D, 0x0D}, /* 0xC4-0xC7 */
 	{0x7D, 0x19}, {0x7D, 0x1B}, {0x7F, 0x3A}, {0x7F, 0x5F}, /* 0xC8-0xCB */
 	{0x7F, 0x94}, {0x7F, 0xC5}, {0x7F, 0xC1}, {0x80, 0x06}, /* 0xCC-0xCF */
@@ -1027,7 +1029,7 @@
 	{0x82, 0xBB}, {0x83, 0x2B}, {0x83, 0x52}, {0x83, 0x54}, /* 0xEC-0xEF */
 	{0x83, 0x4A}, {0x83, 0x38}, {0x83, 0x50}, {0x83, 0x49}, /* 0xF0-0xF3 */
 	{0x83, 0x35}, {0x83, 0x34}, {0x83, 0x4F}, {0x83, 0x32}, /* 0xF4-0xF7 */
-	{0x83, 0x39}, {0x83, 0x36}, {0x83, 0x17}, {0x83, 0x40}, /* 0xF8-0xFB */
+	{0x83, 0x39}, {0xF9, 0xFE}, {0x83, 0x17}, {0x83, 0x40}, /* 0xF8-0xFB */
 	{0x83, 0x31}, {0x83, 0x28}, {0x83, 0x43}, {0x00, 0x3F}, /* 0xFC-0xFF */
 };
 
@@ -1054,7 +1056,7 @@
 	{0x88, 0x82}, {0x88, 0x7D}, {0x88, 0x79}, {0x8A, 0x18}, /* 0x4C-0x4F */
 	{0x8A, 0x10}, {0x8A, 0x0E}, {0x8A, 0x0C}, {0x8A, 0x15}, /* 0x50-0x53 */
 	{0x8A, 0x0A}, {0x8A, 0x17}, {0x8A, 0x13}, {0x8A, 0x16}, /* 0x54-0x57 */
-	{0x8A, 0x0F}, {0x8A, 0x11}, {0x8C, 0x48}, {0x8C, 0x7A}, /* 0x58-0x5B */
+	{0x8A, 0x0F}, {0x8A, 0x11}, {0xF9, 0x00}, {0x8C, 0x7A}, /* 0x58-0x5B */
 	{0x8C, 0x79}, {0x8C, 0xA1}, {0x8C, 0xA2}, {0x8D, 0x77}, /* 0x5C-0x5F */
 	{0x8E, 0xAC}, {0x8E, 0xD2}, {0x8E, 0xD4}, {0x8E, 0xCF}, /* 0x60-0x63 */
 	{0x8F, 0xB1}, {0x90, 0x01}, {0x90, 0x06}, {0x8F, 0xF7}, /* 0x64-0x67 */
@@ -1082,10 +1084,10 @@
 	{0x50, 0x76}, {0x50, 0x4E}, {0x50, 0x55}, {0x50, 0x75}, /* 0xB8-0xBB */
 	{0x50, 0x74}, {0x50, 0x77}, {0x50, 0x4F}, {0x50, 0x0F}, /* 0xBC-0xBF */
 	{0x50, 0x6F}, {0x50, 0x6D}, {0x51, 0x5C}, {0x51, 0x95}, /* 0xC0-0xC3 */
-	{0x51, 0xF0}, {0x52, 0x6A}, {0x52, 0x6F}, {0x52, 0xD2}, /* 0xC4-0xC7 */
+	{0x51, 0xF0}, {0x52, 0x6A}, {0x52, 0x6F}, {0xF9, 0x52}, /* 0xC4-0xC7 */
 	{0x52, 0xD9}, {0x52, 0xD8}, {0x52, 0xD5}, {0x53, 0x10}, /* 0xC8-0xCB */
-	{0x53, 0x0F}, {0x53, 0x19}, {0x53, 0x3F}, {0x53, 0x40}, /* 0xCC-0xCF */
-	{0x53, 0x3E}, {0x53, 0xC3}, {0x66, 0xFC}, {0x55, 0x46}, /* 0xD0-0xD3 */
+	{0x53, 0x0F}, {0x53, 0x19}, {0xF9, 0xEB}, {0x53, 0x40}, /* 0xCC-0xCF */
+	{0x53, 0x3E}, {0xF9, 0x6B}, {0x66, 0xFC}, {0x55, 0x46}, /* 0xD0-0xD3 */
 	{0x55, 0x6A}, {0x55, 0x66}, {0x55, 0x44}, {0x55, 0x5E}, /* 0xD4-0xD7 */
 	{0x55, 0x61}, {0x55, 0x43}, {0x55, 0x4A}, {0x55, 0x31}, /* 0xD8-0xDB */
 	{0x55, 0x56}, {0x55, 0x4F}, {0x55, 0x55}, {0x55, 0x2F}, /* 0xDC-0xDF */
@@ -1122,7 +1124,7 @@
 	{0x5C, 0x09}, {0x5C, 0x08}, {0x5C, 0x07}, {0x5C, 0x60}, /* 0x4C-0x4F */
 	{0x5C, 0x5C}, {0x5C, 0x5D}, {0x5D, 0x07}, {0x5D, 0x06}, /* 0x50-0x53 */
 	{0x5D, 0x0E}, {0x5D, 0x1B}, {0x5D, 0x16}, {0x5D, 0x22}, /* 0x54-0x57 */
-	{0x5D, 0x11}, {0x5D, 0x29}, {0x5D, 0x14}, {0x5D, 0x19}, /* 0x58-0x5B */
+	{0x5D, 0x11}, {0x5D, 0x29}, {0x5D, 0x14}, {0xF9, 0xD5}, /* 0x58-0x5B */
 	{0x5D, 0x24}, {0x5D, 0x27}, {0x5D, 0x17}, {0x5D, 0xE2}, /* 0x5C-0x5F */
 	{0x5E, 0x38}, {0x5E, 0x36}, {0x5E, 0x33}, {0x5E, 0x37}, /* 0x60-0x63 */
 	{0x5E, 0xB7}, {0x5E, 0xB8}, {0x5E, 0xB6}, {0x5E, 0xB5}, /* 0x64-0x67 */
@@ -1145,26 +1147,26 @@
 	{0x60, 0xDC}, {0x60, 0xBC}, {0x60, 0xD8}, {0x60, 0xD5}, /* 0xA4-0xA7 */
 	{0x60, 0xC6}, {0x60, 0xDF}, {0x60, 0xB8}, {0x60, 0xDA}, /* 0xA8-0xAB */
 	{0x60, 0xC7}, {0x62, 0x1A}, {0x62, 0x1B}, {0x62, 0x48}, /* 0xAC-0xAF */
-	{0x63, 0xA0}, {0x63, 0xA7}, {0x63, 0x72}, {0x63, 0x96}, /* 0xB0-0xB3 */
+	{0xF9, 0x75}, {0x63, 0xA7}, {0x63, 0x72}, {0x63, 0x96}, /* 0xB0-0xB3 */
 	{0x63, 0xA2}, {0x63, 0xA5}, {0x63, 0x77}, {0x63, 0x67}, /* 0xB4-0xB7 */
 	{0x63, 0x98}, {0x63, 0xAA}, {0x63, 0x71}, {0x63, 0xA9}, /* 0xB8-0xBB */
 	{0x63, 0x89}, {0x63, 0x83}, {0x63, 0x9B}, {0x63, 0x6B}, /* 0xBC-0xBF */
 	{0x63, 0xA8}, {0x63, 0x84}, {0x63, 0x88}, {0x63, 0x99}, /* 0xC0-0xC3 */
 	{0x63, 0xA1}, {0x63, 0xAC}, {0x63, 0x92}, {0x63, 0x8F}, /* 0xC4-0xC7 */
-	{0x63, 0x80}, {0x63, 0x7B}, {0x63, 0x69}, {0x63, 0x68}, /* 0xC8-0xCB */
+	{0x63, 0x80}, {0xF9, 0xA4}, {0x63, 0x69}, {0x63, 0x68}, /* 0xC8-0xCB */
 	{0x63, 0x7A}, {0x65, 0x5D}, {0x65, 0x56}, {0x65, 0x51}, /* 0xCC-0xCF */
 	{0x65, 0x59}, {0x65, 0x57}, {0x55, 0x5F}, {0x65, 0x4F}, /* 0xD0-0xD3 */
 	{0x65, 0x58}, {0x65, 0x55}, {0x65, 0x54}, {0x65, 0x9C}, /* 0xD4-0xD7 */
 	{0x65, 0x9B}, {0x65, 0xAC}, {0x65, 0xCF}, {0x65, 0xCB}, /* 0xD8-0xDB */
 	{0x65, 0xCC}, {0x65, 0xCE}, {0x66, 0x5D}, {0x66, 0x5A}, /* 0xDC-0xDF */
 	{0x66, 0x64}, {0x66, 0x68}, {0x66, 0x66}, {0x66, 0x5E}, /* 0xE0-0xE3 */
-	{0x66, 0xF9}, {0x52, 0xD7}, {0x67, 0x1B}, {0x68, 0x81}, /* 0xE4-0xE7 */
+	{0x66, 0xF9}, {0x52, 0xD7}, {0x67, 0x1B}, {0xF9, 0x7A}, /* 0xE4-0xE7 */
 	{0x68, 0xAF}, {0x68, 0xA2}, {0x68, 0x93}, {0x68, 0xB5}, /* 0xE8-0xEB */
 	{0x68, 0x7F}, {0x68, 0x76}, {0x68, 0xB1}, {0x68, 0xA7}, /* 0xEC-0xEF */
 	{0x68, 0x97}, {0x68, 0xB0}, {0x68, 0x83}, {0x68, 0xC4}, /* 0xF0-0xF3 */
 	{0x68, 0xAD}, {0x68, 0x86}, {0x68, 0x85}, {0x68, 0x94}, /* 0xF4-0xF7 */
-	{0x68, 0x9D}, {0x68, 0xA8}, {0x68, 0x9F}, {0x68, 0xA1}, /* 0xF8-0xFB */
-	{0x68, 0x82}, {0x6B, 0x32}, {0x6B, 0xBA}, {0x00, 0x3F}, /* 0xFC-0xFF */
+	{0x68, 0x9D}, {0xF9, 0xE2}, {0x68, 0x9F}, {0x68, 0xA1}, /* 0xF8-0xFB */
+	{0x68, 0x82}, {0x6B, 0x32}, {0xF9, 0x70}, {0x00, 0x3F}, /* 0xFC-0xFF */
 };
 
 static struct nls_unicode c2u_B2[256] = {
@@ -1187,18 +1189,18 @@
 	{0x6B, 0xEB}, {0x6B, 0xEC}, {0x6C, 0x2B}, {0x6D, 0x8E}, /* 0x40-0x43 */
 	{0x6D, 0xBC}, {0x6D, 0xF3}, {0x6D, 0xD9}, {0x6D, 0xB2}, /* 0x44-0x47 */
 	{0x6D, 0xE1}, {0x6D, 0xCC}, {0x6D, 0xE4}, {0x6D, 0xFB}, /* 0x48-0x4B */
-	{0x6D, 0xFA}, {0x6E, 0x05}, {0x6D, 0xC7}, {0x6D, 0xCB}, /* 0x4C-0x4F */
+	{0x6D, 0xFA}, {0x6E, 0x05}, {0x6D, 0xC7}, {0xF9, 0xF5}, /* 0x4C-0x4F */
 	{0x6D, 0xAF}, {0x6D, 0xD1}, {0x6D, 0xAE}, {0x6D, 0xDE}, /* 0x50-0x53 */
 	{0x6D, 0xF9}, {0x6D, 0xB8}, {0x6D, 0xF7}, {0x6D, 0xF5}, /* 0x54-0x57 */
 	{0x6D, 0xC5}, {0x6D, 0xD2}, {0x6E, 0x1A}, {0x6D, 0xB5}, /* 0x58-0x5B */
-	{0x6D, 0xDA}, {0x6D, 0xEB}, {0x6D, 0xD8}, {0x6D, 0xEA}, /* 0x5C-0x5F */
+	{0xF9, 0x4D}, {0x6D, 0xEB}, {0x6D, 0xD8}, {0xF9, 0xD6}, /* 0x5C-0x5F */
 	{0x6D, 0xF1}, {0x6D, 0xEE}, {0x6D, 0xE8}, {0x6D, 0xC6}, /* 0x60-0x63 */
 	{0x6D, 0xC4}, {0x6D, 0xAA}, {0x6D, 0xEC}, {0x6D, 0xBF}, /* 0x64-0x67 */
 	{0x6D, 0xE6}, {0x70, 0xF9}, {0x71, 0x09}, {0x71, 0x0A}, /* 0x68-0x6B */
 	{0x70, 0xFD}, {0x70, 0xEF}, {0x72, 0x3D}, {0x72, 0x7D}, /* 0x6C-0x6F */
 	{0x72, 0x81}, {0x73, 0x1C}, {0x73, 0x1B}, {0x73, 0x16}, /* 0x70-0x73 */
-	{0x73, 0x13}, {0x73, 0x19}, {0x73, 0x87}, {0x74, 0x05}, /* 0x74-0x77 */
-	{0x74, 0x0A}, {0x74, 0x03}, {0x74, 0x06}, {0x73, 0xFE}, /* 0x78-0x7B */
+	{0x73, 0x13}, {0x73, 0x19}, {0xF9, 0xDB}, {0x74, 0x05}, /* 0x74-0x77 */
+	{0x74, 0x0A}, {0x74, 0x03}, {0xF9, 0xE4}, {0x73, 0xFE}, /* 0x78-0x7B */
 	{0x74, 0x0D}, {0x74, 0xE0}, {0x74, 0xF6}, {0x00, 0x3F}, /* 0x7C-0x7F */
 	
 	{0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x80-0x83 */
@@ -1210,22 +1212,22 @@
 	{0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x98-0x9B */
 	{0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x9C-0x9F */
 	{0x00, 0x3F}, {0x74, 0xF7}, {0x75, 0x1C}, {0x75, 0x22}, /* 0xA0-0xA3 */
-	{0x75, 0x65}, {0x75, 0x66}, {0x75, 0x62}, {0x75, 0x70}, /* 0xA4-0xA7 */
+	{0xF9, 0x76}, {0x75, 0x66}, {0x75, 0x62}, {0xF9, 0x62}, /* 0xA4-0xA7 */
 	{0x75, 0x8F}, {0x75, 0xD4}, {0x75, 0xD5}, {0x75, 0xB5}, /* 0xA8-0xAB */
 	{0x75, 0xCA}, {0x75, 0xCD}, {0x76, 0x8E}, {0x76, 0xD4}, /* 0xAC-0xAF */
 	{0x76, 0xD2}, {0x76, 0xDB}, {0x77, 0x37}, {0x77, 0x3E}, /* 0xB0-0xB3 */
 	{0x77, 0x3C}, {0x77, 0x36}, {0x77, 0x38}, {0x77, 0x3A}, /* 0xB4-0xB7 */
-	{0x78, 0x6B}, {0x78, 0x43}, {0x78, 0x4E}, {0x79, 0x65}, /* 0xB8-0xBB */
+	{0xF9, 0xCE}, {0x78, 0x43}, {0x78, 0x4E}, {0xFA, 0x1A}, /* 0xB8-0xBB */
 	{0x79, 0x68}, {0x79, 0x6D}, {0x79, 0xFB}, {0x7A, 0x92}, /* 0xBC-0xBF */
-	{0x7A, 0x95}, {0x7B, 0x20}, {0x7B, 0x28}, {0x7B, 0x1B}, /* 0xC0-0xC3 */
+	{0x7A, 0x95}, {0xF9, 0xF8}, {0x7B, 0x28}, {0x7B, 0x1B}, /* 0xC0-0xC3 */
 	{0x7B, 0x2C}, {0x7B, 0x26}, {0x7B, 0x19}, {0x7B, 0x1E}, /* 0xC4-0xC7 */
-	{0x7B, 0x2E}, {0x7C, 0x92}, {0x7C, 0x97}, {0x7C, 0x95}, /* 0xC8-0xCB */
+	{0x7B, 0x2E}, {0xF9, 0xF9}, {0x7C, 0x97}, {0x7C, 0x95}, /* 0xC8-0xCB */
 	{0x7D, 0x46}, {0x7D, 0x43}, {0x7D, 0x71}, {0x7D, 0x2E}, /* 0xCC-0xCF */
 	{0x7D, 0x39}, {0x7D, 0x3C}, {0x7D, 0x40}, {0x7D, 0x30}, /* 0xD0-0xD3 */
-	{0x7D, 0x33}, {0x7D, 0x44}, {0x7D, 0x2F}, {0x7D, 0x42}, /* 0xD4-0xD7 */
+	{0x7D, 0x33}, {0x7D, 0x44}, {0xF9, 0x4F}, {0x7D, 0x42}, /* 0xD4-0xD7 */
 	{0x7D, 0x32}, {0x7D, 0x31}, {0x7F, 0x3D}, {0x7F, 0x9E}, /* 0xD8-0xDB */
-	{0x7F, 0x9A}, {0x7F, 0xCC}, {0x7F, 0xCE}, {0x7F, 0xD2}, /* 0xDC-0xDF */
-	{0x80, 0x1C}, {0x80, 0x4A}, {0x80, 0x46}, {0x81, 0x2F}, /* 0xE0-0xE3 */
+	{0xF9, 0xAF}, {0x7F, 0xCC}, {0x7F, 0xCE}, {0x7F, 0xD2}, /* 0xDC-0xDF */
+	{0x80, 0x1C}, {0x80, 0x4A}, {0xF9, 0xB0}, {0x81, 0x2F}, /* 0xE0-0xE3 */
 	{0x81, 0x16}, {0x81, 0x23}, {0x81, 0x2B}, {0x81, 0x29}, /* 0xE4-0xE7 */
 	{0x81, 0x30}, {0x81, 0x24}, {0x82, 0x02}, {0x82, 0x35}, /* 0xE8-0xEB */
 	{0x82, 0x37}, {0x82, 0x36}, {0x82, 0x39}, {0x83, 0x8E}, /* 0xEC-0xEF */
@@ -1264,7 +1266,7 @@
 	{0x8C, 0xAC}, {0x8C, 0xAB}, {0x8C, 0xA8}, {0x8C, 0xAA}, /* 0x64-0x67 */
 	{0x8C, 0xA7}, {0x8D, 0x67}, {0x8D, 0x66}, {0x8D, 0xBE}, /* 0x68-0x6B */
 	{0x8D, 0xBA}, {0x8E, 0xDB}, {0x8E, 0xDF}, {0x90, 0x19}, /* 0x6C-0x6F */
-	{0x90, 0x0D}, {0x90, 0x1A}, {0x90, 0x17}, {0x90, 0x23}, /* 0x70-0x73 */
+	{0x90, 0x0D}, {0x90, 0x1A}, {0x90, 0x17}, {0xF9, 0x9A}, /* 0x70-0x73 */
 	{0x90, 0x1F}, {0x90, 0x1D}, {0x90, 0x10}, {0x90, 0x15}, /* 0x74-0x77 */
 	{0x90, 0x1E}, {0x90, 0x20}, {0x90, 0x0F}, {0x90, 0x22}, /* 0x78-0x7B */
 	{0x90, 0x16}, {0x90, 0x1B}, {0x90, 0x14}, {0x00, 0x3F}, /* 0x7C-0x7F */
@@ -1277,23 +1279,23 @@
 	{0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x94-0x97 */
 	{0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x98-0x9B */
 	{0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x9C-0x9F */
-	{0x00, 0x3F}, {0x90, 0xE8}, {0x90, 0xED}, {0x90, 0xFD}, /* 0xA0-0xA3 */
+	{0x00, 0x3F}, {0x90, 0xE8}, {0x90, 0xED}, {0xFA, 0x26}, /* 0xA0-0xA3 */
 	{0x91, 0x57}, {0x91, 0xCE}, {0x91, 0xF5}, {0x91, 0xE6}, /* 0xA4-0xA7 */
 	{0x91, 0xE3}, {0x91, 0xE7}, {0x91, 0xED}, {0x91, 0xE9}, /* 0xA8-0xAB */
-	{0x95, 0x89}, {0x96, 0x6A}, {0x96, 0x75}, {0x96, 0x73}, /* 0xAC-0xAF */
-	{0x96, 0x78}, {0x96, 0x70}, {0x96, 0x74}, {0x96, 0x76}, /* 0xB0-0xB3 */
+	{0x95, 0x89}, {0x96, 0x6A}, {0xF9, 0x59}, {0x96, 0x73}, /* 0xAC-0xAF */
+	{0xF9, 0xD3}, {0x96, 0x70}, {0x96, 0x74}, {0x96, 0x76}, /* 0xB0-0xB3 */
 	{0x96, 0x77}, {0x96, 0x6C}, {0x96, 0xC0}, {0x96, 0xEA}, /* 0xB4-0xB7 */
 	{0x96, 0xE9}, {0x7A, 0xE0}, {0x7A, 0xDF}, {0x98, 0x02}, /* 0xB8-0xBB */
 	{0x98, 0x03}, {0x9B, 0x5A}, {0x9C, 0xE5}, {0x9E, 0x75}, /* 0xBC-0xBF */
-	{0x9E, 0x7F}, {0x9E, 0xA5}, {0x9E, 0xBB}, {0x50, 0xA2}, /* 0xC0-0xC3 */
+	{0xF9, 0x40}, {0x9E, 0xA5}, {0x9E, 0xBB}, {0x50, 0xA2}, /* 0xC0-0xC3 */
 	{0x50, 0x8D}, {0x50, 0x85}, {0x50, 0x99}, {0x50, 0x91}, /* 0xC4-0xC7 */
 	{0x50, 0x80}, {0x50, 0x96}, {0x50, 0x98}, {0x50, 0x9A}, /* 0xC8-0xCB */
 	{0x67, 0x00}, {0x51, 0xF1}, {0x52, 0x72}, {0x52, 0x74}, /* 0xCC-0xCF */
-	{0x52, 0x75}, {0x52, 0x69}, {0x52, 0xDE}, {0x52, 0xDD}, /* 0xD0-0xD3 */
+	{0x52, 0x75}, {0x52, 0x69}, {0xF9, 0x2F}, {0x52, 0xDD}, /* 0xD0-0xD3 */
 	{0x52, 0xDB}, {0x53, 0x5A}, {0x53, 0xA5}, {0x55, 0x7B}, /* 0xD4-0xD7 */
 	{0x55, 0x80}, {0x55, 0xA7}, {0x55, 0x7C}, {0x55, 0x8A}, /* 0xD8-0xDB */
 	{0x55, 0x9D}, {0x55, 0x98}, {0x55, 0x82}, {0x55, 0x9C}, /* 0xDC-0xDF */
-	{0x55, 0xAA}, {0x55, 0x94}, {0x55, 0x87}, {0x55, 0x8B}, /* 0xE0-0xE3 */
+	{0x55, 0xAA}, {0x55, 0x94}, {0xF9, 0x0B}, {0x55, 0x8B}, /* 0xE0-0xE3 */
 	{0x55, 0x83}, {0x55, 0xB3}, {0x55, 0xAE}, {0x55, 0x9F}, /* 0xE4-0xE7 */
 	{0x55, 0x3E}, {0x55, 0xB2}, {0x55, 0x9A}, {0x55, 0xBB}, /* 0xE8-0xEB */
 	{0x55, 0xAC}, {0x55, 0xB1}, {0x55, 0x7E}, {0x55, 0x89}, /* 0xEC-0xEF */
@@ -1324,11 +1326,11 @@
 	{0x5A, 0x9B}, {0x5A, 0xA7}, {0x5B, 0x73}, {0x5B, 0x71}, /* 0x44-0x47 */
 	{0x5B, 0xD2}, {0x5B, 0xCC}, {0x5B, 0xD3}, {0x5B, 0xD0}, /* 0x48-0x4B */
 	{0x5C, 0x0A}, {0x5C, 0x0B}, {0x5C, 0x31}, {0x5D, 0x4C}, /* 0x4C-0x4F */
-	{0x5D, 0x50}, {0x5D, 0x34}, {0x5D, 0x47}, {0x5D, 0xFD}, /* 0x50-0x53 */
+	{0xF9, 0x21}, {0x5D, 0x34}, {0x5D, 0x47}, {0x5D, 0xFD}, /* 0x50-0x53 */
 	{0x5E, 0x45}, {0x5E, 0x3D}, {0x5E, 0x40}, {0x5E, 0x43}, /* 0x54-0x57 */
-	{0x5E, 0x7E}, {0x5E, 0xCA}, {0x5E, 0xC1}, {0x5E, 0xC2}, /* 0x58-0x5B */
-	{0x5E, 0xC4}, {0x5F, 0x3C}, {0x5F, 0x6D}, {0x5F, 0xA9}, /* 0x5C-0x5F */
-	{0x5F, 0xAA}, {0x5F, 0xA8}, {0x60, 0xD1}, {0x60, 0xE1}, /* 0x60-0x63 */
+	{0x5E, 0x7E}, {0xF9, 0x28}, {0x5E, 0xC1}, {0x5E, 0xC2}, /* 0x58-0x5B */
+	{0x5E, 0xC4}, {0x5F, 0x3C}, {0x5F, 0x6D}, {0xF9, 0x66}, /* 0x5C-0x5F */
+	{0x5F, 0xAA}, {0x5F, 0xA8}, {0x60, 0xD1}, {0xF9, 0xB9}, /* 0x60-0x63 */
 	{0x60, 0xB2}, {0x60, 0xB6}, {0x60, 0xE0}, {0x61, 0x1C}, /* 0x64-0x67 */
 	{0x61, 0x23}, {0x60, 0xFA}, {0x61, 0x15}, {0x60, 0xF0}, /* 0x68-0x6B */
 	{0x60, 0xFB}, {0x60, 0xF4}, {0x61, 0x68}, {0x60, 0xF1}, /* 0x6C-0x6F */
@@ -1351,7 +1353,7 @@
 	{0x64, 0x52}, {0x63, 0xDA}, {0x63, 0xF9}, {0x65, 0x5E}, /* 0xAC-0xAF */
 	{0x65, 0x66}, {0x65, 0x62}, {0x65, 0x63}, {0x65, 0x91}, /* 0xB0-0xB3 */
 	{0x65, 0x90}, {0x65, 0xAF}, {0x66, 0x6E}, {0x66, 0x70}, /* 0xB4-0xB7 */
-	{0x66, 0x74}, {0x66, 0x76}, {0x66, 0x6F}, {0x66, 0x91}, /* 0xB8-0xBB */
+	{0xFA, 0x12}, {0x66, 0x76}, {0x66, 0x6F}, {0x66, 0x91}, /* 0xB8-0xBB */
 	{0x66, 0x7A}, {0x66, 0x7E}, {0x66, 0x77}, {0x66, 0xFE}, /* 0xBC-0xBF */
 	{0x66, 0xFF}, {0x67, 0x1F}, {0x67, 0x1D}, {0x68, 0xFA}, /* 0xC0-0xC3 */
 	{0x68, 0xD5}, {0x68, 0xE0}, {0x68, 0xD8}, {0x68, 0xD7}, /* 0xC4-0xC7 */
@@ -1397,7 +1399,7 @@
 	{0x74, 0x2A}, {0x74, 0x33}, {0x74, 0x22}, {0x74, 0x25}, /* 0x58-0x5B */
 	{0x74, 0x35}, {0x74, 0x36}, {0x74, 0x34}, {0x74, 0x2F}, /* 0x5C-0x5F */
 	{0x74, 0x1B}, {0x74, 0x26}, {0x74, 0x28}, {0x75, 0x25}, /* 0x60-0x63 */
-	{0x75, 0x26}, {0x75, 0x6B}, {0x75, 0x6A}, {0x75, 0xE2}, /* 0x64-0x67 */
+	{0x75, 0x26}, {0x75, 0x6B}, {0x75, 0x6A}, {0xF9, 0xE5}, /* 0x64-0x67 */
 	{0x75, 0xDB}, {0x75, 0xE3}, {0x75, 0xD9}, {0x75, 0xD8}, /* 0x68-0x6B */
 	{0x75, 0xDE}, {0x75, 0xE0}, {0x76, 0x7B}, {0x76, 0x7C}, /* 0x6C-0x6F */
 	{0x76, 0x96}, {0x76, 0x93}, {0x76, 0xB4}, {0x76, 0xDC}, /* 0x70-0x73 */
@@ -1427,14 +1429,14 @@
 	{0x81, 0x53}, {0x81, 0x74}, {0x82, 0x12}, {0x82, 0x1C}, /* 0xCC-0xCF */
 	{0x83, 0xE9}, {0x84, 0x03}, {0x83, 0xF8}, {0x84, 0x0D}, /* 0xD0-0xD3 */
 	{0x83, 0xE0}, {0x83, 0xC5}, {0x84, 0x0B}, {0x83, 0xC1}, /* 0xD4-0xD7 */
-	{0x83, 0xEF}, {0x83, 0xF1}, {0x83, 0xF4}, {0x84, 0x57}, /* 0xD8-0xDB */
+	{0x83, 0xEF}, {0xF9, 0x58}, {0x83, 0xF4}, {0x84, 0x57}, /* 0xD8-0xDB */
 	{0x84, 0x0A}, {0x83, 0xF0}, {0x84, 0x0C}, {0x83, 0xCC}, /* 0xDC-0xDF */
 	{0x83, 0xFD}, {0x83, 0xF2}, {0x83, 0xCA}, {0x84, 0x38}, /* 0xE0-0xE3 */
 	{0x84, 0x0E}, {0x84, 0x04}, {0x83, 0xDC}, {0x84, 0x07}, /* 0xE4-0xE7 */
 	{0x83, 0xD4}, {0x83, 0xDF}, {0x86, 0x5B}, {0x86, 0xDF}, /* 0xE8-0xEB */
 	{0x86, 0xD9}, {0x86, 0xED}, {0x86, 0xD4}, {0x86, 0xDB}, /* 0xEC-0xEF */
 	{0x86, 0xE4}, {0x86, 0xD0}, {0x86, 0xDE}, {0x88, 0x57}, /* 0xF0-0xF3 */
-	{0x88, 0xC1}, {0x88, 0xC2}, {0x88, 0xB1}, {0x89, 0x83}, /* 0xF4-0xF7 */
+	{0x88, 0xC1}, {0xF9, 0xA0}, {0x88, 0xB1}, {0x89, 0x83}, /* 0xF4-0xF7 */
 	{0x89, 0x96}, {0x8A, 0x3B}, {0x8A, 0x60}, {0x8A, 0x55}, /* 0xF8-0xFB */
 	{0x8A, 0x5E}, {0x8A, 0x3C}, {0x8A, 0x41}, {0x00, 0x3F}, /* 0xFC-0xFF */
 };
@@ -1466,9 +1468,9 @@
 	{0x8D, 0xDA}, {0x8D, 0xD1}, {0x8D, 0xCC}, {0x8D, 0xDB}, /* 0x5C-0x5F */
 	{0x8D, 0xC6}, {0x8E, 0xFB}, {0x8E, 0xF8}, {0x8E, 0xFC}, /* 0x60-0x63 */
 	{0x8F, 0x9C}, {0x90, 0x2E}, {0x90, 0x35}, {0x90, 0x31}, /* 0x64-0x67 */
-	{0x90, 0x38}, {0x90, 0x32}, {0x90, 0x36}, {0x91, 0x02}, /* 0x68-0x6B */
+	{0xFA, 0x25}, {0x90, 0x32}, {0x90, 0x36}, {0x91, 0x02}, /* 0x68-0x6B */
 	{0x90, 0xF5}, {0x91, 0x09}, {0x90, 0xFE}, {0x91, 0x63}, /* 0x6C-0x6F */
-	{0x91, 0x65}, {0x91, 0xCF}, {0x92, 0x14}, {0x92, 0x15}, /* 0x70-0x73 */
+	{0x91, 0x65}, {0xF9, 0x7E}, {0x92, 0x14}, {0x92, 0x15}, /* 0x70-0x73 */
 	{0x92, 0x23}, {0x92, 0x09}, {0x92, 0x1E}, {0x92, 0x0D}, /* 0x74-0x77 */
 	{0x92, 0x10}, {0x92, 0x07}, {0x92, 0x11}, {0x95, 0x94}, /* 0x78-0x7B */
 	{0x95, 0x8F}, {0x95, 0x8B}, {0x95, 0x91}, {0x00, 0x3F}, /* 0x7C-0x7F */
@@ -1483,13 +1485,13 @@
 	{0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x9C-0x9F */
 	{0x00, 0x3F}, {0x95, 0x93}, {0x95, 0x92}, {0x95, 0x8E}, /* 0xA0-0xA3 */
 	{0x96, 0x8A}, {0x96, 0x8E}, {0x96, 0x8B}, {0x96, 0x7D}, /* 0xA4-0xA7 */
-	{0x96, 0x85}, {0x96, 0x86}, {0x96, 0x8D}, {0x96, 0x72}, /* 0xA8-0xAB */
+	{0x96, 0x85}, {0xF9, 0xDC}, {0x96, 0x8D}, {0x96, 0x72}, /* 0xA8-0xAB */
 	{0x96, 0x84}, {0x96, 0xC1}, {0x96, 0xC5}, {0x96, 0xC4}, /* 0xAC-0xAF */
 	{0x96, 0xC6}, {0x96, 0xC7}, {0x96, 0xEF}, {0x96, 0xF2}, /* 0xB0-0xB3 */
 	{0x97, 0xCC}, {0x98, 0x05}, {0x98, 0x06}, {0x98, 0x08}, /* 0xB4-0xB7 */
-	{0x98, 0xE7}, {0x98, 0xEA}, {0x98, 0xEF}, {0x98, 0xE9}, /* 0xB8-0xBB */
+	{0x98, 0xE7}, {0x98, 0xEA}, {0xFA, 0x2A}, {0x98, 0xE9}, /* 0xB8-0xBB */
 	{0x98, 0xF2}, {0x98, 0xED}, {0x99, 0xAE}, {0x99, 0xAD}, /* 0xBC-0xBF */
-	{0x9E, 0xC3}, {0x9E, 0xCD}, {0x9E, 0xD1}, {0x4E, 0x82}, /* 0xC0-0xC3 */
+	{0x9E, 0xC3}, {0x9E, 0xCD}, {0x9E, 0xD1}, {0xF9, 0x1B}, /* 0xC0-0xC3 */
 	{0x50, 0xAD}, {0x50, 0xB5}, {0x50, 0xB2}, {0x50, 0xB3}, /* 0xC4-0xC7 */
 	{0x50, 0xC5}, {0x50, 0xBE}, {0x50, 0xAC}, {0x50, 0xB7}, /* 0xC8-0xCB */
 	{0x50, 0xBB}, {0x50, 0xAF}, {0x50, 0xC7}, {0x52, 0x7F}, /* 0xCC-0xCF */
@@ -1499,8 +1501,8 @@
 	{0x55, 0xCE}, {0x55, 0xDC}, {0x55, 0xC7}, {0x55, 0xD1}, /* 0xDC-0xDF */
 	{0x55, 0xE3}, {0x55, 0xE4}, {0x55, 0xEF}, {0x55, 0xDA}, /* 0xE0-0xE3 */
 	{0x55, 0xE1}, {0x55, 0xC5}, {0x55, 0xC6}, {0x55, 0xE5}, /* 0xE4-0xE7 */
-	{0x55, 0xC9}, {0x57, 0x12}, {0x57, 0x13}, {0x58, 0x5E}, /* 0xE8-0xEB */
-	{0x58, 0x51}, {0x58, 0x58}, {0x58, 0x57}, {0x58, 0x5A}, /* 0xEC-0xEF */
+	{0x55, 0xC9}, {0x57, 0x12}, {0x57, 0x13}, {0xF9, 0x6C}, /* 0xE8-0xEB */
+	{0x58, 0x51}, {0x58, 0x58}, {0x58, 0x57}, {0xFA, 0x10}, /* 0xEC-0xEF */
 	{0x58, 0x54}, {0x58, 0x6B}, {0x58, 0x4C}, {0x58, 0x6D}, /* 0xF0-0xF3 */
 	{0x58, 0x4A}, {0x58, 0x62}, {0x58, 0x52}, {0x58, 0x4B}, /* 0xF4-0xF7 */
 	{0x59, 0x67}, {0x5A, 0xC1}, {0x5A, 0xC9}, {0x5A, 0xCC}, /* 0xF8-0xFB */
@@ -1525,19 +1527,19 @@
 	{0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */
 	{0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */
 	{0x5A, 0xB3}, {0x5A, 0xC2}, {0x5A, 0xB2}, {0x5D, 0x69}, /* 0x40-0x43 */
-	{0x5D, 0x6F}, {0x5E, 0x4C}, {0x5E, 0x79}, {0x5E, 0xC9}, /* 0x44-0x47 */
+	{0x5D, 0x6F}, {0x5E, 0x4C}, {0x5E, 0x79}, {0xF9, 0xA2}, /* 0x44-0x47 */
 	{0x5E, 0xC8}, {0x5F, 0x12}, {0x5F, 0x59}, {0x5F, 0xAC}, /* 0x48-0x4B */
 	{0x5F, 0xAE}, {0x61, 0x1A}, {0x61, 0x0F}, {0x61, 0x48}, /* 0x4C-0x4F */
 	{0x61, 0x1F}, {0x60, 0xF3}, {0x61, 0x1B}, {0x60, 0xF9}, /* 0x50-0x53 */
 	{0x61, 0x01}, {0x61, 0x08}, {0x61, 0x4E}, {0x61, 0x4C}, /* 0x54-0x57 */
-	{0x61, 0x44}, {0x61, 0x4D}, {0x61, 0x3E}, {0x61, 0x34}, /* 0x58-0x5B */
+	{0xF9, 0xD9}, {0x61, 0x4D}, {0x61, 0x3E}, {0x61, 0x34}, /* 0x58-0x5B */
 	{0x61, 0x27}, {0x61, 0x0D}, {0x61, 0x06}, {0x61, 0x37}, /* 0x5C-0x5F */
 	{0x62, 0x21}, {0x62, 0x22}, {0x64, 0x13}, {0x64, 0x3E}, /* 0x60-0x63 */
 	{0x64, 0x1E}, {0x64, 0x2A}, {0x64, 0x2D}, {0x64, 0x3D}, /* 0x64-0x67 */
 	{0x64, 0x2C}, {0x64, 0x0F}, {0x64, 0x1C}, {0x64, 0x14}, /* 0x68-0x6B */
 	{0x64, 0x0D}, {0x64, 0x36}, {0x64, 0x16}, {0x64, 0x17}, /* 0x6C-0x6F */
 	{0x64, 0x06}, {0x65, 0x6C}, {0x65, 0x9F}, {0x65, 0xB0}, /* 0x70-0x73 */
-	{0x66, 0x97}, {0x66, 0x89}, {0x66, 0x87}, {0x66, 0x88}, /* 0x74-0x77 */
+	{0x66, 0x97}, {0x66, 0x89}, {0x66, 0x87}, {0xF9, 0xC5}, /* 0x74-0x77 */
 	{0x66, 0x96}, {0x66, 0x84}, {0x66, 0x98}, {0x66, 0x8D}, /* 0x78-0x7B */
 	{0x67, 0x03}, {0x69, 0x94}, {0x69, 0x6D}, {0x00, 0x3F}, /* 0x7C-0x7F */
 	
@@ -1558,10 +1560,10 @@
 	{0x6E, 0xA2}, {0x6E, 0xAF}, {0x6E, 0xD3}, {0x6E, 0xB6}, /* 0xB8-0xBB */
 	{0x6E, 0xC2}, {0x6E, 0x90}, {0x6E, 0x9D}, {0x6E, 0xC7}, /* 0xBC-0xBF */
 	{0x6E, 0xC5}, {0x6E, 0xA5}, {0x6E, 0x98}, {0x6E, 0xBC}, /* 0xC0-0xC3 */
-	{0x6E, 0xBA}, {0x6E, 0xAB}, {0x6E, 0xD1}, {0x6E, 0x96}, /* 0xC4-0xC7 */
-	{0x6E, 0x9C}, {0x6E, 0xC4}, {0x6E, 0xD4}, {0x6E, 0xAA}, /* 0xC8-0xCB */
+	{0xF9, 0xEC}, {0x6E, 0xAB}, {0xF9, 0x04}, {0x6E, 0x96}, /* 0xC4-0xC7 */
+	{0xF9, 0xCB}, {0x6E, 0xC4}, {0x6E, 0xD4}, {0x6E, 0xAA}, /* 0xC8-0xCB */
 	{0x6E, 0xA7}, {0x6E, 0xB4}, {0x71, 0x4E}, {0x71, 0x59}, /* 0xCC-0xCF */
-	{0x71, 0x69}, {0x71, 0x64}, {0x71, 0x49}, {0x71, 0x67}, /* 0xD0-0xD3 */
+	{0x71, 0x69}, {0x71, 0x64}, {0xF9, 0x93}, {0x71, 0x67}, /* 0xD0-0xD3 */
 	{0x71, 0x5C}, {0x71, 0x6C}, {0x71, 0x66}, {0x71, 0x4C}, /* 0xD4-0xD7 */
 	{0x71, 0x65}, {0x71, 0x5E}, {0x71, 0x46}, {0x71, 0x68}, /* 0xD8-0xDB */
 	{0x71, 0x56}, {0x72, 0x3A}, {0x72, 0x52}, {0x73, 0x37}, /* 0xDC-0xDF */
@@ -1595,9 +1597,9 @@
 	{0x77, 0x79}, {0x77, 0x6A}, {0x77, 0x6C}, {0x77, 0x5C}, /* 0x40-0x43 */
 	{0x77, 0x65}, {0x77, 0x68}, {0x77, 0x62}, {0x77, 0xEE}, /* 0x44-0x47 */
 	{0x78, 0x8E}, {0x78, 0xB0}, {0x78, 0x97}, {0x78, 0x98}, /* 0x48-0x4B */
-	{0x78, 0x8C}, {0x78, 0x89}, {0x78, 0x7C}, {0x78, 0x91}, /* 0x4C-0x4F */
-	{0x78, 0x93}, {0x78, 0x7F}, {0x79, 0x7A}, {0x79, 0x7F}, /* 0x50-0x53 */
-	{0x79, 0x81}, {0x84, 0x2C}, {0x79, 0xBD}, {0x7A, 0x1C}, /* 0x54-0x57 */
+	{0xF9, 0x3B}, {0x78, 0x89}, {0x78, 0x7C}, {0x78, 0x91}, /* 0x4C-0x4F */
+	{0x78, 0x93}, {0x78, 0x7F}, {0x79, 0x7A}, {0xF9, 0x3C}, /* 0x50-0x53 */
+	{0x79, 0x81}, {0x84, 0x2C}, {0x79, 0xBD}, {0xF9, 0x56}, /* 0x54-0x57 */
 	{0x7A, 0x1A}, {0x7A, 0x20}, {0x7A, 0x14}, {0x7A, 0x1F}, /* 0x58-0x5B */
 	{0x7A, 0x1E}, {0x7A, 0x9F}, {0x7A, 0xA0}, {0x7B, 0x77}, /* 0x5C-0x5F */
 	{0x7B, 0xC0}, {0x7B, 0x60}, {0x7B, 0x6E}, {0x7B, 0x67}, /* 0x60-0x63 */
@@ -1619,26 +1621,26 @@
 	{0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x9C-0x9F */
 	{0x00, 0x3F}, {0x81, 0x79}, {0x81, 0x7A}, {0x81, 0x66}, /* 0xA0-0xA3 */
 	{0x82, 0x05}, {0x82, 0x47}, {0x84, 0x82}, {0x84, 0x77}, /* 0xA4-0xA7 */
-	{0x84, 0x3D}, {0x84, 0x31}, {0x84, 0x75}, {0x84, 0x66}, /* 0xA8-0xAB */
-	{0x84, 0x6B}, {0x84, 0x49}, {0x84, 0x6C}, {0x84, 0x5B}, /* 0xAC-0xAF */
+	{0xF9, 0x18}, {0x84, 0x31}, {0x84, 0x75}, {0x84, 0x66}, /* 0xA8-0xAB */
+	{0x84, 0x6B}, {0xF9, 0x6E}, {0x84, 0x6C}, {0x84, 0x5B}, /* 0xAC-0xAF */
 	{0x84, 0x3C}, {0x84, 0x35}, {0x84, 0x61}, {0x84, 0x63}, /* 0xB0-0xB3 */
 	{0x84, 0x69}, {0x84, 0x6D}, {0x84, 0x46}, {0x86, 0x5E}, /* 0xB4-0xB7 */
-	{0x86, 0x5C}, {0x86, 0x5F}, {0x86, 0xF9}, {0x87, 0x13}, /* 0xB8-0xBB */
+	{0xF9, 0x36}, {0x86, 0x5F}, {0x86, 0xF9}, {0x87, 0x13}, /* 0xB8-0xBB */
 	{0x87, 0x08}, {0x87, 0x07}, {0x87, 0x00}, {0x86, 0xFE}, /* 0xBC-0xBF */
 	{0x86, 0xFB}, {0x87, 0x02}, {0x87, 0x03}, {0x87, 0x06}, /* 0xC0-0xC3 */
 	{0x87, 0x0A}, {0x88, 0x59}, {0x88, 0xDF}, {0x88, 0xD4}, /* 0xC4-0xC7 */
 	{0x88, 0xD9}, {0x88, 0xDC}, {0x88, 0xD8}, {0x88, 0xDD}, /* 0xC8-0xCB */
-	{0x88, 0xE1}, {0x88, 0xCA}, {0x88, 0xD5}, {0x88, 0xD2}, /* 0xCC-0xCF */
+	{0xF9, 0xE8}, {0x88, 0xCA}, {0x88, 0xD5}, {0x88, 0xD2}, /* 0xCC-0xCF */
 	{0x89, 0x9C}, {0x89, 0xE3}, {0x8A, 0x6B}, {0x8A, 0x72}, /* 0xD0-0xD3 */
 	{0x8A, 0x73}, {0x8A, 0x66}, {0x8A, 0x69}, {0x8A, 0x70}, /* 0xD4-0xD7 */
 	{0x8A, 0x87}, {0x8A, 0x7C}, {0x8A, 0x63}, {0x8A, 0xA0}, /* 0xD8-0xDB */
 	{0x8A, 0x71}, {0x8A, 0x85}, {0x8A, 0x6D}, {0x8A, 0x62}, /* 0xDC-0xDF */
 	{0x8A, 0x6E}, {0x8A, 0x6C}, {0x8A, 0x79}, {0x8A, 0x7B}, /* 0xE0-0xE3 */
 	{0x8A, 0x3E}, {0x8A, 0x68}, {0x8C, 0x62}, {0x8C, 0x8A}, /* 0xE4-0xE7 */
-	{0x8C, 0x89}, {0x8C, 0xCA}, {0x8C, 0xC7}, {0x8C, 0xC8}, /* 0xE8-0xEB */
-	{0x8C, 0xC4}, {0x8C, 0xB2}, {0x8C, 0xC3}, {0x8C, 0xC2}, /* 0xEC-0xEF */
+	{0x8C, 0x89}, {0x8C, 0xCA}, {0x8C, 0xC7}, {0xF9, 0x03}, /* 0xE8-0xEB */
+	{0x8C, 0xC4}, {0x8C, 0xB2}, {0x8C, 0xC3}, {0xF9, 0x48}, /* 0xEC-0xEF */
 	{0x8C, 0xC5}, {0x8D, 0xE1}, {0x8D, 0xDF}, {0x8D, 0xE8}, /* 0xF0-0xF3 */
-	{0x8D, 0xEF}, {0x8D, 0xF3}, {0x8D, 0xFA}, {0x8D, 0xEA}, /* 0xF4-0xF7 */
+	{0xF9, 0x37}, {0x8D, 0xF3}, {0x8D, 0xFA}, {0x8D, 0xEA}, /* 0xF4-0xF7 */
 	{0x8D, 0xE4}, {0x8D, 0xE6}, {0x8E, 0xB2}, {0x8F, 0x03}, /* 0xF8-0xFB */
 	{0x8F, 0x09}, {0x8E, 0xFE}, {0x8F, 0x0A}, {0x00, 0x3F}, /* 0xFC-0xFF */
 };
@@ -1665,17 +1667,17 @@
 	{0x90, 0x55}, {0x90, 0x50}, {0x90, 0x47}, {0x90, 0x4F}, /* 0x48-0x4B */
 	{0x90, 0x4E}, {0x90, 0x4D}, {0x90, 0x51}, {0x90, 0x3E}, /* 0x4C-0x4F */
 	{0x90, 0x41}, {0x91, 0x12}, {0x91, 0x17}, {0x91, 0x6C}, /* 0x50-0x53 */
-	{0x91, 0x6A}, {0x91, 0x69}, {0x91, 0xC9}, {0x92, 0x37}, /* 0x54-0x57 */
+	{0xF9, 0x19}, {0x91, 0x69}, {0x91, 0xC9}, {0x92, 0x37}, /* 0x54-0x57 */
 	{0x92, 0x57}, {0x92, 0x38}, {0x92, 0x3D}, {0x92, 0x40}, /* 0x58-0x5B */
 	{0x92, 0x3E}, {0x92, 0x5B}, {0x92, 0x4B}, {0x92, 0x64}, /* 0x5C-0x5F */
-	{0x92, 0x51}, {0x92, 0x34}, {0x92, 0x49}, {0x92, 0x4D}, /* 0x60-0x63 */
+	{0x92, 0x51}, {0xF9, 0xB1}, {0x92, 0x49}, {0x92, 0x4D}, /* 0x60-0x63 */
 	{0x92, 0x45}, {0x92, 0x39}, {0x92, 0x3F}, {0x92, 0x5A}, /* 0x64-0x67 */
 	{0x95, 0x98}, {0x96, 0x98}, {0x96, 0x94}, {0x96, 0x95}, /* 0x68-0x6B */
 	{0x96, 0xCD}, {0x96, 0xCB}, {0x96, 0xC9}, {0x96, 0xCA}, /* 0x6C-0x6F */
-	{0x96, 0xF7}, {0x96, 0xFB}, {0x96, 0xF9}, {0x96, 0xF6}, /* 0x70-0x73 */
-	{0x97, 0x56}, {0x97, 0x74}, {0x97, 0x76}, {0x98, 0x10}, /* 0x74-0x77 */
+	{0xF9, 0x49}, {0x96, 0xFB}, {0x96, 0xF9}, {0xF9, 0xB2}, /* 0x70-0x73 */
+	{0xFA, 0x1C}, {0x97, 0x74}, {0x97, 0x76}, {0x98, 0x10}, /* 0x74-0x77 */
 	{0x98, 0x11}, {0x98, 0x13}, {0x98, 0x0A}, {0x98, 0x12}, /* 0x78-0x7B */
-	{0x98, 0x0C}, {0x98, 0xFC}, {0x98, 0xF4}, {0x00, 0x3F}, /* 0x7C-0x7F */
+	{0x98, 0x0C}, {0xFA, 0x2B}, {0x98, 0xF4}, {0x00, 0x3F}, /* 0x7C-0x7F */
 	
 	{0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x80-0x83 */
 	{0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x84-0x87 */
@@ -1689,7 +1691,7 @@
 	{0x99, 0xB1}, {0x99, 0xB4}, {0x9A, 0xE1}, {0x9C, 0xE9}, /* 0xA4-0xA7 */
 	{0x9E, 0x82}, {0x9F, 0x0E}, {0x9F, 0x13}, {0x9F, 0x20}, /* 0xA8-0xAB */
 	{0x50, 0xE7}, {0x50, 0xEE}, {0x50, 0xE5}, {0x50, 0xD6}, /* 0xAC-0xAF */
-	{0x50, 0xED}, {0x50, 0xDA}, {0x50, 0xD5}, {0x50, 0xCF}, /* 0xB0-0xB3 */
+	{0x50, 0xED}, {0xF9, 0xBB}, {0x50, 0xD5}, {0x50, 0xCF}, /* 0xB0-0xB3 */
 	{0x50, 0xD1}, {0x50, 0xF1}, {0x50, 0xCE}, {0x50, 0xE9}, /* 0xB4-0xB7 */
 	{0x51, 0x62}, {0x51, 0xF3}, {0x52, 0x83}, {0x52, 0x82}, /* 0xB8-0xBB */
 	{0x53, 0x31}, {0x53, 0xAD}, {0x55, 0xFE}, {0x56, 0x00}, /* 0xBC-0xBF */
@@ -1702,12 +1704,12 @@
 	{0x58, 0xFD}, {0x59, 0x25}, {0x59, 0x22}, {0x59, 0x24}, /* 0xD8-0xDB */
 	{0x59, 0x6A}, {0x59, 0x69}, {0x5A, 0xE1}, {0x5A, 0xE6}, /* 0xDC-0xDF */
 	{0x5A, 0xE9}, {0x5A, 0xD7}, {0x5A, 0xD6}, {0x5A, 0xD8}, /* 0xE0-0xE3 */
-	{0x5A, 0xE3}, {0x5B, 0x75}, {0x5B, 0xDE}, {0x5B, 0xE7}, /* 0xE4-0xE7 */
+	{0x5A, 0xE3}, {0x5B, 0x75}, {0x5B, 0xDE}, {0xF9, 0xAA}, /* 0xE4-0xE7 */
 	{0x5B, 0xE1}, {0x5B, 0xE5}, {0x5B, 0xE6}, {0x5B, 0xE8}, /* 0xE8-0xEB */
 	{0x5B, 0xE2}, {0x5B, 0xE4}, {0x5B, 0xDF}, {0x5C, 0x0D}, /* 0xEC-0xEF */
-	{0x5C, 0x62}, {0x5D, 0x84}, {0x5D, 0x87}, {0x5E, 0x5B}, /* 0xF0-0xF3 */
+	{0xF9, 0x4B}, {0x5D, 0x84}, {0x5D, 0x87}, {0x5E, 0x5B}, /* 0xF0-0xF3 */
 	{0x5E, 0x63}, {0x5E, 0x55}, {0x5E, 0x57}, {0x5E, 0x54}, /* 0xF4-0xF7 */
-	{0x5E, 0xD3}, {0x5E, 0xD6}, {0x5F, 0x0A}, {0x5F, 0x46}, /* 0xF8-0xFB */
+	{0xFA, 0x0B}, {0x5E, 0xD6}, {0x5F, 0x0A}, {0x5F, 0x46}, /* 0xF8-0xFB */
 	{0x5F, 0x70}, {0x5F, 0xB9}, {0x61, 0x47}, {0x00, 0x3F}, /* 0xFC-0xFF */
 };
 
@@ -1743,7 +1745,7 @@
 	{0x6B, 0x49}, {0x6B, 0x4C}, {0x6C, 0x33}, {0x6F, 0x33}, /* 0x70-0x73 */
 	{0x6F, 0x14}, {0x6E, 0xFE}, {0x6F, 0x13}, {0x6E, 0xF4}, /* 0x74-0x77 */
 	{0x6F, 0x29}, {0x6F, 0x3E}, {0x6F, 0x20}, {0x6F, 0x2C}, /* 0x78-0x7B */
-	{0x6F, 0x0F}, {0x6F, 0x02}, {0x6F, 0x22}, {0x00, 0x3F}, /* 0x7C-0x7F */
+	{0xF9, 0x4E}, {0x6F, 0x02}, {0x6F, 0x22}, {0x00, 0x3F}, /* 0x7C-0x7F */
 	
 	{0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x80-0x83 */
 	{0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x84-0x87 */
@@ -1754,7 +1756,7 @@
 	{0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x98-0x9B */
 	{0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x9C-0x9F */
 	{0x00, 0x3F}, {0x6E, 0xFF}, {0x6E, 0xEF}, {0x6F, 0x06}, /* 0xA0-0xA3 */
-	{0x6F, 0x31}, {0x6F, 0x38}, {0x6F, 0x32}, {0x6F, 0x23}, /* 0xA4-0xA7 */
+	{0x6F, 0x31}, {0x6F, 0x38}, {0x6F, 0x32}, {0xF9, 0x92}, /* 0xA4-0xA7 */
 	{0x6F, 0x15}, {0x6F, 0x2B}, {0x6F, 0x2F}, {0x6F, 0x88}, /* 0xA8-0xAB */
 	{0x6F, 0x2A}, {0x6E, 0xEC}, {0x6F, 0x01}, {0x6E, 0xF2}, /* 0xAC-0xAF */
 	{0x6E, 0xCC}, {0x6E, 0xF7}, {0x71, 0x94}, {0x71, 0x99}, /* 0xB0-0xB3 */
@@ -1766,14 +1768,14 @@
 	{0x76, 0x13}, {0x76, 0xE1}, {0x76, 0xE3}, {0x77, 0x84}, /* 0xC8-0xCB */
 	{0x77, 0x7D}, {0x77, 0x7F}, {0x77, 0x61}, {0x78, 0xC1}, /* 0xCC-0xCF */
 	{0x78, 0x9F}, {0x78, 0xA7}, {0x78, 0xB3}, {0x78, 0xA9}, /* 0xD0-0xD3 */
-	{0x78, 0xA3}, {0x79, 0x8E}, {0x79, 0x8F}, {0x79, 0x8D}, /* 0xD4-0xD7 */
+	{0x78, 0xA3}, {0x79, 0x8E}, {0xFA, 0x1B}, {0x79, 0x8D}, /* 0xD4-0xD7 */
 	{0x7A, 0x2E}, {0x7A, 0x31}, {0x7A, 0xAA}, {0x7A, 0xA9}, /* 0xD8-0xDB */
 	{0x7A, 0xED}, {0x7A, 0xEF}, {0x7B, 0xA1}, {0x7B, 0x95}, /* 0xDC-0xDF */
 	{0x7B, 0x8B}, {0x7B, 0x75}, {0x7B, 0x97}, {0x7B, 0x9D}, /* 0xE0-0xE3 */
 	{0x7B, 0x94}, {0x7B, 0x8F}, {0x7B, 0xB8}, {0x7B, 0x87}, /* 0xE4-0xE7 */
-	{0x7B, 0x84}, {0x7C, 0xB9}, {0x7C, 0xBD}, {0x7C, 0xBE}, /* 0xE8-0xEB */
+	{0x7B, 0x84}, {0x7C, 0xB9}, {0x7C, 0xBD}, {0xFA, 0x1D}, /* 0xE8-0xEB */
 	{0x7D, 0xBB}, {0x7D, 0xB0}, {0x7D, 0x9C}, {0x7D, 0xBD}, /* 0xEC-0xEF */
-	{0x7D, 0xBE}, {0x7D, 0xA0}, {0x7D, 0xCA}, {0x7D, 0xB4}, /* 0xF0-0xF3 */
+	{0xF9, 0x57}, {0xF9, 0x3D}, {0x7D, 0xCA}, {0x7D, 0xB4}, /* 0xF0-0xF3 */
 	{0x7D, 0xB2}, {0x7D, 0xB1}, {0x7D, 0xBA}, {0x7D, 0xA2}, /* 0xF4-0xF7 */
 	{0x7D, 0xBF}, {0x7D, 0xB5}, {0x7D, 0xB8}, {0x7D, 0xAD}, /* 0xF8-0xFB */
 	{0x7D, 0xD2}, {0x7D, 0xC7}, {0x7D, 0xAC}, {0x00, 0x3F}, /* 0xFC-0xFF */
@@ -1808,7 +1810,7 @@
 	{0x87, 0x3F}, {0x87, 0x1C}, {0x87, 0x3B}, {0x87, 0x22}, /* 0x64-0x67 */
 	{0x87, 0x25}, {0x87, 0x34}, {0x87, 0x18}, {0x87, 0x55}, /* 0x68-0x6B */
 	{0x87, 0x37}, {0x87, 0x29}, {0x88, 0xF3}, {0x89, 0x02}, /* 0x6C-0x6F */
-	{0x88, 0xF4}, {0x88, 0xF9}, {0x88, 0xF8}, {0x88, 0xFD}, /* 0x70-0x73 */
+	{0x88, 0xF4}, {0x88, 0xF9}, {0xF9, 0x12}, {0x88, 0xFD}, /* 0x70-0x73 */
 	{0x88, 0xE8}, {0x89, 0x1A}, {0x88, 0xEF}, {0x8A, 0xA6}, /* 0x74-0x77 */
 	{0x8A, 0x8C}, {0x8A, 0x9E}, {0x8A, 0xA3}, {0x8A, 0x8D}, /* 0x78-0x7B */
 	{0x8A, 0xA1}, {0x8A, 0x93}, {0x8A, 0xA4}, {0x00, 0x3F}, /* 0x7C-0x7F */
@@ -1821,7 +1823,7 @@
 	{0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x94-0x97 */
 	{0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x98-0x9B */
 	{0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x9C-0x9F */
-	{0x00, 0x3F}, {0x8A, 0xAA}, {0x8A, 0xA5}, {0x8A, 0xA8}, /* 0xA0-0xA3 */
+	{0x00, 0x3F}, {0xF9, 0xA1}, {0x8A, 0xA5}, {0x8A, 0xA8}, /* 0xA0-0xA3 */
 	{0x8A, 0x98}, {0x8A, 0x91}, {0x8A, 0x9A}, {0x8A, 0xA7}, /* 0xA4-0xA7 */
 	{0x8C, 0x6A}, {0x8C, 0x8D}, {0x8C, 0x8C}, {0x8C, 0xD3}, /* 0xA8-0xAB */
 	{0x8C, 0xD1}, {0x8C, 0xD2}, {0x8D, 0x6B}, {0x8D, 0x99}, /* 0xAC-0xAF */
@@ -1837,14 +1839,14 @@
 	{0x95, 0xA9}, {0x95, 0xA3}, {0x95, 0xA5}, {0x95, 0xA4}, /* 0xD4-0xD7 */
 	{0x96, 0x99}, {0x96, 0x9C}, {0x96, 0x9B}, {0x96, 0xCC}, /* 0xD8-0xDB */
 	{0x96, 0xD2}, {0x97, 0x00}, {0x97, 0x7C}, {0x97, 0x85}, /* 0xDC-0xDF */
-	{0x97, 0xF6}, {0x98, 0x17}, {0x98, 0x18}, {0x98, 0xAF}, /* 0xE0-0xE3 */
+	{0x97, 0xF6}, {0x98, 0x17}, {0xF9, 0xB4}, {0x98, 0xAF}, /* 0xE0-0xE3 */
 	{0x98, 0xB1}, {0x99, 0x03}, {0x99, 0x05}, {0x99, 0x0C}, /* 0xE4-0xE7 */
 	{0x99, 0x09}, {0x99, 0xC1}, {0x9A, 0xAF}, {0x9A, 0xB0}, /* 0xE8-0xEB */
 	{0x9A, 0xE6}, {0x9B, 0x41}, {0x9B, 0x42}, {0x9C, 0xF4}, /* 0xEC-0xEF */
 	{0x9C, 0xF6}, {0x9C, 0xF3}, {0x9E, 0xBC}, {0x9F, 0x3B}, /* 0xF0-0xF3 */
 	{0x9F, 0x4A}, {0x51, 0x04}, {0x51, 0x00}, {0x50, 0xFB}, /* 0xF4-0xF7 */
 	{0x50, 0xF5}, {0x50, 0xF9}, {0x51, 0x02}, {0x51, 0x08}, /* 0xF8-0xFB */
-	{0x51, 0x09}, {0x51, 0x05}, {0x51, 0xDC}, {0x00, 0x3F}, /* 0xFC-0xFF */
+	{0x51, 0x09}, {0x51, 0x05}, {0xF9, 0x54}, {0x00, 0x3F}, /* 0xFC-0xFF */
 };
 
 static struct nls_unicode c2u_BC[256] = {
@@ -1864,7 +1866,7 @@
 	{0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */
 	{0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */
 	{0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */
-	{0x52, 0x87}, {0x52, 0x88}, {0x52, 0x89}, {0x52, 0x8D}, /* 0x40-0x43 */
+	{0x52, 0x87}, {0x52, 0x88}, {0xF9, 0xC7}, {0x52, 0x8D}, /* 0x40-0x43 */
 	{0x52, 0x8A}, {0x52, 0xF0}, {0x53, 0xB2}, {0x56, 0x2E}, /* 0x44-0x47 */
 	{0x56, 0x3B}, {0x56, 0x39}, {0x56, 0x32}, {0x56, 0x3F}, /* 0x48-0x4B */
 	{0x56, 0x34}, {0x56, 0x29}, {0x56, 0x53}, {0x56, 0x4E}, /* 0x4C-0x4F */
@@ -1873,8 +1875,8 @@
 	{0x58, 0xB3}, {0x58, 0x9C}, {0x58, 0xAE}, {0x58, 0xA9}, /* 0x58-0x5B */
 	{0x58, 0xA6}, {0x59, 0x6D}, {0x5B, 0x09}, {0x5A, 0xFB}, /* 0x5C-0x5F */
 	{0x5B, 0x0B}, {0x5A, 0xF5}, {0x5B, 0x0C}, {0x5B, 0x08}, /* 0x60-0x63 */
-	{0x5B, 0xEE}, {0x5B, 0xEC}, {0x5B, 0xE9}, {0x5B, 0xEB}, /* 0x64-0x67 */
-	{0x5C, 0x64}, {0x5C, 0x65}, {0x5D, 0x9D}, {0x5D, 0x94}, /* 0x68-0x6B */
+	{0xF9, 0xBC}, {0x5B, 0xEC}, {0x5B, 0xE9}, {0x5B, 0xEB}, /* 0x64-0x67 */
+	{0x5C, 0x64}, {0xF9, 0xDF}, {0x5D, 0x9D}, {0x5D, 0x94}, /* 0x68-0x6B */
 	{0x5E, 0x62}, {0x5E, 0x5F}, {0x5E, 0x61}, {0x5E, 0xE2}, /* 0x6C-0x6F */
 	{0x5E, 0xDA}, {0x5E, 0xDF}, {0x5E, 0xDD}, {0x5E, 0xE3}, /* 0x70-0x73 */
 	{0x5E, 0xE0}, {0x5F, 0x48}, {0x5F, 0x71}, {0x5F, 0xB7}, /* 0x74-0x77 */
@@ -1890,19 +1892,19 @@
 	{0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x98-0x9B */
 	{0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x9C-0x9F */
 	{0x00, 0x3F}, {0x61, 0x7C}, {0x61, 0x70}, {0x61, 0x6B}, /* 0xA0-0xA3 */
-	{0x61, 0x7E}, {0x61, 0xA7}, {0x61, 0x90}, {0x61, 0xAB}, /* 0xA4-0xA7 */
+	{0x61, 0x7E}, {0x61, 0xA7}, {0xF9, 0x8F}, {0x61, 0xAB}, /* 0xA4-0xA7 */
 	{0x61, 0x8E}, {0x61, 0xAC}, {0x61, 0x9A}, {0x61, 0xA4}, /* 0xA8-0xAB */
-	{0x61, 0x94}, {0x61, 0xAE}, {0x62, 0x2E}, {0x64, 0x69}, /* 0xAC-0xAF */
+	{0x61, 0x94}, {0x61, 0xAE}, {0xF9, 0xD2}, {0x64, 0x69}, /* 0xAC-0xAF */
 	{0x64, 0x6F}, {0x64, 0x79}, {0x64, 0x9E}, {0x64, 0xB2}, /* 0xB0-0xB3 */
 	{0x64, 0x88}, {0x64, 0x90}, {0x64, 0xB0}, {0x64, 0xA5}, /* 0xB4-0xB7 */
 	{0x64, 0x93}, {0x64, 0x95}, {0x64, 0xA9}, {0x64, 0x92}, /* 0xB8-0xBB */
-	{0x64, 0xAE}, {0x64, 0xAD}, {0x64, 0xAB}, {0x64, 0x9A}, /* 0xBC-0xBF */
+	{0x64, 0xAE}, {0x64, 0xAD}, {0x64, 0xAB}, {0xF9, 0x91}, /* 0xBC-0xBF */
 	{0x64, 0xAC}, {0x64, 0x99}, {0x64, 0xA2}, {0x64, 0xB3}, /* 0xC0-0xC3 */
-	{0x65, 0x75}, {0x65, 0x77}, {0x65, 0x78}, {0x66, 0xAE}, /* 0xC4-0xC7 */
-	{0x66, 0xAB}, {0x66, 0xB4}, {0x66, 0xB1}, {0x6A, 0x23}, /* 0xC8-0xCB */
+	{0x65, 0x75}, {0x65, 0x77}, {0xF9, 0x69}, {0x66, 0xAE}, /* 0xC4-0xC7 */
+	{0x66, 0xAB}, {0xFA, 0x06}, {0x66, 0xB1}, {0x6A, 0x23}, /* 0xC8-0xCB */
 	{0x6A, 0x1F}, {0x69, 0xE8}, {0x6A, 0x01}, {0x6A, 0x1E}, /* 0xCC-0xCF */
-	{0x6A, 0x19}, {0x69, 0xFD}, {0x6A, 0x21}, {0x6A, 0x13}, /* 0xD0-0xD3 */
-	{0x6A, 0x0A}, {0x69, 0xF3}, {0x6A, 0x02}, {0x6A, 0x05}, /* 0xD4-0xD7 */
+	{0x6A, 0x19}, {0x69, 0xFD}, {0x6A, 0x21}, {0xF9, 0x4C}, /* 0xD0-0xD3 */
+	{0x6A, 0x0A}, {0x69, 0xF3}, {0xF9, 0xBF}, {0x6A, 0x05}, /* 0xD4-0xD7 */
 	{0x69, 0xED}, {0x6A, 0x11}, {0x6B, 0x50}, {0x6B, 0x4E}, /* 0xD8-0xDB */
 	{0x6B, 0xA4}, {0x6B, 0xC5}, {0x6B, 0xC6}, {0x6F, 0x3F}, /* 0xDC-0xDF */
 	{0x6F, 0x7C}, {0x6F, 0x84}, {0x6F, 0x51}, {0x6F, 0x66}, /* 0xE0-0xE3 */
@@ -1912,7 +1914,7 @@
 	{0x6E, 0xD5}, {0x6F, 0x6F}, {0x6F, 0x60}, {0x6F, 0x5F}, /* 0xF0-0xF3 */
 	{0x71, 0x9F}, {0x71, 0xAC}, {0x71, 0xB1}, {0x71, 0xA8}, /* 0xF4-0xF7 */
 	{0x72, 0x56}, {0x72, 0x9B}, {0x73, 0x4E}, {0x73, 0x57}, /* 0xF8-0xFB */
-	{0x74, 0x69}, {0x74, 0x8B}, {0x74, 0x83}, {0x00, 0x3F}, /* 0xFC-0xFF */
+	{0xF9, 0xAE}, {0x74, 0x8B}, {0x74, 0x83}, {0x00, 0x3F}, /* 0xFC-0xFF */
 };
 
 static struct nls_unicode c2u_BD[256] = {
@@ -1937,13 +1939,13 @@
 	{0x76, 0x21}, {0x76, 0x22}, {0x76, 0x9A}, {0x76, 0xBA}, /* 0x48-0x4B */
 	{0x76, 0xE4}, {0x77, 0x8E}, {0x77, 0x87}, {0x77, 0x8C}, /* 0x4C-0x4F */
 	{0x77, 0x91}, {0x77, 0x8B}, {0x78, 0xCB}, {0x78, 0xC5}, /* 0x50-0x53 */
-	{0x78, 0xBA}, {0x78, 0xCA}, {0x78, 0xBE}, {0x78, 0xD5}, /* 0x54-0x57 */
+	{0x78, 0xBA}, {0xF9, 0x47}, {0x78, 0xBE}, {0x78, 0xD5}, /* 0x54-0x57 */
 	{0x78, 0xBC}, {0x78, 0xD0}, {0x7A, 0x3F}, {0x7A, 0x3C}, /* 0x58-0x5B */
 	{0x7A, 0x40}, {0x7A, 0x3D}, {0x7A, 0x37}, {0x7A, 0x3B}, /* 0x5C-0x5F */
 	{0x7A, 0xAF}, {0x7A, 0xAE}, {0x7B, 0xAD}, {0x7B, 0xB1}, /* 0x60-0x63 */
 	{0x7B, 0xC4}, {0x7B, 0xB4}, {0x7B, 0xC6}, {0x7B, 0xC7}, /* 0x64-0x67 */
 	{0x7B, 0xC1}, {0x7B, 0xA0}, {0x7B, 0xCC}, {0x7C, 0xCA}, /* 0x68-0x6B */
-	{0x7D, 0xE0}, {0x7D, 0xF4}, {0x7D, 0xEF}, {0x7D, 0xFB}, /* 0x6C-0x6F */
+	{0x7D, 0xE0}, {0xF9, 0x96}, {0x7D, 0xEF}, {0x7D, 0xFB}, /* 0x6C-0x6F */
 	{0x7D, 0xD8}, {0x7D, 0xEC}, {0x7D, 0xDD}, {0x7D, 0xE8}, /* 0x70-0x73 */
 	{0x7D, 0xE3}, {0x7D, 0xDA}, {0x7D, 0xDE}, {0x7D, 0xE9}, /* 0x74-0x77 */
 	{0x7D, 0x9E}, {0x7D, 0xD9}, {0x7D, 0xF2}, {0x7D, 0xF9}, /* 0x78-0x7B */
@@ -1960,7 +1962,7 @@
 	{0x00, 0x3F}, {0x7F, 0xE9}, {0x80, 0x26}, {0x81, 0x9B}, /* 0xA0-0xA3 */
 	{0x81, 0x9C}, {0x81, 0x9D}, {0x81, 0xA0}, {0x81, 0x9A}, /* 0xA4-0xA7 */
 	{0x81, 0x98}, {0x85, 0x17}, {0x85, 0x3D}, {0x85, 0x1A}, /* 0xA8-0xAB */
-	{0x84, 0xEE}, {0x85, 0x2C}, {0x85, 0x2D}, {0x85, 0x13}, /* 0xAC-0xAF */
+	{0xF9, 0x99}, {0x85, 0x2C}, {0x85, 0x2D}, {0x85, 0x13}, /* 0xAC-0xAF */
 	{0x85, 0x11}, {0x85, 0x23}, {0x85, 0x21}, {0x85, 0x14}, /* 0xB0-0xB3 */
 	{0x84, 0xEC}, {0x85, 0x25}, {0x84, 0xFF}, {0x85, 0x06}, /* 0xB4-0xB7 */
 	{0x87, 0x82}, {0x87, 0x74}, {0x87, 0x76}, {0x87, 0x60}, /* 0xB8-0xBB */
@@ -1968,19 +1970,19 @@
 	{0x87, 0x57}, {0x87, 0x4C}, {0x87, 0x53}, {0x88, 0x5B}, /* 0xC0-0xC3 */
 	{0x88, 0x5D}, {0x89, 0x10}, {0x89, 0x07}, {0x89, 0x12}, /* 0xC4-0xC7 */
 	{0x89, 0x13}, {0x89, 0x15}, {0x89, 0x0A}, {0x8A, 0xBC}, /* 0xC8-0xCB */
-	{0x8A, 0xD2}, {0x8A, 0xC7}, {0x8A, 0xC4}, {0x8A, 0x95}, /* 0xCC-0xCF */
-	{0x8A, 0xCB}, {0x8A, 0xF8}, {0x8A, 0xB2}, {0x8A, 0xC9}, /* 0xD0-0xD3 */
-	{0x8A, 0xC2}, {0x8A, 0xBF}, {0x8A, 0xB0}, {0x8A, 0xD6}, /* 0xD4-0xD7 */
+	{0xF9, 0x7D}, {0x8A, 0xC7}, {0x8A, 0xC4}, {0x8A, 0x95}, /* 0xCC-0xCF */
+	{0x8A, 0xCB}, {0xFA, 0x22}, {0x8A, 0xB2}, {0x8A, 0xC9}, /* 0xD0-0xD3 */
+	{0x8A, 0xC2}, {0x8A, 0xBF}, {0x8A, 0xB0}, {0xF9, 0x41}, /* 0xD4-0xD7 */
 	{0x8A, 0xCD}, {0x8A, 0xB6}, {0x8A, 0xB9}, {0x8A, 0xDB}, /* 0xD8-0xDB */
-	{0x8C, 0x4C}, {0x8C, 0x4E}, {0x8C, 0x6C}, {0x8C, 0xE0}, /* 0xDC-0xDF */
+	{0x8C, 0x4C}, {0x8C, 0x4E}, {0xFA, 0x16}, {0x8C, 0xE0}, /* 0xDC-0xDF */
 	{0x8C, 0xDE}, {0x8C, 0xE6}, {0x8C, 0xE4}, {0x8C, 0xEC}, /* 0xE0-0xE3 */
 	{0x8C, 0xED}, {0x8C, 0xE2}, {0x8C, 0xE3}, {0x8C, 0xDC}, /* 0xE4-0xE7 */
 	{0x8C, 0xEA}, {0x8C, 0xE1}, {0x8D, 0x6D}, {0x8D, 0x9F}, /* 0xE8-0xEB */
 	{0x8D, 0xA3}, {0x8E, 0x2B}, {0x8E, 0x10}, {0x8E, 0x1D}, /* 0xEC-0xEF */
 	{0x8E, 0x22}, {0x8E, 0x0F}, {0x8E, 0x29}, {0x8E, 0x1F}, /* 0xF0-0xF3 */
 	{0x8E, 0x21}, {0x8E, 0x1E}, {0x8E, 0xBA}, {0x8F, 0x1D}, /* 0xF4-0xF7 */
-	{0x8F, 0x1B}, {0x8F, 0x1F}, {0x8F, 0x29}, {0x8F, 0x26}, /* 0xF8-0xFB */
-	{0x8F, 0x2A}, {0x8F, 0x1C}, {0x8F, 0x1E}, {0x00, 0x3F}, /* 0xFC-0xFF */
+	{0x8F, 0x1B}, {0x8F, 0x1F}, {0x8F, 0x29}, {0xF9, 0x98}, /* 0xF8-0xFB */
+	{0xF9, 0xD7}, {0x8F, 0x1C}, {0x8F, 0x1E}, {0x00, 0x3F}, /* 0xFC-0xFF */
 };
 
 static struct nls_unicode c2u_BE[256] = {
@@ -2006,7 +2008,7 @@
 	{0x91, 0x8B}, {0x91, 0x83}, {0x92, 0xC5}, {0x92, 0xBB}, /* 0x4C-0x4F */
 	{0x92, 0xB7}, {0x92, 0xEA}, {0x92, 0xAC}, {0x92, 0xE4}, /* 0x50-0x53 */
 	{0x92, 0xC1}, {0x92, 0xB3}, {0x92, 0xBC}, {0x92, 0xD2}, /* 0x54-0x57 */
-	{0x92, 0xC7}, {0x92, 0xF0}, {0x92, 0xB2}, {0x95, 0xAD}, /* 0x58-0x5B */
+	{0x92, 0xC7}, {0x92, 0xF0}, {0x92, 0xB2}, {0xF9, 0x86}, /* 0x58-0x5B */
 	{0x95, 0xB1}, {0x97, 0x04}, {0x97, 0x06}, {0x97, 0x07}, /* 0x5C-0x5F */
 	{0x97, 0x09}, {0x97, 0x60}, {0x97, 0x8D}, {0x97, 0x8B}, /* 0x60-0x63 */
 	{0x97, 0x8F}, {0x98, 0x21}, {0x98, 0x2B}, {0x98, 0x1C}, /* 0x64-0x67 */
@@ -2015,7 +2017,7 @@
 	{0x99, 0xDB}, {0x99, 0xD1}, {0x99, 0xD5}, {0x99, 0xD2}, /* 0x70-0x73 */
 	{0x99, 0xD9}, {0x9A, 0xB7}, {0x9A, 0xEE}, {0x9A, 0xEF}, /* 0x74-0x77 */
 	{0x9B, 0x27}, {0x9B, 0x45}, {0x9B, 0x44}, {0x9B, 0x77}, /* 0x78-0x7B */
-	{0x9B, 0x6F}, {0x9D, 0x06}, {0x9D, 0x09}, {0x00, 0x3F}, /* 0x7C-0x7F */
+	{0xF9, 0x39}, {0x9D, 0x06}, {0x9D, 0x09}, {0x00, 0x3F}, /* 0x7C-0x7F */
 	
 	{0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x80-0x83 */
 	{0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x84-0x87 */
@@ -2026,7 +2028,7 @@
 	{0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x98-0x9B */
 	{0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x9C-0x9F */
 	{0x00, 0x3F}, {0x9D, 0x03}, {0x9E, 0xA9}, {0x9E, 0xBE}, /* 0xA0-0xA3 */
-	{0x9E, 0xCE}, {0x58, 0xA8}, {0x9F, 0x52}, {0x51, 0x12}, /* 0xA4-0xA7 */
+	{0xF9, 0x89}, {0x58, 0xA8}, {0x9F, 0x52}, {0x51, 0x12}, /* 0xA4-0xA7 */
 	{0x51, 0x18}, {0x51, 0x14}, {0x51, 0x10}, {0x51, 0x15}, /* 0xA8-0xAB */
 	{0x51, 0x80}, {0x51, 0xAA}, {0x51, 0xDD}, {0x52, 0x91}, /* 0xAC-0xAF */
 	{0x52, 0x93}, {0x52, 0xF3}, {0x56, 0x59}, {0x56, 0x6B}, /* 0xB0-0xB3 */
@@ -2039,15 +2041,15 @@
 	{0x61, 0x91}, {0x61, 0xA9}, {0x61, 0x8A}, {0x61, 0xCD}, /* 0xCC-0xCF */
 	{0x61, 0xB6}, {0x61, 0xBE}, {0x61, 0xCA}, {0x61, 0xC8}, /* 0xD0-0xD3 */
 	{0x62, 0x30}, {0x64, 0xC5}, {0x64, 0xC1}, {0x64, 0xCB}, /* 0xD4-0xD7 */
-	{0x64, 0xBB}, {0x64, 0xBC}, {0x64, 0xDA}, {0x64, 0xC4}, /* 0xD8-0xDB */
+	{0x64, 0xBB}, {0x64, 0xBC}, {0x64, 0xDA}, {0xF9, 0x30}, /* 0xD8-0xDB */
 	{0x64, 0xC7}, {0x64, 0xC2}, {0x64, 0xCD}, {0x64, 0xBF}, /* 0xDC-0xDF */
 	{0x64, 0xD2}, {0x64, 0xD4}, {0x64, 0xBE}, {0x65, 0x74}, /* 0xE0-0xE3 */
-	{0x66, 0xC6}, {0x66, 0xC9}, {0x66, 0xB9}, {0x66, 0xC4}, /* 0xE4-0xE7 */
+	{0xF9, 0x8B}, {0x66, 0xC9}, {0x66, 0xB9}, {0x66, 0xC4}, /* 0xE4-0xE7 */
 	{0x66, 0xC7}, {0x66, 0xB8}, {0x6A, 0x3D}, {0x6A, 0x38}, /* 0xE8-0xEB */
 	{0x6A, 0x3A}, {0x6A, 0x59}, {0x6A, 0x6B}, {0x6A, 0x58}, /* 0xEC-0xEF */
 	{0x6A, 0x39}, {0x6A, 0x44}, {0x6A, 0x62}, {0x6A, 0x61}, /* 0xF0-0xF3 */
 	{0x6A, 0x4B}, {0x6A, 0x47}, {0x6A, 0x35}, {0x6A, 0x5F}, /* 0xF4-0xF7 */
-	{0x6A, 0x48}, {0x6B, 0x59}, {0x6B, 0x77}, {0x6C, 0x05}, /* 0xF8-0xFB */
+	{0x6A, 0x48}, {0x6B, 0x59}, {0xF9, 0x8C}, {0x6C, 0x05}, /* 0xF8-0xFB */
 	{0x6F, 0xC2}, {0x6F, 0xB1}, {0x6F, 0xA1}, {0x00, 0x3F}, /* 0xFC-0xFF */
 };
 
@@ -2071,19 +2073,19 @@
 	{0x6F, 0xC3}, {0x6F, 0xA4}, {0x6F, 0xC1}, {0x6F, 0xA7}, /* 0x40-0x43 */
 	{0x6F, 0xB3}, {0x6F, 0xC0}, {0x6F, 0xB9}, {0x6F, 0xB6}, /* 0x44-0x47 */
 	{0x6F, 0xA6}, {0x6F, 0xA0}, {0x6F, 0xB4}, {0x71, 0xBE}, /* 0x48-0x4B */
-	{0x71, 0xC9}, {0x71, 0xD0}, {0x71, 0xD2}, {0x71, 0xC8}, /* 0x4C-0x4F */
-	{0x71, 0xD5}, {0x71, 0xB9}, {0x71, 0xCE}, {0x71, 0xD9}, /* 0x50-0x53 */
+	{0x71, 0xC9}, {0xF9, 0xEE}, {0x71, 0xD2}, {0x71, 0xC8}, /* 0x4C-0x4F */
+	{0x71, 0xD5}, {0x71, 0xB9}, {0xF9, 0xC0}, {0x71, 0xD9}, /* 0x50-0x53 */
 	{0x71, 0xDC}, {0x71, 0xC3}, {0x71, 0xC4}, {0x73, 0x68}, /* 0x54-0x57 */
-	{0x74, 0x9C}, {0x74, 0xA3}, {0x74, 0x98}, {0x74, 0x9F}, /* 0x58-0x5B */
+	{0x74, 0x9C}, {0x74, 0xA3}, {0xF9, 0xEF}, {0x74, 0x9F}, /* 0x58-0x5B */
 	{0x74, 0x9E}, {0x74, 0xE2}, {0x75, 0x0C}, {0x75, 0x0D}, /* 0x5C-0x5F */
-	{0x76, 0x34}, {0x76, 0x38}, {0x76, 0x3A}, {0x76, 0xE7}, /* 0x60-0x63 */
+	{0x76, 0x34}, {0x76, 0x38}, {0x76, 0x3A}, {0xF9, 0x33}, /* 0x60-0x63 */
 	{0x76, 0xE5}, {0x77, 0xA0}, {0x77, 0x9E}, {0x77, 0x9F}, /* 0x64-0x67 */
 	{0x77, 0xA5}, {0x78, 0xE8}, {0x78, 0xDA}, {0x78, 0xEC}, /* 0x68-0x6B */
 	{0x78, 0xE7}, {0x79, 0xA6}, {0x7A, 0x4D}, {0x7A, 0x4E}, /* 0x6C-0x6F */
 	{0x7A, 0x46}, {0x7A, 0x4C}, {0x7A, 0x4B}, {0x7A, 0xBA}, /* 0x70-0x73 */
 	{0x7B, 0xD9}, {0x7C, 0x11}, {0x7B, 0xC9}, {0x7B, 0xE4}, /* 0x74-0x77 */
 	{0x7B, 0xDB}, {0x7B, 0xE1}, {0x7B, 0xE9}, {0x7B, 0xE6}, /* 0x78-0x7B */
-	{0x7C, 0xD5}, {0x7C, 0xD6}, {0x7E, 0x0A}, {0x00, 0x3F}, /* 0x7C-0x7F */
+	{0x7C, 0xD5}, {0xFA, 0x03}, {0x7E, 0x0A}, {0x00, 0x3F}, /* 0x7C-0x7F */
 	
 	{0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x80-0x83 */
 	{0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x84-0x87 */
@@ -2095,7 +2097,7 @@
 	{0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x9C-0x9F */
 	{0x00, 0x3F}, {0x7E, 0x11}, {0x7E, 0x08}, {0x7E, 0x1B}, /* 0xA0-0xA3 */
 	{0x7E, 0x23}, {0x7E, 0x1E}, {0x7E, 0x1D}, {0x7E, 0x09}, /* 0xA4-0xA7 */
-	{0x7E, 0x10}, {0x7F, 0x79}, {0x7F, 0xB2}, {0x7F, 0xF0}, /* 0xA8-0xAB */
+	{0x7E, 0x10}, {0xF9, 0xE6}, {0x7F, 0xB2}, {0x7F, 0xF0}, /* 0xA8-0xAB */
 	{0x7F, 0xF1}, {0x7F, 0xEE}, {0x80, 0x28}, {0x81, 0xB3}, /* 0xAC-0xAF */
 	{0x81, 0xA9}, {0x81, 0xA8}, {0x81, 0xFB}, {0x82, 0x08}, /* 0xB0-0xB3 */
 	{0x82, 0x58}, {0x82, 0x59}, {0x85, 0x4A}, {0x85, 0x59}, /* 0xB4-0xB7 */
@@ -2106,17 +2108,17 @@
 	{0x89, 0x25}, {0x89, 0x2B}, {0x89, 0x21}, {0x89, 0xAA}, /* 0xC8-0xCB */
 	{0x89, 0xA6}, {0x8A, 0xE6}, {0x8A, 0xFA}, {0x8A, 0xEB}, /* 0xCC-0xCF */
 	{0x8A, 0xF1}, {0x8B, 0x00}, {0x8A, 0xDC}, {0x8A, 0xE7}, /* 0xD0-0xD3 */
-	{0x8A, 0xEE}, {0x8A, 0xFE}, {0x8B, 0x01}, {0x8B, 0x02}, /* 0xD4-0xD7 */
+	{0x8A, 0xEE}, {0xF9, 0x5D}, {0x8B, 0x01}, {0x8B, 0x02}, /* 0xD4-0xD7 */
 	{0x8A, 0xF7}, {0x8A, 0xED}, {0x8A, 0xF3}, {0x8A, 0xF6}, /* 0xD8-0xDB */
 	{0x8A, 0xFC}, {0x8C, 0x6B}, {0x8C, 0x6D}, {0x8C, 0x93}, /* 0xDC-0xDF */
 	{0x8C, 0xF4}, {0x8E, 0x44}, {0x8E, 0x31}, {0x8E, 0x34}, /* 0xE0-0xE3 */
-	{0x8E, 0x42}, {0x8E, 0x39}, {0x8E, 0x35}, {0x8F, 0x3B}, /* 0xE4-0xE7 */
+	{0x8E, 0x42}, {0x8E, 0x39}, {0x8E, 0x35}, {0xFA, 0x07}, /* 0xE4-0xE7 */
 	{0x8F, 0x2F}, {0x8F, 0x38}, {0x8F, 0x33}, {0x8F, 0xA8}, /* 0xE8-0xEB */
 	{0x8F, 0xA6}, {0x90, 0x75}, {0x90, 0x74}, {0x90, 0x78}, /* 0xEC-0xEF */
-	{0x90, 0x72}, {0x90, 0x7C}, {0x90, 0x7A}, {0x91, 0x34}, /* 0xF0-0xF3 */
+	{0x90, 0x72}, {0xF9, 0xC3}, {0x90, 0x7A}, {0x91, 0x34}, /* 0xF0-0xF3 */
 	{0x91, 0x92}, {0x93, 0x20}, {0x93, 0x36}, {0x92, 0xF8}, /* 0xF4-0xF7 */
 	{0x93, 0x33}, {0x93, 0x2F}, {0x93, 0x22}, {0x92, 0xFC}, /* 0xF8-0xFB */
-	{0x93, 0x2B}, {0x93, 0x04}, {0x93, 0x1A}, {0x00, 0x3F}, /* 0xFC-0xFF */
+	{0x93, 0x2B}, {0xF9, 0x3F}, {0x93, 0x1A}, {0x00, 0x3F}, /* 0xFC-0xFF */
 };
 
 static struct nls_unicode c2u_C0[256] = {
@@ -2143,14 +2145,14 @@
 	{0x97, 0x0F}, {0x97, 0x5B}, {0x97, 0x5C}, {0x97, 0x66}, /* 0x50-0x53 */
 	{0x97, 0x98}, {0x98, 0x30}, {0x98, 0x38}, {0x98, 0x3B}, /* 0x54-0x57 */
 	{0x98, 0x37}, {0x98, 0x2D}, {0x98, 0x39}, {0x98, 0x24}, /* 0x58-0x5B */
-	{0x99, 0x10}, {0x99, 0x28}, {0x99, 0x1E}, {0x99, 0x1B}, /* 0x5C-0x5F */
+	{0x99, 0x10}, {0xFA, 0x2C}, {0x99, 0x1E}, {0x99, 0x1B}, /* 0x5C-0x5F */
 	{0x99, 0x21}, {0x99, 0x1A}, {0x99, 0xED}, {0x99, 0xE2}, /* 0x60-0x63 */
-	{0x99, 0xF1}, {0x9A, 0xB8}, {0x9A, 0xBC}, {0x9A, 0xFB}, /* 0x64-0x67 */
+	{0xF9, 0x1A}, {0x9A, 0xB8}, {0x9A, 0xBC}, {0x9A, 0xFB}, /* 0x64-0x67 */
 	{0x9A, 0xED}, {0x9B, 0x28}, {0x9B, 0x91}, {0x9D, 0x15}, /* 0x68-0x6B */
 	{0x9D, 0x23}, {0x9D, 0x26}, {0x9D, 0x28}, {0x9D, 0x12}, /* 0x6C-0x6F */
-	{0x9D, 0x1B}, {0x9E, 0xD8}, {0x9E, 0xD4}, {0x9F, 0x8D}, /* 0x70-0x73 */
-	{0x9F, 0x9C}, {0x51, 0x2A}, {0x51, 0x1F}, {0x51, 0x21}, /* 0x74-0x77 */
-	{0x51, 0x32}, {0x52, 0xF5}, {0x56, 0x8E}, {0x56, 0x80}, /* 0x78-0x7B */
+	{0x9D, 0x1B}, {0x9E, 0xD8}, {0x9E, 0xD4}, {0xF9, 0xC4}, /* 0x70-0x73 */
+	{0xF9, 0x08}, {0x51, 0x2A}, {0x51, 0x1F}, {0x51, 0x21}, /* 0x74-0x77 */
+	{0x51, 0x32}, {0xF9, 0x7F}, {0x56, 0x8E}, {0x56, 0x80}, /* 0x78-0x7B */
 	{0x56, 0x90}, {0x56, 0x85}, {0x56, 0x87}, {0x00, 0x3F}, /* 0x7C-0x7F */
 	
 	{0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x80-0x83 */
@@ -2164,7 +2166,7 @@
 	{0x00, 0x3F}, {0x56, 0x8F}, {0x58, 0xD5}, {0x58, 0xD3}, /* 0xA0-0xA3 */
 	{0x58, 0xD1}, {0x58, 0xCE}, {0x5B, 0x30}, {0x5B, 0x2A}, /* 0xA4-0xA7 */
 	{0x5B, 0x24}, {0x5B, 0x7A}, {0x5C, 0x37}, {0x5C, 0x68}, /* 0xA8-0xAB */
-	{0x5D, 0xBC}, {0x5D, 0xBA}, {0x5D, 0xBD}, {0x5D, 0xB8}, /* 0xAC-0xAF */
+	{0x5D, 0xBC}, {0xF9, 0xAB}, {0x5D, 0xBD}, {0x5D, 0xB8}, /* 0xAC-0xAF */
 	{0x5E, 0x6B}, {0x5F, 0x4C}, {0x5F, 0xBD}, {0x61, 0xC9}, /* 0xB0-0xB3 */
 	{0x61, 0xC2}, {0x61, 0xC7}, {0x61, 0xE6}, {0x61, 0xCB}, /* 0xB4-0xB7 */
 	{0x62, 0x32}, {0x62, 0x34}, {0x64, 0xCE}, {0x64, 0xCA}, /* 0xB8-0xBB */
@@ -2174,16 +2176,16 @@
 	{0x6A, 0x80}, {0x6A, 0x94}, {0x6A, 0x84}, {0x6A, 0xA2}, /* 0xC8-0xCB */
 	{0x6A, 0x9C}, {0x6A, 0xDB}, {0x6A, 0xA3}, {0x6A, 0x7E}, /* 0xCC-0xCF */
 	{0x6A, 0x97}, {0x6A, 0x90}, {0x6A, 0xA0}, {0x6B, 0x5C}, /* 0xD0-0xD3 */
-	{0x6B, 0xAE}, {0x6B, 0xDA}, {0x6C, 0x08}, {0x6F, 0xD8}, /* 0xD4-0xD7 */
+	{0xF9, 0xA5}, {0x6B, 0xDA}, {0x6C, 0x08}, {0x6F, 0xD8}, /* 0xD4-0xD7 */
 	{0x6F, 0xF1}, {0x6F, 0xDF}, {0x6F, 0xE0}, {0x6F, 0xDB}, /* 0xD8-0xDB */
-	{0x6F, 0xE4}, {0x6F, 0xEB}, {0x6F, 0xEF}, {0x6F, 0x80}, /* 0xDC-0xDF */
+	{0x6F, 0xE4}, {0xF9, 0x22}, {0x6F, 0xEF}, {0x6F, 0x80}, /* 0xDC-0xDF */
 	{0x6F, 0xEC}, {0x6F, 0xE1}, {0x6F, 0xE9}, {0x6F, 0xD5}, /* 0xE0-0xE3 */
 	{0x6F, 0xEE}, {0x6F, 0xF0}, {0x71, 0xE7}, {0x71, 0xDF}, /* 0xE4-0xE7 */
 	{0x71, 0xEE}, {0x71, 0xE6}, {0x71, 0xE5}, {0x71, 0xED}, /* 0xE8-0xEB */
 	{0x71, 0xEC}, {0x71, 0xF4}, {0x71, 0xE0}, {0x72, 0x35}, /* 0xEC-0xEF */
 	{0x72, 0x46}, {0x73, 0x70}, {0x73, 0x72}, {0x74, 0xA9}, /* 0xF0-0xF3 */
 	{0x74, 0xB0}, {0x74, 0xA6}, {0x74, 0xA8}, {0x76, 0x46}, /* 0xF4-0xF7 */
-	{0x76, 0x42}, {0x76, 0x4C}, {0x76, 0xEA}, {0x77, 0xB3}, /* 0xF8-0xFB */
+	{0xF9, 0xC1}, {0x76, 0x4C}, {0x76, 0xEA}, {0x77, 0xB3}, /* 0xF8-0xFB */
 	{0x77, 0xAA}, {0x77, 0xB0}, {0x77, 0xAC}, {0x00, 0x3F}, /* 0xFC-0xFF */
 };
 
@@ -2211,14 +2213,14 @@
 	{0x7C, 0x0C}, {0x7B, 0xE0}, {0x7C, 0xE0}, {0x7C, 0xDC}, /* 0x50-0x53 */
 	{0x7C, 0xDE}, {0x7C, 0xE2}, {0x7C, 0xDF}, {0x7C, 0xD9}, /* 0x54-0x57 */
 	{0x7C, 0xDD}, {0x7E, 0x2E}, {0x7E, 0x3E}, {0x7E, 0x46}, /* 0x58-0x5B */
-	{0x7E, 0x37}, {0x7E, 0x32}, {0x7E, 0x43}, {0x7E, 0x2B}, /* 0x5C-0x5F */
+	{0xF9, 0x50}, {0x7E, 0x32}, {0x7E, 0x43}, {0x7E, 0x2B}, /* 0x5C-0x5F */
 	{0x7E, 0x3D}, {0x7E, 0x31}, {0x7E, 0x45}, {0x7E, 0x41}, /* 0x60-0x63 */
 	{0x7E, 0x34}, {0x7E, 0x39}, {0x7E, 0x48}, {0x7E, 0x35}, /* 0x64-0x67 */
 	{0x7E, 0x3F}, {0x7E, 0x2F}, {0x7F, 0x44}, {0x7F, 0xF3}, /* 0x68-0x6B */
 	{0x7F, 0xFC}, {0x80, 0x71}, {0x80, 0x72}, {0x80, 0x70}, /* 0x6C-0x6F */
-	{0x80, 0x6F}, {0x80, 0x73}, {0x81, 0xC6}, {0x81, 0xC3}, /* 0x70-0x73 */
+	{0xF9, 0x97}, {0x80, 0x73}, {0x81, 0xC6}, {0x81, 0xC3}, /* 0x70-0x73 */
 	{0x81, 0xBA}, {0x81, 0xC2}, {0x81, 0xC0}, {0x81, 0xBF}, /* 0x74-0x77 */
-	{0x81, 0xBD}, {0x81, 0xC9}, {0x81, 0xBE}, {0x81, 0xE8}, /* 0x78-0x7B */
+	{0x81, 0xBD}, {0x81, 0xC9}, {0x81, 0xBE}, {0xF9, 0xF6}, /* 0x78-0x7B */
 	{0x82, 0x09}, {0x82, 0x71}, {0x85, 0xAA}, {0x00, 0x3F}, /* 0x7C-0x7F */
 	
 	{0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x80-0x83 */
@@ -2233,7 +2235,7 @@
 	{0x85, 0x91}, {0x85, 0x94}, {0x85, 0xAF}, {0x85, 0x9B}, /* 0xA4-0xA7 */
 	{0x85, 0x87}, {0x85, 0xA8}, {0x85, 0x8A}, {0x86, 0x67}, /* 0xA8-0xAB */
 	{0x87, 0xC0}, {0x87, 0xD1}, {0x87, 0xB3}, {0x87, 0xD2}, /* 0xAC-0xAF */
-	{0x87, 0xC6}, {0x87, 0xAB}, {0x87, 0xBB}, {0x87, 0xBA}, /* 0xB0-0xB3 */
+	{0x87, 0xC6}, {0x87, 0xAB}, {0x87, 0xBB}, {0xF9, 0x11}, /* 0xB0-0xB3 */
 	{0x87, 0xC8}, {0x87, 0xCB}, {0x89, 0x3B}, {0x89, 0x36}, /* 0xB4-0xB7 */
 	{0x89, 0x44}, {0x89, 0x38}, {0x89, 0x3D}, {0x89, 0xAC}, /* 0xB8-0xBB */
 	{0x8B, 0x0E}, {0x8B, 0x17}, {0x8B, 0x19}, {0x8B, 0x1B}, /* 0xBC-0xBF */
@@ -2246,11 +2248,11 @@
 	{0x90, 0x7D}, {0x90, 0x84}, {0x90, 0x81}, {0x90, 0x82}, /* 0xD8-0xDB */
 	{0x90, 0x80}, {0x91, 0x39}, {0x91, 0xA3}, {0x91, 0x9E}, /* 0xDC-0xDF */
 	{0x91, 0x9C}, {0x93, 0x4D}, {0x93, 0x82}, {0x93, 0x28}, /* 0xE0-0xE3 */
-	{0x93, 0x75}, {0x93, 0x4A}, {0x93, 0x65}, {0x93, 0x4B}, /* 0xE4-0xE7 */
+	{0x93, 0x75}, {0xF9, 0x9B}, {0x93, 0x65}, {0x93, 0x4B}, /* 0xE4-0xE7 */
 	{0x93, 0x18}, {0x93, 0x7E}, {0x93, 0x6C}, {0x93, 0x5B}, /* 0xE8-0xEB */
 	{0x93, 0x70}, {0x93, 0x5A}, {0x93, 0x54}, {0x95, 0xCA}, /* 0xEC-0xEF */
 	{0x95, 0xCB}, {0x95, 0xCC}, {0x95, 0xC8}, {0x95, 0xC6}, /* 0xF0-0xF3 */
-	{0x96, 0xB1}, {0x96, 0xB8}, {0x96, 0xD6}, {0x97, 0x1C}, /* 0xF4-0xF7 */
+	{0x96, 0xB1}, {0xF9, 0xB8}, {0x96, 0xD6}, {0x97, 0x1C}, /* 0xF4-0xF7 */
 	{0x97, 0x1E}, {0x97, 0xA0}, {0x97, 0xD3}, {0x98, 0x46}, /* 0xF8-0xFB */
 	{0x98, 0xB6}, {0x99, 0x35}, {0x9A, 0x01}, {0x00, 0x3F}, /* 0xFC-0xFF */
 };
@@ -2276,17 +2278,17 @@
 	{0x9B, 0xAD}, {0x9D, 0x3B}, {0x9D, 0x3F}, {0x9E, 0x8B}, /* 0x44-0x47 */
 	{0x9E, 0xCF}, {0x9E, 0xDE}, {0x9E, 0xDC}, {0x9E, 0xDD}, /* 0x48-0x4B */
 	{0x9E, 0xDB}, {0x9F, 0x3E}, {0x9F, 0x4B}, {0x53, 0xE2}, /* 0x4C-0x4F */
-	{0x56, 0x95}, {0x56, 0xAE}, {0x58, 0xD9}, {0x58, 0xD8}, /* 0x50-0x53 */
+	{0x56, 0x95}, {0x56, 0xAE}, {0x58, 0xD9}, {0xF9, 0x4A}, /* 0x50-0x53 */
 	{0x5B, 0x38}, {0x5F, 0x5D}, {0x61, 0xE3}, {0x62, 0x33}, /* 0x54-0x57 */
 	{0x64, 0xF4}, {0x64, 0xF2}, {0x64, 0xFE}, {0x65, 0x06}, /* 0x58-0x5B */
 	{0x64, 0xFA}, {0x64, 0xFB}, {0x64, 0xF7}, {0x65, 0xB7}, /* 0x5C-0x5F */
 	{0x66, 0xDC}, {0x67, 0x26}, {0x6A, 0xB3}, {0x6A, 0xAC}, /* 0x60-0x63 */
 	{0x6A, 0xC3}, {0x6A, 0xBB}, {0x6A, 0xB8}, {0x6A, 0xC2}, /* 0x64-0x67 */
 	{0x6A, 0xAE}, {0x6A, 0xAF}, {0x6B, 0x5F}, {0x6B, 0x78}, /* 0x68-0x6B */
-	{0x6B, 0xAF}, {0x70, 0x09}, {0x70, 0x0B}, {0x6F, 0xFE}, /* 0x6C-0x6F */
+	{0x6B, 0xAF}, {0x70, 0x09}, {0x70, 0x0B}, {0xF9, 0x84}, /* 0x6C-0x6F */
 	{0x70, 0x06}, {0x6F, 0xFA}, {0x70, 0x11}, {0x70, 0x0F}, /* 0x70-0x73 */
 	{0x71, 0xFB}, {0x71, 0xFC}, {0x71, 0xFE}, {0x71, 0xF8}, /* 0x74-0x77 */
-	{0x73, 0x77}, {0x73, 0x75}, {0x74, 0xA7}, {0x74, 0xBF}, /* 0x78-0x7B */
+	{0x73, 0x77}, {0xF9, 0xA7}, {0x74, 0xA7}, {0x74, 0xBF}, /* 0x78-0x7B */
 	{0x75, 0x15}, {0x76, 0x56}, {0x76, 0x58}, {0x00, 0x3F}, /* 0x7C-0x7F */
 	
 	{0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x80-0x83 */
@@ -2298,15 +2300,15 @@
 	{0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x98-0x9B */
 	{0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x9C-0x9F */
 	{0x00, 0x3F}, {0x76, 0x52}, {0x77, 0xBD}, {0x77, 0xBF}, /* 0xA0-0xA3 */
-	{0x77, 0xBB}, {0x77, 0xBC}, {0x79, 0x0E}, {0x79, 0xAE}, /* 0xA4-0xA7 */
+	{0x77, 0xBB}, {0x77, 0xBC}, {0x79, 0x0E}, {0xF9, 0xB6}, /* 0xA4-0xA7 */
 	{0x7A, 0x61}, {0x7A, 0x62}, {0x7A, 0x60}, {0x7A, 0xC4}, /* 0xA8-0xAB */
 	{0x7A, 0xC5}, {0x7C, 0x2B}, {0x7C, 0x27}, {0x7C, 0x2A}, /* 0xAC-0xAF */
-	{0x7C, 0x1E}, {0x7C, 0x23}, {0x7C, 0x21}, {0x7C, 0xE7}, /* 0xB0-0xB3 */
+	{0x7C, 0x1E}, {0x7C, 0x23}, {0x7C, 0x21}, {0xF9, 0x7B}, /* 0xB0-0xB3 */
 	{0x7E, 0x54}, {0x7E, 0x55}, {0x7E, 0x5E}, {0x7E, 0x5A}, /* 0xB4-0xB7 */
 	{0x7E, 0x61}, {0x7E, 0x52}, {0x7E, 0x59}, {0x7F, 0x48}, /* 0xB8-0xBB */
 	{0x7F, 0xF9}, {0x7F, 0xFB}, {0x80, 0x77}, {0x80, 0x76}, /* 0xBC-0xBF */
 	{0x81, 0xCD}, {0x81, 0xCF}, {0x82, 0x0A}, {0x85, 0xCF}, /* 0xC0-0xC3 */
-	{0x85, 0xA9}, {0x85, 0xCD}, {0x85, 0xD0}, {0x85, 0xC9}, /* 0xC4-0xC7 */
+	{0x85, 0xA9}, {0xF9, 0x23}, {0x85, 0xD0}, {0x85, 0xC9}, /* 0xC4-0xC7 */
 	{0x85, 0xB0}, {0x85, 0xBA}, {0x85, 0xB9}, {0x85, 0xA6}, /* 0xC8-0xCB */
 	{0x87, 0xEF}, {0x87, 0xEC}, {0x87, 0xF2}, {0x87, 0xE0}, /* 0xCC-0xCF */
 	{0x89, 0x86}, {0x89, 0xB2}, {0x89, 0xF4}, {0x8B, 0x28}, /* 0xD0-0xD3 */
@@ -2318,7 +2320,7 @@
 	{0x93, 0x94}, {0x93, 0x8A}, {0x93, 0x96}, {0x93, 0xA2}, /* 0xE8-0xEB */
 	{0x93, 0xB3}, {0x93, 0xAE}, {0x93, 0xAC}, {0x93, 0xB0}, /* 0xEC-0xEF */
 	{0x93, 0x98}, {0x93, 0x9A}, {0x93, 0x97}, {0x95, 0xD4}, /* 0xF0-0xF3 */
-	{0x95, 0xD6}, {0x95, 0xD0}, {0x95, 0xD5}, {0x96, 0xE2}, /* 0xF4-0xF7 */
+	{0x95, 0xD6}, {0x95, 0xD0}, {0x95, 0xD5}, {0xF9, 0xEA}, /* 0xF4-0xF7 */
 	{0x96, 0xDC}, {0x96, 0xD9}, {0x96, 0xDB}, {0x96, 0xDE}, /* 0xF8-0xFB */
 	{0x97, 0x24}, {0x97, 0xA3}, {0x97, 0xA6}, {0x00, 0x3F}, /* 0xFC-0xFF */
 };
@@ -2348,11 +2350,11 @@
 	{0x9B, 0xCA}, {0x9B, 0xC9}, {0x9B, 0xFD}, {0x9B, 0xC8}, /* 0x54-0x57 */
 	{0x9B, 0xC0}, {0x9D, 0x51}, {0x9D, 0x5D}, {0x9D, 0x60}, /* 0x58-0x5B */
 	{0x9E, 0xE0}, {0x9F, 0x15}, {0x9F, 0x2C}, {0x51, 0x33}, /* 0x5C-0x5F */
-	{0x56, 0xA5}, {0x58, 0xDE}, {0x58, 0xDF}, {0x58, 0xE2}, /* 0x60-0x63 */
-	{0x5B, 0xF5}, {0x9F, 0x90}, {0x5E, 0xEC}, {0x61, 0xF2}, /* 0x64-0x67 */
-	{0x61, 0xF7}, {0x61, 0xF6}, {0x61, 0xF5}, {0x65, 0x00}, /* 0x68-0x6B */
+	{0x56, 0xA5}, {0x58, 0xDE}, {0xF9, 0x42}, {0x58, 0xE2}, /* 0x60-0x63 */
+	{0x5B, 0xF5}, {0x9F, 0x90}, {0xF9, 0x82}, {0x61, 0xF2}, /* 0x64-0x67 */
+	{0x61, 0xF7}, {0xF9, 0x0D}, {0x61, 0xF5}, {0x65, 0x00}, /* 0x68-0x6B */
 	{0x65, 0x0F}, {0x66, 0xE0}, {0x66, 0xDD}, {0x6A, 0xE5}, /* 0x6C-0x6F */
-	{0x6A, 0xDD}, {0x6A, 0xDA}, {0x6A, 0xD3}, {0x70, 0x1B}, /* 0x70-0x73 */
+	{0x6A, 0xDD}, {0x6A, 0xDA}, {0xF9, 0x31}, {0x70, 0x1B}, /* 0x70-0x73 */
 	{0x70, 0x1F}, {0x70, 0x28}, {0x70, 0x1A}, {0x70, 0x1D}, /* 0x74-0x77 */
 	{0x70, 0x15}, {0x70, 0x18}, {0x72, 0x06}, {0x72, 0x0D}, /* 0x78-0x7B */
 	{0x72, 0x58}, {0x72, 0xA2}, {0x73, 0x78}, {0x00, 0x3F}, /* 0x7C-0x7F */
@@ -2368,16 +2370,16 @@
 	{0x00, 0x3F}, {0x73, 0x7A}, {0x74, 0xBD}, {0x74, 0xCA}, /* 0xA0-0xA3 */
 	{0x74, 0xE3}, {0x75, 0x87}, {0x75, 0x86}, {0x76, 0x5F}, /* 0xA4-0xA7 */
 	{0x76, 0x61}, {0x77, 0xC7}, {0x79, 0x19}, {0x79, 0xB1}, /* 0xA8-0xAB */
-	{0x7A, 0x6B}, {0x7A, 0x69}, {0x7C, 0x3E}, {0x7C, 0x3F}, /* 0xAC-0xAF */
+	{0x7A, 0x6B}, {0x7A, 0x69}, {0xF9, 0xA6}, {0x7C, 0x3F}, /* 0xAC-0xAF */
 	{0x7C, 0x38}, {0x7C, 0x3D}, {0x7C, 0x37}, {0x7C, 0x40}, /* 0xB0-0xB3 */
 	{0x7E, 0x6B}, {0x7E, 0x6D}, {0x7E, 0x79}, {0x7E, 0x69}, /* 0xB4-0xB7 */
-	{0x7E, 0x6A}, {0x7F, 0x85}, {0x7E, 0x73}, {0x7F, 0xB6}, /* 0xB8-0xBB */
-	{0x7F, 0xB9}, {0x7F, 0xB8}, {0x81, 0xD8}, {0x85, 0xE9}, /* 0xBC-0xBF */
+	{0x7E, 0x6A}, {0xF9, 0x0F}, {0x7E, 0x73}, {0x7F, 0xB6}, /* 0xB8-0xBB */
+	{0x7F, 0xB9}, {0x7F, 0xB8}, {0xF9, 0x26}, {0x85, 0xE9}, /* 0xBC-0xBF */
 	{0x85, 0xDD}, {0x85, 0xEA}, {0x85, 0xD5}, {0x85, 0xE4}, /* 0xC0-0xC3 */
 	{0x85, 0xE5}, {0x85, 0xF7}, {0x87, 0xFB}, {0x88, 0x05}, /* 0xC4-0xC7 */
 	{0x88, 0x0D}, {0x87, 0xF9}, {0x87, 0xFE}, {0x89, 0x60}, /* 0xC8-0xCB */
 	{0x89, 0x5F}, {0x89, 0x56}, {0x89, 0x5E}, {0x8B, 0x41}, /* 0xCC-0xCF */
-	{0x8B, 0x5C}, {0x8B, 0x58}, {0x8B, 0x49}, {0x8B, 0x5A}, /* 0xD0-0xD3 */
+	{0x8B, 0x5C}, {0xF9, 0xFC}, {0x8B, 0x49}, {0x8B, 0x5A}, /* 0xD0-0xD3 */
 	{0x8B, 0x4E}, {0x8B, 0x4F}, {0x8B, 0x46}, {0x8B, 0x59}, /* 0xD4-0xD7 */
 	{0x8D, 0x08}, {0x8D, 0x0A}, {0x8E, 0x7C}, {0x8E, 0x72}, /* 0xD8-0xDB */
 	{0x8E, 0x87}, {0x8E, 0x76}, {0x8E, 0x6C}, {0x8E, 0x7A}, /* 0xDC-0xDF */
@@ -2388,7 +2390,7 @@
 	{0x93, 0xE2}, {0x93, 0xCD}, {0x93, 0xD8}, {0x93, 0xE4}, /* 0xF0-0xF3 */
 	{0x93, 0xD7}, {0x93, 0xE8}, {0x95, 0xDC}, {0x96, 0xB4}, /* 0xF4-0xF7 */
 	{0x96, 0xE3}, {0x97, 0x2A}, {0x97, 0x27}, {0x97, 0x61}, /* 0xF8-0xFB */
-	{0x97, 0xDC}, {0x97, 0xFB}, {0x98, 0x5E}, {0x00, 0x3F}, /* 0xFC-0xFF */
+	{0x97, 0xDC}, {0x97, 0xFB}, {0xF9, 0xD0}, {0x00, 0x3F}, /* 0xFC-0xFF */
 };
 
 static struct nls_unicode c2u_C4[256] = {
@@ -2412,15 +2414,15 @@
 	{0x99, 0x49}, {0x9A, 0x16}, {0x9A, 0x19}, {0x9B, 0x0D}, /* 0x44-0x47 */
 	{0x9B, 0xE8}, {0x9B, 0xE7}, {0x9B, 0xD6}, {0x9B, 0xDB}, /* 0x48-0x4B */
 	{0x9D, 0x89}, {0x9D, 0x61}, {0x9D, 0x72}, {0x9D, 0x6A}, /* 0x4C-0x4F */
-	{0x9D, 0x6C}, {0x9E, 0x92}, {0x9E, 0x97}, {0x9E, 0x93}, /* 0x50-0x53 */
+	{0x9D, 0x6C}, {0x9E, 0x92}, {0xF9, 0x88}, {0x9E, 0x93}, /* 0x50-0x53 */
 	{0x9E, 0xB4}, {0x52, 0xF8}, {0x56, 0xA8}, {0x56, 0xB7}, /* 0x54-0x57 */
 	{0x56, 0xB6}, {0x56, 0xB4}, {0x56, 0xBC}, {0x58, 0xE4}, /* 0x58-0x5B */
 	{0x5B, 0x40}, {0x5B, 0x43}, {0x5B, 0x7D}, {0x5B, 0xF6}, /* 0x5C-0x5F */
 	{0x5D, 0xC9}, {0x61, 0xF8}, {0x61, 0xFA}, {0x65, 0x18}, /* 0x60-0x63 */
 	{0x65, 0x14}, {0x65, 0x19}, {0x66, 0xE6}, {0x67, 0x27}, /* 0x64-0x67 */
 	{0x6A, 0xEC}, {0x70, 0x3E}, {0x70, 0x30}, {0x70, 0x32}, /* 0x68-0x6B */
-	{0x72, 0x10}, {0x73, 0x7B}, {0x74, 0xCF}, {0x76, 0x62}, /* 0x6C-0x6F */
-	{0x76, 0x65}, {0x79, 0x26}, {0x79, 0x2A}, {0x79, 0x2C}, /* 0x70-0x73 */
+	{0xF9, 0x32}, {0x73, 0x7B}, {0x74, 0xCF}, {0x76, 0x62}, /* 0x6C-0x6F */
+	{0x76, 0x65}, {0x79, 0x26}, {0xF9, 0x85}, {0x79, 0x2C}, /* 0x70-0x73 */
 	{0x79, 0x2B}, {0x7A, 0xC7}, {0x7A, 0xF6}, {0x7C, 0x4C}, /* 0x74-0x77 */
 	{0x7C, 0x43}, {0x7C, 0x4D}, {0x7C, 0xEF}, {0x7C, 0xF0}, /* 0x78-0x7B */
 	{0x8F, 0xAE}, {0x7E, 0x7D}, {0x7E, 0x7C}, {0x00, 0x3F}, /* 0x7C-0x7F */
@@ -2435,12 +2437,12 @@
 	{0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x9C-0x9F */
 	{0x00, 0x3F}, {0x7E, 0x82}, {0x7F, 0x4C}, {0x80, 0x00}, /* 0xA0-0xA3 */
 	{0x81, 0xDA}, {0x82, 0x66}, {0x85, 0xFB}, {0x85, 0xF9}, /* 0xA4-0xA7 */
-	{0x86, 0x11}, {0x85, 0xFA}, {0x86, 0x06}, {0x86, 0x0B}, /* 0xA8-0xAB */
+	{0x86, 0x11}, {0xF9, 0xF0}, {0xF9, 0x35}, {0x86, 0x0B}, /* 0xA8-0xAB */
 	{0x86, 0x07}, {0x86, 0x0A}, {0x88, 0x14}, {0x88, 0x15}, /* 0xAC-0xAF */
-	{0x89, 0x64}, {0x89, 0xBA}, {0x89, 0xF8}, {0x8B, 0x70}, /* 0xB0-0xB3 */
+	{0xF9, 0x24}, {0x89, 0xBA}, {0x89, 0xF8}, {0x8B, 0x70}, /* 0xB0-0xB3 */
 	{0x8B, 0x6C}, {0x8B, 0x66}, {0x8B, 0x6F}, {0x8B, 0x5F}, /* 0xB4-0xB7 */
 	{0x8B, 0x6B}, {0x8D, 0x0F}, {0x8D, 0x0D}, {0x8E, 0x89}, /* 0xB8-0xBB */
-	{0x8E, 0x81}, {0x8E, 0x85}, {0x8E, 0x82}, {0x91, 0xB4}, /* 0xBC-0xBF */
+	{0x8E, 0x81}, {0x8E, 0x85}, {0x8E, 0x82}, {0xF9, 0xB7}, /* 0xBC-0xBF */
 	{0x91, 0xCB}, {0x94, 0x18}, {0x94, 0x03}, {0x93, 0xFD}, /* 0xC0-0xC3 */
 	{0x95, 0xE1}, {0x97, 0x30}, {0x98, 0xC4}, {0x99, 0x52}, /* 0xC4-0xC7 */
 	{0x99, 0x51}, {0x99, 0xA8}, {0x9A, 0x2B}, {0x9A, 0x30}, /* 0xC8-0xCB */
@@ -2450,12 +2452,12 @@
 	{0x51, 0x38}, {0x56, 0xC1}, {0x56, 0xC0}, {0x56, 0xC2}, /* 0xD8-0xDB */
 	{0x59, 0x14}, {0x5C, 0x6C}, {0x5D, 0xCD}, {0x61, 0xFC}, /* 0xDC-0xDF */
 	{0x61, 0xFE}, {0x65, 0x1D}, {0x65, 0x1C}, {0x65, 0x95}, /* 0xE0-0xE3 */
-	{0x66, 0xE9}, {0x6A, 0xFB}, {0x6B, 0x04}, {0x6A, 0xFA}, /* 0xE4-0xE7 */
-	{0x6B, 0xB2}, {0x70, 0x4C}, {0x72, 0x1B}, {0x72, 0xA7}, /* 0xE8-0xEB */
-	{0x74, 0xD6}, {0x74, 0xD4}, {0x76, 0x69}, {0x77, 0xD3}, /* 0xEC-0xEF */
+	{0x66, 0xE9}, {0x6A, 0xFB}, {0xF9, 0x1D}, {0x6A, 0xFA}, /* 0xE4-0xE7 */
+	{0x6B, 0xB2}, {0x70, 0x4C}, {0xF9, 0x1E}, {0x72, 0xA7}, /* 0xE8-0xEB */
+	{0x74, 0xD6}, {0x74, 0xD4}, {0xF9, 0x0E}, {0x77, 0xD3}, /* 0xEC-0xEF */
 	{0x7C, 0x50}, {0x7E, 0x8F}, {0x7E, 0x8C}, {0x7F, 0xBC}, /* 0xF0-0xF3 */
-	{0x86, 0x17}, {0x86, 0x2D}, {0x86, 0x1A}, {0x88, 0x23}, /* 0xF4-0xF7 */
-	{0x88, 0x22}, {0x88, 0x21}, {0x88, 0x1F}, {0x89, 0x6A}, /* 0xF8-0xFB */
+	{0x86, 0x17}, {0xF9, 0x1F}, {0x86, 0x1A}, {0x88, 0x23}, /* 0xF4-0xF7 */
+	{0x88, 0x22}, {0x88, 0x21}, {0xF9, 0x27}, {0x89, 0x6A}, /* 0xF8-0xFB */
 	{0x89, 0x6C}, {0x89, 0xBD}, {0x8B, 0x74}, {0x00, 0x3F}, /* 0xFC-0xFF */
 };
 
@@ -2480,11 +2482,11 @@
 	{0x8E, 0x8D}, {0x8E, 0x8B}, {0x8F, 0x5F}, {0x8F, 0xAF}, /* 0x44-0x47 */
 	{0x91, 0xBA}, {0x94, 0x2E}, {0x94, 0x33}, {0x94, 0x35}, /* 0x48-0x4B */
 	{0x94, 0x3A}, {0x94, 0x38}, {0x94, 0x32}, {0x94, 0x2B}, /* 0x4C-0x4F */
-	{0x95, 0xE2}, {0x97, 0x38}, {0x97, 0x39}, {0x97, 0x32}, /* 0x50-0x53 */
+	{0x95, 0xE2}, {0x97, 0x38}, {0x97, 0x39}, {0xF9, 0x38}, /* 0x50-0x53 */
 	{0x97, 0xFF}, {0x98, 0x67}, {0x98, 0x65}, {0x99, 0x57}, /* 0x54-0x57 */
 	{0x9A, 0x45}, {0x9A, 0x43}, {0x9A, 0x40}, {0x9A, 0x3E}, /* 0x58-0x5B */
 	{0x9A, 0xCF}, {0x9B, 0x54}, {0x9B, 0x51}, {0x9C, 0x2D}, /* 0x5C-0x5F */
-	{0x9C, 0x25}, {0x9D, 0xAF}, {0x9D, 0xB4}, {0x9D, 0xC2}, /* 0x60-0x63 */
+	{0x9C, 0x25}, {0x9D, 0xAF}, {0xFA, 0x2D}, {0x9D, 0xC2}, /* 0x60-0x63 */
 	{0x9D, 0xB8}, {0x9E, 0x9D}, {0x9E, 0xEF}, {0x9F, 0x19}, /* 0x64-0x67 */
 	{0x9F, 0x5C}, {0x9F, 0x66}, {0x9F, 0x67}, {0x51, 0x3C}, /* 0x68-0x6B */
 	{0x51, 0x3B}, {0x56, 0xC8}, {0x56, 0xCA}, {0x56, 0xC9}, /* 0x6C-0x6F */
@@ -2501,9 +2503,9 @@
 	{0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x94-0x97 */
 	{0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x98-0x9B */
 	{0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x9C-0x9F */
-	{0x00, 0x3F}, {0x79, 0xB3}, {0x7C, 0x60}, {0x7C, 0x5F}, /* 0xA0-0xA3 */
-	{0x80, 0x7E}, {0x80, 0x7D}, {0x81, 0xDF}, {0x89, 0x72}, /* 0xA4-0xA7 */
-	{0x89, 0x6F}, {0x89, 0xFC}, {0x8B, 0x80}, {0x8D, 0x16}, /* 0xA8-0xAB */
+	{0x00, 0x3F}, {0x79, 0xB3}, {0xF9, 0x44}, {0x7C, 0x5F}, /* 0xA0-0xA3 */
+	{0xF9, 0x45}, {0x80, 0x7D}, {0x81, 0xDF}, {0x89, 0x72}, /* 0xA4-0xA7 */
+	{0x89, 0x6F}, {0x89, 0xFC}, {0xF9, 0x5A}, {0x8D, 0x16}, /* 0xA8-0xAB */
 	{0x8D, 0x17}, {0x8E, 0x91}, {0x8E, 0x93}, {0x8F, 0x61}, /* 0xAC-0xAF */
 	{0x91, 0x48}, {0x94, 0x44}, {0x94, 0x51}, {0x94, 0x52}, /* 0xB0-0xB3 */
 	{0x97, 0x3D}, {0x97, 0x3E}, {0x97, 0xC3}, {0x97, 0xC1}, /* 0xB4-0xB7 */
@@ -2511,16 +2513,16 @@
 	{0x9A, 0xD2}, {0x9B, 0x1A}, {0x9C, 0x49}, {0x9C, 0x31}, /* 0xBC-0xBF */
 	{0x9C, 0x3E}, {0x9C, 0x3B}, {0x9D, 0xD3}, {0x9D, 0xD7}, /* 0xC0-0xC3 */
 	{0x9F, 0x34}, {0x9F, 0x6C}, {0x9F, 0x6A}, {0x9F, 0x94}, /* 0xC4-0xC7 */
-	{0x56, 0xCC}, {0x5D, 0xD6}, {0x62, 0x00}, {0x65, 0x23}, /* 0xC8-0xCB */
+	{0x56, 0xCC}, {0x5D, 0xD6}, {0xF9, 0x90}, {0x65, 0x23}, /* 0xC8-0xCB */
 	{0x65, 0x2B}, {0x65, 0x2A}, {0x66, 0xEC}, {0x6B, 0x10}, /* 0xCC-0xCF */
 	{0x74, 0xDA}, {0x7A, 0xCA}, {0x7C, 0x64}, {0x7C, 0x63}, /* 0xD0-0xD3 */
 	{0x7C, 0x65}, {0x7E, 0x93}, {0x7E, 0x96}, {0x7E, 0x94}, /* 0xD4-0xD7 */
-	{0x81, 0xE2}, {0x86, 0x38}, {0x86, 0x3F}, {0x88, 0x31}, /* 0xD8-0xDB */
-	{0x8B, 0x8A}, {0x90, 0x90}, {0x90, 0x8F}, {0x94, 0x63}, /* 0xDC-0xDF */
+	{0x81, 0xE2}, {0x86, 0x38}, {0xF9, 0x10}, {0x88, 0x31}, /* 0xD8-0xDB */
+	{0x8B, 0x8A}, {0x90, 0x90}, {0xF9, 0x13}, {0x94, 0x63}, /* 0xDC-0xDF */
 	{0x94, 0x60}, {0x94, 0x64}, {0x97, 0x68}, {0x98, 0x6F}, /* 0xE0-0xE3 */
 	{0x99, 0x5C}, {0x9A, 0x5A}, {0x9A, 0x5B}, {0x9A, 0x57}, /* 0xE4-0xE7 */
 	{0x9A, 0xD3}, {0x9A, 0xD4}, {0x9A, 0xD1}, {0x9C, 0x54}, /* 0xE8-0xEB */
-	{0x9C, 0x57}, {0x9C, 0x56}, {0x9D, 0xE5}, {0x9E, 0x9F}, /* 0xEC-0xEF */
+	{0xF9, 0xF2}, {0x9C, 0x56}, {0x9D, 0xE5}, {0xF9, 0xF3}, /* 0xEC-0xEF */
 	{0x9E, 0xF4}, {0x56, 0xD1}, {0x58, 0xE9}, {0x65, 0x2C}, /* 0xF0-0xF3 */
 	{0x70, 0x5E}, {0x76, 0x71}, {0x76, 0x72}, {0x77, 0xD7}, /* 0xF4-0xF7 */
 	{0x7F, 0x50}, {0x7F, 0x88}, {0x88, 0x36}, {0x88, 0x39}, /* 0xF8-0xFB */
@@ -2545,9 +2547,9 @@
 	{0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */
 	{0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */
 	{0x8B, 0x96}, {0x82, 0x77}, {0x8D, 0x1B}, {0x91, 0xC0}, /* 0x40-0x43 */
-	{0x94, 0x6A}, {0x97, 0x42}, {0x97, 0x48}, {0x97, 0x44}, /* 0x44-0x47 */
+	{0x94, 0x6A}, {0x97, 0x42}, {0xF9, 0xB3}, {0x97, 0x44}, /* 0x44-0x47 */
 	{0x97, 0xC6}, {0x98, 0x70}, {0x9A, 0x5F}, {0x9B, 0x22}, /* 0x48-0x4B */
-	{0x9B, 0x58}, {0x9C, 0x5F}, {0x9D, 0xF9}, {0x9D, 0xFA}, /* 0x4C-0x4F */
+	{0x9B, 0x58}, {0x9C, 0x5F}, {0x9D, 0xF9}, {0xF9, 0x3A}, /* 0x4C-0x4F */
 	{0x9E, 0x7C}, {0x9E, 0x7D}, {0x9F, 0x07}, {0x9F, 0x77}, /* 0x50-0x53 */
 	{0x9F, 0x72}, {0x5E, 0xF3}, {0x6B, 0x16}, {0x70, 0x63}, /* 0x54-0x57 */
 	{0x7C, 0x6C}, {0x7C, 0x6E}, {0x88, 0x3B}, {0x89, 0xC0}, /* 0x58-0x5B */
@@ -2558,8 +2560,8 @@
 	{0x7E, 0x9C}, {0x8B, 0x9C}, {0x8E, 0xAA}, {0x91, 0xC5}, /* 0x6C-0x6F */
 	{0x94, 0x7D}, {0x94, 0x7E}, {0x94, 0x7C}, {0x9C, 0x77}, /* 0x70-0x73 */
 	{0x9C, 0x78}, {0x9E, 0xF7}, {0x8C, 0x54}, {0x94, 0x7F}, /* 0x74-0x77 */
-	{0x9E, 0x1A}, {0x72, 0x28}, {0x9A, 0x6A}, {0x9B, 0x31}, /* 0x78-0x7B */
-	{0x9E, 0x1B}, {0x9E, 0x1E}, {0x7C, 0x72}, {0x00, 0x3F}, /* 0x7C-0x7F */
+	{0x9E, 0x1A}, {0x72, 0x28}, {0xF9, 0x87}, {0x9B, 0x31}, /* 0x78-0x7B */
+	{0x9E, 0x1B}, {0xF9, 0x20}, {0x7C, 0x72}, {0x00, 0x3F}, /* 0x7C-0x7F */
 	
 	{0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x80-0x83 */
 	{0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x84-0x87 */
@@ -2793,7 +2795,7 @@
 	{0x54, 0x65}, {0x54, 0x6C}, {0x54, 0x74}, {0x54, 0x66}, /* 0xE4-0xE7 */
 	{0x54, 0x8D}, {0x54, 0x6F}, {0x54, 0x61}, {0x54, 0x60}, /* 0xE8-0xEB */
 	{0x54, 0x98}, {0x54, 0x63}, {0x54, 0x67}, {0x54, 0x64}, /* 0xEC-0xEF */
-	{0x56, 0xF7}, {0x56, 0xF9}, {0x57, 0x6F}, {0x57, 0x72}, /* 0xF0-0xF3 */
+	{0x56, 0xF7}, {0xF9, 0xA9}, {0x57, 0x6F}, {0x57, 0x72}, /* 0xF0-0xF3 */
 	{0x57, 0x6D}, {0x57, 0x6B}, {0x57, 0x71}, {0x57, 0x70}, /* 0xF4-0xF7 */
 	{0x57, 0x76}, {0x57, 0x80}, {0x57, 0x75}, {0x57, 0x7B}, /* 0xF8-0xFB */
 	{0x57, 0x73}, {0x57, 0x74}, {0x57, 0x62}, {0x00, 0x3F}, /* 0xFC-0xFF */
@@ -2845,7 +2847,7 @@
 	{0x60, 0x33}, {0x60, 0x1A}, {0x60, 0x1E}, {0x60, 0x2C}, /* 0xA4-0xA7 */
 	{0x60, 0x22}, {0x60, 0x0D}, {0x60, 0x10}, {0x60, 0x2E}, /* 0xA8-0xAB */
 	{0x60, 0x13}, {0x60, 0x11}, {0x60, 0x0C}, {0x60, 0x09}, /* 0xAC-0xAF */
-	{0x60, 0x1C}, {0x62, 0x14}, {0x62, 0x3D}, {0x62, 0xAD}, /* 0xB0-0xB3 */
+	{0xF9, 0xAC}, {0x62, 0x14}, {0x62, 0x3D}, {0x62, 0xAD}, /* 0xB0-0xB3 */
 	{0x62, 0xB4}, {0x62, 0xD1}, {0x62, 0xBE}, {0x62, 0xAA}, /* 0xB4-0xB7 */
 	{0x62, 0xB6}, {0x62, 0xCA}, {0x62, 0xAE}, {0x62, 0xB3}, /* 0xB8-0xBB */
 	{0x62, 0xAF}, {0x62, 0xBB}, {0x62, 0xA9}, {0x62, 0xB0}, /* 0xBC-0xBF */
@@ -2855,7 +2857,7 @@
 	{0x66, 0x0D}, {0x66, 0x05}, {0x65, 0xFD}, {0x66, 0x11}, /* 0xCC-0xCF */
 	{0x66, 0x10}, {0x66, 0xF6}, {0x67, 0x0A}, {0x67, 0x85}, /* 0xD0-0xD3 */
 	{0x67, 0x6C}, {0x67, 0x8E}, {0x67, 0x92}, {0x67, 0x76}, /* 0xD4-0xD7 */
-	{0x67, 0x7B}, {0x67, 0x98}, {0x67, 0x86}, {0x67, 0x84}, /* 0xD8-0xDB */
+	{0xF9, 0xC8}, {0x67, 0x98}, {0x67, 0x86}, {0x67, 0x84}, /* 0xD8-0xDB */
 	{0x67, 0x74}, {0x67, 0x8D}, {0x67, 0x8C}, {0x67, 0x7A}, /* 0xDC-0xDF */
 	{0x67, 0x9F}, {0x67, 0x91}, {0x67, 0x99}, {0x67, 0x83}, /* 0xE0-0xE3 */
 	{0x67, 0x7D}, {0x67, 0x81}, {0x67, 0x78}, {0x67, 0x79}, /* 0xE4-0xE7 */
@@ -2990,7 +2992,7 @@
 	{0x60, 0x5B}, {0x60, 0x4C}, {0x60, 0x40}, {0x60, 0x42}, /* 0xC8-0xCB */
 	{0x60, 0x5F}, {0x60, 0x24}, {0x60, 0x44}, {0x60, 0x58}, /* 0xCC-0xCF */
 	{0x60, 0x66}, {0x60, 0x6E}, {0x62, 0x42}, {0x62, 0x43}, /* 0xD0-0xD3 */
-	{0x62, 0xCF}, {0x63, 0x0D}, {0x63, 0x0B}, {0x62, 0xF5}, /* 0xD4-0xD7 */
+	{0xF9, 0x5B}, {0x63, 0x0D}, {0x63, 0x0B}, {0x62, 0xF5}, /* 0xD4-0xD7 */
 	{0x63, 0x0E}, {0x63, 0x03}, {0x62, 0xEB}, {0x62, 0xF9}, /* 0xD8-0xDB */
 	{0x63, 0x0F}, {0x63, 0x0C}, {0x62, 0xF8}, {0x62, 0xF6}, /* 0xDC-0xDF */
 	{0x63, 0x00}, {0x63, 0x13}, {0x63, 0x14}, {0x62, 0xFA}, /* 0xE0-0xE3 */
@@ -3849,7 +3851,7 @@
 	{0x83, 0xC6}, {0x83, 0xC8}, {0x83, 0xEB}, {0x83, 0xE3}, /* 0x68-0x6B */
 	{0x83, 0xBF}, {0x84, 0x01}, {0x83, 0xDD}, {0x83, 0xE5}, /* 0x6C-0x6F */
 	{0x83, 0xD8}, {0x83, 0xFF}, {0x83, 0xE1}, {0x83, 0xCB}, /* 0x70-0x73 */
-	{0x83, 0xCE}, {0x83, 0xD6}, {0x83, 0xF5}, {0x83, 0xC9}, /* 0x74-0x77 */
+	{0x83, 0xCE}, {0x83, 0xD6}, {0x83, 0xF5}, {0xF9, 0x3E}, /* 0x74-0x77 */
 	{0x84, 0x09}, {0x84, 0x0F}, {0x83, 0xDE}, {0x84, 0x11}, /* 0x78-0x7B */
 	{0x84, 0x06}, {0x83, 0xC2}, {0x83, 0xF3}, {0x00, 0x3F}, /* 0x7C-0x7F */
 	
@@ -4609,7 +4611,7 @@
 	{0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x94-0x97 */
 	{0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x98-0x9B */
 	{0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x9C-0x9F */
-	{0x00, 0x3F}, {0x73, 0x62}, {0x74, 0x87}, {0x74, 0x89}, /* 0xA0-0xA3 */
+	{0x00, 0x3F}, {0x73, 0x62}, {0x74, 0x87}, {0xF9, 0x94}, /* 0xA0-0xA3 */
 	{0x74, 0x8A}, {0x74, 0x86}, {0x74, 0x81}, {0x74, 0x7D}, /* 0xA4-0xA7 */
 	{0x74, 0x85}, {0x74, 0x88}, {0x74, 0x7C}, {0x74, 0x79}, /* 0xA8-0xAB */
 	{0x75, 0x08}, {0x75, 0x07}, {0x75, 0x7E}, {0x76, 0x25}, /* 0xAC-0xAF */
@@ -4661,7 +4663,7 @@
 	{0x84, 0xFB}, {0x85, 0x2B}, {0x84, 0xFA}, {0x85, 0x08}, /* 0x58-0x5B */
 	{0x85, 0x0C}, {0x84, 0xF4}, {0x85, 0x2A}, {0x84, 0xF2}, /* 0x5C-0x5F */
 	{0x85, 0x15}, {0x84, 0xF7}, {0x84, 0xEB}, {0x84, 0xF3}, /* 0x60-0x63 */
-	{0x84, 0xFC}, {0x85, 0x12}, {0x84, 0xEA}, {0x84, 0xE9}, /* 0x64-0x67 */
+	{0xF9, 0xC2}, {0x85, 0x12}, {0x84, 0xEA}, {0x84, 0xE9}, /* 0x64-0x67 */
 	{0x85, 0x16}, {0x84, 0xFE}, {0x85, 0x28}, {0x85, 0x1D}, /* 0x68-0x6B */
 	{0x85, 0x2E}, {0x85, 0x02}, {0x84, 0xFD}, {0x85, 0x1E}, /* 0x6C-0x6F */
 	{0x84, 0xF6}, {0x85, 0x31}, {0x85, 0x26}, {0x84, 0xE7}, /* 0x70-0x73 */
@@ -4767,7 +4769,7 @@
 	{0x9C, 0xFB}, {0x9D, 0x08}, {0x9D, 0x05}, {0x9D, 0x04}, /* 0xEC-0xEF */
 	{0x9E, 0x83}, {0x9E, 0xD3}, {0x9F, 0x0F}, {0x9F, 0x10}, /* 0xF0-0xF3 */
 	{0x51, 0x1C}, {0x51, 0x13}, {0x51, 0x17}, {0x51, 0x1A}, /* 0xF4-0xF7 */
-	{0x51, 0x11}, {0x51, 0xDE}, {0x53, 0x34}, {0x53, 0xE1}, /* 0xF8-0xFB */
+	{0x51, 0x11}, {0xFA, 0x15}, {0x53, 0x34}, {0x53, 0xE1}, /* 0xF8-0xFB */
 	{0x56, 0x70}, {0x56, 0x60}, {0x56, 0x6E}, {0x00, 0x3F}, /* 0xFC-0xFF */
 };
 
@@ -5087,7 +5089,7 @@
 	{0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x9C-0x9F */
 	{0x00, 0x3F}, {0x77, 0xB4}, {0x77, 0xB1}, {0x77, 0xA8}, /* 0xA0-0xA3 */
 	{0x77, 0xF0}, {0x78, 0xF3}, {0x78, 0xFD}, {0x79, 0x02}, /* 0xA4-0xA7 */
-	{0x78, 0xFB}, {0x78, 0xFC}, {0x78, 0xF2}, {0x79, 0x05}, /* 0xA8-0xAB */
+	{0xF9, 0x64}, {0x78, 0xFC}, {0x78, 0xF2}, {0x79, 0x05}, /* 0xA8-0xAB */
 	{0x78, 0xF9}, {0x78, 0xFE}, {0x79, 0x04}, {0x79, 0xAB}, /* 0xAC-0xAF */
 	{0x79, 0xA8}, {0x7A, 0x5C}, {0x7A, 0x5B}, {0x7A, 0x56}, /* 0xB0-0xB3 */
 	{0x7A, 0x58}, {0x7A, 0x54}, {0x7A, 0x5A}, {0x7A, 0xBE}, /* 0xB4-0xB7 */
@@ -5749,7 +5751,7 @@
 	{0x8B, 0x82}, {0x8B, 0x86}, {0x8B, 0x85}, {0x8B, 0x7F}, /* 0x58-0x5B */
 	{0x8D, 0x15}, {0x8E, 0x95}, {0x8E, 0x94}, {0x8E, 0x9A}, /* 0x5C-0x5F */
 	{0x8E, 0x92}, {0x8E, 0x90}, {0x8E, 0x96}, {0x8E, 0x97}, /* 0x60-0x63 */
-	{0x8F, 0x60}, {0x8F, 0x62}, {0x91, 0x47}, {0x94, 0x4C}, /* 0x64-0x67 */
+	{0x8F, 0x60}, {0xF9, 0x8D}, {0x91, 0x47}, {0x94, 0x4C}, /* 0x64-0x67 */
 	{0x94, 0x50}, {0x94, 0x4A}, {0x94, 0x4B}, {0x94, 0x4F}, /* 0x68-0x6B */
 	{0x94, 0x47}, {0x94, 0x45}, {0x94, 0x48}, {0x94, 0x49}, /* 0x6C-0x6F */
 	{0x94, 0x46}, {0x97, 0x3F}, {0x97, 0xE3}, {0x98, 0x6A}, /* 0x70-0x73 */
@@ -5923,8 +5925,8 @@
 	{0x25, 0x58}, {0x25, 0x67}, {0x25, 0x5B}, {0x25, 0x53}, /* 0xEC-0xEF */
 	{0x25, 0x65}, {0x25, 0x56}, {0x25, 0x5F}, {0x25, 0x6B}, /* 0xF0-0xF3 */
 	{0x25, 0x62}, {0x25, 0x59}, {0x25, 0x68}, {0x25, 0x5C}, /* 0xF4-0xF7 */
-	{0x25, 0x51}, {0x25, 0x50}, {0x25, 0x6D}, {0x25, 0x6E}, /* 0xF8-0xFB */
-	{0x25, 0x70}, {0x25, 0x6F}, {0x25, 0x93}, {0x00, 0x3F}, /* 0xFC-0xFF */
+	{0x25, 0x51}, {0x25, 0x50}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xF8-0xFB */
+	{0x00, 0x3F}, {0x00, 0x3F}, {0x25, 0x93}, {0x00, 0x3F}, /* 0xFC-0xFF */
 };
 
 static struct nls_unicode *page_charset2uni[256] = {
@@ -6032,7 +6034,7 @@
 
 static unsigned char u2c_03[512] = {
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x04-0x07 */
+	0x3F, 0x3F, 0xA1, 0xC2, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x04-0x07 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x08-0x0B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */
@@ -6104,17 +6106,17 @@
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x08-0x0B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xA1, 0x56, /* 0x10-0x13 */
-	0xA1, 0x58, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */
+	0xA1, 0x58, 0xA2, 0x77, 0xA1, 0xFC, 0x3F, 0x3F, /* 0x14-0x17 */
 	0xA1, 0xA5, 0xA1, 0xA6, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x18-0x1B */
 	0xA1, 0xA7, 0xA1, 0xA8, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */
-	0x3F, 0x3F, 0xA1, 0x4C, 0xA1, 0x4B, 0xA1, 0x45, /* 0x24-0x27 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xA1, 0x45, 0x3F, 0x3F, /* 0x20-0x23 */
+	0xA3, 0xBB, 0xA1, 0x4C, 0xA1, 0x4B, 0xA1, 0x45, /* 0x24-0x27 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */
-	0x3F, 0x3F, 0x3F, 0x3F, 0xA1, 0xAC, 0x3F, 0x3F, /* 0x30-0x33 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xA1, 0xAC, 0xA1, 0xB2, /* 0x30-0x33 */
 	0x3F, 0x3F, 0xA1, 0xAB, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xA1, 0xB0, /* 0x38-0x3B */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xA1, 0xC3, 0x3F, 0x3F, /* 0x3C-0x3F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */
@@ -6240,8 +6242,8 @@
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x08-0x0B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */
-	0x3F, 0x3F, 0xA2, 0x41, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0xA1, 0xD4, 0x3F, 0x3F, /* 0x18-0x1B */
+	0x3F, 0x3F, 0xA2, 0x41, 0xA2, 0x42, 0x3F, 0x3F, /* 0x14-0x17 */
+	0xA2, 0x58, 0x3F, 0x3F, 0xA1, 0xD4, 0x3F, 0x3F, /* 0x18-0x1B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0xA1, 0xDB, 0xA1, 0xE8, /* 0x1C-0x1F */
 	0xA1, 0xE7, 0x3F, 0x3F, 0x3F, 0x3F, 0xA1, 0xFD, /* 0x20-0x23 */
 	0x3F, 0x3F, 0xA1, 0xFC, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */
@@ -6259,7 +6261,7 @@
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x5C-0x5F */
-	0xA1, 0xDA, 0xA1, 0xDD, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x60-0x63 */
+	0xA1, 0xDA, 0xA1, 0xDD, 0x3F, 0x3F, 0xA1, 0xDD, /* 0x60-0x63 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0xA1, 0xD8, 0xA1, 0xD9, /* 0x64-0x67 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x68-0x6B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */
@@ -6302,6 +6304,74 @@
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */
 };
 
+static unsigned char u2c_23[512] = {
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xA1, 0x5B, /* 0x04-0x07 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x08-0x0B */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x18-0x1B */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x38-0x3B */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x4C-0x4F */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x5C-0x5F */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x60-0x63 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x68-0x6B */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x74-0x77 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */
+	
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x88-0x8B */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB0-0xB3 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC4-0xC7 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC8-0xCB */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xDC-0xDF */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF8-0xFB */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */
+};
+
 static unsigned char u2c_25[512] = {
 	0xA2, 0x77, 0x3F, 0x3F, 0xA2, 0x78, 0x3F, 0x3F, /* 0x00-0x03 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x04-0x07 */
@@ -6330,8 +6400,8 @@
 	0xF9, 0xE0, 0xF9, 0xEB, 0xF9, 0xF4, 0xF9, 0xE2, /* 0x60-0x63 */
 	0xF9, 0xE7, 0xF9, 0xF0, 0xF9, 0xDE, 0xF9, 0xED, /* 0x64-0x67 */
 	0xF9, 0xF6, 0xF9, 0xE4, 0xF9, 0xEA, 0xF9, 0xF3, /* 0x68-0x6B */
-	0xF9, 0xE1, 0xF9, 0xFA, 0xF9, 0xFB, 0xF9, 0xFD, /* 0x6C-0x6F */
-	0xF9, 0xFC, 0xA2, 0xAC, 0xA2, 0xAD, 0xA2, 0xAE, /* 0x70-0x73 */
+	0xF9, 0xE1, 0xA2, 0x7E, 0xA2, 0xA1, 0xA2, 0xA3, /* 0x6C-0x6F */
+	0xA2, 0xA2, 0xA2, 0xAC, 0xA2, 0xAD, 0xA2, 0xAE, /* 0x70-0x73 */
 	0xA1, 0x5A, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x74-0x77 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */
@@ -6373,7 +6443,7 @@
 static unsigned char u2c_26[512] = {
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */
 	0x3F, 0x3F, 0xA1, 0xB9, 0xA1, 0xB8, 0x3F, 0x3F, /* 0x04-0x07 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x08-0x0B */
+	0x3F, 0x3F, 0xA1, 0xF3, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x08-0x0B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */
@@ -6387,7 +6457,7 @@
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x38-0x3B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */
-	0xA1, 0xF0, 0x3F, 0x3F, 0xA1, 0xF1, 0x3F, 0x3F, /* 0x40-0x43 */
+	0xA1, 0xF0, 0xA1, 0xF2, 0xA1, 0xF1, 0x3F, 0x3F, /* 0x40-0x43 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x4C-0x4F */
@@ -6446,12 +6516,12 @@
 	0xA1, 0x69, 0xA1, 0x6A, 0xA2, 0x45, 0x3F, 0x3F, /* 0x10-0x13 */
 	0xA1, 0x65, 0xA1, 0x66, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x18-0x1B */
-	0x3F, 0x3F, 0xA1, 0xA9, 0xA1, 0xAA, 0x3F, 0x3F, /* 0x1C-0x1F */
+	0xA1, 0xE3, 0xA1, 0xA9, 0xA1, 0xAA, 0x3F, 0x3F, /* 0x1C-0x1F */
 	0x3F, 0x3F, 0xA2, 0xC3, 0xA2, 0xC4, 0xA2, 0xC5, /* 0x20-0x23 */
 	0xA2, 0xC6, 0xA2, 0xC7, 0xA2, 0xC8, 0xA2, 0xC9, /* 0x24-0x27 */
 	0xA2, 0xCA, 0xA2, 0xCB, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */
+	0xA1, 0xCA, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x38-0x3B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */
@@ -6544,10 +6614,10 @@
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x88-0x8B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xA4, 0x40, 0xA4, 0x47, /* 0x90-0x93 */
+	0xA4, 0x54, 0xA5, 0x7C, 0xA4, 0x57, 0xA4, 0xA4, /* 0x94-0x97 */
+	0xA4, 0x55, 0xA5, 0xD2, 0xA4, 0x41, 0xA4, 0xFE, /* 0x98-0x9B */
+	0xA4, 0x42, 0xA4, 0xD1, 0xA6, 0x61, 0xA4, 0x48, /* 0x9C-0x9F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */
@@ -6583,15 +6653,15 @@
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x18-0x1B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x38-0x3B */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */
+	0xA4, 0x40, 0xA4, 0x47, 0xA4, 0x54, 0xA5, 0x7C, /* 0x20-0x23 */
+	0xA4, 0xAD, 0xA4, 0xBB, 0xA4, 0x43, 0xA4, 0x4B, /* 0x24-0x27 */
+	0xA4, 0x45, 0xA4, 0x51, 0xA4, 0xEB, 0xA4, 0xF5, /* 0x28-0x2B */
+	0xA4, 0xF4, 0xA4, 0xEC, 0xAA, 0xF7, 0xA4, 0x67, /* 0x2C-0x2F */
+	0xA4, 0xE9, 0xAE, 0xE8, 0xA6, 0xB3, 0xAA, 0xC0, /* 0x30-0x33 */
+	0xA6, 0x57, 0xAF, 0x53, 0xB0, 0x5D, 0xAF, 0xAC, /* 0x34-0x37 */
+	0xB3, 0xD2, 0xA5, 0x4E, 0xA9, 0x49, 0xBE, 0xC7, /* 0x38-0x3B */
+	0xBA, 0xCA, 0xA5, 0xF8, 0xB8, 0xEA, 0xA8, 0xF3, /* 0x3C-0x3F */
+	0xB2, 0xBD, 0xA5, 0xF0, 0xA6, 0xDB, 0xA6, 0xDC, /* 0x40-0x43 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x4C-0x4F */
@@ -6608,19 +6678,19 @@
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */
 	
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x88-0x8B */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xA1, 0xC0, /* 0xA0-0xA3 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB0-0xB3 */
+	0xA4, 0x40, 0xA4, 0x47, 0xA4, 0x54, 0xA5, 0x7C, /* 0x80-0x83 */
+	0xA4, 0xAD, 0xA4, 0xBB, 0xA4, 0x43, 0xA4, 0x4B, /* 0x84-0x87 */
+	0xA4, 0x45, 0xA4, 0x51, 0xA4, 0xEB, 0xA4, 0xF5, /* 0x88-0x8B */
+	0xA4, 0xF4, 0xA4, 0xEC, 0xAA, 0xF7, 0xA4, 0x67, /* 0x8C-0x8F */
+	0xA4, 0xE9, 0xAE, 0xE8, 0xA6, 0xB3, 0xAA, 0xC0, /* 0x90-0x93 */
+	0xA6, 0x57, 0xAF, 0x53, 0xB0, 0x5D, 0xAF, 0xAC, /* 0x94-0x97 */
+	0xB3, 0xD2, 0xAF, 0xB5, 0xA8, 0x6B, 0xA4, 0x6B, /* 0x98-0x9B */
+	0xBE, 0x41, 0xC0, 0x75, 0xA6, 0x4C, 0xAA, 0x60, /* 0x9C-0x9F */
+	0xB6, 0xB5, 0xA5, 0xF0, 0xBC, 0x67, 0xA1, 0xC0, /* 0xA0-0xA3 */
+	0xA4, 0x57, 0xA4, 0xA4, 0xA4, 0x55, 0xA5, 0xAA, /* 0xA4-0xA7 */
+	0xA5, 0x6B, 0xC2, 0xE5, 0xA9, 0x76, 0xBE, 0xC7, /* 0xA8-0xAB */
+	0xBA, 0xCA, 0xA5, 0xF8, 0xB8, 0xEA, 0xA8, 0xF3, /* 0xAC-0xAF */
+	0xA9, 0x5D, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB0-0xB3 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */
@@ -12286,11 +12356,11 @@
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */
 };
 
-static unsigned char u2c_FA[512] = {
+static unsigned char u2c_DC[512] = {
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x04-0x07 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x08-0x0B */
-	0xC9, 0x4A, 0xDD, 0xFC, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x18-0x1B */
@@ -12354,6 +12424,142 @@
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */
 };
 
+static unsigned char u2c_F9[512] = {
+	0xB0, 0x5A, 0xA7, 0xF3, 0xA8, 0xAE, 0xB8, 0xEB, /* 0x00-0x03 */
+	0xB7, 0xC6, 0xA6, 0xEA, 0xA5, 0x79, 0xC0, 0x74, /* 0x04-0x07 */
+	0xC0, 0x74, 0xAB, 0xB4, 0xAA, 0xF7, 0xB3, 0xE2, /* 0x08-0x0B */
+	0xA9, 0x60, 0xC3, 0x69, 0xC4, 0xEE, 0xC3, 0xB9, /* 0x0C-0x0F */
+	0xC5, 0xDA, 0xC1, 0xB3, 0xBB, 0x72, 0xC5, 0xDE, /* 0x10-0x13 */
+	0xBC, 0xD6, 0xAC, 0xA5, 0xAF, 0x4F, 0xAF, 0x5F, /* 0x14-0x17 */
+	0xB8, 0xA8, 0xB9, 0x54, 0xC0, 0x64, 0xB6, 0xC3, /* 0x18-0x1B */
+	0xA7, 0x5A, 0xC4, 0xE6, 0xC4, 0xEA, 0xC4, 0xF5, /* 0x1C-0x1F */
+	0xC6, 0x7D, 0xB4, 0x50, 0xC0, 0xDD, 0xC2, 0xC5, /* 0x20-0x23 */
+	0xC4, 0xB0, 0xA9, 0xD4, 0xC3, 0xBE, 0xC4, 0xFA, /* 0x24-0x27 */
+	0xB4, 0x59, 0xAE, 0xD4, 0xAE, 0xF6, 0xAF, 0x54, /* 0x28-0x2B */
+	0x3F, 0x3F, 0xA8, 0xD3, 0xA7, 0x4E, 0xB3, 0xD2, /* 0x2C-0x2F */
+	0xBE, 0xDB, 0xC3, 0x72, 0xC4, 0x6C, 0xBF, 0x63, /* 0x30-0x33 */
+	0xA6, 0xD1, 0xC4, 0xAA, 0xB8, 0xB8, 0xB8, 0xF4, /* 0x34-0x37 */
+	0xC5, 0x53, 0xBE, 0x7C, 0xC6, 0x4F, 0xB8, 0x4C, /* 0x38-0x3B */
+	0xB8, 0x53, 0xBA, 0xF1, 0xDB, 0x77, 0xBF, 0xFD, /* 0x3C-0x3F */
+	0xB3, 0xC0, 0xBD, 0xD7, 0xC3, 0x62, 0xA7, 0xCB, /* 0x40-0x43 */
+	0xC5, 0xA2, 0xC5, 0xA4, 0xA8, 0x63, 0xBD, 0x55, /* 0x44-0x47 */
+	0xB8, 0xEF, 0xB9, 0x70, 0xC2, 0x53, 0xB9, 0xF0, /* 0x48-0x4B */
+	0xBC, 0xD3, 0xB2, 0x5C, 0xBA, 0x7C, 0xB2, 0xD6, /* 0x4C-0x4F */
+	0xC1, 0x5C, 0xAD, 0xAE, 0xB0, 0xC7, 0xA6, 0xD8, /* 0x50-0x53 */
+	0xBB, 0xFE, 0xAD, 0xE2, 0xB8, 0x57, 0xBA, 0xF0, /* 0x54-0x57 */
+	0xB5, 0xD9, 0xB3, 0xAE, 0xC5, 0xAA, 0xCE, 0xD4, /* 0x58-0x5B */
+	0xBC, 0xD6, 0xBF, 0xD5, 0xA4, 0xA6, 0xB9, 0xE7, /* 0x5C-0x5F */
+	0xAB, 0xE3, 0xB2, 0x76, 0xB2, 0xA7, 0xA5, 0x5F, /* 0x60-0x63 */
+	0xED, 0xA8, 0xAB, 0x4B, 0xB4, 0x5F, 0xA4, 0xA3, /* 0x64-0x67 */
+	0xAA, 0x63, 0xBC, 0xC6, 0xAF, 0xC1, 0xB0, 0xD1, /* 0x68-0x6B */
+	0xB6, 0xEB, 0xAC, 0xD9, 0xB8, 0xAD, 0xBB, 0xA1, /* 0x6C-0x6F */
+	0xB1, 0xFE, 0xA8, 0xB0, 0xA8, 0x48, 0xAC, 0x42, /* 0x70-0x73 */
+	0xAD, 0x59, 0xB1, 0xB0, 0xB2, 0xA4, 0xAB, 0x47, /* 0x74-0x77 */
+	0xA8, 0xE2, 0x3F, 0x3F, 0xB1, 0xE7, 0xC2, 0xB3, /* 0x78-0x7B */
+	0xA8, 0x7D, 0xBD, 0xCC, 0xB6, 0x71, 0xC0, 0x79, /* 0x7C-0x7F */
+	
+	0xA7, 0x66, 0xA4, 0x6B, 0xC3, 0x66, 0xAE, 0xC8, /* 0x80-0x83 */
+	0xC2, 0x6F, 0xC4, 0x72, 0xBE, 0x5B, 0xC6, 0x7A, /* 0x84-0x87 */
+	0xC4, 0x52, 0xBE, 0xA4, 0xA4, 0x4F, 0xBE, 0xE4, /* 0x88-0x8B */
+	0xBE, 0xFA, 0xF7, 0x65, 0xA6, 0x7E, 0xBC, 0xA6, /* 0x8C-0x8F */
+	0xC5, 0xCA, 0xBC, 0xBF, 0xBA, 0xA7, 0xB7, 0xD2, /* 0x90-0x93 */
+	0xE6, 0xA3, 0x3F, 0x3F, 0xBD, 0x6D, 0xC1, 0x70, /* 0x94-0x97 */
+	0xBD, 0xFB, 0xBD, 0xAC, 0xB3, 0x73, 0xC1, 0xE5, /* 0x98-0x9B */
+	0xA6, 0x43, 0xA6, 0x48, 0xAB, 0x7C, 0xAF, 0x50, /* 0x9C-0x9F */
+	0xB5, 0xF5, 0xBB, 0xA1, 0xB7, 0x47, 0xA9, 0xC0, /* 0xA0-0xA3 */
+	0xB1, 0xC9, 0xC0, 0xD4, 0xC3, 0xAE, 0xC2, 0x79, /* 0xA4-0xA7 */
+	0xA5, 0x4F, 0xCB, 0xF1, 0xB9, 0xE7, 0xC0, 0xAD, /* 0xA8-0xAB */
+	0xCC, 0xB0, 0xAC, 0xC2, 0xBC, 0xFC, 0xB2, 0xDC, /* 0xAC-0xAF */
+	0xB2, 0xE2, 0xB9, 0x61, 0xB9, 0x73, 0xC6, 0x46, /* 0xB0-0xB3 */
+	0xBB, 0xE2, 0xA8, 0xD2, 0xC2, 0xA7, 0xC4, 0xBF, /* 0xB4-0xB7 */
+	0xC1, 0xF5, 0xB4, 0x63, 0xA4, 0x46, 0xB9, 0xB1, /* 0xB8-0xBB */
+	0xBC, 0x64, 0xA7, 0xBF, 0xAE, 0xC6, 0xBC, 0xD6, /* 0xBC-0xBF */
+	0xBF, 0x52, 0xC0, 0xF8, 0xE7, 0x64, 0xBF, 0xF1, /* 0xC0-0xC3 */
+	0xC0, 0x73, 0xB7, 0x77, 0xA8, 0xBF, 0xBC, 0x42, /* 0xC4-0xC7 */
+	0xCC, 0xD8, 0xAC, 0x68, 0xAC, 0x79, 0xB7, 0xC8, /* 0xC8-0xCB */
+	0xAF, 0x5B, 0xAF, 0x64, 0xB2, 0xB8, 0xAF, 0xC3, /* 0xCC-0xCF */
+	0xC3, 0xFE, 0xA4, 0xBB, 0xBC, 0xAE, 0xB3, 0xB0, /* 0xD0-0xD3 */
+	0xAD, 0xDB, 0xB1, 0x5B, 0xB2, 0x5F, 0xBD, 0xFC, /* 0xD4-0xD7 */
+	0xAB, 0xDF, 0xB7, 0x58, 0xAE, 0xDF, 0xB2, 0x76, /* 0xD8-0xDB */
+	0xB6, 0xA9, 0xA7, 0x51, 0xA6, 0x4F, 0xBC, 0x69, /* 0xDC-0xDF */
+	0xA9, 0xF6, 0xA7, 0xF5, 0xB1, 0xF9, 0xAA, 0x64, /* 0xE0-0xE3 */
+	0xB2, 0x7A, 0xB5, 0x67, 0xBF, 0xA9, 0x3F, 0x3F, /* 0xE4-0xE7 */
+	0xB8, 0xCC, 0xA8, 0xBD, 0xC2, 0xF7, 0xB0, 0xCE, /* 0xE8-0xEB */
+	0xB7, 0xC4, 0xA7, 0x5B, 0xBF, 0x4D, 0xBF, 0x5A, /* 0xEC-0xEF */
+	0xC4, 0xA9, 0x3F, 0x3F, 0xC5, 0xEC, 0xC5, 0xEF, /* 0xF0-0xF3 */
+	0xAA, 0x4C, 0xB2, 0x4F, 0xC1, 0x7B, 0xA5, 0xDF, /* 0xF4-0xF7 */
+	0xB2, 0xC1, 0xB2, 0xC9, 0xAA, 0xAC, 0xAA, 0xA5, /* 0xF8-0xFB */
+	0xC3, 0xD1, 0xA4, 0xB0, 0xAF, 0xF9, 0xA8, 0xEB, /* 0xFC-0xFF */
+};
+
+static unsigned char u2c_FA[512] = {
+	0xA4, 0xC1, 0xAB, 0xD7, 0xA9, 0xDD, 0xBF, 0x7D, /* 0x00-0x03 */
+	0xA6, 0x76, 0xAC, 0x7D, 0xBC, 0xC9, 0xBF, 0xE7, /* 0x04-0x07 */
+	0xA6, 0xE6, 0xAD, 0xB0, 0xA8, 0xA3, 0xB9, 0xF8, /* 0x08-0x0B */
+	0xC9, 0x4A, 0xDD, 0xFC, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */
+	0xB6, 0xEF, 0x3F, 0x3F, 0xB4, 0xB8, 0x3F, 0x3F, /* 0x10-0x13 */
+	0x3F, 0x3F, 0xE8, 0xF9, 0xBD, 0xDE, 0xAF, 0x71, /* 0x14-0x17 */
+	0x3F, 0x3F, 0xAF, 0xAB, 0xB2, 0xBB, 0xBA, 0xD6, /* 0x18-0x1B */
+	0xB9, 0x74, 0xBA, 0xEB, 0xA6, 0xD0, 0x3F, 0x3F, /* 0x1C-0x1F */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xBD, 0xD1, 0x3F, 0x3F, /* 0x20-0x23 */
+	0x3F, 0x3F, 0xB6, 0x68, 0xB3, 0xA3, 0x3F, 0x3F, /* 0x24-0x27 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0xB6, 0xBA, 0xB9, 0x7D, /* 0x28-0x2B */
+	0xC0, 0x5D, 0xC5, 0x62, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x38-0x3B */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x4C-0x4F */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x5C-0x5F */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x60-0x63 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x68-0x6B */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x74-0x77 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */
+	
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x88-0x8B */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB0-0xB3 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC4-0xC7 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC8-0xCB */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xDC-0xDF */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF8-0xFB */
+	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */
+};
+
 static unsigned char u2c_FE[512] = {
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x04-0x07 */
@@ -12423,8 +12629,8 @@
 };
 
 static unsigned char u2c_FF[512] = {
-	0x3F, 0x3F, 0xA1, 0x49, 0x3F, 0x3F, 0xA1, 0xAD, /* 0x00-0x03 */
-	0xA2, 0x43, 0xA2, 0x48, 0xA1, 0xAE, 0x3F, 0x3F, /* 0x04-0x07 */
+	0x3F, 0x3F, 0xA1, 0x49, 0xA1, 0xA8, 0xA1, 0xAD, /* 0x00-0x03 */
+	0xA2, 0x43, 0xA2, 0x48, 0xA1, 0xAE, 0xA1, 0xA6, /* 0x04-0x07 */
 	0xA1, 0x5D, 0xA1, 0x5E, 0xA1, 0xAF, 0xA1, 0xCF, /* 0x08-0x0B */
 	0xA1, 0x41, 0xA1, 0xD0, 0xA1, 0x44, 0xA1, 0xFE, /* 0x0C-0x0F */
 	0xA2, 0xAF, 0xA2, 0xB0, 0xA2, 0xB1, 0xA2, 0xB2, /* 0x10-0x13 */
@@ -12437,9 +12643,9 @@
 	0xA2, 0xDA, 0xA2, 0xDB, 0xA2, 0xDC, 0xA2, 0xDD, /* 0x2C-0x2F */
 	0xA2, 0xDE, 0xA2, 0xDF, 0xA2, 0xE0, 0xA2, 0xE1, /* 0x30-0x33 */
 	0xA2, 0xE2, 0xA2, 0xE3, 0xA2, 0xE4, 0xA2, 0xE5, /* 0x34-0x37 */
-	0xA2, 0xE6, 0xA2, 0xE7, 0xA2, 0xE8, 0x3F, 0x3F, /* 0x38-0x3B */
-	0xA2, 0x40, 0x3F, 0x3F, 0x3F, 0x3F, 0xA1, 0xC4, /* 0x3C-0x3F */
-	0x3F, 0x3F, 0xA2, 0xE9, 0xA2, 0xEA, 0xA2, 0xEB, /* 0x40-0x43 */
+	0xA2, 0xE6, 0xA2, 0xE7, 0xA2, 0xE8, 0xA1, 0x65, /* 0x38-0x3B */
+	0xA2, 0x40, 0xA1, 0x66, 0xA1, 0x73, 0xA1, 0xC4, /* 0x3C-0x3F */
+	0xA1, 0xA5, 0xA2, 0xE9, 0xA2, 0xEA, 0xA2, 0xEB, /* 0x40-0x43 */
 	0xA2, 0xEC, 0xA2, 0xED, 0xA2, 0xEE, 0xA2, 0xEF, /* 0x44-0x47 */
 	0xA2, 0xF0, 0xA2, 0xF1, 0xA2, 0xF2, 0xA2, 0xF3, /* 0x48-0x4B */
 	0xA2, 0xF4, 0xA2, 0xF5, 0xA2, 0xF6, 0xA2, 0xF7, /* 0x4C-0x4F */
@@ -12448,7 +12654,7 @@
 	0xA3, 0x41, 0xA3, 0x42, 0xA3, 0x43, 0xA1, 0x61, /* 0x58-0x5B */
 	0xA1, 0x55, 0xA1, 0x62, 0xA1, 0xE3, 0x3F, 0x3F, /* 0x5C-0x5F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x60-0x63 */
-	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */
+	0xA1, 0x4E, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x68-0x6B */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */
 	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */
@@ -12495,7 +12701,7 @@
 	NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   
 	NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   
 	NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   
-	u2c_20, u2c_21, u2c_22, NULL,   NULL,   u2c_25, u2c_26, NULL,   
+	u2c_20, u2c_21, u2c_22, u2c_23, NULL,   u2c_25, u2c_26, NULL,   
 	NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   
 	u2c_30, u2c_31, u2c_32, u2c_33, NULL,   NULL,   NULL,   NULL,   
 	NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   
@@ -12518,11 +12724,11 @@
 	NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   
 	NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   
 	NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   
+	NULL,   NULL,   NULL,   NULL,   u2c_DC, NULL,   NULL,   NULL,   
 	NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   
 	NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   
 	NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   
-	NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   
-	NULL,   NULL,   u2c_FA, NULL,   NULL,   NULL,   u2c_FE, u2c_FF, };
+	NULL,   u2c_F9, u2c_FA, NULL,   NULL,   NULL,   u2c_FE, u2c_FF, };
 
 static void uni2char(unsigned char ch, unsigned char cl, unsigned char *out, int boundlen, int *outlen)
 {
@@ -12530,6 +12736,7 @@
 
 	if (boundlen <= 0)
 		return;
+
 	uni2charset = page_uni2charset[ch];
 	*outlen = 0;
 	if (uni2charset){
@@ -12553,6 +12760,7 @@
 
 	ch = rawstring[0];
 	cl = rawstring[1];
+
 	charset2uni = page_charset2uni[ch];
 	if (charset2uni && cl){
 		*uni1 = charset2uni[cl].uni2;
@@ -12585,20 +12793,34 @@
 	NULL
 };
 
+static struct nls_table alias_table = {
+	"big5",
+	uni2char,
+	char2uni,
+	inc_use_count,
+	dec_use_count,
+	NULL
+};
+
+
 int __init init_nls_cp950(void)
 {
+	register_nls(&alias_table);
 	return register_nls(&table);
 }
 
 #ifdef MODULE
 int init_module(void)
 {
+
 	return init_nls_cp950();
 }
 
 
 void cleanup_module(void)
 {
+
+	unregister_nls(&alias_table);
 	unregister_nls(&table);
 	return;
 }
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/fs/ntfs/Makefile linux.17p9/fs/ntfs/Makefile
--- linux.vanilla/fs/ntfs/Makefile	Fri Apr 21 12:46:45 2000
+++ linux.17p9/fs/ntfs/Makefile	Thu Jun 22 22:33:19 2000
@@ -3,7 +3,7 @@
 O_TARGET := ntfs.o
 O_OBJS   := fs.o sysctl.o support.o util.o inode.o dir.o super.o attr.o
 M_OBJS   := $(O_TARGET)
-EXTRA_CFLAGS = -DNTFS_IN_LINUX_KERNEL -DNTFS_VERSION=\"990411\"
+EXTRA_CFLAGS = -DNTFS_IN_LINUX_KERNEL -DNTFS_VERSION=\"000607\"
 
 include $(TOPDIR)/Rules.make
 
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/fs/ntfs/fs.c linux.17p9/fs/ntfs/fs.c
--- linux.vanilla/fs/ntfs/fs.c	Sun Jun 11 21:44:22 2000
+++ linux.17p9/fs/ntfs/fs.c	Thu Jun 22 22:33:19 2000
@@ -5,6 +5,7 @@
  *  Copyright (C) 1995-1997, 1999 Martin von Löwis
  *  Copyright (C) 1996 Richard Russon
  *  Copyright (C) 1996-1997 Régis Duchesne
+ *  Copyright (C) 2000 Anton Altaparmakov
  */
 
 #ifdef HAVE_CONFIG_H
@@ -79,7 +80,7 @@
 	io.param=buf;
 	io.size=count;
 	error=ntfs_read_attr(ino,ino->vol->at_data,NULL,*off,&io);
-	if(error)return -error;
+	if(error && !io.size)return -error;
 	
 	*off+=io.size;
 	return io.size;
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/fs/ntfs/inode.c linux.17p9/fs/ntfs/inode.c
--- linux.vanilla/fs/ntfs/inode.c	Fri Apr 21 12:46:45 2000
+++ linux.17p9/fs/ntfs/inode.c	Thu Jun 22 22:33:19 2000
@@ -6,6 +6,7 @@
  *  Copyright (C) 1996-1997 Régis Duchesne
  *  Copyright (C) 1998 Joseph Malicki
  *  Copyright (C) 1999 Steve Dodd
+ *  Copyright (C) 2000 Anton Altaparmakov
  */
 
 #include "ntfstypes.h"
@@ -551,11 +552,11 @@
 		dest->size=chunk;
 		error=ntfs_getput_clusters(ino->vol,s_cluster,
 					   offset-s_vcn*clustersize,dest);
-		if(error)/* FIXME: maybe return failure */
+		if(error)
 		{
 			ntfs_error("Read error\n");
 			dest->size=copied;
-			return 0;
+			return error;
 		}
 		l-=chunk;
 		copied+=chunk;
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/fs/ntfs/struct.h linux.17p9/fs/ntfs/struct.h
--- linux.vanilla/fs/ntfs/struct.h	Fri Apr 21 12:46:45 2000
+++ linux.17p9/fs/ntfs/struct.h	Thu Jun 22 22:33:19 2000
@@ -3,6 +3,7 @@
  * Structure definitions
  *
  *  Copyright (C) 1997 Régis Duchesne
+ *  Copyright (C) 2000 Anton Altaparmakov
  */
 
 /* Necessary forward definition */
@@ -42,7 +43,10 @@
 	ntfs_u32 at_standard_information;
 	ntfs_u32 at_attribute_list;
 	ntfs_u32 at_file_name;
+	ntfs_u32 at_volume_version;
 	ntfs_u32 at_security_descriptor;
+	ntfs_u32 at_volume_name;
+	ntfs_u32 at_volume_information;
 	ntfs_u32 at_data;
 	ntfs_u32 at_index_root;
 	ntfs_u32 at_index_allocation;
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/fs/ntfs/super.c linux.17p9/fs/ntfs/super.c
--- linux.vanilla/fs/ntfs/super.c	Fri Apr 21 12:46:45 2000
+++ linux.17p9/fs/ntfs/super.c	Thu Jun 22 22:33:19 2000
@@ -4,6 +4,7 @@
  *  Copyright (C) 1995-1997, 1999 Martin von Löwis
  *  Copyright (C) 1996-1997 Régis Duchesne
  *  Copyright (C) 1999 Steve Dodd
+ *  Copyright (C) 2000 Anton Altparmakov
  */
 
 #include "ntfstypes.h"
@@ -62,7 +63,10 @@
 	vol->at_standard_information=0x10;
 	vol->at_attribute_list=0x20;
 	vol->at_file_name=0x30;
+	vol->at_volume_version=0x40;
 	vol->at_security_descriptor=0x50;
+	vol->at_volume_name=0x60;
+	vol->at_volume_information=0x70;
 	vol->at_data=0x80;
 	vol->at_index_root=0x90;
 	vol->at_index_allocation=0xA0;
@@ -141,8 +145,18 @@
 	}else if(ntfs_ua_strncmp(name,"$FILE_NAME",64)==0){
 		vol->at_file_name=type;
 		check_type=0x30;
+	}else if(ntfs_ua_strncmp(name,"$VOLUME_VERSION",64)==0){
+		vol->at_volume_version=type;
+		check_type=0x40;
 	}else if(ntfs_ua_strncmp(name,"$SECURITY_DESCRIPTOR",64)==0){
-		vol->at_file_name=type;
+		vol->at_security_descriptor=type;
+		check_type=0x50;
+	}else if(ntfs_ua_strncmp(name,"$VOLUME_NAME",64)==0){
+		vol->at_volume_name=type;
+		check_type=0x60;
+	}else if(ntfs_ua_strncmp(name,"$VOLUME_INFORMATION",64)==0){
+		vol->at_volume_information=type;
+		check_type=0x70;
 	}else if(ntfs_ua_strncmp(name,"$DATA",64)==0){
 		vol->at_data=type;
 		check_type=0x80;
@@ -158,6 +172,7 @@
 	}else if(ntfs_ua_strncmp(name,"$SYMBOLIC_LINK",64)==0 ||
 		 ntfs_ua_strncmp(name,"$REPARSE_POINT",64)==0){
 		vol->at_symlink=type;
+		check_type=0xC0;
 	}
 	if(check_type && check_type!=type){
 		ntfs_error("Unexpected type %x for %x\n",type,check_type);
@@ -196,10 +211,31 @@
 	return error;
 }
 
+/* ntfs_get_version will determine the NTFS version of the 
+   volume and will return the version in a BCD format, with
+   the MSB being the major version number and the LSB the
+   minor one. Otherwise return <0 on error. 
+   Example: version 3.1 will be returned as 0x0301.
+   This has the obvious limitation of not coping with version
+   numbers above 0x80 but that shouldn't be a problem... */
+int ntfs_get_version(ntfs_inode* volume)
+{
+	ntfs_attribute *volinfo;
+
+	volinfo = ntfs_find_attr(volume, volume->vol->at_volume_information, 0);
+	if (!volinfo) 
+		return -EINVAL;
+	if (!volinfo->resident) {
+		ntfs_error("Volume information attribute is not resident!\n");
+		return -EINVAL;
+	}
+	return ((ntfs_u8*)volinfo->d.data)[8] << 8 | ((ntfs_u8*)volinfo->d.data)[9];
+}
+
 int ntfs_load_special_files(ntfs_volume *vol)
 {
 	int error;
-	ntfs_inode upcase,attrdef;
+	ntfs_inode upcase, attrdef, volume;
 
 	vol->mft_ino=(ntfs_inode*)ntfs_calloc(3*sizeof(ntfs_inode));
 	error=ENOMEM;
@@ -232,6 +268,21 @@
 	error=ntfs_init_attrdef(&attrdef);
 	ntfs_clear_inode(&attrdef);
 	if(error)return error;
+
+	/* Check for NTFS version and if Win2k version (ie. 3.0+)
+	   do not allow write access since the driver write support
+	   is broken, especially for Win2k. */
+	ntfs_debug(DEBUG_BSD,"Going to load VOLUME\n");
+	error = ntfs_init_inode(&volume,vol,FILE_VOLUME);
+	if (error) return error;
+	if ((error = ntfs_get_version(&volume)) >= 0x0300) {
+		NTFS_SB(vol)->s_flags |= MS_RDONLY;
+		ntfs_error("Warning! NTFS volume version is Win2k+: Mounting read-only\n");
+	}
+	ntfs_clear_inode(&volume);
+	if (error < 0) return error;
+	ntfs_debug(DEBUG_BSD, "NTFS volume is version %d.%d\n", error >> 8, error & 0xff);
+
 	return 0;
 }
 
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/fs/ntfs/util.c linux.17p9/fs/ntfs/util.c
--- linux.vanilla/fs/ntfs/util.c	Fri Apr 21 12:46:45 2000
+++ linux.17p9/fs/ntfs/util.c	Thu Jun 22 22:33:19 2000
@@ -266,6 +266,8 @@
 			return -1;
 		if(b[i]<a[i])
 			return 1;
+		if (a[i] == 0)
+			return 0;
 	}
 	return 0;
 }
@@ -281,6 +283,8 @@
 			return -1;
 		if(b[i]<NTFS_GETU16(a+i))
 			return 1;
+		if (b[i] == 0)
+			return 0;
 	}
 	return 0;
 }
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/fs/proc/array.c linux.17p9/fs/proc/array.c
--- linux.vanilla/fs/proc/array.c	Sun Jun 11 21:44:22 2000
+++ linux.17p9/fs/proc/array.c	Thu Jun 15 15:42:05 2000
@@ -1486,7 +1486,7 @@
 		case PROC_PID_CPU:
 			return 0;	
 	}
-	if(capable(CAP_DAC_OVERRIDE) || (current->fsuid == euid && ok))
+	if((current->fsuid == euid && ok) || capable(CAP_DAC_OVERRIDE))
 		return 0;
 	return 1;
 }
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/fs/read_write.c linux.17p9/fs/read_write.c
--- linux.vanilla/fs/read_write.c	Sun Jun 11 21:44:22 2000
+++ linux.17p9/fs/read_write.c	Fri Jun 16 16:34:31 2000
@@ -210,12 +210,19 @@
 	if (copy_from_user(iov, vector, count*sizeof(*vector)))
 		goto out;
 
+	/* BSD readv/writev returns EINVAL if one of the iov_len
+	   values < 0 or tot_len overflowed a 32-bit integer. -ink */
 	tot_len = 0;
-	for (i = 0 ; i < count ; i++)
-		tot_len += iov[i].iov_len;
-
-	if((long) tot_len <0)
-		return -EINVAL;
+	ret = -EINVAL;
+	for (i = 0 ; i < count ; i++) {
+		size_t tmp = tot_len;
+		int len = iov[i].iov_len;
+		if (len < 0)
+			goto out;
+		(u32)tot_len += len;
+		if (tot_len < tmp || tot_len < (u32)len)
+			goto out;
+	}
 
 	inode = file->f_dentry->d_inode;
 	/* VERIFY_WRITE actually means a read, as we write to user space */
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/include/asm-alpha/unistd.h linux.17p9/include/asm-alpha/unistd.h
--- linux.vanilla/include/asm-alpha/unistd.h	Fri Apr 21 12:46:48 2000
+++ linux.17p9/include/asm-alpha/unistd.h	Thu Jun 15 15:47:58 2000
@@ -315,7 +315,7 @@
 #define __NR_mincore			375	/* implemented in 2.3 */
 #define __NR_pciconfig_iobase		376
 
-#if defined(__LIBRARY__) && defined(__GNUC__)
+#if defined(__GNUC__)
 
 #define _syscall_return(type)						\
 	return (_sc_err ? errno = _sc_ret, _sc_ret = -1L : 0), (type) _sc_ret
@@ -495,7 +495,7 @@
 	_syscall_return(type);						\
 }
 
-#endif /* __LIBRARY__ && __GNUC__ */
+#endif /* __GNUC__ */
 
 #ifdef __KERNEL_SYSCALLS__
 
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/include/asm-i386/processor.h linux.17p9/include/asm-i386/processor.h
--- linux.vanilla/include/asm-i386/processor.h	Fri Apr 21 23:10:16 2000
+++ linux.17p9/include/asm-i386/processor.h	Thu Jun 15 15:27:47 2000
@@ -48,6 +48,8 @@
 #define X86_VENDOR_UMC 3
 #define X86_VENDOR_NEXGEN 4
 #define X86_VENDOR_CENTAUR 5
+#define X86_VENDOR_RISE 6
+#define X86_VENDOR_TRANSMETA 7
 #define X86_VENDOR_UNKNOWN 0xff
 
 /*
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/include/asm-ppc/bootx.h linux.17p9/include/asm-ppc/bootx.h
--- linux.vanilla/include/asm-ppc/bootx.h	Fri Apr 21 12:46:49 2000
+++ linux.17p9/include/asm-ppc/bootx.h	Fri Jun 16 16:24:34 2000
@@ -133,4 +133,3 @@
 #endif
 
 #endif
-    
\ No newline at end of file
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/include/asm-ppc/elf.h linux.17p9/include/asm-ppc/elf.h
--- linux.vanilla/include/asm-ppc/elf.h	Fri Apr 21 12:46:49 2000
+++ linux.17p9/include/asm-ppc/elf.h	Fri Jun 16 16:24:34 2000
@@ -5,9 +5,11 @@
  * ELF register definitions..
  */
 #include <asm/ptrace.h>
+#include <asm/types.h>
 
 #define ELF_NGREG	48	/* includes nip, msr, lr, etc. */
 #define ELF_NFPREG	33	/* includes fpscr */
+#define ELF_NVRREG	33	/* includes vscr */
 
 /*
  * This is used to ensure we don't load something for the wrong architecture.
@@ -36,6 +38,10 @@
 
 typedef double elf_fpreg_t;
 typedef elf_fpreg_t elf_fpregset_t[ELF_NFPREG];
+
+/* Altivec registers */
+typedef vector128 elf_vrreg_t;
+typedef elf_vrreg_t elf_vrregset_t[ELF_NVRREG];
 
 #define ELF_CORE_COPY_REGS(gregs, regs) \
 	memcpy(gregs, regs, \
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/include/asm-ppc/feature.h linux.17p9/include/asm-ppc/feature.h
--- linux.vanilla/include/asm-ppc/feature.h	Fri Apr 21 12:46:49 2000
+++ linux.17p9/include/asm-ppc/feature.h	Fri Jun 16 16:24:34 2000
@@ -8,12 +8,13 @@
  * for more details.
  *
  * Copyright (C) 1998 Paul Mackerras.
+ * 
  */
 #ifndef __ASM_PPC_FEATURE_H
 #define __ASM_PPC_FEATURE_H
 
 /*
- * The FCR bits for particular features vary somewhat between
+ * The FCR selector for particular features vary somewhat between
  * different machines.  So we abstract a list of features here
  * and let the feature_* routines map them to the actual bits.
  */
@@ -25,19 +26,25 @@
 	FEATURE_Serial_IO_B,
 	FEATURE_SWIM3_enable,
 	FEATURE_MESH_enable,
-	FEATURE_IDE_enable,
-	FEATURE_VIA_enable,
-	FEATURE_CD_power,
+	FEATURE_IDE0_enable,		/* Internal IDE */
+	FEATURE_IDE0_reset,		/* Internal IDE */
+	FEATURE_IOBUS_enable,		/* Internal IDE */
 	FEATURE_Mediabay_reset,
-	FEATURE_Mediabay_enable,
+	FEATURE_Mediabay_power,
 	FEATURE_Mediabay_PCI_enable,
-	FEATURE_Mediabay_IDE_enable,
+	FEATURE_IDE1_enable,		/* MediaBay IDE */
+	FEATURE_IDE1_reset,		/* MediaBay IDE */
 	FEATURE_Mediabay_floppy_enable,
 	FEATURE_BMac_reset,
 	FEATURE_BMac_IO_enable,
-	FEATURE_Modem_Reset,
-	FEATURE_IDE_DiskPower,
-	FEATURE_IDE_Reset,
+	FEATURE_Modem_power,
+	FEATURE_Slow_SCC_PCLK,
+	FEATURE_Sound_power,
+	FEATURE_Sound_CLK_enable,
+	FEATURE_IDE2_enable,
+	FEATURE_IDE2_reset,
+	FEATURE_Mediabay_IDE_switch,	/* MB IDE bus switch */
+	FEATURE_Mediabay_content,	/* MB content indicator enable */
 	FEATURE_last,
 };
 
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/include/asm-ppc/heathrow.h linux.17p9/include/asm-ppc/heathrow.h
--- linux.vanilla/include/asm-ppc/heathrow.h	Thu Jan  1 01:00:00 1970
+++ linux.17p9/include/asm-ppc/heathrow.h	Fri Jun 16 16:24:34 2000
@@ -0,0 +1,47 @@
+/*
+ * heathrow.h: definitions for using the "Heathrow" I/O controller chip.
+ *
+ * Grabbed from Open Firmware definitions on a PowerBook G3 Series
+ *
+ * Copyright (C) 1997 Paul Mackerras.
+ */
+
+/* offset from ohare base for feature control register */
+#define HEATHROW_FEATURE_REG	0x38
+
+/*
+ * Bits in feature control register.
+ * Bits postfixed with a _N are in inverse logic
+ */
+#define HRW_RESET_SCC		0x00000001	/* Named in_use_led in OF ??? */
+#define HRW_BAY_POWER_N		0x00000002
+#define HRW_BAY_PCI_ENABLE	0x00000004
+#define HRW_BAY_IDE_ENABLE	0x00000008
+#define HRW_BAY_FLOPPY_ENABLE	0x00000010
+#define HRW_IDE0_ENABLE		0x00000020
+#define HRW_IDE0_RESET_N	0x00000040
+#define HRW_BAY_RESET_N		0x00000080
+#define HRW_IOBUS_ENABLE	0x00000100	/* Internal IDE ? */
+#define HRW_SCC_ENABLE		0x00000200
+#define HRW_MESH_ENABLE		0x00000400
+#define HRW_SWIM_ENABLE		0x00000800
+#define HRW_SOUND_POWER_N	0x00001000
+#define HRW_SOUND_CLK_ENABLE	0x00002000
+#define HRW_SCCA_IO		0x00004000
+#define HRW_SCCB_IO		0x00008000
+#define HRW_PORT_OR_DESK_VIA_N	0x00010000	/* This one is 0 on PowerBook */
+#define HRW_PWM_MON_ID_N	0x00020000	/* ??? (0) */
+#define HRW_HOOK_MB_CNT_N	0x00040000	/* ??? (0) */
+#define HRW_SWIM_CLONE_FLOPPY	0x00080000	/* ??? (0) */
+#define HRW_AUD_RUN22		0x00100000	/* ??? (1) */
+#define HRW_SCSI_LINK_MODE	0x00200000	/* Read ??? (1) */
+#define HRW_ARB_BYPASS		0x00400000	/* ??? (0 on main, 1 on gatwick) */
+#define HRW_IDE1_RESET_N	0x00800000	/* Media bay */
+#define HRW_SLOW_SCC_PCLK	0x01000000	/* ??? (0) */
+#define HRW_MODEM_POWER_N	0x02000000	/* Used by internal modem on wallstreet */
+#define HRW_MFDC_CELL_ENABLE	0x04000000	/* ??? (0) */
+#define HRW_USE_MFDC		0x08000000	/* ??? (0) */
+#define HRW_BMAC_IO_ENABLE	0x60000000	/* two bits, not documented in OF */
+#define HRW_BMAC_RESET		0x80000000	/* not documented in OF */
+
+#define PADD_MODEM_POWER_N	0x00000001	/* modem power on paddington */
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/include/asm-ppc/ide.h linux.17p9/include/asm-ppc/ide.h
--- linux.vanilla/include/asm-ppc/ide.h	Fri Apr 21 12:46:49 2000
+++ linux.17p9/include/asm-ppc/ide.h	Fri Jun 16 16:24:34 2000
@@ -63,16 +63,6 @@
 void ide_outsw(ide_ioreg_t port, void *buf, int ns);
 void ppc_generic_ide_fix_driveid(struct hd_driveid *id);
 
-#undef insw
-#define insw(port, buf, ns) 	do {				\
-	ppc_ide_md.insw((port), (buf), (ns));			\
-} while (0)
-     
-#undef outsw
-#define outsw(port, buf, ns) 	do {				\
-	ppc_ide_md.outsw((port), (buf), (ns));			\
-} while (0)
-
 #undef	SUPPORT_SLOW_DATA_PORTS
 #define	SUPPORT_SLOW_DATA_PORTS	0
 #undef	SUPPORT_VLB_SYNC
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/include/asm-ppc/io.h linux.17p9/include/asm-ppc/io.h
--- linux.vanilla/include/asm-ppc/io.h	Fri Apr 21 12:46:49 2000
+++ linux.17p9/include/asm-ppc/io.h	Fri Jun 16 16:24:34 2000
@@ -54,10 +54,10 @@
 
 #define insb(port, buf, ns)	_insb((unsigned char *)((port)+_IO_BASE), (buf), (ns))
 #define outsb(port, buf, ns)	_outsb((unsigned char *)((port)+_IO_BASE), (buf), (ns))
-#define insw(port, buf, ns)	_insw((unsigned short *)((port)+_IO_BASE), (buf), (ns))
-#define outsw(port, buf, ns)	_outsw((unsigned short *)((port)+_IO_BASE), (buf), (ns))
-#define insl(port, buf, nl)	_insl((unsigned long *)((port)+_IO_BASE), (buf), (nl))
-#define outsl(port, buf, nl)	_outsl((unsigned long *)((port)+_IO_BASE), (buf), (nl))
+#define insw(port, buf, ns)	_insw_ns((unsigned short *)((port)+_IO_BASE), (buf), (ns))
+#define outsw(port, buf, ns)	_outsw_ns((unsigned short *)((port)+_IO_BASE), (buf), (ns))
+#define insl(port, buf, nl)	_insl_ns((unsigned long *)((port)+_IO_BASE), (buf), (nl))
+#define outsl(port, buf, nl)	_outsl_ns((unsigned long *)((port)+_IO_BASE), (buf), (nl))
 
 #define inb(port)		in_8((unsigned char *)((port)+_IO_BASE))
 #define outb(val, port)		out_8((unsigned char *)((port)+_IO_BASE), (val))
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/include/asm-ppc/keyboard.h linux.17p9/include/asm-ppc/keyboard.h
--- linux.vanilla/include/asm-ppc/keyboard.h	Fri Apr 21 12:46:49 2000
+++ linux.17p9/include/asm-ppc/keyboard.h	Fri Jun 16 16:24:34 2000
@@ -72,8 +72,7 @@
 }
 
 #define kbd_sysrq_xlate	(ppc_md.kbd_sysrq_xlate)
-
-#define SYSRQ_KEY 0x54
+#define SYSRQ_KEY (ppc_md.SYSRQ_KEY)
 
 /* resource allocation */
 #define kbd_request_region()
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/include/asm-ppc/machdep.h linux.17p9/include/asm-ppc/machdep.h
--- linux.vanilla/include/asm-ppc/machdep.h	Fri Apr 21 12:46:49 2000
+++ linux.17p9/include/asm-ppc/machdep.h	Fri Jun 16 16:24:34 2000
@@ -50,6 +50,7 @@
 	void		(*kbd_init_hw)(void);
 #ifdef CONFIG_MAGIC_SYSRQ
 	unsigned char 	*kbd_sysrq_xlate;
+	unsigned long	SYSRQ_KEY;
 #endif
 
 	/* PCI interfaces */
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/include/asm-ppc/mediabay.h linux.17p9/include/asm-ppc/mediabay.h
--- linux.vanilla/include/asm-ppc/mediabay.h	Fri Apr 21 12:46:49 2000
+++ linux.17p9/include/asm-ppc/mediabay.h	Fri Jun 16 16:24:34 2000
@@ -7,11 +7,16 @@
 #ifndef _PPC_MEDIABAY_H
 #define _PPC_MEDIABAY_H
 
+#ifdef __KERNEL__
+
+/* We keep those constants local to the kernel to avoid
+ * compatibility problems with different HW. A /proc inteface
+ * could be defined to tell userland about the content of the bay
+ */
 #define MB_FD	0		/* media bay contains floppy drive */
+#define MB_FD1	1		/* media bay contains floppy drive */
 #define MB_CD	3		/* media bay contains ATA drive such as CD */
-#define MB_NO	7		/* media bay contains nothing */
-
-#ifdef __KERNEL__
+#define MB_NO	0xF		/* media bay contains nothing */
 
 void media_bay_init(void);
 int check_media_bay(struct device_node *which_bay, int what);
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/include/asm-ppc/nvram.h linux.17p9/include/asm-ppc/nvram.h
--- linux.vanilla/include/asm-ppc/nvram.h	Fri Apr 21 12:46:49 2000
+++ linux.17p9/include/asm-ppc/nvram.h	Fri Jun 16 16:24:34 2000
@@ -14,13 +14,13 @@
 
 #define MOTO_RTC_SECONDS		0x1FF9
 #define MOTO_RTC_MINUTES		0x1FFA
-#define MOTO_RTC_HOURS		0x1FFB
+#define MOTO_RTC_HOURS			0x1FFB
 #define MOTO_RTC_DAY_OF_WEEK		0x1FFC
-#define MOTO_RTC_DAY_OF_MONTH	0x1FFD
-#define MOTO_RTC_MONTH		0x1FFE
-#define MOTO_RTC_YEAR		0x1FFF
-#define MOTO_RTC_CONTROLA            0x1FF8
-#define MOTO_RTC_CONTROLB            0x1FF9
+#define MOTO_RTC_DAY_OF_MONTH		0x1FFD
+#define MOTO_RTC_MONTH			0x1FFE
+#define MOTO_RTC_YEAR			0x1FFF
+#define MOTO_RTC_CONTROLA        	0x1FF8
+#define MOTO_RTC_CONTROLB        	0x1FF9
 
 #ifndef BCD_TO_BIN
 #define BCD_TO_BIN(val) ((val)=((val)&15) + ((val)>>4)*10)
@@ -29,5 +29,31 @@
 #ifndef BIN_TO_BCD
 #define BIN_TO_BCD(val) ((val)=(((val)/10)<<4) + (val)%10)
 #endif
+
+/* PowerMac specific nvram stuffs */
+
+enum {
+	pmac_nvram_OF,		/* Open Firmware partition */
+	pmac_nvram_XPRAM,	/* MacOS XPRAM partition */
+	pmac_nvram_NR		/* MacOS Name Registry partition */
+};
+
+/* Return partition offset in nvram */
+extern int	pmac_get_partition(int partition);
+
+/* Direct access to XPRAM */
+extern u8	pmac_xpram_read(int xpaddr);
+extern void	pmac_xpram_write(int xpaddr, u8 data);
+
+/* Some offsets in XPRAM */
+#define PMAC_XPRAM_MACHINE_LOC	0xe4
+#define PMAC_XPRAM_SOUND_VOLUME	0x08
+
+/* Machine location structure in XPRAM */
+struct pmac_machine_location {
+	u32	latitude;	/* 2+30 bit Fractional number */
+	u32	longitude;	/* 2+30 bit Fractional number */
+	u32	delta;		/* mix of GMT delta and DLS */
+};
 
 #endif
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/include/asm-ppc/ohare.h linux.17p9/include/asm-ppc/ohare.h
--- linux.vanilla/include/asm-ppc/ohare.h	Fri Apr 21 12:46:49 2000
+++ linux.17p9/include/asm-ppc/ohare.h	Fri Jun 16 16:24:34 2000
@@ -2,6 +2,9 @@
  * ohare.h: definitions for using the "O'Hare" I/O controller chip.
  *
  * Copyright (C) 1997 Paul Mackerras.
+ * 
+ * BenH: Changed to match those of heathrow (but not all of them). Please
+ *       check if I didn't break anything (especially the media bay).
  */
 
 /* offset from ohare base for feature control register */
@@ -13,21 +16,21 @@
  * and may differ for other machines.
  */
 #define OH_SCC_RESET		1
-#define OH_BAY_RESET		2	/* a guess */
+#define OH_BAY_POWER_N		2	/* a guess */
 #define OH_BAY_PCI_ENABLE	4	/* a guess */
 #define OH_BAY_IDE_ENABLE	8
 #define OH_BAY_FLOPPY_ENABLE	0x10
-#define OH_IDE_ENABLE		0x20
-#define OH_IDE_POWER		0x40	/* a guess */
-#define OH_BAY_ENABLE		0x80
-#define OH_IDE_RESET		0x100	/* 0-based, a guess */
+#define OH_IDE0_ENABLE		0x20
+#define OH_IDE0_RESET_N		0x40	/* a guess */
+#define OH_BAY_RESET_N		0x80
+#define OH_IOBUS_ENABLE		0x100	/* IOBUS seems to be IDE */
 #define OH_SCC_ENABLE		0x200
 #define OH_MESH_ENABLE		0x400
 #define OH_FLOPPY_ENABLE	0x800
 #define OH_SCCA_IO		0x4000
 #define OH_SCCB_IO		0x8000
-#define OH_VIA_ENABLE		0x10000
-#define OH_IDECD_POWER		0x800000
+#define OH_VIA_ENABLE		0x10000	/* Is apparently wrong, to be verified */
+#define OH_IDE1_RESET_N		0x800000
 
 /*
  * Bits to set in the feature control register on PowerBooks.
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/include/asm-ppc/page.h linux.17p9/include/asm-ppc/page.h
--- linux.vanilla/include/asm-ppc/page.h	Fri Apr 21 12:46:49 2000
+++ linux.17p9/include/asm-ppc/page.h	Fri Jun 16 16:24:34 2000
@@ -64,7 +64,7 @@
 #define PAGE_ALIGN(addr)	(((addr)+PAGE_SIZE-1)&PAGE_MASK)
 
 extern void clear_page(unsigned long page);
-#define copy_page(to,from)	memcpy((void *)(to), (void *)(from), PAGE_SIZE)
+extern void copy_page(unsigned long to, unsigned long from);
 
 /* map phys->virtual and virtual->phys for RAM pages */
 #ifdef CONFIG_APUS
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/include/asm-ppc/pmu.h linux.17p9/include/asm-ppc/pmu.h
--- linux.vanilla/include/asm-ppc/pmu.h	Fri Apr 21 12:46:49 2000
+++ linux.17p9/include/asm-ppc/pmu.h	Fri Jun 16 16:24:34 2000
@@ -51,6 +51,7 @@
 	PMU_OHARE_BASED,	/* 2400, 3400, 3500 (old G3 powerbook) */
 	PMU_HEATHROW_BASED,	/* PowerBook G3 series */
 	PMU_PADDINGTON_BASED,	/* 1999 PowerBook G3 */
+	PMU_KEYLARGO_BASED,	/* Core99 motherboard (PMU99) */
 };
 
 /*
@@ -66,6 +67,8 @@
 #define PMU_IOC_SET_BACKLIGHT	_IOW('B', 2, sizeof(__u32))
 /* out param: u32*	backlight value: 0 to 31 */
 #define PMU_IOC_GET_MODEL	_IOR('B', 3, sizeof(__u32*))
+/* out param: u32*	has_adb: 0 or 1 */
+#define PMU_IOC_HAS_ADB		_IOR('B', 4, sizeof(__u32*)) 
 
 #ifdef __KERNEL__
 
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/include/asm-ppc/processor.h linux.17p9/include/asm-ppc/processor.h
--- linux.vanilla/include/asm-ppc/processor.h	Fri Apr 21 12:46:49 2000
+++ linux.17p9/include/asm-ppc/processor.h	Mon Jun 26 15:46:11 2000
@@ -4,9 +4,9 @@
 #include <linux/config.h>
 
 #include <asm/ptrace.h>
-#include <asm/residual.h>
 
 /* Bit encodings for Machine State Register (MSR) */
+#define MSR_VEC		(1<<25)		/* Enable Altivec */
 #define MSR_POW		(1<<18)		/* Enable Power Management */
 #define MSR_TGPR	(1<<17)		/* TLB Update registers in use */
 #define MSR_ILE		(1<<16)		/* Interrupt Little-Endian enable */
@@ -53,6 +53,9 @@
 #define HID0_DCI	(1<<10)		/* Data Cache Invalidate */
 #define HID0_SPD	(1<<9)		/* Speculative disable */
 #define HID0_SIED	(1<<7)		/* Serial Instruction Execution [Disable] */
+#define HID0_SGE	(1<<7)		/* Store Gathering Enable */
+#define HID0_BTIC	(1<<5)		/* Branch Target Instruction Cache Enable */
+#define HID0_ABE	(1<<3)		/* Address Broadcast Enable */
 #define HID0_BHTE	(1<<2)		/* Branch History Table Enable */
 #define HID0_BTCD	(1<<1)		/* Branch target cache disable */
 
@@ -147,6 +150,7 @@
 #define EAR	282	/* External Address Register */
 #define L2CR	1017    /* PPC 750 L2 control register */
 
+#define ICTC	1019
 #define THRM1	1020
 #define THRM2	1021
 #define THRM3	1022
@@ -177,6 +181,10 @@
 #define SR15	15
 
 #ifndef __ASSEMBLY__
+#include <asm/types.h>
+
+#ifdef __KERNEL__
+
 extern int _machine;
 
 /* Temporary hacks until we can clean things up better - Corey */
@@ -242,10 +250,21 @@
 	double		fpr[32];	/* Complete floating point set */
 	unsigned long	fpscr_pad;	/* fpr ... fpscr must be contiguous */
 	unsigned long	fpscr;		/* Floating point status */
+#ifdef CONFIG_ALTIVEC
+	vector128	vr[32];		/* Complete AltiVec set */
+	vector128	vscr;		/* AltiVec status */
+	unsigned long	vrsave;
+#endif /* CONFIG_ALTIVEC */
 };
 
 #define INIT_SP		(sizeof(init_stack) + (unsigned long) &init_stack)
 
+#ifdef CONFIG_ALTIVEC
+#define INIT_TSS_AVEC	{{{0}}}, {{0}}, 0,
+#else
+#define INIT_TSS_AVEC
+#endif /* CONFIG_ALTIVEC */
+
 #define INIT_TSS  { \
 	INIT_SP, /* ksp */ \
 	(unsigned long *) swapper_pg_dir, /* pg_tables */ \
@@ -253,7 +272,8 @@
 	(struct pt_regs *)INIT_SP - 1, /* regs */ \
 	KERNEL_DS, /*fs*/ \
 	0, /* last_syscall */ \
-	{0}, 0, 0 \
+	{0}, 0, 0, \
+	INIT_TSS_AVEC \
 }
 
 /*
@@ -295,5 +315,6 @@
 
 #endif /* ndef ASSEMBLY*/
 
-  
+#endif /* __KERNEL__ */
+
 #endif /* __ASM_PPC_PROCESSOR_H */
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/include/asm-ppc/prom.h linux.17p9/include/asm-ppc/prom.h
--- linux.vanilla/include/asm-ppc/prom.h	Fri Apr 21 12:46:49 2000
+++ linux.17p9/include/asm-ppc/prom.h	Fri Jun 16 16:24:34 2000
@@ -72,7 +72,10 @@
 extern struct device_node *find_path_device(const char *path);
 extern struct device_node *find_compatible_devices(const char *type,
 						   const char *compat);
+extern struct device_node *find_pci_device_OFnode(unsigned char bus,
+	unsigned char dev_fn);
 extern struct device_node *find_phandle(phandle);
+extern struct device_node *find_all_nodes(void);
 extern int device_is_compatible(struct device_node *device, const char *);
 extern int machine_is_compatible(const char *compat);
 extern unsigned char *get_property(struct device_node *node, const char *name,
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/include/asm-ppc/residual.h linux.17p9/include/asm-ppc/residual.h
--- linux.vanilla/include/asm-ppc/residual.h	Fri Apr 21 12:46:49 2000
+++ linux.17p9/include/asm-ppc/residual.h	Mon Jun 26 15:46:11 2000
@@ -25,7 +25,7 @@
 /*               Public structures...                                         */
 /*----------------------------------------------------------------------------*/
 
-#include "pnp.h"
+#include <asm/pnp.h>
 
 typedef enum _L1CACHE_TYPE {
   NoneCAC = 0,
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/include/asm-ppc/system.h linux.17p9/include/asm-ppc/system.h
--- linux.vanilla/include/asm-ppc/system.h	Fri Apr 21 12:46:49 2000
+++ linux.17p9/include/asm-ppc/system.h	Fri Jun 16 16:24:34 2000
@@ -72,6 +72,7 @@
 extern void pmac_find_display(void);
 extern void giveup_fpu(struct task_struct *);
 extern void enable_kernel_fp(void);
+extern void giveup_altivec(struct task_struct *);
 extern void cvt_fd(float *from, double *to, unsigned long *fpscr);
 extern void cvt_df(double *from, float *to, unsigned long *fpscr);
 extern int call_rtas(const char *, int, int, unsigned long *, ...);
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/include/asm-ppc/termbits.h linux.17p9/include/asm-ppc/termbits.h
--- linux.vanilla/include/asm-ppc/termbits.h	Fri Apr 21 12:46:49 2000
+++ linux.17p9/include/asm-ppc/termbits.h	Fri Jun 16 16:24:34 2000
@@ -57,12 +57,9 @@
 #define ICRNL	0000400
 #define IXON	0001000
 #define IXOFF	0002000
-#if defined(__KERNEL__) || defined(__USE_BSD)
-  /* POSIX.1 doesn't want these... */
-# define IXANY		0004000
-# define IUCLC		0010000
-# define IMAXBEL	0020000
-#endif
+#define IXANY	0004000
+#define IUCLC	0010000
+#define IMAXBEL	0020000
 
 /* c_oflag bits */
 #define OPOST	0000001
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/include/asm-ppc/time.h linux.17p9/include/asm-ppc/time.h
--- linux.vanilla/include/asm-ppc/time.h	Thu Jan  1 01:00:00 1970
+++ linux.17p9/include/asm-ppc/time.h	Mon Jun 26 15:46:11 2000
@@ -0,0 +1,34 @@
+/*
+ * $Id: time.h,v 1.11.2.1 1999/08/27 04:20:35 cort Exp $
+ * Common time prototypes and such for all ppc machines.
+ *
+ * Written by Cort Dougan (cort@cs.nmt.edu) to merge
+ * Paul Mackerras' version and mine for PReP and Pmac.
+ */
+
+#include <linux/mc146818rtc.h>
+
+/* time.c */
+extern unsigned decrementer_count;
+extern unsigned count_period_num;
+extern unsigned count_period_den;
+extern unsigned long mktime(unsigned int, unsigned int, unsigned int,
+			    unsigned int, unsigned int, unsigned int);
+extern void to_tm(int tim, struct rtc_time * tm);
+extern time_t last_rtc_update;
+
+int via_calibrate_decr(void);
+
+/* Accessor functions for the decrementer register. */
+static __inline__ unsigned int get_dec(void)
+{
+	unsigned int ret;
+
+	asm volatile("mfspr %0,22" : "=r" (ret) :);
+	return ret;
+}
+
+static __inline__ void set_dec(unsigned int val)
+{
+	asm volatile("mtspr 22,%0" : : "r" (val));
+}
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/include/asm-ppc/types.h linux.17p9/include/asm-ppc/types.h
--- linux.vanilla/include/asm-ppc/types.h	Fri Apr 21 12:46:49 2000
+++ linux.17p9/include/asm-ppc/types.h	Fri Jun 16 16:24:34 2000
@@ -39,6 +39,10 @@
 typedef signed long long s64;
 typedef unsigned long long u64;
 
+typedef struct {
+	u32 u[4];
+} __attribute((aligned(16))) vector128;
+
 #define BITS_PER_LONG 32
 
 #endif /* __KERNEL__ */
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/include/asm-sparc64/pbm.h linux.17p9/include/asm-sparc64/pbm.h
--- linux.vanilla/include/asm-sparc64/pbm.h	Fri Apr 21 12:46:51 2000
+++ linux.17p9/include/asm-sparc64/pbm.h	Fri Jun 16 16:19:54 2000
@@ -14,6 +14,8 @@
 
 struct linux_pbm_info;
 
+extern volatile u64 *pci_dma_wsync;
+
 /* This is what we use to determine what the PROM has assigned so
  * far, so that we can perform assignments for addresses which
  * were not taken care of by OBP.  See psycho.c for details.
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/include/linux/blkdev.h linux.17p9/include/linux/blkdev.h
--- linux.vanilla/include/linux/blkdev.h	Sun Jun 11 21:44:23 2000
+++ linux.17p9/include/linux/blkdev.h	Fri Jun 23 00:26:53 2000
@@ -50,7 +50,7 @@
 ((elevator_t) {						\
 	128,			/* read_latency */	\
 	8192,			/* write_latency */	\
-	4,			/* max_bomb_segments */	\
+	32,			/* max_bomb_segments */	\
         0                       /* queue_ID */          \
 	})
 
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/include/linux/cdrom.h linux.17p9/include/linux/cdrom.h
--- linux.vanilla/include/linux/cdrom.h	Sun Jun 11 21:44:23 2000
+++ linux.17p9/include/linux/cdrom.h	Thu Jun 15 15:30:57 2000
@@ -438,9 +438,12 @@
 #define GPCMD_MECHANISM_STATUS		    0xbd
 #define GPCMD_MODE_SELECT_10		    0x55
 #define GPCMD_MODE_SENSE_10		    0x5a
+#define GPCMD_MODE_SELECT_6		    0x15
+#define GPCMD_MODE_SENSE_6		    0x1a
 #define GPCMD_PAUSE_RESUME		    0x4b
 #define GPCMD_PLAY_AUDIO_10		    0x45
 #define GPCMD_PLAY_AUDIO_MSF		    0x47
+#define GPCMD_PLAY_AUDIO_TI		    0x48
 #define GPCMD_PLAY_CD			    0xbc
 #define GPCMD_PREVENT_ALLOW_MEDIUM_REMOVAL  0x1e
 #define GPCMD_READ_10			    0x28
@@ -734,8 +737,8 @@
     	char name[20];                  /* name of the device type */
 /* per-device flags */
         __u8 sanyo_slot		: 2;	/* Sanyo 3 CD changer support */
-        __u8 reserved		: 6;	/* not used yet */
-	struct cdrom_write_settings write;
+        __u8 scsi_2		: 1;	/* strict SCSI-II device */
+        __u8 reserved		: 5;	/* not used yet */
 };
 
 struct cdrom_device_ops {
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/include/linux/falc-lh.h linux.17p9/include/linux/falc-lh.h
--- linux.vanilla/include/linux/falc-lh.h	Thu Jan  1 01:00:00 1970
+++ linux.17p9/include/linux/falc-lh.h	Thu Jun 15 15:45:43 2000
@@ -0,0 +1,1231 @@
+/*
+ * falc.h	Description of the Siemens FALC T1/E1 framer.
+ *
+ * Author:	Ivan Passos <ivan@cyclades.com>
+ *
+ * Copyright:	(c) 2000 Cyclades Corp.
+ *
+ *	This program is free software; you can redistribute it and/or
+ *	modify it under the terms of the GNU General Public License
+ *	as published by the Free Software Foundation; either version
+ *	2 of the License, or (at your option) any later version.
+ *
+ * $Log: falc.h,v $
+ * Revision 1.1 2000/05/15 ivan
+ * Included DJA bits for the LIM2 register.
+ *
+ * Revision 1.0 2000/02/22 ivan
+ * Initial version.
+ *
+ */
+
+#ifndef _FALC_LH_H
+#define _FALC_LH_H
+
+#define NUM_OF_T1_CHANNELS	24
+#define NUM_OF_E1_CHANNELS	32
+
+/*>>>>>>>>>>>>>>>>>  FALC Register Bits (Transmit Mode)  <<<<<<<<<<<<<<<<<<< */
+
+/* CMDR (Command Register)
+   ---------------- E1 & T1 ------------------------------ */
+#define CMDR_RMC	0x80
+#define CMDR_RRES	0x40
+#define CMDR_XREP	0x20
+#define CMDR_XRES	0x10
+#define CMDR_XHF	0x08
+#define CMDR_XTF	0x04
+#define CMDR_XME	0x02
+#define CMDR_SRES	0x01
+
+/* MODE (Mode Register)
+   ----------------- E1 & T1 ----------------------------- */
+#define MODE_MDS2	0x80
+#define MODE_MDS1	0x40
+#define MODE_MDS0	0x20
+#define MODE_BRAC	0x10
+#define MODE_HRAC	0x08
+
+/* IPC (Interrupt Port Configuration)
+   ----------------- E1 & T1 ----------------------------- */
+#define IPC_VIS		0x80
+#define IPC_SCI		0x04
+#define IPC_IC1		0x02
+#define IPC_IC0		0x01
+
+/* CCR1 (Common Configuration Register 1)
+   ----------------- E1 & T1 ----------------------------- */
+#define CCR1_SFLG       0x80
+#define CCR1_XTS16RA    0x40
+#define CCR1_BRM        0x40
+#define CCR1_CASSYM     0x20
+#define CCR1_EDLX       0x20
+#define CCR1_EITS       0x10
+#define CCR1_ITF        0x08
+#define CCR1_RFT1       0x02
+#define CCR1_RFT0       0x01
+
+/* CCR3 (Common Configuration Register 3)
+   ---------------- E1 & T1 ------------------------------ */
+
+#define CCR3_PRE1       0x80
+#define CCR3_PRE0       0x40
+#define CCR3_EPT        0x20
+#define CCR3_RADD       0x10
+#define CCR3_RCRC       0x04
+#define CCR3_XCRC       0x02
+
+
+/* RTR1-4 (Receive Timeslot Register 1-4)
+   ---------------- E1 & T1 ------------------------------ */
+
+#define RTR1_TS0        0x80
+#define RTR1_TS1        0x40
+#define RTR1_TS2        0x20
+#define RTR1_TS3        0x10
+#define RTR1_TS4        0x08
+#define RTR1_TS5        0x04
+#define RTR1_TS6        0x02
+#define RTR1_TS7        0x01
+
+#define RTR2_TS8        0x80
+#define RTR2_TS9        0x40
+#define RTR2_TS10       0x20
+#define RTR2_TS11       0x10
+#define RTR2_TS12       0x08
+#define RTR2_TS13       0x04
+#define RTR2_TS14       0x02
+#define RTR2_TS15       0x01
+
+#define RTR3_TS16       0x80
+#define RTR3_TS17       0x40
+#define RTR3_TS18       0x20
+#define RTR3_TS19       0x10
+#define RTR3_TS20       0x08
+#define RTR3_TS21       0x04
+#define RTR3_TS22       0x02
+#define RTR3_TS23       0x01
+
+#define RTR4_TS24       0x80
+#define RTR4_TS25       0x40
+#define RTR4_TS26       0x20
+#define RTR4_TS27       0x10
+#define RTR4_TS28       0x08
+#define RTR4_TS29       0x04
+#define RTR4_TS30       0x02
+#define RTR4_TS31       0x01
+
+
+/* TTR1-4 (Transmit Timeslot Register 1-4)
+   ---------------- E1 & T1 ------------------------------ */
+
+#define TTR1_TS0        0x80
+#define TTR1_TS1        0x40
+#define TTR1_TS2        0x20
+#define TTR1_TS3        0x10
+#define TTR1_TS4        0x08
+#define TTR1_TS5        0x04
+#define TTR1_TS6        0x02
+#define TTR1_TS7        0x01
+
+#define TTR2_TS8        0x80
+#define TTR2_TS9        0x40
+#define TTR2_TS10       0x20
+#define TTR2_TS11       0x10
+#define TTR2_TS12       0x08
+#define TTR2_TS13       0x04
+#define TTR2_TS14       0x02
+#define TTR2_TS15       0x01
+
+#define TTR3_TS16       0x80
+#define TTR3_TS17       0x40
+#define TTR3_TS18       0x20
+#define TTR3_TS19       0x10
+#define TTR3_TS20       0x08
+#define TTR3_TS21       0x04
+#define TTR3_TS22       0x02
+#define TTR3_TS23       0x01
+
+#define TTR4_TS24       0x80
+#define TTR4_TS25       0x40
+#define TTR4_TS26       0x20
+#define TTR4_TS27       0x10
+#define TTR4_TS28       0x08
+#define TTR4_TS29       0x04
+#define TTR4_TS30       0x02
+#define TTR4_TS31       0x01
+
+
+
+/* IMR0-4 (Interrupt Mask Register 0-4)
+
+   ----------------- E1 & T1 ----------------------------- */
+
+#define IMR0_RME        0x80
+#define IMR0_RFS        0x40
+#define IMR0_T8MS       0x20
+#define IMR0_ISF        0x20
+#define IMR0_RMB        0x10
+#define IMR0_CASC       0x08
+#define IMR0_RSC        0x08
+#define IMR0_CRC6       0x04
+#define IMR0_CRC4       0x04
+#define IMR0_PDEN	0x02
+#define IMR0_RPF        0x01
+
+#define IMR1_CASE       0x80
+#define IMR1_RDO        0x40
+#define IMR1_ALLS       0x20
+#define IMR1_XDU        0x10
+#define IMR1_XMB        0x08
+#define IMR1_XLSC       0x02
+#define IMR1_XPR        0x01
+#define IMR1_LLBSC	0x80
+
+#define IMR2_FAR        0x80
+#define IMR2_LFA        0x40
+#define IMR2_MFAR       0x20
+#define IMR2_T400MS     0x10
+#define IMR2_LMFA       0x10
+#define IMR2_AIS        0x08
+#define IMR2_LOS        0x04
+#define IMR2_RAR        0x02
+#define IMR2_RA         0x01
+
+#define IMR3_ES         0x80
+#define IMR3_SEC        0x40
+#define IMR3_LMFA16     0x20
+#define IMR3_AIS16      0x10
+#define IMR3_RA16       0x08
+#define IMR3_API        0x04
+#define IMR3_XSLP       0x20
+#define IMR3_XSLN       0x10
+#define IMR3_LLBSC      0x08
+#define IMR3_XRS        0x04
+#define IMR3_SLN        0x02
+#define IMR3_SLP        0x01
+
+#define IMR4_LFA        0x80
+#define IMR4_FER        0x40
+#define IMR4_CER        0x20
+#define IMR4_AIS        0x10
+#define IMR4_LOS        0x08
+#define IMR4_CVE        0x04
+#define IMR4_SLIP       0x02
+#define IMR4_EBE        0x01
+
+/* FMR0-5 for E1 and T1  (Framer Mode Register ) */
+
+#define FMR0_XC1        0x80
+#define FMR0_XC0        0x40
+#define FMR0_RC1        0x20
+#define FMR0_RC0        0x10
+#define FMR0_EXTD       0x08
+#define FMR0_ALM        0x04
+#define E1_FMR0_FRS     0x02
+#define T1_FMR0_FRS     0x08
+#define FMR0_SRAF       0x04
+#define FMR0_EXLS       0x02
+#define FMR0_SIM        0x01
+
+#define FMR1_MFCS       0x80
+#define FMR1_AFR        0x40
+#define FMR1_ENSA       0x20
+#define FMR1_CTM        0x80
+#define FMR1_SIGM       0x40
+#define FMR1_EDL        0x20
+#define FMR1_PMOD       0x10
+#define FMR1_XFS        0x08
+#define FMR1_CRC        0x08
+#define FMR1_ECM        0x04
+#define FMR1_IMOD       0x02
+#define FMR1_XAIS       0x01
+
+#define FMR2_RFS1       0x80
+#define FMR2_RFS0       0x40
+#define FMR2_MCSP	0x40
+#define FMR2_RTM        0x20
+#define FMR2_SSP        0x20
+#define FMR2_DAIS       0x10
+#define FMR2_SAIS       0x08
+#define FMR2_PLB        0x04
+#define FMR2_AXRA       0x02
+#define FMR2_ALMF       0x01
+#define FMR2_EXZE       0x01
+
+#define LOOP_RTM	0x40
+#define LOOP_SFM	0x40
+#define LOOP_ECLB	0x20
+#define LOOP_CLA	0x1f
+
+/*--------------------- E1 ----------------------------*/
+#define FMR3_XLD	0x20
+#define FMR3_XLU	0x10
+
+/*--------------------- T1 ----------------------------*/
+#define FMR4_AIS3       0x80
+#define FMR4_TM         0x40
+#define FMR4_XRA        0x20
+#define FMR4_SSC1       0x10
+#define FMR4_SSC0       0x08
+#define FMR4_AUTO       0x04
+#define FMR4_FM1        0x02
+#define FMR4_FM0        0x01
+
+#define FMR5_SRS        0x80
+#define FMR5_EIBR       0x40
+#define FMR5_XLD        0x20
+#define FMR5_XLU        0x10
+
+
+/* LOOP (Channel Loop Back)
+
+   ------------------ E1 & T1 ---------------------------- */
+
+#define LOOP_SFM        0x40
+#define LOOP_ECLB       0x20
+#define LOOP_CLA4       0x10
+#define LOOP_CLA3       0x08
+#define LOOP_CLA2       0x04
+#define LOOP_CLA1       0x02
+#define LOOP_CLA0       0x01
+
+
+
+/* XSW (Transmit Service Word Pulseframe)
+
+   ------------------- E1 --------------------------- */
+
+#define XSW_XSIS        0x80
+#define XSW_XRA         0x20
+#define XSW_XY0         0x10
+#define XSW_XY1         0x08
+#define XSW_XY2         0x04
+#define XSW_XY3         0x02
+#define XSW_XY4         0x01
+
+
+/* XSP (Transmit Spare Bits)
+
+   ------------------- E1 --------------------------- */
+
+#define XSP_XAP         0x80
+#define XSP_CASEN       0x40
+#define XSP_TT0         0x20
+#define XSP_EBP         0x10
+#define XSP_AXS         0x08
+#define XSP_XSIF        0x04
+#define XSP_XS13        0x02
+#define XSP_XS15        0x01
+
+
+/* XC0/1 (Transmit Control 0/1)
+   ------------------ E1 & T1 ---------------------------- */
+
+#define XC0_SA8E        0x80
+#define XC0_SA7E        0x40
+#define XC0_SA6E        0x20
+#define XC0_SA5E        0x10
+#define XC0_SA4E        0x08
+#define XC0_BRM         0x80
+#define XC0_MFBS        0x40
+#define XC0_SFRZ        0x10
+#define XC0_XCO2        0x04
+#define XC0_XCO1        0x02
+#define XC0_XCO0        0x01
+
+#define XC1_XTO5        0x20
+#define XC1_XTO4        0x10
+#define XC1_XTO3        0x08
+#define XC1_XTO2        0x04
+#define XC1_XTO1        0x02
+#define XC1_XTO0        0x01
+
+
+/* RC0/1 (Receive Control 0/1)
+   ------------------ E1 & T1 ---------------------------- */
+
+#define RC0_SICS        0x40
+#define RC0_CRCI        0x20
+#define RC0_XCRCI       0x10
+#define RC0_RDIS        0x08
+#define RC0_RCO2        0x04
+#define RC0_RCO1        0x02
+#define RC0_RCO0        0x01
+
+#define RC1_SWD         0x80
+#define RC1_ASY4        0x40
+#define RC1_RRAM        0x40
+#define RC1_RTO5        0x20
+#define RC1_RTO4        0x10
+#define RC1_RTO3        0x08
+#define RC1_RTO2        0x04
+#define RC1_RTO1        0x02
+#define RC1_RTO0        0x01
+
+
+
+/* XPM0-2 (Transmit Pulse Mask 0-2)
+   --------------------- E1 & T1 ------------------------- */
+
+#define XPM0_XP12       0x80
+#define XPM0_XP11       0x40
+#define XPM0_XP10       0x20
+#define XPM0_XP04       0x10
+#define XPM0_XP03       0x08
+#define XPM0_XP02       0x04
+#define XPM0_XP01       0x02
+#define XPM0_XP00       0x01
+
+#define XPM1_XP30       0x80
+#define XPM1_XP24       0x40
+#define XPM1_XP23       0x20
+#define XPM1_XP22       0x10
+#define XPM1_XP21       0x08
+#define XPM1_XP20       0x04
+#define XPM1_XP14       0x02
+#define XPM1_XP13       0x01
+
+#define XPM2_XLHP       0x80
+#define XPM2_XLT        0x40
+#define XPM2_DAXLT      0x20
+#define XPM2_XP34       0x08
+#define XPM2_XP33       0x04
+#define XPM2_XP32       0x02
+#define XPM2_XP31       0x01
+
+
+/* TSWM (Transparent Service Word Mask)
+   ------------------ E1 ---------------------------- */
+
+#define TSWM_TSIS       0x80
+#define TSWM_TSIF       0x40
+#define TSWM_TRA        0x20
+#define TSWM_TSA4       0x10
+#define TSWM_TSA5       0x08
+#define TSWM_TSA6       0x04
+#define TSWM_TSA7       0x02
+#define TSWM_TSA8       0x01
+
+/* IDLE <Idle Channel Code Register>
+
+   ------------------ E1 & T1 ----------------------- */
+
+#define IDLE_IDL7       0x80
+#define IDLE_IDL6       0x40
+#define IDLE_IDL5       0x20
+#define IDLE_IDL4       0x10
+#define IDLE_IDL3       0x08
+#define IDLE_IDL2       0x04
+#define IDLE_IDL1       0x02
+#define IDLE_IDL0       0x01
+
+
+/* XSA4-8 <Transmit SA4-8 Register(Read/Write) >
+   -------------------E1 ----------------------------- */
+
+#define XSA4_XS47       0x80
+#define XSA4_XS46       0x40
+#define XSA4_XS45       0x20
+#define XSA4_XS44       0x10
+#define XSA4_XS43       0x08
+#define XSA4_XS42       0x04
+#define XSA4_XS41       0x02
+#define XSA4_XS40       0x01
+
+#define XSA5_XS57       0x80
+#define XSA5_XS56       0x40
+#define XSA5_XS55       0x20
+#define XSA5_XS54       0x10
+#define XSA5_XS53       0x08
+#define XSA5_XS52       0x04
+#define XSA5_XS51       0x02
+#define XSA5_XS50       0x01
+
+#define XSA6_XS67       0x80
+#define XSA6_XS66       0x40
+#define XSA6_XS65       0x20
+#define XSA6_XS64       0x10
+#define XSA6_XS63       0x08
+#define XSA6_XS62       0x04
+#define XSA6_XS61       0x02
+#define XSA6_XS60       0x01
+
+#define XSA7_XS77       0x80
+#define XSA7_XS76       0x40
+#define XSA7_XS75       0x20
+#define XSA7_XS74       0x10
+#define XSA7_XS73       0x08
+#define XSA7_XS72       0x04
+#define XSA7_XS71       0x02
+#define XSA7_XS70       0x01
+
+#define XSA8_XS87       0x80
+#define XSA8_XS86       0x40
+#define XSA8_XS85       0x20
+#define XSA8_XS84       0x10
+#define XSA8_XS83       0x08
+#define XSA8_XS82       0x04
+#define XSA8_XS81       0x02
+#define XSA8_XS80       0x01
+
+
+/* XDL1-3 (Transmit DL-Bit Register1-3 (read/write))
+   ----------------------- T1 --------------------- */
+
+#define XDL1_XDL17      0x80
+#define XDL1_XDL16      0x40
+#define XDL1_XDL15      0x20
+#define XDL1_XDL14      0x10
+#define XDL1_XDL13      0x08
+#define XDL1_XDL12      0x04
+#define XDL1_XDL11      0x02
+#define XDL1_XDL10      0x01
+
+#define XDL2_XDL27      0x80
+#define XDL2_XDL26      0x40
+#define XDL2_XDL25      0x20
+#define XDL2_XDL24      0x10
+#define XDL2_XDL23      0x08
+#define XDL2_XDL22      0x04
+#define XDL2_XDL21      0x02
+#define XDL2_XDL20      0x01
+
+#define XDL3_XDL37      0x80
+#define XDL3_XDL36      0x40
+#define XDL3_XDL35      0x20
+#define XDL3_XDL34      0x10
+#define XDL3_XDL33      0x08
+#define XDL3_XDL32      0x04
+#define XDL3_XDL31      0x02
+#define XDL3_XDL30      0x01
+
+
+/* ICB1-4 (Idle Channel Register 1-4)
+   ------------------ E1 ---------------------------- */
+
+#define E1_ICB1_IC0	0x80
+#define E1_ICB1_IC1	0x40
+#define E1_ICB1_IC2	0x20
+#define E1_ICB1_IC3	0x10
+#define E1_ICB1_IC4	0x08
+#define E1_ICB1_IC5	0x04
+#define E1_ICB1_IC6	0x02
+#define E1_ICB1_IC7	0x01
+
+#define E1_ICB2_IC8	0x80
+#define E1_ICB2_IC9	0x40
+#define E1_ICB2_IC10	0x20
+#define E1_ICB2_IC11	0x10
+#define E1_ICB2_IC12	0x08
+#define E1_ICB2_IC13	0x04
+#define E1_ICB2_IC14	0x02
+#define E1_ICB2_IC15	0x01
+
+#define E1_ICB3_IC16	0x80
+#define E1_ICB3_IC17	0x40
+#define E1_ICB3_IC18	0x20
+#define E1_ICB3_IC19	0x10
+#define E1_ICB3_IC20	0x08
+#define E1_ICB3_IC21	0x04
+#define E1_ICB3_IC22	0x02
+#define E1_ICB3_IC23	0x01
+
+#define E1_ICB4_IC24	0x80
+#define E1_ICB4_IC25	0x40
+#define E1_ICB4_IC26	0x20
+#define E1_ICB4_IC27	0x10
+#define E1_ICB4_IC28	0x08
+#define E1_ICB4_IC29	0x04
+#define E1_ICB4_IC30	0x02
+#define E1_ICB4_IC31	0x01
+
+/* ICB1-4 (Idle Channel Register 1-4)
+   ------------------ T1 ---------------------------- */
+
+#define T1_ICB1_IC1	0x80
+#define T1_ICB1_IC2	0x40
+#define T1_ICB1_IC3	0x20
+#define T1_ICB1_IC4	0x10
+#define T1_ICB1_IC5	0x08
+#define T1_ICB1_IC6	0x04
+#define T1_ICB1_IC7	0x02
+#define T1_ICB1_IC8	0x01
+
+#define T1_ICB2_IC9	0x80
+#define T1_ICB2_IC10	0x40
+#define T1_ICB2_IC11	0x20
+#define T1_ICB2_IC12	0x10
+#define T1_ICB2_IC13	0x08
+#define T1_ICB2_IC14	0x04
+#define T1_ICB2_IC15	0x02
+#define T1_ICB2_IC16	0x01
+
+#define T1_ICB3_IC17	0x80
+#define T1_ICB3_IC18	0x40
+#define T1_ICB3_IC19	0x20
+#define T1_ICB3_IC20	0x10
+#define T1_ICB3_IC21	0x08
+#define T1_ICB3_IC22	0x04
+#define T1_ICB3_IC23	0x02
+#define T1_ICB3_IC24	0x01
+
+/* FMR3 (Framer Mode Register 3)
+   --------------------E1------------------------ */
+
+#define FMR3_CMI        0x08
+#define FMR3_SYNSA      0x04
+#define FMR3_CFRZ       0x02
+#define FMR3_EXTIW      0x01
+
+
+
+/* CCB1-3 (Clear Channel Register)
+   ------------------- T1 ----------------------- */
+
+#define CCB1_CH1        0x80
+#define CCB1_CH2        0x40
+#define CCB1_CH3        0x20
+#define CCB1_CH4        0x10
+#define CCB1_CH5        0x08
+#define CCB1_CH6        0x04
+#define CCB1_CH7        0x02
+#define CCB1_CH8        0x01
+
+#define CCB2_CH9        0x80
+#define CCB2_CH10       0x40
+#define CCB2_CH11       0x20
+#define CCB2_CH12       0x10
+#define CCB2_CH13       0x08
+#define CCB2_CH14       0x04
+#define CCB2_CH15       0x02
+#define CCB2_CH16       0x01
+
+#define CCB3_CH17       0x80
+#define CCB3_CH18       0x40
+#define CCB3_CH19       0x20
+#define CCB3_CH20       0x10
+#define CCB3_CH21       0x08
+#define CCB3_CH22       0x04
+#define CCB3_CH23       0x02
+#define CCB3_CH24       0x01
+
+
+/* LIM0/1 (Line Interface Mode 0/1)
+   ------------------- E1 & T1 --------------------------- */
+
+#define LIM0_XFB        0x80
+#define LIM0_XDOS       0x40
+#define LIM0_SCL1       0x20
+#define LIM0_SCL0       0x10
+#define LIM0_EQON       0x08
+#define LIM0_ELOS       0x04
+#define LIM0_LL         0x02
+#define LIM0_MAS        0x01
+
+#define LIM1_EFSC       0x80
+#define LIM1_RIL2       0x40
+#define LIM1_RIL1       0x20
+#define LIM1_RIL0       0x10
+#define LIM1_DCOC       0x08
+#define LIM1_JATT       0x04
+#define LIM1_RL         0x02
+#define LIM1_DRS        0x01
+
+
+/* PCDR (Pulse Count Detection Register(Read/Write))
+   ------------------ E1 & T1 ------------------------- */
+
+#define PCDR_PCD7	0x80
+#define PCDR_PCD6	0x40
+#define PCDR_PCD5	0x20
+#define PCDR_PCD4	0x10
+#define PCDR_PCD3	0x08
+#define PCDR_PCD2	0x04
+#define PCDR_PCD1	0x02
+#define PCDR_PCD0	0x01
+
+#define PCRR_PCR7	0x80
+#define PCRR_PCR6	0x40
+#define PCRR_PCR5	0x20
+#define PCRR_PCR4	0x10
+#define PCRR_PCR3	0x08
+#define PCRR_PCR2	0x04
+#define PCRR_PCR1	0x02
+#define PCRR_PCR0	0x01
+
+
+/* LIM2 (Line Interface Mode 2)
+
+   ------------------ E1 & T1 ---------------------------- */
+
+#define LIM2_DJA2	0x20
+#define LIM2_DJA1	0x10
+#define LIM2_LOS2	0x02
+#define LIM2_LOS1	0x01
+
+/* LCR1 (Loop Code Register 1) */
+
+#define LCR1_EPRM	0x80
+#define	LCR1_XPRBS	0x40
+
+/* SIC1 (System Interface Control 1) */
+#define SIC1_SRSC	0x80
+#define SIC1_RBS1	0x20
+#define SIC1_RBS0	0x10
+#define SIC1_SXSC	0x08
+#define SIC1_XBS1	0x02
+#define SIC1_XBS0	0x01
+
+/* DEC (Disable Error Counter)
+   ------------------ E1 & T1 ---------------------------- */
+
+#define DEC_DCEC3       0x20
+#define DEC_DBEC        0x10
+#define DEC_DCEC1       0x08
+#define DEC_DCEC        0x08
+#define DEC_DEBC        0x04
+#define DEC_DCVC        0x02
+#define DEC_DFEC        0x01
+
+
+/* FALC Register Bits (Receive Mode)
+   ---------------------------------------------------------------------------- */
+
+
+/* FRS0/1 (Framer Receive Status Register 0/1)
+   ----------------- E1 & T1 ---------------------------------- */
+
+#define FRS0_LOS        0x80
+#define FRS0_AIS        0x40
+#define FRS0_LFA        0x20
+#define FRS0_RRA        0x10
+#define FRS0_API        0x08
+#define FRS0_NMF        0x04
+#define FRS0_LMFA       0x02
+#define FRS0_FSRF       0x01
+
+#define FRS1_TS16RA     0x40
+#define FRS1_TS16LOS    0x20
+#define FRS1_TS16AIS    0x10
+#define FRS1_TS16LFA    0x08
+#define FRS1_EXZD       0x80
+#define FRS1_LLBDD      0x10
+#define FRS1_LLBAD      0x08
+#define FRS1_XLS        0x02
+#define FRS1_XLO        0x01
+#define FRS1_PDEN	0x40
+
+/* FRS2/3 (Framer Receive Status Register 2/3)
+   ----------------- T1 ---------------------------------- */
+
+#define FRS2_ESC2       0x80
+#define FRS2_ESC1       0x40
+#define FRS2_ESC0       0x20
+
+#define FRS3_FEH5       0x20
+#define FRS3_FEH4       0x10
+#define FRS3_FEH3       0x08
+#define FRS3_FEH2       0x04
+#define FRS3_FEH1       0x02
+#define FRS3_FEH0       0x01
+
+
+/* RSW (Receive Service Word Pulseframe)
+   ----------------- E1 ------------------------------ */
+
+#define RSW_RSI         0x80
+#define RSW_RRA         0x20
+#define RSW_RYO         0x10
+#define RSW_RY1         0x08
+#define RSW_RY2         0x04
+#define RSW_RY3         0x02
+#define RSW_RY4         0x01
+
+
+/* RSP (Receive Spare Bits / Additional Status)
+   ---------------- E1 ------------------------------- */
+
+#define RSP_SI1         0x80
+#define RSP_SI2         0x40
+#define RSP_LLBDD	0x10
+#define RSP_LLBAD	0x08
+#define RSP_RSIF        0x04
+#define RSP_RS13        0x02
+#define RSP_RS15        0x01
+
+
+/* FECL (Framing Error Counter)
+   ---------------- E1 & T1 -------------------------- */
+
+#define FECL_FE7        0x80
+#define FECL_FE6        0x40
+#define FECL_FE5        0x20
+#define FECL_FE4        0x10
+#define FECL_FE3        0x08
+#define FECL_FE2        0x04
+#define FECL_FE1        0x02
+#define FECL_FE0        0x01
+
+#define FECH_FE15       0x80
+#define FECH_FE14       0x40
+#define FECH_FE13       0x20
+#define FECH_FE12       0x10
+#define FECH_FE11       0x08
+#define FECH_FE10       0x04
+#define FECH_FE9        0x02
+#define FECH_FE8        0x01
+
+
+/* CVCl (Code Violation Counter)
+   ----------------- E1 ------------------------- */
+
+#define CVCL_CV7        0x80
+#define CVCL_CV6        0x40
+#define CVCL_CV5        0x20
+#define CVCL_CV4        0x10
+#define CVCL_CV3        0x08
+#define CVCL_CV2        0x04
+#define CVCL_CV1        0x02
+#define CVCL_CV0        0x01
+
+#define CVCH_CV15       0x80
+#define CVCH_CV14       0x40
+#define CVCH_CV13       0x20
+#define CVCH_CV12       0x10
+#define CVCH_CV11       0x08
+#define CVCH_CV10       0x04
+#define CVCH_CV9        0x02
+#define CVCH_CV8        0x01
+
+
+/* CEC1-3L (CRC Error Counter)
+   ------------------ E1 ----------------------------- */
+
+#define CEC1L_CR7       0x80
+#define CEC1L_CR6       0x40
+#define CEC1L_CR5       0x20
+#define CEC1L_CR4       0x10
+#define CEC1L_CR3       0x08
+#define CEC1L_CR2       0x04
+#define CEC1L_CR1       0x02
+#define CEC1L_CR0       0x01
+
+#define CEC1H_CR15      0x80
+#define CEC1H_CR14      0x40
+#define CEC1H_CR13      0x20
+#define CEC1H_CR12      0x10
+#define CEC1H_CR11      0x08
+#define CEC1H_CR10      0x04
+#define CEC1H_CR9       0x02
+#define CEC1H_CR8       0x01
+
+#define CEC2L_CR7       0x80
+#define CEC2L_CR6       0x40
+#define CEC2L_CR5       0x20
+#define CEC2L_CR4       0x10
+#define CEC2L_CR3       0x08
+#define CEC2L_CR2       0x04
+#define CEC2L_CR1       0x02
+#define CEC2L_CR0       0x01
+
+#define CEC2H_CR15      0x80
+#define CEC2H_CR14      0x40
+#define CEC2H_CR13      0x20
+#define CEC2H_CR12      0x10
+#define CEC2H_CR11      0x08
+#define CEC2H_CR10      0x04
+#define CEC2H_CR9       0x02
+#define CEC2H_CR8       0x01
+
+#define CEC3L_CR7       0x80
+#define CEC3L_CR6       0x40
+#define CEC3L_CR5       0x20
+#define CEC3L_CR4       0x10
+#define CEC3L_CR3       0x08
+#define CEC3L_CR2       0x04
+#define CEC3L_CR1       0x02
+#define CEC3L_CR0       0x01
+
+#define CEC3H_CR15      0x80
+#define CEC3H_CR14      0x40
+#define CEC3H_CR13      0x20
+#define CEC3H_CR12      0x10
+#define CEC3H_CR11      0x08
+#define CEC3H_CR10      0x04
+#define CEC3H_CR9       0x02
+#define CEC3H_CR8       0x01
+
+
+/* CECL (CRC Error Counter)
+
+   ------------------ T1 ----------------------------- */
+
+#define CECL_CR7        0x80
+#define CECL_CR6        0x40
+#define CECL_CR5        0x20
+#define CECL_CR4        0x10
+#define CECL_CR3        0x08
+#define CECL_CR2        0x04
+#define CECL_CR1        0x02
+#define CECL_CR0        0x01
+
+#define CECH_CR15       0x80
+#define CECH_CR14       0x40
+#define CECH_CR13       0x20
+#define CECH_CR12       0x10
+#define CECH_CR11       0x08
+#define CECH_CR10       0x04
+#define CECH_CR9        0x02
+#define CECH_CR8        0x01
+
+/* EBCL (E Bit Error Counter)
+   ------------------- E1 & T1 ------------------------- */
+
+#define EBCL_EB7        0x80
+#define EBCL_EB6        0x40
+#define EBCL_EB5        0x20
+#define EBCL_EB4        0x10
+#define EBCL_EB3        0x08
+#define EBCL_EB2        0x04
+#define EBCL_EB1        0x02
+#define EBCL_EB0        0x01
+
+#define EBCH_EB15       0x80
+#define EBCH_EB14       0x40
+#define EBCH_EB13       0x20
+#define EBCH_EB12       0x10
+#define EBCH_EB11       0x08
+#define EBCH_EB10       0x04
+#define EBCH_EB9        0x02
+#define EBCH_EB8        0x01
+
+
+/* RSA4-8 (Receive Sa4-8-Bit Register)
+   -------------------- E1 --------------------------- */
+
+#define RSA4_RS47       0x80
+#define RSA4_RS46       0x40
+#define RSA4_RS45       0x20
+#define RSA4_RS44       0x10
+#define RSA4_RS43       0x08
+#define RSA4_RS42       0x04
+#define RSA4_RS41       0x02
+#define RSA4_RS40       0x01
+
+#define RSA5_RS57       0x80
+#define RSA5_RS56       0x40
+#define RSA5_RS55       0x20
+#define RSA5_RS54       0x10
+#define RSA5_RS53       0x08
+#define RSA5_RS52       0x04
+#define RSA5_RS51       0x02
+#define RSA5_RS50       0x01
+
+#define RSA6_RS67       0x80
+#define RSA6_RS66       0x40
+#define RSA6_RS65       0x20
+#define RSA6_RS64       0x10
+#define RSA6_RS63       0x08
+#define RSA6_RS62       0x04
+#define RSA6_RS61       0x02
+#define RSA6_RS60       0x01
+
+#define RSA7_RS77       0x80
+#define RSA7_RS76       0x40
+#define RSA7_RS75       0x20
+#define RSA7_RS74       0x10
+#define RSA7_RS73       0x08
+#define RSA7_RS72       0x04
+#define RSA7_RS71       0x02
+#define RSA7_RS70       0x01
+
+#define RSA8_RS87       0x80
+#define RSA8_RS86       0x40
+#define RSA8_RS85       0x20
+#define RSA8_RS84       0x10
+#define RSA8_RS83       0x08
+#define RSA8_RS82       0x04
+#define RSA8_RS81       0x02
+#define RSA8_RS80       0x01
+
+/* RSA6S (Receive Sa6 Bit Status Register)
+   ------------------------ T1 ------------------------- */
+
+#define RSA6S_SX        0x20
+#define RSA6S_SF        0x10
+#define RSA6S_SE        0x08
+#define RSA6S_SC        0x04
+#define RSA6S_SA        0x02
+#define RSA6S_S8        0x01
+
+
+/* RDL1-3 Receive DL-Bit Register1-3)
+   ------------------------ T1 ------------------------- */
+
+#define RDL1_RDL17      0x80
+#define RDL1_RDL16      0x40
+#define RDL1_RDL15      0x20
+#define RDL1_RDL14      0x10
+#define RDL1_RDL13      0x08
+#define RDL1_RDL12      0x04
+#define RDL1_RDL11      0x02
+#define RDL1_RDL10      0x01
+
+#define RDL2_RDL27      0x80
+#define RDL2_RDL26      0x40
+#define RDL2_RDL25      0x20
+#define RDL2_RDL24      0x10
+#define RDL2_RDL23      0x08
+#define RDL2_RDL22      0x04
+#define RDL2_RDL21      0x02
+#define RDL2_RDL20      0x01
+
+#define RDL3_RDL37      0x80
+#define RDL3_RDL36      0x40
+#define RDL3_RDL35      0x20
+#define RDL3_RDL34      0x10
+#define RDL3_RDL33      0x08
+#define RDL3_RDL32      0x04
+#define RDL3_RDL31      0x02
+#define RDL3_RDL30      0x01
+
+
+/* SIS (Signaling Status Register)
+
+   -------------------- E1 & T1 -------------------------- */
+
+#define SIS_XDOV        0x80
+#define SIS_XFW         0x40
+#define SIS_XREP        0x20
+#define SIS_RLI         0x08
+#define SIS_CEC         0x04
+#define SIS_BOM         0x01
+
+
+/* RSIS (Receive Signaling Status Register)
+
+   -------------------- E1 & T1 --------------------------- */
+
+#define RSIS_VFR        0x80
+#define RSIS_RDO        0x40
+#define RSIS_CRC16      0x20
+#define RSIS_RAB        0x10
+#define RSIS_HA1        0x08
+#define RSIS_HA0        0x04
+#define RSIS_HFR        0x02
+#define RSIS_LA         0x01
+
+
+/* RBCL/H (Receive Byte Count Low/High)
+
+   ------------------- E1 & T1 ----------------------- */
+
+#define RBCL_RBC7       0x80
+#define RBCL_RBC6       0x40
+#define RBCL_RBC5       0x20
+#define RBCL_RBC4       0x10
+#define RBCL_RBC3       0x08
+#define RBCL_RBC2       0x04
+#define RBCL_RBC1       0x02
+#define RBCL_RBC0       0x01
+
+#define RBCH_OV         0x10
+#define RBCH_RBC11      0x08
+#define RBCH_RBC10      0x04
+#define RBCH_RBC9       0x02
+#define RBCH_RBC8       0x01
+
+
+/* ISR1-3  (Interrupt Status Register 1-3)
+
+   ------------------ E1 & T1 ------------------------------ */
+
+#define  FISR0_RME	0x80
+#define  FISR0_RFS	0x40
+#define  FISR0_T8MS	0x20
+#define  FISR0_ISF	0x20
+#define  FISR0_RMB	0x10
+#define  FISR0_CASC	0x08
+#define  FISR0_RSC	0x08
+#define  FISR0_CRC6	0x04
+#define  FISR0_CRC4	0x04
+#define  FISR0_PDEN	0x02
+#define  FISR0_RPF	0x01
+
+#define  FISR1_CASE	0x80
+#define  FISR1_LLBSC	0x80
+#define  FISR1_RDO	0x40
+#define  FISR1_ALLS	0x20
+#define  FISR1_XDU	0x10
+#define  FISR1_XMB	0x08
+#define  FISR1_XLSC	0x02
+#define  FISR1_XPR	0x01
+
+#define  FISR2_FAR	0x80
+#define  FISR2_LFA	0x40
+#define  FISR2_MFAR	0x20
+#define  FISR2_T400MS	0x10
+#define  FISR2_LMFA	0x10
+#define  FISR2_AIS	0x08
+#define  FISR2_LOS	0x04
+#define  FISR2_RAR	0x02
+#define  FISR2_RA	0x01
+
+#define  FISR3_ES	0x80
+#define  FISR3_SEC	0x40
+#define  FISR3_LMFA16	0x20
+#define  FISR3_AIS16	0x10
+#define  FISR3_RA16	0x08
+#define  FISR3_API	0x04
+#define  FISR3_XSLP	0x20
+#define  FISR3_XSLN	0x10
+#define  FISR3_LLBSC	0x08
+#define  FISR3_XRS	0x04
+#define  FISR3_SLN	0x02
+#define  FISR3_SLP	0x01
+
+
+/* GIS  (Global Interrupt Status Register)
+
+   --------------------- E1 & T1 --------------------- */
+
+#define  GIS_ISR3	0x08
+#define  GIS_ISR2	0x04
+#define  GIS_ISR1	0x02
+#define  GIS_ISR0	0x01
+
+
+/* VSTR  (Version Status Register)
+
+   --------------------- E1 & T1 --------------------- */
+
+#define  VSTR_VN3	0x08
+#define  VSTR_VN2	0x04
+#define  VSTR_VN1	0x02
+#define  VSTR_VN0	0x01
+
+
+/*>>>>>>>>>>>>>>>>>>>>>  Local Control Structures  <<<<<<<<<<<<<<<<<<<<<<<<< */
+
+/* Write-only Registers (E1/T1 control mode write registers) */
+#define XFIFOH	0x00		/* Tx FIFO High Byte */
+#define XFIFOL	0x01		/* Tx FIFO Low Byte */
+#define CMDR	0x02		/* Command Reg */
+#define DEC	0x60		/* Disable Error Counter */
+#define TEST2	0x62		/* Manuf. Test Reg 2 */
+#define XS(nbr)	(0x70 + (nbr))	/* Tx CAS Reg (0 to 15) */
+
+/* Read-write Registers (E1/T1 status mode read registers) */
+#define MODE	0x03	/* Mode Reg */
+#define RAH1	0x04	/* Receive Address High 1 */
+#define RAH2	0x05	/* Receive Address High 2 */
+#define RAL1	0x06	/* Receive Address Low 1 */
+#define RAL2	0x07	/* Receive Address Low 2 */
+#define IPC	0x08	/* Interrupt Port Configuration */
+#define CCR1	0x09	/* Common Configuration Reg 1 */
+#define CCR3	0x0A	/* Common Configuration Reg 3 */
+#define PRE	0x0B	/* Preamble Reg */
+#define RTR1	0x0C	/* Receive Timeslot Reg 1 */
+#define RTR2	0x0D	/* Receive Timeslot Reg 2 */
+#define RTR3	0x0E	/* Receive Timeslot Reg 3 */
+#define RTR4	0x0F	/* Receive Timeslot Reg 4 */
+#define TTR1	0x10	/* Transmit Timeslot Reg 1 */
+#define TTR2	0x11	/* Transmit Timeslot Reg 2 */
+#define TTR3	0x12	/* Transmit Timeslot Reg 3 */
+#define TTR4	0x13	/* Transmit Timeslot Reg 4 */
+#define IMR0	0x14	/* Interrupt Mask Reg 0 */
+#define IMR1	0x15	/* Interrupt Mask Reg 1 */
+#define IMR2	0x16	/* Interrupt Mask Reg 2 */
+#define IMR3	0x17	/* Interrupt Mask Reg 3 */
+#define IMR4	0x18	/* Interrupt Mask Reg 4 */
+#define IMR5	0x19	/* Interrupt Mask Reg 5 */
+#define FMR0	0x1A	/* Framer Mode Reigster 0 */
+#define FMR1	0x1B	/* Framer Mode Reigster 1 */
+#define FMR2	0x1C	/* Framer Mode Reigster 2 */
+#define LOOP	0x1D	/* Channel Loop Back */
+#define XSW	0x1E	/* Transmit Service Word */
+#define FMR4	0x1E	/* Framer Mode Reg 4 */
+#define XSP	0x1F	/* Transmit Spare Bits */
+#define FMR5	0x1F	/* Framer Mode Reg 5 */
+#define XC0	0x20	/* Transmit Control 0 */
+#define XC1	0x21	/* Transmit Control 1 */
+#define RC0	0x22	/* Receive Control 0 */
+#define RC1	0x23	/* Receive Control 1 */
+#define XPM0	0x24	/* Transmit Pulse Mask 0 */
+#define XPM1	0x25	/* Transmit Pulse Mask 1 */
+#define XPM2	0x26	/* Transmit Pulse Mask 2 */
+#define TSWM	0x27	/* Transparent Service Word Mask */
+#define TEST1	0x28	/* Manuf. Test Reg 1 */
+#define IDLE	0x29	/* Idle Channel Code */
+#define XSA4    0x2A	/* Transmit SA4 Bit Reg */
+#define XDL1	0x2A	/* Transmit DL-Bit Reg 2 */
+#define XSA5    0x2B	/* Transmit SA4 Bit Reg */
+#define XDL2	0x2B	/* Transmit DL-Bit Reg 2 */
+#define XSA6    0x2C	/* Transmit SA4 Bit Reg */
+#define XDL3	0x2C	/* Transmit DL-Bit Reg 2 */
+#define XSA7    0x2D	/* Transmit SA4 Bit Reg */
+#define CCB1	0x2D	/* Clear Channel Reg 1 */
+#define XSA8    0x2E	/* Transmit SA4 Bit Reg */
+#define CCB2	0x2E	/* Clear Channel Reg 2 */
+#define FMR3	0x2F	/* Framer Mode Reg. 3 */
+#define CCB3	0x2F	/* Clear Channel Reg 3 */
+#define ICB1	0x30	/* Idle Channel Reg 1 */
+#define ICB2	0x31	/* Idle Channel Reg 2 */
+#define ICB3	0x32	/* Idle Channel Reg 3 */
+#define ICB4	0x33	/* Idle Channel Reg 4 */
+#define LIM0	0x34	/* Line Interface Mode 0 */
+#define LIM1	0x35	/* Line Interface Mode 1 */
+#define PCDR	0x36	/* Pulse Count Detection */
+#define PCRR	0x37	/* Pulse Count Recovery */
+#define LIM2	0x38	/* Line Interface Mode Reg 2 */
+#define LCR1	0x39	/* Loop Code Reg 1 */
+#define LCR2	0x3A	/* Loop Code Reg 2 */
+#define LCR3	0x3B	/* Loop Code Reg 3 */
+#define SIC1	0x3C	/* System Interface Control 1 */
+
+/* Read-only Registers (E1/T1 control mode read registers) */
+#define RFIFOH	0x00		/* Receive FIFO */
+#define RFIFOL	0x01		/* Receive FIFO */
+#define FRS0	0x4C		/* Framer Receive Status 0 */
+#define FRS1	0x4D		/* Framer Receive Status 1 */
+#define RSW	0x4E		/* Receive Service Word */
+#define FRS2	0x4E		/* Framer Receive Status 2 */
+#define RSP	0x4F		/* Receive Spare Bits */
+#define FRS3	0x4F		/* Framer Receive Status 3 */
+#define FECL	0x50		/* Framing Error Counter */
+#define FECH	0x51		/* Framing Error Counter */
+#define CVCL	0x52		/* Code Violation Counter */
+#define CVCH	0x53		/* Code Violation Counter */
+#define CECL	0x54		/* CRC Error Counter 1 */
+#define CECH	0x55		/* CRC Error Counter 1 */
+#define EBCL	0x56		/* E-Bit Error Counter */
+#define EBCH	0x57		/* E-Bit Error Counter */
+#define BECL	0x58		/* Bit Error Counter Low */
+#define BECH	0x59		/* Bit Error Counter Low */
+#define CEC3	0x5A		/* CRC Error Counter 3 (16-bit) */
+#define RSA4	0x5C		/* Receive SA4 Bit Reg */
+#define RDL1	0x5C		/* Receive DL-Bit Reg 1 */
+#define RSA5	0x5D		/* Receive SA5 Bit Reg */
+#define RDL2	0x5D		/* Receive DL-Bit Reg 2 */
+#define RSA6	0x5E		/* Receive SA6 Bit Reg */
+#define RDL3	0x5E		/* Receive DL-Bit Reg 3 */
+#define RSA7	0x5F		/* Receive SA7 Bit Reg */
+#define RSA8	0x60		/* Receive SA8 Bit Reg */
+#define RSA6S	0x61		/* Receive SA6 Bit Status Reg */
+#define TSR0	0x62		/* Manuf. Test Reg 0 */
+#define TSR1	0x63		/* Manuf. Test Reg 1 */
+#define SIS	0x64		/* Signaling Status Reg */
+#define RSIS	0x65		/* Receive Signaling Status Reg */
+#define RBCL	0x66		/* Receive Byte Control */
+#define RBCH	0x67		/* Receive Byte Control */
+#define FISR0	0x68		/* Interrupt Status Reg 0 */
+#define FISR1	0x69		/* Interrupt Status Reg 1 */
+#define FISR2	0x6A		/* Interrupt Status Reg 2 */
+#define FISR3	0x6B		/* Interrupt Status Reg 3 */
+#define GIS	0x6E		/* Global Interrupt Status */
+#define VSTR	0x6F		/* Version Status */
+#define RS(nbr)	(0x70 + (nbr))	/* Rx CAS Reg (0 to 15) */
+
+#endif	/* _FALC_LH_H */
+
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/include/linux/fs.h linux.17p9/include/linux/fs.h
--- linux.vanilla/include/linux/fs.h	Sun Jun 11 21:44:23 2000
+++ linux.17p9/include/linux/fs.h	Thu Jun 22 22:34:30 2000
@@ -754,7 +754,7 @@
 
 extern void refile_buffer(struct buffer_head * buf);
 extern void set_writetime(struct buffer_head * buf, int flag);
-extern int try_to_free_buffers(struct page *);
+extern int try_to_free_buffers(struct page *, int wait);
 
 extern int nr_buffers;
 extern long buffermem;
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/include/linux/hd64572.h linux.17p9/include/linux/hd64572.h
--- linux.vanilla/include/linux/hd64572.h	Thu Jan  1 01:00:00 1970
+++ linux.17p9/include/linux/hd64572.h	Thu Jun 15 15:45:43 2000
@@ -0,0 +1,437 @@
+/*
+ * hd64572.h	Description of the Hitachi HD64572 (SCA-II), valid for 
+ * 		CPU modes 0 & 2.
+ *
+ * Author:	Ivan Passos <ivan@cyclades.com>
+ *
+ * Copyright:   (c) 2000 Cyclades Corp.
+ *
+ *	This program is free software; you can redistribute it and/or
+ *	modify it under the terms of the GNU General Public License
+ *	as published by the Free Software Foundation; either version
+ *	2 of the License, or (at your option) any later version.
+ *
+ * $Log: hd64572.h,v $
+ * Revision 1.0 2000/01/25 ivan
+ * Initial version.
+ *
+ */
+
+#ifndef _HD64572_H
+#define _HD64572_H
+
+/* Illegal Access Register */
+#define	ILAR	0x00
+
+/* Wait Controller Registers */
+#define PABR0L	0x20	/* Physical Addr Boundary Register 0 L */
+#define PABR0H	0x21	/* Physical Addr Boundary Register 0 H */
+#define PABR1L	0x22	/* Physical Addr Boundary Register 1 L */
+#define PABR1H	0x23	/* Physical Addr Boundary Register 1 H */
+#define WCRL	0x24	/* Wait Control Register L */
+#define WCRM	0x25	/* Wait Control Register M */
+#define WCRH	0x26	/* Wait Control Register H */
+
+/* Interrupt Registers */
+#define IVR	0x60	/* Interrupt Vector Register */
+#define IMVR	0x64	/* Interrupt Modified Vector Register */
+#define ITCR	0x68	/* Interrupt Control Register */
+#define ISR0	0x6c	/* Interrupt Status Register 0 */
+#define ISR1	0x70	/* Interrupt Status Register 1 */
+#define IER0	0x74	/* Interrupt Enable Register 0 */
+#define IER1	0x78	/* Interrupt Enable Register 1 */
+
+/* Register Access Macros (chan is 0 or 1 in _any_ case) */
+#define	M_REG(reg, chan)	(reg + 0x80*chan)		/* MSCI */
+#define	DRX_REG(reg, chan)	(reg + 0x40*chan)		/* DMA Rx */
+#define	DTX_REG(reg, chan)	(reg + 0x20*(2*chan + 1))	/* DMA Tx */
+#define	TRX_REG(reg, chan)	(reg + 0x20*chan)		/* Timer Rx */
+#define	TTX_REG(reg, chan)	(reg + 0x10*(2*chan + 1))	/* Timer Tx */
+#define	ST_REG(reg, chan)	(reg + 0x80*chan)		/* Status Cnt */
+#define IR0_DRX(val, chan)	((val)<<(8*(chan)))		/* Int DMA Rx */
+#define IR0_DTX(val, chan)	((val)<<(4*(2*chan + 1)))	/* Int DMA Tx */
+#define IR0_M(val, chan)	((val)<<(8*(chan)))		/* Int MSCI */
+
+/* MSCI Channel Registers */
+#define MD0	0x138	/* Mode reg 0 */
+#define MD1	0x139	/* Mode reg 1 */
+#define MD2	0x13a	/* Mode reg 2 */
+#define MD3	0x13b	/* Mode reg 3 */
+#define CTL	0x130	/* Control reg */
+#define RXS	0x13c	/* RX clock source */
+#define TXS	0x13d	/* TX clock source */
+#define EXS	0x13e	/* External clock input selection */
+#define TMCT	0x144	/* Time constant (Tx) */
+#define TMCR	0x145	/* Time constant (Rx) */
+#define CMD	0x128	/* Command reg */
+#define ST0	0x118	/* Status reg 0 */
+#define ST1	0x119	/* Status reg 1 */
+#define ST2	0x11a	/* Status reg 2 */
+#define ST3	0x11b	/* Status reg 3 */
+#define ST4	0x11c	/* Status reg 4 */
+#define FST	0x11d	/* frame Status reg  */
+#define IE0	0x120	/* Interrupt enable reg 0 */
+#define IE1	0x121	/* Interrupt enable reg 1 */
+#define IE2	0x122	/* Interrupt enable reg 2 */
+#define IE4	0x124	/* Interrupt enable reg 4 */
+#define FIE	0x125	/* Frame Interrupt enable reg  */
+#define SA0	0x140	/* Syn Address reg 0 */
+#define SA1	0x141	/* Syn Address reg 1 */
+#define IDL	0x142	/* Idle register */
+#define TRBL	0x100	/* TX/RX buffer reg L */ 
+#define TRBK	0x101	/* TX/RX buffer reg K */ 
+#define TRBJ	0x102	/* TX/RX buffer reg J */ 
+#define TRBH	0x103	/* TX/RX buffer reg H */ 
+#define TRC0	0x148	/* TX Ready control reg 0 */ 
+#define TRC1	0x149	/* TX Ready control reg 1 */ 
+#define RRC	0x14a	/* RX Ready control reg */ 
+#define CST0	0x108	/* Current Status Register 0 */ 
+#define CST1	0x109	/* Current Status Register 1 */ 
+#define CST2	0x10a	/* Current Status Register 2 */ 
+#define CST3	0x10b	/* Current Status Register 3 */ 
+#define GPO	0x131	/* General Purpose Output Pin Ctl Reg */
+#define TFS	0x14b	/* Tx Start Threshold Ctl Reg */
+#define TFN	0x143	/* Inter-transmit-frame Time Fill Ctl Reg */
+#define TBN	0x110	/* Tx Buffer Number Reg */
+#define RBN	0x111	/* Rx Buffer Number Reg */
+#define TNR0	0x150	/* Tx DMA Request Ctl Reg 0 */
+#define TNR1	0x151	/* Tx DMA Request Ctl Reg 1 */
+#define TCR	0x152	/* Tx DMA Critical Request Reg */
+#define RNR	0x154	/* Rx DMA Request Ctl Reg */
+#define RCR	0x156	/* Rx DMA Critical Request Reg */
+
+/* Timer Registers */
+#define TCNTL	0x200	/* Timer Upcounter L */
+#define TCNTH	0x201	/* Timer Upcounter H */
+#define TCONRL	0x204	/* Timer Constant Register L */
+#define TCONRH	0x205	/* Timer Constant Register H */
+#define TCSR	0x206	/* Timer Control/Status Register */
+#define TEPR	0x207	/* Timer Expand Prescale Register */
+
+/* DMA registers */
+#define PCR		0x40		/* DMA priority control reg */
+#define DRR		0x44		/* DMA reset reg */
+#define DMER		0x07		/* DMA Master Enable reg */
+#define BTCR		0x08		/* Burst Tx Ctl Reg */
+#define BOLR		0x0c		/* Back-off Length Reg */
+#define DSR_RX(chan)	(0x48 + 2*chan)	/* DMA Status Reg (Rx) */
+#define DSR_TX(chan)	(0x49 + 2*chan)	/* DMA Status Reg (Tx) */
+#define DIR_RX(chan)	(0x4c + 2*chan)	/* DMA Interrupt Enable Reg (Rx) */
+#define DIR_TX(chan)	(0x4d + 2*chan)	/* DMA Interrupt Enable Reg (Tx) */
+#define FCT_RX(chan)	(0x50 + 2*chan)	/* Frame End Interrupt Counter (Rx) */
+#define FCT_TX(chan)	(0x51 + 2*chan)	/* Frame End Interrupt Counter (Tx) */
+#define DMR_RX(chan)	(0x54 + 2*chan)	/* DMA Mode Reg (Rx) */
+#define DMR_TX(chan)	(0x55 + 2*chan)	/* DMA Mode Reg (Tx) */
+#define DCR_RX(chan)	(0x58 + 2*chan)	/* DMA Command Reg (Rx) */
+#define DCR_TX(chan)	(0x59 + 2*chan)	/* DMA Command Reg (Tx) */
+
+/* DMA Channel Registers */
+#define DARL	0x80	/* Dest Addr Register L (single-block, RX only) */
+#define DARH	0x81	/* Dest Addr Register H (single-block, RX only) */
+#define DARB	0x82	/* Dest Addr Register B (single-block, RX only) */
+#define DARBH	0x83	/* Dest Addr Register BH (single-block, RX only) */
+#define SARL	0x80	/* Source Addr Register L (single-block, TX only) */
+#define SARH	0x81	/* Source Addr Register H (single-block, TX only) */
+#define SARB	0x82	/* Source Addr Register B (single-block, TX only) */
+#define DARBH	0x83	/* Source Addr Register BH (single-block, TX only) */
+#define BARL	0x80	/* Buffer Addr Register L (chained-block) */
+#define BARH	0x81	/* Buffer Addr Register H (chained-block) */
+#define BARB	0x82	/* Buffer Addr Register B (chained-block) */
+#define BARBH	0x83	/* Buffer Addr Register BH (chained-block) */
+#define CDAL	0x84	/* Current Descriptor Addr Register L */
+#define CDAH	0x85	/* Current Descriptor Addr Register H */
+#define CDAB	0x86	/* Current Descriptor Addr Register B */
+#define CDABH	0x87	/* Current Descriptor Addr Register BH */
+#define EDAL	0x88	/* Error Descriptor Addr Register L */
+#define EDAH	0x89	/* Error Descriptor Addr Register H */
+#define EDAB	0x8a	/* Error Descriptor Addr Register B */
+#define EDABH	0x8b	/* Error Descriptor Addr Register BH */
+#define BFLL	0x90	/* RX Buffer Length L (only RX) */
+#define BFLH	0x91	/* RX Buffer Length H (only RX) */
+#define BCRL	0x8c	/* Byte Count Register L */
+#define BCRH	0x8d	/* Byte Count Register H */
+
+/* Block Descriptor Structure */
+typedef struct {
+	unsigned long	next;		/* pointer to next block descriptor */
+	unsigned long	ptbuf;		/* buffer pointer */
+	unsigned short	len;		/* data length */
+	unsigned char	status;		/* status */
+	unsigned char	filler[5];	/* alignment filler (16 bytes) */ 
+} pcsca_bd_t;
+
+/* 
+	Descriptor Status definitions:
+
+	Bit	Transmission	Reception
+
+	7	EOM		EOM
+	6	-		Short Frame
+	5	-		Abort
+	4	-		Residual bit
+	3	Underrun	Overrun	
+	2	-		CRC
+	1	Ownership	Ownership
+	0	EOT		-
+*/
+#define DST_EOT		0x01	/* End of transmit command */
+#define DST_OSB		0x02	/* Ownership bit */
+#define DST_CRC		0x04	/* CRC Error */
+#define DST_OVR		0x08	/* Overrun */
+#define DST_UDR		0x08	/* Underrun */
+#define DST_RBIT	0x10	/* Residual bit */
+#define DST_ABT		0x20	/* Abort */
+#define DST_SHRT	0x40	/* Short Frame  */
+#define DST_EOM		0x80	/* End of Message  */
+
+/* Status Counter Registers */
+#define CMCR	0x158	/* Counter Master Ctl Reg */
+#define TECNTL	0x160	/* Tx EOM Counter L */
+#define TECNTM	0x161	/* Tx EOM Counter M */
+#define TECNTH	0x162	/* Tx EOM Counter H */
+#define TECCR	0x163	/* Tx EOM Counter Ctl Reg */
+#define URCNTL	0x164	/* Underrun Counter L */
+#define URCNTH	0x165	/* Underrun Counter H */
+#define URCCR	0x167	/* Underrun Counter Ctl Reg */
+#define RECNTL	0x168	/* Rx EOM Counter L */
+#define RECNTM	0x169	/* Rx EOM Counter M */
+#define RECNTH	0x16a	/* Rx EOM Counter H */
+#define RECCR	0x16b	/* Rx EOM Counter Ctl Reg */
+#define ORCNTL	0x16c	/* Overrun Counter L */
+#define ORCNTH	0x16d	/* Overrun Counter H */
+#define ORCCR	0x16f	/* Overrun Counter Ctl Reg */
+#define CECNTL	0x170	/* CRC Counter L */
+#define CECNTH	0x171	/* CRC Counter H */
+#define CECCR	0x173	/* CRC Counter Ctl Reg */
+#define ABCNTL	0x174	/* Abort frame Counter L */
+#define ABCNTH	0x175	/* Abort frame Counter H */
+#define ABCCR	0x177	/* Abort frame Counter Ctl Reg */
+#define SHCNTL	0x178	/* Short frame Counter L */
+#define SHCNTH	0x179	/* Short frame Counter H */
+#define SHCCR	0x17b	/* Short frame Counter Ctl Reg */
+#define RSCNTL	0x17c	/* Residual bit Counter L */
+#define RSCNTH	0x17d	/* Residual bit Counter H */
+#define RSCCR	0x17f	/* Residual bit Counter Ctl Reg */
+
+/* Register Programming Constants */
+
+#define IR0_DMIC	0x00000001
+#define IR0_DMIB	0x00000002
+#define IR0_DMIA	0x00000004
+#define IR0_EFT		0x00000008
+#define IR0_DMAREQ	0x00010000
+#define IR0_TXINT	0x00020000
+#define IR0_RXINTB	0x00040000
+#define IR0_RXINTA	0x00080000
+#define IR0_TXRDY	0x00100000
+#define IR0_RXRDY	0x00200000
+
+#define MD0_CRC16_0	0x00
+#define MD0_CRC16_1	0x01
+#define MD0_CRC32	0x02
+#define MD0_CRC_CCITT	0x03
+#define MD0_CRCC0	0x04
+#define MD0_CRCC1	0x08
+#define MD0_AUTO_ENA	0x10
+#define MD0_ASYNC	0x00
+#define MD0_BY_MSYNC	0x20
+#define MD0_BY_BISYNC	0x40
+#define MD0_BY_EXT	0x60
+#define MD0_BIT_SYNC	0x80
+#define MD0_TRANSP	0xc0
+
+#define MD1_NOADDR	0x00
+#define MD1_SADDR1	0x40
+#define MD1_SADDR2	0x80
+#define MD1_DADDR	0xc0
+
+#define MD2_F_DUPLEX	0x00
+#define MD2_AUTO_ECHO	0x01
+#define MD2_LOOP_HI_Z	0x02
+#define MD2_LOOP_MIR	0x03
+#define MD2_ADPLL_X8	0x00
+#define MD2_ADPLL_X16	0x08
+#define MD2_ADPLL_X32	0x10
+#define MD2_NRZ		0x00
+#define MD2_NRZI	0x20
+#define MD2_NRZ_IEEE	0x40
+#define MD2_MANCH	0x00
+#define MD2_FM1		0x20
+#define MD2_FM0		0x40
+#define MD2_FM		0x80
+
+#define CTL_RTS		0x01
+#define CTL_DTR		0x02
+#define CTL_SYN		0x04
+#define CTL_IDLC	0x10
+#define CTL_UDRNC	0x20
+#define CTL_URSKP	0x40
+#define CTL_URCT	0x80
+
+#define	RXS_BR0		0x01
+#define	RXS_BR1		0x02
+#define	RXS_BR2		0x04
+#define	RXS_BR3		0x08
+#define	RXS_ECLK	0x00
+#define	RXS_ECLK_NS	0x20
+#define	RXS_IBRG	0x40
+#define	RXS_PLL1	0x50
+#define	RXS_PLL2	0x60
+#define	RXS_PLL3	0x70
+#define	RXS_DRTXC	0x80
+
+#define	TXS_BR0		0x01
+#define	TXS_BR1		0x02
+#define	TXS_BR2		0x04
+#define	TXS_BR3		0x08
+#define	TXS_ECLK	0x00
+#define	TXS_IBRG	0x40
+#define	TXS_RCLK	0x60
+#define	TXS_DTRXC	0x80
+
+#define	EXS_RES0	0x01
+#define	EXS_RES1	0x02
+#define	EXS_RES2	0x04
+#define	EXS_TES0	0x10
+#define	EXS_TES1	0x20
+#define	EXS_TES2	0x40
+
+#define CMD_RX_RST	0x11
+#define CMD_RX_ENA	0x12
+#define CMD_RX_DIS	0x13
+#define CMD_RX_CRC_INIT	0x14
+#define CMD_RX_MSG_REJ	0x15
+#define CMD_RX_MP_SRCH	0x16
+#define CMD_RX_CRC_EXC	0x17
+#define CMD_RX_CRC_FRC	0x18
+#define CMD_TX_RST	0x01
+#define CMD_TX_ENA	0x02
+#define CMD_TX_DISA	0x03
+#define CMD_TX_CRC_INIT	0x04
+#define CMD_TX_CRC_EXC	0x05
+#define CMD_TX_EOM	0x06
+#define CMD_TX_ABORT	0x07
+#define CMD_TX_MP_ON	0x08
+#define CMD_TX_BUF_CLR	0x09
+#define CMD_TX_DISB	0x0b
+#define CMD_CH_RST	0x21
+#define CMD_SRCH_MODE	0x31
+#define CMD_NOP		0x00
+
+#define ST0_RXRDY	0x01
+#define ST0_TXRDY	0x02
+#define ST0_RXINTB	0x20
+#define ST0_RXINTA	0x40
+#define ST0_TXINT	0x80
+
+#define ST1_IDLE	0x01
+#define ST1_ABORT	0x02
+#define ST1_CDCD	0x04
+#define ST1_CCTS	0x08
+#define ST1_SYN_FLAG	0x10
+#define ST1_CLMD	0x20
+#define ST1_TXIDLE	0x40
+#define ST1_UDRN	0x80
+
+#define ST2_CRCE	0x04
+#define ST2_ONRN	0x08
+#define ST2_RBIT	0x10
+#define ST2_ABORT	0x20
+#define ST2_SHORT	0x40
+#define ST2_EOM		0x80
+
+#define ST3_RX_ENA	0x01
+#define ST3_TX_ENA	0x02
+#define ST3_DCD		0x04
+#define ST3_CTS		0x08
+#define ST3_SRCH_MODE	0x10
+#define ST3_SLOOP	0x20
+#define ST3_GPI		0x80
+
+#define ST4_RDNR	0x01
+#define ST4_RDCR	0x02
+#define ST4_TDNR	0x04
+#define ST4_TDCR	0x08
+#define ST4_OCLM	0x20
+#define ST4_CFT		0x40
+#define ST4_CGPI	0x80
+
+#define FST_CRCEF	0x04
+#define FST_OVRNF	0x08
+#define FST_RBIF	0x10
+#define FST_ABTF	0x20
+#define FST_SHRTF	0x40
+#define FST_EOMF	0x80
+
+#define IE0_RXRDY	0x01
+#define IE0_TXRDY	0x02
+#define IE0_RXINTB	0x20
+#define IE0_RXINTA	0x40
+#define IE0_TXINT	0x80
+
+#define IE1_IDLD	0x01
+#define IE1_ABTD	0x02
+#define IE1_CDCD	0x04
+#define IE1_CCTS	0x08
+#define IE1_SYNCD	0x10
+#define IE1_CLMD	0x20
+#define IE1_IDL		0x40
+#define IE1_UDRN	0x80
+
+#define IE2_CRCE	0x04
+#define IE2_OVRN	0x08
+#define IE2_RBIT	0x10
+#define IE2_ABT		0x20
+#define IE2_SHRT	0x40
+#define IE2_EOM		0x80
+
+#define IE4_RDNR	0x01
+#define IE4_RDCR	0x02
+#define IE4_TDNR	0x04
+#define IE4_TDCR	0x08
+#define IE4_OCLM	0x20
+#define IE4_CFT		0x40
+#define IE4_CGPI	0x80
+
+#define FIE_CRCEF	0x04
+#define FIE_OVRNF	0x08
+#define FIE_RBIF	0x10
+#define FIE_ABTF	0x20
+#define FIE_SHRTF	0x40
+#define FIE_EOMF	0x80
+
+#define DSR_DWE		0x01
+#define DSR_DE		0x02
+#define DSR_REF		0x04
+#define DSR_UDRF	0x04
+#define DSR_COA		0x08
+#define DSR_COF		0x10
+#define DSR_BOF		0x20
+#define DSR_EOM		0x40
+#define DSR_EOT		0x80
+
+#define DIR_REF		0x04
+#define DIR_UDRF	0x04
+#define DIR_COA		0x08
+#define DIR_COF		0x10
+#define DIR_BOF		0x20
+#define DIR_EOM		0x40
+#define DIR_EOT		0x80
+
+#define DMR_CNTE	0x02
+#define DMR_NF		0x04
+#define DMR_SEOME	0x08
+#define DMR_TMOD	0x10
+
+#define DCR_SW_ABT	0x01
+#define DCR_FCT_CLR	0x02
+
+#define PCR_PR0		0x01
+#define PCR_PR1		0x02
+#define PCR_PR2		0x04
+#define PCR_CCC		0x08
+#define PCR_BRC		0x10
+#define PCR_OSB		0x40
+#define PCR_BURST	0x80
+
+#endif /* (_HD64572_H) */
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/include/linux/hdlc.h linux.17p9/include/linux/hdlc.h
--- linux.vanilla/include/linux/hdlc.h	Sun Jun 11 21:44:23 2000
+++ linux.17p9/include/linux/hdlc.h	Fri Jun 23 00:29:35 2000
@@ -38,6 +38,8 @@
 #define LINE_X21	3
 #define LINE_LOOPBACK	4	/* On-card loopback */
 #define LINE_NOLOOPBACK	5
+#define LINE_T1		6
+#define LINE_E1		7
 #define LINE_MIN_CLOCK 75	/* This & higher values are real clock rates */
 
 
@@ -126,6 +128,8 @@
 	u16 rel;		/* reliability */
 	u32 time;
 }__attribute__ ((packed)) cisco_packet;
+#define	CISCO_PACKET_LEN	18
+#define	CISCO_BIG_PACKET_LEN	20
 
 
 
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/include/linux/ixjuser.h linux.17p9/include/linux/ixjuser.h
--- linux.vanilla/include/linux/ixjuser.h	Fri Apr 21 23:23:32 2000
+++ linux.17p9/include/linux/ixjuser.h	Thu Jun 15 16:21:40 2000
@@ -1,7 +1,8 @@
-/*
+/******************************************************************************
+ *
  *    ixjuser.h
  *
- *    User-space include file for the Internet PhoneJACK and
+ *    Device Driver for the Internet PhoneJACK and
  *    Internet LineJACK Telephony Cards.
  *
  *    (c) Copyright 1999 Quicknet Technologies, Inc.
@@ -22,31 +23,48 @@
  * at our website:    http://www.quicknet.net
  *
  * Fixes:
- */
+ *
+ * IN NO EVENT SHALL QUICKNET TECHNOLOGIES, INC. BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT
+ * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF QUICKNET
+ * TECHNOLOGIES, INC.HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * QUICKNET TECHNOLOGIES, INC. SPECIFICALLY DISCLAIMS ANY WARRANTIES,
+ * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND QUICKNET TECHNOLOGIES, INC. HAS NO OBLIGATION 
+ * TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ *****************************************************************************/
 
-static char ixjuser_h_rcsid[] = "$Id: ixjuser.h,v 3.4 1999/12/16 22:18:36 root Exp root $";
+static char ixjuser_h_rcsid[] = "$Id: ixjuser.h,v 3.11 2000/03/30 22:06:48 eokerson Exp $";
 
-#include <linux/telephony.h>
+#include "telephony.h"
 
-/***************************************************************************
 
-  If you use the IXJCTL_TESTRAM command, the card must be power
-  cycled to reset the SRAM values before futher use.
+/******************************************************************************
+*
+* IOCTL's used for the Quicknet Cards
+*
+* If you use the IXJCTL_TESTRAM command, the card must be power cycled to
+* reset the SRAM values before futher use.
+*
+******************************************************************************/
 
-***************************************************************************/
 #define IXJCTL_DSP_RESET 		_IO  ('q', 0xC0)
 
-#define IXJCTL_RING         PHONE_RING
-#define IXJCTL_HOOKSTATE    PHONE_HOOKSTATE
+#define IXJCTL_RING                     PHONE_RING
+#define IXJCTL_HOOKSTATE                PHONE_HOOKSTATE
 #define IXJCTL_MAXRINGS			PHONE_MAXRINGS
-#define IXJCTL_RING_CADENCE	PHONE_RING_CADENCE
+#define IXJCTL_RING_CADENCE		PHONE_RING_CADENCE
 #define IXJCTL_RING_START		PHONE_RING_START
 #define IXJCTL_RING_STOP		PHONE_RING_STOP
 
 #define IXJCTL_CARDTYPE			_IOR ('q', 0xC1, int)
-#define IXJCTL_SERIAL			  _IOR ('q', 0xC2, int)
-#define IXJCTL_DSP_TYPE     _IOR ('q', 0xC3, int)
-#define IXJCTL_DSP_VERSION  _IOR ('q', 0xC4, int)
+#define IXJCTL_SERIAL			_IOR ('q', 0xC2, int)
+#define IXJCTL_DSP_TYPE                 _IOR ('q', 0xC3, int)
+#define IXJCTL_DSP_VERSION              _IOR ('q', 0xC4, int)
+#define IXJCTL_VERSION              	_IOR ('q', 0xDA, char *)
 #define IXJCTL_DSP_IDLE			_IO  ('q', 0xC5)
 #define IXJCTL_TESTRAM			_IO  ('q', 0xC6)
 
@@ -104,8 +122,22 @@
 	char enable;
 } IXJ_FILTER;
 
+typedef struct {
+	char enable;
+	char en_filter;
+	unsigned int filter;
+	unsigned int on1;
+	unsigned int off1;
+	unsigned int on2;
+	unsigned int off2;
+	unsigned int on3;
+	unsigned int off3;
+} IXJ_FILTER_CADENCE;
+
 #define IXJCTL_SET_FILTER		_IOW ('q', 0xC7, IXJ_FILTER *)
 #define IXJCTL_GET_FILTER_HIST		_IOW ('q', 0xC8, int)
+#define IXJCTL_FILTER_CADENCE		_IOW ('q', 0xD6, IXJ_FILTER_CADENCE *)
+#define IXJCTL_PLAY_CID			_IO  ('q', 0xD7)
 /******************************************************************************
 *
 * This IOCTL allows you to reassign values in the tone index table.  The
@@ -222,7 +254,9 @@
 	hz1800 = 0x1405,
 	hz1860 = 0xe0b,
 	hz2100 = 0xf5f6,
-	hz2450 = 0xd3b3
+	hz2130 = 0xf2f5,
+	hz2450 = 0xd3b3,
+	hz2750 = 0xb8e4
 } IXJ_FREQ;
 
 typedef enum {
@@ -344,6 +378,7 @@
 #define AEC_LOW   1
 #define AEC_MED   2
 #define AEC_HIGH  3
+#define AEC_AUTO  4
 /******************************************************************************
 *
 * Call Progress Tones, DTMF, etc.
@@ -533,16 +568,16 @@
 
 /******************************************************************************
 * 
-* The DAA Analog GAIN sets 2 parameters at one time, the receive gain (AGRR), 
+* The DAA Analog GAIN sets 2 parameters at one time, the recieve gain (AGRR), 
 * and the transmit gain (AGX).  OR together the components and pass them
 * as the parameter to IXJCTL_DAA_AGAIN.  The default setting is both at 0dB.
 * 
 ******************************************************************************/
 #define IXJCTL_DAA_AGAIN		_IOW ('q', 0xD2, int)
 
-#define AGRR00DB	0x00	// Analog gain in receive direction 0dB
-#define AGRR3_5DB	0x10	// Analog gain in receive direction 3.5dB
-#define AGRR06DB	0x30	// Analog gain in receive direction 6dB
+#define AGRR00DB	0x00	// Analog gain in recieve direction 0dB
+#define AGRR3_5DB	0x10	// Analog gain in recieve direction 3.5dB
+#define AGRR06DB	0x30	// Analog gain in recieve direction 6dB
 
 #define AGX00DB		0x00	// Analog gain in transmit direction 0dB
 #define AGX_6DB		0x04	// Analog gain in transmit direction -6dB
@@ -551,18 +586,9 @@
 
 #define IXJCTL_PSTN_LINETEST		_IO  ('q', 0xD3)
 
-typedef struct {
-	char month[3];
-	char day[3];
-	char hour[3];
-	char min[3];
-	int numlen;
-	char number[11];
-	int namelen;
-	char name[80];
-} IXJ_CID;
-
-#define IXJCTL_CID			_IOR ('q', 0xD4, IXJ_CID *)
+#define IXJCTL_CID			_IOR ('q', 0xD4, PHONE_CID *)
+#define IXJCTL_VMWI			_IOR ('q', 0xD8, int)
+#define IXJCTL_CIDCW			_IOW ('q', 0xD9, PHONE_CID *)
 /******************************************************************************
 * 
 * The wink duration is tunable with this ioctl.  The default wink duration  
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/include/linux/nls.h linux.17p9/include/linux/nls.h
--- linux.vanilla/include/linux/nls.h	Sun Jun 11 21:44:23 2000
+++ linux.17p9/include/linux/nls.h	Sun Jun 11 22:11:27 2000
@@ -54,6 +54,7 @@
 extern int init_nls_cp866(void);
 extern int init_nls_cp869(void);
 extern int init_nls_cp874(void);
+extern int init_nls_euc_jp(void);
 extern int init_nls_cp932(void);
 extern int init_nls_cp936(void);
 extern int init_nls_cp949(void);
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/include/linux/ntfs_fs_sb.h linux.17p9/include/linux/ntfs_fs_sb.h
--- linux.vanilla/include/linux/ntfs_fs_sb.h	Fri Apr 21 12:47:00 2000
+++ linux.17p9/include/linux/ntfs_fs_sb.h	Thu Jun 22 22:33:19 2000
@@ -15,7 +15,10 @@
 	ntfs_u32 at_standard_information;
 	ntfs_u32 at_attribute_list;
 	ntfs_u32 at_file_name;
+	ntfs_u32 at_volume_version;
 	ntfs_u32 at_security_descriptor;
+	ntfs_u32 at_volume_name;
+	ntfs_u32 at_volume_information;
 	ntfs_u32 at_data;
 	ntfs_u32 at_index_root;
 	ntfs_u32 at_index_allocation;
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/include/linux/openpic.h linux.17p9/include/linux/openpic.h
--- linux.vanilla/include/linux/openpic.h	Fri Apr 21 12:47:00 2000
+++ linux.17p9/include/linux/openpic.h	Tue Jun 20 22:53:58 2000
@@ -262,8 +262,12 @@
      *  Interrupt Source Registers
      */
 
-#define OPENPIC_SENSE_POLARITY			0x00800000	/* Undoc'd */
+#define OPENPIC_POLARITY_POSITIVE		0x00800000
+#define OPENPIC_POLARITY_NEGATIVE		0x00000000
+#define OPENPIC_POLARITY_MASK			0x00800000
 #define OPENPIC_SENSE_LEVEL			0x00400000
+#define OPENPIC_SENSE_EDGE			0x00000000
+#define OPENPIC_SENSE_MASK			0x00400000
 
 
     /*
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/include/linux/pc300.h linux.17p9/include/linux/pc300.h
--- linux.vanilla/include/linux/pc300.h	Thu Jan  1 01:00:00 1970
+++ linux.17p9/include/linux/pc300.h	Sun Jun 25 17:14:22 2000
@@ -0,0 +1,382 @@
+/*
+ * pc300.h	Cyclades-PC300(tm) Kernel API Definitions.
+ *
+ * Author:	Ivan Passos <ivan@cyclades.com>
+ *
+ * Copyright:	(c) 1999-2000 Cyclades Corp.
+ *
+ *	This program is free software; you can redistribute it and/or
+ *	modify it under the terms of the GNU General Public License
+ *	as published by the Free Software Foundation; either version
+ *	2 of the License, or (at your option) any later version.
+ *
+ * $Log: pc300.h,v $
+ * Revision 2.2 2000/06/23 ivan
+ * Inclusion of 'loopback' field on structure 'pc300chconf', to allow 
+ * loopback mode operation.
+ * 
+ * Revision 2.1 2000/06/09 ivan
+ * Changes to use the new generic HDLC layer in the driver.
+ *
+ * Revision 2.0 2000/03/27 ivan
+ * Added support for the PC300/TE cards.
+ *
+ * Revision 1.1 2000/01/31 ivan
+ * Replaced 'pc300[drv|sca].h' former PC300 driver include files.
+ *
+ * Revision 1.0 1999/12/16 ivan
+ * First official release.
+ * Inclusion of 'nchan' field on structure 'pc300hw', to allow variable 
+ * number of ports per card.
+ * Inclusion of 'if_ptr' field on structure 'pc300dev'.
+ *
+ * Revision 0.6 1999/11/17 ivan
+ * Changed X.25-specific function names to comply with adopted convention.
+ *
+ * Revision 0.5 1999/11/16 Daniela Squassoni
+ * X.25 support.
+ *
+ * Revision 0.4 1999/11/15 ivan
+ * Inclusion of 'clock' field on structure 'pc300hw'.
+ *
+ * Revision 0.3 1999/11/10 ivan
+ * IOCTL name changing.
+ * Inclusion of driver function prototypes.
+ *
+ * Revision 0.2 1999/11/03 ivan
+ * Inclusion of 'tx_skb' and union 'ifu' on structure 'pc300dev'.
+ *
+ * Revision 0.1 1999/01/15 ivan
+ * Initial version.
+ *
+ */
+
+#ifndef	_PC300_H
+#define	_PC300_H
+
+#ifndef __HDLC_H
+#include <linux/hdlc.h>
+#endif
+#ifndef _HD64572_H
+#include <linux/hd64572.h>
+#endif
+#ifndef _FALC_LH_H
+#include <linux/falc-lh.h>
+#endif
+
+#ifndef CY_TYPES
+#define CY_TYPES
+#if defined(__alpha__)
+typedef	unsigned long	ucdouble;	/* 64 bits, unsigned */
+typedef	unsigned int	uclong;		/* 32 bits, unsigned */
+#else
+typedef	unsigned long	uclong;		/* 32 bits, unsigned */
+#endif
+typedef	unsigned short	ucshort;	/* 16 bits, unsigned */
+typedef	unsigned char	ucchar;		/* 8 bits, unsigned */
+#endif /* CY_TYPES */
+
+#define	PC300_DEVNAME	"hdlc"	/* Dev. name base (for hdlc0, hdlc1, etc.) */
+#define	PC300_MAXINDEX	100	/* Max dev. name index (the '0' in hdlc0) */
+
+#define	PC300_MAXCARDS	4	/* Max number of cards per system */
+#define	PC300_MAXCHAN	2	/* Number of channels per card */
+
+#define	PC300_PLX_WIN	0x80    /* PLX control window size (128b) */
+#define	PC300_RAMSIZE	0x80000 /* RAM window size (512Kb) */
+#define	PC300_SCASIZE	0x400   /* SCA window size (1Kb) */
+#define	PC300_FALCSIZE	0x400	/* FALC window size (1Kb) */
+
+#define PC300_OSC_CLOCK	24576000
+#define PC300_PCI_CLOCK	33000000
+
+#define BD_DEF_LEN	0x0800	/* DMA buffer length (2KB) */
+#define DMA_TX_MEMSZ	0x8000	/* Total DMA Tx memory size (32KB/ch) */
+#define DMA_RX_MEMSZ	0x10000	/* Total DMA Rx memory size (64KB/ch) */
+
+#define N_DMA_TX_BUF	(DMA_TX_MEMSZ / BD_DEF_LEN)	/* DMA Tx buffers */
+#define N_DMA_RX_BUF	(DMA_RX_MEMSZ / BD_DEF_LEN)	/* DMA Rx buffers */
+
+/* DMA Buffer Offsets */
+#define DMA_TX_BASE	((N_DMA_TX_BUF + N_DMA_RX_BUF) *	\
+			 PC300_MAXCHAN * sizeof(pcsca_bd_t))
+#define DMA_RX_BASE	(DMA_TX_BASE + PC300_MAXCHAN*DMA_TX_MEMSZ)
+
+/* DMA Descriptor Offsets */
+#define DMA_TX_BD_BASE	0x0000
+#define DMA_RX_BD_BASE	(DMA_TX_BD_BASE + ((PC300_MAXCHAN*DMA_TX_MEMSZ / \
+				BD_DEF_LEN) * sizeof(pcsca_bd_t)))
+
+/* DMA Descriptor Macros */
+#define TX_BD_ADDR(chan, n)	(DMA_TX_BD_BASE + \
+				 ((N_DMA_TX_BUF*chan) + n) * sizeof(pcsca_bd_t))
+#define RX_BD_ADDR(chan, n)	(DMA_RX_BD_BASE + \
+				 ((N_DMA_RX_BUF*chan) + n) * sizeof(pcsca_bd_t))
+
+/* Macro to access the FALC registers (TE only) */
+#define F_REG(reg, chan)	(0x200*(chan) + ((reg)<<2))
+
+/***************************************
+ * Memory access functions/macros      *
+ * (required to support Alpha systems) *
+ ***************************************/
+#ifdef __KERNEL__
+#define cpc_writeb(port,val)	{writeb((ucchar)(val),(ulong)(port)); mb();}
+#define cpc_writew(port,val)	{writew((ushort)(val),(ulong)(port)); mb();}
+#define cpc_writel(port,val)	{writel((uclong)(val),(ulong)(port)); mb();}
+
+#define cpc_readb(port)		readb(port)
+#define cpc_readw(port)		readw(port)
+#define cpc_readl(port)		readl(port)
+
+#else /* __KERNEL__ */
+#define cpc_writeb(port,val)	(*(volatile ucchar *)(port) = (ucchar)(val))
+#define cpc_writew(port,val)	(*(volatile ucshort *)(port) = (ucshort)(val))
+#define cpc_writel(port,val)	(*(volatile uclong *)(port) = (uclong)(val))
+
+#define cpc_readb(port)		(*(volatile ucchar *)(port))
+#define cpc_readw(port)		(*(volatile ucshort *)(port))
+#define cpc_readl(port)		(*(volatile uclong *)(port))
+
+#endif /* __KERNEL__ */
+
+/****** Data Structures *****************************************************/
+
+/*
+ *      RUNTIME_9050 - PLX PCI9050-1 local configuration and shared runtime
+ *      registers. This structure can be used to access the 9050 registers
+ *      (memory mapped).
+ */
+struct RUNTIME_9050 {
+	uclong	loc_addr_range[4];	/* 00-0Ch : Local Address Ranges */
+	uclong	loc_rom_range;		/* 10h : Local ROM Range */
+	uclong	loc_addr_base[4];	/* 14-20h : Local Address Base Addrs */
+	uclong	loc_rom_base;		/* 24h : Local ROM Base */
+	uclong	loc_bus_descr[4];	/* 28-34h : Local Bus Descriptors */
+	uclong	rom_bus_descr;		/* 38h : ROM Bus Descriptor */
+	uclong	cs_base[4];		/* 3C-48h : Chip Select Base Addrs */
+	uclong	intr_ctrl_stat;		/* 4Ch : Interrupt Control/Status */
+	uclong	init_ctrl;		/* 50h : EEPROM ctrl, Init Ctrl, etc */
+};
+
+#define PLX_9050_LINT1_ENABLE	0x01
+#define PLX_9050_LINT1_POL	0x02
+#define PLX_9050_LINT1_STATUS	0x04
+#define PLX_9050_LINT2_ENABLE	0x08
+#define PLX_9050_LINT2_POL	0x10
+#define PLX_9050_LINT2_STATUS	0x20
+#define PLX_9050_INTR_ENABLE	0x40
+#define PLX_9050_SW_INTR	0x80
+
+/* Masks to access the init_ctrl PLX register */
+#define	PC300_CLKSEL_MASK		(0x00000004UL)
+#define	PC300_CHMEDIA_MASK(chan)	(0x00000020UL<<(chan*3))
+#define	PC300_CTYPE_MASK		(0x00000800UL)
+
+/* CPLD Registers (base addr = falcbase, TE only) */
+#define CPLD_REG1	0x140	/* Chip resets, DCD/CTS status */
+#define CPLD_REG2	0x144	/* Clock enable , LED control */
+
+/* CPLD Register bit description: for the FALC bits, they should always be 
+   set based on the channel (use (bit<<(2*ch)) to access the correct bit for 
+   that channel) */
+#define CPLD_REG1_FALC_RESET	0x01
+#define CPLD_REG1_SCA_RESET	0x02
+#define CPLD_REG1_GLOBAL_CLK	0x08
+#define CPLD_REG1_FALC_DCD	0x10
+#define CPLD_REG1_FALC_CTS	0x20
+
+#define CPLD_REG2_FALC_TX_CLK	0x01
+#define CPLD_REG2_FALC_RX_CLK	0x02
+#define CPLD_REG2_FALC_LED1	0x10
+#define CPLD_REG2_FALC_LED2	0x20
+
+/* Structure with FALC-related fields (TE only) */
+#define PC300_FALC_MAXLOOP	0x0000ffff	/* for falc_issue_cmd() */
+
+typedef struct falc {
+	ucchar sync;		/* If true FALC is synchronized */
+	ucchar active;		/* if TRUE then already active */
+	ucchar loop_active;	/* if TRUE a line loopback UP was received */
+	ucchar loop_gen;	/* if TRUE a line loopback UP was issued */
+
+	ucchar num_channels;
+	ucchar offset;		/* 1 for T1, 0 for E1 */
+	ucchar full_bandwidth;
+
+	ucchar xmb_cause;
+	ucchar multiframe_mode;
+
+	/* Statistics */
+	ucshort pden;	/* Pulse Density violation count */
+	ucshort los;	/* Loss of Signal count */
+	ucshort losr;	/* Loss of Signal recovery count */
+	ucshort lfa;	/* Loss of frame alignment count */
+	ucshort farec;	/* Frame Alignment Recovery count */
+	ucshort lmfa;	/* Loss of multiframe alignment count */
+	ucshort ais;	/* Remote Alarm indication Signal count */
+	ucshort sec;	/* One-second timer */
+	ucshort es;	/* Errored second */
+	ucshort rai;	/* remote alarm received */
+	ucshort bec;
+	ucshort fec;
+	ucshort cvc;
+	ucshort cec;
+	ucshort ebc;
+
+	/* Status */
+	ucchar red_alarm;
+	ucchar blue_alarm;
+	ucchar loss_fa;
+	ucchar yellow_alarm;
+	ucchar loss_mfa;
+	ucchar prbs;
+} falc_t;
+
+typedef struct pc300dev {
+	void *if_ptr;	/* General purpose pointer */
+	struct pc300ch *chan;
+#ifdef __KERNEL__
+	char name[16];
+	void *private;
+	hdlc_device *hdlc;
+	struct net_device_stats stats;
+	struct sk_buff *tx_skb;
+#endif /* __KERNEL__ */
+}pc300dev_t;
+
+typedef struct pc300hw {
+	int type;		/* RSV, X21, etc. */
+	int nchan;		/* number of channels */
+	int irq;		/* interrupt request level */
+	uclong clock;		/* Board clock */
+	uclong plxphys;		/* PLX registers MMIO base (physical) */
+	uclong plxbase;		/* PLX registers MMIO base (virtual) */
+	uclong plxsize;		/* PLX registers MMIO size */
+	uclong scaphys;		/* SCA registers MMIO base (physical) */
+	uclong scabase;		/* SCA registers MMIO base (virtual) */
+	uclong scasize;		/* SCA registers MMIO size */
+	uclong ramphys;		/* On-board RAM MMIO base (physical) */
+	uclong rambase;		/* On-board RAM MMIO base (virtual) */
+	uclong ramsize;		/* On-board RAM MMIO size */
+	uclong falcphys;	/* FALC registers MMIO base (physical) */
+	uclong falcbase;	/* FALC registers MMIO base (virtual) */
+	uclong falcsize;	/* FALC registers MMIO size */
+} pc300hw_t;
+
+typedef struct pc300chconf {
+	ucchar media;		/* HW media (RS232, V.35, etc.) */
+	uclong proto;		/* Protocol (PPP, X.25, etc.) */
+	uclong clkrate;		/* Clock rate (in bps, 0 = ext. clock) */
+	ucchar loopback;	/* Loopback mode */
+
+	/* TE-specific parameters */
+	ucchar lcode;		/* Line Code (AMI, B8ZS, etc.) */
+	ucchar fr_mode;		/* Frame Mode (ESF, D4, etc.) */
+	ucchar lbo;		/* Line Build Out */
+	ucchar rx_sens;		/* Rx Sensitivity (long- or short-haul) */
+	uclong tslot_bitmap;	/* bit[i]=1  =>  timeslot _i_ is active */
+} pc300chconf_t;
+
+typedef struct pc300ch {
+	struct pc300 *card;
+	int channel;
+	pc300dev_t d;
+	pc300chconf_t conf;
+	ucchar tx_first_bd;	/* First TX DMA block descr. w/ data */
+	ucchar tx_next_bd;	/* Next free TX DMA block descriptor */
+	ucchar rx_first_bd;	/* First free RX DMA block descriptor */
+	ucchar rx_last_bd;	/* Last free RX DMA block descriptor */
+	falc_t falc;		/* FALC structure (TE only) */
+} pc300ch_t;
+
+typedef struct pc300 {
+	pc300hw_t hw;			/* hardware config. */
+	pc300ch_t chan[PC300_MAXCHAN];
+#ifdef __KERNEL__
+	spinlock_t card_lock;
+#endif /* __KERNEL__ */
+} pc300_t;
+
+/* DEV ioctl() commands */
+#define	N_SPPP_IOCTLS	2
+
+enum pc300_ioctl_cmds {
+	SIOCCPCRESERVED = (SIOCDEVPRIVATE + N_SPPP_IOCTLS),
+	SIOCGPC300CONF,
+	SIOCSPC300CONF,
+	SIOCGPC300STATUS,
+	SIOCGPC300FALCSTATUS,
+};
+
+/* Control Constant Definitions */
+#define	PC300_RSV	0x01
+#define	PC300_X21	0x02
+#define	PC300_TE	0x03
+
+#define PC300_LC_AMI	0x01
+#define PC300_LC_B8ZS	0x02
+#define PC300_LC_NRZ	0x03
+#define PC300_LC_HDB3	0x04
+
+/* Framing (T1) */
+#define PC300_FR_ESF		0x01
+#define PC300_FR_D4		0x02
+#define PC300_FR_ESF_JAPAN	0x03
+
+/* Framing (E1) */
+#define PC300_FR_MF_CRC4	0x04
+#define PC300_FR_MF_NON_CRC4	0x05
+
+#define PC300_LBO_0_DB		0x00
+#define PC300_LBO_7_5_DB	0x01
+#define PC300_LBO_15_DB		0x02
+#define PC300_LBO_22_5_DB	0x03
+
+#define PC300_RX_SENS_SH	0x01
+#define PC300_RX_SENS_LH	0x02
+
+#define PC300_TX_TIMEOUT	(2*HZ)
+#define PC300_TX_QUEUE_LEN	10
+#define	PC300_DEF_MTU		1500
+
+#ifdef __KERNEL__
+/* Function Prototypes */
+static void tx_dma_buf_pt_init(pc300_t *, int);
+static void tx_dma_buf_init(pc300_t *, int);
+static void rx_dma_buf_pt_init(pc300_t *, int);
+static void rx_dma_buf_init(pc300_t *, int);
+static void tx_dma_buf_check(pc300_t *, int);
+static void rx_dma_buf_check(pc300_t *, int);
+int dma_buf_write(pc300_t *, int, ucchar *, int);
+int dma_buf_read(pc300_t *, int, struct sk_buff *);
+void tx_dma_start(pc300_t *, int);
+void rx_dma_start(pc300_t *, int);
+void tx_dma_stop(pc300_t *, int);
+void rx_dma_stop(pc300_t *, int);
+int cpc_queue_xmit(struct sk_buff *, struct device *);
+void cpc_net_rx(hdlc_device *);
+#ifdef CONFIG_PC300_X25
+int cpc_x25_packetlayer_xmit(struct sk_buff *, struct device *);
+void cpc_lapb_connected(void *, int);
+void cpc_lapb_disconnected(void *, int);
+void cpc_lapb_data_indication(void *, struct sk_buff *);
+void cpc_lapb_data_transmit(void *, struct sk_buff *);
+#endif /* CONFIG_PC300_X25 */
+static void cpc_intr(int, void *, struct pt_regs *);
+void cpc_sca_status(pc300_t *, int);
+int cpc_ioctl(hdlc_device *, struct ifreq *, int);
+static int clock_rate_calc(uclong, uclong, int *);
+int ch_config(pc300dev_t *);
+int rx_config(pc300dev_t *);
+int tx_config(pc300dev_t *);
+int cpc_opench(pc300dev_t *);
+void cpc_closech(pc300dev_t *);
+int cpc_open(hdlc_device *);
+void cpc_close(hdlc_device *);
+static uclong detect_ram(pc300_t *);
+static void plx_init(pc300_t *);
+static int cpc_detect(void);
+#endif /* __KERNEL__ */
+
+#endif	/* _PC300_H */
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/include/linux/pci.h linux.17p9/include/linux/pci.h
--- linux.vanilla/include/linux/pci.h	Sun Jun 11 21:44:23 2000
+++ linux.17p9/include/linux/pci.h	Thu Jun 15 16:05:21 2000
@@ -951,6 +951,10 @@
 #define PCI_DEVICE_ID_CYCLOM_8Y_Hi	0x0105
 #define PCI_DEVICE_ID_CYCLOM_Z_Lo	0x0200
 #define PCI_DEVICE_ID_CYCLOM_Z_Hi	0x0201
+#define PCI_DEVICE_ID_PC300_RX_2	0x0300
+#define PCI_DEVICE_ID_PC300_RX_1	0x0301
+#define PCI_DEVICE_ID_PC300_TE_2	0x0310
+#define PCI_DEVICE_ID_PC300_TE_1	0x0311
 
 #define PCI_VENDOR_ID_ESSENTIAL		0x120f
 #define PCI_DEVICE_ID_ESSENTIAL_ROADRUNNER	0x0001
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/include/linux/sched.h linux.17p9/include/linux/sched.h
--- linux.vanilla/include/linux/sched.h	Fri Apr 21 23:10:16 2000
+++ linux.17p9/include/linux/sched.h	Fri Jun 23 00:26:53 2000
@@ -291,7 +291,6 @@
 /* mm fault and swap info: this can arguably be seen as either mm-specific or thread-specific */
 	unsigned long min_flt, maj_flt, nswap, cmin_flt, cmaj_flt, cnswap;
 	int swappable:1;
-	int trashing_mem:1;
 /* process credentials */
 	uid_t uid,euid,suid,fsuid;
 	gid_t gid,egid,sgid,fsgid;
@@ -382,7 +381,7 @@
 /* utime */	{0,0,0,0},0, \
 /* per CPU times */ {0, }, {0, }, \
 /* flt */	0,0,0,0,0,0, \
-/* swp */	0,0, \
+/* swp */	0, \
 /* process credentials */					\
 /* uid etc */	0,0,0,0,0,0,0,0,				\
 /* suppl grps*/ 0, {0,},					\
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/include/linux/telephony.h linux.17p9/include/linux/telephony.h
--- linux.vanilla/include/linux/telephony.h	Fri Apr 21 12:47:01 2000
+++ linux.17p9/include/linux/telephony.h	Tue Jun 27 11:13:44 2000
@@ -1,32 +1,33 @@
-/*
- *              telephony.h
+/******************************************************************************
+ *
+ *		telephony.h
  *
- *              Basic Linux Telephony Interface
+ *		Basic Linux Telephony Interface
  *
- *              (c) Copyright 1999 Quicknet Technologies, Inc.
+ *		(c) Copyright 1999 Quicknet Technologies, Inc.
  *
- *              This program is free software; you can redistribute it and/or
- *              modify it under the terms of the GNU General Public License
- *              as published by the Free Software Foundation; either version
- *              2 of the License, or (at your option) any later version.
+ *		This program is free software; you can redistribute it and/or
+ *		modify it under the terms of the GNU General Public License
+ *		as published by the Free Software Foundation; either version
+ *		2 of the License, or (at your option) any later version.
  *
- * Authors:       Ed Okerson, <eokerson@quicknet.net>
- *                Greg Herlein, <gherlein@quicknet.net>
+ *    Authors:       Ed Okerson, <eokerson@quicknet.net>
+ *                   Greg Herlein, <gherlein@quicknet.net>
  *
- * Contributors:  Alan Cox, <acox@redhat.com>
- *                David Erhart, <derhart@quicknet.net>
+ *    Contributors:  Alan Cox, <alan@redhat.com>
+ *                   David W. Erhart, <derhart@quicknet.net>
  *
  * Version:       0.1.0 - December 19, 1999
  *
  * Fixes:
- */
+ * 
+ *****************************************************************************/
 
 #ifndef TELEPHONY_H
 #define TELEPHONY_H
 
-/* vendor identification numbers */
 #define PHONE_VENDOR_IXJ          1
-#define PHONE_VENDOR_QUICKNET     PHONE_IXJ
+#define PHONE_VENDOR_QUICKNET	  PHONE_VENDOR_IXJ
 #define PHONE_VENDOR_VOICETRONIX  2
 #define PHONE_VENDOR_ACULAB       3
 #define PHONE_VENDOR_DIGI         4
@@ -43,7 +44,6 @@
  *
  *****************************************************************************/
 
- 
 /******************************************************************************
 *
 * The capabilities ioctls can inform you of the capabilities of each phone
@@ -81,11 +81,23 @@
 #define PHONE_CAPABILITIES_LIST         _IOR ('q', 0x81, struct phone_capability *)
 #define PHONE_CAPABILITIES_CHECK        _IOW ('q', 0x82, struct phone_capability *)
 
+typedef struct {
+        char month[3];
+        char day[3];
+        char hour[3];
+        char min[3];
+        int numlen;
+        char number[11];
+        int namelen;
+        char name[80];
+} PHONE_CID;
+
 #define PHONE_RING			_IO  ('q', 0x83)
 #define PHONE_HOOKSTATE			_IO  ('q', 0x84)
 #define PHONE_MAXRINGS			_IOW ('q', 0x85, char)
 #define PHONE_RING_CADENCE		_IOW ('q', 0x86, short)
-#define PHONE_RING_START		_IO  ('q', 0x87)
+#define OLD_PHONE_RING_START		_IO  ('q', 0x87)
+#define PHONE_RING_START		_IOW ('q', 0x87, PHONE_CID *)
 #define PHONE_RING_STOP			_IO  ('q', 0x88)
 
 #define USA_RING_CADENCE	 0xC0C0
@@ -167,6 +179,23 @@
 #define PHONE_QUERY_CODEC		_IOWR ('q', 0xA7, struct phone_codec_data *)
 #define PHONE_PSTN_LINETEST		_IO ('q', 0xA8)
 
+/******************************************************************************
+* 
+* This controls the VAD/CNG functionality of G.723.1.  The driver will
+* always pass full size frames, any unused bytes will be padded with zeros,
+* and frames passed to the driver should also be padded with zeros.  The
+* frame type is encoded in the least significant two bits of the first
+* WORD of the frame as follows:
+*
+* bits 1-0	Frame Type	Data Rate		Significant Words
+* 00		0		G.723.1 6.3		12
+* 01		1		G.723.1 5.3		10
+* 10		2		VAD/CNG			 2
+* 11		3		Repeat last CNG		 2 bits
+* 
+******************************************************************************/
+#define PHONE_VAD			_IOW ('q', 0xA9, int)
+
 
 /******************************************************************************
 *
@@ -198,7 +227,12 @@
 	unsigned int f1:1;
 	unsigned int f2:1;
 	unsigned int f3:1;
-	unsigned int reserved:23;
+	unsigned int flash:1;
+	unsigned int fc0:1;
+	unsigned int fc1:1;
+	unsigned int fc2:1;
+	unsigned int fc3:1;
+	unsigned int reserved:18;
 };
 
 union telephony_exception {
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/include/linux/toshiba.h linux.17p9/include/linux/toshiba.h
--- linux.vanilla/include/linux/toshiba.h	Thu Jan  1 01:00:00 1970
+++ linux.17p9/include/linux/toshiba.h	Sun Jun 25 17:41:28 2000
@@ -0,0 +1,36 @@
+/* toshiba.h -- Linux driver for accessing the SMM on Toshiba laptops 
+ *
+ * Copyright (c) 1996-2000  Jonathan A. Buzzard (jonathan@buzzard.org.uk)
+ *
+ * Thanks to Juergen Heinzl <juergen@monocerus.demon.co.uk> for the pointers
+ * on making sure the structure is aligned and packed.
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2, or (at your option) any
+ * later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ */
+
+#ifndef _LINUX_TOSHIBA_H
+#define _LINUX_TOSHIBA_H
+
+#define TOSH_PROC "/proc/toshiba"
+#define TOSH_DEVICE "/dev/toshiba"
+#define TOSH_SMM _IOWR('t', 0x90, 24)
+
+typedef struct {
+	unsigned int eax;
+	unsigned int ebx __attribute__ ((packed));
+	unsigned int ecx __attribute__ ((packed));
+	unsigned int edx __attribute__ ((packed));
+	unsigned int esi __attribute__ ((packed));
+	unsigned int edi __attribute__ ((packed));
+} SMMRegisters;
+
+#endif
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/include/net/snmp.h linux.17p9/include/net/snmp.h
--- linux.vanilla/include/net/snmp.h	Fri Apr 21 12:47:01 2000
+++ linux.17p9/include/net/snmp.h	Tue Jun 20 23:03:01 2000
@@ -178,6 +178,7 @@
 	unsigned long	OfoPruned;
 	unsigned long	OutOfWindowIcmps; 
 	unsigned long	LockDroppedIcmps; 
+	unsigned long	SockMallocOOM; 
 };
  	
 #endif
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/include/net/sock.h linux.17p9/include/net/sock.h
--- linux.vanilla/include/net/sock.h	Fri Apr 21 23:11:02 2000
+++ linux.17p9/include/net/sock.h	Fri Jun 23 00:27:38 2000
@@ -717,6 +717,10 @@
 extern struct sk_buff		*sock_wmalloc(struct sock *sk,
 					      unsigned long size, int force,
 					      int priority);
+
+extern struct sk_buff		*sock_wmalloc_err(struct sock *sk,
+					      unsigned long size, int force,
+					      int priority, int *err);
 extern struct sk_buff		*sock_rmalloc(struct sock *sk,
 					      unsigned long size, int force,
 					      int priority);
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/include/scsi/sg.h linux.17p9/include/scsi/sg.h
--- linux.vanilla/include/scsi/sg.h	Sun Jun 11 21:44:23 2000
+++ linux.17p9/include/scsi/sg.h	Tue Jun 27 12:04:59 2000
@@ -11,10 +11,12 @@
 2.x extensions to driver:
 *       Copyright (C) 1998 - 2000 Douglas Gilbert
 
-    Version: 2.1.38 (20000527)
+    Version: 2.1.39 (20000626)
     This version for 2.2.x series kernels
     D. P. Gilbert (dgilbert@interlog.com, dougg@triode.net.au)
 
+    Changes since 2.1.38 (20000527)
+        - more scatter gather fine tuning for sym53c416
     Changes since 2.1.37 (20000504)
         - fine tune state machine to stop read() race
         - switch to numeric device description (e.g. sg0 instead of sga)
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/mm/filemap.c linux.17p9/mm/filemap.c
--- linux.vanilla/mm/filemap.c	Sun Jun 11 21:44:23 2000
+++ linux.17p9/mm/filemap.c	Thu Jun 22 22:34:31 2000
@@ -141,10 +141,12 @@
 	unsigned long limit = num_physpages;
 	struct page * page;
 	int count;
-
+	int nr_dirty = 0;
+	
 	/* Make sure we scan all pages twice at priority 0. */
 	count = (limit << 1) >> priority;
 
+ refresh_clock:
 	page = mem_map + clock;
 	do {
 		int referenced;
@@ -196,10 +198,23 @@
 
 		/* Is it a buffer page? */
 		if (page->buffers) {
+			/*
+			 * Wait for async IO to complete
+			 * at each 64 buffers
+			 */ 
+
+			int wait = ((gfp_mask & __GFP_IO) 
+				&& (!(nr_dirty++ % 64)));
+
 			if (buffer_under_min())
 				continue;
-			if (!try_to_free_buffers(page))
-				continue;
+			/*
+			 * We can sleep if we need to do some write
+			 * throttling.
+			 */
+
+			if (!try_to_free_buffers(page, wait))
+				goto refresh_clock;
 			return 1;
 		}
 
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/mm/page_alloc.c linux.17p9/mm/page_alloc.c
--- linux.vanilla/mm/page_alloc.c	Sun Jun 11 21:44:23 2000
+++ linux.17p9/mm/page_alloc.c	Sat Jun 17 15:37:05 2000
@@ -182,7 +182,6 @@
 unsigned long __get_free_pages(int gfp_mask, unsigned long order)
 {
 	unsigned long flags;
-	static unsigned long last_woke_kswapd = 0;
 	static atomic_t free_before_allocate = ATOMIC_INIT(0);
 
 	if (order >= NR_MEM_LISTS)
@@ -208,41 +207,41 @@
 		int freed;
 		extern struct wait_queue * kswapd_wait;
 
-		if (nr_free_pages > freepages.high)
-			goto ok_to_allocate;
-		
-		/* Maybe wake up kswapd for background swapping. */
-		if (time_before(last_woke_kswapd + HZ, jiffies)) {
-			last_woke_kswapd = jiffies;
-			wake_up_interruptible(&kswapd_wait);
-		}
-
 		/* Somebody needs to free pages so we free some of our own. */
 		if (atomic_read(&free_before_allocate)) {
 			current->flags |= PF_MEMALLOC;
-			freed = try_to_free_pages(gfp_mask);
+			try_to_free_pages(gfp_mask);
 			current->flags &= ~PF_MEMALLOC;
-			if (freed)
-				goto ok_to_allocate;
 		}
 
-		/* Do we have to help kswapd or can we proceed? */
-		if (nr_free_pages < (freepages.low + freepages.low) / 2) {
+		if (nr_free_pages > freepages.low)
+			goto ok_to_allocate;
+
+		if (waitqueue_active(&kswapd_wait))
 			wake_up_interruptible(&kswapd_wait);
 
-			/* Help kswapd a bit... */
-			current->flags |= PF_MEMALLOC;
-			atomic_inc(&free_before_allocate);
-			freed = try_to_free_pages(gfp_mask);
-			atomic_dec(&free_before_allocate);
-			current->flags &= ~PF_MEMALLOC;
+		/* Do we have to block or can we proceed? */
+		if (nr_free_pages > freepages.min)
+			goto ok_to_allocate;
 
-			if (nr_free_pages > freepages.min)
-				goto ok_to_allocate;
+		current->flags |= PF_MEMALLOC;
+		atomic_inc(&free_before_allocate);
+		freed = try_to_free_pages(gfp_mask);
+		atomic_dec(&free_before_allocate);
+		current->flags &= ~PF_MEMALLOC;
+
+		/*
+		 * Re-check we're still low on memory after we blocked
+		 * for some time. Somebody may have released lots of
+		 * memory from under us while we was trying to free
+		 * the pages. We check against pages_high to be sure
+		 * to succeed only if lots of memory is been released.
+		 */
+		if (nr_free_pages > freepages.high)
+			goto ok_to_allocate;
 
-			if (!freed && !(gfp_mask & (__GFP_MED | __GFP_HIGH)))
-				goto nopage;
-		}
+		if (!freed && !(gfp_mask & (__GFP_MED | __GFP_HIGH)))
+			goto nopage;
 	}
 ok_to_allocate:
 	spin_lock_irqsave(&page_alloc_lock, flags);
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/mm/vmscan.c linux.17p9/mm/vmscan.c
--- linux.vanilla/mm/vmscan.c	Sun Jun 11 21:44:23 2000
+++ linux.17p9/mm/vmscan.c	Mon Jun 26 15:49:46 2000
@@ -333,7 +333,6 @@
 
 	for (; counter >= 0; counter--) {
 		max_cnt = 0;
-		assign = 0;
 		pbest = NULL;
 	select:
 		read_lock(&tasklist_lock);
@@ -378,17 +377,12 @@
  * cluster them so that we get good swap-out behaviour. See
  * the "free_memory()" macro for details.
  */
-#define FLUSH_COUNT	8
 static int do_try_to_free_pages(unsigned int gfp_mask)
 {
-	int priority, count, swapcount;
-	int flushcount = FLUSH_COUNT;
+	int priority;
 	int ret = 0;
-
-	/* Kswapd does nothing but freeing pages so we can do big bites. */
-	if (gfp_mask == GFP_KSWAPD)
-		flushcount = SWAP_CLUSTER_MAX;
-	count = flushcount;
+	int swapcount;
+	int count = SWAP_CLUSTER_MAX;
 
 	lock_kernel();
 
@@ -413,21 +407,15 @@
 		}
 
 		/* Then, try to page stuff out.. */
-		swapcount = flushcount;
+		swapcount = count;
 		while (swap_out(priority, gfp_mask)) {
+			ret = 1;
 			if (!--swapcount)
 				break;
 		}
 
 		shrink_dcache_memory(priority, gfp_mask);
 	} while (--priority >= 0);
-
-	/* End with a shrink_mmap() to make sure we free something. */
-	while (shrink_mmap(0, gfp_mask)) {
-		ret = 1;
-		if (!--count)
-			goto done;
-	}
 done:
 	unlock_kernel();
 
@@ -507,18 +495,11 @@
 		 * the processes needing more memory will wake us
 		 * up on a more timely basis.
 		 */
-		int failed = 0;
-sleep:
 		interruptible_sleep_on(&kswapd_wait);
-		/* Enough free pages? -> call do_try_to_free_pages only once. */
-		if (nr_free_pages > freepages.low) {
-			do_try_to_free_pages(GFP_KSWAPD);
-			goto sleep;
-		}
-		/* Not enough free pages? -> free pages agressively. */
+
 		while (nr_free_pages < freepages.high)
 		{
-			if (do_try_to_free_pages(GFP_KSWAPD) && failed++ < 10)
+			if (do_try_to_free_pages(GFP_KSWAPD))
 			{
 				if (tsk->need_resched)
 					schedule();
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/net/appletalk/ddp.c linux.17p9/net/appletalk/ddp.c
--- linux.vanilla/net/appletalk/ddp.c	Sun Jun 11 21:44:23 2000
+++ linux.17p9/net/appletalk/ddp.c	Thu Jun 15 17:29:58 2000
@@ -1583,8 +1583,12 @@
 		 * Note. ddp-> becomes invalid at the realloc.
 		 */
 		if(skb_headroom(skb) < 22)
+		{
 			/* 22 bytes - 12 ether, 2 len, 3 802.2 5 snap */
-			skb = skb_realloc_headroom(skb, 32);
+			struct sk_buff *nskb = skb_realloc_headroom(skb, 32);
+			kfree(skb);
+			skb=nskb;
+		}
 		else
 			skb = skb_unshare(skb, GFP_ATOMIC);
 		
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/net/core/dev.c linux.17p9/net/core/dev.c
--- linux.vanilla/net/core/dev.c	Sun Jun 11 21:44:23 2000
+++ linux.17p9/net/core/dev.c	Thu Jun 15 15:45:43 2000
@@ -98,6 +98,7 @@
 extern void n2_init(void);
 extern void c101_init(void);
 extern int wanxl_init(void);
+extern int cpc_init(void);
 extern void sync_ppp_init(void);
 
 NET_PROFILE_DEFINE(dev_queue_xmit)
@@ -2039,6 +2040,9 @@
 #endif
 #ifdef CONFIG_WANXL
 	wanxl_init();
+#endif
+#ifdef CONFIG_PC300
+	cpc_init();
 #endif
 #ifdef CONFIG_HDLC
 	sync_ppp_init();
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/net/core/sock.c linux.17p9/net/core/sock.c
--- linux.vanilla/net/core/sock.c	Fri Apr 21 12:47:11 2000
+++ linux.17p9/net/core/sock.c	Tue Jun 20 23:03:01 2000
@@ -566,6 +566,31 @@
 			skb->sk = sk;
 			return skb;
 		}
+		net_statistics.SockMallocOOM++; 
+	}
+	return NULL;
+}
+
+/*
+ * Allocate memory from the sockets send buffer, telling caller about real OOM. 
+ * err is only set for oom, not for socket buffer overflow.
+ */ 
+struct sk_buff *sock_wmalloc_err(struct sock *sk, unsigned long size, int force, int priority, int *err)
+{
+	*err = 0; 
+	/* Note: overcommitment possible */ 
+	if (force || atomic_read(&sk->wmem_alloc) < sk->sndbuf) {
+		struct sk_buff * skb;
+		*err = -ENOMEM; 
+		skb = alloc_skb(size, priority);
+		if (skb) {
+			*err = 0;
+			atomic_add(skb->truesize, &sk->wmem_alloc);
+			skb->destructor = sock_wfree;
+			skb->sk = sk;
+			return skb;
+		}
+		net_statistics.SockMallocOOM++; 
 	}
 	return NULL;
 }
@@ -583,6 +608,7 @@
 			skb->sk = sk;
 			return skb;
 		}
+		net_statistics.SockMallocOOM++; 
 	}
 	return NULL;
 }
@@ -602,6 +628,7 @@
 		if (mem)
 			return mem;
 		atomic_sub(size, &sk->omem_alloc);
+		net_statistics.SockMallocOOM++; 
 	}
 	return NULL;
 }
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/net/ipv4/af_inet.c linux.17p9/net/ipv4/af_inet.c
--- linux.vanilla/net/ipv4/af_inet.c	Fri Apr 21 12:47:12 2000
+++ linux.17p9/net/ipv4/af_inet.c	Tue Jun 27 12:13:36 2000
@@ -281,7 +281,8 @@
 	struct sock *sk = sock->sk;
 	unsigned char old_state;
 
-	if (sock->state != SS_UNCONNECTED || sock->type != SOCK_STREAM)
+	if (sock->state != SS_UNCONNECTED || sock->type != SOCK_STREAM ||
+	    !((1<<sk->state)&(TCPF_CLOSE|TCPF_LISTEN)))
 		return(-EINVAL);
 
 	if ((unsigned) backlog == 0)	/* BSDism */
@@ -699,9 +700,6 @@
 	sk2->socket = newsock;
 	newsk->socket = NULL;
 
-	if (flags & O_NONBLOCK)
-		goto do_half_success;
-
 	if(sk2->state == TCP_ESTABLISHED)
 		goto do_full_success;
 	if(sk2->err > 0)
@@ -713,10 +711,6 @@
 	destroy_sock(newsk);
 	newsock->state = SS_CONNECTED;
 	return 0;
-
-do_half_success:
-	destroy_sock(newsk);
-	return(0);
 
 do_connect_err:
 	err = sock_error(sk2);
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/net/ipv4/proc.c linux.17p9/net/ipv4/proc.c
--- linux.vanilla/net/ipv4/proc.c	Sun Jun 11 21:44:23 2000
+++ linux.17p9/net/ipv4/proc.c	Tue Jun 20 23:03:01 2000
@@ -359,8 +359,8 @@
 	len = sprintf(buffer,
 		      "TcpExt: SyncookiesSent SyncookiesRecv SyncookiesFailed"
 		      " EmbryonicRsts PruneCalled RcvPruned OfoPruned"
-		      " OutOfWindowIcmps LockDroppedIcmps\n" 	
-		      "TcpExt: %lu %lu %lu %lu %lu %lu %lu %lu %lu\n",
+		      " OutOfWindowIcmps LockDroppedIcmps SockMallocOOM\n" 	
+		      "TcpExt: %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu\n",
 		      net_statistics.SyncookiesSent,
 		      net_statistics.SyncookiesRecv,
 		      net_statistics.SyncookiesFailed,
@@ -369,7 +369,8 @@
 		      net_statistics.RcvPruned,
 		      net_statistics.OfoPruned,
 		      net_statistics.OutOfWindowIcmps,
-		      net_statistics.LockDroppedIcmps);
+		      net_statistics.LockDroppedIcmps,
+		      net_statistics.SockMallocOOM);
 
 	if (offset >= len)
 	{
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/net/ipv4/tcp.c linux.17p9/net/ipv4/tcp.c
--- linux.vanilla/net/ipv4/tcp.c	Sun Jun 11 21:44:23 2000
+++ linux.17p9/net/ipv4/tcp.c	Tue Jun 20 23:03:01 2000
@@ -697,9 +697,11 @@
 }
 
 /*
- *	Wait for more memory for a socket
+ *	Wait for more memory for a socket.
+ *	Special case is err == -ENOMEM, in this case just sleep a bit waiting
+ *	for the system to free up some memory. 
  */
-static void wait_for_tcp_memory(struct sock * sk)
+static void wait_for_tcp_memory(struct sock * sk, int err)
 {
 	release_sock(sk);
 	if (!tcp_memory_free(sk)) {
@@ -711,13 +713,18 @@
 			if (signal_pending(current))
 				break;
 			current->state = TASK_INTERRUPTIBLE;
-			if (tcp_memory_free(sk))
+			if (tcp_memory_free(sk) && !err)
 				break;
 			if (sk->shutdown & SEND_SHUTDOWN)
 				break;
 			if (sk->err)
 				break;
-			schedule();
+			if (!err) 
+				schedule();
+			else {
+				schedule_timeout(1); 
+				break;
+			} 	
 		}
 		current->state = TASK_RUNNING;
 		remove_wait_queue(sk->sleep, &wait);
@@ -915,7 +922,7 @@
 				tmp += copy;
 				queue_it = 0;
 			}
-			skb = sock_wmalloc(sk, tmp, 0, GFP_KERNEL);
+			skb = sock_wmalloc_err(sk, tmp, 0, GFP_KERNEL, &err);
 
 			/* If we didn't get any memory, we need to sleep. */
 			if (skb == NULL) {
@@ -928,8 +935,10 @@
 					err = -ERESTARTSYS;
 					goto do_interrupted;
 				}
-				tcp_push_pending_frames(sk, tp);
-				wait_for_tcp_memory(sk);
+				/* In OOM that would fail anyways so do not bother. */ 
+				if (!err) 
+					tcp_push_pending_frames(sk, tp);
+				wait_for_tcp_memory(sk, err);
 
 				/* If SACK's were formed or PMTU events happened,
 				 * we must find out about it.
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/net/ipv4/tcp_input.c linux.17p9/net/ipv4/tcp_input.c
--- linux.vanilla/net/ipv4/tcp_input.c	Sun Jun 11 21:44:23 2000
+++ linux.17p9/net/ipv4/tcp_input.c	Tue Jun 27 12:13:36 2000
@@ -448,9 +448,6 @@
  */
 static __inline__ int tcp_fast_parse_options(struct sock *sk, struct tcphdr *th, struct tcp_opt *tp)
 {
-	/* If we didn't send out any options ignore them all. */
-	if (tp->tcp_header_len == sizeof(struct tcphdr))
-		return 0;
 	if (th->doff == sizeof(struct tcphdr)>>2) {
 		tp->saw_tstamp = 0;
 		return 0;
@@ -780,6 +777,7 @@
 		   u32 ack_seq, u32 ack, int len)
 {
 	struct tcp_opt *tp = &(sk->tp_pinfo.af_tcp);
+	u32 nwin = ntohs(th->window) << tp->snd_wscale;
 	int flag = 0;
 	u32 seq = 0;
 	u32 seq_rtt = 0;
@@ -810,20 +808,21 @@
 	 * snd_wl{1,2} are used to prevent unordered
 	 * segments from shrinking the window 
 	 */
-	if (before(tp->snd_wl1, ack_seq) ||
-	    (tp->snd_wl1 == ack_seq && !after(tp->snd_wl2, ack))) {
-		u32 nwin = ntohs(th->window) << tp->snd_wscale;
-
-		if ((tp->snd_wl2 != ack) || (nwin > tp->snd_wnd)) {
-			flag |= FLAG_WIN_UPDATE;
-			tp->snd_wnd = nwin;
-
-			tp->snd_wl1 = ack_seq;
-			tp->snd_wl2 = ack;
-
-			if (nwin > tp->max_window)
-				tp->max_window = nwin;
-		}
+	if (after(ack_seq, tp->snd_wl1) ||
+	    (tp->snd_wl1 == ack_seq &&
+	     (after(ack, tp->snd_wl2) ||
+	      (tp->snd_wl2 == ack && nwin > tp->snd_wnd)))) {
+		flag |= FLAG_WIN_UPDATE;
+		tp->snd_wl1 = ack_seq;
+		tp->snd_wl2 = ack;
+		tp->snd_wnd = nwin;
+
+		if (nwin > tp->max_window)
+			tp->max_window = nwin;
+	} else if (after(ack, tp->snd_una)) {
+		/* Bad case. Window update is not accepted.
+		 * We will lockup. Break RFC to survive. */
+		tp->snd_wnd -= min(ack-tp->snd_una, tp->snd_wnd);
 	}
 
 	/* We passed data and got it acked, remove any soft error
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/net/ipv4/tcp_ipv4.c linux.17p9/net/ipv4/tcp_ipv4.c
--- linux.vanilla/net/ipv4/tcp_ipv4.c	Fri Apr 21 12:47:15 2000
+++ linux.17p9/net/ipv4/tcp_ipv4.c	Tue Jun 27 12:13:36 2000
@@ -327,6 +327,11 @@
 {
 	struct sock **skp;
 
+	if (sk->pprev) {
+		printk("tcp_v4_hash: bug, socket state is %d\n", sk->state);
+		*(int *)0 = 0;
+	}
+
 	if(sk->state == TCP_LISTEN)
 		skp = &tcp_listening_hash[tcp_sk_listen_hashfn(sk)];
 	else
@@ -356,7 +361,8 @@
 		*sk->pprev = sk->next;
 		sk->pprev = NULL;
 		tcp_reg_zap(sk);
-		__tcp_put_port(sk);
+		if (sk->prev != NULL)
+			__tcp_put_port(sk);
 	}
 	SOCKHASH_UNLOCK();
 }
@@ -1041,8 +1047,8 @@
 	rth.source = th->dest; 
 	rth.doff = sizeof(struct tcphdr)/4;
 
-	rth.seq = seq;
-	rth.ack_seq = ack; 
+	rth.seq = htonl(seq);
+	rth.ack_seq = htonl(ack); 
 	rth.ack = 1;
 
 	rth.window = htons(window);
@@ -1365,6 +1371,8 @@
 
 		memcpy(newsk, sk, sizeof(*newsk));
 		newsk->sklist_next = NULL;
+		newsk->next = NULL;
+		newsk->pprev = NULL;
 		newsk->state = TCP_SYN_RECV;
 
 		/* Clone the TCP header template */
@@ -1570,24 +1578,28 @@
 	return NULL;
 }
 
-static void tcp_v4_rst_req(struct sock *sk, struct sk_buff *skb)
+static struct sock *tcp_v4_rst_req(struct sock *sk, struct sk_buff *skb)
 {
 	struct tcp_opt *tp = &sk->tp_pinfo.af_tcp;
 	struct open_request *req, *prev;
 
 	req = tcp_v4_search_req(tp,skb->nh.iph, skb->h.th, &prev);
 	if (!req)
-		return;
+		return NULL;
 	/* Sequence number check required by RFC793 */
 	if (before(TCP_SKB_CB(skb)->seq, req->rcv_isn) ||
 	    after(TCP_SKB_CB(skb)->seq, req->rcv_isn+1))
-		return;
+		return NULL;
+	if (req->sk)
+		return req->sk;
+
 	tcp_synq_unlink(tp, req, prev);
-	(req->sk ? sk->ack_backlog : tp->syn_backlog)--;
+	tp->syn_backlog--;
 	req->class->destructor(req);
 	tcp_openreq_free(req); 
 
 	net_statistics.EmbryonicRsts++;
+	return NULL;
 }
 
 /* Check for embryonic sockets (open_requests) We check packets with
@@ -1601,10 +1613,8 @@
 	u32 flg = ((u32 *)th)[3]; 
 
 	/* Check for RST */
-	if (flg & __constant_htonl(0x00040000)) {
-		tcp_v4_rst_req(sk, skb);
-		return NULL;
-	}
+	if (flg & __constant_htonl(0x00040000))
+		return tcp_v4_rst_req(sk, skb);
 
 	/* Check for SYN|ACK */
 	if (flg & __constant_htonl(0x00120000)) {
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/net/ipv4/tcp_output.c linux.17p9/net/ipv4/tcp_output.c
--- linux.vanilla/net/ipv4/tcp_output.c	Sun Jun 11 21:44:23 2000
+++ linux.17p9/net/ipv4/tcp_output.c	Tue Jun 27 12:13:36 2000
@@ -63,6 +63,31 @@
 		tp->send_head = NULL;
 }
 
+static __inline__ u32 tcp_acceptable_seq(struct sock *sk)
+{
+	struct tcp_opt *tp = &sk->tp_pinfo.af_tcp;
+	struct sk_buff *skb;
+	u32 snd_nxt;
+
+	if (!before(tp->snd_una+tp->snd_wnd, tp->snd_nxt))
+		return tp->snd_nxt;
+
+	/* Umm... No better choice. The case is marginal, no hurry. */
+	skb = skb_peek(&sk->write_queue);
+
+	snd_nxt = tp->snd_una;
+	while((skb != NULL) &&
+	      (skb != tp->send_head) &&
+	      (skb != (struct sk_buff *)&sk->write_queue)) {
+		if (after(TCP_SKB_CB(skb)->end_seq, tp->snd_una+tp->snd_wnd))
+			break;
+		snd_nxt = TCP_SKB_CB(skb)->end_seq;
+		skb = skb->next;
+	}
+
+	return snd_nxt;
+}
+
 /* This routine actually transmits TCP packets queued in by
  * tcp_do_sendmsg().  This is used by both the initial
  * transmission and possible later retransmissions.
@@ -802,7 +827,7 @@
 	TCP_SKB_CB(skb)->urg_ptr = 0;
 
 	/* Send it off. */
-	TCP_SKB_CB(skb)->seq = tp->write_seq;
+	TCP_SKB_CB(skb)->seq = tcp_acceptable_seq(sk);
 	TCP_SKB_CB(skb)->end_seq = TCP_SKB_CB(skb)->seq;
 	TCP_SKB_CB(skb)->when = tcp_time_stamp;
 	tcp_transmit_skb(sk, skb);
@@ -1066,7 +1091,7 @@
 		TCP_SKB_CB(buff)->urg_ptr = 0;
 
 		/* Send it off, this clears delayed acks for us. */
-		TCP_SKB_CB(buff)->seq = TCP_SKB_CB(buff)->end_seq = tp->snd_nxt;
+		TCP_SKB_CB(buff)->seq = TCP_SKB_CB(buff)->end_seq = tcp_acceptable_seq(sk);
 		TCP_SKB_CB(buff)->when = tcp_time_stamp;
 		tcp_transmit_skb(sk, buff);
 	}
@@ -1091,15 +1116,15 @@
 		      TCPF_LAST_ACK|TCPF_CLOSING))
 			return;
 
-		if (before(tp->snd_nxt, tp->snd_una + tp->snd_wnd) &&
-		    ((skb = tp->send_head) != NULL)) {
+		if ((skb = tp->send_head) != NULL &&
+		    before(TCP_SKB_CB(skb)->seq, tp->snd_una+tp->snd_wnd)) {
 			unsigned long win_size;
 
 			/* We are probing the opening of a window
 			 * but the window size is != 0
 			 * must have been a result SWS avoidance ( sender )
 			 */
-			win_size = tp->snd_wnd - (tp->snd_nxt - tp->snd_una);
+			win_size = tp->snd_una+tp->snd_wnd - TCP_SKB_CB(skb)->seq;
 			if (win_size < TCP_SKB_CB(skb)->end_seq - TCP_SKB_CB(skb)->seq) {
 				if (tcp_fragment(sk, skb, win_size))
 					return; /* Let a retransmit get it. */
@@ -1129,7 +1154,7 @@
 			 * end to send an ack.  Don't queue or clone SKB, just
 			 * send it.
 			 */
-			TCP_SKB_CB(skb)->seq = tp->snd_nxt - 1;
+			TCP_SKB_CB(skb)->seq = tp->snd_una - 1;
 			TCP_SKB_CB(skb)->end_seq = TCP_SKB_CB(skb)->seq;
 			TCP_SKB_CB(skb)->when = tcp_time_stamp;
 			tcp_transmit_skb(sk, skb);
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/scripts/Configure linux.17p9/scripts/Configure
--- linux.vanilla/scripts/Configure	Sun Jun 11 21:44:24 2000
+++ linux.17p9/scripts/Configure	Tue Jun 20 23:16:29 2000
@@ -542,7 +542,7 @@
   echo "# Using defaults found in" $DEFAULTS
   echo "#"
   . $DEFAULTS
-  sed -e 's/# \(.*\) is not.*/\1=n/' < $DEFAULTS > .config-is-not.$$
+  sed -e 's/# \(CONFIG_[^ ]*\) is not.*/\1=n/' <$DEFAULTS >.config-is-not.$$
   . .config-is-not.$$
   rm .config-is-not.$$
 else
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/scripts/Menuconfig linux.17p9/scripts/Menuconfig
--- linux.vanilla/scripts/Menuconfig	Sun Jun 11 21:44:24 2000
+++ linux.17p9/scripts/Menuconfig	Thu Jun 22 22:36:57 2000
@@ -425,7 +425,7 @@
 			--menu '$menu_instructions' \
 			$ROWS $COLS $((ROWS-10)) \
 			'$default' " >MCmenu
-	>MCradiolists
+	echo "#!/bin/sh" >MCradiolists
 }
 
 #
@@ -713,11 +713,11 @@
 			++menu_no
 
 			printf("submenu %s MCmenu%s\n", $0, menu_no) >>menu
-
-			printf( "function MCmenu%s () {\n"\
+			printf( "#!/bin/sh\n"\
+				"function MCmenu%s () {\n"\
 				"default=$1\n"\
 				"menu_name %s\n",\
-				 menu_no, $0) >"MCmenu"menu_no
+				 menu_no, $0) >>"MCmenu"menu_no
 
 			parser(ifile, "MCmenu"menu_no)
 		}
@@ -772,7 +772,8 @@
 function parse_config_files () {
 	rm -f MCmenu*
 
-	echo "function MCmenu0 () {" >MCmenu0
+	echo "#!/bin/sh" > MCmenu0
+	echo "function MCmenu0 () {" >>MCmenu0
 	echo 'default=$1' >>MCmenu0
 	echo "menu_name 'Main Menu'" >>MCmenu0
 
