diff -u --recursive --new-file v2.1.106/linux/Documentation/00-INDEX linux/Documentation/00-INDEX
--- v2.1.106/linux/Documentation/00-INDEX	Sun Jun  7 11:16:25 1998
+++ linux/Documentation/00-INDEX	Wed Jun 24 14:30:07 1998
@@ -66,7 +66,7 @@
 logo.txt
 	- Info on creator of above logo & site to get additional images from.
 m68k/
-	- directory with info about Linux on Motorola 68k archtecture.
+	- directory with info about Linux on Motorola 68k architecture.
 magic-number.txt
 	- list of magic numbers used to mark/protect kernel data structures.
 mandatory.txt
@@ -84,7 +84,7 @@
 nbd.txt
 	- info on a TCP implementation of a network block device.
 networking/
-	- directory with info on various linux networking aspects.
+	- directory with info on various aspects of networking with Linux.
 nfsroot.txt
 	- short guide on setting up a diskless box with NFS root filesystem
 oops-tracing.txt
diff -u --recursive --new-file v2.1.106/linux/Documentation/Changes linux/Documentation/Changes
--- v2.1.106/linux/Documentation/Changes	Tue Jun 23 10:01:18 1998
+++ linux/Documentation/Changes	Wed Jun 24 14:30:07 1998
@@ -71,7 +71,7 @@
    <CTRL><ALT><DEL> now performs a cold reboot instead of a warm reboot
 for increased hardware compatibility.  If you want a warm reboot and
 know it works on your hardware, add a "reboot=warm" command line option
-in Lilo.  A small number of machines need "reboot=bios" to reboot via
+in LILO.  A small number of machines need "reboot=bios" to reboot via
 the BIOS.
 
    Also, please remember that cua* devices are now obsolete.  Switch to
diff -u --recursive --new-file v2.1.106/linux/Documentation/CodingStyle linux/Documentation/CodingStyle
--- v2.1.106/linux/Documentation/CodingStyle	Sun Jun  7 11:16:25 1998
+++ linux/Documentation/CodingStyle	Wed Jun 24 14:30:07 1998
@@ -169,7 +169,7 @@
 
 		Chapter 6: You've made a mess of it
 
-That's ok, we all do.  You've probably been told by your long-time unix
+That's OK, we all do.  You've probably been told by your long-time Unix
 user helper that "GNU emacs" automatically formats the C sources for
 you, and you've noticed that yes, it does do that, but the defaults it
 uses are less than desirable (in fact, they are worse than random
diff -u --recursive --new-file v2.1.106/linux/Documentation/Configure.help linux/Documentation/Configure.help
--- v2.1.106/linux/Documentation/Configure.help	Tue Jun 23 10:01:18 1998
+++ linux/Documentation/Configure.help	Wed Jun 24 14:44:00 1998
@@ -5282,20 +5282,6 @@
   module, say M here and read Documentation/modules.txt as well as
   Documentation/networking/net-modules.txt.
 
-PCI NE2000 Support
-CONFIG_NE2K_PCI
-  This driver is for NE2000 compatible PCI cards.  It will not work
-  with ISA NE2000 cards.  If you have a network (Ethernet) card of
-  this type, say Y and read the Ethernet-HOWTO, available via FTP
-  (user: anonymous) in ftp://sunsite.unc.edu/pub/Linux/docs/HOWTO.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called ne2k-pci.o. If you want to compile it as a
-  module, say M here and read Documentation/modules.txt as well as
-  Documentation/networking/net-modules.txt.
-
-
 TI ThunderLAN support (EXPERIMENTAL)
 CONFIG_TLAN
   If you have a TLAN based network card which is supported by this
@@ -5421,6 +5407,20 @@
   The module will be called ibmtr.o. If you want to compile it as a
   module, say M here and read Documentation/modules.txt.
 
+SysKonnect adapter support
+CONFIG_SKTR
+  This is support for all SysKonnect Token Ring cards. Specificly
+  SysKonnect TR4/16(+) ISA (SK-4190), SysKonnect TR4/16(+) PCI
+  (SK-4590), SysKonnect TR4/16 PCI (SK-4591) adapters.
+
+  If you have such an adapter and would like to use it, say Y or M
+  and read the Token-Ring mini-HOWTO, available via ftp (user:anonymous)
+  from ftp://sunsite.unc.edu/pub/Linux/docs/HOWTO.
+
+  Also read the sktr.txt in linux/Documentation/networking or check
+  the Linux-SNA WWW site for the latest information at
+  http://samba.anu.edu.au/linux-sna/documents/drivers/SysKonnect/
+
 Traffic Shaper (EXPERIMENTAL)
 CONFIG_SHAPER
   The traffic shaper is a virtual network device that allows you to
@@ -9182,6 +9182,34 @@
   module called pms.o ( = code which can be inserted in and removed
   from the running kernel whenever you want). If you want to compile
   it as a module, say M here and read Documentation/modules.txt.
+
+# drivers/video section
+Open Firmware frame buffer device support 
+CONFIG_FB_OF
+  Say Y if you want support with Open Firmware for your graphics board.
+
+S3 Trio frame buffer device support 
+CONFIG_FB_S3TRIO
+  If you have a S3 Trio say Y. Say N for S3 Virge. 
+
+ATI Mach64 display support
+CONFIG_FB_ATY
+  This driver supports graphics boards with the ATI Mach64 chips.
+
+MDA dual-headed support
+CONFIG_FB_MDA
+  Say Y here if you have an old MDA or monochrome Hercules graphics
+  adapter in your system acting as a second head ( = videocard).  Do 
+  not enable this driver if your MDA card is the primary card in your
+  system; the normal VGA driver will handle it.
+  
+  This driver is also available as a module ( = code which can be
+  inserted and removed from the running kernel whenever you want).
+  The module will be called mdafb.o.  If you want to compile it as
+  a module, say M here and read Documentation/modules.txt.
+  
+  If unsure, say N.
+
 
 CPU Optimisation
 CONFIG_CPU_ARM2
diff -u --recursive --new-file v2.1.106/linux/Documentation/IO-APIC.txt linux/Documentation/IO-APIC.txt
--- v2.1.106/linux/Documentation/IO-APIC.txt	Sun Jun  7 11:16:25 1998
+++ linux/Documentation/IO-APIC.txt	Wed Jun 24 14:30:07 1998
@@ -1,5 +1,4 @@
-
-most (all) Intel SMP boards have the so-called 'IO-APIC', which is
+Most (all) Intel SMP boards have the so-called 'IO-APIC', which is
 an enhanced interrupt controller, able to route hardware interrupts
 to multiple CPUs, or to CPU groups.
 
diff -u --recursive --new-file v2.1.106/linux/Documentation/IO-mapping.txt linux/Documentation/IO-mapping.txt
--- v2.1.106/linux/Documentation/IO-mapping.txt	Sun Jun  7 11:16:25 1998
+++ linux/Documentation/IO-mapping.txt	Wed Jun 24 14:30:07 1998
@@ -1,8 +1,7 @@
-
-[ This is a mail-message in response to a query on IO mapping, thus the
+[ This is a mail message in response to a query on IO mapping, thus the
   strange format for a "document" ]
 
-The aha1542 is a bus-master device, and your patch makes the driver give the
+The AHA-1542 is a bus-master device, and your patch makes the driver give the
 controller the physical address of the buffers, which is correct on x86
 (because all bus master devices see the physical memory mappings directly). 
 
@@ -11,9 +10,9 @@
 so-called "bus address". 
 
 Essentially, the three ways of addressing memory are (this is "real memory",
-ie normal RAM, see later about other details): 
+that is, normal RAM--see later about other details): 
 
- - CPU untranslated. This is the "physical" address, ie physical address 
+ - CPU untranslated.  This is the "physical" address.  Physical address 
    0 is what the CPU sees when it drives zeroes on the memory bus.
 
  - CPU translated address. This is the "virtual" address, and is 
@@ -27,7 +26,7 @@
    things any more complex than necessary, so you can assume that all 
    external hardware sees the memory the same way. 
 
-Now, on normal PC's the bus address is exactly the same as the physical
+Now, on normal PCs the bus address is exactly the same as the physical
 address, and things are very simple indeed. However, they are that simple
 because the memory and the devices share the same address space, and that is
 not generally necessarily true on other PCI/ISA setups. 
@@ -35,13 +34,13 @@
 Now, just as an example, on the PReP (PowerPC Reference Platform), the 
 CPU sees a memory map something like this (this is from memory):
 
-	0-2GB	"real memory"
-	2GB-3GB	"system IO" (ie inb/out type accesses on x86)
-	3GB-4GB "IO memory" (ie shared memory over the IO bus)
+	0-2 GB		"real memory"
+	2 GB-3 GB	"system IO" (inb/out and similar accesses on x86)
+	3 GB-4 GB 	"IO memory" (shared memory over the IO bus)
 
 Now, that looks simple enough. However, when you look at the same thing from
 the viewpoint of the devices, you have the reverse, and the physical memory
-address 0 actually shows up as address 2GB for any IO master.
+address 0 actually shows up as address 2 GB for any IO master.
 
 So when the CPU wants any bus master to write to physical memory 0, it 
 has to give the master address 0x80000000 as the memory address.
@@ -53,7 +52,7 @@
  virtual address:	0xC0000000
  bus address:		0x80000000
 
-where all the addresses actually point to the same thing, it's just seen 
+where all the addresses actually point to the same thing.  It's just seen 
 through different translations..
 
 Similarly, on the Alpha, the normal translation is
@@ -119,7 +118,7 @@
 the CPU, so it shouldn't need to know about "bus addresses" etc). 
 
 NOTE NOTE NOTE! The above is only one part of the whole equation. The above
-only talks about "real memory", ie CPU memory, ie RAM. 
+only talks about "real memory", that is, CPU memory (RAM). 
 
 There is a completely different type of memory too, and that's the "shared
 memory" on the PCI or ISA bus. That's generally not RAM (although in the case
@@ -160,14 +159,14 @@
 	iounmap(baseptr);
 
  - copying and clearing:
-	/* get the 6-byte ethernet address at ISA address E000:0040 */
+	/* get the 6-byte Ethernet address at ISA address E000:0040 */
 	memcpy_fromio(kernel_buffer, 0xE0040, 6);
 	/* write a packet to the driver */
 	memcpy_toio(0xE1000, skb->data, skb->len);
 	/* clear the frame buffer */
 	memset_io(0xA0000, 0, 0x10000);
 
-Ok, that just about covers the basics of accessing IO portably.  Questions?
+OK, that just about covers the basics of accessing IO portably.  Questions?
 Comments? You may think that all the above is overly complex, but one day you
 might find yourself with a 500 MHz Alpha in front of you, and then you'll be
 happy that your driver works ;)
diff -u --recursive --new-file v2.1.106/linux/Documentation/SMP.txt linux/Documentation/SMP.txt
--- v2.1.106/linux/Documentation/SMP.txt	Tue Jun  9 11:57:28 1998
+++ linux/Documentation/SMP.txt	Wed Jun 24 14:30:07 1998
@@ -1,4 +1,4 @@
-SMP on x86/Linux is now an official feature and is not exprtimental.
+SMP on x86/Linux is now an official feature and is not experimental.
 Experimental SMP support for other architectures is underway.
 
 Please view linux/Documentation/smp for more information about enabling SMP.
@@ -10,11 +10,11 @@
 
 o	Clean up processor specific/independent split.
 o	Document it all.	[PARTLY DONE]
-o	Halt other CPU's on reset/panic doesn't always work.
-o	Don't waste page at 4K - don't need it now.(watch the GDT code).
+o	Halting other CPUs on reset or panic doesn't always work.
+o	Don't waste page at 4 K--don't need it now (watch the GDT code).
 o	Dump bootup pages once booted somehow.
 o	Clean up warnings/volatiles.
 o	486 startup code.
 o	How to handle mixed FPU/non FPU processors.
 o	Test IO-APIC on various hardware.
-o	Seperate IO-APIC from SMP.
+o	Separate IO-APIC from SMP.
diff -u --recursive --new-file v2.1.106/linux/Documentation/VGA-softcursor.txt linux/Documentation/VGA-softcursor.txt
--- v2.1.106/linux/Documentation/VGA-softcursor.txt	Sat Nov 29 10:33:18 1997
+++ linux/Documentation/VGA-softcursor.txt	Wed Jun 24 14:30:07 1998
@@ -1,34 +1,33 @@
 Software cursor for VGA    by Pavel Machek <pavel@atrey.karlin.mff.cuni.cz>
-=======================     & Martin Mares <mj@atrey.karlin.mff.cuni.cz>
+=======================    and Martin Mares <mj@atrey.karlin.mff.cuni.cz>
 
    Linux now has some ability to manipulate cursor appearance. Normally, you
-can set the size of hardware cursor (and also work-around some ugly bugs in
-those miserable Trident cards -- see #define TRIDENT_GLITCH in drivers/char/
+can set the size of hardware cursor (and also work around some ugly bugs in
+those miserable Trident cards--see #define TRIDENT_GLITCH in drivers/char/
 vga.c). In case you enable "Software generated cursor" in the system
-configuration, you can play few new tricks: you can make your cursor look
+configuration, you can play a few new tricks:  you can make your cursor look
 like a non-blinking red block, make it inverse background of the character
 it's over or to highlight that character and still choose whether the
-original hardware cursor should remain visible or not. And maybe other
+original hardware cursor should remain visible or not.  There may be other
 things I have never thought of.
 
    The cursor appearance is controlled by a "<ESC>[?1;2;3c" escape sequence
 where 1, 2 and 3 are parameters described below. If you omit any of them,
 they will default to zeroes.
 
-   Parameter #1 specifies cursor size (0=default, 1=invisible, 2=underline, ...,
+   Parameter 1 specifies cursor size (0=default, 1=invisible, 2=underline, ...,
 8=full block) + 16 if you want the software cursor to be applied + 32 if you
-want to always change the background color + 64 if you dislike background same
-as foreground. (Highlights are ignored for the last two flags.)
+want to always change the background color + 64 if you dislike having the
+background the same as the foreground.  Highlights are ignored for the last two
+flags.
 
    The second parameter selects character attribute bits you want to change
-(by simple XOR'ing them with the value of this parameter). On standard VGA,
-the high 4 bits specify background and the low 4 the foreground. In both
-groups, low 3 bits set color (as in normal color codes used by the console)
-and the most significant one turns on highlight (or sometimes blinking -- it
+(by simply XORing them with the value of this parameter). On standard VGA,
+the high four bits specify background and the low four the foreground. In both
+groups, low three bits set color (as in normal color codes used by the console)
+and the most significant one turns on highlight (or sometimes blinking--it
 depends on the configuration of your VGA).
 
-   And the third parameter consists of character attribute bits you want
-to set. Bit setting takes place before bit toggling, so you can simply
-clear a bit by including it in both the set mask and the toggle mask.
-
-
+   The third parameter consists of character attribute bits you want to set.
+Bit setting takes place before bit toggling, so you can simply clear a bit by 
+including it in both the set mask and the toggle mask.
diff -u --recursive --new-file v2.1.106/linux/Documentation/exception.txt linux/Documentation/exception.txt
--- v2.1.106/linux/Documentation/exception.txt	Sun Jun  7 11:16:25 1998
+++ linux/Documentation/exception.txt	Wed Jun 24 14:30:07 1998
@@ -14,12 +14,12 @@
 in type (read or write). To do this, verify_read had to look up the 
 virtual memory area (vma) that contained the address addr. In the 
 normal case (correctly working program), this test was successful. 
-It only failed for the (hopefully) rare, buggy program. In some kernel 
-profiling tests, this normally unneeded verification used up a 
-considerable amount of time.
+It only failed for a few buggy programs. In some kernel profiling
+tests, this normally unneeded verification used up a considerable
+amount of time.
 
 To overcome this situation, Linus decided to let the virtual memory 
-hardware present in every Linux capable CPU handle this test.
+hardware present in every Linux-capable CPU handle this test.
 
 How does this work?
 
@@ -52,7 +52,7 @@
 
 Since we jump to the contents of fixup, fixup obviously points 
 to executable code. This code is hidden inside the user access macros. 
-I have picked the get_user macro defined in include/asm/uacess.h as an
+I have picked the get_user macro defined in include/asm/uaccess.h as an
 example. The definition is somewhat hard to follow, so let's peek at 
 the code generated by the preprocessor and the compiler. I selected
 the get_user call in drivers/char/console.c for a detailed examination.
diff -u --recursive --new-file v2.1.106/linux/Documentation/fb/00-INDEX linux/Documentation/fb/00-INDEX
--- v2.1.106/linux/Documentation/fb/00-INDEX	Wed Dec 31 16:00:00 1969
+++ linux/Documentation/fb/00-INDEX	Wed Jun 24 14:44:00 1998
@@ -0,0 +1,15 @@
+Index of files in Documentation/fb.  If you think something about frame
+buffer devices needs an entry here, needs correction or you've written one
+please mail me.
+				    Geert Uytterhoeven
+				    <Geert.Uytterhoeven@cs.kuleuven.ac.be>
+
+00-INDEX
+	- this file
+framebuffer.txt
+	- introduction to frame buffer devices
+internals.txt
+	- quick overview of frame buffer device internals
+vesafb.txt
+	- info on the VESA frame buffer device
+
diff -u --recursive --new-file v2.1.106/linux/Documentation/fb/framebuffer.txt linux/Documentation/fb/framebuffer.txt
--- v2.1.106/linux/Documentation/fb/framebuffer.txt	Wed Dec 31 16:00:00 1969
+++ linux/Documentation/fb/framebuffer.txt	Wed Jun 24 14:44:00 1998
@@ -0,0 +1,327 @@
+
+			The Frame Buffer Device
+			-----------------------
+
+Maintained by Geert Uytterhoeven (Geert.Uytterhoeven@cs.kuleuven.ac.be)
+Last revised: June 10, 1998
+
+
+0. Introduction
+---------------
+
+The frame buffer device provides an abstraction for the graphics hardware. It
+represents the frame buffer of some video hardware and allows application
+software to access the graphics hardware through a well-defined interface, so
+the software doesn't need to know anything about the low-level (hardware
+register) stuff.
+
+The device is accessed through special device nodes, usually located in the
+/dev directory, i.e. /dev/fb*.
+
+
+1. User's View of /dev/fb*
+--------------------------
+
+From the user's point of view, the frame buffer device looks just like any
+other device in /dev. It's a character device using major 29; the minor
+specifies the frame buffer number.
+
+By convention, the following device nodes are used (numbers indicate the device
+minor numbers):
+
+      0 = /dev/fb0	First frame buffer
+     32 = /dev/fb1	Second frame buffer
+	  ...
+    224 = /dev/fb7	8th frame buffer
+
+For backwards compatibility, you may want to create the following symbolic
+links:
+
+    /dev/fb0current -> fb0
+    /dev/fb1current -> fb1
+
+and so on...
+
+The frame buffer devices are also `normal' memory devices, this means, you can
+read and write their contents. You can, for example, make a screen snapshot by
+
+  cp /dev/fb0 myfile
+
+There also can be more than one frame buffer at a time, e.g. if you have a
+graphics card in addition to the built-in hardware. The corresponding frame
+buffer devices (/dev/fb0 and /dev/fb1 etc.) work independently.
+
+Application software that uses the frame buffer device (e.g. the X server) will
+use /dev/fb0 by default (older software uses /dev/fb0current). You can specify
+an alternative frame buffer device by setting the environment variable
+$FRAMEBUFFER to the path name of a frame buffer device, e.g. (for sh/bash
+users):
+
+    export FRAMEBUFFER=/dev/fb1
+
+or (for csh users):
+
+    setenv FRAMEBUFFER /dev/fb1
+
+After this the X server will use the second frame buffer.
+
+
+2. Programmer's View of /dev/fb*
+--------------------------------
+
+As you already know, a frame buffer device is a memory device like /dev/mem and
+it has the same features. You can read it, write it, seek to some location in
+it and mmap() it (the main usage). The difference is just that the memory that
+appears in the special file is not the whole memory, but the frame buffer of
+some video hardware.
+
+/dev/fb* also allows several ioctls on it, by which lots of information about
+the hardware can be queried and set. The color map handling works via ioctls,
+too. Look into <linux/fb.h> for more information on what ioctls exist and on
+which data structures they work. Here's just a brief overview:
+
+  - You can request unchangeable information about the hardware, like name,
+    organization of the screen memory (planes, packed pixels, ...) and address
+    and length of the screen memory.
+
+  - You can request and change variable information about the hardware, like
+    visible and virtual geometry, depth, color map format, timing, and so on.
+    If you try to change that information, the driver maybe will round up some
+    values to meet the hardware's capabilities (or return EINVAL if that isn't
+    possible).
+
+  - You can get and set parts of the color map. Communication is done with 16
+    bits per color part (red, green, blue, transparency) to support all 
+    existing hardware. The driver does all the computations needed to apply 
+    it to the hardware (round it down to less bits, maybe throw away 
+    transparency).
+
+All this hardware abstraction makes the implementation of application programs
+easier and more portable. E.g. the X server works completely on /dev/fb* and
+thus doesn't need to know, for example, how the color registers of the concrete
+hardware are organized. XF68_FBDev is a general X server for bitmapped,
+unaccelerated video hardware. The only thing that has to be built into
+application programs is the screen organization (bitplanes or chunky pixels
+etc.), because it works on the frame buffer image data directly.
+
+For the future it is planned that frame buffer drivers for graphics cards and
+the like can be implemented as kernel modules that are loaded at runtime. Such
+a driver just has to call register_framebuffer() and supply some functions.
+Writing and distributing such drivers independently from the kernel will save
+much trouble...
+
+
+3. Frame Buffer Resolution Maintenance
+--------------------------------------
+
+Frame buffer resolutions are maintained using the utility `fbset'. It can
+change the video mode properties of the current resolution. Its main usage is
+to change the current video mode, e.g. during boot up in one of your /etc/rc.*
+or /etc/init.d/* files.
+
+Fbset uses a video mode database stored in a configuration file, so you can
+easily add your own modes and refer to them with a simple identifier.
+
+
+4. The X Server
+---------------
+
+The X server (XF68_FBDev) is the most notable application program for the frame
+buffer device. The current X server is part of the XFree86/XFree68 release
+3.3.1 package and has 2 modes:
+
+  - If the `Display' subsection for the `fbdev' driver in the /etc/XF86Config
+    file contains a
+
+	Modes "default"
+
+    line, the X server will use the scheme discussed above, i.e. it will start
+    up in the resolution determined by /dev/fb0current (or $FRAMEBUFFER, if
+    set). This is the default for the configuration file supplied with XFree68
+    3.2. It's the most simple configuration (and the only possible one if you
+    want to have a broadcast compatible display, e.g. PAL or NTSC), but it has
+    some limitations.
+
+  - Therefore it's also possible to specify resolutions in the /etc/XF86Config
+    file. This allows for on-the-fly resolution switching while retaining the
+    same virtual desktop size. The frame buffer device that's used is still
+    /dev/fb0current (or $FRAMEBUFFER), but the available resolutions are
+    defined by /etc/XF86Config now. The disadvantage is that you have to
+    specify the timings in a different format (but `fbset -x' may help) and
+    that you can't have a broadcast compatible display (e.g. no PAL or NTSC).
+
+To tune a video mode, you can use fbset or xvidtune. Note that xvidtune doesn't
+work 100% with XF68_FBDev: the reported clock values are always incorrect.
+
+
+5. Video Mode Timings
+---------------------
+
+A monitor draws an image on the screen by using an electron beam (3 electron
+beams for most color models, 1 electron beam for Trinitron color monitors and
+monochrone monitors). The front of the screen is covered by a pattern of
+colored phospors (pixels). If a phospor is hit by an electron, it emits a
+photon and thus becomes visible.
+
+The electron beam draws horizontal lines (scanlines) from left to right, and
+from the top to the bottom of the screen. By modifying the intensity of the
+electron beam, pixels with various colors and intensities can be shown.
+
+After each scanline the electron beam has to move back to the left side of the
+screen and to the next line: this is called the horizontal retrace. After the
+whole screen (frame) was painted, the beam moves back to the upper left corner:
+this is called the vertical retrace. During both the horizontal and vertical
+retrace, the electron beam is turned off (blanked).
+
+The speed at which the electron beam paints the pixels is determined by the
+dotclock in the graphics board. For a dotclock of e.g. 28.37516 MHz (millions
+of cycles per second), each pixel is 35242 ps (picoseconds) long:
+
+    1/(28.37516E6 Hz) = 35.242E-9 s
+
+If the screen resolution is 640x480, it will take
+
+    640*35.242E-9 s = 22.555E-6 s
+
+to paint the 640 (xres) pixels on one scanline. But the horizontal retrace
+also takes time (e.g. 272 `pixels'), so a full scanline takes
+
+    (640+272)*35.242E-9 s = 32.141E-6 s
+
+We'll say that the horizontal scanrate is about 31 kHz:
+
+    1/(32.141E-6 s) = 31.113E3 Hz
+
+A full screen counts 480 (yres) lines, but we have to consider the vertical
+retrace too (e.g. 49 `pixels'). So a full screen will take
+
+    (480+49)*32.141E-6 s = 17.002E-3 s
+
+The vertical scanrate is about 59 Hz:
+
+    1/(17.002E-3 s) = 58.815 Hz
+
+This means the screen data is refreshed about 59 times per second. To have a
+stable picture without visible flicker, VESA recommends a vertical scanrate of
+at least 72 Hz. But the perceived flicker is very human dependent: some people
+can use 50 Hz without any trouble, while I'll notice if it's less than 80 Hz.
+
+Since the monitor doesn't know when a new scanline starts, the graphics board
+will supply a synchronization pulse (horizontal sync or hsync) for each
+scanline.  Similarly it supplies a synchronization pulse (vertical sync or
+vsync) for each new frame. The position of the image on the screen is
+influenced by the moments at which the synchronization pulses occur.
+
+The following picture summarizes all timings. The horizontal retrace time is
+the sum of the left margin, the right margin and the hsync length, while the
+vertical retrace time is the sum of the upper margin, the lower margin and the
+vsync length.
+
+  +----------+---------------------------------------------+----------+-------+
+  |          |                ^                            |          |       |
+  |          |                |upper_margin                |          |       |
+  |          |                ¥                            |          |       |
+  +----------###############################################----------+-------+
+  |          #                ^                            #          |       |
+  |          #                |                            #          |       |
+  |          #                |                            #          |       |
+  |          #                |                            #          |       |
+  |   left   #                |                            #  right   | hsync |
+  |  margin  #                |       xres                 #  margin  |  len  |
+  |<-------->#<---------------+--------------------------->#<-------->|<----->|
+  |          #                |                            #          |       |
+  |          #                |                            #          |       |
+  |          #                |                            #          |       |
+  |          #                |yres                        #          |       |
+  |          #                |                            #          |       |
+  |          #                |                            #          |       |
+  |          #                |                            #          |       |
+  |          #                |                            #          |       |
+  |          #                |                            #          |       |
+  |          #                |                            #          |       |
+  |          #                |                            #          |       |
+  |          #                |                            #          |       |
+  |          #                ¥                            #          |       |
+  +----------###############################################----------+-------+
+  |          |                ^                            |          |       |
+  |          |                |lower_margin                |          |       |
+  |          |                ¥                            |          |       |
+  +----------+---------------------------------------------+----------+-------+
+  |          |                ^                            |          |       |
+  |          |                |vsync_len                   |          |       |
+  |          |                ¥                            |          |       |
+  +----------+---------------------------------------------+----------+-------+
+
+The frame buffer device expects all horizontal timings in number of dotclocks
+(in picoseconds, 1E-12 s), and vertical timings in number of scanlines.
+
+
+6. Converting XFree86 timing values info frame buffer device timings
+--------------------------------------------------------------------
+
+An XFree86 mode line consists of the following fields:
+ "800x600"     50      800  856  976 1040    600  637  643  666
+ < name >     DCF       HR  SH1  SH2  HFL     VR  SV1  SV2  VFL
+
+The frame buffer device uses the following fields:
+
+  - pixclock: pixel clock in ps (pico seconds)
+  - left_margin: time from sync to picture
+  - right_margin: time from picture to sync
+  - upper_margin: time from sync to picture
+  - lower_margin: time from picture to sync
+  - hsync_len: length of horizontal sync
+  - vsync_len: length of vertical sync
+
+1) Pixelclock:
+   xfree: in MHz
+   fb: In Picoseconds (ps)
+
+   pixclock = 1000000 / DCF
+
+2) horizontal timings:
+   left_margin = HFL - SH2
+   right_margin = SH1 - HR
+   hsync_len = SH2 - SH1
+
+3) vertical timings:
+   upper_margin = VFL - SV2
+   lower_margin = SV1 - VR
+   vsync_len = SV2 - SV1
+
+Good examples for VESA timings can be found in the XFree86 source tree,
+under "xc/programs/Xserver/hw/xfree86/doc/modeDB.txt".
+
+
+7. References
+-------------
+
+For more specific information about the frame buffer device and its
+applications, please refer to the following documentation:
+
+  - The manual pages for fbset: fbset(8), fb.modes(5)
+  - The manual pages for XFree68: XF68_FBDev(1), XF86Config(4/5)
+  - The mighty kernel sources:
+      o linux/include/linux/fb.h
+      o linux/drivers/char/fbmem.c
+      o linux/drivers/video/*fb.c
+
+
+8. Downloading
+--------------
+
+All necessary files can be found at
+
+    ftp://ftp.uni-erlangen.de/pub/Linux/LOCAL/680x0/
+
+and on its mirrors.
+
+  
+9. Credits                                                       
+----------                                                       
+                
+This readme was written by Geert Uytterhoeven, partly based on the original
+`X-framebuffer.README' by Roman Hodek and Martin Schaller. Section 6 was
+provided by Frank Neumann.
+
+The frame buffer device abstraction was designed by Martin Schaller.
diff -u --recursive --new-file v2.1.106/linux/Documentation/fb/internals.txt linux/Documentation/fb/internals.txt
--- v2.1.106/linux/Documentation/fb/internals.txt	Wed Dec 31 16:00:00 1969
+++ linux/Documentation/fb/internals.txt	Wed Jun 24 14:44:00 1998
@@ -0,0 +1,86 @@
+
+This is a first start for some documentation about frame buffer device
+internals.
+
+Geert Uytterhoeven <Geert.Uytterhoeven@cs.kuleuven.ac.be>, 10 June 1998
+
+--------------------------------------------------------------------------------
+
+	    ***  STRUCTURES USED BY THE FRAME BUFFER DEVICE API  ***
+
+The following structures play a role in the game of frame buffer devices. They
+are defined in <linux/fb.h>.
+
+1. Outside the kernel (user space)
+
+  - struct fb_fix_screeninfo
+
+    Device independent unchangeable information about a frame buffer device and
+    a specific video mode. This can be obtained using the FBIOGET_FSCREENINFO
+    ioctl.
+
+  - struct fb_var_screeninfo
+
+    Device independent changeable information about a frame buffer device and a
+    specific video mode. This can be obtained using the FBIOGET_VSCREENINFO
+    ioctl, and updated with the FBIOPUT_VSCREENINFO ioctl. If you want to pan
+    the screen only, you can use the FBIOPAN_DISPLAY ioctl.
+
+  - struct fb_cmap
+
+    Device independent colormap information. You can get and set the colormap
+    using the FBIOGETCMAP and FBIOPUTCMAP ioctls.
+
+
+2. Inside the kernel
+
+  - struct fb_info
+
+    Generic information, API and low level information about a specific frame
+    buffer device instance (slot number, board address, ...).
+
+  - struct `par'
+
+    Device dependent information that uniquely defines the video mode for this
+    particular piece of hardware.
+
+  - struct display
+
+    Interface between the frame buffer device and the console driver.
+
+
+--------------------------------------------------------------------------------
+
+	    ***  VISUALS USED BY THE FRAME BUFFER DEVICE API  ***
+
+
+Monochrome (FB_VISUAL_MONO01 and FB_VISUAL_MONO10)
+-------------------------------------------------
+Each pixel is either black or white.
+
+
+Pseudo color (FB_VISUAL_PSEUDOCOLOR and FB_VISUAL_STATIC_PSEUDOCOLOR)
+---------------------------------------------------------------------
+The whole pixel value is fed through a programmable lookup table that has one
+color (including red, green, and blue intensities) for each possible pixel
+value, and that color is displayed.
+
+
+True color (FB_VISUAL_TRUECOLOR)
+--------------------------------
+The pixel value is broken up into red, green, and blue fields, each of which 
+are looked up in separate red, green, and blue lookup tables.
+
+
+Direct color (FB_VISUAL_DIRECTCOLOR)
+------------------------------------
+The pixel value is broken up into red, green, and blue fields. This is what
+most people mean when then say `true color'.
+
+
+Grayscale displays
+------------------
+Grayscale and static grayscale are special variants of pseudo color and static
+pseudo color, where the red, green and blue components are always equal to
+each other.
+
diff -u --recursive --new-file v2.1.106/linux/Documentation/fb/vesafb.txt linux/Documentation/fb/vesafb.txt
--- v2.1.106/linux/Documentation/fb/vesafb.txt	Wed Dec 31 16:00:00 1969
+++ linux/Documentation/fb/vesafb.txt	Wed Jun 24 14:44:00 1998
@@ -0,0 +1,71 @@
+
+what is vesafb?
+===============
+
+This is a generic driver for a graphic framebuffer on intel boxes.
+
+Idea is simple:  Turn on graphics mode at boot time with the help of
+the BIOS, and use this as framebuffer device /dev/fb0, like the m68k
+(and other) ports do.
+
+This means we decide at boot time whenever we want to run in text or
+graphics mode.  Switching mode later on (in protected mode) is
+impossible, BIOS calls work in real mode only.  VESA BIOS Extentions
+Version 2.0 are required, becauce we need a linear frame buffer.
+
+Advantages:
+
+ * It provides a nice large console (128 cols + 48 lines with 1024x768)
+   without using tiny, unreadable fonts.
+ * You can run XF68_FBDev on top of /dev/fb0 (=> non-accelerated X11
+   support for every VBE 2.0 compilant graphics board).
+ * Most important: boot logo :-)
+
+Disadvantages:
+
+ * graphic mode is slower than text mode...
+
+
+How to use it?
+==============
+
+Switching modes is done using the vga=... boot parameter.  Read
+Documentation/svga.txt for details.  With vesafb both text and
+graphics modes work.  Text modes are handled by vgafb, graphic modes
+by the new vesafb.c.
+
+The graphic modes are not in the list which you get if you boot with
+vga=ask and hit return.  Here are some mode numbers:
+
+    | 640x480  800x600  1024x768
+----+---------------------------
+256 |  0x101    0x103    0x105
+32k |  0x110    0x113    0x116
+64k |  0x111    0x114    0x117
+16M |  0x112    0x115    0x118
+
+Note 1: this are the VESA mode numbers.  The video mode select code
+        expects 0x200 + VESA mode number.
+Note 2: lilo can't handle hex, for booting with "vga=??" you have to
+        transform the numbers to decimal.
+
+
+Speed it up!
+============
+
+Check /usr/src/linux/Documentation/mtrr.txt, enabling write-combining
+for the framebuffer memory gives a performance boost.
+
+There are two ways to do console scrolling: redraw the screen
+completely, or by copying around the video memory.  You can select one
+of them using the kernel command line: video=vesa:redraw or
+video=vesa:memmove.  redraw is the default, becauce this one works
+faster on my box.
+
+
+Have fun!
+
+  Gerd
+
+--
+Gerd Knorr <kraxel@cs.tu-berlin.de>
diff -u --recursive --new-file v2.1.106/linux/Documentation/filesystems/00-INDEX linux/Documentation/filesystems/00-INDEX
--- v2.1.106/linux/Documentation/filesystems/00-INDEX	Sun Jun  7 11:16:25 1998
+++ linux/Documentation/filesystems/00-INDEX	Wed Jun 24 14:30:07 1998
@@ -9,20 +9,20 @@
 hpfs.txt
 	- info and mount options for the OS/2 HPFS.
 isofs.txt
-	- info and mount options for the ISO9660 (CDROM) filesystem.
+	- info and mount options for the ISO 9660 (CDROM) filesystem.
 ncpfs.txt
 	- info on Novell Netware(tm) filesystem using NCP protocol.
 ntfs.txt
-	- info and mount options for the NTFS filesystem (Win NT).
+	- info and mount options for the NTFS filesystem (Windows NT).
 romfs.txt
 	- Description of the ROMFS filesystem.
 smbfs.txt
-	- info on using filesystems with the SMB protocol (Win 3.11, Win NT)
+	- info on using filesystems with the SMB protocol (Windows 3.11 and NT)
 sysv-fs.txt
 	- info on the SystemV/Coherent filesystem.
 umsdos.txt
 	- info on the umsdos extensions to the msdos filesystem.
 vfat.txt
-	- info on using the VFAT filesystem used in Win NT and Win 95
+	- info on using the VFAT filesystem used in Windows NT and Windows 95
 vfs.txt
 	- Overview of the Virtual File System
diff -u --recursive --new-file v2.1.106/linux/Documentation/filesystems/affs.txt linux/Documentation/filesystems/affs.txt
--- v2.1.106/linux/Documentation/filesystems/affs.txt	Fri May  8 23:14:41 1998
+++ linux/Documentation/filesystems/affs.txt	Wed Jun 24 14:30:07 1998
@@ -1,8 +1,8 @@
-Amiga filesystems Overview
-==========================
+Overview of Amiga Filesystems
+=============================
 
 Not all varieties of the Amiga filesystems are supported for reading and
-writing. The Amiga currently knows 6 different filesystems:
+writing. The Amiga currently knows six different filesystems:
 
 DOS\0		The old or original filesystem, not really suited for
 		hard disks and normally not used on them, either.
@@ -67,7 +67,7 @@
 		be written to the syslog when the filesystem is mounted.
 
 mufs		The filesystem is really a muFS, also it doesn't
-		identify itself as one. This option is neccessary if
+		identify itself as one. This option is necessary if
 		the filesystem wasn't formatted as muFS, but is used
 		as one.
 
@@ -99,9 +99,9 @@
 
 User id and group id will be used unless set[gu]id are given as mount
 options. Since most of the Amiga file systems are single user systems
-they will be owned by root. The root directory of the Amiga filesystem
-(i. e. the mount point) will be owned by the user who actually mounts
-the filesystem (the root directory doesn't have uid/gid fields).
+they will be owned by root. The root directory (the mount point) of the
+Amiga filesystem will be owned by the user who actually mounts the
+filesystem (the root directory doesn't have uid/gid fields).
 
 Linux -> Amiga:
 
@@ -116,7 +116,7 @@
   - All other flags (suid, sgid, ...) are ignored and will
     not be retained.
     
-Newly created files and directories will get the user and group id
+Newly created files and directories will get the user and group ID
 of the current user and a mode according to the umask.
 
 Symbolic links
@@ -126,7 +126,7 @@
 are some, not always subtle, differences. One of them becomes apparent
 with symbolic links. While Linux has a file system with exactly one
 root directory, the Amiga has a separate root directory for each
-file system (e.g. partition, floppy disk, ...). With the Amiga,
+file system (for example, partition, floppy disk, ...). With the Amiga,
 these entities are called "volumes". They have symbolic names which
 can be used to access them. Thus, symbolic links can point to a
 different volume. AFFS turns the volume name into a directory name
diff -u --recursive --new-file v2.1.106/linux/Documentation/filesystems/coda.txt linux/Documentation/filesystems/coda.txt
--- v2.1.106/linux/Documentation/filesystems/coda.txt	Sat May  2 14:19:51 1998
+++ linux/Documentation/filesystems/coda.txt	Wed Jun 24 14:30:07 1998
@@ -1,4 +1,3 @@
-
 NOTE: 
 This is one of the technical documents describing a component of
 Coda -- this document describes the client kernel-Venus interface.
@@ -9,7 +8,7 @@
   ftp://ftp.coda.cs.cmu.edu
 
 To run Coda you need to get a user level cache manager for the client,
-named Venus, as well as tools to manipulate ACL's, to log in etc.  The
+named Venus, as well as tools to manipulate ACLs, to log in, etc.  The
 client needs to have the Coda filesystem selected in the kernel
 configuration.
 
@@ -27,7 +26,7 @@
   v1.0, Nov 9, 1997
 
   This document describes the communication between Venus and kernel
-  level file system code needed for the operation of the Coda filesys-
+  level filesystem code needed for the operation of the Coda file sys-
   tem.  This document version is meant to describe the current interface
   (version 1.0) as well as improvements we envisage.
   ______________________________________________________________________
@@ -177,7 +176,7 @@
   The interface between the kernel and Venus is very similar to the BSD
   VFS interface.  Similar functionality is provided, and the format of
   the parameters and returned data is very similar to the BSD VFS.  This
-  leads to an almost natural environment for implementing a kernel level
+  leads to an almost natural environment for implementing a kernel-level
   filesystem driver for Coda in a BSD system.  However, other operating
   systems such as Linux and Windows 95 and NT have virtual filesystem
   with different interfaces.
@@ -359,7 +358,7 @@
   33..11..  IImmpplleemmeennttaattiioonn ddeettaaiillss
 
   The Unix implementation of this mechanism has been through the
-  implemenation of a character device associated with Coda.  Venus
+  implementation of a character device associated with Coda.  Venus
   retrieves messages by doing a read on the device, replies are sent
   with a write and notification is through the select system call on the
   file descriptor for the device.  The process P is kept waiting on an
@@ -369,7 +368,7 @@
   call is used.  The DeviceIoControl call is designed to copy buffers
   from user memory to kernel memory with OPCODES. The sendmsg_to_kernel
   is issued as a synchronous call, while the getmsg_from_kernel call is
-  asynchrounous.  Windows EventObjects are used for notification of
+  asynchronous.  Windows EventObjects are used for notification of
   message arrival.  The process P is kept waiting on a KernelEvent
   object in NT and a semaphore in Windows 95.
 
@@ -429,7 +428,7 @@
   for the Windows environment when these mature.
 
   struct CodaCred {
-      vuid_t cr_uid, cr_euid, cr_suid, cr_fsuid; /* Real, efftve, set, fs uid*/
+      vuid_t cr_uid, cr_euid, cr_suid, cr_fsuid; /* Real, effective, set, fs uid*/
       vgid_t cr_gid, cr_egid, cr_sgid, cr_fsgid; /* same for groups */
       vgid_t cr_groups[NGROUPS];        /* Group membership for caller */
   };
@@ -514,7 +513,7 @@
 
   Coda specific requests can be made by application through the pioctl
   interface. The pioctl is implemented as an ordinary ioctl on a
-  ficticious file /coda/.CONTROL.  The pioctl call opens this file, gets
+  fictitious file /coda/.CONTROL.  The pioctl call opens this file, gets
   a file handle and makes the ioctl call. Finally it closes the file.
 
   The kernel involvement in this is limited to providing the facility to
@@ -721,7 +720,7 @@
   access will be granted.  It is important to remember that Coda uses
   ACLs to enforce protection and that ultimately the servers, not the
   clients enforce the security of the system.  The result of this call
-  will depend on wether a _t_o_k_e_n is held by the user.
+  will depend on whether a _t_o_k_e_n is held by the user.
 
   EErrrroorrss The object may not exist, or the ACL describing the protection
   may not be accessible.
@@ -765,7 +764,7 @@
   are set by converting the CodaCred to a uid using a macro CRTOUID
   (this macro is platform dependent).  Upon success the VFid and
   attributes of the file are returned.  The Coda FS Driver will normally
-  instantiate a vnode, inode or filehandle at kernel level for the new
+  instantiate a vnode, inode or file handle at kernel level for the new
   object.
 
 
@@ -780,7 +779,7 @@
   to return a file descriptor. The trunctate and exclusive options,
   together with the mode, could simply be part of the mode as it is
   under Unix.  There should be no flags argument; this is used in open
-  (2) to return a filedescriptor for READ or WRITE mode.
+  (2) to return a file descriptor for READ or WRITE mode.
 
   The attributes of the directory should be returned too, since the size
   and mtime changed.
@@ -1221,7 +1220,7 @@
 
   DDeessccrriippttiioonn Ask Venus to update RVM attributes of object VFid. This
   should be called as part of kernel level fsync type calls.  The
-  result indicates if the synching was successful.
+  result indicates if the syncing was successful.
 
   EErrrroorrss
 
diff -u --recursive --new-file v2.1.106/linux/Documentation/filesystems/fat_cvf.txt linux/Documentation/filesystems/fat_cvf.txt
--- v2.1.106/linux/Documentation/filesystems/fat_cvf.txt	Sat May  2 14:19:51 1998
+++ linux/Documentation/filesystems/fat_cvf.txt	Wed Jun 24 14:30:07 1998
@@ -20,7 +20,7 @@
 example, are Microsoft's Doublespace/Drivespace and Stac's Stacker.
 Using the CVF-FAT interface, it is possible to load a module that handles
 all the low-level disk access that has to do with on-the-fly compression
-and decompression. All other part of FAT filesystem access is still handled
+and decompression. Any other part of FAT filesystem access is still handled
 by the FAT, MSDOS or VFAT or even UMSDOS driver.
 
 CVF access works by redirecting certain low-level routines from the FAT
@@ -46,16 +46,16 @@
   might be persuaded to implement it :). CVF-FAT is already prepared
   for using readpage.
   
-- DOSEMU users attention 
+- attention, DOSEmu users 
 
-  You may have to unmount all CVF partitions before running DOSEMU depending 
-  on your configuration. If DOSEMU is configured to use wholedisk or 
-  partition access (this is often the case to let DOSEMU access 
+  You may have to unmount all CVF partitions before running DOSEmu depending 
+  on your configuration. If DOSEmu is configured to use wholedisk or 
+  partition access (this is often the case to let DOSEmu access 
   compressed partitions) there's a risk of destroying your compressed 
   partitions or crashing your system because of confused drivers.
   
   Note that it is always safe to redirect the compressed partitions with 
-  lredir or emufs.sys. Refer to the DOSEMU documentation for details.
+  lredir or emufs.sys. Refer to the DOSEmu documentation for details.
 
 
 3. Mount options
@@ -88,7 +88,7 @@
 ------------------------------------------------------------------------------
 
 Assuming you want to write your own CVF module, you need to write a lot of
-interface funtions. Most of them are covered in the kernel documentation
+interface functions. Most of them are covered in the kernel documentation
 you can find on the net, and thus won't be described here. They have been
 marked with "[...]" :-) Take a look at include/linux/fat_cvf.h.
 
@@ -169,7 +169,7 @@
   call this function to introduce your CVF format to the FAT/CVF-FAT
   driver. This is usually done in init_module. Be sure to check the
   return value. Zero means success, everything else causes a kernel
-  message printed in the syslog describing the error that occured.
+  message printed in the syslog describing the error that occurred.
   Typical errors are:
     - a module with the same version id is already registered or 
     - too many CVF formats. Hack fs/fat/cvf.c if you need more.
diff -u --recursive --new-file v2.1.106/linux/Documentation/filesystems/hpfs.txt linux/Documentation/filesystems/hpfs.txt
--- v2.1.106/linux/Documentation/filesystems/hpfs.txt	Sun Dec 17 01:17:20 1995
+++ linux/Documentation/filesystems/hpfs.txt	Wed Jun 24 14:30:07 1998
@@ -5,7 +5,7 @@
   uid=nnn	All files in the partition will be owned by user id nnn.
   gid=nnn	All files in the partition will be in group nnn.
   umask=nnn	The permission mask (see umask(1)) for the partition.
-  conv=binary   Data is returned exactly as is, with CRLF's.  [default]
+  conv=binary   Data is returned exactly as is, with CRLFs.  [default]
   conv=text     (Carriage return, line feed) is replaced with newline.
   conv=auto     Chooses, file by file, conv=binary or conv=text (by guessing)
 
diff -u --recursive --new-file v2.1.106/linux/Documentation/filesystems/isofs.txt linux/Documentation/filesystems/isofs.txt
--- v2.1.106/linux/Documentation/filesystems/isofs.txt	Tue Jun 23 10:01:18 1998
+++ linux/Documentation/filesystems/isofs.txt	Wed Jun 24 14:30:07 1998
@@ -13,17 +13,17 @@
 		utf8 option.
   utf8          Encode Unicode names in UTF8 format. Default is no.
 
-Mount options that are unique to the isofs filesystem.
+Mount options unique to the isofs filesystem.
   block=512     Set the block size for the disk to 512 bytes
   block=1024    Set the block size for the disk to 1024 bytes
   block=2048    Set the block size for the disk to 2048 bytes
   check=relaxed Matches filenames with different cases
   check=strict  Matches only filenames with the exact same case
   cruft         Try to handle badly formatted CDs.
-  map=off       Do not map non-rockridge filenames to lowercase
-  map=normal    Map non-rockridge filenames to lowecase
+  map=off       Do not map non-Rock Ridge filenames to lower case
+  map=normal    Map non-Rock Ridge filenames to lower case
   map=acorn     As map=normal but also apply Acorn extensions if present
   mode=xxx      Sets the permissions on files to xxx
   nojoliet      Ignore Joliet extensions if they are present.
-  norock        Ignore rockridge extensions if they are present.
+  norock        Ignore Rock Ridge extensions if they are present.
   unhide        Show hidden files.
diff -u --recursive --new-file v2.1.106/linux/Documentation/filesystems/romfs.txt linux/Documentation/filesystems/romfs.txt
--- v2.1.106/linux/Documentation/filesystems/romfs.txt	Sat May  2 14:19:51 1998
+++ linux/Documentation/filesystems/romfs.txt	Wed Jun 24 14:30:07 1998
@@ -1,7 +1,6 @@
-
 ROMFS - ROM FILE SYSTEM
 
-This is a quite dumb, read only filesystem, mainly for initial ram
+This is a quite dumb, read only filesystem, mainly for initial RAM
 disks of installation disks.  It has grown up by the need of having
 modules linked at boot time.  Using this filesystem, you get a very
 similar feature, and even the possibility of a small kernel, with a
@@ -29,13 +28,13 @@
 which has only this filesystem linked in, and then can load any module
 later, with the current module utilities.  It can also be used to run
 some program to decide if you need SCSI devices, and even IDE or
-floppy drives can be loaded later if you use the "initrd" -- initial
-ram disk -- feature of the kernel.  This would not be really news
+floppy drives can be loaded later if you use the "initrd"--initial
+RAM disk--feature of the kernel.  This would not be really news
 flash, but with romfs, you can even spare off your ext2 or minix or
 maybe even affs filesystem until you really know that you need it.
 
 For example, a distribution boot disk can contain only the cd disk
-drivers (and possibly the SCSI drivers), and the ISO filesystem
+drivers (and possibly the SCSI drivers), and the ISO 9660 filesystem
 module.  The kernel can be small enough, since it doesn't have other
 filesystems, like the quite large ext2fs module, which can then be
 loaded off the CD at a later stage of the installation.  Another use
@@ -148,7 +147,7 @@
 features and code, because the primary and most important advantage of
 this file system is the small code.  On the other hand, don't be
 alarmed, I'm not getting that much romfs related mail.  Now I can
-understand why Avery wrote poems in the arcnet docs to get some more
+understand why Avery wrote poems in the ARCnet docs to get some more
 feedback. :)
 
 romfs has also a mailing list, and to date, it hasn't received any
@@ -167,7 +166,7 @@
 one would want to write _anything_ to a file system, he still needs
 a writable file system, thus negating the size advantages.  Possible
 solutions: implement write access as a compile-time option, or a new,
-similarly small writable filesystem for ram disks.
+similarly small writable filesystem for RAM disks.
 
 - Since the files are only required to have alignment on a 16 byte
 boundary, it is currently possibly suboptimal to read or execute files
diff -u --recursive --new-file v2.1.106/linux/Documentation/filesystems/vfat.txt linux/Documentation/filesystems/vfat.txt
--- v2.1.106/linux/Documentation/filesystems/vfat.txt	Sat May  2 14:19:51 1998
+++ linux/Documentation/filesystems/vfat.txt	Wed Jun 24 14:30:07 1998
@@ -34,7 +34,7 @@
 posix=<bool>  -- Allow names of same letters, different case such as
                  'LongFileName' and 'longfilename' to coexist.  This has some
                  problems currently because 8.3 conflicts are not handled
-                 correctly for Posix filesystem compliance.
+                 correctly for POSIX filesystem compliance.
 nonumtail=<bool> -- When creating 8.3 aliases, normally the alias will
                  end in '~1' or tilde followed by some number.  If this
                  option is set, then if the filename is 
@@ -61,7 +61,7 @@
   a get next directory entry approach.  The only thing left that uses
   raw scanning is the directory renaming code.
 
-* Fix the Posix filesystem support to work in 8.3 space.  This involves
+* Fix the POSIX filesystem support to work in 8.3 space.  This involves
   renaming aliases if a conflict occurs between a new filename and
   an old alias.  This is quite a mess.
 
diff -u --recursive --new-file v2.1.106/linux/Documentation/filesystems/vfs.txt linux/Documentation/filesystems/vfs.txt
--- v2.1.106/linux/Documentation/filesystems/vfs.txt	Thu May  7 22:51:46 1998
+++ linux/Documentation/filesystems/vfs.txt	Wed Jun 24 14:30:07 1998
@@ -2,22 +2,22 @@
 ===========================================
 	by Benjamin LaHaise (blah@dot.superaje.com)
 
-Noone else seems to be writing this, so here's a quick description of what
-I've learned while writing lofs...
+No one else seems to be writing this, so here's a quick description of what
+I've learned while writing lofs.
 
 The VFS is relatively simple, but it is nice not to have to browse through
 pages of code to determine what is expected when writing a filesystem.
-Hopefully this helps anyone attempting such a feat, as well as clearing up
-a few important points/dependencies.
+This document is meant to help anyone attempting such a feat, and to clarify 
+a few important points and dependencies.
 
 register_filesystem (struct file_system_type *fstype)
 =====================================================
 
-All filesystems are created equal... or at least they start out that way.
-A filesystem, be it in module form, or linked into the kernel, needs to add
+All filesystems are created equal, or at least they start out that way.
+A filesystem, whether in module form or linked into the kernel, needs to add
 itself to the table of filesystems by calling register_filesystem with an
 initialized file_system_type structure.  Any further functions of the
-filesystem are accessed through the following function tables...
+filesystem are accessed through the following function tables:
 
 
 struct file_system_type
@@ -101,8 +101,8 @@
 	int (*lookup) (struct inode *dir, const char *name, int len, struct inode **result);
 	[optional]
 		lookup is called when the VFS wishes to have the filesystem resolve a name
-		into an inode.  Dir is a directory on the filesystem that [hopefully] contains
-		the zero terminated string name (length len).  A return value of zero indicates
+		into an inode.  Dir is a directory on the filesystem that--we hope--contains
+		the zero-terminated string name (length len).  A return value of zero indicates
 		that there is a valid inode stored in *result.
 
 ***		Note: lofs assumes that any filesystem returns an inode within the filesystem
diff -u --recursive --new-file v2.1.106/linux/Documentation/hayes-esp.txt linux/Documentation/hayes-esp.txt
--- v2.1.106/linux/Documentation/hayes-esp.txt	Sun Jun  7 11:16:25 1998
+++ linux/Documentation/hayes-esp.txt	Wed Jun 24 14:34:44 1998
@@ -28,7 +28,7 @@
 Features:
 
 - Uses the enhanced mode of the ESP card, allowing a wider range of
-  interrupts and features than compatibilty mode
+  interrupts and features than compatibility mode
 - Uses DMA and 16 bit PIO mode to transfer data to and from the ESP's FIFOs,
   reducing CPU load
 - Supports primary and secondary ports
@@ -71,12 +71,12 @@
 
 The dma= option can be used to set the DMA channel.  The channel can be either
 1 or 3.  Specifying any other value will force the driver to use PIO mode.
-For example, to set the dma channel to 3, the insmod command would be:
+For example, to set the DMA channel to 3, the insmod command would be:
 
 insmod esp dma=3
 
 The rx_trigger= and tx_trigger= options can be used to set the FIFO trigger
-levels.  They specifie when the ESP card should send an interrupt.  Larger
+levels.  They specify when the ESP card should send an interrupt.  Larger
 values will decrease the number of interrupts; however, a value too high may
 result in data loss.  Valid values are 1 through 1023, with 768 being the
 default.  For example, to set the receive trigger level to 512 bytes and the
diff -u --recursive --new-file v2.1.106/linux/Documentation/initrd.txt linux/Documentation/initrd.txt
--- v2.1.106/linux/Documentation/initrd.txt	Sun Jun  7 11:16:25 1998
+++ linux/Documentation/initrd.txt	Wed Jun 24 14:30:07 1998
@@ -84,7 +84,7 @@
     the intermediate step of going via initrd adds a little speed
     advantage and it allows the use of a compressed file system.
     Also, together with LOADLIN you may load the RAM disk directly from
-    CDrom or disk, hence having a floppyless boot from CD,
+    CDROM or disk, hence having a floppyless boot from CD,
     e.g.: E:\loadlin E:\bzImage root=/dev/ram initrd=E:\rdimage
 
 
@@ -256,9 +256,9 @@
 dialog and it can also perform some sanity checks (or even some form of
 auto-detection).
 
-Last not least, CDrom distributors may use it for better installation from CD,
-either using a LILO boot floppy and bootstrapping a bigger ramdisk via
-initrd from CD, or using LOADLIN to directly load the ramdisk from CD
+Last not least, CDROM distributors may use it for better installation from CD,
+either using a LILO boot floppy and bootstrapping a bigger RAM disk via
+initrd from CD, or using LOADLIN to directly load the RAM disk from CD
 without need of floppies.
 
 Since initrd is a fairly generic mechanism, it is likely that additional
diff -u --recursive --new-file v2.1.106/linux/Documentation/kmod.txt linux/Documentation/kmod.txt
--- v2.1.106/linux/Documentation/kmod.txt	Sat May  2 14:19:51 1998
+++ linux/Documentation/kmod.txt	Wed Jun 24 14:30:07 1998
@@ -34,8 +34,8 @@
 
 If kerneld worked, why replace it?
 
-- kerneld used sysv ipc, which can now be made into a module.  Besides,
-  sysv ipc is ugly and should therefore be avoided (well, certainly for
+- kerneld used SysV IPC, which can now be made into a module.  Besides,
+  SysV IPC is ugly and should therefore be avoided (well, certainly for
   kernel level stuff)
 
 - both kmod and kerneld end up doing the same thing (calling modprobe),
@@ -44,4 +44,4 @@
 - removing kerneld related stuff from ipc/msg.c made it 40% smaller
 
 - kmod reports errors through the normal kernel mechanisms, which avoids
-  the chicken and egg problem of kerneld and modular unix domain sockets
+  the chicken and egg problem of kerneld and modular Unix domain sockets
diff -u --recursive --new-file v2.1.106/linux/Documentation/m68k/framebuffer.txt linux/Documentation/m68k/framebuffer.txt
--- v2.1.106/linux/Documentation/m68k/framebuffer.txt	Sun Jun  7 11:16:25 1998
+++ linux/Documentation/m68k/framebuffer.txt	Wed Dec 31 16:00:00 1969
@@ -1,330 +0,0 @@
-
-		The Linux/m68k Frame Buffer Device
-		----------------------------------
-
-Maintained by Geert Uytterhoeven (Geert.Uytterhoeven@cs.kuleuven.ac.be)
-Last revised: January 24, 1998
-
-
-0. Introduction
----------------
-
-The frame buffer device provides an abstraction for the graphics hardware. It
-represents the frame buffer of some video hardware and allows application
-software to access the graphics hardware through a well-defined interface, so
-the software doesn't need to know anything about the low-level (hardware
-register) stuff.
-
-The device is accessed through special device nodes, usually located in the
-/dev directory, i.e. /dev/fb*.
-
-
-1. User's View of /dev/fb*
---------------------------
-
-From the user's point of view, the frame buffer device looks just like any
-other device in /dev. It's a character device using major 29; the minor
-specifies the frame buffer number.
-
-By convention, the following device nodes are used (numbers indicate the device
-minor numbers):
-
-      0 = /dev/fb0	First frame buffer
-     32 = /dev/fb1	Second frame buffer
-	  ...
-    224 = /dev/fb7	8th frame buffer
-
-For backwards compatibility, you may want to create the following symbolic
-links:
-
-    /dev/fb0current -> fb0
-    /dev/fb1current -> fb1
-
-and so on...
-
-The frame buffer devices are also `normal' memory devices, this means, you can
-read and write their contents. You can, for example, make a screen snapshot by
-
-  cp /dev/fb0 myfile
-
-There also can be more than one frame buffer at a time, e.g. if you have a
-graphics card in addition to the built-in hardware. The corresponding frame
-buffer devices (/dev/fb0 and /dev/fb1 etc.) work independently.
-
-Application software that uses the frame buffer device (e.g. the X server) will
-use /dev/fb0 by default (older software uses /dev/fb0current). You can specify
-an alternative frame buffer device by setting the environment variable
-$FRAMEBUFFER to the path name of a frame buffer device, e.g. (for sh/bash
-users):
-
-    export FRAMEBUFFER=/dev/fb1
-
-or (for csh users):
-
-    setenv FRAMEBUFFER /dev/fb1
-
-After this the X server will use the second frame buffer.
-
-
-2. Programmer's View of /dev/fb*
---------------------------------
-
-As you already know, a frame buffer device is a memory device like /dev/mem and
-it has the same features. You can read it, write it, seek to some location in
-it and mmap() it (the main usage). The difference is just that the memory that
-appears in the special file is not the whole memory, but the frame buffer of
-some video hardware.
-
-/dev/fb* also allows several ioctls on it, by which lots of information about
-the hardware can be queried and set. The color map handling works via ioctls,
-too. Look into <linux/fb.h> for more information on what ioctls exist and on
-which data structures they work. Here's just a brief overview:
-
-  - You can request unchangeable information about the hardware, like name,
-    organization of the screen memory (planes, packed pixels, ...) and address
-    and length of the screen memory.
-
-  - You can request and change variable information about the hardware, like
-    visible and virtual geometry, depth, color map format, timing, and so on.
-    If you try to change that information, the driver maybe will round up some
-    values to meet the hardware's capabilities (or return EINVAL if that isn't
-    possible).
-
-  - You can get and set parts of the color map. Communication is done with 16
-    bits per color part (red, green, blue, transparency) to support all 
-    existing hardware. The driver does all the computations needed to apply 
-    it to the hardware (round it down to less bits, maybe throw away 
-    transparency).
-
-All this hardware abstraction makes the implementation of application programs
-easier and more portable. E.g. the X server works completely on /dev/fb* and
-thus doesn't need to know, for example, how the color registers of the concrete
-hardware are organized. XF68_FBDev is a general X server for bitmapped,
-unaccelerated video hardware. The only thing that has to be built into
-application programs is the screen organization (bitplanes or chunky pixels
-etc.), because it works on the frame buffer image data directly.
-
-For the future it is planned that frame buffer drivers for graphics cards and
-the like can be implemented as kernel modules that are loaded at runtime. Such
-a driver just has to call register_framebuffer() and supply some functions.
-Writing and distributing such drivers independently from the kernel will save
-much trouble...
-
-
-3. Frame Buffer Resolution Maintenance
---------------------------------------
-
-Frame buffer resolutions are maintained using the utility `fbset'. It can
-change the video mode properties of the current resolution. Its main usage is
-to change the current video mode, e.g. during boot up in one of your /etc/rc.*
-or /etc/init.d/* files.
-
-Fbset uses a video mode database stored in a configuration file, so you can
-easily add your own modes and refer to them with a simple identifier.
-
-
-4. The X Server
----------------
-
-The X server (XF68_FBDev) is the most notable application program for the frame
-buffer device. The current X server is part of the XFree86/XFree68 release
-3.3.1 package and has 2 modes:
-
-  - If the `Display' subsection for the `fbdev' driver in the /etc/XF86Config
-    file contains a
-
-	Modes "default"
-
-    line, the X server will use the scheme discussed above, i.e. it will start
-    up in the resolution determined by /dev/fb0current (or $FRAMEBUFFER, if
-    set). This is the default for the configuration file supplied with XFree68
-    3.2. It's the most simple configuration (and the only possible one if you
-    want to have a broadcast compatible display, e.g. PAL or NTSC), but it has
-    some limitations.
-
-  - Therefore it's also possible to specify resolutions in the /etc/XF86Config
-    file. This allows for on-the-fly resolution switching while retaining the
-    same virtual desktop size. The frame buffer device that's used is still
-    /dev/fb0current (or $FRAMEBUFFER), but the available resolutions are
-    defined by /etc/XF86Config now. The disadvantage is that you have to
-    specify the timings in a different format (but `fbset -x' may help) and
-    that you can't have a broadcast compatible display (e.g. no PAL or NTSC).
-
-To tune a video mode, you can use fbset or xvidtune. Note that xvidtune doesn't
-work 100% with XF68_FBDev: the reported clock values are always incorrect.
-
-There exists also an accelerated X server for the Cybervision 64 graphics
-board, but that's not discussed here.
-
-
-5. Video Mode Timings
----------------------
-
-A monitor draws an image on the screen by using an electron beam (3 electron
-beams for most color models, 1 electron beam for Trinitron color monitors and
-monochrone monitors). The front of the screen is covered by a pattern of
-colored phospors (pixels). If a phospor is hit by an electron, it emits a
-photon and thus becomes visible.
-
-The electron beam draws horizontal lines (scanlines) from left to right, and
-from the top to the bottom of the screen. By modifying the intensity of the
-electron beam, pixels with various colors and intensities can be shown.
-
-After each scanline the electron beam has to move back to the left side of the
-screen and to the next line: this is called the horizontal retrace. After the
-whole screen (frame) was painted, the beam moves back to the upper left corner:
-this is called the vertical retrace. During both the horizontal and vertical
-retrace, the electron beam is turned off (blanked).
-
-The speed at which the electron beam paints the pixels is determined by the
-dotclock in the graphics board. For a dotclock of e.g. 28.37516 MHz (millions
-of cycles per second), each pixel is 35242 ps (picoseconds) long:
-
-    1/(28.37516E6 Hz) = 35.242E-9 s
-
-If the screen resolution is 640x480, it will take
-
-    640*35.242E-9 s = 22.555E-6 s
-
-to paint the 640 (xres) pixels on one scanline. But the horizontal retrace
-also takes time (e.g. 272 `pixels'), so a full scanline takes
-
-    (640+272)*35.242E-9 s = 32.141E-6 s
-
-We'll say that the horizontal scanrate is about 31 kHz:
-
-    1/(32.141E-6 s) = 31.113E3 Hz
-
-A full screen counts 480 (yres) lines, but we have to consider the vertical
-retrace too (e.g. 49 `pixels'). So a full screen will take
-
-    (480+49)*32.141E-6 s = 17.002E-3 s
-
-The vertical scanrate is about 59 Hz:
-
-    1/(17.002E-3 s) = 58.815 Hz
-
-This means the screen data is refreshed about 59 times per second. To have a
-stable picture without visible flicker, VESA recommends a vertical scanrate of
-at least 72 Hz. But the perceived flicker is very human dependent: some people
-can use 50 Hz without any trouble, while I'll notice if it's less than 80 Hz.
-
-Since the monitor doesn't know when a new scanline starts, the graphics board
-will supply a synchronization pulse (horizontal sync or hsync) for each
-scanline.  Similarly it supplies a synchronization pulse (vertical sync or
-vsync) for each new frame. The position of the image on the screen is
-influenced by the moments at which the synchronization pulses occur.
-
-The following picture summarizes all timings. The horizontal retrace time is
-the sum of the left margin, the right margin and the hsync length, while the
-vertical retrace time is the sum of the upper margin, the lower margin and the
-vsync length.
-
-  +----------+---------------------------------------------+----------+-------+
-  |          |                ^                            |          |       |
-  |          |                |upper_margin                |          |       |
-  |          |                ¥                            |          |       |
-  +----------###############################################----------+-------+
-  |          #                ^                            #          |       |
-  |          #                |                            #          |       |
-  |          #                |                            #          |       |
-  |          #                |                            #          |       |
-  |   left   #                |                            #  right   | hsync |
-  |  margin  #                |       xres                 #  margin  |  len  |
-  |<-------->#<---------------+--------------------------->#<-------->|<----->|
-  |          #                |                            #          |       |
-  |          #                |                            #          |       |
-  |          #                |                            #          |       |
-  |          #                |yres                        #          |       |
-  |          #                |                            #          |       |
-  |          #                |                            #          |       |
-  |          #                |                            #          |       |
-  |          #                |                            #          |       |
-  |          #                |                            #          |       |
-  |          #                |                            #          |       |
-  |          #                |                            #          |       |
-  |          #                |                            #          |       |
-  |          #                ¥                            #          |       |
-  +----------###############################################----------+-------+
-  |          |                ^                            |          |       |
-  |          |                |lower_margin                |          |       |
-  |          |                ¥                            |          |       |
-  +----------+---------------------------------------------+----------+-------+
-  |          |                ^                            |          |       |
-  |          |                |vsync_len                   |          |       |
-  |          |                ¥                            |          |       |
-  +----------+---------------------------------------------+----------+-------+
-
-The frame buffer device expects all horizontal timings in number of dotclocks
-(in picoseconds, 1E-12 s), and vertical timings in number of scanlines.
-
-
-6. Converting XFree86 timing values info frame buffer device timings
---------------------------------------------------------------------
-
-An XFree86 mode line consists of the following fields:
- "800x600"     50      800  856  976 1040    600  637  643  666
- < name >     DCF       HR  SH1  SH2  HFL     VR  SV1  SV2  VFL
-
-The frame buffer device uses the following fields:
-
-  - pixclock: pixel clock in ps (pico seconds)
-  - left_margin: time from sync to picture
-  - right_margin: time from picture to sync
-  - upper_margin: time from sync to picture
-  - lower_margin: time from picture to sync
-  - hsync_len: length of horizontal sync
-  - vsync_len: length of vertical sync
-
-1) Pixelclock:
-   xfree: in MHz
-   fb: In Picoseconds (ps)
-
-   pixclock = 1000000 / DCF
-
-2) horizontal timings:
-   left_margin = HFL - SH2
-   right_margin = SH1 - HR
-   hsync_len = SH2 - SH1
-
-3) vertical timings:
-   upper_margin = VFL - SV2
-   lower_margin = SV1 - VR
-   vsync_len = SV2 - SV1
-
-Good examples for VESA timings can be found in the XFree86 source tree,
-under "xc/programs/Xserver/hw/xfree86/doc/modeDB.txt".
-
-
-7. References
--------------
-
-For more specific information about the frame buffer device and its
-applications, please refer to the following documentation:
-
-  - The manual pages for fbset: fbset(8), fb.modes(5)
-  - The manual pages for XFree68: XF68_FBDev(1), XF86Config(4/5)
-  - The mighty kernel sources:
-      o linux/include/linux/fb.h
-      o linux/drivers/char/fbmem.c
-      o linux/drivers/video/*fb.c
-
-
-8. Downloading
---------------
-
-All necessary files can be found at
-
-    ftp://ftp.uni-erlangen.de/pub/Linux/680x0/
-
-and on its mirrors.
-
-  
-9. Credits                                                       
-----------                                                       
-                
-This readme was written by Geert Uytterhoeven, partly based on the original
-`X-framebuffer.README' by Roman Hodek and Martin Schaller. Section 6 was
-provided by Frank Neumann.
-
-The frame buffer device abstraction was designed by Martin Schaller.
diff -u --recursive --new-file v2.1.106/linux/Documentation/mca.txt linux/Documentation/mca.txt
--- v2.1.106/linux/Documentation/mca.txt	Sat May  2 14:19:51 1998
+++ linux/Documentation/mca.txt	Wed Jun 24 14:30:07 1998
@@ -159,12 +159,12 @@
 3) 3c523
 	drivers/net/3c523.c
 	drivers/net/3c523.h
-   3Com 3c523 Etherlink/MC ethernet driver.
+   3Com 3c523 Etherlink/MC Ethernet driver.
 
 4) SMC Ultra/MCA
 	drivers/net/smc-mca.c
 	drivers/net/smc-mca.h
-	Elite/A (8013EP/A) and Elite10T/A (8013WP/A) ethernet driver
+	Elite/A (8013EP/A) and Elite10T/A (8013WP/A) Ethernet driver
 
 As well, drivers/char/psaux.c was modified to support IRQ sharing (it's
 #ifdef CONFIG_MCA'ed, for your convenience, although PCI users might be
diff -u --recursive --new-file v2.1.106/linux/Documentation/networking/framerelay.txt linux/Documentation/networking/framerelay.txt
--- v2.1.106/linux/Documentation/networking/framerelay.txt	Fri May 31 03:35:27 1996
+++ linux/Documentation/networking/framerelay.txt	Wed Jun 24 14:34:44 1998
@@ -8,8 +8,8 @@
 As such, a separate device is needed to accommodate the routing.  Within the
 net-tools archives is 'dlcicfg'.  This program will communicate with the
 base "DLCI" device, and create new net devices named 'dlci00', 'dlci01'... 
-The configuration script will ask you how many DLCI's you need, as well as
-how many DLCI's you want to assign to each Frame Relay Access Device (FRAD).
+The configuration script will ask you how many DLCIs you need, as well as
+how many DLCIs you want to assign to each Frame Relay Access Device (FRAD).
 
 The DLCI uses a number of function calls to communicate with the FRAD, all
 of which are stored in the FRAD's private data area.  assoc/deassoc, 
diff -u --recursive --new-file v2.1.106/linux/Documentation/networking/sktr.txt linux/Documentation/networking/sktr.txt
--- v2.1.106/linux/Documentation/networking/sktr.txt	Wed Dec 31 16:00:00 1969
+++ linux/Documentation/networking/sktr.txt	Wed Jun 24 14:26:12 1998
@@ -0,0 +1,147 @@
+Text file for the Linux SysKonnect Token Ring ISA/PCI Adapter Driver.
+	Text file by: Jay Schulist <jschlst@samba.anu.edu.au>
+
+The Linux SysKonnect Token Ring driver works with the SysKonnect TR4/16(+) ISA,
+SysKonnect TR4/16(+) PCI, SysKonnect TR4/16 PCI, and older revisions of the
+SK NET TR4/16 ISA card.
+
+Latest information on this driver can be obtained on the Linux-SNA WWW site.
+Please point your browser to: 
+http://samba.anu.edu.au/linux-sna/documents/drivers/SysKonnect/
+
+Many thanks to Christoph Goos for his excellent work on this driver and
+SysKonnect for donating the adapters to Linux-SNA for the testing and maintaince
+of this device driver.
+
+Important information to be noted:
+1. Adapters can be slow to open (~20 secs) and close (~5 secs), please be 
+   patient.
+2. This driver works very well when autoprobing for adapters. Why even 
+   think about those nasty io/int/dma settings of modprobe when the driver 
+   will do it all for you!
+
+This driver is rather simple to use. Select Y to Token Ring adapter support
+in the kernel configuration. A choice for SysKonnect Token Ring adapters will
+appear. This drives supports all SysKonnect ISA and PCI adapters. Choose this
+option. I personally recommend compiling the driver as a module (M), but if you
+you would like to compile it staticly answer Y instead.
+
+This driver supports multiple adapters without the need to load multiple copies
+of the driver. You should be able to load up to 7 adapters without any kernel
+modifications, if you are in need of more please contact the maintainer of this
+driver.
+
+Load the driver either by lilo/loadlin or as a module. When a module using the
+following command will suffice for most:
+
+# modprobe sktr
+
+This will produce output similar to the following: (Output is user specific)
+
+sktr.c: v1.01 08/29/97 by Christoph Goos
+tr0: SK NET TR 4/16 PCI found at 0x6100, using IRQ 17.
+tr1: SK NET TR 4/16 PCI found at 0x6200, using IRQ 16.
+tr2: SK NET TR 4/16 ISA found at 0xa20, using IRQ 10 and DMA 5.
+
+Now just setup the device via ifconfig and set and routes you may have. After
+this you are ready to start sending some tokens.
+
+Errata:
+For anyone wondering where to pick up the SysKonnect adapters please browse
+to http://www.syskonnect.com
+
+This driver is under the GNU General Public License. Its Firmware image is 
+included as an initialized C-array and is licensed by SysKonnect to the Linux 
+users of this driver. However no waranty about its fitness is expressed or 
+implied by SysKonnect.
+
+Below find attached the setting for the SK NET TR 4/16 ISA adapters
+-------------------------------------------------------------------
+
+                    ***************************
+                    ***   C O N T E N T S   ***
+                    ***************************
+
+                1) Location of DIP-Switch W1
+                2) Default settings
+                3) DIP-Switch W1 description
+
+
+  ==============================================================
+  CHAPTER 1     LOCATION OF DIP-SWITCH
+  ==============================================================
+
+UÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
+þUÄÄÄÄÄÄ¿                         UÄÄÄÄÄ¿            UÄÄÄ¿         þ
+þAÄÄÄÄÄÄU                      W1 AÄÄÄÄÄU     UÄÄÄÄ¿ þ   þ         þ
+þUÄÄÄÄÄÄ¿                                     þ    þ þ   þ      UÄÄÅ¿
+þAÄÄÄÄÄÄU              UÄÄÄÄÄÄÄÄÄÄÄ¿          AÄÄÄÄU þ   þ      þ  þþ
+þUÄÄÄÄÄÄ¿              þ           þ          UÄÄÄ¿  AÄÄÄU      AÄÄÅU
+þAÄÄÄÄÄÄU              þ TMS380C26 þ          þ   þ                þ
+þUÄÄÄÄÄÄ¿              þ           þ          AÄÄÄU                AÄ¿
+þAÄÄÄÄÄÄU              þ           þ                               þ þ
+þ                      AÄÄÄÄÄÄÄÄÄÄÄU                               þ þ
+þ                                                                  þ þ
+þ                                                                  AÄU
+þ                                                                  þ
+þ                                                                  þ
+þ                                                                  þ
+þ                                                                  þ
+AÄÄÄÄÄÄÄÄÄÄÄÄAÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄAÄÄAÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄAÄÄÄÄÄÄÄÄÄU
+             AÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄU  AÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄU
+
+  ==============================================================
+  CHAPTER 2     DEFAULT SETTINGS
+  ==============================================================
+
+          W1    1  2  3  4  5  6  7  8
+        +------------------------------+
+        | ON    X                      |
+        | OFF      X  X  X  X  X  X  X |
+        +------------------------------+
+
+        W1.1 = ON               Adapter drives address lines SA17..19
+        W1.2 - 1.5 = OFF        BootROM disabled
+        W1.6 - 1.8 = OFF        I/O address 0A20h
+
+  ==============================================================
+  CHAPTER 3     DIP SWITCH W1 DESCRIPTION
+  ==============================================================
+
+      UÄÄÄAÄÄÄAÄÄÄAÄÄÄAÄÄÄAÄÄÄAÄÄÄAÄÄÄ¿  ON
+      þ 1 þ 2 þ 3 þ 4 þ 5 þ 6 þ 7 þ 8 þ
+      AÄÄÄAÄÄÄAÄÄÄAÄÄÄAÄÄÄAÄÄÄAÄÄÄAÄÄÄU  OFF
+      |AD | BootROM Addr. |  I/O      |
+      +-+-+-------+-------+-----+-----+
+        |         |             |
+        |         |             +------ 6     7     8
+        |         |                     ON    ON    ON       1900h
+        |         |                     ON    ON    OFF      0900h
+        |         |                     ON    OFF   ON       1980h
+        |         |                     ON    OFF   OFF      0980h
+        |         |                     OFF   ON    ON       1b20h
+        |         |                     OFF   ON    OFF      0b20h
+        |         |                     OFF   OFF   ON       1a20h
+        |         |                     OFF   OFF   OFF      0a20h    (+)
+        |         |
+        |         |
+        |         +-------- 2     3     4     5
+        |                   OFF   x     x     x       disabled  (+)
+        |                   ON    ON    ON    ON      C0000
+        |                   ON    ON    ON    OFF     C4000
+        |                   ON    ON    OFF   ON      C8000
+        |                   ON    ON    OFF   OFF     CC000
+        |                   ON    OFF   ON    ON      D0000
+        |                   ON    OFF   ON    OFF     D4000
+        |                   ON    OFF   OFF   ON      D8000
+        |                   ON    OFF   OFF   OFF     DC000
+        |
+        |
+        +----- 1
+               OFF    adapter does NOT drive SA<17..19>
+               ON     adapter drives SA<17..19>  (+)
+
+
+        (+) means default setting
+
+                       ********************************
diff -u --recursive --new-file v2.1.106/linux/Documentation/nfsroot.txt linux/Documentation/nfsroot.txt
--- v2.1.106/linux/Documentation/nfsroot.txt	Sun Jun  7 11:16:26 1998
+++ linux/Documentation/nfsroot.txt	Wed Jun 24 14:30:07 1998
@@ -1,5 +1,5 @@
 Mounting the root filesystem via NFS (nfsroot)
-==============================================
+===============================================
 
 Written 1996 by Gero Kuhlmann <gero@gkminix.han.de>
 Updated 1997 by Martin Mares <mj@atrey.karlin.mff.cuni.cz>
@@ -185,12 +185,12 @@
 	lar to how LILO is doing it. Please refer to the loadlin docu-
 	mentation for further information.
 
-3.4) Using a bootrom
+3.4) Using a boot ROM
 	This is probably the most elegant way of booting a diskless
-	client. With a bootrom the kernel gets loaded using the TFTP
-	protocol. As far as I know no commercial bootroms already
+	client. With a boot ROM the kernel gets loaded using the TFTP
+	protocol. As far as I know, no commercial boot ROMs yet
 	support booting Linux over the network, but there are two
-	free implementations of a bootrom available on sunsite.unc.edu
+	free implementations of a boot ROM available on sunsite.unc.edu
 	and its mirrors. They are called 'netboot-nfs' and 'etherboot'.
 	Both contain everything you need to boot a diskless Linux client.
 
diff -u --recursive --new-file v2.1.106/linux/Documentation/ramdisk.txt linux/Documentation/ramdisk.txt
--- v2.1.106/linux/Documentation/ramdisk.txt	Sat May  2 14:19:52 1998
+++ linux/Documentation/ramdisk.txt	Wed Jun 24 14:30:07 1998
@@ -1,4 +1,3 @@
-
 Using the RAM disk block device with Linux
 ------------------------------------------
 
@@ -7,20 +6,20 @@
 	1) Overview
 	2) Kernel Command Line Parameters
 	3) Using "rdev -r" With New Kernels
-	4) An Example of Creating a Compressed ramdisk 
+	4) An Example of Creating a Compressed RAM Disk 
 
 
 1) Overview
 -----------
 
-As of kernel v1.3.48, the ramdisk driver was substantially changed.
+As of kernel v1.3.48, the RAM disk driver was substantially changed.
 
 The older versions would grab a chunk of memory off the top before
 handing the remainder to the kernel at boot time. Thus a size parameter
 had to be specified via "ramdisk=1440" or "rdev -r /dev/fd0 1440" so
 that the driver knew how much memory to grab.
 
-Now the ramdisk dynamically grows as more space is required. It does
+Now the RAM disk dynamically grows as more space is required. It does
 this by using RAM from the buffer cache. The driver marks the buffers
 it is using with a new "BH_Protected" flag so that the kernel does 
 not try to reuse them later. This means that the old size parameter
@@ -28,9 +27,9 @@
 of the "rdev -r" or "ramsize" (usually a symbolic link to "rdev")
 command has changed.
 
-Also, the new ramdisk supports up to 16 ramdisks out of the box, and can
-be reconfigured in rd.c to support up to 255 ramdisks.  To use multiple
-ramdisk support with your system, run 'mknod /dev/ramX b 1 X' and chmod
+Also, the new RAM disk supports up to 16 RAM disks out of the box, and can
+be reconfigured in rd.c to support up to 255 RAM disks.  To use multiple
+RAM disk support with your system, run 'mknod /dev/ramX b 1 X' and chmod
 (to change its permissions) it to your liking.  The default /dev/ram(disk)
 uses minor #1, so start with ram2 and go from there.
 
@@ -38,14 +37,14 @@
 to make it clearer.  The original "ramdisk=<ram_size>" has been kept around
 for compatibility reasons, but it will probably be removed in 2.1.x.
 
-The new ramdisk also has the ability to load compressed ramdisk images,
+The new RAM disk also has the ability to load compressed RAM disk images,
 allowing one to squeeze more programs onto an average installation or 
 rescue floppy disk.
 
 Notes: You may have "/dev/ram" or "/dev/ramdisk" or both. They are
-equivalent from the standpoint of this document. Also, the new ramdisk
+equivalent from the standpoint of this document. Also, the new RAM disk
 is a config option. When running "make config", make sure you enable
-ramdisk support for the kernel you intend to use the ramdisk with.
+RAM disk support for the kernel with which you intend to use the RAM disk.
 
 
 2) Kernel Command Line Parameters
@@ -55,42 +54,42 @@
 	=================
 
 To allow a kernel image to reside on a floppy disk along with a compressed
-ramdisk image, the "ramdisk_start=<offset>" command was added. The kernel
-can't be included into the compressed ramdisk filesystem image, because
+RAM disk image, the "ramdisk_start=<offset>" command was added. The kernel
+can't be included into the compressed RAM disk filesystem image, because
 it needs to be stored starting at block zero so that the BIOS can load the 
-bootsector and then the kernel can bootstrap itself to get going.
+boot sector and then the kernel can bootstrap itself to get going.
 
-Note: If you are using an uncompressed ramdisk image, then the kernel can
-be a part of the filesystem image that is being loaded into the ramdisk,
+Note: If you are using an uncompressed RAM disk image, then the kernel can
+be a part of the filesystem image that is being loaded into the RAM disk,
 and the floppy can be booted with LILO, or the two can be separate as
 is done for the compressed images.
 
-If you are using a two-disk boot/root setup (kernel on #1, ramdisk image
-on #2) then the ramdisk would start at block zero, and an offset of
+If you are using a two-disk boot/root setup (kernel on #1, RAM disk image
+on #2) then the RAM disk would start at block zero, and an offset of
 zero would be used. Since this is the default value, you would not need
 to actually use the command at all.
 
-If instead, you have a "zImage" of about 350k, and a "fs_image.gz" of
-say about 1MB, and you want them both on the same disk, then you
+If instead, you have a "zImage" of about 350 kB, and a "fs_image.gz" of
+say about 1 MB, and you want them both on the same disk, then you
 would use an offset. If you stored the "fs_image.gz" onto the floppy
-starting at an offset of 400kB, you would use "ramdisk_start=400".
+starting at an offset of 400 kB, you would use "ramdisk_start=400".
 
 
 	load_ramdisk=N
 	==============
 
 This parameter tells the kernel whether it is to try to load a
-ramdisk image or not. Specifying "load_ramdisk=1" will tell the
-kernel to load a floppy into the ramdisk. The default value is
-zero, meaning that the kernel should not try to load a ramdisk.
+RAM disk image or not. Specifying "load_ramdisk=1" will tell the
+kernel to load a floppy into the RAM disk. The default value is
+zero, meaning that the kernel should not try to load a RAM disk.
 
 
 	prompt_ramdisk=N
 	================
 
 This parameter tells the kernel whether or not to give you a prompt
-asking you to insert the floppy containing the ramdisk image. In
-a single floppy configuration the ramdisk image is on the same floppy
+asking you to insert the floppy containing the RAM disk image. In
+a single floppy configuration the RAM disk image is on the same floppy
 as the kernel that just finished loading/booting and so a prompt
 is not needed. In this case one can use "prompt_ramdisk=0". In a
 two floppy configuration, you will need the chance to switch disks,
@@ -100,18 +99,18 @@
 	ramdisk_size=N
 	==============
 
-This parameter tells the ramdisk driver to set up ramdisks of Nk size.  The
-default is 4096 (4MB). 
+This parameter tells the RAM disk driver to set up RAM disks of N k size.  The
+default is 4096 (4 MB). 
 
 3) Using "rdev -r" With New Kernels
 -----------------------------------
 
 The usage of the word (two bytes) that "rdev -r" sets in the kernel image
-has changed. The low 11 bits (0 -> 10) specify an offset (in 1k blocks) 
-of up to 2MB (2^11) of where to find the ramdisk (this used to be the 
-size). Bit 14 indicates that a ramdisk is to be loaded, and bit 15
+has changed. The low 11 bits (0 -> 10) specify an offset (in 1 k blocks) 
+of up to 2 MB (2^11) of where to find the RAM disk (this used to be the 
+size). Bit 14 indicates that a RAM disk is to be loaded, and bit 15
 indicates whether a prompt/wait sequence is to be given before trying
-to read the ramdisk. Since the ramdisk dynamically grows as data is
+to read the RAM disk. Since the RAM disk dynamically grows as data is
 being written into it, a size field is no longer required. Bits 11
 to 13 are not currently used and may as well be zero. These numbers
 are no magical secrets, as seen below:
@@ -121,13 +120,13 @@
 ./arch/i386/kernel/setup.c:#define RAMDISK_LOAD_FLAG            0x4000
 
 Consider a typical two floppy disk setup, where you will have the 
-kernel on disk one, and have already put a ramdisk image onto disk #2.
+kernel on disk one, and have already put a RAM disk image onto disk #2.
 
-Hence you want to set bits 0 to 13 as zero, meaning that your ramdisk
-starts at an offset of zero kB from the beginning of the floppy.
+Hence you want to set bits 0 to 13 as 0, meaning that your RAM disk
+starts at an offset of 0 kB from the beginning of the floppy.
 The command line equivalent is: "ramdisk_start=0"
 
-You want bit 14 as one, indicating that a ramdisk is to be loaded.
+You want bit 14 as one, indicating that a RAM disk is to be loaded.
 The command line equivalent is: "load_ramdisk=1"
 
 You want bit 15 as one, indicating that you want a prompt/keypress
@@ -147,20 +146,20 @@
 	append = "load_ramdisk=1"
 
 
-4) An Example of Creating a Compressed ramdisk 
+4) An Example of Creating a Compressed RAM Disk 
 ----------------------------------------------
 
-To create a ramdisk image, you will need a spare block device to
-construct it on. This can be the ramdisk device itself, or an
+To create a RAM disk image, you will need a spare block device to
+construct it on. This can be the RAM disk device itself, or an
 unused disk partition (such as an unmounted swap partition). For this 
-example, we will use the ramdisk device, "/dev/ram".
+example, we will use the RAM disk device, "/dev/ram".
 
-Note: This technique should not be done on a machine with less than 8MB
+Note: This technique should not be done on a machine with less than 8 MB
 of RAM. If using a spare disk partition instead of /dev/ram, then this
 restriction does not apply.
 
-a) Decide on the ramdisk size that you want. Say 2MB for this example.
-   Create it by writing to the ramdisk device. (This step is not currently
+a) Decide on the RAM disk size that you want. Say 2 MB for this example.
+   Create it by writing to the RAM disk device. (This step is not currently
    required, but may be in the future.) It is wise to zero out the
    area (esp. for disks) so that maximal compression is achieved for
    the unused blocks of the image that you are about to create.
@@ -174,9 +173,9 @@
 c) Mount it, copy the files you want to it (eg: /etc/* /dev/* ...)
    and unmount it again.
 
-d) Compress the contents of the ramdisk. The level of compression
+d) Compress the contents of the RAM disk. The level of compression
    will be approximately 50% of the space used by the files. Unused
-   space on the ramdisk will compress to almost nothing.
+   space on the RAM disk will compress to almost nothing.
 
 	dd if=/dev/ram bs=1k count=2048 | gzip -v9 > /tmp/ram_image.gz
 
@@ -184,23 +183,23 @@
 
 	dd if=zImage of=/dev/fd0 bs=1k
 
-f) Put the ramdisk image onto the floppy, after the kernel. Use an offset
+f) Put the RAM disk image onto the floppy, after the kernel. Use an offset
    that is slightly larger than the kernel, so that you can put another
    (possibly larger) kernel onto the same floppy later without overlapping
-   the ramdisk image. An offset of 400kB for kernels about 350kB in
+   the RAM disk image. An offset of 400 kB for kernels about 350 kB in
    size would be reasonable. Make sure offset+size of ram_image.gz is
-   not larger than the total space on your floppy (usually 1440kB).
+   not larger than the total space on your floppy (usually 1440 kB).
 
 	dd if=/tmp/ram_image.gz of=/dev/fd0 bs=1k seek=400
 
-g) Use "rdev" to set the boot device, ramdisk offset, prompt flag, etc.
+g) Use "rdev" to set the boot device, RAM disk offset, prompt flag, etc.
    For prompt_ramdisk=1, load_ramdisk=1, ramdisk_start=400, one would
    have 2^15 + 2^14 + 400 = 49552.
 
 	rdev /dev/fd0 /dev/fd0
 	rdev -r /dev/fd0 49552
 
-That is it. You now have your boot/root compressed ramdisk floppy. Some
+That is it. You now have your boot/root compressed RAM disk floppy. Some
 users may wish to combine steps (d) and (f) by using a pipe.
 
 --------------------------------------------------------------------------
diff -u --recursive --new-file v2.1.106/linux/Documentation/smp.tex linux/Documentation/smp.tex
--- v2.1.106/linux/Documentation/smp.tex	Sun Jun  7 11:16:26 1998
+++ linux/Documentation/smp.tex	Wed Jun 24 14:30:07 1998
@@ -52,7 +52,7 @@
 locking and protection of its own tables to prevent two processes updating 
 them at once and for example allocating the same memory block. There are 
 two strategies for this within current Unix and Unixlike kernels. 
-Traditional unix systems from the earliest of days use a scheme of 'Coarse 
+Traditional Unix systems from the earliest of days use a scheme of 'Coarse 
 Grained Locking' where the entire kernel is protected by a small number of 
 locks only. Some modern systems use fine grained locking. Because fine 
 grained locking has more overhead it is normally used only on 
diff -u --recursive --new-file v2.1.106/linux/Documentation/spinlocks.txt linux/Documentation/spinlocks.txt
--- v2.1.106/linux/Documentation/spinlocks.txt	Sat May  2 14:19:52 1998
+++ linux/Documentation/spinlocks.txt	Wed Jun 24 14:30:07 1998
@@ -11,7 +11,7 @@
 > these routines and go about making use of them?  Do they only lock on a
 > per-processor basis or can they also lock say an interrupt routine from
 > mucking with a queue if the queue routine was manipulating it when the
-> interrupt occured, or should I still use a cli(); based construct on that
+> interrupt occurred, or should I still use a cli(); based construct on that
 > one?
 
 See <asm/spinlock.h>. The basic version is:
diff -u --recursive --new-file v2.1.106/linux/Documentation/stallion.txt linux/Documentation/stallion.txt
--- v2.1.106/linux/Documentation/stallion.txt	Sat May  2 14:19:52 1998
+++ linux/Documentation/stallion.txt	Mon Jun 22 23:00:51 1998
@@ -4,8 +4,8 @@
 
 Copyright (C) 1994-1998,  Stallion Technologies (support@stallion.com).
 
-Version:   5.4.5
-Date:      23MAR98
+Version:   5.4.6
+Date:      23JUN98
 
 
 
diff -u --recursive --new-file v2.1.106/linux/Documentation/svga.txt linux/Documentation/svga.txt
--- v2.1.106/linux/Documentation/svga.txt	Sun Jun  7 11:16:26 1998
+++ linux/Documentation/svga.txt	Wed Jun 24 14:44:00 1998
@@ -60,7 +60,7 @@
 
    "0  0F00  80x25" means that the first menu item (the menu items are numbered
 from "0" to "9" and from "a" to "z") is a 80x25 mode with ID=0x0f00 (see the
-next section for a description of mode ID's).
+next section for a description of mode IDs).
 
    <flashing-cursor-here> encourages you to enter the item number or mode ID
 you wish to set and press <RETURN>. If the computer complains something about
@@ -91,9 +91,9 @@
 modes are not listed at all and the modes revealed by `scan' are shown before
 all VESA modes.
 
-3. Mode ID's
-~~~~~~~~~~~~
-   Because of the complexity of all the video stuff, the video mode ID's
+3. Mode IDs
+~~~~~~~~~~~
+   Because of the complexity of all the video stuff, the video mode IDs
 used here are also a bit complex. A video mode ID is a 16-bit number usually
 expressed in a hexadecimal notation (starting with "0x"). You can set a mode
 by entering its mode directly if you know it even if it isn't shown on the menu.
@@ -233,7 +233,7 @@
 2.2 (01-Feb-96)	EGA 80x43 fixed. VESA extended to 0x200-0x4ff (non-standard 02XX
 		VESA modes work now). Display end bug workaround supported.
 		Special modes renumbered to allow adding of the "recalculate"
-		flag, 0xffff and 0xfffe became aliases instead of real ID's.
+		flag, 0xffff and 0xfffe became aliases instead of real IDs.
 		Screen contents retained during mode changes.
 2.3 (15-Mar-96)	Changed to work with 1.3.74 kernel.
 2.4 (18-Mar-96)	Added patches by Hans Lermen fixing a memory overwrite problem
@@ -267,3 +267,4 @@
 		  offered explicitly on the prompt line.
 		- Removed the doc section describing adding of new probing
 		  functions as I try to get rid of _all_ hardware probing here.
+2.12 (25-May-98)- Added support for VESA frame buffer graphics.
diff -u --recursive --new-file v2.1.106/linux/Documentation/sysctl/README linux/Documentation/sysctl/README
--- v2.1.106/linux/Documentation/sysctl/README	Thu Apr 23 20:21:27 1998
+++ linux/Documentation/sysctl/README	Wed Jun 24 14:30:07 1998
@@ -1,4 +1,3 @@
-
 Documentation for /proc/sys/*/*		version 0.1
 	(c) 1998, Rik van Riel <H.H.vanRiel@phys.uu.nl>
 
diff -u --recursive --new-file v2.1.106/linux/Documentation/sysctl/kernel.txt linux/Documentation/sysctl/kernel.txt
--- v2.1.106/linux/Documentation/sysctl/kernel.txt	Sat May  2 14:19:52 1998
+++ linux/Documentation/sysctl/kernel.txt	Wed Jun 24 14:30:07 1998
@@ -1,4 +1,3 @@
-
 Documentation for /proc/sys/kernel/*	version 0.1
 	(c) 1998, Rik van Riel <H.H.vanRiel@phys.uu.nl>
 
@@ -89,8 +88,8 @@
 
 file-max & file-nr:
 
-The kernel allocates filehandles dynamically, but as yet it
-doesn't free them again...
+The kernel allocates file handles dynamically, but as yet it
+doesn't free them again.
 
 The value in file-max denotes the maximum number of file-
 handles that the Linux kernel will allocate. When you get lots
@@ -99,17 +98,17 @@
 
 The three values in file-nr denote the number of allocated
 file handles, the number of used file handles and the maximum
-number of file handles. When the allocated filehandles come
+number of file handles. When the allocated file handles come
 close to the maximum, but the number of actually used ones is
-far behind, you've encountered a peak in your filehandle usage
-and you don't need to increase the maximum.
+far behind, you've encountered a peak in your usage of file
+handles and you don't need to increase the maximum.
 
 ==============================================================
 
 inode-max, inode-nr & inode-state:
 
-As with filehandles, the kernel allocates the inode structures
-dynamically, but can't free them yet...
+As with file handles, the kernel allocates the inode structures
+dynamically, but can't free them yet.
 
 The value in inode-max denotes the maximum number of inode
 handlers. This value should be 3-4 times larger than the value
diff -u --recursive --new-file v2.1.106/linux/Documentation/sysctl/vm.txt linux/Documentation/sysctl/vm.txt
--- v2.1.106/linux/Documentation/sysctl/vm.txt	Thu May  7 22:51:46 1998
+++ linux/Documentation/sysctl/vm.txt	Wed Jun 24 14:30:07 1998
@@ -1,4 +1,3 @@
-
 Documentation for /proc/sys/vm/*	version 0.1
 	(c) 1998, Rik van Riel <H.H.vanRiel@phys.uu.nl>
 
@@ -99,7 +98,7 @@
 as a percentage of total system memory.
 
 The values are:
-min_percent	-- this is the minumum percentage of memory
+min_percent	-- this is the minimum percentage of memory
 		   that should be spent on buffer memory
 borrow_percent  -- when Linux is short on memory, and the
                    buffer cache uses more memory, free pages
@@ -138,7 +137,7 @@
 kswapd:
 
 Kswapd is the kernel swapout daemon. That is, kswapd is that
-piece of the kernel that frees memory when it get's fragmented
+piece of the kernel that frees memory when it gets fragmented
 or full. Since every system is different, you'll probably want
 some control over this piece of the system.
 
@@ -152,7 +151,7 @@
 		number. Usually this number will be divided
 		by 4 or 8 (see mm/vmscan.c), so it isn't as
 		big as it looks.
-		When you need to increase the bandwith to/from
+		When you need to increase the bandwidth to/from
 		swap, you'll want to increase this number.
 tries_min	This is the minimum number of times kswapd
 		tries to free a page each time it is called.
@@ -186,9 +185,9 @@
 --------------------------------------------------------------
 static inline int vm_enough_memory(long pages)
 {
-    /* Stupid algorithm to decide if we have enough memory: while
-     * simple, it hopefully works in most obvious cases.. Easy to
-     * fool it, but this should catch most mistakes.
+    /* This stupid algorithm decides whether we have enough memory:
+     * while simple, it should work in most obvious cases.  It's
+     * easily fooled, but this should catch most mistakes.
      */
     long freepages;
 
@@ -269,7 +268,7 @@
 The values of sc_pageout_weight and sc_bufferout_weight are
 used to control how many tries kswapd will make in order
 to swapout one page / buffer. These values can be used to
-finetune the ratio between user pages and buffer/cache memory.
+fine-tune the ratio between user pages and buffer/cache memory.
 When you find that your Linux system is swapping out too many
 process pages in order to satisfy buffer memory demands, you
 might want to either increase sc_bufferout_weight, or decrease
diff -u --recursive --new-file v2.1.106/linux/Documentation/sysrq.txt linux/Documentation/sysrq.txt
--- v2.1.106/linux/Documentation/sysrq.txt	Sun Jun  7 11:16:26 1998
+++ linux/Documentation/sysrq.txt	Wed Jun 24 14:30:07 1998
@@ -37,7 +37,7 @@
 
 's'     - Will attempt to sync all mounted filesystems.
 
-'u'     - Will attempt to remount all mounted file systems readonly.
+'u'     - Will attempt to remount all mounted filesystems read-only.
 
 'p'     - Will dump the current registers and flags to your console.
 
diff -u --recursive --new-file v2.1.106/linux/Documentation/watchdog.txt linux/Documentation/watchdog.txt
--- v2.1.106/linux/Documentation/watchdog.txt	Sun Feb  2 05:18:30 1997
+++ linux/Documentation/watchdog.txt	Wed Jun 24 14:30:07 1998
@@ -23,7 +23,7 @@
 
 A second temperature monitoring interface is available on the WDT501P cards
 and some Berkshire cards. This provides /dev/temperature. This is the machine 
-internal temperature in degrees farenheit. Each read returns a single byte 
+internal temperature in degrees Fahrenheit. Each read returns a single byte 
 giving the temperature.
 
 The third interface logs kernel messages on additional alert events.
diff -u --recursive --new-file v2.1.106/linux/Makefile linux/Makefile
--- v2.1.106/linux/Makefile	Tue Jun 23 10:01:19 1998
+++ linux/Makefile	Wed Jun 24 14:44:02 1998
@@ -1,8 +1,8 @@
 VERSION = 2
 PATCHLEVEL = 1
-SUBLEVEL = 106
+SUBLEVEL = 107
 
-ARCH := $(shell uname -m | sed -e s/i.86/i386/ -e s/sun4u/sparc64/ -e s/arm*/arm/ -e s/sa110/arm/)
+ARCH := $(shell uname -m | sed -e s/i.86/i386/ -e s/sun4u/sparc64/ -e s/arm.*/arm/ -e s/sa110/arm/)
 
 #
 # For SMP kernels, set this. We don't want to have this in the config file
@@ -93,7 +93,7 @@
 endif
 
 #
-# if you want the ram-disk device, define this to be the
+# if you want the RAM disk device, define this to be the
 # size in blocks.
 #
 
@@ -145,6 +145,10 @@
 DRIVERS := $(DRIVERS) drivers/pnp/pnp.a
 endif
 
+ifdef CONFIG_VT
+DRIVERS := $(DRIVERS) drivers/video/video.a
+endif
+
 ifeq ($(CONFIG_PARIDE),y)
 DRIVERS := $(DRIVERS) drivers/block/paride/paride.a
 endif
@@ -319,6 +323,8 @@
 	if [ -f CDROM_MODULES ]; then inst_mod CDROM_MODULES cdrom; fi; \
 	if [ -f HAM_MODULES   ]; then inst_mod HAM_MODULES   net;   fi; \
 	if [ -f SOUND_MODULES ]; then inst_mod SOUND_MODULES sound; fi; \
+	if [ -f VIDEO_MODULES ]; then inst_mod VIDEO_MODULES video; fi; \
+	if [ -f FC4_MODULES   ]; then inst_mod FC4_MODULES   fc4;   fi; \
 	\
 	ls *.o > .allmods; \
 	echo $$MODULES | tr ' ' '\n' | sort | comm -23 .allmods - > .misc; \
diff -u --recursive --new-file v2.1.106/linux/README linux/README
--- v2.1.106/linux/README	Tue Jun 23 10:01:19 1998
+++ linux/README	Wed Jun 24 14:30:07 1998
@@ -1,4 +1,3 @@
-
 	Linux kernel release 2.1.xx
 
 These are the release notes for Linux version 2.1.  Read them carefully,
@@ -126,16 +125,16 @@
 
 CONFIGURING the kernel:
 
- - Do a "make config" to configure the basic kernel.  "make config"
-   needs bash to work: it will search for bash in $BASH, /bin/bash and
-   /bin/sh (in that order), so hopefully one of those is correct. 
+ - Do a "make config" to configure the basic kernel.  "make config" needs
+   bash to work: it will search for bash in $BASH, /bin/bash and /bin/sh
+   (in that order), so one of those must be correct for it to work. 
 
-   (Do not skip this step even if you are only upgrading one minor
+   Do not skip this step even if you are only upgrading one minor
    version.  New configuration options are added in each release, and
    odd problems will turn up if the configuration files are not set up
    as expected.  If you want to carry your existing configuration to a
    new version with minimal work, use "make oldconfig", which will
-   only ask you for the answers to new questions.)
+   only ask you for the answers to new questions.
 
  - Alternate configuration commands are:
 	"make menuconfig"  Text based color menus, radiolists & dialogs.
@@ -180,7 +179,7 @@
    kernel.
 
  - Do a "make zImage" to create a compressed kernel image.  If you want
-   to make a bootdisk (without root filesystem or lilo), insert a floppy
+   to make a boot disk (without root filesystem or LILO), insert a floppy
    in your A: drive, and do a "make zdisk".  It is also possible to do
    "make zlilo" if you have lilo installed to suit the kernel makefiles,
    but you may want to check your particular lilo setup first. 
diff -u --recursive --new-file v2.1.106/linux/Rules.make linux/Rules.make
--- v2.1.106/linux/Rules.make	Tue Jun 23 10:01:19 1998
+++ linux/Rules.make	Wed Jun 24 14:30:07 1998
@@ -176,10 +176,10 @@
 MODINCL = $(TOPDIR)/include/linux/modules
 
 # The -w option (enable warnings) for genksyms will return here in 2.1
-# So where has it gone ???
+# So where has it gone?
 #
-# Added the SMP separator to stop module accidents between uniproc/smp
-# intel boxes - AC - from bits by Michael Chastain
+# Added the SMP separator to stop module accidents between uniprocessor
+# and SMP Intel boxes - AC - from bits by Michael Chastain
 #
 
 ifdef SMP
diff -u --recursive --new-file v2.1.106/linux/arch/alpha/config.in linux/arch/alpha/config.in
--- v2.1.106/linux/arch/alpha/config.in	Fri May  8 23:14:41 1998
+++ linux/arch/alpha/config.in	Wed Jun 24 14:44:00 1998
@@ -202,6 +202,12 @@
 fi
 endmenu
 
+bool 'Support for frame buffer devices' CONFIG_FB
+if [ "$CONFIG_FB" = "y" ]; then
+  define_bool CONFIG_PCI_CONSOLE y
+fi
+source drivers/video/Config.in
+
 source drivers/pnp/Config.in
 
 source drivers/block/Config.in
diff -u --recursive --new-file v2.1.106/linux/arch/alpha/kernel/apecs.c linux/arch/alpha/kernel/apecs.c
--- v2.1.106/linux/arch/alpha/kernel/apecs.c	Fri Apr 10 13:03:48 1998
+++ linux/arch/alpha/kernel/apecs.c	Wed Jun 24 14:30:07 1998
@@ -82,7 +82,7 @@
  *  
  * Notes:
  *	The function number selects which function of a multi-function device 
- *	(e.g., scsi and ethernet).
+ *	(e.g., SCSI and Ethernet).
  * 
  *	The register selects a DWORD (32 bit) register offset.  Hence it
  *	doesn't get shifted by 2 bits as we want to "drop" the bottom two
diff -u --recursive --new-file v2.1.106/linux/arch/alpha/kernel/bios32.c linux/arch/alpha/kernel/bios32.c
--- v2.1.106/linux/arch/alpha/kernel/bios32.c	Sun Jun  7 11:16:26 1998
+++ linux/arch/alpha/kernel/bios32.c	Wed Jun 24 14:44:00 1998
@@ -1090,7 +1090,7 @@
  *  6       PCI on board slot 0
  *  7       PCI on board slot 1
  *  8       Intel SIO PCI-ISA bridge chip
- *  9       Tulip - DECchip 21040 ethernet controller
+ *  9       Tulip - DECchip 21040 Ethernet controller
  *   
  *
  * This two layered interrupt approach means that we allocate IRQ 16 and 
@@ -1946,10 +1946,6 @@
 }
 
 
-#ifdef CONFIG_TGA_CONSOLE
-extern void tga_console_init(void);
-#endif /* CONFIG_TGA_CONSOLE */
-
 void __init
 pcibios_fixup(void)
 {
@@ -2022,12 +2018,6 @@
 	/* no fixup needed */
 #else
 # error "You must tell me what kind of platform you want."
-#endif
-
-#ifndef CONFIG_ABSTRACT_CONSOLE
-#ifdef CONFIG_TGA_CONSOLE
-	tga_console_init();
-#endif
 #endif
 }
 
diff -u --recursive --new-file v2.1.106/linux/arch/alpha/kernel/cia.c linux/arch/alpha/kernel/cia.c
--- v2.1.106/linux/arch/alpha/kernel/cia.c	Sun Jun  7 11:16:26 1998
+++ linux/arch/alpha/kernel/cia.c	Wed Jun 24 14:30:08 1998
@@ -104,7 +104,7 @@
  *  
  * Notes:
  *	The function number selects which function of a multi-function device 
- *	(e.g., scsi and ethernet).
+ *	(e.g., SCSI and Ethernet).
  * 
  *	The register selects a DWORD (32 bit) register offset.  Hence it
  *	doesn't get shifted by 2 bits as we want to "drop" the bottom two
diff -u --recursive --new-file v2.1.106/linux/arch/alpha/kernel/irq.c linux/arch/alpha/kernel/irq.c
--- v2.1.106/linux/arch/alpha/kernel/irq.c	Wed Apr  1 20:11:47 1998
+++ linux/arch/alpha/kernel/irq.c	Wed Jun 24 14:30:08 1998
@@ -827,7 +827,7 @@
 			       cpu, previous_irqholder, globl_locked,
 			       globl_icount, local_count);
 #ifdef VERBOSE_IRQLOCK_DEBUGGING
-			printk("Performing backtrace on all cpus,"
+			printk("Performing backtrace on all CPUs,"
 			       " write this down!\n");
 			smp_show_backtrace_all_cpus();
 #endif
diff -u --recursive --new-file v2.1.106/linux/arch/alpha/kernel/lca.c linux/arch/alpha/kernel/lca.c
--- v2.1.106/linux/arch/alpha/kernel/lca.c	Sun Jun  7 11:16:26 1998
+++ linux/arch/alpha/kernel/lca.c	Wed Jun 24 14:30:08 1998
@@ -84,7 +84,7 @@
  *  
  * Notes:
  *	The function number selects which function of a multi-function device 
- *	(e.g., scsi and ethernet).
+ *	(e.g., SCSI and Ethernet).
  * 
  *	The register selects a DWORD (32 bit) register offset.  Hence it
  *	doesn't get shifted by 2 bits as we want to "drop" the bottom two
diff -u --recursive --new-file v2.1.106/linux/arch/alpha/kernel/mcpcia.c linux/arch/alpha/kernel/mcpcia.c
--- v2.1.106/linux/arch/alpha/kernel/mcpcia.c	Wed Apr  8 19:36:24 1998
+++ linux/arch/alpha/kernel/mcpcia.c	Wed Jun 24 14:30:08 1998
@@ -120,7 +120,7 @@
  *  
  * Notes:
  *	The function number selects which function of a multi-function device 
- *	(e.g., scsi and ethernet).
+ *	(e.g., SCSI and Ethernet).
  * 
  *	The register selects a DWORD (32 bit) register offset.  Hence it
  *	doesn't get shifted by 2 bits as we want to "drop" the bottom two
diff -u --recursive --new-file v2.1.106/linux/arch/alpha/kernel/osf_sys.c linux/arch/alpha/kernel/osf_sys.c
--- v2.1.106/linux/arch/alpha/kernel/osf_sys.c	Tue Jun 23 10:01:19 1998
+++ linux/arch/alpha/kernel/osf_sys.c	Wed Jun 24 14:30:08 1998
@@ -366,8 +366,8 @@
 	int flags;
 	uid_t exroot;
 /*
- * this has lots more here, which linux handles with the option block
- * but I'm too lazy to do the translation into ascii..
+ * This has lots more here, which Linux handles with the option block
+ * but I'm too lazy to do the translation into ASCII.
  */
 };
 
@@ -435,8 +435,8 @@
 
 /*
  * We can't actually handle ufs yet, so we translate UFS mounts to
- * ext2fs mounts... I wouldn't mind a UFS filesystem, but the UFS
- * layout is so braindead it's a major headache doing it..
+ * ext2fs mounts. I wouldn't mind a UFS filesystem, but the UFS
+ * layout is so braindead it's a major headache doing it.
  */
 static int osf_ufs_mount(char *dirname, struct ufs_args *args, int flags)
 {
@@ -845,7 +845,7 @@
 	lock_kernel();
 	offset = command-1;
 	if (offset >= sizeof(sysinfo_table)/sizeof(char *)) {
-		/* Digital unix has a few unpublished interfaces here */
+		/* Digital UNIX has a few unpublished interfaces here */
 		printk("sysinfo(%d)", command);
 		goto out;
 	}
diff -u --recursive --new-file v2.1.106/linux/arch/alpha/kernel/process.c linux/arch/alpha/kernel/process.c
--- v2.1.106/linux/arch/alpha/kernel/process.c	Tue Jun 23 10:01:19 1998
+++ linux/arch/alpha/kernel/process.c	Wed Jun 24 14:30:08 1998
@@ -5,7 +5,7 @@
  */
 
 /*
- * This file handles the architecture-dependent parts of process handling..
+ * This file handles the architecture-dependent parts of process handling.
  */
 
 #include <linux/config.h>
@@ -255,7 +255,7 @@
 void flush_thread(void)
 {
 	/* Arrange for each exec'ed process to start off with a 
-	   clean slate wrt the fpu.  */
+	   clean slate with respect to the FPU.  */
 	current->tss.flags &= ~IEEE_SW_MASK;
 	wrfpcr(FPCR_DYN_NORMAL);
 }
diff -u --recursive --new-file v2.1.106/linux/arch/alpha/kernel/pyxis.c linux/arch/alpha/kernel/pyxis.c
--- v2.1.106/linux/arch/alpha/kernel/pyxis.c	Mon Apr  6 17:40:59 1998
+++ linux/arch/alpha/kernel/pyxis.c	Wed Jun 24 14:30:08 1998
@@ -89,7 +89,7 @@
  *  
  * Notes:
  *	The function number selects which function of a multi-function device 
- *	(e.g., scsi and ethernet).
+ *	(e.g., SCSI and Ethernet).
  * 
  *	The register selects a DWORD (32 bit) register offset.  Hence it
  *	doesn't get shifted by 2 bits as we want to "drop" the bottom two
diff -u --recursive --new-file v2.1.106/linux/arch/alpha/kernel/setup.c linux/arch/alpha/kernel/setup.c
--- v2.1.106/linux/arch/alpha/kernel/setup.c	Wed Apr  8 19:36:24 1998
+++ linux/arch/alpha/kernel/setup.c	Wed Jun 24 14:44:00 1998
@@ -23,6 +23,7 @@
 #include <linux/config.h>	/* CONFIG_ALPHA_LCA etc */
 #include <linux/ioport.h>
 #include <linux/mc146818rtc.h>
+#include <linux/console.h>
 
 #ifdef CONFIG_RTC
 #include <linux/timex.h>
@@ -221,20 +222,29 @@
 #ifdef __SMP__
 	setup_smp();
 #endif
+
+#ifdef CONFIG_VGA_CONSOLE
+	conswitchp = &vga_con;
+#endif
+#ifdef CONFIG_FB
+	/* Frame buffer device based console */
+	conswitchp = &fb_con;
+#endif
 }
 
 
 #define N(a) (sizeof(a)/sizeof(a[0]))
 
 /* A change was made to the HWRPB via an ECO and the following code tracks
- * a part of the ECO.  The HWRPB version must be 5 or higher or the ECO
- * was not implemented in the console firmware.  If its at rev 5 or greater
- * we can get the platform ascii string name from the HWRPB.  Thats what this
- * function does.  It checks the rev level and if the string is in the HWRPB
- * it returns the addtess of the string ... a pointer to the platform name.
+ * a part of the ECO.  In HWRPB versions less than 5, the ECO was not
+ * implemented in the console firmware.  If it's revision 5 or greater we can
+ * get the name of the platform as an ASCII string from the HWRPB.  That's what
+ * this function does.  It checks the revision level and if the string is in
+ * the HWRPB it returns the address of the string--a pointer to the name of the
+ * platform.
  *
  * Returns:
- *      - Pointer to a ascii string if its in the HWRPB
+ *      - Pointer to a ASCII string if it's in the HWRPB
  *      - Pointer to a blank string if the data is not in the HWRPB.
  */
 static char *
@@ -378,11 +388,11 @@
 		     &systype_name, &sysvariation_name);
 
 	return sprintf(buffer,
-		       "cpu\t\t\t: Alpha\n"
-		       "cpu model\t\t: %s\n"
-		       "cpu variation\t\t: %ld\n"
-		       "cpu revision\t\t: %ld\n"
-		       "cpu serial number\t: %s\n"
+		       "CPU\t\t\t: Alpha\n"
+		       "CPU model\t\t: %s\n"
+		       "CPU variation\t\t: %ld\n"
+		       "CPU revision\t\t: %ld\n"
+		       "CPU serial number\t: %s\n"
 		       "system type\t\t: %s\n"
 		       "system variation\t: %s\n"
 		       "system revision\t\t: %ld\n"
diff -u --recursive --new-file v2.1.106/linux/arch/alpha/kernel/smc37c669.c linux/arch/alpha/kernel/smc37c669.c
--- v2.1.106/linux/arch/alpha/kernel/smc37c669.c	Wed Apr  8 19:36:24 1998
+++ linux/arch/alpha/kernel/smc37c669.c	Wed Jun 24 14:30:08 1998
@@ -1131,7 +1131,7 @@
 	0,			/* is a flash update driver		*/
 	0,			/* is a block device			*/
 	0,			/* not seekable				*/
-	0,			/* is an ethernet device		*/
+	0,			/* is an Ethernet device		*/
 	0,			/* is a filesystem driver		*/
 };
 #endif
diff -u --recursive --new-file v2.1.106/linux/arch/alpha/kernel/smp.c linux/arch/alpha/kernel/smp.c
--- v2.1.106/linux/arch/alpha/kernel/smp.c	Sun Jun  7 11:16:26 1998
+++ linux/arch/alpha/kernel/smp.c	Wed Jun 24 14:30:08 1998
@@ -397,9 +397,8 @@
   return -EINVAL;
 }
 
-/* Only broken Intel needs this, thus it should not even be referenced
- * globally...
- */
+/* Only broken Intel needs this, thus it should not even be referenced globally.
+*/
 __initfunc(void initialize_secondary(void))
 {
 	printk("initialize_secondary: entry\n");
@@ -673,7 +672,7 @@
 static int
 unknown_ipi(unsigned int this_cpu)
 {
-	printk("unknown_ipi() on cpu %d:  ", this_cpu);
+	printk("unknown_ipi() on CPU %d:  ", this_cpu);
 	return 1;
 }
 
@@ -762,7 +761,7 @@
 	send_ipi_message(CPU_STOP, cpu_present_map ^ (1 << me));
 	return;
 barf:
-	printk("Yeeee, trying to send SMP msg(%d) on cpu %d\n", msg, me);
+	printk("Yeeee, trying to send SMP msg(%d) on CPU %d\n", msg, me);
 	panic("Bogon SMP message pass.");
 }
 
diff -u --recursive --new-file v2.1.106/linux/arch/alpha/kernel/t2.c linux/arch/alpha/kernel/t2.c
--- v2.1.106/linux/arch/alpha/kernel/t2.c	Sun Jun  7 11:16:26 1998
+++ linux/arch/alpha/kernel/t2.c	Wed Jun 24 14:30:08 1998
@@ -103,7 +103,7 @@
  *  
  * Notes:
  *	The function number selects which function of a multi-function device 
- *	(e.g., scsi and ethernet).
+ *	(e.g., SCSI and Ethernet).
  * 
  *	The register selects a DWORD (32 bit) register offset.  Hence it
  *	doesn't get shifted by 2 bits as we want to "drop" the bottom two
@@ -520,7 +520,7 @@
 	sable_cpu_regs[cpu]->sic &= ~SIC_SEIC;
 
 	/* 
-	 * clear cpu errors
+	 * clear CPU errors
 	 */
 	sable_cpu_regs[cpu]->bcce |= sable_cpu_regs[cpu]->bcce;
 	sable_cpu_regs[cpu]->cbe  |= sable_cpu_regs[cpu]->cbe;
diff -u --recursive --new-file v2.1.106/linux/arch/alpha/kernel/time.c linux/arch/alpha/kernel/time.c
--- v2.1.106/linux/arch/alpha/kernel/time.c	Wed Apr  1 20:11:47 1998
+++ linux/arch/alpha/kernel/time.c	Wed Jun 24 14:30:08 1998
@@ -57,7 +57,7 @@
 	__u32 last_time;
 	/* ticks/cycle * 2^48 */
 	unsigned long scaled_ticks_per_cycle;
-	/* last time the cmos clock got updated */
+	/* last time the CMOS clock got updated */
 	time_t last_rtc_update;
 } state;
 
diff -u --recursive --new-file v2.1.106/linux/arch/alpha/kernel/tsunami.c linux/arch/alpha/kernel/tsunami.c
--- v2.1.106/linux/arch/alpha/kernel/tsunami.c	Mon Apr  6 17:40:59 1998
+++ linux/arch/alpha/kernel/tsunami.c	Wed Jun 24 14:30:08 1998
@@ -1,7 +1,7 @@
 /*
  * Code common to all TSUNAMI chips.
  *
- * Based on code written by David A Rusling (david.rusling@reo.mts.dec.com).
+ * Based on code written by David A. Rusling (david.rusling@reo.mts.dec.com).
  *
  */
 #include <linux/kernel.h>
@@ -18,7 +18,7 @@
 
 /*
  * NOTE: Herein lie back-to-back mb instructions.  They are magic. 
- * One plausible explanation is that the i/o controller does not properly
+ * One plausible explanation is that the I/O controller does not properly
  * handle the system transaction.  Another involves timing.  Ho hum.
  */
 
@@ -84,7 +84,7 @@
  *  
  * Notes:
  *	The function number selects which function of a multi-function device 
- *	(e.g., scsi and ethernet).
+ *	(e.g., SCSI and Ethernet).
  * 
  *	The register selects a DWORD (32 bit) register offset.  Hence it
  *	doesn't get shifted by 2 bits as we want to "drop" the bottom two
diff -u --recursive --new-file v2.1.106/linux/arch/alpha/lib/strlen_user.S linux/arch/alpha/lib/strlen_user.S
--- v2.1.106/linux/arch/alpha/lib/strlen_user.S	Fri Jan  3 08:48:37 1997
+++ linux/arch/alpha/lib/strlen_user.S	Wed Jun 24 14:30:08 1998
@@ -2,7 +2,7 @@
  * arch/alpha/lib/strlen_user.S
  *
  * Return the length of the string including the NUL terminator
- * (strlen+1) or zero if an error occured.
+ * (strlen+1) or zero if an error occurred.
  */
 
 #include <alpha/regdef.h>
diff -u --recursive --new-file v2.1.106/linux/arch/alpha/mm/fault.c linux/arch/alpha/mm/fault.c
--- v2.1.106/linux/arch/alpha/mm/fault.c	Tue Jun 23 10:01:19 1998
+++ linux/arch/alpha/mm/fault.c	Wed Jun 24 14:30:08 1998
@@ -111,7 +111,7 @@
 	unsigned fixup;
 
 	/* As of EV6, a load into $31/$f31 is a prefetch, and never faults
-	   (or is suppressed by the PALcode).  Support that for older cpu's
+	   (or is suppressed by the PALcode).  Support that for older CPUs
 	   by ignoring such an instruction.  */
 	if (cause == 0) {
 		unsigned int insn;
diff -u --recursive --new-file v2.1.106/linux/arch/i386/boot/bootsect.S linux/arch/i386/boot/bootsect.S
--- v2.1.106/linux/arch/i386/boot/bootsect.S	Mon Feb 23 18:12:02 1998
+++ linux/arch/i386/boot/bootsect.S	Wed Jun 24 14:30:08 1998
@@ -413,7 +413,7 @@
 	rol	dx, #4		! rotate so that lowest 4 bits are used
 	mov	ax, #0xe0f	! ah = request, al = mask for nybble
 	and	al, dl
-	add	al, #0x90	! convert al to ascii hex (four instructions)
+	add	al, #0x90	! convert al to ASCII hex (four instructions)
 	daa
 	adc	al, #0x40
 	daa
diff -u --recursive --new-file v2.1.106/linux/arch/i386/boot/compressed/misc.c linux/arch/i386/boot/compressed/misc.c
--- v2.1.106/linux/arch/i386/boot/compressed/misc.c	Sun Dec 21 17:27:17 1997
+++ linux/arch/i386/boot/compressed/misc.c	Wed Jun 24 14:30:08 1998
@@ -38,7 +38,7 @@
 static unsigned outcnt = 0;  /* bytes in output buffer */
 
 /* gzip flag byte */
-#define ASCII_FLAG   0x01 /* bit 0 set: file probably ascii text */
+#define ASCII_FLAG   0x01 /* bit 0 set: file probably ASCII text */
 #define CONTINUATION 0x02 /* bit 1 set: continuation of multi-part gzip file */
 #define EXTRA_FIELD  0x04 /* bit 2 set: extra field present */
 #define ORIG_NAME    0x08 /* bit 3 set: original file name present */
diff -u --recursive --new-file v2.1.106/linux/arch/i386/boot/setup.S linux/arch/i386/boot/setup.S
--- v2.1.106/linux/arch/i386/boot/setup.S	Tue Jun 23 10:01:19 1998
+++ linux/arch/i386/boot/setup.S	Wed Jun 24 14:30:08 1998
@@ -145,7 +145,7 @@
 	jne	bad_sig
 	jmp	good_sig1
 
-! Routine to print asciiz-string at DS:SI
+! Routine to print ASCII string at DS:SI
 
 prtstr:	lodsb
 	and	al,al
@@ -159,7 +159,7 @@
 prtsp2:	call	prtspc		! Print double space
 prtspc:	mov	al,#0x20	! Print single space (fall-thru!)
 
-! Part of above routine, this one just prints ascii al
+! Part of above routine, this one just prints ASCII al
 
 prtchr:	push	ax
 	push	cx
@@ -226,12 +226,12 @@
 
 ! check if an old loader tries to load a big-kernel
 	seg cs
-	test	byte ptr loadflags,#LOADED_HIGH ! have we a big kernel ?
+	test	byte ptr loadflags,#LOADED_HIGH ! Have we a big kernel?
 	jz	loader_ok	! NO, no danger even for old loaders
 				! YES, we have a big-kernel
 	seg cs
-	cmp	byte ptr type_of_loader,#0 ! have we one of the new loaders ?
-	jnz	loader_ok	! YES, ok
+	cmp	byte ptr type_of_loader,#0 ! Have we one of the new loaders?
+	jnz	loader_ok	! YES, OK
 				! NO, we have an old loader, must give up
 	push    cs
 	pop	ds
@@ -239,7 +239,7 @@
 	call	prtstr
 	jmp	no_sig_loop
 loader_panic_mess: 
-	.ascii	"Wrong loader, giving up..."
+	.ascii	"Wrong loader:  giving up."
 	db	0
 
 loader_ok:
@@ -255,8 +255,8 @@
 	int     0x15
 	jc      oldstylemem
 
-! memory size is in 1k chunksizes, to avoid confusing loadlin.
-! we store the 0xe801 memory size in a completely different place,
+! Memory size is in 1 k chunksizes, to avoid confusing loadlin.
+! We store the 0xe801 memory size in a completely different place,
 ! because it will most likely be longer than 16 bits.
 ! (use 1e0 because that's what Larry Augustine uses in his
 ! alternative new memory detection scheme, and it's sensible
@@ -270,7 +270,7 @@
  	add     [0x1e0],eax     ! and add lower memory into total size.
   
 	! and fall into the old memory detection code to populate the
-	! compatability slot.
+	! compatibility slot.
 
 oldstylemem:
 	pop	ebx
@@ -290,7 +290,7 @@
 ! Check for video adapter and its parameters and allow the
 ! user to browse video modes.
 
-	call	video	! NOTE: we need DS pointing to bootsector
+	call	video	! NOTE: we need DS pointing to boot sector
 
 ! Get hd0 data
 
@@ -380,7 +380,7 @@
 
 #ifdef CONFIG_APM
 ! check for APM BIOS
-		! NOTE:	DS is pointing to the bootsector
+		! NOTE:	DS is pointing to the boot sector
 		!
 	mov	[64],#0		! version == 0 means no APM BIOS
 
@@ -479,7 +479,7 @@
 	mov	ds,ax
 
 ! If we have our code not at 0x90000, we need to move it there now.
-! We also then need to move the params behind it (commandline)
+! We also then need to move the parameters behind it (command line)
 ! Because we would overwrite the code on the current IP, we move
 ! it in two steps, jumping high after the first one.
 	mov	ax,cs
@@ -532,21 +532,26 @@
 	call	empty_8042
 
 ! wait until a20 really *is* enabled; it can take a fair amount of
-! time on any
-	
+! time on certain systems; Toshiba Tecras are known to have this
+! problem.  The memory location used here is the int 0x1f vector,
+! which should be safe to use; any *unused* memory location < 0xfff0
+! should work here.  
+
+#define	TEST_ADDR 0x7c
+
 	push	ds
-	push	es
 	xor	ax,ax			! segment 0x0000
 	mov	ds,ax
 	dec	ax			! segment 0xffff (HMA)
-	mov	es,ax
+	mov	gs,ax
+	mov	bx,[TEST_ADDR]		! we want to restore the value later
 a20_wait:
 	inc	ax
-	mov	[0x7c00],ax		! any unused memory location < 64K
-	seg	es
-	cmp	ax,[0x7c10]		! corresponding HMA address
+	mov	[TEST_ADDR],ax
+	seg	gs
+	cmp	ax,[TEST_ADDR+0x10]
 	je	a20_wait		! loop until no longer aliased
-	pop	es
+	mov	[TEST_ADDR],bx		! restore original value
 	pop	ds
 		
 ! make sure any possible coprocessor is properly reset..
@@ -595,12 +600,12 @@
 
 ! Well, that certainly wasn't fun :-(. Hopefully it works, and we don't
 ! need no steenking BIOS anyway (except for the initial loading :-).
-! The BIOS-routine wants lots of unnecessary data, and it's less
+! The BIOS routine wants lots of unnecessary data, and it's less
 ! "interesting" anyway. This is how REAL programmers do it.
 !
 ! Well, now's the time to actually move into protected mode. To make
 ! things as simple as possible, we do no register set-up or anything,
-! we let the gnu-compiled 32-bit programs do that. We just jump to
+! we let the GNU-compiled 32-bit programs do that. We just jump to
 ! absolute address 0x1000 (or the loader supplied one),
 ! in 32-bit protected mode.
 !
@@ -720,7 +725,7 @@
 bootsect_panic_loop:
 	jmp	bootsect_panic_loop
 bootsect_panic_mess:
-	.ascii	"INT15 refuses to access high mem, giving up..."
+	.ascii	"INT15 refuses to access high memory.  Giving up."
 	db	0
 
 ! This routine checks that the keyboard command queue is empty
@@ -742,7 +747,7 @@
 	ret
 
 !
-! Read the cmos clock. Return the seconds in al
+! Read the CMOS clock. Return the seconds in al
 !
 gettime:
 	push	cx
diff -u --recursive --new-file v2.1.106/linux/arch/i386/boot/tools/build.c linux/arch/i386/boot/tools/build.c
--- v2.1.106/linux/arch/i386/boot/tools/build.c	Wed May 20 19:10:37 1998
+++ linux/arch/i386/boot/tools/build.c	Wed Jun 24 14:30:08 1998
@@ -187,7 +187,7 @@
 	}
 	close(fd);
 
-	if (lseek(1, 497, SEEK_SET) != 497)		    /* Write sizes to the bootsector */
+	if (lseek(1, 497, SEEK_SET) != 497)		    /* Write sizes to the boot sector */
 		die("Output: seek failed");
 	buf[0] = setup_sectors;
 	if (write(1, buf, 1) != 1)
diff -u --recursive --new-file v2.1.106/linux/arch/i386/boot/video.S linux/arch/i386/boot/video.S
--- v2.1.106/linux/arch/i386/boot/video.S	Mon Feb 23 18:12:02 1998
+++ linux/arch/i386/boot/video.S	Wed Jun 24 14:44:00 1998
@@ -1,7 +1,7 @@
 !
-!	Display adapter & video mode setup, version 2.11 (03-May-97)
+!	Display adapter & video mode setup, version 2.12 (25-May-98)
 !
-!	Copyright (C) 1995 -- 1997 Martin Mares <mj@k332.feld.cvut.cz>
+!	Copyright (C) 1995 -- 1998 Martin Mares <mj@atrey.karlin.mff.cuni.cz>
 !	Based on the original setup.S code (C) Linus Torvalds and Mats Anderson
 !
 
@@ -68,14 +68,23 @@
 #define VIDEO_RECALC 0x8000
 
 ! Positions of various video parameters passed to the kernel
-#define PARAM_CURSOR_POS	0
-#define PARAM_VIDEO_PAGE	4
-#define PARAM_VIDEO_MODE	6
-#define PARAM_VIDEO_COLS	7
-#define PARAM_VIDEO_EGA_BX	10
-#define PARAM_VIDEO_LINES	14
-#define PARAM_HAVE_VGA		15
-#define PARAM_FONT_POINTS	16
+! (see also include/linux/tty.h)
+#define PARAM_CURSOR_POS	0x00
+#define PARAM_VIDEO_PAGE	0x04
+#define PARAM_VIDEO_MODE	0x06
+#define PARAM_VIDEO_COLS	0x07
+#define PARAM_VIDEO_EGA_BX	0x0a
+#define PARAM_VIDEO_LINES	0x0e
+#define PARAM_HAVE_VGA		0x0f
+#define PARAM_FONT_POINTS	0x10
+
+#define PARAM_LFB_WIDTH		0x12
+#define PARAM_LFB_HEIGHT	0x14
+#define PARAM_LFB_DEPTH		0x16
+#define PARAM_LFB_BASE		0x18
+#define PARAM_LFB_SIZE		0x1c
+#define PARAM_LFB_LINELENGTH	0x24
+#define PARAM_LFB_COLORS	0x26
 
 ! Define DO_STORE according to CONFIG_VIDEO_RETAIN
 #ifdef CONFIG_VIDEO_RETAIN
@@ -88,7 +97,7 @@
 ! This is the main entry point called by setup.S
 !
 ! Input:
-!	DS pointing to the bootsector
+!	DS pointing to the boot sector
 
 video:	push	ds		! We use different segments
 	push	ds		! FS contains original DS
@@ -155,6 +164,11 @@
 !
 
 mode_params:
+#ifdef CONFIG_VIDEO_SELECT
+	cmpb	[graphic_mode],#0
+	jnz	mopar_gr
+#endif
+
 	mov	ah,#0x03	! Read cursor position
 	xor	bh,bh
 	int	0x10
@@ -197,6 +211,50 @@
 #ifdef CONFIG_VIDEO_SELECT
 
 !
+! Fetching of VESA frame buffer parameters
+!
+
+mopar_gr:
+	lea	di,modelist+1024
+	seg	fs
+	movb	[PARAM_HAVE_VGA],#0x23
+
+	mov	ax,(di+16)
+	seg	fs
+	mov	[PARAM_LFB_LINELENGTH],ax
+
+	mov	ax,(di+18)
+	seg	fs
+	mov	[PARAM_LFB_WIDTH],ax
+
+	mov	ax,(di+20)
+	seg	fs
+	mov	[PARAM_LFB_HEIGHT],ax
+
+	mov	al,(di+25)
+	mov	ah,#0
+	seg	fs
+	mov	[PARAM_LFB_DEPTH],ax
+
+	mov	eax,(di+40)
+	seg	fs
+	mov	[PARAM_LFB_BASE],eax
+
+	mov	eax,(di+44)
+	seg	fs
+	mov	[PARAM_LFB_SIZE],eax
+
+	mov	eax,(di+31)
+	seg	fs
+	mov	[PARAM_LFB_COLORS],eax
+
+	mov	eax,(di+35)
+	seg	fs
+	mov	[PARAM_LFB_COLORS+4],eax
+	
+	ret
+
+!
 ! The video mode menu
 !
 
@@ -355,7 +413,8 @@
 	stc
 	ret
 
-_setrec:	br	setrec	! Ugly...
+_setrec:	br	setrec		! Ugly...
+_set_80x25:	br	set_80x25
 
 !
 ! Aliases for backward compatibility.
@@ -369,7 +428,7 @@
 	inc	bx
 	jnz	setbad
 
-	! Fall-thru !
+	! Fall-through!
 
 !
 ! Setting of user mode (AX=mode ID) => CF=success
@@ -388,7 +447,7 @@
 	cmp	ah,#VIDEO_FIRST_V7>>8
 	jz	setv7
 	cmp	ah,#VIDEO_FIRST_VESA>>8
-	jnc	setvesa
+	jnc	check_vesa
 	or	ah,ah
 	jz	setmenu
 	dec	ah
@@ -427,7 +486,7 @@
 
 setmenu:
 	or	al,al		! 80x25 is an exception
-	jz	set_80x25
+	jz	_set_80x25
 	push	bx		! Set mode chosen from menu
 	call	mode_table	! Build the mode table
 	pop	ax
@@ -452,6 +511,41 @@
 	mov	ax,(si-4)	! Fetch mode ID
 	jmp	_m_s
 
+
+check_vesa:
+	lea	di,modelist+1024
+	sub	bh,#VIDEO_FIRST_VESA>>8
+	mov	cx,bx		! Get mode information structure
+	mov	ax,#0x4f01
+	int	0x10
+	add	bh,#VIDEO_FIRST_VESA>>8
+	cmp	ax,#0x004f
+	jnz	setbad
+
+	mov	al,(di)		! Check capabilities.
+	and	al,#0x19
+	cmp	al,#0x09
+	jz	setvesa		! this is a text mode
+
+	mov	al,(di)		! Check capabilities.
+	and	al,#0x99
+	cmp	al,#0x99
+	jnz	_setbad		! to bad, no linear frame buffer
+
+	sub	bh,#VIDEO_FIRST_VESA>>8
+	or	bx,#0x4000	! want use linear frame buffer	
+	mov	ax,#0x4f02	! VESA BIOS mode set call
+	int	0x10
+	cmp	ax,#0x004f	! AL=4f if implemented, AH=0 if OK
+	jnz	_setbad
+
+	movb	[graphic_mode],#1 ! flag graphic mode
+	movb	[do_restore],#0   ! no screen restore
+	stc
+	ret
+	
+_setbad:	br	setbad		! Ugly...
+	
 !
 ! Recalculate vertical display end registers -- this fixes various
 ! inconsistencies of extended modes on many adapters. Called when
@@ -525,9 +619,9 @@
 	jz	set80
 	seg	gs		! This is EGA+ -- beware of 80x50 etc.
 	mov	al,[0x0484]
-	or	al,al		! Some buggy BIOS'es set 0 rows
+	or	al,al		! Some buggy BIOSs set 0 rows
 	jz	set80
-	cmp	al,#24		! It's hopefully correct
+	cmp	al,#24		! Let's hope this is correct
 	jz	set80
 #endif /* CONFIG_VIDEO_400_HACK */
 force3:	DO_STORE
@@ -929,7 +1023,7 @@
 	jz	vesar
 	cmp	ax,#0x0080	! Check validity of mode ID
 	jc	vesa2
-	or	ah,ah		! Valid ID's are 0x0000-0x007f and 0x0100-0x07ff
+	or	ah,ah		! Valid IDs are 0x0000-0x007f and 0x0100-0x07ff
 	jz	vesan		! [Certain BIOSes erroneously report 0x80-0xff]
 	cmp	ax,#0x0800
 	jnc	vesae
@@ -1393,7 +1487,7 @@
 	cmp	al,#0x01
 	jne	c2fail
 	mov	al,#0xaa
-	call	inidx	! 4X, 5X, 7X and 8X are valid 64XX chip ID's
+	call	inidx	! 4X, 5X, 7X and 8X are valid 64XX chip IDs
 	shr	al,#4
 	sub	al,#4
 	jz	c6done
@@ -1577,7 +1671,7 @@
 
 tseng_test:
 	mov	dx,#0x3cd
-	in	al,dx			! Could things be this simple ! :-)
+	in	al,dx			! Could things be this simple? :-)
 	mov	bl,al
 	mov	al,#0x55
 	out	dx,al
@@ -1798,6 +1892,7 @@
 scanning:	.byte	0	! Performing mode scan
 do_restore:	.byte	0	! Screen contents altered during mode change
 svga_prefix:	.byte	VIDEO_FIRST_BIOS>>8	! Default prefix for BIOS modes
+graphic_mode:	.byte	0	! Graphic mode with a linear frame buffer
 
 !
 ! Messages:
diff -u --recursive --new-file v2.1.106/linux/arch/i386/config.in linux/arch/i386/config.in
--- v2.1.106/linux/arch/i386/config.in	Sat May  2 14:19:52 1998
+++ linux/arch/i386/config.in	Wed Jun 24 14:50:44 1998
@@ -66,6 +66,10 @@
   fi
 fi
 
+if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then
+  bool 'Support for frame buffer devices (EXPERIMENTAL)' CONFIG_FB
+fi
+
 endmenu
 
 source drivers/pnp/Config.in
@@ -121,6 +125,10 @@
 
 source fs/nls/Config.in
 
+define_bool CONFIG_VGA_CONSOLE y
+
+source drivers/video/Config.in
+
 source drivers/char/Config.in
 
 mainmenu_option next_comment
@@ -143,4 +151,3 @@
 bool 'Magic SysRq key' CONFIG_MAGIC_SYSRQ
 endmenu
 
-define_bool CONFIG_VGA_CONSOLE y
diff -u --recursive --new-file v2.1.106/linux/arch/i386/defconfig linux/arch/i386/defconfig
--- v2.1.106/linux/arch/i386/defconfig	Tue Jun  9 11:57:28 1998
+++ linux/arch/i386/defconfig	Wed Jun 24 14:51:06 1998
@@ -245,6 +245,7 @@
 # CONFIG_UFS_FS is not set
 # CONFIG_MAC_PARTITION is not set
 # CONFIG_NLS is not set
+CONFIG_VGA_CONSOLE=y
 
 #
 # Character devices
@@ -288,4 +289,3 @@
 CONFIG_PROFILE=y
 CONFIG_PROFILE_SHIFT=2
 # CONFIG_MAGIC_SYSRQ is not set
-CONFIG_VGA_CONSOLE=y
diff -u --recursive --new-file v2.1.106/linux/arch/i386/kernel/io_apic.c linux/arch/i386/kernel/io_apic.c
--- v2.1.106/linux/arch/i386/kernel/io_apic.c	Tue Jun  9 11:57:28 1998
+++ linux/arch/i386/kernel/io_apic.c	Wed Jun 24 14:30:08 1998
@@ -1,5 +1,5 @@
 /*
- *	Intel IO-APIC support for multi-pentium hosts.
+ *	Intel IO-APIC support for multi-Pentium hosts.
  *
  *	Copyright (C) 1997, 1998 Ingo Molnar, Hajnalka Szabo
  *
@@ -129,7 +129,7 @@
 }
 
 /*
- * Syncronize the IO-APIC and the CPU by doing
+ * Synchronize the IO-APIC and the CPU by doing
  * a dummy read from the IO-APIC
  */
 static inline void io_apic_sync(void)
@@ -206,7 +206,7 @@
 
 
 /*
- * support for broken MP BIOSes, enables hand-redirection of PIRQ0-7 to
+ * support for broken MP BIOSs, enables hand-redirection of PIRQ0-7 to
  * specific CPU-side IRQs.
  */
 
@@ -243,7 +243,7 @@
 }
 
 /*
- * Find the irq entry nr of a certain pin.
+ * Find the IRQ entry number of a certain pin.
  */
 __initfunc(static int find_irq_entry(int pin, int type))
 {
@@ -520,7 +520,7 @@
 			return (irq_trigger(idx));
 	}
 	/*
-	 * nonexistant IRQs are edge default
+	 * nonexistent IRQs are edge default
 	 */
 	return 0;
 }
@@ -634,16 +634,16 @@
 	struct IO_APIC_reg_01 reg_01;
 	struct IO_APIC_reg_02 reg_02;
 
- 	printk("nr of MP irq sources: %d.\n", mp_irq_entries);
- 	printk("nr of IO-APIC registers: %d.\n", nr_ioapic_registers);
+ 	printk("number of MP IRQ sources: %d.\n", mp_irq_entries);
+ 	printk("number of IO-APIC registers: %d.\n", nr_ioapic_registers);
 
 	*(int *)&reg_00 = io_apic_read(0);
 	*(int *)&reg_01 = io_apic_read(1);
 	*(int *)&reg_02 = io_apic_read(2);
 
 	/*
-	 * We are a bit conservative about what we expect, we have to
-	 * know about every HW change ASAP ...
+	 * We are a bit conservative about what we expect.  We have to
+	 * know about every hardware change ASAP.
 	 */
 	printk("testing the IO APIC.......................\n");
 
@@ -723,7 +723,7 @@
 		for (i=0; i<MAX_PIRQS; i++)
 			pirq_entries[i]=-1;
 
-	printk("enabling Symmetric IO mode ... ");
+	printk("enabling symmetric IO mode... ");
 
 	outb(0x70, 0x22);
 	outb(0x01, 0x23);
@@ -731,7 +731,7 @@
 	printk("...done.\n");
 
 	/*
-	 * The number of IO-APIC irq-registers (== #pins):
+	 * The number of IO-APIC IRQ registers (== #pins):
 	 */
 	{
 		struct IO_APIC_reg_01 reg_01;
@@ -752,7 +752,7 @@
  */
 void init_pic_mode (void)
 {
-	printk("disabling Symmetric IO mode ... ");
+	printk("disabling symmetric IO mode... ");
 		outb_p (0x70, 0x22);
 		outb_p (0x00, 0x23);
 	printk("...done.\n");
@@ -793,7 +793,7 @@
 {
 /*
  * Right now, whitelist everything to see whether the new parsing
- * routines really do work for everybody..
+ * routines really do work for everybody.
  */
 #if 1
 	return 1;
@@ -829,7 +829,7 @@
 	 * Set the ID
 	 */
 	*(int *)&reg_00 = io_apic_read(0);
-	printk("... changing IO-APIC physical APIC ID to 2 ...\n");
+	printk("...changing IO-APIC physical APIC ID to 2...\n");
 	reg_00.ID = 0x2;
 	io_apic_write(0, *(int *)&reg_00);
 
@@ -938,7 +938,7 @@
 }
 
 /*
- * Level triggered interrupts can just be masked
+ * Level triggered interrupts can just be masked.
  */
 static void enable_level_ioapic_irq(unsigned int irq)
 {
@@ -973,7 +973,7 @@
 	spin_lock(&irq_controller_lock);
 
 	/*
-	 * Edge triggered IRQs can be acked immediately
+	 * Edge triggered IRQs can be acknowledged immediately
 	 * and do not need to be masked.
 	 */
 	ack_APIC_irq();
@@ -981,8 +981,8 @@
 	desc->events = 1;
 
 	/*
-	 * If the irq is disabled for whatever reason, we cannot
-	 * use the action we have..
+	 * If the IRQ is disabled for whatever reason, we cannot
+	 * use the action we have.
 	 */
 	action = NULL;
 	if (!(desc->status & (IRQ_DISABLED | IRQ_INPROGRESS))) {
@@ -1002,7 +1002,7 @@
 
 	/*
 	 * Edge triggered interrupts need to remember
-	 * pending events..
+	 * pending events.
 	 */
 	for (;;) {
 		int pending;
@@ -1042,8 +1042,8 @@
 	desc->ipi = 0;
 
 	/*
-	 * If the irq is disabled for whatever reason, we must
-	 * not enter the irq action.
+	 * If the IRQ is disabled for whatever reason, we must
+	 * not enter the IRQ action.
 	 */
 	action = NULL;
 	if (!(desc->status & (IRQ_DISABLED | IRQ_INPROGRESS))) {
@@ -1073,7 +1073,7 @@
 
 /*
  * Level and edge triggered IO-APIC interrupts need different handling,
- * so we use two separate irq descriptors. edge triggered IRQs can be
+ * so we use two separate IRQ descriptors. Edge triggered IRQs can be
  * handled with the level-triggered descriptor, but that one has slightly
  * more overhead. Level-triggered interrupts cannot be handled with the
  * edge-triggered handler, without risking IRQ storms and other ugly
@@ -1103,10 +1103,10 @@
 	 * As the interrupt level is determined by taking the
 	 * vector number and shifting that right by 4, we
 	 * want to spread these out a bit so that they don't
-	 * all fall in the same interrupt level
+	 * all fall in the same interrupt level.
 	 *
-	 * also, we've got to be careful not to trash gate
-	 * 0x80, because int 0x80 is hm, kindof importantish ;)
+	 * Also, we've got to be careful not to trash gate
+	 * 0x80, because int 0x80 is hm, kind of importantish. ;)
 	 */
 	for (i = 0; i < NR_IRQS ; i++) {
 		if ((IO_APIC_VECTOR(i) <= 0xfe)  /* HACK */ &&
@@ -1128,9 +1128,9 @@
 
 /*
  * This code may look a bit paranoid, but it's supposed to cooperate with
- * a wide range of boards and BIOS bugs ... fortunately only the timer IRQ
- * is so screwy. Thanks to Brian Perkins for testing/hacking this beast
- * fanatically on his truly bugged board.
+ * a wide range of boards and BIOS bugs.  Fortunately only the timer IRQ
+ * is so screwy.  Thanks to Brian Perkins for testing/hacking this beast
+ * fanatically on his truly buggy board.
  */
 __initfunc(static void check_timer (void))
 {
@@ -1142,7 +1142,7 @@
 	if (!timer_irq_works ()) {
 		if (pin1 != -1)
 			printk("..MP-BIOS bug: 8254 timer not connected to IO-APIC\n");
-		printk("..trying to set up timer as ExtINT ... ");
+		printk("...trying to set up timer as ExtINT... ");
 
 		if (pin2 != -1) {
 			printk(".. (found pin %d) ...", pin2);
@@ -1152,7 +1152,7 @@
 
 		if (!timer_irq_works ()) {
 			printk(" failed.\n");
-			printk("..trying to set up timer as BP irq ...");
+			printk("...trying to set up timer as BP IRQ...");
 			/*
 			 * Just in case ...
 			 */
@@ -1165,7 +1165,7 @@
 
 			if (!timer_irq_works ()) {
 				printk(" failed.\n");
-				panic("IO-APIC + timer doesnt work!");
+				panic("IO-APIC + timer doesn't work!");
 			}
 		}
 		printk(" works.\n");
@@ -1201,7 +1201,7 @@
 	}
 
 	/*
-	 * If there are no explicit mp irq entries: it's either one of the
+	 * If there are no explicit MP IRQ entries, it's either one of the
 	 * default configuration types or we are broken. In both cases it's
 	 * fine to set up most of the low 16 IO-APIC pins to ISA defaults.
 	 */
@@ -1213,7 +1213,7 @@
 	init_IO_APIC_traps();
 
 	/*
-	 * Set up the IO-APIC irq routing table by parsing the MP-BIOS
+	 * Set up the IO-APIC IRQ routing table by parsing the MP-BIOS
 	 * mptable:
 	 */
 	setup_IO_APIC_irqs ();
diff -u --recursive --new-file v2.1.106/linux/arch/i386/kernel/irq.c linux/arch/i386/kernel/irq.c
--- v2.1.106/linux/arch/i386/kernel/irq.c	Sun Jun  7 11:16:27 1998
+++ linux/arch/i386/kernel/irq.c	Wed Jun 24 14:30:08 1998
@@ -11,7 +11,7 @@
  */
 
 /*
- * IRQ's are in fact implemented a bit like signal handlers for the kernel.
+ * IRQs are in fact implemented a bit like signal handlers for the kernel.
  * Naturally it's not a 1:1 relation, but there are similarities.
  */
 
@@ -385,7 +385,7 @@
  * Such 'high frequency update' races can be avoided by careful design, but
  * some of our major constructs like spinlocks use similar techniques,
  * it would be nice to clarify this issue. Set this define to 0 if you
- * want to check wether your system freezes. I suspect the delay done
+ * want to check whether your system freezes.  I suspect the delay done
  * by SYNC_OTHER_CORES() is in correlation with 'snooping latency', but
  * i thought that such things are guaranteed by design, since we use
  * the 'LOCK' prefix.
diff -u --recursive --new-file v2.1.106/linux/arch/i386/kernel/mtrr.c linux/arch/i386/kernel/mtrr.c
--- v2.1.106/linux/arch/i386/kernel/mtrr.c	Sun Jun  7 11:16:27 1998
+++ linux/arch/i386/kernel/mtrr.c	Wed Jun 24 14:30:08 1998
@@ -486,7 +486,7 @@
 };
 
 
-/* Grab all of the mtrr state for this cpu into *state. */
+/* Grab all of the MTRR state for this CPU into *state. */
 __initfunc(static void get_mtrr_state(struct mtrr_state *state))
 {
     unsigned int nvrs, i;
@@ -697,7 +697,7 @@
     }
 }   /*  End Function copy_mtrr_state_handler  */
 
-/* Copies the entire MTRR state of this cpu to all the others. */
+/* Copies the entire MTRR state of this CPU to all the others. */
 static void copy_mtrr_state (void)
 {
     struct mtrr_state ms;
diff -u --recursive --new-file v2.1.106/linux/arch/i386/kernel/process.c linux/arch/i386/kernel/process.c
--- v2.1.106/linux/arch/i386/kernel/process.c	Tue Jun 23 10:01:19 1998
+++ linux/arch/i386/kernel/process.c	Wed Jun 24 14:30:08 1998
@@ -261,7 +261,7 @@
    something else should be done for other chips.
 
    More could be done here to set up the registers as if a CPU reset had
-   occurred; hopefully real BIOSes don't assume much. */
+   occurred; hopefully real BIOSs don't assume much. */
 
 static unsigned char real_mode_switch [] =
 {
@@ -546,7 +546,7 @@
 }
 
 /*
- * fill in the fpu structure for a core dump..
+ * fill in the FPU structure for a core dump.
  */
 int dump_fpu (struct pt_regs * regs, struct user_i387_struct* fpu)
 {
diff -u --recursive --new-file v2.1.106/linux/arch/i386/kernel/setup.c linux/arch/i386/kernel/setup.c
--- v2.1.106/linux/arch/i386/kernel/setup.c	Tue Jun 23 10:01:19 1998
+++ linux/arch/i386/kernel/setup.c	Wed Jun 24 14:44:00 1998
@@ -32,6 +32,7 @@
 #ifdef CONFIG_BLK_DEV_RAM
 #include <linux/blk.h>
 #endif
+#include <linux/console.h>
 #include <asm/uaccess.h>
 #include <asm/system.h>
 #include <asm/smp.h>
@@ -210,12 +211,20 @@
 	}
 #endif
 
-	/* request io space for devices used on all i[345]86 PC'S */
+	/* request I/O space for devices used on all i[345]86 PCs */
 	request_region(0x00,0x20,"dma1");
 	request_region(0x40,0x20,"timer");
 	request_region(0x80,0x10,"dma page reg");
 	request_region(0xc0,0x20,"dma2");
 	request_region(0xf0,0x10,"fpu");
+
+#ifdef CONFIG_VT
+#ifdef CONFIG_FB
+	conswitchp = &fb_con;
+#else
+	conswitchp = &vga_con;
+#endif
+#endif
 }
 
 /*
@@ -359,10 +368,10 @@
 	  { NULL, NULL, NULL, "DX/2", NULL, NULL, NULL, "DX/2-WB", "DX/4",
 	    "DX/4-WB", NULL, NULL, NULL, NULL, "Am5x86-WT", "Am5x86-WB" }},
 	{ X86_VENDOR_AMD,	5,
-	  { "K5/SSA5 (PR-75, PR-90, PR-100)", "K5 (PR-120, PR-133)",
-	    "K5 (PR-166)", "K5 (PR-200)", NULL, NULL,
-	    "K6 (166 - 266)", "K6 (166 - 300)", "K6-2 (200 - 450)",
-	    "K6-3D-Plus (200 - 450)", NULL, NULL, NULL, NULL, NULL, NULL }},
+	  { "K5/SSA5 (PR75, PR90, PR100)", "K5 (PR120, PR133)",
+	    "K5 (PR166)", "K5 (PR200)", NULL, NULL,
+	    "K6 (PR166 - PR266)", "K6 (PR166 - PR300)", "K6-2 (PR233 - PR333)",
+	    "K6-3 (PR300 - PR450)", NULL, NULL, NULL, NULL, NULL, NULL }},
 	{ X86_VENDOR_UMC,	4,
 	  { NULL, "U5D", "U5S", NULL, NULL, NULL, NULL, NULL, NULL, NULL,
 	    NULL, NULL, NULL, NULL, NULL, NULL }},
@@ -457,7 +466,7 @@
 			continue;
 #endif
 		p += sprintf(p, "processor\t: %d\n"
-			       "cpu family\t: %c\n"
+			       "CPU family\t: %c\n"
 			       "model\t\t: %s\n"
 			       "vendor_id\t: %s\n",
 			       n,
@@ -503,9 +512,9 @@
 			        "hlt_bug\t\t: %s\n"
 			        "sep_bug\t\t: %s\n"
 			        "f00f_bug\t: %s\n"
-			        "fpu\t\t: %s\n"
-			        "fpu_exception\t: %s\n"
-			        "cpuid level\t: %d\n"
+			        "FPU\t\t: %s\n"
+			        "FPU_exception\t: %s\n"
+			        "CPUID level\t: %d\n"
 			        "wp\t\t: %s\n"
 			        "flags\t\t:",
 			     c->fdiv_bug ? "yes" : "no",
diff -u --recursive --new-file v2.1.106/linux/arch/i386/kernel/smp.c linux/arch/i386/kernel/smp.c
--- v2.1.106/linux/arch/i386/kernel/smp.c	Tue Jun 23 10:01:19 1998
+++ linux/arch/i386/kernel/smp.c	Wed Jun 24 14:30:08 1998
@@ -64,19 +64,19 @@
 /*
  *	Some notes on processor bugs:
  *
- *	Pentium and Pentium Pro (and all CPU's) have bugs. The Linux issues
+ *	Pentium and Pentium Pro (and all CPUs) have bugs. The Linux issues
  *	for SMP are handled as follows.
  *
  *	Pentium Pro
  *		Occasional delivery of 'spurious interrupt' as trap #16. This
- *	is very very rare. The kernel logs the event and recovers
+ *	is very rare. The kernel logs the event and recovers
  *
  *	Pentium
  *		There is a marginal case where REP MOVS on 100MHz SMP
  *	machines with B stepping processors can fail. XXX should provide
  *	an L1cache=Writethrough or L1cache=off option.
  *
- *		B stepping CPU's may hang. There are hardware work arounds
+ *		B stepping CPUs may hang. There are hardware work arounds
  *	for this. We warn about it in case your board doesnt have the work
  *	arounds. Basically thats so I can tell anyone with a B stepping
  *	CPU and SMP problems "tough".
@@ -116,15 +116,15 @@
 static int max_cpus = -1;				/* Setup configured maximum number of CPUs to activate	*/
 int smp_found_config=0;					/* Have we found an SMP box 				*/
 
-unsigned long cpu_present_map = 0;			/* Bitmask of existing CPU's 				*/
-int smp_num_cpus = 1;					/* Total count of live CPU's 				*/
+unsigned long cpu_present_map = 0;			/* Bitmask of existing CPUs 				*/
+int smp_num_cpus = 1;					/* Total count of live CPUs 				*/
 int smp_threads_ready=0;				/* Set when the idlers are all forked 			*/
 volatile int cpu_number_map[NR_CPUS];			/* which CPU maps to which logical number		*/
 volatile int __cpu_logical_map[NR_CPUS];			/* which logical number maps to which CPU		*/
 volatile unsigned long cpu_callin_map[NR_CPUS] = {0,};	/* We always use 0 the rest is ready for parallel delivery */
 volatile unsigned long smp_invalidate_needed;		/* Used for the invalidate map that's also checked in the spinlock */
-volatile unsigned long kstack_ptr;			/* Stack vector for booting CPU's			*/
-struct cpuinfo_x86 cpu_data[NR_CPUS];			/* Per cpu bogomips and other parameters 		*/
+volatile unsigned long kstack_ptr;			/* Stack vector for booting CPUs			*/
+struct cpuinfo_x86 cpu_data[NR_CPUS];			/* Per CPU bogomips and other parameters 		*/
 static unsigned int num_processors = 1;			/* Internal processor count				*/
 static unsigned long io_apic_addr = 0xFEC00000;		/* Address of the I/O apic (not yet used) 		*/
 unsigned char boot_cpu_id = 0;				/* Processor that is doing the boot up 			*/
@@ -140,7 +140,7 @@
 volatile unsigned long kernel_counter=0;		/* Number of times the processor holds the lock		*/
 volatile unsigned long syscall_count=0;			/* Number of times the processor holds the syscall lock	*/
 
-volatile unsigned long ipi_count;			/* Number of IPI's delivered				*/
+volatile unsigned long ipi_count;			/* Number of IPIs delivered				*/
 
 volatile unsigned long  smp_proc_in_lock[NR_CPUS] = {0,};/* for computing process time */
 volatile int smp_process_available=0;
@@ -396,7 +396,7 @@
 		}
 	}
 	if(apics>1)
-		printk("Warning: Multiple APIC's not supported.\n");
+		printk("Warning: Multiple APICs not supported.\n");
 	return num_processors;
 }
 
@@ -448,7 +448,7 @@
  *
  *	HACK HACK HACK HACK HACK HACK HACK HACK HACK HACK HACK HACK HACK
  *
- *	It's not just a crazy hack...  ;-)
+ *	It's not just a crazy hack.  ;-)
  */
 					/*
 					 *	Standard page mapping
@@ -614,17 +614,17 @@
 /*
  *	Architecture specific routine called by the kernel just before init is
  *	fired off. This allows the BP to have everything in order [we hope].
- *	At the end of this all the AP's will hit the system scheduling and off
+ *	At the end of this all the APs will hit the system scheduling and off
  *	we go. Each AP will load the system gdt's and jump through the kernel
  *	init into idle(). At this point the scheduler will one day take over
  * 	and give them jobs to do. smp_callin is a standard routine
- *	we use to track CPU's as they power up.
+ *	we use to track CPUs as they power up.
  */
 
 __initfunc(void smp_commence(void))
 {
 	/*
-	 *	Lets the callin's below out of their loop.
+	 *	Lets the callins below out of their loop.
 	 */
 	SMP_PRINTK(("Setting commenced=1, go go go\n"));
 	smp_commenced=1;
@@ -705,7 +705,7 @@
 
 /*
  * Everything has been set up for the secondary
- * CPU's - they just need to reload everything
+ * CPUs - they just need to reload everything
  * from the task structure
  */
 __initfunc(void initialize_secondary(void))
@@ -928,7 +928,7 @@
 unsigned int prof_counter[NR_CPUS];
 
 /*
- *	Cycle through the processors sending APIC IPI's to boot each.
+ *	Cycle through the processors sending APIC IPIs to boot each.
  */
 
 __initfunc(void smp_boot_cpus(void))
@@ -941,7 +941,7 @@
 	mtrr_init_boot_cpu ();
 #endif
 	/*
-	 *	Initialize the logical to physical cpu number mapping
+	 *	Initialize the logical to physical CPU number mapping
 	 *	and the per-CPU profiling counter/multiplier
 	 */
 
@@ -1031,7 +1031,7 @@
 	setup_APIC_clock ();
 
 	/*
-	 *	Now scan the cpu present map and fire up the other CPUs.
+	 *	Now scan the CPU present map and fire up the other CPUs.
 	 */
 
 	SMP_PRINTK(("CPU map: %lx\n", cpu_present_map));
@@ -1161,16 +1161,16 @@
 }
 
 /*
- * A non wait message cannot pass data or cpu source info. This current setup
+ * A non wait message cannot pass data or CPU source info. This current setup
  * is only safe because the kernel lock owner is the only person who can send
  * a message.
  *
  * Wrapping this whole block in a spinlock is not the safe answer either. A
- * processor may get stuck with irq's off waiting to send a message and thus
- * not replying to the person spinning for a reply....
+ * processor may get stuck with IRQs off waiting to send a message and thus
+ * not replying to the person spinning for a reply.
  *
- * In the end flush tlb ought to be the NMI and a very very short function
- * (to avoid the old IDE disk problems), and other messages sent with IRQ's
+ * In the end flush tlb ought to be the NMI and a very short function
+ * (to avoid the old IDE disk problems), and other messages sent with IRQs
  * enabled in a civilised fashion. That will also boost performance.
  */
 
@@ -1223,15 +1223,15 @@
 	}
 
 	/*
-	 * Sanity check we don't re-enter this across CPU's. Only the kernel
-	 * lock holder may send messages. For a STOP_CPU we are bringing the
-	 * entire box to the fastest halt we can.. A reschedule carries
-	 * no data and can occur during a flush.. guess what panic
-	 * I got to notice this bug...
+	 * Sanity check we don't re-enter this across CPUs.  Only the kernel
+	 * lock holder may send messages.  For a STOP_CPU we are bringing the
+	 * entire box to the fastest halt we can.  A reschedule carries
+	 * no data and can occur during a flush.  Guess what panic
+	 * I got to notice this bug.
 	 */
 	
 	/*
-	 *	We are busy
+	 *	We are busy.
 	 */
 	
 	smp_cpu_in_msg[p]++;
@@ -1240,7 +1240,7 @@
 		p, msg, target);*/
 
 	/*
-	 * Wait for the APIC to become ready - this should never occur. Its
+	 * Wait for the APIC to become ready - this should never occur. It's
 	 * a debugging check really.
 	 */
 	
@@ -1327,7 +1327,7 @@
 
 /*
  *	This is fraught with deadlocks. Linus does a flush tlb at a whim
- *	even with IRQ's off. We have to avoid a pair of crossing flushes
+ *	even with IRQs off. We have to avoid a pair of crossing flushes
  *	or we are doomed.  See the notes about smp_message_pass.
  */
 
@@ -1447,7 +1447,7 @@
 	 * we might want to decouple profiling from the 'long path',
 	 * and do the profiling totally in assembly.
 	 *
-	 * Currently this isnt too much of an issue (performance wise),
+	 * Currently this isn't too much of an issue (performance wise),
 	 * we can take more than 100K local irqs per second on a 100 MHz P5.
 	 */
 }
@@ -1617,7 +1617,7 @@
 		delta = curr_count-prev_count;
 
 	/*
-	 * This limit for delta seems arbitrary, but it isnt, it's
+	 * This limit for delta seems arbitrary, but it isn't, it's
 	 * slightly above the level of error a buggy Mercury/Neptune
 	 * chipset timer can cause.
 	 */
@@ -1670,7 +1670,7 @@
 
 #define LOOPS (HZ/10)
 	/*
-	 * let's wait LOOPS wraprounds:
+	 * Let's wait LOOPS wraprounds:
 	 */
 	for (i=0; i<LOOPS; i++)
 		wait_8254_wraparound ();
diff -u --recursive --new-file v2.1.106/linux/arch/i386/kernel/sys_i386.c linux/arch/i386/kernel/sys_i386.c
--- v2.1.106/linux/arch/i386/kernel/sys_i386.c	Tue Jun 23 10:01:19 1998
+++ linux/arch/i386/kernel/sys_i386.c	Wed Jun 24 14:30:08 1998
@@ -24,7 +24,7 @@
 
 /*
  * sys_pipe() is the normal C calling standard for creating
- * a pipe. It's not the way unix traditionally does this, though.
+ * a pipe. It's not the way Unix traditionally does this, though.
  */
 asmlinkage int sys_pipe(unsigned long * fildes)
 {
@@ -63,10 +63,11 @@
 	struct file * file = NULL;
 	struct mmap_arg_struct a;
 
+	if (copy_from_user(&a, arg, sizeof(a)))
+		return -EFAULT;
+
 	down(&current->mm->mmap_sem);
 	lock_kernel();
-	if (copy_from_user(&a, arg, sizeof(a)))
-		goto out;
 	if (!(a.flags & MAP_ANONYMOUS)) {
 		error = -EBADF;
 		file = fget(a.fd);
diff -u --recursive --new-file v2.1.106/linux/arch/i386/kernel/traps.c linux/arch/i386/kernel/traps.c
--- v2.1.106/linux/arch/i386/kernel/traps.c	Wed Apr  1 20:11:47 1998
+++ linux/arch/i386/kernel/traps.c	Wed Jun 24 14:30:08 1998
@@ -303,7 +303,7 @@
 }
 
 /*
- * Note that we play around with the 'TS' bit to hopefully get
+ * Note that we play around with the 'TS' bit in an attempt to get
  * the correct behaviour even in the presence of the asynchronous
  * IRQ13 behaviour
  */
diff -u --recursive --new-file v2.1.106/linux/arch/i386/kernel/vm86.c linux/arch/i386/kernel/vm86.c
--- v2.1.106/linux/arch/i386/kernel/vm86.c	Thu May  7 22:51:46 1998
+++ linux/arch/i386/kernel/vm86.c	Wed Jun 24 14:30:08 1998
@@ -27,9 +27,9 @@
  *   as the next instruction might result in a page fault or similar.
  * - a real x86 will have interrupts disabled for one instruction
  *   past the 'sti' that enables them. We don't bother with all the
- *   details yet..
+ *   details yet.
  *
- * Hopefully these problems do not actually matter for anything.
+ * Let's hope these problems do not actually matter for anything.
  */
 
 
diff -u --recursive --new-file v2.1.106/linux/arch/i386/lib/checksum.c linux/arch/i386/lib/checksum.c
--- v2.1.106/linux/arch/i386/lib/checksum.c	Tue Jun 23 10:01:19 1998
+++ linux/arch/i386/lib/checksum.c	Wed Jun 24 14:30:08 1998
@@ -33,9 +33,9 @@
 
 unsigned int csum_partial(const unsigned char * buff, int len, unsigned int sum) {
 	  /*
-	   * Experiments with ethernet and slip connections show that buff
+	   * Experiments with Ethernet and SLIP connections show that buff
 	   * is aligned on either a 2-byte or 4-byte boundary.  We get at
-	   * least a 2x speedup on 486 and Pentium if it is 4-byte aligned.
+	   * least a twofold speedup on 486 and Pentium if it is 4-byte aligned.
 	   * Fortunately, it is easy to convert 2-byte alignment to 4-byte
 	   * alignment for the unrolled loop.
 	   */
@@ -118,7 +118,7 @@
             negl %%ebx
             lea 45f(%%ebx,%%ebx,2), %%ebx
             testl %%esi, %%esi
-            jmp %%ebx
+            jmp *%%ebx
 
             # Handle 2-byte-aligned regions
 20:         addw (%%esi), %%ax
@@ -203,9 +203,9 @@
  * The macros SRC and DST specify the type of access for the instruction.
  * thus we can call a custom exception handler for all access types.
  *
- * FIXME: could someone double check wether i havent mixed up some SRC and
- *	  DST definitions? It's damn hard to trigger all cases, i hope i got
- *	  them all but theres no guarantee ...
+ * FIXME: could someone double-check whether I haven't mixed up some SRC and
+ *	  DST definitions? It's damn hard to trigger all cases.  I hope I got
+ *	  them all but there's no guarantee.
  */
 
 #define SRC(y...)			\
@@ -369,7 +369,7 @@
         subl %%ebx, %%edi  
         lea 3f(%%ebx,%%ebx), %%ebx
         testl %%esi, %%esi 
-        jmp %%ebx         
+        jmp *%%ebx         
 1:      addl $64,%%esi
         addl $64,%%edi\n" 
 ROUND1(-64) ROUND(-60) ROUND(-56) ROUND(-52)
diff -u --recursive --new-file v2.1.106/linux/arch/i386/lib/locks.S linux/arch/i386/lib/locks.S
--- v2.1.106/linux/arch/i386/lib/locks.S	Thu Mar 26 15:57:02 1998
+++ linux/arch/i386/lib/locks.S	Wed Jun 24 14:30:08 1998
@@ -7,7 +7,7 @@
 
 	/* Caller does atomic increment on current->lock_depth,
 	 * if it was found to originally be zero then we get here,
-	 * %eax contains callers PC and %edx holds this cpu ID.
+	 * %eax contains caller's PC and %edx holds this CPU ID.
 	 */
 ENTRY(__lock_kernel)
 1:
diff -u --recursive --new-file v2.1.106/linux/arch/i386/math-emu/README linux/arch/i386/math-emu/README
--- v2.1.106/linux/arch/i386/math-emu/README	Tue Dec  9 17:57:09 1997
+++ linux/arch/i386/math-emu/README	Wed Jun 24 14:30:08 1998
@@ -131,7 +131,7 @@
           movl %esp,[%ebx]
 	  fld1
 The FPU instruction may be (usually will be) loaded into the pre-fetch
-queue of the cpu before the mov instruction is executed. If the
+queue of the CPU before the mov instruction is executed. If the
 destination of the 'movl' overlaps the FPU instruction then the bytes
 in the prefetch queue and memory will be inconsistent when the FPU
 instruction is executed. The emulator will be invoked but will not be
@@ -163,7 +163,7 @@
 The speed of floating point computation with the emulator will depend
 upon instruction mix. Relative performance is best for the instructions
 which require most computation. The simple instructions are adversely
-affected by the fpu instruction trap overhead.
+affected by the FPU instruction trap overhead.
 
 
 Timing: Some simple timing tests have been made on the emulator functions.
diff -u --recursive --new-file v2.1.106/linux/arch/i386/math-emu/reg_mul.c linux/arch/i386/math-emu/reg_mul.c
--- v2.1.106/linux/arch/i386/math-emu/reg_mul.c	Tue Dec  9 17:57:09 1997
+++ linux/arch/i386/math-emu/reg_mul.c	Wed Jun 24 14:30:08 1998
@@ -7,7 +7,7 @@
  |                  W. Metzenthen, 22 Parker St, Ormond, Vic 3163, Australia |
  |                  E-mail   billm@suburbia.net                              |
  |                                                                           |
- | Returns the tag of the result if no exceptions or errors occured.         |
+ | Returns the tag of the result if no exceptions or errors occurred.        |
  |                                                                           |
  +---------------------------------------------------------------------------*/
 
diff -u --recursive --new-file v2.1.106/linux/arch/m68k/config.in linux/arch/m68k/config.in
--- v2.1.106/linux/arch/m68k/config.in	Tue Jun 23 10:01:20 1998
+++ linux/arch/m68k/config.in	Wed Jun 24 14:44:00 1998
@@ -318,9 +318,6 @@
   bool '   Software Watchdog' CONFIG_SOFT_WATCHDOG
 fi
 bool 'Support for user misc device modules' CONFIG_UMISC
-if [ "$CONFIG_AMIGA" = "y" -o "$CONFIG_ATARI" = "y" -o "$CONFIG_MAC" = "y" ]; then
-  define_bool CONFIG_ABSTRACT_CONSOLE y
-fi
 if [ "$CONFIG_ATARI" = "y" ]; then
   bool 'Enhanced Real Time Clock Support' CONFIG_RTC
 fi
diff -u --recursive --new-file v2.1.106/linux/arch/ppc/config.in linux/arch/ppc/config.in
--- v2.1.106/linux/arch/ppc/config.in	Fri May  8 23:14:44 1998
+++ linux/arch/ppc/config.in	Wed Jun 24 14:44:00 1998
@@ -77,23 +77,21 @@
   fi
 fi
 
-if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then
-  bool 'New unified console driver (EXPERIMENTAL)' CONFIG_ABSTRACT_CONSOLE
+bool 'Support for frame buffer devices' CONFIG_FB
+if [ "$CONFIG_FB" = "y" ]; then
+  bool 'Backward compatibility mode for Xpmac' CONFIG_FB_COMPAT_XPMAC
+else
+  define_bool CONFIG_ABSCON_COMPAT y
 fi
 
 if [ "$CONFIG_PMAC" = "y" ]; then
-  if [ "$CONFIG_ABSTRACT_CONSOLE" = "y" ]; then
-    define_bool CONFIG_FB y
-    bool 'Backward compatibility mode for Xpmac' CONFIG_FB_COMPAT_XPMAC
-  else
+  if [ "$CONFIG_FB" != "y" ]; then
     define_bool CONFIG_PMAC_CONSOLE y
   fi
 else
 # if compiling specifically for prep or chrp, or supporting all arch's
-  if [ "$CONFIG_ABSTRACT_CONSOLE" = "y" ]; then
-    bool 'Support for frame buffer devices' CONFIG_FB
+  if [ "$CONFIG_FB" = "y" ]; then
     bool 'Support for VGA devices' CONFIG_VGA_CONSOLE
-    bool 'Backward compatibility mode for Xpmac' CONFIG_FB_COMPAT_XPMAC
   else
     bool 'Support for PowerMac console' CONFIG_PMAC_CONSOLE
   fi
@@ -108,7 +106,7 @@
 bool 'Include kgdb kernel debugger' CONFIG_KGDB
 bool 'Include xmon kernel debugger' CONFIG_XMON
 
-if [ "$CONFIG_ABSTRACT_CONSOLE" != "y" ]; then
+if [ "$CONFIG_FB" != "y" ]; then
   if [ "$CONFIG_PMAC_CONSOLE" = "y" ]; then
     bool 'Support for Apple "control" display' CONFIG_CONTROL_VIDEO
     bool 'Support for Apple "platinum" display' CONFIG_PLATINUM_VIDEO
@@ -176,9 +174,7 @@
 
 source fs/nls/Config.in
 
-if [ "$CONFIG_ABSTRACT_CONSOLE" = "y" ]; then
-  source drivers/video/Config.in
-fi
+source drivers/video/Config.in
 
 source drivers/char/Config.in
 
diff -u --recursive --new-file v2.1.106/linux/arch/ppc/kernel/chrp_setup.c linux/arch/ppc/kernel/chrp_setup.c
--- v2.1.106/linux/arch/ppc/kernel/chrp_setup.c	Fri May  8 23:14:44 1998
+++ linux/arch/ppc/kernel/chrp_setup.c	Wed Jun 24 14:44:00 1998
@@ -28,9 +28,7 @@
 #include <linux/init.h>
 #include <linux/blk.h>
 #include <linux/ioport.h>
-#ifdef CONFIG_ABSTRACT_CONSOLE
 #include <linux/console.h>
-#endif
 
 #include <asm/mmu.h>
 #include <asm/processor.h>
@@ -263,5 +261,9 @@
 #ifdef CONFIG_FB
 	/* Frame buffer device based console */
 	conswitchp = &fb_con;
+#endif
+#ifdef CONFIG_ABSCON_COMPAT
+	/* Console wrapper */
+	conswitchp = &compat_con;
 #endif
 }
diff -u --recursive --new-file v2.1.106/linux/arch/ppc/kernel/pmac_setup.c linux/arch/ppc/kernel/pmac_setup.c
--- v2.1.106/linux/arch/ppc/kernel/pmac_setup.c	Fri May  8 23:14:45 1998
+++ linux/arch/ppc/kernel/pmac_setup.c	Wed Jun 24 14:44:00 1998
@@ -38,9 +38,8 @@
 #include <linux/delay.h>
 #include <linux/ioport.h>
 #include <linux/major.h>
-#ifdef CONFIG_ABSTRACT_CONSOLE
+#include <linux/vt_kern.h>
 #include <linux/console.h>
-#endif
 #include <asm/prom.h>
 #include <asm/system.h>
 #include <asm/pgtable.h>
@@ -142,6 +141,12 @@
 	/* Frame buffer device based console */
 	conswitchp = &fb_con;
 #endif
+#ifdef CONFIG_ABSCON_COMPAT
+	/* Console wrapper */
+	conswitchp = &compat_con;
+#endif
+
+	kd_mksound = pmac_mksound;
 }
 
 static volatile u32 *feature_addr;
diff -u --recursive --new-file v2.1.106/linux/arch/ppc/kernel/prep_setup.c linux/arch/ppc/kernel/prep_setup.c
--- v2.1.106/linux/arch/ppc/kernel/prep_setup.c	Fri May  8 23:14:45 1998
+++ linux/arch/ppc/kernel/prep_setup.c	Wed Jun 24 14:44:00 1998
@@ -28,9 +28,7 @@
 #include <linux/init.h>
 #include <linux/blk.h>
 #include <linux/ioport.h>
-#ifdef CONFIG_ABSTRACT_CONSOLE
 #include <linux/console.h>
-#endif
 
 #include <asm/mmu.h>
 #include <asm/processor.h>
@@ -256,9 +254,11 @@
 	request_region(0x80,0x10,"dma page reg");
 	request_region(0xc0,0x20,"dma2");
 
-#ifdef CONFIG_ABSTRACT_CONSOLE
 #ifdef CONFIG_VGA_CONSOLE
         conswitchp = &vga_con;
 #endif
+#ifdef CONFIG_ABSCON_COMPAT
+	/* Console wrapper */
+	conswitchp = &compat_con;
 #endif
 }
diff -u --recursive --new-file v2.1.106/linux/drivers/Makefile linux/drivers/Makefile
--- v2.1.106/linux/drivers/Makefile	Tue Jun  9 11:57:28 1998
+++ linux/drivers/Makefile	Wed Jun 24 14:44:02 1998
@@ -1,15 +1,15 @@
 #
-# Makefile for the linux kernel device drivers.
+# Makefile for the Linux kernel device drivers.
 #
 # Note! Dependencies are done automagically by 'make dep', which also
 # removes any old dependencies. DON'T put your own dependencies here
-# unless it's something special (ie not a .c file).
+# unless it's something special (not a .c file).
 #
-# Note 2! The CFLAGS definitions are now in the main makefile...
+# Note 2! The CFLAGS definitions are now in the main makefile.
 
 SUB_DIRS     := block char net misc sound
 MOD_SUB_DIRS := $(SUB_DIRS) sbus
-ALL_SUB_DIRS := $(SUB_DIRS) pci scsi sbus cdrom isdn pnp macintosh
+ALL_SUB_DIRS := $(SUB_DIRS) pci scsi sbus cdrom isdn pnp macintosh video
 
 ifdef CONFIG_PCI
 SUB_DIRS += pci
@@ -19,12 +19,17 @@
 SUB_DIRS += sbus
 endif
 
+ifdef CONFIG_VT
+SUB_DIRS += video
+MOD_SUB_DIRS += video
+endif
+
 ifdef CONFIG_PPC
 SUB_DIRS += macintosh
 MOD_SUB_DIRS += macintosh
 endif
 
-# If CONFIG_SCSI is set, the core of scsi support will be added to the kernel,
+# If CONFIG_SCSI is set, the core of SCSI support will be added to the kernel,
 # but some of the low-level things may also be modules.
 ifeq ($(CONFIG_SCSI),y)
 SUB_DIRS += scsi
@@ -63,10 +68,9 @@
 ALL_SUB_DIRS += ap1000
 endif
 
-# make will try to add $(MOD_SUB_DIRS).o to modules/MOD_LIST_NAME 
-# when MOD_LIST_NAME is set. We don't have hamradio.o and Linus
-# sort-of insisted on making hamradio a subdirectory to drivers/net.
-#
+# When MOD_LIST_NAME is set, make will try to add $(MOD_SUB_DIRS).o to
+# modules/MOD_LIST_NAME.  We don't have hamradio.o and Linus
+# sort of insisted on making hamradio/ a subdirectory of drivers/net/.
 
 ifeq ($(CONFIG_HAMRADIO),y)
   SUB_DIRS += net/hamradio
diff -u --recursive --new-file v2.1.106/linux/drivers/block/Config.in linux/drivers/block/Config.in
--- v2.1.106/linux/drivers/block/Config.in	Thu May 14 19:47:39 1998
+++ linux/drivers/block/Config.in	Wed Jun 24 14:30:08 1998
@@ -8,7 +8,7 @@
 tristate 'Enhanced IDE/MFM/RLL disk/cdrom/tape/floppy support' CONFIG_BLK_DEV_IDE
 comment 'Please see Documentation/ide.txt for help/info on IDE drives'
 if [ "$CONFIG_BLK_DEV_IDE" = "n" ]; then
-  bool 'Old harddisk (MFM/RLL/IDE) driver' CONFIG_BLK_DEV_HD_ONLY
+  bool 'Old hard disk (MFM/RLL/IDE) driver' CONFIG_BLK_DEV_HD_ONLY
 else
   bool '   Use old disk-only driver on primary interface' CONFIG_BLK_DEV_HD_IDE
   dep_tristate '   Include IDE/ATA-2 DISK support' CONFIG_BLK_DEV_IDEDISK $CONFIG_BLK_DEV_IDE
@@ -54,7 +54,7 @@
   fi
 fi
 if [ "$CONFIG_MCA" = "y" ]; then
-  bool 'PS/2 ESDI harddisk support' CONFIG_BLK_DEV_PS2
+  bool 'PS/2 ESDI hard disk support' CONFIG_BLK_DEV_PS2
 fi
 
 comment 'Additional Block Devices'
@@ -75,7 +75,7 @@
 if [ "$CONFIG_BLK_DEV_RAM" = "y" ]; then
   bool '   Initial RAM disk (initrd) support' CONFIG_BLK_DEV_INITRD
 fi
-tristate 'XT harddisk support' CONFIG_BLK_DEV_XD
+tristate 'XT hard disk support' CONFIG_BLK_DEV_XD
 
 # PARIDE doesn't need PARPORT, but if PARPORT is configured as a module,
 # PARIDE must also be a module.  The bogus CONFIG_PARIDE_PARPORT option
diff -u --recursive --new-file v2.1.106/linux/drivers/block/README.fd linux/drivers/block/README.fd
--- v2.1.106/linux/drivers/block/README.fd	Mon Jan 12 14:57:50 1998
+++ linux/drivers/block/README.fd	Wed Jun 24 14:30:08 1998
@@ -7,8 +7,8 @@
 at http://poboxes.com/Alain.Knaff/floppy/FAQ.html
 
 
-Lilo config options (Thinkpad users, read this)
-===============================================
+LILO configuration options (Thinkpad users, read this)
+======================================================
 
  The floppy driver is configured using the 'floppy=' option in
 lilo. This option can be typed at the boot prompt, or entered in the
@@ -104,7 +104,7 @@
 
 floppy=nofifo
 	Disables the FIFO entirely. This is needed if you get "Bus
-	master arbitration error" messages from your ethernet card (or
+	master arbitration error" messages from your Ethernet card (or
 	from other devices) while accessing the floppy.
 
 floppy=fifo
diff -u --recursive --new-file v2.1.106/linux/drivers/block/acsi.c linux/drivers/block/acsi.c
--- v2.1.106/linux/drivers/block/acsi.c	Fri May  8 23:14:47 1998
+++ linux/drivers/block/acsi.c	Wed Jun 24 14:30:08 1998
@@ -39,7 +39,7 @@
  *    knows the PREVENT/ALLOW MEDIUM REMOVAL command, the door should
  *    be locked and unlocked when mounting the first or unmounting the
  *    last filesystem on the device. The code is untested, because I
- *    don't have a removable harddisk.
+ *    don't have a removable hard disk.
  *
  */
 
@@ -147,7 +147,7 @@
 #define TYPE_NO_LUN	0x7f
 
 /* The data returned by MODE SENSE differ between the old Atari
- * harddisks and SCSI disks connected to ACSI. In the following, both
+ * hard disks and SCSI disks connected to ACSI. In the following, both
  * formats are defined and some macros to operate on them potably.
  */
 
diff -u --recursive --new-file v2.1.106/linux/drivers/block/floppy.c linux/drivers/block/floppy.c
--- v2.1.106/linux/drivers/block/floppy.c	Tue Jun 23 10:01:22 1998
+++ linux/drivers/block/floppy.c	Wed Jun 24 14:30:09 1998
@@ -3962,7 +3962,7 @@
 	int current_drive=0;
 
 	if (ints[0] != 2){
-		DPRINT("wrong number of parameter for cmos\n");
+		DPRINT("wrong number of parameters for CMOS\n");
 		return;
 	}
 	current_drive = ints[1];
@@ -3974,11 +3974,11 @@
 		FDC2 = 0x370;
 	if (ints[2] <= 0 || 
 	    (ints[2] >= NUMBER(default_drive_params) && ints[2] != 16)){
-		DPRINT("bad cmos code %d\n", ints[2]);
+		DPRINT("bad CMOS code %d\n", ints[2]);
 		return;
 	}
 	DP->cmos = ints[2];
-	DPRINT("setting cmos code to %d\n", ints[2]);
+	DPRINT("setting CMOS code to %d\n", ints[2]);
 }
 
 static struct param_table {
diff -u --recursive --new-file v2.1.106/linux/drivers/block/genhd.c linux/drivers/block/genhd.c
--- v2.1.106/linux/drivers/block/genhd.c	Thu Feb 12 20:56:05 1998
+++ linux/drivers/block/genhd.c	Wed Jun 24 14:30:09 1998
@@ -1000,7 +1000,7 @@
 
 	/*
 	 * This is a kludge to allow the partition check to be
-	 * skipped for specific drives (e.g. IDE cd-rom drives)
+	 * skipped for specific drives (e.g. IDE CD-ROM drives)
 	 */
 	if ((int)first_sector == -1) {
 		hd->part[MINOR(dev)].start_sect = 0;
diff -u --recursive --new-file v2.1.106/linux/drivers/block/hd.c linux/drivers/block/hd.c
--- v2.1.106/linux/drivers/block/hd.c	Sun Jun  7 11:16:28 1998
+++ linux/drivers/block/hd.c	Wed Jun 24 14:30:09 1998
@@ -690,10 +690,10 @@
 }
 
 /*
- * This is the harddisk IRQ description. The SA_INTERRUPT in sa_flags
- * means we run the IRQ-handler with interrupts disabled: this is bad for
+ * This is the hard disk IRQ description. The SA_INTERRUPT in sa_flags
+ * means we run the IRQ-handler with interrupts disabled:  this is bad for
  * interrupt latency, but anything else has led to problems on some
- * machines...
+ * machines.
  *
  * We enable interrupts in some of the routines after making sure it's
  * safe.
@@ -760,7 +760,7 @@
 	}
 	if (NR_HD) {
 		if (request_irq(HD_IRQ, hd_interrupt, SA_INTERRUPT, "hd", NULL)) {
-			printk("hd: unable to get IRQ%d for the harddisk driver\n",HD_IRQ);
+			printk("hd: unable to get IRQ%d for the hard disk driver\n",HD_IRQ);
 			NR_HD = 0;
 		} else {
 			request_region(HD_DATA, 8, "hd");
@@ -790,7 +790,7 @@
 __initfunc(int hd_init(void))
 {
 	if (register_blkdev(MAJOR_NR,"hd",&hd_fops)) {
-		printk("hd: unable to get major %d for harddisk\n",MAJOR_NR);
+		printk("hd: unable to get major %d for hard disk\n",MAJOR_NR);
 		return -1;
 	}
 	blk_dev[MAJOR_NR].request_fn = DEVICE_REQUEST;
diff -u --recursive --new-file v2.1.106/linux/drivers/block/ht6560b.c linux/drivers/block/ht6560b.c
--- v2.1.106/linux/drivers/block/ht6560b.c	Thu May  7 22:51:48 1998
+++ linux/drivers/block/ht6560b.c	Wed Jun 24 14:30:09 1998
@@ -30,7 +30,7 @@
  * of the value is the Active Time  (at). Minimum value 2 is the fastest and
  * the maximum value 15 is the slowest. Default values should be 15 for both.
  * So 0x24 means 2 for rt and 4 for at. Each of the drives should have
- * both values, and IDESETUP gives automatically rt=15 st=15 for cdroms or
+ * both values, and IDESETUP gives automatically rt=15 st=15 for CDROMs or
  * similar. If value is too small there will be all sorts of failures.
  *
  * Port 0x3e6 bit 0x20 sets these timings on/off. If 0x20 bit is set
@@ -103,7 +103,7 @@
  * Active Time for each drive. Smaller value gives higher speed.
  * In case of failures you should probably fall back to a higher value.
  *
- * Hopefully this example will make it clearer:
+ * Here's an example to make it clearer:
  *
  * DOS:    DEVICE=C:\bin\HTIDE\HTIDE.SYS /D0=2,4 /D1=4,5 /D2=10,10 /D3=15,15
  * Linux:  byte ht6560b_timings [][] = {{0x24, 0x45}, {0xaa, 0xff}};
@@ -198,7 +198,7 @@
 
 	if (pio == 255)  {	/* auto-tune */
 		if (drive->media != ide_disk)
-			pio = 0; /* some cdroms don't like fast modes (?) */
+			pio = 0; /* some CDROMs don't like fast modes (?) */
 		else
 			pio = ide_get_best_pio_mode(drive, pio, 5, NULL);
 	}
diff -u --recursive --new-file v2.1.106/linux/drivers/block/loop.c linux/drivers/block/loop.c
--- v2.1.106/linux/drivers/block/loop.c	Thu May  7 22:51:48 1998
+++ linux/drivers/block/loop.c	Wed Jun 24 11:08:59 1998
@@ -166,8 +166,8 @@
 {
 	int	size;
 
-	if (S_ISREG(lo->lo_inode->i_mode))
-		size = (lo->lo_inode->i_size - lo->lo_offset) / BLOCK_SIZE;
+	if (S_ISREG(lo->lo_dentry->d_inode->i_mode))
+		size = (lo->lo_dentry->d_inode->i_size - lo->lo_offset) / BLOCK_SIZE;
 	else {
 		kdev_t lodev = lo->lo_device;
 		if (blk_size[MAJOR(lodev)])
@@ -195,7 +195,7 @@
 	if (MINOR(current_request->rq_dev) >= MAX_LOOP)
 		goto error_out;
 	lo = &loop_dev[MINOR(current_request->rq_dev)];
-	if (!lo->lo_inode || !lo->transfer)
+	if (!lo->lo_dentry || !lo->transfer)
 		goto error_out;
 
 	blksize = BLOCK_SIZE;
@@ -229,13 +229,14 @@
 		printk("unknown loop device command (%d)?!?", current_request->cmd);
 		goto error_out;
 	}
+	spin_unlock_irq(&io_request_lock);
 	while (len > 0) {
 		real_block = block;
 		if (lo->lo_flags & LO_FLAGS_DO_BMAP) {
-			real_block = bmap(lo->lo_inode, block);
+			real_block = bmap(lo->lo_dentry->d_inode, block);
 			if (!real_block) {
 				printk("loop: block %d not present\n", block);
-				goto error_out;
+				goto error_out_lock;
 			}
 		}
 		bh = getblk(lo->lo_device, real_block, blksize);
@@ -243,7 +244,7 @@
 			printk("loop: device %s: getblk(-, %d, %d) returned NULL",
 			       kdevname(lo->lo_device),
 			       block, blksize);
-			goto error_out;
+			goto error_out_lock;
 		}
 		if (!buffer_uptodate(bh) && ((current_request->cmd == READ) ||
 					(offset || (len < blksize)))) {
@@ -251,7 +252,7 @@
 			wait_on_buffer(bh);
 			if (!buffer_uptodate(bh)) {
 				brelse(bh);
-				goto error_out;
+				goto error_out_lock;
 			}
 		}
 		size = blksize - offset;
@@ -262,7 +263,7 @@
 				   dest_addr, size)) {
 			printk("loop: transfer error block %d\n", block);
 			brelse(bh);
-			goto error_out;
+			goto error_out_lock;
 		}
 		if (current_request->cmd == WRITE) {
 			mark_buffer_uptodate(bh, 1);
@@ -274,10 +275,13 @@
 		offset = 0;
 		block++;
 	}
+	spin_lock_irq(&io_request_lock);
 	current_request->next=CURRENT;
 	CURRENT=current_request;
 	end_request(1);
 	goto repeat;
+error_out_lock:
+	spin_lock_irq(&io_request_lock);
 error_out:
 	current_request->next=CURRENT;
 	CURRENT=current_request;
@@ -292,15 +296,16 @@
 	int error;
 
 	MOD_INC_USE_COUNT;
+
+	error = -EBUSY;
+	if (lo->lo_dentry)
+		goto out;
+
 	error = -EBADF;
 	file = fget(arg);
 	if (!file)
 		goto out;
 
-	error = -EBUSY;
-	if (lo->lo_inode)
-		goto out_putf;
-
 	error = -EINVAL;
 	inode = file->f_dentry->d_inode;
 	if (!inode) {
@@ -328,9 +333,8 @@
 		set_device_ro(dev, 0);
 	}
 
-	/* N.B. Should keep the file or dentry ... */
-	inode->i_count++;
-	lo->lo_inode = inode;
+	lo->lo_dentry = file->f_dentry;
+	lo->lo_dentry->d_count++;
 	lo->transfer = NULL;
 	figure_loop_size(lo);
 
@@ -344,17 +348,17 @@
 
 static int loop_clr_fd(struct loop_device *lo, kdev_t dev)
 {
-	struct inode *inode = lo->lo_inode;
+	struct dentry *dentry = lo->lo_dentry;
 
-	if (!inode)
+	if (!dentry)
 		return -ENXIO;
 	if (lo->lo_refcnt > 1)	/* we needed one fd for the ioctl */
 		return -EBUSY;
 
-	if (S_ISBLK(inode->i_mode))
-		blkdev_release (inode);
-	lo->lo_inode = NULL;
-	iput(inode);
+	if (S_ISBLK(dentry->d_inode->i_mode))
+		blkdev_release (dentry->d_inode);
+	lo->lo_dentry = NULL;
+	dput(dentry);
 	lo->lo_device = 0;
 	lo->lo_encrypt_type = 0;
 	lo->lo_offset = 0;
@@ -372,7 +376,7 @@
 	struct loop_info info;
 	int err;
 
-	if (!lo->lo_inode)
+	if (!lo->lo_dentry)
 		return -ENXIO;
 	if (!arg)
 		return -EINVAL;
@@ -432,7 +436,7 @@
 	struct loop_info	info;
 	int err;
 	
-	if (!lo->lo_inode)
+	if (!lo->lo_dentry)
 		return -ENXIO;
 	if (!arg)
 		return -EINVAL;
@@ -441,8 +445,8 @@
 		return err;
 	memset(&info, 0, sizeof(info));
 	info.lo_number = lo->lo_number;
-	info.lo_device = kdev_t_to_nr(lo->lo_inode->i_dev);
-	info.lo_inode = lo->lo_inode->i_ino;
+	info.lo_device = kdev_t_to_nr(lo->lo_dentry->d_inode->i_dev);
+	info.lo_inode = lo->lo_dentry->d_inode->i_ino;
 	info.lo_rdevice = kdev_t_to_nr(lo->lo_device);
 	info.lo_offset = lo->lo_offset;
 	info.lo_flags = lo->lo_flags;
@@ -483,7 +487,7 @@
 	case LOOP_GET_STATUS:
 		return loop_get_status(lo, (struct loop_info *) arg);
 	case BLKGETSIZE:   /* Return device size */
-		if (!lo->lo_inode)
+		if (!lo->lo_dentry)
 			return -ENXIO;
 		if (!arg)
 			return -EINVAL;
diff -u --recursive --new-file v2.1.106/linux/drivers/block/md.c linux/drivers/block/md.c
--- v2.1.106/linux/drivers/block/md.c	Sun Jun  7 11:16:28 1998
+++ linux/drivers/block/md.c	Wed Jun 24 14:30:09 1998
@@ -594,9 +594,9 @@
 	if (hot_add) {
 		/*
 		 * Check the superblock for consistency.
-		 * the personality itself has to check wether it's getting
-		 * added with the proper flags ... also, personality has to
-		 * be checked too ;)
+		 * The personality itself has to check whether it's getting
+		 * added with the proper flags.  The personality has to be
+                 * checked too. ;)
 		 */
 		if (analyze_one_sb (realdev))
 			return -EINVAL;
diff -u --recursive --new-file v2.1.106/linux/drivers/block/paride/epia.c linux/drivers/block/paride/epia.c
--- v2.1.106/linux/drivers/block/paride/epia.c	Wed May 20 19:10:38 1998
+++ linux/drivers/block/paride/epia.c	Wed Jun 24 14:27:18 1998
@@ -13,10 +13,11 @@
 /* Changes:
 
         1.01    GRG 1998.05.06 init_proto, release_proto
+	1.02    GRG 1998.06.17 support older versions of EPIA
 
 */
 
-#define EPIA_VERSION      "1.01"
+#define EPIA_VERSION      "1.02"
 
 #include <linux/module.h>
 #include <linux/delay.h>
@@ -123,7 +124,7 @@
 
 static void epia_disconnect ( PIA *pi )
 
-{       WR(0x84,0x10);
+{       /* WR(0x84,0x10); */
         w0(pi->saved_r0);
         w2(1); w2(4);
         w0(pi->saved_r0);
@@ -244,6 +245,7 @@
                 WR(3,k^0x55);
                 if (RR(2) != (k^0xaa)) e[j]++;
                 }
+	    WR(2,1); WR(3,1);
             }
         epia_disconnect(pi);
 
diff -u --recursive --new-file v2.1.106/linux/drivers/block/paride/paride.c linux/drivers/block/paride/paride.c
--- v2.1.106/linux/drivers/block/paride/paride.c	Tue Jun 23 10:01:22 1998
+++ linux/drivers/block/paride/paride.c	Wed Jun 24 14:36:49 1998
@@ -502,6 +502,11 @@
           pt_init();
         };
 #endif
+#ifdef CONFIG_PARIDE_PG
+        { extern int pg_init(void);
+          pg_init();
+        };
+#endif
 }
 
 #endif
diff -u --recursive --new-file v2.1.106/linux/drivers/block/paride/pcd.c linux/drivers/block/paride/pcd.c
--- v2.1.106/linux/drivers/block/paride/pcd.c	Sun Jun  7 11:16:29 1998
+++ linux/drivers/block/paride/pcd.c	Wed Jun 24 14:24:19 1998
@@ -90,10 +90,11 @@
 				and loosen interpretation of ATAPI
 			        standard for clearing error status.
 				Use spinlocks. Eliminate sti().
+	1.03    GRG 1998.06.16  Eliminated an Ugh
 
 */
 
-#define	PCD_VERSION	"1.02"
+#define	PCD_VERSION	"1.03"
 #define PCD_MAJOR	46
 #define PCD_NAME	"pcd"
 #define PCD_UNITS	4
@@ -413,30 +414,20 @@
 int	init_module(void)
 
 {	int	err;
-	long    flags;
-
-	save_flags(flags);
-	cli();
 
 	err = pcd_init();
 
-	restore_flags(flags);
 	return err;
 }
 
 void	cleanup_module(void)
 
-{	long flags;
-	int unit;
+{	int unit;
 
-	save_flags(flags);
-	cli();
 	unregister_blkdev(MAJOR_NR,name);
 	
         for (unit=0;unit<PCD_UNITS;unit++) 
            if (PCD.present) pi_release(PI);
-
-	restore_flags(flags);
 }
 
 #endif
diff -u --recursive --new-file v2.1.106/linux/drivers/block/paride/pd.c linux/drivers/block/paride/pd.c
--- v2.1.106/linux/drivers/block/paride/pd.c	Wed May 20 19:10:38 1998
+++ linux/drivers/block/paride/pd.c	Wed Jun 24 14:24:19 1998
@@ -107,10 +107,11 @@
 				Added eject ioctl
 	1.02    GRG 1998.05.06  SMP spinlock changes, 
 				Added slave support
+	1.03    GRG 1998.06.16  Eliminate an Ugh.
 
 */
 
-#define PD_VERSION      "1.02"
+#define PD_VERSION      "1.03"
 #define PD_MAJOR	45
 #define PD_NAME		"pd"
 #define PD_UNITS	4
@@ -606,42 +607,27 @@
 int     init_module(void)
 
 {       int     err, unit;
-        long    flags;
-
-        save_flags(flags);
-        cli();
 
         err = pd_init();
-        if (err) {
-            restore_flags(flags);
-            return err;
-        }
+        if (err) return err;
 
 	pd_geninit(&pd_gendisk);
 
-        if (!pd_gendisk.nr_real) {
-                restore_flags(flags);
-                return -1;
-        }
+        if (!pd_gendisk.nr_real)  return -1;
 
         pd_valid = 0;
 	for (unit=0;unit<PD_UNITS;unit++) 
           if (PD.present) resetup_one_dev(&pd_gendisk,unit);
         pd_valid = 1;
 
-        restore_flags(flags);
         return 0;
 }
 
 void    cleanup_module(void)
 
 {       struct gendisk **gdp;
-        long flags;
 	int unit;
 
-        save_flags(flags);
-        cli();
-
         unregister_blkdev(MAJOR_NR,name);
 
         for(gdp=&gendisk_head;*gdp;gdp=&((*gdp)->next))
@@ -650,8 +636,6 @@
 
 	for (unit=0;unit<PD_UNITS;unit++) 
 	   if (PD.present) pi_release(PI);
-
-        restore_flags(flags);
 }
 
 #endif
diff -u --recursive --new-file v2.1.106/linux/drivers/block/paride/pf.c linux/drivers/block/paride/pf.c
--- v2.1.106/linux/drivers/block/paride/pf.c	Sun Jun  7 11:16:29 1998
+++ linux/drivers/block/paride/pf.c	Wed Jun 24 14:24:19 1998
@@ -106,10 +106,11 @@
 			        until after next CDB delivered.
 				Small change in pf_completion to round
 				up transfer size.
+	1.02    GRG 1998.06.16  Eliminated an Ugh
 
 */
 
-#define PF_VERSION      "1.01"
+#define PF_VERSION      "1.02"
 #define PF_MAJOR	47
 #define PF_NAME		"pf"
 #define PF_UNITS	4
@@ -504,31 +505,20 @@
 int     init_module(void)
 
 {       int     err;
-        long    flags;
-
-        save_flags(flags);
-        cli();
 
         err = pf_init();
 
-        restore_flags(flags);
         return err;
 }
 
 void    cleanup_module(void)
 
-{       long flags;
-	int unit;
-
-        save_flags(flags);
-        cli();
+{       int unit;
 
         unregister_blkdev(MAJOR_NR,name);
 
 	for (unit=0;unit<PF_UNITS;unit++)
 	  if (PF.present) pi_release(PI);
-	
-        restore_flags(flags);
 }
 
 #endif
diff -u --recursive --new-file v2.1.106/linux/drivers/block/paride/pg.c linux/drivers/block/paride/pg.c
--- v2.1.106/linux/drivers/block/paride/pg.c	Tue Jun 23 10:01:22 1998
+++ linux/drivers/block/paride/pg.c	Wed Jun 24 14:24:19 1998
@@ -114,11 +114,20 @@
 
 */
 
-#define PG_VERSION      "1.0"
+/* Changes:
+
+	1.01	GRG 1998.06.16	Bug fixes
+*/
+
+#define PG_VERSION      "1.01"
 #define PG_MAJOR	97
 #define PG_NAME		"pg"
 #define PG_UNITS	4
 
+#ifndef PI_PG
+#define PI_PG	4
+#endif
+
 /* Here are things one can override from the insmod command.
    Most are autoprobed by paride unless set here.  Verbose is 0
    by default.
@@ -191,6 +200,7 @@
 #define PG_SPIN_DEL     50              /* spin delay in micro-seconds  */
 #define PG_SPIN         200
 #define PG_TMO		HZ
+#define PG_RESET_TMO	10*HZ
 
 #define STAT_ERR        0x01
 #define STAT_INDEX      0x02
@@ -312,31 +322,20 @@
 int     init_module(void)
 
 {       int     err;
-        long    flags;
-
-        save_flags(flags);
-        cli();
 
         err = pg_init();
 
-        restore_flags(flags);
         return err;
 }
 
 void    cleanup_module(void)
 
-{       long flags;
-	int unit;
-
-        save_flags(flags);
-        cli();
+{       int unit;
 
         unregister_chrdev(major,name);
 
 	for (unit=0;unit<PG_UNITS;unit++)
 	  if (PG.present) pi_release(PI);
-	
-        restore_flags(flags);
 }
 
 #endif
@@ -421,14 +420,14 @@
 
 static int pg_completion( int unit, char * buf, int tmo)
 
-{       int r, s, d, n, p;
+{       int r, d, n, p;
 
         r = pg_wait(unit,STAT_BUSY,STAT_DRQ|STAT_READY|STAT_ERR,
 			tmo,"completion");
 
 	PG.dlen = 0;
 
-        if (RR(0,7)&STAT_DRQ) { 
+        while (RR(0,7)&STAT_DRQ) {
            d = (RR(0,4)+256*RR(0,5));
            n = ((d+3)&0xfffc);
 	   p = RR(0,2)&3;
@@ -436,14 +435,15 @@
 	   if (p == 2) pi_read_block(PI,buf,n);
 	   if (verbose > 1) printk("%s: %s %d bytes\n",PG.name,
 				    p?"Read":"Write",n);
-	   PG.dlen = (1-p)*d;
+           PG.dlen += (1-p)*d;
+           buf += d;
+           r = pg_wait(unit,STAT_BUSY,STAT_DRQ|STAT_READY|STAT_ERR,
+                        tmo,"completion");
         }
 
-        s = pg_wait(unit,STAT_BUSY,STAT_READY|STAT_ERR,tmo,"data done");
-
         pi_disconnect(PI); 
 
-        return (r?r:s);
+        return r;
 }
 
 static int pg_reset( int unit )
@@ -458,7 +458,7 @@
 	pg_sleep(2);
 
         k = 0;
-        while ((k++ < PG_TMO) && (RR(1,6)&STAT_BUSY))
+        while ((k++ < PG_RESET_TMO) && (RR(1,6)&STAT_BUSY))
                 pg_sleep(1);
 
 	flg = 1;
diff -u --recursive --new-file v2.1.106/linux/drivers/block/paride/pt.c linux/drivers/block/paride/pt.c
--- v2.1.106/linux/drivers/block/paride/pt.c	Sun Jun  7 11:16:29 1998
+++ linux/drivers/block/paride/pt.c	Wed Jun 24 14:24:19 1998
@@ -96,10 +96,11 @@
 			        loosed interpretation of ATAPI standard
 				for clearing error status.
 				Eliminate sti();
+	1.02    GRG 1998.06.16  Eliminate an Ugh.
 
 */
 
-#define PT_VERSION      "1.01"
+#define PT_VERSION      "1.02"
 #define PT_MAJOR	96
 #define PT_NAME		"pt"
 #define PT_UNITS	4
@@ -322,31 +323,20 @@
 int     init_module(void)
 
 {       int     err;
-        long    flags;
-
-        save_flags(flags);
-        cli();
 
         err = pt_init();
 
-        restore_flags(flags);
         return err;
 }
 
 void    cleanup_module(void)
 
-{       long flags;
-	int unit;
-
-        save_flags(flags);
-        cli();
+{       int unit;
 
         unregister_chrdev(major,name);
 
 	for (unit=0;unit<PT_UNITS;unit++)
 	  if (PT.present) pi_release(PI);
-	
-        restore_flags(flags);
 }
 
 #endif
diff -u --recursive --new-file v2.1.106/linux/drivers/block/raid1.c linux/drivers/block/raid1.c
--- v2.1.106/linux/drivers/block/raid1.c	Sun Jun  7 11:16:29 1998
+++ linux/drivers/block/raid1.c	Wed Jun 24 14:30:09 1998
@@ -457,8 +457,8 @@
 	int n;
 
 	/*
-	 * The device has it's superblock already read and it was found
-	 * to be consistent for generic RAID usage, now we check wether
+	 * The device has its superblock already read and it was found
+	 * to be consistent for generic RAID usage.  Now we check whether
 	 * it's usable for RAID-1 hot addition.
 	 */
 
diff -u --recursive --new-file v2.1.106/linux/drivers/block/rd.c linux/drivers/block/rd.c
--- v2.1.106/linux/drivers/block/rd.c	Thu May  7 22:51:48 1998
+++ linux/drivers/block/rd.c	Wed Jun 24 14:30:09 1998
@@ -1,39 +1,39 @@
 /*
- * ramdisk.c - Multiple ramdisk driver - gzip-loading version - v. 0.8 beta.
+ * ramdisk.c - Multiple RAM disk driver - gzip-loading version - v. 0.8 beta.
  * 
  * (C) Chad Page, Theodore Ts'o, et. al, 1995. 
  *
- * This ramdisk is designed to have filesystems created on it and mounted
+ * This RAM disk is designed to have filesystems created on it and mounted
  * just like a regular floppy disk.  
  *  
  * It also does something suggested by Linus: use the buffer cache as the
- * ramdisk data.  This makes it possible to dynamically allocate the ramdisk
+ * RAM disk data.  This makes it possible to dynamically allocate the RAM disk
  * buffer - with some consequences I have to deal with as I write this. 
  * 
  * This code is based on the original ramdisk.c, written mostly by
  * Theodore Ts'o (TYT) in 1991.  The code was largely rewritten by
- * Chad Page to use the buffer cache to store the ramdisk data in
+ * Chad Page to use the buffer cache to store the RAM disk data in
  * 1995; Theodore then took over the driver again, and cleaned it up
  * for inclusion in the mainline kernel.
  *
  * The original CRAMDISK code was written by Richard Lyons, and
- * adapted by Chad Page to use the new ramdisk interface.  Theodore
- * Ts'o rewrote it so that both the compressed ramdisk loader and the
- * kernel decompressor uses the same inflate.c codebase.  The ramdisk
- * loader now also loads into a dynamic (buffer cache based) ramdisk,
- * not the old static ramdisk.  Support for the old static ramdisk has
+ * adapted by Chad Page to use the new RAM disk interface.  Theodore
+ * Ts'o rewrote it so that both the compressed RAM disk loader and the
+ * kernel decompressor uses the same inflate.c codebase.  The RAM disk
+ * loader now also loads into a dynamic (buffer cache based) RAM disk,
+ * not the old static RAM disk.  Support for the old static RAM disk has
  * been completely removed.
  *
  * Loadable module support added by Tom Dyas.
  *
  * Further cleanups by Chad Page (page0588@sundance.sjsu.edu):
- *	Cosmetic changes in #ifdef MODULE, code movement, etc...
- * 	When the ramdisk is rmmod'ed, free the protected buffers
- * 	Default ramdisk size changed to 2.88MB
+ *	Cosmetic changes in #ifdef MODULE, code movement, etc.
+ * 	When the RAM disk module is removed, free the protected buffers
+ * 	Default RAM disk size changed to 2.88 MB
  *
  *  Added initrd: Werner Almesberger & Hans Lermen, Feb '96
  *
- * 4/25/96 : Made ramdisk size a parameter (default is now 4MB) 
+* 4/25/96 : Made RAM disk size a parameter (default is now 4 MB) 
  *		- Chad Page
  *
  * Add support for fs images split across >1 disk, Paul Gortmaker, Mar '98
@@ -70,11 +70,11 @@
 #define MAJOR_NR RAMDISK_MAJOR
 #include <linux/blk.h>
 
-/* The ramdisk size is now a parameter */
+/* The RAM disk size is now a parameter */
 #define NUM_RAMDISKS 16		/* This cannot be overridden (yet) */ 
 
 #ifndef MODULE
-/* We don't have to load ramdisks or gunzip them in a module... */
+/* We don't have to load RAM disks or gunzip them in a module. */
 #define RD_LOADER
 #define BUILD_CRAMDISK
 
@@ -86,22 +86,23 @@
 #endif
 #endif
 
-/* Various static variables go here... mostly used within the ramdisk code only. */
+/* Various static variables go here.  Most are used only in the RAM disk code.
+ */
 
 static int rd_length[NUM_RAMDISKS];
 static int rd_blocksizes[NUM_RAMDISKS];
 
 /*
- * Parameters for the boot-loading of the ramdisk.  These are set by
+ * Parameters for the boot-loading of the RAM disk.  These are set by
  * init/main.c (from arguments to the kernel command line) or from the
- * architecture-specific setup routine (from the stored bootsector
+ * architecture-specific setup routine (from the stored boot sector
  * information). 
  */
-int rd_size = 4096;		/* Size of the ramdisks */
+int rd_size = 4096;		/* Size of the RAM disks */
 
 #ifndef MODULE
-int rd_doload = 0;		/* 1 = load ramdisk, 0 = don't load */
-int rd_prompt = 1;		/* 1 = prompt for ramdisk, 0 = don't prompt */
+int rd_doload = 0;		/* 1 = load RAM disk, 0 = don't load */
+int rd_prompt = 1;		/* 1 = prompt for RAM disk, 0 = don't prompt */
 int rd_image_start = 0;		/* starting block # of image */
 #ifdef CONFIG_BLK_DEV_INITRD
 unsigned long initrd_start,initrd_end;
@@ -273,7 +274,7 @@
 	block_fsync		/* fsync */ 
 };
 
-/* This is the registration and initialization section of the ramdisk driver */
+/* This is the registration and initialization section of the RAM disk driver */
 __initfunc(int rd_init(void))
 {
 	int		i;
@@ -292,7 +293,7 @@
 
 	blksize_size[MAJOR_NR] = rd_blocksizes;
 
-	printk("Ramdisk driver initialized : %d ramdisks of %dK size\n",
+	printk("RAM disk driver initialized:  %d RAM disks of %dK size\n",
 							NUM_RAMDISKS, rd_size);
 
 	return 0;
@@ -324,11 +325,11 @@
 
 #endif  /* MODULE */
 
-/* End of non-loading portions of the ramdisk driver */
+/* End of non-loading portions of the RAM disk driver */
 
 #ifdef RD_LOADER 
 /*
- * This routine tries to find a ramdisk image to load, and returns the
+ * This routine tries to find a RAM disk image to load, and returns the
  * number of blocks to read for a non-compressed image, 0 if the image
  * is a compressed image, and -1 if an image with the right magic
  * numbers could not be found.
@@ -382,7 +383,7 @@
 	if (romfsb->word0 == ROMSB_WORD0 &&
 	    romfsb->word1 == ROMSB_WORD1) {
 		printk(KERN_NOTICE
-		       "RAMDISK: Romfs filesystem found at block %d\n",
+		       "RAMDISK: romfs filesystem found at block %d\n",
 		       start_block);
 		nblocks = (ntohl(romfsb->size)+BLOCK_SIZE-1)>>BLOCK_SIZE_BITS;
 		goto done;
@@ -410,14 +411,14 @@
 	/* Try ext2 */
 	if (ext2sb->s_magic == cpu_to_le16(EXT2_SUPER_MAGIC)) {
 		printk(KERN_NOTICE
-		       "RAMDISK: Ext2 filesystem found at block %d\n",
+		       "RAMDISK: ext2 filesystem found at block %d\n",
 		       start_block);
 		nblocks = le32_to_cpu(ext2sb->s_blocks_count);
 		goto done;
 	}
 
 	printk(KERN_NOTICE
-	       "RAMDISK: Couldn't find valid ramdisk image starting at %d.\n",
+	       "RAMDISK: Couldn't find valid RAM disk image starting at %d.\n",
 	       start_block);
 	
 done:
@@ -430,7 +431,7 @@
 }
 
 /*
- * This routine loads in the ramdisk image.
+ * This routine loads in the RAM disk image.
  */
 __initfunc(static void rd_load_image(kdev_t device,int offset))
 {
@@ -480,7 +481,7 @@
 #else
 		printk(KERN_NOTICE
 		       "RAMDISK: Kernel does not support compressed "
-		       "ramdisk images\n");
+		       "RAM disk images\n");
 #endif
 		goto done;
 	}
@@ -564,7 +565,7 @@
 		floppy_eject();
 #endif
 		printk(KERN_NOTICE
-		       "VFS: Insert root floppy disk to be loaded into ramdisk and press ENTER\n");
+		       "VFS: Insert root floppy disk to be loaded into RAM disk and press ENTER\n");
 		wait_for_keypress();
 	}
 
diff -u --recursive --new-file v2.1.106/linux/drivers/block/xd.c linux/drivers/block/xd.c
--- v2.1.106/linux/drivers/block/xd.c	Wed May 20 19:10:38 1998
+++ linux/drivers/block/xd.c	Wed Jun 24 14:30:09 1998
@@ -240,7 +240,7 @@
 
 	}
 	if (xd_drives) {
-		if (!request_irq(xd_irq,xd_interrupt_handler, 0, "XT harddisk", NULL)) {
+		if (!request_irq(xd_irq,xd_interrupt_handler, 0, "XT hard disk", NULL)) {
 			if (request_dma(xd_dma,"xd")) {
 				printk("xd: unable to get DMA%d\n",xd_dma);
 				free_irq(xd_irq, NULL);
diff -u --recursive --new-file v2.1.106/linux/drivers/char/ChangeLog linux/drivers/char/ChangeLog
--- v2.1.106/linux/drivers/char/ChangeLog	Sun Jun  7 11:16:29 1998
+++ linux/drivers/char/ChangeLog	Wed Jun 24 14:30:09 1998
@@ -33,13 +33,13 @@
  		it.
 
 	* serial.c (autoconfig): Change 16750 test to hopefully eliminate
-		false results by people with strange 16550A's being
-		detected as 16750's.  Hopefully 16750's will still be
-		detected as 16750, and other wierd UART's won't get poorly
+		false results by people with strange 16550As being
+		detected as 16750s.  Hopefully 16750s will still be
+		detected as 16750, and other weird UARTs won't get poorly
 		autodetected.  If this doesn't work, I'll have to disable
-		the auto identification for the 16750....
+		the auto identification for the 16750.
 
-	* tty_io.c (tty_hangup): Now do actually do the tty hangup
+	* tty_io.c (tty_hangup): Now actually do the tty hangup
 		processing during the timer processing, and disable
 		interrupts while doing the hangup processing.  This avoids
 		several nasty race conditions which happened when the
@@ -129,7 +129,7 @@
 	* serial.c: Update routines to use the new 2.1 memory access
 	 	routines.
 
-Wed Dec  4 07:51:52 1996  Theodre Ts'o  <tytso@localhost.mit.edu>
+Wed Dec  4 07:51:52 1996  Theodore Ts'o  <tytso@localhost.mit.edu>
 
 	* serial.c (change_speed): Use save_flags(); cli() and
 		restore_flags() in order to ensure we don't accidentally
@@ -139,7 +139,7 @@
 		should be off this whole time, but we eventually will want
 		to reduce this window.
 
-Thu Nov 21 10:05:22 1996  Theodre Ts'o  <tytso@localhost.mit.edu>
+Thu Nov 21 10:05:22 1996  Theodore Ts'o  <tytso@localhost.mit.edu>
 
 	* tty_ioctl.c (tty_wait_until_sent): Always check the driver
  		wait_until_ready routine, even if there are no characters
@@ -174,7 +174,7 @@
  		DTR and RTS.  DTR and RTS are only be changed on the
  		transition to or from the B0 state.
 		(rs_close): Wait for the characters to drain based on
- 		info->timeout.  At low baud rates (50bps), it may take a
+ 		info->timeout.  At low baud rates (50 bps), it may take a
  		long time for the FIFO to completely drain out!
 		(rs_wait_until_sent): Fixed timeout handling.  Now
  		releases control to the scheduler, but checks frequently
diff -u --recursive --new-file v2.1.106/linux/drivers/char/Makefile linux/drivers/char/Makefile
--- v2.1.106/linux/drivers/char/Makefile	Tue Jun  9 11:57:28 1998
+++ linux/drivers/char/Makefile	Wed Jun 24 14:44:00 1998
@@ -27,6 +27,9 @@
 L_OBJS += console.o vt.o vc_screen.o consolemap.o consolemap_deftbl.o
 LX_OBJS += selection.o
 endif
+ifdef CONFIG_FB
+  LX_OBJS += fbmem.o
+endif
 
 ifeq ($(CONFIG_SERIAL),y)
   ifndef CONFIG_SUN_SERIAL
@@ -431,14 +434,6 @@
   endif
 endif
 
-ifdef CONFIG_VT
-  ifdef CONFIG_TGA_CONSOLE
-  L_OBJS += tga.o
-  endif
-  ifdef CONFIG_VGA_CONSOLE
-  L_OBJS += vga.o vesa_blank.o
-  endif
-endif
 
 ifeq ($(CONFIG_HFMODEM),y)
 ALL_SUB_DIRS += hfmodem
diff -u --recursive --new-file v2.1.106/linux/drivers/char/console.c linux/drivers/char/console.c
--- v2.1.106/linux/drivers/char/console.c	Tue Jun 23 10:01:22 1998
+++ linux/drivers/char/console.c	Wed Jun 24 15:07:54 1998
@@ -8,17 +8,18 @@
  *
  * This module exports the console io functions:
  *
- *     'void do_keyboard_interrupt(void)'
- *
  *     'int vc_allocate(unsigned int console)'
  *     'int vc_cons_allocated(unsigned int console)'
  *     'int vc_resize(unsigned long lines, unsigned long cols)'
+ *     'int vc_resize_con(unsigned long lines, unsigned long cols,
+ *			  unsigned int currcons)'
  *     'void vc_disallocate(unsigned int currcons)'
  *
  *     'unsigned long con_init(unsigned long)'
  *     'int con_open(struct tty_struct *tty, struct file * filp)'
  *     'void con_write(struct tty_struct * tty)'
- *     'void vt_console_print(const char * b)'
+ *     'void vt_console_print(struct console *co, const char * b,
+ *                            unsigned count)'
  *     'void update_screen(int new_console)'
  *
  *     'void do_blank_screen(int)'
@@ -61,8 +62,141 @@
  * redirection by Martin Mares <mj@k332.feld.cvut.cz> 19-Nov-95
  *
  * APM screenblank bug fixed Takashi Manabe <manabe@roy.dsl.tutics.tut.jp>
+ *
+ * Merge with the abstract console driver by Geert Uytterhoeven
+ * <Geert.Uytterhoeven@cs.kuleuven.ac.be>, Jan 1997.
+ *
+ *   Original m68k console driver modifications by
+ *
+ *     - Arno Griffioen <arno@usn.nl>
+ *     - David Carter <carter@cs.bris.ac.uk>
+ * 
+ *   Note that the abstract console driver allows all consoles to be of
+ *   potentially different sizes, so the following variables depend on the
+ *   current console (currcons):
+ *
+ *     - video_num_columns
+ *     - video_num_lines
+ *     - video_size_row
+ *     - video_screen_size
+ *     - can_do_color
+ *
+ *   The abstract console driver provides a generic interface for a text
+ *   console. It supports VGA text mode, frame buffer based graphical consoles
+ *   and special graphics processors that are only accessible through some
+ *   registers (e.g. a TMS340x0 GSP).
+ *
+ *   The interface to the hardware is specified using a special structure
+ *   (struct consw) which contains function pointers to the following
+ *   operations:
+ *
+ *     unsigned long con_startup(unsigned long kmem_start,
+ *				 const char **display_desc)
+ *     void con_init(struct vc_data *conp)
+ *     int con_deinit(struct vc_data *conp)
+ *     int con_clear(struct vc_data *conp, int sy, int sx, int height,
+ *		     int width)
+ *     int con_putc(struct vc_data *conp, int c, int y, int x)
+ *     int con_putcs(struct vc_data *conp, const char *s, int count, int y,
+ *		     int x)
+ *     int con_cursor(struct vc_data *conp, int mode)
+ *     int con_scroll(struct vc_data *conp, int t, int b, int dir, int count)
+ *     int con_bmove(struct vc_data *conp, int sy, int sx, int dy, int dx,
+ *		     int height, int width)
+ *     int con_switch(struct vc_data *conp)
+ *     int con_blank(int blank)
+ *     int con_get_font(struct vc_data *conp, int *w, int *h, char *data)
+ *     int con_set_font(struct vc_data *conp, int w, int h, char *data)
+ *     int con_set_palette(struct vc_data *conp, unsigned char *table)
+ *     int con_scrolldelta(struct vc_data *conp, int lines)
+ *
+ * Support for changeable cursor shape
+ * by Pavel Machek <pavel@atrey.karlin.mff.cuni.cz>, August 1997
+ *
+ * Ported to i386 and con_scrolldelta fixed
+ * by Emmanuel Marty <core@ggi-project.org>, April 1998
  */
 
+#include <linux/sched.h>
+#include <linux/tty.h>
+#include <linux/tty_flip.h>
+#include <linux/kernel.h>
+#include <linux/string.h>
+#include <linux/errno.h>
+#include <linux/kd.h>
+#include <linux/malloc.h>
+#include <linux/major.h>
+#include <linux/mm.h>
+#include <linux/console.h>
+#include <linux/init.h>
+#include <linux/vt_kern.h>
+#include <linux/selection.h>
+#include <linux/console_struct.h>
+#include <linux/kbd_kern.h>
+#include <linux/consolemap.h>
+#include <linux/timer.h>
+#include <linux/interrupt.h>
+#include <linux/config.h>
+#include <linux/version.h>
+#ifdef CONFIG_APM
+#include <linux/apm_bios.h>
+#endif
+
+#include <asm/io.h>
+#include <asm/system.h>
+#include <asm/uaccess.h>
+#include <asm/bitops.h>
+
+#ifndef CONFIG_ABSCON_COMPAT
+#define INCLUDE_LINUX_LOGO_DATA
+#endif
+#include <asm/linux_logo.h>
+
+#include "console_macros.h"
+
+
+struct consw *conswitchp = NULL;
+
+int (*console_show_logo)(void) __initdata = NULL;
+
+static int vesa_blank_mode = 0; /* 0:none 1:suspendV 2:suspendH 3:powerdown */
+
+static inline void hide_cursor(int currcons)
+{
+    sw->con_cursor(vc_cons[currcons].d,CM_ERASE);
+}
+
+void set_cursor(int currcons)
+{
+    if (currcons != fg_console || console_blanked || vcmode == KD_GRAPHICS)
+	return;
+    if (deccm)
+	sw->con_cursor(vc_cons[currcons].d,CM_DRAW);
+    else
+	hide_cursor(currcons);
+}
+
+    /*
+     *  Adjust the screen to fit a font of a certain height
+     *
+     *  Returns < 0 for error, 0 if nothing changed, and the number
+     *  of lines on the adjusted console if changed.
+     */
+
+int con_adjust_height(unsigned long fontheight)
+{
+    int currcons = fg_console;
+    /* ++Geert: Always assume that the number of lines did change? */
+    return video_num_lines;
+}
+
+/* dummy functions */
+
+void no_scroll(char *str, int *ints)
+{
+}
+
+
 #define BLANK 0x0020
 
 /* A bitmap for codes <32. A bit of 1 indicates that the code
@@ -86,45 +220,10 @@
  * interrupt, as we use trap-gates. Hopefully all is well.
  */
 
-#include <linux/sched.h>
-#include <linux/timer.h>
-#include <linux/interrupt.h>
-#include <linux/tty.h>
-#include <linux/tty_flip.h>
-#include <linux/console.h>
-#include <linux/config.h>
-#include <linux/kernel.h>
-#include <linux/string.h>
-#include <linux/errno.h>
-#include <linux/kd.h>
-#include <linux/malloc.h>
-#include <linux/major.h>
-#include <linux/mm.h>
-#include <linux/ioport.h>
-#include <linux/init.h>
-#ifdef CONFIG_APM
-#include <linux/apm_bios.h>
-#endif
-
-#include <asm/io.h>
-#include <asm/system.h>
-#include <asm/uaccess.h>
-#include <asm/bitops.h>
-
-#include <linux/kbd_kern.h>
-#include <linux/vt_kern.h>
-#include <linux/consolemap.h>
-#include <linux/selection.h>
-#include <linux/console_struct.h>
-
 #ifndef MIN
 #define MIN(a,b)	((a) < (b) ? (a) : (b))
 #endif
 
-#ifdef __sparc__
-int serial_console;
-#endif
-
 struct tty_driver console_driver;
 static int console_refcount;
 static struct tty_struct *console_table[MAX_NR_CONSOLES];
@@ -134,56 +233,30 @@
 struct vc vc_cons [MAX_NR_CONSOLES];
 
 static int con_open(struct tty_struct *, struct file *);
-static void con_setsize(unsigned long rows, unsigned long cols);
 static void vc_init(unsigned int console, unsigned long rows,
 		    unsigned long cols, int do_clear);
-extern void get_scrmem(int currcons);
-extern void set_scrmem(int currcons, long offset);
-static void set_origin(int currcons);
 static void blank_screen(void);
 static void unblank_screen(void);
 extern void change_console(unsigned int);
 extern void poke_blanked_console(void);
+static void update_attr(int currcons);
 static void gotoxy(int currcons, int new_x, int new_y);
 static void save_cur(int currcons);
-extern void set_cursor(int currcons);
-extern void hide_cursor(void);
 static void reset_terminal(int currcons, int do_clear);
 extern void reset_vc(unsigned int new_console);
 extern void vt_init(void);
 extern void set_vesa_blanking(unsigned long arg);
 extern void vesa_blank(void);
-extern void vesa_unblank(void);
 extern void vesa_powerdown(void);
 extern void compute_shiftstate(void);
 extern void reset_palette(int currcons);
 extern void set_palette(void);
-extern int con_is_present(void);
-extern unsigned long con_type_init(unsigned long, const char **);
-extern void con_type_init_finish(void);
-extern int set_get_cmap(unsigned char *, int);
-extern int set_get_font(unsigned char *, int, int);
-extern void rs_cons_hook(int chip, int out, int channel);
-
-/* Description of the hardware situation */
-unsigned char	video_type;		/* Type of display being used	*/
-unsigned long	video_mem_base;		/* Base of video memory		*/
-unsigned long	video_mem_term;		/* End of video memory		*/
-unsigned short	video_port_reg;		/* Video register select port	*/
-unsigned short	video_port_val;		/* Video register value port	*/
-unsigned long	video_num_columns;	/* Number of text columns	*/
-unsigned long	video_num_lines;	/* Number of text lines		*/
-unsigned long	video_size_row;
-unsigned long	video_screen_size;
 
-int can_do_color = 0;
 static int printable = 0;		/* Is console ready for printing? */
 
 int		video_mode_512ch = 0;	/* 512-character mode */
 unsigned long	video_font_height;	/* Height of current screen font */
 unsigned long	video_scan_lines;	/* Number of scan lines on screen */
-static unsigned long   default_font_height;    /* Height of default screen font */
-int		video_font_is_default = 1;
 static unsigned short console_charmask = 0x0ff;
 
 /* used by kbd_bh - set by keyboard_interrupt */
@@ -191,7 +264,8 @@
        int console_blanked = 0;
 static int blankinterval = 10*60*HZ;
 static int vesa_off_interval = 0;
-static long blank_origin, blank__origin, unblank_origin;
+
+static char putcs_buf[256];
 
 /*
  * fg_console is the current virtual console,
@@ -204,161 +278,58 @@
 int want_console = -1;
 int kmsg_redirect = 0;
 
-#ifdef CONFIG_SERIAL_ECHO
-
-#include <linux/serial_reg.h>
-
-extern int serial_echo_init (int base);
-extern int serial_echo_print (const char *s);
-
-/*
- * this defines the address for the port to which printk echoing is done
- *  when CONFIG_SERIAL_ECHO is defined
- */
-#define SERIAL_ECHO_PORT	0x3f8	/* COM1 */
-
-static int serial_echo_port = 0;
-
-#define serial_echo_outb(v,a) outb((v),(a)+serial_echo_port)
-#define serial_echo_inb(a)    inb((a)+serial_echo_port)
-
-#define BOTH_EMPTY (UART_LSR_TEMT | UART_LSR_THRE)
-
-/* Wait for transmitter & holding register to empty */
-#define WAIT_FOR_XMITR \
- do { \
-       lsr = serial_echo_inb(UART_LSR); \
- } while ((lsr & BOTH_EMPTY) != BOTH_EMPTY)
-
-/* These two functions abstract the actual communications with the
- * debug port.	This is so we can change the underlying communications
- * mechanism without modifying the rest of the code.
- */
-int
-serial_echo_print(const char *s)
-{
-	int     lsr, ier;
-	int     i;
-
-	if (!serial_echo_port) return (0);
-
-	/*
-	 * First save the IER then disable the interrupts
-	 */
-	ier = serial_echo_inb(UART_IER);
-	serial_echo_outb(0x00, UART_IER);
-
-	/*
-	 * Now, do each character
-	 */
-	for (i = 0; *s; i++, s++) {
-		WAIT_FOR_XMITR;
-
-		/* Send the character out. */
-		serial_echo_outb(*s, UART_TX);
-
-		/* if a LF, also do CR... */
-		if (*s == 10) {
-			WAIT_FOR_XMITR;
-			serial_echo_outb(13, UART_TX);
-		}
-	}
-
-	/*
-	 * Finally, Wait for transmitter & holding register to empty
-	 *  and restore the IER
-	 */
-	do {
-		lsr = serial_echo_inb(UART_LSR);
-	} while ((lsr & BOTH_EMPTY) != BOTH_EMPTY);
-	serial_echo_outb(ier, UART_IER);
-
-	return (0);
-}
-
-
-int
-serial_echo_init(int base)
+int vc_cons_allocated(unsigned int i)
 {
-	int comstat, hi, lo;
-	
-	if (base != 0x2f8 && base != 0x3f8) {
-		serial_echo_port = 0;
-		return (0);
-	} else
-	  serial_echo_port = base;
-
-	/*
-	 * read the Divisor Latch
-	 */
-	comstat = serial_echo_inb(UART_LCR);
-	serial_echo_outb(comstat | UART_LCR_DLAB, UART_LCR);
-	hi = serial_echo_inb(UART_DLM);
-	lo = serial_echo_inb(UART_DLL);
-	serial_echo_outb(comstat, UART_LCR);
-
-	/*
-	 * now do hardwired init
-	 */
-	serial_echo_outb(0x03, UART_LCR); /* No parity, 8 data bits, 1 stop */
-	serial_echo_outb(0x83, UART_LCR); /* Access divisor latch */
-	serial_echo_outb(0x00, UART_DLM); /* 9600 baud */
-	serial_echo_outb(0x0c, UART_DLL);
-	serial_echo_outb(0x03, UART_LCR); /* Done with divisor */
-
-	/* Prior to disabling interrupts, read the LSR and RBR
-	 * registers
-	 */
-	comstat = serial_echo_inb(UART_LSR); /* COM? LSR */
-	comstat = serial_echo_inb(UART_RX);	/* COM? RBR */
-	serial_echo_outb(0x00, UART_IER); /* Disable all interrupts */
-
-	return(0);
+	return (i < MAX_NR_CONSOLES && vc_cons[i].d);
 }
 
-#endif /* CONFIG_SERIAL_ECHO */
-
-int vc_cons_allocated(unsigned int i)
+void visual_init(int currcons)
 {
-	return (i < MAX_NR_CONSOLES && vc_cons[i].d);
+    /* ++Geert: sw->con_init determines console size */
+    sw = conswitchp;
+    cons_num = currcons;
+    sw->con_init(vc_cons[currcons].d);
+    video_size_row = video_num_columns<<1;
+    video_screen_size = video_num_lines*video_size_row;
 }
 
-int vc_allocate(unsigned int i)		/* return 0 on success */
+int vc_allocate(unsigned int currcons)		/* return 0 on success */
 {
-	if (i >= MAX_NR_CONSOLES)
+	if (currcons >= MAX_NR_CONSOLES)
 	  return -ENXIO;
-	if (!vc_cons[i].d) {
+	if (!vc_cons[currcons].d) {
 	    long p, q;
 
 	    /* prevent users from taking too much memory */
-	    if (i >= MAX_NR_USER_CONSOLES && !capable(CAP_SYS_RESOURCE))
+	    if (currcons >= MAX_NR_USER_CONSOLES && !capable(CAP_SYS_RESOURCE))
 	      return -EPERM;
 
 	    /* due to the granularity of kmalloc, we waste some memory here */
 	    /* the alloc is done in two steps, to optimize the common situation
 	       of a 25x80 console (structsize=216, video_screen_size=4000) */
-	    q = (long) kmalloc(video_screen_size, GFP_KERNEL);
-	    if (!q)
-	      return -ENOMEM;
 	    p = (long) kmalloc(structsize, GFP_KERNEL);
-	    if (!p) {
-		kfree_s((char *) q, video_screen_size);
+	    if (!p)
+		return -ENOMEM;
+	    vc_cons[currcons].d = (struct vc_data *)p;
+	    vt_cons[currcons] = (struct vt_struct *)(p+sizeof(struct vc_data));
+	    visual_init(currcons);
+	    q = (long)kmalloc(video_screen_size, GFP_KERNEL);
+	    if (!q) {
+		kfree_s((char *) p, structsize);
+		vc_cons[currcons].d = NULL;
+		vt_cons[currcons] = NULL;
 		return -ENOMEM;
 	    }
-
-	    vc_cons[i].d = (struct vc_data *) p;
-	    p += sizeof(struct vc_data);
-	    vt_cons[i] = (struct vt_struct *) p;
-	    vc_scrbuf[i] = (unsigned short *) q;
-	    vc_cons[i].d->vc_kmalloced = 1;
-	    vc_cons[i].d->vc_screenbuf_size = video_screen_size;
-	    vc_init (i, video_num_lines, video_num_columns, 1);
+	    vc_scrbuf[currcons] = (unsigned short *) q;
+	    vc_cons[currcons].d->vc_kmalloced = 1;
+	    vc_cons[currcons].d->vc_screenbuf_size = video_screen_size;
+	    vc_init(currcons, video_num_lines, video_num_columns, 1);
 	}
 	return 0;
 }
 
 /*
- * Change # of rows and columns (0 means unchanged)
+ * Change # of rows and columns (0 means unchanged/the size of fg_console)
  * [this is to be used together with some user program
  * like resize that changes the hardware videomode]
  */
@@ -367,7 +338,7 @@
 	unsigned long cc, ll, ss, sr;
 	unsigned long occ, oll, oss, osr;
 	unsigned short *p;
-	unsigned int currcons, i;
+	unsigned int currcons = fg_console, i;
 	unsigned short *newscreens[MAX_NR_CONSOLES];
 	long ol, nl, rlth, rrem;
 
@@ -376,9 +347,6 @@
 	sr = cc << 1;
 	ss = sr * ll;
 
-	if (ss > video_mem_term - video_mem_base)
-	  return -ENOMEM;
-
 	/*
 	 * Some earlier version had all consoles of potentially
 	 * different sizes, but that was really messy.
@@ -400,22 +368,20 @@
 	    }
 	}
 
-	get_scrmem(fg_console);
-
-	oll = video_num_lines;
-	occ = video_num_columns;
-	osr = video_size_row;
-	oss = video_screen_size;
-
-	video_num_lines = ll;
-	video_num_columns = cc;
-	video_size_row = sr;
-	video_screen_size = ss;
-
 	for (currcons = 0; currcons < MAX_NR_CONSOLES; currcons++) {
 	    if (!vc_cons_allocated(currcons))
 	      continue;
 
+	    oll = video_num_lines;
+	    occ = video_num_columns;
+	    osr = video_size_row;
+	    oss = video_screen_size;
+
+	    video_num_lines = ll;
+	    video_num_columns = cc;
+	    video_size_row = sr;
+	    video_screen_size = ss;
+
 	    rlth = MIN(osr, sr);
 	    rrem = sr - rlth;
 	    ol = origin;
@@ -423,6 +389,7 @@
 	    if (ll < oll)
 	      ol += (oll - ll) * osr;
 
+	    update_attr(currcons);
 	    while (ol < scr_end) {
 		memcpyw((unsigned short *) nl, (unsigned short *) ol, rlth);
 		if (rrem)
@@ -432,7 +399,7 @@
 	    }
 
 	    if (kmalloced)
-	      kfree_s(vc_scrbuf[currcons], screenbuf_size);
+	      kfree_s(vc_scrbuf[currcons], oss);
 	    vc_scrbuf[currcons] = newscreens[currcons];
 	    kmalloced = 1;
 	    screenbuf_size = ss;
@@ -450,16 +417,110 @@
 	    save_cur(currcons);
 	}
 
-	set_scrmem(fg_console, 0);
-	set_origin(fg_console);
+	/* don't update in graphics mode */
+	if (currcons == fg_console && vt_cons[fg_console]->vc_mode == KD_TEXT)
+	    update_screen(fg_console);
+
 	set_cursor(fg_console);
 
 	return 0;
 }
 
+/*
+ * ++Geert: Change # of rows and columns for one specific console.
+ * Of course it's not messy to have all consoles of potentially different
+ * sizes, except on PCish hardware :-)
+ */
+void vc_resize_con(unsigned long lines, unsigned long cols,
+		   unsigned int currcons)
+{
+	unsigned long cc, ll, ss, sr;
+	unsigned long occ, oll, oss, osr;
+	unsigned short *newscreen;
+	long ol, nl, rlth, rrem;
+
+	if (!cols || !lines || currcons >= MAX_NR_CONSOLES)
+	    return;
+
+	cc = cols;
+	ll = lines;
+	sr = cc << 1;
+	ss = sr * ll;
+
+	if (!vc_cons_allocated(currcons))
+	    newscreen = 0;
+	else if (!(newscreen = (unsigned short *)kmalloc(ss, GFP_USER)))
+	    return;
+
+	if (vc_cons_allocated(currcons)) {
+	    oll = video_num_lines;
+	    occ = video_num_columns;
+	    osr = video_size_row;
+	    oss = video_screen_size;
+
+	    video_num_lines = ll;
+	    video_num_columns = cc;
+	    video_size_row = sr;
+	    video_screen_size = ss;
+
+	    rlth = MIN(osr, sr);
+	    rrem = sr - rlth;
+	    ol = origin;
+	    nl = (long) newscreen;
+	    if (ll < oll)
+		ol += (oll - ll) * osr;
+
+	    /* ++Geert: TODO: Because the attributes have different meanings
+	       for monochrome and color, they should really be converted if
+	       can_do_color changes... */
+	    update_attr(currcons);
+	    while (ol < scr_end) {
+		memcpyw((unsigned short *) nl, (unsigned short *) ol, rlth);
+		if (rrem)
+		    memsetw((void *)(nl + rlth), video_erase_char, rrem);
+		ol += osr;
+		nl += sr;
+	    }
+
+	    if (kmalloced)
+		kfree_s(vc_scrbuf[currcons], oss);
+	    vc_scrbuf[currcons] = newscreen;
+	    kmalloced = 1;
+	    screenbuf_size = ss;
+
+	    origin = video_mem_start = (long) vc_scrbuf[currcons];
+	    scr_end = video_mem_end = video_mem_start + ss;
+
+	    if (scr_end > nl)
+		memsetw((void *) nl, video_erase_char, scr_end - nl);
+
+	    /* do part of a reset_terminal() */
+	    top = 0;
+	    bottom = video_num_lines;
+	    gotoxy(currcons, x, y);
+	    save_cur(currcons);
+
+	    if (console_table[currcons]) {
+		struct winsize ws, *cws = &console_table[currcons]->winsize;
+		ws.ws_row = video_num_lines;
+		ws.ws_col = video_num_columns;
+		if ((ws.ws_row != cws->ws_row || ws.ws_col != cws->ws_col) &&
+		    console_table[currcons]->pgrp > 0)
+		    kill_pg(console_table[currcons]->pgrp, SIGWINCH, 1);
+		*cws = ws;
+	    }
+	}
+
+	/* don't update in graphics mode */
+	if (currcons == fg_console && vt_cons[fg_console]->vc_mode == KD_TEXT)
+	    update_screen(fg_console);
+}
+
+
 void vc_disallocate(unsigned int currcons)
 {
 	if (vc_cons_allocated(currcons)) {
+	    sw->con_deinit(vc_cons[currcons].d);
 	    if (kmalloced)
 	      kfree_s(vc_scrbuf[currcons], screenbuf_size);
 	    if (currcons >= MIN_NR_CONSOLES)
@@ -490,7 +551,7 @@
 /* the default colour table, for VGA+ colour systems */
 int default_red[] = {0x00,0xaa,0x00,0xaa,0x00,0xaa,0x00,0xaa,
     0x55,0xff,0x55,0xff,0x55,0xff,0x55,0xff};
-int default_grn[] = {0x00,0x00,0xaa,0x55,0x00,0x00,0xaa,0xaa,
+int default_grn[] = {0x00,0x00,0xaa,0xaa,0x00,0x00,0xaa,0xaa,
     0x55,0x55,0xff,0xff,0x55,0x55,0xff,0xff};
 int default_blu[] = {0x00,0x00,0x00,0x00,0xaa,0xaa,0xaa,0xaa,
     0x55,0x55,0x55,0x55,0xff,0xff,0xff,0xff};
@@ -537,58 +598,16 @@
 /*
  * Hardware scrollback support
  */
-extern void __set_origin(unsigned short);
-unsigned short __real_origin;       /* offset of non-scrolled screen */
-unsigned short __origin;	    /* offset of currently displayed screen */
-unsigned char has_wrapped;          /* all of videomem is data of fg_console */
-static unsigned char hardscroll_enabled;
-static unsigned char hardscroll_disabled_by_init = 0;
-
-void no_scroll(char *str, int *ints)
+static inline void scrolldelta(int lines)
 {
-  /*
-   * Disabling scrollback is required for the Braillex ib80-piezo
-   * Braille reader made by F.H. Papenmeier (Germany).
-   * Use the "no-scroll" bootflag.
-   */
-	hardscroll_disabled_by_init = 1;
-	hardscroll_enabled = 0;
-}
-
-static void scrolldelta(int lines)
-{
-	int new_origin;
-	int last_origin_rel = (((video_mem_term - video_mem_base)
-         / video_num_columns / 2) - (video_num_lines - 1)) * video_num_columns;
-
-	new_origin = __origin + lines * video_num_columns;
-	if (__origin > __real_origin)
-		new_origin -= last_origin_rel;
-	if (new_origin < 0) {
-		int s_top = __real_origin + video_num_lines*video_num_columns;
-		new_origin += last_origin_rel;
-		if (new_origin < s_top)
-			new_origin = s_top;
-		if (new_origin > last_origin_rel - video_num_columns
-		    || has_wrapped == 0)
-			new_origin = 0;
-		else {
-			unsigned short * d = (unsigned short *) video_mem_base;
-			unsigned short * s = d + last_origin_rel;
-			int count = (video_num_lines-1)*video_num_columns;
-			while (count) {
-				count--;
-				scr_writew(scr_readw(d++),s++);
-			}
-		}
-	} else if (new_origin > __real_origin)
-		new_origin = __real_origin;
-
-	__set_origin(new_origin);
+    int currcons = fg_console;
+    sw->con_scrolldelta(vc_cons[currcons].d, lines);
 }
 
 void scrollback(int lines)
 {
+	int currcons = fg_console;
+
 	if (!lines)
 		lines = video_num_lines/2;
 	scrolldelta(-lines);
@@ -596,80 +615,31 @@
 
 void scrollfront(int lines)
 {
+	int currcons = fg_console;
+
 	if (!lines)
 		lines = video_num_lines/2;
 	scrolldelta(lines);
 }
 
-static void set_origin(int currcons)
+static void scrup(int currcons, unsigned int t, unsigned int b, int nr)
 {
-	if (video_type != VIDEO_TYPE_EGAC && video_type != VIDEO_TYPE_VGAC
-	    && video_type != VIDEO_TYPE_EGAM)
-		return;
-	if (currcons != fg_console || console_blanked || vcmode == KD_GRAPHICS)
-		return;
-	__real_origin = (origin-video_mem_base) >> 1;
-	__set_origin(__real_origin);
-}
-
-static void scrup(int currcons, unsigned int t, unsigned int b, unsigned int nr)
-{
-	int hardscroll = hardscroll_enabled;
+	unsigned short *d, *s;
 
 	if (t+nr >= b)
 		nr = b - t - 1;
 	if (b > video_num_lines || t >= b || nr < 1)
 		return;
-	if (t || b != video_num_lines || nr > 1)
-		hardscroll = 0;
-	if (hardscroll) {
-		origin += video_size_row;
-		pos += video_size_row;
-		scr_end += video_size_row;
-		if (scr_end > video_mem_end) {
-			unsigned short * d = (unsigned short *) video_mem_start;
-			unsigned short * s = (unsigned short *) origin;
-			unsigned int count;
-
-			count = (video_num_lines-1)*video_num_columns;
-			while (count) {
-				count--;
-				scr_writew(scr_readw(s++),d++);
-			}
-			count = video_num_columns;
-			while (count) {
-				count--;
-				scr_writew(video_erase_char, d++);
-			}
-			scr_end -= origin-video_mem_start;
-			pos -= origin-video_mem_start;
-			origin = video_mem_start;
-			has_scrolled = 1;
-			if (currcons == fg_console)
-				has_wrapped = 1;
-		} else {
-			unsigned short * d;
-			unsigned int count;
-
-			d = (unsigned short *) (scr_end - video_size_row);
-			count = video_num_columns;
-			while (count) {
-				count--;
-				scr_writew(video_erase_char, d++);
-			}
-		}
-		set_origin(currcons);
-	} else {
-		unsigned short * d = (unsigned short *) (origin+video_size_row*t);
-		unsigned short * s = (unsigned short *) (origin+video_size_row*(t+nr));
-
-		memcpyw(d, s, (b-t-nr) * video_size_row);
-		memsetw(d + (b-t-nr) * video_num_columns, video_erase_char, video_size_row*nr);
-	}
+	d = (unsigned short *) (origin+video_size_row*t);
+	s = (unsigned short *) (origin+video_size_row*(t+nr));
+	memcpyw(d, s, (b-t-nr) * video_size_row);
+	memsetw(d + (b-t-nr) * video_num_columns, video_erase_char, video_size_row*nr);
+	if (currcons == fg_console)
+		sw->con_scroll(vc_cons[currcons].d, t, b, SM_UP, nr);
 }
 
 static void
-scrdown(int currcons, unsigned int t, unsigned int b, unsigned int nr)
+scrdown(int currcons, unsigned int t, unsigned int b, int nr)
 {
 	unsigned short *s;
 	unsigned int count;
@@ -686,42 +656,14 @@
 		memcpyw(s + step, s, video_size_row);
 		s -= video_num_columns;
 	}
-	while (nr--) {
+	count = nr;
+	while (count--) {
 		s += video_num_columns;
 		memsetw(s, video_erase_char, video_size_row);
 	}
 	has_scrolled = 1;
-}
-
-/*
- * Routine to reset the visible "screen" to the top of video memory.
- * This is necessary when exiting from the kernel back to a console
- * which expects only the top of video memory to be used for the visible
- * screen (with scrolling down by moving the memory contents).
- * The normal action of the LINUX console is to scroll using all of the
- * video memory and diddling the hardware top-of-video register as needed.
- */
-void
-scrreset(void)
-{
-	int currcons = fg_console;
-	unsigned short * d = (unsigned short *) video_mem_start;
-	unsigned short * s = (unsigned short *) origin;
-	unsigned int count;
-
-	count = (video_num_lines-1)*video_num_columns;
-	memcpyw(d, s, 2*count);
-	memsetw(d + count, video_erase_char,
-		2*video_num_columns);
-	scr_end -= origin-video_mem_start;
-	pos -= origin-video_mem_start;
-	origin = video_mem_start;
-
-	has_scrolled = 1;
-	has_wrapped = 1;
-
-	set_origin(currcons);
-	set_cursor(currcons);
+	if (currcons == fg_console)
+		sw->con_scroll(vc_cons[currcons].d, t, b, SM_DOWN, nr);
 }
 
 static void lf(int currcons)
@@ -730,7 +672,7 @@
 	 * if below scrolling region
 	 */
     	if (y+1 == bottom)
-		scrup(currcons,top,bottom, 1);
+		scrup(currcons,top,bottom,1);
 	else if (y < video_num_lines-1) {
 	    	y++;
 		pos += video_size_row;
@@ -781,14 +723,33 @@
 		case 0:	/* erase from cursor to end of display */
 			count = (scr_end-pos)>>1;
 			start = (unsigned short *) pos;
+			if (currcons == fg_console) {
+				/* do in two stages */
+				sw->con_clear(vc_cons[currcons].d, y, x, 1,
+					      video_num_columns-x);
+				sw->con_clear(vc_cons[currcons].d, y+1, 0,
+					      video_num_lines-y-1,
+					      video_num_columns);
+			}
 			break;
 		case 1:	/* erase from start to cursor */
 			count = ((pos-origin)>>1)+1;
 			start = (unsigned short *) origin;
+			if (currcons == fg_console) {
+				/* do in two stages */
+				sw->con_clear(vc_cons[currcons].d, 0, 0, y,
+					      video_num_columns);
+				sw->con_clear(vc_cons[currcons].d, y, 0, 1,
+					      x + 1);
+			}
 			break;
 		case 2: /* erase whole display */
 			count = video_num_columns * video_num_lines;
 			start = (unsigned short *) origin;
+			if (currcons == fg_console)
+				sw->con_clear(vc_cons[currcons].d, 0, 0,
+					      video_num_lines,
+					      video_num_columns);
 			break;
 		default:
 			return;
@@ -806,14 +767,23 @@
 		case 0:	/* erase from cursor to end of line */
 			count = video_num_columns-x;
 			start = (unsigned short *) pos;
+			if (currcons == fg_console)
+				sw->con_clear(vc_cons[currcons].d, y, x, 1,
+					      video_num_columns-x);
 			break;
 		case 1:	/* erase from start of line to cursor */
 			start = (unsigned short *) (pos - (x<<1));
 			count = x+1;
+			if (currcons == fg_console)
+				sw->con_clear(vc_cons[currcons].d, y, 0, 1,
+					      x + 1);
 			break;
 		case 2: /* erase whole line */
 			start = (unsigned short *) (pos - (x<<1));
 			count = video_num_columns;
+			if (currcons == fg_console)
+				sw->con_clear(vc_cons[currcons].d, y, 0, 1,
+					      video_num_columns);
 			break;
 		default:
 			return;
@@ -824,16 +794,43 @@
 
 static void csi_X(int currcons, int vpar) /* erase the following vpar positions */
 {					  /* not vt100? */
+	int count;
+
 	if (!vpar)
 		vpar++;
+	count = (vpar > video_num_columns-x) ? (video_num_columns-x) : vpar;
 
-	memsetw((unsigned short *) pos, video_erase_char,
-		(vpar > video_num_columns-x) ? 2 * (video_num_columns-x) : 2 * vpar);
+	memsetw((unsigned short *) pos, video_erase_char, 2 * count);
+	if (currcons == fg_console)
+		sw->con_clear(vc_cons[currcons].d, y, x, 1, count);
 	need_wrap = 0;
 }
 
 static void update_attr(int currcons)
 {
+/*
+ * ++roman: I completely changed the attribute format for monochrome
+ * mode (!can_do_color). The formerly used MDA (monochrome display
+ * adapter) format didn't allow the combination of certain effects.
+ * Now the attribute is just a bit vector:
+ *  Bit 0..1: intensity (0..2)
+ *  Bit 2   : underline
+ *  Bit 3   : reverse
+ *  Bit 7   : blink
+ *
+ * ++Geert: TODO: Because the attributes have different meanings
+ * for monochrome and color, they should really be converted if
+ * can_do_color changes...
+ */
+	if (!can_do_color) {
+		/* Special treatment for monochrome */
+		attr = intensity |
+			(underline ? 4 : 0) |
+			((reverse ^ decscnm) ? 8 : 0) |
+			(blink ? 0x80 : 0);
+		video_erase_char = ' ' | ((reverse ^ decscnm) ? 0x800 : 0);
+		return;
+	}
 	attr = color;
 	if (can_do_color) {
 		if (underline)
@@ -847,12 +844,6 @@
 		attr ^= 0x80;
 	if (intensity == 2)
 		attr ^= 0x08;
-	if (!can_do_color) {
-		if (underline)
-			attr = (attr & 0xf8) | 0x01;
-		else if (intensity == 0)
-			attr = (attr & 0xf0) | 0x08;
-	}
 	if (decscnm)
 		video_erase_char = (reverse_video_char(color) << 8) | ' ';
 	else
@@ -1060,31 +1051,57 @@
 static inline unsigned short *screenpos(int currcons, int offset, int viewed)
 {
 	unsigned short *p = (unsigned short *)(origin + offset);
-	if (viewed && currcons == fg_console)
-		p -= (__real_origin - __origin);
 	return p;
 }
 
+static inline void visual_putc_attr(int currcons, unsigned short new,
+				    int yy, int xx)
+{
+    unsigned short oldattr = attr;
+    attr = new >> 8;
+    sw->con_putc(vc_cons[currcons].d, new & 0xff, yy, xx);
+    attr = oldattr;
+}
+
+static inline void visual_putc_attr_next(int currcons, unsigned short new,
+					 int *yy, int *xx)
+{
+    attr = new >> 8;
+    sw->con_putc(vc_cons[currcons].d, new & 0xff, *yy, *xx);
+    if (++(*xx) == video_num_columns)
+	*xx = 0, ++(*yy);
+}
+
+
 /* Note: inverting the screen twice should revert to the original state */
 void invert_screen(int currcons, int offset, int count, int viewed)
 {
 	unsigned short *p;
+	int xx = (offset >> 1) % video_num_columns;
+	int yy = (offset >> 1) / video_num_columns;
+	unsigned short oldattr = attr;
 
 	count /= 2;
 	p = screenpos(currcons, offset, viewed);
 	if (can_do_color)
 		while (count--) {
 			unsigned short old = scr_readw(p);
-			scr_writew(reverse_video_short(old), p);
+			unsigned short new = reverse_video_short(old);
+			scr_writew(new, p);
 			p++;
+			if (currcons == fg_console)
+				visual_putc_attr_next(currcons, new, &yy, &xx);
 		}
 	else
 		while (count--) {
 			unsigned short old = scr_readw(p);
-			scr_writew(old ^ (((old & 0x0700) == 0x0100)
-					  ? 0x7000 : 0x7700), p);
+			unsigned short new = reverse_video_short_mono(old);
+			scr_writew(new, p);
 			p++;
+			if (currcons == fg_console)
+				visual_putc_attr_next(currcons, new, &yy, &xx);
 		}
+	attr = oldattr;
 }
 
 /* used by selection: complement pointer position */
@@ -1092,15 +1109,25 @@
 {
 	static unsigned short *p = NULL;
 	static unsigned short old = 0;
+	static unsigned short oldx = 0, oldy = 0;
 
-	if (p)
+	if (p) {
 		scr_writew(old, p);
+		if (currcons == fg_console)
+			visual_putc_attr(currcons, old, oldy, oldx);
+	}
 	if (offset == -1)
 		p = NULL;
 	else {
+		unsigned short new;
 		p = screenpos(currcons, offset, 1);
 		old = scr_readw(p);
-		scr_writew(old ^ 0x7700, p);
+		oldx = (offset >> 1) % video_num_columns;
+		oldy = (offset >> 1) / video_num_columns;
+		new = complement_video_short(old);
+		scr_writew(new, p);
+		if (currcons == fg_console)
+			visual_putc_attr(currcons, new, oldy, oldx);
 	}
 }
 
@@ -1261,9 +1288,18 @@
 	p = q + video_num_columns - nr - x;
 	while (--p >= q)
 		scr_writew(scr_readw(p), p + nr);
-
 	memsetw(q, video_erase_char, nr*2);
 	need_wrap = 0;
+	if (currcons == fg_console) {
+		unsigned short oldattr = attr;
+		sw->con_bmove(vc_cons[currcons].d,y,x,y,x+nr,1,
+			      video_num_columns-x-nr);
+		attr = video_erase_char >> 8;
+		while (nr--)
+			sw->con_putc(vc_cons[currcons].d,
+				     (video_erase_char & 0x00ff),y,x+nr);
+		attr = oldattr;
+	}
 }
 
 static void insert_line(int currcons, unsigned int nr)
@@ -1275,7 +1311,7 @@
 static void delete_char(int currcons, unsigned int nr)
 {
 	unsigned int i = x;
-	unsigned short * p = (unsigned short *) pos;
+	unsigned short *p = (unsigned short *) pos;
 
 	while (++i <= video_num_columns - nr) {
 		scr_writew(scr_readw(p+nr), p);
@@ -1283,6 +1319,17 @@
 	}
 	memsetw(p, video_erase_char, nr*2);
 	need_wrap = 0;
+	if (currcons == fg_console) {
+		unsigned short oldattr = attr;
+		sw->con_bmove(vc_cons[currcons].d, y, x+nr, y, x, 1,
+			      video_num_columns-x-nr);
+		attr = video_erase_char >> 8;
+		while (nr--)
+			sw->con_putc(vc_cons[currcons].d,
+				     (video_erase_char & 0x00ff), y,
+				     video_num_columns-1-nr);
+		attr = oldattr;
+	}
 }
 
 static void delete_line(int currcons, unsigned int nr)
@@ -1293,8 +1340,8 @@
 
 static void csi_at(int currcons, unsigned int nr)
 {
-	if (nr > video_num_columns)
-		nr = video_num_columns;
+	if (nr > video_num_columns - x)
+		nr = video_num_columns - x;
 	else if (!nr)
 		nr = 1;
 	insert_char(currcons, nr);
@@ -1302,8 +1349,8 @@
 
 static void csi_L(int currcons, unsigned int nr)
 {
-	if (nr > video_num_lines)
-		nr = video_num_lines;
+	if (nr > video_num_lines - y)
+		nr = video_num_lines - y;
 	else if (!nr)
 		nr = 1;
 	insert_line(currcons, nr);
@@ -1311,8 +1358,8 @@
 
 static void csi_P(int currcons, unsigned int nr)
 {
-	if (nr > video_num_columns)
-		nr = video_num_columns;
+	if (nr > video_num_columns - x)
+		nr = video_num_columns - x;
 	else if (!nr)
 		nr = 1;
 	delete_char(currcons, nr);
@@ -1320,8 +1367,8 @@
 
 static void csi_M(int currcons, unsigned int nr)
 {
-	if (nr > video_num_lines)
-		nr = video_num_lines;
+	if (nr > video_num_lines - y)
+		nr = video_num_lines - y;
 	else if (!nr)
 		nr=1;
 	delete_line(currcons, nr);
@@ -1395,6 +1442,8 @@
 	kbd_table[currcons].ledflagstate = kbd_table[currcons].default_ledflagstate;
 	set_leds();
 
+	cursor_type = CUR_DEFAULT;
+
 	default_attr(currcons);
 	update_attr(currcons);
 
@@ -1455,7 +1504,7 @@
 	currcons = vt->vc_num;
 	if (vcmode != KD_GRAPHICS)
 		set_cursor(currcons);
-}	
+}
 
 static int do_con_write(struct tty_struct * tty, int from_user,
 			const unsigned char *buf, int count)
@@ -1480,6 +1529,11 @@
 	    return 0;
 	}
 
+	/* undraw cursor first */
+	if (currcons == fg_console)
+		hide_cursor(currcons);
+
+	/* clear the selection */
 	if (currcons == sel_cons)
 		clear_selection();
 
@@ -1490,7 +1544,7 @@
 	}
 
 	disable_bh(CONSOLE_BH);
-	while (!tty->stopped &&	count) {
+	while (count) {
 		enable_bh(CONSOLE_BH);
 		if (from_user)
 			__get_user(c, buf);
@@ -1577,12 +1631,93 @@
 				cr(currcons);
 				lf(currcons);
 			}
+
+                        /* DPC: 1994-04-12
+                         *   Speed up overstrike mode, using new putcs.
+                         *
+                         * P.S. I hate 8 spaces per tab! Use Emacs!
+			 */
+
+			/* Only use this for the foreground console,
+                           where we really draw the chars */
+
+                        if (count > 2 &&
+			    !decim && !utf && currcons == fg_console) {
+				char   *p     = putcs_buf;
+				int putcs_count  = 1;
+				ushort nextx  = x + 1;
+
+				*p++ = tc;
+				scr_writew((attr << 8) + tc,
+					   (unsigned short *)pos);
+				pos+=2;
+
+				if (nextx == video_num_columns) {
+					sw->con_putc(vc_cons[currcons].d,
+						     *putcs_buf, y, x);
+					pos-=2;
+					need_wrap = decawm;
+					continue;
+				}
+
+				/* TAB TAB TAB - Arghh!!!! */
+
+				while (count) {
+					enable_bh(CONSOLE_BH);
+					if (from_user)
+						get_user(c, buf);
+					else
+						c = *buf;
+					disable_bh(CONSOLE_BH);
+					tc = translate[toggle_meta ? (c|0x80) : c];
+					if (!tc ||
+					    !(c >= 32
+					      || !(((disp_ctrl ? CTRL_ALWAYS
+						   : CTRL_ACTION) >> c) & 1)))
+					  break;
+					tc = conv_uni_to_pc(tc);
+					if (tc == -4)
+					  tc = conv_uni_to_pc(0xfffd);
+					else if (tc == -3)
+					  tc = c;
+
+					buf++; n++; count--;
+					if (tc & ~console_charmask)
+					  continue; /* Conversion failed */
+
+					*p++ = tc;
+					scr_writew((attr << 8) + tc,
+						   (unsigned short *)pos);
+					pos+=2;
+					++putcs_count;
+					++nextx;
+					if (nextx == video_num_columns ||
+					    putcs_count == sizeof (putcs_buf))
+						break;
+				}
+
+				sw->con_putcs(vc_cons[currcons].d,
+					      putcs_buf, putcs_count, y, x);
+				if (nextx == video_num_columns) {
+					pos-=2;
+					x         = video_num_columns-1;
+					need_wrap = decawm;
+				} else
+					x += putcs_count;
+				continue;
+                        }
+
+                        /* DPC: End of putcs support */
+
 			if (decim)
 				insert_char(currcons, 1);
 			scr_writew( video_mode_512ch ?
 			   ((attr & 0xf7) << 8) + ((tc & 0x100) << 3) +
 			   (tc & 0x0ff) : (attr << 8) + tc,
 			   (unsigned short *) pos);
+			if (currcons == fg_console)
+				sw->con_putc(vc_cons[currcons].d, tc, y, x);
+
 			if (x == video_num_columns - 1)
 				need_wrap = decawm;
 			else {
@@ -1760,6 +1895,13 @@
 					case 'l':
 						set_mode(currcons,0);
 						continue;
+					case 'c':
+						if (par[0])
+							cursor_type = par[0] | (par[1]<<8) | (par[2]<<16);
+						else
+							cursor_type = CUR_DEFAULT;
+						set_cursor(currcons);
+						continue;
 					case 'n':
 						if (!ques) {
 							if (par[0] == 5)
@@ -1901,6 +2043,11 @@
 					/* DEC screen alignment test. kludge :-) */
 					video_erase_char =
 						(video_erase_char & 0xff00) | 'E';
+					/* Arno:
+					* Doesn't work, because csi_J(c,2)
+					* calls con_clear and doesn't print
+					* the erase char..
+					*/
 					csi_J(currcons, 2);
 					video_erase_char =
 						(video_erase_char & 0xff00) | ' ';
@@ -1989,6 +2136,9 @@
 	int currcons = fg_console;
 	unsigned char c;
 	static int printing = 0;
+	const char *start = b;
+	ushort cnt = 0;
+	ushort myx = x;
 
 #if CONFIG_AP1000
         prom_printf(b);
@@ -2007,30 +2157,52 @@
 		return;
 	}
 
-#ifdef CONFIG_SERIAL_ECHO
-        serial_echo_print(b);
-#endif /* CONFIG_SERIAL_ECHO */
-
-	while (count-- > 0) {
-		c = *(b++);
-		if (c == 10 || c == 13 || need_wrap) {
+	/* undraw cursor first */
+	hide_cursor(currcons);
+
+	/* Contrived structure to try to emulate original need_wrap behaviour
+	 * Problems caused when we have need_wrap set on '\n' character */
+	while (count--) {
+		c = *b++;
+		if (c == 10 || c == 13 || c == 8 || need_wrap) {
+			if ((cnt = b - start - 1) > 0) {
+				sw->con_putcs(vc_cons[currcons].d, start, cnt, y, x);
+				x += cnt;
+				if (need_wrap)
+					x--;
+			}
+			if (c == 8) {		/* backspace */
+				bs(currcons);
+				start = b;
+				myx = x;
+				continue;
+			}
 			if (c != 13)
 				lf(currcons);
 			cr(currcons);
-			if (c == 10 || c == 13)
+			if (c == 10 || c == 13) {
+				start = b;
+				myx = x;
 				continue;
-		}
-		if (c == 8) {		/* backspace */
-			bs(currcons);
-			continue;
+			}
+			start = b-1;
+			myx = x;
 		}
 		scr_writew((attr << 8) + c, (unsigned short *) pos);
-		if (x == video_num_columns - 1) {
+		if (myx == video_num_columns - 1) {
 			need_wrap = 1;
 			continue;
 		}
-		x++;
 		pos+=2;
+		myx++;
+	}
+	if ((cnt = b - start) > 0) {
+		sw->con_putcs(vc_cons[currcons].d, start, cnt, y, x);
+		x += cnt;
+		if (x == video_num_columns) {
+			x--;
+			need_wrap = 1;
+		}
 	}
 	set_cursor(currcons);
 	poke_blanked_console();
@@ -2101,14 +2273,6 @@
 	reset_terminal(currcons, do_clear);
 }
 
-static void con_setsize(unsigned long rows, unsigned long cols)
-{
-	video_num_lines = rows;
-	video_num_columns = cols;
-	video_size_row = 2 * cols;
-	video_screen_size = video_num_lines * video_size_row;
-}
-
 /*
  * This is the console switching bottom half handler.
  *
@@ -2150,23 +2314,17 @@
  */
 __initfunc(unsigned long con_init(unsigned long kmem_start))
 {
-	const char *display_desc = "????";
-	int currcons = 0;
-	int orig_x = ORIG_X;
-	int orig_y = ORIG_Y;
-
-#ifdef __sparc__
-	if (serial_console) {
+	const char *display_desc = NULL;
+	unsigned int currcons = 0;
+	char q[2] = { 0, 1 };
+
+	if (conswitchp)
+		kmem_start = conswitchp->con_startup(kmem_start,
+						     &display_desc);
+	if (!display_desc) {
 		fg_console = 0;
-
-#if CONFIG_SUN_SERIAL
-		rs_cons_hook(0, 0, serial_console);
-		rs_cons_hook(0, 1, serial_console);
-#endif
-
 		return kmem_start;
 	}
-#endif
 
 	memset(&console_driver, 0, sizeof(struct tty_driver));
 	console_driver.magic = TTY_DRIVER_MAGIC;
@@ -2201,7 +2359,6 @@
 #if CONFIG_AP1000
         return(kmem_start);
 #endif
-	con_setsize(ORIG_VIDEO_LINES, ORIG_VIDEO_COLS);
 
 	timer_table[BLANK_TIMER].fn = blank_screen;
 	timer_table[BLANK_TIMER].expires = 0;
@@ -2210,14 +2367,6 @@
 		timer_active |= 1<<BLANK_TIMER;
 	}
 
-	kmem_start = con_type_init(kmem_start, &display_desc);
-
-	hardscroll_enabled = (hardscroll_disabled_by_init ? 0 :
-	  (video_type == VIDEO_TYPE_EGAC
-	    || video_type == VIDEO_TYPE_VGAC
-	    || video_type == VIDEO_TYPE_EGAM));
-	has_wrapped = 0 ;
-
 	/* Due to kmalloc roundup allocating statically is more efficient -
 	   so provide MIN_NR_CONSOLES for people with very little memory */
 	for (currcons = 0; currcons < MIN_NR_CONSOLES; currcons++) {
@@ -2227,6 +2376,7 @@
 		kmem_start += sizeof(struct vc_data);
 		vt_cons[currcons] = (struct vt_struct *) kmem_start;
 		kmem_start += sizeof(struct vt_struct);
+		visual_init(currcons);
 		vc_scrbuf[currcons] = (unsigned short *) kmem_start;
 		kmem_start += video_screen_size;
 		kmalloced = 0;
@@ -2241,58 +2391,65 @@
 
 	currcons = fg_console = 0;
 
-	video_mem_start = video_mem_base;
-	video_mem_end = video_mem_term;
-	origin = video_mem_start;
-	scr_end	= video_mem_start + video_num_lines * video_size_row;
-	gotoxy(currcons,orig_x,orig_y);
-	set_origin(currcons);
+	gotoxy(currcons,0,0);
 	csi_J(currcons, 0);
+	update_screen(fg_console);
 
-	/* Figure out the size of the screen and screen font so we
-	   can figure out the appropriate screen size should we load
-	   a different font */
-
-	printable = 1;
-	if ( video_type == VIDEO_TYPE_VGAC || video_type == VIDEO_TYPE_EGAC
-	    || video_type == VIDEO_TYPE_EGAM || video_type == VIDEO_TYPE_TGAC 
-	     || video_type == VIDEO_TYPE_SUN )
-	{
-		default_font_height = video_font_height = ORIG_VIDEO_POINTS;
-		/* This may be suboptimal but is a safe bet - go with it */
-		video_scan_lines = video_font_height * video_num_lines;
-
-#ifdef CONFIG_SERIAL_ECHO
-		serial_echo_init(SERIAL_ECHO_PORT);
-#endif /* CONFIG_SERIAL_ECHO */
-
-		printk("Console: %ld point font, %ld scans\n",
-		       video_font_height, video_scan_lines);
-	}
-
-	printk("Console: %s %s %ldx%ld, %d virtual console%s (max %d)\n",
+#if 0
+/* The logo is too ugly to live */
+	if (console_show_logo)
+	    q[1] += console_show_logo();
+	conswitchp->con_putcs(vc_cons[fg_console].d, linux_logo_banner,
+			      sizeof(linux_logo_banner)-1, q[1]-1, q[0]);
+	putconsxy(0, q);
+#endif
+	sw->con_cursor(vc_cons[currcons].d, CM_DRAW);
+	printk("Console: %s %s %ldx%ld",
 		can_do_color ? "colour" : "mono",
-		display_desc, video_num_columns, video_num_lines,
-		MIN_NR_CONSOLES, (MIN_NR_CONSOLES == 1) ? "" : "s",
-	        MAX_NR_CONSOLES);
-
-	con_type_init_finish();
+		display_desc, video_num_columns, video_num_lines);
+	printable = 1;
+	printk("\n");
 
-	/*
-	 * can't register TGA yet, because PCI bus probe has *not* taken
-	 * place before con_init() gets called. Trigger the real TGA hw
-	 * initialization and register_console() event from
-	 * within the bus probing code... :-(
-	 */
 #ifdef CONFIG_VT_CONSOLE
-	if (video_type != VIDEO_TYPE_TGAC && con_is_present())
-		register_console(&vt_console_driver);
+	register_console(&vt_console_driver);
 #endif
 
 	init_bh(CONSOLE_BH, console_bh);
 	return kmem_start;
 }
 
+void set_vesa_blanking(unsigned long arg)
+{
+    char *argp = (char *)arg + 1;
+    unsigned int mode;
+    get_user(mode, argp);
+    vesa_blank_mode = (mode < 4) ? mode : 0;
+}
+
+void vesa_blank(void)
+{
+    vc_cons[fg_console].d->vc_sw->con_blank(vesa_blank_mode + 1);
+}
+
+void vesa_powerdown(void)
+{
+    /*
+     *  Power down if currently suspended (1 or 2),
+     *  suspend if currently blanked (0),
+     *  else do nothing (i.e. already powered down (3)).
+     *  Called only if powerdown features are allowed.
+     */
+    switch (vesa_blank_mode) {
+	case VESA_NO_BLANKING:
+	    vc_cons[fg_console].d->vc_sw->con_blank(VESA_VSYNC_SUSPEND+1);
+	    break;
+	case VESA_VSYNC_SUSPEND:
+	case VESA_HSYNC_SUSPEND:
+	    vc_cons[fg_console].d->vc_sw->con_blank(VESA_POWERDOWN+1);
+	    break;
+    }
+}
+
 void vesa_powerdown_screen(void)
 {
 	timer_active &= ~(1<<BLANK_TIMER);
@@ -2308,6 +2465,12 @@
 	if (console_blanked)
 		return;
 
+	/* don't blank graphics */
+	if (vt_cons[fg_console]->vc_mode != KD_TEXT) {
+		console_blanked = fg_console + 1;
+		hide_cursor(fg_console);
+		return;
+	}
 	if(vesa_off_interval && !nopowersave) {
 		timer_table[BLANK_TIMER].fn = vesa_powerdown_screen;
 		timer_table[BLANK_TIMER].expires = jiffies + vesa_off_interval;
@@ -2320,14 +2483,7 @@
 	/* try not to lose information by blanking, and not to waste memory */
 	currcons = fg_console;
 	has_scrolled = 0;
-	blank__origin = __origin;
-	blank_origin = origin;
-	set_origin(fg_console);
-	get_scrmem(fg_console);
-	unblank_origin = origin;
-	memsetw((void *)blank_origin, BLANK,
-		2*video_num_lines*video_num_columns);
-	hide_cursor();
+	sw->con_blank(1);
 	console_blanked = fg_console + 1;
 
 	if(!nopowersave)
@@ -2343,9 +2499,6 @@
 void do_unblank_screen(void)
 {
 	int currcons;
-	int resetorg;
-	long offset;
-
 	if (!console_blanked)
 		return;
 	if (!vc_cons_allocated(fg_console)) {
@@ -2360,28 +2513,11 @@
 	}
 
 	currcons = fg_console;
-	offset = 0;
-	resetorg = 0;
-	if (console_blanked == fg_console + 1 && origin == unblank_origin
-	    && !has_scrolled) {
-		/* try to restore the exact situation before blanking */
-		resetorg = 1;
-		offset = (blank_origin - video_mem_base)
-			- (unblank_origin - video_mem_start);
-	}
-
 	console_blanked = 0;
-	set_scrmem(fg_console, offset);
-	set_origin(fg_console);
+	if (sw->con_blank(0))
+		/* Low-level driver cannot restore -> do it ourselves */
+		update_screen(fg_console);
 	set_cursor(fg_console);
-	if (resetorg)
-		__set_origin(blank__origin);
-
-	vesa_unblank();
-#ifdef CONFIG_APM
-	if (apm_display_unblank())
-		return;
-#endif
 }
 
 /*
@@ -2400,9 +2536,13 @@
 
 void update_screen(int new_console)
 {
+	int currcons = fg_console;
+	int xx, yy, startx, attr_save;
+	char *bufp;
+	unsigned short *p;
 	static int lock = 0;
 
-	if (new_console == fg_console || lock)
+	if (lock)
 		return;
 	if (!vc_cons_allocated(new_console)) {
 		/* strange ... */
@@ -2413,15 +2553,37 @@
 
 	clear_selection();
 
-	if (!console_blanked)
-		get_scrmem(fg_console);
-	else
-		console_blanked = -1;	   /* no longer of the form console+1 */
-	fg_console = new_console; /* this is the only (nonzero) assignment to fg_console */
-				  /* consequently, fg_console will always be allocated */
-	set_scrmem(fg_console, 0);
-	set_origin(fg_console);
-	set_cursor(fg_console);
+	currcons = fg_console = new_console;
+	sw->con_cursor (vc_cons[currcons].d, CM_ERASE);
+	sw->con_switch (vc_cons[new_console].d);
+	/* Update the screen contents */
+	p = (unsigned short *)video_mem_start;
+	attr_save = attr;
+	for (yy = 0; yy < video_num_lines; yy++) {
+	    bufp = putcs_buf;
+	    for (startx = xx = 0; xx < video_num_columns; xx++) {
+		if (attr != ((scr_readw(p) >> 8) & 0xff)) {
+		    if (bufp > putcs_buf)
+		      sw->con_putcs (vc_cons[currcons].d, putcs_buf,
+				     bufp - putcs_buf, yy, startx);
+		    startx = xx;
+		    bufp = putcs_buf;
+		    attr = (scr_readw(p) >> 8) & 0xff;
+		}
+		*bufp++ = scr_readw(p++);
+		if (bufp == putcs_buf + sizeof (putcs_buf)) {
+		    sw->con_putcs (vc_cons[currcons].d, putcs_buf,
+				   bufp - putcs_buf, yy, startx);
+		    startx = xx + 1;
+		    bufp = putcs_buf;
+		}
+	    }
+	    if (bufp > putcs_buf)
+		sw->con_putcs (vc_cons[currcons].d, putcs_buf,
+			       bufp - putcs_buf, yy, startx);
+	}
+	set_cursor (currcons);
+	attr = attr_save;
 	set_leds();
 	compute_shiftstate();
 	lock = 0;
@@ -2432,17 +2594,17 @@
  */
 static int con_open(struct tty_struct *tty, struct file * filp)
 {
-	unsigned int	idx;
+	unsigned int	currcons;
 	int i;
 
-	idx = MINOR(tty->device) - tty->driver.minor_start;
+	currcons = MINOR(tty->device) - tty->driver.minor_start;
 
-	i = vc_allocate(idx);
+	i = vc_allocate(currcons);
 	if (i)
 		return i;
 
-	vt_cons[idx]->vc_num = idx;
-	tty->driver_data = vt_cons[idx];
+	vt_cons[currcons]->vc_num = currcons;
+	tty->driver_data = vt_cons[currcons];
 
 	if (!tty->winsize.ws_row && !tty->winsize.ws_col) {
 		tty->winsize.ws_row = video_num_lines;
@@ -2451,9 +2613,41 @@
 	return 0;
 }
 
+void set_palette(void)
+{
+    if (vt_cons[fg_console]->vc_mode != KD_GRAPHICS)
+	conswitchp->con_set_palette(vc_cons[fg_console].d, color_table);
+}
+
+int set_get_cmap(unsigned char *arg, int set)
+{
+    int i, j, k;
+
+    for (i = 0; i < 16; i++)
+	if (set) {
+	    get_user(default_red[i], arg++);
+	    get_user(default_grn[i], arg++);
+	    get_user(default_blu[i], arg++);
+	} else {
+	    put_user(default_red[i], arg++);
+	    put_user(default_grn[i], arg++);
+	    put_user(default_blu[i], arg++);
+	}
+    if (set) {
+	for (i = 0; i < MAX_NR_CONSOLES; i++)
+	    if (vc_cons_allocated(i))
+		for (j = k = 0; j < 16; j++) {
+		    vc_cons[i].d->vc_palette[k++] = default_red[j];
+		    vc_cons[i].d->vc_palette[k++] = default_grn[j];
+		    vc_cons[i].d->vc_palette[k++] = default_blu[j];
+		}
+	set_palette();
+    }
+    return 0;
+}
 
 /*
- * Load palette into the EGA/VGA DAC registers. arg points to a colour
+ * Load palette into the DAC registers. arg points to a colour
  * map, 3 bytes per colour, 16 colours, range from 0 to 255.
  */
 
@@ -2476,6 +2670,58 @@
 		palette[k++] = default_blu[j];
 	}
 	set_palette() ;
+}
+
+/*
+ *  PIO_FONT support.
+ *
+ *  Currently we only support 8 pixels wide fonts, at a maximum height
+ *  of 32 pixels. Userspace fontdata is stored with 32 bytes reserved
+ *  for each character which is kinda wasty, but this is done in order
+ *  to maintain compatibility with the EGA/VGA fonts. It is upto the
+ *  actual low-level console-driver convert data into its favorite
+ *  format (maybe we should add a `fontoffset' field to the `display'
+ *  structure so we wont have to convert the fontdata all the time.
+ *  /Jes
+ */
+
+#define cmapsz 8192
+
+int set_get_font(unsigned char * arg, int set, int ch512)
+{
+    int i, unit, size;
+    char *charmap;
+
+    if (!arg)
+	return -EINVAL;
+
+
+    size = ch512 ? 2*cmapsz : cmapsz;
+
+    charmap = (char *)kmalloc(size, GFP_USER);
+
+    if (set) {
+	if (copy_from_user(charmap, arg, size)) {
+	    kfree(charmap);
+	    return -EFAULT;
+	}
+
+	for (unit = 32; unit > 0; unit--)
+	    for (i = 0; i < (ch512 ? 512 : 256); i++)
+		if (charmap[32*i+unit-1])
+		    goto nonzero;
+    nonzero:
+	i = conswitchp->con_set_font(vc_cons[fg_console].d, 8, unit, charmap);
+    } else {
+	memset(charmap, 0, size);
+	i = conswitchp->con_get_font(vc_cons[fg_console].d, &unit, &unit,
+				     charmap);
+	if (i == 0 && copy_to_user(arg, charmap, size))
+	    i = -EFAULT;
+    }
+    kfree(charmap);
+
+    return i;
 }
 
 /*
diff -u --recursive --new-file v2.1.106/linux/drivers/char/console_macros.h linux/drivers/char/console_macros.h
--- v2.1.106/linux/drivers/char/console_macros.h	Wed Dec 31 16:00:00 1969
+++ linux/drivers/char/console_macros.h	Wed Jun 24 14:44:00 1998
@@ -0,0 +1,65 @@
+#define cons_num	(vc_cons[currcons].d->vc_num)
+#define sw		(vc_cons[currcons].d->vc_sw)
+#define screenbuf_size	(vc_cons[currcons].d->vc_screenbuf_size)
+#define origin		(vc_cons[currcons].d->vc_origin)
+#define scr_end		(vc_cons[currcons].d->vc_scr_end)
+#define pos		(vc_cons[currcons].d->vc_pos)
+#define top		(vc_cons[currcons].d->vc_top)
+#define bottom		(vc_cons[currcons].d->vc_bottom)
+#define x		(vc_cons[currcons].d->vc_x)
+#define y		(vc_cons[currcons].d->vc_y)
+#define vc_state	(vc_cons[currcons].d->vc_state)
+#define npar		(vc_cons[currcons].d->vc_npar)
+#define par		(vc_cons[currcons].d->vc_par)
+#define ques		(vc_cons[currcons].d->vc_ques)
+#define attr		(vc_cons[currcons].d->vc_attr)
+#define saved_x		(vc_cons[currcons].d->vc_saved_x)
+#define saved_y		(vc_cons[currcons].d->vc_saved_y)
+#define translate	(vc_cons[currcons].d->vc_translate)
+#define G0_charset	(vc_cons[currcons].d->vc_G0_charset)
+#define G1_charset	(vc_cons[currcons].d->vc_G1_charset)
+#define saved_G0	(vc_cons[currcons].d->vc_saved_G0)
+#define saved_G1	(vc_cons[currcons].d->vc_saved_G1)
+#define utf		(vc_cons[currcons].d->vc_utf)
+#define utf_count	(vc_cons[currcons].d->vc_utf_count)
+#define utf_char	(vc_cons[currcons].d->vc_utf_char)
+#define video_mem_start (vc_cons[currcons].d->vc_video_mem_start)
+#define video_mem_end	(vc_cons[currcons].d->vc_video_mem_end)
+#define video_erase_char (vc_cons[currcons].d->vc_video_erase_char)
+#define disp_ctrl	(vc_cons[currcons].d->vc_disp_ctrl)
+#define toggle_meta	(vc_cons[currcons].d->vc_toggle_meta)
+#define decscnm		(vc_cons[currcons].d->vc_decscnm)
+#define decom		(vc_cons[currcons].d->vc_decom)
+#define decawm		(vc_cons[currcons].d->vc_decawm)
+#define deccm		(vc_cons[currcons].d->vc_deccm)
+#define decim		(vc_cons[currcons].d->vc_decim)
+#define deccolm		(vc_cons[currcons].d->vc_deccolm)
+#define need_wrap	(vc_cons[currcons].d->vc_need_wrap)
+#define has_scrolled	(vc_cons[currcons].d->vc_has_scrolled)
+#define kmalloced	(vc_cons[currcons].d->vc_kmalloced)
+#define report_mouse	(vc_cons[currcons].d->vc_report_mouse)
+#define color		(vc_cons[currcons].d->vc_color)
+#define s_color		(vc_cons[currcons].d->vc_s_color)
+#define def_color	(vc_cons[currcons].d->vc_def_color)
+#define foreground	(color & 0x0f)
+#define background	(color & 0xf0)
+#define charset		(vc_cons[currcons].d->vc_charset)
+#define s_charset	(vc_cons[currcons].d->vc_s_charset)
+#define	intensity	(vc_cons[currcons].d->vc_intensity)
+#define	underline	(vc_cons[currcons].d->vc_underline)
+#define	blink		(vc_cons[currcons].d->vc_blink)
+#define	reverse		(vc_cons[currcons].d->vc_reverse)
+#define	s_intensity	(vc_cons[currcons].d->vc_s_intensity)
+#define	s_underline	(vc_cons[currcons].d->vc_s_underline)
+#define	s_blink		(vc_cons[currcons].d->vc_s_blink)
+#define	s_reverse	(vc_cons[currcons].d->vc_s_reverse)
+#define	ulcolor		(vc_cons[currcons].d->vc_ulcolor)
+#define	halfcolor	(vc_cons[currcons].d->vc_halfcolor)
+#define tab_stop	(vc_cons[currcons].d->vc_tab_stop)
+#define palette		(vc_cons[currcons].d->vc_palette)
+#define bell_pitch	(vc_cons[currcons].d->vc_bell_pitch)
+#define bell_duration	(vc_cons[currcons].d->vc_bell_duration)
+#define cursor_type	(vc_cons[currcons].d->vc_cursor_type)
+#define vcmode		(vt_cons[currcons]->vc_mode)
+
+#define structsize	(sizeof(struct vc_data) + sizeof(struct vt_struct))
diff -u --recursive --new-file v2.1.106/linux/drivers/char/fbmem.c linux/drivers/char/fbmem.c
--- v2.1.106/linux/drivers/char/fbmem.c	Tue Mar 10 10:03:31 1998
+++ linux/drivers/char/fbmem.c	Wed Jun 24 14:44:00 1998
@@ -8,6 +8,9 @@
  * for more details.
  */
 
+#include <linux/config.h>
+#include <linux/module.h>
+
 #include <linux/types.h>
 #include <linux/errno.h>
 #include <linux/sched.h>
@@ -17,29 +20,141 @@
 #include <linux/mman.h>
 #include <linux/tty.h>
 #include <linux/init.h>
+#ifdef CONFIG_PROC_FS
+#include <linux/proc_fs.h>
+#endif
+#ifdef CONFIG_KERNELD
+#include <linux/kerneld.h>
+#endif
 
+#ifdef __mc68000__
 #include <asm/setup.h>
+#endif
+#ifdef __powerpc__
+#include <asm/io.h>
+#endif
 #include <asm/uaccess.h>
 #include <asm/page.h>
 #include <asm/pgtable.h>
 
 #include <linux/fb.h>
 
-#define FB_MAJOR	29
 
-#define FB_MODES_SHIFT    5	/* 32 modes per framebuffer */
-#define FB_NUM_MINORS 	256	/* 256 Minors		    */
-#define FB_MAX		(FB_NUM_MINORS / (1 << FB_MODES_SHIFT))
+    /*
+     *  Frame buffer device initialization and setup routines
+     */
+
+extern unsigned long amifb_init(unsigned long mem_start);
+extern void amifb_setup(char *options, int *ints);
+extern unsigned long atafb_init(unsigned long mem_start);
+extern void atafb_setup(char *options, int *ints);
+extern unsigned long macfb_init(unsigned long mem_start);
+extern void macfb_setup(char *options, int *ints);
+extern unsigned long cyberfb_init(unsigned long mem_start);
+extern void cyberfb_setup(char *options, int *ints);
+extern unsigned long retz3fb_init(unsigned long mem_start);
+extern void retz3fb_setup(char *options, int *ints);
+extern unsigned long clgenfb_init(unsigned long mem_start);
+extern void clgenfb_setup(char *options, int *ints);
+extern unsigned long vfb_init(unsigned long mem_start);
+extern void vfb_setup(char *options, int *ints);
+extern unsigned long offb_init(unsigned long mem_start);
+extern void offb_setup(char *options, int *ints);
+extern unsigned long atyfb_init(unsigned long mem_start);
+extern void atyfb_setup(char *options, int *ints);
+extern unsigned long dnfb_init(unsigned long mem_start);
+extern unsigned long tgafb_init(unsigned long mem_start);
+extern unsigned long virgefb_init(unsigned long mem_start);
+extern void virgefb_setup(char *options, int *ints);
+extern void resolver_video_setup(char *options, int *ints);
+extern unsigned long s3triofb_init(unsigned long mem_start);
+extern void s3triofb_setup(char *options, int *ints);
+extern unsigned long vgafb_init(unsigned long mem_start);
+extern void vgafb_setup(char *options, int *ints);
+extern unsigned long vesafb_init(unsigned long mem_start);
+extern void vesafb_setup(char *options, int *ints);
+extern unsigned long mdafb_init(unsigned long mem_start);
+extern void mdafb_setup(char *options, int *ints);
+extern unsigned long hpfb_init(unsigned long mem_start);
+extern void hpfb_setup(char *options, int *ints);
+
+
+
+static struct {
+	const char *name;
+	unsigned long (*init)(unsigned long mem_start);
+	void (*setup)(char *options, int *ints);
+} fb_drivers[] __initdata = {
+#ifdef CONFIG_FB_RETINAZ3
+	{ "retz3", retz3fb_init, retz3fb_setup },
+#endif
+#ifdef CONFIG_FB_AMIGA
+	{ "amifb", amifb_init, amifb_setup },
+#endif
+#ifdef CONFIG_FB_ATARI
+	{ "atafb", atafb_init, atafb_setup },
+#endif
+#ifdef CONFIG_FB_MAC
+	{ "macfb", macfb_init, macfb_setup },
+#endif
+#ifdef CONFIG_FB_CYBER
+	{ "cyber", cyberfb_init, cyberfb_setup },
+#endif
+#ifdef CONFIG_FB_CLGEN
+	{ "clgen", clgenfb_init, clgenfb_setup },
+#endif
+#ifdef CONFIG_FB_VIRTUAL
+	{ "vfb", vfb_init, vfb_setup },
+#endif
+#ifdef CONFIG_FB_OF
+	{ "offb", offb_init, offb_setup },
+#endif
+#ifdef CONFIG_FB_ATY
+	{ "atyfb", atyfb_init, atyfb_setup },
+#endif
+#ifdef CONFIG_APOLLO
+	{ "apollo", dnfb_init, NULL },
+#endif
+#ifdef CONFIG_FB_S3TRIO
+	{ "s3trio", s3triofb_init, s3triofb_setup },
+#endif 
+#ifdef CONFIG_FB_TGA
+	{ "tga", tgafb_init, NULL },
+#endif
+#ifdef CONFIG_FB_VIRGE
+	{ "virge", virgefb_init, virgefb_setup },
+#endif
+#ifdef CONFIG_FB_VGA
+	{ "vga", vgafb_init, vgafb_setup },
+#endif 
+#ifdef CONFIG_FB_VESA
+	{ "vesa", vesafb_init, vesafb_setup },
+#endif 
+#ifdef CONFIG_FB_MDA
+	{ "mda", mdafb_init, mdafb_setup },
+#endif 
+#ifdef CONFIG_FB_HP300
+	{ "hpfb", hpfb_init, hpfb_setup },
+#endif 
+#ifdef CONFIG_GSP_RESOLVER
+	/* Not a real frame buffer device... */
+	{ "resolver", NULL, resolver_video_setup },
+#endif
+};
+
+#define NUM_FB_DRIVERS	(sizeof(fb_drivers)/sizeof(*fb_drivers))
+
+static fb_init_func *pref_init_funcs[FB_MAX];
+static int num_pref_init_funcs __initdata = 0;
+
 
 #define GET_INODE(i) MKDEV(FB_MAJOR, (i) << FB_MODES_SHIFT)
-#define GET_FB_IDX(node) (MINOR(node) >> FB_MODES_SHIFT)
 #define GET_FB_VAR_IDX(node) (MINOR(node) & ((1 << FB_MODES_SHIFT)-1)) 
 
-struct fb_ops *registered_fb[FB_MAX];
-struct fb_var_screeninfo *registered_fb_var[FB_MAX];
-int registered_fb_var_num[FB_MAX];
-int fb_curr_open[FB_MAX];
-int fb_open_count[FB_MAX];
+struct fb_info *registered_fb[FB_MAX];
+int num_registered_fb = 0;
+
+char con2fb_map[MAX_NR_CONSOLES];
 
 static inline int PROC_CONSOLE(void)
 {
@@ -56,167 +171,240 @@
 	return MINOR(current->tty->device) - 1;
 }
 
-static long 
-fb_read(struct inode *inode, struct file *file, char *buf, unsigned long count)
+#ifdef CONFIG_PROC_FS
+static int fbmem_read_proc(char *buf, char **start, off_t offset,
+			   int len, int *eof, void *private)
+{
+	struct fb_info **fi;
+
+	len = 0;
+	for (fi = registered_fb; fi < &registered_fb[FB_MAX] && len < 4000; fi++)
+		if (*fi)
+			len += sprintf(buf + len, "%d %s\n",
+				       GET_FB_IDX((*fi)->node),
+				       (*fi)->modename);
+	*start = buf + offset;
+	return len > offset ? len - offset : 0;
+}
+#endif
+
+static ssize_t
+fb_read(struct file *file, char *buf, size_t count, loff_t *ppos)
 {
-	unsigned long p = file->f_pos;
-	struct fb_ops *fb = registered_fb[GET_FB_IDX(inode->i_rdev)];
+	unsigned long p = *ppos;
+	struct inode *inode = file->f_dentry->d_inode;
+	int fbidx = GET_FB_IDX(inode->i_rdev);
+	struct fb_info *info = registered_fb[fbidx];
+	struct fb_ops *fb = info->fbops;
 	struct fb_fix_screeninfo fix;
 	char *base_addr;
-	int copy_size;
+	ssize_t copy_size;
 
-	if (! fb)
+	if (! fb || ! info->disp)
 		return -ENODEV;
 
-	fb->fb_get_fix(&fix,PROC_CONSOLE());
-	base_addr=(char *) fix.smem_start;
+	fb->fb_get_fix(&fix,PROC_CONSOLE(), info);
+	base_addr=info->disp->screen_base;
 	copy_size=(count + p <= fix.smem_len ? count : fix.smem_len - p);
-	copy_to_user(buf, base_addr+p, copy_size);
-	file->f_pos += copy_size;
+	if (copy_to_user(buf, base_addr+p, copy_size))
+	    return -EFAULT;
+	*ppos += copy_size;
 	return copy_size;
 }
 
-static long
-fb_write(struct inode *inode, struct file *file, const char *buf,
-	 unsigned long count)
+static ssize_t
+fb_write(struct file *file, const char *buf, size_t count, loff_t *ppos)
 {
-	unsigned long p = file->f_pos;
-	struct fb_ops *fb = registered_fb[GET_FB_IDX(inode->i_rdev)];
+	unsigned long p = *ppos;
+	struct inode *inode = file->f_dentry->d_inode;
+	int fbidx = GET_FB_IDX(inode->i_rdev);
+	struct fb_info *info = registered_fb[fbidx];
+	struct fb_ops *fb = info->fbops;
 	struct fb_fix_screeninfo fix;
 	char *base_addr;
-	int copy_size;
+	ssize_t copy_size;
 
-	if (! fb)
+	if (! fb || ! info->disp)
 		return -ENODEV;
-	fb->fb_get_fix(&fix, PROC_CONSOLE());
-	base_addr=(char *) fix.smem_start;
+
+	fb->fb_get_fix(&fix, PROC_CONSOLE(), info);
+	base_addr=info->disp->screen_base;
 	copy_size=(count + p <= fix.smem_len ? count : fix.smem_len - p);
-	copy_from_user(base_addr+p, buf, copy_size); 
+	if (copy_from_user(base_addr+p, buf, copy_size))
+	    return -EFAULT;
 	file->f_pos += copy_size;
 	return copy_size;
 }
 
 
+static void set_con2fb_map(int unit, int newidx)
+{
+    int oldidx = con2fb_map[unit];
+    struct fb_info *oldfb, *newfb;
+    struct vc_data *conp;
+
+    if (newidx != con2fb_map[unit]) {
+       oldfb = registered_fb[oldidx];
+       newfb = registered_fb[newidx];
+       if (newfb->fbops->fb_open(newfb))
+	   return;
+       oldfb->fbops->fb_release(oldfb);
+       conp = fb_display[unit].conp;
+       con2fb_map[unit] = newidx;
+       fb_display[unit] = *(newfb->disp);
+       fb_display[unit].conp = conp;
+       fb_display[unit].fb_info = newfb;
+       if (!newfb->changevar)
+	   newfb->changevar = oldfb->changevar;
+       /* tell console var has changed */
+       if (newfb->changevar)
+	   newfb->changevar(unit);
+    }
+}
+
+#ifdef CONFIG_KERNELD
+static void try_to_load(int fb)
+{
+	char modname[16];
+
+	sprintf(modname, "fb%d", fb);
+	request_module(modname);
+}
+#endif
+
 static int 
 fb_ioctl(struct inode *inode, struct file *file, unsigned int cmd,
 	 unsigned long arg)
 {
-	struct fb_ops *fb = registered_fb[GET_FB_IDX(inode->i_rdev)];
+	int fbidx = GET_FB_IDX(inode->i_rdev);
+	struct fb_info *info = registered_fb[fbidx];
+	struct fb_ops *fb = info->fbops;
 	struct fb_cmap cmap;
 	struct fb_var_screeninfo var;
 	struct fb_fix_screeninfo fix;
-
-	int i,fbidx,vidx;
+	struct fb_con2fbmap con2fb;
+	int i;
 	
 	if (! fb)
 		return -ENODEV;
 	switch (cmd) {
 	case FBIOGET_VSCREENINFO:
-		i = verify_area(VERIFY_WRITE, (void *) arg, 
-				sizeof(struct fb_var_screeninfo));
-		if (i) return i;
-		fbidx=GET_FB_IDX(inode->i_rdev);
-		vidx=GET_FB_VAR_IDX(inode->i_rdev);
-		if (! vidx) /* ask device driver for current */
-			i=fb->fb_get_var(&var, PROC_CONSOLE());
-		else
-			var=registered_fb_var[fbidx][vidx-1];
-		copy_to_user((void *) arg, &var, sizeof(var));
-		return i;
+		if ((i = fb->fb_get_var(&var, PROC_CONSOLE(), info)))
+			return i;
+		return copy_to_user((void *) arg, &var,
+				    sizeof(var)) ? -EFAULT : 0;
 	case FBIOPUT_VSCREENINFO:
-		i = verify_area(VERIFY_WRITE, (void *) arg, 
-				sizeof(struct fb_var_screeninfo));
-		if (i) return i;
-		copy_from_user(&var, (void *) arg, sizeof(var));
-		i=fb->fb_set_var(&var, PROC_CONSOLE());
-		copy_to_user((void *) arg, &var, sizeof(var));
-		fbidx=GET_FB_IDX(inode->i_rdev);
-		vidx=GET_FB_VAR_IDX(inode->i_rdev);
-		if (! i && vidx)
-			registered_fb_var[fbidx][vidx-1]=var;
-		return i;
+		if (copy_from_user(&var, (void *) arg, sizeof(var)))
+			return -EFAULT;
+		if ((i = fb->fb_set_var(&var, PROC_CONSOLE(), info)))
+			return i;
+		if (copy_to_user((void *) arg, &var, sizeof(var)))
+			return -EFAULT;
+		return 0;
 	case FBIOGET_FSCREENINFO:
-		i = verify_area(VERIFY_WRITE, (void *) arg, 
-				sizeof(struct fb_fix_screeninfo));
-		if (i)	return i;
-		i=fb->fb_get_fix(&fix, PROC_CONSOLE());
-		copy_to_user((void *) arg, &fix, sizeof(fix));
-		return i;
+		if ((i = fb->fb_get_fix(&fix, PROC_CONSOLE(), info)))
+			return i;
+		return copy_to_user((void *) arg, &fix, sizeof(fix)) ?
+			-EFAULT : 0;
 	case FBIOPUTCMAP:
-		i = verify_area(VERIFY_READ, (void *) arg,
-				sizeof(struct fb_cmap));
-		if (i) return i;
-		copy_from_user(&cmap, (void *) arg, sizeof(cmap));
-		i = verify_area(VERIFY_READ, (void *) cmap.red, 
-				cmap.len * sizeof(unsigned short));
-		if (i) return i;
-		i = verify_area(VERIFY_READ, (void *) cmap.green, 
-				cmap.len * sizeof(unsigned short));
-		if (i) return i;
-		i = verify_area(VERIFY_READ, (void *) cmap.blue, 
-				cmap.len * sizeof(unsigned short));
-		if (i) return i;
-		if (cmap.transp) {
-			i = verify_area(VERIFY_READ, (void *) cmap.transp, 
-					cmap.len * sizeof(unsigned short));
-			if (i) return i;
-		}
-		return (fb->fb_set_cmap(&cmap, 0, PROC_CONSOLE()));
+		if (copy_from_user(&cmap, (void *) arg, sizeof(cmap)))
+			return -EFAULT;
+		return (fb->fb_set_cmap(&cmap, 0, PROC_CONSOLE(), info));
 	case FBIOGETCMAP:
-		i = verify_area(VERIFY_READ, (void *) arg,
-				sizeof(struct fb_cmap));
-		if (i)	return i;
-		copy_from_user(&cmap, (void *) arg, sizeof(cmap));
-		i = verify_area(VERIFY_WRITE, (void *) cmap.red, 
-				cmap.len * sizeof(unsigned short));
-		if (i) return i;
-		i = verify_area(VERIFY_WRITE, (void *) cmap.green, 
-				cmap.len * sizeof(unsigned short));
-		if (i) return i;
-		i = verify_area(VERIFY_WRITE, (void *) cmap.blue, 
-				cmap.len * sizeof(unsigned short));
-		if (i) return i;
-		if (cmap.transp) {
-			i = verify_area(VERIFY_WRITE, (void *) cmap.transp, 
-					cmap.len * sizeof(unsigned short));
-			if (i) return i;
-		}
-		return (fb->fb_get_cmap(&cmap, 0, PROC_CONSOLE()));
+		if (copy_from_user(&cmap, (void *) arg, sizeof(cmap)))
+			return -EFAULT;
+		return (fb->fb_get_cmap(&cmap, 0, PROC_CONSOLE(), info));
 	case FBIOPAN_DISPLAY:
-		i = verify_area(VERIFY_WRITE, (void *) arg, 
-				sizeof(struct fb_var_screeninfo));
-		if (i) return i;
-		copy_from_user(&var, (void *) arg, sizeof(var));
-		i=fb->fb_pan_display(&var, PROC_CONSOLE());
-		copy_to_user((void *) arg, &var, sizeof(var));
-		fbidx=GET_FB_IDX(inode->i_rdev);
-		vidx=GET_FB_VAR_IDX(inode->i_rdev);
-		if (! i && vidx)
-			registered_fb_var[fbidx][vidx-1]=var;
+		if (copy_from_user(&var, (void *) arg, sizeof(var)))
+			return -EFAULT;
+		if ((i=fb->fb_pan_display(&var, PROC_CONSOLE(), info)))
+			return i;
+		if (copy_to_user((void *) arg, &var, sizeof(var)))
+			return -EFAULT;
 		return i;
+	case FBIOGET_CON2FBMAP:
+		if (copy_from_user(&con2fb, (void *)arg, sizeof(con2fb)))
+			return -EFAULT;
+		if (con2fb.console < 1 || con2fb.console > MAX_NR_CONSOLES)
+		    return -EINVAL;
+		con2fb.framebuffer = con2fb_map[con2fb.console-1];
+		return copy_to_user((void *)arg, &con2fb,
+				    sizeof(con2fb)) ? -EFAULT : 0;
+	case FBIOPUT_CON2FBMAP:
+		if (copy_from_user(&con2fb, (void *)arg, sizeof(con2fb)))
+			return - EFAULT;
+		if (con2fb.console < 0 || con2fb.console > MAX_NR_CONSOLES)
+		    return -EINVAL;
+		if (con2fb.framebuffer < 0 || con2fb.framebuffer >= FB_MAX)
+		    return -EINVAL;
+#ifdef CONFIG_KERNELD
+		if (!registered_fb[con2fb.framebuffer])
+		    try_to_load(con2fb.framebuffer);
+#endif
+		if (!registered_fb[con2fb.framebuffer])
+		    return -EINVAL;
+		if (con2fb.console != 0)
+		    set_con2fb_map(con2fb.console-1, con2fb.framebuffer);
+		else
+		    /* set them all */
+		    for (i = 0; i < MAX_NR_CONSOLES; i++)
+			set_con2fb_map(i, con2fb.framebuffer);
+		return 0;
 	default:
-		return (fb->fb_ioctl(inode, file, cmd, arg, PROC_CONSOLE()));
+		return fb->fb_ioctl(inode, file, cmd, arg, PROC_CONSOLE(),
+				    info);
 	}
 }
 
-static int fb_mmap(struct file *file, struct vm_area_struct * vma)
+static int 
+fb_mmap(struct file *file, struct vm_area_struct * vma)
 {
-	struct fb_ops *fb = registered_fb[GET_FB_IDX(file->f_dentry->d_inode->i_rdev)];
+	int fbidx = GET_FB_IDX(file->f_dentry->d_inode->i_rdev);
+	struct fb_info *info = registered_fb[fbidx];
+	struct fb_ops *fb = info->fbops;
 	struct fb_fix_screeninfo fix;
+	struct fb_var_screeninfo var;
+	unsigned long start;
+	u32 len;
 
-	if (! fb)
+	if (!fb)
 		return -ENODEV;
-	fb->fb_get_fix(&fix, PROC_CONSOLE());
-	if ((vma->vm_end - vma->vm_start + vma->vm_offset) > fix.smem_len)
+	fb->fb_get_fix(&fix, PROC_CONSOLE(), info);
+
+	/* frame buffer memory */
+	start = (unsigned long)fix.smem_start;
+	len = (start & ~PAGE_MASK)+fix.smem_len;
+	start &= PAGE_MASK;
+	len = (len+~PAGE_MASK) & PAGE_MASK;
+	if (vma->vm_offset >= len) {
+		/* memory mapped io */
+		vma->vm_offset -= len;
+		fb->fb_get_var(&var, PROC_CONSOLE(), info);
+		if (var.accel_flags)
+			return -EINVAL;
+		start = (unsigned long)fix.mmio_start;
+		len = (start & ~PAGE_MASK)+fix.mmio_len;
+		start &= PAGE_MASK;
+		len = (len+~PAGE_MASK) & PAGE_MASK;
+	}
+	if ((vma->vm_end - vma->vm_start + vma->vm_offset) > len)
 		return -EINVAL;
-	vma->vm_offset += __pa(fix.smem_start);
+	vma->vm_offset += start;
 	if (vma->vm_offset & ~PAGE_MASK)
 		return -ENXIO;
+#if defined(__mc68000__)
+	if (CPU_IS_020_OR_030)
+		pgprot_val(vma->vm_page_prot) |= _PAGE_NOCACHE030;
 	if (CPU_IS_040_OR_060) {
 		pgprot_val(vma->vm_page_prot) &= _CACHEMASK040;
-		/* Use write-through cache mode */
+		/* Use no-cache mode, serialized */
 		pgprot_val(vma->vm_page_prot) |= _PAGE_NOCACHE_S;
 	}
+#elif defined(__powerpc__)
+	pgprot_val(vma->vm_page_prot) |= _PAGE_NO_CACHE|_PAGE_GUARDED;
+#else
+#warning What do we have to do here??
+#endif
 	if (remap_page_range(vma->vm_start, vma->vm_offset,
 			     vma->vm_end - vma->vm_start, vma->vm_page_prot))
 		return -EAGAIN;
@@ -228,34 +416,25 @@
 static int
 fb_open(struct inode *inode, struct file *file)
 {
-	int fbidx=GET_FB_IDX(inode->i_rdev);
-	int vidx=GET_FB_VAR_IDX(inode->i_rdev);
-	struct fb_ops *fb = registered_fb[fbidx];
-	int err;
-	
-	if (! vidx)		/* fb?current always succeeds */ 
-		return 0;
-	if (vidx > registered_fb_var_num[fbidx])
-		return -EINVAL;
-	if (fb_curr_open[fbidx] && fb_curr_open[fbidx] != vidx)
-		return -EBUSY;
- 	if (file->f_mode & 2) /* only set parameters if opened writeable */
-		if ((err=fb->fb_set_var(registered_fb_var[fbidx] + vidx-1, PROC_CONSOLE())))
-			return err;
-	fb_curr_open[fbidx] = vidx;
-	fb_open_count[fbidx]++;
-	return 0;
+	int fbidx = GET_FB_IDX(inode->i_rdev);
+	struct fb_info *info;
+
+#ifdef CONFIG_KERNELD
+	if (!(info = registered_fb[fbidx]))
+		try_to_load(fbidx);
+#endif
+	if (!(info = registered_fb[fbidx]))
+		return -ENODEV;
+	return info->fbops->fb_open(info);
 }
 
 static int 
 fb_release(struct inode *inode, struct file *file)
 {
-	int fbidx=GET_FB_IDX(inode->i_rdev);
-	int vidx=GET_FB_VAR_IDX(inode->i_rdev);
-	if (! vidx)
-		return 0;
-	if (! (--fb_open_count[fbidx]))
-		fb_curr_open[fbidx]=0;
+	int fbidx = GET_FB_IDX(inode->i_rdev);
+	struct fb_info *info = registered_fb[fbidx];
+
+	info->fbops->fb_release(info);
 	return 0;
 }
 
@@ -273,37 +452,181 @@
 };
 
 int
-register_framebuffer(char *id, int *node, struct fb_ops *fbops, int fbvar_num, 
-		     struct fb_var_screeninfo *fbvar)
+register_framebuffer(struct fb_info *fb_info)
 {
-	int i;
+	int i, j;
+	static int fb_ever_opened[FB_MAX];
+
+	if (num_registered_fb == FB_MAX)
+		return -ENXIO;
+	num_registered_fb++;
 	for (i = 0 ; i < FB_MAX; i++)
-		if (! registered_fb[i])
+		if (!registered_fb[i])
 			break;
-	if (i == FB_MAX)
-		return -ENXIO;
-	registered_fb[i]=fbops;
-	registered_fb_var[i]=fbvar;
-	registered_fb_var_num[i]=fbvar_num;
-	*node=GET_INODE(i);
+	fb_info->node=GET_INODE(i);
+	registered_fb[i] = fb_info;
+	if (!fb_ever_opened[i]) {
+		/*
+		 *  We assume initial frame buffer devices can be opened this
+		 *  many times
+		 */
+		for (j = 0; j < MAX_NR_CONSOLES; j++)
+			if (con2fb_map[j] == i)
+				fb_info->fbops->fb_open(fb_info);
+		fb_ever_opened[i] = 1;
+	}
 	return 0;
 }
 
 int
-unregister_framebuffer(int node)
+unregister_framebuffer(const struct fb_info *fb_info)
 {
-	int i=GET_FB_IDX(node);
-	if (! registered_fb[i])
+	int i, j;
+
+	i = GET_FB_IDX(fb_info->node);
+	for (j = 0; j < MAX_NR_CONSOLES; j++)
+		if (con2fb_map[j] == i)
+			return -EBUSY;
+	if (!registered_fb[i])
 		return -EINVAL; 
 	registered_fb[i]=NULL;
-	registered_fb_var[i]=NULL;
+	num_registered_fb--;
 	return 0;
 }
 
+#ifdef CONFIG_PROC_FS
+static struct proc_dir_entry *proc_fbmem;
+#endif
+
 __initfunc(void
 fbmem_init(void))
 {
+#ifdef CONFIG_PROC_FS
+	proc_fbmem = create_proc_entry("fb", 0, 0);
+	if (proc_fbmem)
+		proc_fbmem->read_proc = fbmem_read_proc;
+#endif
+
 	if (register_chrdev(FB_MAJOR,"fb",&fb_fops))
 		printk("unable to get major %d for fb devs\n", FB_MAJOR);
 }
 
+
+int fbmon_valid_timings(u_int pixclock, u_int htotal, u_int vtotal,
+			const struct fb_info *fb_info)
+{
+#if 0
+	/*
+	 * long long divisions .... $#%%#$ 
+	 */
+    unsigned long long hpicos, vpicos;
+    const unsigned long long _1e12 = 1000000000000ULL;
+    const struct fb_monspecs *monspecs = &fb_info->monspecs;
+
+    hpicos = (unsigned long long)htotal*(unsigned long long)pixclock;
+    vpicos = (unsigned long long)vtotal*(unsigned long long)hpicos;
+    if (!vpicos)
+	return 0;
+
+    if (monspecs->hfmin == 0)
+	return 1;
+
+    if (hpicos*monspecs->hfmin > _1e12 || hpicos*monspecs->hfmax < _1e12 ||
+	vpicos*monspecs->vfmin > _1e12 || vpicos*monspecs->vfmax < _1e12)
+	return 0;
+#endif
+    return 1;
+}
+
+int fbmon_dpms(const struct fb_info *fb_info)
+{
+    return fb_info->monspecs.dpms;
+}
+
+
+    /*
+     *  Probe for all builtin frame buffer devices
+     */
+
+__initfunc(unsigned long probe_framebuffers(unsigned long kmem_start))
+{
+    int i;
+
+    for (i = 0; i < num_pref_init_funcs; i++)
+	    kmem_start = pref_init_funcs[i](kmem_start);
+
+    for (i = 0; i < NUM_FB_DRIVERS; i++)
+	    if (fb_drivers[i].init)
+		    kmem_start = fb_drivers[i].init(kmem_start);
+
+    return kmem_start;
+}
+
+
+    /*
+     *  Command line options
+     */
+
+__initfunc(void video_setup(char *options, int *ints))
+{
+    int i, j;
+
+    if (!options || !*options)
+	    return;
+
+    if (!strncmp(options, "map:", 4)) {
+	    options += 4;
+	    if (*options)
+		    for (i = 0, j = 0; i < MAX_NR_CONSOLES; i++) {
+			    if (!options[j])
+				    j = 0;
+			    con2fb_map[i] = (options[j++]-'0') % FB_MAX;
+		    }
+	    return;
+    }
+
+    if (num_pref_init_funcs == FB_MAX)
+	    return;
+
+    for (i = 0; i < NUM_FB_DRIVERS; i++) {
+	    j = strlen(fb_drivers[i].name);
+	    if (!strncmp(options, fb_drivers[i].name, j) &&
+		options[j] == ':') {
+		    if (!strcmp(options+j+1, "off"))
+			    fb_drivers[i].init = NULL;
+		    else {
+			    if (fb_drivers[i].init) {
+				    pref_init_funcs[num_pref_init_funcs++] =
+					    fb_drivers[i].init;
+				    fb_drivers[i].init = NULL;
+			    }
+			    if (fb_drivers[i].setup)
+				    fb_drivers[i].setup(options+j+1, ints);
+		    }
+		    return;
+	    }
+    }
+    /*
+     * If we get here no fb was specified and we default to pass the
+     * options to the first frame buffer that has an init and a setup
+     * fuction.
+     */
+    for (i = 0; i < NUM_FB_DRIVERS; i++) {
+	    if (fb_drivers[i].init && fb_drivers[i].setup) {
+		    pref_init_funcs[num_pref_init_funcs++] =
+			    fb_drivers[i].init;
+		    fb_drivers[i].init = NULL;
+
+		    fb_drivers[i].setup(options, ints);
+		    return;
+	    }
+    }
+}
+
+
+    /*
+     *  Visible symbols for modules
+     */
+
+EXPORT_SYMBOL(register_framebuffer);
+EXPORT_SYMBOL(unregister_framebuffer);
diff -u --recursive --new-file v2.1.106/linux/drivers/char/h8.c linux/drivers/char/h8.c
--- v2.1.106/linux/drivers/char/h8.c	Sat Sep  6 10:16:07 1997
+++ linux/drivers/char/h8.c	Wed Jun 24 14:30:09 1998
@@ -775,7 +775,7 @@
 
 	case H8_RD_SN:
 	case H8_RD_ENET_ADDR:
-	    printk("H8: Read ethernet addr - command done - address: %x - %x - %x - %x - %x - %x \n", 
+	    printk("H8: read Ethernet address: command done - address: %x - %x - %x - %x - %x - %x \n", 
 		   qp->rcvbuf[0], qp->rcvbuf[1], qp->rcvbuf[2],
 		   qp->rcvbuf[3], qp->rcvbuf[4], qp->rcvbuf[5]);
 	    QUEUE_ENTER(&h8_freeq, qp, link, h8_cmd_q_t *);
@@ -908,7 +908,7 @@
 }
 
 /*
- * Retrieve the current cpu temperature and case temperature.  Provides
+ * Retrieve the current CPU temperature and case temperature.  Provides
  * the feedback for the thermal control algorithm.  Synchcronized via 
  * sleep() for priority so that no other actions in the process will take
  * place before the data becomes available.
@@ -954,7 +954,7 @@
 /*
  * Assigns an upper limit to the value of the H8 thermal interrupt.
  * As an example setting a value of 115 F here will cause the 
- * interrupt to trigger when the cpu temperature reaches 115 F.
+ * interrupt to trigger when the CPU temperature reaches 115 F.
  */
 static void
 h8_set_upper_therm_thold(int thold)
@@ -1072,7 +1072,7 @@
 
 		/*
 		 * If an external DC supply is removed or added make 
-		 * appropriate cpu speed adjustments.
+		 * appropriate CPU speed adjustments.
 		 */
                 if (h8_event_mask & H8_MANAGE_BATTERY) {
                           h8_run_level_3_manage(H8_RUN); 
@@ -1106,7 +1106,7 @@
 		h8_set_cpu_speed(h8_udamp); 
                 h8_clear_event_mask(H8_MANAGE_UTHERM);
                 h8_set_event_mask(H8_MANAGE_LTHERM);
-                /* Check again in 30 seconds for cpu temperature */
+                /* Check again in 30 seconds for CPU temperature */
                 h8_start_monitor_timer(H8_TIMEOUT_INTERVAL); 
         } else if (h8_event_mask & H8_MANAGE_LTHERM) {
 		/* See how cool the system has become as a result
@@ -1116,7 +1116,7 @@
                 if (curr_temp[0] < (h8_uthermal_threshold - h8_uthermal_window))
 		{
 			/* System cooling has progressed to a point
-			   that the cpu may be speeded up. */
+			   that the CPU may be sped up. */
                         h8_set_upper_therm_thold(h8_uthermal_threshold);
                         h8_set_cpu_speed(h8_ldamp); /* adjustable */ 
                         if(h8_debug & 0x10)
@@ -1144,7 +1144,7 @@
 /*
  * global_rpb_counter is consumed by alpha_delay() in determining just
  * how much time to delay.  It is necessary that the number of microseconds
- * in DELAY(n) be kept consistent over a variety of cpu clock speeds.
+ * in DELAY(n) be kept consistent over a variety of CPU clock speeds.
  * To that end global_rpb_counter is here adjusted.
  */ 
         
@@ -1183,7 +1183,7 @@
 }
 
 /*
- * Gets value stored in rpb representing cpu clock speed and adjusts this
+ * Gets value stored in rpb representing CPU clock speed and adjusts this
  * value based on the current clock speed divisor.
  */
 u_long
diff -u --recursive --new-file v2.1.106/linux/drivers/char/h8.h linux/drivers/char/h8.h
--- v2.1.106/linux/drivers/char/h8.h	Sat Sep  6 10:16:07 1997
+++ linux/drivers/char/h8.h	Wed Jun 24 14:30:09 1998
@@ -183,7 +183,7 @@
 #define H8_SYSTEM_DELAY_TEST            0x100000
 #define H8_POWER_SWITCH_TEST            0x200000
 
-/* cpu speeds and clock divisor values */
+/* CPU speeds and clock divisor values */
 #define MHZ_14                           5
 #define MHZ_28                           4
 #define MHZ_57                           3
diff -u --recursive --new-file v2.1.106/linux/drivers/char/i2c.h linux/drivers/char/i2c.h
--- v2.1.106/linux/drivers/char/i2c.h	Wed Apr  8 19:36:26 1998
+++ linux/drivers/char/i2c.h	Wed Jun 24 14:30:09 1998
@@ -6,7 +6,7 @@
  * There are:
  *
  *     i2c          the basic control module        (like scsi_mod)
- *     bus driver   a driver with a i2c bus         (hostadapter driver)
+ *     bus driver   a driver with a i2c bus         (host adapter driver)
  *     chip driver  a driver for a chip connected
  *                  to a i2c bus                    (cdrom/hd driver)
  *
diff -u --recursive --new-file v2.1.106/linux/drivers/char/istallion.c linux/drivers/char/istallion.c
--- v2.1.106/linux/drivers/char/istallion.c	Sun Jun  7 11:16:30 1998
+++ linux/drivers/char/istallion.c	Mon Jun 22 23:00:51 1998
@@ -170,7 +170,7 @@
  */
 static char	*stli_drvtitle = "Stallion Intelligent Multiport Serial Driver";
 static char	*stli_drvname = "istallion";
-static char	*stli_drvversion = "5.4.5";
+static char	*stli_drvversion = "5.4.6";
 static char	*stli_serialname = "ttyE";
 static char	*stli_calloutname = "cue";
 
@@ -1425,12 +1425,12 @@
 			(tail - head - 1);
 		count = MIN(len, count);
 		EBRDDISABLE(brdp);
+		restore_flags(flags);
 
 		down(&stli_tmpwritesem);
 		copy_from_user(stli_tmpwritebuf, chbuf, count);
 		up(&stli_tmpwritesem);
 		chbuf = &stli_tmpwritebuf[0];
-		restore_flags(flags);
 	}
 
 /*
diff -u --recursive --new-file v2.1.106/linux/drivers/char/mem.c linux/drivers/char/mem.c
--- v2.1.106/linux/drivers/char/mem.c	Tue Jun 23 10:01:22 1998
+++ linux/drivers/char/mem.c	Wed Jun 24 14:44:00 1998
@@ -41,8 +41,8 @@
 #ifdef CONFIG_VIDEO_DEV
 extern int videodev_init(void);
 #endif
-#if defined(CONFIG_FB)
-extern void fbmem_init( void );
+#ifdef CONFIG_FB
+extern void fbmem_init(void);
 #endif
 
 static ssize_t do_write_mem(struct file * file, void *p, unsigned long realp,
@@ -63,7 +63,7 @@
 		written+=sz;
 	}
 #endif
-	if (copy_from_user(p, buf, count) < 0) 
+	if (copy_from_user(p, buf, count)) 
 		return -EFAULT;
 	written += count;
 	*ppos += written;
@@ -104,7 +104,7 @@
 		}
 	}
 #endif
-	if (copy_to_user(buf, __va(p), count) < 0)
+	if (copy_to_user(buf, __va(p), count))
 		return -EFAULT;
 	read += count;
 	*ppos += read;
@@ -552,7 +552,7 @@
 #endif
 #ifdef CONFIG_JOYSTICK
 	/*
-	 *	Some joysticks only appear when the soundcard they are
+	 *	Some joysticks only appear when the sound card they are
 	 *	connected to is configured. Keep the sound/joystick ordering.
 	 */
 	js_init();
diff -u --recursive --new-file v2.1.106/linux/drivers/char/msp3400.c linux/drivers/char/msp3400.c
--- v2.1.106/linux/drivers/char/msp3400.c	Tue Jun 23 10:01:22 1998
+++ linux/drivers/char/msp3400.c	Wed Jun 24 14:30:09 1998
@@ -5,17 +5,17 @@
  *
  * what works and what doesn't:
  *
- *  AM-Mono
+ *  AM mono
  *      probably doesn't (untested)
  *
- *  FM-Mono
- *      should work. The stereo modes are backward compatible to FM-mono,
- *      therefore FM-Mono should be allways available.
+ *  FM-mono
+ *      should work. FM stereo modes are backward-compatible to mono.
+ *      Therefore FM mono should always be available.
  *
- *  FM-Stereo (B/G, used in germany)
+ *  FM stereo (B/G, used in Germany)
  *      should work, with autodetect
  *
- *  FM-Stereo (satellite)
+ *  FM stereo (satellite)
  *      should work, no autodetect (i.e. default is mono, but you can
  *      switch to stereo -- untested)
  *
@@ -605,7 +605,7 @@
 			dprintk("msp3400: carrier2 val: %5d / %s\n", val,cd[this].name);
 		}
 
-		/* programm the msp3400 according to the results */
+		/* program the msp3400 according to the results */
 		switch (max1) {
 		case 0: /* 4.5 */
 		case 1: /* 5.5 */
diff -u --recursive --new-file v2.1.106/linux/drivers/char/random.c linux/drivers/char/random.c
--- v2.1.106/linux/drivers/char/random.c	Tue Jun 23 10:01:22 1998
+++ linux/drivers/char/random.c	Wed Jun 24 14:30:09 1998
@@ -1715,9 +1715,9 @@
 
 	/*
 	 *	As close as possible to RFC 793, which
-	 *	suggests using a 250kHz clock.
-	 *	Further reading shows this assumes 2Mb/s networks.
-	 *	For 10Mb/s ethernet, a 1MHz clock is appropriate.
+	 *	suggests using a 250 kHz clock.
+	 *	Further reading shows this assumes 2 Mb/s networks.
+	 *	For 10 Mb/s Ethernet, a 1 MHz clock is appropriate.
 	 *	That's funny, Linux has one built in!  Use it!
 	 *	(Networks are faster now - should this be increased?)
 	 */
diff -u --recursive --new-file v2.1.106/linux/drivers/char/rtc.c linux/drivers/char/rtc.c
--- v2.1.106/linux/drivers/char/rtc.c	Thu May  7 22:51:49 1998
+++ linux/drivers/char/rtc.c	Wed Jun 24 14:16:31 1998
@@ -134,11 +134,8 @@
 	rtc_irq_data |= (CMOS_READ(RTC_INTR_FLAGS) & 0xF0);
 	wake_up_interruptible(&rtc_wait);	
 
-	if (rtc_status & RTC_TIMER_ON) {
-		del_timer(&rtc_irq_timer);
-		rtc_irq_timer.expires = jiffies + HZ/rtc_freq + 2*HZ/100;
-		add_timer(&rtc_irq_timer);
-	}
+	if (rtc_status & RTC_TIMER_ON)
+		mod_timer(&rtc_irq_timer, jiffies + HZ/rtc_freq + 2*HZ/100);
 }
 
 /*
@@ -596,9 +593,7 @@
 	unsigned long flags;
 
 	printk(KERN_INFO "rtc: lost some interrupts at %ldHz.\n", rtc_freq);
-	del_timer(&rtc_irq_timer);
-	rtc_irq_timer.expires = jiffies + HZ/rtc_freq + 2*HZ/100;
-	add_timer(&rtc_irq_timer);
+	mod_timer(&rtc_irq_timer, jiffies + HZ/rtc_freq + 2*HZ/100);
 
 	save_flags(flags);
 	cli();
diff -u --recursive --new-file v2.1.106/linux/drivers/char/selection.c linux/drivers/char/selection.c
--- v2.1.106/linux/drivers/char/selection.c	Mon Feb 23 18:12:04 1998
+++ linux/drivers/char/selection.c	Wed Jun 24 14:44:00 1998
@@ -22,6 +22,7 @@
 
 #include <linux/vt_kern.h>
 #include <linux/consolemap.h>
+#include <linux/console_struct.h>
 #include <linux/selection.h>
 
 #ifndef MIN
@@ -120,15 +121,11 @@
 	int sel_mode, new_sel_start, new_sel_end, spc;
 	char *bp, *obp;
 	int i, ps, pe;
-	unsigned long num_lines, num_columns, size_row;
+	unsigned int currcons = fg_console;
 
 	do_unblank_screen();
 	poke_blanked_console();
 
-	num_lines = get_video_num_lines(fg_console);
-	num_columns = get_video_num_columns(fg_console);
-	size_row = get_video_size_row(fg_console);
-
 	{ unsigned short *args, xs, ys, xe, ye;
 
 	  args = (unsigned short *)(arg + 1);
@@ -150,12 +147,12 @@
 		  sel_mode = *args;
 	  }
 	  xs--; ys--; xe--; ye--;
-	  xs = limit(xs, num_columns - 1);
-	  ys = limit(ys, num_lines - 1);
-	  xe = limit(xe, num_columns - 1);
-	  ye = limit(ye, num_lines - 1);
-	  ps = ys * size_row + (xs << 1);
-	  pe = ye * size_row + (xe << 1);
+	  xs = limit(xs, video_num_columns - 1);
+	  ys = limit(ys, video_num_lines - 1);
+	  xe = limit(xe, video_num_columns - 1);
+	  ye = limit(ye, video_num_lines - 1);
+	  ps = ys * video_size_row + (xs << 1);
+	  pe = ye * video_size_row + (xe << 1);
 
 	  if (sel_mode == 4) {
 	      /* useful for screendump without selection highlights */
@@ -195,7 +192,7 @@
 				    (!spc && !inword(sel_pos(ps))))
 					break;
 				new_sel_start = ps;
-				if (!(ps % size_row))
+				if (!(ps % video_size_row))
 					break;
 			}
 			spc = isspace(sel_pos(pe));
@@ -205,14 +202,14 @@
 				    (!spc && !inword(sel_pos(pe))))
 					break;
 				new_sel_end = pe;
-				if (!((pe + 2) % size_row))
+				if (!((pe + 2) % video_size_row))
 					break;
 			}
 			break;
 		case 2:	/* line-by-line selection */
-			new_sel_start = ps - ps % size_row;
-			new_sel_end = pe + size_row
-				    - pe % size_row - 2;
+			new_sel_start = ps - ps % video_size_row;
+			new_sel_end = pe + video_size_row
+				    - pe % video_size_row - 2;
 			break;
 		case 3:
 			highlight_pointer(pe);
@@ -226,9 +223,11 @@
 
 	/* select to end of line if on trailing space */
 	if (new_sel_end > new_sel_start &&
-		!atedge(new_sel_end, size_row) && isspace(sel_pos(new_sel_end))) {
+		!atedge(new_sel_end, video_size_row) &&
+		isspace(sel_pos(new_sel_end))) {
 		for (pe = new_sel_end + 2; ; pe += 2)
-			if (!isspace(sel_pos(pe)) || atedge(pe, size_row))
+			if (!isspace(sel_pos(pe)) ||
+			    atedge(pe, video_size_row))
 				break;
 		if (isspace(sel_pos(pe)))
 			new_sel_end = pe;
@@ -273,7 +272,7 @@
 		*bp = sel_pos(i);
 		if (!isspace(*bp++))
 			obp = bp;
-		if (! ((i + 2) % size_row)) {
+		if (! ((i + 2) % video_size_row)) {
 			/* strip trailing blanks from line and add newline,
 			   unless non-space at end of line. */
 			if (obp != bp) {
diff -u --recursive --new-file v2.1.106/linux/drivers/char/stallion.c linux/drivers/char/stallion.c
--- v2.1.106/linux/drivers/char/stallion.c	Sun Jun  7 11:16:30 1998
+++ linux/drivers/char/stallion.c	Mon Jun 22 23:00:51 1998
@@ -142,7 +142,7 @@
  */
 static char	*stl_drvtitle = "Stallion Multiport Serial Driver";
 static char	*stl_drvname = "stallion";
-static char	*stl_drvversion = "5.4.5";
+static char	*stl_drvversion = "5.4.6";
 static char	*stl_serialname = "ttyE";
 static char	*stl_calloutname = "cue";
 
@@ -1082,7 +1082,6 @@
 {
 	stlport_t	*portp;
 	unsigned int	len, stlen;
-	unsigned long	flags;
 	unsigned char	*chbuf;
 	char		*head, *tail;
 
@@ -1114,12 +1113,9 @@
 			(tail - head - 1);
 		count = MIN(len, count);
 		
-		save_flags(flags);
-		cli();
 		down(&stl_tmpwritesem);
 		copy_from_user(stl_tmpwritebuf, chbuf, count);
 		up(&stl_tmpwritesem);
-		restore_flags(flags);
 		chbuf = &stl_tmpwritebuf[0];
 	}
 
diff -u --recursive --new-file v2.1.106/linux/drivers/char/tga.c linux/drivers/char/tga.c
--- v2.1.106/linux/drivers/char/tga.c	Fri Apr 10 13:03:48 1998
+++ linux/drivers/char/tga.c	Wed Dec 31 16:00:00 1969
@@ -1,1169 +0,0 @@
-/*
- *  linux/drivers/char/tga.c
- *
- *  Copyright (C) 1995  Jay Estabrook
- */
-
-/*
- *	tga.c
- *
- * This module exports the console io support for DEC's TGA
- */
-
-#include <linux/config.h>
-#include <linux/sched.h>
-#include <linux/timer.h>
-#include <linux/interrupt.h>
-#include <linux/tty.h>
-#include <linux/tty_flip.h>
-#include <linux/kernel.h>
-#include <linux/string.h>
-#include <linux/errno.h>
-#include <linux/kd.h>
-#include <linux/malloc.h>
-#include <linux/major.h>
-#include <linux/mm.h>
-#include <linux/ioport.h>
-#include <linux/pci.h>
-#include <linux/init.h>
-#include <linux/console.h>
-
-#include <asm/io.h>
-#include <asm/system.h>
-#include <asm/uaccess.h>
-#include <asm/bitops.h>
-
-#include <linux/kbd_kern.h>
-#include <linux/vt_kern.h>
-#include <linux/consolemap.h>
-#include <linux/selection.h>
-#include <linux/console_struct.h>
-
-extern struct console vt_console_driver;
-
-/* TGA hardware description (minimal) */
-/*
- * Offsets within Memory Space
- */
-#define	TGA_ROM_OFFSET			0x0000000
-#define	TGA_REGS_OFFSET			0x0100000
-#define	TGA_8PLANE_FB_OFFSET		0x0200000
-#define	TGA_24PLANE_FB_OFFSET		0x0804000
-#define	TGA_24PLUSZ_FB_OFFSET		0x1004000
-
-#define	TGA_PLANEMASK_REG		0x0028
-#define	TGA_MODE_REG			0x0030
-#define	TGA_RASTEROP_REG		0x0034
-#define	TGA_DEEP_REG			0x0050
-#define	TGA_PIXELMASK_REG		0x005c
-#define	TGA_CURSOR_BASE_REG		0x0060
-#define	TGA_HORIZ_REG			0x0064
-#define	TGA_VERT_REG			0x0068
-#define	TGA_BASE_ADDR_REG		0x006c
-#define	TGA_VALID_REG			0x0070
-#define	TGA_CURSOR_XY_REG		0x0074
-#define	TGA_INTR_STAT_REG		0x007c
-#define	TGA_RAMDAC_SETUP_REG		0x00c0
-#define	TGA_BLOCK_COLOR0_REG		0x0140
-#define	TGA_BLOCK_COLOR1_REG		0x0144
-#define	TGA_CLOCK_REG			0x01e8
-#define	TGA_RAMDAC_REG			0x01f0
-#define	TGA_CMD_STAT_REG		0x01f8
-
-/*
- * useful defines for managing the BT485 on the 8-plane TGA
- */
-#define	BT485_READ_BIT			0x01
-#define	BT485_WRITE_BIT			0x00
-
-#define	BT485_ADDR_PAL_WRITE		0x00
-#define	BT485_DATA_PAL			0x02
-#define	BT485_PIXEL_MASK		0x04
-#define	BT485_ADDR_PAL_READ		0x06
-#define	BT485_ADDR_CUR_WRITE		0x08
-#define	BT485_DATA_CUR			0x0a
-#define	BT485_CMD_0			0x0c
-#define	BT485_ADDR_CUR_READ		0x0e
-#define	BT485_CMD_1			0x10
-#define	BT485_CMD_2			0x12
-#define	BT485_STATUS			0x14
-#define	BT485_CMD_3			0x14
-#define	BT485_CUR_RAM			0x16
-#define	BT485_CUR_LOW_X			0x18
-#define	BT485_CUR_HIGH_X		0x1a
-#define	BT485_CUR_LOW_Y			0x1c
-#define	BT485_CUR_HIGH_Y		0x1e
-
-/*
- * useful defines for managing the BT463 on the 24-plane TGAs
- */
-#define	BT463_ADDR_LO		0x0
-#define	BT463_ADDR_HI		0x1
-#define	BT463_REG_ACC		0x2
-#define	BT463_PALETTE		0x3
-
-#define	BT463_CUR_CLR_0		0x0100
-#define	BT463_CUR_CLR_1		0x0101
-
-#define	BT463_CMD_REG_0		0x0201
-#define	BT463_CMD_REG_1		0x0202
-#define	BT463_CMD_REG_2		0x0203
-
-#define	BT463_READ_MASK_0	0x0205
-#define	BT463_READ_MASK_1	0x0206
-#define	BT463_READ_MASK_2	0x0207
-#define	BT463_READ_MASK_3	0x0208
-
-#define	BT463_BLINK_MASK_0	0x0209
-#define	BT463_BLINK_MASK_1	0x020a
-#define	BT463_BLINK_MASK_2	0x020b
-#define	BT463_BLINK_MASK_3	0x020c
-
-#define	BT463_WINDOW_TYPE_BASE	0x0300
-
-/*
- * built-in font management constants
- *
- * NOTE: the built-in font is 8x16, and the video resolution
- * is 640x480 @ 60Hz.
- * This means we could put 30 rows of text on the screen (480/16).
- * However, we wish to make then TGA look just like a VGA, as the
- * default, so, we pad the character to 8x18, and leave some scan
- * lines at the bottom unused.
- */
-#define TGA_F_WIDTH 8
-#define TGA_F_HEIGHT 16
-#define TGA_F_HEIGHT_PADDED 18
-
-int tga_type;
-unsigned long tga_mem_base;
-unsigned long tga_fb_base;
-unsigned long tga_regs_base;
-unsigned int tga_bpp, tga_fb_width, tga_fb_height, tga_fb_stride;
-
-static unsigned int fb_offset_presets[4] __initdata = {
-	TGA_8PLANE_FB_OFFSET,
-	TGA_24PLANE_FB_OFFSET,
-	0xffffffff,
-	TGA_24PLUSZ_FB_OFFSET
-};
-
-static unsigned int deep_presets[4] __initdata = {
-  0x00014000,
-  0x0001440d,
-  0xffffffff,
-  0x0001441d
-};
-
-static unsigned int rasterop_presets[4] __initdata = {
-  0x00000003,
-  0x00000303,
-  0xffffffff,
-  0x00000303
-};
-
-static unsigned int mode_presets[4] __initdata = {
-  0x00002000,
-  0x00002300,
-  0xffffffff,
-  0x00002300
-};
-
-static unsigned int base_addr_presets[4] __initdata = {
-  0x00000000,
-  0x00000001,
-  0xffffffff,
-  0x00000001
-};
-
-#define TGA_WRITE_REG(v,r) \
-	{ writel((v), tga_regs_base+(r)); mb(); }
-
-#define TGA_READ_REG(r) readl(tga_regs_base+(r))
-
-#define BT485_WRITE(v,r) \
-	  TGA_WRITE_REG((r),TGA_RAMDAC_SETUP_REG);		\
-	  TGA_WRITE_REG(((v)&0xff)|((r)<<8),TGA_RAMDAC_REG);
-
-#define BT463_LOAD_ADDR(a) \
-	TGA_WRITE_REG(BT463_ADDR_LO<<2, TGA_RAMDAC_SETUP_REG); \
-	TGA_WRITE_REG((BT463_ADDR_LO<<10)|((a)&0xff), TGA_RAMDAC_REG); \
-	TGA_WRITE_REG(BT463_ADDR_HI<<2, TGA_RAMDAC_SETUP_REG); \
-	TGA_WRITE_REG((BT463_ADDR_HI<<10)|(((a)>>8)&0xff), TGA_RAMDAC_REG);
-
-#define BT463_WRITE(m,a,v) \
-	BT463_LOAD_ADDR((a)); \
-	TGA_WRITE_REG(((m)<<2),TGA_RAMDAC_SETUP_REG); \
-	TGA_WRITE_REG(((m)<<10)|((v)&0xff),TGA_RAMDAC_REG);
-
-extern char tga_builtin_font[];
-
-void tga_init_video(void);
-void tga_clear_screen(void);
-
-void
-set_palette (void)
-{
-  int i, j;
-
-  if (console_blanked || vt_cons[fg_console]->vc_mode == KD_GRAPHICS)
-    return;
-
-
-  if (tga_type == 0) { /* 8-plane */
-    BT485_WRITE(0x00, BT485_ADDR_PAL_WRITE);
-    TGA_WRITE_REG(BT485_DATA_PAL, TGA_RAMDAC_SETUP_REG);
-
-    for (i = 0; i < 16; i++) {
-     j = color_table[i];
-     TGA_WRITE_REG(default_red[j]|(BT485_DATA_PAL<<8),TGA_RAMDAC_REG);
-     TGA_WRITE_REG(default_grn[j]|(BT485_DATA_PAL<<8),TGA_RAMDAC_REG);
-     TGA_WRITE_REG(default_blu[j]|(BT485_DATA_PAL<<8),TGA_RAMDAC_REG);
-   } 
-  } else {
-    BT463_LOAD_ADDR(0x0000);
-    TGA_WRITE_REG((BT463_PALETTE<<2), TGA_RAMDAC_REG);
-
-    for (i = 0; i < 16; i++) {
-      j = color_table[i];
-      TGA_WRITE_REG(default_red[j]|(BT463_PALETTE<<10), TGA_RAMDAC_REG);
-      TGA_WRITE_REG(default_grn[j]|(BT463_PALETTE<<10), TGA_RAMDAC_REG);
-      TGA_WRITE_REG(default_blu[j]|(BT463_PALETTE<<10), TGA_RAMDAC_REG);
-    }
-  }
-}
-
-void
-__set_origin(unsigned short offset)
-{
-  /*
-   * should not be called, but if so, do nothing...
-   */
-}
-
-/*
- * Hide the cursor from view, during blanking, usually...
- */
-void
-hide_cursor(void)
-{
-	unsigned long flags;
-	save_flags(flags); cli();
-
-	if (tga_type == 0) {
-	  BT485_WRITE(0x20, BT485_CMD_2);
-	} else {
-	  TGA_WRITE_REG(0x03, TGA_VALID_REG); /* SCANNING and BLANK */
-	}
-
-	restore_flags(flags);
-}
-
-void
-set_cursor(int currcons)
-{
-  unsigned int idx, xt, yt, row, col;
-  unsigned long flags;
-
-  if (currcons != fg_console || console_blanked || vcmode == KD_GRAPHICS)
-    return;
-
-  if (__real_origin != __origin)
-    __set_origin(__real_origin);
-
-  save_flags(flags); cli();
-
-  if (deccm) {
-    idx = (pos - video_mem_base) >> 1;
-    col = idx % 80;
-    row = (idx - col) / 80;
-
-    if (tga_type == 0) { /* 8-plane */
-
-      xt = col * TGA_F_WIDTH + 64;
-      yt = row * TGA_F_HEIGHT_PADDED + 64;
-
-      /* make sure it's enabled */
-      BT485_WRITE(0x22, BT485_CMD_2); /* WIN cursor type */
-
-      BT485_WRITE(xt, BT485_CUR_LOW_X);
-      BT485_WRITE((xt >> 8), BT485_CUR_HIGH_X);
-      BT485_WRITE(yt, BT485_CUR_LOW_Y);
-      BT485_WRITE((yt >> 8), BT485_CUR_HIGH_Y);
-
-    } else {
-
-      xt = col * TGA_F_WIDTH + 144;
-      yt = row * TGA_F_HEIGHT_PADDED + 35;
-
-      TGA_WRITE_REG(0x05, TGA_VALID_REG); /* SCANNING and CURSOR */
-      TGA_WRITE_REG(xt | (yt << 12), TGA_CURSOR_XY_REG);
-    }
-
-  } else
-    hide_cursor();
-  restore_flags(flags);
-}
-
-__initfunc(unsigned long
-con_type_init(unsigned long kmem_start, const char **display_desc))
-{
-        can_do_color = 1;
-
-        /*
-        * fake the screen memory with some CPU memory
-        */
-        video_mem_base = kmem_start;
-        kmem_start += video_screen_size;
-        video_mem_term = kmem_start;
-
-        video_type = VIDEO_TYPE_TGAC;
-
-        *display_desc = "TGA";
-
-	return kmem_start;
-}
-
-__initfunc(void
-con_type_init_finish(void))
-{
-}
-
-/*
- * NOTE: get_scrmem() and set_scrmem() are here only because
- * the VGA version of set_scrmem() has some direct VGA references.
- */
-void
-get_scrmem(int currcons)
-{
-	memcpyw((unsigned short *)vc_scrbuf[currcons],
-		(unsigned short *)origin, video_screen_size);
-	origin = video_mem_start = (unsigned long)vc_scrbuf[currcons];
-	scr_end = video_mem_end = video_mem_start + video_screen_size;
-	pos = origin + y*video_size_row + (x<<1);
-}
-
-void
-set_scrmem(int currcons, long offset)
-{
-	if (video_mem_term - video_mem_base < offset + video_screen_size)
-	  offset = 0;	/* strange ... */
-	memcpyw((unsigned short *)(video_mem_base + offset),
-		(unsigned short *) origin, video_screen_size);
-	video_mem_start = video_mem_base;
-	video_mem_end = video_mem_term;
-	origin = video_mem_base + offset;
-	scr_end = origin + video_screen_size;
-	pos = origin + y*video_size_row + (x<<1);
-}
-
-/*
- * PIO_FONT support.
- *
- * for now, we will use/allow *only* our built-in font...
- */
-int
-set_get_font(char * arg, int set, int ch512)
-{
-	return -EINVAL;
-}
-
-/*
- * Adjust the screen to fit a font of a certain height
- *
- * Returns < 0 for error, 0 if nothing changed, and the number
- * of lines on the adjusted console if changed.
- *
- * for now, we only support the built-in font...
- */
-int
-con_adjust_height(unsigned long fontheight)
-{
-	return -EINVAL;
-}
-
-/* NOTE:
- * this is here, and not in console.c, because the VGA version
- * tests the controller type to see if color can be done. We *KNOW*
- * that we can do color on the TGA... :-)
- *
- * FIXME? maybe the init codes for VGA and TGA could set
- * a flag for (in)ability to do colormap set/get???
- */
-
-int
-set_get_cmap(unsigned char * arg, int set) {
-	int i;
-
-	i = verify_area(set ? VERIFY_READ : VERIFY_WRITE, (void *)arg, 16*3);
-	if (i)
-		return i;
-
-	for (i=0; i<16; i++) {
-		if (set) {
-			get_user(default_red[i], arg++) ;
-			get_user(default_grn[i], arg++) ;
-			get_user(default_blu[i], arg++) ;
-		} else {
-			put_user (default_red[i], arg++) ;
-			put_user (default_grn[i], arg++) ;
-			put_user (default_blu[i], arg++) ;
-		}
-	}
-	if (set) {
-		for (i=0; i<MAX_NR_CONSOLES; i++)
-		    if (vc_cons_allocated(i)) {
-			int j, k ;
-			for (j=k=0; j<16; j++) {
-			    vc_cons[i].d->vc_palette[k++] = default_red[j];
-			    vc_cons[i].d->vc_palette[k++] = default_grn[j];
-			    vc_cons[i].d->vc_palette[k++] = default_blu[j];
-			}
-		    }
-		set_palette() ;
-	}
-
-	return 0;
-}
-
-/*
- * dummy routines for the VESA blanking code, which is VGA only,
- * so we don't have to carry that stuff around for the TGA...
- */
-void vesa_powerdown(void)
-{
-}
-void vesa_blank(void)
-{
-}
-void vesa_unblank(void)
-{
-}
-void set_vesa_blanking(const unsigned long arg)
-{
-}
-
-
-/*
- *	See if we have a TGA card.
- *	Just a placeholder at the moment, because of the strange
- *	way the TGA card is initialized. This has to be enabled when
- *	the kernel initializes PCI devices before the console.
- */
-__initfunc(int con_is_present(void))
-{
-#if 0
-	unsigned char pci_bus, pci_devfn;
-	int status;
-
-	status = pcibios_find_device (PCI_VENDOR_ID_DEC, PCI_DEVICE_ID_DEC_TGA,
-				      0, &pci_bus, &pci_devfn);
-	return (status == PCIBIOS_DEVICE_NOT_FOUND) ? 0 : 1;
-#endif
-	return 1;
-}
-
-/*
- * video init code, called from within the PCI bus probing code;
- * when TGA console is configured, at the end of the probing code,
- * we call here to look for a TGA device, and proceed...
- */
-__initfunc(void
-tga_console_init(void))
-{
-	struct pci_dev *dev;
-	
-	/*
-	 * first, find the TGA among the PCI devices...
-	 */
-	if (! (dev = pci_find_device(PCI_VENDOR_ID_DEC, PCI_DEVICE_ID_DEC_TGA, NULL))) {
-		/* PANIC!!! */
-		printk("tga_console_init: TGA not found!!! :-(\n");
-		return;
-	}
-
-	/*
-	 * read BASE_REG_0 for memory address
-	 */
-	tga_mem_base = dev->base_address[0] & PCI_BASE_ADDRESS_MEM_MASK;
-#ifdef DEBUG
-	printk("tga_console_init: mem_base 0x%lx\n", tga_mem_base);
-#endif /* DEBUG */
-
-	tga_type = (readl(tga_mem_base) >> 12) & 0x0f;
-	if (tga_type != 0 && tga_type != 1 && tga_type != 3) {
-	  printk("TGA type (0x%x) unrecognized!\n", tga_type);
-	  return;
-	}
-	tga_init_video();
-	tga_clear_screen();
-
-	/*
-	 * FINALLY, we can register TGA as console (whew!)
-	 */
-#ifdef CONFIG_VT_CONSOLE
-	register_console(&vt_console_driver);
-#endif
-}
-
-unsigned char PLLbits[7] __initdata = { 0x80, 0x04, 0x00, 0x24, 0x44, 0x80, 0xb8 };
-
-const unsigned long bt485_cursor_source[64] __initdata = {
-  0x00000000000000ff,0x00000000000000ff,0x00000000000000ff,0x00000000000000ff,
-  0x00000000000000ff,0x00000000000000ff,0x00000000000000ff,0x00000000000000ff,
-  0x00000000000000ff,0x00000000000000ff,0x00000000000000ff,0x00000000000000ff,
-  0x00000000000000ff,0x00000000000000ff,0x00000000000000ff,0x00000000000000ff,
-  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-};
-
-const unsigned int bt463_cursor_source[256] __initdata = {
-  0xffff0000, 0x00000000, 0x00000000, 0x00000000,
-  0xffff0000, 0x00000000, 0x00000000, 0x00000000,
-  0xffff0000, 0x00000000, 0x00000000, 0x00000000,
-  0xffff0000, 0x00000000, 0x00000000, 0x00000000,
-  0xffff0000, 0x00000000, 0x00000000, 0x00000000,
-  0xffff0000, 0x00000000, 0x00000000, 0x00000000,
-  0xffff0000, 0x00000000, 0x00000000, 0x00000000,
-  0xffff0000, 0x00000000, 0x00000000, 0x00000000,
-  0xffff0000, 0x00000000, 0x00000000, 0x00000000,
-  0xffff0000, 0x00000000, 0x00000000, 0x00000000,
-  0xffff0000, 0x00000000, 0x00000000, 0x00000000,
-  0xffff0000, 0x00000000, 0x00000000, 0x00000000,
-  0xffff0000, 0x00000000, 0x00000000, 0x00000000,
-  0xffff0000, 0x00000000, 0x00000000, 0x00000000,
-  0xffff0000, 0x00000000, 0x00000000, 0x00000000,
-  0xffff0000, 0x00000000, 0x00000000, 0x00000000,
-  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-};
-
-__initfunc(void
-tga_init_video(void))
-{
-	int i, j, temp;
-	unsigned char *cbp;
-
-	tga_regs_base = (tga_mem_base + TGA_REGS_OFFSET);
-	tga_fb_base = (tga_mem_base + fb_offset_presets[tga_type]);
-
-	/* first, disable video timing */
-	TGA_WRITE_REG(0x03, TGA_VALID_REG); /* SCANNING and BLANK */
-
-	/* write the DEEP register */
-	while (TGA_READ_REG(TGA_CMD_STAT_REG) & 1) /* wait for not busy */
-	  continue;
-
-	mb();
-	TGA_WRITE_REG(deep_presets[tga_type], TGA_DEEP_REG);
-	while (TGA_READ_REG(TGA_CMD_STAT_REG) & 1) /* wait for not busy */
-	  continue;
-	mb();
-
-	/* write some more registers */
-	TGA_WRITE_REG(rasterop_presets[tga_type], TGA_RASTEROP_REG);
-	TGA_WRITE_REG(mode_presets[tga_type], TGA_MODE_REG);
-	TGA_WRITE_REG(base_addr_presets[tga_type], TGA_BASE_ADDR_REG);
-
-	/* write the PLL for 640x480 @ 60Hz */
-	for (i = 0; i <= 6; i++) {
-	  for (j = 0; j <= 7; j++) {
-	    temp = (PLLbits[i] >> (7-j)) & 1;
-	    if (i == 6 && j == 7)
-	      temp |= 2;
-	    TGA_WRITE_REG(temp, TGA_CLOCK_REG);
-	  }
-	}
-
-	/* write some more registers */
-	TGA_WRITE_REG(0xffffffff, TGA_PLANEMASK_REG);
-	TGA_WRITE_REG(0xffffffff, TGA_PIXELMASK_REG);
-	TGA_WRITE_REG(0x12345678, TGA_BLOCK_COLOR0_REG);
-	TGA_WRITE_REG(0x12345678, TGA_BLOCK_COLOR1_REG);
-
-	/* init video timing regs for 640x480 @ 60 Hz */
-	TGA_WRITE_REG(0x018608a0, TGA_HORIZ_REG);
-	TGA_WRITE_REG(0x084251e0, TGA_VERT_REG);
-
-	if (tga_type == 0) { /* 8-plane */
-
-	  tga_bpp = 1;
-
-	  /* init BT485 RAMDAC registers */
-	  BT485_WRITE(0xa2, BT485_CMD_0);
-	  BT485_WRITE(0x01, BT485_ADDR_PAL_WRITE);
-	  BT485_WRITE(0x14, BT485_CMD_3); /* cursor 64x64 */
-	  BT485_WRITE(0x40, BT485_CMD_1);
-	  BT485_WRITE(0x22, BT485_CMD_2); /* WIN cursor type */
-	  BT485_WRITE(0xff, BT485_PIXEL_MASK);
-
-	  /* fill palette registers */
-	  BT485_WRITE(0x00, BT485_ADDR_PAL_WRITE);
-	  TGA_WRITE_REG(BT485_DATA_PAL, TGA_RAMDAC_SETUP_REG);
-
-	  for (i = 0; i < 16; i++) {
-	    j = color_table[i];
-	    TGA_WRITE_REG(default_red[j]|(BT485_DATA_PAL<<8),
-			  TGA_RAMDAC_REG);
-	    TGA_WRITE_REG(default_grn[j]|(BT485_DATA_PAL<<8),
-			  TGA_RAMDAC_REG);
-	    TGA_WRITE_REG(default_blu[j]|(BT485_DATA_PAL<<8),
-			  TGA_RAMDAC_REG);
-	  }
-	  for (i = 0; i < 240*3; i += 4) {
-	    TGA_WRITE_REG(0x55|(BT485_DATA_PAL<<8), TGA_RAMDAC_REG);
-	    TGA_WRITE_REG(0x00|(BT485_DATA_PAL<<8), TGA_RAMDAC_REG);
-	    TGA_WRITE_REG(0x00|(BT485_DATA_PAL<<8), TGA_RAMDAC_REG);
-	    TGA_WRITE_REG(0x00|(BT485_DATA_PAL<<8), TGA_RAMDAC_REG);
-	  }	  
-
-	  /* initialize RAMDAC cursor colors */
-	  BT485_WRITE(0, BT485_ADDR_CUR_WRITE);
-
-	  BT485_WRITE(0xaa, BT485_DATA_CUR); /* overscan WHITE */
-	  BT485_WRITE(0xaa, BT485_DATA_CUR); /* overscan WHITE */
-	  BT485_WRITE(0xaa, BT485_DATA_CUR); /* overscan WHITE */
-
-	  BT485_WRITE(0x00, BT485_DATA_CUR); /* color 1 BLACK */
-	  BT485_WRITE(0x00, BT485_DATA_CUR); /* color 1 BLACK */
-	  BT485_WRITE(0x00, BT485_DATA_CUR); /* color 1 BLACK */
-
-	  BT485_WRITE(0x00, BT485_DATA_CUR); /* color 2 BLACK */
-	  BT485_WRITE(0x00, BT485_DATA_CUR); /* color 2 BLACK */
-	  BT485_WRITE(0x00, BT485_DATA_CUR); /* color 2 BLACK */
-
-	  BT485_WRITE(0x00, BT485_DATA_CUR); /* color 3 BLACK */
-	  BT485_WRITE(0x00, BT485_DATA_CUR); /* color 3 BLACK */
-	  BT485_WRITE(0x00, BT485_DATA_CUR); /* color 3 BLACK */
-
-	  /* initialize RAMDAC cursor RAM */
-	  BT485_WRITE(0x00, BT485_ADDR_PAL_WRITE);
-	  cbp = (unsigned char *)bt485_cursor_source;
-	  for (i = 0; i < 512; i++) {
-	    BT485_WRITE(*cbp++, BT485_CUR_RAM);
-	  }
-	  for (i = 0; i < 512; i++) {
-	    BT485_WRITE(0xff, BT485_CUR_RAM);
-	  }
-
-	} else { /* 24-plane or 24plusZ */
-
-	  tga_bpp = 4;
-
-	  TGA_WRITE_REG(0x01, TGA_VALID_REG); /* SCANNING */
-
-	  /*
-	   * init some registers
-	   */
-	  BT463_WRITE(BT463_REG_ACC, BT463_CMD_REG_0, 0x40);
-	  BT463_WRITE(BT463_REG_ACC, BT463_CMD_REG_1, 0x08);
-	  BT463_WRITE(BT463_REG_ACC, BT463_CMD_REG_2, 0x40);
-
-	  BT463_WRITE(BT463_REG_ACC, BT463_READ_MASK_0, 0xff);
-	  BT463_WRITE(BT463_REG_ACC, BT463_READ_MASK_1, 0xff);
-	  BT463_WRITE(BT463_REG_ACC, BT463_READ_MASK_2, 0xff);
-	  BT463_WRITE(BT463_REG_ACC, BT463_READ_MASK_3, 0x0f);
-
-	  BT463_WRITE(BT463_REG_ACC, BT463_BLINK_MASK_0, 0x00);
-	  BT463_WRITE(BT463_REG_ACC, BT463_BLINK_MASK_1, 0x00);
-	  BT463_WRITE(BT463_REG_ACC, BT463_BLINK_MASK_2, 0x00);
-	  BT463_WRITE(BT463_REG_ACC, BT463_BLINK_MASK_3, 0x00);
-
-	  /*
-	   * fill the palette
-	   */
-	  BT463_LOAD_ADDR(0x0000);
-	  TGA_WRITE_REG((BT463_PALETTE<<2), TGA_RAMDAC_REG);
-
-	  for (i = 0; i < 16; i++) {
-	    j = color_table[i];
-	    TGA_WRITE_REG(default_red[j]|(BT463_PALETTE<<10),
-			  TGA_RAMDAC_REG);
-	    TGA_WRITE_REG(default_grn[j]|(BT463_PALETTE<<10),
-			  TGA_RAMDAC_REG);
-	    TGA_WRITE_REG(default_blu[j]|(BT463_PALETTE<<10),
-			  TGA_RAMDAC_REG);
-	  }
-	  for (i = 0; i < 512*3; i += 4) {
-	    TGA_WRITE_REG(0x55|(BT463_PALETTE<<10), TGA_RAMDAC_REG);
-	    TGA_WRITE_REG(0x00|(BT463_PALETTE<<10), TGA_RAMDAC_REG);
-	    TGA_WRITE_REG(0x00|(BT463_PALETTE<<10), TGA_RAMDAC_REG);
-	    TGA_WRITE_REG(0x00|(BT463_PALETTE<<10), TGA_RAMDAC_REG);
-	  }	  
-
-	  /*
-	   * fill window type table after start of vertical retrace
-	   */
-	  while (!(TGA_READ_REG(TGA_INTR_STAT_REG) & 0x01))
-	    continue;
-	  TGA_WRITE_REG(0x01, TGA_INTR_STAT_REG);
-	  mb();
-	  while (!(TGA_READ_REG(TGA_INTR_STAT_REG) & 0x01))
-	    continue;
-	  TGA_WRITE_REG(0x01, TGA_INTR_STAT_REG);
-
-	  BT463_LOAD_ADDR(BT463_WINDOW_TYPE_BASE);
-	  TGA_WRITE_REG((BT463_REG_ACC<<2), TGA_RAMDAC_SETUP_REG);
-	  
-	  for (i = 0; i < 16; i++) {
-	    TGA_WRITE_REG(0x00|(BT463_REG_ACC<<10), TGA_RAMDAC_REG);
-	    TGA_WRITE_REG(0x01|(BT463_REG_ACC<<10), TGA_RAMDAC_REG);
-	    TGA_WRITE_REG(0x80|(BT463_REG_ACC<<10), TGA_RAMDAC_REG);
-	  }
-
-	  /*
-	   * init cursor colors
-	   */
-	  BT463_LOAD_ADDR(BT463_CUR_CLR_0);
-
-	  TGA_WRITE_REG(0x00|(BT463_REG_ACC<<10), TGA_RAMDAC_REG); /* background */
-	  TGA_WRITE_REG(0x00|(BT463_REG_ACC<<10), TGA_RAMDAC_REG); /* background */
-	  TGA_WRITE_REG(0x00|(BT463_REG_ACC<<10), TGA_RAMDAC_REG); /* background */
-
-	  TGA_WRITE_REG(0xff|(BT463_REG_ACC<<10), TGA_RAMDAC_REG); /* foreground */
-	  TGA_WRITE_REG(0xff|(BT463_REG_ACC<<10), TGA_RAMDAC_REG); /* foreground */
-	  TGA_WRITE_REG(0xff|(BT463_REG_ACC<<10), TGA_RAMDAC_REG); /* foreground */
-
-	  TGA_WRITE_REG(0x00|(BT463_REG_ACC<<10), TGA_RAMDAC_REG);
-	  TGA_WRITE_REG(0x00|(BT463_REG_ACC<<10), TGA_RAMDAC_REG);
-	  TGA_WRITE_REG(0x00|(BT463_REG_ACC<<10), TGA_RAMDAC_REG);
-
-	  TGA_WRITE_REG(0x00|(BT463_REG_ACC<<10), TGA_RAMDAC_REG);
-	  TGA_WRITE_REG(0x00|(BT463_REG_ACC<<10), TGA_RAMDAC_REG);
-	  TGA_WRITE_REG(0x00|(BT463_REG_ACC<<10), TGA_RAMDAC_REG);
-
-	  /*
-	   * finally, init the cursor shape
-	   */
-	  temp = tga_fb_base - 1024; /* this assumes video starts at base
-				       and base is beyond memory start*/
-
-	  for (i = 0; i < 256; i++) {
-	    writel(bt463_cursor_source[i], temp + i*4);
-	  }
-	  TGA_WRITE_REG(temp & 0x000fffff, TGA_CURSOR_BASE_REG);
-	}
-
-	/* finally, enable video scan & cursor
-	   (and pray for the monitor... :-) */
-	TGA_WRITE_REG(0x05, TGA_VALID_REG); /* SCANNING and CURSOR */
-
-	/* oh, and set the globals describing the resolution... :-) */
-	tga_fb_width = 640 * tga_bpp;
-	tga_fb_height = 480;
-	tga_fb_stride = tga_fb_width / sizeof(int);
-}
-
-__initfunc(void
-tga_clear_screen(void))
-{
-    register int i, j;
-    register unsigned int *dst;
-
-    dst = (unsigned int *) ((unsigned long)tga_fb_base);
-    for (i = 0; i < tga_fb_height; i++, dst += tga_fb_stride) {
-      for (j = 0; j < tga_fb_stride; j++) {
-	writel(0, (dst+j));
-      }
-    }
-
-    /* also clear out the "shadow" screen memory */
-    memset((char *)video_mem_base, 0, (video_mem_term - video_mem_base));
-}
-
-/*
- * tga_blitc
- *
- * Displays an ASCII character at a specified character cell
- *  position.
- *
- * Called from scr_writew() when the destination is
- *  the "shadow" screen
- */
-static unsigned int
-fontmask_bits[16] = {
-    0x00000000,
-    0xff000000,
-    0x00ff0000,
-    0xffff0000,
-    0x0000ff00,
-    0xff00ff00,
-    0x00ffff00,
-    0xffffff00,
-    0x000000ff,
-    0xff0000ff,
-    0x00ff00ff,
-    0xffff00ff,
-    0x0000ffff,
-    0xff00ffff,
-    0x00ffffff,
-    0xffffffff
-};
-
-int
-tga_blitc(unsigned int charattr, unsigned long addr)
-{
-  int row, col, temp, c, attrib;
-  register unsigned int fgmask, bgmask, data, rowbits;
-  register unsigned int *dst;
-  register unsigned char *font_row;
-  register int i, j, stride;
-
-  c = charattr & 0x00ff;
-  attrib = (charattr >> 8) & 0x00ff;
-
-  /*
-   * extract foreground and background indices
-   * NOTE: we always treat blink/underline bits as color for now...
-   */
-  fgmask = attrib & 0x0f;
-  bgmask = (attrib >> 4) & 0x0f;
-
-  i = (c & 0xff) << 4; /* NOTE: assumption of 16 bytes per character bitmap */
-
-  /*
-   * calculate (row,col) from addr and video_mem_base
-   */
-  temp = (addr - video_mem_base) >> 1;
-  col = temp % 80;
-  row = (temp - col) / 80;
-
-  /*
-   * calculate destination address
-   */
-  dst = (unsigned int *) ( (unsigned long)tga_fb_base
-                           + ( row * tga_fb_width * TGA_F_HEIGHT_PADDED )
-                           + ( col * TGA_F_WIDTH * tga_bpp) );
-
-  font_row = (unsigned char *)&tga_builtin_font[i];
-  stride = tga_fb_stride;
-
-  if (tga_type == 0) { /* 8-plane */
-
-    fgmask = fgmask << 8 | fgmask;
-    fgmask |= fgmask << 16;
-    bgmask = bgmask << 8 | bgmask;
-    bgmask |= bgmask << 16;
-
-    for ( j = 0; j < TGA_F_HEIGHT_PADDED; j++ ) {
-      if (j < TGA_F_HEIGHT) {
-	rowbits = font_row[j];
-      } else {
-	/* dup the last n rows only if char > 0x7f */
-	if (c & 0x80)
-	  rowbits = font_row[j-(TGA_F_HEIGHT_PADDED-TGA_F_HEIGHT)];
-	else
-	  rowbits = 0;
-      }
-      data = fontmask_bits[(rowbits>>4)&0xf];
-      data = (data & fgmask) | (~data & bgmask);
-      writel(data, dst);
-      data = fontmask_bits[rowbits&0xf];
-      data = (data & fgmask) | (~data & bgmask);
-      writel(data, (dst+1));
-      dst += stride;
-    }
-  } else { /* 24-plane */
-
-    fgmask = (default_red[fgmask] << 16) |
-             (default_grn[fgmask] <<  8) |
-             (default_blu[fgmask] <<  0);
-    bgmask = (default_red[bgmask] << 16) |
-             (default_grn[bgmask] <<  8) |
-             (default_blu[bgmask] <<  0);
-
-    for ( i = 0; i < TGA_F_HEIGHT_PADDED; i++ ) {
-      if (i < TGA_F_HEIGHT) {
-	rowbits = font_row[i];
-      } else {
-	/* dup the last n rows only if char > 0x7f */
-	if (c & 0x80)
-	  rowbits = font_row[i-(TGA_F_HEIGHT_PADDED-TGA_F_HEIGHT)];
-	else
-	  rowbits = 0;
-      }
-      data = 1 << (TGA_F_WIDTH - 1);
-      for (j = 0; j < TGA_F_WIDTH; j++, data >>= 1) {
-	if (rowbits & data)
-	  writel(fgmask, (dst+j));
-	else
-	  writel(bgmask, (dst+j));
-      }
-      dst += stride;
-    }
-  }
-  return (0);
-}
-
-/*
- * font table of displayable characters.
- */
-char  tga_builtin_font[]={
-0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x7e, 0x81, 0xa5, 0x81, 0x81, 0xbd, 0x99, 0x81, 0x81, 0x7e, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x7e, 0xff, 0xdb, 0xff, 0xff, 0xc3, 0xe7, 0xff, 0xff, 0x7e, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x00, 0x6c, 0xfe, 0xfe, 0xfe, 0xfe, 0x7c, 0x38, 0x10, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x7c, 0xfe, 0x7c, 0x38, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x18, 0x3c, 0x3c, 0xe7, 0xe7, 0xe7, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x18, 0x3c, 0x7e, 0xff, 0xff, 0x7e, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x3c, 0x3c, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe7, 0xc3, 0xc3, 0xe7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x66, 0x42, 0x42, 0x66, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00,
-0xff, 0xff, 0xff, 0xff, 0xff, 0xc3, 0x99, 0xbd, 0xbd, 0x99, 0xc3, 0xff, 0xff, 0xff, 0xff, 0xff,
-0x00, 0x00, 0x1e, 0x0e, 0x1a, 0x32, 0x78, 0xcc, 0xcc, 0xcc, 0xcc, 0x78, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x3c, 0x66, 0x66, 0x66, 0x66, 0x3c, 0x18, 0x7e, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x3f, 0x33, 0x3f, 0x30, 0x30, 0x30, 0x30, 0x70, 0xf0, 0xe0, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x7f, 0x63, 0x7f, 0x63, 0x63, 0x63, 0x63, 0x67, 0xe7, 0xe6, 0xc0, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x18, 0x18, 0xdb, 0x3c, 0xe7, 0x3c, 0xdb, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x80, 0xc0, 0xe0, 0xf0, 0xf8, 0xfe, 0xf8, 0xf0, 0xe0, 0xc0, 0x80, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x02, 0x06, 0x0e, 0x1e, 0x3e, 0xfe, 0x3e, 0x1e, 0x0e, 0x06, 0x02, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x18, 0x3c, 0x7e, 0x18, 0x18, 0x18, 0x7e, 0x3c, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x00, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x7f, 0xdb, 0xdb, 0xdb, 0x7b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x7c, 0xc6, 0x60, 0x38, 0x6c, 0xc6, 0xc6, 0x6c, 0x38, 0x0c, 0xc6, 0x7c, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xfe, 0xfe, 0xfe, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x18, 0x3c, 0x7e, 0x18, 0x18, 0x18, 0x7e, 0x3c, 0x18, 0x7e, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x18, 0x3c, 0x7e, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x7e, 0x3c, 0x18, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x0c, 0xfe, 0x0c, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x60, 0xfe, 0x60, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xc0, 0xc0, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x66, 0xff, 0x66, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x38, 0x7c, 0x7c, 0xfe, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x00, 0xfe, 0xfe, 0x7c, 0x7c, 0x38, 0x38, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x18, 0x3c, 0x3c, 0x3c, 0x18, 0x18, 0x18, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x66, 0x66, 0x66, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x6c, 0x6c, 0xfe, 0x6c, 0x6c, 0x6c, 0xfe, 0x6c, 0x6c, 0x00, 0x00, 0x00, 0x00,
-0x18, 0x18, 0x7c, 0xc6, 0xc2, 0xc0, 0x7c, 0x06, 0x06, 0x86, 0xc6, 0x7c, 0x18, 0x18, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x00, 0xc2, 0xc6, 0x0c, 0x18, 0x30, 0x60, 0xc6, 0x86, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x38, 0x6c, 0x6c, 0x38, 0x76, 0xdc, 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x30, 0x30, 0x30, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x0c, 0x18, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x18, 0x0c, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x30, 0x18, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x18, 0x30, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x3c, 0xff, 0x3c, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x7e, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x30, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x00, 0x02, 0x06, 0x0c, 0x18, 0x30, 0x60, 0xc0, 0x80, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xce, 0xde, 0xf6, 0xe6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x18, 0x38, 0x78, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x7e, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x7c, 0xc6, 0x06, 0x0c, 0x18, 0x30, 0x60, 0xc0, 0xc6, 0xfe, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x7c, 0xc6, 0x06, 0x06, 0x3c, 0x06, 0x06, 0x06, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x0c, 0x1c, 0x3c, 0x6c, 0xcc, 0xfe, 0x0c, 0x0c, 0x0c, 0x1e, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0xfe, 0xc0, 0xc0, 0xc0, 0xfc, 0x06, 0x06, 0x06, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x38, 0x60, 0xc0, 0xc0, 0xfc, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0xfe, 0xc6, 0x06, 0x06, 0x0c, 0x18, 0x30, 0x30, 0x30, 0x30, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0x7e, 0x06, 0x06, 0x06, 0x0c, 0x78, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x18, 0x18, 0x30, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x06, 0x0c, 0x18, 0x30, 0x60, 0x30, 0x18, 0x0c, 0x06, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x60, 0x30, 0x18, 0x0c, 0x06, 0x0c, 0x18, 0x30, 0x60, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x7c, 0xc6, 0xc6, 0x0c, 0x18, 0x18, 0x18, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xde, 0xde, 0xde, 0xdc, 0xc0, 0x7c, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x10, 0x38, 0x6c, 0xc6, 0xc6, 0xfe, 0xc6, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0xfc, 0x66, 0x66, 0x66, 0x7c, 0x66, 0x66, 0x66, 0x66, 0xfc, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x3c, 0x66, 0xc2, 0xc0, 0xc0, 0xc0, 0xc0, 0xc2, 0x66, 0x3c, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0xf8, 0x6c, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x6c, 0xf8, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0xfe, 0x66, 0x62, 0x68, 0x78, 0x68, 0x60, 0x62, 0x66, 0xfe, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0xfe, 0x66, 0x62, 0x68, 0x78, 0x68, 0x60, 0x60, 0x60, 0xf0, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x3c, 0x66, 0xc2, 0xc0, 0xc0, 0xde, 0xc6, 0xc6, 0x66, 0x3a, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xfe, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x3c, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x1e, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0xcc, 0xcc, 0xcc, 0x78, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0xe6, 0x66, 0x66, 0x6c, 0x78, 0x78, 0x6c, 0x66, 0x66, 0xe6, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0xf0, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x62, 0x66, 0xfe, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0xc3, 0xe7, 0xff, 0xff, 0xdb, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0xc6, 0xe6, 0xf6, 0xfe, 0xde, 0xce, 0xc6, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0xfc, 0x66, 0x66, 0x66, 0x7c, 0x60, 0x60, 0x60, 0x60, 0xf0, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xd6, 0xde, 0x7c, 0x0c, 0x0e, 0x00, 0x00,
-0x00, 0x00, 0xfc, 0x66, 0x66, 0x66, 0x7c, 0x6c, 0x66, 0x66, 0x66, 0xe6, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x7c, 0xc6, 0xc6, 0x60, 0x38, 0x0c, 0x06, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0xff, 0xdb, 0x99, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0x66, 0x3c, 0x18, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xdb, 0xdb, 0xff, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0xc3, 0xc3, 0x66, 0x3c, 0x18, 0x18, 0x3c, 0x66, 0xc3, 0xc3, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0xc3, 0xc3, 0xc3, 0x66, 0x3c, 0x18, 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0xff, 0xc3, 0x86, 0x0c, 0x18, 0x30, 0x60, 0xc1, 0xc3, 0xff, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x3c, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x3c, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x80, 0xc0, 0xe0, 0x70, 0x38, 0x1c, 0x0e, 0x06, 0x02, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x3c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x3c, 0x00, 0x00, 0x00, 0x00,
-0x10, 0x38, 0x6c, 0xc6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-0x30, 0x30, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x0c, 0x7c, 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0xe0, 0x60, 0x60, 0x78, 0x6c, 0x66, 0x66, 0x66, 0x66, 0x7c, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, 0xc0, 0xc0, 0xc0, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x1c, 0x0c, 0x0c, 0x3c, 0x6c, 0xcc, 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, 0xfe, 0xc0, 0xc0, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x38, 0x6c, 0x64, 0x60, 0xf0, 0x60, 0x60, 0x60, 0x60, 0xf0, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0x7c, 0x0c, 0xcc, 0x78, 0x00,
-0x00, 0x00, 0xe0, 0x60, 0x60, 0x6c, 0x76, 0x66, 0x66, 0x66, 0x66, 0xe6, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x18, 0x18, 0x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x06, 0x06, 0x00, 0x0e, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x66, 0x66, 0x3c, 0x00,
-0x00, 0x00, 0xe0, 0x60, 0x60, 0x66, 0x6c, 0x78, 0x78, 0x6c, 0x66, 0xe6, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x00, 0x00, 0xe6, 0xff, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x00, 0x00, 0xdc, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x00, 0x00, 0xdc, 0x66, 0x66, 0x66, 0x66, 0x66, 0x7c, 0x60, 0x60, 0xf0, 0x00,
-0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0x7c, 0x0c, 0x0c, 0x1e, 0x00,
-0x00, 0x00, 0x00, 0x00, 0x00, 0xdc, 0x76, 0x66, 0x60, 0x60, 0x60, 0xf0, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, 0x60, 0x38, 0x0c, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x10, 0x30, 0x30, 0xfc, 0x30, 0x30, 0x30, 0x30, 0x36, 0x1c, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x00, 0x00, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x00, 0x00, 0xc3, 0xc3, 0xc3, 0xc3, 0x66, 0x3c, 0x18, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x00, 0x00, 0xc3, 0xc3, 0xc3, 0xdb, 0xdb, 0xff, 0x66, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x00, 0x00, 0xc3, 0x66, 0x3c, 0x18, 0x3c, 0x66, 0xc3, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7e, 0x06, 0x0c, 0xf8, 0x00,
-0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xcc, 0x18, 0x30, 0x60, 0xc6, 0xfe, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x0e, 0x18, 0x18, 0x18, 0x70, 0x18, 0x18, 0x18, 0x18, 0x0e, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x70, 0x18, 0x18, 0x18, 0x0e, 0x18, 0x18, 0x18, 0x18, 0x70, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x76, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x6c, 0xc6, 0xc6, 0xc6, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x3c, 0x66, 0xc2, 0xc0, 0xc0, 0xc0, 0xc2, 0x66, 0x3c, 0x0c, 0x06, 0x7c, 0x00, 0x00,
-0x00, 0x00, 0xcc, 0x00, 0x00, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x0c, 0x18, 0x30, 0x00, 0x7c, 0xc6, 0xfe, 0xc0, 0xc0, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x10, 0x38, 0x6c, 0x00, 0x78, 0x0c, 0x7c, 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0xcc, 0x00, 0x00, 0x78, 0x0c, 0x7c, 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x60, 0x30, 0x18, 0x00, 0x78, 0x0c, 0x7c, 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x38, 0x6c, 0x38, 0x00, 0x78, 0x0c, 0x7c, 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x00, 0x3c, 0x66, 0x60, 0x60, 0x66, 0x3c, 0x0c, 0x06, 0x3c, 0x00, 0x00, 0x00,
-0x00, 0x10, 0x38, 0x6c, 0x00, 0x7c, 0xc6, 0xfe, 0xc0, 0xc0, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0xc6, 0x00, 0x00, 0x7c, 0xc6, 0xfe, 0xc0, 0xc0, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x60, 0x30, 0x18, 0x00, 0x7c, 0xc6, 0xfe, 0xc0, 0xc0, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x66, 0x00, 0x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x18, 0x3c, 0x66, 0x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x60, 0x30, 0x18, 0x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00,
-0x00, 0xc6, 0x00, 0x10, 0x38, 0x6c, 0xc6, 0xc6, 0xfe, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00,
-0x38, 0x6c, 0x38, 0x00, 0x38, 0x6c, 0xc6, 0xc6, 0xfe, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00,
-0x18, 0x30, 0x60, 0x00, 0xfe, 0x66, 0x60, 0x7c, 0x60, 0x60, 0x66, 0xfe, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x00, 0x00, 0x6e, 0x3b, 0x1b, 0x7e, 0xd8, 0xdc, 0x77, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x3e, 0x6c, 0xcc, 0xcc, 0xfe, 0xcc, 0xcc, 0xcc, 0xcc, 0xce, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x10, 0x38, 0x6c, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0xc6, 0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x60, 0x30, 0x18, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x30, 0x78, 0xcc, 0x00, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x60, 0x30, 0x18, 0x00, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0xc6, 0x00, 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7e, 0x06, 0x0c, 0x78, 0x00,
-0x00, 0xc6, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00,
-0x00, 0xc6, 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x18, 0x18, 0x7e, 0xc3, 0xc0, 0xc0, 0xc0, 0xc3, 0x7e, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x38, 0x6c, 0x64, 0x60, 0xf0, 0x60, 0x60, 0x60, 0x60, 0xe6, 0xfc, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0xc3, 0x66, 0x3c, 0x18, 0xff, 0x18, 0xff, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00,
-0x00, 0xfc, 0x66, 0x66, 0x7c, 0x62, 0x66, 0x6f, 0x66, 0x66, 0x66, 0xf3, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x0e, 0x1b, 0x18, 0x18, 0x18, 0x7e, 0x18, 0x18, 0x18, 0x18, 0x18, 0xd8, 0x70, 0x00, 0x00,
-0x00, 0x18, 0x30, 0x60, 0x00, 0x78, 0x0c, 0x7c, 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x0c, 0x18, 0x30, 0x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x18, 0x30, 0x60, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x18, 0x30, 0x60, 0x00, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x76, 0xdc, 0x00, 0xdc, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00,
-0x76, 0xdc, 0x00, 0xc6, 0xe6, 0xf6, 0xfe, 0xde, 0xce, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x3c, 0x6c, 0x6c, 0x3e, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x38, 0x6c, 0x6c, 0x38, 0x00, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x30, 0x30, 0x00, 0x30, 0x30, 0x60, 0xc0, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xc0, 0xc0, 0xc0, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x06, 0x06, 0x06, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00,
-0x00, 0xc0, 0xc0, 0xc2, 0xc6, 0xcc, 0x18, 0x30, 0x60, 0xce, 0x9b, 0x06, 0x0c, 0x1f, 0x00, 0x00,
-0x00, 0xc0, 0xc0, 0xc2, 0xc6, 0xcc, 0x18, 0x30, 0x66, 0xce, 0x96, 0x3e, 0x06, 0x06, 0x00, 0x00,
-0x00, 0x00, 0x18, 0x18, 0x00, 0x18, 0x18, 0x18, 0x3c, 0x3c, 0x3c, 0x18, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x6c, 0xd8, 0x6c, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x00, 0x00, 0xd8, 0x6c, 0x36, 0x6c, 0xd8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-0x11, 0x44, 0x11, 0x44, 0x11, 0x44, 0x11, 0x44, 0x11, 0x44, 0x11, 0x44, 0x11, 0x44, 0x11, 0x44,
-0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa,
-0xdd, 0x77, 0xdd, 0x77, 0xdd, 0x77, 0xdd, 0x77, 0xdd, 0x77, 0xdd, 0x77, 0xdd, 0x77, 0xdd, 0x77,
-0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
-0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xf8, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
-0x18, 0x18, 0x18, 0x18, 0x18, 0xf8, 0x18, 0xf8, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
-0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0xf6, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
-0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
-0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x18, 0xf8, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
-0x36, 0x36, 0x36, 0x36, 0x36, 0xf6, 0x06, 0xf6, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
-0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
-0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x06, 0xf6, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
-0x36, 0x36, 0x36, 0x36, 0x36, 0xf6, 0x06, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-0x18, 0x18, 0x18, 0x18, 0x18, 0xf8, 0x18, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
-0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
-0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x1f, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
-0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xff, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
-0x18, 0x18, 0x18, 0x18, 0x18, 0x1f, 0x18, 0x1f, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
-0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x37, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
-0x36, 0x36, 0x36, 0x36, 0x36, 0x37, 0x30, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x30, 0x37, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
-0x36, 0x36, 0x36, 0x36, 0x36, 0xf7, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0xf7, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
-0x36, 0x36, 0x36, 0x36, 0x36, 0x37, 0x30, 0x37, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
-0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-0x36, 0x36, 0x36, 0x36, 0x36, 0xf7, 0x00, 0xf7, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
-0x18, 0x18, 0x18, 0x18, 0x18, 0xff, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0xff, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
-0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
-0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-0x18, 0x18, 0x18, 0x18, 0x18, 0x1f, 0x18, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x18, 0x1f, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
-0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
-0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0xff, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
-0x18, 0x18, 0x18, 0x18, 0x18, 0xff, 0x18, 0xff, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
-0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
-0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0,
-0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f,
-0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0xdc, 0xd8, 0xd8, 0xd8, 0xdc, 0x76, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x78, 0xcc, 0xcc, 0xcc, 0xd8, 0xcc, 0xc6, 0xc6, 0xc6, 0xcc, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0xfe, 0xc6, 0xc6, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x00, 0xfe, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0xfe, 0xc6, 0x60, 0x30, 0x18, 0x30, 0x60, 0xc6, 0xfe, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0xd8, 0xd8, 0xd8, 0xd8, 0xd8, 0x70, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x00, 0x66, 0x66, 0x66, 0x66, 0x66, 0x7c, 0x60, 0x60, 0xc0, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x00, 0x76, 0xdc, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x7e, 0x18, 0x3c, 0x66, 0x66, 0x66, 0x3c, 0x18, 0x7e, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x38, 0x6c, 0xc6, 0xc6, 0xfe, 0xc6, 0xc6, 0x6c, 0x38, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x38, 0x6c, 0xc6, 0xc6, 0xc6, 0x6c, 0x6c, 0x6c, 0x6c, 0xee, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x1e, 0x30, 0x18, 0x0c, 0x3e, 0x66, 0x66, 0x66, 0x66, 0x3c, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0xdb, 0xdb, 0xdb, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x03, 0x06, 0x7e, 0xdb, 0xdb, 0xf3, 0x7e, 0x60, 0xc0, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x1c, 0x30, 0x60, 0x60, 0x7c, 0x60, 0x60, 0x60, 0x30, 0x1c, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x00, 0xfe, 0x00, 0x00, 0xfe, 0x00, 0x00, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x7e, 0x18, 0x18, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x30, 0x18, 0x0c, 0x06, 0x0c, 0x18, 0x30, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x0c, 0x18, 0x30, 0x60, 0x30, 0x18, 0x0c, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x0e, 0x1b, 0x1b, 0x1b, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
-0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xd8, 0xd8, 0xd8, 0x70, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x7e, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0xdc, 0x00, 0x76, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x38, 0x6c, 0x6c, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x0f, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0xec, 0x6c, 0x6c, 0x3c, 0x1c, 0x00, 0x00, 0x00, 0x00,
-0x00, 0xd8, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x70, 0xd8, 0x30, 0x60, 0xc8, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x00, 0x7c, 0x7c, 0x7c, 0x7c, 0x7c, 0x7c, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
-};
diff -u --recursive --new-file v2.1.106/linux/drivers/char/vc_screen.c linux/drivers/char/vc_screen.c
--- v2.1.106/linux/drivers/char/vc_screen.c	Thu Feb 12 20:56:06 1998
+++ linux/drivers/char/vc_screen.c	Wed Jun 24 14:44:00 1998
@@ -31,8 +31,10 @@
 #include <linux/mm.h>
 #include <linux/init.h>
 #include <linux/vt_kern.h>
+#include <linux/console_struct.h>
 #include <linux/selection.h>
 #include <asm/uaccess.h>
+#include <asm/byteorder.h>
 
 #undef attr
 #undef org
@@ -55,18 +57,15 @@
 vcs_size(struct inode *inode)
 {
 	int size;
-#ifdef CONFIG_FB_CONSOLE
-	int cons = MINOR(inode->i_rdev) & 127;
-
-	if (cons == 0)
-		cons = fg_console;
+   	int currcons = MINOR(inode->i_rdev) & 127;
+	if (currcons == 0)
+		currcons = fg_console;
 	else
-		cons--;
-	if (!vc_cons_allocated(cons))
+		currcons--;
+	if (!vc_cons_allocated(currcons))
 		return -ENXIO;
-#endif
 
-	size = get_video_num_lines(cons) * get_video_num_columns(cons);
+	size = video_num_lines * video_num_columns;
 
 	if (MINOR(inode->i_rdev) & 128)
 		size = 2*size + HEADER_SIZE;
@@ -132,8 +131,8 @@
 	} else {
 		if (p < HEADER_SIZE) {
 			char header[HEADER_SIZE];
-			header[0] = (char) get_video_num_lines(currcons);
-			header[1] = (char) get_video_num_columns(currcons);
+			header[0] = (char) video_num_lines;
+			header[1] = (char) video_num_columns;
 			getconsxy(currcons, header+2);
 			while (p < HEADER_SIZE && count > 0)
 			    { count--; put_user(header[p++], buf++); }
@@ -142,7 +141,11 @@
 		    p -= HEADER_SIZE;
 		    org = screen_pos(currcons, p/2, viewed);
 		    if ((p & 1) && count > 0)
+#ifdef __BIG_ENDIAN
+			    { count--; put_user(func_scr_readw(org++) & 0xff, buf++); }
+#else
 			    { count--; put_user(func_scr_readw(org++) >> 8, buf++); }
+#endif
 		}
 		while (count > 1) {
 			put_user(func_scr_readw(org++), (unsigned short *) buf);
@@ -150,7 +153,11 @@
 			count -= 2;
 		}
 		if (count > 0)
+#ifdef __BIG_ENDIAN
+			put_user(func_scr_readw(org) >> 8, buf++);
+#else
 			put_user(func_scr_readw(org) & 0xff, buf++);
+#endif
 	}
 	read = buf - buf0;
 	*ppos += read;
@@ -212,8 +219,13 @@
 			    char c;
 				count--;
 				get_user(c,buf++);
+#ifdef __BIG_ENDIAN
+				func_scr_writew(c |
+				     (func_scr_readw(org) & 0xff00), org);
+#else
 				func_scr_writew((c << 8) |
 				     (func_scr_readw(org) & 0xff), org);
+#endif
 				org++;
 			}
 		}
@@ -227,14 +239,16 @@
 		if (count > 0) {
 			unsigned char c;
 			get_user(c, (const unsigned char*)buf++);
+#ifdef __BIG_ENDIAN
+			func_scr_writew((func_scr_readw(org) & 0xff) | (c << 8), org);
+#else
 			func_scr_writew((func_scr_readw(org) & 0xff00) | c, org);
+#endif
 		}
 	}
-#ifdef CONFIG_FB_CONSOLE
 	if (currcons == fg_console)
 		/* Horribly inefficient if count < screen size.  */
 		update_screen(currcons);
-#endif
 	written = buf - buf0;
 	*ppos += written;
 	RETURN( written );
diff -u --recursive --new-file v2.1.106/linux/drivers/char/vesa_blank.c linux/drivers/char/vesa_blank.c
--- v2.1.106/linux/drivers/char/vesa_blank.c	Mon Oct 28 04:29:23 1996
+++ linux/drivers/char/vesa_blank.c	Wed Dec 31 16:00:00 1969
@@ -1,290 +0,0 @@
-/*
- * vesa_blank.c
- *
- * Exported functions:
- *	void vesa_blank(void);
- *	void vesa_unblank(void);
- *	void vesa_powerdown(void);
- *	void set_vesa_blanking(const unsigned long arg);
- *
- * Not all hardware reacts well to this code - activate at your own risk.
- * Activation is done using a sufficiently recent version of setterm
- * or using a tiny C program like the following.
- *
------------------------------------------------------------------------
-|#include <stdio.h>
-|#include <linux/termios.h>
-|main(int argc, char *argv[]) {
-|    int fd;
-|    struct { char ten, onoff; } arg;
-|
-|    if (argc != 2) {
-|	fprintf(stderr, "usage: setvesablank on|vsync|hsync|powerdown|off\n");
-|	exit(1);
-|    }
-|    if ((fd = open("/dev/console", 0)) < 0)
-|      fd = 0;
-|    arg.ten = 10;
-|    arg.onoff = 0;
-|    if (!strcmp(argv[1], "on") || !strcmp(argv[1], "vsync"))
-|      arg.onoff = 1;
-|    else if (!strcmp(argv[1], "hsync"))
-|      arg.onoff = 2;
-|    else if (!strcmp(argv[1], "powerdown"))
-|      arg.onoff = 3;
-|    if (ioctl(fd, TIOCLINUX, &arg)) {
-|	perror("setvesablank: TIOCLINUX");
-|	exit(1);
-|    }
-|    exit(0);
-|}
------------------------------------------------------------------------
-*/
-
-#include <asm/io.h>
-#include <asm/system.h>
-#include <asm/uaccess.h>
-#include <linux/mm.h>
-
-extern unsigned short video_port_reg, video_port_val;
-
-/*
- * This file handles the VESA Power Saving Protocol that lets a
- * monitor be powered down whenever not needed for a longer time.
- * The VESA protocol defines:
- *
- *  Mode/Status		HSync	VSync	Video
- *  -------------------------------------------
- *  "On"		on	on	active  (mode 0)
- *  "Suspend" {either}	on	off	blank   (mode 1)
- *            {  or  }	off	on	blank   (mode 2)
- *  "Off"               off	off	blank	(mode 3)
- *
- * Original code taken from the Power Management Utility (PMU) of
- * Huang shi chao, delivered together with many new monitor models
- * capable of the VESA Power Saving Protocol.
- *
- * Adapted to Linux by Christoph Rimek (chrimek@toppoint.de)  15-may-94.
- * A slightly adapted fragment of his README follows.
- *
- * Two-stage blanking by todd j. derr (tjd@barefoot.org)      10-oct-95.
-
-Patch (based on Linux Kernel revision 1.0) for handling the Power Saving
-feature of the new monitor generation. The code works on all these monitors
-(mine is a Smile 1506) and should run on *all* video adapter cards (change
-some i/o-addresses), although tested only on two different VGA-cards: a  
-cheap Cirrus Logic (5428) and a miro Crystal 8S (S3-805).
-
-You can choose from two options:
-
-(1) Setting vesa_blanking_mode to 1 or 2.
-    The code will save the current setting of your video adapters'
-    register settings and then program the controller to turn off
-    the vertical synchronization pulse (mode 1) or horizontal
-    synchronization pulse (mode 2).  Mode 1 should work with most
-    monitors, but the VESA spec allows mode 2, so it's included for
-    completeness. You may set this blanking interval in minutes by
-    echoing the escape sequence 'ESC[9;interval]' to the terminal.
-    By default this interval is set to 10 minutes.
-
-    If you use one of these modes, you can also set a second interval
-    by echoing the escape sequence 'ESC[14;interval]' to the terminal.
-    The monitor will be turned off completely (mode 3) after being in
-    suspend mode for the specified interval. An interval of 0 disables
-    this feature which is the default.
-
-    Both intervals may be set within the range of 0..60 minutes.
-
-(2) Setting vesa_blanking_mode to 3.
-    If your monitor locally has an Off_Mode timer then you should not
-    force your video card to send the OFF-signal - your monitor will
-    power down by itself.
-    If your monitor cannot handle this and needs the Off-signal directly,
-    or if you like your monitor to power down immediately when the
-    blank_timer times out, then you choose this option.
-
-On the other hand I'd recommend to not choose this second option unless
-it is absolutely necessary. Powering down a monitor to the Off_State with
-an approx. power consumption of 3-5 Watts is a rather strong action for
-the CRT and it should not be done every now and then. If the software only  
-sends the signal to enter Standby mode, you have the chance to interfere
-before the monitor powers down. Do not set a too short period, if you love
-your hardware :-)) .
-
-By default vesa_blanking_mode is set to 0, thus not using any power saving
-features.
-*/
-
-#define seq_port_reg	(0x3c4)		/* Sequencer register select port */
-#define seq_port_val	(0x3c5)		/* Sequencer register value port  */
-#define video_misc_rd	(0x3cc)		/* Video misc. read port	  */
-#define video_misc_wr	(0x3c2)		/* Video misc. write port	  */
-
-/* structure holding original VGA register settings */
-static struct {
-	unsigned char	SeqCtrlIndex;		/* Sequencer Index reg.   */
-	unsigned char	CrtCtrlIndex;		/* CRT-Contr. Index reg.  */
-	unsigned char	CrtMiscIO;		/* Miscellaneous register */
-	unsigned char	HorizontalTotal;	/* CRT-Controller:00h */
-	unsigned char	HorizDisplayEnd;	/* CRT-Controller:01h */
-	unsigned char	StartHorizRetrace;	/* CRT-Controller:04h */
-	unsigned char	EndHorizRetrace;	/* CRT-Controller:05h */
-	unsigned char	Overflow;		/* CRT-Controller:07h */
-	unsigned char	StartVertRetrace;	/* CRT-Controller:10h */
-	unsigned char	EndVertRetrace;		/* CRT-Controller:11h */
-	unsigned char	ModeControl;		/* CRT-Controller:17h */
-	unsigned char	ClockingMode;		/* Seq-Controller:01h */
-} vga;
-
-#define VESA_NO_BLANKING	0
-#define VESA_VSYNC_SUSPEND	1
-#define VESA_HSYNC_SUSPEND	2
-#define VESA_POWERDOWN		(VESA_HSYNC_SUSPEND | VESA_VSYNC_SUSPEND)
-
-#define DEFAULT_VESA_BLANKING_MODE	VESA_NO_BLANKING
-
-static int vesa_blanking_mode = DEFAULT_VESA_BLANKING_MODE;
-static int suspend_vesa_blanking_mode = DEFAULT_VESA_BLANKING_MODE;
-static int vesa_blanked = 0;
-
-/* routine to blank a vesa screen */
-void vesa_blank(void)
-{
-	int mode;
-
-	if((mode = vesa_blanking_mode) == 0)
-	  return;
-
-	/* save original values of VGA controller registers */
-	if(!vesa_blanked) {
-	    cli();
-	    vga.SeqCtrlIndex = inb_p(seq_port_reg);
-	    vga.CrtCtrlIndex = inb_p(video_port_reg);
-	    vga.CrtMiscIO = inb_p(video_misc_rd);
-	    sti();
-
-	    outb_p(0x00,video_port_reg);		/* HorizontalTotal */
-	    vga.HorizontalTotal = inb_p(video_port_val);
-	    outb_p(0x01,video_port_reg);		/* HorizDisplayEnd */
-	    vga.HorizDisplayEnd = inb_p(video_port_val);
-	    outb_p(0x04,video_port_reg);		/* StartHorizRetrace */
-	    vga.StartHorizRetrace = inb_p(video_port_val);
-	    outb_p(0x05,video_port_reg);		/* EndHorizRetrace */
-	    vga.EndHorizRetrace = inb_p(video_port_val);
-	    outb_p(0x07,video_port_reg);		/* Overflow */
-	    vga.Overflow = inb_p(video_port_val);
-	    outb_p(0x10,video_port_reg);		/* StartVertRetrace */
-	    vga.StartVertRetrace = inb_p(video_port_val);
-	    outb_p(0x11,video_port_reg);		/* EndVertRetrace */
-	    vga.EndVertRetrace = inb_p(video_port_val);
-	    outb_p(0x17,video_port_reg);		/* ModeControl */
-	    vga.ModeControl = inb_p(video_port_val);
-	    outb_p(0x01,seq_port_reg);			/* ClockingMode */
-	    vga.ClockingMode = inb_p(seq_port_val);
-	}
-
-	/* assure that video is enabled */
-	/* "0x20" is VIDEO_ENABLE_bit in register 01 of sequencer */
-	cli();
-	outb_p(0x01,seq_port_reg);
-	outb_p(vga.ClockingMode | 0x20,seq_port_val);
-
-	/* test for vertical retrace in process.... */
-	if ((vga.CrtMiscIO & 0x80) == 0x80)
-		outb_p(vga.CrtMiscIO & 0xef,video_misc_wr);
-
-	/*
-	 * Set <End of vertical retrace> to minimum (0) and
-	 * <Start of vertical Retrace> to maximum (incl. overflow)
-	 * Result: turn off vertical sync (VSync) pulse.
-	 */
-	if (mode & VESA_VSYNC_SUSPEND) {
-	    outb_p(0x10,video_port_reg);	/* StartVertRetrace */
-	    outb_p(0xff,video_port_val); 	/* maximum value */
-	    outb_p(0x11,video_port_reg);	/* EndVertRetrace */
-	    outb_p(0x40,video_port_val);	/* minimum (bits 0..3)  */
-	    outb_p(0x07,video_port_reg);		/* Overflow */
-	    outb_p(vga.Overflow | 0x84,video_port_val);	/* bits 9,10 of  */
-							/* vert. retrace */
-	}
-
-	if (mode & VESA_HSYNC_SUSPEND) {
-	    /*
-	     * Set <End of horizontal retrace> to minimum (0) and
-	     *  <Start of horizontal Retrace> to maximum
-	     * Result: turn off horizontal sync (HSync) pulse.
-	     */
-	    outb_p(0x04,video_port_reg);	/* StartHorizRetrace */
-	    outb_p(0xff,video_port_val);	/* maximum */
-	    outb_p(0x05,video_port_reg);	/* EndHorizRetrace */
-	    outb_p(0x00,video_port_val);	/* minimum (0) */
-	}
-
-	/* restore both index registers */
-	outb_p(vga.SeqCtrlIndex,seq_port_reg);
-	outb_p(vga.CrtCtrlIndex,video_port_reg);
-	sti();
-
-	vesa_blanked = mode;
-}	
-
-/* routine to unblank a vesa screen */
-void vesa_unblank(void)
-{
-	if (!vesa_blanked)
-	  return;
-
-	/* restore original values of VGA controller registers */
-	cli();
-	outb_p(vga.CrtMiscIO,video_misc_wr);
-
-	outb_p(0x00,video_port_reg);		/* HorizontalTotal */
-	outb_p(vga.HorizontalTotal,video_port_val);
-	outb_p(0x01,video_port_reg);		/* HorizDisplayEnd */
-	outb_p(vga.HorizDisplayEnd,video_port_val);
-	outb_p(0x04,video_port_reg);		/* StartHorizRetrace */
-	outb_p(vga.StartHorizRetrace,video_port_val);
-	outb_p(0x05,video_port_reg);		/* EndHorizRetrace */
-	outb_p(vga.EndHorizRetrace,video_port_val);
-	outb_p(0x07,video_port_reg);		/* Overflow */
-	outb_p(vga.Overflow,video_port_val);
-	outb_p(0x10,video_port_reg);		/* StartVertRetrace */
-	outb_p(vga.StartVertRetrace,video_port_val);
-	outb_p(0x11,video_port_reg);		/* EndVertRetrace */
-	outb_p(vga.EndVertRetrace,video_port_val);
-	outb_p(0x17,video_port_reg);		/* ModeControl */
-	outb_p(vga.ModeControl,video_port_val);
-	outb_p(0x01,seq_port_reg);		/* ClockingMode */
-	outb_p(vga.ClockingMode,seq_port_val);
-
-	/* restore index/control registers */
-	outb_p(vga.SeqCtrlIndex,seq_port_reg);
-	outb_p(vga.CrtCtrlIndex,video_port_reg);
-	sti();
-
-	vesa_blanked = 0;
-}
-
-void set_vesa_blanking(const unsigned long arg)
-{
-	unsigned char *argp = (unsigned char *)(arg + 1);
-	unsigned int mode;
-
-	if (verify_area(VERIFY_READ, argp, 1))
-		return;
-
-	get_user(mode, argp);
-	vesa_blanking_mode = suspend_vesa_blanking_mode =
-		((mode <= VESA_POWERDOWN) ? mode : DEFAULT_VESA_BLANKING_MODE);
-}
-
-void vesa_powerdown(void)
-{
-	if(vesa_blanking_mode == VESA_VSYNC_SUSPEND
-		|| vesa_blanking_mode == VESA_HSYNC_SUSPEND)
-	{
-		vesa_blanking_mode = VESA_POWERDOWN;
-		vesa_blank();
-		vesa_blanking_mode = suspend_vesa_blanking_mode;
-	}
-}
diff -u --recursive --new-file v2.1.106/linux/drivers/char/vga.c linux/drivers/char/vga.c
--- v2.1.106/linux/drivers/char/vga.c	Tue Dec  9 12:23:52 1997
+++ linux/drivers/char/vga.c	Wed Dec 31 16:00:00 1969
@@ -1,635 +0,0 @@
-/*
- *  linux/drivers/char/vga.c
- *
- *  Copyright (C) 1991, 1992  Linus Torvalds
- *			1995  Jay Estabrook
- */
-
-/*
- *	vga.c
- *
- * This module exports the console low-level io support for VGA
- *
- *     'int con_get_font(char *data)'
- *     'int con_set_font(char *data, int ch512)'
- *     'int con_adjust_height(int fontheight)'
- *
- *     'int con_get_cmap(char *)'
- *     'int con_set_cmap(char *)'
- *
- *     'int reset_palette(int currcons)'
- *     'void set_palette(void)'
- *
- * User definable mapping table and font loading by Eugene G. Crosser,
- * <crosser@pccross.msk.su>
- *
- * Improved loadable font/UTF-8 support by H. Peter Anvin 
- * Feb-Sep 1995 <peter.anvin@linux.org>
- *
- * Colour palette handling, by Simon Tatham
- * 17-Jun-95 <sgt20@cam.ac.uk>
- *
- * if 512 char mode is already enabled don't re-enable it,
- * because it causes screen to flicker, by Mitja Horvat
- * 5-May-96 <mitja.horvat@guest.arnes.si>
- *
- * Use 2 outw instead of 4 outb_p to reduce erroneous text 
- * flashing on RHS of screen during heavy console scrolling .
- * Oct 1996, Paul Gortmaker.
- *
- */
-
-#include <linux/sched.h>
-#include <linux/timer.h>
-#include <linux/interrupt.h>
-#include <linux/tty.h>
-#include <linux/tty_flip.h>
-#include <linux/config.h>
-#include <linux/kernel.h>
-#include <linux/string.h>
-#include <linux/errno.h>
-#include <linux/kd.h>
-#include <linux/malloc.h>
-#include <linux/major.h>
-#include <linux/mm.h>
-#include <linux/ioport.h>
-#include <linux/init.h>
-
-#include <asm/io.h>
-#include <asm/system.h>
-#include <asm/uaccess.h>
-#include <asm/bitops.h>
-
-#include <linux/kbd_kern.h>
-#include <linux/vt_kern.h>
-#include <linux/consolemap.h>
-#include <linux/selection.h>
-#include <linux/console_struct.h>
-
-#define CAN_LOAD_EGA_FONTS    /* undefine if the user must not do this */
-#define CAN_LOAD_PALETTE      /* undefine if the user must not do this */
-
-#define dac_reg (0x3c8)
-#define dac_val (0x3c9)
-
-#ifdef __powerpc__
-#define VGA_OFFSET 0xC0000000;
-#else
-#define VGA_OFFSET 0x0
-#endif
-
-/*
- * By replacing the four outb_p with two back to back outw, we can reduce
- * the window of opportunity to see text mislocated to the RHS of the
- * console during heavy scrolling activity. However there is the remote
- * possibility that some pre-dinosaur hardware won't like the back to back
- * I/O. Since the Xservers get away with it, we should be able to as well.
- */
-static inline void write_vga(unsigned char reg, unsigned int val)
-{
-#ifndef SLOW_VGA
-	unsigned int v1, v2;
-
-	v1 = reg + (val & 0xff00);
-	v2 = reg + 1 + ((val << 8) & 0xff00);
-	outw(v1, video_port_reg);
-	outw(v2, video_port_reg);
-#else
-	outb_p(reg, video_port_reg);
-	outb_p(val >> 8, video_port_val);
-	outb_p(reg+1, video_port_reg);
-	outb_p(val & 0xff, video_port_val);
-#endif
-}
-
-void
-set_palette (void)
-{
-	int i, j ;
-
-	if (video_type != VIDEO_TYPE_VGAC || console_blanked ||
-	    vt_cons[fg_console]->vc_mode == KD_GRAPHICS)
-		return ;
-
-	for (i=j=0; i<16; i++) {
-		outb_p (color_table[i], dac_reg) ;
-		outb_p (vc_cons[fg_console].d->vc_palette[j++]>>2, dac_val) ;
-		outb_p (vc_cons[fg_console].d->vc_palette[j++]>>2, dac_val) ;
-		outb_p (vc_cons[fg_console].d->vc_palette[j++]>>2, dac_val) ;
-	}
-}
-
-void
-__set_origin(unsigned short offset)
-{
-	clear_selection();
-
-	__origin = offset;
-	write_vga(12, offset);
-}
-
-/*
- * Put the cursor just beyond the end of the display adaptor memory.
- */
-void
-hide_cursor(void)
-{
-  /* This is inefficient, we could just put the cursor at 0xffff,
-     but perhaps the delays due to the inefficiency are useful for
-     some hardware... */
-	write_vga(14, (video_mem_term - video_mem_base - 1)>>1);
-}
-
-void
-set_cursor(int currcons)
-{
-	if (currcons != fg_console || console_blanked || vcmode == KD_GRAPHICS)
-		return;
-	if (__real_origin != __origin)
-		__set_origin(__real_origin);
-	if (deccm) {
-		write_vga(14, (pos - video_mem_base)>>1);
-	} else
-		hide_cursor();
-}
-
-__initfunc(int con_is_present(void))
-{
-	unsigned short saved;
-	unsigned short *p;
-
-	/*
-	 *	Find out if there is a graphics card present.
-	 *	Are there smarter methods around?
-	 */
-	p = (unsigned short *) video_mem_base;
-	saved = scr_readw(p);
-	scr_writew(0xAA55, p);
-	if (scr_readw(p) != 0xAA55) {
-		scr_writew(saved, p);
-		return 0;
-	}
-	scr_writew(0x55AA, p);
-	if (scr_readw(p) != 0x55AA) {
-		scr_writew(saved, p);
-		return 0;
-	}
-	scr_writew(saved, p);
-	return 1;
-}
-
-__initfunc(unsigned long
-con_type_init(unsigned long kmem_start, const char **display_desc))
-{
-	if (ORIG_VIDEO_MODE == 7)	/* Is this a monochrome display? */
-	{
-		video_mem_base = 0xb0000 + VGA_OFFSET;
-		video_port_reg = 0x3b4;
-		video_port_val = 0x3b5;
-		if ((ORIG_VIDEO_EGA_BX & 0xff) != 0x10)
-		{
-			video_type = VIDEO_TYPE_EGAM;
-			video_mem_term = 0xb8000 + VGA_OFFSET;
-			*display_desc = "EGA+";
-			request_region(0x3b0,16,"ega");
-		}
-		else
-		{
-			video_type = VIDEO_TYPE_MDA;
-			video_mem_term = 0xb2000 + VGA_OFFSET;
-			*display_desc = "*MDA";
-			request_region(0x3b0,12,"mda");
-			request_region(0x3bf, 1,"mda");
-		}
-	}
-	else				/* If not, it is color. */
-	{
-		can_do_color = 1;
-		video_mem_base = 0xb8000  + VGA_OFFSET;
-		video_port_reg	= 0x3d4;
-		video_port_val	= 0x3d5;
-		if ((ORIG_VIDEO_EGA_BX & 0xff) != 0x10)
-		{
-			int i ;
-
-			video_mem_term = 0xc0000 + VGA_OFFSET;
-
-			if (!ORIG_VIDEO_ISVGA) {
-				video_type = VIDEO_TYPE_EGAC;
-				*display_desc = "EGA";
-				request_region(0x3c0,32,"ega");
-			} else {
-				video_type = VIDEO_TYPE_VGAC;
-				*display_desc = "VGA+";
-				request_region(0x3c0,32,"vga+");
-
-#ifdef VGA_CAN_DO_64KB
-				/*
-				 * get 64K rather than 32K of video RAM.
-				 * This doesn't actually work on all "VGA"
-				 * controllers (it seems like setting MM=01
-				 * and COE=1 isn't necessarily a good idea)
-				 */
-				video_mem_base = 0xa0000  + VGA_OFFSET;
-				video_mem_term = 0xb0000  + VGA_OFFSET;
-				outb_p (6, 0x3ce) ;
-				outb_p (6, 0x3cf) ;
-#endif
-
-				/*
-				 * Normalise the palette registers, to point
-				 * the 16 screen colours to the first 16
-				 * DAC entries.
-				 */
-
-				for (i=0; i<16; i++) {
-					inb_p (0x3da) ;
-					outb_p (i, 0x3c0) ;
-					outb_p (i, 0x3c0) ;
-				}
-				outb_p (0x20, 0x3c0) ;
-
-				/* now set the DAC registers back to their
-				 * default values */
-
-				for (i=0; i<16; i++) {
-					outb_p (color_table[i], 0x3c8) ;
-					outb_p (default_red[i], 0x3c9) ;
-					outb_p (default_grn[i], 0x3c9) ;
-					outb_p (default_blu[i], 0x3c9) ;
-				}
-			}
-		}
-		else
-		{
-			video_type = VIDEO_TYPE_CGA;
-			video_mem_term = 0xba000 + VGA_OFFSET;
-			*display_desc = "*CGA";
-			request_region(0x3d4,2,"cga");
-		}
-	}
-	return kmem_start;
-}
-
-__initfunc(void
-con_type_init_finish(void))
-{
-}
-
-void
-get_scrmem(int currcons)
-{
-	memcpyw((unsigned short *)vc_scrbuf[currcons],
-		(unsigned short *)origin, video_screen_size);
-	origin = video_mem_start = (unsigned long)vc_scrbuf[currcons];
-	scr_end = video_mem_end = video_mem_start + video_screen_size;
-	pos = origin + y*video_size_row + (x<<1);
-}
-
-void
-set_scrmem(int currcons, long offset)
-{
-#ifdef CONFIG_HGA
-  /* This works with XFree86 1.2, 1.3 and 2.0
-     This code could be extended and made more generally useful if we could
-     determine the actual video mode. It appears that this should be
-     possible on a genuine Hercules card, but I (WM) haven't been able to
-     read from any of the required registers on my clone card.
-     */
-	/* This code should work with Hercules and MDA cards. */
-	if (video_type == VIDEO_TYPE_MDA)
-	  {
-	    if (vcmode == KD_TEXT)
-	      {
-		/* Ensure that the card is in text mode. */
-		int	i;
-		static char herc_txt_tbl[12] = {
-		  0x61,0x50,0x52,0x0f,0x19,6,0x19,0x19,2,0x0d,0x0b,0x0c };
-		outb_p(0, 0x3bf);  /* Back to power-on defaults */
-		outb_p(0, 0x3b8);  /* Blank the screen, select page 0, etc */
-		for ( i = 0 ; i < 12 ; i++ )
-		  {
-		    outb_p(i, 0x3b4);
-		    outb_p(herc_txt_tbl[i], 0x3b5);
-		  }
-	      }
-#define HGA_BLINKER_ON 0x20
-#define HGA_SCREEN_ON  8
-	    /* Make sure that the hardware is not blanked */
-	    outb_p(HGA_BLINKER_ON | HGA_SCREEN_ON, 0x3b8);
-	  }
-#endif CONFIG_HGA
-
-	if (video_mem_term - video_mem_base < offset + video_screen_size)
-	  offset = 0;	/* strange ... */
-	memcpyw((unsigned short *)(video_mem_base + offset),
-		(unsigned short *) origin, video_screen_size);
-	video_mem_start = video_mem_base;
-	video_mem_end = video_mem_term;
-	origin = video_mem_base + offset;
-	scr_end = origin + video_screen_size;
-	pos = origin + y*video_size_row + (x<<1);
-	has_wrapped = 0;
-}
-
-/*
- * PIO_FONT support.
- *
- * The font loading code goes back to the codepage package by
- * Joel Hoffman (joel@wam.umd.edu). (He reports that the original
- * reference is: "From: p. 307 of _Programmer's Guide to PC & PS/2
- * Video Systems_ by Richard Wilton. 1987.  Microsoft Press".)
- *
- * Change for certain monochrome monitors by Yury Shevchuck
- * (sizif@botik.yaroslavl.su).
- */
-
-#define colourmap ((char *)0xa0000)
-/* Pauline Middelink <middelin@polyware.iaf.nl> reports that we
-   should use 0xA0000 for the bwmap as well.. */
-#define blackwmap ((char *)0xa0000)
-#define cmapsz 8192
-#define attrib_port (0x3c0)
-#define seq_port_reg (0x3c4)
-#define seq_port_val (0x3c5)
-#define gr_port_reg (0x3ce)
-#define gr_port_val (0x3cf)
-
-int
-set_get_font(char * arg, int set, int ch512)
-{
-#ifdef CAN_LOAD_EGA_FONTS
-	static int ch512enabled = 0;
-	int i;
-	char *charmap;
-	int beg;
-	unsigned short video_port_status = video_port_reg + 6;
-	int font_select = 0x00;
-
-	/* no use to "load" CGA... */
-
-	if (video_type == VIDEO_TYPE_EGAC || video_type == VIDEO_TYPE_VGAC) {
-		charmap = colourmap;
-		beg = 0x0e;
-#ifdef VGA_CAN_DO_64KB
-		if (video_type == VIDEO_TYPE_VGAC)
-			beg = 0x06;
-#endif
-	} else if (video_type == VIDEO_TYPE_EGAM) {
-		charmap = blackwmap;
-		beg = 0x0a;
-	} else
-		return -EINVAL;
-	
-	if (arg)
-	  {
-	    i = verify_area(set ? VERIFY_READ : VERIFY_WRITE, (void *)arg,
-			    ch512 ? 2*cmapsz : cmapsz);
-	    if (i)
-	      return i;
-	  }
-	else
-	  ch512 = 0;		/* Default font is always 256 */
-
-#ifdef BROKEN_GRAPHICS_PROGRAMS
-	/*
-	 * All fonts are loaded in slot 0 (0:1 for 512 ch)
-	 */
-
-	if (!arg)
-	  return -EINVAL;	/* Return to default font not supported */
-
-	video_font_is_default = 0;
-	font_select = ch512 ? 0x04 : 0x00;
-#else	
-	/*
-	 * The default font is kept in slot 0 and is never touched.
-	 * A custom font is loaded in slot 2 (256 ch) or 2:3 (512 ch)
-	 */
-
-	if (set)
-	  {
-	    video_font_is_default = !arg;
-	    font_select = arg ? (ch512 ? 0x0e : 0x0a) : 0x00;
-	  }
-
-	if ( !video_font_is_default )
-	  charmap += 4*cmapsz;
-#endif
-
-	cli();
-	outb_p( 0x00, seq_port_reg );   /* First, the sequencer */
-	outb_p( 0x01, seq_port_val );   /* Synchronous reset */
-	outb_p( 0x02, seq_port_reg );
-	outb_p( 0x04, seq_port_val );   /* CPU writes only to map 2 */
-	outb_p( 0x04, seq_port_reg );
-	outb_p( 0x07, seq_port_val );   /* Sequential addressing */
-	outb_p( 0x00, seq_port_reg );
-	outb_p( 0x03, seq_port_val );   /* Clear synchronous reset */
-
-	outb_p( 0x04, gr_port_reg );    /* Now, the graphics controller */
-	outb_p( 0x02, gr_port_val );    /* select map 2 */
-	outb_p( 0x05, gr_port_reg );
-	outb_p( 0x00, gr_port_val );    /* disable odd-even addressing */
-	outb_p( 0x06, gr_port_reg );
-	outb_p( 0x00, gr_port_val );    /* map start at A000:0000 */
-	sti();
-	
-	if (arg)
-	  {
-	    if (set)
-	      for (i=0; i<cmapsz ; i++) {
-	      	char c;
-	      	get_user(c, arg + i);
-		scr_writeb(c, charmap + i);
-	      }
-	    else
-	      for (i=0; i<cmapsz ; i++)
-		put_user(scr_readb(charmap + i), arg + i);
-	    
-	    
-	/*
-	 * In 512-character mode, the character map is not contiguous if
-	 * we want to remain EGA compatible -- which we do
-	 */
-
-	    if (ch512)
-	      {
-		charmap += 2*cmapsz;
-		arg += cmapsz;
-		if (set)
-		  for (i=0; i<cmapsz ; i++) {
-		    char c;
-		    get_user(c, arg+i);
-		    scr_writeb(c, charmap+i);
-		  }
-		else
-		  for (i=0; i<cmapsz ; i++)
-		    put_user(scr_readb(charmap+i), arg+i);
-	      }
-	  }
-	
-	cli();
-	outb_p( 0x00, seq_port_reg );   /* First, the sequencer */
-	outb_p( 0x01, seq_port_val );   /* Synchronous reset */
-	outb_p( 0x02, seq_port_reg );
-	outb_p( 0x03, seq_port_val );   /* CPU writes to maps 0 and 1 */
-	outb_p( 0x04, seq_port_reg );
-	outb_p( 0x03, seq_port_val );   /* odd-even addressing */
-	if (set)
-	  {
-	    outb_p( 0x03, seq_port_reg ); /* Character Map Select */
-	    outb_p( font_select, seq_port_val );
-	  }
-	outb_p( 0x00, seq_port_reg );
-	outb_p( 0x03, seq_port_val );   /* clear synchronous reset */
-
-	outb_p( 0x04, gr_port_reg );    /* Now, the graphics controller */
-	outb_p( 0x00, gr_port_val );    /* select map 0 for CPU */
-	outb_p( 0x05, gr_port_reg );
-	outb_p( 0x10, gr_port_val );    /* enable even-odd addressing */
-	outb_p( 0x06, gr_port_reg );
-	outb_p( beg, gr_port_val );     /* map starts at b800:0 or b000:0 */
-
-	/* if 512 char mode is already enabled don't re-enable it. */
-	if ((set)&&(ch512!=ch512enabled))	/* attribute controller */
-	  {
-	    ch512enabled=ch512;
-	    /* 256-char: enable intensity bit
-	       512-char: disable intensity bit */
-	    inb_p( video_port_status );	/* clear address flip-flop */
-	    outb_p ( 0x12, attrib_port ); /* color plane enable register */
-	    outb_p ( ch512 ? 0x07 : 0x0f, attrib_port );
-	    /* Wilton (1987) mentions the following; I don't know what
-	       it means, but it works, and it appears necessary */
-	    inb_p( video_port_status );
-	    outb_p ( 0x20, attrib_port );
-	  }
-	sti();
-
-	return 0;
-#else
-	return -EINVAL;
-#endif
-}
-
-/*
- * Adjust the screen to fit a font of a certain height
- *
- * Returns < 0 for error, 0 if nothing changed, and the number
- * of lines on the adjusted console if changed.
- */
-int
-con_adjust_height(unsigned long fontheight)
-{
-	int rows, maxscan;
-	unsigned char ovr, vde, fsr, curs, cure;
-
-	if (fontheight > 32 || (video_type != VIDEO_TYPE_VGAC &&
-	    video_type != VIDEO_TYPE_EGAC && video_type != VIDEO_TYPE_EGAM))
-		return -EINVAL;
-
-	if ( fontheight == video_font_height || fontheight == 0 )
-		return 0;
-
-	video_font_height = fontheight;
-
-	rows = video_scan_lines/fontheight;	/* Number of video rows we end up with */
-	maxscan = rows*fontheight - 1;		/* Scan lines to actually display-1 */
-
-	/* Reprogram the CRTC for the new font size
-	   Note: the attempt to read the overflow register will fail
-	   on an EGA, but using 0xff for the previous value appears to
-	   be OK for EGA text modes in the range 257-512 scan lines, so I
-	   guess we don't need to worry about it.
-
-	   The same applies for the spill bits in the font size and cursor
-	   registers; they are write-only on EGA, but it appears that they
-	   are all don't care bits on EGA, so I guess it doesn't matter. */
-
-	cli();
-	outb_p( 0x07, video_port_reg );		/* CRTC overflow register */
-	ovr = inb_p(video_port_val);
-	outb_p( 0x09, video_port_reg );		/* Font size register */
-	fsr = inb_p(video_port_val);
-	outb_p( 0x0a, video_port_reg );		/* Cursor start */
-	curs = inb_p(video_port_val);
-	outb_p( 0x0b, video_port_reg );		/* Cursor end */
-	cure = inb_p(video_port_val);
-	sti();
-
-	vde = maxscan & 0xff;			/* Vertical display end reg */
-	ovr = (ovr & 0xbd) +			/* Overflow register */
-	      ((maxscan & 0x100) >> 7) +
-	      ((maxscan & 0x200) >> 3);
-	fsr = (fsr & 0xe0) + (fontheight-1);    /*  Font size register */
-	curs = (curs & 0xc0) + fontheight - (fontheight < 10 ? 2 : 3);
-	cure = (cure & 0xe0) + fontheight - (fontheight < 10 ? 1 : 2);
-
-	cli();
-	outb_p( 0x07, video_port_reg );		/* CRTC overflow register */
-	outb_p( ovr, video_port_val );
-	outb_p( 0x09, video_port_reg );		/* Font size */
-	outb_p( fsr, video_port_val );
-	outb_p( 0x0a, video_port_reg );		/* Cursor start */
-	outb_p( curs, video_port_val );
-	outb_p( 0x0b, video_port_reg );		/* Cursor end */
-	outb_p( cure, video_port_val );
-	outb_p( 0x12, video_port_reg );		/* Vertical display limit */
-	outb_p( vde, video_port_val );
-	sti();
-
-	if ( rows == video_num_lines ) {
-	  /* Change didn't affect number of lines -- no need to scare
-	     the rest of the world */
-	  return 0;
-	}
-
-	vc_resize(rows, 0);			/* Adjust console size */
-
-	return rows;
-}
-
-int
-set_get_cmap(unsigned char * arg, int set) {
-#ifdef CAN_LOAD_PALETTE
-	int i;
-
-	/* no use to set colourmaps in less than colour VGA */
-
-	if (video_type != VIDEO_TYPE_VGAC)
-		return -EINVAL;
-
-	i = verify_area(set ? VERIFY_READ : VERIFY_WRITE, (void *)arg, 16*3);
-	if (i)
-		return i;
-
-	for (i=0; i<16; i++) {
-		if (set) {
-			get_user(default_red[i], arg++) ;
-			get_user(default_grn[i], arg++) ;
-			get_user(default_blu[i], arg++) ;
-		} else {
-			put_user (default_red[i], arg++) ;
-			put_user (default_grn[i], arg++) ;
-			put_user (default_blu[i], arg++) ;
-		}
-	}
-	if (set) {
-		for (i=0; i<MAX_NR_CONSOLES; i++)
-			if (vc_cons_allocated(i)) {
-				int j, k ;
-				for (j=k=0; j<16; j++) {
-					vc_cons[i].d->vc_palette[k++] = default_red[j];
-					vc_cons[i].d->vc_palette[k++] = default_grn[j];
-					vc_cons[i].d->vc_palette[k++] = default_blu[j];
-				}
-			}
-		set_palette() ;
-	}
-
-	return 0;
-#else
-	return -EINVAL;
-#endif
-}
diff -u --recursive --new-file v2.1.106/linux/drivers/char/vt.c linux/drivers/char/vt.c
--- v2.1.106/linux/drivers/char/vt.c	Thu May  7 22:51:49 1998
+++ linux/drivers/char/vt.c	Wed Jun 24 14:44:00 1998
@@ -416,7 +416,11 @@
 			if (i)
 				return i;
 			i = con_adjust_height(cfdarg.charheight);
-			return (i <= 0) ? i : kd_size_changed(i, 0);
+			/*
+			 *  ++Geert: vc_resize_con() will take note of the
+			 *	     changed screen size, if necessary
+			 */
+			return (i <= 0) ? i : 0;
 		} else
 			return -EINVAL;
 	case GIO_FONTX:
@@ -1013,7 +1017,10 @@
 		if (i) return i;
 
 		i = con_adjust_height(default_font_height);
-		if ( i > 0 ) kd_size_changed(i, 0);
+			/*
+			 *  ++Geert: vc_resize_con() will take note of the
+			 *	     changed screen size, if necessary
+			 */
 		con_set_default_unimap();
 
 		return 0;
diff -u --recursive --new-file v2.1.106/linux/drivers/char/wdt.c linux/drivers/char/wdt.c
--- v2.1.106/linux/drivers/char/wdt.c	Mon Jan 12 15:12:42 1998
+++ linux/drivers/char/wdt.c	Wed Jun 24 14:30:09 1998
@@ -184,7 +184,7 @@
 }
 
 /*
- *	Read reports the temperature in farenheit
+ *	Read reports the temperature in degrees Fahrenheit.
  */
  
 static ssize_t wdt_read(struct file *file, char *buf, size_t count, loff_t *ptr)
diff -u --recursive --new-file v2.1.106/linux/drivers/macintosh/aty.c linux/drivers/macintosh/aty.c
--- v2.1.106/linux/drivers/macintosh/aty.c	Fri May  8 23:14:47 1998
+++ linux/drivers/macintosh/aty.c	Wed Jun 24 14:44:00 1998
@@ -11,16 +11,16 @@
  * as published by the Free Software Foundation; either version
  * 2 of the License, or (at your option) any later version.
  */
-#include <linux/config.h> /* for CONFIG_CHIP_ID and CONFIG_STAT0 */
+#include <linux/config.h>
 #include <linux/kernel.h>
 #include <linux/sched.h>
 #include <linux/delay.h>
 #include <linux/string.h>
-#include <linux/vc_ioctl.h>
 #include <linux/pci.h>
 #include <linux/nvram.h>
 #include <linux/selection.h>
 #include <linux/vt_kern.h>
+#include <asm/vc_ioctl.h>
 #include <asm/prom.h>
 #include <asm/io.h>
 #include <asm/pgtable.h>
@@ -28,6 +28,9 @@
 #include <asm/init.h>
 #include "pmac-cons.h"
 #include "aty.h"
+#ifdef CONFIG_ABSCON_COMPAT
+#include <linux/console_compat.h>
+#endif
 
 struct aty_cmap_regs {
 	unsigned char windex;
@@ -708,7 +711,8 @@
 	pmac_init_palette();	/* Initialize colormap */
 
 	/* clear screen */
-	fb_start = frame_buffer + (((n_scanlines % 16) * line_pitch) >> 1);
+	fb_start = frame_buffer + ((chip_type == MACH64_GX_ID) ?
+				   init->offset[color_mode] : 0);
 	memsetw((unsigned short *) fb_start, 0, total_vram);
 
 	display_info.height = n_scanlines;
diff -u --recursive --new-file v2.1.106/linux/drivers/macintosh/chips.c linux/drivers/macintosh/chips.c
--- v2.1.106/linux/drivers/macintosh/chips.c	Fri May  8 23:14:47 1998
+++ linux/drivers/macintosh/chips.c	Wed Jun 24 14:44:00 1998
@@ -8,13 +8,15 @@
  * as published by the Free Software Foundation; either version
  * 2 of the License, or (at your option) any later version.
  */
+#include <linux/config.h>
 #include <linux/kernel.h>
 #include <linux/sched.h>
 #include <linux/delay.h>
 #include <linux/string.h>
-#include <linux/vc_ioctl.h>
 #include <linux/pci.h>
 #include <linux/selection.h>
+#include <linux/vmalloc.h>
+#include <asm/vc_ioctl.h>
 #include <asm/prom.h>
 #include <asm/io.h>
 #include <asm/pgtable.h>
@@ -25,6 +27,7 @@
 #include <asm/init.h>
 #include "pmac-cons.h"
 #include "chips.h"
+#include <linux/console_compat.h>
 
 
 static unsigned char *frame_buffer;
diff -u --recursive --new-file v2.1.106/linux/drivers/macintosh/control.c linux/drivers/macintosh/control.c
--- v2.1.106/linux/drivers/macintosh/control.c	Fri May  8 23:14:47 1998
+++ linux/drivers/macintosh/control.c	Wed Jun 24 14:44:00 1998
@@ -12,8 +12,8 @@
 #include <linux/sched.h>
 #include <linux/delay.h>
 #include <linux/string.h>
-#include <linux/vc_ioctl.h>
 #include <linux/nvram.h>
+#include <asm/vc_ioctl.h>
 #include <asm/prom.h>
 #include <asm/io.h>
 #include <asm/adb.h>
@@ -23,6 +23,7 @@
 #include <linux/selection.h>
 #include "pmac-cons.h"
 #include "control.h"
+#include <linux/console_compat.h>
 
 /*
  * Structure of the registers for the RADACAL colormap device.
diff -u --recursive --new-file v2.1.106/linux/drivers/macintosh/imstt.c linux/drivers/macintosh/imstt.c
--- v2.1.106/linux/drivers/macintosh/imstt.c	Sun Jun  7 11:16:31 1998
+++ linux/drivers/macintosh/imstt.c	Wed Jun 24 14:44:01 1998
@@ -9,15 +9,16 @@
  * as published by the Free Software Foundation; either version
  * 2 of the License, or (at your option) any later version.
  */
+
 #include <linux/module.h>
 
 #include <linux/kernel.h>
 #include <linux/sched.h>
 #include <linux/delay.h>
 #include <linux/string.h>
-#include <linux/vc_ioctl.h>
 #include <linux/pci.h>
 #include <linux/nvram.h>
+#include <asm/vc_ioctl.h>
 #include <asm/prom.h>
 #include <asm/io.h>
 #include <asm/pgtable.h>
@@ -27,6 +28,7 @@
 #include <linux/vt_kern.h>
 #include "pmac-cons.h"
 #include "imstt.h"
+#include <linux/console_compat.h>
 
 
 enum { 
diff -u --recursive --new-file v2.1.106/linux/drivers/macintosh/platinum.c linux/drivers/macintosh/platinum.c
--- v2.1.106/linux/drivers/macintosh/platinum.c	Fri May  8 23:14:47 1998
+++ linux/drivers/macintosh/platinum.c	Wed Jun 24 14:44:01 1998
@@ -12,8 +12,8 @@
 #include <linux/sched.h>
 #include <linux/delay.h>
 #include <linux/string.h>
-#include <linux/vc_ioctl.h>
 #include <linux/nvram.h>
+#include <asm/vc_ioctl.h>
 #include <asm/prom.h>
 #include <asm/io.h>
 #include <asm/pgtable.h>
@@ -21,6 +21,7 @@
 #include <linux/selection.h>
 #include "pmac-cons.h"
 #include "platinum.h"
+#include <linux/console_compat.h>
 
 /*
  * Structure of the registers for the DACula colormap device.
@@ -37,7 +38,7 @@
 };
 
 /*
- * Structure of the registers for the "platinum" display adaptor".
+ * Structure of the registers for the "platinum" display adaptor.
  */
 #define PAD(x)	char x[12]
 
@@ -424,7 +425,7 @@
 	cmap_regs = ioremap(cmap_regs_phys, 0x1000);
 
 	/* Grok total video ram */
-	plat_regs->reg[16].r = (unsigned)frame_buffer;
+	plat_regs->reg[16].r = (unsigned)frame_buffer_phys;
 	plat_regs->reg[20].r = 0x1011;	/* select max vram */
 	plat_regs->reg[24].r = 0;	/* switch in vram */
 	eieio();
@@ -521,7 +522,7 @@
 	for (i = 0; i < 26; ++i)
 		plat_regs->reg[i+32].r = init->regs[i];
 	plat_regs->reg[26+32].r = (one_mb ? init->plat_offset[color_mode] + 4 - color_mode : init->plat_offset[color_mode]);
-	plat_regs->reg[16].r = (unsigned) frame_buffer;
+	plat_regs->reg[16].r = (unsigned) frame_buffer_phys + init->fb_offset;
 	plat_regs->reg[18].r = line_pitch;
 	plat_regs->reg[19].r = (one_mb ? init->mode[color_mode+1] : init->mode[color_mode]);
 	plat_regs->reg[20].r = (one_mb ? 0x11 : 0x1011);
diff -u --recursive --new-file v2.1.106/linux/drivers/macintosh/pmac-cons.c linux/drivers/macintosh/pmac-cons.c
--- v2.1.106/linux/drivers/macintosh/pmac-cons.c	Fri May  8 23:14:47 1998
+++ linux/drivers/macintosh/pmac-cons.c	Wed Jun 24 14:44:01 1998
@@ -12,9 +12,9 @@
 #include <linux/sched.h>
 #include <linux/delay.h>
 #include <linux/string.h>
-#include <linux/vc_ioctl.h>
 #include <linux/kd.h>
 #include <linux/version.h>
+#include <asm/vc_ioctl.h>
 #include <asm/processor.h>
 #include <asm/prom.h>
 #include <asm/pgtable.h>
@@ -40,6 +40,7 @@
 #ifdef CONFIG_IMSTT_VIDEO
 #include "imstt.h"
 #endif
+#include <linux/console_compat.h>
 
 int video_mode = VMODE_NVRAM;
 int color_mode = CMODE_NVRAM;
@@ -320,7 +321,7 @@
 		hide_cursor();
 	} else {
 		old_cursor = cursor_pos;
-		cursor_pos = (pos - video_mem_base) >> 1;
+		cursor_pos = (pos - video_mem_start) >> 1;
 		if (old_cursor != -1)
 			invert_cursor(-1);
 		invert_cursor(cursor_pos);
@@ -394,7 +395,7 @@
 }
 
 int
-set_get_font(char *p, int set, int ch512)
+set_get_font(unsigned char *p, int set, int ch512)
 {
 	return 0;
 }
diff -u --recursive --new-file v2.1.106/linux/drivers/macintosh/valkyrie.c linux/drivers/macintosh/valkyrie.c
--- v2.1.106/linux/drivers/macintosh/valkyrie.c	Fri May  8 23:14:47 1998
+++ linux/drivers/macintosh/valkyrie.c	Wed Jun 24 14:44:01 1998
@@ -12,8 +12,8 @@
 #include <linux/sched.h>
 #include <linux/delay.h>
 #include <linux/string.h>
-#include <linux/vc_ioctl.h>
 #include <linux/nvram.h>
+#include <asm/vc_ioctl.h>
 #include <asm/prom.h>
 #include <asm/io.h>
 #include <asm/adb.h>
@@ -23,6 +23,7 @@
 #include <linux/selection.h>
 #include "pmac-cons.h"
 #include "valkyrie.h"
+#include <linux/console_compat.h>
 
 /*
  * Structure of the registers for the Valkyrie colormap registers.
diff -u --recursive --new-file v2.1.106/linux/drivers/net/3c505.c linux/drivers/net/3c505.c
--- v2.1.106/linux/drivers/net/3c505.c	Mon Feb 23 18:12:05 1998
+++ linux/drivers/net/3c505.c	Wed Jun 24 14:36:49 1998
@@ -1,9 +1,9 @@
 /*
- * Linux ethernet device driver for the 3Com Etherlink Plus (3C505)
+ * Linux Ethernet device driver for the 3Com Etherlink Plus (3C505)
  *      By Craig Southeren, Juha Laiho and Philip Blundell
  *
  * 3c505.c      This module implements an interface to the 3Com
- *              Etherlink Plus (3c505) ethernet card. Linux device
+ *              Etherlink Plus (3c505) Ethernet card. Linux device
  *              driver interface reverse engineered from the Linux 3C509
  *              device drivers. Some 3C505 information gleaned from
  *              the Crynwr packet driver. Still this driver would not
@@ -1568,7 +1568,7 @@
 	outb_control(adapter->hcr_val & ~CMDE, dev);
 
 	/*
-	 * copy ethernet address into structure
+	 * copy Ethernet address into structure
 	 */
 	for (i = 0; i < 6; i++)
 		dev->dev_addr[i] = adapter->rx_pcb.data.eth_addr[i];
diff -u --recursive --new-file v2.1.106/linux/drivers/net/3c505.h linux/drivers/net/3c505.h
--- v2.1.106/linux/drivers/net/3c505.h	Sun Feb  2 05:18:35 1997
+++ linux/drivers/net/3c505.h	Wed Jun 24 14:36:49 1998
@@ -216,7 +216,7 @@
 /*
 Primary Command Block. The most important data structure. All communication
 between the host and the adapter is done with these. (Except for the actual
-ethernet data, which has different packaging.)
+Ethernet data, which has different packaging.)
 */
 typedef struct {
 	byte	command;
diff -u --recursive --new-file v2.1.106/linux/drivers/net/Config.in linux/drivers/net/Config.in
--- v2.1.106/linux/drivers/net/Config.in	Tue Jun 23 10:01:23 1998
+++ linux/drivers/net/Config.in	Wed Jun 24 14:26:13 1998
@@ -188,6 +188,7 @@
 if [ "$CONFIG_TR" = "y" ]; then
   tristate 'IBM Tropic chipset based adaptor support' CONFIG_IBMTR
 #  tristate 'IBM Lanstreamer PCI adaptor support' CONFIG_IBMLS
+  tristate 'SysKonnect adapter support' CONFIG_SKTR
 fi
 
 if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then
diff -u --recursive --new-file v2.1.106/linux/drivers/net/Makefile linux/drivers/net/Makefile
--- v2.1.106/linux/drivers/net/Makefile	Tue Jun 23 10:01:23 1998
+++ linux/drivers/net/Makefile	Wed Jun 24 14:26:13 1998
@@ -61,6 +61,14 @@
   endif
 endif
 
+ifeq ($(CONFIG_SKTR),y)
+L_OBJS += sktr.o
+else
+  ifeq ($(CONFIG_SKTR),m)
+  M_OBJS += sktr.o
+  endif
+endif
+
 ifeq ($(CONFIG_ETHERTAP),y)
 L_OBJS += ethertap.o
 else
diff -u --recursive --new-file v2.1.106/linux/drivers/net/Space.c linux/drivers/net/Space.c
--- v2.1.106/linux/drivers/net/Space.c	Tue Jun 23 10:01:23 1998
+++ linux/drivers/net/Space.c	Wed Jun 24 14:26:13 1998
@@ -551,6 +551,9 @@
 #ifdef CONFIG_IBMTR
 	&& ibmtr_probe(dev)
 #endif
+#ifdef CONFIG_SKTR
+	&& sktr_probe(dev)
+#endif
 	&& 1 ) {
 	return 1;	/* -ENODEV or -EAGAIN would be more accurate. */
     }
diff -u --recursive --new-file v2.1.106/linux/drivers/net/cops.c linux/drivers/net/cops.c
--- v2.1.106/linux/drivers/net/cops.c	Tue Jun 23 10:01:23 1998
+++ linux/drivers/net/cops.c	Mon Jun 15 23:51:02 1998
@@ -336,14 +336,15 @@
 	if(board==DAYNA)
 		printk("%s: %s at %#3x, using IRQ %d, in Dayna mode.\n", 
 			dev->name, cardname, ioaddr, dev->irq);
-	if(board==TANGENT)
+	if(board==TANGENT) {
 		if(dev->irq)
 			printk("%s: %s at %#3x, IRQ %d, in Tangent mode\n", 
 				dev->name, cardname, ioaddr, dev->irq);
-	else
-		printk("%s: %s at %#3x, using polled IO, in Tangent mode.\n", 
-			dev->name, cardname, ioaddr);
+		else
+			printk("%s: %s at %#3x, using polled IO, in Tangent mode.\n", 
+				dev->name, cardname, ioaddr);
 
+	}
         return 0;
 }
 
diff -u --recursive --new-file v2.1.106/linux/drivers/net/eexpress.c linux/drivers/net/eexpress.c
--- v2.1.106/linux/drivers/net/eexpress.c	Sun Jun  7 11:16:32 1998
+++ linux/drivers/net/eexpress.c	Wed Jun 24 14:36:49 1998
@@ -65,7 +65,7 @@
  * Note by Zoltan Szilagyi 10-12-96:
  *
  * I've succeeded in eliminating the "CU wedged" messages, and hence the
- * lockups, which were only occuring with cards running in 8-bit mode ("force
+ * lockups, which were only occurring with cards running in 8-bit mode ("force
  * 8-bit operation" in Intel's SoftSet utility). This version of the driver
  * sets the 82586 and the ASIC to 8-bit mode at startup; it also stops the
  * CU before submitting a packet for transmission, and then restarts it as soon
diff -u --recursive --new-file v2.1.106/linux/drivers/net/ne2k-pci.c linux/drivers/net/ne2k-pci.c
--- v2.1.106/linux/drivers/net/ne2k-pci.c	Tue Jun  9 11:57:30 1998
+++ linux/drivers/net/ne2k-pci.c	Tue Jun 16 14:36:02 1998
@@ -103,7 +103,7 @@
 struct ne2k_pci_card {
 	struct ne2k_pci_card *next;
 	struct device *dev;
-	unsigned char pci_bus, pci_device_fn;
+	struct pci_dev *pci_dev;
 };
 /* A list of all installed devices, for removing the driver module. */
 static struct ne2k_pci_card *ne2k_card_list = NULL;
@@ -170,45 +170,29 @@
 
 __initfunc (int ne2k_pci_probe(struct device *dev))
 {
-	static int pci_index = 0;	/* Static, for multiple calls. */
+	struct pci_dev *pdev = NULL;
 	int cards_found = 0;
 	int i;
 
-	if ( ! pcibios_present())
+	if ( ! pci_present())
 		return -ENODEV;
 
-	for (;pci_index < 0xff; pci_index++) {
-		unsigned char pci_bus, pci_device_fn;
+	while ((pdev = pci_find_class(PCI_CLASS_NETWORK_ETHERNET << 8, pdev)) != NULL) {
 		u8 pci_irq_line;
-		u16 pci_command, new_command, vendor, device;
+		u16 pci_command, new_command;
 		u32 pci_ioaddr;
 
-		if (pcibios_find_class (PCI_CLASS_NETWORK_ETHERNET << 8, pci_index,
-								&pci_bus, &pci_device_fn)
-			!= PCIBIOS_SUCCESSFUL)
-			break;
-		pcibios_read_config_word(pci_bus, pci_device_fn,
-								 PCI_VENDOR_ID, &vendor);
-		pcibios_read_config_word(pci_bus, pci_device_fn,
-								 PCI_DEVICE_ID, &device);
-
 		/* Note: some vendor IDs (RealTek) have non-NE2k cards as well. */
 		for (i = 0; pci_clone_list[i].vendor != 0; i++)
-			if (pci_clone_list[i].vendor == vendor
-				&& pci_clone_list[i].dev_id == device)
+			if (pci_clone_list[i].vendor == pdev->vendor
+				&& pci_clone_list[i].dev_id == pdev->device)
 				break;
 		if (pci_clone_list[i].vendor == 0)
 			continue;
 
-		pcibios_read_config_dword(pci_bus, pci_device_fn,
-								  PCI_BASE_ADDRESS_0, &pci_ioaddr);
-		pcibios_read_config_byte(pci_bus, pci_device_fn,
-								 PCI_INTERRUPT_LINE, &pci_irq_line);
-		pcibios_read_config_word(pci_bus, pci_device_fn,
-								 PCI_COMMAND, &pci_command);
-
-		/* Remove I/O space marker in bit 0. */
-		pci_ioaddr &= PCI_BASE_ADDRESS_IO_MASK;
+		pci_ioaddr = pdev->base_address[0] & PCI_BASE_ADDRESS_IO_MASK;
+		pci_irq_line = pdev->irq;
+		pci_read_config_word(pdev, PCI_COMMAND, &pci_command);
 
 		/* Avoid already found cards from previous calls */
 		if (check_region(pci_ioaddr, NE_IO_EXTENT))
@@ -228,8 +212,7 @@
 			printk(KERN_INFO "  The PCI BIOS has not enabled this"
 				   " NE2k clone!  Updating PCI command %4.4x->%4.4x.\n",
 				   pci_command, new_command);
-			pcibios_write_config_word(pci_bus, pci_device_fn,
-									  PCI_COMMAND, new_command);
+			pci_write_config_word(pdev, PCI_COMMAND, new_command);
 		}
 
 		if (pci_irq_line <= 0 || pci_irq_line >= NR_IRQS)
@@ -252,8 +235,7 @@
 			ne2k_card->next = ne2k_card_list;
 			ne2k_card_list = ne2k_card;
 			ne2k_card->dev = dev;
-			ne2k_card->pci_bus = pci_bus;
-			ne2k_card->pci_device_fn = pci_device_fn;
+			ne2k_card->pci_dev = pdev;
 		}
 		dev = 0;
 
diff -u --recursive --new-file v2.1.106/linux/drivers/net/sdla_fr.c linux/drivers/net/sdla_fr.c
--- v2.1.106/linux/drivers/net/sdla_fr.c	Thu May  7 22:51:50 1998
+++ linux/drivers/net/sdla_fr.c	Wed Jun 24 14:34:44 1998
@@ -53,7 +53,7 @@
 *                  		   This caused the If_send() routine to get into*                                  the if clause for it(0,dev->tbusy) 
 *				   forever.
 *				   The code got into this stage due to an 
-*				   interrupt occuring within the if clause for 
+*				   interrupt occurring within the if clause for 
 *				   set_bit(0,dev->tbusy).  Since an interrupt 
 *				   disables furhter transmit interrupt and 
 * 				   makes dev->tbusy = 0, this effect was undone *                                  by making dev->tbusy = 1 in the if clause.
@@ -1224,7 +1224,7 @@
 }				/* switch_net_numbers */
 
 /*============================================================================
- * Get ethernet-style interface statistics.
+ * Get Ethernet-style interface statistics.
  * Return a pointer to struct enet_statistics.
  */
 
@@ -2158,7 +2158,7 @@
 /****** Firmware Asynchronous Event Handlers ********************************/
 
 /*============================================================================
- * Main asyncronous event/error handler.
+ * Main asynchronous event/error handler.
  *	This routine is called whenever firmware command returns non-zero
  *	return code.
  *
diff -u --recursive --new-file v2.1.106/linux/drivers/net/sdla_ppp.c linux/drivers/net/sdla_ppp.c
--- v2.1.106/linux/drivers/net/sdla_ppp.c	Wed Apr  8 19:36:27 1998
+++ linux/drivers/net/sdla_ppp.c	Wed Jun 24 14:34:44 1998
@@ -841,7 +841,7 @@
 }				/* switch_net_numbers */
 
 /*============================================================================
- * Get ethernet-style interface statistics.
+ * Get Ethernet-style interface statistics.
  * Return a pointer to struct enet_statistics.
  */
 
@@ -2183,7 +2183,7 @@
 {
 	ppp_mbox_t *mb = card->mbox;
 	int err, i;
-	/* The critical flag is unset because during intialization (if_open) 
+	/* The critical flag is unset because during initialization (if_open) 
 	 * we want the interrupts to be enabled so that when the wpp_isr is
 	 * called it does not exit due to critical flag set.
 	 */
diff -u --recursive --new-file v2.1.106/linux/drivers/net/sdla_x25.c linux/drivers/net/sdla_x25.c
--- v2.1.106/linux/drivers/net/sdla_x25.c	Thu May  7 22:51:50 1998
+++ linux/drivers/net/sdla_x25.c	Wed Jun 24 14:34:44 1998
@@ -167,7 +167,7 @@
 static int x25_error (sdla_t* card, int err, int cmd, int lcn);
 
 /* X.25 asynchronous event handlers */
-static int incomming_call (sdla_t* card, int cmd, int lcn, TX25Mbox* mb);
+static int incoming_call (sdla_t* card, int cmd, int lcn, TX25Mbox* mb);
 static int call_accepted (sdla_t* card, int cmd, int lcn, TX25Mbox* mb);
 static int call_cleared (sdla_t* card, int cmd, int lcn, TX25Mbox* mb);
 static int timeout_event (sdla_t* card, int cmd, int lcn, TX25Mbox* mb);
@@ -822,7 +822,7 @@
 }
 
 /*============================================================================
- * Get ethernet-style interface statistics.
+ * Get Ethernet-style interface statistics.
  * Return a pointer to struct net_device_stats
  */
  
@@ -1177,7 +1177,7 @@
 
 		/* If there is a packet queued for transmission then kick
 		 * the channel's send routine. When transmission is complete
-		 * or if error has occured, release socket buffer and reset
+		 * or if error has occurred, release socket buffer and reset
 		 * 'tbusy' flag.
 		 */
 		if (skb && (chan_send(dev, skb) == 0))
@@ -1204,8 +1204,8 @@
 
 /****** SDLA Firmware-Specific Functions *************************************
  * Almost all X.25 commands can unexpetedly fail due to so called 'X.25
- * asynchronous events' such as restart, interrupt, incomming call request,
- * call clear request, etc.  They can't be ignored and have to be delt with
+ * asynchronous events' such as restart, interrupt, incoming call request,
+ * call clear request, etc.  They can't be ignored and have to be dealt with
  * immediately.  To tackle with this problem we execute each interface command
  * in a loop until good return code is received or maximum number of retries
  * is reached.  Each interface command returns non-zero return code, an
@@ -1643,8 +1643,8 @@
 			mb->data[dlen] = '\0';
 			switch (mb->cmd.pktType & 0x7F)
 			{
-				case 0x30:		/* incomming call */
-					retry = incomming_call(card, cmd, lcn, mb);
+				case 0x30:		/* incoming call */
+					retry = incoming_call(card, cmd, lcn, mb);
 					break;
 
 				case 0x31:		/* connected */
@@ -1728,7 +1728,7 @@
  */
 
 /*============================================================================
- * Handle X.25 incomming call request.
+ * Handle X.25 incoming call request.
  *	RFC 1356 establishes the following rules:
  *	1. The first octet in the Call User Data (CUD) field of the call
  *	   request packet contains NLPID identifying protocol encapsulation.
@@ -1736,12 +1736,12 @@
  *	   protocol encapsulation.
  *	3. A diagnostic code 249 defined by ISO/IEC 8208 may be used when
  *	   clearing a call because protocol encapsulation is not supported.
- *	4. If an incomming call is received while a call request is pending
- *	   (i.e. call collision has occured), the incomming call shall be
+ *	4. If an incoming call is received while a call request is pending
+ *	   (i.e. call collision has occurred), the incoming call shall be
  *	   rejected and call request shall be retried.
  */
 
-static int incomming_call (sdla_t* card, int cmd, int lcn, TX25Mbox* mb)
+static int incoming_call (sdla_t* card, int cmd, int lcn, TX25Mbox* mb)
 {
 	wan_device_t* wandev = &card->wandev;
 	int new_lcn = mb->cmd.lcn;
@@ -1754,7 +1754,7 @@
 	if (dev != NULL)
 	{
 		printk(KERN_INFO
-			"%s: X.25 incomming call collision on LCN %d!\n",
+			"%s: X.25 incoming call collision on LCN %d!\n",
 			card->devname, new_lcn);
 		x25_clear_call(card, new_lcn, 0, 0);
 		return 1;
@@ -1764,7 +1764,7 @@
 	if (mb->cmd.qdm & 0x02)
 	{
 		printk(KERN_INFO
-			"%s: X.25 incomming call on LCN %d with D-bit set!\n",
+			"%s: X.25 incoming call on LCN %d with D-bit set!\n",
 			card->devname, new_lcn);
 		x25_clear_call(card, new_lcn, 0, 0);
 		return 1;
@@ -1775,13 +1775,13 @@
 	if (info == NULL)
 	{
 		printk(KERN_ERR
-			"%s: not enough memory to parse X.25 incomming call "
+			"%s: not enough memory to parse X.25 incoming call "
 			"on LCN %d!\n", card->devname, new_lcn);
 		x25_clear_call(card, new_lcn, 0, 0);
 		return 1;
 	}
 	parse_call_info(mb->data, info);
-	printk(KERN_INFO "%s: X.25 incomming call on LCN %d! Call data: %s\n",
+	printk(KERN_INFO "%s: X.25 incoming call on LCN %d! Call data: %s\n",
 		card->devname, new_lcn, mb->data);
 
 	/* Find available channel */
@@ -1793,7 +1793,7 @@
 			continue;
 		if (strcmp(info->src, chan->addr) == 0)
 			break;
-	        /* If just an '@' is specified, accept all incomming calls */
+	        /* If just an '@' is specified, accept all incoming calls */
 	        if (strcmp(chan->addr, "") == 0)
 	                break;
 	}
@@ -1809,7 +1809,7 @@
 	else if (info->nuser == 0)
 	{
 		printk(KERN_INFO
-			"%s: no user data in incomming call on LCN %d!\n",
+			"%s: no user data in incoming call on LCN %d!\n",
 			card->devname, new_lcn);
 		x25_clear_call(card, new_lcn, 0, 0);
 	}
@@ -1831,7 +1831,7 @@
 			break;
 		default:
 			printk(KERN_INFO
-				"%s: unsupported NLPID 0x%02X in incomming call "
+				"%s: unsupported NLPID 0x%02X in incoming call "
 				"on LCN %d!\n", card->devname, info->user[0], new_lcn);
 			x25_clear_call(card, new_lcn, 0, 249);
 	}
diff -u --recursive --new-file v2.1.106/linux/drivers/net/sdladrv.c linux/drivers/net/sdladrv.c
--- v2.1.106/linux/drivers/net/sdladrv.c	Thu Mar 26 15:57:03 1998
+++ linux/drivers/net/sdladrv.c	Wed Jun 24 14:34:44 1998
@@ -495,7 +495,7 @@
 }
 
 /*============================================================================
- * Map shared memory window into SDLA adress space.
+ * Map shared memory window into SDLA address space.
  */
 
 EXPORT_SYMBOL(sdla_mapmem);
diff -u --recursive --new-file v2.1.106/linux/drivers/net/sktr.c linux/drivers/net/sktr.c
--- v2.1.106/linux/drivers/net/sktr.c	Wed Dec 31 16:00:00 1969
+++ linux/drivers/net/sktr.c	Wed Jun 24 14:26:13 1998
@@ -0,0 +1,2696 @@
+/*
+ *  sktr.c: A network driver for the SysKonnect Token Ring ISA/PCI Adapters.
+ *
+ *  Written 1997 by Christoph Goos
+ *
+ *  A fine result of the Linux Systems Network Architecture Project.
+ *  http://samba.anu.edu.au/linux-sna/
+ *
+ *  This software may be used and distributed according to the terms
+ *  of the GNU Public License, incorporated herein by reference.
+ *
+ *  This device driver works with the following SysKonnect adapters:
+ *	- SysKonnect TR4/16(+) ISA	(SK-4190)
+ *	- SysKonnect TR4/16(+) PCI	(SK-4590)
+ *	- SysKonnect TR4/16 PCI		(SK-4591)
+ *
+ *  Sources:
+ *  	- The hardware related parts of this driver are take from
+ *  	  the SysKonnect Token Ring driver for Windows NT.
+ *  	- I used the IBM Token Ring driver 'ibmtr.c' as a base for this
+ *  	  driver, as well as the 'skeleton.c' driver by Donald Becker.
+ *  	- Also various other drivers in the linux source tree were taken
+ *  	  as samples for some tasks.
+ *
+ *  Maintainer(s):
+ *    JS        Jay Schulist            jschlst@samba.anu.edu.au
+ *    CG	Christoph Goos		cgoos@syskonnect.de
+ *
+ *  Modification History:
+ *	29-Aug-97	CG	Created
+ *	04-Apr-98	CG	Fixed problems caused by tok_timer_check
+ *	10-Apr-98	CG	Fixed lockups at cable disconnection
+ *	27-May-98	JS	Formated to Linux Kernel Format
+ *	31-May-98	JS	Hacked in PCI support
+ *	16-Jun-98	JS	Modulized for multiple cards with one driver
+ *
+ *  To do:
+ *    1. Selectable 16 Mbps or 4Mbps
+ *    2. Multi/Broadcast packet handling
+ *
+ */
+
+static const char *version = "sktr.c: v1.01 08/29/97 by Christoph Goos\n";
+
+#include <linux/config.h>
+#ifdef MODULE
+#include <linux/module.h>
+#include <linux/version.h>
+#endif
+
+#include <linux/kernel.h>
+#include <linux/sched.h>
+#include <linux/types.h>
+#include <linux/fcntl.h>
+#include <linux/interrupt.h>
+#include <linux/ptrace.h>
+#include <linux/ioport.h>
+#include <linux/in.h>
+#include <linux/malloc.h>
+#include <linux/string.h>
+#include <linux/time.h>
+#include <asm/system.h>
+#include <asm/bitops.h>
+#include <asm/io.h>
+#include <asm/dma.h>
+#include <asm/irq.h>
+#include <linux/errno.h>
+#include <linux/init.h>
+#include <linux/pci.h>
+
+#include <linux/netdevice.h>
+#include <linux/etherdevice.h>
+#include <linux/skbuff.h>
+#include <linux/trdevice.h>
+
+#include "sktr.h"		/* Our Stuff */
+#include "sktr_firmware.h"	/* SysKonnect adapter firmware */
+
+/* A zero-terminated list of I/O addresses to be probed. */
+static unsigned int sktr_portlist[] __initdata = {
+	0x0A20, 0x1A20, 0x0B20, 0x1B20, 0x0980, 0x1980, 0x0900, 0x1900,
+	0
+};
+
+/* A zero-terminated list of IRQs to be probed. 
+ * Used again after initial probe for sktr_chipset_init, called from sktr_open.
+ */
+static unsigned short sktr_irqlist[] = {
+	3, 5, 9, 10, 11, 12, 15,
+	0
+};
+
+/* A zero-terminated list of DMAs to be probed. */
+static int sktr_dmalist[] __initdata = {
+	5, 6, 7,
+	0
+};
+
+/* Card names */
+static char *pci_cardname = "SK NET TR 4/16 PCI\0";
+static char *isa_cardname = "SK NET TR 4/16 ISA\0";
+static char *AdapterName;
+
+/* Use 0 for production, 1 for verification, 2 for debug, and
+ * 3 for very verbose debug.
+ */
+#ifndef SKTR_DEBUG
+#define SKTR_DEBUG 1
+#endif
+static unsigned int sktr_debug = SKTR_DEBUG;
+
+/* The number of low I/O ports used by the tokencard. */
+#define SKTR_IO_EXTENT 32
+
+/* Index to functions, as function prototypes.
+ * Alphabetical by function name.
+ */
+
+/* "B" */
+static int      sktr_bringup_diags(struct device *dev);
+/* "C" */
+static void	sktr_cancel_tx_queue(struct net_local* tp);
+static int 	sktr_chipset_init(struct device *dev);
+static void 	sktr_chk_irq(struct device *dev);
+static unsigned char sktr_chk_frame(struct device *dev, unsigned char *Addr);
+static void 	sktr_chk_outstanding_cmds(struct device *dev);
+static void 	sktr_chk_src_addr(unsigned char *frame, unsigned char *hw_addr);
+static unsigned char sktr_chk_ssb(struct net_local *tp, unsigned short IrqType);
+static int 	sktr_close(struct device *dev);
+static void 	sktr_cmd_status_irq(struct device *dev);
+/* "D" */
+static void 	sktr_disable_interrupts(struct device *dev);
+static void 	sktr_dump(unsigned char *Data, int length);
+/* "E" */
+static void 	sktr_enable_interrupts(struct device *dev);
+static void 	sktr_exec_cmd(struct device *dev, unsigned short Command);
+static void 	sktr_exec_sifcmd(struct device *dev, unsigned int WriteValue);
+/* "F" */
+static unsigned char *sktr_fix_srouting(unsigned char *buf, short *FrameLen);
+/* "G" */
+static struct enet_statistics *sktr_get_stats(struct device *dev);
+/* "H" */
+static void 	sktr_hardware_send_packet(struct device *dev,
+			struct net_local* tp);
+/* "I" */
+static int 	sktr_init_adapter(struct device *dev);
+static int 	sktr_init_card(struct device *dev);
+static void 	sktr_init_ipb(struct net_local *tp);
+static void 	sktr_init_net_local(struct device *dev);
+static void 	sktr_init_opb(struct net_local *tp);
+static void 	sktr_interrupt(int irq, void *dev_id, struct pt_regs *regs);
+static int 	sktr_isa_chk_card(struct device *dev, int ioaddr);
+static int      sktr_isa_chk_ioaddr(int ioaddr);
+/* "O" */
+static int 	sktr_open(struct device *dev);
+static void	sktr_open_adapter(struct device *dev);
+/* "P" */
+static int 	sktr_pci_chk_card(struct device *dev);
+int 		sktr_probe(struct device *dev);
+static int 	sktr_probe1(struct device *dev, int ioaddr);
+/* "R" */
+static void 	sktr_rcv_status_irq(struct device *dev);
+static void 	sktr_read_addr(struct device *dev, unsigned char *Address);
+static void 	sktr_read_ptr(struct device *dev);
+static void 	sktr_read_ram(struct device *dev, unsigned char *Data,
+			unsigned short Address, int Length);
+static int 	sktr_reset_adapter(struct device *dev);
+static void 	sktr_reset_interrupt(struct device *dev);
+static void 	sktr_ring_status_irq(struct device *dev);
+/* "S" */
+static int 	sktr_send_packet(struct sk_buff *skb, struct device *dev);
+static void 	sktr_set_multicast_list(struct device *dev);
+/* "T" */
+static void 	sktr_timer_chk(unsigned long data);
+static void 	sktr_timer_end_wait(unsigned long data);
+static void 	sktr_tx_status_irq(struct device *dev);
+/* "U" */
+static void 	sktr_update_rcv_stats(struct net_local *tp,
+			unsigned char DataPtr[], unsigned int Length);
+/* "W" */
+static void 	sktr_wait(unsigned long time);
+static void 	sktr_write_rpl_status(RPL *rpl, unsigned int Status);
+static void 	sktr_write_tpl_status(TPL *tpl, unsigned int Status);
+
+/*
+ * Check for a network adapter 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.
+ */
+__initfunc(int sktr_probe(struct device *dev))
+{
+	int i;
+	int base_addr = dev ? dev->base_addr : 0;
+
+	if(base_addr > 0x1ff)    /* Check a single specified location. */
+		return (sktr_probe1(dev, base_addr));
+	else if(base_addr != 0)  /* Don't probe at all. */
+		return (-ENXIO);
+
+	for(i = 0; sktr_portlist[i]; i++)
+	{
+		int ioaddr = sktr_portlist[i];
+		if(check_region(ioaddr, SKTR_IO_EXTENT))
+			continue;
+		if(sktr_probe1(dev, ioaddr))
+		{
+#ifndef MODULE
+                        tr_freedev(dev);
+#endif
+                }
+		else
+			return (0);
+	}
+
+	return (-ENODEV);
+}
+
+/*
+ * Detect and setup the PCI SysKonnect TR cards in slot order.
+ */
+__initfunc(static int sktr_pci_chk_card(struct device *dev))
+{
+	static int pci_index = 0;
+	unsigned char pci_bus, pci_device_fn;
+
+	if(!pci_present())
+		return (-1);	/* No PCI present. */
+
+	for(; pci_index < 0xff; pci_index++)
+	{
+		unsigned int pci_irq_line;
+		struct pci_dev *pdev;
+		unsigned short pci_command, new_command, vendor, device;
+		unsigned int pci_ioaddr;
+
+		if(pcibios_find_class(PCI_CLASS_NETWORK_TOKEN_RING << 8,
+			pci_index, &pci_bus, &pci_device_fn)
+			!= PCIBIOS_SUCCESSFUL)
+		{
+			break;
+		}
+
+		pcibios_read_config_word(pci_bus, pci_device_fn,
+						PCI_VENDOR_ID, &vendor);
+		pcibios_read_config_word(pci_bus, pci_device_fn,
+						PCI_DEVICE_ID, &device);
+
+		pdev		= pci_find_slot(pci_bus, pci_device_fn);
+		pci_irq_line 	= pdev->irq;
+		pci_ioaddr 	= pdev->base_address[0];
+
+		pcibios_read_config_word(pci_bus, pci_device_fn,
+						PCI_COMMAND, &pci_command);
+
+		/* Remove I/O space marker in bit 0. */
+		pci_ioaddr &= ~3;
+
+		if(vendor != PCI_VENDOR_ID_SK)
+			continue;
+		if(device != PCI_DEVICE_ID_SK_TR)
+			continue;
+		if(check_region(pci_ioaddr, SKTR_IO_EXTENT))
+			continue;
+		request_region(pci_ioaddr, SKTR_IO_EXTENT, pci_cardname);
+		if(request_irq(pdev->irq, sktr_interrupt, SA_SHIRQ,
+				pci_cardname, dev))
+			return (-ENODEV); /* continue; ?? */
+
+		AdapterName = pci_cardname;
+
+		new_command = (pci_command|PCI_COMMAND_MASTER|PCI_COMMAND_IO);
+
+		if(pci_command != new_command)
+		{
+			printk("The PCI BIOS has not enabled this"
+				"device! Updating PCI command %4.4x->%4.4x.\n",
+			  	pci_command, new_command);
+			pcibios_write_config_word(pci_bus, pci_device_fn,
+				PCI_COMMAND, new_command);
+		}
+
+		/* At this point we have found a valid PCI TR card. */
+		dev->base_addr	= pci_ioaddr;
+		dev->irq 	= pci_irq_line;
+		dev->dma	= 0;
+
+		printk("%s: %s found at %#4x, using IRQ %d.\n",
+			dev->name, AdapterName, pci_ioaddr, dev->irq);
+
+		return (0);
+	}
+
+	return (-1);
+}
+
+/*
+ * Detect and setup the ISA SysKonnect TR cards.
+ */
+__initfunc(static int sktr_isa_chk_card(struct device *dev, int ioaddr))
+{
+	int i, err;
+
+	err = sktr_isa_chk_ioaddr(ioaddr);
+	if(err < 0)
+		return (-ENODEV);
+
+        if(virt_to_bus((void*)((unsigned long)dev->priv+sizeof(struct net_local)))
+		> ISA_MAX_ADDRESS)
+        {
+                printk("%s: Memory not accessible for DMA\n", dev->name);
+                kfree(dev->priv);
+                return (-EAGAIN);
+        }
+
+	AdapterName = isa_cardname;
+
+        /* Grab the region so that no one else tries to probe our ioports. */
+        request_region(ioaddr, SKTR_IO_EXTENT, AdapterName);
+        dev->base_addr = ioaddr;
+
+        /* Autoselect IRQ and DMA if dev->irq == 0 */
+        if(dev->irq == 0)
+        {
+                for(i = 0; sktr_irqlist[i] != 0; i++)
+                {
+                        dev->irq = sktr_irqlist[i];
+                        err = request_irq(dev->irq, &sktr_interrupt, 0, AdapterName, dev);
+                        if(!err)
+				break;
+                }
+
+                if(sktr_irqlist[i] == 0)
+                {
+                        printk("%s: AutoSelect no IRQ available\n", dev->name);
+                        return (-EAGAIN);
+                }
+        }
+        else
+        {
+                err = request_irq(dev->irq, &sktr_interrupt, 0, AdapterName, dev);
+		if(err)
+                {
+                        printk("%s: Selected IRQ not available\n", dev->name);
+                        return (-EAGAIN);
+                }
+        }
+
+        /* Always allocate the DMA channel after IRQ and clean up on failure */
+        if(dev->dma == 0)
+        {
+                for(i = 0; sktr_dmalist[i] != 0; i++)
+                {
+			dev->dma = sktr_dmalist[i];
+                        err = request_dma(dev->dma, AdapterName);
+                        if(!err)
+                                break;
+                }
+
+                if(dev->dma == 0)
+                {
+                        printk("%s: AutoSelect no DMA available\n", dev->name);
+                        free_irq(dev->irq, NULL);
+                        return (-EAGAIN);
+                }
+        }
+        else
+        {
+                err = request_dma(dev->dma, AdapterName);
+                if(err)
+                {
+                        printk("%s: Selected DMA not available\n", dev->name);
+                        free_irq(dev->irq, NULL);
+                        return (-EAGAIN);
+                }
+        }
+
+	disable_dma(dev->dma);
+        set_dma_mode(dev->dma, DMA_MODE_CASCADE);
+        enable_dma(dev->dma);
+
+	printk("%s: %s found at %#4x, using IRQ %d and DMA %d.\n",
+                dev->name, AdapterName, ioaddr, dev->irq, dev->dma);
+
+	return (0);
+}
+
+__initfunc(static int sktr_probe1(struct device *dev, int ioaddr))
+{
+	static unsigned version_printed = 0;
+	struct net_local *tp;
+	int err;
+
+	if(sktr_debug && version_printed++ == 0)
+		printk("%s", version);
+
+#ifndef MODULE
+	dev = init_trdev(dev, 0);
+	if(dev == NULL)
+		return (-ENOMEM);
+#endif
+
+	err = sktr_pci_chk_card(dev);
+	if(err < 0)
+	{
+		err = sktr_isa_chk_card(dev, ioaddr);
+		if(err < 0)
+			return (-ENODEV);
+	}
+
+	/* Setup this devices private information structure */
+	tp = (struct net_local *)kmalloc(sizeof(struct net_local), GFP_KERNEL | GFP_DMA);
+	if(tp == NULL)
+		return (-ENOMEM);
+	memset(tp, 0, sizeof(struct net_local));
+
+	dev->priv		= tp;
+	dev->init               = sktr_init_card;
+        dev->open               = sktr_open;
+        dev->stop               = sktr_close;
+        dev->hard_start_xmit    = sktr_send_packet;
+        dev->get_stats          = sktr_get_stats;
+        dev->set_multicast_list = &sktr_set_multicast_list;
+
+        return (0);
+}
+
+/* Dummy function */
+__initfunc(static int sktr_init_card(struct device *dev))
+{
+	if(sktr_debug > 3)
+		printk("%s: sktr_init_card\n", dev->name);
+
+	return (0);
+}
+
+/*
+ * This function tests if an adapter is really installed at the
+ * given I/O address. Return negative if no adapter at IO addr.
+ */
+__initfunc(static int sktr_isa_chk_ioaddr(int ioaddr))
+{
+	unsigned char old, chk1, chk2;
+
+	old = inb(ioaddr + SIFADR);	/* Get the old SIFADR value */
+
+	chk1 = 0;	/* Begin with check value 0 */
+	do {
+		/* Write new SIFADR value */
+		outb(chk1, ioaddr + SIFADR);
+
+		/* Read, invert and write */
+		chk2 = inb(ioaddr + SIFADD);
+		chk2 ^= 0x0FE;
+		outb(chk2, ioaddr + SIFADR);
+
+		/* Read, invert and compare */
+		chk2 = inb(ioaddr + SIFADD);
+		chk2 ^= 0x0FE;
+
+		if(chk1 != chk2)
+			return (-1);	/* No adapter */
+
+		chk1 -= 2;
+	} while(chk1 != 0);	/* Repeat 128 times (all byte values) */
+
+    	/* Restore the SIFADR value */
+	outb(old, ioaddr + SIFADR);
+
+	return (0);
+}
+
+/*
+ * Open/initialize the board. This is called sometime after
+ * booting when the 'ifconfig' program is run.
+ *
+ * This routine should set everything up anew at each open, even
+ * registers that "should" only need to be set once at boot, so that
+ * there is non-reboot way to recover if something goes wrong.
+ */
+static int sktr_open(struct device *dev)
+{
+	struct net_local *tp = (struct net_local *)dev->priv;
+	int err;
+
+	/* Reset the hardware here. Don't forget to set the station address. */
+	err = sktr_chipset_init(dev);
+	if(err)
+	{
+		printk(KERN_INFO "%s: Chipset initialization error\n", 
+			dev->name);
+		return (-1);
+	}
+
+	dev->addr_len = 6;
+	sktr_read_addr(dev, (unsigned char*)dev->dev_addr);
+
+	init_timer(&tp->timer);
+	tp->timer.expires	= jiffies + 30*HZ;
+	tp->timer.function	= sktr_timer_end_wait;
+	tp->timer.data		= (unsigned long)dev;
+	tp->timer.next		= NULL;
+	tp->timer.prev		= NULL;
+	add_timer(&tp->timer);
+
+	sktr_read_ptr(dev);
+	sktr_enable_interrupts(dev);
+	sktr_open_adapter(dev);
+
+	dev->tbusy = 0;
+	dev->interrupt = 0;
+	dev->start = 0;
+
+	/* Wait for interrupt from hardware. If interrupt does not come,
+	 * there will be a timeout from the timer.
+	 */
+	tp->Sleeping = 1;
+	interruptible_sleep_on(&tp->wait_for_tok_int);
+	del_timer(&tp->timer);
+
+	/* If AdapterVirtOpenFlag is 1, the adapter is now open for use */
+	if(tp->AdapterVirtOpenFlag == 0)
+	{
+		sktr_disable_interrupts(dev);
+		return (-1);
+	}
+
+	dev->start = 1;
+
+	tp->StartTime = jiffies;
+
+	/* Start function control timer */
+	tp->timer.expires	= jiffies + 2*HZ;
+	tp->timer.function	= sktr_timer_chk;
+	tp->timer.data		= (unsigned long)dev;
+	add_timer(&tp->timer);
+
+#ifdef MODULE
+	MOD_INC_USE_COUNT;
+#endif
+
+	return (0);
+}
+
+/*
+ * Timeout function while waiting for event
+ */
+static void sktr_timer_end_wait(unsigned long data)
+{
+	struct device *dev = (struct device*)data;
+	struct net_local *tp = (struct net_local *)dev->priv;
+
+	if(tp->Sleeping)
+	{
+		tp->Sleeping = 0;
+		wake_up_interruptible(&tp->wait_for_tok_int);
+	}
+
+	return;
+}
+
+/*
+ * Initialize the chipset
+ */
+static int sktr_chipset_init(struct device *dev)
+{
+	struct net_local *tp = (struct net_local *)dev->priv;
+	unsigned char PosReg, Tmp;
+	int i, err;
+
+	sktr_init_ipb(tp);
+	sktr_init_opb(tp);
+	sktr_init_net_local(dev);
+
+	/* Set pos register: selects irq and dma channel.
+	 * Only for ISA bus adapters.
+	 */
+	if(dev->dma > 0)
+	{
+		PosReg = 0;
+		for(i = 0; sktr_irqlist[i] != 0; i++)
+		{
+			if(sktr_irqlist[i] == dev->irq)
+				break;
+		}
+
+		/* Choose default cycle time, 500 nsec   */
+		PosReg |= CYCLE_TIME << 2;
+		PosReg |= i << 4;
+		i = dev->dma - 5;
+		PosReg |= i;
+
+		if(tp->DataRate == SPEED_4)
+			PosReg |= LINE_SPEED_BIT;
+		else
+			PosReg &= ~LINE_SPEED_BIT;
+
+		outb(PosReg, dev->base_addr + POSREG);
+		Tmp = inb(dev->base_addr + POSREG);
+		if((Tmp & ~CYCLE_TIME) != (PosReg & ~CYCLE_TIME))
+			printk(KERN_INFO "%s: POSREG error\n", dev->name);
+	}
+
+	err = sktr_reset_adapter(dev);
+	if(err < 0)
+		return (-1);
+
+	err = sktr_bringup_diags(dev);
+	if(err < 0)
+		return (-1);
+
+	err = sktr_init_adapter(dev);
+	if(err < 0)
+		return (-1);
+
+	return (0);
+}
+
+/*
+ * Initializes the net_local structure.
+ */
+static void sktr_init_net_local(struct device *dev)
+{
+	struct net_local *tp = (struct net_local *)dev->priv;
+	int i;
+
+	tp->scb.CMD	= 0;
+	tp->scb.Parm[0] = 0;
+	tp->scb.Parm[1] = 0;
+
+	tp->ssb.STS	= 0;
+	tp->ssb.Parm[0] = 0;
+	tp->ssb.Parm[1] = 0;
+	tp->ssb.Parm[2] = 0;
+
+	tp->CMDqueue	= 0;
+
+	tp->AdapterOpenFlag	= 0;
+	tp->AdapterVirtOpenFlag = 0;
+	tp->ScbInUse		= 0;
+	tp->OpenCommandIssued	= 0;
+	tp->ReOpenInProgress	= 0;
+	tp->HaltInProgress	= 0;
+	tp->TransmitHaltScheduled = 0;
+	tp->LobeWireFaultLogged	= 0;
+	tp->LastOpenStatus	= 0;
+	tp->MaxPacketSize	= DEFAULT_PACKET_SIZE;
+
+	skb_queue_head_init(&tp->SendSkbQueue);
+	tp->QueueSkb = MAX_TX_QUEUE;
+
+	/* Create circular chain of transmit lists */
+	for (i = 0; i < TPL_NUM; i++)
+	{
+		tp->Tpl[i].NextTPLAddr = htonl((unsigned long) virt_to_bus(&tp->Tpl[(i+1) % TPL_NUM]));
+		tp->Tpl[i].Status	= 0;
+		tp->Tpl[i].FrameSize	= 0;
+		tp->Tpl[i].FragList[0].DataCount	= 0;
+		tp->Tpl[i].FragList[0].DataAddr		= 0;
+		tp->Tpl[i].NextTPLPtr	= &tp->Tpl[(i+1) % TPL_NUM];
+		tp->Tpl[i].MData	= NULL;
+		tp->Tpl[i].TPLIndex	= i;
+		tp->Tpl[i].BusyFlag	= 0;
+	}
+
+	tp->TplFree = tp->TplBusy = &tp->Tpl[0];
+
+	/* Create circular chain of receive lists */
+	for (i = 0; i < RPL_NUM; i++)
+	{
+		tp->Rpl[i].NextRPLAddr = htonl((unsigned long) virt_to_bus(&tp->Rpl[(i+1) % RPL_NUM]));
+		tp->Rpl[i].Status = (RX_VALID | RX_START_FRAME | RX_END_FRAME | RX_FRAME_IRQ);
+		tp->Rpl[i].FrameSize = 0;
+		tp->Rpl[i].FragList[0].DataCount = SWAPB(tp->MaxPacketSize);
+
+		/* Alloc skb and point adapter to data area */
+		tp->Rpl[i].Skb = dev_alloc_skb(tp->MaxPacketSize);
+
+		/* skb == NULL ? then use local buffer */
+		if(tp->Rpl[i].Skb == NULL)
+		{
+			tp->Rpl[i].SkbStat = SKB_UNAVAILABLE;
+			tp->Rpl[i].FragList[0].DataAddr = htonl(virt_to_bus(tp->LocalRxBuffers[i]));
+			tp->Rpl[i].MData = tp->LocalRxBuffers[i];
+		}
+		else	/* SKB != NULL */
+		{
+			tp->Rpl[i].Skb->dev = dev;
+			skb_put(tp->Rpl[i].Skb, tp->MaxPacketSize);
+
+			/* data unreachable for DMA ? then use local buffer */
+			if(virt_to_bus(tp->Rpl[i].Skb->data) + tp->MaxPacketSize > ISA_MAX_ADDRESS)
+			{
+				tp->Rpl[i].SkbStat = SKB_DATA_COPY;
+				tp->Rpl[i].FragList[0].DataAddr = htonl(virt_to_bus(tp->LocalRxBuffers[i]));
+				tp->Rpl[i].MData = tp->LocalRxBuffers[i];
+			}
+			else	/* DMA directly in skb->data */
+			{
+				tp->Rpl[i].SkbStat = SKB_DMA_DIRECT;
+				tp->Rpl[i].FragList[0].DataAddr = htonl(virt_to_bus(tp->Rpl[i].Skb->data));
+				tp->Rpl[i].MData = tp->Rpl[i].Skb->data;
+			}
+		}
+
+		tp->Rpl[i].NextRPLPtr = &tp->Rpl[(i+1) % RPL_NUM];
+		tp->Rpl[i].RPLIndex = i;
+	}
+
+	tp->RplHead = &tp->Rpl[0];
+	tp->RplTail = &tp->Rpl[RPL_NUM-1];
+	tp->RplTail->Status = (RX_START_FRAME | RX_END_FRAME | RX_FRAME_IRQ);
+
+	return;
+}
+
+/*
+ * Initializes the initialisation parameter block.
+ */
+static void sktr_init_ipb(struct net_local *tp)
+{
+	tp->ipb.Init_Options	= BURST_MODE;
+	tp->ipb.CMD_Status_IV	= 0;
+	tp->ipb.TX_IV		= 0;
+	tp->ipb.RX_IV		= 0;
+	tp->ipb.Ring_Status_IV	= 0;
+	tp->ipb.SCB_Clear_IV	= 0;
+	tp->ipb.Adapter_CHK_IV	= 0;
+	tp->ipb.RX_Burst_Size	= BURST_SIZE;
+	tp->ipb.TX_Burst_Size	= BURST_SIZE;
+	tp->ipb.DMA_Abort_Thrhld = DMA_RETRIES;
+	tp->ipb.SCB_Addr	= 0;
+	tp->ipb.SSB_Addr	= 0;
+
+	return;
+}
+
+/*
+ * Initializes the open parameter block.
+ */
+static void sktr_init_opb(struct net_local *tp)
+{
+	unsigned long Addr;
+	unsigned short RplSize    = RPL_SIZE;
+	unsigned short TplSize    = TPL_SIZE;
+	unsigned short BufferSize = BUFFER_SIZE;
+
+	tp->ocpl.OPENOptions 	 = 0;
+	tp->ocpl.OPENOptions 	|= ENABLE_FULL_DUPLEX_SELECTION;
+	tp->ocpl.OPENOptions 	|= PAD_ROUTING_FIELD;
+	tp->ocpl.FullDuplex 	 = 0;
+	tp->ocpl.FullDuplex 	|= OPEN_FULL_DUPLEX_OFF;
+
+	/* Fixme: If mac address setable:
+	 * for (i=0; i<LENGTH_OF_ADDRESS; i++)
+	 *	mac->Vam->ocpl.NodeAddr[i] = mac->CurrentAddress[i];
+	 */
+
+	tp->ocpl.GroupAddr	 = 0;
+	tp->ocpl.FunctAddr	 = 0;
+	tp->ocpl.RxListSize	 = SWAPB(RplSize);
+	tp->ocpl.TxListSize	 = SWAPB(TplSize);
+	tp->ocpl.BufSize	 = SWAPB(BufferSize);
+	tp->ocpl.Reserved	 = 0;
+	tp->ocpl.TXBufMin	 = TX_BUF_MIN;
+	tp->ocpl.TXBufMax	 = TX_BUF_MAX;
+
+	Addr = htonl(virt_to_bus(tp->ProductID));
+
+	tp->ocpl.ProdIDAddr[0]	 = LOWORD(Addr);
+	tp->ocpl.ProdIDAddr[1]	 = HIWORD(Addr);
+
+	return;
+}
+
+/*
+ * Send OPEN command to adapter
+ */
+static void sktr_open_adapter(struct device *dev)
+{
+	struct net_local *tp = (struct net_local *)dev->priv;
+
+	if(tp->OpenCommandIssued)
+		return;
+
+	tp->OpenCommandIssued = 1;
+	sktr_exec_cmd(dev, OC_OPEN);
+
+	return;
+}
+
+/*
+ * Clear the adapter's interrupt flag. Clear system interrupt enable
+ * (SINTEN): disable adapter to system interrupts.
+ */
+static void sktr_disable_interrupts(struct device *dev)
+{
+	outb(0, dev->base_addr + SIFACL);
+
+	return;
+}
+
+/*
+ * Set the adapter's interrupt flag. Set system interrupt enable
+ * (SINTEN): enable adapter to system interrupts.
+ */
+static void sktr_enable_interrupts(struct device *dev)
+{
+	outb(ACL_SINTEN, dev->base_addr + SIFACL);
+
+	return;
+}
+
+/*
+ * Put command in command queue, try to execute it.
+ */
+static void sktr_exec_cmd(struct device *dev, unsigned short Command)
+{
+	struct net_local *tp = (struct net_local *)dev->priv;
+
+	tp->CMDqueue |= Command;
+	sktr_chk_outstanding_cmds(dev);
+
+	return;
+}
+
+/*
+ * Linux always gives 18 byte of source routing information in the frame header.
+ * But the length field can indicate shorter length. Then cut header
+ * appropriate.
+ */
+static unsigned char *sktr_fix_srouting(unsigned char *buf, short *FrameLen)
+{
+	struct trh_hdr *trh = (struct trh_hdr *)buf;
+	int len;
+        
+	if(buf[8] & TR_RII)
+	{
+		trh->rcf &= ~SWAPB((unsigned short) TR_RCF_LONGEST_FRAME_MASK);
+		trh->rcf |= SWAPB((unsigned short) TR_RCF_FRAME4K);
+		len = (SWAPB(trh->rcf) & TR_RCF_LEN_MASK) >> 8;
+		if(len < 18)
+		{
+			memcpy(&buf[18-len],buf,sizeof(struct trh_hdr)-18+len);
+			*FrameLen -= (18 - len);
+		}
+		return (&buf[18-len]);
+	}
+
+	return (buf);
+}
+
+/*
+ * Gets skb from system, queues it and checks if it can be sent
+ */
+static int sktr_send_packet(struct sk_buff *skb, struct device *dev)
+{
+	struct net_local *tp = (struct net_local *)dev->priv;
+
+	if(dev->tbusy)
+	{
+		/*
+		 * If we get here, some higher level has decided we are broken.
+		 * There should really be a "kick me" function call instead.
+		 *
+		 * Resetting the token ring adapter takes a long time so just
+		 * fake transmission time and go on trying. Our own timeout
+		 * routine is in sktr_timer_chk()
+		 */
+		dev->tbusy 	 = 0;
+		dev->trans_start = jiffies;
+		return (1);
+	}
+
+	/*
+	 * If some higher layer thinks we've missed an tx-done interrupt we
+	 * are passed NULL.
+	 */
+	if(skb == NULL)
+		return (0);
+
+	/*
+	 * Block a timer-based transmit from overlapping. This could better be
+	 * done with atomic_swap(1, dev->tbusy), but set_bit() works as well.
+	 */
+	if(test_and_set_bit(0, (void*)&dev->tbusy) != 0)
+	{
+		printk("%s: Transmitter access conflict.\n", dev->name);
+		return (1);
+	}
+
+	if(tp->QueueSkb == 0)
+		return (1);	/* Return with tbusy set: queue full */
+
+	tp->QueueSkb--;
+	skb_queue_tail(&tp->SendSkbQueue, skb);
+	sktr_hardware_send_packet(dev, tp);
+	if(tp->QueueSkb > 0)
+		dev->tbusy = 0;
+
+	return (0);
+}
+
+/*
+ * Move frames from internal skb queue into adapter tx queue
+ */
+static void sktr_hardware_send_packet(struct device *dev, struct net_local* tp)
+{
+	TPL *tpl;
+	short length;
+	unsigned char *buf, *newbuf;
+	struct sk_buff *skb;
+	int i;
+    
+	for(;;)
+	{
+		/* Try to get a free TPL from the chain.
+		 *
+		 * NOTE: We *must* always leave one unused TPL in the chain, 
+		 * because otherwise the adapter might send frames twice.
+		 */
+		if(tp->TplFree->NextTPLPtr->BusyFlag)	/* No free TPL */
+		{
+			printk(KERN_INFO "%s: No free TPL\n", dev->name);
+			return;
+		}
+
+		/* Send first buffer from queue */
+		skb = skb_dequeue(&tp->SendSkbQueue);
+		if(skb == NULL)
+			return;
+
+		tp->QueueSkb++;
+		/* Is buffer reachable for Busmaster-DMA? */
+		if(virt_to_bus((void*)(((long) skb->data) + skb->len))
+			> ISA_MAX_ADDRESS)
+		{
+			/* Copy frame to local buffer */
+			i 	= tp->TplFree->TPLIndex;
+			length 	= skb->len;
+			buf 	= tp->LocalTxBuffers[i];
+			memcpy(buf, skb->data, length);
+			newbuf 	= sktr_fix_srouting(buf, &length);
+		}
+		else
+		{
+			/* Send direct from skb->data */
+			length = skb->len;
+			newbuf = sktr_fix_srouting(skb->data, &length);
+		}
+
+		/* Source address in packet? */
+		sktr_chk_src_addr(newbuf, dev->dev_addr);
+
+		tp->LastSendTime	= jiffies;
+		tpl 			= tp->TplFree;	/* Get the "free" TPL */
+		tpl->BusyFlag 		= 1;		/* Mark TPL as busy */
+		tp->TplFree 		= tpl->NextTPLPtr;
+    
+		/* Save the skb for delayed return of skb to system */
+		tpl->Skb = skb;
+		tpl->FragList[0].DataCount = (unsigned short) SWAPB(length);
+		tpl->FragList[0].DataAddr  = htonl(virt_to_bus(newbuf));
+
+		/* Write the data length in the transmit list. */
+		tpl->FrameSize 	= (unsigned short) SWAPB(length);
+		tpl->MData 	= newbuf;
+
+		/* Transmit the frame and set the status values. */
+		sktr_write_tpl_status(tpl, TX_VALID | TX_START_FRAME
+					| TX_END_FRAME | TX_PASS_SRC_ADDR
+					| TX_FRAME_IRQ);
+
+		/* Let adapter send the frame. */
+		sktr_exec_sifcmd(dev, CMD_TX_VALID);
+	}
+
+	return;
+}
+
+/*
+ * Write the given value to the 'Status' field of the specified TPL.
+ * NOTE: This function should be used whenever the status of any TPL must be
+ * modified by the driver, because the compiler may otherwise change the
+ * order of instructions such that writing the TPL status may be executed at
+ * an undesireable time. When this function is used, the status is always
+ * written when the function is called.
+ */
+static void sktr_write_tpl_status(TPL *tpl, unsigned int Status)
+{
+	tpl->Status = Status;
+}
+
+static void sktr_chk_src_addr(unsigned char *frame, unsigned char *hw_addr)
+{
+	unsigned char SRBit;
+
+	if((((unsigned long)frame[8]) & ~0x80) != 0)	/* Compare 4 bytes */
+		return;
+	if((unsigned short)frame[12] != 0)		/* Compare 2 bytes */
+		return;
+
+	SRBit = frame[8] & 0x80;
+	memcpy(&frame[8], hw_addr, 6);
+	frame[8] |= SRBit;
+
+	return;
+}
+
+/*
+ * The timer routine: Check if adapter still open and working, reopen if not. 
+ */
+static void sktr_timer_chk(unsigned long data)
+{
+	struct device *dev = (struct device*)data;
+	struct net_local *tp = (struct net_local*)dev->priv;
+
+	if(tp->HaltInProgress)
+		return;
+
+	sktr_chk_outstanding_cmds(dev);
+	if(tp->LastSendTime + SEND_TIMEOUT < jiffies
+		&& (tp->QueueSkb < MAX_TX_QUEUE || tp->TplFree != tp->TplBusy))
+	{
+		/* Anything to send, but stalled to long */
+		tp->LastSendTime = jiffies;
+		sktr_exec_cmd(dev, OC_CLOSE);	/* Does reopen automatically */
+	}
+
+	tp->timer.expires = jiffies + 2*HZ;
+	add_timer(&tp->timer);
+
+	if(tp->AdapterOpenFlag || tp->ReOpenInProgress)
+		return;
+	tp->ReOpenInProgress = 1;
+	sktr_open_adapter(dev);
+
+	return;
+}
+
+/*
+ * The typical workload of the driver: Handle the network interface interrupts.
+ */
+static void sktr_interrupt(int irq, void *dev_id, struct pt_regs *regs)
+{
+	struct device *dev = dev_id;
+	struct net_local *tp;
+	int ioaddr;
+	unsigned short irq_type;
+
+	if(dev == NULL)
+	{
+		printk("%s: irq %d for unknown device.\n", dev->name, irq);
+		return;
+	}
+
+	dev->interrupt = 1;
+
+	ioaddr = dev->base_addr;
+	tp = (struct net_local *)dev->priv;
+
+	irq_type = inw(ioaddr + SIFSTS);
+
+	while(irq_type & STS_SYSTEM_IRQ)
+	{
+		irq_type &= STS_IRQ_MASK;
+
+		if(!sktr_chk_ssb(tp, irq_type))
+		{
+			printk(KERN_INFO "%s: DATA LATE occured\n", dev->name);
+			break;
+		}
+
+		switch(irq_type)
+		{
+			case STS_IRQ_RECEIVE_STATUS:
+				sktr_reset_interrupt(dev);
+				sktr_rcv_status_irq(dev);
+				break;
+
+			case STS_IRQ_TRANSMIT_STATUS:
+				/* Check if TRANSMIT.HALT command is complete */
+				if(tp->ssb.Parm[0] & COMMAND_COMPLETE)
+				{
+					tp->TransmitCommandActive = 0;
+					tp->TransmitHaltScheduled = 0;
+
+					/* Issue a new transmit command. */
+					sktr_exec_cmd(dev, OC_TRANSMIT);
+				}
+
+				sktr_reset_interrupt(dev);
+				sktr_tx_status_irq(dev);
+				break;
+
+			case STS_IRQ_COMMAND_STATUS:
+				/* The SSB contains status of last command
+				 * other than receive/transmit.
+				 */
+				sktr_cmd_status_irq(dev);
+				break;
+
+			case STS_IRQ_SCB_CLEAR:
+				/* The SCB is free for another command. */
+				tp->ScbInUse = 0;
+				sktr_chk_outstanding_cmds(dev);
+				break;
+
+			case STS_IRQ_RING_STATUS:
+				sktr_ring_status_irq(dev);
+				break;
+
+			case STS_IRQ_ADAPTER_CHECK:
+				sktr_chk_irq(dev);
+				break;
+
+			default:
+				printk(KERN_INFO "Unknown Token Ring IRQ\n");
+				break;
+		}
+
+		/* Reset system interrupt if not already done. */
+		if(irq_type != STS_IRQ_TRANSMIT_STATUS
+			&& irq_type != STS_IRQ_RECEIVE_STATUS)
+		{
+			sktr_reset_interrupt(dev);
+		}
+
+		irq_type = inw(ioaddr + SIFSTS);
+	}
+
+	dev->interrupt = 0;
+
+	return;
+}
+
+/*
+ *  Reset the INTERRUPT SYSTEM bit and issue SSB CLEAR command.
+ */
+static void sktr_reset_interrupt(struct device *dev)
+{
+	struct net_local *tp = (struct net_local *)dev->priv;
+	SSB *ssb = &tp->ssb;
+
+	/*
+	 * [Workaround for "Data Late"]
+	 * Set all fields of the SSB to well-defined values so we can
+	 * check if the adapter has written the SSB.
+	 */
+
+	ssb->STS	= (unsigned short) -1;
+	ssb->Parm[0] 	= (unsigned short) -1;
+	ssb->Parm[1] 	= (unsigned short) -1;
+	ssb->Parm[2] 	= (unsigned short) -1;
+
+	/* Free SSB by issuing SSB_CLEAR command after reading IRQ code
+	 * and clear STS_SYSTEM_IRQ bit: enable adapter for further interrupts.
+	 */
+	sktr_exec_sifcmd(dev, CMD_SSB_CLEAR | CMD_CLEAR_SYSTEM_IRQ);
+
+	return;
+}
+
+/*
+ * Check if the SSB has actually been written by the adapter.
+ */
+static unsigned char sktr_chk_ssb(struct net_local *tp, unsigned short IrqType)
+{
+	SSB *ssb = &tp->ssb;	/* The address of the SSB. */
+
+	/* C 0 1 2 INTERRUPT CODE
+	 * - - - - --------------
+	 * 1 1 1 1 TRANSMIT STATUS
+	 * 1 1 1 1 RECEIVE STATUS
+	 * 1 ? ? 0 COMMAND STATUS
+	 * 0 0 0 0 SCB CLEAR
+	 * 1 1 0 0 RING STATUS
+	 * 0 0 0 0 ADAPTER CHECK
+	 *
+	 * 0 = SSB field not affected by interrupt
+	 * 1 = SSB field is affected by interrupt
+	 *
+	 * C = SSB ADDRESS +0: COMMAND
+	 * 0 = SSB ADDRESS +2: STATUS 0
+	 * 1 = SSB ADDRESS +4: STATUS 1
+	 * 2 = SSB ADDRESS +6: STATUS 2
+	 */
+
+	/* Check if this interrupt does use the SSB. */
+
+	if(IrqType != STS_IRQ_TRANSMIT_STATUS
+		&& IrqType != STS_IRQ_RECEIVE_STATUS
+		&& IrqType != STS_IRQ_COMMAND_STATUS
+		&& IrqType != STS_IRQ_RING_STATUS)
+	{
+		return (1);	/* SSB not involved. */
+	}
+
+	/* Note: All fields of the SSB have been set to all ones (-1) after it
+	 * has last been used by the software (see DriverIsr()).
+	 *
+	 * Check if the affected SSB fields are still unchanged.
+	 */
+
+	if(ssb->STS == (unsigned short) -1)
+		return (0);	/* Command field not yet available. */
+	if(IrqType == STS_IRQ_COMMAND_STATUS)
+		return (1);	/* Status fields not always affected. */
+	if(ssb->Parm[0] == (unsigned short) -1)
+		return (0);	/* Status 1 field not yet available. */
+	if(IrqType == STS_IRQ_RING_STATUS)
+		return (1);	/* Status 2 & 3 fields not affected. */
+
+	/* Note: At this point, the interrupt is either TRANSMIT or RECEIVE. */
+	if(ssb->Parm[1] == (unsigned short) -1)
+		return (0);	/* Status 2 field not yet available. */
+	if(ssb->Parm[2] == (unsigned short) -1)
+		return (0);	/* Status 3 field not yet available. */
+
+	return (1);	/* All SSB fields have been written by the adapter. */
+}
+
+/*
+ * Evaluates the command results status in the SSB status field.
+ */
+static void sktr_cmd_status_irq(struct device *dev)
+{
+	struct net_local *tp = (struct net_local *)dev->priv;
+	unsigned short ssb_cmd, ssb_parm_0;
+	unsigned short ssb_parm_1;
+	char *open_err = "Open error -";
+	char *code_err = "Open code -";
+
+	/* Copy the ssb values to local variables */
+	ssb_cmd    = tp->ssb.STS;
+	ssb_parm_0 = tp->ssb.Parm[0];
+	ssb_parm_1 = tp->ssb.Parm[1];
+
+	if(ssb_cmd == OPEN)
+	{
+		tp->Sleeping = 0;
+		if(!tp->ReOpenInProgress)
+	    		wake_up_interruptible(&tp->wait_for_tok_int);
+
+		tp->OpenCommandIssued = 0;
+		tp->ScbInUse = 0;
+
+		if((ssb_parm_0 & 0x00FF) == GOOD_COMPLETION)
+		{
+			/* Success, the adapter is open. */
+			tp->LobeWireFaultLogged	= 0;
+			tp->AdapterOpenFlag 	= 1;
+			tp->AdapterVirtOpenFlag = 1;
+			tp->TransmitCommandActive = 0;
+			sktr_exec_cmd(dev, OC_TRANSMIT);
+			sktr_exec_cmd(dev, OC_RECEIVE);
+
+			if(tp->ReOpenInProgress)
+				tp->ReOpenInProgress = 0;
+
+			return;
+		}
+		else 	/* The adapter did not open. */
+		{
+	    		if(ssb_parm_0 & NODE_ADDR_ERROR)
+				printk(KERN_INFO "%s: Node address error\n",
+					dev->name);
+	    		if(ssb_parm_0 & LIST_SIZE_ERROR)
+				printk(KERN_INFO "%s: List size error\n",
+					dev->name);
+	    		if(ssb_parm_0 & BUF_SIZE_ERROR)
+				printk(KERN_INFO "%s: Buffer size error\n",
+					dev->name);
+	    		if(ssb_parm_0 & TX_BUF_COUNT_ERROR)
+				printk(KERN_INFO "%s: Tx buffer count error\n",
+					dev->name);
+	    		if(ssb_parm_0 & INVALID_OPEN_OPTION)
+				printk(KERN_INFO "%s: Invalid open option\n",
+					dev->name);
+	    		if(ssb_parm_0 & OPEN_ERROR)
+			{
+				/* Show the open phase. */
+				switch(ssb_parm_0 & OPEN_PHASES_MASK)
+				{
+					case LOBE_MEDIA_TEST:
+						if(!tp->LobeWireFaultLogged)
+						{
+							tp->LobeWireFaultLogged = 1;
+							printk(KERN_INFO "%s: %s Lobe wire fault (check cable !).\n", dev->name, open_err);
+		    				}
+						tp->ReOpenInProgress	= 1;
+						tp->AdapterOpenFlag 	= 0;
+						tp->AdapterVirtOpenFlag = 1;
+						sktr_open_adapter(dev);
+						return;
+
+					case PHYSICAL_INSERTION:
+						printk(KERN_INFO "%s: %s Physical insertion.\n", dev->name, open_err);
+						break;
+
+					case ADDRESS_VERIFICATION:
+						printk(KERN_INFO "%s: %s Address verification.\n", dev->name, open_err);
+						break;
+
+					case PARTICIPATION_IN_RING_POLL:
+						printk(KERN_INFO "%s: %s Participation in ring poll.\n", dev->name, open_err);
+						break;
+
+					case REQUEST_INITIALISATION:
+						printk(KERN_INFO "%s: %s Request initialisation.\n", dev->name, open_err);
+						break;
+
+					case FULLDUPLEX_CHECK:
+						printk(KERN_INFO "%s: %s Full duplex check.\n", dev->name, open_err);
+						break;
+
+					default:
+						printk(KERN_INFO "%s: %s Unknown open phase\n", dev->name, open_err);
+						break;
+				}
+
+				/* Show the open errors. */
+				switch(ssb_parm_0 & OPEN_ERROR_CODES_MASK)
+				{
+					case OPEN_FUNCTION_FAILURE:
+						printk(KERN_INFO "%s: %s OPEN_FUNCTION_FAILURE", dev->name, code_err);
+						tp->LastOpenStatus =
+							OPEN_FUNCTION_FAILURE;
+						break;
+
+					case OPEN_SIGNAL_LOSS:
+						printk(KERN_INFO "%s: %s OPEN_SIGNAL_LOSS\n", dev->name, code_err);
+						tp->LastOpenStatus =
+							OPEN_SIGNAL_LOSS;
+						break;
+
+					case OPEN_TIMEOUT:
+						printk(KERN_INFO "%s: %s OPEN_TIMEOUT\n", dev->name, code_err);
+						tp->LastOpenStatus =
+							OPEN_TIMEOUT;
+						break;
+
+					case OPEN_RING_FAILURE:
+						printk(KERN_INFO "%s: %s OPEN_RING_FAILURE\n", dev->name, code_err);
+						tp->LastOpenStatus =
+							OPEN_RING_FAILURE;
+						break;
+
+					case OPEN_RING_BEACONING:
+						printk(KERN_INFO "%s: %s OPEN_RING_BEACONING\n", dev->name, code_err);
+						tp->LastOpenStatus =
+							OPEN_RING_BEACONING;
+						break;
+
+					case OPEN_DUPLICATE_NODEADDR:
+						printk(KERN_INFO "%s: %s OPEN_DUPLICATE_NODEADDR\n", dev->name, code_err);
+						tp->LastOpenStatus =
+							OPEN_DUPLICATE_NODEADDR;
+						break;
+
+					case OPEN_REQUEST_INIT:
+						printk(KERN_INFO "%s: %s OPEN_REQUEST_INIT\n", dev->name, code_err);
+						tp->LastOpenStatus =
+							OPEN_REQUEST_INIT;
+						break;
+
+					case OPEN_REMOVE_RECEIVED:
+						printk(KERN_INFO "%s: %s OPEN_REMOVE_RECEIVED", dev->name, code_err);
+						tp->LastOpenStatus =
+							OPEN_REMOVE_RECEIVED;
+						break;
+
+					case OPEN_FULLDUPLEX_SET:
+						printk(KERN_INFO "%s: %s OPEN_FULLDUPLEX_SET\n", dev->name, code_err);
+						tp->LastOpenStatus =
+							OPEN_FULLDUPLEX_SET;
+						break;
+
+					default:
+						printk(KERN_INFO "%s: %s Unknown open err code", dev->name, code_err);
+						tp->LastOpenStatus =
+							OPEN_FUNCTION_FAILURE;
+						break;
+				}
+			}
+
+			tp->AdapterOpenFlag 	= 0;
+			tp->AdapterVirtOpenFlag = 0;
+
+			return;
+		}
+	}
+	else
+	{
+		if(ssb_cmd != READ_ERROR_LOG)
+			return;
+
+		/* Add values from the error log table to the MAC
+		 * statistics counters and update the errorlogtable
+		 * memory.
+		 */
+		tp->MacStat.line_errors += tp->errorlogtable.Line_Error;
+		tp->MacStat.burst_errors += tp->errorlogtable.Burst_Error;
+		tp->MacStat.A_C_errors += tp->errorlogtable.ARI_FCI_Error;
+		tp->MacStat.lost_frames += tp->errorlogtable.Lost_Frame_Error;
+		tp->MacStat.recv_congest_count += tp->errorlogtable.Rx_Congest_Error;
+		tp->MacStat.rx_errors += tp->errorlogtable.Rx_Congest_Error;
+		tp->MacStat.frame_copied_errors += tp->errorlogtable.Frame_Copied_Error;
+		tp->MacStat.token_errors += tp->errorlogtable.Token_Error;
+		tp->MacStat.dummy1 += tp->errorlogtable.DMA_Bus_Error;
+		tp->MacStat.dummy1 += tp->errorlogtable.DMA_Parity_Error;
+		tp->MacStat.abort_delimiters += tp->errorlogtable.AbortDelimeters;
+		tp->MacStat.frequency_errors += tp->errorlogtable.Frequency_Error;
+		tp->MacStat.internal_errors += tp->errorlogtable.Internal_Error;
+	}
+
+	return;
+}
+
+/*
+ * The inverse routine to sktr_open().
+ */
+static int sktr_close(struct device *dev)
+{
+	struct net_local *tp = (struct net_local *)dev->priv;
+
+	dev->tbusy = 1;
+	dev->start = 0;
+
+	del_timer(&tp->timer);
+
+	/* Flush the Tx and disable Rx here. */
+
+	tp->HaltInProgress 	= 1;
+	sktr_exec_cmd(dev, OC_CLOSE);
+	tp->timer.expires	= jiffies + 1*HZ;
+	tp->timer.function 	= sktr_timer_end_wait;
+	tp->timer.data 		= (unsigned long)dev;
+	add_timer(&tp->timer);
+
+	sktr_enable_interrupts(dev);
+
+	tp->Sleeping = 1;
+	interruptible_sleep_on(&tp->wait_for_tok_int);
+	tp->TransmitCommandActive = 0;
+    
+	del_timer(&tp->timer);
+	sktr_disable_interrupts(dev);
+   
+	if(dev->dma > 0) 
+		disable_dma(dev->dma);
+	outw(0xFF00, dev->base_addr + SIFCMD);
+	if(dev->dma > 0)
+		outb(0xff, dev->base_addr + POSREG);
+
+#ifdef MODULE
+	MOD_DEC_USE_COUNT;
+#endif
+
+	sktr_cancel_tx_queue(tp);
+
+	return (0);
+}
+
+/*
+ * Get the current statistics. This may be called with the card open
+ * or closed.
+ */
+static struct enet_statistics *sktr_get_stats(struct device *dev)
+{
+	struct net_local *tp = (struct net_local *)dev->priv;
+
+	return ((struct enet_statistics *)&tp->MacStat);
+}
+
+/*
+ * Set or clear the multicast filter for this adapter.
+ */
+static void sktr_set_multicast_list(struct device *dev)
+{
+	struct net_local *tp = (struct net_local *)dev->priv;
+	unsigned int OpenOptions;
+
+	OpenOptions = tp->ocpl.OPENOptions &
+		~(PASS_ADAPTER_MAC_FRAMES
+		| PASS_ATTENTION_FRAMES
+		| PASS_BEACON_MAC_FRAMES
+		| COPY_ALL_MAC_FRAMES
+		| COPY_ALL_NON_MAC_FRAMES);
+
+	if(dev->flags & IFF_PROMISC)
+		/* Enable promiscuous mode */
+		OpenOptions |= COPY_ALL_NON_MAC_FRAMES | COPY_ALL_MAC_FRAMES;
+	else
+	{
+		if(dev->flags & IFF_ALLMULTI)
+			/* || dev->mc_count > HW_MAX_ADDRS) */
+		{
+			/* Disable promiscuous mode, use normal mode. */
+		}
+		else
+		{
+			if(dev->mc_count)
+			{
+				/* Walk the address list, and load the filter */
+			}
+		}
+	}
+
+	tp->ocpl.OPENOptions = OpenOptions;
+	sktr_exec_cmd(dev, OC_MODIFY_OPEN_PARMS);
+
+	return;
+}
+
+/*
+ * Wait for some time (microseconds)
+ */
+static void sktr_wait(unsigned long time)
+{
+	long tmp;
+
+	tmp = jiffies + time/(1000000/HZ);
+	do {
+		current->timeout	= tmp;
+		current->state 		= TASK_INTERRUPTIBLE;
+		schedule();
+	} while(tmp > jiffies);
+
+	return;
+}
+
+/*
+ * Write a command value to the SIFCMD register
+ */
+static void sktr_exec_sifcmd(struct device *dev, unsigned int WriteValue)
+{
+	int ioaddr = dev->base_addr;
+	unsigned short cmd;
+	unsigned short SifStsValue;
+	unsigned long loop_counter;
+
+	WriteValue = ((WriteValue ^ CMD_SYSTEM_IRQ) | CMD_INTERRUPT_ADAPTER);
+	cmd = (unsigned short)WriteValue;
+	loop_counter = 0,5 * 800000;
+	do {
+		SifStsValue = inw(ioaddr + SIFSTS);
+	} while((SifStsValue & CMD_INTERRUPT_ADAPTER) && loop_counter--);
+	outw(cmd, ioaddr + SIFCMD);
+
+	return;
+}
+
+/*
+ * Processes adapter hardware reset, halts adapter and downloads firmware,
+ * clears the halt bit.
+ */
+static int sktr_reset_adapter(struct device *dev)
+{
+	struct net_local *tp = (struct net_local *)dev->priv;
+	unsigned short *fw_ptr = (unsigned short *)&sktr_code;
+	unsigned short count, c;
+	int ioaddr = dev->base_addr;
+
+	/* Hardware adapter reset */
+	outw(ACL_ARESET, ioaddr + SIFACL);
+	sktr_wait(40);
+
+	c = inw(ioaddr + SIFACL);
+	sktr_wait(20);
+
+	if(dev->dma == 0)	/* For PCI adapters */
+	{
+		c &= ~(ACL_SPEED4 | ACL_SPEED16);	/* Clear bits */
+		if(tp->DataRate == SPEED_4)
+			c |= ACL_SPEED4;		/* Set 4Mbps */
+		else
+			c |= ACL_SPEED16;		/* Set 16Mbps */
+	}
+
+	/* In case a comand is pending - forget it */
+	tp->ScbInUse = 0;
+
+	c &= ~ACL_ARESET;		/* Clear adapter reset bit */
+	c |=  ACL_CPHALT;		/* Halt adapter CPU, allow download */
+	c &= ~ACL_PSDMAEN;		/* Clear pseudo dma bit */
+	outw(c, ioaddr + SIFACL);
+	sktr_wait(40);
+
+	/* Download firmware via DIO interface: */
+	do {
+		/* Download first address part */
+		outw(*fw_ptr, ioaddr + SIFADX);
+		fw_ptr++;
+
+		/* Download second address part */
+		outw(*fw_ptr, ioaddr + SIFADD);
+		fw_ptr++;
+
+		if((count = *fw_ptr) != 0)	/* Load loop counter */
+		{
+			fw_ptr++;	/* Download block data */
+			for(; count > 0; count--)
+			{
+				outw(*fw_ptr, ioaddr + SIFINC);
+				fw_ptr++;
+			}
+		}
+		else	/* Stop, if last block downloaded */
+		{
+			c = inw(ioaddr + SIFACL);
+			c &= (~ACL_CPHALT | ACL_SINTEN);
+
+			/* Clear CPHALT and start BUD */
+			outw(c, ioaddr + SIFACL);
+			return (1);
+		}
+	} while(count == 0);
+
+	return (-1);
+}
+
+/*
+ * Starts bring up diagnostics of token ring adapter and evaluates
+ * diagnostic results.
+ */
+static int sktr_bringup_diags(struct device *dev)
+{
+	int loop_cnt, retry_cnt;
+	unsigned short Status;
+	int ioaddr = dev->base_addr;
+
+	sktr_wait(HALF_SECOND);
+	sktr_exec_sifcmd(dev, EXEC_SOFT_RESET);
+	sktr_wait(HALF_SECOND);
+
+	retry_cnt = BUD_MAX_RETRIES;	/* maximal number of retrys */
+
+	do {
+		retry_cnt--;
+		if(sktr_debug > 3)
+			printk(KERN_INFO "BUD-Status: \n");
+		loop_cnt = BUD_MAX_LOOPCNT;	/* maximum: three seconds*/
+		do {			/* Inspect BUD results */
+			loop_cnt--;
+			sktr_wait(HALF_SECOND);
+			Status = inw(ioaddr + SIFSTS);
+			Status &= STS_MASK;
+
+			if(sktr_debug > 3)
+				printk(KERN_INFO " %04X \n", Status);
+			/* BUD successfully completed */
+			if(Status == STS_INITIALIZE)
+				return (1);
+		/* Unrecoverable hardware error, BUD not completed? */
+		} while((loop_cnt > 0) && ((Status & (STS_ERROR | STS_TEST))
+			!= (STS_ERROR | STS_TEST)));
+
+		/* Error preventing completion of BUD */
+		if(retry_cnt > 0)
+		{
+			printk(KERN_INFO "%s: Adapter Software Reset.\n", 
+				dev->name);
+			sktr_exec_sifcmd(dev, EXEC_SOFT_RESET);
+			sktr_wait(HALF_SECOND);
+		}
+	} while(retry_cnt > 0);
+
+	Status = inw(ioaddr + SIFSTS);
+	Status &= STS_ERROR_MASK;	/* Hardware error occured! */
+
+	printk(KERN_INFO "%s: Bring Up Diagnostics Error (%04X) occurred\n",
+		dev->name, Status);
+
+	return (-1);
+}
+
+/*
+ * Copy initialisation data to adapter memory, beginning at address
+ * 1:0A00; Starting DMA test and evaluating result bits.
+ */
+static int sktr_init_adapter(struct device *dev)
+{
+	struct net_local *tp = (struct net_local *)dev->priv;
+
+	const unsigned char SCB_Test[6] = {0x00, 0x00, 0xC1, 0xE2, 0xD4, 0x8B};
+	const unsigned char SSB_Test[8] = {0xFF, 0xFF, 0xD1, 0xD7,
+						0xC5, 0xD9, 0xC3, 0xD4};
+	void *ptr = (void *)&tp->ipb;
+	unsigned short *ipb_ptr = (unsigned short *)ptr;
+	unsigned char *cb_ptr = (unsigned char *) &tp->scb;
+	unsigned char *sb_ptr = (unsigned char *) &tp->ssb;
+	unsigned short Status;
+	int i, loop_cnt, retry_cnt;
+	int ioaddr = dev->base_addr;
+
+	/* Normalize: byte order low/high, word order high/low! (only IPB!) */
+	tp->ipb.SCB_Addr = SWAPW(virt_to_bus(&tp->scb));
+	tp->ipb.SSB_Addr = SWAPW(virt_to_bus(&tp->ssb));
+
+	/* Maximum: three initialization retries */
+	retry_cnt = INIT_MAX_RETRIES;
+
+	do {
+		retry_cnt--;
+
+		/* Transfer initialization block */
+		outw(0x0001, ioaddr + SIFADX);
+
+		/* To address 0001:0A00 of adapter RAM */
+		outw(0x0A00, ioaddr + SIFADD);
+
+		/* Write 11 words to adapter RAM */
+		for(i = 0; i < 11; i++)
+			outw(ipb_ptr[i], ioaddr + SIFINC);
+
+		/* Execute SCB adapter command */
+		sktr_exec_sifcmd(dev, CMD_EXECUTE);
+
+		loop_cnt = INIT_MAX_LOOPCNT;	/* Maximum: 11 seconds */
+
+		/* While remaining retries, no error and not completed */
+		do {
+			Status = 0;
+			loop_cnt--;
+			sktr_wait(HALF_SECOND);
+
+			/* Mask interesting status bits */
+			Status = inw(ioaddr + SIFSTS);
+			Status &= STS_MASK;
+		} while(((Status &(STS_INITIALIZE | STS_ERROR | STS_TEST)) != 0)
+			&& ((Status & STS_ERROR) == 0) && (loop_cnt != 0));
+
+		if((Status & (STS_INITIALIZE | STS_ERROR | STS_TEST)) == 0)
+		{
+			/* Initialization completed without error */
+			i = 0;
+			do {	/* Test if contents of SCB is valid */
+				if(SCB_Test[i] != *(cb_ptr + i))
+					/* DMA data error: wrong data in SCB */
+					return (-1);
+				i++;
+			} while(i < 6);
+
+			i = 0;
+			do {	/* Test if contents of SSB is valid */
+				if(SSB_Test[i] != *(sb_ptr + i))
+					/* DMA data error: wrong data in SSB */
+					return (-1);
+				i++;
+			} while (i < 8);
+
+			return (1);	/* Adapter successfully initialized */
+		}
+		else
+		{
+			if((Status & STS_ERROR) != 0)
+			{
+				/* Initialization error occured */
+				Status = inw(ioaddr + SIFSTS);
+				Status &= STS_ERROR_MASK;
+				/* ShowInitialisationErrorCode(Status); */
+				return (-1); /* Unrecoverable error */
+			}
+			else
+			{
+				if(retry_cnt > 0)
+				{
+					/* Reset adapter and try init again */
+					sktr_exec_sifcmd(dev, EXEC_SOFT_RESET);
+					sktr_wait(HALF_SECOND);
+				}
+			}
+		}
+	} while(retry_cnt > 0);
+
+	return (-1);
+}
+
+/*
+ * Check for outstanding commands in command queue and tries to execute
+ * command immediately. Corresponding command flag in command queue is cleared.
+ */
+static void sktr_chk_outstanding_cmds(struct device *dev)
+{
+	struct net_local *tp = (struct net_local *)dev->priv;
+	unsigned long Addr = 0;
+	unsigned char i = 0;
+
+	if(tp->CMDqueue == 0)
+		return;		/* No command execution */
+
+	/* If SCB in use: no command */
+	if(tp->ScbInUse == 1)
+		return;
+
+	/* Check if adapter is opened, avoiding COMMAND_REJECT
+	 * interrupt by the adapter!
+	 */
+	if(tp->AdapterOpenFlag == 0)
+	{
+		if(tp->CMDqueue & OC_OPEN)
+		{
+			/* Execute OPEN command	*/
+			tp->CMDqueue ^= OC_OPEN;
+
+			/* Copy the 18 bytes of the product ID */
+			while((AdapterName[i] != '\0') && (i < PROD_ID_SIZE))
+			{
+				tp->ProductID[i] = AdapterName[i];
+				i++;
+			}
+
+			Addr = htonl(virt_to_bus(&tp->ocpl));
+			tp->scb.Parm[0] = LOWORD(Addr);
+			tp->scb.Parm[1] = HIWORD(Addr);
+			tp->scb.CMD = OPEN;
+		}
+		else
+			/* No OPEN command queued, but adapter closed. Note:
+			 * We'll try to re-open the adapter in DriverPoll()
+			 */
+			return;		/* No adapter command issued */
+	}
+	else
+	{
+		/* Adapter is open; evaluate command queue: try to execute
+		 * outstanding commands (depending on priority!) CLOSE
+		 * command queued
+		 */
+		if(tp->CMDqueue & OC_CLOSE)
+		{
+			tp->CMDqueue ^= OC_CLOSE;
+			tp->AdapterOpenFlag = 0;
+			tp->scb.Parm[0] = 0; /* Parm[0], Parm[1] are ignored */
+			tp->scb.Parm[1] = 0; /* but should be set to zero! */
+			tp->scb.CMD = CLOSE;
+			if(!tp->HaltInProgress)
+				tp->CMDqueue |= OC_OPEN; /* re-open adapter */
+			else
+				tp->CMDqueue = 0;	/* no more commands */
+		}
+		else
+		{
+			if(tp->CMDqueue & OC_RECEIVE)
+			{
+				tp->CMDqueue ^= OC_RECEIVE;
+				Addr = htonl(virt_to_bus(tp->RplHead));
+				tp->scb.Parm[0] = LOWORD(Addr);
+				tp->scb.Parm[1] = HIWORD(Addr);
+				tp->scb.CMD = RECEIVE;
+			}
+			else
+			{
+				if(tp->CMDqueue & OC_TRANSMIT_HALT)
+				{
+					/* NOTE: TRANSMIT.HALT must be checked 
+					 * before TRANSMIT.
+					 */
+					tp->CMDqueue ^= OC_TRANSMIT_HALT;
+					tp->scb.CMD = TRANSMIT_HALT;
+
+					/* Parm[0] and Parm[1] are ignored
+					 * but should be set to zero!
+					 */
+					tp->scb.Parm[0] = 0;
+					tp->scb.Parm[1] = 0;
+				}
+				else
+				{
+					if(tp->CMDqueue & OC_TRANSMIT)
+					{
+						/* NOTE: TRANSMIT must be 
+						 * checked after TRANSMIT.HALT
+						 */
+						if(tp->TransmitCommandActive)
+						{
+							if(!tp->TransmitHaltScheduled)
+							{
+								tp->TransmitHaltScheduled = 1;
+								sktr_exec_cmd(dev, OC_TRANSMIT_HALT) ;
+							}
+							tp->TransmitCommandActive = 0;
+							return;
+						}
+
+						tp->CMDqueue ^= OC_TRANSMIT;
+						sktr_cancel_tx_queue(tp);
+						Addr = htonl(virt_to_bus(tp->TplBusy));
+						tp->scb.Parm[0] = LOWORD(Addr);
+						tp->scb.Parm[1] = HIWORD(Addr);
+						tp->scb.CMD = TRANSMIT;
+						tp->TransmitCommandActive = 1;
+					}
+					else
+					{
+						if(tp->CMDqueue & OC_MODIFY_OPEN_PARMS)
+						{
+							tp->CMDqueue ^= OC_MODIFY_OPEN_PARMS;
+							tp->scb.Parm[0] = tp->ocpl.OPENOptions; /* new OPEN options*/
+							tp->scb.Parm[0] |= ENABLE_FULL_DUPLEX_SELECTION;
+							tp->scb.Parm[1] = 0; /* is ignored but should be zero */
+							tp->scb.CMD = MODIFY_OPEN_PARMS;
+						}
+						else
+						{
+							if(tp->CMDqueue & OC_SET_FUNCT_ADDR)
+							{
+								tp->CMDqueue ^= OC_SET_FUNCT_ADDR;
+								tp->scb.Parm[0] = LOWORD(tp->ocpl.FunctAddr);
+								tp->scb.Parm[1] = HIWORD(tp->ocpl.FunctAddr);
+								tp->scb.CMD = SET_FUNCT_ADDR;
+							}
+							else
+							{
+								if(tp->CMDqueue & OC_SET_GROUP_ADDR)
+								{
+									tp->CMDqueue ^= OC_SET_GROUP_ADDR;
+									tp->scb.Parm[0] = LOWORD(tp->ocpl.GroupAddr);
+									tp->scb.Parm[1] = HIWORD(tp->ocpl.GroupAddr);
+									tp->scb.CMD = SET_GROUP_ADDR;
+								}
+								else
+								{
+									if(tp->CMDqueue & OC_READ_ERROR_LOG)
+									{
+										tp->CMDqueue ^= OC_READ_ERROR_LOG;
+										Addr = htonl(virt_to_bus(&tp->errorlogtable));
+										tp->scb.Parm[0] = LOWORD(Addr);
+										tp->scb.Parm[1] = HIWORD(Addr);
+										tp->scb.CMD = READ_ERROR_LOG;
+									}
+									else
+									{
+										printk(KERN_WARNING "CheckForOutstandingCommand: unknown Command\n");
+										tp->CMDqueue = 0;
+										return;
+									}
+								}
+							}
+						}
+					}
+				}
+			}
+		}
+	}
+
+	tp->ScbInUse = 1;	/* Set semaphore: SCB in use. */
+
+	/* Execute SCB and generate IRQ when done. */
+	sktr_exec_sifcmd(dev, CMD_EXECUTE | CMD_SCB_REQUEST);
+
+	return;
+}
+
+/*
+ * IRQ conditions: signal loss on the ring, transmit or receive of beacon
+ * frames (disabled if bit 1 of OPEN option is set); report error MAC
+ * frame transmit (disabled if bit 2 of OPEN option is set); open or short
+ * cirquit fault on the lobe is detected; remove MAC frame received;
+ * error counter overflow (255); opened adapter is the only station in ring.
+ * After some of the IRQs the adapter is closed!
+ */
+static void sktr_ring_status_irq(struct device *dev)
+{
+	struct net_local *tp = (struct net_local *)dev->priv;
+
+	tp->CurrentRingStatus = SWAPB(tp->ssb.Parm[0]);
+
+	/* First: fill up statistics */
+	if(tp->ssb.Parm[0] & SIGNAL_LOSS)
+	{
+		printk(KERN_INFO "%s: Signal Loss\n", dev->name);
+		tp->MacStat.line_errors++;
+	}
+
+	/* Adapter is closed, but initialized */
+	if(tp->ssb.Parm[0] & LOBE_WIRE_FAULT)
+	{
+		printk(KERN_INFO "%s: Lobe Wire Fault, Reopen Adapter\n", 
+			dev->name);
+		tp->MacStat.line_errors++;
+	}
+
+	if(tp->ssb.Parm[0] & RING_RECOVERY)
+		printk(KERN_INFO "%s: Ring Recovery\n", dev->name);
+
+	/* Counter overflow: read error log */
+	if(tp->ssb.Parm[0] & COUNTER_OVERFLOW)
+	{
+		printk(KERN_INFO "%s: Counter Overflow\n", dev->name);
+		sktr_exec_cmd(dev, OC_READ_ERROR_LOG);
+	}
+
+	/* Adapter is closed, but initialized */
+	if(tp->ssb.Parm[0] & REMOVE_RECEIVED)
+		printk(KERN_INFO "%s: Remove Received, Reopen Adapter\n", 
+			dev->name);
+
+	/* Adapter is closed, but initialized */
+	if(tp->ssb.Parm[0] & AUTO_REMOVAL_ERROR)
+		printk(KERN_INFO "%s: Auto Removal Error, Reopen Adapter\n", 
+			dev->name);
+
+	if(tp->ssb.Parm[0] & HARD_ERROR)
+		printk(KERN_INFO "%s: Hard Error\n", dev->name);
+
+	if(tp->ssb.Parm[0] & SOFT_ERROR)
+		printk(KERN_INFO "%s: Soft Error\n", dev->name);
+
+	if(tp->ssb.Parm[0] & TRANSMIT_BEACON)
+		printk(KERN_INFO "%s: Transmit Beacon\n", dev->name);
+
+	if(tp->ssb.Parm[0] & SINGLE_STATION)
+		printk(KERN_INFO "%s: Single Station\n", dev->name);
+
+	/* Check if adapter has been closed */
+	if(tp->ssb.Parm[0] & ADAPTER_CLOSED)
+	{
+		printk(KERN_INFO "%s: Adapter closed (Reopening)," 
+			"QueueSkb %d, CurrentRingStat %x\n",
+			dev->name, tp->QueueSkb, tp->CurrentRingStatus);
+		tp->AdapterOpenFlag = 0;
+		sktr_open_adapter(dev);
+	}
+
+	return;
+}
+
+/*
+ * Issued if adapter has encountered an unrecoverable hardware
+ * or software error.
+ */
+static void sktr_chk_irq(struct device *dev)
+{
+	int i;
+	unsigned short AdapterCheckBlock[4];
+	unsigned short ioaddr = dev->base_addr;
+	struct net_local *tp = (struct net_local *)dev->priv;
+
+	tp->AdapterOpenFlag = 0;	/* Adapter closed now */
+
+	/* Page number of adapter memory */
+	outw(0x0001, ioaddr + SIFADX);
+	/* Address offset */
+	outw(CHECKADDR, ioaddr + SIFADR);
+
+	/* Reading 8 byte adapter check block. */
+	for(i = 0; i < 4; i++)
+		AdapterCheckBlock[i] = inw(ioaddr + SIFINC);
+
+	if(sktr_debug > 3)
+	{
+		printk("%s: AdapterCheckBlock: ", dev->name);
+		for (i = 0; i < 4; i++)
+			printk("%04X", AdapterCheckBlock[i]);
+		printk("\n");
+	}
+
+	switch(AdapterCheckBlock[0])
+	{
+		case DIO_PARITY:
+			printk(KERN_INFO "%s: DIO parity error\n", dev->name);
+			break;
+
+		case DMA_READ_ABORT:
+			printk(KERN_INFO "%s DMA read operation aborted:\n",
+				dev->name);
+			switch (AdapterCheckBlock[1])
+			{
+				case 0:
+					printk(KERN_INFO "Timeout\n");
+					printk(KERN_INFO "Address: %04X %04X\n",
+						AdapterCheckBlock[2],
+						AdapterCheckBlock[3]);
+					break;
+
+				case 1:
+					printk(KERN_INFO "Parity error\n");
+					printk(KERN_INFO "Address: %04X %04X\n",
+						AdapterCheckBlock[2], 
+						AdapterCheckBlock[3]);
+					break;
+
+				case 2: 
+					printk(KERN_INFO "Bus error\n");
+					printk(KERN_INFO "Address: %04X %04X\n",
+						AdapterCheckBlock[2], 
+						AdapterCheckBlock[3]);
+					break;
+
+				default:
+					printk(KERN_INFO "Unknown error.\n");
+					break;
+			}
+			break;
+
+		case DMA_WRITE_ABORT:
+			printk(KERN_INFO "%s: DMA write operation aborted: \n",
+				dev->name);
+			switch (AdapterCheckBlock[1])
+			{
+				case 0: 
+					printk(KERN_INFO "Timeout\n");
+					printk(KERN_INFO "Address: %04X %04X\n",
+						AdapterCheckBlock[2], 
+						AdapterCheckBlock[3]);
+					break;
+
+				case 1: 
+					printk(KERN_INFO "Parity error\n");
+					printk(KERN_INFO "Address: %04X %04X\n",
+						AdapterCheckBlock[2], 
+						AdapterCheckBlock[3]);
+					break;
+
+				case 2: 
+					printk(KERN_INFO "Bus error\n");
+					printk(KERN_INFO "Address: %04X %04X\n",
+						AdapterCheckBlock[2], 
+						AdapterCheckBlock[3]);
+					break;
+
+				default:
+					printk(KERN_INFO "Unknown error.\n");
+					break;
+			}
+			break;
+
+		case ILLEGAL_OP_CODE:
+			printk("%s: Illegal operation code in firmware\n",
+				dev->name);
+			/* Parm[0-3]: adapter internal register R13-R15 */
+			break;
+
+		case PARITY_ERRORS:
+			printk("%s: Adapter internal bus parity error\n",
+				dev->name);
+			/* Parm[0-3]: adapter internal register R13-R15 */
+			break;
+
+		case RAM_DATA_ERROR:
+			printk("%s: RAM data error\n", dev->name);
+			/* Parm[0-1]: MSW/LSW address of RAM location. */
+			break;
+
+		case RAM_PARITY_ERROR:
+			printk("%s: RAM parity error\n", dev->name);
+			/* Parm[0-1]: MSW/LSW address of RAM location. */
+			break;
+
+		case RING_UNDERRUN:
+			printk("%s: Internal DMA underrun detected\n",
+				dev->name);
+			break;
+
+		case INVALID_IRQ:
+			printk("%s: Unrecognized interrupt detected\n",
+				dev->name);
+			/* Parm[0-3]: adapter internal register R13-R15 */
+			break;
+
+		case INVALID_ERROR_IRQ:
+			printk("%s: Unrecognized error interrupt detected\n",
+				dev->name);
+			/* Parm[0-3]: adapter internal register R13-R15 */
+			break;
+
+		case INVALID_XOP:
+			printk("%s: Unrecognized XOP request detected\n",
+				dev->name);
+			/* Parm[0-3]: adapter internal register R13-R15 */
+			break;
+
+		default:
+			printk("%s: Unknown status", dev->name);
+			break;
+	}
+
+	if(sktr_chipset_init(dev) == 1)
+	{
+		/* Restart of firmware successful */
+		tp->AdapterOpenFlag = 1;
+	}
+
+	return;
+}
+
+/*
+ * Internal adapter pointer to RAM data are copied from adapter into
+ * host system.
+ */
+static void sktr_read_ptr(struct device *dev)
+{
+	struct net_local *tp = (struct net_local *)dev->priv;
+	unsigned short adapterram;
+
+	sktr_read_ram(dev, (unsigned char *)&tp->intptrs.BurnedInAddrPtr,
+			ADAPTER_INT_PTRS, 16);
+	sktr_read_ram(dev, (unsigned char *)&adapterram,
+			(unsigned short)SWAPB(tp->intptrs.AdapterRAMPtr), 2);
+
+	printk(KERN_INFO "%s: Adapter RAM size: %d K\n", 
+		dev->name, SWAPB(adapterram));
+
+	return;
+}
+
+/*
+ * Reads a number of bytes from adapter to system memory.
+ */
+static void sktr_read_ram(struct device *dev, unsigned char *Data,
+				unsigned short Address, int Length)
+{
+	int i;
+	unsigned short old_sifadx, old_sifadr, InWord;
+	unsigned short ioaddr = dev->base_addr;
+
+	/* Save the current values */
+	old_sifadx = inw(ioaddr + SIFADX);
+	old_sifadr = inw(ioaddr + SIFADR);
+
+	/* Page number of adapter memory */
+	outw(0x0001, ioaddr + SIFADX);
+	/* Address offset in adapter RAM */
+	outw(Address, ioaddr + SIFADR);
+
+	/* Copy len byte from adapter memory to system data area. */
+	i = 0;
+	for(;;)
+	{
+		InWord = inw(ioaddr + SIFINC);
+
+		*(Data + i) = HIBYTE(InWord);	/* Write first byte */
+		if(++i == Length)		/* All is done break */
+			break;
+
+		*(Data + i) = LOBYTE(InWord);	/* Write second byte */
+		if (++i == Length)		/* All is done break */
+			break;
+	}
+
+	/* Restore original values */
+	outw(old_sifadx, ioaddr + SIFADX);
+	outw(old_sifadr, ioaddr + SIFADR);
+
+	return;
+}
+
+/*
+ * Reads MAC address from adapter ROM.
+ */
+static void sktr_read_addr(struct device *dev, unsigned char *Address)
+{
+	int i, In;
+	unsigned short ioaddr = dev->base_addr;
+
+	/* Address: 0000:0000 */
+	outw(0, ioaddr + SIFADX);
+	outw(0, ioaddr + SIFADR);
+
+	/* Read six byte MAC address data */
+	for(i = 0; i < 6; i++)
+	{
+		In = inw(ioaddr + SIFINC);
+		*(Address + i) = (unsigned char)(In >> 8);
+	}
+
+	return;
+}
+
+/*
+ * Cancel all queued packets in the transmission queue.
+ */
+static void sktr_cancel_tx_queue(struct net_local* tp)
+{
+	TPL *tpl;
+	struct sk_buff *skb;
+
+	/*
+	 * NOTE: There must not be an active TRANSMIT command pending, when
+	 * this function is called.
+	 */
+	if(tp->TransmitCommandActive)
+		return;
+
+	for(;;)
+	{
+		tpl = tp->TplBusy;
+		if(!tpl->BusyFlag)
+			break;
+		/* "Remove" TPL from busy list. */
+		tp->TplBusy = tpl->NextTPLPtr;
+		sktr_write_tpl_status(tpl, 0);	/* Clear VALID bit */
+		tpl->BusyFlag = 0;		/* "free" TPL */
+
+		printk(KERN_INFO "Cancel tx (%08lXh).\n", (unsigned long)tpl);
+
+		dev_kfree_skb(tpl->Skb);
+	}
+
+	for(;;)
+	{
+		skb = skb_dequeue(&tp->SendSkbQueue);
+		if(skb == NULL)
+			break;
+		tp->QueueSkb++;
+		dev_kfree_skb(skb);
+	}
+
+	return;
+}
+
+/*
+ * This function is called whenever a transmit interrupt is generated by the
+ * adapter. For a command complete interrupt, it is checked if we have to
+ * issue a new transmit command or not.
+ */
+static void sktr_tx_status_irq(struct device *dev)
+{
+	struct net_local *tp = (struct net_local *)dev->priv;
+	unsigned char HighByte, HighAc, LowAc;
+	TPL *tpl;
+
+	/* NOTE: At this point the SSB from TRANSMIT STATUS is no longer
+	 * available, because the CLEAR SSB command has already been issued.
+	 *
+	 * Process all complete transmissions.
+	 */
+
+	for(;;)
+	{
+		tpl = tp->TplBusy;
+		if(!tpl->BusyFlag || (tpl->Status
+			& (TX_VALID | TX_FRAME_COMPLETE))
+			!= TX_FRAME_COMPLETE)
+		{
+			break;
+		}
+
+		/* "Remove" TPL from busy list. */
+		tp->TplBusy = tpl->NextTPLPtr ;
+
+		if(sktr_debug > 3)
+			sktr_dump(tpl->MData, SWAPB(tpl->FrameSize));
+
+		/* Check the transmit status field only for directed frames*/
+		if(DIRECTED_FRAME(tpl) && (tpl->Status & TX_ERROR) == 0)
+		{
+			HighByte = GET_TRANSMIT_STATUS_HIGH_BYTE(tpl->Status);
+			HighAc   = GET_FRAME_STATUS_HIGH_AC(HighByte);
+			LowAc    = GET_FRAME_STATUS_LOW_AC(HighByte);
+
+			if((HighAc != LowAc) || (HighAc == AC_NOT_RECOGNIZED))
+			{
+				printk(KERN_INFO "%s: (DA=%08lX not recognized)",
+					dev->name,
+					*(unsigned long *)&tpl->MData[2+2]);
+			}
+			else
+			{
+				if(sktr_debug > 3)
+					printk("%s: Directed frame tx'd\n", 
+						dev->name);
+			}
+		}
+		else
+		{
+			if(!DIRECTED_FRAME(tpl))
+			{
+				if(sktr_debug > 3)
+					printk("%s: Broadcast frame tx'd\n",
+						dev->name);
+			}
+		}
+
+                tp->MacStat.tx_packets++;
+		dev_kfree_skb(tpl->Skb);
+		tpl->BusyFlag = 0;	/* "free" TPL */
+	}
+
+	dev->tbusy = 0;
+	if(tp->QueueSkb < MAX_TX_QUEUE)
+		sktr_hardware_send_packet(dev, tp);
+
+	return;
+}
+
+/*
+ * Called if a frame receive interrupt is generated by the adapter.
+ * Check if the frame is valid and indicate it to system.
+ */
+static void sktr_rcv_status_irq(struct device *dev)
+{
+	struct net_local *tp = (struct net_local *)dev->priv;
+	unsigned char *ReceiveDataPtr;
+	struct sk_buff *skb;
+	unsigned int Length, Length2;
+	RPL *rpl;
+	RPL *SaveHead;
+
+	/* NOTE: At this point the SSB from RECEIVE STATUS is no longer
+	 * available, because the CLEAR SSB command has already been issued.
+	 *
+	 * Process all complete receives.
+	 */
+
+	for(;;)
+	{
+		rpl = tp->RplHead;
+		if(rpl->Status & RX_VALID)
+			break;		/* RPL still in use by adapter */
+
+		/* Forward RPLHead pointer to next list. */
+		SaveHead = tp->RplHead;
+		tp->RplHead = rpl->NextRPLPtr;
+
+		/* Get the frame size (Byte swap for Intel).
+		 * Do this early (see workaround comment below)
+		 */
+		Length = (unsigned short)SWAPB(rpl->FrameSize);
+
+		/* Check if the Frame_Start, Frame_End and
+		 * Frame_Complete bits are set.
+		 */
+		if((rpl->Status & VALID_SINGLE_BUFFER_FRAME)
+			== VALID_SINGLE_BUFFER_FRAME)
+		{
+			ReceiveDataPtr = rpl->MData;
+
+			/* Workaround for delayed write of FrameSize on ISA
+			 * (FrameSize is false but valid-bit is reset)
+			 * Frame size is set to zero when the RPL is freed.
+			 * Length2 is there because there have also been
+			 * cases where the FrameSize was partially written
+			 */
+			Length2 = (unsigned short)SWAPB(rpl->FrameSize);
+
+			if(Length == 0 || Length != Length2)
+			{
+				tp->RplHead = SaveHead;
+				break;	/* Return to sktr_interrupt */
+			}
+
+			/* Drop frames sent by myself */
+			if(sktr_chk_frame(dev, rpl->MData))
+			{
+				printk(KERN_INFO "%s: Received my own frame\n",
+					dev->name);
+				if(rpl->Skb != NULL)
+					dev_kfree_skb(rpl->Skb);
+			}
+			else
+			{
+				sktr_update_rcv_stats(tp,ReceiveDataPtr,Length);
+
+				if(sktr_debug > 3)
+					printk("%s: Packet Length %04X (%d)\n",
+						dev->name, Length, Length);
+
+				/* Indicate the received frame to system the
+				 * adapter does the Source-Routing padding for 
+				 * us. See: OpenOptions in sktr_init_opb()
+				 */
+				skb = rpl->Skb;
+				if(rpl->SkbStat == SKB_UNAVAILABLE)
+				{
+					/* Try again to allocate skb */
+					skb = dev_alloc_skb(tp->MaxPacketSize);
+					if(skb == NULL)
+					{
+						/* Update Stats ?? */
+					}
+					else
+					{
+						skb->dev	= dev;
+						skb_put(skb, tp->MaxPacketSize);
+						rpl->SkbStat 	= SKB_DATA_COPY;
+						ReceiveDataPtr 	= rpl->MData;
+					}
+				}
+
+				if(rpl->SkbStat == SKB_DATA_COPY
+					|| rpl->SkbStat == SKB_DMA_DIRECT)
+				{
+					if(rpl->SkbStat == SKB_DATA_COPY)
+					{
+						memmove(skb->data, ReceiveDataPtr, Length);
+					}
+
+					/* Deliver frame to system */
+					rpl->Skb = NULL;
+					skb_trim(skb,Length);
+					skb->protocol = tr_type_trans(skb,dev);
+					netif_rx(skb);
+				}
+			}
+		}
+		else	/* Invalid frame */
+		{
+			if(rpl->Skb != NULL)
+				dev_kfree_skb(rpl->Skb);
+
+			/* Skip list. */
+			if(rpl->Status & RX_START_FRAME)
+				/* Frame start bit is set -> overflow. */
+				tp->MacStat.rx_errors++;
+		}
+
+		/* Allocate new skb for rpl */
+		rpl->Skb = dev_alloc_skb(tp->MaxPacketSize);
+
+		/* skb == NULL ? then use local buffer */
+		if(rpl->Skb == NULL)
+		{
+			rpl->SkbStat = SKB_UNAVAILABLE;
+			rpl->FragList[0].DataAddr = htonl(virt_to_bus(tp->LocalRxBuffers[rpl->RPLIndex]));
+			rpl->MData = tp->LocalRxBuffers[rpl->RPLIndex];
+		}
+		else	/* skb != NULL */
+		{
+			rpl->Skb->dev = dev;
+			skb_put(rpl->Skb, tp->MaxPacketSize);
+
+			/* Data unreachable for DMA ? then use local buffer */
+			if(virt_to_bus(rpl->Skb->data) + tp->MaxPacketSize
+				> ISA_MAX_ADDRESS)
+			{
+				rpl->SkbStat = SKB_DATA_COPY;
+				rpl->FragList[0].DataAddr = htonl(virt_to_bus(tp->LocalRxBuffers[rpl->RPLIndex]));
+				rpl->MData = tp->LocalRxBuffers[rpl->RPLIndex];
+			}
+			else
+			{
+				/* DMA directly in skb->data */
+				rpl->SkbStat = SKB_DMA_DIRECT;
+				rpl->FragList[0].DataAddr = htonl(virt_to_bus(rpl->Skb->data));
+				rpl->MData = rpl->Skb->data;
+			}
+		}
+
+		rpl->FragList[0].DataCount = SWAPB(tp->MaxPacketSize);
+		rpl->FrameSize = 0;
+
+		/* Pass the last RPL back to the adapter */
+		tp->RplTail->FrameSize = 0;
+
+		/* Reset the CSTAT field in the list. */
+		sktr_write_rpl_status(tp->RplTail, RX_VALID | RX_FRAME_IRQ);
+
+		/* Current RPL becomes last one in list. */
+		tp->RplTail = tp->RplTail->NextRPLPtr;
+
+		/* Inform adapter about RPL valid. */
+		sktr_exec_sifcmd(dev, CMD_RX_VALID);
+	}
+
+	return;
+}
+
+/*
+ * This function should be used whenever the status of any RPL must be
+ * modified by the driver, because the compiler may otherwise change the
+ * order of instructions such that writing the RPL status may be executed
+ * at an undesireable time. When this function is used, the status is
+ * always written when the function is called.
+ */
+static void sktr_write_rpl_status(RPL *rpl, unsigned int Status)
+{
+	rpl->Status = Status;
+
+	return;
+}
+
+/*
+ * The function updates the statistic counters in mac->MacStat.
+ * It differtiates between directed and broadcast/multicast ( ==functional)
+ * frames.
+ */
+static void sktr_update_rcv_stats(struct net_local *tp, unsigned char DataPtr[],
+					unsigned int Length)
+{
+	tp->MacStat.rx_packets++;
+
+	/* Test functional bit */
+	if(DataPtr[2] & GROUP_BIT)
+		tp->MacStat.multicast++;
+
+	return;
+}
+
+/*
+ * Check if it is a frame of myself. Compare source address with my current
+ * address in reverse direction, and mask out the TR_RII.
+ */
+static unsigned char sktr_chk_frame(struct device *dev, unsigned char *Addr)
+{
+	int i;
+
+	for(i = 5; i > 0; i--)
+	{
+		if(Addr[8 + i] != dev->dev_addr[i])
+			return (0);
+	}
+
+	/* Mask out RIF bit. */
+	if((Addr[8] & ~TR_RII) != (unsigned char)(dev->dev_addr[0]))
+		return (0);
+
+	return (1);  /* It is my frame. */
+}
+
+/*
+ * Dump Packet (data)
+ */
+static void sktr_dump(unsigned char *Data, int length)
+{
+        int i, j;
+
+        for (i = 0, j = 0; i < length / 8; i++, j += 8)
+        {
+		printk(KERN_DEBUG "%02x %02x %02x %02x %02x %02x %02x %02x\n",
+			Data[j+0],Data[j+1],Data[j+2],Data[j+3],
+                        Data[j+4],Data[j+5],Data[j+6],Data[j+7]);
+        }
+
+        return;
+}
+
+#ifdef MODULE
+
+static struct device* dev_sktr[SKTR_MAX_ADAPTERS];
+static int io[SKTR_MAX_ADAPTERS]	= { 0, 0 };
+static int irq[SKTR_MAX_ADAPTERS] 	= { 0, 0 };
+static int mem[SKTR_MAX_ADAPTERS] 	= { 0, 0 };
+
+MODULE_PARM(io,  "1-" __MODULE_STRING(SKTR_MAX_ADAPTERS) "i");
+MODULE_PARM(irq, "1-" __MODULE_STRING(SKTR_MAX_ADAPTERS) "i");
+MODULE_PARM(mem, "1-" __MODULE_STRING(SKTR_MAX_ADAPTERS) "i");
+
+int init_module(void)
+{
+	int i;
+
+	for(i = 0; i < SKTR_MAX_ADAPTERS; i++)
+	{
+                irq[i] = 0;
+                mem[i] = 0;
+                dev_sktr[i] = NULL;
+                dev_sktr[i] = init_trdev(dev_sktr[i], 0);
+                if(dev_sktr[i] == NULL)
+                        return (-ENOMEM);
+
+		dev_sktr[i]->base_addr = io[i];
+                dev_sktr[i]->irq       = irq[i];
+                dev_sktr[i]->mem_start = mem[i];
+                dev_sktr[i]->init      = &sktr_probe;
+
+                if(register_trdev(dev_sktr[i]) != 0)
+		{
+                        kfree_s(dev_sktr[i], sizeof(struct device));
+                        dev_sktr[i] = NULL;
+                        if(i == 0)
+			{
+                                printk("sktr: register_trdev() returned non-zero.\n");
+                                return (-EIO);
+                        }
+			else
+                                return (0);
+                }
+        }
+
+        return (0);
+}
+
+void cleanup_module(void)
+{
+	int i;
+
+        for(i = 0; i < SKTR_MAX_ADAPTERS; i++)
+	{
+		if(dev_sktr[i])
+		{
+			unregister_trdev(dev_sktr[i]);
+			release_region(dev_sktr[i]->base_addr, SKTR_IO_EXTENT);
+			if(dev_sktr[i]->irq)
+				free_irq(dev_sktr[i]->irq, dev_sktr[i]);
+			if(dev_sktr[i]->dma > 0)
+				free_dma(dev_sktr[i]->dma);
+			if(dev_sktr[i]->priv)
+				kfree_s(dev_sktr[i]->priv, sizeof(struct net_local));
+			kfree_s(dev_sktr[i], sizeof(struct device));
+			dev_sktr[i] = NULL;
+                }
+	}
+}
+#endif /* MODULE */
diff -u --recursive --new-file v2.1.106/linux/drivers/net/sktr.h linux/drivers/net/sktr.h
--- v2.1.106/linux/drivers/net/sktr.h	Wed Dec 31 16:00:00 1969
+++ linux/drivers/net/sktr.h	Wed Jun 24 14:26:13 1998
@@ -0,0 +1,1098 @@
+/* sktr.h: SysKonnect TokenRing driver for Linux
+ *
+ * Authors:
+ * - Christoph Goos <cgoos@syskonnect.de>
+ */
+
+#ifndef __LINUX_SKTR_H
+#define __LINUX_SKTR_H
+
+#ifdef __KERNEL__
+
+#define SKTR_MAX_ADAPTERS 7
+
+#define SEND_TIMEOUT 10*HZ
+
+#define TR_RCF_LONGEST_FRAME_MASK 0x0070
+#define TR_RCF_FRAME4K 0x0030
+
+/*------------------------------------------------------------------*/
+/*  Bit order for adapter communication with DMA		    */
+/*  --------------------------------------------------------------  */
+/*  Bit  8 | 9| 10| 11|| 12| 13| 14| 15|| 0| 1| 2| 3|| 4| 5| 6| 7|  */
+/*  --------------------------------------------------------------  */
+/*  The bytes in a word must be byte swapped. Also, if a double	    */
+/*  word is used for storage, then the words, as well as the bytes, */
+/*  must be swapped. 						    */
+/*  Bit order for adapter communication with DIO 		    */
+/*  --------------------------------------------------------------  */
+/*  Bit  0 | 1| 2| 3|| 4| 5| 6| 7|| 8| 9| 10| 11|| 12| 13| 14| 15|  */
+/*  --------------------------------------------------------------  */
+/*------------------------------------------------------------------*/
+
+/* Swap bytes of a word.                        */
+#define SWAPB(x) (((unsigned short)((x) << 8)) | ((unsigned short)((x) >> 8)))
+
+/* Swap words of a long.                        */
+#define SWAPW(x) (((x) << 16) | ((x) >> 16))
+
+/* Get the low byte of a word.                      */
+#define LOBYTE(w)       ((unsigned char)(w))
+
+/* Get the high byte of a word.                     */
+#define HIBYTE(w)       ((unsigned char)((unsigned short)(w) >> 8))
+
+/* Get the low word of a long.                      */
+#define LOWORD(l)       ((unsigned short)(l))
+
+/* Get the high word of a long.                     */
+#define HIWORD(l)       ((unsigned short)((unsigned long)(l) >> 16))
+
+
+
+/* Token ring adapter I/O addresses for normal mode. */
+#define SIFDAT      		0L	/* SIF/DMA data. */
+#define SIFINC      		2L  	/* IO Word data with auto increment. */
+#define SIFINH      		3L  	/* IO Byte data with auto increment. */
+#define SIFADR      		4L  	/* SIF/DMA Address. */
+#define SIFCMD      		6L  	/* SIF Command. */
+#define SIFSTS      		6L  	/* SIF Status. */
+#define SIFACL      		8L  	/* SIF Adapter Control Register. */
+#define SIFADD      		10L 	/* SIF/DMA Address. */
+#define SIFADX      		12L
+#define DMALEN      		14L 	/* SIF DMA length. */
+#define POSREG      		16L 	/* Adapter Program Option Select (POS)
+			 		 * Register: base IO address + 16 byte.
+			 		 */
+#define POSREG_2    		24L 	/* only for TR4/16+ adapter
+			 		 * base IO address + 24 byte.
+			 		 */
+
+
+/* SIFCMD command codes (high-low) */
+#define CMD_INTERRUPT_ADAPTER   0x8000  /* Cause internal adapter interrupt */
+#define CMD_ADAPTER_RESET   	0x4000  /* Hardware reset of adapter */
+#define CMD_SSB_CLEAR		0x2000  /* Acknowledge to adapter to
+					 * system interrupts.
+					 */
+#define CMD_EXECUTE		0x1000	/* Execute SCB command */
+#define CMD_SCB_REQUEST		0x0800  /* Request adapter to interrupt
+					 * system when SCB is available for
+					 * another command.
+					 */
+#define CMD_RX_CONTINUE		0x0400  /* Continue receive after odd pointer
+					 * stop. (odd pointer receive method)
+					 */
+#define CMD_RX_VALID		0x0200  /* Now actual RPL is valid. */
+#define CMD_TX_VALID		0x0100  /* Now actual TPL is valid. (valid
+					 * bit receive/transmit method)
+					 */
+#define CMD_SYSTEM_IRQ		0x0080  /* Adapter-to-attached-system
+					 * interrupt is reset.
+					 */
+#define CMD_CLEAR_SYSTEM_IRQ	0x0080	/* Clear SYSTEM_INTERRUPT bit.
+					 * (write: 1=ignore, 0=reset)
+					 */
+#define EXEC_SOFT_RESET		0xFF00  /* adapter soft reset. (restart
+					 * adapter after hardware reset)
+					 */
+
+
+/* ACL commands (high-low) */
+#define ACL_SWHLDA		0x0800  /* Software hold acknowledge. */
+#define ACL_SWDDIR		0x0400  /* Data transfer direction. */
+#define ACL_SWHRQ		0x0200  /* Pseudo DMA operation. */
+#define ACL_PSDMAEN		0x0100  /* Enable pseudo system DMA. */
+#define ACL_ARESET		0x0080  /* Adapter hardware reset command.
+					 * (held in reset condition as
+					 * long as bit is set)
+					 */
+#define ACL_CPHALT		0x0040  /* Communication processor halt.
+					 * (can only be set while ACL_ARESET
+					 * bit is set; prevents adapter
+					 * processor from executing code while
+					 * downloading firmware)
+					 */
+#define ACL_BOOT		0x0020
+#define ACL_SINTEN		0x0008  /* System interrupt enable/disable
+					 * (1/0): can be written if ACL_ARESET
+					 * is zero.
+					 */
+#define ACL_SPEED4		0x0003
+#define ACL_SPEED16		0x0001
+#define PS_DMA_MASK		(ACL_SWHRQ | ACL_PSDMAEN)
+
+
+/* SIFSTS register return codes (high-low) */
+#define STS_SYSTEM_IRQ		0x0080	/* Adapter-to-attached-system
+					 * interrupt is valid.
+					 */
+#define STS_INITIALIZE		0x0040  /* INITIALIZE status. (ready to
+					 * initialize)
+					 */
+#define STS_TEST		0x0020  /* TEST status. (BUD not completed) */
+#define STS_ERROR		0x0010  /* ERROR status. (unrecoverable
+					 * HW error occurred)
+					 */
+#define STS_MASK		0x00F0  /* Mask interesting status bits. */
+#define STS_ERROR_MASK		0x000F  /* Get Error Code by masking the
+					 * interrupt code bits.
+					 */
+#define ADAPTER_INT_PTRS	0x0A00  /* Address offset of adapter internal
+					 * pointers 01:0a00 (high-low) have to
+					 * be read after init and before open.
+					 */
+
+
+/* Interrupt Codes (only MAC IRQs) */
+#define STS_IRQ_ADAPTER_CHECK   0x0000  /* unrecoverable hardware or
+					 * software error.
+					 */ 
+#define STS_IRQ_RING_STATUS     0x0004  /* SSB is updated with ring status. */
+#define STS_IRQ_SCB_CLEAR       0x0006  /* SCB clear, following an
+					 * SCB_REQUEST IRQ.
+					 */
+#define STS_IRQ_COMMAND_STATUS  0x0008  /* SSB is updated with command 
+					 * status.
+					 */ 
+#define STS_IRQ_RECEIVE_STATUS  0x000A  /* SSB is updated with receive
+					 * status.
+					 */
+#define STS_IRQ_TRANSMIT_STATUS 0x000C  /* SSB is updated with transmit
+                                         * status
+					 */
+#define STS_IRQ_MASK            0x000F  /* = STS_ERROR_MASK. */
+
+
+/* TRANSMIT_STATUS completion code: (SSB.Parm[0]) */
+#define COMMAND_COMPLETE        0x0080  /* TRANSMIT command completed
+                                         * (avoid this!) issue another transmit
+					 * to send additional frames.
+					 */
+#define FRAME_COMPLETE          0x0040  /* Frame has been transmitted;
+					 * INTERRUPT_FRAME bit was set in the
+					 * CSTAT request; indication of possibly
+					 * more than one frame transmissions!
+					 * SSB.Parm[0-1]: 32 bit pointer to
+					 * TPL of last frame.
+					 */
+#define LIST_ERROR              0x0020  /* Error in one of the TPLs that
+					 * compose the frame; TRANSMIT
+					 * terminated; Parm[1-2]: 32 bit pointer
+					 * to TPL which starts the error
+					 * frame; error details in bits 8-13.
+					 * (14?)
+					 */
+#define FRAME_SIZE_ERROR        0x8000  /* FRAME_SIZE does not equal the sum of
+					 * the valid DATA_COUNT fields;
+					 * FRAME_SIZE less than header plus
+					 * information field. (15 bytes +
+					 * routing field) Or if FRAME_SIZE
+					 * was specified as zero in one list.
+					 */
+#define TX_THRESHOLD            0x4000  /* FRAME_SIZE greater than (BUFFER_SIZE
+					 * - 9) * TX_BUF_MAX.
+					 */
+#define ODD_ADDRESS             0x2000  /* Odd forward pointer value is
+					 * read on a list without END_FRAME
+					 * indication.
+					 */
+#define FRAME_ERROR             0x1000  /* START_FRAME bit is (not) anticipated,
+					 * but (not) set.
+					 */
+#define ACCESS_PRIORITY_ERROR   0x0800  /* Access priority requested has not
+					 * been allowed.
+					 */
+#define UNENABLED_MAC_FRAME     0x0400  /* MAC frame has source class of zero
+					 * or MAC frame PCF ATTN field is
+					 * greater than one.
+					 */
+#define ILLEGAL_FRAME_FORMAT    0x0200  /* Bit 0 or FC field was set to one. */
+
+
+/*
+ * Since we need to support some functions even if the adapter is in a
+ * CLOSED state, we have a (pseudo-) command queue which holds commands
+ * that are outstandig to be executed.
+ *
+ * Each time a command completes, an interrupt occurs and the next
+ * command is executed. The command queue is actually a simple word with 
+ * a bit for each outstandig command. Therefore the commands will not be
+ * executed in the order they have been queued.
+ *
+ * The following defines the command code bits and the command queue:
+ */
+#define OC_OPEN                 0x0001	/* OPEN command */
+#define OC_TRANSMIT             0x0002  /* TRANSMIT command */
+#define OC_TRANSMIT_HALT        0x0004  /* TRANSMIT_HALT command */
+#define OC_RECEIVE              0x0008  /* RECEIVE command */
+#define OC_CLOSE                0x0010  /* CLOSE command */
+#define OC_SET_GROUP_ADDR       0x0020  /* SET_GROUP_ADDR command */
+#define OC_SET_FUNCT_ADDR       0x0040  /* SET_FUNCT_ADDR command */
+#define OC_READ_ERROR_LOG       0x0080  /* READ_ERROR_LOG command */
+#define OC_READ_ADAPTER         0x0100  /* READ_ADAPTER command */
+#define OC_MODIFY_OPEN_PARMS    0x0400  /* MODIFY_OPEN_PARMS command */
+#define OC_RESTORE_OPEN_PARMS   0x0800  /* RESTORE_OPEN_PARMS command */
+#define OC_SET_FIRST_16_GROUP   0x1000  /* SET_FIRST_16_GROUP command */
+#define OC_SET_BRIDGE_PARMS     0x2000  /* SET_BRIDGE_PARMS command */
+#define OC_CONFIG_BRIDGE_PARMS  0x4000  /* CONFIG_BRIDGE_PARMS command */
+
+#define OPEN			0x0300  /* C: open command. S: completion. */
+#define TRANSMIT		0x0400  /* C: transmit command. S: completion
+					 * status. (reject: COMMAND_REJECT if
+					 * adapter not opened, TRANSMIT already
+					 * issued or address passed in the SCB
+					 * not word aligned)
+					 */
+#define TRANSMIT_HALT		0x0500  /* C: interrupt TX TPL chain; if no
+					 * TRANSMIT command issued, the command
+					 * is ignored. (completion with TRANSMIT
+					 * status (0x0400)!)
+					 */
+#define RECEIVE			0x0600  /* C: receive command. S: completion
+					 * status. (reject: COMMAND_REJECT if
+					 * adapter not opened, RECEIVE already
+					 * issued or address passed in the SCB 
+					 * not word aligned)
+					 */
+#define CLOSE			0x0700  /* C: close adapter. S: completion.
+					 * (COMMAND_REJECT if adapter not open)
+					 */
+#define SET_GROUP_ADDR		0x0800  /* C: alter adapter group address after
+					 * OPEN.  S: completion. (COMMAND_REJECT
+					 * if adapter not open)
+					 */
+#define SET_FUNCT_ADDR		0x0900  /* C: alter adapter functional address
+					 * after OPEN. S: completion.
+					 * (COMMAND_REJECT if adapter not open)
+					 */
+#define READ_ERROR_LOG		0x0A00  /* C: read adapter error counters.
+					 * S: completion. (command ignored
+					 * if adapter not open!)
+					 */
+#define READ_ADAPTER		0x0B00  /* C: read data from adapter memory.
+					 * (important: after init and before
+					 * open!) S: completion. (ADAPTER_CHECK
+					 * interrupt if undefined storage area
+					 * read)
+					 */
+#define MODIFY_OPEN_PARMS	0x0D00  /* C: modify some adapter operational
+					 * parameters. (bit correspondend to
+					 * WRAP_INTERFACE is ignored)
+					 * S: completion. (reject: 
+					 * COMMAND_REJECT)
+					 */
+#define RESTORE_OPEN_PARMS	0x0E00  /* C: modify some adapter operational
+					 * parameters. (bit correspondend
+					 * to WRAP_INTERFACE is ignored)
+					 * S: completion. (reject:
+					 * COMMAND_REJECT)
+					 */
+#define SET_FIRST_16_GROUP	0x0F00  /* C: alter the first two bytes in
+					 * adapter group address.
+					 * S: completion. (reject:
+					 * COMMAND_REJECT)
+					 */
+#define SET_BRIDGE_PARMS	0x1000  /* C: values and conditions for the
+					 * adapter hardware to use when frames
+					 * are copied for forwarding.
+					 * S: completion. (reject:
+					 * COMMAND_REJECT)
+					 */
+#define CONFIG_BRIDGE_PARMS 0x1100	/* C: ..
+					 * S: completion. (reject:
+					 * COMMAND_REJECT)
+					 */
+
+#define SPEED_4         4
+#define SPEED_16        16	/* Default transmission speed  */
+
+
+/* Initialization Parameter Block (IPB); word alignment necessary! */
+#define BURST_SIZE      0x0018  /* Default burst size */
+#define BURST_MODE      0x9F00  /* Burst mode enable */
+#define DMA_RETRIES     0x0505  /* Magic DMA retry number... */
+
+#define CYCLE_TIME      3	/* Default AT-bus cycle time: 500 ns
+				 * (later adapter version: fix  cycle time!)
+				 */
+#define LINE_SPEED_BIT	0x80
+
+/* Macro definition for the wait function. */
+#define ONE_SECOND_TICKS	1000000
+#define HALF_SECOND		(ONE_SECOND_TICKS / 2)
+#define ONE_SECOND		(ONE_SECOND_TICKS)
+#define TWO_SECONDS		(ONE_SECOND_TICKS * 2)
+#define THREE_SECONDS		(ONE_SECOND_TICKS * 3)
+#define FOUR_SECONDS		(ONE_SECOND_TICKS * 4)
+#define FIVE_SECONDS		(ONE_SECOND_TICKS * 5)
+
+#define BUFFER_SIZE 2048	/* Buffers on Adapter */
+
+#pragma pack(1)
+typedef struct {
+	unsigned short Init_Options;	/* Initialize with burst mode;
+					 * LLC disabled. (MAC only)
+					 */
+
+	/* Interrupt vectors the adapter places on attached system bus. */
+	unsigned char CMD_Status_IV;	/* Interrupt vector: command status. */
+	unsigned char TX_IV;     	/* Interrupt vector: transmit. */
+	unsigned char RX_IV;     	/* Interrupt vector: receive. */
+	unsigned char Ring_Status_IV;	/* Interrupt vector: ring status. */
+	unsigned char SCB_Clear_IV;  	/* Interrupt vector: SCB clear. */
+	unsigned char Adapter_CHK_IV;	/* Interrupt vector: adapter check. */
+
+	unsigned short RX_Burst_Size;	/* Max. number of transfer cycles. */
+	unsigned short TX_Burst_Size;	/* During DMA burst; even value! */
+	unsigned short DMA_Abort_Thrhld; /* Number of DMA retries. */
+
+	unsigned long SCB_Addr;	/* SCB address: even, word aligned, high-low. */
+	unsigned long SSB_Addr;	/* SSB address: even, word aligned, high-low. */
+} IPB, *IPB_Ptr;
+#pragma pack()
+
+/*
+ * OPEN Command Parameter List (OCPL) (can be reused, if the adapter has to
+ * be reopened)
+ */
+#define BUFFER_SIZE	2048		/* Buffers on Adapter. */
+#define TPL_SIZE	8+6*TX_FRAG_NUM /* Depending on fragments per TPL. */
+#define RPL_SIZE	14		/* (with TI firmware v2.26 handling
+					 * up to nine fragments possible)
+					 */
+#define TX_BUF_MIN      20		/* ??? (Stephan: calculation with */
+#define TX_BUF_MAX      40		/* BUFFER_SIZE and MAX_FRAME_SIZE) ??? 
+					 */
+#define DISABLE_EARLY_TOKEN_RELEASE 0x1000
+
+/* OPEN Options (high-low) */
+#define WRAP_INTERFACE		0x0080	/* Inserting omitted for test
+					 * purposes; transmit data appears
+					 * as receive data. (usefull for
+					 * testing; change: CLOSE necessary)
+					 */
+#define DISABLE_HARD_ERROR	0x0040  /* On HARD_ERROR & TRANSMIT_BEACON
+					 * no RING.STATUS interrupt.
+					 */
+#define DISABLE_SOFT_ERROR	0x0020  /* On SOFT_ERROR, no RING.STATUS
+					 * interrupt.
+					 */
+#define PASS_ADAPTER_MAC_FRAMES 0x0010  /* Passing unsupported MAC frames
+					 * to system.
+					 */
+#define PASS_ATTENTION_FRAMES   0x0008  /* All changed attention MAC frames are
+					 * passed to the system.
+					 */
+#define PAD_ROUTING_FIELD	0x0004  /* Routing field is padded to 18
+					 * bytes.
+					 */
+#define FRAME_HOLD		0x0002  /* Adapter waits for entire frame before
+					 * initiating DMA transfer; otherwise:
+					 * DMA transfer initiation if internal
+					 * buffer filled.
+					 */
+#define CONTENDER		0x0001  /* Adapter participates in the monitor
+					 * contention process.
+					 */
+#define PASS_BEACON_MAC_FRAMES  0x8000  /* Adapter passes beacon MAC frames
+					 * to the system.
+					 */
+#define EARLY_TOKEN_RELEASE 	0x1000  /* Only valid in 16 Mbps operation;
+					 * 0 = ETR. (no effect in 4 Mbps
+					 * operation)
+					 */
+#define COPY_ALL_MAC_FRAMES	0x0400  /* All MAC frames are copied to
+					 * the system. (after OPEN: duplicate
+					 * address test (DAT) MAC frame is 
+					 * first received frame copied to the
+					 * system)
+					 */
+#define COPY_ALL_NON_MAC_FRAMES	0x0200  /* All non MAC frames are copied to
+					 * the system.
+					 */
+#define PASS_FIRST_BUF_ONLY	0x0100  /* Passes only first internal buffer
+					 * of each received frame; FrameSize
+					 * of RPLs must contain internal
+					 * BUFFER_SIZE bits for promiscous mode.
+					 */
+#define ENABLE_FULL_DUPLEX_SELECTION 0x2000 /* Enable the use of full-duplex
+					 * settings with bits in byte 22 in
+					 * ocpl. (new feature in firmware
+					 * version 3.09)
+					 */
+
+/* Full-duplex settings */
+#define OPEN_FULL_DUPLEX_OFF	0x0000
+#define OPEN_FULL_DUPLEX_ON	0x00c0
+#define OPEN_FULL_DUPLEX_AUTO	0x0080
+
+#define PROD_ID_SIZE	18	/* Length of product ID. */
+
+#define TX_FRAG_NUM	3	 /* Number of fragments used in one TPL. */
+#define TX_MORE_FRAGMENTS 0x8000 /* Bit set in DataCount to indicate more
+				  * fragments following.
+				  */
+
+#define ISA_MAX_ADDRESS 0x00ffffff
+
+#pragma pack(1)
+typedef struct {
+	unsigned short OPENOptions;
+	unsigned char NodeAddr[6];	/* Adapter node address; use ROM 
+					 * address
+					 */
+	unsigned long GroupAddr;	/* Multicast: high order
+					 * bytes = 0xC000
+					 */
+	unsigned long FunctAddr;	/* High order bytes = 0xC000 */
+	unsigned short RxListSize;	/* RPL size: 0 (=26), 14, 20 or
+					 * 26 bytes read by the adapter.
+					 * (Depending on the number of 
+					 * fragments/list)
+					 */
+	unsigned short TxListSize;	/* TPL size */
+	unsigned short BufSize;		/* Is automatically rounded up to the
+					 * nearest nK boundary.
+					 */
+	unsigned short FullDuplex;
+	unsigned short Reserved;
+	unsigned char TXBufMin;		/* Number of adapter buffers reserved
+					 * for transmission a minimum of 2
+					 * buffers must be allocated.
+					 */
+	unsigned char TXBufMax;		/* Maximum number of adapter buffers
+					 * for transmit; a minimum of 2 buffers
+					 * must be available for receive.
+					 * Default: 6
+					 */
+	unsigned short ProdIDAddr[2];	/* Pointer to product ID. */
+} OPB, *OPB_Ptr;
+#pragma pack()
+
+/*
+ * SCB: adapter commands enabled by the host system started by writing
+ * CMD_INTERRUPT_ADAPTER | CMD_EXECUTE (|SCB_REQUEST) to the SIFCMD IO
+ * register. (special case: | CMD_SYSTEM_IRQ for initialization)
+ */
+#pragma pack(1)
+typedef struct {
+	unsigned short CMD;	/* Command code */
+	unsigned short Parm[2];	/* Pointer to Command Parameter Block */
+} SCB;	/* System Command Block (32 bit physical address; big endian)*/
+#pragma pack()
+
+/*
+ * SSB: adapter command return status can be evaluated after COMMAND_STATUS
+ * adapter to system interrupt after reading SSB, the availability of the SSB
+ * has to be told the adapter by writing CMD_INTERRUPT_ADAPTER | CMD_SSB_CLEAR
+ * in the SIFCMD IO register.
+ */
+#pragma pack(1)
+typedef struct {
+	unsigned short STS;	/* Status code */
+	unsigned short Parm[3];	/* Parameter or pointer to Status Parameter
+				 * Block.
+				 */
+} SSB;	/* System Status Block (big endian - physical address)  */
+#pragma pack()
+
+typedef struct {
+	unsigned short BurnedInAddrPtr;	/* Pointer to adapter burned in
+					 * address. (BIA)
+					 */
+	unsigned short SoftwareLevelPtr;/* Pointer to software level data. */
+	unsigned short AdapterAddrPtr;	/* Pointer to adapter addresses. */
+	unsigned short AdapterParmsPtr;	/* Pointer to adapter parameters. */
+	unsigned short MACBufferPtr;	/* Pointer to MAC buffer. (internal) */
+	unsigned short LLCCountersPtr;	/* Pointer to LLC counters.  */
+	unsigned short SpeedFlagPtr;	/* Pointer to data rate flag.
+					 * (4/16 Mbps)
+					 */
+	unsigned short AdapterRAMPtr;	/* Pointer to adapter RAM found. (KB) */
+} INTPTRS;	/* Adapter internal pointers */
+
+#pragma pack(1)
+typedef struct {
+	unsigned char Line_Error;	/* Line error: code violation in
+					 * frame or in a token, or FCS error.
+					 */
+	unsigned char Internal_Error;	/* IBM specific. (Reserved_1) */
+	unsigned char Burst_Error;
+	unsigned char ARI_FCI_Error;	/* ARI/FCI bit zero in AMP or
+					 * SMP MAC frame.
+					 */
+	unsigned char AbortDelimeters;	/* IBM specific. (Reserved_2) */
+	unsigned char Reserved_3;
+	unsigned char Lost_Frame_Error;	/* Receive of end of transmitted
+					 * frame failed.
+					 */
+	unsigned char Rx_Congest_Error;	/* Adapter in repeat mode has not
+					 * enough buffer space to copy incoming
+					 * frame.
+					 */
+	unsigned char Frame_Copied_Error;/* ARI bit not zero in frame
+					 * addressed to adapter.
+					 */
+	unsigned char Frequency_Error;	/* IBM specific. (Reserved_4) */
+	unsigned char Token_Error;	/* (active only in monitor station) */
+	unsigned char Reserved_5;
+	unsigned char DMA_Bus_Error;	/* DMA bus errors not exceeding the
+					 * abort thresholds.
+					 */
+	unsigned char DMA_Parity_Error;	/* DMA parity errors not exceeding
+					 * the abort thresholds.
+					 */
+} ERRORTAB;	/* Adapter error counters */
+#pragma pack()
+
+
+/*--------------------- Send and Receive definitions -------------------*/
+#pragma pack(1)
+typedef struct {
+	unsigned short DataCount;	/* Value 0, even and odd values are
+					 * permitted; value is unaltered most
+					 * significant bit set: following
+					 * fragments last fragment: most
+					 * significant bit is not evaluated.
+					 * (???)
+					 */
+	unsigned long DataAddr;		/* Pointer to frame data fragment;
+					 * even or odd.
+					 */
+} Fragment;
+#pragma pack()
+
+#define MAX_FRAG_NUMBERS    9	/* Maximal number of fragments possible to use
+				 * in one RPL/TPL. (depending on TI firmware 
+				 * version)
+				 */
+#define MAX_TX_QUEUE	    10	/* Maximal number of skb's queued in driver. */
+
+/*
+ * AC (1), FC (1), Dst (6), Src (6), RIF (18), Data (4472) = 4504
+ * The packet size can be one of the follows: 548, 1502, 2084, 4504, 8176,
+ * 11439, 17832. Refer to TMS380 Second Generation Token Ring User's Guide
+ * Page 2-27.
+ */
+#define HEADER_SIZE		(1 + 1 + 6 + 6)
+#define SRC_SIZE		18
+#define MIN_DATA_SIZE		516
+#define DEFAULT_DATA_SIZE	4472
+#define MAX_DATA_SIZE		17800
+
+#define DEFAULT_PACKET_SIZE (HEADER_SIZE + SRC_SIZE + DEFAULT_DATA_SIZE)
+#define MIN_PACKET_SIZE     (HEADER_SIZE + SRC_SIZE + MIN_DATA_SIZE)
+#define MAX_PACKET_SIZE     (HEADER_SIZE + SRC_SIZE + MAX_DATA_SIZE)
+
+/*
+ * Macros to deal with the frame status field.
+ */
+#define AC_NOT_RECOGNIZED	0x00
+#define GROUP_BIT		0x80
+#define GET_TRANSMIT_STATUS_HIGH_BYTE(Ts) ((unsigned char)((Ts) >> 8))
+#define GET_FRAME_STATUS_HIGH_AC(Fs)	  ((unsigned char)(((Fs) & 0xC0) >> 6))
+#define GET_FRAME_STATUS_LOW_AC(Fs)       ((unsigned char)(((Fs) & 0x0C) >> 2))
+#define DIRECTED_FRAME(Context)           (!((Context)->MData[2] & GROUP_BIT))
+
+
+/*--------------------- Send Functions ---------------------------------*/
+/* define TX_CSTAT _REQUEST (R) and _COMPLETE (C) values (high-low) */
+
+#define TX_VALID		0x0080	/* R: set via TRANSMIT.VALID interrupt.
+					 * C: always reset to zero!
+					 */
+#define TX_FRAME_COMPLETE	0x0040	/* R: must be reset to zero.
+					 * C: set to one.
+					 */
+#define TX_START_FRAME		0x0020  /* R: start of a frame: 1 
+					 * C: unchanged.
+					 */
+#define TX_END_FRAME		0x0010  /* R: end of a frame: 1
+					 * C: unchanged.
+					 */
+#define TX_FRAME_IRQ		0x0008  /* R: request interrupt generation
+					 * after transmission.
+					 * C: unchanged.
+					 */
+#define TX_ERROR		0x0004  /* R: reserved.
+					 * C: set to one if Error occurred.
+					 */
+#define TX_INTERFRAME_WAIT	0x0004
+#define TX_PASS_CRC		0x0002  /* R: set if CRC value is already
+					 * calculated. (valid only in
+					 * FRAME_START TPL)
+					 * C: unchanged.
+					 */
+#define TX_PASS_SRC_ADDR	0x0001  /* R: adapter uses explicit frame
+					 * source address and does not overwrite
+					 * with the adapter node address.
+					 * (valid only in FRAME_START TPL)
+					 *
+					 * C: unchanged.
+					 */
+#define TX_STRIP_FS		0xFF00  /* R: reserved.
+					 * C: if no Transmission Error,
+					 * field contains copy of FS byte after
+					 * stripping of frame.
+					 */
+
+/*
+ * Structure of Transmit Parameter Lists (TPLs) (only one frame every TPL,
+ * but possibly multiple TPLs for one frame) the length of the TPLs has to be
+ * initialized in the OPL. (OPEN parameter list)
+ */
+#define TPL_NUM		3	/* Number of Transmit Parameter Lists.
+				 * !! MUST BE >= 3 !!
+				 */
+
+#pragma pack(1)
+typedef struct s_TPL TPL;
+
+struct s_TPL {	/* Transmit Parameter List (align on even word boundaries) */
+	unsigned long NextTPLAddr;	/* Pointer to next TPL in chain; if
+					 * pointer is odd: this is the last
+					 * TPL. Pointing to itself can cause
+					 * problems!
+					 */
+	volatile unsigned short Status;	/* Initialized by the adapter:
+					 * CSTAT_REQUEST important: update least
+					 * significant bit first! Set by the
+					 * adapter: CSTAT_COMPLETE status.
+					 */
+	unsigned short FrameSize;	/* Number of bytes to be transmitted
+					 * as a frame including AC/FC,
+					 * Destination, Source, Routing field
+					 * not including CRC, FS, End Delimiter
+					 * (valid only if START_FRAME bit in 
+					 * CSTAT nonzero) must not be zero in
+					 * any list; maximum value: (BUFFER_SIZE
+					 * - 8) * TX_BUF_MAX sum of DataCount
+					 * values in FragmentList must equal
+					 * Frame_Size value in START_FRAME TPL!
+					 * frame data fragment list.
+					 */
+
+	/* TPL/RPL size in OPEN parameter list depending on maximal
+	 * numbers of fragments used in one parameter list.
+	 */
+	Fragment FragList[TX_FRAG_NUM];	/* Maximum: nine frame fragments in one
+					 * TPL actual version of firmware: 9
+					 * fragments possible.
+					 */
+#pragma pack()
+
+	/* Special proprietary data and precalculations */
+
+	TPL *NextTPLPtr;		/* Pointer to next TPL in chain. */
+	unsigned char *MData;
+	struct sk_buff *Skb;
+	unsigned char TPLIndex;
+	volatile unsigned char BusyFlag;/* Flag: TPL busy? */
+};
+
+/* ---------------------Receive Functions-------------------------------*
+ * define RECEIVE_CSTAT_REQUEST (R) and RECEIVE_CSTAT_COMPLETE (C) values.
+ * (high-low)
+ */
+#define RX_VALID		0x0080	/* R: set; tell adapter with
+					 * RECEIVE.VALID interrupt.
+					 * C: reset to zero.
+					 */
+#define RX_FRAME_COMPLETE	0x0040  /* R: must be reset to zero,
+					 * C: set to one.
+					 */
+#define RX_START_FRAME		0x0020  /* R: must be reset to zero.
+					 * C: set to one on the list.
+					 */
+#define RX_END_FRAME		0x0010  /* R: must be reset to zero.
+					 * C: set to one on the list
+					 * that ends the frame.
+					 */
+#define RX_FRAME_IRQ		0x0008  /* R: request interrupt generation
+					 * after receive.
+					 * C: unchanged.
+					 */
+#define RX_INTERFRAME_WAIT	0x0004  /* R: after receiving a frame:
+					 * interrupt and wait for a
+					 * RECEIVE.CONTINUE.
+					 * C: unchanged.
+					 */
+#define RX_PASS_CRC		0x0002  /* R: if set, the adapter includes
+					 * the CRC in data passed. (last four 
+					 * bytes; valid only if FRAME_START is
+					 * set)
+					 * C: set, if CRC is included in
+					 * received data.
+					 */
+#define RX_PASS_SRC_ADDR	0x0001  /* R: adapter uses explicit frame
+					 * source address and does not
+					 * overwrite with the adapter node
+					 * address. (valid only if FRAME_START
+					 * is set)
+					 * C: unchanged.
+					 */
+#define RX_RECEIVE_FS		0xFC00  /* R: reserved; must be reset to zero.
+					 * C: on lists with START_FRAME, field
+					 * contains frame status field from
+					 * received frame; otherwise cleared.
+					 */
+#define RX_ADDR_MATCH		0x0300  /* R: reserved; must be reset to zero.
+					 * C: address match code mask.
+					 */ 
+#define RX_STATUS_MASK		0x00FF  /* Mask for receive status bits. */
+
+#define RX_INTERN_ADDR_MATCH    0x0100  /* C: internally address match. */
+#define RX_EXTERN_ADDR_MATCH    0x0200  /* C: externally matched via
+					 * XMATCH/XFAIL interface.
+					 */
+#define RX_INTEXT_ADDR_MATCH    0x0300  /* C: internally and externally
+					 * matched.
+					 */
+#define RX_READY (RX_VALID | RX_FRAME_IRQ) /* Ready for receive. */
+
+/* Constants for Command Status Interrupt.
+ * COMMAND_REJECT status field bit functions (SSB.Parm[0])
+ */
+#define ILLEGAL_COMMAND		0x0080	/* Set if an unknown command
+					 * is issued to the adapter
+					 */
+#define ADDRESS_ERROR		0x0040  /* Set if any address field in
+					 * the SCB is odd. (not word aligned)
+					 */
+#define ADAPTER_OPEN		0x0020  /* Command issued illegal with
+					 * open adapter.
+					 */
+#define ADAPTER_CLOSE		0x0010  /* Command issued illegal with
+					 * closed adapter.
+					 */
+#define SAME_COMMAND		0x0008  /* Command issued with same command
+					 * already executing.
+					 */
+
+/* OPEN_COMPLETION values (SSB.Parm[0], MSB) */
+#define NODE_ADDR_ERROR		0x0040  /* Wrong address or BIA read
+					 * zero address.
+					 */
+#define LIST_SIZE_ERROR		0x0020  /* If List_Size value not in 0,
+					 * 14, 20, 26.
+					 */
+#define BUF_SIZE_ERROR		0x0010  /* Not enough available memory for
+					 * two buffers.
+					 */
+#define TX_BUF_COUNT_ERROR	0x0004  /* Remaining receive buffers less than
+					 * two.
+					 */
+#define OPEN_ERROR		0x0002	/* Error during ring insertion; more
+					 * information in bits 8-15.
+					 */
+
+/* Standard return codes */
+#define GOOD_COMPLETION		0x0080  /* =OPEN_SUCCESSFULL */
+#define INVALID_OPEN_OPTION	0x0001  /* OPEN options are not supported by
+					 * the adapter.
+					 */
+
+/* OPEN phases; details of OPEN_ERROR (SSB.Parm[0], LSB)            */
+#define OPEN_PHASES_MASK            0xF000  /* Check only the bits 8-11. */
+#define LOBE_MEDIA_TEST             0x1000
+#define PHYSICAL_INSERTION          0x2000
+#define ADDRESS_VERIFICATION        0x3000
+#define PARTICIPATION_IN_RING_POLL  0x4000
+#define REQUEST_INITIALISATION      0x5000
+#define FULLDUPLEX_CHECK            0x6000
+
+/* OPEN error codes; details of OPEN_ERROR (SSB.Parm[0], LSB) */
+#define OPEN_ERROR_CODES_MASK	0x0F00  /* Check only the bits 12-15. */
+#define OPEN_FUNCTION_FAILURE   0x0100  /* Unable to transmit to itself or
+					 * frames received before insertion.
+					 */
+#define OPEN_SIGNAL_LOSS	0x0200	/* Signal loss condition detected at
+					 * receiver.
+					 */
+#define OPEN_TIMEOUT		0x0500	/* Insertion timer expired before
+					 * logical insertion.
+					 */
+#define OPEN_RING_FAILURE	0x0600	/* Unable to receive own ring purge
+					 * MAC frames.
+					 */
+#define OPEN_RING_BEACONING	0x0700	/* Beacon MAC frame received after
+					 * ring insertion.
+					 */
+#define OPEN_DUPLICATE_NODEADDR	0x0800  /* Other station in ring found
+					 * with the same address.
+					 */
+#define OPEN_REQUEST_INIT	0x0900	/* RPS present but does not respond. */
+#define OPEN_REMOVE_RECEIVED    0x0A00  /* Adapter received a remove adapter
+					 * MAC frame.
+					 */
+#define OPEN_FULLDUPLEX_SET	0x0D00	/* Got this with full duplex on when
+					 * trying to connect to a normal ring.
+					 */
+
+/* SET_BRIDGE_PARMS return codes: */
+#define BRIDGE_INVALID_MAX_LEN  0x4000  /* MAX_ROUTING_FIELD_LENGTH odd,
+					 * less than 6 or > 30.
+					 */
+#define BRIDGE_INVALID_SRC_RING 0x2000  /* SOURCE_RING number zero, too large
+					 * or = TARGET_RING.
+					 */
+#define BRIDGE_INVALID_TRG_RING 0x1000  /* TARGET_RING number zero, too large
+					 * or = SOURCE_RING.
+					 */
+#define BRIDGE_INVALID_BRDGE_NO 0x0800  /* BRIDGE_NUMBER too large. */
+#define BRIDGE_INVALID_OPTIONS  0x0400  /* Invalid bridge options. */
+#define BRIDGE_DIAGS_FAILED     0x0200  /* Diagnostics of TMS380SRA failed. */
+#define BRIDGE_NO_SRA           0x0100  /* The TMS380SRA does not exist in HW
+					 * configuration.
+					 */
+
+/*
+ * Bring Up Diagnostics error codes.
+ */
+#define BUD_INITIAL_ERROR       0x0
+#define BUD_CHECKSUM_ERROR      0x1
+#define BUD_ADAPTER_RAM_ERROR   0x2
+#define BUD_INSTRUCTION_ERROR   0x3
+#define BUD_CONTEXT_ERROR       0x4
+#define BUD_PROTOCOL_ERROR      0x5
+#define BUD_INTERFACE_ERROR	0x6
+
+/* BUD constants */
+#define BUD_MAX_RETRIES         3
+#define BUD_MAX_LOOPCNT         6
+#define BUD_TIMEOUT             3000
+
+/* Initialization constants */
+#define INIT_MAX_RETRIES        3	/* Maximum three retries. */
+#define INIT_MAX_LOOPCNT        22      /* Maximum loop counts. */
+
+/* RING STATUS field values (high/low) */
+#define SIGNAL_LOSS             0x0080  /* Loss of signal on the ring
+					 * detected.
+					 */
+#define HARD_ERROR              0x0040  /* Transmitting or receiving beacon
+					 * frames.
+					 */
+#define SOFT_ERROR              0x0020  /* Report error MAC frame
+					 * transmitted.
+					 */
+#define TRANSMIT_BEACON         0x0010  /* Transmitting beacon frames on the
+					 * ring.
+					 */
+#define LOBE_WIRE_FAULT         0x0008  /* Open or short circuit in the
+					 * cable to concentrator; adapter
+					 * closed.
+					 */
+#define AUTO_REMOVAL_ERROR      0x0004  /* Lobe wrap test failed, deinserted;
+					 * adapter closed.
+					 */
+#define REMOVE_RECEIVED         0x0001  /* Received a remove ring station MAC
+					 * MAC frame request; adapter closed.
+					 */
+#define COUNTER_OVERFLOW        0x8000  /* Overflow of one of the adapters
+					 * error counters; READ.ERROR.LOG.
+					 */
+#define SINGLE_STATION          0x4000  /* Adapter is the only station on the
+					 * ring.
+					 */
+#define RING_RECOVERY           0x2000  /* Claim token MAC frames on the ring;
+					 * reset after ring purge frame.
+					 */
+
+#define ADAPTER_CLOSED (LOBE_WIRE_FAULT | AUTO_REMOVAL_ERROR |\
+                        REMOVE_RECEIVED)
+
+/* Adapter_check_block.Status field bit assignments: */
+#define DIO_PARITY              0x8000  /* Adapter detects bad parity
+					 * through direct I/O access.
+					 */
+#define DMA_READ_ABORT          0x4000  /* Aborting DMA read operation
+					 * from system Parm[0]: 0=timeout,
+					 * 1=parity error, 2=bus error;
+					 * Parm[1]: 32 bit pointer to host
+					 * system address at failure.
+					 */
+#define DMA_WRITE_ABORT         0x2000  /* Aborting DMA write operation
+					 * to system. (parameters analogous to
+					 * DMA_READ_ABORT)
+					 */
+#define ILLEGAL_OP_CODE         0x1000  /* Illegal operation code in the
+					 * the adapters firmware Parm[0]-2:
+					 * communications processor registers
+					 * R13-R15.
+					 */
+#define PARITY_ERRORS           0x0800  /* Adapter detects internal bus
+					 * parity error.
+					 */
+#define RAM_DATA_ERROR          0x0080  /* Valid only during RAM testing;
+					 * RAM data error Parm[0-1]: 32 bit
+					 * pointer to RAM location.
+					 */
+#define RAM_PARITY_ERROR        0x0040  /* Valid only during RAM testing;
+					 * RAM parity error Parm[0-1]: 32 bit
+					 * pointer to RAM location.
+					 */
+#define RING_UNDERRUN           0x0020  /* Internal DMA underrun when
+					 * transmitting onto ring.
+					 */
+#define INVALID_IRQ             0x0008  /* Unrecognized interrupt generated
+					 * internal to adapter Parm[0-2]:
+					 * adapter register R13-R15.
+					 */
+#define INVALID_ERROR_IRQ       0x0004  /* Unrecognized error interrupt
+					 * generated Parm[0-2]: adapter register
+					 * R13-R15.
+					 */
+#define INVALID_XOP             0x0002  /* Unrecognized XOP request in
+					 * communication processor Parm[0-2]:
+					 * adapter register R13-R15.
+					 */
+#define CHECKADDR               0x05E0  /* Adapter check status information
+					 * address offset.
+					 */
+#define ROM_PAGE_0              0x0000  /* Adapter ROM page 0. */
+
+/*
+ * RECEIVE.STATUS interrupt result SSB values: (high-low)
+ * (RECEIVE_COMPLETE field bit definitions in SSB.Parm[0])
+ */
+#define RX_COMPLETE             0x0080  /* SSB.Parm[0]; SSB.Parm[1]: 32
+					 * bit pointer to last RPL.
+					 */
+#define RX_SUSPENDED            0x0040  /* SSB.Parm[0]; SSB.Parm[1]: 32
+					 * bit pointer to RPL with odd
+					 * forward pointer.
+					 */
+
+/* Valid receive CSTAT: */
+#define RX_FRAME_CONTROL_BITS (RX_VALID | RX_START_FRAME | RX_END_FRAME | \
+			       RX_FRAME_COMPLETE)
+#define VALID_SINGLE_BUFFER_FRAME (RX_START_FRAME | RX_END_FRAME | \
+				   RX_FRAME_COMPLETE)
+
+typedef enum SKB_STAT SKB_STAT;
+enum SKB_STAT {
+	SKB_UNAVAILABLE,
+	SKB_DMA_DIRECT,
+	SKB_DATA_COPY
+};
+
+/* Receive Parameter List (RPL) The length of the RPLs has to be initialized 
+ * in the OPL. (OPEN parameter list)
+ */
+#define RPL_NUM		3
+
+#define RX_FRAG_NUM     1	/* Maximal number of used fragments in one RPL.
+				 * (up to firmware v2.24: 3, now: up to 9)
+				 */
+
+#pragma pack(1)
+typedef struct s_RPL RPL;
+struct s_RPL {	/* Receive Parameter List */
+	unsigned long NextRPLAddr;	/* Pointer to next RPL in chain
+					 * (normalized = physical 32 bit
+					 * address) if pointer is odd: this
+					 * is last RPL. Pointing to itself can
+					 * cause problems!
+					 */
+	volatile unsigned short Status;	/* Set by creation of Receive Parameter
+					 * List RECEIVE_CSTAT_COMPLETE set by
+					 * adapter in lists that start or end
+					 * a frame.
+					 */
+	volatile unsigned short FrameSize; /* Number of bytes received as a
+					 * frame including AC/FC, Destination,
+					 * Source, Routing field not including 
+					 * CRC, FS (Frame Status), End Delimiter
+					 * (valid only if START_FRAME bit in 
+					 * CSTAT nonzero) must not be zero in
+					 * any list; maximum value: (BUFFER_SIZE
+					 * - 8) * TX_BUF_MAX sum of DataCount
+					 * values in FragmentList must equal
+					 * Frame_Size value in START_FRAME TPL!
+					 * frame data fragment list
+					 */
+
+	/* TPL/RPL size in OPEN parameter list depending on maximal numbers
+	 * of fragments used in one parameter list.
+	 */
+	Fragment FragList[RX_FRAG_NUM];	/* Maximum: nine frame fragments in
+					 * one TPL. Actual version of firmware:
+					 * 9 fragments possible.
+					 */
+#pragma pack()
+
+	/* Special proprietary data and precalculations. */
+	RPL *NextRPLPtr;	/* Logical pointer to next RPL in chain. */
+	unsigned char *MData;
+	struct sk_buff *Skb;
+	SKB_STAT SkbStat;
+	int RPLIndex;
+};
+
+/* Information that need to be kept for each board. */
+typedef struct net_local {
+#pragma pack(1)
+	IPB ipb;	/* Initialization Parameter Block. */
+	SCB scb;	/* System Command Block: system to adapter 
+			 * communication.
+			 */
+	SSB ssb;	/* System Status Block: adapter to system 
+			 * communication.
+			 */
+	OPB ocpl;	/* Open Options Parameter Block. */
+
+	ERRORTAB errorlogtable;	/* Adapter statistic error counters.
+				 * (read from adapter memory)
+				 */
+	unsigned char ProductID[PROD_ID_SIZE + 1]; /* Product ID */
+#pragma pack()
+
+	TPL Tpl[TPL_NUM];
+	TPL *TplFree;
+	TPL *TplBusy;
+	unsigned char LocalTxBuffers[TPL_NUM][DEFAULT_PACKET_SIZE];
+
+	RPL Rpl[RPL_NUM];
+	RPL *RplHead;
+	RPL *RplTail;
+	unsigned char LocalRxBuffers[RPL_NUM][DEFAULT_PACKET_SIZE];
+
+	int DataRate;
+	unsigned char ScbInUse;
+	unsigned short CMDqueue;
+
+	unsigned long AdapterOpenFlag:1;
+	unsigned long AdapterVirtOpenFlag:1;
+	unsigned long OpenCommandIssued:1;
+	unsigned long TransmitCommandActive:1;
+	unsigned long TransmitHaltScheduled:1;
+	unsigned long HaltInProgress:1;
+	unsigned long LobeWireFaultLogged:1;
+	unsigned long ReOpenInProgress:1;
+	unsigned long Sleeping:1;
+
+	unsigned long LastOpenStatus;
+	unsigned short CurrentRingStatus;
+	unsigned long MaxPacketSize;
+	
+	unsigned long StartTime;
+	unsigned long LastSendTime;
+
+	struct sk_buff_head SendSkbQueue;
+	unsigned short QueueSkb;
+
+	struct tr_statistics MacStat;	/* MAC statistics structure */
+
+	struct timer_list timer;
+
+	struct wait_queue *wait_for_tok_int;
+
+	INTPTRS intptrs;	/* Internal adapter pointer. Must be read
+				 * before OPEN command.
+				 */
+} NET_LOCAL;
+
+#endif	/* __KERNEL__ */
+#endif	/* __LINUX_SKTR_H */
diff -u --recursive --new-file v2.1.106/linux/drivers/net/sktr_firmware.h linux/drivers/net/sktr_firmware.h
--- v2.1.106/linux/drivers/net/sktr_firmware.h	Wed Dec 31 16:00:00 1969
+++ linux/drivers/net/sktr_firmware.h	Wed Jun 24 14:26:13 1998
@@ -0,0 +1,3616 @@
+/*
+ * The firmware this driver downloads into the tokenring card is a
+ * seperate program and is not GPL'd source code, even though the Linux
+ * side driver and the routine that loads this data into the card are.
+ *
+ * This firmware is licensed to you strictly for use in conjunction
+ * with the use of SysKonnect TokenRing adapters. There is no
+ * waranty expressed or implied about its fitness for any purpose.
+ */
+
+/* sktr_firmware.h: SysKonnect TokenRing driver firmware dump for Linux.
+ *
+ * Notes:
+ *  - Loaded from sktr_reset_adapter upon adapter reset.
+ *
+ * Authors:
+ * - Christoph Goos <cgoos@syskonnect.de>
+ */
+
+#include <linux/config.h>
+
+#if defined(CONFIG_SKTR) || defined(CONFIG_SKTR_MODULE)
+
+unsigned char sktr_code[] = {
+	0x00, 0x00, 0x00, 0xA0, 0x00, 0x20, 0x68, 0x54,
+	0x73, 0x69, 0x63, 0x20, 0x64, 0x6F, 0x20, 0x65,
+	0x73, 0x69, 0x72, 0x20, 0x6C, 0x65, 0x61, 0x65,
+	0x65, 0x73, 0x20, 0x64, 0x6E, 0x75, 0x65, 0x64,
+	0x20, 0x72, 0x69, 0x6C, 0x65, 0x63, 0x63, 0x6E,
+	0x20, 0x65, 0x6E, 0x4F, 0x79, 0x6C, 0x20, 0x2C,
+	0x6C, 0x41, 0x20, 0x6C, 0x69, 0x72, 0x68, 0x67,
+	0x73, 0x74, 0x72, 0x20, 0x73, 0x65, 0x72, 0x65,
+	0x65, 0x76, 0x2E, 0x64, 0x60, 0x01, 0x42, 0x01,
+	0x00, 0x08, 0x08, 0x16, 0xB0, 0x03, 0xE0, 0x04,
+	0x00, 0x00, 0x20, 0x01, 0x00, 0x00, 0xFF, 0xFF,
+	0xFC, 0x13, 0x80, 0x03, 0xA0, 0x07, 0x42, 0x01,
+	0x00, 0x08, 0x20, 0x07, 0x00, 0x00, 0xE0, 0x04,
+	0x00, 0x01, 0x8B, 0x07, 0x00, 0x3D, 0x60, 0x01,
+	0x42, 0x01, 0x80, 0x00, 0x09, 0x13, 0x8B, 0x07,
+	0x00, 0x2D, 0x20, 0xC0, 0x4E, 0x01, 0x80, 0x02,
+	0x41, 0x0F, 0x02, 0x11, 0x8B, 0x07, 0x00, 0x3D,
+	0x0B, 0xC8, 0x4A, 0x01, 0x00, 0x02, 0x00, 0x90,
+	0xA0, 0x09, 0x00, 0xC8, 0x66, 0x01, 0xE0, 0x02,
+	0xA0, 0x00, 0xA0, 0x07, 0x04, 0x01, 0x20, 0x00,
+	0xA0, 0x01, 0x40, 0x01, 0x00, 0xFE, 0x20, 0x48,
+	0x2A, 0xE0, 0x42, 0x01, 0xE0, 0x04, 0x02, 0x01,
+	0xE0, 0x04, 0x60, 0x09, 0xE0, 0x04, 0x82, 0x01,
+	0x60, 0x01, 0x1C, 0x01, 0x04, 0x00, 0x03, 0x16,
+	0xE0, 0x01, 0x40, 0x01, 0x00, 0x0C, 0xA0, 0x06,
+	0xBC, 0xA1, 0xA0, 0x07, 0x04, 0x01, 0x2D, 0x00,
+	0x20, 0xC2, 0x00, 0xE0, 0x88, 0x02, 0x11, 0xE3,
+	0x14, 0x16, 0xA0, 0x07, 0x04, 0x01, 0x2E, 0x00,
+	0x60, 0x01, 0x42, 0x01, 0x00, 0x03, 0x0D, 0x16,
+	0xA0, 0x07, 0x04, 0x01, 0x21, 0x00, 0x88, 0x07,
+	0x00, 0xA0, 0x89, 0x07, 0xFE, 0xFF, 0xA8, 0x09,
+	0xA9, 0x09, 0x8A, 0x07, 0x02, 0xE0, 0xA0, 0x06,
+	0x84, 0xEC, 0x56, 0x10, 0x88, 0x07, 0x00, 0x90,
+	0x89, 0x07, 0xFE, 0x9F, 0xA8, 0x09, 0xA9, 0x09,
+	0x8A, 0x07, 0x78, 0xE0, 0xA0, 0x06, 0x84, 0xEC,
+	0x4B, 0x10, 0xA0, 0x05, 0x04, 0x01, 0x88, 0x07,
+	0x08, 0x00, 0x89, 0x07, 0x7A, 0x00, 0x00, 0x03,
+	0x01, 0x00, 0xA0, 0x06, 0xD2, 0xAC, 0x40, 0x10,
+	0xA0, 0x06, 0xBC, 0xA1, 0xE0, 0x02, 0xF4, 0x03,
+	0x88, 0x07, 0xA0, 0x00, 0x89, 0x07, 0xFE, 0x00,
+	0xA0, 0x06, 0xD2, 0xAC, 0x35, 0x10, 0xE0, 0x02,
+	0xA0, 0x00, 0xE0, 0x04, 0x7E, 0x01, 0xC8, 0x04,
+	0x09, 0x02, 0xF2, 0x03, 0x48, 0x62, 0xE0, 0xC1,
+	0x40, 0x01, 0xA0, 0x01, 0x40, 0x01, 0x00, 0x04,
+	0x18, 0xCE, 0x09, 0x06, 0xFD, 0x16, 0xA0, 0x01,
+	0x40, 0x01, 0x00, 0x40, 0x07, 0xC8, 0x40, 0x01,
+	0x88, 0x07, 0xF4, 0x03, 0x89, 0x07, 0xFE, 0x3F,
+	0xA0, 0x06, 0xD2, 0xAC, 0x19, 0x10, 0xE0, 0x02,
+	0xA0, 0x00, 0xA0, 0x06, 0xFA, 0xAD, 0x14, 0x10,
+	0x08, 0xC8, 0x44, 0x04, 0x09, 0xC8, 0x46, 0x04,
+	0xA0, 0x06, 0x28, 0xAD, 0x0D, 0x10, 0x81, 0x07,
+	0x7C, 0xE0, 0xB1, 0xC0, 0x26, 0x13, 0x01, 0xC8,
+	0xE0, 0x00, 0xA0, 0x05, 0x04, 0x01, 0x92, 0x06,
+	0x03, 0x10, 0x60, 0xC0, 0xE0, 0x00, 0xF5, 0x10,
+	0xE0, 0x01, 0x04, 0x01, 0x10, 0x00, 0xB0, 0x03,
+	0xFF, 0x10, 0xA0, 0x01, 0x04, 0x01, 0x00, 0x80,
+	0x80, 0x03, 0x80, 0x07, 0xA0, 0x00, 0xC2, 0x04,
+	0x80, 0xCC, 0x81, 0x07, 0xAA, 0xA1, 0x82, 0x02,
+	0x1E, 0x00, 0x02, 0x16, 0x81, 0x07, 0xB4, 0xA1,
+	0x81, 0xC4, 0x81, 0x8C, 0xE9, 0x16, 0x82, 0x02,
+	0x7C, 0x00, 0xF2, 0x16, 0x00, 0x03, 0x0F, 0x00,
+	0x5B, 0x04, 0x81, 0x07, 0x08, 0xE1, 0x82, 0x07,
+	0x04, 0x00, 0xE0, 0x04, 0x80, 0x01, 0xE0, 0x04,
+	0x82, 0x01, 0x91, 0xC4, 0xB1, 0x8C, 0xD8, 0x16,
+	0x82, 0x02, 0x7C, 0x00, 0xFA, 0x16, 0x20, 0xC8,
+	0x04, 0xE0, 0x82, 0x01, 0x20, 0xE8, 0x0C, 0xE0,
+	0x82, 0x01, 0x20, 0xC8, 0x10, 0xE0, 0x80, 0x01,
+	0x81, 0x07, 0x86, 0xE0, 0xB1, 0xC0, 0x07, 0x13,
+	0xB1, 0xC4, 0xFC, 0x10, 0xA0, 0x07, 0x04, 0x01,
+	0x2E, 0x00, 0x60, 0x04, 0xAA, 0xA1, 0x81, 0x07,
+	0x34, 0xE0, 0x82, 0x07, 0xFC, 0x05, 0x83, 0x07,
+	0x0A, 0x00, 0xB1, 0xCC, 0x43, 0x06, 0xFD, 0x16,
+	0x02, 0x02, 0x00, 0x06, 0x60, 0xD0, 0x4E, 0x01,
+	0xED, 0x13, 0x21, 0x02, 0x00, 0xF7, 0x21, 0x02,
+	0x00, 0xC0, 0x81, 0xDC, 0x60, 0xD0, 0x4F, 0x01,
+	0xC1, 0xC0, 0x41, 0x09, 0x21, 0x02, 0x00, 0xF0,
+	0x81, 0xDC, 0x43, 0x02, 0x00, 0x0F, 0x23, 0x02,
+	0x00, 0xF0, 0x83, 0xDC, 0x01, 0x02, 0x32, 0x0C,
+	0xA0, 0xC0, 0x44, 0x04, 0xE0, 0xC0, 0x46, 0x04,
+	0x03, 0xC1, 0x02, 0x61, 0x84, 0x05, 0x04, 0xC8,
+	0x48, 0x04, 0x03, 0xC1, 0x84, 0x05, 0x04, 0xA1,
+	0x01, 0xA1, 0x04, 0xC8, 0x30, 0x0C, 0x03, 0xC1,
+	0x84, 0x05, 0xF1, 0x04, 0x04, 0x06, 0xFD, 0x16,
+	0x08, 0x02, 0x00, 0xA0, 0xA8, 0x09, 0x60, 0xC2,
+	0x30, 0x0C, 0x29, 0x02, 0xFF, 0x03, 0xA9, 0x09,
+	0x29, 0x02, 0x40, 0x00, 0x80, 0x07, 0x00, 0x90,
+	0xA0, 0x09, 0x8A, 0x07, 0xFE, 0x9F, 0x2A, 0x02,
+	0xFF, 0x03, 0xAA, 0x09, 0x01, 0x02, 0x32, 0x0C,
+	0x05, 0x02, 0x00, 0x00, 0x03, 0xC1, 0x84, 0x05,
+	0x11, 0x07, 0xC1, 0x05, 0x85, 0x05, 0x04, 0x06,
+	0x0B, 0x13, 0x85, 0x80, 0xF9, 0x1A, 0x05, 0x80,
+	0xF8, 0x1A, 0x85, 0x82, 0xF5, 0x1A, 0x05, 0x82,
+	0xF4, 0x1A, 0x45, 0x82, 0xF1, 0x1A, 0xF1, 0x10,
+	0x20, 0x2D, 0x02, 0x00, 0x60, 0x01, 0x40, 0x01,
+	0x00, 0x40, 0x06, 0x16, 0x8A, 0x07, 0x00, 0x08,
+	0xA0, 0x01, 0x40, 0x01, 0x00, 0x40, 0x48, 0x10,
+	0x60, 0x01, 0x42, 0x01, 0x00, 0x80, 0x06, 0x16,
+	0x8A, 0x07, 0x00, 0x10, 0xA0, 0x01, 0x42, 0x01,
+	0x00, 0x80, 0x3E, 0x10, 0x60, 0x01, 0x02, 0x01,
+	0x00, 0x10, 0x0A, 0x16, 0x60, 0x01, 0x00, 0x01,
+	0x00, 0x04, 0x06, 0x16, 0x8A, 0x07, 0x00, 0x80,
+	0xA0, 0x01, 0x02, 0x01, 0x00, 0x10, 0x30, 0x10,
+	0x60, 0x01, 0x02, 0x01, 0x00, 0x08, 0x0A, 0x16,
+	0x60, 0x01, 0x00, 0x01, 0x00, 0x04, 0x06, 0x16,
+	0xA0, 0x01, 0x02, 0x01, 0x00, 0x08, 0x0D, 0x02,
+	0x01, 0x00, 0x0D, 0x10, 0x60, 0x01, 0x02, 0x01,
+	0x00, 0x04, 0x16, 0x16, 0x60, 0x01, 0x00, 0x01,
+	0x00, 0x08, 0x12, 0x16, 0xA0, 0x01, 0x02, 0x01,
+	0x00, 0x04, 0x0D, 0x02, 0x02, 0x00, 0xA0, 0xC3,
+	0x0E, 0x01, 0xE0, 0xC3, 0x10, 0x01, 0x8A, 0x07,
+	0x00, 0x20, 0x60, 0x01, 0x00, 0x01, 0x00, 0x80,
+	0x0B, 0x13, 0x8A, 0x07, 0x00, 0x40, 0x08, 0x10,
+	0x8A, 0x07, 0x04, 0x00, 0x05, 0x10, 0x8A, 0x07,
+	0x02, 0x00, 0x02, 0x10, 0x8A, 0x07, 0x08, 0x00,
+	0x00, 0x03, 0x00, 0x00, 0xE0, 0x04, 0x82, 0x01,
+	0x8B, 0x07, 0xE0, 0x05, 0xCA, 0xCE, 0xCD, 0xCE,
+	0xCE, 0xCE, 0xCF, 0xC6, 0x20, 0xC3, 0x58, 0x07,
+	0x20, 0x23, 0x04, 0xE0, 0x12, 0x13, 0x8B, 0x07,
+	0x18, 0xFF, 0x8A, 0x02, 0x00, 0x80, 0x0A, 0x13,
+	0x8B, 0x05, 0xCD, 0xA2, 0x8A, 0x02, 0x00, 0x40,
+	0x05, 0x13, 0x8A, 0x02, 0x00, 0x20, 0x02, 0x13,
+	0x8B, 0x07, 0x1D, 0xFF, 0x0B, 0xC8, 0x04, 0x01,
+	0x0D, 0x10, 0x20, 0xD3, 0x05, 0x01, 0xFD, 0x11,
+	0x20, 0xD8, 0xDF, 0x07, 0x17, 0x01, 0x8B, 0x07,
+	0x80, 0xFF, 0x0B, 0xC8, 0x04, 0x01, 0x20, 0xE8,
+	0x0A, 0xE0, 0x00, 0x01, 0xE0, 0xC2, 0x04, 0x01,
+	0xE0, 0x22, 0x86, 0xE1, 0xFB, 0x16, 0xE0, 0x02,
+	0xA0, 0x00, 0xE0, 0x04, 0x82, 0x01, 0x20, 0xE8,
+	0x0A, 0xE0, 0x00, 0x01, 0xE0, 0xC2, 0x00, 0x01,
+	0xE0, 0x22, 0x06, 0xE0, 0xF8, 0x13, 0xA0, 0x01,
+	0x40, 0x01, 0x00, 0xF6, 0x60, 0x04, 0x90, 0xA0,
+	0x00, 0x03, 0x02, 0x00, 0xA0, 0x07, 0x02, 0x01,
+	0xFF, 0xDF, 0x90, 0x03, 0xFF, 0xFF, 0x80, 0x03,
+	0x00, 0x03, 0x02, 0x00, 0x09, 0x07, 0xA0, 0xC2,
+	0x04, 0x01, 0x8A, 0x01, 0x80, 0x00, 0x4A, 0x52,
+	0x89, 0xD2, 0x0A, 0xC8, 0x04, 0x01, 0xA0, 0xD2,
+	0x04, 0x01, 0xF9, 0x16, 0x49, 0x05, 0x89, 0x01,
+	0x00, 0x80, 0x49, 0x01, 0x00, 0x40, 0x0E, 0x13,
+	0x09, 0xF8, 0x3A, 0x07, 0x60, 0xC2, 0x36, 0x07,
+	0x03, 0x16, 0x90, 0x03, 0xFF, 0xFF, 0x80, 0x03,
+	0xE0, 0x04, 0x36, 0x07, 0x54, 0x04, 0x90, 0x03,
+	0xFF, 0xFF, 0x80, 0x03, 0x60, 0x22, 0x86, 0xE1,
+	0xC2, 0x13, 0xE0, 0x04, 0x82, 0x01, 0x60, 0x04,
+	0xE0, 0xA3, 0x00, 0x03, 0x02, 0x00, 0xA0, 0x07,
+	0x62, 0x09, 0xE8, 0x03, 0xC9, 0x04, 0xA0, 0xC1,
+	0x34, 0x06, 0x04, 0x16, 0xA0, 0x06, 0x50, 0xB5,
+	0xE0, 0x04, 0x20, 0x09, 0x86, 0x07, 0xE8, 0x05,
+	0xA0, 0x01, 0x40, 0x01, 0x00, 0x80, 0x20, 0xC2,
+	0x84, 0x01, 0x20, 0x48, 0x08, 0xE0, 0x84, 0x01,
+	0x20, 0x22, 0x08, 0xE0, 0x08, 0x13, 0x60, 0x01,
+	0xAE, 0x01, 0x01, 0x00, 0x04, 0x16, 0xE0, 0x01,
+	0x34, 0x06, 0x00, 0x80, 0x06, 0x10, 0x20, 0xC2,
+	0x32, 0x09, 0x06, 0x13, 0xE0, 0x01, 0x34, 0x06,
+	0x00, 0x08, 0xE0, 0x04, 0x30, 0x06, 0x09, 0x07,
+	0xA0, 0x05, 0xEE, 0x05, 0x20, 0x06, 0xEC, 0x05,
+	0x02, 0x16, 0x16, 0xC2, 0x03, 0x16, 0x49, 0xC2,
+	0x12, 0x16, 0x80, 0x03, 0x98, 0xC5, 0xE8, 0xC1,
+	0x02, 0x00, 0xE0, 0xE9, 0x14, 0xE0, 0x04, 0x00,
+	0xD7, 0x04, 0x27, 0x02, 0x08, 0x00, 0xA0, 0x06,
+	0xE6, 0xB4, 0x16, 0xC2, 0x04, 0x13, 0x28, 0xC8,
+	0x08, 0x00, 0xEC, 0x05, 0xEF, 0x13, 0x54, 0x04,
+	0x00, 0x03, 0x02, 0x00, 0xE0, 0xC1, 0x86, 0x01,
+	0x47, 0x02, 0x0E, 0x00, 0xA7, 0xC2, 0x90, 0xE1,
+	0x5A, 0x04, 0x8A, 0x07, 0x00, 0xA0, 0x0A, 0xC8,
+	0x86, 0x01, 0xC7, 0xA1, 0x27, 0x02, 0x98, 0xE1,
+	0x37, 0xE8, 0x34, 0x06, 0x17, 0xE8, 0xD2, 0x06,
+	0xE0, 0x04, 0x30, 0x06, 0x60, 0x04, 0xF2, 0xA9,
+	0x0A, 0xE8, 0xD2, 0x06, 0xE0, 0x01, 0x34, 0x06,
+	0x00, 0x08, 0xE0, 0x04, 0x30, 0x06, 0x20, 0xE0,
+	0x18, 0xE0, 0x5B, 0x04, 0xA0, 0x05, 0x20, 0x09,
+	0x20, 0x88, 0x20, 0x09, 0x16, 0xE0, 0xE5, 0x1A,
+	0xE0, 0x04, 0x20, 0x09, 0xA0, 0x06, 0xD0, 0xD5,
+	0x80, 0x03, 0xA0, 0x05, 0x32, 0x09, 0x80, 0x03,
+	0x01, 0xC3, 0xFB, 0x13, 0x60, 0x01, 0x6A, 0x09,
+	0x01, 0x00, 0x78, 0x13, 0xA0, 0x05, 0x32, 0x09,
+	0x75, 0x10, 0x41, 0xC0, 0x06, 0x13, 0x01, 0xC8,
+	0x6C, 0x01, 0xE0, 0xC2, 0x02, 0xFC, 0x01, 0x11,
+	0x7B, 0x10, 0x60, 0x01, 0x9C, 0x01, 0x40, 0x00,
+	0x79, 0x16, 0x20, 0xD8, 0x2F, 0x09, 0x83, 0x01,
+	0x41, 0xC0, 0x04, 0x13, 0x01, 0xC8, 0x8A, 0x01,
+	0x01, 0xC8, 0x18, 0x09, 0x86, 0x07, 0x43, 0x00,
+	0x06, 0xC8, 0x6C, 0x01, 0x07, 0x02, 0x02, 0xFC,    
+	0x17, 0xC2, 0x60, 0x04, 0xFA, 0xA6, 0xE0, 0x04, 
+	0x18, 0x09, 0xC7, 0x61, 0x08, 0x07, 0x60, 0x01, 
+	0x06, 0xFC, 0x40, 0x00, 0x02, 0x13, 0x08, 0x02, 
+	0x01, 0x00, 0x09, 0x10, 0x4C, 0xC2, 0x20, 0xC3, 
+	0x00, 0xFC, 0x2A, 0x13, 0x0C, 0xC8, 0x6C, 0x01, 
+	0xE0, 0xC2, 0x02, 0xFC, 0x1B, 0x11, 0x4B, 0x01, 
+	0x00, 0x01, 0xF4, 0x16, 0xC8, 0x22, 0x12, 0x13, 
+	0xCB, 0x01, 0x00, 0x40, 0x0B, 0xC8, 0x02, 0xFC, 
+	0x0D, 0x10, 0xE0, 0xC1, 0x18, 0x09, 0x01, 0xC3, 
+	0x21, 0x13, 0x4C, 0xC2, 0x15, 0x13, 0x0C, 0xC8, 
+	0x6C, 0x01, 0xE0, 0xC2, 0x02, 0xFC, 0x06, 0x11, 
+	0xCC, 0x81, 0xD5, 0x13, 0x4C, 0xC2, 0x20, 0xC3, 
+	0x00, 0xFC, 0xF4, 0x10, 0x09, 0xC8, 0x6C, 0x01, 
+	0xE0, 0xC2, 0x02, 0xFC, 0x1E, 0x16, 0xA0, 0x07, 
+	0x02, 0xFC, 0x00, 0x80, 0x09, 0xC3, 0x19, 0x10, 
+	0x09, 0xC8, 0x6C, 0x01, 0xE0, 0xC2, 0x02, 0xFC, 
+	0x05, 0x16, 0xA0, 0x07, 0x02, 0xFC, 0x00, 0x80, 
+	0x09, 0xC3, 0x0F, 0x10, 0xE0, 0xC2, 0x02, 0x0C, 
+	0x01, 0x11, 0x1E, 0x10, 0x20, 0xD8, 0x00, 0xE2, 
+	0x83, 0x01, 0x8B, 0x09, 0x8B, 0x09, 0x8B, 0x09,  
+	0x8B, 0x09, 0xA0, 0x07, 0x8A, 0x01, 0x43, 0x00,  
+	0x13, 0x10, 0x0C, 0xC8, 0x8A, 0x01, 0x0C, 0xC8,  
+	0x18, 0x09, 0x0E, 0x10, 0x00, 0x03, 0x02, 0x00, 
+	0xE0, 0xC0, 0x6C, 0x01, 0x20, 0xC3, 0x8A, 0x01,  
+	0x20, 0x98, 0x83, 0x01, 0x00, 0xE2, 0x81, 0x13,  
+	0x60, 0x01, 0x9C, 0x01, 0x40, 0x00, 0xB9, 0x13, 
+	0x01, 0x83, 0x31, 0x16, 0x03, 0xC8, 0x6C, 0x01, 
+	0x40, 0x01, 0x10, 0x00, 0x14, 0x16, 0xE0, 0xC2, 
+	0x2E, 0x06, 0x11, 0x13, 0xE0, 0xC2, 0xF8, 0x05, 
+	0x0E, 0x13, 0xE0, 0x01, 0x3A, 0x07, 0x00, 0x80, 
+	0x80, 0x01, 0x10, 0x00, 0xE0, 0xC2, 0x36, 0x07, 
+	0x06, 0x13, 0xE0, 0x04, 0x36, 0x07, 0x80, 0x01, 
+	0x20, 0x00, 0x60, 0x04, 0xF2, 0xA9, 0x40, 0x01, 
+	0x20, 0x00, 0xF9, 0x13, 0x90, 0x03, 0xFF, 0x11, 
+	0x80, 0x03, 0x08, 0x01, 0x00, 0x04, 0x19, 0x16,  
+	0x60, 0x01, 0x6A, 0x09, 0x01, 0x00, 0x15, 0x16,  
+	0x88, 0x01, 0x00, 0x1A, 0xC8, 0x01, 0x00, 0x01, 
+	0xC8, 0xC5, 0x0F, 0x10, 0xE0, 0x04, 0x18, 0x09, 
+	0xC0, 0x01, 0x04, 0x00, 0x15, 0x10, 0x81, 0xC1, 
+	0x01, 0xC8, 0x6C, 0x01, 0x07, 0x02, 0x00, 0xFC, 
+	0x77, 0xC0, 0x17, 0xC2, 0x48, 0x01, 0x00, 0x18, 
+	0xE4, 0x13, 0x40, 0x01, 0x40, 0x00, 0x15, 0x16, 
+	0x80, 0x01, 0x45, 0x00, 0x46, 0xC1, 0x20, 0xD0, 
+	0x07, 0xFC, 0x60, 0x81, 0x18, 0x09, 0xE6, 0x13, 
+	0xE0, 0xC2, 0x08, 0xFC, 0x08, 0x11, 0xE0, 0xC2, 
+	0x0E, 0xFC, 0x07, 0x15, 0x06, 0x13, 0xE0, 0xC2, 
+	0x14, 0xFC, 0x03, 0x15, 0x02, 0x13, 0xC0, 0x01, 
+	0x01, 0x00, 0x48, 0x01, 0x00, 0x01, 0x11, 0x13, 
+	0x40, 0x01, 0x80, 0x40, 0x69, 0x13, 0x60, 0x04, 
+	0x66, 0xA6, 0x48, 0x01, 0x01, 0x00, 0x03, 0x16, 
+	0x40, 0x01, 0x00, 0x40, 0x0B, 0x16, 0xC8, 0x01, 
+	0x00, 0x40, 0xA0, 0x05, 0x32, 0x09, 0xC8, 0xC5, 
+	0x05, 0x10, 0xC0, 0x01, 0x40, 0x00, 0x40, 0x01, 
+	0x04, 0x00, 0xEF, 0x13, 0xB7, 0x01, 0x20, 0x00, 
+	0xD7, 0xC2, 0xC4, 0x62, 0x0B, 0x05, 0x2B, 0x02, 
+	0xFC, 0xFF, 0xCB, 0xC5, 0x02, 0x15, 0x46, 0x81, 
+	0x6A, 0x13, 0x08, 0x01, 0x00, 0x5E, 0x67, 0x16, 
+	0x08, 0x01, 0x88, 0x00, 0x13, 0x16, 0x86, 0x02, 
+	0x43, 0x00, 0x25, 0x16, 0x40, 0x01, 0x00, 0x40, 
+	0x0B, 0x13, 0x08, 0x01, 0x03, 0x00, 0x08, 0x13, 
+	0x84, 0xC2, 0x2A, 0x02, 0xD8, 0xFF, 0x06, 0xC8, 
+	0x6C, 0x01, 0x0A, 0x68, 0x04, 0xFC, 0x73, 0x10, 
+	0x60, 0x04, 0xD2, 0xA8, 0x40, 0x01, 0x01, 0x00, 
+	0xEA, 0x13, 0x08, 0x01, 0x02, 0x00, 0xE7, 0x16, 
+	0x48, 0x01, 0x01, 0x00, 0xE4, 0x16, 0x40, 0x01, 
+	0x00, 0x40, 0x04, 0x16, 0x60, 0x01, 0xA8, 0x09, 
+	0x80, 0x00, 0xDD, 0x13, 0x8A, 0x07, 0x80, 0x00, 
+	0xA0, 0x06, 0x32, 0xA5, 0xD8, 0x10, 0x00, 0xC0, 
+	0xE7, 0x11, 0x60, 0xC2, 0x6A, 0x09, 0x40, 0x01, 
+	0x00, 0x40, 0x0A, 0x13, 0x48, 0x01, 0x01, 0x00, 
+	0x34, 0x13, 0x48, 0x01, 0x02, 0x00, 0x0A, 0x13, 
+	0x49, 0x01, 0x04, 0x00, 0xD9, 0x16, 0x06, 0x10, 
+	0x49, 0x01, 0x02, 0x00, 0x03, 0x13, 0x08, 0x01, 
+	0x03, 0x00, 0x6E, 0x13, 0x49, 0x01, 0x01, 0x00, 
+	0x12, 0x13, 0x40, 0x01, 0x80, 0x40, 0x01, 0x16, 
+	0x46, 0xC1, 0xE0, 0x04, 0x00, 0xFC, 0x87, 0x07, 
+	0xF8, 0x05, 0x17, 0xC2, 0x14, 0x13, 0xC7, 0x05, 
+	0x17, 0xC8, 0x6C, 0x01, 0x05, 0xC8, 0x00, 0xFC,  
+	0xC6, 0xC5, 0x60, 0x04, 0x66, 0xA6, 0x07, 0x02, 
+	0x02, 0xFC, 0xE0, 0xA1, 0x2C, 0x09, 0xE0, 0xCD,  
+	0xEE, 0x05, 0xE0, 0xC5, 0x04, 0xFC, 0x20, 0xC8, 
+	0x2C, 0x09, 0x04, 0xFC, 0xE2, 0x10, 0xC5, 0xCD, 
+	0xC6, 0xC5, 0x60, 0x04, 0x66, 0xA6, 0x60, 0x04, 
+	0xB6, 0xA8, 0x06, 0xC8, 0x6C, 0x01, 0x85, 0x81, 
+	0x1A, 0x13, 0xE0, 0xC2, 0x04, 0xFC, 0x17, 0x15, 
+	0x86, 0xC2, 0x8A, 0xA2, 0xAA, 0xC1, 0x32, 0x0C, 
+	0x06, 0xC8, 0x6C, 0x01, 0x0B, 0xA8, 0x04, 0xFC, 
+	0x1A, 0x09, 0x0A, 0xC8, 0x6C, 0x01, 0xE0, 0xC2, 
+	0x02, 0xFC, 0xE0, 0x04, 0x00, 0xFC, 0x06, 0xC8, 
+	0x6C, 0x01, 0x0B, 0xC8, 0x02, 0xFC, 0xA0, 0x06, 
+	0x3E, 0xB4, 0x06, 0xC8, 0x6C, 0x01, 0xE0, 0x04, 
+	0x00, 0xFC, 0xA0, 0x01, 0x02, 0xFC, 0x02, 0x00, 
+	0x87, 0x07, 0x30, 0x06, 0xE7, 0x01, 0x04, 0x00, 
+	0x40, 0x00, 0xD7, 0x04, 0x27, 0x02, 0x0C, 0x00, 
+	0x05, 0xC2, 0x60, 0x01, 0x6A, 0x09, 0x04, 0x00, 
+	0x03, 0x16, 0xE0, 0x01, 0x02, 0xFC, 0x20, 0x00, 
+	0xA0, 0x06, 0xFC, 0xB4, 0xC0, 0x01, 0x20, 0x00, 
+	0x60, 0x04, 0x66, 0xA6, 0x48, 0x01, 0x00, 0x18, 
+	0x03, 0x13, 0x48, 0x01, 0x00, 0x10, 0x02, 0x16, 
+	0xA0, 0x05, 0x32, 0x09, 0x86, 0x02, 0x43, 0x00, 
+	0x03, 0x13, 0x40, 0x01, 0x80, 0x40, 0x98, 0x13, 
+	0x06, 0xC8, 0x6C, 0x01, 0xE0, 0x04, 0x00, 0xFC,  
+	0x85, 0xC2, 0xA0, 0x06, 0x3E, 0xB4, 0x20, 0x06, 
+	0x62, 0x09, 0xE6, 0x16, 0xA0, 0x06, 0xD0, 0xD5, 
+	0xE3, 0x10, 0xA0, 0xC2, 0xF6, 0x05, 0x56, 0x16, 
+	0x19, 0xC8, 0xF0, 0x05, 0xA9, 0xC2, 0x0A, 0x00, 
+	0x0D, 0x11, 0xA0, 0xF2, 0x2E, 0x09, 0x0A, 0xD8, 
+	0x80, 0x01, 0x29, 0xC8, 0x06, 0x00, 0x8C, 0x01, 
+	0xA0, 0x07, 0x16, 0x09, 0x04, 0x00, 0x09, 0xC8, 
+	0xF4, 0x05, 0x46, 0x10, 0x29, 0xC8, 0x06, 0x00, 
+	0x6C, 0x01, 0x20, 0xC8, 0x0E, 0xFC, 0xBC, 0x01, 
+	0x20, 0xC8, 0x10, 0xFC, 0xB0, 0x01, 0x20, 0xC8, 
+	0x12, 0xFC, 0xB2, 0x01, 0xA0, 0xF2, 0x2E, 0x09, 
+	0x8A, 0x01, 0x00, 0x10, 0xA0, 0x01, 0x80, 0x01, 
+	0x00, 0xC4, 0xE1, 0x10, 0x47, 0x01, 0x08, 0x00, 
+	0x06, 0x16, 0xA8, 0xC2, 0x06, 0x00, 0xA0, 0x06, 
+	0x3E, 0xB4, 0xE8, 0x04, 0x06, 0x00, 0x07, 0x01, 
+	0x20, 0x00, 0x31, 0x13, 0xE8, 0x04, 0x02, 0x00, 
+	0x3B, 0x10, 0xE0, 0x04, 0x00, 0xFC, 0xA0, 0x06, 
+	0x3E, 0xB4, 0x29, 0x10, 0x00, 0x03, 0x02, 0x00, 
+	0x20, 0xC2, 0x8C, 0x01, 0xE0, 0xC0, 0x6C, 0x01, 
+	0x20, 0xC2, 0xF4, 0x05, 0x28, 0xC8, 0x08, 0x00, 
+	0x6C, 0x01, 0xE8, 0xC1, 0x0A, 0x00, 0x20, 0xC3, 
+	0x02, 0xFC, 0x8C, 0x01, 0x20, 0x00, 0x0C, 0xC8, 
+	0x02, 0xFC, 0x0C, 0x01, 0x00, 0xFE, 0x3B, 0x16, 
+	0x47, 0x01, 0x40, 0x00, 0x50, 0x13, 0x60, 0xC2, 
+	0xF0, 0x05, 0xA7, 0x16, 0xE0, 0x04, 0xF4, 0x05, 
+	0x0C, 0xCA, 0x08, 0x00, 0x47, 0x01, 0x80, 0x00, 
+	0xC9, 0x16, 0x28, 0xC8, 0x06, 0x00, 0x6C, 0x01, 
+	0xA0, 0xC2, 0x00, 0xFC, 0xD2, 0x16, 0xE8, 0xC1, 
+	0x02, 0x00, 0xD7, 0xC2, 0x0F, 0x16, 0x27, 0x02, 
+	0x10, 0x00, 0xD8, 0x04, 0x57, 0xC2, 0x0E, 0x13, 
+	0xC7, 0x05, 0x57, 0xC2, 0x48, 0xC6, 0xC8, 0xC5, 
+	0x03, 0xC8, 0x6C, 0x01, 0x0D, 0x11, 0x90, 0x03, 
+	0xFF, 0x11, 0x80, 0x03, 0xD7, 0x04, 0xC3, 0x01, 
+	0x00, 0x80, 0xED, 0x10, 0xE7, 0x01, 0xF4, 0xFF, 
+	0x20, 0x00, 0xC8, 0xCD, 0xC8, 0xC5, 0xF0, 0x10, 
+	0x90, 0x03, 0xF8, 0x11, 0xE0, 0x02, 0xC0, 0x00, 
+	0x60, 0xC3, 0xFA, 0x00, 0xA0, 0xC3, 0xFC, 0x00, 
+	0xE0, 0xC3, 0xFE, 0x00, 0x54, 0x04, 0xE8, 0xC2, 
+	0x08, 0x00, 0xA8, 0xC2, 0x06, 0x00, 0x0C, 0xC3, 
+	0x33, 0x11, 0x20, 0x23, 0x0A, 0xE0, 0x45, 0x13, 
+	0x20, 0x23, 0x10, 0xE0, 0x46, 0x13, 0x20, 0x23, 
+	0x0E, 0xE0, 0x13, 0x13, 0xE0, 0x21, 0x16, 0xE0, 
+	0xB6, 0x16, 0x20, 0x23, 0x06, 0xE0, 0x03, 0x16, 
+	0x20, 0x27, 0xA8, 0xE4, 0x0A, 0x13, 0xE8, 0xC2, 
+	0x08, 0x00, 0xA8, 0xC2, 0x06, 0x00, 0x4C, 0x01, 
+	0x88, 0x00, 0xA9, 0x16, 0x0C, 0x01, 0x44, 0x00, 
+	0xA6, 0x16, 0x20, 0x06, 0x16, 0x09, 0xA3, 0x13, 
+	0x0A, 0xC8, 0x6C, 0x01, 0x20, 0xC8, 0x04, 0xE0, 
+	0x02, 0xFC, 0x0B, 0xC8, 0x6C, 0x01, 0xA0, 0x07, 
+	0x02, 0xFC, 0x00, 0x81, 0x20, 0xC3, 0x80, 0x01, 
+	0xA0, 0x01, 0x80, 0x01, 0x00, 0xC4, 0x0C, 0xC8, 
+	0x80, 0x01, 0x0A, 0xC8, 0x8C, 0x01, 0xAC, 0x10, 
+	0x0A, 0xC2, 0x0F, 0x13, 0x08, 0xC8, 0x6C, 0x01, 
+	0xA0, 0xC2, 0x00, 0xFC, 0x20, 0xC3, 0x02, 0xFC, 
+	0x20, 0x23, 0x12, 0xE0, 0xF5, 0x16, 0x0B, 0xC8, 
+	0x6C, 0x01, 0x0C, 0xC8, 0x02, 0xFC, 0x60, 0x04, 
+	0x72, 0xA9, 0x8A, 0x07, 0x00, 0x04, 0x60, 0x04, 
+	0x8A, 0xA3, 0x8A, 0x07, 0x20, 0x00, 0x60, 0x04, 
+	0x8A, 0xA3, 0x8A, 0x07, 0x00, 0x02, 0x20, 0x27, 
+	0x0E, 0xE0, 0x04, 0x16, 0xA0, 0x06, 0x32, 0xA5, 
+	0xC3, 0x01, 0x00, 0x80, 0xA8, 0xC2, 0x06, 0x00, 
+	0x60, 0x04, 0x98, 0xA9, 0x00, 0x03, 0x02, 0x00, 
+	0xC0, 0x01, 0x10, 0x00, 0xE0, 0xC2, 0x2E, 0x06, 
+	0x08, 0x13, 0xE0, 0xC2, 0xF8, 0x05, 0x05, 0x13, 
+	0xE0, 0x01, 0x3A, 0x07, 0x00, 0x80, 0x80, 0x01, 
+	0x10, 0x00, 0x90, 0x03, 0xFF, 0x7F, 0x80, 0x03, 
+	0x00, 0x03, 0x02, 0x00, 0x20, 0xC2, 0xF6, 0x05, 
+	0x20, 0xE2, 0xF4, 0x05, 0x0E, 0x16, 0x20, 0xD8, 
+	0x2E, 0x09, 0x80, 0x01, 0x2B, 0xC8, 0x06, 0x00, 
+	0x8C, 0x01, 0xA0, 0x07, 0x16, 0x09, 0x04, 0x00, 
+	0x0B, 0xC8, 0xF4, 0x05, 0x90, 0x03, 0xFF, 0xFF, 
+	0x80, 0x03, 0x87, 0x07, 0xF0, 0x05, 0xDB, 0x04, 
+	0x57, 0xC2, 0x05, 0x16, 0xCB, 0xCD, 0xCB, 0xC5, 
+	0x90, 0x03, 0xFF, 0xFF, 0x80, 0x03, 0xC7, 0x05, 
+	0x57, 0xC2, 0x4B, 0xC6, 0xCB, 0xC5, 0x90, 0x03, 
+	0xFF, 0xFF, 0x80, 0x03, 0x00, 0x03, 0x02, 0x00, 
+	0x0B, 0xC2, 0x20, 0xC3, 0xF4, 0x05, 0x0F, 0x13, 
+	0xA8, 0xC2, 0x0A, 0x00, 0x4A, 0x01, 0x10, 0x00, 
+	0x16, 0x16, 0xA0, 0x22, 0x04, 0xE0, 0x1A, 0x16, 
+	0x08, 0xC3, 0xA0, 0x06, 0x36, 0xAC, 0x0C, 0xC2, 
+	0x20, 0xC3, 0xF4, 0x05, 0x13, 0x16, 0x68, 0x01, 
+	0x0A, 0x00, 0x10, 0x00, 0x03, 0x13, 0xE0, 0xC2, 
+	0xF6, 0x05, 0x05, 0x16, 0xA0, 0x06, 0x78, 0xAC, 
+	0x90, 0x03, 0xFF, 0xFF, 0x80, 0x03, 0x87, 0x07, 
+	0xF0, 0x05, 0xA0, 0x06, 0xE6, 0xB4, 0x90, 0x03, 
+	0xFF, 0xFF, 0x80, 0x03, 0x87, 0x07, 0xF0, 0x05, 
+	0xA0, 0x06, 0x2C, 0xB5, 0x80, 0x03, 0x00, 0x03, 
+	0x02, 0x00, 0x87, 0x07, 0xF0, 0x05, 0xCB, 0xC2, 
+	0x08, 0x16, 0xA0, 0x06, 0x36, 0xAC, 0x20, 0x07, 
+	0xF6, 0x05, 0x60, 0xCB, 0xF4, 0x05, 0x02, 0x00, 
+	0x80, 0x03, 0xE0, 0x04, 0xF6, 0x05, 0x20, 0xC2, 
+	0xF4, 0x05, 0x05, 0x16, 0x17, 0xC2, 0x03, 0x13, 
+	0xD8, 0xC5, 0xA0, 0x06, 0x78, 0xAC, 0x80, 0x03, 
+	0x00, 0x03, 0x02, 0x00, 0x0B, 0xC3, 0xA0, 0x06, 
+	0x36, 0xAC, 0x8C, 0xC2, 0xCC, 0xC1, 0x27, 0x02, 
+	0x10, 0x00, 0x88, 0x07, 0xF0, 0x05, 0x88, 0xC1, 
+	0x18, 0xC2, 0x26, 0x13, 0xA8, 0x82, 0x02, 0x00, 
+	0xFA, 0x16, 0xE8, 0xC2, 0x0A, 0x00, 0xE0, 0x22, 
+	0x1E, 0xE0, 0xF5, 0x16, 0x98, 0xC5, 0xE0, 0x22, 
+	0x1C, 0xE0, 0x0B, 0x16, 0x28, 0xC8, 0x06, 0x00, 
+	0xF4, 0x00, 0xE0, 0x02, 0xE0, 0x00, 0xA0, 0x06, 
+	0x3E, 0xB4, 0xE0, 0x02, 0xC0, 0x00, 0xE8, 0x04, 
+	0x06, 0x00, 0xE0, 0x22, 0x18, 0xE0, 0xE4, 0x13, 
+	0x20, 0xEA, 0x22, 0xE0, 0x0A, 0x00, 0xA0, 0xEA, 
+	0x18, 0xE0, 0x04, 0x00, 0xDA, 0x04, 0xA0, 0x06, 
+	0xE6, 0xB4, 0x47, 0x06, 0x06, 0xC2, 0xD8, 0x10, 
+	0x06, 0xC8, 0xF2, 0x05, 0x60, 0xCB, 0xF4, 0x05, 
+	0x02, 0x00, 0x54, 0x04, 0x20, 0xC2, 0xF4, 0x05, 
+	0x13, 0x13, 0xE0, 0x01, 0x9C, 0x01, 0x00, 0x40, 
+	0x8B, 0x0B, 0x8B, 0x0B, 0x60, 0x01, 0x9C, 0x01, 
+	0x00, 0x40, 0x0A, 0x16, 0x60, 0xC2, 0x6C, 0x01, 
+	0x28, 0xC8, 0x06, 0x00, 0x6C, 0x01, 0xA0, 0xC2, 
+	0x02, 0xFC, 0x03, 0x11, 0x09, 0xC8, 0x6C, 0x01, 
+	0x5B, 0x04, 0x09, 0xC8, 0x6C, 0x01, 0x4B, 0xC2, 
+	0x87, 0x07, 0xF0, 0x05, 0xA0, 0x06, 0x2C, 0xB5, 
+	0xE0, 0x04, 0xF4, 0x05, 0x59, 0x04, 0xA8, 0xC2, 
+	0x0A, 0x00, 0x0D, 0x11, 0xA0, 0xF2, 0x2E, 0x09, 
+	0x0A, 0xD8, 0x80, 0x01, 0x28, 0xC8, 0x06, 0x00, 
+	0x8C, 0x01, 0xA0, 0x07, 0x16, 0x09, 0x04, 0x00, 
+	0x08, 0xC8, 0xF4, 0x05, 0x5B, 0x04, 0x20, 0xC3, 
+	0x6C, 0x01, 0x28, 0xC8, 0x06, 0x00, 0x6C, 0x01, 
+	0x20, 0xC8, 0x0E, 0xFC, 0xBC, 0x01, 0x20, 0xC8, 
+	0x10, 0xFC, 0xB0, 0x01, 0x20, 0xC8, 0x12, 0xFC, 
+	0xB2, 0x01, 0x0C, 0xC8, 0x6C, 0x01, 0xA0, 0xF2, 
+	0x2E, 0x09, 0x8A, 0x01, 0x00, 0x10, 0xA0, 0x01, 
+	0x80, 0x01, 0x00, 0xC4, 0xDD, 0x10, 0x48, 0xC0, 
+	0x89, 0xC0, 0x81, 0x60, 0xC2, 0x05, 0x5B, 0x04, 
+	0x0B, 0xC3, 0xA0, 0x06, 0xC8, 0xAC, 0x41, 0xCC, 
+	0x42, 0x06, 0xFD, 0x16, 0xA0, 0x06, 0xC8, 0xAC, 
+	0x01, 0xC1, 0x44, 0x8C, 0x12, 0x16, 0xC4, 0x05, 
+	0x42, 0x06, 0xFB, 0x16, 0x04, 0x02, 0x0E, 0xAD, 
+	0x03, 0x02, 0x01, 0x01, 0x94, 0x06, 0x03, 0x02, 
+	0x5A, 0x5A, 0x94, 0x06, 0x43, 0x05, 0x94, 0x06, 
+	0x03, 0x07, 0x94, 0x06, 0xC3, 0x04, 0x94, 0x06, 
+	0xCC, 0x05, 0x5C, 0x04, 0xCB, 0xC1, 0xA0, 0x06, 
+	0xC8, 0xAC, 0x43, 0xCC, 0x42, 0x06, 0xFD, 0x16, 
+	0xA0, 0x06, 0xC8, 0xAC, 0x43, 0x8C, 0xF5, 0x16, 
+	0x42, 0x06, 0xFC, 0x16, 0x57, 0x04, 0x8B, 0xC2, 
+	0x08, 0xC0, 0x49, 0xC1, 0x85, 0x05, 0x80, 0x02, 
+	0x40, 0x00, 0x03, 0x11, 0x80, 0x02, 0x4F, 0x00, 
+	0x45, 0x12, 0x01, 0x02, 0xC8, 0xAC, 0xA1, 0x09, 
+	0x01, 0x80, 0x40, 0x13, 0x01, 0x02, 0xF8, 0xAD, 
+	0xA1, 0x09, 0x01, 0x80, 0x3B, 0x13, 0x60, 0xC0, 
+	0x06, 0x00, 0xA1, 0x09, 0x01, 0x80, 0x36, 0x13, 
+	0x81, 0x05, 0x01, 0x80, 0x33, 0x13, 0x4A, 0xC0, 
+	0xA1, 0x09, 0x01, 0x80, 0x2F, 0x13, 0x00, 0xC8, 
+	0x6A, 0x01, 0x80, 0x02, 0x80, 0x00, 0x17, 0x14, 
+	0x01, 0x02, 0x00, 0xF8, 0xA0, 0xC1, 0x40, 0x01, 
+	0xA0, 0x01, 0x40, 0x01, 0x00, 0x04, 0x02, 0x02, 
+	0x00, 0x10, 0x03, 0x02, 0x00, 0x04, 0xB1, 0xCC, 
+	0x43, 0x06, 0xFD, 0x16, 0xA0, 0x01, 0x40, 0x01, 
+	0x00, 0x40, 0x08, 0x02, 0x10, 0xF8, 0x06, 0xC8, 
+	0x40, 0x01, 0x00, 0xC0, 0x02, 0x13, 0x08, 0x02, 
+	0x00, 0xF8, 0x09, 0x02, 0xFE, 0xFB, 0xA0, 0x06, 
+	0xD2, 0xAC, 0x25, 0x10, 0x80, 0x02, 0x80, 0x00, 
+	0x09, 0x14, 0x01, 0x02, 0x00, 0xF8, 0x02, 0x02, 
+	0x00, 0x10, 0x03, 0x02, 0x00, 0x04, 0x72, 0xCC, 
+	0x43, 0x06, 0xFD, 0x16, 0x80, 0x05, 0x80, 0x02, 
+	0x80, 0x00, 0x04, 0x12, 0x60, 0x01, 0x04, 0x01, 
+	0x20, 0x00, 0x05, 0x13, 0x40, 0x81, 0xAB, 0x16, 
+	0x80, 0x02, 0x80, 0x00, 0x0B, 0x14, 0xA0, 0x07, 
+	0x6A, 0x01, 0x7E, 0x00, 0x02, 0x02, 0x00, 0x10, 
+	0x03, 0x02, 0x00, 0x04, 0xC1, 0x04, 0x81, 0xCC, 
+	0x43, 0x06, 0xFD, 0x16, 0xCA, 0x05, 0x5A, 0x04, 
+	0x00, 0x02, 0xEA, 0xAD, 0x01, 0x02, 0x1A, 0xAF, 
+	0x40, 0x02, 0x00, 0xFC, 0x41, 0x02, 0x00, 0xFC, 
+	0x40, 0x80, 0x04, 0x13, 0xA0, 0x07, 0x04, 0x01, 
+	0x3C, 0x00, 0x5B, 0x04, 0xC0, 0x04, 0x01, 0x02, 
+	0x08, 0x00, 0x02, 0x02, 0x00, 0x12, 0xE0, 0xC1, 
+	0x40, 0x01, 0xA0, 0x01, 0x40, 0x01, 0x00, 0x04, 
+	0x03, 0x02, 0x00, 0x01, 0x00, 0xC8, 0x6A, 0x01, 
+	0xA0, 0xCC, 0x10, 0xF8, 0x80, 0x05, 0x03, 0x06, 
+	0xF9, 0x16, 0x22, 0x02, 0x00, 0x02, 0x01, 0x06, 
+	0xF3, 0x16, 0xA0, 0x01, 0x40, 0x01, 0x00, 0x40, 
+	0x07, 0xC8, 0x40, 0x01, 0x00, 0x02, 0x00, 0x08, 
+	0x40, 0xC0, 0x01, 0x06, 0x01, 0xC8, 0x6A, 0x01, 
+	0x61, 0x02, 0x00, 0x80, 0x01, 0xC8, 0x10, 0xF8, 
+	0x00, 0x06, 0xF6, 0x16, 0xC0, 0x04, 0xC8, 0x04, 
+	0xC9, 0x04, 0x03, 0x02, 0x00, 0x08, 0x00, 0xC8, 
+	0x6A, 0x01, 0x80, 0xC1, 0x66, 0x02, 0x00, 0x80, 
+	0x20, 0xC1, 0x10, 0xF8, 0x06, 0x81, 0x15, 0x16, 
+	0x08, 0xC2, 0x06, 0x13, 0x80, 0x05, 0x03, 0x06, 
+	0xF2, 0x16, 0x08, 0xC2, 0x0D, 0x13, 0x19, 0x10, 
+	0xA0, 0x07, 0x10, 0xF8, 0x55, 0x55, 0x20, 0xC1, 
+	0x10, 0xF8, 0x84, 0x02, 0x55, 0x55, 0x02, 0x16, 
+	0x06, 0xC2, 0xF0, 0x10, 0x06, 0x81, 0xEE, 0x13, 
+	0x5B, 0x04, 0xA0, 0x07, 0x10, 0xF8, 0x55, 0x55, 
+	0x60, 0xC1, 0x10, 0xF8, 0x05, 0x81, 0x03, 0x13, 
+	0x85, 0x02, 0x55, 0x55, 0xF5, 0x16, 0x08, 0xC2, 
+	0xE1, 0x13, 0x40, 0xC2, 0x09, 0x06, 0x48, 0x02, 
+	0xFF, 0x07, 0xC0, 0x04, 0x01, 0x02, 0x08, 0x00, 
+	0x02, 0x02, 0x00, 0x12, 0x03, 0x02, 0x00, 0x01, 
+	0x00, 0xC8, 0x6A, 0x01, 0x32, 0xC8, 0x10, 0xF8, 
+	0x80, 0x05, 0x03, 0x06, 0xF9, 0x16, 0x22, 0x02, 
+	0x00, 0x02, 0x01, 0x06, 0xF3, 0x16, 0x88, 0x02, 
+	0x40, 0x00, 0x13, 0x15, 0x89, 0x02, 0x4F, 0x00, 
+	0x10, 0x11, 0xC0, 0x04, 0x02, 0x02, 0x00, 0x12, 
+	0x01, 0x02, 0x08, 0x00, 0x03, 0x02, 0x00, 0x01, 
+	0x80, 0xCC, 0x03, 0x06, 0xFD, 0x16, 0x22, 0x02, 
+	0x00, 0x02, 0x01, 0x06, 0xF7, 0x16, 0xCB, 0x05, 
+	0x5B, 0x04, 0xA0, 0x07, 0x04, 0x01, 0x37, 0x00, 
+	0x5B, 0x04, 0x33, 0x07, 0x33, 0x07, 0x0C, 0x10, 
+	0x13, 0x07, 0x23, 0x07, 0x02, 0x00, 0xCB, 0xC8, 
+	0x06, 0x00, 0x23, 0x02, 0x18, 0x00, 0xE0, 0xCC, 
+	0x6C, 0x01, 0xCD, 0xCC, 0xCE, 0xCC, 0xCF, 0xCC, 
+	0x83, 0x07, 0x30, 0x06, 0xD3, 0xC1, 0x0A, 0x13, 
+	0x83, 0x07, 0x36, 0x07, 0xD3, 0xC1, 0x06, 0x13, 
+	0x83, 0x07, 0xA0, 0x00, 0x93, 0x00, 0x0C, 0xC8, 
+	0x6C, 0x01, 0x80, 0x03, 0x63, 0x07, 0x02, 0x00, 
+	0x2A, 0x15, 0x63, 0xC2, 0x04, 0x00, 0x63, 0x42, 
+	0x06, 0x00, 0xDB, 0x13, 0x63, 0xC3, 0x1A, 0x00, 
+	0x49, 0xD2, 0x0C, 0x13, 0xC9, 0x06, 0x49, 0x72, 
+	0x69, 0xD2, 0xC0, 0xE1, 0xC9, 0x06, 0x49, 0x72, 
+	0xE9, 0x48, 0x04, 0xE0, 0x04, 0x00, 0x49, 0xCB, 
+	0x02, 0x00, 0x52, 0x04, 0x69, 0xC2, 0xC0, 0xE1, 
+	0x49, 0x72, 0x29, 0x02, 0x10, 0x00, 0xC3, 0xC2, 
+	0xE9, 0xA2, 0xA8, 0xE1, 0x1B, 0xC3, 0x89, 0x02, 
+	0x12, 0x00, 0x0F, 0x13, 0xDC, 0xC6, 0x03, 0x16, 
+	0xE9, 0x48, 0x04, 0xE0, 0x04, 0x00, 0x49, 0xCB, 
+	0x02, 0x00, 0x4C, 0xCB, 0x04, 0x00, 0x90, 0x03, 
+	0xFF, 0x01, 0x93, 0x00, 0x0C, 0xC8, 0x6C, 0x01, 
+	0x80, 0x03, 0x0C, 0xC8, 0x6C, 0x01, 0xE0, 0xC6, 
+	0x00, 0xFC, 0xF1, 0x16, 0xE9, 0x48, 0x04, 0xE0, 
+	0x04, 0x00, 0x49, 0xCB, 0x02, 0x00, 0x4C, 0xCB, 
+	0x04, 0x00, 0xED, 0x10, 0x00, 0x03, 0x02, 0x00, 
+	0xDB, 0xC2, 0x63, 0xC2, 0x04, 0x00, 0x4B, 0x42, 
+	0x9F, 0x13, 0x49, 0xD2, 0x0E, 0x13, 0xC9, 0x06, 
+	0x49, 0x72, 0x69, 0xD2, 0xC0, 0xE1, 0xC9, 0x06, 
+	0x49, 0x72, 0xE9, 0x48, 0x04, 0xE0, 0x04, 0x00, 
+	0x49, 0xCB, 0x02, 0x00, 0x90, 0x03, 0xFF, 0xFF, 
+	0x80, 0x03, 0x69, 0xC2, 0xC0, 0xE1, 0x49, 0x72, 
+	0x29, 0x02, 0x10, 0x00, 0xC3, 0xC2, 0xE9, 0xA2, 
+	0xA8, 0xE1, 0x1B, 0xC3, 0x89, 0x02, 0x12, 0x00, 
+	0x0C, 0x13, 0xDC, 0xC6, 0x03, 0x16, 0xE9, 0x48, 
+	0x04, 0xE0, 0x04, 0x00, 0x49, 0xCB, 0x02, 0x00, 
+	0x4C, 0xCB, 0x04, 0x00, 0x90, 0x03, 0xFF, 0xFF, 
+	0x80, 0x03, 0x0C, 0xC8, 0x6C, 0x01, 0xE0, 0xC6, 
+	0x00, 0xFC, 0xF4, 0x16, 0xF0, 0x10, 0x00, 0x03, 
+	0x02, 0x00, 0xBB, 0xC2, 0xBB, 0xC1, 0x86, 0xD1, 
+	0x03, 0x13, 0x86, 0xEA, 0x04, 0x00, 0x13, 0x10, 
+	0xA6, 0xD1, 0xC0, 0xE1, 0xC6, 0x06, 0x86, 0x71, 
+	0xCA, 0xC1, 0xE6, 0xA1, 0xB8, 0xE1, 0xA6, 0xEA, 
+	0x14, 0xE0, 0x04, 0x00, 0x1B, 0xC2, 0x86, 0x02, 
+	0x02, 0x00, 0x03, 0x16, 0xA0, 0x06, 0x0C, 0xB5, 
+	0x02, 0x10, 0xA0, 0x06, 0xE6, 0xB4, 0xDA, 0x04, 
+	0x80, 0x03, 0x00, 0x03, 0x02, 0x00, 0xAB, 0xC2, 
+	0x06, 0x00, 0x8C, 0x07, 0xE8, 0x05, 0x5C, 0xC2, 
+	0x16, 0x13, 0xA0, 0xC1, 0xEC, 0x05, 0x8A, 0x81, 
+	0x1A, 0x1A, 0xC6, 0xC1, 0x09, 0xC2, 0x59, 0xC2, 
+	0x20, 0x13, 0xE9, 0xA1, 0x08, 0x00, 0x87, 0x82, 
+	0xF9, 0x12, 0xA9, 0xA2, 0x08, 0x00, 0x87, 0x62, 
+	0xCA, 0xCA, 0x08, 0x00, 0x4A, 0x6A, 0x08, 0x00, 
+	0xC9, 0xC6, 0x0B, 0xC6, 0x80, 0x03, 0xCA, 0xCA, 
+	0x08, 0x00, 0x0A, 0xC8, 0xEC, 0x05, 0xDB, 0x04, 
+	0x0B, 0xCF, 0x0B, 0xC7, 0x80, 0x03, 0x8A, 0x61, 
+	0x46, 0xCA, 0x08, 0x00, 0xCA, 0xCA, 0x08, 0x00, 
+	0x0A, 0xC8, 0xEC, 0x05, 0xC9, 0xC6, 0x0B, 0xC7, 
+	0x80, 0x03, 0x87, 0x62, 0xCA, 0xCA, 0x08, 0x00, 
+	0xDB, 0x04, 0x0B, 0xC6, 0x0B, 0xCB, 0x02, 0x00, 
+	0x80, 0x03, 0x00, 0x03, 0x02, 0x00, 0xBB, 0xC1, 
+	0xDB, 0xC2, 0x8C, 0x07, 0xE8, 0x05, 0x4C, 0xC2, 
+	0xED, 0x04, 0x02, 0x00, 0x09, 0xC2, 0x59, 0xC2, 
+	0x18, 0x13, 0xA9, 0x81, 0x02, 0x00, 0xFA, 0x16, 
+	0xE9, 0x82, 0x04, 0x00, 0xF7, 0x16, 0x49, 0xCB, 
+	0x04, 0x00, 0x99, 0xC2, 0x0A, 0xC6, 0x0A, 0x13, 
+	0x08, 0x83, 0x04, 0x13, 0xA9, 0xAA, 0x08, 0x00, 
+	0x08, 0x00, 0x80, 0x03, 0x2A, 0xA8, 0x08, 0x00, 
+	0xEC, 0x05, 0x80, 0x03, 0x08, 0xCB, 0x02, 0x00, 
+	0x80, 0x03, 0x2D, 0x07, 0x02, 0x00, 0x8C, 0x07, 
+	0x08, 0x00, 0x06, 0xA3, 0x4C, 0xC2, 0x09, 0xC2, 
+	0x59, 0xC2, 0x13, 0x13, 0xE9, 0x82, 0x04, 0x00, 
+	0xFA, 0x16, 0xAD, 0x07, 0x02, 0x00, 0x01, 0x00, 
+	0x49, 0xCB, 0x04, 0x00, 0x19, 0xC6, 0x01, 0x13, 
+	0x80, 0x03, 0x08, 0x83, 0x04, 0x16, 0xA0, 0x49, 
+	0x14, 0xE0, 0x04, 0x00, 0x80, 0x03, 0x08, 0xCB, 
+	0x02, 0x00, 0x80, 0x03, 0x00, 0x03, 0x02, 0x00, 
+	0x0B, 0x06, 0x1F, 0x11, 0x4D, 0x13, 0x8B, 0x07, 
+	0x00, 0x4E, 0x60, 0x01, 0x42, 0x01, 0x80, 0x00, 
+	0x09, 0x13, 0x8B, 0x07, 0x00, 0x3A, 0x20, 0xC1, 
+	0x4E, 0x01, 0x84, 0x02, 0x41, 0x0F, 0x02, 0x11, 
+	0x8B, 0x07, 0x00, 0x4E, 0x0B, 0xC8, 0x44, 0x01, 
+	0xA0, 0x07, 0x62, 0x09, 0xE8, 0x03, 0xE0, 0x01, 
+	0x40, 0x01, 0x00, 0x02, 0xE0, 0x01, 0x40, 0x01, 
+	0x00, 0x20, 0x84, 0x07, 0x34, 0xAF, 0x60, 0x04, 
+	0x42, 0xAF, 0x20, 0xC8, 0x16, 0xE0, 0xE0, 0x00, 
+	0xE0, 0xC2, 0x6A, 0x09, 0xE0, 0x22, 0x10, 0xE0, 
+	0x03, 0x13, 0x20, 0xE8, 0x14, 0xE0, 0xE0, 0x00, 
+	0x20, 0xC8, 0x04, 0xE0, 0x82, 0x01, 0x20, 0xC8, 
+	0xE2, 0x00, 0x8A, 0x01, 0xE0, 0x04, 0x18, 0x09, 
+	0xE0, 0x04, 0xF4, 0x05, 0xE0, 0x04, 0xF8, 0x05, 
+	0xE0, 0x04, 0xF0, 0x05, 0xE0, 0x04, 0x42, 0x07, 
+	0xA0, 0x07, 0x88, 0x01, 0x20, 0x00, 0xE0, 0xC2, 
+	0x30, 0x09, 0x09, 0x13, 0xA0, 0x07, 0x88, 0x01, 
+	0x80, 0x00, 0x20, 0xE8, 0x16, 0xE0, 0x80, 0x01, 
+	0xE0, 0x01, 0x82, 0x01, 0x00, 0x03, 0x8B, 0x07, 
+	0x00, 0xA0, 0x0B, 0xE8, 0x86, 0x01, 0x80, 0x03, 
+	0xE0, 0x04, 0x86, 0x01, 0xE0, 0x01, 0x9C, 0x01, 
+	0x40, 0x00, 0xE0, 0x01, 0x9C, 0x01, 0x00, 0x40, 
+	0xCB, 0x04, 0xB0, 0x03, 0x0B, 0x06, 0x04, 0x13, 
+	0x60, 0x01, 0x9C, 0x01, 0x00, 0x40, 0xF9, 0x16, 
+	0xE0, 0x04, 0x82, 0x01, 0x20, 0xE8, 0x08, 0xE0, 
+	0x6A, 0x09, 0x8B, 0x07, 0x00, 0x80, 0x0B, 0xC8, 
+	0x98, 0x07, 0x0B, 0xC8, 0x78, 0x07, 0x20, 0xC8, 
+	0x04, 0xE0, 0x82, 0x01, 0x8B, 0x07, 0x6F, 0x87, 
+	0x0B, 0x48, 0x3A, 0x07, 0xE0, 0xC2, 0x50, 0x07, 
+	0x8B, 0x02, 0x58, 0x07, 0x10, 0x13, 0x20, 0xE8, 
+	0x0A, 0xE0, 0x00, 0x01, 0xE0, 0xC2, 0x00, 0x01, 
+	0xE0, 0x22, 0x06, 0xE0, 0xF8, 0x13, 0x8B, 0x07, 
+	0x58, 0x07, 0x0B, 0xC8, 0x50, 0x07, 0x8B, 0x07, 
+	0x0C, 0xB8, 0x0B, 0xC8, 0x52, 0x07, 0x80, 0x03, 
+	0x00, 0x03, 0x02, 0x00, 0xE0, 0xC2, 0x1A, 0x09, 
+	0x0C, 0x13, 0x20, 0x06, 0x1C, 0x09, 0x0B, 0xC8, 
+	0x6C, 0x01, 0x20, 0xC8, 0x00, 0xFC, 0x1A, 0x09, 
+	0x4B, 0xCB, 0x02, 0x00, 0x90, 0x03, 0xFF, 0xFF, 
+	0x80, 0x03, 0x41, 0xC0, 0x0F, 0x13, 0x81, 0x80, 
+	0x0D, 0x13, 0x82, 0xA0, 0xE2, 0xC2, 0x32, 0x0C, 
+	0x12, 0x09, 0x0B, 0xC8, 0x6C, 0x01, 0xE0, 0x04, 
+	0x00, 0xFC, 0x20, 0xC3, 0x02, 0xFC, 0x07, 0x11, 
+	0x02, 0xC8, 0x00, 0xFC, 0xED, 0x04, 0x02, 0x00, 
+	0xE0, 0x04, 0x6C, 0x01, 0x80, 0x03, 0x42, 0xCB, 
+	0x02, 0x00, 0x02, 0xC8, 0x6C, 0x01, 0x8B, 0xC0, 
+	0x80, 0x03, 0x00, 0x03, 0x02, 0x00, 0x83, 0x07, 
+	0x00, 0x80, 0x60, 0xC2, 0x7E, 0x09, 0x09, 0xC1, 
+	0x24, 0x02, 0xF8, 0xFF, 0xA9, 0x08, 0x01, 0x02, 
+	0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0x0B, 0x02, 
+	0x00, 0x00, 0x0C, 0x02, 0x00, 0x00, 0x07, 0x02, 
+	0x00, 0x00, 0x2C, 0xCB, 0x32, 0x0C, 0x32, 0x0C, 
+	0x06, 0x13, 0x8B, 0x05, 0xCC, 0x05, 0x0B, 0x88, 
+	0x46, 0x04, 0x27, 0x1B, 0xF6, 0x10, 0x09, 0xC2, 
+	0x8B, 0xC2, 0x08, 0x06, 0x0A, 0x13, 0x8B, 0x05, 
+	0xCC, 0x05, 0x0B, 0x88, 0x46, 0x04, 0x1D, 0x1B, 
+	0x2C, 0xCB, 0x32, 0x0C, 0x32, 0x0C, 0xED, 0x16, 
+	0xF4, 0x10, 0x82, 0xC0, 0x14, 0x13, 0x02, 0xC8, 
+	0x6C, 0x01, 0x0A, 0xC8, 0x00, 0xFC, 0x0A, 0xC8, 
+	0x6C, 0x01, 0xE0, 0x04, 0x00, 0xFC, 0xA0, 0x07, 
+	0x02, 0xFC, 0x00, 0x80, 0x04, 0xC8, 0x04, 0xFC, 
+	0x0A, 0xC2, 0x08, 0xA2, 0x02, 0xCA, 0x32, 0x0C, 
+	0x8A, 0xC0, 0x87, 0x05, 0xD6, 0x10, 0x4A, 0xC0, 
+	0xEE, 0x10, 0x47, 0xCB, 0x02, 0x00, 0xE0, 0x04, 
+	0x6C, 0x01, 0x8B, 0x07, 0x43, 0x00, 0xE0, 0x04, 
+	0x00, 0x0C, 0x00, 0x03, 0x02, 0x00, 0x0B, 0xC8, 
+	0x6C, 0x01, 0x8B, 0x02, 0x43, 0x00, 0x04, 0x13, 
+	0x60, 0x01, 0x02, 0xFC, 0x20, 0x00, 0x06, 0x13, 
+	0x8B, 0xC2, 0xA0, 0x06, 0x42, 0xB4, 0x90, 0x03, 
+	0x7F, 0x00, 0x80, 0x03, 0xA0, 0x01, 0x02, 0xFC, 
+	0x20, 0x00, 0x60, 0x01, 0x6A, 0x09, 0x01, 0x00, 
+	0x0B, 0x16, 0x0A, 0x02, 0x02, 0xFC, 0xA0, 0xA2, 
+	0x2C, 0x09, 0xA0, 0xCE, 0xEE, 0x05, 0xA0, 0xC6, 
+	0x04, 0xFC, 0x20, 0xC8, 0x2C, 0x09, 0x04, 0xFC, 
+	0x8A, 0x07, 0xF8, 0x05, 0x5A, 0xC2, 0x08, 0x13, 
+	0xCA, 0x05, 0x5A, 0xC2, 0x09, 0xC8, 0x6C, 0x01, 
+	0x0B, 0xC8, 0x00, 0xFC, 0x8B, 0xC6, 0x02, 0x10, 
+	0x8B, 0xCE, 0x8B, 0xC6, 0x20, 0x20, 0x1A, 0xE0, 
+	0x05, 0x16, 0x20, 0xE8, 0x04, 0xE0, 0x3A, 0x07, 
+	0xE0, 0x04, 0x36, 0x07, 0x90, 0x03, 0x7F, 0x00, 
+	0x80, 0x03, 0x00, 0x03, 0x02, 0x00, 0x0B, 0xC8, 
+	0x6C, 0x01, 0xCC, 0x04, 0xE0, 0x04, 0x00, 0xFC, 
+	0x8B, 0xC2, 0xA0, 0x06, 0x50, 0xB4, 0x90, 0x03, 
+	0x7F, 0x00, 0x80, 0x03, 0xA0, 0x07, 0x02, 0xFC, 
+	0x00, 0x80, 0x20, 0xC8, 0x8C, 0xE1, 0x04, 0xFC, 
+	0x41, 0xC0, 0x0F, 0x16, 0x20, 0xD8, 0x00, 0xE2, 
+	0x83, 0x01, 0x8B, 0x0B, 0x8B, 0x0B, 0x8B, 0x0B, 
+	0x8B, 0x0B, 0x8B, 0x0B, 0x8B, 0x0B, 0x8B, 0x0B, 
+	0x8B, 0x0B, 0x8B, 0x0B, 0x8B, 0x0B, 0x0A, 0xC8, 
+	0x8A, 0x01, 0x5B, 0x04, 0x0A, 0xC8, 0x6C, 0x01, 
+	0x20, 0xC3, 0x00, 0xFC, 0xE0, 0x04, 0x00, 0xFC, 
+	0x8A, 0x02, 0x43, 0x00, 0xDF, 0x13, 0xA0, 0x07, 
+	0x02, 0xFC, 0x00, 0x80, 0x04, 0xC8, 0x04, 0xFC, 
+	0x20, 0x98, 0x84, 0x09, 0x1D, 0x09, 0x0A, 0x13, 
+	0x20, 0xC8, 0x1A, 0x09, 0x00, 0xFC, 0x0A, 0xC8, 
+	0x1A, 0x09, 0xA0, 0x05, 0x1C, 0x09, 0x8C, 0xC2, 
+	0xE5, 0x16, 0x5B, 0x04, 0x41, 0xC0, 0x10, 0x13, 
+	0x8A, 0xA2, 0x82, 0xCA, 0x32, 0x0C, 0x1A, 0x09, 
+	0x02, 0xC8, 0x6C, 0x01, 0x0A, 0xC8, 0x00, 0xFC, 
+	0x8A, 0xC0, 0x20, 0x98, 0x83, 0x01, 0x00, 0xE2, 
+	0x09, 0x13, 0x8C, 0xC2, 0xD3, 0x16, 0x5B, 0x04, 
+	0x4A, 0xC0, 0x8A, 0xC0, 0x20, 0x98, 0x83, 0x01, 
+	0x00, 0xE2, 0x1B, 0x16, 0xE0, 0x01, 0x9C, 0x01, 
+	0x40, 0x00, 0xA0, 0x07, 0x64, 0x09, 0x00, 0x70, 
+	0x60, 0x01, 0x9C, 0x01, 0x40, 0x00, 0x07, 0x13, 
+	0x20, 0x06, 0x64, 0x09, 0xF9, 0x16, 0x0A, 0x02, 
+	0x00, 0x01, 0x60, 0x04, 0x8A, 0xA3, 0x60, 0x01, 
+	0x02, 0x0C, 0x00, 0x01, 0xE2, 0x13, 0x20, 0xD8, 
+	0x2F, 0x09, 0x83, 0x01, 0xA0, 0x07, 0x02, 0x0C, 
+	0x00, 0x80, 0x0A, 0xC8, 0x8A, 0x01, 0x0A, 0xC8, 
+	0x18, 0x09, 0xD7, 0x10, 0xD8, 0x04, 0x57, 0xC2, 
+	0x03, 0x16, 0xC8, 0xCD, 0xC8, 0xC5, 0x5B, 0x04, 
+	0xC7, 0x05, 0x57, 0xC2, 0x48, 0xC6, 0xC8, 0xC5, 
+	0x5B, 0x04, 0x08, 0xC8, 0x6C, 0x01, 0x08, 0xA2, 
+	0x20, 0xCA, 0x00, 0xFC, 0x32, 0x0C, 0x18, 0x09, 
+	0x02, 0x10, 0x08, 0xC8, 0x6C, 0x01, 0xE0, 0x04, 
+	0x00, 0xFC, 0x57, 0xC2, 0x03, 0x16, 0xC8, 0xCD, 
+	0xC8, 0xC5, 0x5B, 0x04, 0xC7, 0x05, 0x17, 0xC8, 
+	0x6C, 0x01, 0x08, 0xC8, 0x00, 0xFC, 0xC8, 0xC5, 
+	0x5B, 0x04, 0x17, 0xC6, 0x02, 0x16, 0xC8, 0xC9, 
+	0x02, 0x00, 0xC8, 0xC5, 0x5B, 0x04, 0x17, 0xC2, 
+	0x08, 0xC8, 0x6C, 0x01, 0x07, 0x13, 0xE0, 0xC5, 
+	0x00, 0xFC, 0x08, 0xA2, 0x28, 0xC8, 0x32, 0x0C, 
+	0x00, 0xFC, 0x18, 0x09, 0x5B, 0x04, 0x60, 0x01, 
+	0x82, 0x01, 0x00, 0x20, 0x0A, 0x16, 0x60, 0xC2, 
+	0x84, 0x01, 0xA0, 0x01, 0x82, 0x01, 0x00, 0x20, 
+	0xE0, 0x01, 0x82, 0x01, 0x00, 0x20, 0x09, 0xC8, 
+	0x84, 0x01, 0xC9, 0x04, 0x5B, 0x04, 0xA0, 0x06, 
+	0xBE, 0xB7, 0xD3, 0x04, 0xE0, 0x04, 0x02, 0x01, 
+	0x20, 0xE8, 0x14, 0xE0, 0x00, 0x01, 0x20, 0xC8, 
+	0x16, 0xE0, 0x04, 0x01, 0x05, 0x2C, 0x20, 0x48, 
+	0x14, 0xE0, 0x00, 0x01, 0x8C, 0x07, 0x00, 0x0A, 
+	0x8D, 0x07, 0xD8, 0x07, 0x8E, 0x07, 0x18, 0x00, 
+	0x7C, 0xCF, 0x4E, 0x06, 0xFD, 0x16, 0xE0, 0x02, 
+	0xD8, 0x07, 0x8F, 0x07, 0x11, 0xFF, 0x8B, 0x02, 
+	0x3B, 0x59, 0x21, 0x16, 0x8A, 0x02, 0x3B, 0x59, 
+	0x1E, 0x13, 0x8F, 0x05, 0x20, 0x20, 0x16, 0xE0, 
+	0x01, 0x16, 0x19, 0x10, 0x20, 0x20, 0x04, 0xE0, 
+	0x16, 0x16, 0x00, 0x01, 0xBF, 0x00, 0x13, 0x16, 
+	0x8B, 0x07, 0xC0, 0x40, 0x00, 0x01, 0x00, 0x60, 
+	0x10, 0x13, 0x40, 0x01, 0x00, 0x60, 0x0B, 0x16, 
+	0x8B, 0x07, 0xC4, 0x44, 0xA0, 0xC3, 0x02, 0x01, 
+	0x0E, 0x48, 0x02, 0x01, 0x4E, 0x01, 0x00, 0x10, 
+	0x04, 0x16, 0x8F, 0x07, 0x18, 0xFF, 0x60, 0x04, 
+	0x94, 0xB7, 0x0B, 0xC3, 0x4B, 0xC3, 0x20, 0x20, 
+	0x0A, 0xE0, 0x02, 0x16, 0x6B, 0x02, 0x20, 0x20, 
+	0x20, 0x20, 0x0C, 0xE0, 0x02, 0x16, 0x6C, 0x02, 
+	0x00, 0x20, 0x20, 0x20, 0x0E, 0xE0, 0x02, 0x16, 
+	0x6C, 0x02, 0x20, 0x00, 0x8F, 0x05, 0x20, 0x20, 
+	0x10, 0xE0, 0x07, 0x16, 0x6D, 0x02, 0x20, 0x00, 
+	0x20, 0x21, 0x22, 0xE0, 0xE4, 0x13, 0x04, 0xC1, 
+	0x02, 0x16, 0x84, 0x07, 0xFE, 0x7F, 0x8F, 0x05, 
+	0x20, 0x20, 0x12, 0xE0, 0x02, 0x16, 0x6D, 0x02, 
+	0x00, 0x20, 0x60, 0x21, 0x22, 0xE0, 0xD7, 0x13, 
+	0x45, 0xC1, 0x02, 0x16, 0x85, 0x07, 0xFE, 0x7F, 
+	0x8F, 0x05, 0x86, 0xD1, 0x0B, 0x13, 0xA0, 0x25, 
+	0x26, 0xE0, 0x08, 0x13, 0x8F, 0x05, 0x20, 0x26, 
+	0x22, 0xE0, 0x04, 0x16, 0x8F, 0x05, 0xA0, 0x26, 
+	0x22, 0xE0, 0x02, 0x13, 0x60, 0x04, 0x94, 0xB7, 
+	0x01, 0xD8, 0xEC, 0x08, 0x20, 0xD8, 0xDB, 0x07, 
+	0x00, 0x09, 0x02, 0xD8, 0xF6, 0x08, 0x20, 0xD8, 
+	0xDD, 0x07, 0xE2, 0x08, 0xE0, 0x02, 0x58, 0x07, 
+	0x20, 0xD8, 0xEF, 0x07, 0xF4, 0x07, 0x20, 0xD8, 
+	0xF1, 0x07, 0xF6, 0x07, 0x20, 0xD8, 0xF3, 0x07, 
+	0xF8, 0x07, 0x09, 0x02, 0x06, 0x00, 0xCB, 0x04, 
+	0x0F, 0x02, 0xEE, 0x07, 0x8F, 0x05, 0xCB, 0xDF, 
+	0x09, 0x06, 0xFC, 0x16, 0xA0, 0x06, 0xBE, 0xB7, 
+	0x89, 0x07, 0x5C, 0xE3, 0xE0, 0x04, 0x1A, 0x01, 
+	0x20, 0xC8, 0xE4, 0x07, 0x18, 0x01, 0x19, 0xC8, 
+	0x0C, 0x01, 0x39, 0xC8, 0x0A, 0x01, 0x39, 0xC8, 
+	0x12, 0x01, 0x09, 0x16, 0x79, 0xC3, 0x0F, 0x02, 
+	0x00, 0xE0, 0x4F, 0x63, 0x2D, 0x02, 0x00, 0x90, 
+	0x0D, 0xC8, 0x14, 0x01, 0x02, 0x10, 0x39, 0xC8, 
+	0x14, 0x01, 0xF9, 0xC3, 0x3F, 0xC8, 0x0E, 0x01, 
+	0x1F, 0xC8, 0x10, 0x01, 0xE0, 0x04, 0x14, 0x09, 
+	0xB9, 0xC2, 0x1A, 0xC8, 0x00, 0x01, 0x96, 0x06, 
+	0x89, 0x02, 0x84, 0xE3, 0xE0, 0x16, 0x8F, 0x07, 
+	0x1C, 0xFF, 0x8C, 0x07, 0x00, 0x0A, 0x8D, 0x07, 
+	0x84, 0xE3, 0x8E, 0x07, 0x10, 0x00, 0x7C, 0x8F, 
+	0x44, 0x16, 0x4E, 0x06, 0xFC, 0x16, 0xA0, 0xC3, 
+	0xE2, 0x07, 0xE0, 0xC3, 0xE0, 0x07, 0xCE, 0x83, 
+	0x01, 0x14, 0xCE, 0xC3, 0x0F, 0xC8, 0x1A, 0x01, 
+	0x8C, 0x07, 0x94, 0xE3, 0x8D, 0x07, 0x00, 0x0A, 
+	0x8E, 0x07, 0xA4, 0xE3, 0x8C, 0x63, 0x7C, 0xCF, 
+	0x4E, 0x06, 0xFD, 0x16, 0xE0, 0x04, 0x30, 0x09, 
+	0x20, 0x01, 0x42, 0x01, 0x00, 0x04, 0x02, 0x16, 
+	0x20, 0x07, 0x30, 0x09, 0x60, 0xC2, 0x62, 0x01, 
+	0xE0, 0x04, 0x62, 0x01, 0x8E, 0x07, 0x00, 0x80, 
+	0x8C, 0x07, 0x34, 0x09, 0x8D, 0x07, 0x06, 0x00, 
+	0x3E, 0xDF, 0x8E, 0x05, 0x0D, 0x06, 0xFC, 0x16, 
+	0xFE, 0xD3, 0xCF, 0x06, 0x8E, 0x05, 0xFE, 0xD3, 
+	0xCF, 0x06, 0x8C, 0x07, 0x34, 0x09, 0x09, 0xC8, 
+	0x62, 0x01, 0xC9, 0x04, 0x5C, 0xA3, 0x7C, 0xE2, 
+	0x5C, 0xA3, 0x7C, 0xE2, 0x5C, 0xA3, 0x7C, 0xE2, 
+	0x02, 0x13, 0xCD, 0x83, 0x09, 0x13, 0x20, 0x07, 
+	0x34, 0x09, 0x06, 0x10, 0x8F, 0x07, 0x19, 0xFF, 
+	0xCD, 0xA3, 0x0F, 0xC8, 0x04, 0x01, 0xFF, 0x10, 
+	0xA0, 0x01, 0x02, 0x01, 0x00, 0x10, 0xE0, 0xC3, 
+	0xEE, 0x07, 0xE0, 0x43, 0x06, 0xE0, 0x0F, 0xC8, 
+	0x00, 0x01, 0x20, 0xC0, 0x04, 0xE0, 0xE0, 0x04, 
+	0xFE, 0x06, 0xD3, 0x04, 0xE0, 0x04, 0x04, 0x01, 
+	0x60, 0x04, 0x0C, 0xB8, 0x8C, 0x07, 0x00, 0x0A, 
+	0x8D, 0x07, 0x18, 0x00, 0x8E, 0x07, 0x3B, 0x59, 
+	0x0E, 0xCF, 0x4D, 0x06, 0xFD, 0x16, 0x5B, 0x04, 
+	0x93, 0x01, 0x00, 0x80, 0x20, 0x04, 0xC0, 0xE2, 
+	0x60, 0xD0, 0x98, 0x07, 0x1C, 0x13, 0x00, 0x03, 
+	0x02, 0x00, 0xA0, 0xC0, 0x46, 0x07, 0x12, 0xC8, 
+	0x46, 0x07, 0x02, 0x16, 0x93, 0x01, 0x20, 0x00, 
+	0x00, 0x03, 0x0F, 0x00, 0x20, 0x04, 0xE8, 0xE2, 
+	0x93, 0x01, 0x00, 0x20, 0x80, 0x01, 0x00, 0x40, 
+	0x00, 0x01, 0xFE, 0x00, 0x49, 0x16, 0xC4, 0xC3, 
+	0x25, 0x16, 0xD3, 0xC3, 0xC5, 0x43, 0x0C, 0x16, 
+	0xE0, 0xC3, 0x98, 0x07, 0x03, 0x11, 0xE0, 0x02, 
+	0x98, 0x07, 0x51, 0x04, 0xE0, 0xC3, 0x78, 0x07, 
+	0x0A, 0x11, 0xE0, 0x02, 0x78, 0x07, 0x51, 0x04, 
+	0xD3, 0x11, 0x4F, 0x01, 0x00, 0x20, 0xE4, 0x13, 
+	0x4F, 0x01, 0x20, 0x00, 0xD1, 0x13, 0x05, 0x2C, 
+	0x41, 0xA0, 0x21, 0x04, 0xC0, 0xE2, 0x8B, 0x07, 
+	0x0C, 0xB8, 0x00, 0x01, 0x00, 0x40, 0x0F, 0x13, 
+	0xDD, 0xC3, 0x4F, 0x02, 0x0F, 0x00, 0x2F, 0xE1, 
+	0x14, 0xE0, 0x5B, 0x04, 0xE4, 0xC3, 0xC0, 0xE1, 
+	0xCF, 0x73, 0x2F, 0x41, 0x14, 0xE0, 0x6F, 0xC3, 
+	0xEC, 0xEA, 0x8B, 0x07, 0x0C, 0xB8, 0x4B, 0xC2, 
+	0xA0, 0xC2, 0xF4, 0x07, 0x8C, 0x07, 0x08, 0x00, 
+	0xBD, 0xC0, 0xA0, 0xC3, 0xEA, 0x07, 0xE0, 0xC3, 
+	0xEC, 0x07, 0xA0, 0x06, 0x00, 0xBA, 0xC0, 0x01, 
+	0x00, 0x40, 0x02, 0xD8, 0x17, 0x01, 0x62, 0x02, 
+	0x80, 0xFF, 0xA0, 0x06, 0x54, 0xBA, 0x02, 0xC8, 
+	0x04, 0x01, 0x90, 0x03, 0x3F, 0x60, 0x59, 0x04, 
+	0xC0, 0xC3, 0xCF, 0x73, 0xEF, 0xC3, 0xC0, 0xE1, 
+	0xCF, 0x73, 0xAF, 0xC3, 0xDE, 0xEA, 0x9E, 0xC3, 
+	0x4E, 0x02, 0x0F, 0x00, 0x2E, 0x21, 0x14, 0xE0, 
+	0x08, 0x13, 0x2F, 0x40, 0x14, 0xE0, 0xCF, 0xA3, 
+	0x2F, 0x04, 0xF0, 0xE2, 0x40, 0x01, 0x00, 0x40, 
+	0xA4, 0x13, 0xC4, 0xC3, 0xC7, 0x16, 0x00, 0x01, 
+	0xFE, 0x00, 0xE6, 0x16, 0x9E, 0x10, 0x40, 0x01, 
+	0x00, 0x40, 0x05, 0x16, 0x20, 0xE0, 0x14, 0xE0, 
+	0x65, 0x02, 0x00, 0x58, 0x96, 0x10, 0x20, 0xD8, 
+	0xDE, 0x07, 0x17, 0x01, 0x8F, 0x07, 0x86, 0xFF, 
+	0x0F, 0xC8, 0x04, 0x01, 0xC0, 0x01, 0x00, 0x40, 
+	0x45, 0x02, 0xFF, 0xA7, 0x8A, 0x10, 0x20, 0xC3, 
+	0xFE, 0x06, 0x20, 0x27, 0x38, 0xE3, 0x07, 0x13, 
+	0x20, 0x23, 0x22, 0xE0, 0x1A, 0x13, 0x65, 0x02, 
+	0xFF, 0xDF, 0x20, 0x40, 0x14, 0xE0, 0x20, 0xE0, 
+	0x16, 0xE0, 0x0C, 0xC8, 0xE6, 0x08, 0x8D, 0x07, 
+	0xE2, 0x08, 0x58, 0x04, 0x20, 0x48, 0x08, 0xE0, 
+	0xFE, 0x06, 0x20, 0xC3, 0xE6, 0x08, 0x20, 0x27, 
+	0x38, 0xE3, 0x19, 0x16, 0x80, 0x03, 0x02, 0xC3,  
+	0x6C, 0xC2, 0x0A, 0x00, 0x99, 0x06, 0x60, 0x04,  
+	0x0C, 0xB8, 0xA0, 0xC2, 0xF4, 0x07, 0x8C, 0x07, 
+	0x01, 0x00, 0x8D, 0x07, 0x06, 0x06, 0xCE, 0x04, 
+	0xE0, 0xC3, 0x08, 0x06, 0x01, 0x13, 0x97, 0x06, 
+	0x20, 0xD8, 0x07, 0x06, 0x17, 0x01, 0x8B, 0x07, 
+	0x82, 0xFF, 0x0B, 0xC8, 0x04, 0x01, 0xA0, 0x06, 
+	0xB4, 0xBE, 0x60, 0x04, 0x0C, 0xB8, 0xA0, 0xC2, 
+	0xEE, 0x07, 0x8C, 0x07, 0x06, 0x00, 0x8D, 0x07, 
+	0xEE, 0x08, 0xA0, 0xC3, 0xE6, 0x07, 0xE0, 0xC3, 
+	0xE8, 0x07, 0x97, 0x06, 0xA0, 0xC2, 0xF4, 0x07, 
+	0x8D, 0x07, 0xF4, 0x08, 0xDD, 0x04, 0x8C, 0x07, 
+	0x02, 0x00, 0x97, 0x06, 0x8D, 0x07, 0x00, 0x80, 
+	0xA0, 0xC2, 0xEE, 0x08, 0x0A, 0x88, 0x0C, 0x06, 
+	0x14, 0x1B, 0x82, 0x07, 0xD0, 0xB9, 0xA0, 0xC3, 
+	0xF0, 0x08, 0xE0, 0xC3, 0xF2, 0x08, 0x8B, 0x07, 
+	0x0C, 0xE3, 0x8A, 0x02, 0x14, 0x00, 0x04, 0x1A, 
+	0x8B, 0x07, 0xBA, 0xEA, 0x2A, 0x02, 0xEC, 0xFF, 
+	0x8A, 0xA2, 0xCA, 0xA2, 0xDB, 0xC2, 0x01, 0x13, 
+	0x9B, 0x06, 0x20, 0xC8, 0xEE, 0x08, 0xF2, 0x08, 
+	0x20, 0xC8, 0x20, 0xE0, 0xEE, 0x08, 0x0D, 0xC8, 
+	0xF0, 0x08, 0x8D, 0x07, 0xEC, 0x08, 0x20, 0xE0, 
+	0x18, 0xE0, 0x65, 0x02, 0x00, 0x58, 0x58, 0x04, 
+	0x45, 0x02, 0xFF, 0xA7, 0x80, 0x03, 0x60, 0xC0, 
+	0xEE, 0x05, 0x21, 0x02, 0xE8, 0x03, 0x20, 0x01, 
+	0x02, 0x01, 0x06, 0x00, 0x07, 0x16, 0x01, 0x88, 
+	0xEE, 0x05, 0xF9, 0x16, 0x39, 0x10, 0x60, 0xD0, 
+	0x03, 0x01, 0xF1, 0x13, 0x01, 0x02, 0x0A, 0x01, 
+	0x4C, 0xCC, 0x4C, 0xCC, 0x4E, 0xCC, 0x4F, 0xCC, 
+	0xB1, 0x07, 0x40, 0x00, 0x4D, 0xCC, 0x0A, 0xC8, 
+	0x00, 0x01, 0x5B, 0x04, 0x60, 0xC0, 0xEE, 0x05, 
+	0x21, 0x02, 0xE8, 0x03, 0x20, 0x01, 0x02, 0x01, 
+	0x06, 0x00, 0x07, 0x16, 0x01, 0x88, 0xEE, 0x05, 
+	0xF9, 0x16, 0x1E, 0x10, 0x60, 0xD0, 0x03, 0x01, 
+	0xF1, 0x13, 0x01, 0x02, 0x0A, 0x01, 0x4C, 0xCC, 
+	0x4C, 0xCC, 0x4E, 0xCC, 0x4F, 0xCC, 0xB1, 0x07, 
+	0x40, 0x00, 0x4D, 0xCC, 0x0A, 0xC8, 0x00, 0x01, 
+	0xA0, 0x03, 0x60, 0xD0, 0x03, 0x01, 0x01, 0x13, 
+	0x5B, 0x04, 0x60, 0xC0, 0xEE, 0x05, 0x21, 0x02, 
+	0xE8, 0x03, 0x20, 0x01, 0x02, 0x01, 0x06, 0x00, 
+	0xF7, 0x16, 0x01, 0x88, 0xEE, 0x05, 0xF9, 0x16, 
+	0xCD, 0x04, 0x8A, 0x07, 0x00, 0x40, 0x20, 0xC3, 
+	0x00, 0x01, 0x0C, 0x01, 0x00, 0x80, 0x02, 0x13, 
+	0x8A, 0x07, 0x00, 0x20, 0xA0, 0xC3, 0x0E, 0x01, 
+	0xE0, 0xC3, 0x10, 0x01, 0xB0, 0x03, 0x20, 0xC3, 
+	0x58, 0x07, 0x20, 0x23, 0x04, 0xE0, 0x02, 0x13, 
+	0x60, 0x04, 0x8E, 0xB7, 0x60, 0x04, 0x8A, 0xA3, 
+	0x8D, 0x07, 0x00, 0x20, 0x20, 0x20, 0x0A, 0xE0, 
+	0x01, 0x16, 0x5B, 0x04, 0x0D, 0x02, 0x32, 0x0C, 
+	0x5D, 0xC2, 0x01, 0x11, 0xDD, 0x04, 0xCD, 0x05, 
+	0x0D, 0x88, 0x30, 0x0C, 0xF9, 0x16, 0x60, 0xC2, 
+	0x0A, 0x06, 0x8D, 0x07, 0x6A, 0x09, 0xA0, 0x06, 
+	0xF4, 0xBE, 0x09, 0x02, 0x48, 0x00, 0xE0, 0xC3, 
+	0x30, 0x09, 0x03, 0x16, 0xE0, 0x01, 0x6A, 0x09, 
+	0x10, 0x00, 0xE0, 0xC2, 0x6A, 0x09, 0x0F, 0x02, 
+	0x00, 0x01, 0xC9, 0x26, 0x02, 0x13, 0x60, 0x04, 
+	0x86, 0xBD, 0x09, 0x02, 0x00, 0x12, 0x4B, 0x01, 
+	0x10, 0x00, 0x02, 0x13, 0x09, 0x02, 0x00, 0x13, 
+	0x09, 0xD8, 0x2E, 0x09, 0x8F, 0x07, 0x00, 0x40, 
+	0x89, 0x07, 0x6C, 0x09, 0xCB, 0x04, 0xF9, 0xE2, 
+	0xF9, 0xE2, 0xF9, 0xE2, 0x07, 0x16, 0x8B, 0x07, 
+	0x34, 0x09, 0x8C, 0x07, 0x6C, 0x09, 0x3B, 0xCF, 
+	0x3B, 0xCF, 0x1B, 0xC7, 0x20, 0xC3, 0x6C, 0x09, 
+	0x19, 0x11, 0x8F, 0x07, 0x00, 0x20, 0x89, 0x07, 
+	0x7A, 0x09, 0xA0, 0x06, 0x3A, 0xBB, 0xA0, 0x06, 
+	0x3A, 0xBB, 0x12, 0x10, 0x4C, 0xCE, 0x5B, 0x04, 
+	0x19, 0xC3, 0x02, 0x16, 0x8C, 0x07, 0x1A, 0x00, 
+	0x4C, 0xC3, 0x2D, 0x02, 0xF8, 0xFF, 0x0A, 0x02, 
+	0x09, 0x00, 0x2D, 0x02, 0xFA, 0xFF, 0xF2, 0x13, 
+	0x0A, 0x06, 0xFB, 0x16, 0x60, 0x04, 0x86, 0xBD, 
+	0x8F, 0x07, 0x00, 0x10, 0xD9, 0xC2, 0xFA, 0x11, 
+	0x02, 0x16, 0x8B, 0x07, 0x00, 0x04, 0x4B, 0xC3, 
+	0x8D, 0x02, 0x20, 0x00, 0x02, 0x14, 0x0D, 0x02, 
+	0x20, 0x00, 0x8D, 0x02, 0x00, 0x04, 0x02, 0x12, 
+	0x0D, 0x02, 0x00, 0x04, 0x2D, 0x02, 0xF8, 0xFF, 
+	0x0D, 0xC8, 0x2C, 0x09, 0x2B, 0x02, 0xFF, 0x03, 
+	0x8B, 0x01, 0xFF, 0x03, 0x4B, 0xCE, 0x60, 0xC3, 
+	0x6A, 0x09, 0x60, 0x23, 0x18, 0xE0, 0x0C, 0x16, 
+	0x49, 0xC3, 0xDD, 0xC2, 0x0F, 0x02, 0x01, 0x01, 
+	0x8B, 0x01, 0x80, 0xC0, 0xD7, 0x16, 0x8F, 0x05, 
+	0xED, 0xC2, 0x02, 0x00, 0xD3, 0x16, 0x02, 0x10, 
+	0x8D, 0x07, 0xBA, 0xEA, 0x3D, 0xC8, 0xA8, 0x09, 
+	0x1D, 0xC8, 0xAA, 0x09, 0xCB, 0x04, 0xE0, 0x04, 
+	0xF8, 0x05, 0xE0, 0x04, 0x66, 0x09, 0x20, 0xC8, 
+	0x30, 0x0C, 0x80, 0x09, 0xA0, 0x07, 0x82, 0x09, 
+	0xFE, 0xDF, 0x8D, 0x07, 0xFE, 0xDF, 0xE0, 0xC3, 
+	0xD8, 0x07, 0xE0, 0x23, 0x16, 0xE0, 0x24, 0x16, 
+	0xE0, 0xC3, 0x30, 0x0C, 0x4F, 0x63, 0xFF, 0x04, 
+	0xFF, 0x04, 0x4D, 0x06, 0xFD, 0x16, 0x8D, 0x07, 
+	0xFE, 0xDF, 0x20, 0x04, 0xA2, 0xEA, 0xA0, 0xC3, 
+	0xA2, 0xEA, 0xEE, 0xC3, 0x12, 0x00, 0xAA, 0x16, 
+	0x6E, 0xC3, 0x18, 0x00, 0xAD, 0x09, 0x8C, 0x07, 
+	0x00, 0xE0, 0xAC, 0x09, 0x0D, 0x63, 0x0C, 0x13, 
+	0x6E, 0xC3, 0x18, 0x00, 0xAD, 0x09, 0x2D, 0x02, 
+	0x40, 0x00, 0x1D, 0x0A, 0x2D, 0x02, 0x32, 0x0C, 
+	0xBD, 0x07, 0xFF, 0x7F, 0x0C, 0x06, 0xFC, 0x16, 
+	0x20, 0xC3, 0x46, 0x04, 0x8C, 0x02, 0x80, 0x00, 
+	0x13, 0x1A, 0xAC, 0x02, 0x0C, 0xC8, 0x9A, 0x00, 
+	0xE0, 0x02, 0x80, 0x00, 0x88, 0x07, 0x80, 0x00, 
+	0x60, 0xC2, 0x46, 0x04, 0xA0, 0x06, 0x28, 0xAD, 
+	0x02, 0x10, 0x9D, 0x00, 0x05, 0x10, 0x9D, 0x00, 
+	0x8F, 0x07, 0x00, 0x08, 0x60, 0x04, 0x86, 0xBD, 
+	0x4B, 0x2D, 0x81, 0xC3, 0xC9, 0x05, 0x8F, 0x07, 
+	0x00, 0x10, 0x8E, 0x02, 0x02, 0x00, 0xF6, 0x11, 
+	0x8F, 0x07, 0x00, 0x04, 0xC9, 0x05, 0xD9, 0xC2, 
+	0xE0, 0x26, 0x26, 0xE0, 0x02, 0x16, 0x2B, 0x02, 
+	0x06, 0x00, 0x4B, 0xC6, 0x4B, 0xC3, 0xCB, 0x72, 
+	0x2E, 0x02, 0xFE, 0xFF, 0x8B, 0x83, 0xE6, 0x1B, 
+	0xCD, 0x06, 0x4D, 0x73, 0xCD, 0x82, 0xE2, 0x1B, 
+	0xE0, 0x04, 0x1A, 0x09, 0xE0, 0x04, 0x1C, 0x09, 
+	0x4D, 0xC3, 0x02, 0x13, 0x60, 0x66, 0x12, 0xE0, 
+	0xC9, 0x05, 0xCF, 0x04, 0x81, 0x2D, 0x01, 0xC8, 
+	0x6C, 0x01, 0xD4, 0x13, 0x0F, 0xC8, 0x00, 0xFC, 
+	0xC1, 0xC3, 0x0D, 0x06, 0xF7, 0x15, 0x0D, 0x02, 
+	0x36, 0x07, 0x0E, 0x02, 0x98, 0x08, 0x0C, 0x02, 
+	0x03, 0x00, 0x8D, 0xCB, 0x02, 0x00, 0x81, 0x2D, 
+	0x81, 0xCB, 0x06, 0x00, 0xC3, 0x13, 0xEE, 0x04, 
+	0x0C, 0x00, 0x2E, 0x02, 0x18, 0x00, 0x0C, 0x06, 
+	0xF4, 0x16, 0xE0, 0x04, 0x96, 0x08, 0x1F, 0x2E, 
+	0xB9, 0xC3, 0xD9, 0xC3, 0x89, 0x07, 0x12, 0x00, 
+	0x8D, 0x07, 0x3A, 0x09, 0xA0, 0x06, 0xF4, 0xBE, 
+	0x60, 0xC3, 0xD8, 0x07, 0x60, 0x23, 0x16, 0xE0, 
+	0x09, 0x16, 0x20, 0xE8, 0x10, 0xE0, 0x6A, 0x09, 
+	0x20, 0xE8, 0x18, 0xE0, 0x98, 0x07, 0x20, 0xE8, 
+	0x12, 0xE0, 0x78, 0x07, 0x60, 0xC3, 0x6A, 0x09, 
+	0x60, 0x23, 0x1E, 0xE0, 0x03, 0x16, 0x20, 0x48, 
+	0xA4, 0xE3, 0x6A, 0x09, 0x60, 0x23, 0x22, 0xE0, 
+	0x06, 0x13, 0x60, 0x27, 0xA6, 0xE3, 0x03, 0x13, 
+	0x20, 0xE8, 0x10, 0xE0, 0x6A, 0x09, 0x20, 0x2D, 
+	0x00, 0x00, 0x8E, 0x07, 0x00, 0x00, 0xA0, 0x06, 
+	0xD4, 0xBE, 0x4E, 0x05, 0x0E, 0x2C, 0xA0, 0xC0, 
+	0x04, 0x08, 0xEF, 0xC3, 0x06, 0x00, 0x1B, 0x16, 
+	0xA0, 0xC3, 0x72, 0x09, 0xE0, 0xC3, 0x74, 0x09, 
+	0xA0, 0x06, 0xC2, 0xBD, 0xA0, 0xC3, 0x76, 0x09, 
+	0xE0, 0xC3, 0x78, 0x09, 0xA0, 0x06, 0xE0, 0xBD, 
+	0x20, 0xE0, 0x0A, 0xE0, 0x60, 0xC3, 0xD8, 0x07, 
+	0x60, 0x23, 0x16, 0xE0, 0x05, 0x16, 0xE0, 0x04, 
+	0x2E, 0x06, 0x60, 0x41, 0x04, 0xE0, 0x4D, 0x2E, 
+	0x8D, 0x07, 0x00, 0x80, 0x52, 0x04, 0xCF, 0x73, 
+	0x2F, 0x02, 0x00, 0x02, 0x4F, 0xC3, 0x52, 0x04, 
+	0x20, 0x20, 0x0A, 0xE0, 0x03, 0x13, 0x8D, 0x07, 
+	0x00, 0x10, 0x5B, 0x04, 0x20, 0x40, 0x0A, 0xE0, 
+	0x40, 0x02, 0xFF, 0xF0, 0x8E, 0x07, 0x02, 0x00, 
+	0xA0, 0x06, 0xD4, 0xBE, 0x4E, 0x05, 0x0E, 0x2C, 
+	0xA0, 0xC0, 0x04, 0x08, 0xA0, 0x06, 0xB4, 0xBE, 
+	0x60, 0xC3, 0xD8, 0x07, 0x60, 0x23, 0x16, 0xE0, 
+	0x66, 0x16, 0x20, 0x04, 0xB6, 0xEA, 0x63, 0x10, 
+	0x6E, 0x02, 0x00, 0x80, 0x8D, 0x07, 0x00, 0xC0, 
+	0x0D, 0xC8, 0xA6, 0x01, 0x0E, 0xC8, 0x72, 0x09, 
+	0x0F, 0xC8, 0x74, 0x09, 0x0E, 0xC8, 0xA8, 0x01, 
+	0x0F, 0xC8, 0xAA, 0x01, 0x12, 0x10, 0x8F, 0x01, 
+	0x01, 0x00, 0x8A, 0x07, 0x76, 0x09, 0xA0, 0xE3, 
+	0x4E, 0x09, 0x8E, 0xCE, 0x9A, 0x01, 0xFE, 0xFF, 
+	0xE0, 0xE3, 0x50, 0x09, 0x8F, 0xE6, 0x8A, 0x07, 
+	0xAC, 0x01, 0x8E, 0xCE, 0x9A, 0x01, 0xFE, 0xFF, 
+	0x8F, 0xE6, 0x20, 0x20, 0x0A, 0xE0, 0x3F, 0x13, 
+	0x8D, 0x07, 0x00, 0x10, 0x5B, 0x04, 0x20, 0x20, 
+	0x0A, 0xE0, 0x03, 0x13, 0x0D, 0x02, 0x00, 0x10, 
+	0x5B, 0x04, 0x8E, 0xC3, 0x04, 0x13, 0xE0, 0x01, 
+	0x50, 0x09, 0x00, 0x01, 0x06, 0x10, 0xA0, 0x01, 
+	0x50, 0x09, 0x00, 0x01, 0xA0, 0x01, 0x78, 0x09, 
+	0x00, 0x01, 0xA0, 0xC3, 0x76, 0x09, 0xE0, 0xC3, 
+	0x78, 0x09, 0xA0, 0xE3, 0x4E, 0x09, 0xE0, 0xE3, 
+	0x50, 0x09, 0x0E, 0xC8, 0xAC, 0x01, 0x0F, 0xC8, 
+	0xAE, 0x01, 0x0E, 0xC8, 0x76, 0x09, 0x0F, 0xC8, 
+	0x78, 0x09, 0x19, 0x10, 0x6E, 0x02, 0x00, 0x80, 
+	0x0E, 0xC8, 0xA6, 0x01, 0x20, 0x20, 0x0A, 0xE0, 
+	0x12, 0x13, 0x0D, 0x02, 0x00, 0x10, 0x5B, 0x04, 
+	0x8D, 0x07, 0x28, 0x07, 0x89, 0x07, 0x0E, 0x00, 
+	0xA0, 0x06, 0xFA, 0xBE, 0x8D, 0x07, 0x28, 0x07, 
+	0xFD, 0x04, 0x8D, 0x02, 0x36, 0x07, 0xFC, 0x16, 
+	0x20, 0x48, 0x14, 0xE0, 0xFE, 0x06, 0x8D, 0x07, 
+	0x00, 0x80, 0x52, 0x04, 0xA0, 0xC2, 0xEE, 0x07, 
+	0x8C, 0x07, 0x04, 0x00, 0x8D, 0x07, 0xF0, 0x08, 
+	0x97, 0x06, 0x7D, 0xC2, 0x5D, 0xC3, 0x60, 0x43, 
+	0x22, 0xE0, 0xA0, 0x06, 0xFA, 0xBE, 0xEF, 0x10, 
+	0x0E, 0xC8, 0x06, 0x06, 0x0F, 0xC8, 0x08, 0x06, 
+	0xEA, 0x10, 0xB0, 0x03, 0xA0, 0x01, 0x60, 0x07, 
+	0x26, 0x00, 0x40, 0x02, 0x00, 0xC0, 0xE0, 0x04, 
+	0x06, 0x06, 0x8C, 0x07, 0x10, 0x40, 0xCC, 0x44, 
+	0xE0, 0x04, 0xFE, 0x06, 0x85, 0x07, 0x40, 0x80, 
+	0x5B, 0x04, 0x02, 0xC8, 0x04, 0x08, 0x8F, 0x07, 
+	0xFA, 0x07, 0xCE, 0xCB, 0x02, 0x00, 0x8E, 0x07, 
+	0x36, 0x07, 0xCE, 0xCB, 0x04, 0x00, 0x8D, 0x07, 
+	0x30, 0x06, 0x8E, 0x07, 0x10, 0x00, 0x4D, 0x2C, 
+	0x5B, 0x04, 0xA0, 0xC2, 0xF2, 0x07, 0x02, 0x10, 
+	0xA0, 0xC2, 0xF8, 0x07, 0x0B, 0xC8, 0xEA, 0x08, 
+	0x09, 0xC3, 0x0A, 0x13, 0xA0, 0x06, 0x36, 0xBA, 
+	0xA0, 0xC2, 0x00, 0x01, 0xA0, 0xE2, 0x06, 0xE0, 
+	0x4C, 0xA3, 0xCC, 0xA3, 0x01, 0x17, 0x8E, 0x05, 
+	0x4C, 0x62, 0xE0, 0xC2, 0xEA, 0x08, 0x5B, 0x04, 
+	0x8D, 0x07, 0x00, 0x10, 0x20, 0x20, 0x0A, 0xE0, 
+	0x01, 0x13, 0x5B, 0x04, 0x0D, 0x02, 0x48, 0x00, 
+	0xE0, 0xC3, 0x30, 0x09, 0x02, 0x16, 0xCE, 0x01, 
+	0x10, 0x00, 0x8D, 0x27, 0x03, 0x13, 0x0D, 0x02, 
+	0x00, 0x01, 0x52, 0x04, 0x00, 0x03, 0x02, 0x00, 
+	0x60, 0xC3, 0x6A, 0x09, 0x4D, 0x02, 0x08, 0x80, 
+	0x4E, 0x02, 0xF7, 0x7F, 0x8D, 0xE3, 0xE0, 0xC3, 
+	0xD8, 0x07, 0xE0, 0x23, 0x16, 0xE0, 0x04, 0x13, 
+	0x8D, 0x07, 0x06, 0x00, 0x8D, 0x27, 0x02, 0x13, 
+	0xA0, 0xE3, 0x10, 0xE0, 0x0E, 0xC8, 0x6A, 0x09, 
+	0x60, 0x01, 0x8E, 0x09, 0x00, 0x80, 0x09, 0x13, 
+	0x0D, 0x02, 0x00, 0x12, 0x4E, 0x01, 0x10, 0x00, 
+	0x02, 0x13, 0x0D, 0x02, 0x00, 0x13, 0x0D, 0xD8, 
+	0x2E, 0x09, 0x60, 0xC3, 0x80, 0x01, 0x4E, 0x02, 
+	0x01, 0x00, 0x4D, 0x02, 0xFE, 0xFF, 0x4E, 0xE3, 
+	0x0D, 0xC8, 0x80, 0x01, 0x20, 0xD8, 0x40, 0xE2, 
+	0x2F, 0x09, 0x20, 0x01, 0x6A, 0x09, 0x06, 0x00, 
+	0x03, 0x13, 0x20, 0xD8, 0xD0, 0xE1, 0x2F, 0x09, 
+	0x20, 0x98, 0x83, 0x01, 0x00, 0xE2, 0x03, 0x13, 
+	0x20, 0xD8, 0x2F, 0x09, 0x83, 0x01, 0x00, 0x03, 
+	0x0F, 0x00, 0x60, 0x04, 0x88, 0xBE, 0x20, 0x20, 
+	0x0A, 0xE0, 0x03, 0x13, 0x0D, 0x02, 0x00, 0x10, 
+	0x5B, 0x04, 0x09, 0x02, 0x08, 0x00, 0x0D, 0x02, 
+	0x58, 0x09, 0xA0, 0x06, 0xF4, 0xBE, 0xA0, 0x07, 
+	0x02, 0x02, 0x00, 0x00, 0x0D, 0x02, 0x00, 0x04, 
+	0xE0, 0xC3, 0x58, 0x09, 0x0F, 0x01, 0x00, 0x7C, 
+	0x01, 0x13, 0x52, 0x04, 0x8F, 0xC3, 0x4E, 0x02, 
+	0x0F, 0x00, 0xFB, 0x13, 0x8E, 0x02, 0x0F, 0x00, 
+	0xF8, 0x13, 0x0D, 0x02, 0x00, 0x40, 0x4F, 0xC2, 
+	0x49, 0x09, 0x49, 0x02, 0x3F, 0x00, 0x09, 0x01, 
+	0x01, 0x00, 0xEF, 0x16, 0x89, 0x02, 0x06, 0x00, 
+	0xEC, 0x1A, 0x89, 0x02, 0x20, 0x00, 0xE9, 0x14, 
+	0xC9, 0x06, 0x1F, 0x09, 0x4F, 0x02, 0x00, 0x40, 
+	0x4F, 0xE2, 0x69, 0x02, 0x00, 0x80, 0x09, 0xC8, 
+	0x58, 0x09, 0x0F, 0x02, 0xFF, 0xFF, 0x4E, 0xC2, 
+	0x1F, 0x09, 0x09, 0x06, 0xFD, 0x16, 0x4F, 0x05, 
+	0x0D, 0x02, 0x00, 0x20, 0x60, 0xC2, 0x5A, 0x09, 
+	0xD4, 0x13, 0x4F, 0x26, 0xD2, 0x16, 0x0D, 0x02, 
+	0x00, 0x10, 0x60, 0xC2, 0x5C, 0x09, 0xCD, 0x13, 
+	0x4F, 0x26, 0xCB, 0x16, 0x0D, 0x02, 0x00, 0x30, 
+	0x20, 0x88, 0x5A, 0x09, 0x5C, 0x09, 0xC5, 0x13, 
+	0xE0, 0xC3, 0x5A, 0x09, 0x4E, 0xC2, 0x1F, 0x0A, 
+	0x09, 0x06, 0xFD, 0x16, 0xE0, 0xE3, 0x5E, 0x09, 
+	0x0F, 0xC8, 0x5A, 0x09, 0xE0, 0xC3, 0x5C, 0x09, 
+	0x4E, 0xC2, 0x1F, 0x0A, 0x09, 0x06, 0xFD, 0x16, 
+	0xE0, 0xE3, 0x5E, 0x09, 0x0F, 0xC8, 0x5C, 0x09, 
+	0x0F, 0x02, 0xFF, 0xFF, 0x4E, 0xC2, 0x1F, 0x0A, 
+	0x09, 0x06, 0xFD, 0x16, 0x0D, 0x02, 0x00, 0x08, 
+	0x60, 0xC2, 0x5E, 0x09, 0x4F, 0x26, 0xA5, 0x16, 
+	0x4F, 0x05, 0x0F, 0xC8, 0x5E, 0x09, 0x0F, 0x02, 
+	0x02, 0x02, 0x0E, 0x02, 0x03, 0x00, 0x60, 0xC3, 
+	0x40, 0x01, 0x0C, 0x02, 0xFE, 0xC0, 0xA0, 0x01, 
+	0x40, 0x01, 0x00, 0x04, 0xCF, 0x05, 0x09, 0x02, 
+	0x55, 0x55, 0x9C, 0x06, 0x49, 0x05, 0x9C, 0x06, 
+	0x09, 0x07, 0x9C, 0x06, 0x49, 0x05, 0x9C, 0x06, 
+	0x0E, 0x06, 0xF4, 0x16, 0xA0, 0x01, 0x40, 0x01, 
+	0x00, 0x40, 0x0D, 0xC8, 0x40, 0x01, 0x09, 0x02, 
+	0x08, 0x00, 0x0E, 0x02, 0x58, 0x09, 0x0F, 0x02, 
+	0x02, 0x02, 0xFE, 0xCF, 0x49, 0x06, 0xFD, 0x16, 
+	0x60, 0x04, 0x88, 0xBE, 0xC9, 0xC7, 0x5F, 0x82, 
+	0x01, 0x16, 0x5B, 0x04, 0xA0, 0x01, 0x40, 0x01, 
+	0x00, 0x40, 0x0D, 0xC8, 0x40, 0x01, 0x0D, 0x02, 
+	0x00, 0x01, 0x52, 0x04, 0x8D, 0x07, 0x00, 0x10, 
+	0x20, 0x20, 0x0A, 0xE0, 0x0A, 0x16, 0x8D, 0x07, 
+	0x00, 0x08, 0x20, 0x20, 0x10, 0xE0, 0x05, 0x13, 
+	0x8D, 0x07, 0x00, 0x40, 0x4F, 0x01, 0x01, 0x00, 
+	0x01, 0x16, 0x5B, 0x04, 0x20, 0xE0, 0x10, 0xE0, 
+	0x20, 0x07, 0x9C, 0x08, 0x20, 0x07, 0xB4, 0x08, 
+	0x20, 0x07, 0xCC, 0x08, 0xA0, 0x07, 0xA2, 0x08, 
+	0x84, 0x02, 0xA0, 0x07, 0xBA, 0x08, 0x84, 0x02, 
+	0xA0, 0x07, 0xD2, 0x08, 0x84, 0x02, 0xA0, 0x07, 
+	0x04, 0x09, 0x00, 0x40, 0xE0, 0x04, 0x06, 0x09, 
+	0xE0, 0x04, 0x08, 0x09, 0x0E, 0xC8, 0x4C, 0x08, 
+	0x0F, 0xC8, 0x4E, 0x08, 0x0E, 0xC8, 0x8E, 0x08, 
+	0x0F, 0xC8, 0x90, 0x08, 0xE0, 0x04, 0x5A, 0x08, 
+	0xE0, 0x04, 0x60, 0x08, 0xE0, 0x02, 0x78, 0x07, 
+	0xE0, 0x04, 0x94, 0x08, 0x20, 0x40, 0x40, 0xE3, 
+	0x20, 0xE0, 0x0C, 0xE0, 0x60, 0x04, 0xBC, 0xC6, 
+	0x80, 0x01, 0x00, 0xF0, 0xC0, 0x01, 0x00, 0x40, 
+	0x10, 0x10, 0x80, 0x01, 0x00, 0xF0, 0x0D, 0x10, 
+	0xC0, 0x01, 0x00, 0xF0, 0x20, 0x40, 0x06, 0xE0, 
+	0x08, 0x10, 0xC0, 0x01, 0x00, 0xF0, 0x80, 0x01, 
+	0x00, 0x20, 0xE0, 0xC3, 0x94, 0x08, 0x01, 0x16, 
+	0x5B, 0x04, 0x4B, 0xC0, 0x20, 0x04, 0xDA, 0xEA, 
+	0x40, 0x01, 0x00, 0x20, 0xFB, 0x16, 0x51, 0x04, 
+	0xA0, 0xC2, 0xD8, 0x07, 0x4A, 0x01, 0x40, 0x00, 
+	0x01, 0x16, 0x5B, 0x04, 0xE0, 0x02, 0x78, 0x07, 
+	0x20, 0x20, 0x0C, 0xE0, 0xEF, 0x16, 0x43, 0xC2, 
+	0x02, 0x13, 0xA0, 0x06, 0x1A, 0xC3, 0x20, 0x2F, 
+	0x36, 0x07, 0x20, 0x40, 0x0C, 0xE0, 0xA0, 0x06, 
+	0xAC, 0xC1, 0xA0, 0xC3, 0x94, 0x08, 0xFB, 0x16, 
+	0xA0, 0x06, 0x3A, 0xC2, 0x8E, 0x07, 0x04, 0x09, 
+	0x9E, 0x07, 0x00, 0x80, 0x20, 0x20, 0x10, 0xE0, 
+	0x05, 0x16, 0x8F, 0x07, 0x4C, 0x08, 0xBF, 0xCF, 
+	0xBF, 0xCF, 0x9F, 0xC7, 0xA0, 0x06, 0x5A, 0xC2, 
+	0x20, 0xE8, 0x3C, 0xE3, 0x62, 0x07, 0xA0, 0x06, 
+	0x3A, 0xC2, 0x20, 0x48, 0x3C, 0xE3, 0x62, 0x07, 
+	0x20, 0x40, 0x40, 0xE3, 0x20, 0xE0, 0x04, 0xE0, 
+	0x20, 0x48, 0x10, 0xE0, 0x58, 0x07, 0x5B, 0x04, 
+	0x80, 0x01, 0x00, 0xF0, 0x20, 0xE0, 0x04, 0xE0, 
+	0x60, 0x01, 0x60, 0x07, 0x02, 0x00, 0x02, 0x13, 
+	0x9B, 0x06, 0xB8, 0x10, 0x20, 0xE8, 0x1E, 0xE0, 
+	0x58, 0x07, 0xB4, 0x10, 0x9B, 0x06, 0x80, 0x03, 
+	0xE0, 0x02, 0x58, 0x07, 0x00, 0x01, 0x00, 0x40, 
+	0x07, 0x16, 0x8D, 0x07, 0x00, 0x09, 0xA0, 0x06, 
+	0x68, 0xB8, 0xE0, 0x02, 0x78, 0x07, 0x5B, 0x04, 
+	0xC4, 0x01, 0x02, 0x00, 0xE0, 0x02, 0x78, 0x07, 
+	0x5B, 0x04, 0x0E, 0x68, 0x96, 0x08, 0xE9, 0x04, 
+	0x0C, 0x00, 0x11, 0x10, 0x0E, 0x02, 0x00, 0x23, 
+	0x4E, 0xDB, 0x01, 0x00, 0xCC, 0x01, 0x00, 0x04, 
+	0x4C, 0xD7, 0x1C, 0x10, 0x60, 0xC2, 0x5C, 0x07, 
+	0x20, 0x06, 0x94, 0x08, 0xA9, 0xC2, 0x08, 0x00, 
+	0xA9, 0xC3, 0x0C, 0x00, 0xEA, 0x16, 0x29, 0x07, 
+	0x04, 0x00, 0x69, 0x01, 0x0A, 0x00, 0x01, 0x00, 
+	0x2D, 0x13, 0x49, 0xC3, 0x2D, 0x02, 0x0E, 0x00, 
+	0x0A, 0xC3, 0x1D, 0xD3, 0x8C, 0x01, 0x00, 0x84, 
+	0xCC, 0x01, 0x00, 0x40, 0x0A, 0x01, 0x00, 0x5E, 
+	0xDD, 0x16, 0x4C, 0xC7, 0xA9, 0xC3, 0x10, 0x00, 
+	0xE9, 0xC3, 0x12, 0x00, 0x41, 0xCA, 0x10, 0x00, 
+	0x2F, 0x02, 0x04, 0x00, 0x01, 0x17, 0x8E, 0x05, 
+	0x8C, 0x07, 0x02, 0x00, 0xA0, 0xC2, 0xF6, 0x07, 
+	0xA0, 0x06, 0x00, 0xBA, 0x69, 0xC0, 0x10, 0x00, 
+	0x29, 0xC8, 0x14, 0x00, 0x06, 0x09, 0x29, 0xC8, 
+	0x16, 0x00, 0x08, 0x09, 0x69, 0x01, 0x0E, 0x00, 
+	0x00, 0x08, 0x04, 0x16, 0x90, 0x03, 0x7F, 0x00, 
+	0xA0, 0x06, 0x5A, 0xC2, 0x40, 0x01, 0x00, 0x40, 
+	0x01, 0x16, 0x51, 0x04, 0x60, 0x04, 0xBE, 0xC1, 
+	0xA9, 0xC3, 0x0C, 0x00, 0x0B, 0x13, 0x0E, 0x68, 
+	0x96, 0x08, 0xE9, 0x04, 0x0C, 0x00, 0x29, 0xC8, 
+	0x06, 0x00, 0x6C, 0x01, 0xA0, 0xC3, 0x00, 0xFC, 
+	0x01, 0x13, 0x1E, 0x2E, 0x29, 0x07, 0x04, 0x00, 
+	0x5B, 0x04, 0x81, 0x07, 0x20, 0x20, 0x89, 0x07, 
+	0x4C, 0x08, 0x41, 0xCE, 0x63, 0xCE, 0x10, 0x00, 
+	0x63, 0xC6, 0x12, 0x00, 0xA0, 0x06, 0x54, 0xBA, 
+	0x43, 0xC2, 0x02, 0x13, 0xA0, 0x06, 0x1A, 0xC3, 
+	0x20, 0xE0, 0x10, 0xE0, 0x60, 0x04, 0xEC, 0xC1, 
+	0x40, 0x01, 0x00, 0x04, 0xEA, 0x16, 0xA0, 0x06, 
+	0xAC, 0xC1, 0xA0, 0xC2, 0xF0, 0x07, 0x8C, 0x07, 
+	0x04, 0x00, 0x8D, 0x07, 0x4C, 0x08, 0xA0, 0xC3, 
+	0x8E, 0x08, 0xE0, 0xC3, 0x90, 0x08, 0xA0, 0x06, 
+	0x36, 0xBA, 0xE0, 0xC3, 0x4E, 0x08, 0x4F, 0x01, 
+	0x01, 0x00, 0x13, 0x16, 0xE0, 0xC2, 0x94, 0x08, 
+	0xEA, 0x16, 0x60, 0x04, 0xEC, 0xC1, 0xE0, 0xC3, 
+	0x4E, 0x08, 0x4F, 0x01, 0x01, 0x00, 0x09, 0x16, 
+	0x60, 0x04, 0xEC, 0xC1, 0xA0, 0x06, 0x54, 0xBA, 
+	0xE0, 0xC3, 0x4E, 0x08, 0x4F, 0x01, 0x01, 0x00, 
+	0xD7, 0x13, 0xA0, 0xC2, 0xF0, 0x07, 0x20, 0xC3, 
+	0x7C, 0x09, 0x8D, 0x07, 0x4C, 0x08, 0x9D, 0xC3, 
+	0xA0, 0x06, 0x36, 0xBA, 0xC0, 0x06, 0x20, 0xD0, 
+	0x50, 0x08, 0xC0, 0x06, 0x40, 0x01, 0x00, 0x04, 
+	0x0A, 0x16, 0x40, 0x01, 0x80, 0x00, 0x07, 0x13, 
+	0x0E, 0xC8, 0x4C, 0x08, 0x0F, 0xC8, 0x4E, 0x08, 
+	0xA0, 0x06, 0xA2, 0xC1, 0xD8, 0x10, 0x0E, 0xC8, 
+	0x8E, 0x08, 0x0F, 0xC8, 0x90, 0x08, 0x40, 0x01, 
+	0x00, 0x04, 0x0C, 0x13, 0x40, 0x01, 0x20, 0x00, 
+	0x58, 0x16, 0x81, 0x07, 0x10, 0x20, 0x9F, 0x10, 
+	0xA0, 0x06, 0xAC, 0xC1, 0xA0, 0xC3, 0x8E, 0x08, 
+	0xE0, 0xC3, 0x90, 0x08, 0x83, 0x07, 0x98, 0x08, 
+	0x63, 0x07, 0x04, 0x00, 0x2D, 0x11, 0x83, 0x07, 
+	0xB0, 0x08, 0x63, 0x07, 0x04, 0x00, 0x28, 0x11, 
+	0x83, 0x07, 0xC8, 0x08, 0x63, 0x07, 0x04, 0x00, 
+	0x23, 0x11, 0xC3, 0x60, 0x60, 0xC2, 0x46, 0x07, 
+	0xE7, 0x13, 0x69, 0x01, 0x0E, 0x00, 0x00, 0x08, 
+	0xE3, 0x13, 0x00, 0x03, 0x02, 0x00, 0x19, 0xC8, 
+	0x46, 0x07, 0x03, 0x16, 0xA0, 0x01, 0x3A, 0x07, 
+	0x20, 0x00, 0x00, 0x03, 0x0F, 0x00, 0xC0, 0x01, 
+	0x00, 0xF0, 0x80, 0x01, 0x00, 0x20, 0x01, 0x02, 
+	0x06, 0xC4, 0x60, 0x04, 0x9A, 0xC2, 0x81, 0x07, 
+	0x80, 0x20, 0xE0, 0xC8, 0x8E, 0x08, 0x14, 0x00, 
+	0xE0, 0xC8, 0x90, 0x08, 0x16, 0x00, 0xC7, 0x10, 
+	0xE0, 0xC8, 0x50, 0x08, 0x0E, 0x00, 0xCE, 0xC8, 
+	0x10, 0x00, 0xCF, 0xC8, 0x12, 0x00, 0x40, 0x01, 
+	0x20, 0x00, 0xBB, 0x16, 0xE3, 0xC1, 0x06, 0x00, 
+	0xC7, 0xC8, 0x08, 0x00, 0x07, 0xC8, 0x6C, 0x01, 
+	0x07, 0xC8, 0xE0, 0x08, 0x08, 0x02, 0x02, 0xFC, 
+	0xB8, 0x07, 0x00, 0x81, 0xE0, 0xC1, 0xE8, 0x00, 
+	0x07, 0xCE, 0x20, 0xC8, 0x52, 0x08, 0x92, 0x08, 
+	0xDA, 0x13, 0xCE, 0xC8, 0x14, 0x00, 0xCF, 0xC8, 
+	0x16, 0x00, 0x80, 0x01, 0x00, 0x04, 0x82, 0x07, 
+	0x54, 0x08, 0x32, 0xC1, 0x08, 0x11, 0x72, 0xC1, 
+	0x92, 0xC1, 0x82, 0x07, 0x8A, 0x08, 0x04, 0xC1, 
+	0x07, 0x16, 0x60, 0x04, 0x8E, 0xC5, 0x72, 0xC1, 
+	0xB2, 0xC1, 0x84, 0x01, 0x00, 0x80, 0xF9, 0x13, 
+	0x04, 0x68, 0x92, 0x08, 0xC7, 0xC1, 0x37, 0x16, 
+	0x20, 0x98, 0x97, 0x08, 0x85, 0x09, 0x16, 0x16, 
+	0x81, 0x07, 0x40, 0x20, 0xE0, 0xC1, 0x94, 0x08, 
+	0x57, 0x13, 0xA0, 0x06, 0xAC, 0xC1, 0xF4, 0x10, 
+	0xE0, 0xC2, 0x3A, 0x07, 0xE0, 0x42, 0x62, 0x07, 
+	0xE0, 0x26, 0x3A, 0xE3, 0x02, 0x13, 0xA0, 0x06, 
+	0x92, 0xC1, 0xA0, 0x06, 0x54, 0xBA, 0x22, 0x10, 
+	0xA0, 0x06, 0x9C, 0xC1, 0x81, 0x2D, 0x01, 0xC2, 
+	0xFB, 0x13, 0xA0, 0x05, 0x96, 0x08, 0x23, 0xC8, 
+	0x08, 0x00, 0x6C, 0x01, 0xA0, 0x07, 0x02, 0xFC, 
+	0x00, 0x80, 0xC3, 0xC1, 0x27, 0x02, 0x06, 0x00, 
+	0xA0, 0x06, 0x0C, 0xB5, 0xA3, 0x05, 0x0C, 0x00, 
+	0x08, 0xC8, 0x6C, 0x01, 0x08, 0xC8, 0xE0, 0x08, 
+	0x08, 0x02, 0x02, 0xFC, 0xB8, 0x07, 0x00, 0x81, 
+	0xF8, 0xC1, 0x04, 0xC1, 0x37, 0x13, 0xE0, 0xD2, 
+	0x03, 0x01, 0xD2, 0x13, 0x0B, 0x02, 0x0A, 0x01, 
+	0xC4, 0xCE, 0xC7, 0xCE, 0xC5, 0xCE, 0xC6, 0xCE, 
+	0xFB, 0x04, 0x09, 0x02, 0x00, 0x04, 0x48, 0xA2, 
+	0xC9, 0xC6, 0x20, 0xA8, 0xE0, 0x08, 0x12, 0x01, 
+	0x20, 0xC8, 0xF2, 0x07, 0x00, 0x01, 0x47, 0xC2, 
+	0xC4, 0x81, 0x01, 0x14, 0x44, 0xC2, 0xC9, 0x61, 
+	0x09, 0xA2, 0x89, 0xA1, 0x01, 0x17, 0x85, 0x05, 
+	0x09, 0x61, 0xA8, 0x16, 0x82, 0x02, 0x8A, 0x08, 
+	0x05, 0x16, 0x40, 0x01, 0x10, 0x00, 0x12, 0x13, 
+	0x60, 0x04, 0xA6, 0xC3, 0x60, 0x04, 0xBC, 0xC4, 
+	0x60, 0x04, 0x40, 0xC3, 0x81, 0x07, 0x80, 0x20, 
+	0xFB, 0x10, 0x81, 0x07, 0x80, 0x20, 0xF8, 0x10, 
+	0x81, 0x07, 0x02, 0x20, 0xF5, 0x10, 0x81, 0x07, 
+	0x04, 0x20, 0xF2, 0x10, 0x23, 0xC8, 0x08, 0x00, 
+	0x6C, 0x01, 0x07, 0x05, 0xE0, 0xA1, 0xE8, 0x00, 
+	0x0C, 0x02, 0x04, 0xFC, 0x07, 0xCF, 0xE0, 0xC2, 
+	0x92, 0x08, 0xE8, 0x16, 0xE0, 0xD2, 0x03, 0x01, 
+	0x10, 0x16, 0xE0, 0xC2, 0x3A, 0x07, 0xE0, 0x42, 
+	0x62, 0x07, 0xE0, 0x26, 0x3A, 0xE3, 0x07, 0x13, 
+	0x90, 0x03, 0xC8, 0x2F, 0xA0, 0x06, 0x92, 0xC1, 
+	0xE0, 0xD2, 0x03, 0x01, 0x02, 0x16, 0xA0, 0x06, 
+	0x54, 0xBA, 0x23, 0xC8, 0x06, 0x00, 0x6C, 0x01, 
+	0xA3, 0xC2, 0x0E, 0x00, 0x4A, 0x01, 0x00, 0x01, 
+	0x0B, 0x13, 0x0C, 0x02, 0x0E, 0xFC, 0x5C, 0xC2, 
+	0x49, 0x02, 0x00, 0x80, 0x0D, 0x02, 0x6C, 0x09, 
+	0x7D, 0xE2, 0x09, 0xCF, 0x3D, 0xCF, 0x3D, 0xCF, 
+	0x0C, 0x02, 0x00, 0xFC, 0x6C, 0xC3, 0x06, 0x00, 
+	0x4D, 0x02, 0xFF, 0xE0, 0x4A, 0x02, 0x00, 0x02, 
+	0x8A, 0xA2, 0x8A, 0xA2, 0x4A, 0xE3, 0x60, 0xE3,  
+	0x9E, 0x09, 0x0D, 0xCB, 0x06, 0x00, 0xCD, 0x06, 
+	0x0B, 0x02, 0x0F, 0x00, 0xEC, 0x82, 0x04, 0x00, 
+	0xAD, 0x11, 0xEC, 0xC3, 0x0E, 0x00, 0x11, 0x15, 
+	0x10, 0x13, 0x6C, 0xC2, 0x14, 0x00, 0x49, 0x02, 
+	0x00, 0x1F, 0xA7, 0x13, 0xC9, 0x06, 0x89, 0x02, 
+	0x12, 0x00, 0xA3, 0x1B, 0x49, 0x01, 0x01, 0x00, 
+	0xA0, 0x13, 0xC9, 0xA2, 0xEC, 0x82, 0x04, 0x00, 
+	0x9C, 0x11, 0x4D, 0xA3, 0x9D, 0x18, 0x14, 0x11, 
+	0x60, 0x01, 0x6A, 0x09, 0x00, 0x80, 0x18, 0x13, 
+	0x1D, 0x09, 0xCC, 0xA2, 0xEB, 0xC2, 0x08, 0x00, 
+	0x7B, 0x09, 0x4B, 0x02, 0x1E, 0x00, 0xA0, 0xC3, 
+	0xF0, 0x06, 0xAB, 0x23, 0x04, 0xE0, 0x8F, 0x16, 
+	0x60, 0x27, 0x3E, 0xE3, 0x8C, 0x16, 0x4D, 0xA3, 
+	0x4D, 0xA3, 0x4D, 0xA3, 0xCD, 0x06, 0x4D, 0x02, 
+	0x07, 0x00, 0x0D, 0x88, 0xEE, 0x06, 0x0A, 0x15, 
+	0x90, 0x03, 0xFF, 0x6F, 0x53, 0x2F, 0xA0, 0x05, 
+	0x94, 0x08, 0xC3, 0x04, 0xC0, 0x01, 0x00, 0x04, 
+	0x60, 0x04, 0xAA, 0xC3, 0x60, 0x01, 0x6A, 0x09, 
+	0x00, 0x80, 0xF2, 0x13, 0x01, 0x02, 0x08, 0x20, 
+	0x60, 0x04, 0xA2, 0xC5, 0x8D, 0x07, 0x00, 0x10, 
+	0x20, 0x20, 0x0A, 0xE0, 0x0A, 0x16, 0x8D, 0x07, 
+	0x00, 0x08, 0x20, 0x20, 0x0E, 0xE0, 0x05, 0x13, 
+	0x8D, 0x07, 0x00, 0x40, 0x4F, 0x01, 0x01, 0x00, 
+	0x01, 0x16, 0x5B, 0x04, 0x20, 0xE0, 0x0E, 0xE0, 
+	0xA0, 0x07, 0xFA, 0x08, 0x00, 0x80, 0x0E, 0xC8,  
+	0xFA, 0x07, 0x0F, 0xC8, 0xFC, 0x07, 0x0E, 0xC8,  
+	0x3C, 0x08, 0x0F, 0xC8, 0x3E, 0x08, 0xE0, 0x04,  
+	0x08, 0x08, 0xE0, 0x04, 0x0E, 0x08, 0xE0, 0x02,  
+	0x98, 0x07, 0x20, 0x40, 0x4C, 0xE3, 0x20, 0x07, 
+	0x2E, 0x06, 0x60, 0x04, 0x12, 0xCA, 0x00, 0x70, 
+	0x4B, 0xC0, 0xE0, 0x04, 0x2E, 0x06, 0x0B, 0x10, 
+	0x20, 0xF0, 0x4B, 0xE3, 0x02, 0x10, 0x20, 0xF0, 
+	0x4A, 0xE3, 0x4B, 0xC0, 0xE0, 0x04, 0x2E, 0x06, 
+	0xE0, 0x01, 0x62, 0x07, 0x40, 0x00, 0x20, 0xE8, 
+	0x46, 0xE3, 0x62, 0x07, 0x20, 0x04, 0xDA, 0xEA,  
+	0x40, 0x01, 0x00, 0x20, 0x04, 0x13, 0xFA, 0x10,  
+	0x40, 0x01, 0x00, 0x40, 0xF7, 0x16, 0x20, 0x07,  
+	0x2E, 0x06, 0x20, 0x50, 0x50, 0xE3, 0x51, 0x04, 
+	0xF1, 0x10, 0xE0, 0x02, 0x58, 0x07, 0x00, 0x01, 
+	0x00, 0x40, 0x07, 0x16, 0x8D, 0x07, 0xF6, 0x08, 
+	0xA0, 0x06, 0x68, 0xB8, 0xE0, 0x02, 0x98, 0x07, 
+	0x5B, 0x04, 0xC4, 0x01, 0x04, 0x00, 0xE0, 0x02, 
+	0x98, 0x07, 0x5B, 0x04, 0x60, 0x01, 0x60, 0x07, 
+	0x04, 0x00, 0x06, 0x16, 0x20, 0xE8, 0x1C, 0xE0, 
+	0x58, 0x07, 0x80, 0x03, 0xE0, 0x02, 0x98, 0x07, 
+	0x20, 0xD8, 0xDC, 0x07, 0x17, 0x01, 0x8F, 0x07, 
+	0x8E, 0xFF, 0x0F, 0xC8, 0x04, 0x01, 0x20, 0xE8, 
+	0x06, 0xE0, 0x58, 0x07, 0x80, 0x01, 0x00, 0x80, 
+	0x5B, 0x04, 0xE0, 0xC2, 0x4A, 0x08, 0xC3, 0x82, 
+	0x03, 0x13, 0xDB, 0x2D, 0x03, 0xC8, 0x4A, 0x08, 
+	0x49, 0x01, 0x00, 0x01, 0x02, 0x16, 0x60, 0x04, 
+	0x52, 0xC9, 0xE0, 0xC0, 0xF8, 0x05, 0xFD, 0x13, 
+	0x03, 0xC8, 0x6C, 0x01, 0x20, 0xC8, 0x00, 0xFC, 
+	0xF8, 0x05, 0x88, 0x07, 0x02, 0xFC, 0x78, 0xC2, 
+	0xF8, 0xC1, 0x28, 0x02, 0x00, 0x04, 0x49, 0x01, 
+	0x00, 0x01, 0x4D, 0x16, 0x09, 0x01, 0x00, 0x5E, 
+	0x29, 0x16, 0x49, 0x01, 0x02, 0x00, 0x0B, 0x16, 
+	0x60, 0x01, 0x46, 0x08, 0x00, 0x02, 0x0A, 0x16, 
+	0x27, 0x02, 0x04, 0x00, 0x07, 0x88, 0x7E, 0x09, 
+	0x05, 0x12, 0x27, 0x02, 0xFC, 0xFF, 0xA0, 0x01, 
+	0x46, 0x08, 0x00, 0x02, 0xC7, 0xC1, 0x37, 0x15, 
+	0xD3, 0x2D, 0xE0, 0xC0, 0x4A, 0x08, 0x07, 0xA8, 
+	0x48, 0x08, 0x07, 0xA8, 0x44, 0x08, 0x0C, 0x15, 
+	0x20, 0xC8, 0x3C, 0x08, 0xFA, 0x07, 0x20, 0xC8, 
+	0x3E, 0x08, 0xFC, 0x07, 0x20, 0xC8, 0x40, 0x08, 
+	0x3C, 0x08, 0x20, 0xC8, 0x42, 0x08, 0x3E, 0x08, 
+	0x60, 0x04, 0x52, 0xC9, 0xA0, 0x06, 0x54, 0xBA, 
+	0xD3, 0x2D, 0xE0, 0xC2, 0x4A, 0x08, 0xC3, 0x82, 
+	0x01, 0x13, 0xDB, 0x2D, 0x20, 0x88, 0x3E, 0x08, 
+	0x3A, 0x08, 0x0D, 0x16, 0x20, 0x88, 0x3C, 0x08, 
+	0x38, 0x08, 0x09, 0x16, 0xE0, 0x04, 0x44, 0x08, 
+	0x82, 0x07, 0x02, 0x08, 0x04, 0x61, 0xE0, 0x04, 
+	0x48, 0x08, 0x60, 0x04, 0x1E, 0xCA, 0x20, 0xC8, 
+	0x38, 0x08, 0xFA, 0x07, 0x20, 0xC8, 0x3A, 0x08, 
+	0xFC, 0x07, 0x60, 0x04, 0x12, 0xCA, 0x07, 0xA8, 
+	0x48, 0x08, 0x04, 0xC1, 0x1B, 0x16, 0x82, 0x02, 
+	0x38, 0x08, 0x0A, 0x16, 0x60, 0x01, 0xFC, 0x07, 
+	0x01, 0x00, 0x02, 0x16, 0xA0, 0x06, 0x6E, 0xCB, 
+	0xA0, 0x06, 0xFC, 0xCA, 0x80, 0x01, 0x10, 0x00, 
+	0x32, 0xC1, 0x07, 0x11, 0x72, 0xC1, 0x92, 0xC1, 
+	0x82, 0x07, 0x38, 0x08, 0x04, 0xC1, 0x06, 0x16, 
+	0xEA, 0x10, 0x72, 0xC1, 0xB2, 0xC1, 0x84, 0x01, 
+	0x00, 0x80, 0xE5, 0x13, 0xE0, 0xD2, 0x03, 0x01, 
+	0x34, 0x13, 0x0B, 0x02, 0x0A, 0x01, 0xC4, 0xCE, 
+	0xC7, 0xCE, 0xC5, 0xCE, 0xC6, 0xCE, 0xFB, 0x04, 
+	0xC8, 0xC6, 0x03, 0xA8, 0x12, 0x01, 0x20, 0xC8, 
+	0xF8, 0x07, 0x00, 0x01, 0xC7, 0xC2, 0xC4, 0x81, 
+	0x01, 0x14, 0xC4, 0xC2, 0x0B, 0xA8, 0x44, 0x08, 
+	0x0B, 0x61, 0x0B, 0xA2, 0x8B, 0xA1, 0x01, 0x17, 
+	0x85, 0x05, 0xCB, 0x61, 0xC6, 0x16, 0x40, 0x01, 
+	0x40, 0x00, 0x15, 0x16, 0x87, 0x07, 0x20, 0x00, 
+	0xE0, 0x61, 0x44, 0x08, 0xC4, 0x81, 0x08, 0x1A, 
+	0x07, 0xA8, 0x48, 0x08, 0x07, 0xA8, 0x44, 0x08, 
+	0x07, 0x61, 0x87, 0xA1, 0x01, 0x17, 0x85, 0x05, 
+	0x80, 0x01, 0x40, 0x00, 0x03, 0xC8, 0x6C, 0x01, 
+	0xE0, 0xC1, 0x04, 0xFC, 0xAC, 0x10, 0x60, 0x04, 
+	0xBC, 0xC7, 0x20, 0x01, 0x3A, 0x07, 0x00, 0x70, 
+	0x04, 0x13, 0xA0, 0x06, 0x28, 0xC7, 0x20, 0x07, 
+	0x2E, 0x06, 0xA0, 0x06, 0x54, 0xBA, 0xC1, 0x10, 
+	0xE0, 0xD2, 0x03, 0x01, 0x0A, 0x16, 0x20, 0x01, 
+	0x3A, 0x07, 0x00, 0x70, 0x04, 0x13, 0xA0, 0x06, 
+	0x28, 0xC7, 0x20, 0x07, 0x2E, 0x06, 0xA0, 0x06, 
+	0x54, 0xBA, 0x90, 0x03, 0xBF, 0x4F, 0xD3, 0x2D, 
+	0x60, 0x01, 0xFC, 0x07, 0x01, 0x00, 0x02, 0x16, 
+	0xA0, 0x06, 0x6E, 0xCB, 0x60, 0xD2, 0x46, 0x08, 
+	0x89, 0x01, 0x00, 0xF1, 0xC9, 0x01, 0x00, 0x70, 
+	0x40, 0x01, 0x10, 0x00, 0x1C, 0x13, 0x20, 0x88, 
+	0x3E, 0x08, 0x3A, 0x08, 0x04, 0x16, 0x20, 0x88, 
+	0x3C, 0x08, 0x38, 0x08, 0x14, 0x13, 0x89, 0x01, 
+	0x00, 0x10, 0x8D, 0x07, 0x44, 0x08, 0x9D, 0x07, 
+	0x00, 0x50, 0xA0, 0xC2, 0xF6, 0x07, 0x8C, 0x07, 
+	0x02, 0x00, 0xA0, 0xC3, 0x3C, 0x08, 0xE0, 0xC3, 
+	0x3E, 0x08, 0x2F, 0x02, 0x04, 0x00, 0x01, 0x17, 
+	0x8E, 0x05, 0xA0, 0x06, 0x00, 0xBA, 0x8D, 0x07, 
+	0x46, 0x08, 0x49, 0xC7, 0xA0, 0xC2, 0xF6, 0x07, 
+	0x8C, 0x07, 0x04, 0x00, 0xA0, 0xC3, 0x38, 0x08, 
+	0xE0, 0xC3, 0x3A, 0x08, 0xCC, 0xA3, 0x01, 0x17, 
+	0x8E, 0x05, 0xA0, 0x06, 0x00, 0xBA, 0x20, 0xC8, 
+	0x3C, 0x08, 0xFC, 0x08, 0x20, 0xC8, 0x3E, 0x08, 
+	0xFE, 0x08, 0x09, 0x01, 0x00, 0x0C, 0x0C, 0x13, 
+	0x49, 0x01, 0x00, 0x04, 0x05, 0x16, 0xA0, 0x06, 
+	0x6C, 0xC7, 0xA0, 0x06, 0x38, 0xC7, 0x04, 0x10, 
+	0x90, 0x03, 0x7F, 0x40, 0xA0, 0x06, 0x6C, 0xC7, 
+	0xC0, 0x01, 0x90, 0x00, 0xA0, 0x06, 0xFC, 0xCA, 
+	0x0B, 0xC8, 0x46, 0x08, 0xE0, 0xC2, 0x42, 0x07, 
+	0x2D, 0x13, 0xE0, 0xC2, 0x2E, 0x06, 0x2A, 0x13, 
+	0xE0, 0x02, 0x58, 0x07, 0x8F, 0x07, 0xBF, 0xFF, 
+	0x0F, 0x2C, 0xE0, 0x02, 0x98, 0x07, 0xE0, 0xC0, 
+	0x5C, 0x07, 0x03, 0xC8, 0x4A, 0x08, 0x03, 0xC8, 
+	0x6C, 0x01, 0xC3, 0xC2, 0xCB, 0xA2, 0xEB, 0xC2, 
+	0x32, 0x0C, 0x32, 0x13, 0x0B, 0xC8, 0x00, 0xFC, 
+	0x0B, 0xC3, 0x4B, 0xC3, 0x0B, 0xC8, 0x6C, 0x01, 
+	0xE0, 0xC2, 0x00, 0xFC, 0xFA, 0x16, 0x00, 0x03, 
+	0x02, 0x00, 0x20, 0xC8, 0xF8, 0x05, 0x00, 0xFC, 
+	0x02, 0x16, 0x0D, 0xC8, 0xFA, 0x05, 0x0C, 0xC8, 
+	0xF8, 0x05, 0x00, 0x03, 0x0F, 0x00, 0x03, 0xC8, 
+	0x6C, 0x01, 0x1A, 0x10, 0xA0, 0xC3, 0x2E, 0x06, 
+	0x03, 0x13, 0xE0, 0xC0, 0xF8, 0x05, 0x0D, 0x16, 
+	0x4F, 0x2E, 0xC0, 0x01, 0x00, 0x80, 0xA0, 0x01, 
+	0x62, 0x07, 0x00, 0x80, 0x8E, 0xC3, 0x03, 0x13, 
+	0xA0, 0x01, 0x62, 0x07, 0x40, 0x00, 0x60, 0x04, 
+	0x4E, 0xC7, 0x03, 0xC8, 0x6C, 0x01, 0x20, 0xC8, 
+	0x00, 0xFC, 0xF8, 0x05, 0x03, 0xC8, 0x4A, 0x08, 
+	0x60, 0x01, 0x6A, 0x09, 0x00, 0x04, 0x02, 0x13, 
+	0x60, 0x04, 0xE4, 0xC7, 0x8C, 0x07, 0x0E, 0x00, 
+	0x20, 0xC2, 0x0E, 0xFC, 0x0A, 0x15, 0x09, 0x13, 
+	0x20, 0xC2, 0x14, 0xFC, 0x48, 0x02, 0x00, 0x1F, 
+	0xC8, 0x06, 0x88, 0x02, 0x12, 0x00, 0xF0, 0x1B, 
+	0x08, 0xA3, 0x88, 0x07, 0x02, 0xFC, 0x78, 0xC2, 
+	0xF8, 0xC1, 0x28, 0x02, 0x00, 0x04, 0x07, 0x83, 
+	0xE7, 0x1A, 0xCC, 0x61, 0x07, 0xC8, 0x04, 0xFC, 
+	0xCC, 0xC1, 0xC0, 0x01, 0x40, 0x00, 0x60, 0x04, 
+	0xF0, 0xC7, 0x4B, 0xC1, 0xA0, 0xC2, 0xF0, 0x07, 
+	0x20, 0xC3, 0x7A, 0x09, 0x8D, 0x07, 0xFA, 0x07, 
+	0x9D, 0xC3, 0xE0, 0xC3, 0xFC, 0x07, 0xA0, 0x06, 
+	0x00, 0xBA, 0x20, 0xC8, 0x3C, 0x08, 0x40, 0x08, 
+	0x20, 0xC8, 0x3E, 0x08, 0x42, 0x08, 0x0E, 0xC8, 
+	0x3C, 0x08, 0x0F, 0xC8, 0x3E, 0x08, 0xC4, 0x04, 
+	0x82, 0x07, 0x02, 0x08, 0xE0, 0x04, 0x44, 0x08, 
+	0x40, 0x01, 0x80, 0x00, 0x06, 0x16, 0x0E, 0xC8, 
+	0x38, 0x08, 0x0F, 0xC8, 0x3A, 0x08, 0xE0, 0x04, 
+	0x48, 0x08, 0xA0, 0x06, 0x54, 0xBA, 0xE0, 0xC2, 
+	0xFE, 0x07, 0x0D, 0x11, 0x0E, 0xC8, 0xFA, 0x07, 
+	0x0F, 0xC8, 0xFC, 0x07, 0x20, 0xC8, 0x40, 0x08, 
+	0x3C, 0x08, 0x20, 0xC8, 0x42, 0x08, 0x3E, 0x08, 
+	0xA0, 0x06, 0x32, 0xC7, 0xCB, 0x10, 0x80, 0x01, 
+	0x80, 0x00, 0x55, 0x04, 0x8B, 0xC0, 0xA0, 0xC2, 
+	0xF0, 0x07, 0x8C, 0x07, 0x04, 0x00, 0x8D, 0x07, 
+	0xFA, 0x07, 0xA0, 0xC3, 0x3C, 0x08, 0xE0, 0xC3, 
+	0x3E, 0x08, 0xA0, 0x06, 0x36, 0xBA, 0x60, 0x01, 
+	0xFC, 0x07, 0x01, 0x00, 0x04, 0x13, 0xA0, 0x07, 
+	0xFA, 0x08, 0x00, 0x80, 0x52, 0x04, 0x60, 0x01, 
+	0x60, 0x07, 0x04, 0x00, 0x07, 0x16, 0x20, 0xD0, 
+	0x04, 0xE0, 0x20, 0xE8, 0x1A, 0xE0, 0x58, 0x07, 
+	0x60, 0x04, 0x3E, 0xC7, 0xA0, 0x07, 0xFA, 0x08, 
+	0x00, 0x40, 0x20, 0xC8, 0x3C, 0x08, 0xFC, 0x08, 
+	0x20, 0xC8, 0x3E, 0x08, 0xFE, 0x08, 0xA0, 0x06, 
+	0x6C, 0xC7, 0xA0, 0x06, 0x38, 0xC7, 0xD3, 0x10, 
+	0xAD, 0xC2, 0x02, 0x00, 0x6D, 0xC2, 0x00, 0x00, 
+	0x05, 0x16, 0xAA, 0x07, 0x02, 0x00, 0x36, 0x07, 
+	0x9A, 0x2C, 0x80, 0x03, 0xEA, 0x2C, 0x02, 0x00, 
+	0x41, 0xCB, 0x00, 0x00, 0x80, 0x03, 0x2D, 0xC3, 
+	0x18, 0x00, 0xAC, 0x07, 0x02, 0x00, 0x36, 0x07, 
+	0x20, 0x4B, 0x06, 0xEB, 0x0A, 0x00, 0x20, 0xEB, 
+	0x00, 0xEB, 0x0A, 0x00, 0x9C, 0x2E, 0x80, 0x03, 
+	0xA0, 0xC2, 0x22, 0xE0, 0x60, 0x04, 0x8A, 0xA3, 
+	0xED, 0xC0, 0x18, 0x00, 0xA0, 0x06, 0x3A, 0xCC, 
+	0x80, 0x03, 0x44, 0xC2, 0xC3, 0xC0, 0x02, 0x13, 
+	0xA0, 0x06, 0x3A, 0xCC, 0x19, 0xC3, 0x09, 0xCB, 
+	0x18, 0x00, 0xC9, 0x05, 0x19, 0xCB, 0x16, 0x00, 
+	0x4C, 0xC2, 0x2C, 0x02, 0x1A, 0x00, 0x0D, 0xCF, 
+	0x0E, 0xCF, 0x0F, 0xC7, 0x99, 0x00, 0x5B, 0x04, 
+	0x8C, 0x07, 0x0A, 0x09, 0x9C, 0xC2, 0xA0, 0x22, 
+	0x14, 0xE0, 0x06, 0x13, 0xA0, 0xC2, 0x58, 0x07, 
+	0xA0, 0x22, 0x20, 0xE0, 0x01, 0x16, 0x80, 0x03, 
+	0x03, 0xC1, 0xC3, 0x04, 0x8A, 0x07, 0x04, 0x00, 
+	0x84, 0xA2, 0x3A, 0xCF, 0x3A, 0xCF, 0x3A, 0xCF, 
+	0x3A, 0xCF, 0x3A, 0xCF, 0xE0, 0x02, 0x58, 0x07, 
+	0x8D, 0x07, 0x0A, 0x09, 0x0B, 0xC8, 0xC2, 0x07, 
+	0xA0, 0x06, 0x44, 0xB8, 0xE0, 0xC2, 0xC2, 0x07, 
+	0x20, 0xE0, 0x20, 0xE0, 0xE0, 0x02, 0xB8, 0x07, 
+	0x5B, 0x04, 0x2D, 0xC3, 0x18, 0x00, 0x8C, 0xC2, 
+	0x60, 0xC2, 0x6C, 0x01, 0x0A, 0xC8, 0x6C, 0x01, 
+	0xE0, 0xC2, 0x00, 0xFC, 0x02, 0x13, 0x8B, 0xC2, 
+	0xF9, 0x10, 0x09, 0xC8, 0x6C, 0x01, 0x8B, 0x07, 
+	0xF8, 0x05, 0x5B, 0xC2, 0x0C, 0x13, 0xCB, 0x05, 
+	0x5B, 0xC2, 0xCA, 0xC6, 0xE0, 0xC2, 0x6C, 0x01, 
+	0x09, 0xC8, 0x6C, 0x01, 0x0C, 0xC8, 0x00, 0xFC, 
+	0x0B, 0xC8, 0x6C, 0x01, 0x02, 0x10, 0xCC, 0xCE, 
+	0xCA, 0xC6, 0xA0, 0xC2, 0xE0, 0x00, 0xA0, 0x22, 
+	0x1A, 0xE0, 0x06, 0x16, 0x20, 0xE8, 0x04, 0xE0, 
+	0x3A, 0x07, 0x20, 0x48, 0x1A, 0xE0, 0xE0, 0x00, 
+	0x80, 0x03, 0xE0, 0xD3, 0xAB, 0xE3, 0xE0, 0x04, 
+	0x8E, 0x09, 0xE0, 0xC1, 0xA8, 0x06, 0x05, 0x16, 
+	0x07, 0x02, 0xA2, 0x06, 0xA0, 0x06, 0x38, 0xB5, 
+	0x0B, 0x16, 0xE0, 0xC1, 0xBA, 0x06, 0x23, 0x16, 
+	0x07, 0x02, 0xB4, 0x06, 0xA0, 0x06, 0x38, 0xB5, 
+	0x1E, 0x13, 0x07, 0x02, 0xB8, 0x06, 0x02, 0x10, 
+	0x07, 0x02, 0xA6, 0x06, 0x60, 0xC1, 0x02, 0xFC, 
+	0x25, 0xC8, 0x0C, 0x00, 0x02, 0xFC, 0xC5, 0xC9, 
+	0x0C, 0x00, 0xF5, 0xCD, 0xF5, 0xCD, 0xF5, 0xCD, 
+	0xF5, 0xCD, 0xF5, 0xCD, 0xF5, 0xC5, 0xB7, 0x01, 
+	0x28, 0x00, 0x27, 0x02, 0xF4, 0xFF, 0xA7, 0x07, 
+	0x04, 0x00, 0x52, 0xCE, 0x20, 0xE8, 0x9E, 0x09, 
+	0x06, 0xFC, 0x97, 0x2E, 0xD2, 0x10, 0x00, 0x03, 
+	0x02, 0x00, 0xA0, 0x06, 0x50, 0xB5, 0x00, 0x03, 
+	0x0F, 0x00, 0x20, 0x2C, 0xF0, 0xED, 0xE0, 0x93, 
+	0xAB, 0xE3, 0x03, 0x16, 0x81, 0x02, 0x16, 0x00, 
+	0xC4, 0x16, 0x21, 0xC1, 0x10, 0xEB, 0x54, 0x04, 
+	0xE0, 0x93, 0x10, 0xE0, 0x03, 0x16, 0xA0, 0xD2, 
+	0xA8, 0xE3, 0x0B, 0x10, 0xCF, 0xD3, 0x09, 0x16, 
+	0xA0, 0x23, 0x08, 0xE0, 0x06, 0x16, 0x84, 0x07, 
+	0x20, 0x00, 0x04, 0xE8, 0xD2, 0x06, 0xA0, 0xD2, 
+	0x0C, 0xE0, 0x60, 0x04, 0xD2, 0xCE, 0x60, 0x04, 
+	0x70, 0xD1, 0x22, 0xC1, 0x04, 0x00, 0xE2, 0x04, 
+	0x02, 0x00, 0x54, 0x04, 0x02, 0xC8, 0x6C, 0x01, 
+	0x82, 0xA0, 0x22, 0xC8, 0x32, 0x0C, 0x00, 0xFC, 
+	0x02, 0x02, 0x00, 0xFC, 0xE0, 0x93, 0xAA, 0xE3, 
+	0x13, 0x16, 0xB0, 0x03, 0x20, 0x98, 0xAA, 0xE3, 
+	0x65, 0x06, 0x0D, 0x16, 0x8B, 0x07, 0x17, 0xFC, 
+	0xDB, 0xD2, 0x8B, 0x09, 0x8B, 0x02, 0x15, 0x00, 
+	0x7B, 0x1B, 0xEB, 0xD2, 0xC4, 0xEA, 0x06, 0x13, 
+	0x77, 0x15, 0x20, 0x07, 0xA0, 0x09, 0x74, 0x10, 
+	0xA0, 0x06, 0x02, 0xD0, 0xA0, 0x48, 0x04, 0xE0, 
+	0x0E, 0x00, 0x85, 0x02, 0x07, 0x00, 0x0E, 0x13, 
+	0x0E, 0x01, 0x03, 0x00, 0x0B, 0x13, 0xA0, 0x23, 
+	0x22, 0xE0, 0x03, 0x16, 0xA0, 0xD2, 0x0E, 0xE0, 
+	0x02, 0x10, 0xA0, 0xD2, 0xA8, 0xE3, 0x8E, 0x01, 
+	0x03, 0x00, 0x5E, 0x10, 0x05, 0xC8, 0xFC, 0x06, 
+	0xC3, 0xC0, 0x57, 0x16, 0xA0, 0x43, 0x10, 0xE0, 
+	0x22, 0x88, 0x0E, 0x00, 0x6C, 0x09, 0x0A, 0x16, 
+	0x22, 0x88, 0x10, 0x00, 0x6E, 0x09, 0x06, 0x16, 
+	0x22, 0x88, 0x12, 0x00, 0x70, 0x09, 0x02, 0x16, 
+	0xA0, 0xE3, 0x10, 0xE0, 0x85, 0x02, 0x09, 0x00, 
+	0x02, 0x13, 0xA0, 0x06, 0xB8, 0xD7, 0x45, 0xA1, 
+	0x65, 0xC1, 0xAC, 0xE3, 0x55, 0x04, 0x62, 0xC0, 
+	0x04, 0x00, 0x22, 0xC8, 0x06, 0x00, 0x6C, 0x01, 
+	0x82, 0x02, 0x48, 0x04, 0x02, 0x1B, 0xA0, 0x43, 
+	0x0C, 0xE0, 0x22, 0xC1, 0x0E, 0x00, 0x51, 0x04, 
+	0x42, 0xC0, 0xE1, 0x04, 0x02, 0x00, 0xA2, 0xC0, 
+	0x0C, 0x00, 0x22, 0xC1, 0x0A, 0x00, 0x20, 0x21, 
+	0x18, 0xE0, 0x07, 0x13, 0xA1, 0xC8, 0x0A, 0x00, 
+	0x0A, 0x00, 0xA1, 0xC8, 0x08, 0x00, 0x08, 0x00, 
+	0xE2, 0x10, 0x22, 0xC8, 0x06, 0x00, 0x6C, 0x01, 
+	0xA0, 0x06, 0x66, 0xD6, 0x60, 0x04, 0xB0, 0xCE, 
+	0x02, 0xC8, 0xD4, 0x06, 0x62, 0xC1, 0x02, 0x00, 
+	0x65, 0xC1, 0xD8, 0xE3, 0x55, 0x04, 0x0F, 0x10, 
+	0x0E, 0x10, 0x85, 0x07, 0xF4, 0x03, 0xF5, 0x04, 
+	0x60, 0xCD, 0xCE, 0xED, 0xA0, 0x06, 0xA2, 0xD8, 
+	0xA0, 0xE3, 0x0C, 0xE0, 0x20, 0xE8, 0x9E, 0x09, 
+	0x06, 0x04, 0xA0, 0x2E, 0xF4, 0x03, 0x60, 0x04, 
+	0xE4, 0xCC, 0xA0, 0x06, 0x26, 0xD5, 0x0C, 0x10, 
+	0xA0, 0x06, 0x66, 0xD6, 0x09, 0x10, 0xA0, 0x06, 
+	0x2A, 0xD8, 0x06, 0x10, 0xA0, 0x06, 0x66, 0xD6, 
+	0x03, 0xC8, 0x2A, 0x09, 0xA0, 0xD2, 0xAA, 0xE3, 
+	0xA0, 0x06, 0x6E, 0xCF, 0xA0, 0x92, 0x26, 0xE0, 
+	0x0C, 0x16, 0xE0, 0xD3, 0x26, 0xE0, 0xE0, 0x23, 
+	0x14, 0xE0, 0x0A, 0x13, 0x0A, 0xC1, 0xC4, 0x83, 
+	0x07, 0x13, 0xC4, 0xC3, 0x24, 0xC1, 0xDC, 0xE3, 
+	0x54, 0x04, 0xCA, 0x93, 0xDC, 0x13, 0xCA, 0xD3, 
+	0xB0, 0x03, 0x0F, 0xD8, 0x59, 0x06, 0x04, 0x71, 
+	0x24, 0xC1, 0xEC, 0xE3, 0x54, 0x04, 0xA0, 0x23, 
+	0x0C, 0xE0, 0xD1, 0x13, 0x4D, 0xC3, 0xCF, 0x13, 
+	0x4D, 0x01, 0x00, 0x04, 0x0B, 0x13, 0x86, 0x07, 
+	0x02, 0x00, 0x84, 0x07, 0x26, 0x00, 0x46, 0x23, 
+	0x03, 0x13, 0x44, 0x06, 0x86, 0xA1, 0xFB, 0x10, 
+	0x46, 0x43, 0xB3, 0x10, 0x84, 0x07, 0x18, 0x00, 
+	0x8D, 0x01, 0x00, 0x04, 0x85, 0x07, 0xF4, 0x03, 
+	0xF5, 0x04, 0x60, 0xCD, 0xCE, 0xED, 0xA0, 0x06, 
+	0xA2, 0xD8, 0x20, 0xE8, 0x9C, 0x09, 0xFE, 0x03, 
+	0x20, 0xE8, 0x9E, 0x09, 0x06, 0x04, 0xA8, 0x10, 
+	0x85, 0x07, 0x1C, 0x07, 0x86, 0x07, 0x1A, 0x04, 
+	0x76, 0x6D, 0x76, 0x6D, 0x76, 0x6D, 0xC6, 0x05, 
+	0x76, 0x6D, 0x76, 0x6D, 0x76, 0x6D, 0x83, 0x07, 
+	0x00, 0x90, 0xA9, 0x10, 0x0B, 0xC3, 0x86, 0x07, 
+	0x00, 0x01, 0x85, 0x07, 0x00, 0x80, 0x20, 0xC1, 
+	0xD2, 0x06, 0x37, 0x13, 0xC4, 0x04, 0x60, 0xC0, 
+	0xD2, 0x06, 0x45, 0x20, 0x04, 0x13, 0x84, 0x05, 
+	0x15, 0x09, 0xF9, 0x16, 0x2E, 0x10, 0xCF, 0xD3, 
+	0x06, 0x16, 0xE0, 0x23, 0x14, 0xE0, 0x03, 0x16, 
+	0x0E, 0x01, 0x03, 0x00, 0x03, 0x13, 0xE0, 0x04, 
+	0xD2, 0x06, 0x23, 0x10, 0x64, 0xD0, 0x1C, 0x07, 
+	0x46, 0xB0, 0x10, 0x18, 0x01, 0xD9, 0x1C, 0x07, 
+	0x60, 0x23, 0x20, 0xE0, 0x0B, 0x13, 0x81, 0x07, 
+	0x18, 0x00, 0x61, 0xC0, 0xFC, 0xE3, 0x11, 0x88, 
+	0xCE, 0xED, 0x04, 0x13, 0x08, 0x02, 0x18, 0x80, 
+	0xA0, 0x06, 0xDA, 0xD4, 0x64, 0xD0, 0x28, 0x07, 
+	0x46, 0xB0, 0x08, 0x18, 0x01, 0xD9, 0x28, 0x07, 
+	0x46, 0xB0, 0x04, 0x17, 0x83, 0x07, 0x40, 0x80, 
+	0xA0, 0x06, 0x2A, 0xD8, 0x05, 0x48, 0xD2, 0x06, 
+	0xCA, 0x16, 0x20, 0xC1, 0x32, 0x09, 0x01, 0x16, 
+	0x5C, 0x04, 0x04, 0x02, 0x07, 0x00, 0x20, 0x06, 
+	0x32, 0x09, 0x05, 0x02, 0x00, 0x01, 0xC7, 0x10, 
+	0x0B, 0xC3, 0xC5, 0x04, 0x42, 0xC0, 0xC7, 0x04, 
+	0x20, 0xC2, 0x6C, 0x01, 0xE1, 0xA1, 0x04, 0x00, 
+	0x11, 0xC8, 0x6C, 0x01, 0xFB, 0x16, 0x08, 0xC8, 
+	0x6C, 0x01, 0xC8, 0x04, 0xA0, 0x43, 0x1A, 0xE0, 
+	0x22, 0xC1, 0x0E, 0x00, 0x0D, 0x15, 0x0C, 0x13, 
+	0xA0, 0xE3, 0x1A, 0xE0, 0xA0, 0x06, 0x14, 0xD8, 
+	0x08, 0xC2, 0x48, 0x13, 0x88, 0x02, 0x12, 0x00, 
+	0x45, 0x1B, 0x20, 0x22, 0x22, 0xE0, 0x42, 0x13, 
+	0x02, 0xC1, 0x08, 0xA1, 0x08, 0x05, 0x28, 0x02, 
+	0xF2, 0xFF, 0x07, 0xA2, 0x83, 0x07, 0x01, 0x80, 
+	0x88, 0x02, 0x04, 0x00, 0x6E, 0x11, 0x64, 0xC2, 
+	0x16, 0x00, 0x49, 0xD2, 0x02, 0x16, 0x02, 0x81, 
+	0x31, 0x16, 0x09, 0x01, 0x00, 0xF0, 0x28, 0x16, 
+	0x49, 0xC1, 0x45, 0x71, 0xC3, 0x04, 0x85, 0x02, 
+	0x09, 0x00, 0x7C, 0x13, 0x83, 0x07, 0x02, 0x80, 
+	0xA4, 0xC1, 0x14, 0x00, 0x88, 0x81, 0x76, 0x16, 
+	0x83, 0x05, 0x85, 0x02, 0x15, 0x00, 0x13, 0x1B, 
+	0x83, 0x05, 0x49, 0x99, 0x30, 0xEB, 0x0A, 0x13, 
+	0x09, 0x98, 0x0E, 0xE0, 0x6B, 0x16, 0x25, 0x98, 
+	0x30, 0xEB, 0x0C, 0xE0, 0x67, 0x16, 0xE0, 0xC1, 
+	0xEC, 0x06, 0x64, 0x16, 0xC3, 0x04, 0x52, 0xC2, 
+	0x0F, 0x13, 0x83, 0x07, 0x09, 0x80, 0xE0, 0xC1, 
+	0x6A, 0x09, 0x47, 0x01, 0x00, 0x10, 0x5A, 0x16, 
+	0xA0, 0xC0, 0x6C, 0x01, 0xA0, 0x06, 0xBE, 0xD6, 
+	0x60, 0x04, 0xB0, 0xCE, 0x60, 0x04, 0xBA, 0xCE, 
+	0x89, 0x07, 0x0E, 0x07, 0xC7, 0x04, 0xE5, 0xD1, 
+	0x46, 0xEB, 0x05, 0x13, 0xC7, 0x06, 0x27, 0x02, 
+	0x5C, 0xEB, 0x77, 0xCE, 0xFE, 0x15, 0x44, 0xC0, 
+	0x21, 0x02, 0x18, 0x00, 0x28, 0x02, 0xFC, 0xFF, 
+	0x36, 0x13, 0x91, 0xC1, 0x86, 0xD1, 0x1F, 0x13, 
+	0xC6, 0x06, 0x87, 0x07, 0x0E, 0x07, 0xF7, 0xC0, 
+	0x46, 0x02, 0xFF, 0xBF, 0x43, 0x02, 0xFF, 0x3F, 
+	0xA0, 0x91, 0xF5, 0xED, 0x09, 0x16, 0xB0, 0x03, 
+	0x20, 0x98, 0x0E, 0xE0, 0x5D, 0x06, 0x0F, 0x16, 
+	0x21, 0xC8, 0x02, 0x00, 0x0C, 0x07, 0x17, 0x10, 
+	0x47, 0x82, 0x0C, 0x1B, 0xC6, 0x90, 0xEB, 0x16, 
+	0x47, 0x06, 0xF7, 0x04, 0xB0, 0x03, 0x20, 0x98, 
+	0x5D, 0x06, 0x57, 0x06, 0x0C, 0x13, 0x83, 0x07, 
+	0x05, 0x80, 0x1C, 0x10, 0xD1, 0xC0, 0xE0, 0x20, 
+	0x16, 0xE0, 0x03, 0x16, 0x83, 0x07, 0x08, 0x80, 
+	0x15, 0x10, 0x60, 0x44, 0x26, 0xE0, 0x86, 0x71, 
+	0x46, 0xA0, 0x06, 0x62, 0x83, 0x07, 0x05, 0x80, 
+	0x08, 0xC2, 0xCB, 0x15, 0x0B, 0x16, 0xC3, 0x04, 
+	0x87, 0x07, 0x0E, 0x07, 0x77, 0xC0, 0x47, 0x82, 
+	0x05, 0x1B, 0x60, 0x20, 0x06, 0xE0, 0xFA, 0x16, 
+	0x83, 0x07, 0x07, 0x80, 0x5C, 0x04, 0xA0, 0x92, 
+	0x0E, 0xE0, 0x11, 0x16, 0x20, 0xC8, 0x20, 0xE0, 
+	0x08, 0x07, 0xE0, 0x04, 0x84, 0x01, 0x60, 0x05, 
+	0x02, 0x07, 0x4B, 0x13, 0x20, 0x48, 0x06, 0xE0, 
+	0x82, 0x01, 0xA0, 0x06, 0xD0, 0xD4, 0x83, 0x07, 
+	0x00, 0xC0, 0xA0, 0x06, 0x2A, 0xD8, 0x20, 0xC8, 
+	0x1E, 0xE0, 0x02, 0x07, 0xA0, 0xE3, 0x04, 0xE0, 
+	0x08, 0x02, 0x24, 0x80, 0xA0, 0x06, 0xDA, 0xD4, 
+	0x42, 0x10, 0x20, 0xC1, 0x84, 0x01, 0x44, 0x02, 
+	0x00, 0x88, 0x2A, 0x13, 0x04, 0x48, 0x84, 0x01, 
+	0x20, 0x06, 0x02, 0x07, 0xF1, 0x16, 0x60, 0x01, 
+	0x8E, 0x09, 0x00, 0x80, 0x15, 0x13, 0xA0, 0x23, 
+	0x22, 0xE0, 0x05, 0x16, 0xA0, 0x43, 0x22, 0xE0, 
+	0xA0, 0xD2, 0x0E, 0xE0, 0xCF, 0x10, 0xE0, 0x23, 
+	0x14, 0xE0, 0x04, 0x13, 0x20, 0x98, 0xA9, 0xE3, 
+	0x65, 0x06, 0x0C, 0x16, 0xA0, 0x92, 0x0E, 0xE0, 
+	0xC5, 0x13, 0xA0, 0xD2, 0xA8, 0xE3, 0xD3, 0x10, 
+	0x20, 0xC8, 0x20, 0xE0, 0x08, 0x07, 0x83, 0x07, 
+	0x00, 0xC0, 0x04, 0x10, 0x83, 0x07, 0x02, 0x00, 
+	0x60, 0x04, 0xCA, 0xCE, 0x60, 0x04, 0xC0, 0xCE, 
+	0x20, 0xE8, 0x06, 0xE0, 0x82, 0x01, 0xA0, 0x06, 
+	0xD0, 0xD4, 0x20, 0x07, 0x02, 0x07, 0xA0, 0x43, 
+	0x04, 0xE0, 0x20, 0xC8, 0xAE, 0xE4, 0x86, 0x01, 
+	0x20, 0x88, 0x20, 0xE0, 0x08, 0x07, 0x03, 0x16, 
+	0x20, 0xC8, 0x78, 0xEB, 0x08, 0x07, 0x60, 0x04, 
+	0xD2, 0xCE, 0x0E, 0x01, 0x03, 0x00, 0x16, 0x13, 
+	0xCF, 0xD3, 0x08, 0x16, 0xA0, 0x23, 0x20, 0xE0, 
+	0x03, 0x16, 0xA0, 0xD2, 0xA8, 0xE3, 0x02, 0x10, 
+	0xA0, 0xD2, 0x0E, 0xE0, 0x8E, 0x01, 0x03, 0x00, 
+	0x09, 0x10, 0x60, 0xC1, 0x84, 0x01, 0x60, 0x21, 
+	0x0A, 0xE0, 0x04, 0x16, 0x83, 0x07, 0x00, 0x84, 
+	0x60, 0x04, 0xCA, 0xCE, 0x20, 0xC8, 0x2E, 0xE0, 
+	0x84, 0x01, 0x08, 0x02, 0x06, 0x80, 0xA0, 0x06, 
+	0xDA, 0xD4, 0x60, 0x04, 0xD2, 0xCE, 0x60, 0xE3, 
+	0x20, 0xE0, 0x60, 0x04, 0xD2, 0xCE, 0xE0, 0x93, 
+	0x26, 0xE0, 0x10, 0x16, 0xA0, 0x23, 0x08, 0xE0, 
+	0x0D, 0x16, 0xA0, 0x23, 0x06, 0xE0, 0x02, 0x13, 
+	0x60, 0xE3, 0x1C, 0xE0, 0x60, 0xE3, 0x18, 0xE0, 
+	0xA0, 0x43, 0x06, 0xE0, 0x08, 0x02, 0x3C, 0x80, 
+	0xA0, 0x06, 0xDA, 0xD4, 0x60, 0x04, 0xD2, 0xCE, 
+	0xA0, 0x92, 0xA8, 0xE3, 0x03, 0x13, 0xA0, 0x92, 
+	0xA9, 0xE3, 0x1E, 0x16, 0xE0, 0x23, 0x14, 0xE0, 
+	0x08, 0x13, 0x20, 0x98, 0xA9, 0xE3, 0x65, 0x06, 
+	0x04, 0x13, 0x83, 0x07, 0x07, 0x00, 0x60, 0x04, 
+	0xCA, 0xCE, 0xA0, 0xD2, 0x0E, 0xE0, 0x20, 0xC8, 
+	0x20, 0xE0, 0x08, 0x07, 0xA0, 0x27, 0x04, 0xE0, 
+	0x0B, 0x16, 0x20, 0xC8, 0x1E, 0xE0, 0x08, 0x07, 
+	0xE0, 0x93, 0xA8, 0xE3, 0x05, 0x16, 0xA0, 0x23, 
+	0x12, 0xE0, 0x02, 0x13, 0x20, 0x06, 0x08, 0x07, 
+	0x60, 0x04, 0xD2, 0xCE, 0xE0, 0x23, 0x14, 0xE0, 
+	0x3E, 0x13, 0xB0, 0x03, 0x20, 0x98, 0x0E, 0xE0, 
+	0x6F, 0x06, 0x0F, 0x16, 0xCF, 0xD3, 0x37, 0x16, 
+	0xA0, 0xD2, 0xA8, 0xE3, 0x60, 0x04, 0xD2, 0xCE, 
+	0xA0, 0x92, 0x0C, 0xE0, 0x30, 0x16, 0xE0, 0x23, 
+	0x14, 0xE0, 0xF6, 0x13, 0x83, 0x07, 0x06, 0x00, 
+	0x07, 0x10, 0x83, 0x07, 0x05, 0x00, 0xE0, 0x93, 
+	0x0E, 0xE0, 0x02, 0x16, 0x83, 0x07, 0x07, 0x00, 
+	0x60, 0x04, 0xCA, 0xCE, 0x60, 0xE3, 0x12, 0xE0, 
+	0xE0, 0x23, 0x14, 0xE0, 0x11, 0x13, 0x20, 0x98, 
+	0x0C, 0xE0, 0x65, 0x06, 0x03, 0x16, 0x20, 0xD8, 
+	0xA9, 0xE3, 0x65, 0x06, 0x14, 0x10, 0x60, 0x01, 
+	0x8E, 0x09, 0x00, 0x80, 0x10, 0x13, 0x20, 0xC1, 
+	0x84, 0x01, 0x20, 0x21, 0x06, 0xE0, 0xD2, 0x16, 
+	0x60, 0x01, 0x8E, 0x09, 0x00, 0x80, 0x07, 0x13, 
+	0x20, 0x48, 0x06, 0xE0, 0x84, 0x01, 0x08, 0x02, 
+	0x30, 0x80, 0xA0, 0x06, 0xDA, 0xD4, 0x60, 0x04, 
+	0xD2, 0xCE, 0x60, 0x01, 0x8E, 0x09, 0x00, 0x20, 
+	0xFA, 0x16, 0x08, 0x02, 0x78, 0x80, 0xA0, 0x06, 
+	0xDA, 0xD4, 0x20, 0xC2, 0xA2, 0x09, 0x03, 0x13, 
+	0x20, 0x06, 0xA2, 0x09, 0x21, 0x13, 0x20, 0xC2, 
+	0xA4, 0x09, 0xED, 0x13, 0x20, 0x06, 0xA4, 0x09, 
+	0xEA, 0x16, 0xA0, 0x07, 0xA4, 0x09, 0x05, 0x00, 
+	0xCD, 0x01, 0x00, 0x04, 0xE4, 0x10, 0x60, 0x01, 
+	0x8E, 0x09, 0x80, 0x00, 0x3E, 0x13, 0x60, 0x01, 
+	0x8E, 0x09, 0x00, 0x10, 0x02, 0x16, 0xA0, 0x06, 
+	0xE6, 0xD5, 0xA0, 0x01, 0x8E, 0x09, 0x00, 0x10, 
+	0xE0, 0x01, 0x8E, 0x09, 0x80, 0x00, 0x83, 0x07, 
+	0x00, 0xA8, 0xA0, 0x06, 0x2A, 0xD8, 0x16, 0x10, 
+	0x60, 0x01, 0x8E, 0x09, 0x00, 0x04, 0x21, 0x13, 
+	0xE0, 0x01, 0x8E, 0x09, 0x00, 0x10, 0xA0, 0x07, 
+	0x08, 0x07, 0x05, 0x00, 0x83, 0x07, 0x08, 0xA8, 
+	0xA0, 0x23, 0x04, 0xE0, 0x05, 0x16, 0x20, 0xC8,  
+	0x20, 0xE0, 0x08, 0x07, 0x83, 0x07, 0x08, 0xE8,  
+	0xA0, 0x06, 0x2A, 0xD8, 0xA0, 0x01, 0x8E, 0x09, 
+	0x00, 0x20, 0xE0, 0x01, 0x8E, 0x09, 0x00, 0x01, 
+	0xE0, 0x01, 0x82, 0x01, 0x00, 0x08, 0xA0, 0xD2, 
+	0x0E, 0xE0, 0x83, 0x07, 0x10, 0x80, 0x60, 0x04, 
+	0xC0, 0xCE, 0x08, 0x02, 0x78, 0x00, 0xA0, 0x06, 
+	0xDA, 0xD4, 0x83, 0x07, 0x00, 0x82, 0x60, 0x04, 
+	0xCA, 0xCE, 0x60, 0x04, 0xD2, 0xCE, 0x20, 0x06, 
+	0x90, 0x09, 0x07, 0x15, 0xA0, 0xD2, 0x10, 0xE0, 
+	0xCA, 0x06, 0xA0, 0xD2, 0x26, 0xE0, 0xCF, 0x04, 
+	0xF4, 0x10, 0x08, 0x02, 0x7E, 0x80, 0xA0, 0x06, 
+	0xDA, 0xD4, 0x20, 0xC2, 0x90, 0x09, 0x88, 0x02,  
+	0x96, 0x00, 0x0D, 0x1B, 0xEA, 0x16, 0x20, 0x48,  
+	0x08, 0xE0, 0x82, 0x01, 0xA0, 0x01, 0x8E, 0x09, 
+	0x00, 0x10, 0xA0, 0x06, 0xE6, 0xD5, 0x83, 0x07, 
+	0x00, 0x28, 0x60, 0x04, 0xC0, 0xCE, 0x60, 0x01, 
+	0x8E, 0x09, 0x00, 0x10, 0xDA, 0x16, 0x84, 0x07, 
+	0x04, 0x00, 0x85, 0x07, 0xF4, 0x03, 0xF5, 0x04, 
+	0xB5, 0x07, 0x30, 0x06, 0xA0, 0x06, 0xA2, 0xD8, 
+	0xA0, 0x07, 0xF8, 0x03, 0x34, 0xD4, 0x60, 0x04, 
+	0xC0, 0xDB, 0xA0, 0x07, 0x90, 0x09, 0xF4, 0x01, 
+	0x08, 0x02, 0x7E, 0x80, 0xA0, 0x06, 0xDA, 0xD4, 
+	0x08, 0x02, 0x36, 0x00, 0xA0, 0x06, 0xDA, 0xD4, 
+	0x20, 0xE8, 0x0C, 0xE0, 0x82, 0x01, 0xA0, 0x23, 
+	0x18, 0xE0, 0x06, 0x13, 0xA0, 0xE3, 0x18, 0xE0, 
+	0xE0, 0x2E, 0x00, 0x00, 0x41, 0xC0, 0xFA, 0x16, 
+	0xA0, 0x06, 0xE6, 0xD5, 0xB2, 0x10, 0x04, 0x02, 
+	0x64, 0x00, 0x04, 0x06, 0xFE, 0x16, 0x5B, 0x04, 
+	0xA0, 0xE3, 0x0A, 0xE0, 0x08, 0xC2, 0x02, 0x11, 
+	0xA0, 0x43, 0x0A, 0xE0, 0x20, 0x42, 0x04, 0xE0, 
+	0x28, 0x02, 0xFC, 0xE3, 0x58, 0xC0, 0x02, 0xC0, 
+	0x11, 0x88, 0xCE, 0xED, 0x03, 0x16, 0xD1, 0x2C, 
+	0x58, 0xC0, 0xD1, 0x04, 0x80, 0xC0, 0x0E, 0x01, 
+	0x00, 0x10, 0x0F, 0x13, 0x60, 0xCC, 0xCE, 0xED, 
+	0xC8, 0x05, 0x78, 0xCC, 0x03, 0x16, 0x41, 0x06, 
+	0x60, 0xCC, 0xD6, 0x06, 0x58, 0xC4, 0x02, 0x16, 
+	0x60, 0xC4, 0x00, 0x07, 0x21, 0x02, 0xFA, 0xFF, 
+	0x91, 0x2C, 0x5B, 0x04, 0x0B, 0xC3, 0xA0, 0x06, 
+	0xC2, 0xD5, 0xA0, 0x06, 0x9C, 0xD5, 0x08, 0xC2, 
+	0x05, 0x16, 0x62, 0xC2, 0x02, 0x00, 0x60, 0x26, 
+	0xA8, 0xE4, 0x0D, 0x16, 0x42, 0xC2, 0xC9, 0x05, 
+	0x60, 0xCE, 0xF2, 0xED, 0x60, 0xC6, 0x7C, 0xEB, 
+	0xA0, 0x06, 0x10, 0xD6, 0x18, 0xCA, 0x0A, 0x00, 
+	0x20, 0x46, 0x26, 0xE0, 0x04, 0x16, 0xA0, 0xC0, 
+	0x6C, 0x01, 0x12, 0x2E, 0x1D, 0x10, 0x12, 0xC1, 
+	0x05, 0x13, 0x60, 0xC1, 0x6C, 0x01, 0x14, 0x2E, 
+	0x05, 0xC8, 0x6C, 0x01, 0xD2, 0x04, 0x48, 0x06, 
+	0x84, 0x07, 0x02, 0x00, 0x48, 0xC1, 0xA0, 0xC0, 
+	0x6C, 0x01, 0x02, 0xC0, 0xA0, 0x06, 0xA2, 0xD8, 
+	0x60, 0xC5, 0x02, 0xFC, 0x07, 0x02, 0xA2, 0x06, 
+	0x25, 0x02, 0xF4, 0xFF, 0x05, 0xC8, 0x02, 0xFC, 
+	0x20, 0xC2, 0x6C, 0x01, 0xA0, 0x06, 0xFC, 0xB4, 
+	0x5C, 0x04, 0x42, 0xC2, 0x29, 0x02, 0x08, 0x00, 
+	0x39, 0xC2, 0x48, 0x02, 0x00, 0xC0, 0x88, 0x02, 
+	0x00, 0xC0, 0x08, 0x16, 0x60, 0x8E, 0x2E, 0xE0, 
+	0x05, 0x16, 0x60, 0x86, 0x2E, 0xE0, 0x02, 0x16, 
+	0xC8, 0x04, 0x5B, 0x04, 0x08, 0x07, 0x5B, 0x04, 
+	0x20, 0x88, 0x8E, 0xE1, 0x6C, 0x01, 0x02, 0x16,  
+	0x60, 0x04, 0xBA, 0xCE, 0x5B, 0x04, 0x88, 0x07,  
+	0xAE, 0x01, 0x20, 0xE8, 0x0E, 0xE0, 0x80, 0x01, 
+	0x08, 0x06, 0xFE, 0x16, 0x20, 0x48, 0x0E, 0xE0, 
+	0x80, 0x01, 0x5B, 0x04, 0xC2, 0x04, 0xA0, 0x23, 
+	0x0C, 0xE0, 0x10, 0x16, 0x20, 0x2F, 0x30, 0x06, 
+	0x82, 0x07, 0xDF, 0xFF, 0x02, 0x2C, 0x82, 0x02, 
+	0xF4, 0x03, 0x06, 0x13, 0xE2, 0x04, 0x02, 0x00, 
+	0xA2, 0xC0, 0x06, 0x00, 0x12, 0x2E, 0xF4, 0x10, 
+	0xA0, 0x43, 0x0C, 0xE0, 0x5B, 0x04, 0x42, 0xC2, 
+	0x88, 0x07, 0x0E, 0x00, 0x09, 0xA2, 0x29, 0x02, 
+	0x08, 0x00, 0x78, 0xCE, 0x78, 0xCE, 0x78, 0xCE, 
+	0x60, 0xCE, 0x6C, 0x09, 0x60, 0xCE, 0x6E, 0x09, 
+	0x60, 0xCE, 0x70, 0x09, 0xA0, 0x23, 0x1A, 0xE0, 
+	0x0F, 0x16, 0x58, 0xC2, 0x49, 0x02, 0x80, 0x1F, 
+	0x60, 0x2A, 0x14, 0xE0, 0xA0, 0xE8, 0x04, 0xE0, 
+	0x0E, 0x00, 0x09, 0xC6, 0x49, 0x02, 0x00, 0x1F, 
+	0xC9, 0x06, 0x09, 0xA2, 0x89, 0xA8, 0x04, 0x00, 
+	0x28, 0x02, 0x02, 0x00, 0x58, 0xC2, 0x49, 0x0A, 
+	0x49, 0x02, 0x00, 0xF0, 0x09, 0xD6, 0xE2, 0x04, 
+	0x06, 0x00, 0x5B, 0x04, 0x00, 0x07, 0x82, 0xC0, 
+	0x53, 0x13, 0xA0, 0xC0, 0x6C, 0x01, 0xA0, 0xC1, 
+	0x06, 0xFC, 0x46, 0x02, 0x0F, 0x00, 0x86, 0x02, 
+	0x01, 0x00, 0x3D, 0x12, 0x06, 0x88, 0xF2, 0x06, 
+	0x12, 0x16, 0x01, 0x02, 0x0E, 0xFC, 0x31, 0x88, 
+	0xF4, 0x06, 0x0D, 0x16, 0x31, 0x88, 0xF6, 0x06, 
+	0x0A, 0x16, 0x31, 0x88, 0xF8, 0x06, 0x07, 0x16, 
+	0x86, 0x02, 0x02, 0x00, 0x2C, 0x16, 0x20, 0x88, 
+	0x0A, 0x07, 0xFA, 0x06, 0x28, 0x13, 0x20, 0xC1, 
+	0x6A, 0x09, 0x44, 0x01, 0x00, 0x08, 0x06, 0x13, 
+	0x86, 0x02, 0x02, 0x00, 0x20, 0x16, 0x44, 0x01, 
+	0x80, 0x00, 0x1D, 0x16, 0x00, 0x07, 0xE0, 0x23, 
+	0x14, 0xE0, 0x19, 0x16, 0x82, 0x02, 0x43, 0x00, 
+	0x16, 0x13, 0x00, 0x02, 0x02, 0xFC, 0x40, 0xC0, 
+	0xB0, 0x01, 0x20, 0x00, 0x60, 0x01, 0x6A, 0x09, 
+	0x01, 0x00, 0x07, 0x16, 0x60, 0xA0, 0x2C, 0x09, 
+	0x60, 0xCC, 0xEE, 0x05, 0x50, 0xC4, 0x20, 0xC4, 
+	0x2C, 0x09, 0x80, 0x07, 0x36, 0x07, 0x81, 0x07, 
+	0x40, 0x00, 0x40, 0x2C, 0xC0, 0x04, 0x84, 0x07, 
+	0xF2, 0x06, 0x06, 0xCD, 0x01, 0x02, 0x0E, 0xFC, 
+	0x31, 0xCD, 0x31, 0xCD, 0x31, 0xCD, 0x20, 0xC5, 
+	0x0A, 0x07, 0x00, 0xC0, 0x01, 0x13, 0x12, 0x2E, 
+	0xE0, 0x04, 0x6C, 0x01, 0x5B, 0x04, 0x60, 0x01, 
+	0x8A, 0x09, 0x00, 0x80, 0x12, 0x13, 0x0B, 0xC8, 
+	0x22, 0x09, 0xA0, 0x06, 0x3E, 0xD7, 0x08, 0x02, 
+	0x42, 0x80, 0xA0, 0x06, 0xDA, 0xD4, 0x08, 0x02, 
+	0x30, 0x80, 0xA0, 0x06, 0xDA, 0xD4, 0xE0, 0xC2, 
+	0x22, 0x09, 0x5B, 0x04, 0x20, 0x48, 0xAC, 0xE4, 
+	0x80, 0x01, 0x20, 0x48, 0x7E, 0xEB, 0x82, 0x01, 
+	0x20, 0x48, 0x22, 0xE0, 0xAE, 0x01, 0x20, 0x48, 
+	0x22, 0xE0, 0x78, 0x09, 0x60, 0x43, 0x18, 0xE0, 
+	0xA0, 0x43, 0x08, 0xE0, 0x60, 0x01, 0x8A, 0x09, 
+	0x00, 0x80, 0xEB, 0x13, 0x0B, 0xC3, 0x08, 0x02, 
+	0x42, 0x00, 0xA0, 0x06, 0xDA, 0xD4, 0x5C, 0x04, 
+	0x0B, 0xC3, 0x20, 0xE8, 0x0E, 0xE0, 0x82, 0x01, 
+	0x20, 0xE8, 0x22, 0xE0, 0xAE, 0x01, 0x20, 0xE8, 
+	0x22, 0xE0, 0x78, 0x09, 0xA0, 0xE3, 0x08, 0xE0, 
+	0x60, 0xE3, 0x18, 0xE0, 0xA0, 0x43, 0x06, 0xE0, 
+	0x08, 0x02, 0x3C, 0x80, 0xA0, 0x06, 0xDA, 0xD4, 
+	0x08, 0x02, 0x42, 0x80, 0xA0, 0x06, 0xDA, 0xD4, 
+	0x5C, 0x04, 0x0B, 0xC3, 0x83, 0x07, 0x00, 0x68, 
+	0xA0, 0x06, 0x2A, 0xD8, 0x83, 0x07, 0x10, 0x80, 
+	0xA0, 0x06, 0x2A, 0xD8, 0x5C, 0x04, 0x0B, 0xC3, 
+	0xA0, 0x06, 0x14, 0xD8, 0x02, 0xA2, 0x68, 0xC2, 
+	0x14, 0x00, 0x29, 0x02, 0xFC, 0xFF, 0x24, 0x13, 
+	0x28, 0x02, 0x18, 0x00, 0x87, 0x07, 0x0E, 0x00, 
+	0x81, 0x07, 0x0E, 0x07, 0xF1, 0x04, 0x47, 0x06, 
+	0xFD, 0x15, 0x58, 0xC0, 0xB0, 0x03, 0x01, 0x78, 
+	0x63, 0x06, 0x41, 0x02, 0x3F, 0x00, 0x0E, 0x13, 
+	0x81, 0x02, 0x1F, 0x00, 0x0B, 0x1B, 0x41, 0xA0, 
+	0x61, 0xC0, 0x86, 0xE4, 0xF8, 0xC1, 0xC7, 0x06, 
+	0xC7, 0x71, 0x47, 0x06, 0x78, 0xCC, 0x47, 0x06, 
+	0xFD, 0x15, 0x04, 0x10, 0x58, 0xC0, 0xC1, 0x06, 
+	0x41, 0x70, 0x01, 0xA2, 0x49, 0xC2, 0xE5, 0x15, 
+	0x5C, 0x04, 0xA0, 0x23, 0x1A, 0xE0, 0x02, 0x13, 
+	0xC8, 0x04, 0x5B, 0x04, 0x22, 0xC2, 0x14, 0x00, 
+	0x48, 0x02, 0x00, 0x1F, 0xC8, 0x06, 0x5B, 0x04, 
+	0x83, 0x02, 0x0F, 0x00, 0x17, 0x1B, 0xA0, 0xC1, 
+	0xD4, 0x06, 0x35, 0x13, 0x26, 0x02, 0x04, 0x00, 
+	0xA0, 0xCD, 0xCE, 0xED, 0x83, 0xC5, 0x04, 0x13, 
+	0x4A, 0xC2, 0x39, 0x0A, 0xC9, 0xE0, 0x83, 0xC5, 
+	0x86, 0x07, 0x36, 0x07, 0x87, 0x07, 0x10, 0x00, 
+	0x20, 0xC2, 0xD4, 0x06, 0xE0, 0x04, 0xD4, 0x06, 
+	0x46, 0x2C, 0x5B, 0x04, 0x60, 0xC0, 0xFE, 0x06, 
+	0x20, 0xC2, 0x6A, 0x09, 0x48, 0x02, 0x00, 0x60, 
+	0x20, 0x22, 0x06, 0xE0, 0x04, 0x16, 0x20, 0xE2, 
+	0x0A, 0xE0, 0x20, 0xE2, 0x18, 0xE0, 0x13, 0x0A, 
+	0x04, 0x18, 0x41, 0x05, 0x03, 0x48, 0xFE, 0x06, 
+	0x06, 0x10, 0x83, 0x02, 0x02, 0x00, 0x01, 0x16, 
+	0x13, 0x09, 0x03, 0xE8, 0xFE, 0x06, 0xC8, 0x40, 
+	0xC1, 0x40, 0x05, 0x13, 0x88, 0x07, 0x36, 0x07, 
+	0x89, 0x07, 0x00, 0x40, 0x48, 0x2C, 0x5B, 0x04, 
+	0xC9, 0x04, 0x24, 0xC1, 0x94, 0xEB, 0x84, 0xC1, 
+	0x86, 0x71, 0x86, 0xA1, 0x26, 0x02, 0x56, 0xEC, 
+	0xC4, 0x06, 0x04, 0x71, 0x24, 0x02, 0xC2, 0xEB, 
+	0x14, 0xD2, 0xC8, 0x09, 0x08, 0xA2, 0xB0, 0x03, 
+	0x34, 0xD8, 0x5F, 0x06, 0x47, 0x02, 0x0F, 0x00, 
+	0xC7, 0xA1, 0x28, 0xC2, 0x82, 0xEB, 0x58, 0x04, 
+	0x76, 0xCD, 0x47, 0x06, 0xFD, 0x16, 0x32, 0x10, 
+	0x36, 0xC2, 0x26, 0x10, 0x17, 0x09, 0x47, 0xA1, 
+	0x2D, 0x10, 0x17, 0x09, 0x47, 0x61, 0x2A, 0x10, 
+	0xA0, 0x43, 0x16, 0xE0, 0x5B, 0x04, 0xA0, 0x43, 
+	0x16, 0xE0, 0x49, 0xC2, 0x03, 0x16, 0x44, 0xC2, 
+	0x06, 0xC8, 0x22, 0x09, 0x27, 0xC1, 0x8E, 0xED, 
+	0x84, 0xC1, 0x86, 0x71, 0x26, 0x02, 0xC4, 0xED, 
+	0xC4, 0x06, 0x04, 0x71, 0x24, 0x02, 0xAA, 0xED, 
+	0xD3, 0x10, 0x09, 0xC1, 0xA0, 0xC1, 0x22, 0x09, 
+	0xC9, 0x04, 0x10, 0x10, 0x36, 0xC2, 0x78, 0xD5,  
+	0x60, 0x41, 0x22, 0xE0, 0xC5, 0x05, 0x0A, 0x10, 
+	0x78, 0xCD, 0x47, 0x06, 0xFD, 0x15, 0x06, 0x10, 
+	0xA0, 0x23, 0x16, 0xE0, 0xCD, 0x16, 0x49, 0xC2, 
+	0xEC, 0x16, 0xD6, 0x10, 0xA0, 0xE3, 0x16, 0xE0, 
+	0xBB, 0x10, 0x08, 0x02, 0x5A, 0x80, 0xA0, 0x06, 
+	0xDA, 0xD4, 0x44, 0x10, 0xA0, 0x92, 0x0C, 0xE0, 
+	0x15, 0x16, 0x44, 0x02, 0x00, 0x5E, 0x14, 0x16, 
+	0x20, 0x48, 0xAC, 0xE4, 0x80, 0x01, 0xA0, 0x06, 
+	0x72, 0xD7, 0x20, 0xC8, 0x9E, 0x01, 0x9E, 0x01, 
+	0xE0, 0x2E, 0x01, 0x00, 0xA0, 0x43, 0x18, 0xE0, 
+	0xA0, 0xD2, 0x26, 0xE0, 0x83, 0x07, 0x10, 0x00, 
+	0xA0, 0x06, 0x2A, 0xD8, 0x60, 0x04, 0xD2, 0xCE, 
+	0x84, 0x07, 0x08, 0x00, 0x60, 0x04, 0x94, 0xCE, 
+	0x85, 0x07, 0x03, 0x02, 0x05, 0xC8, 0xCE, 0x06, 
+	0xA0, 0x43, 0x12, 0xE0, 0xE0, 0x04, 0xFA, 0x06, 
+	0xA0, 0x06, 0xA4, 0xD7, 0x08, 0x02, 0x48, 0x80, 
+	0xA0, 0x06, 0xDA, 0xD4, 0x17, 0x10, 0x60, 0x01, 
+	0x8E, 0x09, 0x00, 0x80, 0x02, 0x16, 0x60, 0x04, 
+	0x9C, 0xD4, 0xA0, 0x27, 0x2C, 0xE0, 0x04, 0x16, 
+	0x08, 0x02, 0x54, 0x80, 0xA0, 0x06, 0xDA, 0xD4, 
+	0x83, 0x07, 0x00, 0xA8, 0x20, 0x88, 0x08, 0x07, 
+	0x20, 0xE0, 0x02, 0x16, 0x83, 0x07, 0x00, 0xE8, 
+	0xA0, 0x06, 0x2A, 0xD8, 0x08, 0x02, 0x36, 0x00, 
+	0xA0, 0x06, 0xDA, 0xD4, 0x20, 0xE8, 0x0C, 0xE0, 
+	0x82, 0x01, 0xA0, 0x23, 0x18, 0xE0, 0x06, 0x13, 
+	0xA0, 0xE3, 0x18, 0xE0, 0xE0, 0x2E, 0x00, 0x00, 
+	0x41, 0xC0, 0xFA, 0x16, 0xA0, 0x06, 0xE6, 0xD5, 
+	0x82, 0xC0, 0x02, 0x13, 0x4F, 0x02, 0x80, 0xFF, 
+	0xC4, 0x04, 0x0F, 0xD1, 0xC4, 0x06, 0x60, 0x04, 
+	0x94, 0xCE, 0xA0, 0x06, 0x32, 0xDA, 0x08, 0x02, 
+	0x36, 0x80, 0xA0, 0x07, 0xD6, 0x06, 0x20, 0xDA, 
+	0xA0, 0x06, 0xDA, 0xD4, 0x10, 0x10, 0xA0, 0x06, 
+	0x32, 0xDA, 0x20, 0xD1, 0xCE, 0x06, 0xE6, 0x13, 
+	0x20, 0x78, 0x12, 0xE0, 0xCE, 0x06, 0xE2, 0x10, 
+	0x20, 0xC1, 0x16, 0x04, 0x14, 0x0A, 0xC4, 0x06, 
+	0x0A, 0x91, 0x01, 0x16, 0x5B, 0x04, 0x60, 0x04, 
+	0xD2, 0xCE, 0xB0, 0x03, 0x20, 0x98, 0xAB, 0xE3, 
+	0x65, 0x06, 0x02, 0x13, 0x60, 0x04, 0xBA, 0xCE, 
+	0x60, 0xC1, 0x94, 0x09, 0x02, 0x13, 0x60, 0x04, 
+	0x22, 0xDE, 0x60, 0xD1, 0x0E, 0xE0, 0x3D, 0x10, 
+	0x85, 0x07, 0xBE, 0xEA, 0x35, 0xC8, 0x8A, 0x09, 
+	0x15, 0xC8, 0x8C, 0x09, 0x0B, 0x10, 0xE0, 0x04, 
+	0xA0, 0x09, 0x20, 0xD8, 0x2E, 0x09, 0xA6, 0x09, 
+	0x20, 0xC8, 0xA8, 0x09, 0x8A, 0x09, 0x20, 0xC8, 
+	0xAA, 0x09, 0x8C, 0x09, 0xE0, 0x04, 0x8E, 0x09, 
+	0xCA, 0x04, 0xCD, 0x04, 0xCE, 0x04, 0xCF, 0x04, 
+	0xE0, 0x04, 0xA8, 0x06, 0xE0, 0x04, 0xBA, 0x06, 
+	0x84, 0x07, 0xA0, 0x01, 0x85, 0x07, 0x10, 0x00, 
+	0xF4, 0x04, 0x45, 0x06, 0xFD, 0x15, 0x84, 0x07, 
+	0xD8, 0x06, 0x85, 0x07, 0x34, 0x07, 0x44, 0x61, 
+	0xF4, 0x04, 0x45, 0x06, 0xFD, 0x15, 0x84, 0x07, 
+	0xC8, 0x00, 0x04, 0xC8, 0x00, 0x07, 0x84, 0x07, 
+	0xFF, 0x7F, 0x04, 0xC8, 0xF0, 0x06, 0x84, 0x07, 
+	0x06, 0x00, 0x04, 0xC8, 0xEE, 0x06, 0x85, 0x07, 
+	0x02, 0x0C, 0x20, 0xC1, 0x8A, 0x09, 0x01, 0x11, 
+	0xC5, 0x06, 0xB0, 0x03, 0x05, 0xD8, 0x65, 0x06, 
+	0x60, 0x04, 0xD2, 0xCE, 0xB0, 0x03, 0x20, 0x98, 
+	0xAA, 0xE3, 0x65, 0x06, 0x79, 0x16, 0x60, 0xD1, 
+	0x10, 0xE0, 0xF3, 0x10, 0x60, 0xD1, 0xAB, 0xE3, 
+	0xA0, 0x01, 0x8E, 0x09, 0x00, 0x02, 0xE0, 0x01, 
+	0x80, 0x01, 0x00, 0x20, 0xC8, 0x04, 0x20, 0xD2, 
+	0x80, 0x01, 0x08, 0xC8, 0x9C, 0x09, 0x08, 0xD8, 
+	0x2E, 0x09, 0xE3, 0x10, 0x20, 0xF8, 0x19, 0xEE, 
+	0x82, 0x01, 0x20, 0xC8, 0x10, 0xE0, 0xC6, 0x06, 
+	0x20, 0xC8, 0x20, 0xE0, 0xC8, 0x06, 0x20, 0xC8, 
+	0xC2, 0xEA, 0x90, 0x09, 0xE0, 0x2E, 0x00, 0x00, 
+	0xA0, 0x06, 0xE6, 0xD5, 0x20, 0xC8, 0x6C, 0x09, 
+	0xA0, 0x01, 0x20, 0xC8, 0x6E, 0x09, 0xA2, 0x01, 
+	0x20, 0xC8, 0x70, 0x09, 0xA4, 0x01, 0x20, 0xC8, 
+	0x6E, 0x09, 0xB0, 0x01, 0x20, 0xC8, 0x70, 0x09, 
+	0xB2, 0x01, 0x20, 0xC8, 0x70, 0x09, 0xCC, 0x06, 
+	0x20, 0xF8, 0x18, 0xEE, 0x80, 0x01, 0xB0, 0x03, 
+	0xA0, 0x01, 0x8E, 0x09, 0x00, 0x02, 0x20, 0x98, 
+	0xAA, 0xE3, 0x65, 0x06, 0x3A, 0x13, 0xE0, 0x01, 
+	0x8E, 0x09, 0x00, 0x02, 0x88, 0x07, 0x56, 0xDF, 
+	0xE0, 0xC2, 0x8A, 0x09, 0x05, 0x11, 0xA0, 0x01, 
+	0x8E, 0x09, 0x00, 0x02, 0x88, 0x07, 0x9A, 0xDF, 
+	0x98, 0x06, 0x08, 0x02, 0x12, 0x80, 0xA0, 0x06, 
+	0xDA, 0xD4, 0x84, 0x07, 0x0A, 0x00, 0x85, 0x07, 
+	0xF4, 0x03, 0x20, 0x88, 0xC6, 0x06, 0x20, 0xE0, 
+	0x08, 0x1B, 0x60, 0x01, 0x8E, 0x09, 0x00, 0x80, 
+	0xA5, 0x13, 0x84, 0x07, 0x1C, 0x00, 0x85, 0x07, 
+	0xF8, 0x03, 0xA0, 0x06, 0xA2, 0xD8, 0x85, 0x07, 
+	0x42, 0xDC, 0x05, 0xC8, 0xF8, 0x03, 0x20, 0xC8, 
+	0xA0, 0x09, 0xA0, 0x09, 0x6C, 0x16, 0x20, 0xE8, 
+	0x9C, 0x09, 0xFE, 0x03, 0x20, 0xE8, 0x9E, 0x09, 
+	0x06, 0x04, 0xA0, 0x23, 0x0C, 0xE0, 0x32, 0x13, 
+	0xA0, 0xE3, 0x0C, 0xE0, 0xA0, 0x2E, 0xF4, 0x03, 
+	0x2D, 0x10, 0xA0, 0x06, 0x56, 0xDF, 0x60, 0x01, 
+	0x8E, 0x09, 0x00, 0x40, 0x08, 0x13, 0x08, 0x02, 
+	0x6C, 0x80, 0xA0, 0x06, 0xDA, 0xD4, 0x22, 0x10, 
+	0xE0, 0x01, 0x8E, 0x09, 0x00, 0x40, 0x08, 0x02, 
+	0x60, 0x80, 0xA0, 0x06, 0xDA, 0xD4, 0x84, 0x07, 
+	0x2A, 0x00, 0x85, 0x07, 0xF4, 0x03, 0xA0, 0x06, 
+	0xA2, 0xD8, 0xD5, 0x10, 0xB0, 0x03, 0x20, 0x98, 
+	0xAA, 0xE3, 0x65, 0x06, 0x0F, 0x16, 0x20, 0x06, 
+	0x90, 0x09, 0x9A, 0x16, 0x60, 0x01, 0x8A, 0x09, 
+	0x00, 0x40, 0x39, 0x13, 0xE0, 0x04, 0x8A, 0x09, 
+	0xE0, 0x04, 0x8C, 0x09, 0xE0, 0x04, 0x8E, 0x09, 
+	0x60, 0x04, 0x62, 0xDA, 0x60, 0x04, 0xB0, 0xCE, 
+	0xB0, 0x03, 0x20, 0x98, 0x10, 0xE0, 0x65, 0x06, 
+	0xF9, 0x16, 0x44, 0x02, 0x00, 0x5E, 0x04, 0x16, 
+	0x20, 0x06, 0xC6, 0x06, 0x9A, 0x16, 0x0A, 0x10, 
+	0xB0, 0x03, 0x20, 0x98, 0x10, 0xE0, 0x65, 0x06, 
+	0xED, 0x16, 0x20, 0x06, 0xC8, 0x06, 0x02, 0x13, 
+	0x60, 0x04, 0x5A, 0xDB, 0x60, 0x01, 0x8E, 0x09, 
+	0x00, 0x01, 0x02, 0x16, 0xCE, 0x01, 0x03, 0x00, 
+	0x0E, 0x01, 0x03, 0x00, 0x03, 0x13, 0x83, 0x07, 
+	0x00, 0x82, 0x07, 0x10, 0x83, 0x07, 0x01, 0x00, 
+	0xE0, 0x04, 0x8E, 0x09, 0x20, 0xE8, 0x0C, 0xE0, 
+	0x82, 0x01, 0x60, 0x04, 0xCA, 0xCE, 0x60, 0x01, 
+	0x8A, 0x09, 0x00, 0x40, 0xC7, 0x16, 0x83, 0x07, 
+	0x0D, 0x00, 0xF2, 0x10, 0xB0, 0x03, 0x20, 0x98, 
+	0xAA, 0xE3, 0x65, 0x06, 0xC7, 0x16, 0x20, 0x88, 
+	0x98, 0x09, 0x20, 0xE0, 0xF0, 0x16, 0x22, 0xC8, 
+	0x0E, 0x00, 0xDC, 0x06, 0x22, 0xC8, 0x10, 0x00, 
+	0xDE, 0x06, 0x22, 0xC8, 0x12, 0x00, 0xE0, 0x06, 
+	0xE0, 0x01, 0x8E, 0x09, 0x00, 0x80, 0x08, 0x02, 
+	0x66, 0x80, 0xA0, 0x06, 0xDA, 0xD4, 0xB2, 0x10, 
+	0xA0, 0x07, 0x9A, 0x09, 0x5A, 0x00, 0xA0, 0x07, 
+	0xA2, 0x09, 0x19, 0x00, 0xA0, 0x07, 0xA4, 0x09, 
+	0x05, 0x00, 0xE0, 0x01, 0x8E, 0x09, 0x00, 0x20, 
+	0xE0, 0x01, 0x8E, 0x09, 0x00, 0x04, 0x08, 0x02, 
+	0x78, 0x80, 0xA0, 0x06, 0xDA, 0xD4, 0xB0, 0x03, 
+	0x20, 0x98, 0xAB, 0xE3, 0x65, 0x06, 0x9A, 0x16, 
+	0x08, 0x02, 0x72, 0x80, 0xA0, 0x06, 0xDA, 0xD4, 
+	0x20, 0xE8, 0x0C, 0xE0, 0x82, 0x01, 0xA0, 0x06, 
+	0xD0, 0xD5, 0x20, 0x06, 0x9A, 0x09, 0xBF, 0x13, 
+	0x84, 0x07, 0x2C, 0x00, 0x85, 0x07, 0xF4, 0x03, 
+	0xA0, 0x06, 0xA2, 0xD8, 0x60, 0x04, 0xC0, 0xDB, 
+	0x20, 0x48, 0x0C, 0xE0, 0x82, 0x01, 0x82, 0x10, 
+	0x0E, 0x01, 0x03, 0x00, 0x0A, 0x13, 0x08, 0x02, 
+	0x0C, 0x80, 0xA0, 0x06, 0xDA, 0xD4, 0xE0, 0xE3, 
+	0x14, 0xE0, 0x20, 0xC8, 0xAE, 0xE4, 0x86, 0x01, 
+	0x26, 0x10, 0x20, 0x48, 0x0C, 0xE0, 0x82, 0x01, 
+	0xE0, 0x2E, 0x01, 0x00, 0x60, 0xC1, 0x1E, 0x09, 
+	0x35, 0x0A, 0x05, 0xE8, 0x82, 0x01, 0x20, 0xC1, 
+	0x6A, 0x09, 0x04, 0x01, 0x06, 0x00, 0x06, 0x13, 
+	0x20, 0xD8, 0xD0, 0xE1, 0x2F, 0x09, 0x20, 0xD8, 
+	0xD0, 0xE1, 0x83, 0x01, 0x20, 0x21, 0x22, 0xE0, 
+	0x03, 0x16, 0x20, 0xE8, 0x22, 0xE0, 0x80, 0x01, 
+	0x20, 0x21, 0x04, 0xE0, 0x04, 0x16, 0xA0, 0xE3, 
+	0x14, 0xE0, 0x60, 0x04, 0x0A, 0xD3, 0x08, 0x02, 
+	0x00, 0x80, 0xA0, 0x06, 0xDA, 0xD4, 0x20, 0xE8, 
+	0x08, 0xE0, 0x82, 0x01, 0xE0, 0xC2, 0x8A, 0x09, 
+	0x02, 0x11, 0x60, 0x04, 0xB0, 0xCE, 0xA0, 0x01, 
+	0x8E, 0x09, 0x00, 0x04, 0x6B, 0x10, 0x20, 0xC8, 
+	0xAE, 0xE4, 0x86, 0x01, 0x08, 0x02, 0x00, 0x80, 
+	0xA0, 0x06, 0xDA, 0xD4, 0x20, 0xC2, 0x1E, 0x09, 
+	0x08, 0xA2, 0x08, 0x05, 0x28, 0xC8, 0x22, 0xE0, 
+	0xCA, 0x06, 0x20, 0xC8, 0x20, 0xE0, 0xC6, 0x06, 
+	0x20, 0xC8, 0x20, 0xE0, 0xC8, 0x06, 0x60, 0xE3, 
+	0x16, 0xE0, 0x60, 0x04, 0xD2, 0xCE, 0x44, 0xC1, 
+	0x44, 0x02, 0x00, 0x5E, 0xF8, 0x16, 0x60, 0x25, 
+	0xA8, 0xE4, 0x0F, 0x16, 0x20, 0x06, 0xC6, 0x06, 
+	0xF2, 0x16, 0x20, 0x06, 0xCA, 0x06, 0x03, 0x13, 
+	0xA0, 0x05, 0xCC, 0x06, 0xE6, 0x10, 0xB0, 0x03, 
+	0x20, 0xD8, 0x0C, 0xE0, 0x65, 0x06, 0x60, 0x04, 
+	0xD2, 0xCE, 0x20, 0x06, 0xC8, 0x06, 0xE3, 0x16, 
+	0x20, 0x88, 0x70, 0x09, 0xCC, 0x06, 0x03, 0x16, 
+	0x83, 0x07, 0x08, 0x00, 0x02, 0x10, 0x83, 0x07, 
+	0x0C, 0x00, 0x60, 0x04, 0x8A, 0xDC, 0x60, 0x04, 
+	0xD2, 0xCE, 0xA0, 0x23, 0x08, 0xE0, 0x03, 0x13, 
+	0x60, 0x23, 0x12, 0xE0, 0x06, 0x16, 0xB0, 0x03, 
+	0x20, 0xD8, 0xA9, 0xE3, 0x65, 0x06, 0x60, 0x04, 
+	0xD2, 0xCE, 0x08, 0x02, 0x00, 0x80, 0xA0, 0x06, 
+	0xDA, 0xD4, 0x60, 0x04, 0xB0, 0xCE, 0x08, 0x02, 
+	0x00, 0x80, 0xA0, 0x06, 0xDA, 0xD4, 0x20, 0xC8, 
+	0x1E, 0xE0, 0xC6, 0x06, 0x20, 0xC8, 0x1E, 0xE0, 
+	0xC8, 0x06, 0x60, 0xE3, 0x10, 0xE0, 0x60, 0x04, 
+	0xD2, 0xCE, 0xE0, 0x23, 0x14, 0xE0, 0x30, 0x13, 
+	0x44, 0xC1, 0x44, 0x02, 0x00, 0x1E, 0xF5, 0x16, 
+	0x60, 0x25, 0xA8, 0xE4, 0x1D, 0x16, 0x20, 0x06, 
+	0xC8, 0x06, 0xEF, 0x16, 0x60, 0x01, 0x8E, 0x09, 
+	0x00, 0x80, 0x13, 0x16, 0x60, 0x01, 0x8E, 0x09, 
+	0x00, 0x01, 0x0C, 0x16, 0xA0, 0x01, 0x8E, 0x09, 
+	0x00, 0x01, 0xA0, 0x01, 0x8E, 0x09, 0x80, 0x00, 
+	0xA0, 0x43, 0x04, 0xE0, 0x83, 0x07, 0x18, 0x68, 
+	0xA0, 0x06, 0x2A, 0xD8, 0x20, 0xC8, 0xAE, 0xE4, 
+	0x86, 0x01, 0xC2, 0x04, 0x60, 0x04, 0x2C, 0xE4, 
+	0x08, 0x02, 0x1E, 0x80, 0xA0, 0x06, 0xDA, 0xD4, 
+	0x07, 0x10, 0x20, 0x06, 0xC6, 0x06, 0xCD, 0x16, 
+	0x83, 0x07, 0x09, 0x00, 0xA0, 0x06, 0x8A, 0xDC, 
+	0x60, 0x04, 0xB0, 0xCE, 0xCE, 0x04, 0xE0, 0x04, 
+	0x2A, 0x09, 0xE0, 0xD3, 0xAA, 0xE3, 0x8F, 0xC2, 
+	0x20, 0xC8, 0xB0, 0xE4, 0x86, 0x01, 0x20, 0x48, 
+	0x08, 0xE0, 0x82, 0x01, 0x86, 0x07, 0x05, 0x00, 
+	0x84, 0x07, 0x72, 0x06, 0x54, 0xC1, 0x01, 0x13, 
+	0xD4, 0x2C, 0x24, 0x02, 0x0A, 0x00, 0x06, 0x06, 
+	0xF9, 0x16, 0x08, 0x02, 0x2A, 0x80, 0xA0, 0x06, 
+	0xDA, 0xD4, 0x20, 0x2C, 0x1A, 0xE0, 0x60, 0x04, 
+	0x50, 0xCD, 0xA0, 0x06, 0x3E, 0xD7, 0xCD, 0x04, 
+	0xA0, 0x23, 0x1C, 0xE0, 0x0D, 0x13, 0x0E, 0x01, 
+	0x03, 0x00, 0x0A, 0x13, 0xA0, 0xE3, 0x1C, 0xE0, 
+	0xB0, 0x03, 0x20, 0xD8, 0x10, 0xE0, 0x65, 0x06, 
+	0xA0, 0xD2, 0x26, 0xE0, 0xCF, 0x04, 0x08, 0x10, 
+	0x20, 0x2D, 0x01, 0x00, 0xE0, 0xC0, 0x2A, 0x09, 
+	0xA0, 0x06, 0x2A, 0xD8, 0xA0, 0xD2, 0xAB, 0xE3, 
+	0x60, 0x04, 0xD2, 0xCE, 0xA0, 0x01, 0x80, 0x01, 
+	0x00, 0x01, 0xE0, 0x01, 0x80, 0x01, 0x00, 0xAC, 
+	0xA0, 0x01, 0x82, 0x01, 0x00, 0x03, 0xE0, 0x01, 
+	0x82, 0x01, 0x00, 0x08, 0x88, 0x07, 0xAE, 0x01, 
+	0x08, 0x06, 0xFE, 0x16, 0x60, 0x01, 0x8E, 0x09, 
+	0x00, 0x02, 0x03, 0x16, 0xA0, 0x01, 0x80, 0x01, 
+	0x00, 0x20, 0xC8, 0x04, 0x20, 0xD2, 0x80, 0x01, 
+	0x08, 0xC8, 0x9C, 0x09, 0x08, 0xD8, 0x2E, 0x09, 
+	0xA0, 0x07, 0x9E, 0x09, 0x00, 0x10, 0x5B, 0x04, 
+	0x20, 0xD8, 0xA6, 0x09, 0x2E, 0x09, 0xE0, 0x01, 
+	0x80, 0x01, 0x00, 0x04, 0xE0, 0x01, 0x82, 0x01, 
+	0x00, 0x08, 0xA0, 0x01, 0x82, 0x01, 0x00, 0x03, 
+	0x20, 0xC2, 0x30, 0x09, 0x03, 0x13, 0xE0, 0x01, 
+	0x82, 0x01, 0x00, 0x03, 0xA0, 0x01, 0x80, 0x01, 
+	0x00, 0xA1, 0x20, 0xF8, 0x2E, 0x09, 0x80, 0x01, 
+	0x88, 0x07, 0xAE, 0x01, 0x08, 0x06, 0xFE, 0x16, 
+	0xA0, 0x01, 0x80, 0x01, 0x00, 0x0C, 0xE0, 0x04, 
+	0x9E, 0x01, 0xE0, 0x04, 0x9C, 0x09, 0xE0, 0x04, 
+	0x9E, 0x09, 0x5B, 0x04, 0x20, 0x01, 0xA8, 0x09, 
+	0x00, 0x80, 0x11, 0x13, 0xE0, 0x93, 0x26, 0xE0, 
+	0x0E, 0x16, 0x60, 0x01, 0x8E, 0x09, 0x00, 0x80, 
+	0x0A, 0x13, 0x08, 0x02, 0x84, 0x80, 0x00, 0x00, 
+	0x00, 0xE0, 0xDC, 0x0F, 0xA0, 0x06, 0xDA, 0xD4, 
+	0x20, 0x48, 0x08, 0xE0, 0x82, 0x01, 0x02, 0x10, 
+	0x60, 0x04, 0x70, 0xDA, 0x60, 0x04, 0xBA, 0xCE, 
+	0xA0, 0x06, 0x9C, 0xD5, 0x08, 0xC2, 0x19, 0x13, 
+	0x83, 0x07, 0x80, 0x80, 0xE0, 0x23, 0x14, 0xE0, 
+	0x02, 0x13, 0x83, 0x07, 0x0A, 0x00, 0x60, 0x04, 
+	0xC6, 0xCE, 0x20, 0xC1, 0x06, 0x06, 0x0D, 0x13, 
+	0xA0, 0x06, 0x9C, 0xD5, 0x08, 0xC2, 0x09, 0x13, 
+	0x83, 0x07, 0x0B, 0x00, 0xE0, 0x23, 0x14, 0xE0, 
+	0x02, 0x16, 0x83, 0x07, 0x01, 0x80, 0x60, 0x04, 
+	0xC6, 0xCE, 0x83, 0x07, 0x0A, 0x80, 0x60, 0x04, 
+	0xB4, 0xCE, 0x60, 0x01, 0x8E, 0x09, 0x00, 0x80, 
+	0x06, 0x16, 0xA0, 0x06, 0xA8, 0xE5, 0x47, 0x10, 
+	0xD0, 0x03, 0x60, 0x04, 0xB0, 0xD3, 0xE0, 0x93, 
+	0x0E, 0xE0, 0x5E, 0x13, 0xE0, 0x93, 0x10, 0xE0, 
+	0x17, 0x13, 0xE0, 0x23, 0x14, 0xE0, 0x04, 0x13,  
+	0x83, 0x07, 0x07, 0x00, 0x60, 0x04, 0xC6, 0xCE, 
+	0x83, 0x07, 0x00, 0xA0, 0xA0, 0x06, 0x2A, 0xD8,  
+	0x83, 0x07, 0x00, 0x48, 0xA0, 0x06, 0x2A, 0xD8, 
+	0xA0, 0xD2, 0x10, 0xE0, 0x20, 0xC8, 0x1C, 0xE0, 
+	0xCA, 0x06, 0x20, 0xC8, 0x20, 0xE0, 0xCC, 0x06, 
+	0xA0, 0x06, 0x3E, 0xD7, 0x08, 0x02, 0x4E, 0x80, 
+	0xA0, 0x06, 0xDA, 0xD4, 0xA0, 0x23, 0x1C, 0xE0, 
+	0x20, 0x13, 0x20, 0x88, 0x6C, 0x09, 0x0E, 0x07, 
+	0x1C, 0x16, 0x20, 0x88, 0x6E, 0x09, 0x10, 0x07, 
+	0x18, 0x16, 0x20, 0x88, 0x70, 0x09, 0x12, 0x07, 
+	0x14, 0x16, 0x20, 0x88, 0x0A, 0x07, 0x22, 0xE0, 
+	0x10, 0x13, 0x20, 0x06, 0xCA, 0x06, 0x38, 0x16, 
+	0xA0, 0xE3, 0x20, 0xE0, 0x06, 0x10, 0xE0, 0x23, 
+	0x14, 0xE0, 0xCA, 0x16, 0xA0, 0xE3, 0x22, 0xE0, 
+	0xC2, 0x04, 0xA0, 0xD2, 0xAA, 0xE3, 0x60, 0x04, 
+	0xBA, 0xCE, 0x20, 0xC8, 0x1C, 0xE0, 0xCA, 0x06, 
+	0xA0, 0x88, 0xDC, 0x06, 0x0E, 0x00, 0x10, 0x16, 
+	0xA0, 0x88, 0xDE, 0x06, 0x10, 0x00, 0x0C, 0x16, 
+	0xA0, 0x88, 0xE0, 0x06, 0x12, 0x00, 0x08, 0x16, 
+	0x20, 0x06, 0xCC, 0x06, 0x19, 0x16, 0x20, 0xE8, 
+	0x0E, 0xE0, 0x82, 0x01, 0xA0, 0xE3, 0x1E, 0xE0, 
+	0x20, 0xC8, 0x20, 0xE0, 0xCC, 0x06, 0x10, 0x10, 
+	0xA0, 0x23, 0x10, 0xE0, 0x08, 0x16, 0x64, 0xC1, 
+	0x06, 0x00, 0x60, 0x21, 0x0C, 0xE0, 0x08, 0x13, 
+	0xA0, 0xD2, 0xA8, 0xE3, 0x05, 0x10, 0x20, 0x88, 
+	0x0A, 0x07, 0x08, 0x07, 0x96, 0x12, 0x00, 0x10, 
+	0x60, 0x04, 0xBA, 0xCE, 0x60, 0x01, 0x8E, 0x09, 
+	0x00, 0x80, 0x06, 0x16, 0x83, 0x07, 0x00, 0x82, 
+	0xA0, 0x06, 0x2A, 0xD8, 0x60, 0x04, 0xCA, 0xCE, 
+	0xE0, 0x93, 0x0E, 0xE0, 0x50, 0x13, 0xE0, 0x93, 
+	0xA9, 0xE3, 0x4D, 0x13, 0xE0, 0x93, 0xA8, 0xE3, 
+	0x1C, 0x13, 0xA0, 0x06, 0xA4, 0xD7, 0xA0, 0x23, 
+	0x10, 0xE0, 0x45, 0x13, 0xA0, 0x23, 0x08, 0xE0, 
+	0x06, 0x16, 0x60, 0xE3, 0x1E, 0xE0, 0x20, 0xC8, 
+	0x22, 0xE0, 0x06, 0x07, 0x34, 0x10, 0xE0, 0x23, 
+	0x14, 0xE0, 0x31, 0x16, 0x60, 0xC1, 0x6A, 0x09, 
+	0x60, 0x21, 0x12, 0xE0, 0x2C, 0x16, 0xA0, 0x06, 
+	0x0E, 0xE2, 0x31, 0x10, 0xA0, 0xD2, 0xA8, 0xE3, 
+	0x2E, 0x10, 0xA0, 0xE3, 0x12, 0xE0, 0xA0, 0x06, 
+	0x0E, 0xE2, 0x64, 0xC1, 0x06, 0x00, 0x60, 0x21, 
+	0x0C, 0xE0, 0x25, 0x13, 0x20, 0x88, 0x0E, 0x07, 
+	0xDC, 0x06, 0x14, 0x16, 0x20, 0x88, 0x10, 0x07, 
+	0xDE, 0x06, 0x10, 0x16, 0x20, 0x88, 0x12, 0x07, 
+	0xE0, 0x06, 0x0C, 0x16, 0x20, 0x98, 0xCE, 0x06, 
+	0xCF, 0x06, 0x15, 0x13, 0x20, 0x06, 0xCE, 0x06, 
+	0x12, 0x16, 0x60, 0xE3, 0x1A, 0xE0, 0xA0, 0xD2, 
+	0x0C, 0xE0, 0x0D, 0x10, 0x60, 0xE3, 0x1E, 0xE0,  
+	0x20, 0xC8, 0x32, 0xE0, 0x06, 0x07, 0xA0, 0x06, 
+	0x3E, 0xD7, 0x08, 0x02, 0x48, 0x80, 0xA0, 0x06, 
+	0xDA, 0xD4, 0xA0, 0xD2, 0xA9, 0xE3, 0x60, 0x04, 
+	0xBA, 0xCE, 0x22, 0x88, 0x0E, 0x00, 0x6C, 0x09, 
+	0xC9, 0x1A, 0x0B, 0x1B, 0x22, 0x88, 0x10, 0x00, 
+	0x6E, 0x09, 0xC4, 0x1A, 0x06, 0x1B, 0x22, 0x88, 
+	0x12, 0x00, 0x70, 0x09, 0xBF, 0x1A, 0x01, 0x1B, 
+	0x5B, 0x04, 0x60, 0xC1, 0x6C, 0x01, 0x85, 0x02, 
+	0x43, 0x00, 0xE1, 0x13, 0xE0, 0x93, 0xA8, 0xE3, 
+	0xDE, 0x16, 0xA0, 0xC8, 0x00, 0xEE, 0x02, 0x00, 
+	0x84, 0x07, 0x0E, 0x00, 0x42, 0xC1, 0xA0, 0xC0, 
+	0x6C, 0x01, 0x02, 0xC0, 0x25, 0x02, 0x48, 0x00, 
+	0x81, 0x07, 0x60, 0xE2, 0x83, 0x07, 0x14, 0xAE, 
+	0x60, 0x04, 0x9E, 0xE5, 0x02, 0x02, 0x00, 0xFC, 
+	0xCA, 0x10, 0x60, 0x01, 0x8E, 0x09, 0x00, 0x80, 
+	0x06, 0x16, 0x83, 0x07, 0x00, 0x82, 0xA0, 0x06, 
+	0x2A, 0xD8, 0x60, 0x04, 0xCA, 0xCE, 0x20, 0x98, 
+	0x0E, 0xE0, 0x65, 0x06, 0x03, 0x16, 0x20, 0xD8, 
+	0xA8, 0xE3, 0x65, 0x06, 0xE0, 0x93, 0xA9, 0xE3, 
+	0x0D, 0x13, 0xA0, 0x23, 0x08, 0xE0, 0x19, 0x16, 
+	0xA0, 0x23, 0x10, 0xE0, 0x16, 0x13, 0x60, 0xE3, 
+	0x1E, 0xE0, 0x20, 0xC8, 0x20, 0xE0, 0x06, 0x07, 
+	0xA0, 0x06, 0x3E, 0xD7, 0xA0, 0x43, 0x18, 0xE0, 
+	0xE0, 0x2E, 0x01, 0x00, 0xA0, 0xD2, 0x26, 0xE0, 
+	0x83, 0x07, 0x10, 0x00, 0xA0, 0x06, 0x2A, 0xD8, 
+	0xE0, 0x23, 0x14, 0xE0, 0x02, 0x16, 0xA0, 0x06, 
+	0x18, 0xD7, 0xA0, 0x43, 0x2C, 0xE0, 0x20, 0xC8, 
+	0x20, 0xE0, 0x24, 0x09, 0x60, 0x04, 0xBA, 0xCE, 
+	0xA0, 0x06, 0xA8, 0xE5, 0x01, 0x10, 0x03, 0x10, 
+	0x20, 0x07, 0xA0, 0x09, 0x03, 0x10, 0xA0, 0x07, 
+	0xA2, 0x09, 0x19, 0x00, 0x60, 0x04, 0xBA, 0xCE, 
+	0xA0, 0x43, 0x0E, 0xE0, 0xA0, 0xC1, 0x24, 0x09, 
+	0x02, 0x13, 0x20, 0x06, 0x24, 0x09, 0xE0, 0x23, 
+	0x14, 0xE0, 0x03, 0x13, 0xA0, 0x23, 0x08, 0xE0, 
+	0x29, 0x16, 0x20, 0xC2, 0x8A, 0x09, 0xE4, 0x11, 
+	0x08, 0x02, 0x42, 0x80, 0xA0, 0x06, 0xDA, 0xD4, 
+	0xA0, 0x23, 0x08, 0xE0, 0x1F, 0x16, 0xA0, 0x23, 
+	0x10, 0xE0, 0x0A, 0x16, 0x22, 0xC1, 0x02, 0x00, 
+	0x20, 0x25, 0xA8, 0xE4, 0x23, 0x16, 0x83, 0x07, 
+	0x20, 0x80, 0xA0, 0x06, 0x2A, 0xD8, 0x12, 0x10, 
+	0xA0, 0x06, 0x3E, 0xD7, 0xE0, 0x23, 0x14, 0xE0, 
+	0x02, 0x16, 0xA0, 0x06, 0x18, 0xD7, 0x60, 0xE3, 
+	0x1E, 0xE0, 0x20, 0xC8, 0x20, 0xE0, 0x06, 0x07, 
+	0xA0, 0x23, 0x08, 0xE0, 0x03, 0x16, 0xA0, 0x23, 
+	0x06, 0xE0, 0x51, 0x13, 0x20, 0x98, 0x0E, 0xE0, 
+	0x65, 0x06, 0x03, 0x16, 0x20, 0xD8, 0xA8, 0xE3, 
+	0x65, 0x06, 0x22, 0xC1, 0x02, 0x00, 0x20, 0x25, 
+	0xA8, 0xE4, 0x0E, 0x13, 0x83, 0x07, 0x20, 0x00, 
+	0xA0, 0x06, 0x2A, 0xD8, 0x22, 0xC8, 0x0E, 0x00, 
+	0xE6, 0x06, 0x22, 0xC8, 0x10, 0x00, 0xE8, 0x06, 
+	0x22, 0xC8, 0x12, 0x00, 0xEA, 0x06, 0x37, 0x10, 
+	0x22, 0x88, 0x0E, 0x00, 0xDC, 0x06, 0x08, 0x16, 
+	0x22, 0x88, 0x10, 0x00, 0xDE, 0x06, 0x04, 0x16, 
+	0x22, 0x88, 0x12, 0x00, 0xE0, 0x06, 0x0B, 0x13, 
+	0x22, 0xC8, 0x0E, 0x00, 0xDC, 0x06, 0x22, 0xC8, 
+	0x10, 0x00, 0xDE, 0x06, 0x22, 0xC8, 0x12, 0x00,  
+	0xE0, 0x06, 0x60, 0xE3, 0x14, 0xE0, 0xA0, 0x23, 
+	0x0E, 0xE0, 0x08, 0x16, 0xA0, 0xC1, 0x24, 0x09, 
+	0x1A, 0x16, 0x86, 0x07, 0x00, 0x10, 0x06, 0xE8, 
+	0xD2, 0x06, 0x15, 0x10, 0xA0, 0xE3, 0x0E, 0xE0, 
+	0xA0, 0x23, 0x08, 0xE0, 0x09, 0x16, 0xA0, 0xE3, 
+	0x06, 0xE0, 0xE0, 0x04, 0xE6, 0x06, 0xE0, 0x04, 
+	0xE8, 0x06, 0xE0, 0x04, 0xEA, 0x06, 0x07, 0x10, 
+	0x08, 0x02, 0x36, 0x80, 0xA0, 0x07, 0xD6, 0x06, 
+	0x36, 0xD3, 0xA0, 0x06, 0xDA, 0xD4, 0x60, 0x04, 
+	0xBA, 0xCE, 0x20, 0x98, 0x65, 0x06, 0x10, 0xE0, 
+	0x03, 0x16, 0x20, 0xD8, 0x0E, 0xE0, 0x65, 0x06, 
+	0x60, 0x04, 0xBA, 0xCE, 0xE0, 0x23, 0x14, 0xE0, 
+	0x02, 0x13, 0x60, 0x04, 0xBA, 0xCE, 0x2E, 0x10, 
+	0xB0, 0x03, 0x20, 0x98, 0xA9, 0xE3, 0x6F, 0x06, 
+	0x19, 0x16, 0x24, 0xC2, 0x08, 0x00, 0x16, 0x11, 
+	0xE0, 0xE3, 0x14, 0xE0, 0x83, 0x07, 0x00, 0x00, 
+	0xA0, 0x06, 0x2A, 0xD8, 0xA0, 0x23, 0x14, 0xE0, 
+	0x04, 0x13, 0x08, 0x02, 0x06, 0x80, 0xA0, 0x06, 
+	0xDA, 0xD4, 0x08, 0x02, 0x1E, 0x00, 0xA0, 0x06, 
+	0xDA, 0xD4, 0xA0, 0x23, 0x08, 0xE0, 0x02, 0x13, 
+	0xA0, 0x06, 0x18, 0xD7, 0x82, 0xC0, 0x02, 0x16, 
+	0x60, 0x04, 0xD2, 0xCE, 0x20, 0xE8, 0x1C, 0xEE, 
+	0xF0, 0x06, 0x20, 0x99, 0x0E, 0xE0, 0x16, 0x00, 
+	0x05, 0x16, 0xE0, 0x04, 0xEC, 0x06, 0x20, 0x48, 
+	0x14, 0xE0, 0xF0, 0x06, 0x83, 0x07, 0x01, 0x00, 
+	0x60, 0x04, 0xB4, 0xCE, 0x64, 0xC2, 0x14, 0x00, 
+	0x24, 0x02, 0x18, 0x00, 0xC4, 0xC1, 0xC2, 0x61, 
+	0x27, 0x02, 0xFC, 0xFF, 0x74, 0xC1, 0x85, 0xC1, 
+	0x45, 0x71, 0x85, 0x02, 0x27, 0x00, 0x46, 0x16, 
+	0x54, 0xC1, 0x45, 0x02, 0xCF, 0xFF, 0x42, 0x16, 
+	0xC8, 0x04, 0x64, 0xC1, 0x08, 0x00, 0x06, 0x15, 
+	0x05, 0x13, 0x24, 0xC2, 0x0E, 0x00, 0x48, 0x02, 
+	0x00, 0x1F, 0xC8, 0x06, 0x28, 0x02, 0x11, 0x00, 
+	0x04, 0xA2, 0x18, 0x98, 0x21, 0xEE, 0x32, 0x16, 
+	0x42, 0xC1, 0x25, 0x02, 0x04, 0x00, 0x47, 0x65, 
+	0x35, 0xC2, 0x74, 0xCD, 0x48, 0x06, 0xFD, 0x15, 
+	0xA0, 0xC0, 0x6C, 0x01, 0x02, 0xC1, 0x04, 0xC8, 
+	0x6C, 0x01, 0xA0, 0xC1, 0x00, 0xFC, 0x05, 0x13, 
+	0x20, 0xC8, 0x80, 0xEB, 0x02, 0xFC, 0x06, 0xC1, 
+	0xF6, 0x10, 0x20, 0xC8, 0x00, 0xEE, 0x02, 0xFC, 
+	0x02, 0xC8, 0x6C, 0x01, 0x81, 0x07, 0x08, 0xE5, 
+	0x04, 0xC0, 0x83, 0x07, 0x10, 0x02, 0x84, 0x07, 
+	0x0E, 0x00, 0x3B, 0x10, 0x84, 0x07, 0x0C, 0x00, 
+	0xE2, 0xC0, 0x08, 0x00, 0x05, 0x02, 0x00, 0xFC, 
+	0xA0, 0xC0, 0x6C, 0x01, 0x02, 0xC0, 0x95, 0xC1, 
+	0x30, 0x13, 0xD5, 0x04, 0x16, 0x2E, 0x02, 0xC8, 
+	0x6C, 0x01, 0x2B, 0x10, 0xA0, 0xC8, 0x22, 0xEE, 
+	0x0E, 0x00, 0xA0, 0xC8, 0x24, 0xEE, 0x10, 0x00, 
+	0xA0, 0xC8, 0x26, 0xEE, 0x12, 0x00, 0x83, 0x07, 
+	0x06, 0x80, 0x60, 0x04, 0xB4, 0xCE, 0x60, 0x04, 
+	0xD2, 0xCE, 0x84, 0x07, 0x10, 0x00, 0x85, 0x07, 
+	0x34, 0x00, 0x09, 0x10, 0x84, 0x07, 0x12, 0x00, 
+	0x85, 0x07, 0x32, 0x00, 0x04, 0x10, 0x84, 0x07, 
+	0x14, 0x00, 0x85, 0x07, 0x38, 0x00, 0xA0, 0x06, 
+	0xC2, 0xD5, 0x85, 0xC8, 0x04, 0x00, 0xA0, 0x06, 
+	0x10, 0xD6, 0xA0, 0xC8, 0x00, 0xEE, 0x02, 0x00, 
+	0xA0, 0xC0, 0x6C, 0x01, 0x02, 0xC0, 0x48, 0x06, 
+	0x48, 0xC1, 0xA0, 0x06, 0xA2, 0xD8, 0x07, 0x02, 
+	0xA2, 0x06, 0x60, 0xC5, 0x02, 0xFC, 0x25, 0x02, 
+	0xF4, 0xFF, 0x05, 0xC8, 0x02, 0xFC, 0x20, 0xC2, 
+	0x6C, 0x01, 0xA0, 0x06, 0xFC, 0xB4, 0x60, 0x04, 
+	0xB0, 0xCE, 0xA0, 0x06, 0xA2, 0xD8, 0x07, 0x02, 
+	0xB4, 0x06, 0xEF, 0x10, 0x22, 0x88, 0x12, 0x00, 
+	0x70, 0x09, 0x08, 0x16, 0x22, 0x88, 0x10, 0x00, 
+	0x6E, 0x09, 0x04, 0x16, 0x22, 0x88, 0x0E, 0x00, 
+	0x6C, 0x09, 0x0E, 0x13, 0x22, 0x88, 0x12, 0x00, 
+	0xE0, 0x06, 0x08, 0x16, 0x22, 0x88, 0x10, 0x00, 
+	0xDE, 0x06, 0x04, 0x16, 0x22, 0x88, 0x0E, 0x00, 
+	0xDC, 0x06, 0x01, 0x13, 0xCB, 0x05, 0xCB, 0x05, 
+	0x5B, 0x04, 0x0B, 0xC3, 0x00, 0x03, 0x02, 0x00, 
+	0x82, 0x07, 0xC0, 0x00, 0x20, 0xC8, 0x0C, 0x00, 
+	0xC0, 0x00, 0x20, 0xC8, 0x0E, 0x00, 0xC2, 0x00, 
+	0x20, 0xC8, 0x10, 0x00, 0xC4, 0x00, 0x20, 0xC8, 
+	0x12, 0x00, 0xC6, 0x00, 0x20, 0xC8, 0x14, 0x00, 
+	0xC8, 0x00, 0x20, 0xC8, 0x16, 0x00, 0xCA, 0x00, 
+	0x20, 0xC8, 0x04, 0x00, 0xCC, 0x00, 0x20, 0xC8, 
+	0x06, 0x00, 0xCE, 0x00, 0x02, 0xC8, 0x0C, 0x00, 
+	0xA0, 0x07, 0x0E, 0x00, 0x7E, 0xE6, 0x02, 0xC8, 
+	0x10, 0x00, 0xA0, 0x07, 0x12, 0x00, 0x88, 0xE6, 
+	0x02, 0xC8, 0x14, 0x00, 0xA0, 0x07, 0x16, 0x00, 
+	0xB8, 0xE6, 0x02, 0xC8, 0x04, 0x00, 0xA0, 0x07, 
+	0x06, 0x00, 0xCE, 0xE6, 0x60, 0x01, 0x1C, 0x01, 
+	0x04, 0x00, 0x09, 0x16, 0xE0, 0x01, 0x40, 0x01, 
+	0x00, 0x08, 0xA0, 0x01, 0x40, 0x01, 0x00, 0x40, 
+	0xE0, 0x01, 0x40, 0x01, 0x00, 0x04, 0xA0, 0x06, 
+	0x8E, 0xE9, 0x05, 0x02, 0x00, 0x80, 0x05, 0xD8, 
+	0x80, 0x04, 0xC7, 0x04, 0x00, 0x03, 0x0F, 0x00, 
+	0x88, 0x07, 0x00, 0x10, 0x09, 0x02, 0x00, 0x20, 
+	0x8A, 0x07, 0xE6, 0xE6, 0x03, 0x02, 0x3E, 0xE6, 
+	0x5A, 0x04, 0x00, 0x03, 0x00, 0x00, 0x20, 0xD2, 
+	0x87, 0x01, 0x06, 0x10, 0x00, 0x03, 0x00, 0x00, 
+	0x20, 0xC2, 0x8A, 0x01, 0x08, 0x02, 0x00, 0x1A, 
+	0x60, 0xC2, 0xAE, 0x00, 0x48, 0xDA, 0x80, 0x04, 
+	0x89, 0x05, 0x89, 0x02, 0x06, 0x00, 0x07, 0x15, 
+	0x88, 0x07, 0x00, 0x80, 0x48, 0xDA, 0x80, 0x04, 
+	0x09, 0xC8, 0xAE, 0x00, 0x80, 0x03, 0xE0, 0x02, 
+	0xA0, 0x00, 0x5C, 0x04, 0x00, 0x03, 0x00, 0x00, 
+	0x60, 0x01, 0x9C, 0x01, 0x20, 0x00, 0xE2, 0x13, 
+	0x20, 0xC2, 0x8C, 0x01, 0x08, 0x02, 0x00, 0x1C, 
+	0xE3, 0x10, 0x00, 0x03, 0x00, 0x00, 0x60, 0x01,  
+	0x40, 0x01, 0x00, 0x40, 0xEC, 0x16, 0xA0, 0x01,  
+	0x40, 0x01, 0x00, 0x40, 0x08, 0x02, 0x00, 0x02, 
+	0xD7, 0x10, 0xB3, 0xC0, 0x92, 0x06, 0xFD, 0x10, 
+	0xB3, 0xC0, 0x48, 0xC0, 0x72, 0xCC, 0x72, 0xCC, 
+	0x32, 0xC1, 0x44, 0xCC, 0x72, 0xDC, 0x04, 0x06, 
+	0xFD, 0x16, 0x5B, 0x04, 0x48, 0xC0, 0x02, 0x02, 
+	0xD0, 0xE9, 0x84, 0x07, 0x06, 0x00, 0xF6, 0x10, 
+	0x02, 0x02, 0x1E, 0xE6, 0x49, 0xC0, 0x84, 0x07, 
+	0x06, 0x00, 0xF0, 0x10, 0xB3, 0xC0, 0x32, 0xC1, 
+	0x01, 0x02, 0x01, 0x00, 0x44, 0xD0, 0xC1, 0x06, 
+	0x44, 0x02, 0xFF, 0x00, 0xE7, 0x10, 0x33, 0xC1, 
+	0x73, 0xC0, 0x44, 0xD1, 0x44, 0x02, 0xFF, 0x00, 
+	0x45, 0xDC, 0x04, 0x06, 0xFD, 0x16, 0x5A, 0x04, 
+	0xA0, 0x06, 0x0E, 0xE9, 0x33, 0xC8, 0x9E, 0x01, 
+	0x5A, 0x04, 0xA0, 0x06, 0x0C, 0xE7, 0x89, 0xC1, 
+	0xA6, 0x09, 0x66, 0x02, 0x40, 0x00, 0x06, 0xC8, 
+	0x8A, 0x01, 0x88, 0xC1, 0xA6, 0x09, 0x66, 0x02,  
+	0x40, 0x00, 0x06, 0xC8, 0x8C, 0x01, 0xC2, 0x04,  
+	0xC7, 0xC1, 0x03, 0x16, 0x02, 0x06, 0xFC, 0x16,  
+	0x4D, 0x10, 0x5A, 0x04, 0xA0, 0x06, 0x58, 0xE8, 
+	0x89, 0xC1, 0xA6, 0x09, 0x66, 0x02, 0x40, 0x00, 
+	0x06, 0xC8, 0x8A, 0x01, 0x88, 0xC1, 0xA6, 0x09, 
+	0x66, 0x02, 0x40, 0x00, 0x06, 0xC8, 0x8C, 0x01, 
+	0x33, 0xC8, 0x9E, 0x01, 0xE8, 0x10, 0x33, 0x8A, 
+	0x02, 0x00, 0x38, 0x16, 0x73, 0x8A, 0x02, 0x00, 
+	0x35, 0x16, 0x5A, 0x04, 0x20, 0x8A, 0xCA, 0xE9, 
+	0x02, 0x00, 0x30, 0x16, 0x60, 0x8A, 0xCE, 0xE9, 
+	0x02, 0x00, 0x2C, 0x16, 0x82, 0x07, 0x74, 0xEA, 
+	0x01, 0x10, 0xB3, 0xC0, 0x04, 0x02, 0x80, 0x04, 
+	0x52, 0xD1, 0x03, 0x13, 0x32, 0x9D, 0x22, 0x16, 
+	0xFB, 0x10, 0x85, 0x07, 0x00, 0x80, 0x05, 0xD8, 
+	0x80, 0x04, 0xC7, 0x04, 0x5A, 0x04, 0x20, 0xC8, 
+	0xC0, 0x00, 0x0C, 0x00, 0x20, 0xC8, 0xC2, 0x00, 
+	0x0E, 0x00, 0x20, 0xC8, 0xC4, 0x00, 0x10, 0x00, 
+	0x20, 0xC8, 0xC6, 0x00, 0x12, 0x00, 0x20, 0xC8, 
+	0xC8, 0x00, 0x14, 0x00, 0x20, 0xC8, 0xCA, 0x00, 
+	0x16, 0x00, 0x20, 0xC8, 0xCC, 0x00, 0x04, 0x00, 
+	0x20, 0xC8, 0xCE, 0x00, 0x06, 0x00, 0x00, 0x03, 
+	0x0F, 0x00, 0xCC, 0x05, 0x5C, 0x04, 0xE0, 0x04, 
+	0x82, 0x01, 0x02, 0x02, 0x18, 0xE6, 0x32, 0xC8, 
+	0x82, 0x01, 0x32, 0xC8, 0x80, 0x01, 0xA0, 0x06, 
+	0x24, 0xE8, 0x12, 0xC8, 0x82, 0x01, 0xCA, 0xC2, 
+	0x84, 0x07, 0xD0, 0x07, 0xE0, 0x04, 0x84, 0x01, 
+	0x04, 0x06, 0xFC, 0x16, 0x20, 0xC1, 0x84, 0x01, 
+	0xE9, 0x16, 0x04, 0x02, 0x32, 0x00, 0x85, 0x07, 
+	0x00, 0x80, 0x05, 0xD8, 0x80, 0x04, 0xC7, 0x04, 
+	0x60, 0xC1, 0x86, 0x01, 0x04, 0x06, 0xFC, 0x16, 
+	0x20, 0xC1, 0x84, 0x01, 0x5B, 0x04, 0xB3, 0xC0, 
+	0xB3, 0xC4, 0x5B, 0x04, 0x48, 0xC0, 0xB3, 0xC0, 
+	0x73, 0xA0, 0x42, 0xC4, 0x5B, 0x04, 0x33, 0x88, 
+	0x84, 0x01, 0xE6, 0x16, 0x5A, 0x04, 0x89, 0xC1, 
+	0xA6, 0x09, 0x66, 0x02, 0x40, 0x00, 0x06, 0xC8, 
+	0x8A, 0x01, 0x5B, 0x04, 0xC5, 0x04, 0xA0, 0x07, 
+	0x9C, 0x01, 0x40, 0x00, 0x60, 0x01, 0x9C, 0x01, 
+	0x40, 0x00, 0x03, 0x13, 0x05, 0x06, 0xF7, 0x16, 
+	0x5C, 0x04, 0x5B, 0x04, 0xA0, 0x06, 0xAC, 0xE8, 
+	0x60, 0xC0, 0x40, 0x01, 0x05, 0xC8, 0x40, 0x01, 
+	0x02, 0xC5, 0x01, 0xC8, 0x40, 0x01, 0x5A, 0x04, 
+	0xA0, 0x06, 0xAC, 0xE8, 0x08, 0xA1, 0xF4, 0x10, 
+	0xB3, 0xC0, 0x33, 0xC1, 0x60, 0xC1, 0x40, 0x01, 
+	0x85, 0x01, 0x00, 0x04, 0xC5, 0x01, 0x00, 0x10,  
+	0x5B, 0x04, 0x08, 0xC1, 0x09, 0xC2, 0x44, 0xC2, 
+	0x5B, 0x04, 0x05, 0x02, 0xC8, 0x00, 0x05, 0x06, 
+	0xFE, 0x16, 0x5B, 0x04, 0x33, 0xC1, 0x03, 0xC0, 
+	0xC4, 0xC0, 0x5B, 0x04, 0xC0, 0xC0, 0x5B, 0x04, 
+	0xE0, 0x94, 0x9E, 0x01, 0xC2, 0x16, 0xC3, 0x05, 
+	0x5B, 0x04, 0x73, 0xC0, 0xA0, 0x06, 0x26, 0xE9, 
+	0x2D, 0x02, 0x08, 0x00, 0x85, 0x07, 0x08, 0x00, 
+	0x71, 0x9F, 0xB7, 0x16, 0x05, 0x06, 0xFC, 0x16, 
+	0x5A, 0x04, 0x02, 0x02, 0x24, 0xE6, 0x60, 0x04, 
+	0x10, 0xE7, 0xE9, 0x8C, 0x04, 0x00, 0xAD, 0x16, 
+	0x5B, 0x04, 0x20, 0xC1, 0x80, 0x01, 0x85, 0x07, 
+	0xD0, 0x07, 0xE0, 0x01, 0x80, 0x01, 0x00, 0x04, 
+	0x45, 0x06, 0xFE, 0x16, 0x04, 0xC8, 0x80, 0x01, 
+	0x5B, 0x04, 0x33, 0xC1, 0x48, 0xC3, 0x04, 0xC1, 
+	0x04, 0x13, 0x2D, 0x02, 0x00, 0x04, 0x04, 0x06, 
+	0xFC, 0x16, 0x5B, 0x04, 0x8D, 0xC3, 0xA0, 0x06, 
+	0x26, 0xE9, 0x8D, 0xC1, 0xA6, 0x09, 0x66, 0x02, 
+	0x40, 0x00, 0x86, 0xC7, 0x5A, 0x04, 0x8D, 0xC1, 
+	0xA6, 0x09, 0x66, 0x02, 0x40, 0x00, 0x06, 0xC8, 
+	0x8A, 0x01, 0x5B, 0x04, 0x8D, 0xC1, 0xA6, 0x09, 
+	0x66, 0x02, 0x40, 0x00, 0x06, 0xC8, 0x8C, 0x01, 
+	0x5B, 0x04, 0x4D, 0xC0, 0x04, 0x02, 0x28, 0x00, 
+	0x85, 0x07, 0x00, 0x55, 0x60, 0x04, 0x34, 0xE7, 
+	0x4D, 0xC0, 0xB3, 0xC0, 0x32, 0xC1, 0x60, 0x04, 
+	0xF8, 0xE6, 0x33, 0xC1, 0x60, 0x01, 0x1C, 0x01, 
+	0x04, 0x00, 0x01, 0x16, 0x5B, 0x04, 0xC4, 0xC0, 
+	0x5B, 0x04, 0x89, 0x07, 0x66, 0xE5, 0x39, 0xC2, 
+	0x07, 0x13, 0x39, 0xC6, 0x39, 0x86, 0x25, 0x16, 
+	0x39, 0xC6, 0x39, 0x86, 0x22, 0x16, 0xF7, 0x10, 
+	0x02, 0x02, 0xAC, 0xE9, 0xC4, 0x04, 0xC5, 0x04, 
+	0x39, 0xC2, 0x02, 0x13, 0x60, 0x04, 0xE8, 0xE9, 
+	0x02, 0x02, 0xBA, 0xE9, 0xC4, 0x04, 0x39, 0xC2, 
+	0x03, 0x13, 0x79, 0xC1, 0x60, 0x04, 0xE8, 0xE9, 
+	0x02, 0x02, 0xCA, 0xE9, 0xC5, 0x04, 0x39, 0xC2, 
+	0x03, 0x13, 0x39, 0xC1, 0x60, 0x04, 0xE8, 0xE9, 
+	0x79, 0xC0, 0xB9, 0xC0, 0x81, 0x60, 0xC2, 0x05, 
+	0x12, 0x09, 0xF1, 0x04, 0x02, 0x06, 0xFD, 0x16, 
+	0x5B, 0x04, 0x5C, 0x04, 0x01, 0x02, 0xAA, 0xAA, 
+	0x01, 0xC6, 0x44, 0xE0, 0x45, 0x40, 0x58, 0x80, 
+	0xF8, 0x16, 0x01, 0x02, 0x14, 0x00, 0x01, 0x06, 
+	0xFE, 0x16, 0x01, 0x02, 0x55, 0x55, 0x01, 0xC6, 
+	0x44, 0xE0, 0x45, 0x40, 0x58, 0x80, 0xED, 0x16, 
+	0x52, 0x04, 0xE0, 0x02, 0xA0, 0x00, 0x88, 0x07, 
+	0xC0, 0x00, 0x09, 0x02, 0x62, 0xEA, 0x84, 0x07, 
+	0x2A, 0xE6, 0x05, 0x02, 0x01, 0x00, 0x8B, 0xC2, 
+	0xCC, 0x04, 0xA0, 0x06, 0x6C, 0xEA, 0x60, 0x2C, 
+	0x01, 0x00, 0x99, 0x06, 0xA0, 0x2C, 0x02, 0x00, 
+	0x99, 0x06, 0x20, 0x2D, 0x04, 0x00, 0x99, 0x06, 
+	0x20, 0x2E, 0x08, 0x00, 0x99, 0x06, 0xA0, 0x2F, 
+	0x10, 0x00, 0x8C, 0x05, 0x09, 0x16, 0x80, 0xCC, 
+	0x81, 0xC4, 0x83, 0x07, 0xB0, 0xEA, 0x88, 0xC0, 
+	0x02, 0x04, 0x8C, 0x05, 0x01, 0x16, 0x33, 0x10, 
+	0xE0, 0x02, 0xA0, 0x00, 0x5A, 0x04, 0x8C, 0x05, 
+	0xFB, 0x16, 0x80, 0xCC, 0x81, 0xC4, 0x15, 0x0A, 
+	0xB4, 0xC0, 0x12, 0xC0, 0x88, 0xCC, 0x52, 0xC0, 
+	0xB4, 0xC4, 0x42, 0x06, 0x5B, 0x04, 0x2D, 0x07, 
+	0x18, 0x00, 0x41, 0x8B, 0x0A, 0x00, 0xEC, 0x16, 
+	0xC1, 0x82, 0xEA, 0x16, 0xC2, 0x02, 0x42, 0x02, 
+	0x00, 0x02, 0xE6, 0x16, 0x80, 0x03, 0x81, 0x07, 
+	0x01, 0x00, 0xF1, 0x10, 0x01, 0x02, 0x02, 0x00, 
+	0xEE, 0x10, 0x01, 0x02, 0x04, 0x00, 0xEB, 0x10, 
+	0x01, 0x02, 0x08, 0x00, 0xE8, 0x10, 0x01, 0x02, 
+	0x10, 0x00, 0xE5, 0x10, 0xA1, 0x02, 0x41, 0x8B, 
+	0x10, 0x00, 0x02, 0x13, 0x60, 0x04, 0x5C, 0xEA, 
+	0x2D, 0x07, 0x18, 0x00, 0x80, 0x03, 0x09, 0x02, 
+	0x00, 0x08, 0x03, 0x02, 0x04, 0x00, 0xC7, 0x04, 
+	0xA0, 0x06, 0xDC, 0xEB, 0x60, 0x01, 0x1C, 0x01, 
+	0x04, 0x00, 0x1C, 0x16, 0xA0, 0x01, 0x40, 0x01, 
+	0x00, 0x08, 0xE0, 0x01, 0x40, 0x01, 0x00, 0x10, 
+	0x04, 0x02, 0x01, 0x00, 0x44, 0xCE, 0xC4, 0x06, 
+	0x44, 0xC6, 0xA0, 0x01, 0x40, 0x01, 0x00, 0x10, 
+	0x49, 0x06, 0xA0, 0x01, 0x40, 0x01, 0x00, 0x40, 
+	0xE0, 0x01, 0x40, 0x01, 0x00, 0x04, 0xE0, 0x01, 
+	0x40, 0x01, 0x00, 0x08, 0xA0, 0x06, 0x7A, 0xEC, 
+	0xA0, 0x06, 0x7A, 0xEC, 0xC7, 0x05, 0x04, 0x02, 
+	0xE4, 0xE4, 0xE0, 0x04, 0xD0, 0x03, 0x74, 0xC1, 
+	0xB4, 0xC1, 0x86, 0x05, 0x1C, 0x13, 0xE0, 0x02, 
+	0xC0, 0x00, 0x00, 0x02, 0x00, 0x00, 0x40, 0xC0, 
+	0x80, 0xC0, 0xC0, 0xC0, 0x00, 0xC1, 0x40, 0xC1, 
+	0x80, 0xC1, 0xC0, 0xC1, 0x00, 0xC2, 0x40, 0xC2, 
+	0x80, 0xC2, 0xC0, 0xC2, 0x00, 0xC3, 0x40, 0xC3, 
+	0x80, 0xC3, 0xC0, 0xC3, 0xA0, 0x04, 0xAA, 0x00, 
+	0xD0, 0x03, 0xD0, 0x03, 0x3F, 0x10, 0x85, 0x05, 
+	0x85, 0x81, 0xE1, 0x13, 0xE4, 0x10, 0xC7, 0x05, 
+	0x05, 0x02, 0xFF, 0x7F, 0x45, 0xA1, 0xD0, 0x03, 
+	0xD0, 0x03, 0x34, 0x10, 0xC0, 0xCC, 0xC1, 0xC4, 
+	0x03, 0x02, 0x28, 0x00, 0xA0, 0x06, 0xDC, 0xEB, 
+	0xE0, 0x01, 0x42, 0x01, 0x00, 0x10, 0xC7, 0x05, 
+	0xD0, 0x03, 0xD0, 0x03, 0x27, 0x10, 0xC7, 0x05, 
+	0xA0, 0xC1, 0x4A, 0x01, 0xA0, 0x07, 0x4A, 0x01, 
+	0x00, 0x0E, 0xA0, 0x01, 0x40, 0x01, 0x00, 0x02, 
+	0x20, 0x07, 0x44, 0x01, 0x60, 0xC1, 0x44, 0x01, 
+	0x85, 0x02, 0x00, 0xFF, 0x17, 0x16, 0xE0, 0x01, 
+	0x40, 0x01, 0x00, 0x22, 0x05, 0x02, 0xC0, 0x00, 
+	0x05, 0x06, 0xD0, 0x03, 0xFD, 0x16, 0x60, 0xC1, 
+	0x46, 0x01, 0x85, 0x02, 0x00, 0xFF, 0x0A, 0x13, 
+	0x05, 0x02, 0x93, 0x33, 0x05, 0x06, 0x00, 0x10, 
+	0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 
+	0xD0, 0x03, 0xF8, 0x16, 0x51, 0x10, 0x06, 0xC8, 
+	0x4A, 0x01, 0xC0, 0xCC, 0xC1, 0xC4, 0x4B, 0x10, 
+	0x13, 0xC0, 0xC8, 0xCC, 0x53, 0xC0, 0x02, 0x02, 
+	0xEC, 0xEB, 0xC2, 0xC4, 0x43, 0x06, 0x5B, 0x04, 
+	0x60, 0xC0, 0xAE, 0x00, 0xC4, 0x02, 0x44, 0x02, 
+	0x0F, 0x00, 0x44, 0x88, 0xCA, 0xE4, 0x3C, 0x16, 
+	0x81, 0x02, 0x08, 0x00, 0x27, 0x13, 0x21, 0xC1, 
+	0xDC, 0xE4, 0x14, 0xC1, 0x21, 0x21, 0xBA, 0xE4, 
+	0x33, 0x16, 0x21, 0xC1, 0xC2, 0xE4, 0x81, 0x02, 
+	0x00, 0x00, 0x0B, 0x13, 0x0D, 0x02, 0xA0, 0x00, 
+	0x84, 0x83, 0x09, 0x13, 0xC4, 0x05, 0x84, 0x83, 
+	0x06, 0x13, 0xC4, 0x05, 0x84, 0x83, 0x03, 0x13, 
+	0x23, 0x10, 0x0E, 0x81, 0x21, 0x16, 0x21, 0xC1, 
+	0xDC, 0xE4, 0x21, 0x45, 0xBA, 0xE4, 0xE0, 0x01, 
+	0x42, 0x01, 0x00, 0x10, 0xA0, 0x01, 0x42, 0x01, 
+	0x00, 0x10, 0xA1, 0xC3, 0xD4, 0xE4, 0x0F, 0x02, 
+	0x2F, 0x00, 0x80, 0x03, 0xA0, 0x01, 0x40, 0x01, 
+	0x00, 0x02, 0xA0, 0x01, 0x40, 0x01, 0x00, 0x80, 
+	0x6D, 0xC0, 0x0A, 0x00, 0x09, 0x13, 0x81, 0x02, 
+	0x5C, 0x12, 0x06, 0x1B, 0x0E, 0x02, 0xD2, 0xEB, 
+	0x0F, 0x02, 0x0F, 0x00, 0x80, 0x03, 0xCA, 0x05, 
+	0xE0, 0x02, 0xA0, 0x00, 0x5A, 0x04, 0x59, 0xCE, 
+	0x20, 0x88, 0xE4, 0xE4, 0xE4, 0xE4, 0xF8, 0x10, 
+	0xC1, 0x04, 0x48, 0x62, 0x89, 0x05, 0xA0, 0xC0, 
+	0x6C, 0x01, 0x08, 0xC8, 0x6C, 0x01, 0x03, 0x02, 
+	0x00, 0xFC, 0x04, 0x02, 0x00, 0x02, 0x73, 0xA0, 
+	0x04, 0x06, 0xFD, 0x16, 0x88, 0x05, 0x09, 0x06, 
+	0xF4, 0x16, 0x02, 0xC8, 0x6C, 0x01, 0x81, 0x86, 
+	0x02, 0x16, 0xD0, 0x03, 0xCB, 0x05, 0x5B, 0x04, 
+	0x43, 0x28, 0x31, 0x29, 0x38, 0x39, 0x2D, 0x33, 
+	0x38, 0x38, 0x42, 0x20, 0x20, 0x59, 0x49, 0x54, 
+	0x4B, 0xC2, 0xA8, 0x02, 0x98, 0x00, 0x83, 0x07, 
+	0x02, 0x00, 0x28, 0x02, 0x08, 0x00, 0x23, 0xC6, 
+	0x36, 0xE5, 0x48, 0x06, 0xC4, 0xC0, 0x73, 0x0A, 
+	0x65, 0x17, 0xA0, 0x06, 0xAA, 0xED, 0xC8, 0xC1, 
+	0xC7, 0x05, 0x03, 0x02, 0xA5, 0x00, 0xB0, 0x03, 
+	0xF8, 0xCD, 0xF8, 0xCD, 0xA6, 0x02, 0x06, 0x62, 
+	0x88, 0x02, 0x0A, 0x00, 0x57, 0x16, 0x03, 0x29, 
+	0x55, 0x16, 0x05, 0x29, 0xC4, 0x80, 0x52, 0x16, 
+	0x15, 0x09, 0x50, 0x17, 0x15, 0x09, 0x4E, 0x18, 
+	0x85, 0x02, 0x29, 0x00, 0x4B, 0x16, 0xC6, 0x05, 
+	0x96, 0x00, 0x03, 0x07, 0xC4, 0x04, 0x45, 0x06, 
+	0x95, 0x00, 0x44, 0x05, 0x43, 0x16, 0x44, 0x81, 
+	0x41, 0x16, 0x00, 0x03, 0x05, 0x00, 0xC4, 0x02, 
+	0x00, 0x03, 0x0A, 0x00, 0x44, 0x02, 0x0F, 0x00, 
+	0x84, 0x02, 0x05, 0x00, 0x37, 0x16, 0xC4, 0x02, 
+	0x00, 0x03, 0x0F, 0x00, 0x44, 0x02, 0x0F, 0x00, 
+	0x84, 0x02, 0x0A, 0x00, 0x2F, 0x16, 0x04, 0x02, 
+	0xFE, 0xFF, 0x2C, 0x13, 0x2B, 0x15, 0x2A, 0x1A, 
+	0x84, 0x05, 0x28, 0x12, 0x27, 0x15, 0x26, 0x1A, 
+	0x25, 0x18, 0x84, 0x05, 0x23, 0x16, 0x22, 0x1B, 
+	0x21, 0x17, 0x84, 0x05, 0x1F, 0x13, 0x1E, 0x1A, 
+	0x1D, 0x11, 0x04, 0x06, 0x1B, 0x16, 0xA5, 0x02, 
+	0xC5, 0xC1, 0x25, 0x02, 0x06, 0x00, 0x03, 0x02, 
+	0xA5, 0xA5, 0x83, 0xC1, 0x95, 0x00, 0x03, 0x38, 
+	0x94, 0x00, 0x83, 0x02, 0x2E, 0x6B, 0x0E, 0x16, 
+	0x84, 0x02, 0x59, 0x1C, 0x0B, 0x16, 0x24, 0x02, 
+	0x69, 0x00, 0x95, 0x00, 0x03, 0x3C, 0x94, 0x00, 
+	0x83, 0x81, 0x04, 0x16, 0x84, 0x02, 0x69, 0x00, 
+	0x01, 0x16, 0xC9, 0x05, 0x59, 0x04, 0xC3, 0xD0, 
+	0xFD, 0x13, 0x01, 0x1C, 0xFB, 0x10, 0xE0, 0x90, 
+	0x3D, 0xE5, 0xF8, 0x16, 0xC3, 0x06, 0xC3, 0xD0, 
+	0xF5, 0x1C, 0xF4, 0x16, 0xE0, 0x90, 0x3A, 0xE5, 
+	0xF1, 0x16, 0x5B, 0x04, 0x0B, 0xC3, 0x09, 0x02, 
+	0x3E, 0xE5, 0xA0, 0x06, 0x92, 0xE9, 0xCC, 0x05, 
+	0x5C, 0x04, 0x88, 0x07, 0x00, 0xA0, 0x89, 0x07, 
+	0xFE, 0xFF, 0xA8, 0x09, 0xA9, 0x09, 0x8A, 0x07, 
+	0x02, 0xE0, 0xA0, 0x06, 0x84, 0xEC, 0x00, 0x00, 
+	0x88, 0x07, 0x00, 0x90, 0x89, 0x07, 0xFE, 0x9F, 
+	0xA8, 0x09, 0xA9, 0x09, 0x8A, 0x07, 0x78, 0xE0, 
+	0xA0, 0x06, 0x84, 0xEC, 0x00, 0x00, 0xA0, 0x06, 
+	0xC4, 0xEC, 0x00, 0x00, 0xE6, 0x10, 0xE5, 0x10, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,   
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x90, 
+	0x00, 0x08, 0x11, 0xE3, 0x6C, 0xCC, 0x00, 0x80, 
+	0x00, 0x40, 0x00, 0x20, 0x00, 0x10, 0x00, 0x08, 
+	0x00, 0x04, 0x00, 0x02, 0x00, 0x01, 0x80, 0x00, 
+	0x40, 0x00, 0x20, 0x00, 0x10, 0x00, 0x08, 0x00, 
+	0x04, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0xFF, 
+	0xFF, 0x00, 0xF0, 0xFF, 0x00, 0xF0, 0x0F, 0x00,  
+	0xFF, 0xFF, 0xFF, 0x7F, 0x03, 0x00, 0x00, 0x00,  
+	0xC3, 0x00, 0xE7, 0xE7, 0xF3, 0xE7, 0xF1, 0xF1, 
+	0x43, 0x28, 0x20, 0x29, 0x4F, 0x43, 0x59, 0x50, 
+	0x49, 0x52, 0x48, 0x47, 0x20, 0x54, 0x42, 0x49, 
+	0x20, 0x4D, 0x39, 0x31, 0x33, 0x38, 0x34, 0x2C, 
+	0x35, 0x2C, 0x36, 0x2C, 0x43, 0x28, 0x20, 0x29, 
+	0x4F, 0x43, 0x59, 0x50, 0x49, 0x52, 0x48, 0x47, 
+	0x20, 0x54, 0x49, 0x54, 0x31, 0x20, 0x38, 0x39, 
+	0x2D, 0x33, 0x39, 0x38, 0x39, 0x2C, 0x2D, 0x30, 
+	0x38, 0x39, 0x00, 0x00, 0x61, 0x9B, 0xC4, 0xEC, 
+	0x0E, 0xEA, 0xDE, 0xE5, 0xC8, 0xED, 0x00, 0x00, 
+	0xC4, 0x00, 0xB8, 0xAF, 0x4A, 0x06, 0x50, 0x06, 
+	0x4C, 0x06, 0xDC, 0xCC, 0x4E, 0x06, 0x0F, 0x00, 
+	0x32, 0x06, 0x01, 0x00, 0x50, 0x07, 0x58, 0x07, 
+	0x52, 0x07, 0x70, 0xB5, 0x54, 0x07, 0x0F, 0x00, 
+	0x38, 0x07, 0x01, 0x00, 0xBA, 0x00, 0xA0, 0x00, 
+	0xBC, 0x00, 0xD6, 0xED, 0xBE, 0x00, 0x0F, 0x00, 
+	0x5E, 0x07, 0x3A, 0x07, 0x62, 0x07, 0x40, 0x80, 
+	0x64, 0x07, 0x54, 0xBA, 0x66, 0x07, 0x36, 0xBA, 
+	0x68, 0x07, 0x40, 0xB8, 0x98, 0x07, 0x00, 0x80, 
+	0x78, 0x07, 0x00, 0x80, 0xE2, 0x08, 0x04, 0x00, 
+	0xE4, 0x08, 0x01, 0x00, 0xEC, 0x08, 0x08, 0x00, 
+	0xF6, 0x08, 0x0A, 0x00, 0xF8, 0x08, 0x06, 0x00, 
+	0x00, 0x09, 0x0C, 0x00, 0x02, 0x09, 0x04, 0x00, 
+	0xAE, 0x01, 0x00, 0x00, 0x1E, 0x09, 0x00, 0x00, 
+	0x66, 0x09, 0x00, 0x00, 0x0C, 0x06, 0x13, 0x00, 
+	0x0A, 0x06, 0x20, 0x00, 0x00, 0x00, 0xE0, 0x00, 
+	0x86, 0xA3, 0xE0, 0x00, 0xE6, 0xA2, 0xE0, 0x00, 
+	0x86, 0xA3, 0xE0, 0x00, 0x02, 0xA5, 0xE0, 0x00, 
+	0x5E, 0xA6, 0xE0, 0x00, 0x66, 0xA9, 0xE0, 0x00, 
+	0x12, 0xA4, 0xC0, 0x00, 0x22, 0xA4, 0xE0, 0x00, 
+	0x86, 0xA3, 0xE0, 0x00, 0x86, 0xA3, 0xC0, 0x00, 
+	0x74, 0xA4, 0xE0, 0x00, 0x86, 0xA3, 0xE0, 0x00, 
+	0x86, 0xA3, 0xE0, 0x00, 0x86, 0xA3, 0xE0, 0x00, 
+	0x86, 0xA3, 0xE0, 0x00, 0x86, 0xA3, 0xC0, 0x00, 
+	0xDE, 0xAF, 0xC0, 0x00, 0x48, 0xB0, 0xC0, 0x00, 
+	0x84, 0xB0, 0xC0, 0x00, 0xF4, 0xB0, 0xC0, 0x00, 
+	0x76, 0xB1, 0xE0, 0x00, 0xE4, 0xB2, 0xE0, 0x00, 
+	0x8A, 0xB2, 0xE0, 0x00, 0xF4, 0xB3, 0xE0, 0x00, 
+	0x7C, 0xB3, 0xE0, 0x00, 0xC6, 0xAA, 0xC0, 0x00, 
+	0x36, 0xAB, 0xC0, 0x00, 0x90, 0xAB, 0xC0, 0x00, 
+	0xC2, 0xAB, 0xC0, 0x00, 0xEA, 0xAA, 0xC0, 0x00, 
+	0x80, 0xA3, 0xC0, 0x00, 0x80, 0xA3, 0x00, 0x3F, 
+	0x00, 0x7F, 0x00, 0x5E, 0x30, 0x00, 0x28, 0x00, 
+	0x43, 0x00, 0xB6, 0xA6, 0xB6, 0xA6, 0x1C, 0xA5, 
+	0x14, 0xA5, 0x46, 0xA5, 0x46, 0xA5, 0x62, 0xA5, 
+	0xB6, 0xA6, 0x00, 0x40, 0x00, 0x00, 0x00, 0x20, 
+	0x00, 0x00, 0x00, 0x08, 0x00, 0x20, 0x00, 0x08, 
+	0x00, 0x80, 0x00, 0x08, 0x00, 0x01, 0x00, 0x10, 
+	0x00, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x10, 0x00, 
+	0x14, 0x00, 0x0E, 0x10, 0x0C, 0x0C, 0x0A, 0x0A, 
+	0x0A, 0x0A, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 
+	0x08, 0x08, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,  
+	0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 
+	0x06, 0x06, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04,  
+	0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 
+	0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 
+	0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 
+	0x04, 0x04, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 
+	0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 
+	0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 
+	0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 
+	0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 
+	0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 
+	0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 
+	0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 
+	0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x98, 0x07, 0x7E, 0xCA, 0x58, 0x07, 
+	0xF8, 0xB8, 0x58, 0x07, 0xFE, 0xB7, 0x58, 0x07, 
+	0x68, 0xB9, 0x58, 0x07, 0xD0, 0xB8, 0x98, 0x07, 
+	0x5A, 0xC7, 0x98, 0x07, 0x52, 0xC7, 0x78, 0x07, 
+	0xC2, 0xC1, 0x58, 0x07, 0x30, 0xB9, 0x98, 0x07, 
+	0x38, 0xCA, 0x78, 0x07, 0x96, 0xC2, 0x58, 0x07, 
+	0x6A, 0xC7, 0x58, 0x07, 0xE0, 0xB8, 0x58, 0x07, 
+	0x1E, 0xB9, 0x58, 0x07, 0xE2, 0xB9, 0x98, 0x07, 
+	0xAE, 0xCB, 0x98, 0x07, 0x8E, 0xC7, 0x78, 0x07, 
+	0x56, 0xC2, 0xB8, 0x07, 0x14, 0xCC, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0xA2, 0xBA, 0x16, 0xC1, 
+	0xCA, 0xC1, 0xD6, 0xC6, 0x8A, 0xBD, 0xC2, 0xBD, 
+	0xE0, 0xBD, 0x6A, 0xBE, 0x8E, 0xBE, 0xAA, 0xBE, 
+	0x22, 0xBF, 0x22, 0xBF, 0x56, 0xBE, 0xC8, 0xBF, 
+	0x10, 0xBE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2C, 
+	0x00, 0x0C, 0x01, 0x0F, 0xFF, 0xFE, 0x00, 0x58, 
+	0x00, 0x0E, 0xFF, 0xFE, 0x0E, 0x00, 0x00, 0x70, 
+	0x40, 0x80, 0x00, 0x5E, 0xA0, 0xC0, 0xDF, 0xFF, 
+	0x00, 0x18, 0x00, 0xE0, 0x00, 0x78, 0x00, 0x50, 
+	0x00, 0x60, 0x00, 0x70, 0x00, 0x0C, 0x06, 0x00, 
+	0x00, 0x00, 0x84, 0xE3, 0xE6, 0x07, 0xF4, 0x07, 
+	0x08, 0x00, 0x00, 0x00, 0x8A, 0xE3, 0xEA, 0x07, 
+	0xF4, 0x07, 0x06, 0x00, 0x40, 0x00, 0x00, 0x0A, 
+	0xE6, 0x07, 0xEE, 0x07, 0x08, 0x00, 0x40, 0x00, 
+	0x06, 0x0A, 0xEA, 0x07, 0xEE, 0x07, 0x00, 0x00, 
+	0xE2, 0xC1, 0x8B, 0xD4, 0xFF, 0xFF, 0xD7, 0xD1, 
+	0xD9, 0xC5, 0xD4, 0xC3, 0x3B, 0x59, 0x34, 0x09, 
+	0xFC, 0x05, 0x6C, 0x09, 0xD8, 0x06, 0x06, 0x04, 
+	0xBA, 0xEA, 0x30, 0x09, 0x48, 0x04, 0x80, 0x08, 
+	0x06, 0x00, 0x0A, 0x06, 0x0E, 0x0C, 0xBA, 0xCE, 
+	0x2E, 0xE0, 0x56, 0xE0, 0x50, 0xE1, 0x66, 0xE2, 
+	0xEC, 0xE2, 0x4C, 0xE3, 0xFE, 0xE3, 0xBA, 0xCE, 
+	0x80, 0xE4, 0x10, 0xE4, 0x14, 0xE0, 0x1C, 0xE4, 
+	0x1C, 0xE4, 0x46, 0xE5, 0x50, 0xE5, 0x5A, 0xE5, 
+	0xBA, 0xCE, 0xA6, 0xDC, 0xBA, 0xCE, 0x44, 0xDA, 
+	0xE6, 0xDF, 0x70, 0xDA, 0xDE, 0xDE, 0xB0, 0xCE, 
+	0x16, 0xDB, 0x3A, 0xDD, 0xB8, 0xDD, 0x34, 0xDE, 
+	0x58, 0xDE, 0x16, 0xDB, 0xDA, 0xDC, 0x08, 0xCF, 
+	0xB0, 0xCE, 0xA8, 0xD9, 0x8A, 0xD9, 0x44, 0xD9, 
+	0xB0, 0xCE, 0xEA, 0xDE, 0xB0, 0xCE, 0x72, 0x06, 
+	0xF6, 0xD2, 0x08, 0x07, 0x72, 0x06, 0x54, 0xD2, 
+	0xF4, 0x01, 0x72, 0x06, 0x34, 0xD2, 0x08, 0x07, 
+	0x7C, 0x06, 0x5A, 0xDC, 0x04, 0x00, 0x7C, 0x06, 
+	0x78, 0xD2, 0x00, 0x00, 0x7C, 0x06, 0xCC, 0xDE, 
+	0xFA, 0x00, 0x86, 0x06, 0xAC, 0xD1, 0x05, 0x00, 
+	0x90, 0x06, 0x1C, 0xDF, 0x28, 0x00, 0x90, 0x06, 
+	0x50, 0xD3, 0x04, 0x01, 0x90, 0x06, 0x00, 0x00, 
+	0x02, 0x00, 0x90, 0x06, 0x80, 0xD2, 0xBC, 0x02, 
+	0x9A, 0x06, 0x06, 0xD3, 0xDC, 0x05, 0x9A, 0x06, 
+	0xAA, 0xD2, 0x64, 0x00, 0x9A, 0x06, 0x0A, 0xD3, 
+	0x14, 0x00, 0x9A, 0x06, 0xE2, 0xE0, 0x40, 0x06, 
+	0x9A, 0x06, 0x12, 0xD3, 0x64, 0x00, 0x7C, 0x06, 
+	0x16, 0xDC, 0x04, 0x00, 0x7C, 0x06, 0xE6, 0xDA,  
+	0x16, 0x00, 0x7C, 0x06, 0xFA, 0xDB, 0x05, 0x00, 
+	0x7C, 0x06, 0x00, 0xDD, 0x14, 0x00, 0x9A, 0x06, 
+	0x7C, 0xD3, 0x14, 0x00, 0x9A, 0x06, 0x38, 0xD4, 
+	0x02, 0x00, 0x7C, 0x06, 0x0C, 0xE0, 0x19, 0x00, 
+	0x00, 0x00, 0x0A, 0x07, 0x0E, 0x07, 0x04, 0x07, 
+	0xD8, 0x06, 0x00, 0x07, 0xF0, 0x06, 0xEE, 0x06, 
+	0xEC, 0x06, 0x0C, 0x07, 0xE6, 0x06, 0x18, 0x07, 
+	0x92, 0x09, 0x94, 0x09, 0x96, 0x09, 0x98, 0x09, 
+	0x00, 0x50, 0xCC, 0x00, 0x03, 0x00, 0x00, 0x84, 
+	0x00, 0xA8, 0x00, 0xA0, 0x00, 0x20, 0x00, 0x80, 
+	0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 0x80, 
+	0x00, 0x40, 0x00, 0x10, 0x82, 0xEC, 0x48, 0xEB, 
+	0x62, 0xEB, 0x7C, 0xEB, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x09, 0x00, 0x09, 0x00, 0xEA, 0xEB, 
+	0x52, 0xEB, 0x68, 0xEB, 0x82, 0xEB, 0x40, 0x01, 
+	0x42, 0x01, 0x42, 0x01, 0x42, 0x01, 0x00, 0x00, 
+	0x7F, 0x00, 0xA0, 0x00, 0xFF, 0x00, 0x10, 0x02, 
+	0x1F, 0x02, 0x30, 0x02, 0x3F, 0x02, 0x50, 0x02, 
+	0x5F, 0x02, 0x70, 0x02, 0x7F, 0x02, 0x90, 0x02, 
+	0x9F, 0x02, 0xB0, 0x02, 0xBF, 0x02, 0xD0, 0x02, 
+	0xDF, 0x02, 0xE1, 0x02, 0xFF, 0x02, 0x01, 0x03, 
+	0x7F, 0x03, 0x81, 0x03, 0x8F, 0x03, 0x91, 0x03, 
+	0x9F, 0x03, 0xA1, 0x03, 0xAF, 0x03, 0xB1, 0x03, 
+	0xBF, 0x03, 0xC1, 0x03, 0xCF, 0x03, 0xE1, 0x03, 
+	0xFF, 0x03, 0xC0, 0x07, 0xFF, 0x07, 0x00, 0x0C, 
+	0xFF, 0x0F, 0x00, 0x30, 0xFF, 0x37, 0xFF, 0xFF, 
+	0xFF, 0xFF, 0xBC, 0xFE, 0x07, 0x00, 0x5E, 0x02, 
+	0x00, 0x01, 0xFF, 0xBA, 0x80, 0xBA, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x0C, 0x01, 0x0A, 0x01, 
+	0x0E, 0x01, 0x10, 0x01, 0x14, 0x01, 0x00, 0x00, 
+	0x12, 0x01, 0x00, 0xF8, 0x16, 0x01, 0x00, 0xFF, 
+	0x00, 0x00, 0x00, 0x00, 0x0A, 0x01, 0x1C, 0x01, 
+	0x82, 0x01, 0x66, 0x96, 0x66, 0x96, 0x55, 0x55, 
+	0x00, 0x00, 0x82, 0x01, 0x2A, 0x8A, 0x2A, 0x8A, 
+	0x18, 0xC9, 0x18, 0xC9, 0x86, 0x01, 0xAA, 0xA2, 
+	0x1E, 0xA0, 0x55, 0x55, 0x1E, 0x54, 0x8A, 0x01, 
+	0x00, 0x50, 0x00, 0x00, 0x00, 0xA8, 0x00, 0x00, 
+	0x8C, 0x01, 0x00, 0x50, 0x00, 0x00, 0x00, 0xA8, 
+	0x00, 0x00, 0x8E, 0x01, 0x00, 0x50, 0x00, 0x00, 
+	0x00, 0xA8, 0x00, 0x00, 0x90, 0x01, 0x00, 0x50, 
+	0x00, 0x00, 0x00, 0xA8, 0x00, 0x00, 0x92, 0x01, 
+	0x00, 0x50, 0x00, 0x00, 0x00, 0xA8, 0x00, 0x00, 
+	0x94, 0x01, 0x00, 0x50, 0x00, 0x00, 0x00, 0xA8, 
+	0x00, 0x00, 0x96, 0x01, 0x00, 0x50, 0x00, 0x00, 
+	0x00, 0xA8, 0x00, 0x00, 0x98, 0x01, 0x00, 0x50, 
+	0x00, 0x00, 0x00, 0xA8, 0x00, 0x00, 0x9A, 0x01, 
+	0x00, 0x50, 0x00, 0x00, 0x00, 0xA8, 0x00, 0x00, 
+	0x9C, 0x01, 0x55, 0x55, 0xC0, 0x7F, 0xAA, 0xAA, 
+	0xC0, 0x7F, 0x00, 0x00, 0xA2, 0x01, 0xA4, 0x01, 
+	0xA8, 0x01, 0xAA, 0x01, 0xAE, 0x01, 0xB0, 0x01, 
+	0xB2, 0x01, 0x80, 0x01, 0x00, 0x00, 0x88, 0x01, 
+	0x00, 0xFF, 0x9E, 0x01, 0xFF, 0x00, 0xA0, 0x01, 
+	0x00, 0x80, 0xAC, 0x01, 0x00, 0x80, 0x00, 0x00, 
+	0xA6, 0x01, 0x00, 0x80, 0x00, 0x00, 0x80, 0x01, 
+	0xBC, 0x01, 0x00, 0x88, 0x00, 0x06, 0x00, 0xC8, 
+	0x00, 0x00, 0x00, 0x80, 0x30, 0x00, 0x00, 0x00, 
+	0x00, 0x80, 0x02, 0x00, 0x44, 0x00, 0x92, 0xEA, 
+	0x48, 0x00, 0x98, 0xEA, 0x50, 0x00, 0x9E, 0xEA, 
+	0x60, 0x00, 0xA4, 0xEA, 0x78, 0x00, 0xAA, 0xEA, 
+	0x0A, 0xE8, 0x18, 0xE7, 0x3C, 0xEA, 0x2A, 0xE7, 
+	0x14, 0x55, 0xA0, 0x01, 0xEC, 0xE6, 0xD0, 0xE9, 
+	0x46, 0xE7, 0xA0, 0xE7, 0x00, 0xE7, 0x58, 0xE8, 
+	0x00, 0x00, 0x1E, 0x00, 0x46, 0xE7, 0x92, 0xE7, 
+	0x00, 0x41, 0x01, 0x41, 0xB6, 0xE7, 0x73, 0xEA, 
+	0x18, 0xE7, 0x48, 0xEA, 0xEC, 0xE6, 0x04, 0xEA, 
+	0x56, 0xE7, 0x62, 0xE7, 0xB6, 0xE7, 0x6E, 0xEA, 
+	0x62, 0xE8, 0x00, 0x00, 0x36, 0xE8, 0xEC, 0xE6, 
+	0xFA, 0xE9, 0x56, 0xE7, 0x62, 0xE7, 0x36, 0xE8, 
+	0x62, 0xE8, 0x00, 0x00, 0xEC, 0xE6, 0xF0, 0xE9, 
+	0x0C, 0xE7, 0x4A, 0xE7, 0x62, 0xE7, 0x36, 0xE8, 
+	0xEC, 0xE6, 0xFA, 0xE9, 0x56, 0xE7, 0x62, 0xE7, 
+	0x36, 0xE8, 0x62, 0xE8, 0x00, 0x20, 0x2A, 0xE7, 
+	0x14, 0x55, 0xA0, 0x01, 0x18, 0xE7, 0x50, 0xEA, 
+	0xEC, 0xE6, 0xD0, 0xE9, 0x58, 0xE8, 0x50, 0x55, 
+	0x0C, 0x00, 0x46, 0xE7, 0x92, 0xE7, 0x00, 0x01, 
+	0x00, 0x00, 0xB6, 0xE7, 0x75, 0xEA, 0x00, 0xE7, 
+	0x58, 0xE8, 0x55, 0x55, 0x0C, 0x00, 0x56, 0xE7, 
+	0xA0, 0xE7, 0x00, 0xE7, 0x58, 0xE8, 0xFF, 0xFF, 
+	0x08, 0x00, 0x58, 0xE8, 0x02, 0x10, 0x06, 0x00, 
+	0x46, 0xE7, 0x92, 0xE7, 0x00, 0x01, 0x01, 0x01, 
+	0xB6, 0xE7, 0x80, 0xEA, 0x00, 0xE7, 0x58, 0xE8, 
+	0x00, 0xC0, 0x08, 0x00, 0x58, 0xE8, 0xFF, 0xFF, 
+	0x0A, 0x00, 0x58, 0xE8, 0xFF, 0xFF, 0x0C, 0x00, 
+	0x58, 0xE8, 0x0D, 0x10, 0x06, 0x00, 0x46, 0xE7, 
+	0x92, 0xE7, 0x00, 0x01, 0x01, 0x01, 0xB6, 0xE7, 
+	0x74, 0xEA, 0x62, 0xE8, 0x08, 0x20, 0x00, 0xE7, 
+	0x52, 0xE8, 0x82, 0x01, 0x02, 0xC9, 0x46, 0xE7, 
+	0xB6, 0xE7, 0x80, 0xEA, 0x62, 0xE8, 0x34, 0x20, 
+	0x00, 0xE7, 0x58, 0xE8, 0x00, 0x10, 0x06, 0x00, 
+	0x46, 0xE7, 0xC6, 0xE8, 0xB6, 0xE7, 0x78, 0xEA, 
+	0x52, 0xE8, 0x9C, 0x01, 0x40, 0x00, 0x18, 0xE7, 
+	0x50, 0xEA, 0x2A, 0xE7, 0xFF, 0x00, 0x80, 0x07, 
+	0x26, 0xE9, 0x03, 0x00, 0x66, 0xE9, 0x74, 0xE9, 
+	0x12, 0xEA, 0x38, 0xE9, 0x00, 0x00, 0x74, 0xE9, 
+	0x1C, 0xEA, 0x38, 0xE9, 0x04, 0x00, 0x74, 0xE9, 
+	0x24, 0xEA, 0x38, 0xE9, 0x07, 0x00, 0x74, 0xE9, 
+	0x2C, 0xEA, 0x26, 0xE9, 0x01, 0x00, 0x74, 0xE9, 
+	0x34, 0xEA, 0x38, 0xE9, 0x02, 0x00, 0x74, 0xE9, 
+	0x34, 0xEA, 0x38, 0xE9, 0x06, 0x00, 0x74, 0xE9, 
+	0x34, 0xEA, 0x38, 0xE9, 0x05, 0x00, 0x74, 0xE9, 
+	0x34, 0xEA, 0x26, 0xE9, 0x01, 0x00, 0x4A, 0xE9, 
+	0x26, 0xE9, 0x03, 0x00, 0x58, 0xE9, 0x62, 0xE7, 
+	0xE6, 0xE8, 0xD8, 0xE9, 0x01, 0x00, 0xE6, 0xE8, 
+	0x25, 0xEA, 0x02, 0x00, 0xE6, 0xE8, 0x2F, 0xEA, 
+	0x06, 0x00, 0xE6, 0xE8, 0x3A, 0xEA, 0x05, 0x00, 
+	0xB6, 0xE7, 0x74, 0xEA, 0x36, 0xE8, 0xEC, 0xE6, 
+	0xD0, 0xE9, 0x56, 0xE7, 0xC6, 0xE8, 0x0C, 0xE7, 
+	0x92, 0xE7, 0x00, 0x01, 0x00, 0x80, 0xB6, 0xE7, 
+	0x78, 0xEA, 0x00, 0xE7, 0xFE, 0xE8, 0x52, 0xE8, 
+	0x80, 0x01, 0x41, 0x8E, 0x4A, 0xE7, 0x92, 0xE7, 
+	0x00, 0x01, 0x01, 0x1B, 0x06, 0xE9, 0xE4, 0xFF, 
+	0xB6, 0xE7, 0x7C, 0xEA, 0xBE, 0xE8, 0x18, 0xE7, 
+	0x56, 0xEA, 0x0C, 0xE7, 0x6A, 0xE8, 0x3C, 0xE7, 
+	0x00, 0xE0, 0xC6, 0xE8, 0xB6, 0xE7, 0x86, 0xEA, 
+	0x3C, 0xE7, 0x00, 0xE8, 0x62, 0xE7, 0xB6, 0xE7, 
+	0x85, 0xEA, 0x3C, 0xE7, 0x00, 0x08, 0xC6, 0xE8, 
+	0xB6, 0xE7, 0x86, 0xEA, 0x3C, 0xE7, 0x00, 0xF8, 
+	0x62, 0xE7, 0xB6, 0xE7, 0x85, 0xEA, 0x52, 0xE8, 
+	0x80, 0x01, 0x00, 0x02, 0x3C, 0xE7, 0x00, 0xE0, 
+	0x62, 0xE7, 0xB6, 0xE7, 0x85, 0xEA, 0x52, 0xE8, 
+	0x84, 0x01, 0x00, 0x00, 0x62, 0xE8, 0x34, 0x00, 
+	0x3C, 0xE7, 0x00, 0x00, 0xC6, 0xE8, 0x62, 0xE8, 
+	0x34, 0x60, 0x0E, 0xE9, 0x52, 0xE8, 0x84, 0x01, 
+	0x00, 0x00, 0xB6, 0xE7, 0x86, 0xEA, 0x52, 0xE8, 
+	0x82, 0x01, 0x00, 0xC8, 0x3C, 0xE7, 0x00, 0xE0, 
+	0xC6, 0xE8, 0x3C, 0xE7, 0x00, 0x10, 0xC6, 0xE8, 
+	0x62, 0xE8, 0x34, 0x60, 0x52, 0xE8, 0x80, 0x01, 
+	0x00, 0x06, 0x3C, 0xE7, 0x10, 0x00, 0x78, 0xE8, 
+	0x36, 0xE8, 0x52, 0xE8, 0x84, 0x01, 0x00, 0x00, 
+	0x62, 0xE8, 0x34, 0x00, 0xEC, 0xE6, 0xD0, 0xE9, 
+	0x18, 0xE7, 0x5C, 0xEA, 0xD0, 0xE8, 0x92, 0xE9, 
+	0x00, 0xE7, 0x0C, 0xE7, 0x70, 0xE7, 0x40, 0xF0, 
+	0x06, 0x00, 0x00, 0xC7, 0xA0, 0xE7, 0xDC, 0xE8, 
+	0x00, 0xE0, 0x00, 0xE7, 0x0C, 0xE7, 0x70, 0xE7, 
+	0x40, 0xD0, 0x06, 0x00, 0x00, 0xE0, 0xA0, 0xE7, 
+	0xDC, 0xE8, 0x00, 0xC0, 0x00, 0xE7, 0x0C, 0xE7, 
+	0x70, 0xE7, 0x40, 0x90, 0x06, 0x00, 0x00, 0xA0, 
+	0xA0, 0xE7, 0xDC, 0xE8, 0x00, 0x80, 0x00, 0xE7, 
+	0x0C, 0xE7, 0x70, 0xE7, 0x40, 0x50, 0x06, 0x00, 
+	0x00, 0x60, 0xA0, 0xE7, 0xDC, 0xE8, 0x00, 0x40, 
+	0x00, 0xE7, 0x0C, 0xE7, 0x70, 0xE7, 0x40, 0x10, 
+	0x06, 0x00, 0x00, 0x20, 0xA0, 0xE7, 0xDC, 0xE8,  
+	0x00, 0x00, 0xD0, 0xE8, 0x92, 0xE9, 0x00, 0xE7,  
+	0x0C, 0xE7, 0x70, 0xE7, 0x40, 0xD0, 0x06, 0x00, 
+	0x00, 0xA6, 0xA0, 0xE7, 0xDC, 0xE8, 0x00, 0xC0, 
+	0x00, 0xE7, 0x0C, 0xE7, 0x70, 0xE7, 0x40, 0x90, 
+	0x06, 0x00, 0x00, 0xC0, 0xA0, 0xE7, 0xDC, 0xE8, 
+	0x00, 0x80, 0x00, 0xE7, 0x0C, 0xE7, 0x70, 0xE7, 
+	0x40, 0x50, 0x06, 0x00, 0x00, 0x40, 0xA0, 0xE7, 
+	0xDC, 0xE8, 0x00, 0x40, 0x00, 0xE7, 0x0C, 0xE7, 
+	0x70, 0xE7, 0x40, 0x70, 0x06, 0x00, 0x00, 0x60, 
+	0xA0, 0xE7, 0xDC, 0xE8, 0x00, 0x60, 0x7E, 0xE9, 
+	0x90, 0xE9, 0x18, 0xE7, 0x62, 0xEA, 0xEC, 0xE6, 
+	0xD0, 0xE9, 0xA4, 0xE8, 0x55, 0x55, 0x16, 0x00, 
+	0x46, 0xE7, 0x92, 0xE7, 0x00, 0x00, 0x00, 0x00, 
+	0xB6, 0xE7, 0x8B, 0xEA, 0x0A, 0xE8, 0x18, 0xE7, 
+	0x62, 0xEA, 0x58, 0xE8, 0x55, 0x55, 0x16, 0x00, 
+	0x00, 0xE7, 0x46, 0xE7, 0xA0, 0xE7, 0x2A, 0xE7, 
+	0xFF, 0x00, 0x00, 0x08, 0x2A, 0xE7, 0xFF, 0x00, 
+	0x00, 0x0C, 0x2A, 0xE7, 0xFF, 0x00, 0x00, 0x10,  
+	0x2A, 0xE7, 0xFF, 0x00, 0x00, 0x14, 0x2A, 0xE7, 
+	0xFF, 0x00, 0x00, 0x18, 0x2A, 0xE7, 0xFF, 0x00, 
+	0x00, 0x1C, 0x2A, 0xE7, 0xFF, 0x00, 0x00, 0x20, 
+	0x2A, 0xE7, 0xFF, 0x00, 0x00, 0x24, 0x2A, 0xE7, 
+	0xFF, 0x00, 0x00, 0x28, 0x2A, 0xE7, 0xFF, 0x00, 
+	0x00, 0x2C, 0xD2, 0xE7, 0x00, 0xE7, 0x0C, 0xE7, 
+	0x70, 0xE7, 0x40, 0x30, 0x06, 0x00, 0x00, 0x01, 
+	0xA0, 0xE7, 0xDC, 0xE8, 0x00, 0x20, 0x00, 0xE7, 
+	0x0C, 0xE7, 0x70, 0xE7, 0x40, 0x70, 0x06, 0x00, 
+	0x00, 0x43, 0xA0, 0xE7, 0xDC, 0xE8, 0x00, 0x60, 
+	0x00, 0xE7, 0x0C, 0xE7, 0x70, 0xE7, 0x40, 0xB0, 
+	0x06, 0x00, 0x00, 0x85, 0xA0, 0xE7, 0xDC, 0xE8, 
+	0x00, 0xA0, 0xD8, 0xE8, 0x00, 0x01, 0x03, 0x01, 
+	0x01, 0x01, 0x00, 0x00, 0x00, 0x81, 0x1A, 0x00, 
+	0x40, 0x10, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 
+	0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x72, 0x82, 
+	0x4A, 0xA9, 0xA5, 0x5A, 0xDA, 0xE7, 0x03, 0x09, 
+	0x11, 0x9D, 0x00, 0x00, 0x00, 0x81, 0x04, 0x00, 
+	0xD8, 0x90, 0x00, 0x10, 0x00, 0x00, 0x00, 0x81, 
+	0x04, 0x00, 0xD8, 0x90, 0xD8, 0xB4, 0x00, 0x00, 
+	0x00, 0x81, 0x08, 0x00, 0xD8, 0x90, 0x46, 0x16, 
+	0x00, 0x40, 0xD8, 0xB4, 0x08, 0x00, 0x00, 0x00, 
+	0x00, 0x80, 0x13, 0x00, 0x40, 0x10, 0x16, 0x00, 
+	0x00, 0x00, 0x00, 0x80, 0x10, 0x00, 0x15, 0x00, 
+	0x00, 0x00, 0x00, 0x80, 0x0F, 0x00, 0x15, 0x00, 
+	0x00, 0x00, 0x00, 0x81, 0x0F, 0x00, 0x06, 0x00, 
+	0x00, 0x00, 0x00, 0x80, 0x12, 0x00, 0x0A, 0x80, 
+	0x40, 0x9E, 0x00, 0xC8, 0x00, 0x00, 0x5E, 0x80, 
+	0x0F, 0x00, 0x06, 0x80, 0x40, 0xFE, 0x00, 0xCC, 
+	0x00, 0x00, 0x04, 0x80, 0x40, 0x8E, 0x00, 0xC9, 
+	0x04, 0x80, 0x00, 0x06, 0x00, 0xCC, 0x04, 0x80, 
+	0x40, 0x0A, 0x00, 0xC8, 0x0A, 0x80, 0x40, 0x8A, 
+	0x00, 0xC8, 0x00, 0x00, 0x5E, 0x80, 0x0F, 0x00, 
+	0x0A, 0x08, 0x80, 0x1C, 0x0A, 0x00, 0x1C, 0x1A, 
+	0x00, 0x80, 0x1C, 0x0C, 0x00, 0x80, 0x1C, 0x1A, 
+	0x00, 0x80, 0x1A, 0x0E, 0x80, 0x1C, 0x04, 0x00, 
+	0x00, 0x80, 0x80, 0x02, 0x02, 0x00, 0x00, 0x80, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x80, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 
+	0x40, 0x00, 0x00, 0x00, 0x58, 0x07, 0x0C, 0xB8, 
+	0x16, 0xE0, 0xE2, 0x08, 0xEC, 0x08, 0xF6, 0x08, 
+	0x16, 0xE0, 0x00, 0x09, 0x0A, 0x09, 0x00, 0x00, 
+	0x00, 0x00, 0xE2, 0x08, 0x00, 0x00, 0xEC, 0x08, 
+	0xF6, 0x08, 0x00, 0x09, 0x00, 0x00, 0xB8, 0x07, 
+	0xCA, 0xCB, 0x80, 0x02, 0xB8, 0x07, 0xE8, 0xCB, 
+	0x84, 0xFF, 0xB8, 0x07, 0x0A, 0xCC, 0xB8, 0x07, 
+	0x84, 0xCC, 0x6E, 0xCD, 0x62, 0xCD, 0x88, 0xCD, 
+	0x90, 0xCE, 0x84, 0xCD, 0x92, 0xCE, 0x92, 0xCE, 
+	0x92, 0xCE, 0x8C, 0xCD, 0x96, 0xCD, 0x38, 0xCE, 
+	0x82, 0xCE, 0x92, 0xCE, 0x92, 0xCE, 0x92, 0xCE, 
+	0x92, 0xCE, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x08, 0x00, 0x08, 0x01, 0x05, 0x08, 
+	0x08, 0x08, 0x03, 0x08, 0x03, 0x03, 0x03, 0x03, 
+	0x00, 0x00, 0x04, 0x02, 0x04, 0x04, 0x00, 0x04, 
+	0x0A, 0x08, 0x00, 0x00, 0x10, 0x0C, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x18, 0x00, 0x1A, 0x00, 0x00, 
+	0x04, 0x41, 0x06, 0x0B, 0x08, 0xC2, 0x00, 0xE6, 
+	0x00, 0xE7, 0x04, 0x06, 0x04, 0x07, 0x04, 0x03, 
+	0x06, 0x04, 0x04, 0x05, 0x04, 0x88, 0x04, 0xCF, 
+	0x04, 0xCD, 0x03, 0x00, 0x05, 0x00, 0x1C, 0x00, 
+	0x00, 0x0C, 0x00, 0x80, 0xD2, 0xD8, 0xDA, 0xD8, 
+	0x1E, 0xD9, 0xDE, 0xD8, 0xEA, 0xD8, 0xF0, 0xD8, 
+	0x14, 0xD9, 0xE4, 0xD8, 0x32, 0xD9, 0x00, 0x06, 
+	0x00, 0x00, 0x03, 0x07, 0x0A, 0x0E, 0x0F, 0x14, 
+	0x26, 0x2A, 0x52, 0x42, 0x50, 0x48, 0x5D, 0x4D, 
+	0x62, 0x62, 0x6D, 0x57, 0x46, 0x39, 0x1A, 0x1D, 
+	0x7C, 0x76, 0x1F, 0x23, 0x15, 0x1D, 0x74, 0x6F, 
+	0x84, 0x7C, 0x8B, 0x82, 0x92, 0x89, 0x00, 0x00, 
+	0x32, 0x2F, 0x3F, 0x34, 0x32, 0x01, 0x01, 0x57, 
+	0x32, 0x11, 0x81, 0x51, 0x02, 0x56, 0x03, 0x55, 
+	0x54, 0x11, 0x56, 0x81, 0x55, 0x02, 0x54, 0x02, 
+	0x56, 0x81, 0x01, 0x76, 0x02, 0x34, 0x02, 0x55, 
+	0x81, 0x54, 0x02, 0x58, 0x02, 0x55, 0x81, 0x54, 
+	0x02, 0x58, 0x11, 0x12, 0x02, 0x52, 0x58, 0x83, 
+	0x52, 0x05, 0x83, 0x04, 0x02, 0x58, 0x08, 0x55, 
+	0x58, 0x83, 0x55, 0x02, 0x81, 0x02, 0x05, 0x58, 
+	0x03, 0x52, 0x5C, 0x15, 0x53, 0x5B, 0x52, 0x87, 
+	0x11, 0x03, 0x41, 0x51, 0x78, 0x51, 0x34, 0x11, 
+	0x81, 0x11, 0x20, 0x31, 0x54, 0x57, 0x01, 0x53, 
+	0x5A, 0x12, 0x81, 0x51, 0x20, 0x31, 0x5B, 0x57, 
+	0x01, 0x5A, 0x01, 0x11, 0x51, 0x11, 0x31, 0x81, 
+	0x57, 0x20, 0x15, 0x01, 0x13, 0x01, 0x11, 0x01, 
+	0x11, 0x11, 0x81, 0x51, 0x05, 0x58, 0x02, 0x52, 
+	0x5B, 0x54, 0x5D, 0x81, 0x52, 0x05, 0x54, 0x02, 
+	0x58, 0x81, 0x50, 0x02, 0x13, 0x03, 0x58, 0x81, 
+	0x50, 0x02, 0x11, 0x03, 0x81, 0x54, 0x72, 0x5D, 
+	0x50, 0x03, 0x13, 0x03, 0x13, 0x01, 0x40, 0x54, 
+	0x0E, 0x00, 0x20, 0x06, 0x56, 0x06, 0x0C, 0xDA, 
+	0x24, 0x00, 0x02, 0x10, 0x16, 0x00, 0x02, 0x00, 
+	0x01, 0x04, 0x08, 0x07, 0x0C, 0xDA, 0x20, 0x00, 
+	0x03, 0x10, 0x12, 0x00, 0x03, 0x00, 0x4E, 0xD9, 
+	0x14, 0x8E, 0x20, 0x00, 0x04, 0x10, 0x12, 0x00, 
+	0x04, 0x00, 0xD2, 0xCE, 0x20, 0x00, 0x05, 0xE0, 
+	0x12, 0x00, 0x05, 0x00, 0xD2, 0xCE, 0x20, 0x00, 
+	0x06, 0xE0, 0x12, 0x00, 0x06, 0x00, 0xE8, 0xDD, 
+	0x12, 0x00, 0x01, 0xE0, 0x6C, 0x09, 0xCC, 0x06, 
+	0x04, 0x00, 0x07, 0x00, 0x00, 0x00, 0x30, 0x06, 
+	0x42, 0xDC, 0xF0, 0x05, 0x00, 0xE0, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0xE2, 0x05, 0x08, 0x00, 
+	0x26, 0xFF, 0xDC, 0x05, 0x00, 0x00, 0x30, 0x06, 
+	0xF8, 0xDB, 0x1E, 0x00, 0x01, 0xE0, 0x10, 0x00, 
+	0x11, 0x30, 0x0C, 0x04, 0x01, 0x00, 0x0E, 0x04, 
+	0x02, 0x00, 0x21, 0x04, 0x00, 0x00, 0x00, 0x00, 
+	0x30, 0x06, 0x32, 0xDD, 0x12, 0x00, 0x01, 0xE0, 
+	0x04, 0x00, 0x13, 0x30, 0x74, 0xDE, 0x3E, 0x00, 
+	0x00, 0xE0, 0x00, 0xC0, 0x00, 0x00, 0x02, 0x00, 
+	0x30, 0x00, 0x20, 0x50, 0x23, 0x0C, 0xFC, 0x05, 
+	0x52, 0x06, 0x56, 0x06, 0x00, 0x00, 0x00, 0x81, 
+	0x16, 0x00, 0x00, 0xE0, 0x00, 0xC0, 0x00, 0x00, 
+	0x10, 0x00, 0x08, 0x00, 0x2A, 0x40, 0x2A, 0x04, 
+	0x56, 0x06, 0x26, 0x00, 0x19, 0xED, 0x2B, 0x06, 
+	0x72, 0x09, 0x22, 0x00, 0x24, 0x00, 0x2F, 0xED, 
+	0x23, 0x0C, 0xFC, 0x05, 0x28, 0x08, 0x34, 0x09, 
+	0x29, 0x08, 0x58, 0x07, 0x78, 0x07, 0x98, 0x07, 
+	0x23, 0x00, 0x2A, 0x00, 0x3D, 0xED, 0x06, 0x04, 
+	0xF0, 0x06, 0x07, 0x04, 0xEE, 0x06, 0x24, 0x00, 
+	0xD2, 0xCE, 0x34, 0x00, 0x00, 0xE0, 0x00, 0xC0, 
+	0x00, 0x00, 0x10, 0x00, 0x26, 0x00, 0x25, 0x40, 
+	0xD2, 0xCE, 0x20, 0x00, 0x00, 0xE0, 0x00, 0xC0, 
+	0x00, 0x00, 0x10, 0x00, 0x12, 0x00, 0x26, 0x40, 
+	0xD2, 0xCE, 0x1A, 0x00, 0x00, 0xE0, 0x0C, 0x00, 
+	0x27, 0x60, 0x0A, 0x08, 0xE6, 0x06, 0xD2, 0xCE, 
+	0x24, 0x00, 0x00, 0xE0, 0x16, 0x00, 0x28, 0x60, 
+	0x30, 0x04, 0x06, 0x07, 0x52, 0xCF, 0x00, 0x81, 
+	0x30, 0x00, 0x00, 0xE0, 0x22, 0x00, 0x29, 0x60, 
+	0x2D, 0x08, 0x1C, 0x07, 0x2E, 0x08, 0x22, 0x07, 
+	0x00, 0x00, 0x08, 0x02, 0x06, 0x01, 0x14, 0x06, 
+	0x18, 0x08, 0x20, 0x0C, 0x26, 0x0E, 0x30, 0x0F, 
+	0x34, 0x11, 0x3E, 0x12, 0x42, 0x14, 0x46, 0x16, 
+	0x1C, 0x0A, 0x4A, 0x18, 0x13, 0x03, 0x11, 0x83, 
+	0x01, 0x11, 0x11, 0x81, 0x12, 0x81, 0x13, 0x01, 
+	0x52, 0x83, 0x81, 0x85, 0x85, 0x11, 0x12, 0x81, 
+	0x12, 0x81, 0x19, 0x81, 0x60, 0x85, 0x00, 0xC0, 
+	0x00, 0x00, 0x08, 0x00, 0x6C, 0x09, 0x00, 0x00, 
+	0x30, 0x06, 0x08, 0xE5, 0x54, 0x06, 0x50, 0x06, 
+	0x38, 0x02, 0x21, 0x04, 0x1E, 0x09, 0x0B, 0x06, 
+	0xD8, 0x06, 0x02, 0x08, 0xDC, 0x06, 0x00, 0xC0, 
+	0xFF, 0xFF, 0xFF, 0xFF, 0x41, 0x00, 0x41, 0x00, 
+	0x14, 0xAE, 0x00, 0x00, 0x00, 0x81, 0x09, 0x04, 
+	0x0C, 0x07, 0x41, 0x00, 0x41, 0x00, 0x14, 0x02, 
+	0x00, 0x00, 0x00, 0x81, 0x0B, 0x06, 0xD8, 0x06, 
+	0x2C, 0x06, 0x76, 0x09, 0x22, 0x14, 0x3A, 0x09, 
+	0x41, 0x00, 0x41, 0x00, 0x54, 0x02, 0x00, 0x00, 
+	0x00, 0x81, 0xD8, 0x06, 0x00, 0x84, 0x00, 0x48, 
+	0xFC, 0xFF, 0x09, 0x00, 0x00, 0xC0, 0x00, 0x00, 
+	0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0xB8, 0xFF, 0x20, 0x00, 
+	0x43, 0x28, 0x31, 0x29, 0x38, 0x39, 0x2D, 0x33, 
+	0x39, 0x38, 0x39, 0x2C, 0x2D, 0x30, 0x38, 0x39, 
+	0x54, 0x20, 0x78, 0x65, 0x73, 0x61, 0x49, 0x20, 
+	0x73, 0x6E, 0x72, 0x74, 0x6D, 0x75, 0x6E, 0x65, 
+	0x73, 0x74, 0x28, 0x0A, 0x29, 0x43, 0x39, 0x31, 
+	0x33, 0x38, 0x34, 0x2C, 0x35, 0x2C, 0x36, 0x2C, 
+	0x49, 0x20, 0x4D, 0x42, 0x43, 0x20, 0x72, 0x6F, 
+	0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0xF8, 0xFF, 0x01, 0x00, 0x34, 0x90, 
+	0x00, 0x00, 0xFA, 0xFF, 0x01, 0x00, 0xB8, 0xFF, 
+	0x00, 0x00, 0xFC, 0xFF, 0x02, 0x00, 0x80, 0x00, 
+	0x3E, 0xA0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00  
+};
+#endif /* CONFIG_SKTR */
diff -u --recursive --new-file v2.1.106/linux/drivers/net/tlan.c linux/drivers/net/tlan.c
--- v2.1.106/linux/drivers/net/tlan.c	Sun Jun  7 11:16:32 1998
+++ linux/drivers/net/tlan.c	Wed Jun 24 14:34:43 1998
@@ -1754,7 +1754,7 @@
 	 *		areg	The AREG to set the address in (0 - 3).
 	 *		mac	A pointer to an array of chars.  Each
 	 *			element stores one byte of the address.
-	 *			IE, it isn't in ascii.
+	 *			That is, it isn't in ASCII.
 	 *
 	 *	This function transfers a MAC address to one of the
 	 *	TLAN AREGs (address registers).  The TLAN chip locks
@@ -2654,7 +2654,7 @@
 	 *
 	 *	Returns:
 	 *		No error = 0, else, the stage at which the error
-	 *		occured.
+	 *		occurred.
 	 *	Parms:
 	 *		io_base		The IO port base address for the
 	 *				TLAN device with the EEPROM to
diff -u --recursive --new-file v2.1.106/linux/drivers/sbus/audio/cs4215.h linux/drivers/sbus/audio/cs4215.h
--- v2.1.106/linux/drivers/sbus/audio/cs4215.h	Mon Jan 12 15:15:45 1998
+++ linux/drivers/sbus/audio/cs4215.h	Wed Jun 24 14:30:09 1998
@@ -61,7 +61,7 @@
 };
 #define CS4215_HPF	(1<<7)	/* High Pass Filter, 1: Enabled */
 
-#define CS4215_12_MASK	0xfcbf	/* Mask off reseved bits in slot 1 & 2 */
+#define CS4215_12_MASK	0xfcbf	/* Mask off reserved bits in slot 1 & 2 */
 
 /* Time Slot 3, Serial Port Control register */
 #define CS4215_XEN	(1<<0)	/* 0: Enable serial output */
@@ -109,7 +109,7 @@
 /* Time Slot 7, Input Setting */
 #define CS4215_LG(v)	v	/* Left Gain Setting 0xf: 22.5 dB */
 #define CS4215_IS	(1<<4)	/* Input Select: 1=Microphone, 0=Line */
-#define CS4215_OVR	(1<<5)	/* 1: Overrange condition occured */
+#define CS4215_OVR	(1<<5)	/* 1: Overrange condition occurred */
 #define CS4215_PIO0	(1<<6)	/* Parallel I/O 0 */
 #define CS4215_PIO1	(1<<7)
 
diff -u --recursive --new-file v2.1.106/linux/drivers/sbus/char/bpp.c linux/drivers/sbus/char/bpp.c
--- v2.1.106/linux/drivers/sbus/char/bpp.c	Wed Apr 23 19:01:21 1997
+++ linux/drivers/sbus/char/bpp.c	Wed Jun 24 14:30:09 1998
@@ -45,7 +45,7 @@
 static const unsigned  BPP_MAJOR = LP_MAJOR;
 static const char* dev_name = "bpp";
 
-/* When switching from compatability to a mode where I can read, try
+/* When switching from compatibility to a mode where I can read, try
    the following mode first. */
 
 /* const unsigned char DEFAULT_ECP = 0x10; */
diff -u --recursive --new-file v2.1.106/linux/drivers/video/Config.in linux/drivers/video/Config.in
--- v2.1.106/linux/drivers/video/Config.in	Thu Mar 26 15:57:04 1998
+++ linux/drivers/video/Config.in	Wed Jun 24 14:44:01 1998
@@ -7,6 +7,9 @@
   mainmenu_option next_comment
   comment 'Frame buffer devices'
 
+  if [ "$CONFIG_ARCH_ACORN" = "y" ]; then
+    define_bool CONFIG_FB_ACORN y
+  fi
   if [ "$CONFIG_APOLLO" = "y" ]; then
     define_bool CONFIG_FB_APOLLO y
   fi
@@ -17,6 +20,8 @@
       bool 'Amiga ECS chipset support' CONFIG_FB_AMIGA_ECS
       bool 'Amiga AGA chipset support' CONFIG_FB_AMIGA_AGA
     fi
+  fi
+  if [ "$CONFIG_ZORRO" = "y" ]; then
     tristate 'Amiga CyberVision support' CONFIG_FB_CYBER
     if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then
       bool 'Amiga CyberVision3D support (experimental)' CONFIG_FB_VIRGE
@@ -43,9 +48,22 @@
   if [ "$CONFIG_MAC" = "y" ]; then
     define_bool CONFIG_FB_MAC y
   fi
+  if [ "$CONFIG_HP300" = "y" ]; then
+    define_bool CONFIG_FB_HP300 y
+  fi
   if [ "$CONFIG_TGA_CONSOLE" = "y" ]; then
     define_bool CONFIG_FB_TGA y
   fi
+  if [ "$ARCH" = "i386" -o "$ARCH" = "alpha" -o "$ARCH" = "ppc" ]; then
+    bool 'VGA chipset support (text only)' CONFIG_FB_VGA
+  fi
+  if [ "$ARCH" = "i386" ]; then
+    bool 'VESA VGA graphics console' CONFIG_FB_VESA
+    define_bool CONFIG_VIDEO_SELECT y
+  fi
+  if [ "$ARCH" = "i386" ]; then
+    tristate 'MDA dual-headed support' CONFIG_FB_MDA
+  fi
   tristate 'Virtual Frame Buffer support (ONLY FOR TESTING!)' CONFIG_FB_VIRTUAL
 
   bool 'Advanced low level driver options' CONFIG_FBCON_ADVANCED
@@ -63,6 +81,7 @@
     bool 'Atari interleaved bitplanes (4 planes) support' CONFIG_FBCON_IPLAN2P4
     bool 'Atari interleaved bitplanes (8 planes) support' CONFIG_FBCON_IPLAN2P8
     bool 'Mac variable bpp packed pixels support' CONFIG_FBCON_MAC
+    bool 'VGA characters/attributes support' CONFIG_FBCON_VGA
   else
     if [ "$CONFIG_FB_AMIGA" = "y" -o "$CONFIG_FB_AMIGA" = "m" -o \
 	 "$CONFIG_FB_ATARI" = "y" -o "$CONFIG_FB_ATARI" = "m" -o \
@@ -92,12 +111,14 @@
 	 "$CONFIG_FB_OF" = "y" -o "$CONFIG_FB_OF" = "m" -o \
 	 "$CONFIG_FB_MAC" = "y" -o "$CONFIG_FB_MAC" = "m" -o  \
 	 "$CONFIG_FB_TGA" = "y" -o "$CONFIG_FB_TGA" = "m" -o \
+	 "$CONFIG_FB_VESA" = "y" -o "$CONFIG_FB_VESA" = "m" -o \
 	 "$CONFIG_FB_VIRTUAL" = "y" -o "$CONFIG_FB_VIRTUAL" = "m" ]; then
       define_bool CONFIG_FBCON_CFB8 y
     fi
     if [ "$CONFIG_FB_ATARI" = "y" -o "$CONFIG_FB_ATARI" = "m" -o \
 	 "$CONFIG_FB_ATY" = "y" -o "$CONFIG_FB_ATY" = "m" -o \
 	 "$CONFIG_FB_MAC" = "y" -o "$CONFIG_FB_MAC" = "m" -o \
+	 "$CONFIG_FB_VESA" = "y" -o "$CONFIG_FB_VESA" = "m" -o \
 	 "$CONFIG_FB_VIRTUAL" = "y" -o "$CONFIG_FB_VIRTUAL" = "m" ]; then
       define_bool CONFIG_FBCON_CFB16 y
     fi
@@ -106,8 +127,19 @@
     fi
     if [ "$CONFIG_FB_ATARI" = "y" -o "$CONFIG_FB_ATARI" = "m" -o \
 	 "$CONFIG_FB_ATY" = "y" -o "$CONFIG_FB_ATY" = "m" -o \
+	 "$CONFIG_FB_VESA" = "y" -o "$CONFIG_FB_VESA" = "m" -o \
 	 "$CONFIG_FB_VIRTUAL" = "y" -o "$CONFIG_FB_VIRTUAL" = "m" ]; then
       define_bool CONFIG_FBCON_CFB32 y
+    fi
+    if [ "$CONFIG_FB_ACORN" != "n" ]; then
+      define_bool CONFIG_FBCON_MFB y
+      define_bool CONFIG_FBCON_CFB2 y
+      define_bool CONFIG_FBCON_CFB4 y
+      define_bool CONFIG_FBCON_CFB8 y
+    fi
+    if [ "$CONFIG_FB_VGA" = "y" -o "$CONFIG_FB_VGA" = "m" -o \
+	 "$CONFIG_FB_MDA" = "y" -o "$CONFIG_FB_MDA" = "m" ]; then
+      define_bool CONFIG_FBCON_VGA y
     fi
   fi
 
diff -u --recursive --new-file v2.1.106/linux/drivers/video/Makefile linux/drivers/video/Makefile
--- v2.1.106/linux/drivers/video/Makefile	Thu Mar 26 15:57:04 1998
+++ linux/drivers/video/Makefile	Wed Jun 24 14:44:01 1998
@@ -64,6 +64,10 @@
 L_OBJS += macfb.o
 endif
 
+ifeq ($(CONFIG_FB_HP300),y)
+L_OBJS += hpfb.o
+endif
+
 ifeq ($(CONFIG_FB_OF),y)
 L_OBJS += offb.o
 endif
@@ -88,6 +92,22 @@
 L_OBJS += tgafb.o
 endif
 
+ifeq ($(CONFIG_FB_VGA),y)
+L_OBJS += vgafb.o
+endif
+
+ifeq ($(CONFIG_FB_VESA),y)
+L_OBJS += vesafb.o
+endif
+
+ifeq ($(CONFIG_FB_MDA),y)
+L_OBJS += mdafb.o
+else
+  ifeq ($(CONFIG_FB_MDA),m)
+  M_OBJS += mdafb.o
+  endif
+endif
+
 ifeq ($(CONFIG_FB_VIRGE),y)
 L_OBJS += virgefb.o
 else
@@ -158,6 +178,10 @@
 LX_OBJS += fbcon-mfb.o
 endif
 
+ifdef CONFIG_FBCON_VGA
+LX_OBJS += fbcon-vga.o
+endif
+
 # GSP Console
 
 ifdef CONFIG_AMIGA_GSP
@@ -166,10 +190,16 @@
 
 # VGA Text Console
 
-ifdef CONFIG_ABSTRACT_CONSOLE
 ifdef CONFIG_VGA_CONSOLE
+ifndef CONFIG_FB_VGA
 L_OBJS := $(L_OBJS) vgacon.o
 endif
+endif
+
+# Console Wrapper
+
+ifdef CONFIG_ABSCON_COMPAT
+L_OBJS := $(L_OBJS) compatcon.o
 endif
 
 include $(TOPDIR)/Rules.make
diff -u --recursive --new-file v2.1.106/linux/drivers/video/S3triofb.c linux/drivers/video/S3triofb.c
--- v2.1.106/linux/drivers/video/S3triofb.c	Thu Mar 26 15:57:04 1998
+++ linux/drivers/video/S3triofb.c	Wed Jun 24 14:44:01 1998
@@ -23,9 +23,8 @@
 
 */
 
-#include <linux/config.h>
-#include <linux/module.h>
 #include <linux/kernel.h>
+#include <linux/module.h>
 #include <linux/errno.h>
 #include <linux/string.h>
 #include <linux/mm.h>
@@ -36,11 +35,18 @@
 #include <linux/interrupt.h>
 #include <linux/fb.h>
 #include <linux/init.h>
+#include <linux/selection.h>
 #include <asm/io.h>
 #include <asm/prom.h>
+#include <asm/pci-bridge.h>
 #include <linux/pci.h>
+#ifdef CONFIG_FB_COMPAT_XPMAC
+#include <asm/vc_ioctl.h>
+#endif
 
+#include "fbcon.h"
 #include "fbcon-cfb8.h"
+#include "s3blit.h"
 
 
 #define mem_in8(addr)           in_8((void *)(addr))
@@ -60,7 +66,7 @@
 static struct fb_info fb_info;
 static struct { u_char red, green, blue, pad; } palette[256];
 static char s3trio_name[16] = "S3Trio ";
-
+static char *s3trio_base;
 
 static struct fb_fix_screeninfo fb_fix;
 static struct fb_var_screeninfo fb_var = { 0, };
@@ -70,8 +76,6 @@
      *  Interface used by the world
      */
 
-void of_video_setup(char *options, int *ints);
-
 static int s3trio_open(struct fb_info *info);
 static int s3trio_release(struct fb_info *info);
 static int s3trio_get_fix(struct fb_fix_screeninfo *fix, int con,
@@ -106,7 +110,9 @@
 static int s3triofbcon_switch(int con, struct fb_info *info);
 static int s3triofbcon_updatevar(int con, struct fb_info *info);
 static void s3triofbcon_blank(int blank, struct fb_info *info);
+#if 0
 static int s3triofbcon_setcmap(struct fb_cmap *cmap, int con);
+#endif
 
     /*
      *  Text console acceleration
@@ -138,12 +144,12 @@
                          u_int *transp, struct fb_info *info);
 static int s3trio_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);
+static void do_install_cmap(int con, struct fb_info *info);
 
 
 static struct fb_ops s3trio_ops = {
     s3trio_open, s3trio_release, s3trio_get_fix, s3trio_get_var, s3trio_set_var,
-    s3trio_get_cmap, s3trio_set_cmap, s3trio_pan_display, NULL, s3trio_ioctl
+    s3trio_get_cmap, s3trio_set_cmap, s3trio_pan_display, s3trio_ioctl
 };
 
 
@@ -200,11 +206,16 @@
 			  struct fb_info *info)
 {
     if (var->xres > fb_var.xres || var->yres > fb_var.yres ||
-	var->xres_virtual > fb_var.xres_virtual ||
-	var->yres_virtual > fb_var.yres_virtual ||
-	var->bits_per_pixel > fb_var.bits_per_pixel ||
-	var->nonstd || var->vmode != FB_VMODE_NONINTERLACED)
+	var->bits_per_pixel > fb_var.bits_per_pixel )
+	/* || var->nonstd || var->vmode != FB_VMODE_NONINTERLACED) */
 	return -EINVAL;
+    if (var->xres_virtual > fb_var.xres_virtual) {
+	outw(IO_OUT16VAL((var->xres_virtual /8) & 0xff, 0x13), 0x3d4);
+	outw(IO_OUT16VAL(((var->xres_virtual /8 ) & 0x300) >> 3, 0x51), 0x3d4);
+	fb_var.xres_virtual = var->xres_virtual;
+	fb_fix.line_length = var->xres_virtual;
+    }
+    fb_var.yres_virtual = var->yres_virtual;
     memcpy(var, &fb_var, sizeof(fb_var));
     return 0;
 }
@@ -219,12 +230,25 @@
 static int s3trio_pan_display(struct fb_var_screeninfo *var, int con,
 			      struct fb_info *info)
 {
-    if (var->xoffset || var->yoffset)
+    unsigned int base;
+
+    if (var->xoffset > (var->xres_virtual - var->xres))
 	return -EINVAL;
-    else
-	return 0;
+    if (var->yoffset > (var->yres_virtual - var->yres))
+	return -EINVAL;
+
+    fb_var.xoffset = var->xoffset;
+    fb_var.yoffset = var->yoffset;
+
+    base = var->yoffset * fb_fix.line_length + var->xoffset;
+
+    outw(IO_OUT16VAL((base >> 8) & 0xff, 0x0c),0x03D4);
+    outw(IO_OUT16VAL(base  & 0xff, 0x0d),0x03D4);
+    outw(IO_OUT16VAL((base >> 16) & 0xf, 0x69),0x03D4);
+    return 0;
 }
 
+
     /*
      *  Get the Colormap
      */
@@ -238,7 +262,7 @@
     else if (fb_display[con].cmap.len) /* non default colormap? */
 	fb_copy_cmap(&fb_display[con].cmap, cmap, kspc ? 0 : 2);
     else
-	fb_copy_cmap(fb_default_cmap(fb_display[con].var.bits_per_pixel),
+	fb_copy_cmap(fb_default_cmap(1 << fb_display[con].var.bits_per_pixel),
 		     cmap, kspc ? 0 : 2);
     return 0;
 }
@@ -273,7 +297,18 @@
     return -EINVAL;
 }
 
-__initfunc(int s3trio_resetaccel(void)) {
+__initfunc(unsigned long s3triofb_init(unsigned long mem_start))
+{
+#ifdef __powerpc__
+    /* We don't want to be called like this. */
+    /* We rely on Open Firmware (offb) instead. */
+#else /* !__powerpc__ */
+    /* To be merged with cybervision */
+#endif /* !__powerpc__ */
+    return mem_start;
+}
+
+__initfunc(void s3trio_resetaccel(void)) {
 
 
 #define EC01_ENH_ENB    0x0005
@@ -314,18 +349,15 @@
 	outw(0xffff,  0xaae8);       /* Enable all planes */
 	outw(0xffff, 0xaae8);       /* Enable all planes */
 	outw( MF_PIX_CONTROL | MFA_SRC_FOREGR_MIX,  0xbee8);
-
 }
 
-__initfunc(int s3trio_init(void)) {
+__initfunc(int s3trio_init(struct device_node *dp)) {
 
     u_char bus, dev;
     unsigned int t32;
     unsigned short cmd;
-    int i;
 
-	bus=0;
-	dev=(3<<3);
+	pci_device_loc(dp,&bus,&dev);
                 pcibios_read_config_dword(bus, dev, PCI_VENDOR_ID, &t32);
                 if(t32 == (PCI_DEVICE_ID_S3_TRIO << 16) + PCI_VENDOR_ID_S3) {
                         pcibios_read_config_dword(bus, dev, PCI_BASE_ADDRESS_0, &t32);
@@ -351,16 +383,16 @@
 			outw(IO_OUT16VAL(0x48, 0x38),0x03D4);
 			outw(IO_OUT16VAL(0xA0, 0x39),0x03D4);
 			outb(0x33,0x3d4);
-			outw(IO_OUT16VAL( inb(0x3d5) & ~(0x2 |
-			 0x10 | 0x40) , 0x33),0x3d4);
+			outw(IO_OUT16VAL((inb(0x3d5) & ~(0x2 | 0x10 |  0x40)) |
+					  0x20, 0x33), 0x3d4);
 
-			outw(IO_OUT16VAL(0x6,0x8), 0x3c4);
+			outw(IO_OUT16VAL(0x6, 0x8), 0x3c4);
 
 			/* switch to MMIO only mode */
 
-			outb(0x58,0x3d4);
-			outw(IO_OUT16VAL(inb(0x3d5) | 3 | 0x10,0x58),0x3d4);
-			outw(IO_OUT16VAL(8,0x53),0x3d4);
+			outb(0x58, 0x3d4);
+			outw(IO_OUT16VAL(inb(0x3d5) | 3 | 0x10, 0x58), 0x3d4);
+			outw(IO_OUT16VAL(8, 0x53), 0x3d4);
 
 			/* switch off I/O accesses */
 
@@ -368,6 +400,7 @@
 			pcibios_write_config_word(bus, dev, PCI_COMMAND,
 				        PCI_COMMAND_IO | PCI_COMMAND_MEMORY);
 #endif
+			return 1;
                 }
 
 	return 0;
@@ -379,18 +412,12 @@
      *  We heavily rely on OF for the moment. This needs fixing.
      */
 
-__initfunc(unsigned long s3trio_fb_init(unsigned long mem_start))
+__initfunc(void s3triofb_init_of(struct device_node *dp))
 {
-    struct device_node *dp;
     int i, err, *pp, len;
-    unsigned *up, address;
+    unsigned long address;
     u_long *CursorBase;
 
-    if (!prom_display_paths[0])
-	return mem_start;
-    if (!(dp = find_path_device(prom_display_paths[0])))
-	return mem_start;
-
     strncat(s3trio_name, dp->name, sizeof(s3trio_name));
     s3trio_name[sizeof(s3trio_name)-1] = '\0';
     strcpy(fb_fix.id, s3trio_name);
@@ -398,19 +425,19 @@
     if((pp = (int *)get_property(dp, "vendor-id", &len)) != NULL
 	&& *pp!=PCI_VENDOR_ID_S3) {
 	printk("%s: can't find S3 Trio board\n", dp->full_name);
-	return mem_start;
+	return;
     }
 
     if((pp = (int *)get_property(dp, "device-id", &len)) != NULL
 	&& *pp!=PCI_DEVICE_ID_S3_TRIO) {
 	printk("%s: can't find S3 Trio board\n", dp->full_name);
-	return mem_start;
+	return;
     }
 
     if ((pp = (int *)get_property(dp, "depth", &len)) != NULL
 	&& len == sizeof(int) && *pp != 8) {
 	printk("%s: can't use depth = %d\n", dp->full_name, *pp);
-	return mem_start;
+	return;
     }
     if ((pp = (int *)get_property(dp, "width", &len)) != NULL
 	&& len == sizeof(int))
@@ -425,45 +452,51 @@
 	fb_fix.line_length = fb_var.xres_virtual;
     fb_fix.smem_len = fb_fix.line_length*fb_var.yres;
 
-    s3trio_init();
-    address=0xc6000000;
-    fb_fix.smem_start = ioremap(address,64*1024*1024);
+    s3trio_init(dp);
+    address = 0xc6000000;
+    s3trio_base = ioremap(address,64*1024*1024);
+    fb_fix.smem_start = (char *)address;
     fb_fix.type = FB_TYPE_PACKED_PIXELS;
     fb_fix.type_aux = 0;
+    fb_fix.accel = FB_ACCEL_S3_TRIO64;
+    fb_fix.mmio_start = (char *)address+0x1000000;
+    fb_fix.mmio_len = 0x1000000;
 
+    fb_fix.xpanstep = 1;
+    fb_fix.ypanstep = 1;
 
     s3trio_resetaccel();
 
-	mem_out8(0x30,fb_fix.smem_start+0x1008000 + 0x03D4);
-	mem_out8(0x2d,fb_fix.smem_start+0x1008000 + 0x03D4);
-	mem_out8(0x2e,fb_fix.smem_start+0x1008000 + 0x03D4);
+    mem_out8(0x30, s3trio_base+0x1008000 + 0x03D4);
+    mem_out8(0x2d, s3trio_base+0x1008000 + 0x03D4);
+    mem_out8(0x2e, s3trio_base+0x1008000 + 0x03D4);
 
-	mem_out8(0x50,fb_fix.smem_start+0x1008000 + 0x03D4);
+    mem_out8(0x50, s3trio_base+0x1008000 + 0x03D4);
 
     /* disable HW cursor */
 
-    mem_out8(0x39,fb_fix.smem_start+0x1008000 + 0x03D4);
-    mem_out8(0xa0,fb_fix.smem_start+0x1008000 + 0x03D5);
+    mem_out8(0x39, s3trio_base+0x1008000 + 0x03D4);
+    mem_out8(0xa0, s3trio_base+0x1008000 + 0x03D5);
 
-    mem_out8(0x45,fb_fix.smem_start+0x1008000 + 0x03D4);
-    mem_out8(0,fb_fix.smem_start+0x1008000 + 0x03D5);
+    mem_out8(0x45, s3trio_base+0x1008000 + 0x03D4);
+    mem_out8(0, s3trio_base+0x1008000 + 0x03D5);
 
-    mem_out8(0x4e,fb_fix.smem_start+0x1008000 + 0x03D4);
-    mem_out8(0,fb_fix.smem_start+0x1008000 + 0x03D5);
+    mem_out8(0x4e, s3trio_base+0x1008000 + 0x03D4);
+    mem_out8(0, s3trio_base+0x1008000 + 0x03D5);
 
-    mem_out8(0x4f,fb_fix.smem_start+0x1008000 + 0x03D4);
-    mem_out8(0,fb_fix.smem_start+0x1008000 + 0x03D5);
+    mem_out8(0x4f, s3trio_base+0x1008000 + 0x03D4);
+    mem_out8(0, s3trio_base+0x1008000 + 0x03D5);
 
     /* init HW cursor */
 
-    CursorBase=(u_long *)(fb_fix.smem_start + 2*1024*1024 - 0x400);
-	for (i=0; i < 8; i++) {
+    CursorBase = (u_long *)(s3trio_base + 2*1024*1024 - 0x400);
+	for (i = 0; i < 8; i++) {
 		*(CursorBase  +(i*4)) = 0xffffff00;
 		*(CursorBase+1+(i*4)) = 0xffff0000;
 		*(CursorBase+2+(i*4)) = 0xffff0000;
 		*(CursorBase+3+(i*4)) = 0xffff0000;
 	}
-	for (i=8; i < 64; i++) {
+	for (i = 8; i < 64; i++) {
 		*(CursorBase  +(i*4)) = 0xffff0000;
 		*(CursorBase+1+(i*4)) = 0xffff0000;
 		*(CursorBase+2+(i*4)) = 0xffff0000;
@@ -471,34 +504,43 @@
 	}
 
 
-    mem_out8(0x4c,fb_fix.smem_start+0x1008000 + 0x03D4);
-    mem_out8(((2*1024 - 1)&0xf00)>>8,fb_fix.smem_start+0x1008000 + 0x03D5);
-
-    mem_out8(0x4d,fb_fix.smem_start+0x1008000 + 0x03D4);
-    mem_out8((2*1024 - 1) & 0xff,fb_fix.smem_start+0x1008000 + 0x03D5);
+    mem_out8(0x4c, s3trio_base+0x1008000 + 0x03D4);
+    mem_out8(((2*1024 - 1)&0xf00)>>8, s3trio_base+0x1008000 + 0x03D5);
 
-    mem_out8(0x45,fb_fix.smem_start+0x1008000 + 0x03D4);
-	mem_in8(fb_fix.smem_start+0x1008000 + 0x03D4);
+    mem_out8(0x4d, s3trio_base+0x1008000 + 0x03D4);
+    mem_out8((2*1024 - 1) & 0xff, s3trio_base+0x1008000 + 0x03D5);
 
-    mem_out8(0x4a,fb_fix.smem_start+0x1008000 + 0x03D4);
-    mem_out8(0x80,fb_fix.smem_start+0x1008000 + 0x03D5);
-    mem_out8(0x80,fb_fix.smem_start+0x1008000 + 0x03D5);
-    mem_out8(0x80,fb_fix.smem_start+0x1008000 + 0x03D5);
-
-    mem_out8(0x4b,fb_fix.smem_start+0x1008000 + 0x03D4);
-    mem_out8(0x00,fb_fix.smem_start+0x1008000 + 0x03D5);
-    mem_out8(0x00,fb_fix.smem_start+0x1008000 + 0x03D5);
-    mem_out8(0x00,fb_fix.smem_start+0x1008000 + 0x03D5);
+    mem_out8(0x45, s3trio_base+0x1008000 + 0x03D4);
+    mem_in8(s3trio_base+0x1008000 + 0x03D4);
 
-    mem_out8(0x45,fb_fix.smem_start+0x1008000 + 0x03D4);
-    mem_out8(0,fb_fix.smem_start+0x1008000 + 0x03D5);
+    mem_out8(0x4a, s3trio_base+0x1008000 + 0x03D4);
+    mem_out8(0x80, s3trio_base+0x1008000 + 0x03D5);
+    mem_out8(0x80, s3trio_base+0x1008000 + 0x03D5);
+    mem_out8(0x80, s3trio_base+0x1008000 + 0x03D5);
+
+    mem_out8(0x4b, s3trio_base+0x1008000 + 0x03D4);
+    mem_out8(0x00, s3trio_base+0x1008000 + 0x03D5);
+    mem_out8(0x00, s3trio_base+0x1008000 + 0x03D5);
+    mem_out8(0x00, s3trio_base+0x1008000 + 0x03D5);
+
+    mem_out8(0x45, s3trio_base+0x1008000 + 0x03D4);
+    mem_out8(0, s3trio_base+0x1008000 + 0x03D5);
+
+    /* setup default color table */
+
+	for(i = 0; i < 16; i++) {
+		int j = color_table[i];
+		palette[i].red=default_red[j];
+		palette[i].green=default_grn[j];
+		palette[i].blue=default_blu[j];
+	}
 
     s3trio_setcolreg(255, 56, 100, 160, 0, NULL /* not used */);
     s3trio_setcolreg(254, 0, 0, 0, 0, NULL /* not used */);
-    memset((char *)fb_fix.smem_start,0,640*480);
+    memset((char *)s3trio_base, 0, 640*480);
 
 #if 0
-    Trio_RectFill(0,0,90,90,7,1);
+    Trio_RectFill(0, 0, 90, 90, 7, 1);
 #endif
 
     fb_fix.visual = FB_VISUAL_PSEUDOCOLOR ;
@@ -512,7 +554,8 @@
     fb_var.nonstd = 0;
     fb_var.activate = 0;
     fb_var.height = fb_var.width = -1;
-    fb_var.accel = 5;
+    fb_var.accel_flags = FB_ACCELF_TEXT;
+#warning FIXME: always obey fb_var.accel_flags
     fb_var.pixclock = 1;
     fb_var.left_margin = fb_var.right_margin = 0;
     fb_var.upper_margin = fb_var.lower_margin = 0;
@@ -524,7 +567,7 @@
     disp.cmap.start = 0;
     disp.cmap.len = 0;
     disp.cmap.red = disp.cmap.green = disp.cmap.blue = disp.cmap.transp = NULL;
-    disp.screen_base = fb_fix.smem_start;
+    disp.screen_base = s3trio_base;
     disp.visual = fb_fix.visual;
     disp.type = fb_fix.type;
     disp.type_aux = fb_fix.type_aux;
@@ -534,7 +577,10 @@
     disp.can_soft_blank = 1;
     disp.inverse = 0;
 #ifdef CONFIG_FBCON_CFB8
-    disp.dispsw = &fbcon_trio8;
+    if (fb_var.accel_flags & FB_ACCELF_TEXT)
+	disp.dispsw = &fbcon_trio8;
+    else
+	disp.dispsw = &fbcon_cfb8;
 #else
     disp.dispsw = NULL;
 #endif
@@ -577,12 +623,10 @@
 
     err = register_framebuffer(&fb_info);
     if (err < 0)
-	return mem_start;
+	return;
 
     printk("fb%d: S3 Trio frame buffer device on %s\n",
 	   GET_FB_IDX(fb_info.node), dp->full_name);
-
-    return mem_start;
 }
 
 
@@ -595,7 +639,7 @@
 
     currcon = con;
     /* Install new colormap */
-    do_install_cmap(con);
+    do_install_cmap(con,info);
     return 0;
 }
 
@@ -615,17 +659,23 @@
 
 static void s3triofbcon_blank(int blank, struct fb_info *info)
 {
-    /* Nothing */
+    unsigned char x;
+
+    mem_out8(0x1, s3trio_base+0x1008000 + 0x03c4);
+    x = mem_in8(s3trio_base+0x1008000 + 0x03c5);
+    mem_out8((x & (~0x20)) | (blank << 5), s3trio_base+0x1008000 + 0x03c5);
 }
 
     /*
      *  Set the colormap
      */
 
+#if 0
 static int s3triofbcon_setcmap(struct fb_cmap *cmap, int con)
 {
     return(s3trio_set_cmap(cmap, 1, con, &fb_info));
 }
+#endif
 
 
     /*
@@ -660,16 +710,16 @@
     palette[regno].green = green;
     palette[regno].blue = blue;
 
-    mem_out8(regno,fb_fix.smem_start+0x1008000 + 0x3c8);
-    mem_out8((red & 0xff) >> 2,fb_fix.smem_start+0x1008000 + 0x3c9);
-    mem_out8((green & 0xff) >> 2,fb_fix.smem_start+0x1008000 + 0x3c9);
-    mem_out8((blue & 0xff) >> 2,fb_fix.smem_start+0x1008000 + 0x3c9);
+    mem_out8(regno,s3trio_base+0x1008000 + 0x3c8);
+    mem_out8((red & 0xff) >> 2,s3trio_base+0x1008000 + 0x3c9);
+    mem_out8((green & 0xff) >> 2,s3trio_base+0x1008000 + 0x3c9);
+    mem_out8((blue & 0xff) >> 2,s3trio_base+0x1008000 + 0x3c9);
 
     return 0;
 }
 
 
-static void do_install_cmap(int con)
+static void do_install_cmap(int con, struct fb_info *info)
 {
     if (con != currcon)
 	return;
@@ -689,6 +739,9 @@
 
 static int s3trio_console_setmode(struct vc_mode *mode, int doit)
 {
+#if 1
+    return -EINVAL;
+#else
     int err;
     struct fb_var_screeninfo var;
     struct s3trio_par par;
@@ -718,11 +771,12 @@
     if (doit)
         s3trio_set_var(&var, currcon, 0);
     return 0;
+#endif
 }
 
 #endif /* CONFIG_FB_COMPAT_XPMAC */
 
-void s3trio_video_setup(char *options, int *ints) {
+void s3triofb_setup(char *options, int *ints) {
 
         return;
 
@@ -734,7 +788,7 @@
 
         do
         {
-		status = mem_in16(fb_fix.smem_start + 0x1000000 + 0x9AE8);
+		status = mem_in16(s3trio_base + 0x1000000 + 0x9AE8);
 	}  while (!(status & fifo));
 
 }
@@ -745,7 +799,7 @@
 
         do
         {
-		status = mem_in16(fb_fix.smem_start + 0x1000000 + 0x9AE8);
+		status = mem_in16(s3trio_base + 0x1000000 + 0x9AE8);
 	}  while (status & 0x200);
 
 }
@@ -813,18 +867,18 @@
 
 static void Trio_MoveCursor(u_short x, u_short y) {
 
-	mem_out8(0x39, fb_fix.smem_start + 0x1008000 + 0x3d4);
-	mem_out8(0xa0, fb_fix.smem_start + 0x1008000 + 0x3d5);
+	mem_out8(0x39, s3trio_base + 0x1008000 + 0x3d4);
+	mem_out8(0xa0, s3trio_base + 0x1008000 + 0x3d5);
 
-	mem_out8(0x46, fb_fix.smem_start + 0x1008000 + 0x3d4);
-	mem_out8((x & 0x0700) >> 8, fb_fix.smem_start + 0x1008000 + 0x3d5);
-	mem_out8(0x47, fb_fix.smem_start + 0x1008000 + 0x3d4);
-	mem_out8(x & 0x00ff, fb_fix.smem_start + 0x1008000 + 0x3d5);
-
-	mem_out8(0x48, fb_fix.smem_start + 0x1008000 + 0x3d4);
-	mem_out8((y & 0x0700) >> 8, fb_fix.smem_start + 0x1008000 + 0x3d5);
-	mem_out8(0x49, fb_fix.smem_start + 0x1008000 + 0x3d4);
-	mem_out8(y & 0x00ff, fb_fix.smem_start + 0x1008000 + 0x3d5);
+	mem_out8(0x46, s3trio_base + 0x1008000 + 0x3d4);
+	mem_out8((x & 0x0700) >> 8, s3trio_base + 0x1008000 + 0x3d5);
+	mem_out8(0x47, s3trio_base + 0x1008000 + 0x3d4);
+	mem_out8(x & 0x00ff, s3trio_base + 0x1008000 + 0x3d5);
+
+	mem_out8(0x48, s3trio_base + 0x1008000 + 0x3d4);
+	mem_out8((y & 0x0700) >> 8, s3trio_base + 0x1008000 + 0x3d5);
+	mem_out8(0x49, s3trio_base + 0x1008000 + 0x3d4);
+	mem_out8(y & 0x00ff, s3trio_base + 0x1008000 + 0x3d5);
 
 }
 
@@ -880,6 +934,6 @@
 
 static struct display_switch fbcon_trio8 = {
    fbcon_cfb8_setup, fbcon_trio8_bmove, fbcon_trio8_clear, fbcon_trio8_putc,
-   fbcon_trio8_putcs, fbcon_trio8_revc
+   fbcon_trio8_putcs, fbcon_trio8_revc, NULL
 };
 #endif
diff -u --recursive --new-file v2.1.106/linux/drivers/video/amifb.c linux/drivers/video/amifb.c
--- v2.1.106/linux/drivers/video/amifb.c	Thu Mar 26 15:57:04 1998
+++ linux/drivers/video/amifb.c	Wed Jun 24 14:44:01 1998
@@ -579,8 +579,14 @@
 #define modx(x,v)	((v) & ((x)-1))
 
 /* if x1 is not a constant, this macro won't make real sense :-) */
+#ifdef __mc68000__
 #define DIVUL(x1, x2) ({int res; asm("divul %1,%2,%3": "=d" (res): \
 	"d" (x2), "d" ((long)((x1)/0x100000000ULL)), "0" ((long)(x1))); res;})
+#else
+/* We know a bit about the numbers, so we can do it this way */
+#define DIVUL(x1, x2) ((((long)((unsigned long long)x1 >> 8) / x2) << 8) + \
+	((((long)((unsigned long long)x1 >> 8) % x2) << 8) / x2))
+#endif
 
 #define min(a, b)	((a) < (b) ? (a) : (b))
 #define max(a, b)	((a) > (b) ? (a) : (b))
@@ -1245,7 +1251,7 @@
 static struct fb_ops amifb_ops = {
 	amifb_open, amifb_release, amifb_get_fix, amifb_get_var,
 	amifb_set_var, amifb_get_cmap, amifb_set_cmap,
-	amifb_pan_display, NULL, amifb_ioctl
+	amifb_pan_display, amifb_ioctl
 };
 
 
@@ -1803,9 +1809,13 @@
 	 * Calculate the Pixel Clock Values for this Machine
 	 */
 
-	pixclock[TAG_SHRES] = DIVUL(25E9, amiga_eclock);	/* SHRES:  35 ns / 28 MHz */
-	pixclock[TAG_HIRES] = DIVUL(50E9, amiga_eclock);	/* HIRES:  70 ns / 14 MHz */
-	pixclock[TAG_LORES] = DIVUL(100E9, amiga_eclock); 	/* LORES: 140 ns /  7 MHz */
+	{
+	u_long tmp = DIVUL(200E9, amiga_eclock);
+
+	pixclock[TAG_SHRES] = (tmp + 4) / 8;	/* SHRES:  35 ns / 28 MHz */
+	pixclock[TAG_HIRES] = (tmp + 2) / 4;	/* HIRES:  70 ns / 14 MHz */
+	pixclock[TAG_LORES] = (tmp + 1) / 2;	/* LORES: 140 ns /  7 MHz */
+	}
 
 	/*
 	 * Replace the Tag Values with the Real Pixel Clock Values
@@ -2543,7 +2553,8 @@
                           struct amifb_par *par)
 {
 	u_short clk_shift, line_shift;
-	int i;
+
+	memset(var, 0, sizeof(struct fb_var_screeninfo));
 
 	clk_shift = par->clk_shift;
 	line_shift = par->line_shift;
@@ -2626,9 +2637,6 @@
 	if (par->vmode & FB_VMODE_YWRAP)
 		var->vmode |= FB_VMODE_YWRAP;
 
-	for (i = 0; i < arraysize(var->reserved); i++)
-		var->reserved[i] = 0;
-
 	return 0;
 }
 
@@ -2927,20 +2935,20 @@
 		custom.dmacon = DMAF_RASTER | DMAF_SPRITE;
 		red = green = blue = 0;
 		if (!IS_OCS && do_blank > 1) {
-			switch (do_blank) {
-				case 2 : /* suspend vsync */
+			switch (do_blank-1) {
+				case VESA_VSYNC_SUSPEND:
 					custom.hsstrt = hsstrt2hw(par->hsstrt);
 					custom.hsstop = hsstop2hw(par->hsstop);
 					custom.vsstrt = vsstrt2hw(par->vtotal+4);
 					custom.vsstop = vsstop2hw(par->vtotal+4);
 					break;
-				case 3 : /* suspend hsync */
+				case VESA_HSYNC_SUSPEND:
 					custom.hsstrt = hsstrt2hw(par->htotal+16);
 					custom.hsstop = hsstop2hw(par->htotal+16);
 					custom.vsstrt = vsstrt2hw(par->vsstrt);
 					custom.vsstop = vsstrt2hw(par->vsstop);
 					break;
-				case 4 : /* powerdown */
+				case VESA_POWERDOWN:
 					custom.hsstrt = hsstrt2hw(par->htotal+16);
 					custom.hsstop = hsstop2hw(par->htotal+16);
 					custom.vsstrt = vsstrt2hw(par->vtotal+4);
diff -u --recursive --new-file v2.1.106/linux/drivers/video/atafb.c linux/drivers/video/atafb.c
--- v2.1.106/linux/drivers/video/atafb.c	Thu Mar 26 15:57:04 1998
+++ linux/drivers/video/atafb.c	Wed Jun 24 14:44:01 1998
@@ -492,6 +492,7 @@
 	fix->ypanstep=1;
 	fix->ywrapstep=0;
 	fix->line_length = 0;
+	fix->accel = FB_ACCEL_ATARIBLITT;
 	return 0;
 }
 
@@ -580,7 +581,8 @@
 static int tt_encode_var( struct fb_var_screeninfo *var,
 						  struct atafb_par *par )
 {
-	int linelen, i;
+	int linelen;
+	memset(var, 0, sizeof(struct fb_var_screeninfo));
 	var->red.offset=0;
 	var->red.length=4;
 	var->red.msb_right=0;
@@ -668,8 +670,6 @@
 	var->nonstd=0;
 	var->activate=0;
 	var->vmode=FB_VMODE_NONINTERLACED;
-	for (i=0; i<arraysize(var->reserved); i++)
-		var->reserved[i]=0;
 	return 0;
 }
 
@@ -816,6 +816,7 @@
 		fix->xpanstep = 2;
 	}
 	fix->line_length = 0;
+	fix->accel = FB_ACCEL_ATARIBLITT;
 	return 0;
 }
 
@@ -1306,11 +1307,12 @@
 							  struct atafb_par *par )
 {
 /* !!! only for VGA !!! */
-	int linelen, i;
+	int linelen;
 	int prescale, plen;
 	int hdb_off, hde_off, base_off;
 	struct falcon_hw *hw = &par->hw.falcon;
 
+	memset(var, 0, sizeof(struct fb_var_screeninfo));
 	/* possible frequencies: 25.175 or 32MHz */
 	var->pixclock = hw->sync & 0x1 ? fext.t :
 	                hw->vid_control & VCO_CLOCK25 ? f25.t : f32.t;
@@ -1461,8 +1463,6 @@
 		var->yoffset=0;
 	var->nonstd=0;	/* what is this for? */
 	var->activate=0;
-	for (i=0; i<arraysize(var->reserved); i++)
-		var->reserved[i]=0;
 	return 0;
 }
 
@@ -1773,6 +1773,7 @@
 	}
 	fix->ywrapstep = 0;
 	fix->line_length = 0;
+	fix->accel = FB_ACCEL_ATARIBLITT;
 	return 0;
 }
 
@@ -1838,7 +1839,8 @@
 static int stste_encode_var( struct fb_var_screeninfo *var,
 						  struct atafb_par *par )
 {
-	int linelen, i;
+	int linelen;
+	memset(var, 0, sizeof(struct fb_var_screeninfo));
 	var->red.offset=0;
 	var->red.length = ATARIHW_PRESENT(EXTD_SHIFTER) ? 4 : 3;
 	var->red.msb_right=0;
@@ -1908,8 +1910,6 @@
 	var->nonstd=0;
 	var->activate=0;
 	var->vmode=FB_VMODE_NONINTERLACED;
-	for (i=0; i<arraysize(var->reserved); i++)
-		var->reserved[i]=0;
 	return 0;
 }
 
@@ -2145,8 +2145,7 @@
 static int ext_encode_var( struct fb_var_screeninfo *var,
 						   struct atafb_par *par )
 {
-	int i;
-
+	memset(var, 0, sizeof(struct fb_var_screeninfo));
 	var->red.offset=0;
 	var->red.length=(external_pmode == -1) ? external_depth/3 : 
 			(external_vgaiobase ? external_bitspercol : 0);
@@ -2181,8 +2180,6 @@
 	var->nonstd=0;
 	var->activate=0;
 	var->vmode=FB_VMODE_NONINTERLACED;
-	for (i=0; i<arraysize(var->reserved); i++)
-		var->reserved[i]=0;
 	return 0;
 }
 
@@ -2470,7 +2467,7 @@
 	atafb_get_var(&var, con, info);
 	if (con == -1)
 		con=0;
-	display->screen_base = (u_char *)fix.smem_start;
+	display->screen_base = fix.smem_start;
 	display->visual = fix.visual;
 	display->type = fix.type;
 	display->type_aux = fix.type_aux;
@@ -2642,7 +2639,7 @@
 static struct fb_ops atafb_ops = {
 	atafb_open, atafb_release, atafb_get_fix, atafb_get_var,
 	atafb_set_var, atafb_get_cmap, atafb_set_cmap,
-	atafb_pan_display, NULL, atafb_ioctl	
+	atafb_pan_display, atafb_ioctl	
 };
 
 static void
diff -u --recursive --new-file v2.1.106/linux/drivers/video/aty.h linux/drivers/video/aty.h
--- v2.1.106/linux/drivers/video/aty.h	Thu Mar 26 15:57:04 1998
+++ linux/drivers/video/aty.h	Wed Jun 24 14:44:01 1998
@@ -223,8 +223,8 @@
 #define DP_BKGD_CLR		0x02C0	/* Dword offset 0_B0 */
 #define DP_FOG_CLR		0x02C4	/* Dword offset 0_B1 */
 #define DP_FRGD_CLR		0x02C4	/* Dword offset 0_B1 */
-#define DP_WRITE_MSK		0x02C8	/* Dword offset 0_B2 */
-#define DP_CHAIN_MSK		0x02CC	/* Dword offset 0_B3 */
+#define DP_WRITE_MASK		0x02C8	/* Dword offset 0_B2 */
+#define DP_CHAIN_MASK		0x02CC	/* Dword offset 0_B3 */
 #define DP_PIX_WIDTH		0x02D0	/* Dword offset 0_B4 */
 #define DP_MIX			0x02D4	/* Dword offset 0_B5 */
 #define DP_SRC			0x02D8	/* Dword offset 0_B6 */
@@ -238,7 +238,7 @@
 #define DP_SET_GUI_ENGINE	0x02FC	/* Dword offset 0_BF */
 
 #define CLR_CMP_CLR		0x0300	/* Dword offset 0_C0 */
-#define CLR_CMP_MSK		0x0304	/* Dword offset 0_C1 */
+#define CLR_CMP_MASK		0x0304	/* Dword offset 0_C1 */
 #define CLR_CMP_CNTL		0x0308	/* Dword offset 0_C2 */
 
 #define FIFO_STAT		0x0310	/* Dword offset 0_C4 */
@@ -569,7 +569,8 @@
 #define PLL_WR_EN		0x02
 
 /* PLL registers */
-#define PLL_MACRO_CNTL		0x01
+#define MPLL_CNTL		0x00
+#define VPLL_CNTL		0x01
 #define PLL_REF_DIV		0x02
 #define PLL_GEN_CNTL		0x03
 #define MCLK_FB_DIV		0x04
@@ -579,7 +580,9 @@
 #define VCLK1_FB_DIV		0x08
 #define VCLK2_FB_DIV		0x09
 #define VCLK3_FB_DIV		0x0A
-#define PLL_XCLK_CNTL		0x0B
+#define PLL_EXT_CNTL		0x0B
+#define DLL_CNTL		0x0C
+#define VFC_CNTL		0x0D
 #define PLL_TEST_CTRL		0x0E
 #define PLL_TEST_COUNT		0x0F
 
@@ -688,28 +691,88 @@
 
 /* ATI PCI constants */
 #define PCI_ATI_VENDOR_ID	0x1002
-#define PCI_MACH64_GX		0x4758
-#define PCI_MACH64_CX		0x4358
-#define PCI_MACH64_CT		0x4354
-#define PCI_MACH64_ET		0x4554
-#define PCI_MACH64_VT		0x5654
-#define PCI_MACH64_GT		0x4754
+
+/* mach64GX family */
+#define PCI_MACH64_GX		0x4758	/* mach64GX (ATI888GX00) */
+#define PCI_MACH64_CX		0x4358	/* mach64CX (ATI888CX00) */
+
+/* mach64CT family */
+#define PCI_MACH64_CT		0x4354	/* mach64CT (ATI264CT) */
+#define PCI_MACH64_ET		0x4554	/* mach64ET (ATI264ET) */
+
+/* mach64CT family / mach64VT class */
+#define PCI_MACH64_VT		0x5654	/* mach64VT (ATI264VT) */
+#define PCI_MACH64_VTB		0x5655	/* mach64VTB (ATI264VTB) */
+#define PCI_MACH64_VT4		0x5656	/* mach64VT4 (ATI264VT4) */
+
+/* mach64CT family / mach64GT (3D RAGE) class */
+#define PCI_MACH64_GB		0x4742	/* RAGE PRO, BGA, AGP 1x and 2x */
+#define PCI_MACH64_GD		0x4744	/* RAGE PRO, BGA, AGP 1x only */
+#define PCI_MACH64_GI		0x4749	/* RAGE PRO, BGA, PCI33 only */
+#define PCI_MACH64_GP		0x4750	/* RAGE PRO, PQFP, PCI33, full 3D */
+#define PCI_MACH64_GQ		0x4751	/* RAGE PRO, PQFP, PCI33, limited 3D */
+#define PCI_MACH64_GT		0x4754	/* 3D RAGE II/II+ */
+#define PCI_MACH64_GTB		0x4755	/* 3D II+ */
+#define PCI_MACH64_GTC		0x4756	/* 3D RAGE IIC */
+#define PCI_MACH64_LT		0x4c47	/* 3D RAGE LT */
+
 
 /* CONFIG_CHIP_ID register constants */
 #define CFG_CHIP_TYPE		0x0000FFFF
 #define CFG_CHIP_CLASS		0x00FF0000
 #define CFG_CHIP_REV		0xFF000000
-#define CFG_CHIP_VERSION	0x07000000
-#define CFG_CHIP_FOUNDRY	0x38000000
-#define CFG_CHIP_REVISION	0xC0000000
+#define CFG_CHIP_MAJOR		0x07000000
+#define CFG_CHIP_FND_ID		0x38000000
+#define CFG_CHIP_MINOR		0xC0000000
+
 
 /* Chip IDs read from CONFIG_CHIP_ID */
-#define MACH64_GX_ID		0xD7
-#define MACH64_CX_ID		0x57
-#define MACH64_CT_ID		0x4354
-#define MACH64_ET_ID		0x4554
-#define MACH64_VT_ID		0x5654
-#define MACH64_GT_ID		0x4754
+
+/* mach64GX family */
+#define MACH64_GX_ID		0xD7	/* mach64GX (ATI888GX00) */
+#define MACH64_CX_ID		0x57	/* mach64CX (ATI888CX00) */
+
+/* mach64CT family */
+#define MACH64_CT_ID		PCI_MACH64_CT
+#define MACH64_ET_ID		PCI_MACH64_ET
+
+/* mach64CT family / mach64VT class */
+#define MACH64_VT_ID		PCI_MACH64_VT
+#define MACH64_VTB_ID		PCI_MACH64_VTB
+#define MACH64_VT4_ID		PCI_MACH64_VT4
+
+/* mach64CT family / mach64GT (3D RAGE) class */
+#define MACH64_GB_ID		PCI_MACH64_GB
+#define MACH64_GD_ID		PCI_MACH64_GD
+#define MACH64_GI_ID		PCI_MACH64_GI
+#define MACH64_GP_ID		PCI_MACH64_GP
+#define MACH64_GQ_ID		PCI_MACH64_GQ
+#define MACH64_GT_ID		PCI_MACH64_GT
+#define MACH64_GTB_ID		PCI_MACH64_GTB
+#define MACH64_GTC_ID		PCI_MACH64_GTC
+#define MACH64_LT_ID		PCI_MACH64_LT
+
+
+/* Mach64 major ASIC revisions */
+#define MACH64_ASIC_NEC_VT_A3		0x08
+#define MACH64_ASIC_NEC_VT_A4		0x48
+#define MACH64_ASIC_SGS_VT_A4		0x40
+#define MACH64_ASIC_SGS_VT_B1S1		0x01
+#define MACH64_ASIC_SGS_GT_B1S1		0x01
+#define MACH64_ASIC_SGS_GT_B1S2		0x41
+#define MACH64_ASIC_UMC_GT_B2U1		0x1a
+#define MACH64_ASIC_UMC_GT_B2U2		0x5a
+#define MACH64_ASIC_UMC_VT_B2U3		0x9a
+#define MACH64_ASIC_UMC_GT_B2U3		0x9a
+#define MACH64_ASIC_UMC_R3B_D_P_A1	0x1b
+#define MACH64_ASIC_UMC_R3B_D_P_A2	0x5b
+#define MACH64_ASIC_UMC_R3B_D_P_A3	0x1c
+#define MACH64_ASIC_UMC_R3B_D_P_A4	0x5c
+
+/* Mach64 foundries */
+#define MACH64_FND_SGS		0
+#define MACH64_FND_NEC		1
+#define MACH64_FND_UMC		3
 
 /* Mach64 chip types */
 #define MACH64_UNKNOWN		0
@@ -900,24 +963,4 @@
 #define MACH64_NUM_CLOCKS	16
 #define MACH64_NUM_FREQS	50
 
-/* Wait until "v" queue entries are free */
-#define aty_WaitQueue(v)    { while ((aty_ld_le32(FIFO_STAT) & 0xffff) > \
-			 ((unsigned short)(0x8000 >> (v)))); }
-
-/* Wait until GP is idle and queue is empty */
-#define aty_WaitIdleEmpty() { aty_WaitQueue(16); \
-			  while ((aty_ld_le32(GUI_STAT) & 1) != 0); }
-
-#define SKIP_2(_v) ((((_v)<<1)&0xfff8)|((_v)&0x3)|(((_v)&0x80)>>5))
-
-#define MACH64_BIT_BLT(_srcx, _srcy, _dstx, _dsty, _w, _h, _dir) \
-{ \
-    aty_WaitQueue(5); \
-    aty_st_le32(SRC_Y_X, (((_srcx) << 16) | ((_srcy) & 0x0000ffff))); \
-    aty_st_le32(SRC_WIDTH1, (_w)); \
-    aty_st_le32(DST_CNTL, (_dir)); \
-    aty_st_le32(DST_Y_X, (((_dstx) << 16) | ((_dsty) & 0x0000ffff))); \
-    aty_st_le32(DST_HEIGHT_WIDTH, (((_w) << 16) | ((_h) & 0x0000ffff))); \
-}
 #endif /* REGMACH64_H */
-
diff -u --recursive --new-file v2.1.106/linux/drivers/video/atyfb.c linux/drivers/video/atyfb.c
--- v2.1.106/linux/drivers/video/atyfb.c	Sun Jun  7 11:16:35 1998
+++ linux/drivers/video/atyfb.c	Wed Jun 24 14:44:01 1998
@@ -1,7 +1,8 @@
 /*
- *  linux/drivers/video/atyfb.c -- Frame buffer device for ATI/Open Firmware
+ *  linux/drivers/video/atyfb.c -- Frame buffer device for ATI Mach64
  *
  *	Copyright (C) 1997 Geert Uytterhoeven
+ *	Copyright (C) 1998 Bernd Harries
  *
  *  This driver is partly based on the PowerMac console driver:
  *
@@ -20,6 +21,14 @@
  *  more details.
  */
 
+/******************************************************************************
+
+  TODO:
+
+    - support arbitrary video modes
+
+******************************************************************************/
+
 #include <linux/config.h>
 #include <linux/module.h>
 #include <linux/kernel.h>
@@ -36,10 +45,14 @@
 #include <linux/init.h>
 #include <linux/pci.h>
 #include <linux/nvram.h>
-#include <linux/vc_ioctl.h>
+#ifdef CONFIG_FB_COMPAT_XPMAC
+#include <asm/vc_ioctl.h>
+#endif
 #include <asm/io.h>
+#if defined(CONFIG_PMAC) || defined(CONFIG_CHRP)
 #include <asm/prom.h>
 #include <asm/pci-bridge.h>
+#endif
 
 #include "aty.h"
 #include "fbcon.h"
@@ -48,20 +61,28 @@
 #include "fbcon-cfb32.h"
 
 
+#ifndef __powerpc__
+#define eieio()		/* Enforce In-order Execution of I/O */
+#endif
+
 static int currcon = 0;
 static struct display fb_disp;
-static struct fb_info fb_info;
-static struct { u_char red, green, blue, pad; } palette[256];
 
 static char atyfb_name[16] = "ATY Mach64";
 
 struct atyfb_par {
-    int vmode;
-    int cmode;
+    union {
+	/* this should contain chipset specific mode information */
+	struct {
+	    int vmode;
+	    int cmode;
+	} gx, gt, vt;
+    } hw;
     u_int vxres;	/* virtual screen size */
     u_int vyres;
     int xoffset;	/* virtual screen position */
     int yoffset;
+    int accel;
 };
 
 
@@ -103,34 +124,27 @@
 #define CMODE_32		2	/* 32 (actually 24) bits/pixel */
 
 
-static int default_video_mode = VMODE_NVRAM;
-static int default_color_mode = CMODE_NVRAM;
-
-static struct atyfb_par default_par;
-static struct atyfb_par current_par;
-
+static int default_vmode = VMODE_NVRAM;
+static int default_cmode = CMODE_NVRAM;
 
+#if defined(CONFIG_PMAC) || defined(CONFIG_CHRP)
 /*
  * Addresses in NVRAM where video mode and pixel size are stored.
  */
 #define NV_VMODE	0x140f
 #define NV_CMODE	0x1410
+#endif /* CONFIG_PMAC || CONFIG_CHRP */
+
 
 /*
- * Horizontal and vertical resolution information.
+ * Horizontal and vertical resolution for each mode.
  */
-extern struct vmode_attr {
+static struct vmode_attr {
 	int	hres;
 	int	vres;
 	int	vfreq;
 	int	interlaced;
-} vmode_attrs[VMODE_MAX];
-
-
-/*
- * Horizontal and vertical resolution for each mode.
- */
-static struct vmode_attr vmode_attrs[VMODE_MAX] = {
+} vmode_attrs[VMODE_MAX] = {
     {512, 384, 60, 1},
     {512, 384, 60},
     {640, 480, 50, 1},
@@ -182,6 +196,7 @@
 	{0x72d, VMODE_832_624_75},	/* 16" RGB (Goldfish) */
 	{0x730, VMODE_768_576_50I},	/* PAL (Alternate) */
 	{0x73a, VMODE_1152_870_75},	/* 3rd party 19" */
+	{0x73f, VMODE_640_480_67},	/* no sense lines connected at all */
 	{-1,	VMODE_640_480_60},	/* catch-all, must be last */
 };
 
@@ -196,44 +211,59 @@
 }
 
 struct aty_cmap_regs {
-    unsigned char windex;
-    unsigned char lut;
-    unsigned char mask;
-    unsigned char rindex;
-    unsigned char cntl;
+    u8 windex;
+    u8 lut;
+    u8 mask;
+    u8 rindex;
+    u8 cntl;
 };
 
 typedef struct aty_regvals {
-    int offset[3];		/* first pixel address */
+    u32 offset[3];		/* first pixel address */
 
-    int crtc_h_sync_strt_wid[3];	/* depth dependent */
-    int crtc_gen_cntl[3];
-    int mem_cntl[3];
-
-    int crtc_h_tot_disp;	/* mode dependent */
-    int crtc_v_tot_disp;
-    int crtc_v_sync_strt_wid;
-    int crtc_off_pitch;
+    u32 crtc_h_sync_strt_wid[3];	/* depth dependent */
+    u32 crtc_gen_cntl[3];
+    u32 mem_cntl[3];
+
+    u32 crtc_h_tot_disp;	/* mode dependent */
+    u32 crtc_v_tot_disp;
+    u32 crtc_v_sync_strt_wid;
+    u32 crtc_off_pitch;
 
-    unsigned char clock_val[2];	/* vals for 20 and 21 */
+    u8 clock_val[2];	/* vals for 20 and 21 */
 } aty_regvals;
 
 struct rage_regvals {
-    int h_total, h_sync_start, h_sync_width;
-    int v_total, v_sync_start, v_sync_width;
-    int h_sync_neg, v_sync_neg;
+    u32 h_total, h_sync_start, h_sync_width;
+    u32 v_total, v_sync_start, v_sync_width;
+    u32 h_sync_neg, v_sync_neg;
 };
 
-static int aty_vram_reqd(const struct atyfb_par *par);
-static struct aty_regvals *get_aty_struct(int vmode);
-
-static unsigned long frame_buffer;
+struct fb_info_aty {
+    struct fb_info fb_info;
+    unsigned long ati_regbase_phys;
+    unsigned long ati_regbase;
+    unsigned long frame_buffer_phys;
+    unsigned long frame_buffer;
+    u8 chip_class;
+    u8 pixclock_lim_8;	/* ps, <= 8 bpp */
+    u8 pixclock_lim_hi;	/* ps, > 8 bpp */
+    u32 total_vram;
+    struct aty_cmap_regs *aty_cmap_regs;
+    struct { u8 red, green, blue, pad; } palette[256];
+    struct atyfb_par default_par;
+    struct atyfb_par current_par;
+};
 
-static int total_vram;		/* total amount of video memory, bytes */
-static int chip_type;		/* what chip type was detected */
+#ifdef CONFIG_ATARI
+static unsigned int mach64_count __initdata = 0;
+static unsigned long phys_vmembase[FB_MAX] __initdata = { 0, };
+static unsigned long phys_size[FB_MAX] __initdata = { 0, };
+static unsigned long phys_guiregbase[FB_MAX] __initdata = { 0, };
+#endif
 
-static unsigned long ati_regbase;
-static struct aty_cmap_regs *aty_cmap_regs;
+static int aty_vram_reqd(const struct atyfb_par *par);
+static struct aty_regvals *get_aty_struct(int vmode, struct fb_info_aty *info);
 
 #include "ati-gx.h"
 #include "ati-gt.h"
@@ -291,11 +321,54 @@
 	&aty_vt_reg_init_20
 };
 
+
+#define CLASS_GX	1
+#define CLASS_CT	2
+#define CLASS_VT	3
+#define CLASS_GT	4
+
+struct aty_features {
+    u16 pci_id;
+    u16 chip_type;
+    const char *name;
+    u8 chip_class;
+    u8 pixclock_lim_8;	/* MHz, <= 8 bpp (not sure about these limits!) */
+    u8 pixclock_lim_hi;	/* MHz, > 8 bpp (not sure about these limits!) */
+} aty_features[] __initdata = {
+    /* mach64GX family */
+    { 0x4758, 0x00d7, "mach64GX (ATI888GX00)", CLASS_GX, 135, 80 },
+    { 0x4358, 0x0057, "mach64CX (ATI888CX00)", CLASS_GX, 135, 80 },
+
+    /* mach64CT family */
+    { 0x4354, 0x4354, "mach64CT (ATI264CT)", CLASS_CT, 135, 80 },
+    { 0x4554, 0x4554, "mach64ET (ATI264ET)", CLASS_CT, 135, 80 },
+
+    /* mach64CT family / mach64VT class */
+    { 0x5654, 0x5654, "mach64VT (ATI264VT)", CLASS_VT, 160, 135 },
+    { 0x5655, 0x5655, "mach64VTB (ATI264VTB)", CLASS_VT, 160, 135 },
+    { 0x5656, 0x5656, "mach64VT4 (ATI264VT4)", CLASS_VT, 160, 135 },
+
+    /* mach64CT family / mach64GT (3D RAGE) class */
+    { 0x4742, 0x4742, "3D RAGE PRO (BGA, AGP)", CLASS_GT, 240, 240 },
+    { 0x4744, 0x4744, "3D RAGE PRO (BGA, AGP, 1x only)", CLASS_GT, 240, 240 },
+    { 0x4749, 0x4749, "3D RAGE PRO (BGA, PCI)", CLASS_GT, 240, 240 },
+    { 0x4750, 0x4750, "3D RAGE PRO (PQFP, PCI)", CLASS_GT, 240, 240 },
+    { 0x4751, 0x4751, "3D RAGE PRO (PQFP, PCI, limited 3D)", CLASS_GT, 240, 240 },
+    { 0x4754, 0x4754, "3D RAGE (GT)", CLASS_GT, 200, 200 },
+    { 0x4755, 0x4755, "3D RAGE II+ (GTB)", CLASS_GT, 200, 200 },
+    { 0x4756, 0x4756, "3D RAGE IIC", CLASS_GT, 200, 200 },
+    { 0x4c47, 0x4c47, "3D RAGE LT", CLASS_GT, 200, 200 },
+};
+
+
     /*
      *  Interface used by the world
      */
 
 unsigned long atyfb_init(unsigned long mem_start);
+#ifdef CONFIG_FB_OF
+void atyfb_of_init(struct device_node *dp);
+#endif
 void atyfb_setup(char *options, int *ints);
 
 static int atyfb_open(struct fb_info *info);
@@ -332,6 +405,12 @@
 #ifdef CONFIG_FBCON_CFB8
 static struct display_switch fbcon_aty8;
 #endif
+#ifdef CONFIG_FBCON_CFB16
+static struct display_switch fbcon_aty16;
+#endif
+#ifdef CONFIG_FBCON_CFB32
+static struct display_switch fbcon_aty32;
+#endif
 
 
 #ifdef CONFIG_FB_COMPAT_XPMAC
@@ -341,13 +420,19 @@
 extern int (*console_set_cmap_ptr)(struct fb_cmap *, int, int,
 				   struct fb_info *);
 static int atyfb_console_setmode(struct vc_mode *, int);
-#endif
+#endif /* CONFIG_FB_COMPAT_XPMAC */
 
 
     /*
      *  Internal routines
      */
 
+static int aty_init(struct fb_info_aty *info, const char *name);
+#ifndef CONFIG_FB_OF
+static int store_video_par(char *videopar, unsigned char m64_num);
+static char *strtoke(char *s, const char *ct);
+#endif
+
 static int atyfb_getcolreg(u_int regno, u_int *red, u_int *green, u_int *blue,
 			 u_int *transp, struct fb_info *info);
 static int atyfb_setcolreg(u_int regno, u_int red, u_int green, u_int blue,
@@ -357,352 +442,542 @@
 
 static struct fb_ops atyfb_ops = {
     atyfb_open, atyfb_release, atyfb_get_fix, atyfb_get_var, atyfb_set_var,
-    atyfb_get_cmap, atyfb_set_cmap, atyfb_pan_display, NULL, atyfb_ioctl
+    atyfb_get_cmap, atyfb_set_cmap, atyfb_pan_display, atyfb_ioctl
 };
 
 
 static inline int aty_vram_reqd(const struct atyfb_par *par)
 {
-    return (par->vxres*par->vyres) << par->cmode;
+    return (par->vxres*par->vyres) << par->hw.gx.cmode;
 }
 
-extern inline unsigned aty_ld_le32(volatile unsigned long addr)
+static inline u32 aty_ld_le32(volatile unsigned int regindex,
+			      struct fb_info_aty *info)
 {
-    register unsigned long temp = ati_regbase,val;
+    unsigned long temp;
+    u32 val;
 
-    asm("lwbrx %0,%1,%2": "=r"(val):"r"(addr), "r"(temp));
+#ifdef __powerpc__
+    temp = info->ati_regbase;
+    asm("lwbrx %0,%1,%2": "=r"(val):"r"(regindex), "r"(temp));
+#else
+    temp = info->ati_regbase+regindex;
+    val = le32_to_cpu(*((volatile u32 *)(temp)));
+#endif
     return val;
 }
 
-extern inline void aty_st_le32(volatile unsigned long addr, unsigned val)
+static inline void aty_st_le32(volatile unsigned int regindex, u32 val,
+			       struct fb_info_aty *info)
 {
-    register unsigned long temp = ati_regbase;
+    unsigned long temp;
 
-    asm("stwbrx %0,%1,%2": : "r"(val), "r"(addr), "r"(temp):"memory");
+#ifdef __powerpc__
+    temp = info->ati_regbase;
+    asm("stwbrx %0,%1,%2": : "r"(val), "r"(regindex), "r"(temp):"memory");
+#else
+    temp = info->ati_regbase+regindex;
+    *((volatile u32 *)(temp)) = cpu_to_le32(val);
+#endif
 }
 
-extern inline unsigned char aty_ld_8(volatile unsigned long addr)
+static inline u8 aty_ld_8(volatile unsigned int regindex,
+			  struct fb_info_aty *info)
 {
-    return *(char *) ((long) addr + (long) ati_regbase);
+    return *(volatile u8 *)(info->ati_regbase+regindex);
 }
 
-extern inline void aty_st_8(volatile unsigned long addr, unsigned char val)
+static inline void aty_st_8(volatile unsigned int regindex, u8 val,
+			    struct fb_info_aty *info)
 {
-    *(unsigned char *) (addr + (unsigned long) ati_regbase) = val;
+    *(volatile u8 *)(info->ati_regbase+regindex) = val;
 }
 
-static void aty_st_514(int offset, char val)
+    /*
+     *  All writes to draw engine registers are automatically routed through a
+     *  32-bit-wide, 16-entry-deep command FIFO ...
+     *  Register writes to registers with DWORD offsets less than 40h are not
+     *  FIFOed.
+     *  (from Chapter 5 of the Mach64 Programmer's Guide)
+     */
+
+static inline void wait_for_fifo(u16 entries, struct fb_info_aty *info)
+{
+    while ((aty_ld_le32(FIFO_STAT, info) & 0xffff) >
+	   ((u32)(0x8000 >> entries)));
+}
+
+static inline void wait_for_idle(struct fb_info_aty *info)
 {
-    aty_WaitQueue(5);
-    aty_st_8(DAC_CNTL, 1);
-    aty_st_8(DAC_W_INDEX, offset & 0xff);	/* right addr byte */
-    aty_st_8(DAC_DATA, (offset >> 8) & 0xff);	/* left addr byte */
+    wait_for_fifo(16, info);
+    while ((aty_ld_le32(GUI_STAT, info) & 1)!= 0);
+}
+
+static void reset_engine(struct fb_info_aty *info)
+{
+    /* reset engine */
+    aty_st_le32(GEN_TEST_CNTL,
+		aty_ld_le32(GEN_TEST_CNTL, info) & ~GUI_ENGINE_ENABLE, info);
+    /* enable engine */
+    aty_st_le32(GEN_TEST_CNTL,
+		aty_ld_le32(GEN_TEST_CNTL, info) | GUI_ENGINE_ENABLE, info);
+    /* ensure engine is not locked up by clearing any FIFO or */
+    /* HOST errors */
+    aty_st_le32(BUS_CNTL, aty_ld_le32(BUS_CNTL, info) | BUS_HOST_ERR_ACK |
+			  BUS_FIFO_ERR_ACK, info);
+}
+
+static void init_engine(const struct atyfb_par *par, struct fb_info_aty *info)
+{
+    u32 pitch_value;
+
+    /* determine modal information from global mode structure */
+    pitch_value = par->vxres;
+
+#if 0
+    if (par->hw.gx.cmode == CMODE_24) {
+	/* In 24 bpp, the engine is in 8 bpp - this requires that all */
+	/* horizontal coordinates and widths must be adjusted */
+	pitch_value = pitch_value * 3;
+    }
+#endif
+
+    /* Reset engine, enable, and clear any engine errors */
+    reset_engine(info);
+    /* Ensure that vga page pointers are set to zero - the upper */
+    /* page pointers are set to 1 to handle overflows in the */
+    /* lower page */
+    aty_st_le32(MEM_VGA_WP_SEL, 0x00010000, info);
+    aty_st_le32(MEM_VGA_RP_SEL, 0x00010000, info);
+
+    /* ---- Setup standard engine context ---- */
+
+    /* All GUI registers here are FIFOed - therefore, wait for */
+    /* the appropriate number of empty FIFO entries */
+    wait_for_fifo(14, info);
+
+    /* enable all registers to be loaded for context loads */
+    aty_st_le32(CONTEXT_MASK, 0xFFFFFFFF, info);
+
+    /* set destination pitch to modal pitch, set offset to zero */
+    aty_st_le32(DST_OFF_PITCH, (pitch_value / 8) << 22, info);
+
+    /* zero these registers (set them to a known state) */
+    aty_st_le32(DST_Y_X, 0, info);
+    aty_st_le32(DST_HEIGHT, 0, info);
+    aty_st_le32(DST_BRES_ERR, 0, info);
+    aty_st_le32(DST_BRES_INC, 0, info);
+    aty_st_le32(DST_BRES_DEC, 0, info);
+
+    /* set destination drawing attributes */
+    aty_st_le32(DST_CNTL, DST_LAST_PEL | DST_Y_TOP_TO_BOTTOM |
+			  DST_X_LEFT_TO_RIGHT, info);
+
+    /* set source pitch to modal pitch, set offset to zero */
+    aty_st_le32(SRC_OFF_PITCH, (pitch_value / 8) << 22, info);
+
+    /* set these registers to a known state */
+    aty_st_le32(SRC_Y_X, 0, info);
+    aty_st_le32(SRC_HEIGHT1_WIDTH1, 1, info);
+    aty_st_le32(SRC_Y_X_START, 0, info);
+    aty_st_le32(SRC_HEIGHT2_WIDTH2, 1, info);
+
+    /* set source pixel retrieving attributes */
+    aty_st_le32(SRC_CNTL, SRC_LINE_X_LEFT_TO_RIGHT, info);
+
+    /* set host attributes */
+    wait_for_fifo(13, info);
+    aty_st_le32(HOST_CNTL, 0, info);
+
+    /* set pattern attributes */
+    aty_st_le32(PAT_REG0, 0, info);
+    aty_st_le32(PAT_REG1, 0, info);
+    aty_st_le32(PAT_CNTL, 0, info);
+
+    /* set scissors to modal size */
+    aty_st_le32(SC_LEFT, 0, info);
+    aty_st_le32(SC_TOP, 0, info);
+    aty_st_le32(SC_BOTTOM, par->vyres-1, info);
+    aty_st_le32(SC_RIGHT, pitch_value-1, info);
+
+    /* set background color to minimum value (usually BLACK) */
+    aty_st_le32(DP_BKGD_CLR, 0, info);
+
+    /* set foreground color to maximum value (usually WHITE) */
+    aty_st_le32(DP_FRGD_CLR, 0xFFFFFFFF, info);
+
+    /* set write mask to effect all pixel bits */
+    aty_st_le32(DP_WRITE_MASK, 0xFFFFFFFF, info);
+
+    /* set foreground mix to overpaint and background mix to */
+    /* no-effect */
+    aty_st_le32(DP_MIX, FRGD_MIX_S | BKGD_MIX_D, info);
+
+    /* set primary source pixel channel to foreground color */
+    /* register */
+    aty_st_le32(DP_SRC, FRGD_SRC_FRGD_CLR, info);
+
+    /* set compare functionality to false (no-effect on */
+    /* destination) */
+    wait_for_fifo(3, info);
+    aty_st_le32(CLR_CMP_CLR, 0, info);
+    aty_st_le32(CLR_CMP_MASK, 0xFFFFFFFF, info);
+    aty_st_le32(CLR_CMP_CNTL, 0, info);
+
+    /* set pixel depth */
+    wait_for_fifo(2, info);
+    switch(par->hw.gx.cmode) {
+#ifdef CONFIG_FBCON_CFB8
+	case CMODE_8:
+	    aty_st_le32(DP_PIX_WIDTH, HOST_8BPP | SRC_8BPP | DST_8BPP |
+				      BYTE_ORDER_LSB_TO_MSB,
+	    info);
+	    aty_st_le32(DP_CHAIN_MASK, 0x8080, info);
+	    break;
+#endif
+#ifdef CONFIG_FBCON_CFB16
+	case CMODE_16:
+	    aty_st_le32(DP_PIX_WIDTH, HOST_15BPP | SRC_15BPP | DST_15BPP |
+				      BYTE_ORDER_LSB_TO_MSB,
+	    info);
+	    aty_st_le32(DP_CHAIN_MASK, 0x4210, info);
+	    break;
+#endif
+#if 0
+	case CMODE_24:
+	    aty_st_le32(DP_PIX_WIDTH, HOST_8BPP | SRC_8BPP | DST_8BPP |
+				      BYTE_ORDER_LSB_TO_MSB,
+	    info);
+	    aty_st_le32(DP_CHAIN_MASK, 0x8080, info);
+	    break;
+#endif
+#ifdef CONFIG_FBCON_CFB32
+	case CMODE_32:
+	    aty_st_le32(DP_PIX_WIDTH, HOST_32BPP | SRC_32BPP | DST_32BPP |
+				      BYTE_ORDER_LSB_TO_MSB, info);
+	    aty_st_le32(DP_CHAIN_MASK, 0x8080, info);
+	    break;
+#endif
+    }
+    /* insure engine is idle before leaving */
+    wait_for_idle(info);
+}
+
+static void aty_st_514(int offset, u8 val, struct fb_info_aty *info)
+{
+    aty_st_8(DAC_CNTL, 1, info);
+    /* right addr byte */
+    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);
+    aty_st_8(DAC_MASK, val, info);
     eieio();
-    aty_st_8(DAC_CNTL, 0);
+    aty_st_8(DAC_CNTL, 0, info);
 }
 
-static void aty_st_pll(int offset, char val)
+static void aty_st_pll(int offset, u8 val, struct fb_info_aty *info)
 {
-    aty_WaitQueue(3);
-    aty_st_8(CLOCK_CNTL + 1, (offset << 2) | PLL_WR_EN);	/* write addr byte */
+    /* write addr byte */
+    aty_st_8(CLOCK_CNTL + 1, (offset << 2) | PLL_WR_EN, info);
     eieio();
-    aty_st_8(CLOCK_CNTL + 2, val);	/* write the register value */
+    /* write the register value */
+    aty_st_8(CLOCK_CNTL + 2, val, info);
     eieio();
-    aty_st_8(CLOCK_CNTL + 1, (offset << 2) & ~PLL_WR_EN);
+    aty_st_8(CLOCK_CNTL + 1, (offset << 2) & ~PLL_WR_EN, info);
 }
 
-static struct aty_regvals *get_aty_struct(int vmode)
+static struct aty_regvals *get_aty_struct(int vmode, struct fb_info_aty *info)
 {
     int v = vmode - 1;
 
-    switch (chip_type) {
-	case MACH64_GT_ID:
-	    return aty_gt_reg_init[v];
+    switch (info->chip_class) {
+	case CLASS_GX:
+	    return aty_gx_reg_init[v];
 	    break;
-	case MACH64_VT_ID:
+	case CLASS_CT:
+	case CLASS_VT:
 	    return aty_vt_reg_init[v];
 	    break;
-	default: /* default to MACH64_GX_ID */
-	    return aty_gx_reg_init[v];
+	case CLASS_GT:
+	    return aty_gt_reg_init[v];
 	    break;
+	default:
+	    /* should NOT happen */
+	    return NULL;
     }
 }
 
-static int read_aty_sense(void)
+static int read_aty_sense(struct fb_info_aty *info)
 {
     int sense, i;
 
-    aty_st_le32(GP_IO, 0x31003100);	/* drive outputs high */
+    aty_st_le32(GP_IO, 0x31003100, info);	/* drive outputs high */
     __delay(200);
-    aty_st_le32(GP_IO, 0);		/* turn off outputs */
+    aty_st_le32(GP_IO, 0, info);		/* turn off outputs */
     __delay(2000);
-    i = aty_ld_le32(GP_IO);		/* get primary sense value */
+    i = aty_ld_le32(GP_IO, info);		/* get primary sense value */
     sense = ((i & 0x3000) >> 3) | (i & 0x100);
 
     /* drive each sense line low in turn and collect the other 2 */
-    aty_st_le32(GP_IO, 0x20000000);	/* drive A low */
+    aty_st_le32(GP_IO, 0x20000000, info);	/* drive A low */
     __delay(2000);
-    i = aty_ld_le32(GP_IO);
+    i = aty_ld_le32(GP_IO, info);
     sense |= ((i & 0x1000) >> 7) | ((i & 0x100) >> 4);
-    aty_st_le32(GP_IO, 0x20002000);	/* drive A high again */
+    aty_st_le32(GP_IO, 0x20002000, info);	/* drive A high again */
     __delay(200);
 
-    aty_st_le32(GP_IO, 0x10000000);	/* drive B low */
+    aty_st_le32(GP_IO, 0x10000000, info);	/* drive B low */
     __delay(2000);
-    i = aty_ld_le32(GP_IO);
+    i = aty_ld_le32(GP_IO, info);
     sense |= ((i & 0x2000) >> 10) | ((i & 0x100) >> 6);
-    aty_st_le32(GP_IO, 0x10001000);	/* drive B high again */
+    aty_st_le32(GP_IO, 0x10001000, info);	/* drive B high again */
     __delay(200);
 
-    aty_st_le32(GP_IO, 0x01000000);	/* drive C low */
+    aty_st_le32(GP_IO, 0x01000000, info);	/* drive C low */
     __delay(2000);
-    sense |= (aty_ld_le32(GP_IO) & 0x3000) >> 12;
-    aty_st_le32(GP_IO, 0);		/* turn off outputs */
+    sense |= (aty_ld_le32(GP_IO, info) & 0x3000) >> 12;
+    aty_st_le32(GP_IO, 0, info);		/* turn off outputs */
 
     return sense;
 }
 
-static void RGB514_Program(int cmode)
+static void RGB514_Program(int cmode, struct fb_info_aty *info)
 {
     typedef struct {
-	char pixel_dly;
-	char misc2_cntl;
-	char pixel_rep;
-	char pixel_cntl_index;
-	char pixel_cntl_v1;
+	u8 pixel_dly;
+	u8 misc2_cntl;
+	u8 pixel_rep;
+	u8 pixel_cntl_index;
+	u8 pixel_cntl_v1;
     } RGB514_DAC_Table;
 
     static RGB514_DAC_Table RGB514DAC_Tab[8] = {
-	{0, 0x41, 0x03, 0x71, 0x45},	// 8bpp
-	{0, 0x45, 0x04, 0x0c, 0x01},	// 555
-	{0, 0x45, 0x06, 0x0e, 0x00},	// XRGB
+	{0, 0x41, 0x03, 0x71, 0x45},	/* 8bpp */
+	{0, 0x45, 0x04, 0x0c, 0x01},	/* 555 */
+	{0, 0x45, 0x06, 0x0e, 0x00},	/* XRGB */
     };
     RGB514_DAC_Table *pDacProgTab;
 
     pDacProgTab = &RGB514DAC_Tab[cmode];
 
-    aty_st_514(0x90, 0x00);
-    aty_st_514(0x04, pDacProgTab->pixel_dly);
-    aty_st_514(0x05, 0x00);
+    aty_st_514(0x90, 0x00, info);
+    aty_st_514(0x04, pDacProgTab->pixel_dly, info);
+    aty_st_514(0x05, 0x00, info);
 
-    aty_st_514(0x2, 0x1);
-    aty_st_514(0x71, pDacProgTab->misc2_cntl);
-    aty_st_514(0x0a, pDacProgTab->pixel_rep);
+    aty_st_514(0x2, 0x1, info);
+    aty_st_514(0x71, pDacProgTab->misc2_cntl, info);
+    aty_st_514(0x0a, pDacProgTab->pixel_rep, info);
 
-    aty_st_514(pDacProgTab->pixel_cntl_index, pDacProgTab->pixel_cntl_v1);
+    aty_st_514(pDacProgTab->pixel_cntl_index, pDacProgTab->pixel_cntl_v1,
+	       info);
 }
 
-static void set_off_pitch(const struct atyfb_par *par)
+static void set_off_pitch(const struct atyfb_par *par,
+			  struct fb_info_aty *info)
 {
     u32 pitch, offset;
 
     pitch = par->vxres>>3;
-    offset = ((par->yoffset*par->vxres+par->xoffset)>>3)<<par->cmode;
-    aty_st_le32(CRTC_OFF_PITCH, pitch<<22 | offset);
-    if (chip_type == MACH64_GT_ID) {
-	/* Is this OK for other chips? */
-	aty_st_le32(DST_OFF_PITCH, pitch<<22 | offset);
-	aty_st_le32(SRC_OFF_PITCH, pitch<<22 | offset);
-    }
+    offset = ((par->yoffset*par->vxres+par->xoffset)>>3)<<par->hw.gx.cmode;
+    aty_st_le32(CRTC_OFF_PITCH, pitch<<22 | offset, info);
 }
 
-static void atyfb_set_par(struct atyfb_par *par)
+static void atyfb_set_par(struct atyfb_par *par, struct fb_info_aty *info)
 {
-    int i, hres;
-    struct aty_regvals *init = get_aty_struct(par->vmode);
-    int vram_type = aty_ld_le32(CONFIG_STAT0) & 7;
+    int i, j, hres;
+    struct aty_regvals *init = get_aty_struct(par->hw.gx.vmode, info);
+    int vram_type = aty_ld_le32(CONFIG_STAT0, info) & 7;
 
     if (init == 0)	/* paranoia, shouldn't get here */
-	panic("aty: display mode %d not supported", par->vmode);
+	panic("aty: display mode %d not supported", par->hw.gx.vmode);
 
-    current_par = *par;
-    hres = vmode_attrs[par->vmode-1].hres;
+    info->current_par = *par;
+    hres = vmode_attrs[par->hw.gx.vmode-1].hres;
 
-    /* clear FIFO errors */
-    aty_st_le32(BUS_CNTL, aty_ld_le32(BUS_CNTL) | BUS_HOST_ERR_ACK
-			  | BUS_FIFO_ERR_ACK);
-
-    /* Reset engine */
-    i = aty_ld_le32(GEN_TEST_CNTL);
-    aty_st_le32(GEN_TEST_CNTL, i & ~GUI_ENGINE_ENABLE);
-    eieio();
-    aty_WaitIdleEmpty();
-    aty_st_le32(GEN_TEST_CNTL, i | GUI_ENGINE_ENABLE);
-    aty_WaitIdleEmpty();
-
-    if ( chip_type != MACH64_GT_ID ) {
-	i = aty_ld_le32(CRTC_GEN_CNTL);
-	aty_st_le32(CRTC_GEN_CNTL, i | CRTC_EXT_DISP_EN);
-    }
-
-    if ( chip_type == MACH64_GX_ID ) {
-	i = aty_ld_le32(GEN_TEST_CNTL);
-	aty_st_le32(GEN_TEST_CNTL, i | GEN_OVR_OUTPUT_EN );
-    }
-
-    switch (chip_type) {
-	case MACH64_VT_ID:
-	    aty_st_pll(PLL_MACRO_CNTL, 0xb5);
-	    aty_st_pll(PLL_REF_DIV, 0x2d);
-	    aty_st_pll(PLL_GEN_CNTL, 0x14);
-	    aty_st_pll(MCLK_FB_DIV, 0xbd);
-	    aty_st_pll(PLL_VCLK_CNTL, 0x0b);
-	    aty_st_pll(VCLK_POST_DIV, init->clock_val[0]);
-	    aty_st_pll(VCLK0_FB_DIV, init->clock_val[1]);
-	    aty_st_pll(VCLK1_FB_DIV, 0xd6);
-	    aty_st_pll(VCLK2_FB_DIV, 0xee);
-	    aty_st_pll(VCLK3_FB_DIV, 0xf8);
-	    aty_st_pll(PLL_XCLK_CNTL, 0x0);
-	    aty_st_pll(PLL_TEST_CTRL, 0x0);
-	    aty_st_pll(PLL_TEST_COUNT, 0x0);
+    if (info->chip_class != CLASS_GT) {
+	i = aty_ld_le32(CRTC_GEN_CNTL, info);
+	aty_st_le32(CRTC_GEN_CNTL, i | CRTC_EXT_DISP_EN, info);
+    }
+
+    if (info->chip_class == CLASS_GX) {
+	i = aty_ld_le32(GEN_TEST_CNTL, info);
+	aty_st_le32(GEN_TEST_CNTL, i | GEN_OVR_OUTPUT_EN, info);
+    }
+
+    switch (info->chip_class) {
+	case CLASS_GX:
+	    RGB514_Program(par->hw.gx.cmode, info);
+	    wait_for_idle(info);
+	    aty_st_514(0x06, 0x02, info);
+	    aty_st_514(0x10, 0x01, info);
+	    aty_st_514(0x70, 0x01, info);
+	    aty_st_514(0x8f, 0x1f, info);
+	    aty_st_514(0x03, 0x00, info);
+	    aty_st_514(0x05, 0x00, info);
+	    aty_st_514(0x20, init->clock_val[0], info);
+	    aty_st_514(0x21, init->clock_val[1], info);
+	    break;
+	case CLASS_CT:
+	case CLASS_VT:
+	    aty_st_pll(VPLL_CNTL, 0xb5, info);
+	    aty_st_pll(PLL_REF_DIV, 0x2d, info);
+	    aty_st_pll(PLL_GEN_CNTL, 0x14, info);
+	    aty_st_pll(MCLK_FB_DIV, 0xbd, info);
+	    aty_st_pll(PLL_VCLK_CNTL, 0x0b, info);
+	    aty_st_pll(VCLK_POST_DIV, init->clock_val[0], info);
+	    aty_st_pll(VCLK0_FB_DIV, init->clock_val[1], info);
+	    aty_st_pll(VCLK1_FB_DIV, 0xd6, info);
+	    aty_st_pll(VCLK2_FB_DIV, 0xee, info);
+	    aty_st_pll(VCLK3_FB_DIV, 0xf8, info);
+	    aty_st_pll(PLL_EXT_CNTL, 0x0, info);
+	    aty_st_pll(PLL_TEST_CTRL, 0x0, info);
+	    aty_st_pll(PLL_TEST_COUNT, 0x0, info);
 	    break;
-	case MACH64_GT_ID:
+	case CLASS_GT:
 	    if (vram_type == 5) {
-		aty_st_pll(0, 0xcd);
-		aty_st_pll(PLL_MACRO_CNTL,
-			   par->vmode >= VMODE_1024_768_60 ? 0xd3: 0xd5);
-		aty_st_pll(PLL_REF_DIV, 0x21);
-		aty_st_pll(PLL_GEN_CNTL, 0x44);
-		aty_st_pll(MCLK_FB_DIV, 0xe8);
-		aty_st_pll(PLL_VCLK_CNTL, 0x03);
-		aty_st_pll(VCLK_POST_DIV, init->offset[0]);
-		aty_st_pll(VCLK0_FB_DIV, init->offset[1]);
-		aty_st_pll(VCLK1_FB_DIV, 0x8e);
-		aty_st_pll(VCLK2_FB_DIV, 0x9e);
-		aty_st_pll(VCLK3_FB_DIV, 0xc6);
-		aty_st_pll(PLL_XCLK_CNTL, init->offset[2]);
-		aty_st_pll(12, 0xa6);
-		aty_st_pll(13, 0x1b);
+		aty_st_pll(MPLL_CNTL, 0xcd, info);
+		aty_st_pll(VPLL_CNTL,
+			   par->hw.gx.vmode >= VMODE_1024_768_60 ? 0xd3
+								 : 0xd5,
+			   info);
+		aty_st_pll(PLL_REF_DIV, 0x21, info);
+		aty_st_pll(PLL_GEN_CNTL, 0x44, info);
+		aty_st_pll(MCLK_FB_DIV, 0xe8, info);
+		aty_st_pll(PLL_VCLK_CNTL, 0x03, info);
+		aty_st_pll(VCLK_POST_DIV, init->offset[0], info);
+		aty_st_pll(VCLK0_FB_DIV, init->offset[1], info);
+		aty_st_pll(VCLK1_FB_DIV, 0x8e, info);
+		aty_st_pll(VCLK2_FB_DIV, 0x9e, info);
+		aty_st_pll(VCLK3_FB_DIV, 0xc6, info);
+		aty_st_pll(PLL_EXT_CNTL, init->offset[2], info);
+		aty_st_pll(DLL_CNTL, 0xa6, info);
+		aty_st_pll(VFC_CNTL, 0x1b, info);
 	    } else {
-		aty_st_pll(PLL_MACRO_CNTL, 0xd5);
-		aty_st_pll(PLL_REF_DIV, 0x21);
-		aty_st_pll(PLL_GEN_CNTL, 0xc4);
-		aty_st_pll(MCLK_FB_DIV, 0xda);
-		aty_st_pll(PLL_VCLK_CNTL, 0x03);
+		aty_st_pll(VPLL_CNTL, 0xd5, info);
+		aty_st_pll(PLL_REF_DIV, 0x21, info);
+		aty_st_pll(PLL_GEN_CNTL, 0xc4, info);
+		aty_st_pll(MCLK_FB_DIV, 0xda, info);
+		aty_st_pll(PLL_VCLK_CNTL, 0x03, info);
 		/* offset actually holds clock values */
-		aty_st_pll(VCLK_POST_DIV, init->offset[0]);
-		aty_st_pll(VCLK0_FB_DIV, init->offset[1]);
-		aty_st_pll(VCLK1_FB_DIV, 0x8e);
-		aty_st_pll(VCLK2_FB_DIV, 0x9e);
-		aty_st_pll(VCLK3_FB_DIV, 0xc6);
-		aty_st_pll(PLL_TEST_CTRL, 0x0);
-		aty_st_pll(PLL_XCLK_CNTL, init->offset[2]);
-		aty_st_pll(12, 0xa0);
-		aty_st_pll(13, 0x1b);
+		aty_st_pll(VCLK_POST_DIV, init->offset[0], info);
+		aty_st_pll(VCLK0_FB_DIV, init->offset[1], info);
+		aty_st_pll(VCLK1_FB_DIV, 0x8e, info);
+		aty_st_pll(VCLK2_FB_DIV, 0x9e, info);
+		aty_st_pll(VCLK3_FB_DIV, 0xc6, info);
+		aty_st_pll(PLL_TEST_CTRL, 0x0, info);
+		aty_st_pll(PLL_EXT_CNTL, init->offset[2], info);
+		aty_st_pll(DLL_CNTL, 0xa0, info);
+		aty_st_pll(VFC_CNTL, 0x1b, info);
 	    }
 	    break;
-	default:
-	    RGB514_Program(par->cmode);
-	    aty_WaitIdleEmpty();
-	    aty_st_514(0x06, 0x02);
-	    aty_st_514(0x10, 0x01);
-	    aty_st_514(0x70, 0x01);
-	    aty_st_514(0x8f, 0x1f);
-	    aty_st_514(0x03, 0x00);
-	    aty_st_514(0x05, 0x00);
-	    aty_st_514(0x20, init->clock_val[0]);
-	    aty_st_514(0x21, init->clock_val[1]);
-	    break;
     }
 
-    aty_ld_8(DAC_REGS);	/* clear counter */
-    aty_WaitIdleEmpty();
-
-    aty_st_le32(CRTC_H_TOTAL_DISP, init->crtc_h_tot_disp);
-    aty_st_le32(CRTC_H_SYNC_STRT_WID, init->crtc_h_sync_strt_wid[par->cmode]);
-    aty_st_le32(CRTC_V_TOTAL_DISP, init->crtc_v_tot_disp);
-    aty_st_le32(CRTC_V_SYNC_STRT_WID, init->crtc_v_sync_strt_wid);
-
-    aty_st_8(CLOCK_CNTL, 0);
-    aty_st_8(CLOCK_CNTL, CLOCK_STROBE);
-
-    aty_st_le32(CRTC_VLINE_CRNT_VLINE, 0);
-
-    set_off_pitch(par);
-
-    if (chip_type == MACH64_GT_ID) {
-	aty_st_le32(BUS_CNTL, 0x7b23a040);
-
-	/* need to set DSP values !! assume sdram */
-	i = init->crtc_gen_cntl[0] - (0x100000 * par->cmode);
-	if ( vram_type == 5 )
-	    i = init->crtc_gen_cntl[1] - (0x100000 * par->cmode);
-	aty_st_le32(DSP_CONFIG, i);
-
-	i = aty_ld_le32(MEM_CNTL) & MEM_SIZE_ALIAS;
-	if ( vram_type == 5 ) {
-	    i |= ((1 * par->cmode) << 26) | 0x4215b0;
-	    aty_st_le32(DSP_ON_OFF,sgram_dsp[par->vmode-1][par->cmode]);
-
-	//aty_st_le32(CLOCK_CNTL,8192);
-	} else {
-	    i |= ((1 * par->cmode) << 26) | 0x300090;
-	    aty_st_le32(DSP_ON_OFF, init->mem_cntl[par->cmode]);
-	}
-
-	aty_st_le32(MEM_CNTL, i);
-	aty_st_le32(EXT_MEM_CNTL, 0x5000001);
+    aty_ld_8(DAC_REGS, info);	/* clear counter */
+    wait_for_idle(info);
 
-	/* if (total_vram > 0x400000)	
-	    i |= 0x538; this not been verified on > 4Megs!! */
-    } else {
-
-/* The magic constant below translates into:
-* 5   = No RDY delay, 1 wait st for mem write, increment during burst transfer
-* 9   = DAC access delayed, 1 wait state for DAC
-* 0   = Disables interupts for FIFO errors
-* e   = Allows FIFO to generate 14 wait states before generating error
-* 1   = DAC snooping disabled, ROM disabled
-* 0   = ROM page at 0 (disabled so doesn't matter)
-* f   = 15 ROM wait states (disabled so doesn't matter)
-* f   = 15 BUS wait states (I'm not sure this applies to PCI bus types)
-* at some point it would be good to experiment with bench marks to see if
-* we can gain some speed by fooling with the wait states etc.
-*/
-	if (chip_type == MACH64_VT_ID)
-	    aty_st_le32(BUS_CNTL, 0x680000f9);
-	else
-	    aty_st_le32(BUS_CNTL, 0x590e10ff);
-
-	switch (total_vram) {
-	    case 0x00100000:
-		aty_st_le32(MEM_CNTL, vt_mem_cntl[0][par->cmode]);
-		break;
-	    case 0x00200000:
-		aty_st_le32(MEM_CNTL, vt_mem_cntl[1][par->cmode]);
-		break;
-	    case 0x00400000:
-		aty_st_le32(MEM_CNTL, vt_mem_cntl[2][par->cmode]);
-		break;
-	    default:
-		i = aty_ld_le32(MEM_CNTL) & 0x000F;
-		aty_st_le32(MEM_CNTL,
-			    (init->mem_cntl[par->cmode] & 0xFFFFFFF0) | i);
-	}
-    }
-/* These magic constants are harder to figure out
-* on the vt chipset bit 2 set makes the screen brighter
-* and bit 15 makes the screen black! But nothing else
-* seems to matter for the vt DAC_CNTL
-*/
-    switch (chip_type) {
-	case MACH64_GT_ID:
-	    i = 0x86010102;
+    aty_st_le32(CRTC_H_TOTAL_DISP, init->crtc_h_tot_disp, info);
+    aty_st_le32(CRTC_H_SYNC_STRT_WID,
+		init->crtc_h_sync_strt_wid[par->hw.gx.cmode], info);
+    aty_st_le32(CRTC_V_TOTAL_DISP, init->crtc_v_tot_disp, info);
+    aty_st_le32(CRTC_V_SYNC_STRT_WID, init->crtc_v_sync_strt_wid, info);
+
+    aty_st_8(CLOCK_CNTL, 0, info);
+    aty_st_8(CLOCK_CNTL, CLOCK_STROBE, info);
+
+    aty_st_le32(CRTC_VLINE_CRNT_VLINE, 0, info);
+
+    set_off_pitch(par, info);
+
+    switch (info->chip_class) {
+	case CLASS_GX:
+	    /* The magic constant below translates into:
+	     * 5  = No RDY delay, 1 wait st for mem write, increment during
+	     *      burst transfer
+	     * 9  = DAC access delayed, 1 wait state for DAC
+	     * 0  = Disables interupts for FIFO errors
+	     * e  = Allows FIFO to generate 14 wait states before generating
+	     *      error
+	     * 1  = DAC snooping disabled, ROM disabled
+	     * 0  = ROM page at 0 (disabled so doesn't matter)
+	     * f  = 15 ROM wait states (disabled so doesn't matter)
+	     * f  = 15 BUS wait states (I'm not sure this applies to PCI bus
+	     *      types)
+	     * at some point it would be good to experiment with bench marks to
+	     * if we can gain some speed by fooling with the wait states etc.
+	     */
+	    aty_st_le32(BUS_CNTL, 0x890e20f1 /* 0x590e10ff */, info);
+	    j = 0x47012100;
+	    j = 0x47052100;
 	    break;
-	case MACH64_VT_ID:
-	    i = 0x87010184;
+
+	case CLASS_CT:
+	case CLASS_VT:
+	    aty_st_le32(BUS_CNTL, 0x680000f9, info);
+	    switch (info->total_vram) {
+		case 0x00100000:
+		    aty_st_le32(MEM_CNTL, vt_mem_cntl[0][par->hw.gx.cmode],
+				info);
+		    break;
+		case 0x00200000:
+		    aty_st_le32(MEM_CNTL, vt_mem_cntl[1][par->hw.gx.cmode],
+				info);
+		    break;
+		case 0x00400000:
+		    aty_st_le32(MEM_CNTL, vt_mem_cntl[2][par->hw.gx.cmode],
+				info);
+		    break;
+		default:
+		    i = aty_ld_le32(MEM_CNTL, info) & 0x000F;
+		    aty_st_le32(MEM_CNTL,
+				(init->mem_cntl[par->hw.gx.cmode] &
+				 0xFFFFFFF0) | i,
+				info);
+	    }
+	    j = 0x87010184;
 	    break;
-	default:
-	    i = 0x47012100;
+
+	case CLASS_GT:
+	    aty_st_le32(BUS_CNTL, 0x7b23a040, info);
+
+	    /* need to set DSP values !! assume sdram */
+	    i = init->crtc_gen_cntl[0] - (0x100000 * par->hw.gx.cmode);
+	    if ( vram_type == 5 )
+		i = init->crtc_gen_cntl[1] - (0x100000 * par->hw.gx.cmode);
+	    aty_st_le32(DSP_CONFIG, i, info);
+
+	    i = aty_ld_le32(MEM_CNTL, info) & MEM_SIZE_ALIAS;
+	    if ( vram_type == 5 ) {
+		i |= ((1 * par->hw.gx.cmode) << 26) | 0x4215b0;
+		aty_st_le32(DSP_ON_OFF,
+			    sgram_dsp[par->hw.gx.vmode-1][par->hw.gx.cmode],
+			    info);
+
+		/* aty_st_le32(CLOCK_CNTL, 8192, info); */
+	    } else {
+		i |= ((1 * par->hw.gx.cmode) << 26) | 0x300090;
+		aty_st_le32(DSP_ON_OFF, init->mem_cntl[par->hw.gx.cmode],
+			    info);
+	    }
+	    aty_st_le32(MEM_CNTL, i, info);
+	    aty_st_le32(EXT_MEM_CNTL, 0x5000001, info);
+
+	    /* if (info->total_vram > 0x400000)	
+		i |= 0x538; this not been verified on > 4Megs!! */
+
+	    j = 0x86010102;
 	    break;
     }
 
-    aty_st_le32(DAC_CNTL, i);
-    aty_st_8(DAC_MASK, 0xff);
+    /* These magic constants (variable j) are harder to figure out
+    * on the vt chipset bit 2 set makes the screen brighter
+    * and bit 15 makes the screen black! But nothing else
+    * seems to matter for the vt DAC_CNTL
+    */
+    aty_st_le32(DAC_CNTL, j, info);
+    aty_st_8(DAC_MASK, 0xff, info);
 
-    switch (par->cmode) {
+    switch (par->hw.gx.cmode) {
 	case CMODE_16:
 	    i = CRTC_PIX_WIDTH_15BPP; break;
 	/*case CMODE_24: */
@@ -713,28 +988,35 @@
 	    i = CRTC_PIX_WIDTH_8BPP; break;
     }
 
-    if (chip_type != MACH64_GT_ID) {
-	aty_st_le32(CRTC_INT_CNTL, 0x00000002);
-	aty_st_le32(GEN_TEST_CNTL, GUI_ENGINE_ENABLE | BLOCK_WRITE_ENABLE);	/* gui_en block_en */
-	i |= init->crtc_gen_cntl[par->cmode];
+    if (info->chip_class != CLASS_GT) {
+	aty_st_le32(CRTC_INT_CNTL, 0x00000002, info);
+	aty_st_le32(GEN_TEST_CNTL, GUI_ENGINE_ENABLE | BLOCK_WRITE_ENABLE,
+		    info);	/* gui_en block_en */
+	i |= init->crtc_gen_cntl[par->hw.gx.cmode];
     }
     /* Gentlemen, start your crtc engine */
-    aty_st_le32(CRTC_GEN_CNTL, CRTC_EXT_DISP_EN | CRTC_ENABLE | i);
+    aty_st_le32(CRTC_GEN_CNTL, CRTC_EXT_DISP_EN | CRTC_ENABLE | i, info);
+
+    /* Initialize the graphics engine */
+    if (par->accel & FB_ACCELF_TEXT)
+	init_engine(par, info);
 
 #ifdef CONFIG_FB_COMPAT_XPMAC
-    display_info.height = vmode_attrs[par->vmode-1].vres;
-    display_info.width = vmode_attrs[par->vmode-1].hres;
-    display_info.depth = 8<<par->cmode;
-    display_info.pitch = par->vxres<<par->cmode;
-    display_info.mode = par->vmode;
-    strcpy(display_info.name, atyfb_name);
-    display_info.fb_address =
-	iopa(((chip_type != MACH64_GT_ID) ?
-	     frame_buffer + init->offset[par->cmode] : frame_buffer));
-    display_info.cmap_adr_address = iopa((unsigned long)&aty_cmap_regs->windex);
-    display_info.cmap_data_address = iopa((unsigned long)&aty_cmap_regs->lut);
-    display_info.disp_reg_address = iopa(ati_regbase);
-#endif /* CONFIG_FB_COMPAT_XPMAC) */
+    if (console_fb_info == &info->fb_info) {
+	display_info.height = vmode_attrs[par->hw.gx.vmode-1].vres;
+	display_info.width = vmode_attrs[par->hw.gx.vmode-1].hres;
+	display_info.depth = 8<<par->hw.gx.cmode;
+	display_info.pitch = par->vxres<<par->hw.gx.cmode;
+	display_info.mode = par->hw.gx.vmode;
+	strcpy(display_info.name, atyfb_name);
+	display_info.fb_address = info->frame_buffer_phys;
+	if (info->chip_class == CLASS_VT)
+	    display_info.fb_address += init->offset[par->hw.gx.cmode];
+	display_info.cmap_adr_address = info->ati_regbase_phys+0xc0;
+	display_info.cmap_data_address = info->ati_regbase_phys+0xc1;
+	display_info.disp_reg_address = info->ati_regbase_phys;
+    }
+#endif /* CONFIG_FB_COMPAT_XPMAC */
 }
 
 
@@ -761,30 +1043,67 @@
 
 
 static int encode_fix(struct fb_fix_screeninfo *fix,
-		      const struct atyfb_par *par)
+		      const struct atyfb_par *par, struct fb_info_aty *info)
 {
     struct aty_regvals *init;
 
     memset(fix, 0, sizeof(struct fb_fix_screeninfo));
 
     strcpy(fix->id, atyfb_name);
-    init = get_aty_struct(par->vmode);
+    init = get_aty_struct(par->hw.gx.vmode, info);
     /*
      *  FIXME: This will cause problems on non-GT chips, because the frame
      *  buffer must be aligned to a page
      */
-    fix->smem_start = (char *)((chip_type != MACH64_GT_ID)
-	    ? frame_buffer + init->offset[par->cmode] : frame_buffer);
-    fix->smem_len = (u32)total_vram;
-    if (fix->smem_len > 0x7ff000)
-	fix->smem_len = 0x7ff000;	/* last page is MMIO */
-    fix->mmio_start = (char *)(ati_regbase & ~0xfff);
-    fix->mmio_len = 4096;
+    fix->smem_start = (char *)info->frame_buffer_phys;
+    if (info->chip_class == CLASS_VT)
+	fix->smem_start += init->offset[par->hw.gx.cmode];
+    fix->smem_len = (u32)info->total_vram;
+
+#ifdef __LITTLE_ENDIAN
+    /*
+     *  Last page of 8 MB little-endian aperture is MMIO
+     *  FIXME: we should use the auxillary aperture instead so we can acces the
+     *  full 8 MB of video RAM on 8 MB boards
+     */
+    if (fix->smem_len > 0x800000-PAGE_SIZE)
+	fix->smem_len = 0x800000-PAGE_SIZE;
+#endif
+    /*
+     *  Reg Block 0 (CT-compatible block) is at ati_regbase_phys
+     *  Reg Block 1 (multimedia extensions) is at ati_regbase_phys-0x400
+     */
+    switch (info->chip_class) {
+	case CLASS_GX:
+	    fix->mmio_start = (char *)info->ati_regbase_phys;
+	    fix->mmio_len = 0x400;
+	    fix->accel = FB_ACCEL_ATI_MACH64GX;
+	    break;
+	case CLASS_CT:
+	    fix->mmio_start = (char *)info->ati_regbase_phys;
+	    fix->mmio_len = 0x400;
+	    fix->accel = FB_ACCEL_ATI_MACH64CT;
+	    break;
+	case CLASS_VT:
+	    fix->mmio_start = (char *)(info->ati_regbase_phys-0x400);
+	    fix->mmio_len = 0x800;
+	    fix->accel = FB_ACCEL_ATI_MACH64VT;
+	    break;
+	case CLASS_GT:
+	    fix->mmio_start = (char *)(info->ati_regbase_phys-0x400);
+	    fix->mmio_len = 0x800;
+	    fix->accel = FB_ACCEL_ATI_MACH64GT;
+	    break;
+	default:
+	    fix->mmio_start = NULL;
+	    fix->mmio_len = 0;
+	    fix->accel = 0;
+    }
     fix->type = FB_TYPE_PACKED_PIXELS;
     fix->type_aux = 0;
-    fix->line_length = par->vxres<<par->cmode;
-    fix->visual = par->cmode == CMODE_8 ? FB_VISUAL_PSEUDOCOLOR
-					: FB_VISUAL_TRUECOLOR;
+    fix->line_length = par->vxres<<par->hw.gx.cmode;
+    fix->visual = par->hw.gx.cmode == CMODE_8 ? FB_VISUAL_PSEUDOCOLOR
+					      : FB_VISUAL_TRUECOLOR;
     fix->ywrapstep = 0;
     fix->xpanstep = 8;
     fix->ypanstep = 1;
@@ -794,7 +1113,7 @@
 
 
 static int decode_var(struct fb_var_screeninfo *var,
-		      struct atyfb_par *par)
+		      struct atyfb_par *par, struct fb_info_aty *info)
 {
     int xres = var->xres;
     int yres = var->yres;
@@ -804,30 +1123,30 @@
     /* This should support more video modes */
 
     if (xres <= 512 && yres <= 384)
-	par->vmode = VMODE_512_384_60;		/* 512x384, 60Hz */
+	par->hw.gx.vmode = VMODE_512_384_60;	/* 512x384, 60Hz */
     else if (xres <= 640 && yres <= 480)
-	par->vmode = VMODE_640_480_67;		/* 640x480, 67Hz */
+	par->hw.gx.vmode = VMODE_640_480_67;	/* 640x480, 67Hz */
     else if (xres <= 640 && yres <= 870)
-	par->vmode = VMODE_640_870_75P;		/* 640x870, 75Hz (portrait) */
+	par->hw.gx.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) */
+	par->hw.gx.vmode = VMODE_768_576_50I;	/* 768x576, 50Hz (PAL full frame) */
     else if (xres <= 800 && yres <= 600)
-	par->vmode = VMODE_800_600_75;		/* 800x600, 75Hz */
+	par->hw.gx.vmode = VMODE_800_600_75;	/* 800x600, 75Hz */
     else if (xres <= 832 && yres <= 624)
-	par->vmode = VMODE_832_624_75;		/* 832x624, 75Hz */
+	par->hw.gx.vmode = VMODE_832_624_75;	/* 832x624, 75Hz */
     else if (xres <= 1024 && yres <= 768)
-	par->vmode = VMODE_1024_768_75;		/* 1024x768, 75Hz */
+	par->hw.gx.vmode = VMODE_1024_768_75;	/* 1024x768, 75Hz */
     else if (xres <= 1152 && yres <= 870)
-	par->vmode = VMODE_1152_870_75;		/* 1152x870, 75Hz */
+	par->hw.gx.vmode = VMODE_1152_870_75;	/* 1152x870, 75Hz */
     else if (xres <= 1280 && yres <= 960)
-	par->vmode = VMODE_1280_960_75;		/* 1280x960, 75Hz */
+	par->hw.gx.vmode = VMODE_1280_960_75;	/* 1280x960, 75Hz */
     else if (xres <= 1280 && yres <= 1024)
-	par->vmode = VMODE_1280_1024_75;	/* 1280x1024, 75Hz */
+	par->hw.gx.vmode = VMODE_1280_1024_75;	/* 1280x1024, 75Hz */
     else
 	return -EINVAL;
 
-    xres = vmode_attrs[par->vmode-1].hres;
-    yres = vmode_attrs[par->vmode-1].vres;
+    xres = vmode_attrs[par->hw.gx.vmode-1].hres;
+    yres = vmode_attrs[par->hw.gx.vmode-1].vres;
 
     if (var->xres_virtual <= xres)
 	par->vxres = xres;
@@ -844,23 +1163,29 @@
 	return -EINVAL;
 
     if (bpp <= 8)
-	par->cmode = CMODE_8;
+	par->hw.gx.cmode = CMODE_8;
     else if (bpp <= 16)
-	par->cmode = CMODE_16;
+	par->hw.gx.cmode = CMODE_16;
     else if (bpp <= 32)
-	par->cmode = CMODE_32;
+	par->hw.gx.cmode = CMODE_32;
     else
 	return -EINVAL;
 
-    if (aty_vram_reqd(par) > total_vram)
+    if (var->accel_flags & FB_ACCELF_TEXT)
+	par->accel = FB_ACCELF_TEXT;
+    else
+	par->accel = 0;
+
+    if (aty_vram_reqd(par) > info->total_vram)
 	return -EINVAL;
 
     /* Check if we know about the wanted video mode */
-    init = get_aty_struct(par->vmode);
-    if (init == NULL || init->crtc_h_sync_strt_wid[par->cmode] == 0 ||
-	(chip_type != MACH64_GT_ID &&
-	 init->crtc_gen_cntl[par->cmode] == 0) ||
-	(chip_type == MACH64_GT_ID && (aty_ld_le32(CONFIG_STAT0) & 7) == 5 &&
+    init = get_aty_struct(par->hw.gx.vmode, info);
+    if (init == NULL || init->crtc_h_sync_strt_wid[par->hw.gx.cmode] == 0 ||
+	(info->chip_class != CLASS_GT &&
+	 init->crtc_gen_cntl[par->hw.gx.cmode] == 0) ||
+	(info->chip_class == CLASS_GT &&
+	 (aty_ld_le32(CONFIG_STAT0, info) & 7) == 5 &&
 	 init->crtc_gen_cntl[1] == 0))
 	return -EINVAL;
 
@@ -873,18 +1198,31 @@
 }
 
 static int encode_var(struct fb_var_screeninfo *var,
-		      const struct atyfb_par *par)
+		      const struct atyfb_par *par,
+		      struct fb_info_aty *info)
 {
+    int vmode = par->hw.gx.vmode;
+    int cmode = par->hw.gx.cmode;
+    struct aty_regvals *init = get_aty_struct(vmode, info);
+    u_int h_total, h_disp;
+    u_int h_sync_strt, h_sync_dly, h_sync_wid, h_sync_pol;
+    u_int v_total, v_disp;
+    u_int v_sync_strt, v_sync_wid, v_sync_pol;
+    u_int xtalin, vclk;
+    u8 pll_ref_div, vclk_fb_div, vclk_post_div, pll_ext_cntl;
+
     memset(var, 0, sizeof(struct fb_var_screeninfo));
+    if (!init)
+	return -EINVAL;
 
-    var->xres = vmode_attrs[par->vmode-1].hres;
-    var->yres = vmode_attrs[par->vmode-1].vres;
+    var->xres = vmode_attrs[vmode-1].hres;
+    var->yres = vmode_attrs[vmode-1].vres;
     var->xres_virtual = par->vxres;
     var->yres_virtual = par->vyres;
     var->xoffset = par->xoffset;
     var->yoffset = par->yoffset;
     var->grayscale = 0;
-    switch (par->cmode) {
+    switch (cmode) {
 	case CMODE_8:
 	    var->bits_per_pixel = 8;
 	    var->red.offset = 0;
@@ -927,21 +1265,97 @@
     var->activate = 0;
     var->height = -1;
     var->width = -1;
-    var->accel = /* FB_ACCEL_ATY */ 0;
     var->vmode = FB_VMODE_NONINTERLACED;
-    var->left_margin = var->right_margin = 64;	/* guesses */
-    var->upper_margin = var->lower_margin = 32;
-    var->hsync_len = 64;
-    var->vsync_len = 2;
-
-    /* no long long support in the kernel :-( */
-    /* this splittig trick will work if xres > 232 */
-    var->pixclock = 1000000000/
-	(var->left_margin+var->xres+var->right_margin+var->hsync_len);
-    var->pixclock *= 1000;
-    var->pixclock /= vmode_attrs[par->vmode-1].vfreq*
-	 (var->upper_margin+var->yres+var->lower_margin+var->vsync_len);
-    var->sync = 0;
+    var->accel_flags = par->accel;
+
+    h_total = (init->crtc_h_tot_disp<<3) & 0xff8;
+    h_disp = (init->crtc_h_tot_disp>>13) & 0x7f8;
+    h_sync_strt = ((init->crtc_h_sync_strt_wid[cmode]<<3) & 0x7f8) |
+		  ((init->crtc_h_sync_strt_wid[cmode]>>1) & 0x800);
+    h_sync_dly = (init->crtc_h_sync_strt_wid[cmode]>>8) & 0x7;
+    h_sync_wid = (init->crtc_h_sync_strt_wid[cmode]>>13) & 0xf8;
+    h_sync_pol = (init->crtc_h_sync_strt_wid[cmode]>>21) & 0x1;
+
+    v_total = init->crtc_v_tot_disp & 0x7ff;
+    v_disp = (init->crtc_v_tot_disp>>16) & 0x7ff;
+    v_sync_strt = init->crtc_v_sync_strt_wid & 0x7ff;
+    v_sync_wid = (init->crtc_v_sync_strt_wid>>16) & 0x1f;
+    v_sync_pol = (init->crtc_v_sync_strt_wid>>21) & 0x1;
+
+    var->left_margin = (h_total+8)-h_sync_strt-h_sync_wid;
+    var->right_margin = h_sync_strt-(h_disp+8);
+    var->upper_margin = (v_total+1)-v_sync_strt-v_sync_wid;
+    var->lower_margin = v_sync_strt-(v_disp+1);
+    var->hsync_len = h_sync_wid;
+    var->vsync_len = v_sync_wid;
+    var->sync = (h_sync_pol ? 0 : FB_SYNC_HOR_HIGH_ACT) |
+		(v_sync_pol ? 0 : FB_SYNC_VERT_HIGH_ACT);
+
+    xtalin = 69841;	/* 14.31818 MHz */
+    switch (info->chip_class) {
+	case CLASS_GX:
+	    {
+		/* haven't read the IBM RGB514 PDF yet, so just guesses */
+		static u32 gx_vclk[VMODE_MAX] = {
+		        0,	/* vmode  1 */	
+		        0,	/* vmode  2 */	
+		        0,	/* vmode  3 */	
+		        0,	/* vmode  4 */	
+		    39722,	/* vmode  5 (25.175 MHz) */
+		    33333,	/* vmode  6 (30 MHz) */
+		        0,	/* vmode  7 */	
+		        0,	/* vmode  8 */	
+		    27778,	/* vmode  9 (36 MHz) */
+		    25000,	/* vmode 10 (40 MHz) */
+		    20000,	/* vmode 11 (50 MHz) */
+		    20000,	/* vmode 12 (50 MHz) */
+		    17544,	/* vmode 13 (57 MHz) */
+		    15385,	/* vmode 14 (65 MHz) */
+		    13333,	/* vmode 15 (75 MHz) */
+		        0,	/* vmode 16 */	
+		    12821,	/* vmode 17 (78 MHz) */
+		    10000,	/* vmode 18 (100 MHz) */
+		     7937,	/* vmode 19 (126 MHz) */
+		     7407	/* vmode 20 (135 MHz) */
+		};
+		vclk = gx_vclk[vmode-1];
+	    }
+	    break;
+	case CLASS_CT:
+	case CLASS_GT:
+	case CLASS_VT:
+	    if (info->chip_class == CLASS_GT) {
+		pll_ref_div = 0x21;
+		vclk_post_div = init->offset[0];
+		vclk_fb_div = init->offset[1];
+		pll_ext_cntl = init->offset[2];
+	    } else {
+		pll_ref_div = 0x2d;
+		vclk_post_div = init->clock_val[0];
+		vclk_fb_div = init->clock_val[1];
+		pll_ext_cntl = 0x0;
+	    }
+	    vclk = xtalin*pll_ref_div;
+	    switch (vclk_post_div & 3) {
+		case 0:
+		    vclk *= (pll_ext_cntl & 0x10) ? 3 : 1;
+		    break;
+		case 1:
+		    if (pll_ext_cntl & 0x10)
+			return -EINVAL;
+		    vclk *= 2;
+		    break;
+		case 2:
+		    vclk *= (pll_ext_cntl & 0x10) ? 6 : 4;
+		    break;
+		case 3:
+		    vclk *= (pll_ext_cntl & 0x10) ? 12 : 8;
+		    break;
+	    }
+	    vclk /= 2*vclk_fb_div;
+	    break;
+    }
+    var->pixclock = vclk;
 
     return 0;
 }
@@ -949,12 +1363,13 @@
 
 static void init_par(struct atyfb_par *par, int vmode, int cmode)
 {
-    par->vmode = vmode;
-    par->cmode = cmode;
+    par->hw.gx.vmode = vmode;
+    par->hw.gx.cmode = cmode;
     par->vxres = vmode_attrs[vmode-1].hres;
     par->vyres = vmode_attrs[vmode-1].vres;
     par->xoffset = 0;
     par->yoffset = 0;
+    par->accel = FB_ACCELF_TEXT;
 }
 
 
@@ -965,13 +1380,14 @@
 static int atyfb_get_fix(struct fb_fix_screeninfo *fix, int con,
 			 struct fb_info *info)
 {
+    struct fb_info_aty *info2 = (struct fb_info_aty *)info;
     struct atyfb_par par;
 
     if (con == -1)
-	par = default_par;
+	par = info2->default_par;
     else
-	decode_var(&fb_display[con].var, &par);
-    encode_fix(fix, &par);
+	decode_var(&fb_display[con].var, &par, info2);
+    encode_fix(fix, &par, info2);
     return 0;
 }
 
@@ -983,10 +1399,12 @@
 static int atyfb_get_var(struct fb_var_screeninfo *var, int con,
 			 struct fb_info *info)
 {
+    struct fb_info_aty *info2 = (struct fb_info_aty *)info;
+
     if (con == -1)
-	encode_var(var, &default_par);
+	encode_var(var, &info2->default_par, (struct fb_info_aty *)info);
     else
-	*var=fb_display[con].var;
+	*var = fb_display[con].var;
     return 0;
 }
 
@@ -998,10 +1416,10 @@
 static int atyfb_set_var(struct fb_var_screeninfo *var, int con,
 			 struct fb_info *info)
 {
+    struct fb_info_aty *info2 = (struct fb_info_aty *)info;
     struct atyfb_par par;
     struct display *display;
-    int oldxres, oldyres, oldvxres, oldvyres, oldbpp;
-    int err;
+    int oldxres, oldyres, oldvxres, oldvyres, oldbpp, oldaccel, accel, err;
     int activate = var->activate;
 
     if (con >= 0)
@@ -1009,10 +1427,10 @@
     else
 	display = &fb_disp;	/* used during initialization */
 
-    if ((err = decode_var(var, &par)))
+    if ((err = decode_var(var, &par, info2)))
 	return err;
 
-    encode_var(var, &par);
+    encode_var(var, &par, (struct fb_info_aty *)info);
 
     if ((activate & FB_ACTIVATE_MASK) == FB_ACTIVATE_NOW) {
 	oldxres = display->var.xres;
@@ -1020,14 +1438,15 @@
 	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) {
+	    oldbpp != var->bits_per_pixel || oldaccel != var->accel_flags) {
 	    struct fb_fix_screeninfo fix;
 
-	    encode_fix(&fix, &par);
-	    display->screen_base = (u_char *)fix.smem_start;
+	    encode_fix(&fix, &par, info2);
+	    display->screen_base = (char *)info2->frame_buffer;
 	    display->visual = fix.visual;
 	    display->type = fix.type;
 	    display->type_aux = fix.type_aux;
@@ -1036,29 +1455,32 @@
 	    display->line_length = fix.line_length;
 	    display->can_soft_blank = 1;
 	    display->inverse = 0;
-	    switch (par.cmode) {
+	    accel = var->accel_flags & FB_ACCELF_TEXT;
+	    switch (par.hw.gx.cmode) {
+#ifdef CONFIG_FBCON_CFB8
 		case CMODE_8:
-#if 1
-		    display->dispsw = &fbcon_cfb8;
-#else
-		    display->dispsw = &fbcon_aty8;
-#endif
+		    display->dispsw = accel ? &fbcon_aty8 : &fbcon_cfb8;
 		    break;
+#endif
+#ifdef CONFIG_FBCON_CFB16
 		case CMODE_16:
-		    display->dispsw = &fbcon_cfb16;
+		    display->dispsw = accel ? &fbcon_aty16 : &fbcon_cfb16;
 		    break;
+#endif
+#ifdef CONFIG_FBCON_CFB32
 		case CMODE_32:
-		    display->dispsw = &fbcon_cfb32;
+		    display->dispsw = accel ? &fbcon_aty32 : &fbcon_cfb32;
 		    break;
+#endif
 		default:
 		    display->dispsw = NULL;
 		    break;
 	    }
-	    if (fb_info.changevar)
-		(*fb_info.changevar)(con);
+	    if (info->changevar)
+		(*info->changevar)(con);
 	}
 	if (con == currcon)
-	    atyfb_set_par(&par);
+	    atyfb_set_par(&par, info2);
 	if (oldbpp != var->bits_per_pixel) {
 	    if ((err = fb_alloc_cmap(&display->cmap, 0, 0)))
 		return err;
@@ -1079,18 +1501,19 @@
 static int atyfb_pan_display(struct fb_var_screeninfo *var, int con,
 			     struct fb_info *info)
 {
+    struct fb_info_aty *info2 = (struct fb_info_aty *)info;
     u32 xres, yres, xoffset, yoffset;
-    struct atyfb_par *par = &current_par;
+    struct atyfb_par *par = &info2->current_par;
 
-    xres = vmode_attrs[par->vmode-1].hres;
-    yres = vmode_attrs[par->vmode-1].vres;
+    xres = vmode_attrs[par->hw.gx.vmode-1].hres;
+    yres = vmode_attrs[par->hw.gx.vmode-1].vres;
     xoffset = (var->xoffset+7) & ~7;
     yoffset = var->yoffset;
     if (xoffset+xres > par->vxres || yoffset+yres > par->vyres)
 	return -EINVAL;
     par->xoffset = xoffset;
     par->yoffset = yoffset;
-    set_off_pitch(par);
+    set_off_pitch(par, info2);
     return 0;
 }
 
@@ -1146,225 +1569,328 @@
      *  Initialisation
      */
 
-__initfunc(unsigned long atyfb_init(unsigned long mem_start))
-{
-#ifdef __powerpc__
-    /* We don't want to be called like this. */
-    /* We rely on Open Firmware (offb) instead. */
-    return mem_start;
-#else /* !__powerpc__ */
-    /* To be merged with Bernd's mach64fb */
-    return mem_start;
-#endif /* !__powerpc__ */
-}
-
-
-unsigned long atyfb_of_init(unsigned long mem_start, struct device_node *dp)
+__initfunc(static int aty_init(struct fb_info_aty *info, const char *name))
 {
-    int i, err, sense;
+    u32 chip_id;
+    u32 i;
+    int j, k, err, sense;
     struct fb_var_screeninfo var;
     struct aty_regvals *init;
-    unsigned long addr;
-    unsigned char bus, devfn;
-    unsigned short cmd;
+    const char *chipname = NULL;
+    u8 rev;
 
-    if (dp->next)
-	printk("Warning: only using first ATI card detected\n");
-    if (dp->n_addrs != 1 && dp->n_addrs != 3)
-	printk("Warning: expecting 1 or 3 addresses for ATY (got %d)",
-	       dp->n_addrs);
-
-    ati_regbase = (int)ioremap((0x7ffc00 + dp->addrs[0].address), 0x1000);
-    aty_cmap_regs = (struct aty_cmap_regs *)(ati_regbase + 0xC0);
-
-    /* enable 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 != 0xffff) {
-	    cmd |= PCI_COMMAND_MEMORY;
-	    pcibios_write_config_word(bus, devfn, PCI_COMMAND, cmd);
+    info->aty_cmap_regs = (struct aty_cmap_regs *)(info->ati_regbase+0xc0);
+    chip_id = aty_ld_le32(CONFIG_CHIP_ID, info);
+    for (j = 0; j < (sizeof(aty_features)/sizeof(*aty_features)); j++)
+	if (aty_features[j].chip_type == (chip_id & CFG_CHIP_TYPE)) {
+	    chipname = aty_features[j].name;
+	    info->chip_class = aty_features[j].chip_class;
+	    info->pixclock_lim_8 = 1000000/aty_features[j].pixclock_lim_8;
+	    info->pixclock_lim_hi = 1000000/aty_features[j].pixclock_lim_hi;
 	}
+    if (!chipname) {
+	printk("atyfb: Unknown Mach64 0x%04x\n", chip_id & CFG_CHIP_TYPE);
+	return 0;
+    } else
+	printk("atyfb: %s [", chipname);
+    rev = (chip_id & CFG_CHIP_REV)>>24;
+    switch ((rev>>3) & 7) {
+	case MACH64_FND_SGS:
+	    printk("SGS");
+	    break;
+	case MACH64_FND_NEC:
+	    printk("NEC");
+	    break;
+	case MACH64_FND_UMC:
+	    printk("UMC");
+	    break;
     }
-    chip_type = (aty_ld_le32(CONFIG_CHIP_ID) & CFG_CHIP_TYPE);
+    printk(" %c%d]\n", 'A'+(rev & 7), rev>>6);
 
-    i = aty_ld_le32(MEM_CNTL);
-    if (chip_type != MACH64_GT_ID)
+    i = aty_ld_le32(MEM_CNTL, info);
+    if (info->chip_class != CLASS_GT)
 	switch (i & MEM_SIZE_ALIAS) {
 	    case MEM_SIZE_512K:
-		total_vram = 0x80000;
+		info->total_vram = 0x80000;
 		break;
 	    case MEM_SIZE_1M:
-		total_vram = 0x100000;
+		info->total_vram = 0x100000;
 		break;
 	    case MEM_SIZE_2M:
-		total_vram = 0x200000;
+		info->total_vram = 0x200000;
 		break;
 	    case MEM_SIZE_4M:
-		total_vram = 0x400000;
+		info->total_vram = 0x400000;
 		break;
 	    case MEM_SIZE_6M:
-		total_vram = 0x600000;
+		info->total_vram = 0x600000;
 		break;
 	    case MEM_SIZE_8M:
-		total_vram = 0x800000;
+		info->total_vram = 0x800000;
 		break;
 	    default:
-		total_vram = 0x80000;
+		info->total_vram = 0x80000;
 	}
     else
 	switch (i & 0xF) {	/* 0xF used instead of MEM_SIZE_ALIAS */
 	    case MEM_SIZE_512K:
-		total_vram = 0x80000;
+		info->total_vram = 0x80000;
 		break;
 	    case MEM_SIZE_1M:
-		total_vram = 0x100000;
+		info->total_vram = 0x100000;
 		break;
 	    case MEM_SIZE_2M_GTB:
-		total_vram = 0x200000;
+		info->total_vram = 0x200000;
 		break;
 	    case MEM_SIZE_4M_GTB:
-		total_vram = 0x400000;
+		info->total_vram = 0x400000;
 		break;
 	    case MEM_SIZE_6M_GTB:
-		total_vram = 0x600000;
+		info->total_vram = 0x600000;
 		break;
 	    case MEM_SIZE_8M_GTB:
-		total_vram = 0x800000;
+		info->total_vram = 0x800000;
 		break;
 	    default:
-		total_vram = 0x80000;
+		info->total_vram = 0x80000;
 	}
+#ifdef CONFIG_ATARI	/* this is definately not the wrong way to set this */
+    if ((info->total_vram == 0x400000) || (info->total_vram == 0x800000)) {
+	/* protect GUI-regs if complete Aperture is VRAM */
+	info->total_vram -= 0x00001000;
+    }
+#endif
 
-#if 1
-    printk("aty_display_init: node = %p, addrs = ", dp->node);
-    printk(" %x(%x)", dp->addrs[0].address, dp->addrs[0].size);
-    printk(", intrs =");
-    for (i = 0; i < dp->n_intrs; ++i)
-    printk(" %x", dp->intrs[i].line);
-    printk("\nregbase: %x pci loc: %x:%x total_vram: %x cregs: %p\n",
-	   (int)ati_regbase, bus, devfn, total_vram, aty_cmap_regs);
-#endif
-
-    /* Map in frame buffer */
-    addr = dp->addrs[0].address;
-
-    /* use the big-endian aperture (??) */
-    addr += 0x800000;
-    frame_buffer = (unsigned long)__ioremap(addr, 0x800000, _PAGE_WRITETHRU);
-
-    if (default_video_mode != -1) {
-	sense = read_aty_sense();
-	printk("monitor sense = %x\n", sense);
-	if (default_video_mode == VMODE_NVRAM) {
-	    default_video_mode = nvram_read_byte(NV_VMODE);
-	    init = get_aty_struct(default_video_mode);
-	    if (default_video_mode <= 0 ||
-		default_video_mode > VMODE_MAX || init == 0)
-		default_video_mode = VMODE_CHOOSE;
-	}
-	if (default_video_mode == VMODE_CHOOSE)
-	    default_video_mode = map_monitor_sense(sense);
+#if 0
+    printk("aty_init: regbase = %lx, frame_buffer = %lx, total_vram = %x\n",
+	   info->ati_regbase, info->frame_buffer, info->total_vram);
+#endif
 
-	init = get_aty_struct(default_video_mode);
-	if (!init)
-	    default_video_mode = VMODE_640_480_60;
-    }
+    sense = read_aty_sense(info);
+    printk("monitor sense = %x\n", sense);
+#if defined(CONFIG_PMAC) || defined(CONFIG_CHRP)
+    if (default_vmode == VMODE_NVRAM) {
+	default_vmode = nvram_read_byte(NV_VMODE);
+	init = get_aty_struct(default_vmode, info);
+	if (default_vmode <= 0 || default_vmode > VMODE_MAX || init == 0)
+	    default_vmode = VMODE_CHOOSE;
+    }
+    if (default_vmode == VMODE_CHOOSE)
+	default_vmode = map_monitor_sense(sense);
+#else /* !CONFIG_PMAC && !CONFIG_CHRP */
+    if (default_vmode == VMODE_NVRAM)
+	default_vmode = map_monitor_sense(sense);
+#endif /* !CONFIG_PMAC && !CONFIG_CHRP */
+
+    if (!(init = get_aty_struct(default_vmode, info)))
+	default_vmode = VMODE_640_480_60;
 
     /*
      * Reduce the pixel size if we don't have enough VRAM.
      */
 
-    if (default_color_mode == CMODE_NVRAM)
-	default_color_mode = nvram_read_byte(NV_CMODE);
-    if (default_color_mode < CMODE_8 ||
-	default_color_mode > CMODE_32)
-	default_color_mode = CMODE_8;
-
-    init_par(&default_par, default_video_mode, default_color_mode);
-    while (aty_vram_reqd(&default_par) > total_vram) {
-	while (default_color_mode > CMODE_8 &&
-	       aty_vram_reqd(&default_par) > total_vram) {
-	    --default_color_mode;
-	    init_par(&default_par, default_video_mode, default_color_mode);
+    if (default_cmode == CMODE_NVRAM)
+#if defined(CONFIG_PMAC) || defined(CONFIG_CHRP)
+	default_cmode = nvram_read_byte(NV_CMODE);
+#else /* !CONFIG_PMAC && !CONFIG_CHRP */
+	default_cmode = CMODE_8;
+#endif /* !CONFIG_PMAC && !CONFIG_CHRP */
+    if (default_cmode < CMODE_8 || default_cmode > CMODE_32)
+	default_cmode = CMODE_8;
+
+    init_par(&info->default_par, default_vmode, default_cmode);
+    while (aty_vram_reqd(&info->default_par) > info->total_vram) {
+	while (default_cmode > CMODE_8 &&
+	       aty_vram_reqd(&info->default_par) > info->total_vram) {
+	    --default_cmode;
+	    init_par(&info->default_par, default_vmode, default_cmode);
 	}
 	/*
-	 * adjust the video mode smaller if there still is not enough VRAM
+	 * Adjust the video mode smaller if there still is not enough VRAM
 	 */
-	if (aty_vram_reqd(&default_par) > total_vram)
+	if (aty_vram_reqd(&info->default_par) > info->total_vram)
 	    do {
-		default_video_mode--;
-		init_par(&default_par, default_video_mode, default_color_mode);
-		init = get_aty_struct(default_video_mode);
+		default_vmode--;
+		init_par(&info->default_par, default_vmode, default_cmode);
+		init = get_aty_struct(default_vmode, info);
 	    } while ((init == 0) &&
-		     (default_video_mode > VMODE_640_480_60));
+		     (default_vmode > VMODE_640_480_60));
     }
 
-    if (chip_type == MACH64_GT_ID && (aty_ld_le32(CONFIG_STAT0) & 7) == 5
+    if (info->chip_class == CLASS_GT &&
+	(aty_ld_le32(CONFIG_STAT0, info) & 7) == 5
 	&& init->crtc_gen_cntl[1] == 0) {
-	    default_video_mode = VMODE_640_480_67;
-	    default_color_mode = CMODE_8;
-	    init_par(&default_par, default_video_mode, default_color_mode);
+	    default_vmode = VMODE_640_480_67;
+	    default_cmode = CMODE_8;
+	    init_par(&info->default_par, default_vmode, default_cmode);
     }
 
-    switch (chip_type) {
-	case MACH64_GX_ID:
+    switch (info->chip_class) {
+	case CLASS_GX:
 	    strcat(atyfb_name, "GX");
 	    break;
-	case MACH64_VT_ID:
+	case CLASS_CT:
+	    strcat(atyfb_name, "CT");
+	    break;
+	case CLASS_VT:
 	    strcat(atyfb_name, "VT");
 	    break;
-	case MACH64_GT_ID:
+	case CLASS_GT:
 	    strcat(atyfb_name, "GT");
 	    break;
-	default:
-	    break;
     }
-    strcpy(fb_info.modename, atyfb_name);
-    fb_info.node = -1;
-    fb_info.fbops = &atyfb_ops;
-    fb_info.disp = &fb_disp;
-    fb_info.fontname[0] = '\0';
-    fb_info.changevar = NULL;
-    fb_info.switch_con = &atyfbcon_switch;
-    fb_info.updatevar = &atyfbcon_updatevar;
-    fb_info.blank = &atyfbcon_blank;
+    strcpy(info->fb_info.modename, atyfb_name);
+    info->fb_info.node = -1;
+    info->fb_info.fbops = &atyfb_ops;
+    info->fb_info.disp = &fb_disp;
+    info->fb_info.fontname[0] = '\0';
+    info->fb_info.changevar = NULL;
+    info->fb_info.switch_con = &atyfbcon_switch;
+    info->fb_info.updatevar = &atyfbcon_updatevar;
+    info->fb_info.blank = &atyfbcon_blank;
+
+    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];
+    }
 
-    err = register_framebuffer(&fb_info);
+    err = register_framebuffer(&info->fb_info);
     if (err < 0)
-	return mem_start;
+	return 0;
+    atyfb_set_par(&info->default_par, info);
+    encode_var(&var, &info->default_par, info);
+    atyfb_set_var(&var, -1, &info->fb_info);
+
+    printk("fb%d: %s frame buffer device on %s\n",
+	   GET_FB_IDX(info->fb_info.node), atyfb_name, name);
+    return 1;
+}
 
-    for (i = 0; i < 16; i++) {
-	int j = color_table[i];
-	palette[i].red = default_red[j];
-	palette[i].green = default_grn[j];
-	palette[i].blue = default_blu[j];
-    }
-    atyfb_set_par(&default_par);
-    encode_var(&var, &default_par);
-    atyfb_set_var(&var, -1, &fb_info);
+__initfunc(unsigned long atyfb_init(unsigned long mem_start))
+{
+#if defined(CONFIG_FB_OF)
+    /* We don't want to be called like this. */
+    /* We rely on Open Firmware (offb) instead. */
+#elif defined(CONFIG_PCI)
+    /* Anyone who wants to do a PCI probe for an ATI chip? */
+#elif defined(CONFIG_ATARI)
+    int m64_num;
+    struct fb_info_aty *info;
+
+    for (m64_num = 0; m64_num < mach64_count; m64_num++) {
+	if (!phys_vmembase[m64_num] || !phys_size[m64_num] ||
+	    !phys_guiregbase[m64_num]) {
+	    printk(" phys_*[%d] parameters not set => returning early. \n",
+		   m64_num);
+	    continue;
+	}
 
-    printk("fb%d: %s frame buffer device on %s\n", GET_FB_IDX(fb_info.node),
-	   atyfb_name, dp->full_name);
+	info = (struct fb_info_aty *)mem_start;
+	mem_start += sizeof(struct fb_info_aty);
+	mem_start = PAGE_ALIGN(mem_start);
 
-#ifdef CONFIG_FB_COMPAT_XPMAC
-    if (!console_fb_info) {
-	console_fb_info = &fb_info;
-	console_setmode_ptr = atyfb_console_setmode;
-	console_set_cmap_ptr = atyfb_set_cmap;
+	/*
+	 *  Map the video memory (physical address given) to somewhere in the
+	 *  kernel address space.
+	 */
+	info->frame_buffer = kernel_map(phys_vmembase[m64_num],
+					phys_size[m64_num],
+					KERNELMAP_NOCACHE_SER, &mem_start);
+	info->frame_buffer_phys = info->frame_buffer;
+	info->ati_regbase = kernel_map(phys_guiregbase[m64_num], 0x10000,
+				       KERNELMAP_NOCACHE_SER, &mem_start)
+			    +0xFC00ul;
+	info->ati_regbase_phys = info->ati_regbase;
+
+	if (!aty_init(info, "ISA bus")) {
+	    /* This is insufficient! kernel_map has added two large chunks!! */
+	    return mem_start;
+	}
     }
-#endif /* CONFIG_FB_COMPAT_XPMAC) */
-
+#endif
     return mem_start;
 }
 
+#ifdef CONFIG_FB_OF
+__initfunc(void atyfb_of_init(struct device_node *dp))
+{
+    unsigned long addr;
+    u8 bus, devfn;
+    u16 cmd;
+    struct fb_info_aty *info;
+    int i;
+
+    for (; dp; dp = dp->next) {
+	switch (dp->n_addrs) {
+	    case 1:
+	    case 3:
+		addr = dp->addrs[0].address;
+		break;
+	    case 4:
+		addr = dp->addrs[1].address;
+		break;
+	    default:
+		printk("Warning: got %d adresses for ATY:\n", dp->n_addrs);
+		for (i = 0; i < dp->n_addrs; i++)
+		    printk(" %08x-%08x", dp->addrs[i].address,
+			   dp->addrs[i].address+dp->addrs[i].size-1);
+		if (dp->n_addrs)
+		    printk("\n");
+		continue;
+	}
+
+	info = kmalloc(sizeof(struct fb_info_aty), GFP_ATOMIC);
+
+	info->ati_regbase = (unsigned long)ioremap(0x7ff000+addr,
+						   0x1000)+0xc00;
+	info->ati_regbase_phys = 0x7ff000+addr;
+	info->ati_regbase = (unsigned long)ioremap(info->ati_regbase_phys,
+						   0x1000);
+	info->ati_regbase_phys += 0xc00;
+	info->ati_regbase += 0xc00;
+
+	/* enable 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 != 0xffff) {
+		cmd |= PCI_COMMAND_MEMORY;
+		pcibios_write_config_word(bus, devfn, PCI_COMMAND, cmd);
+	    }
+	}
+
+#ifdef __BIG_ENDIAN
+	/* Use the big-endian aperture */
+	addr += 0x800000;
+#endif
+
+	/* Map in frame buffer */
+	info->frame_buffer_phys = addr;
+	info->frame_buffer = (unsigned long)ioremap(addr, 0x800000);
+
+	if (!aty_init(info, dp->full_name)) {
+	    kfree(info);
+	    return;
+	}
+
+#ifdef CONFIG_FB_COMPAT_XPMAC
+	if (!console_fb_info) {
+	    console_fb_info = &info->fb_info;
+	    console_setmode_ptr = atyfb_console_setmode;
+	    console_set_cmap_ptr = atyfb_set_cmap;
+	}
+#endif /* CONFIG_FB_COMPAT_XPMAC */
+    }
+}
+#endif /* CONFIG_FB_OF */
+
 
-/* XXX: doesn't work yet */
-void atyfb_setup(char *options, int *ints)
+__initfunc(void atyfb_setup(char *options, int *ints))
 {
     char *this_opt;
     int vmode;
     int depth;
-
     if (!options || !*options)
 	return;
 
@@ -1373,29 +1899,94 @@
 	if (!strncmp(this_opt, "vmode:", 6)) {
 	    vmode = simple_strtoul(this_opt+6, NULL, 0);
 	    if (vmode > 0 && vmode <= VMODE_MAX)
-		default_video_mode = vmode;
+		default_vmode = vmode;
 	} else if (!strncmp(this_opt, "cmode:", 6)) {
 	    depth = simple_strtoul(this_opt+6, NULL, 0);
 	    switch (depth) {
 		case 8:
-		    default_color_mode = CMODE_8;
+		    default_cmode = CMODE_8;
 		    break;
 		case 15:
 		case 16:
-		    default_color_mode = CMODE_16;
+		    default_cmode = CMODE_16;
 		    break;
 		case 24:
 		case 32:
-		    default_color_mode = CMODE_32;
+		    default_cmode = CMODE_32;
 		    break;
-	    };
+	    }
 	}
+#ifdef CONFIG_ATARI
+	/*
+	 * Why do we need this silly Mach64 argument?
+	 * We are already here because of mach64= so its redundant.
+	 */
+	else if (MACH_IS_ATARI && (!strncmp(this_opt, "Mach64:", 7))) {
+	    static unsigned char m64_num;
+	    static char mach64_str[80];
+	    strncpy(mach64_str, this_opt+7, 80);
+	    if (!store_video_par(mach64_str, m64_num)) {
+		m64_num++;
+		mach64_count = m64_num;
+	    }
+	}
+#endif
     }
 }
 
+#ifdef CONFIG_ATARI
+__initfunc(static int store_video_par(char *video_str, unsigned char m64_num))
+{
+    char *p;
+    unsigned long vmembase, size, guiregbase;
+
+    printk("store_video_par() '%s' \n", video_str);
+
+    if (!(p = strtoke(video_str, ";")) || !*p)
+	goto mach64_invalid;
+    vmembase = simple_strtoul(p, NULL, 0);
+    if (!(p = strtoke(NULL, ";")) || !*p)
+	goto mach64_invalid;
+    size = simple_strtoul(p, NULL, 0);
+    if (!(p = strtoke(NULL, ";")) || !*p)
+	goto mach64_invalid;
+    guiregbase = simple_strtoul(p, NULL, 0);
+
+    phys_vmembase[m64_num] = vmembase;
+    phys_size[m64_num] = size;
+    phys_guiregbase[m64_num] = guiregbase;
+    printk(" stored them all: $%08lX $%08lX $%08lX \n", vmembase, size,
+	   guiregbase);
+    return 0;
+
+mach64_invalid:
+    phys_vmembase[m64_num]   = 0;
+    return -1;
+}
+
+__initfunc(static char *strtoke(char *s, const char *ct))
+{
+    static char *ssave = NULL;
+    char *sbegin, *send;
+
+    sbegin  = s ? s : ssave;
+    if (!sbegin)
+	return NULL;
+    if (*sbegin == '\0') {
+	ssave = NULL;
+	return NULL;
+    }
+    send = strpbrk(sbegin, ct);
+    if (send && *send != '\0')
+	*send++ = '\0';
+    ssave = send;
+    return sbegin;
+}
+#endif /* !CONFIG_FB_OF */
 
 static int atyfbcon_switch(int con, struct fb_info *info)
 {
+    struct fb_info_aty *info2 = (struct fb_info_aty *)info;
     struct atyfb_par par;
 
     /* Do we have to save the colormap? */
@@ -1403,8 +1994,8 @@
 	fb_get_cmap(&fb_display[currcon].cmap, &fb_display[currcon].var, 1,
 		    atyfb_getcolreg, info);
     currcon = con;
-    decode_var(&fb_display[con].var, &par);
-    atyfb_set_par(&par);
+    decode_var(&fb_display[con].var, &par, info2);
+    atyfb_set_par(&par, info2);
     /* Install new colormap */
     do_install_cmap(con, info);
     return 0;
@@ -1416,8 +2007,10 @@
 
 static int atyfbcon_updatevar(int con, struct fb_info *info)
 {
-    current_par.yoffset = fb_display[con].var.yoffset;
-    set_off_pitch(&current_par);
+    struct fb_info_aty *info2 = (struct fb_info_aty *)info;
+
+    info2->current_par.yoffset = fb_display[con].var.yoffset;
+    set_off_pitch(&info2->current_par, info2);
     return 0;
 }
 
@@ -1427,9 +2020,10 @@
 
 static void atyfbcon_blank(int blank, struct fb_info *info)
 {
-    char gen_cntl;
+    struct fb_info_aty *info2 = (struct fb_info_aty *)info;
+    u8 gen_cntl;
 
-    gen_cntl = aty_ld_8(CRTC_GEN_CNTL);
+    gen_cntl = aty_ld_8(CRTC_GEN_CNTL, info2);
     if (blank & VESA_VSYNC_SUSPEND)
 	    gen_cntl |= 0x8;
     if (blank & VESA_HSYNC_SUSPEND)
@@ -1438,7 +2032,7 @@
 	    gen_cntl |= 0x40;
     if (blank == VESA_NO_BLANKING)
 	    gen_cntl &= ~(0x4c);
-    aty_st_8(CRTC_GEN_CNTL, gen_cntl);
+    aty_st_8(CRTC_GEN_CNTL, gen_cntl, info2);
 }
 
 
@@ -1448,13 +2042,15 @@
      */
 
 static int atyfb_getcolreg(u_int regno, u_int *red, u_int *green, u_int *blue,
-			 u_int *transp, struct fb_info *info)
+			   u_int *transp, struct fb_info *info)
 {
+    struct fb_info_aty *info2 = (struct fb_info_aty *)info;
+
     if (regno > 255)
 	return 1;
-    *red = palette[regno].red;
-    *green = palette[regno].green;
-    *blue = palette[regno].blue;
+    *red = info2->palette[regno].red;
+    *green = info2->palette[regno].green;
+    *blue = info2->palette[regno].blue;
     return 0;
 }
 
@@ -1466,32 +2062,31 @@
      */
 
 static int atyfb_setcolreg(u_int regno, u_int red, u_int green, u_int blue,
-			 u_int transp, struct fb_info *info)
+			   u_int transp, struct fb_info *info)
 {
+    struct fb_info_aty *info2 = (struct fb_info_aty *)info;
     int i, scale;
 
     if (regno > 255)
 	return 1;
-    palette[regno].red = red;
-    palette[regno].green = green;
-    palette[regno].blue = blue;
-    aty_WaitQueue(2);
-    i = aty_ld_8(DAC_CNTL) & 0xfc;
-    if (chip_type == MACH64_GT_ID)
-	    i |= 0x2;	/*DAC_CNTL|0x2 turns off the extra brightness for gt*/
-    aty_st_8(DAC_CNTL, i);
-    aty_st_8(DAC_REGS + DAC_MASK, 0xff);
+    info2->palette[regno].red = red;
+    info2->palette[regno].green = green;
+    info2->palette[regno].blue = blue;
+    i = aty_ld_8(DAC_CNTL, info2) & 0xfc;
+    if (info2->chip_class == CLASS_GT)
+	i |= 0x2;	/*DAC_CNTL|0x2 turns off the extra brightness for gt*/
+    aty_st_8(DAC_CNTL, i, info2);
+    aty_st_8(DAC_REGS + DAC_MASK, 0xff, info2);
     eieio();
-    scale = ((chip_type != MACH64_GX_ID) &&
-	     (current_par.cmode == CMODE_16)) ? 3 : 0;
-    aty_WaitQueue(4);
-    aty_cmap_regs->windex = regno << scale;
+    scale = ((info2->chip_class != CLASS_GX) &&
+	     (info2->current_par.hw.gx.cmode == CMODE_16)) ? 3 : 0;
+    info2->aty_cmap_regs->windex = regno << scale;
     eieio();
-    aty_cmap_regs->lut = red << scale;
+    info2->aty_cmap_regs->lut = red << scale;
     eieio();
-    aty_cmap_regs->lut = green << scale;
+    info2->aty_cmap_regs->lut = green << scale;
     eieio();
-    aty_cmap_regs->lut = blue << scale;
+    info2->aty_cmap_regs->lut = blue << scale;
     eieio();
     if (regno < 16) {
 #ifdef CONFIG_FBCON_CFB16
@@ -1524,15 +2119,33 @@
      *  Accelerated functions
      */
 
-void aty_waitblit(void)
+static inline void draw_rect(s16 x, s16 y, u16 width, u16 height,
+			     struct fb_info_aty *info)
 {
-    aty_WaitIdleEmpty();	/* Make sure that all commands have finished */
+    /* perform rectangle fill */
+    wait_for_fifo(2, info);
+    aty_st_le32(DST_Y_X, (x << 16) | y, info);
+    aty_st_le32(DST_HEIGHT_WIDTH, (width << 16) | height, info);
 }
 
-void aty_rectcopy(int srcx, int srcy, int dstx, int dsty, u_int width,
-		  u_int height)
+static inline void aty_rectcopy(int srcx, int srcy, int dstx, int dsty,
+				u_int width, u_int height,
+				struct fb_info_aty *info)
 {
-    u_int direction = 0;
+    u32 direction = DST_LAST_PEL;
+    u32 pitch_value;
+
+    if (!width || !height)
+	return;
+
+    pitch_value = info->current_par.vxres;
+#if 0
+    if (par->hw.gx.cmode == CMODE_24) {
+	/* In 24 bpp, the engine is in 8 bpp - this requires that all */
+	/* horizontal coordinates and widths must be adjusted */
+	pitch_value = pitch_value * 3;
+    }
+#endif
 
     if (srcy < dsty) {
 	dsty += height - 1;
@@ -1546,46 +2159,33 @@
     } else
 	direction |= DST_X_LEFT_TO_RIGHT;
 
-    aty_WaitQueue(4);
-    aty_st_le32(DP_WRITE_MSK, 0x000000FF /* pGC->planemask */ );
-    aty_st_le32(DP_MIX, (MIX_SRC << 16) |  MIX_DST);
-    aty_st_le32(DP_SRC, FRGD_SRC_BLIT);
-
-    aty_WaitQueue(5);
-    aty_st_le32(SRC_Y_X, (srcx << 16) | (srcy & 0x0000ffff));
-    aty_st_le32(SRC_WIDTH1, width);
-    aty_st_le32(DST_CNTL, direction);
-    aty_st_le32(DST_Y_X, (dstx << 16) | (dsty & 0x0000ffff));
-    aty_st_le32(DST_HEIGHT_WIDTH, (width << 16) | (height & 0x0000ffff));
-
-    aty_WaitIdleEmpty();	/* Make sure that all commands have finished */
-
+    wait_for_fifo(5, info);
+    aty_st_le32(DP_SRC, FRGD_SRC_BLIT, info);
     /*
-     * Make sure that the destination trajectory is correctly set
-     * for subsequent calls.  MACH64_BIT_BLT is the only function that
-     * currently changes the destination trajectory from L->R and T->B.
-     */
-    aty_st_le32(DST_CNTL, (DST_X_LEFT_TO_RIGHT | DST_Y_TOP_TO_BOTTOM));
+     * ++Geert:
+     * Warning: SRC_OFF_PITCH may be thrashed by writing to other registers
+     * (e.g. CRTC_H_TOTAL_DISP, DP_SRC, DP_FRGD_CLR)
+     */
+    aty_st_le32(SRC_OFF_PITCH, (pitch_value / 8) << 22, info);
+    aty_st_le32(SRC_Y_X, (srcx << 16) | srcy, info);
+    aty_st_le32(SRC_HEIGHT1_WIDTH1, (width << 16) | height, info);
+    aty_st_le32(DST_CNTL, direction, info);
+    draw_rect(dstx, dsty, width, height, info);
 }
 
-void aty_rectfill(int dstx, int dsty, u_int width, u_int height, u_int color)
+static inline void aty_rectfill(int dstx, int dsty, u_int width, u_int height,
+				u_int color, struct fb_info_aty *info)
 {
     if (!width || !height)
 	return;
 
-    aty_WaitQueue(5);
-    aty_st_le32(DP_FRGD_CLR, color /* pGC->fgPixel */ );
-    aty_st_le32(DP_WRITE_MSK, 0x000000FF /* pGC->planemask */ );
-    aty_st_le32(DP_MIX, (MIX_SRC << 16) | MIX_DST);
-    aty_st_le32(DP_SRC, FRGD_SRC_FRGD_CLR);
-
-    aty_st_le32(DST_CNTL, DST_X_LEFT_TO_RIGHT | DST_Y_TOP_TO_BOTTOM);
-
-    aty_WaitQueue(2);
-    aty_st_le32(DST_Y_X, (((u_int)dstx << 16) | ((u_int)dsty & 0x0000ffff)));
-    aty_st_le32(DST_HEIGHT_WIDTH, (((u_int)width << 16) | height));
-
-    aty_WaitIdleEmpty();	/* Make sure that all commands have finished */
+    wait_for_fifo(3, info);
+    aty_st_le32(DP_FRGD_CLR, color, info);
+    aty_st_le32(DP_SRC, BKGD_SRC_BKGD_CLR | FRGD_SRC_FRGD_CLR | MONO_SRC_ONE,
+		info);
+    aty_st_le32(DST_CNTL, DST_LAST_PEL | DST_Y_TOP_TO_BOTTOM |
+			  DST_X_LEFT_TO_RIGHT, info);
+    draw_rect(dstx, dsty, width, height, info);
 }
 
 
@@ -1593,8 +2193,8 @@
      *  Text console acceleration
      */
 
-static void fbcon_aty8_bmove(struct display *p, int sy, int sx, int dy, int dx,
-			     int height, int width)
+static void fbcon_aty_bmove(struct display *p, int sy, int sx, int dy, int dx,
+			    int height, int width)
 {
     sx *= p->fontwidth;
     sy *= p->fontheight;
@@ -1603,11 +2203,12 @@
     width *= p->fontwidth;
     height *= p->fontheight;
 
-    aty_rectcopy(sx, sy, dx, dy, width, height);
+    aty_rectcopy(sx, sy, dx, dy, width, height,
+		 (struct fb_info_aty *)p->fb_info);
 }
 
-static void fbcon_aty8_clear(struct vc_data *conp, struct display *p, int sy,
-			     int sx, int height, int width)
+static void fbcon_aty_clear(struct vc_data *conp, struct display *p, int sy,
+			    int sx, int height, int width)
 {
     u32 bgx = attr_bgcol_ec(p, conp);
     bgx |= (bgx << 8);
@@ -1618,38 +2219,85 @@
     width *= p->fontwidth;
     height *= p->fontheight;
 
-    aty_rectfill(sx, sy, width, height, bgx);
+    aty_rectfill(sx, sy, width, height, bgx,
+		 (struct fb_info_aty *)p->fb_info);
 }
 
+#ifdef CONFIG_FBCON_CFB8
 static void fbcon_aty8_putc(struct vc_data *conp, struct display *p, int c,
 			    int yy, int xx)
 {
-    aty_waitblit();
+    wait_for_idle((struct fb_info_aty *)p->fb_info);
     fbcon_cfb8_putc(conp, p, c, yy, xx);
 }
 
 static void fbcon_aty8_putcs(struct vc_data *conp, struct display *p,
 			     const char *s, int count, int yy, int xx)
 {
-    aty_waitblit();
+    wait_for_idle((struct fb_info_aty *)p->fb_info);
     fbcon_cfb8_putcs(conp, p, s, count, yy, xx);
 }
 
 static struct display_switch fbcon_aty8 = {
-    fbcon_cfb8_setup, fbcon_aty8_bmove, fbcon_aty8_clear, fbcon_aty8_putc,
-    fbcon_aty8_putcs, fbcon_cfb8_revc
+    fbcon_cfb8_setup, fbcon_aty_bmove, fbcon_aty_clear, fbcon_aty8_putc,
+    fbcon_aty8_putcs, fbcon_cfb8_revc, NULL
+};
+#endif
+
+#ifdef CONFIG_FBCON_CFB16
+static void fbcon_aty16_putc(struct vc_data *conp, struct display *p, int c,
+			     int yy, int xx)
+{
+    wait_for_idle((struct fb_info_aty *)p->fb_info);
+    fbcon_cfb16_putc(conp, p, c, yy, xx);
+}
+
+static void fbcon_aty16_putcs(struct vc_data *conp, struct display *p,
+			      const char *s, int count, int yy, int xx)
+{
+    wait_for_idle((struct fb_info_aty *)p->fb_info);
+    fbcon_cfb16_putcs(conp, p, s, count, yy, xx);
+}
+
+static struct display_switch fbcon_aty16 = {
+    fbcon_cfb16_setup, fbcon_aty_bmove, fbcon_aty_clear, fbcon_aty16_putc,
+    fbcon_aty16_putcs, fbcon_cfb16_revc, NULL
+};
+#endif
+
+#ifdef CONFIG_FBCON_CFB32
+static void fbcon_aty32_putc(struct vc_data *conp, struct display *p, int c,
+			     int yy, int xx)
+{
+    wait_for_idle((struct fb_info_aty *)p->fb_info);
+    fbcon_cfb32_putc(conp, p, c, yy, xx);
+}
+
+static void fbcon_aty32_putcs(struct vc_data *conp, struct display *p,
+			      const char *s, int count, int yy, int xx)
+{
+    wait_for_idle((struct fb_info_aty *)p->fb_info);
+    fbcon_cfb32_putcs(conp, p, s, count, yy, xx);
+}
+
+static struct display_switch fbcon_aty32 = {
+    fbcon_cfb32_setup, fbcon_aty_bmove, fbcon_aty_clear, fbcon_aty32_putc,
+    fbcon_aty32_putcs, fbcon_cfb32_revc, NULL
 };
+#endif
 
 
 #ifdef CONFIG_FB_COMPAT_XPMAC
 
     /*
      *  Backward compatibility mode for Xpmac
+     *
+     *  This should move to offb.c once this driver supports arbitrary video
+     *  modes
      */
 
 static int atyfb_console_setmode(struct vc_mode *mode, int doit)
 {
-    int err;
     struct fb_var_screeninfo var;
     struct atyfb_par par;
     int vmode, cmode;
@@ -1674,12 +2322,9 @@
 	    return -EINVAL;
     }
     init_par(&par, vmode, cmode);
-    encode_var(&var, &par);
-    if ((err = decode_var(&var, &par)))
-	return err;
-    if (doit)
-	atyfb_set_var(&var, currcon, 0);
-    return 0;
+    encode_var(&var, &par, (struct fb_info_aty *)console_fb_info);
+    var.activate = doit ? FB_ACTIVATE_NOW : FB_ACTIVATE_TEST;
+    return atyfb_set_var(&var, currcon, console_fb_info);
 }
 
 #endif /* CONFIG_FB_COMPAT_XPMAC */
diff -u --recursive --new-file v2.1.106/linux/drivers/video/compatcon.c linux/drivers/video/compatcon.c
--- v2.1.106/linux/drivers/video/compatcon.c	Wed Dec 31 16:00:00 1969
+++ linux/drivers/video/compatcon.c	Wed Jun 24 14:44:01 1998
@@ -0,0 +1,354 @@
+/*
+ *  linux/drivers/video/compatcon.c -- Console wrapper
+ *
+ *	Created 26 Apr 1998 by Geert Uytterhoeven
+ *
+ *  This will be removed once there are frame buffer devices for all supported
+ *  graphics hardware
+ *
+ *  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 for
+ *  more details.
+ */
+
+
+#include <linux/types.h>
+#include <linux/sched.h>
+#include <linux/fs.h>
+#include <linux/kernel.h>
+#include <linux/tty.h>
+#include <linux/console.h>
+#include <linux/console_struct.h>
+#include <linux/string.h>
+#include <linux/kd.h>
+#include <linux/malloc.h>
+#include <linux/vt_kern.h>
+#include <linux/selection.h>
+#include <linux/init.h>
+
+#include <asm/io.h>
+#include <asm/uaccess.h>
+#include <asm/linux_logo.h>
+
+#include <linux/console_compat.h>
+
+
+    /*
+     *  Interface used by the world
+     */
+
+static const char *compatcon_startup(void);
+static void compatcon_init(struct vc_data *conp);
+static void compatcon_deinit(struct vc_data *conp);
+static void compatcon_clear(struct vc_data *conp, int sy, int sx, int height,
+			    int width);
+static void compatcon_putc(struct vc_data *conp, int c, int ypos, int xpos);
+static void compatcon_putcs(struct vc_data *conp, const char *s, int count,
+			    int ypos, int xpos);
+static void compatcon_cursor(struct vc_data *conp, int mode);
+static void compatcon_scroll(struct vc_data *conp, int t, int b, int dir,
+			     int count);
+static void compatcon_bmove(struct vc_data *conp, int sy, int sx, int dy,
+			    int dx, int height, int width);
+static int compatcon_switch(struct vc_data *conp);
+static int compatcon_blank(int blank);
+static int compatcon_get_font(struct vc_data *conp, int *w, int *h, char *data);
+static int compatcon_set_font(struct vc_data *conp, int w, int h, char *data);
+static int compatcon_set_palette(struct vc_data *conp, unsigned char *table);
+static int compatcon_scrolldelta(struct vc_data *conp, int lines);
+
+
+    /*
+     *  Internal routines
+     */
+
+#if 0
+static int compatcon_show_logo(void);
+#endif
+
+unsigned long video_num_columns;
+unsigned long video_num_lines;
+unsigned long video_size_row;
+unsigned char video_type;
+unsigned long video_mem_base;
+unsigned long video_mem_term;
+unsigned long video_screen_size;
+int can_do_color;
+
+extern void set_cursor(int currcons);
+extern void hide_cursor(void);
+extern int set_get_cmap(unsigned char *arg, int set);
+extern void set_palette(void);
+extern int set_get_font(unsigned char *arg, int set, int ch512);
+extern void set_vesa_blanking(unsigned long arg);
+extern void vesa_blank(void);
+extern void vesa_powerdown(void);
+extern int con_adjust_height(unsigned long fontheight);
+extern void con_type_init(const char **);
+extern void con_type_init_finish(void);
+
+#define BLANK	0x0020
+
+
+__initfunc(static const char *compatcon_startup(void))
+{
+    const char *display_desc = "????";
+
+    video_num_lines = ORIG_VIDEO_LINES;
+    video_num_columns = ORIG_VIDEO_COLS;
+    video_size_row = 2*video_num_columns;
+    video_screen_size = video_num_lines*video_size_row;
+
+    con_type_init(&display_desc);
+#if 0
+    if (!console_show_logo)
+	console_show_logo = compatcon_show_logo;
+#endif
+    return display_desc;
+}
+
+
+static void compatcon_init(struct vc_data *conp)
+{
+    static int first = 1;
+
+    conp->vc_cols = video_num_columns;
+    conp->vc_rows = video_num_lines;
+    conp->vc_can_do_color = can_do_color;
+    if (first) {
+	con_type_init_finish();
+	first = 0;
+    }
+}
+
+static void compatcon_deinit(struct vc_data *conp)
+{
+}
+
+
+static void compatcon_clear(struct vc_data *conp, int sy, int sx, int height,
+			    int width)
+{
+    int rows;
+    unsigned long dest;
+
+    if (console_blanked)
+	return;
+
+    dest = video_mem_base+sy*video_size_row+sx*2;
+    if (sx == 0 && width == video_num_columns)      
+	memsetw((void *)dest, conp->vc_video_erase_char, height*video_size_row);
+    else
+	for (rows = height; rows-- ; dest += video_size_row)
+	    memsetw((void *)dest, conp->vc_video_erase_char, width*2);
+}
+
+
+static void compatcon_putc(struct vc_data *conp, int c, int ypos, int xpos)
+{
+    u16 *p;
+
+    if (console_blanked)
+	return;
+
+    p = (u16 *)(video_mem_base+ypos*video_size_row+xpos*2);
+    scr_writew(conp->vc_attr << 8 | c, p);
+}
+
+
+static void compatcon_putcs(struct vc_data *conp, const char *s, int count,
+			    int ypos, int xpos)
+{
+    u16 *p;
+    u16 sattr;
+
+    if (console_blanked)
+	return;
+
+    p = (u16 *)(video_mem_base+ypos*video_size_row+xpos*2);
+    sattr = conp->vc_attr << 8;
+    while (count--)
+	scr_writew(sattr | ((int) (*s++) & 0xff), p++);
+}
+
+
+static void compatcon_cursor(struct vc_data *conp, int mode)
+{
+    switch (mode) {
+	case CM_ERASE:
+	    hide_cursor();
+	    break;
+
+	case CM_MOVE:
+	case CM_DRAW:
+	    set_cursor(conp->vc_num);
+	    break;
+    }
+}
+
+
+static void compatcon_scroll(struct vc_data *conp, int t, int b, int dir,
+			     int count)
+{
+    if (console_blanked)
+	return;
+
+    compatcon_cursor(conp, CM_ERASE);
+
+    switch (dir) {
+	case SM_UP:
+	    if (count > conp->vc_rows)	/* Maximum realistic size */
+		count = conp->vc_rows;
+	    compatcon_bmove(conp, t+count, 0, t, 0, b-t-count, conp->vc_cols);
+	    compatcon_clear(conp, b-count, 0, count, conp->vc_cols);
+	    break;
+
+	case SM_DOWN:
+	    if (count > conp->vc_rows)	/* Maximum realistic size */
+		count = conp->vc_rows;
+	    /*
+	     *  Fixed bmove() should end Arno's frustration with copying?
+	     *  Confucius says:
+	     *	Man who copies in wrong direction, end up with trashed
+	     *	data
+	     */
+	    compatcon_bmove(conp, t, 0, t+count, 0, b-t-count, conp->vc_cols);
+	    compatcon_clear(conp, t, 0, count, conp->vc_cols);
+	    break;
+
+	case SM_LEFT:
+	    compatcon_bmove(conp, 0, t+count, 0, t, conp->vc_rows, b-t-count);
+	    compatcon_clear(conp, 0, b-count, conp->vc_rows, count);
+	    break;
+
+	case SM_RIGHT:
+	    compatcon_bmove(conp, 0, t, 0, t+count, conp->vc_rows, b-t-count);
+	    compatcon_clear(conp, 0, t, conp->vc_rows, count);
+	    break;
+    }
+}
+
+
+static inline void memmovew(u16 *to, u16 *from, unsigned int count)
+{
+    if ((unsigned long)to < (unsigned long)from)
+	memcpyw(to, from, count);
+    else {
+	count /= 2;
+	to += count;
+	from += count;
+	while (count) {
+	    count--;
+	    scr_writew(scr_readw(--from), --to);
+	}
+    }
+}
+
+static void compatcon_bmove(struct vc_data *conp, int sy, int sx, int dy,
+			    int dx, int height, int width)
+{
+    unsigned long src, dst;
+    int rows;
+
+    if (console_blanked)
+	return;
+
+    if (sx == 0 && dx == 0 && width == video_num_columns) {
+	src = video_mem_base+sy*video_size_row;
+	dst = video_mem_base+dy*video_size_row;
+	memmovew((u16 *)dst, (u16 *)src, height*video_size_row);
+    } else if (dy < sy || (dy == sy && dx < sx)) {
+	src = video_mem_base+sy*video_size_row+sx*2;
+	dst = video_mem_base+dy*video_size_row+dx*2;
+	for (rows = height; rows-- ;) {
+	    memmovew((u16 *)dst, (u16 *)src, width*2);
+	    src += video_size_row;
+	    dst += video_size_row;
+	}
+    } else {
+	src = video_mem_base+(sy+height-1)*video_size_row+sx*2;
+	dst = video_mem_base+(dy+height-1)*video_size_row+dx*2;
+	for (rows = height; rows-- ;) {
+	    memmovew((u16 *)dst, (u16 *)src, width*2);
+	    src -= video_size_row;
+	    dst -= video_size_row;
+	}
+    }
+}
+
+
+static int compatcon_switch(struct vc_data *conp)
+{
+    return 0;
+}
+
+
+static int compatcon_blank(int blank)
+{
+    if (blank) {
+	set_vesa_blanking(blank-1);
+	if (blank-1 == 0)
+	    vesa_blank();
+	else
+	    vesa_powerdown();
+	return 0;
+    } else {
+	/* Tell console.c that it has to restore the screen itself */
+	return 1;
+    }
+    return 0;
+}
+
+
+static int compatcon_get_font(struct vc_data *conp, int *w, int *h, char *data)
+{
+    /* this is not supported: data already points to a kernel space copy */
+    return -ENOSYS;
+}
+
+
+static int compatcon_set_font(struct vc_data *conp, int w, int h, char *data)
+{
+    /* this is not supported: data already points to a kernel space copy */
+    return -ENOSYS;
+}
+
+static int compatcon_set_palette(struct vc_data *conp, unsigned char *table)
+{
+    if (console_blanked || vt_cons[fg_console]->vc_mode == KD_GRAPHICS)
+	return -EINVAL;
+    set_palette();
+    return 0;
+}
+
+static int compatcon_scrolldelta(struct vc_data *conp, int lines)
+{
+    /* TODO */
+    return -ENOSYS;
+}
+
+#if 0
+__initfunc(static int compatcon_show_logo( void ))
+{
+    int height = 0;
+    char *p;
+
+    printk(linux_serial_image);
+    for (p = linux_serial_image; *p; p++)
+	if (*p == '\n')
+	    height++;
+    return height;
+}
+#endif
+
+
+    /*
+     *  The console `switch' structure for the console wrapper
+     */
+
+struct consw compat_con = {
+    compatcon_startup, compatcon_init, compatcon_deinit, compatcon_clear,
+    compatcon_putc, compatcon_putcs, compatcon_cursor, compatcon_scroll,
+    compatcon_bmove, compatcon_switch, compatcon_blank, compatcon_get_font,
+    compatcon_set_font, compatcon_set_palette, compatcon_scrolldelta
+};
diff -u --recursive --new-file v2.1.106/linux/drivers/video/cyberfb.c linux/drivers/video/cyberfb.c
--- v2.1.106/linux/drivers/video/cyberfb.c	Wed Apr  8 19:36:28 1998
+++ linux/drivers/video/cyberfb.c	Wed Jun 24 14:44:01 1998
@@ -20,6 +20,7 @@
  * for more details.
  */
 
+
 #include <linux/config.h>
 #include <linux/module.h>
 #include <linux/kernel.h>
@@ -61,6 +62,7 @@
    int xres;
    int yres;
    int bpp;
+   int accel;
 };
 
 static struct cyberfb_par current_par;
@@ -133,49 +135,49 @@
 	"640x480-8", {		/* Cybervision 8 bpp */
 	    640, 480, 640, 480, 0, 0, 8, 0,
 	    {0, 8, 0}, {0, 8, 0}, {0, 8, 0}, {0, 0, 0},
-	    0, 0, -1, -1, FB_ACCEL_NONE, CYBER8_PIXCLOCK, 64, 96, 35, 12, 112, 2,
+	    0, 0, -1, -1, FB_ACCELF_TEXT, CYBER8_PIXCLOCK, 64, 96, 35, 12, 112, 2,
 	    FB_SYNC_COMP_HIGH_ACT|FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED
 	}
     }, {
 	"800x600-8", {		/* Cybervision 8 bpp */
 	    800, 600, 800, 600, 0, 0, 8, 0,
 	    {0, 8, 0}, {0, 8, 0}, {0, 8, 0}, {0, 0, 0},
-	    0, 0, -1, -1, FB_ACCEL_NONE, CYBER8_PIXCLOCK, 64, 96, 35, 12, 112, 2,
+	    0, 0, -1, -1, FB_ACCELF_TEXT, CYBER8_PIXCLOCK, 64, 96, 35, 12, 112, 2,
 	    FB_SYNC_COMP_HIGH_ACT|FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED
 	}
     }, {
 	"1024x768-8", {		/* Cybervision 8 bpp */
 	    1024, 768, 1024, 768, 0, 0, 8, 0,
 	    {0, 8, 0}, {0, 8, 0}, {0, 8, 0}, {0, 0, 0},
-	    0, 0, -1, -1, FB_ACCEL_NONE, CYBER8_PIXCLOCK, 64, 96, 35, 12, 112, 2,
+	    0, 0, -1, -1, FB_ACCELF_TEXT, CYBER8_PIXCLOCK, 64, 96, 35, 12, 112, 2,
 	    FB_SYNC_COMP_HIGH_ACT|FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED
 	}
     }, {
 	"1152x886-8", {		/* Cybervision 8 bpp */
 	    1152, 886, 1152, 886, 0, 0, 8, 0,
 	    {0, 8, 0}, {0, 8, 0}, {0, 8, 0}, {0, 0, 0},
-	    0, 0, -1, -1, FB_ACCEL_NONE, CYBER8_PIXCLOCK, 64, 96, 35, 12, 112, 2,
+	    0, 0, -1, -1, FB_ACCELF_TEXT, CYBER8_PIXCLOCK, 64, 96, 35, 12, 112, 2,
 	    FB_SYNC_COMP_HIGH_ACT|FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED
 	}
     }, {
 	"1280x1024-8", {	/* Cybervision 8 bpp */
 	    1280, 1024, 1280, 1024, 0, 0, 8, 0,
 	    {0, 8, 0}, {0, 8, 0}, {0, 8, 0}, {0, 0, 0},
-	    0, 0, -1, -1, FB_ACCEL_NONE, CYBER8_PIXCLOCK, 64, 96, 35, 12, 112, 2,
+	    0, 0, -1, -1, FB_ACCELF_TEXT, CYBER8_PIXCLOCK, 64, 96, 35, 12, 112, 2,
 	    FB_SYNC_COMP_HIGH_ACT|FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED
 	}
     }, {
 	"1600x1200-8", {	/* Cybervision 8 bpp */
 	    1600, 1200, 1600, 1200, 0, 0, 8, 0,
 	    {0, 8, 0}, {0, 8, 0}, {0, 8, 0}, {0, 0, 0},
-	    0, 0, -1, -1, FB_ACCEL_NONE, CYBER8_PIXCLOCK, 64, 96, 35, 12, 112, 2,
+	    0, 0, -1, -1, FB_ACCELF_TEXT, CYBER8_PIXCLOCK, 64, 96, 35, 12, 112, 2,
 	    FB_SYNC_COMP_HIGH_ACT|FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED
 	}
     }, {
 	"800x600-16", {		/* Cybervision 16 bpp */
 	    800, 600, 800, 600, 0, 0, 16, 0,
 	    {11, 5, 0}, {5, 6, 0}, {0, 5, 0}, {0, 0, 0},
-	    0, 0, -1, -1, FB_ACCEL_NONE, CYBER16_PIXCLOCK, 64, 96, 35, 12, 112, 2,
+	    0, 0, -1, -1, FB_ACCELF_TEXT, CYBER16_PIXCLOCK, 64, 96, 35, 12, 112, 2,
 	    FB_SYNC_COMP_HIGH_ACT|FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED
 	}
     }
@@ -371,12 +373,11 @@
 static int Cyber_encode_fix(struct fb_fix_screeninfo *fix,
 			    struct cyberfb_par *par)
 {
-	int i;
-
+	memset(fix, 0, sizeof(struct fb_fix_screeninfo));
 	strcpy(fix->id, cyberfb_name);
-	fix->smem_start = (caddr_t)CyberMem;
+	fix->smem_start = (char *)CyberMem;
 	fix->smem_len = CyberSize;
-	fix->mmio_start = (unsigned char *)CyberRegs;
+	fix->mmio_start = (char *)CyberRegs;
 	fix->mmio_len = 0x10000;
 
 	fix->type = FB_TYPE_PACKED_PIXELS;
@@ -390,9 +391,7 @@
 	fix->ypanstep = 0;
 	fix->ywrapstep = 0;
 	fix->line_length = 0;
-
-	for (i = 0; i < arraysize(fix->reserved); i++)
-		fix->reserved[i] = 0;
+	fix->accel = FB_ACCEL_S3_TRIO64;
 
 	return(0);
 }
@@ -410,6 +409,10 @@
 	par->xres = var->xres;
 	par->yres = var->yres;
 	par->bpp = var->bits_per_pixel;
+	if (var->accel_flags & FB_ACCELF_TEXT)
+	    par->accel = FB_ACCELF_TEXT;
+	else
+	    par->accel = 0;
 #else
 	if (Cyberfb_Cyber8) {
 		par->xres = CYBER8_WIDTH;
@@ -433,8 +436,6 @@
 static int Cyber_encode_var(struct fb_var_screeninfo *var,
 			    struct cyberfb_par *par)
 {
-	int i;
-
 	var->xres = par->xres;
 	var->yres = par->yres;
 	var->xres_virtual = par->xres;
@@ -471,8 +472,7 @@
 	var->height = -1;
 	var->width = -1;
 
-	var->accel = FB_ACCEL_CYBERVISION;
-	DPRINTK("accel CV64\n");
+	var->accel_flags = (par->accel && par->bpp == 8) ? FB_ACCELF_TEXT : 0;
 
 	var->vmode = FB_VMODE_NONINTERLACED;
 
@@ -490,9 +490,6 @@
 	var->hsync_len = 112;
 	var->vsync_len = 2;
 
-	for (i = 0; i < arraysize(var->reserved); i++)
-		var->reserved[i] = 0;
-
 	return(0);
 }
 
@@ -847,7 +844,7 @@
 	cyberfb_get_fix(&fix, con, info);
 	if (con == -1)
 		con = 0;
-	display->screen_base = (u_char *)fix.smem_start;
+	display->screen_base = fix.smem_start;
 	display->visual = fix.visual;
 	display->type = fix.type;
 	display->type_aux = fix.type_aux;
@@ -858,7 +855,11 @@
 	switch (display->var.bits_per_pixel) {
 #ifdef CONFIG_FBCON_CFB8
 	    case 8:
-		display->dispsw = &fbcon_cyber8;
+		if (display->var.accel_flags & FB_ACCELF_TEXT) {
+		    display->dispsw = &fbcon_cyber8;
+#warning FIXME: We should reinit the graphics engine here
+		} else
+		    display->dispsw = &fbcon_cfb8;
 		break;
 #endif
 #ifdef CONFIG_FBCON_CFB16
@@ -880,7 +881,7 @@
 static int cyberfb_set_var(struct fb_var_screeninfo *var, int con,
 			   struct fb_info *info)
 {
-	int err, oldxres, oldyres, oldvxres, oldvyres, oldbpp;
+	int err, oldxres, oldyres, oldvxres, oldvyres, oldbpp, oldaccel;
 
 	if ((err = do_fb_set_var(var, con == currcon)))
 		return(err);
@@ -890,11 +891,13 @@
 		oldvxres = fb_display[con].var.xres_virtual;
 		oldvyres = fb_display[con].var.yres_virtual;
 		oldbpp = fb_display[con].var.bits_per_pixel;
+		oldaccel = fb_display[con].var.accel_flags;
 		fb_display[con].var = *var;
 		if (oldxres != var->xres || oldyres != var->yres ||
 		    oldvxres != var->xres_virtual ||
 		    oldvyres != var->yres_virtual ||
-		    oldbpp != var->bits_per_pixel) {
+		    oldbpp != var->bits_per_pixel ||
+		    oldaccel != var->accel_flags) {
 			cyberfb_set_disp(con, info);
 			(*fb_info.changevar)(con);
 			fb_alloc_cmap(&fb_display[con].cmap, 0, 0);
@@ -975,7 +978,7 @@
 static struct fb_ops cyberfb_ops = {
 	cyberfb_open, cyberfb_release, cyberfb_get_fix, cyberfb_get_var,
 	cyberfb_set_var, cyberfb_get_cmap, cyberfb_set_cmap,
-	cyberfb_pan_display, NULL, cyberfb_ioctl
+	cyberfb_pan_display, cyberfb_ioctl
 };
 
 
@@ -1175,7 +1178,7 @@
 
 static struct display_switch fbcon_cyber8 = {
    fbcon_cfb8_setup, fbcon_cyber8_bmove, fbcon_cyber8_clear, fbcon_cyber8_putc,
-   fbcon_cyber8_putcs, fbcon_cyber8_revc
+   fbcon_cyber8_putcs, fbcon_cyber8_revc, NULL
 };
 #endif
 
@@ -1183,7 +1186,7 @@
 #ifdef MODULE
 int init_module(void)
 {
-	return(cyberfb_init(NULL));
+	return cyberfb_init(NULL);
 }
 
 void cleanup_module(void)
diff -u --recursive --new-file v2.1.106/linux/drivers/video/dnfb.c linux/drivers/video/dnfb.c
--- v2.1.106/linux/drivers/video/dnfb.c	Thu Mar 26 15:57:04 1998
+++ linux/drivers/video/dnfb.c	Wed Jun 24 14:44:01 1998
@@ -142,7 +142,7 @@
 static struct fb_info fb_info;
 static struct fb_ops dnfb_ops = { 
 	dnfb_open,dnfb_release, dnfb_get_fix, dnfb_get_var, dnfb_set_var,
-	dnfb_get_cmap, dnfb_set_cmap, dnfb_pan_display, NULL, dnfb_ioctl
+	dnfb_get_cmap, dnfb_set_cmap, dnfb_pan_display, dnfb_ioctl
 };
 
 static int currcon=0;
@@ -187,6 +187,7 @@
 static int dnfb_get_var(struct fb_var_screeninfo *var, int con,
 			struct fb_info *info)
 {
+	memset(var, 0, sizeof(struct fb_var_screeninfo));
 	var->xres=1280;
 	var->yres=1024;
 	var->xres_virtual=2048;
@@ -206,7 +207,6 @@
 	var->vsync_len=0;
 	var->sync=0;
 	var->vmode=FB_VMODE_NONINTERLACED;
-	var->accel=FB_ACCEL_NONE;
 
 	return 0;
 
@@ -249,8 +249,6 @@
 		return -EINVAL;
 	if(var->vmode!=FB_VMODE_NONINTERLACED)
 		return -EINVAL;
-	if(var->accel!=FB_ACCEL_NONE)
-		return -EINVAL;
 
 	return 0;
 
@@ -297,7 +295,7 @@
   if(con==-1) 
     con=0;
 
-   disp[con].screen_base = (u_char *)fix.smem_start;
+   disp[con].screen_base = fix.smem_start;
    disp[con].visual = fix.visual;
    disp[con].type = fix.type;
    disp[con].type_aux = fix.type_aux;
diff -u --recursive --new-file v2.1.106/linux/drivers/video/fbcon-afb.c linux/drivers/video/fbcon-afb.c
--- v2.1.106/linux/drivers/video/fbcon-afb.c	Wed Apr  8 19:36:28 1998
+++ linux/drivers/video/fbcon-afb.c	Wed Jun 24 14:44:01 1998
@@ -414,7 +414,7 @@
 
 struct display_switch fbcon_afb = {
     fbcon_afb_setup, fbcon_afb_bmove, fbcon_afb_clear, fbcon_afb_putc,
-    fbcon_afb_putcs, fbcon_afb_revc
+    fbcon_afb_putcs, fbcon_afb_revc, NULL
 };
 
 
diff -u --recursive --new-file v2.1.106/linux/drivers/video/fbcon-cfb16.c linux/drivers/video/fbcon-cfb16.c
--- v2.1.106/linux/drivers/video/fbcon-cfb16.c	Wed Apr  8 19:36:28 1998
+++ linux/drivers/video/fbcon-cfb16.c	Wed Jun 24 14:44:01 1998
@@ -37,7 +37,7 @@
 
 void fbcon_cfb16_setup(struct display *p)
 {
-    p->next_line = p->var.xres_virtual<<1;
+    p->next_line = p->line_length ? p->line_length : p->var.xres_virtual<<1;
     p->next_plane = 0;
 }
 
@@ -181,7 +181,7 @@
 
 struct display_switch fbcon_cfb16 = {
     fbcon_cfb16_setup, fbcon_cfb16_bmove, fbcon_cfb16_clear, fbcon_cfb16_putc,
-    fbcon_cfb16_putcs, fbcon_cfb16_revc
+    fbcon_cfb16_putcs, fbcon_cfb16_revc, NULL
 };
 
 
diff -u --recursive --new-file v2.1.106/linux/drivers/video/fbcon-cfb2.c linux/drivers/video/fbcon-cfb2.c
--- v2.1.106/linux/drivers/video/fbcon-cfb2.c	Wed Apr  8 19:36:28 1998
+++ linux/drivers/video/fbcon-cfb2.c	Wed Jun 24 14:44:01 1998
@@ -187,7 +187,7 @@
 
 struct display_switch fbcon_cfb2 = {
     fbcon_cfb2_setup, fbcon_cfb2_bmove, fbcon_cfb2_clear, fbcon_cfb2_putc,
-    fbcon_cfb2_putcs, fbcon_cfb2_revc
+    fbcon_cfb2_putcs, fbcon_cfb2_revc, NULL
 };
 
 
diff -u --recursive --new-file v2.1.106/linux/drivers/video/fbcon-cfb24.c linux/drivers/video/fbcon-cfb24.c
--- v2.1.106/linux/drivers/video/fbcon-cfb24.c	Wed Apr  8 19:36:28 1998
+++ linux/drivers/video/fbcon-cfb24.c	Wed Jun 24 14:44:01 1998
@@ -108,7 +108,9 @@
     *dest++ = (d2<<16) | (d3>>8);
     *dest++ = (d3<<24) | d4;
 #elif defined(__LITTLE_ENDIAN)
-#error Please add support for little endian byteorder
+    *dest++ = (d1<<8) | (d2>>16);
+    *dest++ = (d2<<16) | (d3>>8);
+    *dest++ = (d3<<24) | d4;
 #else
 #error FIXME: No endianness??
 #endif
@@ -202,7 +204,7 @@
 
 struct display_switch fbcon_cfb24 = {
     fbcon_cfb24_setup, fbcon_cfb24_bmove, fbcon_cfb24_clear, fbcon_cfb24_putc,
-    fbcon_cfb24_putcs, fbcon_cfb24_revc
+    fbcon_cfb24_putcs, fbcon_cfb24_revc, NULL
 };
 
 
diff -u --recursive --new-file v2.1.106/linux/drivers/video/fbcon-cfb32.c linux/drivers/video/fbcon-cfb32.c
--- v2.1.106/linux/drivers/video/fbcon-cfb32.c	Wed Apr  8 19:36:28 1998
+++ linux/drivers/video/fbcon-cfb32.c	Wed Jun 24 14:44:01 1998
@@ -186,7 +186,7 @@
 
 struct display_switch fbcon_cfb32 = {
     fbcon_cfb32_setup, fbcon_cfb32_bmove, fbcon_cfb32_clear, fbcon_cfb32_putc,
-    fbcon_cfb32_putcs, fbcon_cfb32_revc
+    fbcon_cfb32_putcs, fbcon_cfb32_revc, NULL
 };
 
 
diff -u --recursive --new-file v2.1.106/linux/drivers/video/fbcon-cfb4.c linux/drivers/video/fbcon-cfb4.c
--- v2.1.106/linux/drivers/video/fbcon-cfb4.c	Wed Apr  8 19:36:28 1998
+++ linux/drivers/video/fbcon-cfb4.c	Wed Jun 24 14:44:01 1998
@@ -190,7 +190,7 @@
 
 struct display_switch fbcon_cfb4 = {
     fbcon_cfb4_setup, fbcon_cfb4_bmove, fbcon_cfb4_clear, fbcon_cfb4_putc,
-    fbcon_cfb4_putcs, fbcon_cfb4_revc
+    fbcon_cfb4_putcs, fbcon_cfb4_revc, NULL
 };
 
 
diff -u --recursive --new-file v2.1.106/linux/drivers/video/fbcon-cfb8.c linux/drivers/video/fbcon-cfb8.c
--- v2.1.106/linux/drivers/video/fbcon-cfb8.c	Wed Apr  8 19:36:28 1998
+++ linux/drivers/video/fbcon-cfb8.c	Wed Jun 24 14:44:01 1998
@@ -41,7 +41,7 @@
 
 void fbcon_cfb8_setup(struct display *p)
 {
-    p->next_line = p->var.xres_virtual;
+    p->next_line = p->line_length ? p->line_length : p->var.xres_virtual;
     p->next_plane = 0;
 }
 
@@ -178,7 +178,7 @@
 
 struct display_switch fbcon_cfb8 = {
     fbcon_cfb8_setup, fbcon_cfb8_bmove, fbcon_cfb8_clear, fbcon_cfb8_putc,
-    fbcon_cfb8_putcs, fbcon_cfb8_revc
+    fbcon_cfb8_putcs, fbcon_cfb8_revc, NULL
 };
 
 
diff -u --recursive --new-file v2.1.106/linux/drivers/video/fbcon-ilbm.c linux/drivers/video/fbcon-ilbm.c
--- v2.1.106/linux/drivers/video/fbcon-ilbm.c	Thu Mar 26 15:57:04 1998
+++ linux/drivers/video/fbcon-ilbm.c	Wed Jun 24 14:44:01 1998
@@ -262,7 +262,7 @@
 
 struct display_switch fbcon_ilbm = {
     fbcon_ilbm_setup, fbcon_ilbm_bmove, fbcon_ilbm_clear, fbcon_ilbm_putc,
-    fbcon_ilbm_putcs, fbcon_ilbm_revc
+    fbcon_ilbm_putcs, fbcon_ilbm_revc, NULL
 };
 
 
diff -u --recursive --new-file v2.1.106/linux/drivers/video/fbcon-iplan2p2.c linux/drivers/video/fbcon-iplan2p2.c
--- v2.1.106/linux/drivers/video/fbcon-iplan2p2.c	Sun Jun  7 11:16:35 1998
+++ linux/drivers/video/fbcon-iplan2p2.c	Wed Jun 24 14:44:01 1998
@@ -14,7 +14,6 @@
 #include <linux/tty.h>
 #include <linux/console.h>
 #include <linux/string.h>
-#include <linux/config.h>
 #include <linux/fb.h>
 
 #include <asm/byteorder.h>
@@ -376,7 +375,7 @@
 
 struct display_switch fbcon_iplan2p2 = {
     fbcon_iplan2p2_setup, fbcon_iplan2p2_bmove, fbcon_iplan2p2_clear,
-    fbcon_iplan2p2_putc, fbcon_iplan2p2_putcs, fbcon_iplan2p2_revc
+    fbcon_iplan2p2_putc, fbcon_iplan2p2_putcs, fbcon_iplan2p2_revc, NULL
 };
 
 
diff -u --recursive --new-file v2.1.106/linux/drivers/video/fbcon-iplan2p4.c linux/drivers/video/fbcon-iplan2p4.c
--- v2.1.106/linux/drivers/video/fbcon-iplan2p4.c	Sun Jun  7 11:16:35 1998
+++ linux/drivers/video/fbcon-iplan2p4.c	Wed Jun 24 14:44:01 1998
@@ -14,7 +14,6 @@
 #include <linux/tty.h>
 #include <linux/console.h>
 #include <linux/string.h>
-#include <linux/config.h>
 #include <linux/fb.h>
 
 #include <asm/byteorder.h>
@@ -396,7 +395,7 @@
 
 struct display_switch fbcon_iplan2p4 = {
     fbcon_iplan2p4_setup, fbcon_iplan2p4_bmove, fbcon_iplan2p4_clear,
-    fbcon_iplan2p4_putc, fbcon_iplan2p4_putcs, fbcon_iplan2p4_revc
+    fbcon_iplan2p4_putc, fbcon_iplan2p4_putcs, fbcon_iplan2p4_revc, NULL
 };
 
 
diff -u --recursive --new-file v2.1.106/linux/drivers/video/fbcon-iplan2p8.c linux/drivers/video/fbcon-iplan2p8.c
--- v2.1.106/linux/drivers/video/fbcon-iplan2p8.c	Thu Mar 26 15:57:04 1998
+++ linux/drivers/video/fbcon-iplan2p8.c	Wed Jun 24 14:44:01 1998
@@ -14,7 +14,6 @@
 #include <linux/tty.h>
 #include <linux/console.h>
 #include <linux/string.h>
-#include <linux/config.h>
 #include <linux/fb.h>
 
 #include <asm/byteorder.h>
@@ -433,7 +432,7 @@
 
 struct display_switch fbcon_iplan2p8 = {
     fbcon_iplan2p8_setup, fbcon_iplan2p8_bmove, fbcon_iplan2p8_clear,
-    fbcon_iplan2p8_putc, fbcon_iplan2p8_putcs, fbcon_iplan2p8_revc
+    fbcon_iplan2p8_putc, fbcon_iplan2p8_putcs, fbcon_iplan2p8_revc, NULL
 };
 
 
diff -u --recursive --new-file v2.1.106/linux/drivers/video/fbcon-mac.c linux/drivers/video/fbcon-mac.c
--- v2.1.106/linux/drivers/video/fbcon-mac.c	Wed Apr  8 19:36:28 1998
+++ linux/drivers/video/fbcon-mac.c	Wed Jun 24 14:44:01 1998
@@ -495,7 +495,7 @@
 
 struct display_switch fbcon_mac = {
     fbcon_mac_setup, fbcon_mac_bmove, fbcon_mac_clear, fbcon_mac_putc,
-    fbcon_mac_putcs, fbcon_mac_revc
+    fbcon_mac_putcs, fbcon_mac_revc, NULL
 };
 
 
diff -u --recursive --new-file v2.1.106/linux/drivers/video/fbcon-mfb.c linux/drivers/video/fbcon-mfb.c
--- v2.1.106/linux/drivers/video/fbcon-mfb.c	Wed Apr  8 19:36:28 1998
+++ linux/drivers/video/fbcon-mfb.c	Wed Jun 24 14:44:01 1998
@@ -155,7 +155,7 @@
 
 struct display_switch fbcon_mfb = {
     fbcon_mfb_setup, fbcon_mfb_bmove, fbcon_mfb_clear, fbcon_mfb_putc,
-    fbcon_mfb_putcs, fbcon_mfb_revc
+    fbcon_mfb_putcs, fbcon_mfb_revc, NULL
 };
 
 
diff -u --recursive --new-file v2.1.106/linux/drivers/video/fbcon-vga.c linux/drivers/video/fbcon-vga.c
--- v2.1.106/linux/drivers/video/fbcon-vga.c	Wed Dec 31 16:00:00 1969
+++ linux/drivers/video/fbcon-vga.c	Wed Jun 24 14:44:01 1998
@@ -0,0 +1,190 @@
+/*
+ *  linux/drivers/video/fbcon-vga.c -- Low level frame buffer operations for
+ *				       VGA characters/attributes
+ *
+ *	Created 28 Mar 1998 by Geert Uytterhoeven
+ *	Monochrome attributes added May 1998 by Andrew Apted
+ *
+ *  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 for
+ *  more details.
+ */
+
+#include <linux/module.h>
+#include <linux/tty.h>
+#include <linux/console.h>
+#include <linux/string.h>
+#include <linux/fb.h>
+
+#include <asm/io.h>
+
+#include "fbcon.h"
+#include "fbcon-vga.h"
+
+
+    /*
+     *  VGA screen access
+     */ 
+
+static inline void vga_writew(u16 val, u16 *addr)
+{
+#ifdef __powerpc__
+    st_le16(addr, val);
+#else
+    writew(val, (unsigned long)addr);
+#endif /* !__powerpc__ */
+}
+
+static inline u16 vga_readw(u16 *addr)
+{
+#ifdef __powerpc__
+    return ld_le16(addr);
+#else
+    return readw((unsigned long)addr);
+#endif /* !__powerpc__ */	
+}
+
+static inline void vga_memsetw(void *s, u16 c, unsigned int count)
+{
+    u16 *addr = (u16 *)s;
+
+    while (count) {
+	count--;
+	vga_writew(c, addr++);
+    }
+}
+
+static inline void vga_memmovew(u16 *to, u16 *from, unsigned int count)
+{
+    if (to < from) {
+	while (count) {
+	    count--;
+	    vga_writew(vga_readw(from++), to++);
+	}
+    } else {
+	from += count;
+	to += count;
+	while (count) {
+	    count--;
+	    vga_writew(vga_readw(--from), --to);
+	}
+    }
+}
+
+
+    /*
+     *  VGA characters/attributes
+     */
+
+static inline u16 fbcon_vga_attr(struct display *p,
+				 struct vc_data *conp)
+{
+	if (conp->vc_can_do_color) {
+		return conp->vc_attr << 8;
+	}
+
+        /* Underline and reverse-video are mutually exclusive on MDA.
+         * Since reverse-video is used for cursors and selected areas, 
+	 * it takes precedence.
+         */
+
+	return (attr_reverse(p, conp) ? 0x7000 :
+		(attr_underline(p, conp) ? 0x0100 : 0x0700)) |
+	       (attr_bold(p, conp) ? 0x0800 : 0) |
+	       (attr_blink(p, conp) ? 0x8000 : 0);
+}
+
+void fbcon_vga_setup(struct display *p)
+{
+    p->next_line = p->line_length;
+    p->next_plane = 0;
+}
+
+void fbcon_vga_bmove(struct display *p, int sy, int sx, int dy, int dx,
+		     int height, int width)
+{
+    u16 *src, *dst;
+    int rows;
+
+    if (sx == 0 && dx == 0 && width == p->next_line/2) {
+	src = (u16 *)(p->screen_base+sy*p->next_line);
+	dst = (u16 *)(p->screen_base+dy*p->next_line);
+	vga_memmovew(dst, src, height*width);
+    } else if (dy < sy || (dy == sy && dx < sx)) {
+	src = (u16 *)(p->screen_base+sy*p->next_line+sx*2);
+	dst = (u16 *)(p->screen_base+dy*p->next_line+dx*2);
+	for (rows = height; rows-- ;) {
+	    vga_memmovew(dst, src, width);
+	    src += p->next_line/2;
+	    dst += p->next_line/2;
+	}
+    } else {
+	src = (u16 *)(p->screen_base+(sy+height-1)*p->next_line+sx*2);
+	dst = (u16 *)(p->screen_base+(dy+height-1)*p->next_line+dx*2);
+	for (rows = height; rows-- ;) {
+	    vga_memmovew(dst, src, width);
+	    src -= p->next_line/2;
+	    dst -= p->next_line/2;
+	}
+    }
+}
+
+void fbcon_vga_clear(struct vc_data *conp, struct display *p, int sy, int sx,
+		     int height, int width)
+{
+    u16 *dest = (u16 *)(p->screen_base+sy*p->next_line+sx*2);
+    int rows;
+
+    if (sx == 0 && width*2 == p->next_line)      
+	vga_memsetw(dest, conp->vc_video_erase_char, height*width);
+    else
+	for (rows = height; rows-- ; dest += p->next_line/2)
+	    vga_memsetw(dest, conp->vc_video_erase_char, width);
+}
+
+void fbcon_vga_putc(struct vc_data *conp, struct display *p, int c, int y,
+		    int x)
+{
+    u16 *dst = (u16 *)(p->screen_base+y*p->next_line+x*2);
+    vga_writew(fbcon_vga_attr(p, conp) | (c & 0xff), dst);
+}
+
+void fbcon_vga_putcs(struct vc_data *conp, struct display *p, const char *s,
+		     int count, int y, int x)
+{
+    u16 *dst = (u16 *)(p->screen_base+y*p->next_line+x*2);
+    u16 sattr = fbcon_vga_attr(p, conp);
+    while (count--)
+	vga_writew(sattr | ((int) (*s++) & 0xff), dst++);
+}
+
+void fbcon_vga_revc(struct display *p, int x, int y)
+{
+    u16 *dst = (u16 *)(p->screen_base+y*p->next_line+x*2);
+    u16 val = vga_readw(dst);
+    val = (val & 0x88ff) | ((val<<4) & 0x7000) | ((val>>4) & 0x0700);
+    vga_writew(val, dst);
+}
+
+
+    /*
+     *  `switch' for the low level operations
+     */
+
+struct display_switch fbcon_vga = {
+    fbcon_vga_setup, fbcon_vga_bmove, fbcon_vga_clear, fbcon_vga_putc,
+    fbcon_vga_putcs, fbcon_vga_revc, NULL
+};
+
+
+    /*
+     *  Visible symbols for modules
+     */
+
+EXPORT_SYMBOL(fbcon_vga);
+EXPORT_SYMBOL(fbcon_vga_setup);
+EXPORT_SYMBOL(fbcon_vga_bmove);
+EXPORT_SYMBOL(fbcon_vga_clear);
+EXPORT_SYMBOL(fbcon_vga_putc);
+EXPORT_SYMBOL(fbcon_vga_putcs);
+EXPORT_SYMBOL(fbcon_vga_revc);
diff -u --recursive --new-file v2.1.106/linux/drivers/video/fbcon-vga.h linux/drivers/video/fbcon-vga.h
--- v2.1.106/linux/drivers/video/fbcon-vga.h	Wed Dec 31 16:00:00 1969
+++ linux/drivers/video/fbcon-vga.h	Wed Jun 24 14:44:01 1998
@@ -0,0 +1,15 @@
+    /*
+     *  VGA characters/attributes
+     */
+
+extern struct display_switch fbcon_vga;
+extern void fbcon_vga_setup(struct display *p);
+extern void fbcon_vga_bmove(struct display *p, int sy, int sx, int dy, int dx,
+			    int height, int width);
+extern void fbcon_vga_clear(struct vc_data *conp, struct display *p, int sy,
+			    int sx, int height, int width);
+extern void fbcon_vga_putc(struct vc_data *conp, struct display *p, int c,
+			   int yy, int xx);
+extern void fbcon_vga_putcs(struct vc_data *conp, struct display *p,
+			    const char *s, int count, int yy, int xx);
+extern void fbcon_vga_revc(struct display *p, int xx, int yy);
diff -u --recursive --new-file v2.1.106/linux/drivers/video/fbcon.c linux/drivers/video/fbcon.c
--- v2.1.106/linux/drivers/video/fbcon.c	Thu Mar 26 15:57:04 1998
+++ linux/drivers/video/fbcon.c	Wed Jun 24 14:44:01 1998
@@ -24,6 +24,8 @@
  *			   Martin Schaller
  *			   Andreas Schwab
  *
+ *  Hardware cursor support added by Emmanuel Marty (core@ggi-project.org)
+ *
  *
  *  The low level operations for the various display memory organizations are
  *  now in separate source files.
@@ -39,7 +41,6 @@
  *  To do:
  *
  *    - Implement 16 plane mode (iplan2p16)
- *    - Hardware cursor
  *
  *
  *  This file is subject to the terms and conditions of the GNU General Public
@@ -82,7 +83,7 @@
 #ifdef CONFIG_MAC
 #include <asm/macints.h>
 #endif
-#ifdef __mc68000__
+#if defined(__mc68000__) || defined(CONFIG_APUS)
 #include <asm/machdep.h>
 #include <asm/setup.h>
 #endif
@@ -101,8 +102,13 @@
 struct display fb_display[MAX_NR_CONSOLES];
 
 
-/* ++Geert: Sorry, no hardware cursor support at the moment;
-   use Atari alike software cursor */
+/*
+ * Emmanuel: fbcon will now use a hardware cursor if the
+ * low-level driver provides a non-NULL dispsw->cursor pointer,
+ * in which case the hardware should do blinking, etc.
+ *
+ * if dispsw->cursor is NULL, use Atari alike software cursor
+ */
 
 #if FLASHING_CURSOR
 static int cursor_drawn = 0;
@@ -164,8 +170,7 @@
 static int fbcon_get_font(struct vc_data *conp, int *w, int *h, char *data);
 static int fbcon_set_font(struct vc_data *conp, int w, int h, char *data);
 static int fbcon_set_palette(struct vc_data *conp, unsigned char *table);
-static int fbcon_scrolldelta(int lines);
-static int fbcon_set_mode(struct vc_data *conp, int mode);
+static int fbcon_scrolldelta(struct vc_data *conp, int lines);
 
 
 /*
@@ -527,26 +532,35 @@
     int unit = conp->vc_num;
     struct display *p = &fb_display[unit];
 
+    /* do we have a hardware cursor ? */
+    if (p->dispsw->cursor) {
+	p->cursor_x = conp->vc_x;
+	p->cursor_y = conp->vc_y;
+	p->dispsw->cursor(p, mode, p->cursor_x, real_y(p, p->cursor_y));
+	return;
+    }
+
     /* Avoid flickering if there's no real change. */
     if (p->cursor_x == conp->vc_x && p->cursor_y == conp->vc_y &&
 	(mode == CM_ERASE) == !cursor_on)
 	return;
-    if (CURSOR_UNDRAWN ())
-	p->dispsw->revc(p, p->cursor_x, real_y(p, p->cursor_y));
-    p->cursor_x = conp->vc_x;
-    p->cursor_y = conp->vc_y;
-
-    switch (mode) {
-	case CM_ERASE:
-	    cursor_on = 0;
-	    break;
 
-	case CM_MOVE:
-	case CM_DRAW:
-	    vbl_cursor_cnt = CURSOR_DRAW_DELAY;
-	    cursor_on = 1;
-	    break;
-    }
+	if (CURSOR_UNDRAWN ())
+	    p->dispsw->revc(p, p->cursor_x, real_y(p, p->cursor_y));
+	p->cursor_x = conp->vc_x;
+	p->cursor_y = conp->vc_y;
+
+	switch (mode) {
+	    case CM_ERASE:
+		cursor_on = 0;
+		break;
+
+	    case CM_MOVE:
+	    case CM_DRAW:
+		vbl_cursor_cnt = CURSOR_DRAW_DELAY;
+		cursor_on = 1;
+		break;
+	}
 }
 
 
@@ -642,9 +656,10 @@
 {
     p->yscroll -= count;
     if (p->yscroll < 0) {
-	p->yscroll = p->vrows-conp->vc_rows;
-	p->dispsw->bmove(p, 0, 0, p->yscroll+count, 0, conp->vc_rows-count,
-			 conp->vc_cols);
+	p->dispsw->bmove(p, p->yscroll + count, 0,
+			 p->vrows - conp->vc_rows + count, 0,
+			 conp->vc_rows - count, conp->vc_cols);
+	p->yscroll = p->vrows - conp->vc_rows;
     }
     p->var.xoffset = 0;
     p->var.yoffset = p->yscroll*p->fontheight;
@@ -1051,13 +1066,14 @@
 	val = conp->vc_palette[j++];
 	palette_blue[k] = (val<<8)|val;
     }
-    palette_cmap.len = 1<<p->var.bits_per_pixel;
-    if (palette_cmap.len > 16)
+    if (p->var.bits_per_pixel <= 4)
+	palette_cmap.len = 1<<p->var.bits_per_pixel;
+    else
 	palette_cmap.len = 16;
     return p->fb_info->fbops->fb_set_cmap(&palette_cmap, 1, unit, p->fb_info);
 }
 
-static int fbcon_scrolldelta(int lines)
+static int fbcon_scrolldelta(struct vc_data *conp, int lines)
 {
 #if SUPPORT_SCROLLBACK
     int unit = fg_console; /* xxx */
@@ -1092,20 +1108,6 @@
 }
 
 
-    /*
-     *  Switch between `text' (emulated and accelerated) and `graphics'
-     *  (unaccelerated text) mode
-     */
-
-static int fbcon_set_mode(struct vc_data *conp, int mode)
-{
-    struct display *p = &fb_display[conp->vc_num];
-    struct fb_ops *ops = p->fb_info->fbops;
-
-    return ops->fb_set_mode ? ops->fb_set_mode(mode, p->fb_info) : 0;
-}
-
-
 #define LOGO_H			80
 #define LOGO_W			80
 #define LOGO_LINE	(LOGO_W/8)
@@ -1120,15 +1122,20 @@
     unsigned char *dst, *src;
     int i, j, n, x1, y1;
     int logo_depth, done = 0;
-	
-    /* Set colors if visual is PSEUDOCOLOR and we have enough colors */
-    if (p->visual == FB_VISUAL_PSEUDOCOLOR && depth >= 4) {
-	int first_col = depth >= 8 ? 32 : depth > 4 ? 16 : 0;
-	int num_cols = depth >= 8 ? LINUX_LOGO_COLORS : 16;
+
+    /* Set colors if visual is PSEUDOCOLOR and we have enough colors, or for
+     * TRUECOLOR */
+    if ((p->visual == FB_VISUAL_PSEUDOCOLOR && depth >= 4) ||
+	p->visual == FB_VISUAL_TRUECOLOR) {
+	int is_truecolor = (p->visual == FB_VISUAL_TRUECOLOR);
+	int use_256 = (!is_truecolor && depth >= 8) ||
+		      (is_truecolor && depth >= 24);
+	int first_col = use_256 ? 32 : depth > 4 ? 16 : 0;
+	int num_cols = use_256 ? LINUX_LOGO_COLORS : 16;
 	unsigned char *red, *green, *blue;
 	int old_cmap_len;
 	
-	if (depth >= 8) {
+	if (use_256) {
 	    red   = linux_logo_red;
 	    green = linux_logo_green;
 	    blue  = linux_logo_blue;
@@ -1142,7 +1149,7 @@
 	/* dirty trick to avoid setcmap calling kmalloc which isn't
 	 * initialized yet... */
 	old_cmap_len = fb_display[fg_console].cmap.len;
-	fb_display[fg_console].cmap.len = 1 << depth;
+	fb_display[fg_console].cmap.len = 1 << (depth/(is_truecolor ? 3 : 1));
 	
 	for( i = 0; i < num_cols; i += n ) {
 	    n = num_cols - i;
@@ -1161,7 +1168,7 @@
 	}
 	fb_display[fg_console].cmap.len = old_cmap_len;
     }
-
+	
     if (depth >= 8) {
 	logo = linux_logo;
 	logo_depth = 8;
@@ -1194,10 +1201,14 @@
 	    for( y1 = 0; y1 < LOGO_H; y1++ ) {
 		dst = fb + y1*line;
 		for( x1 = 0; x1 < LOGO_W; x1++, src++ ) {
-		val = ((linux_logo_red[*src]   & redmask)   << redshift) |
-		      ((linux_logo_green[*src] & greenmask) << greenshift) |
-		      ((linux_logo_blue[*src]  & bluemask)  << blueshift);
+		    val = (*src << redshift) |
+			  (*src << greenshift) |
+			  (*src << blueshift);
+#ifdef __LITTLE_ENDIAN
+		    for( i = 0; i < bdepth; ++i )
+#else
 		    for( i = bdepth-1; i >= 0; --i )
+#endif
 			*dst++ = val >> (i*8);
 		}
 	    }
@@ -1251,10 +1262,14 @@
 	for( y1 = 0; y1 < LOGO_H; y1++ ) {
 	    dst = fb + y1*line;
 	    for( x1 = 0; x1 < LOGO_W; x1++, src++ ) {
-		val = ((linux_logo_red[*src]   & redmask)   << redshift) |
-		      ((linux_logo_green[*src] & greenmask) << greenshift) |
-		      ((linux_logo_blue[*src]  & bluemask)  << blueshift);
+		val = ((linux_logo_red[*src-32]   & redmask)   << redshift) |
+		      ((linux_logo_green[*src-32] & greenmask) << greenshift) |
+		      ((linux_logo_blue[*src-32]  & bluemask)  << blueshift);
+#ifdef __LITTLE_ENDIAN
 		for( i = 0; i < bdepth; ++i )
+#else
+		for( i = bdepth-1; i >= 0; --i )
+#endif
 		    *dst++ = val >> (i*8);
 	    }
 	}
@@ -1328,7 +1343,9 @@
 #endif
 #if defined(CONFIG_FBCON_MFB) || defined(CONFIG_FBCON_AFB) || \
     defined(CONFIG_FBCON_ILBM)
-    if (depth == 1) {
+    if (depth == 1 && (p->type == FB_TYPE_PACKED_PIXELS ||
+		       p->type == FB_TYPE_PLANES ||
+		       p->type == FB_TYPE_INTERLEAVED_PLANES)) {
 	/* monochrome */
 	unsigned char inverse = p->inverse ? 0x00 : 0xff;
 
@@ -1343,6 +1360,21 @@
 	done = 1;
     }
 #endif
+#ifdef CONFIG_FBCON_VGA
+    if (depth == 1 && p->type == FB_TYPE_VGA_TEXT) {
+
+        int height = 0;
+        char *p;
+    
+        printk(linux_mda_image);
+
+        for (p = linux_mda_image; *p; p++)
+            if (*p == '\n')
+                height++;
+
+        return height;
+    }
+#endif
     /* Modes not yet supported: packed pixels with depth != 8 (does such a
      * thing exist in reality?) */
 
@@ -1359,7 +1391,7 @@
     fbcon_startup, fbcon_init, fbcon_deinit, fbcon_clear, fbcon_putc,
     fbcon_putcs, fbcon_cursor, fbcon_scroll, fbcon_bmove, fbcon_switch,
     fbcon_blank, fbcon_get_font, fbcon_set_font, fbcon_set_palette,
-    fbcon_scrolldelta, fbcon_set_mode
+    fbcon_scrolldelta
 };
 
 
@@ -1376,6 +1408,7 @@
     (void *)fbcon_dummy_op,	/* fbcon_dummy_putc */
     (void *)fbcon_dummy_op,	/* fbcon_dummy_putcs */
     (void *)fbcon_dummy_op,	/* fbcon_dummy_revc */
+    NULL,			/* fbcon_dummy_cursor */
 };
 
 
diff -u --recursive --new-file v2.1.106/linux/drivers/video/fbcon.h linux/drivers/video/fbcon.h
--- v2.1.106/linux/drivers/video/fbcon.h	Thu Mar 26 15:57:04 1998
+++ linux/drivers/video/fbcon.h	Wed Jun 24 14:44:01 1998
@@ -29,6 +29,7 @@
     void (*putcs)(struct vc_data *conp, struct display *p, const char *s,
 		  int count, int yy, int xx);     
     void (*revc)(struct display *p, int xx, int yy);
+    void (*cursor)(struct display *p, int mode, int xx, int yy);
 }; 
 
 
@@ -45,12 +46,14 @@
 	(((conp)->vc_video_erase_char >> ((p)->inverse ? 8 : 12)) & 0x0f)
 
 /* Monochrome */
-#define attr_bold(p,conp)     \
-	(((conp)->vc_attr & 3) == 2)
-#define attr_reverse(p,conp)  \
+#define attr_bold(p,conp) \
+	((conp)->vc_attr & 2)
+#define attr_reverse(p,conp) \
 	(((conp)->vc_attr & 8) ^ ((p)->inverse ? 8 : 0))
 #define attr_underline(p,conp) \
-	(((conp)->vc_attr) & 4)
+	((conp)->vc_attr & 4)
+#define attr_blink(p,conp) \
+	((conp)->vc_attr & 0x80)
 
 
 /* ================================================================= */
@@ -317,6 +320,54 @@
     return(memset(s, 255, count));
 }
 
+#ifdef __i386__
+static __inline__ void fast_memmove(void *d, const void *s, size_t count)
+{
+    if (d < s) {
+__asm__ __volatile__ (
+	"cld\n\t"
+	"shrl $1,%%ecx\n\t"
+	"jnc 1f\n\t"
+	"movsb\n"
+	"1:\tshrl $1,%%ecx\n\t"
+	"jnc 2f\n\t"
+	"movsw\n"
+	"2:\trep\n\t"
+	"movsl"
+	: /* no output */
+	:"c"(count),"D"((long)d),"S"((long)s)
+	:"cx","di","si","memory");
+    } else {
+__asm__ __volatile__ (
+	"std\n\t"
+	"shrl $1,%%ecx\n\t"
+	"jnc 1f\n\t"
+	"movb 3(%%esi),%%al\n\t"
+	"movb %%al,3(%%edi)\n\t"
+	"decl %%esi\n\t"
+	"decl %%edi\n"
+	"1:\tshrl $1,%%ecx\n\t"
+	"jnc 2f\n\t"
+	"movw 2(%%esi),%%ax\n\t"
+	"movw %%ax,2(%%edi)\n\t"
+	"decl %%esi\n\t"
+	"decl %%edi\n\t"
+	"decl %%esi\n\t"
+	"decl %%edi\n"
+	"2:\trep\n\t"
+	"movsl"
+	: /* no output */
+	:"c"(count),"D"(count-4+(long)d),"S"(count-4+(long)s)
+	:"ax","cx","di","si","memory");
+    }
+}
+
+static __inline__ void *mymemmove(char *dst, const char *src, size_t size)
+{
+    fast_memmove(dst, src, size);
+    return dst;
+}
+#else
 static __inline__ void *mymemmove(void *d, const void *s, size_t count)
 {
     return(memmove(d, s, count));
@@ -326,6 +377,7 @@
 {
     memmove(dst, src, size);
 }
+#endif	/* !i386 */
 
 #endif /* !m68k */
 
diff -u --recursive --new-file v2.1.106/linux/drivers/video/fonts.c linux/drivers/video/fonts.c
--- v2.1.106/linux/drivers/video/fonts.c	Thu Mar 26 15:57:04 1998
+++ linux/drivers/video/fonts.c	Wed Jun 24 14:44:02 1998
@@ -12,7 +12,7 @@
 #include <linux/config.h>
 #include <linux/types.h>
 #include <linux/string.h>
-#ifdef __mc68000__
+#if defined(__mc68000__) || defined(CONFIG_APUS)
 #include <asm/setup.h>
 #endif
 #include "font.h"
diff -u --recursive --new-file v2.1.106/linux/drivers/video/hpfb.c linux/drivers/video/hpfb.c
--- v2.1.106/linux/drivers/video/hpfb.c	Wed Dec 31 16:00:00 1969
+++ linux/drivers/video/hpfb.c	Wed Jun 24 14:44:02 1998
@@ -0,0 +1,431 @@
+/*
+ *	HP300 Topcat framebuffer support (derived from macfb of all things)
+ *	Phil Blundell <philb@gnu.org> 1998
+ * 
+ * Should this be moved to drivers/dio/video/ ? -- Peter Maydell
+ * No! -- Jes
+ */
+
+#include <linux/config.h>
+#include <linux/module.h>
+#include <linux/kernel.h>
+#include <linux/sched.h>
+#include <linux/errno.h>
+#include <linux/string.h>
+#include <linux/mm.h>
+#include <linux/tty.h>
+#include <linux/malloc.h>
+#include <linux/delay.h>
+#include <linux/init.h>
+#include <linux/fb.h>
+#include <linux/dio.h>
+#include <asm/io.h>
+#include <asm/blinken.h>
+#include <asm/hwtest.h>
+
+#include "fbcon-mfb.h"
+#include "fbcon-cfb2.h"
+#include "fbcon-cfb4.h"
+#include "fbcon-cfb8.h"
+
+#define arraysize(x)    (sizeof(x)/sizeof(*(x)))
+
+static struct display disp;
+static struct fb_info fb_info;
+
+unsigned long fb_start, fb_size = 1024*768, fb_line_length = 1024;
+unsigned long fb_regs;
+unsigned char fb_bitmask;
+
+#define TC_WEN		0x4088
+#define TC_REN		0x408c
+#define TC_FBEN		0x4090
+#define TC_NBLANK	0x4080
+
+/* blitter regs */
+#define BUSY		0x4044
+#define WMRR		0x40ef
+#define SOURCE_X	0x40f2
+#define SOURCE_Y	0x40f6
+#define DEST_X		0x40fa
+#define DEST_Y		0x40fe
+#define WHEIGHT		0x4106
+#define WWIDTH		0x4102
+#define WMOVE		0x409c
+
+static struct fb_var_screeninfo hpfb_defined = {
+	0,0,0,0,	/* W,H, W, H (virtual) load xres,xres_virtual*/
+	0,0,		/* virtual -> visible no offset */
+	0,		/* depth -> load bits_per_pixel */
+	0,		/* greyscale ? */
+	{0,2,0},	/* R */
+	{0,2,0},	/* G */
+	{0,2,0},	/* B */
+	{0,0,0},	/* transparency */
+	0,		/* standard pixel format */
+	FB_ACTIVATE_NOW,
+	274,195,	/* 14" monitor */
+	FB_ACCEL_NONE,
+	0L,0L,0L,0L,0L,
+	0L,0L,0,	/* No sync info */
+	FB_VMODE_NONINTERLACED,
+	{0,0,0,0,0,0}
+};
+
+struct hpfb_par
+{
+};
+
+static int currcon = 0;
+struct hpfb_par current_par;
+
+static void hpfb_encode_var(struct fb_var_screeninfo *var, 
+				struct hpfb_par *par)
+{
+	int i=0;
+	var->xres=1024;
+	var->yres=768;
+	var->xres_virtual=1024;
+	var->yres_virtual=768;
+	var->xoffset=0;
+	var->yoffset=0;
+	var->bits_per_pixel = 1;
+	var->grayscale=0;
+	var->transp.offset=0;
+	var->transp.length=0;
+	var->transp.msb_right=0;
+	var->nonstd=0;
+	var->activate=0;
+	var->height= -1;
+	var->width= -1;
+	var->vmode=FB_VMODE_NONINTERLACED;
+	var->pixclock=0;
+	var->sync=0;
+	var->left_margin=0;
+	var->right_margin=0;
+	var->upper_margin=0;
+	var->lower_margin=0;
+	var->hsync_len=0;
+	var->vsync_len=0;
+	for(i=0;i<arraysize(var->reserved);i++)
+		var->reserved[i]=0;
+}
+
+static void hpfb_get_par(struct hpfb_par *par)
+{
+	*par=current_par;
+}
+
+static int fb_update_var(int con, struct fb_info *info)
+{
+	return 0;
+}
+
+static int do_fb_set_var(struct fb_var_screeninfo *var, int isactive)
+{
+	struct hpfb_par par;
+	
+	hpfb_get_par(&par);
+	hpfb_encode_var(var, &par);
+	return 0;
+}
+
+static int hpfb_get_cmap(struct fb_cmap *cmap, int kspc, int con,
+			  struct fb_info *info)
+{
+	return 0;
+}
+
+/*
+ * Set the palette.  This may not work on all boards but only experimentation will tell.
+ * XXX Doesn't work at all.
+ */
+
+static int hpfb_set_cmap(struct fb_cmap *cmap, int kspc, int con,
+			  struct fb_info *info)
+{
+	unsigned int i;
+	for (i = 0; i < cmap->len; i++)
+	{
+		while (readw(fb_regs + 0x6002) & 0x4) udelay(1);
+		writew(0, fb_regs + 0x60f0);
+		writew(cmap->start + i, fb_regs + 0x60b8);
+		writew(cmap->red[i], fb_regs + 0x60b2);
+		writew(cmap->green[i], fb_regs + 0x60b4);
+		writew(cmap->blue[i], fb_regs + 0x60b6);
+		writew(0xff, fb_regs + 0x60f0);
+		udelay(100);
+	}
+	writew(0xffff, fb_regs + 0x60ba);
+	return 0;
+}
+
+static int hpfb_get_var(struct fb_var_screeninfo *var, int con,
+			 struct fb_info *info)
+{
+	struct hpfb_par par;
+	if(con==-1)
+	{
+		hpfb_get_par(&par);
+		hpfb_encode_var(var, &par);
+	}
+	else
+		*var=fb_display[con].var;
+	return 0;
+}
+
+static int hpfb_set_var(struct fb_var_screeninfo *var, int con,
+			 struct fb_info *info)
+{
+	int err;
+	
+	if ((err=do_fb_set_var(var, 1)))
+		return err;
+	return 0;
+}
+
+static void hpfb_encode_fix(struct fb_fix_screeninfo *fix, 
+				struct hpfb_par *par)
+{
+	memset(fix, 0, sizeof(struct fb_fix_screeninfo));
+	strcpy(fix->id, "HP300 Topcat");
+
+	/*
+	 * X works, but screen wraps ... 
+	 */
+	fix->smem_start=(char *)fb_start;
+	fix->smem_len=fb_size;
+	fix->type = FB_TYPE_PACKED_PIXELS;
+	fix->visual = FB_VISUAL_PSEUDOCOLOR;
+	fix->xpanstep=0;
+	fix->ypanstep=0;
+	fix->ywrapstep=0;
+	fix->line_length=fb_line_length;
+}
+
+static int hpfb_get_fix(struct fb_fix_screeninfo *fix, int con,
+			 struct fb_info *info)
+{
+	struct hpfb_par par;
+	hpfb_get_par(&par);
+	hpfb_encode_fix(fix, &par);
+	return 0;
+}
+
+static void topcat_blit(int x0, int y0, int x1, int y1, int w, int h)
+{
+	while (readb(fb_regs + BUSY) & fb_bitmask);
+	writeb(0x3, fb_regs + WMRR);
+	writew(x0, fb_regs + SOURCE_X);
+	writew(y0, fb_regs + SOURCE_Y);
+	writew(x1, fb_regs + DEST_X);
+	writew(y1, fb_regs + DEST_Y);
+	writew(h, fb_regs + WHEIGHT);
+	writew(w, fb_regs + WWIDTH);
+	writeb(fb_bitmask, fb_regs + WMOVE);
+}
+
+static int hpfb_ioctl(struct inode *inode, struct file *file, 
+		       unsigned int cmd, unsigned long arg, int con,
+		       struct fb_info *info)
+{
+	return -EINVAL;
+}
+
+static int hpfb_switch(int con, struct fb_info *info)
+{
+	do_fb_set_var(&fb_display[con].var,1);
+	currcon=con;
+	return 0;
+}
+
+/* 0 unblank, 1 blank, 2 no vsync, 3 no hsync, 4 off */
+
+static void hpfb_blank(int blank, struct fb_info *info)
+{
+	/* Not supported */
+}
+
+static int hpfb_open(struct fb_info *info)
+{
+	/*
+	 * Nothing, only a usage count for the moment
+	 */
+	MOD_INC_USE_COUNT;
+	return(0);
+}
+
+static void hpfb_set_disp(int con)
+{
+	struct fb_fix_screeninfo fix;
+	struct display *display;
+	
+	if (con >= 0)
+		display = &fb_display[con];
+	else
+		display = &disp;	/* used during initialization */
+
+	hpfb_get_fix(&fix, con, 0);
+
+	display->screen_base = fix.smem_start;
+	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->next_line = fix.line_length;
+	display->can_soft_blank = 0;
+	display->inverse = 0;
+
+	display->dispsw = &fbcon_cfb8;
+}
+
+static int hpfb_release(struct fb_info *info)
+{
+	MOD_DEC_USE_COUNT;
+	return(0);
+}
+
+static struct fb_ops hpfb_ops = {
+	hpfb_open,
+	hpfb_release,
+	hpfb_get_fix,
+	hpfb_get_var,
+	hpfb_set_var,
+	hpfb_get_cmap,
+	hpfb_set_cmap,
+	NULL,
+	hpfb_ioctl
+};
+
+#define TOPCAT_FBOMSB	0x5d
+#define TOPCAT_FBOLSB	0x5f
+
+__initfunc(int hpfb_init_one(unsigned long base))
+{
+	unsigned long fboff;
+	int err;
+
+	fboff = (readb(base + TOPCAT_FBOMSB) << 8) 
+		| readb(base + TOPCAT_FBOLSB);
+
+	fb_start = 0xf0000000 | (readb(base + fboff) << 16);
+	fb_regs = base;
+
+#if 0
+	/* This is the magic incantation NetBSD uses to make Catseye boards work. */
+	writeb(0, base+0x4800);
+	writeb(0, base+0x4510);
+	writeb(0, base+0x4512);
+	writeb(0, base+0x4514);
+	writeb(0, base+0x4516);
+	writeb(0x90, base+0x4206);
+#endif
+
+	/*
+	 *	Fill in the available video resolution
+	 */
+	 
+	hpfb_defined.xres = 1024;
+	hpfb_defined.yres = 768;
+	hpfb_defined.xres_virtual = 1024;
+	hpfb_defined.yres_virtual = 768;
+	hpfb_defined.bits_per_pixel = 8;
+
+	/* 
+	 *	Give the hardware a bit of a prod and work out how many bits per
+	 *	pixel are supported.
+	 */
+	
+	writeb(0xff, base + TC_WEN);
+	writeb(0xff, base + TC_FBEN);
+	writeb(0xff, fb_start);
+	fb_bitmask = readb(fb_start);
+
+	/*
+	 *	Enable reading/writing of all the planes.
+	 */
+	writeb(fb_bitmask, base + TC_WEN);
+	writeb(fb_bitmask, base + TC_REN);
+	writeb(fb_bitmask, base + TC_FBEN);
+	writeb(0x1, base + TC_NBLANK);
+
+	/*
+	 *	Let there be consoles..
+	 */
+	strcpy(fb_info.modename, "Topcat");
+	fb_info.changevar = NULL;
+	fb_info.node = -1;
+	fb_info.fbops = &hpfb_ops;
+	fb_info.disp = &disp;
+	fb_info.switch_con = &hpfb_switch;
+	fb_info.updatevar = &fb_update_var;
+	fb_info.blank = &hpfb_blank;
+	do_fb_set_var(&hpfb_defined, 1);
+
+	err = register_framebuffer(&fb_info);
+	if (err < 0)
+		return 1;
+
+	hpfb_get_var(&disp.var, -1, &fb_info);
+	hpfb_set_disp(-1);
+
+	return 0;
+}
+
+/* 
+ * Check that the secondary ID indicates that we have some hope of working with this
+ * framebuffer.  The catseye boards are pretty much like topcats and we can muddle through.
+ */
+
+#define topcat_sid_ok(x)  (((x) == DIO_ID2_LRCATSEYE) || ((x) == DIO_ID2_HRCCATSEYE)    \
+			   || ((x) == DIO_ID2_HRMCATSEYE) || ((x) == DIO_ID2_TOPCAT))
+
+/* 
+ * Initialise the framebuffer
+ */
+
+__initfunc(unsigned long hpfb_init(unsigned long mem_start))
+{
+	unsigned int sid;
+
+	/* Topcats can be on the internal IO bus or real DIO devices.
+	 * The internal variant sits at 0xf0560000; it has primary
+	 * and secondary ID registers just like the DIO version.
+	 * So we merge the two detection routines.
+	 *
+	 * Perhaps this #define should be in a global header file:
+	 * I believe it's common to all internal fbs, not just topcat.
+	 */
+#define INTFBADDR 0xf0560000
+
+	if (hwreg_present((void *)INTFBADDR) && (DIO_ID(INTFBADDR) == DIO_ID_FBUFFER)
+		&& topcat_sid_ok(sid = DIO_SECID(INTFBADDR)))
+	{
+		printk("Internal Topcat found (secondary id %02x)\n", sid); 
+		hpfb_init_one(INTFBADDR);
+	}
+	else
+	{
+		int sc = dio_find(DIO_ID_FBUFFER);
+		if (sc)
+		{
+			unsigned long addr = (unsigned long)dio_scodetoviraddr(sc);
+			unsigned int sid = DIO_SECID(addr);
+
+			if (topcat_sid_ok(sid))
+			{
+				printk("Topcat found at DIO select code %02x "
+				       "(secondary id %02x)\n", sc, sid);
+				hpfb_init_one(addr);
+			}
+		}
+	}
+
+	return mem_start;
+}
+
+__initfunc(void hpfb_setup(char *options, int *ints))
+{
+}
diff -u --recursive --new-file v2.1.106/linux/drivers/video/macfb.c linux/drivers/video/macfb.c
--- v2.1.106/linux/drivers/video/macfb.c	Sun Jun  7 11:16:35 1998
+++ linux/drivers/video/macfb.c	Wed Jun 24 14:44:02 1998
@@ -44,7 +44,7 @@
 	0,		/* standard pixel format */
 	FB_ACTIVATE_NOW,
 	274,195,	/* 14" monitor *Mikael Nykvist's anyway* */
-	FB_ACCEL_NONE,	/* The only way to accelerate a mac is .. */
+	0,		/* The only way to accelerate a mac is .. */
 	0L,0L,0L,0L,0L,
 	0L,0L,0,	/* No sync info */
 	FB_VMODE_NONINTERLACED,
@@ -94,7 +94,7 @@
 static void macfb_encode_var(struct fb_var_screeninfo *var, 
 				struct macfb_par *par)
 {
-	int i=0;
+	memset(var, 0, sizeof(struct fb_var_screeninfo));
 	var->xres=mac_xres;
 	var->yres=mac_yres;
 	var->xres_virtual=mac_vxres;
@@ -110,7 +110,6 @@
 	var->activate=0;
 	var->height= -1;
 	var->width= -1;
-	var->accel=0;
 	var->vmode=FB_VMODE_NONINTERLACED;
 	var->pixclock=0;
 	var->sync=0;
@@ -120,8 +119,6 @@
 	var->lower_margin=0;
 	var->hsync_len=0;
 	var->vsync_len=0;
-	for(i=0;i<arraysize(var->reserved);i++)
-		var->reserved[i]=0;
 	return;
 }
 
@@ -155,8 +152,6 @@
 static void macfb_encode_fix(struct fb_fix_screeninfo *fix, 
 				struct macfb_par *par)
 {
-	int i;
-
 	memset(fix, 0, sizeof(struct fb_fix_screeninfo));
 	strcpy(fix->id,"Macintosh");
 
@@ -210,7 +205,7 @@
 
 	macfb_get_fix(&fix, con, 0);
 
-	display->screen_base = (u_char *)(fix.smem_start+fix.smem_offset);
+	display->screen_base = fix.smem_start+fix.smem_offset;
 	display->visual = fix.visual;
 	display->type = fix.type;
 	display->type_aux = fix.type_aux;
@@ -323,14 +318,12 @@
 	macfb_get_cmap,
 	macfb_set_cmap,
 	macfb_pan_display,
-	NULL,
 	macfb_ioctl
 };
 
 void macfb_setup(char *options, int *ints)
 {
     char *this_opt;
-    int temp;
 
     fb_info.fontname[0] = '\0';
 
@@ -430,7 +423,7 @@
 	if(err<0)
 	{
 		mac_boom(6);
-		return NULL;
+		return mem_start;
 	}
 
 	macfb_get_var(&disp.var, -1, &fb_info);
diff -u --recursive --new-file v2.1.106/linux/drivers/video/mdafb.c linux/drivers/video/mdafb.c
--- v2.1.106/linux/drivers/video/mdafb.c	Wed Dec 31 16:00:00 1969
+++ linux/drivers/video/mdafb.c	Wed Jun 24 14:44:02 1998
@@ -0,0 +1,485 @@
+/*
+ *  linux/drivers/video/mdafb.c -- MDA frame buffer device
+ *
+ *	Adapted from vgafb, May 1998 by Andrew Apted
+ *
+ *  This file is based on vgacon.c and vgafb.c.  Read about their
+ *  contributors there.
+ *
+ *  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 for
+ *  more details.
+ */
+
+
+/* KNOWN PROBLEMS/TO DO ==================================================== *
+ *
+ *	-  detecting amount of memory is not yet implemented
+ *
+ * ========================================================================= */
+
+
+#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 <linux/fb.h>
+#include <linux/ioport.h>
+#include <linux/init.h>
+#include <linux/console.h>
+#include <linux/selection.h>
+
+#include <asm/io.h>
+#include <asm/uaccess.h>
+
+#include "fbcon.h"
+#include "fbcon-vga.h"
+
+
+#ifdef __powerpc__
+#define VGA_OFFSET _ISA_MEM_BASE;
+#else
+#define VGA_OFFSET 0x0
+#endif
+
+
+static int mda_font_height = 16;   /* !!! */
+
+
+static int currcon = 0;
+static struct display disp;
+static struct fb_info fb_info;
+
+static struct fb_fix_screeninfo fb_fix = { { 0, } };
+static struct fb_var_screeninfo fb_var = { 0, };
+
+
+/* Description of the hardware situation */
+static unsigned char mda_video_type;
+static unsigned long mda_video_mem_base;	/* Base of video memory */
+static unsigned long mda_video_mem_len;		/* End of video memory */
+static u16 mda_video_port_reg;			/* Video register select port */
+static u16 mda_video_port_val;			/* Video register value port */
+static unsigned long mda_video_num_columns;	/* Number of text columns */
+static unsigned long mda_video_num_lines;	/* Number of text lines */
+
+
+    /*
+     *  MDA screen access
+     */ 
+
+static inline void mda_writew(u16 val, u16 *addr)
+{
+#ifdef __powerpc__
+	st_le16(addr, val);
+#else
+	writew(val, (unsigned long)addr);
+#endif /* !__powerpc__ */
+}
+
+static inline u16 mda_readw(u16 *addr)
+{
+#ifdef __powerpc__
+	return ld_le16(addr);
+#else
+	return readw((unsigned long)addr);
+#endif /* !__powerpc__ */	
+}
+
+
+static inline void write_mda(unsigned char reg, unsigned int val)
+{
+	unsigned long flags;
+
+	save_flags(flags); cli();
+
+	outb(reg, mda_video_port_reg);
+	outb(val >> 8, mda_video_port_val);
+	outb(reg+1, mda_video_port_reg);
+	outb(val & 0xff, mda_video_port_val);
+
+	restore_flags(flags);
+}
+
+static inline void mda_set_origin(unsigned short offset)
+{
+	write_mda(12, offset);
+}
+
+    /*
+     *  Move hardware mda cursor
+     */
+    
+static int mda_write_cursor (int location) 
+{
+	write_mda(14, location >> 1);
+	return 0;
+}
+
+
+void fbcon_mdafb_cursor(struct display *p, int mode, int x, int y)
+{
+	switch (mode) {
+		case CM_ERASE:
+			mda_write_cursor(mda_video_mem_len - 1);
+			break;
+
+		case CM_MOVE:
+		case CM_DRAW:
+			mda_write_cursor(y*p->next_line + (x << 1));
+			break;
+	}
+}
+
+
+    /*
+     *  Interface to the low level console driver
+     */
+
+void mdafb_setup(char *options, int *ints);
+static int mdafbcon_switch(int con, struct fb_info *info);
+static int mdafbcon_updatevar(int con, struct fb_info *info);
+static void mdafbcon_blank(int blank, struct fb_info *info);
+
+
+    /*
+     *  Open/Release the frame buffer device
+     */
+
+static int mdafb_open(struct fb_info *info)
+{
+	MOD_INC_USE_COUNT;
+	return 0;
+}
+
+static int mdafb_release(struct fb_info *info)
+{
+	MOD_DEC_USE_COUNT;
+	return 0;
+}
+
+
+    /*
+     *  Get the Fixed Part of the Display
+     */
+
+static int mdafb_get_fix(struct fb_fix_screeninfo *fix, int con,
+			 struct fb_info *info)
+{
+	memcpy(fix, &fb_fix, sizeof(fb_fix));
+	return 0;
+}
+
+
+    /*
+     *  Get the User Defined Part of the Display
+     */
+
+static int mdafb_get_var(struct fb_var_screeninfo *var, int con,
+			 struct fb_info *info)
+{
+	memcpy(var, &fb_var, sizeof(fb_var));
+	return 0;
+}
+
+
+    /*
+     *  Set the User Defined Part of the Display
+     */
+
+static int mdafb_set_var(struct fb_var_screeninfo *var, int con,
+			 struct fb_info *info)
+{
+    struct display *display;
+
+    if (con >= 0)
+	display = &fb_display[con];
+    else
+	display = &disp;	/* used during initialization */
+
+    if (var->xres > fb_var.xres || var->yres > fb_var.yres ||
+	var->xres_virtual > fb_var.xres_virtual ||
+	var->yres_virtual > fb_var.yres_virtual ||
+	var->bits_per_pixel > fb_var.bits_per_pixel ||
+	var->nonstd || !(var->accel_flags & FB_ACCELF_TEXT) ||
+	(var->vmode & FB_VMODE_MASK) != FB_VMODE_NONINTERLACED)
+	return -EINVAL;
+
+    memcpy(var, &fb_var, sizeof(fb_var));
+
+    if ((var->activate & FB_ACTIVATE_MASK) == FB_ACTIVATE_NOW) {
+	display->var = *var;
+	mda_set_origin(var->yoffset/mda_font_height*fb_fix.line_length/2);
+    }
+
+    return 0;
+}
+
+
+    /*
+     *  Pan or Wrap the Display
+     *
+     *  This call looks only at xoffset, yoffset and the FB_VMODE_YWRAP flag
+     */
+
+static int mdafb_pan_display(struct fb_var_screeninfo *var, int con,
+			     struct fb_info *info)
+{
+	if (var->xoffset || var->yoffset+var->yres > var->yres_virtual)
+		return -EINVAL;
+
+	mda_set_origin(var->yoffset/mda_font_height*fb_fix.line_length/2);
+	return 0;
+}
+
+
+    /*
+     *  Get the Colormap
+     */
+
+static int mdafb_get_cmap(struct fb_cmap *cmap, int kspc, int con,
+			  struct fb_info *info)
+{
+	/* MDA is simply black and white */
+
+	return 0;
+}
+
+
+    /*
+     *  Set the Colormap
+     */
+
+static int mdafb_set_cmap(struct fb_cmap *cmap, int kspc, int con,
+			  struct fb_info *info)
+{
+	/* MDA is simply black and white */
+
+	return 0;
+}
+
+
+static int mdafb_ioctl(struct inode *inode, struct file *file, u_int cmd,
+		       u_long arg, int con, struct fb_info *info)
+{
+	return -EINVAL;
+}
+
+    /*
+     *  Interface used by the world
+     */
+
+static struct fb_ops mdafb_ops = {
+	mdafb_open, mdafb_release, mdafb_get_fix, mdafb_get_var,
+	mdafb_set_var, mdafb_get_cmap, mdafb_set_cmap, mdafb_pan_display, 
+	mdafb_ioctl
+};
+
+    /*
+     *  MDA text console with hardware cursor
+     */
+
+static struct display_switch fbcon_mdafb = {
+    fbcon_vga_setup, fbcon_vga_bmove, fbcon_vga_clear, fbcon_vga_putc,
+    fbcon_vga_putcs, fbcon_vga_revc, fbcon_mdafb_cursor
+};
+
+
+    /*
+     *  Initialisation
+     */
+
+__initfunc(unsigned long mdafb_init(unsigned long mem_start))
+{
+    int err;
+    u16 saved;
+    u16 *p;
+
+    mda_video_num_lines = 25;
+    mda_video_num_columns = 80;
+    mda_video_type = VIDEO_TYPE_MDA;
+    mda_video_mem_base = 0xb0000 + VGA_OFFSET;
+    mda_video_mem_len  = 0x01000;
+    mda_video_port_reg = 0x3b4;
+    mda_video_port_val = 0x3b5;
+
+    strcpy(fb_fix.id, "MDA-Dual-Head");
+    request_region(0x3b0, 12, "mda-2");
+    request_region(0x3bf, 1, "mda-2");
+
+    /*
+     *	Find out if there is a graphics card present.
+     *	Are there smarter methods around?
+     */
+    p = (u16 *)mda_video_mem_base;
+    saved = mda_readw(p);
+    mda_writew(0xAA55, p);
+    if (mda_readw(p) != 0xAA55) {
+	mda_writew(saved, p);
+	return mem_start;
+    }
+    mda_writew(0x55AA, p);
+    if (mda_readw(p) != 0x55AA) {
+	mda_writew(saved, p);
+	return mem_start;
+    }
+    mda_writew(saved, p);
+
+    fb_fix.smem_start = (char *) mda_video_mem_base;
+    fb_fix.smem_len = mda_video_mem_len;
+    fb_fix.type = FB_TYPE_VGA_TEXT;
+    fb_fix.type_aux = 0;
+    fb_fix.visual = FB_VISUAL_PSEUDOCOLOR;
+    fb_fix.ypanstep = mda_font_height;
+    fb_fix.xpanstep = 0;
+    fb_fix.ywrapstep = 0;
+    fb_fix.line_length = 2 * mda_video_num_columns;
+    fb_fix.mmio_start = NULL;
+    fb_fix.mmio_len = 0;
+    fb_fix.accel = FB_ACCEL_NONE;
+
+    fb_var.xres = mda_video_num_columns*8;
+    fb_var.yres = mda_video_num_lines * mda_font_height;
+    fb_var.xres_virtual = fb_var.xres;
+    /* the cursor is put at the end of the video memory, hence the -2 */
+    fb_var.yres_virtual = ((fb_fix.smem_len-2)/fb_fix.line_length)*
+			  mda_font_height;
+
+    fb_var.xoffset = fb_var.yoffset = 0;
+    fb_var.bits_per_pixel = 1;
+    fb_var.grayscale = 1;
+    fb_var.red.offset = 0;
+    fb_var.red.length = 0;
+    fb_var.red.msb_right = 0;
+    fb_var.green.offset = 0;
+    fb_var.green.length = 0;
+    fb_var.green.msb_right = 0;
+    fb_var.blue.offset = 0;
+    fb_var.blue.length = 0;
+    fb_var.blue.msb_right = 0;
+    fb_var.transp.offset = 0;
+    fb_var.transp.length = 0;
+    fb_var.transp.msb_right = 0;
+    fb_var.nonstd = 0;
+    fb_var.activate = 0;
+    fb_var.height = fb_var.width = -1;
+    fb_var.accel_flags = FB_ACCELF_TEXT;
+    fb_var.pixclock = 39722;		/* 25.175 MHz */
+    fb_var.left_margin = 40;
+    fb_var.right_margin = 24;
+    fb_var.upper_margin = 39;
+    fb_var.lower_margin = 9;
+    fb_var.hsync_len = 96;
+    fb_var.vsync_len = 2;
+    fb_var.sync = 0;
+    fb_var.vmode = FB_VMODE_NONINTERLACED;
+
+    disp.var = fb_var;
+    disp.cmap.start = 0;
+    disp.cmap.len = 0;
+    disp.cmap.red = NULL;
+    disp.cmap.green = NULL;
+    disp.cmap.blue = NULL;
+    disp.cmap.transp = NULL;
+
+#ifdef __i386__
+    disp.screen_base = ioremap((unsigned long) fb_fix.smem_start, 
+    				fb_fix.smem_len);
+#else
+    disp.screen_base = bus_to_virt((unsigned long) fb_fix.smem_start);
+#endif
+    disp.visual = fb_fix.visual;
+    disp.type = fb_fix.type;
+    disp.type_aux = fb_fix.type_aux;
+    disp.ypanstep = fb_fix.ypanstep;
+    disp.ywrapstep = fb_fix.ywrapstep;
+    disp.line_length = fb_fix.line_length;
+    disp.can_soft_blank = 1;
+    disp.inverse = 0;
+    disp.dispsw = &fbcon_mdafb;
+
+    strcpy(fb_info.modename, fb_fix.id);
+    fb_info.node = -1;
+    fb_info.fbops = &mdafb_ops;
+    fb_info.disp = &disp;
+    fb_info.fontname[0] = '\0';
+    fb_info.changevar = NULL;
+    fb_info.switch_con = &mdafbcon_switch;
+    fb_info.updatevar = &mdafbcon_updatevar;
+    fb_info.blank = &mdafbcon_blank;
+
+    err = register_framebuffer(&fb_info);
+
+    if (err < 0)
+	return mem_start;
+
+    mdafb_set_var(&fb_var, -1, &fb_info);
+
+    printk("fb%d: MDA frame buffer device, using %dK of video memory\n",
+	   GET_FB_IDX(fb_info.node), fb_fix.smem_len>>10);
+
+    return mem_start;
+}
+
+__initfunc(void mdafb_setup(char *options, int *ints))
+{
+	/* nothing yet */
+}
+
+    /*
+     *  Update the `var' structure (called by fbcon.c)
+     */
+
+static int mdafbcon_updatevar(int con, struct fb_info *info)
+{
+	if (con == currcon) {
+		struct fb_var_screeninfo *var = &fb_display[currcon].var;
+
+		/* hardware scrolling */
+
+		mda_set_origin(var->yoffset / mda_font_height *
+			fb_fix.line_length / 2);
+	}
+
+	return 0;
+}
+
+static int mdafbcon_switch(int con, struct fb_info *info)
+{
+	currcon = con;
+	mdafbcon_updatevar(con, info);
+	return 0;
+}
+
+    /*
+     *  Blank the display.
+     */
+
+static void mdafbcon_blank(int blank, struct fb_info *info)
+{
+	if (blank) {
+		outb_p(0x00, 0x3b8);  /* disable video */
+	} else {
+		outb_p(0x08, 0x3b8);  /* enable video */
+	}
+}
+
+
+#ifdef MODULE
+int init_module(void)
+{
+	mdafb_init();
+	return 0;
+}
+
+void cleanup_module(void)
+{
+	unregister_framebuffer(&fb_info);
+}
+#endif /* MODULE */
diff -u --recursive --new-file v2.1.106/linux/drivers/video/offb.c linux/drivers/video/offb.c
--- v2.1.106/linux/drivers/video/offb.c	Thu Mar 26 15:57:04 1998
+++ linux/drivers/video/offb.c	Wed Jun 24 14:44:02 1998
@@ -27,7 +27,7 @@
 #include <linux/selection.h>
 #include <linux/init.h>
 #ifdef CONFIG_FB_COMPAT_XPMAC
-#include <linux/vc_ioctl.h>
+#include <asm/vc_ioctl.h>
 #endif
 #include <asm/io.h>
 #include <asm/prom.h>
@@ -47,8 +47,6 @@
     volatile unsigned char *cmap_data;
 };
 
-static struct fb_info_offb fb_info[FB_MAX];
-
 #ifdef __powerpc__
 #define mach_eieio()	eieio()
 #else
@@ -85,6 +83,7 @@
 #ifdef CONFIG_FB_COMPAT_XPMAC
 int console_getmode(struct vc_mode *);
 int console_setmode(struct vc_mode *, int);
+int console_setcmap(int, unsigned char *, unsigned char *, unsigned char *);
 int console_powermode(int);
 struct fb_info *console_fb_info = NULL;
 int (*console_setmode_ptr)(struct vc_mode *, int) = NULL;
@@ -116,7 +115,7 @@
 
 static struct fb_ops offb_ops = {
     offb_open, offb_release, offb_get_fix, offb_get_var, offb_set_var,
-    offb_get_cmap, offb_set_cmap, offb_pan_display, NULL, offb_ioctl
+    offb_get_cmap, offb_set_cmap, offb_pan_display, offb_ioctl
 };
 
 
@@ -282,9 +281,12 @@
 static const char *aty_names[] = {
     "ATY,mach64", "ATY,XCLAIM", "ATY,264VT", "ATY,mach64ii", "ATY,264GT-B", 
     "ATY,mach64_3D_pcc", "ATY,XCLAIM3D", "ATY,XCLAIMVR", "ATY,RAGEII_M",
-    "ATY,XCLAIMVRPro", "ATY,mach64_3DU"
+    "ATY,XCLAIMVRPro", "ATY,mach64_3DU", "ATY,XCLAIM3DPro"
 };
 #endif /* CONFIG_FB_ATY */
+#ifdef CONFIG_FB_S3TRIO
+extern void s3triofb_init_of(unsigned long mem_start, struct device_node *dp);
+#endif /* CONFIG_FB_S3TRIO */
 
 
     /*
@@ -305,11 +307,6 @@
 	if (!(dp = find_path_device(prom_display_paths[dpy])))
 	    continue;
 
-	info = &fb_info[dpy];
-	fix = &info->fix;
-	var = &info->var;
-	disp = &info->disp;
-
 	if (!ofonly) {
 #ifdef CONFIG_FB_ATY
 	    for (i = 0; i < sizeof(aty_names)/sizeof(*aty_names); i++)
@@ -320,8 +317,17 @@
 		continue;
 	    }
 #endif /* CONFIG_FB_ATY */
+#ifdef CONFIG_FB_S3TRIO
+            if (s3triofb_init_of(dp))
+                continue;
+#endif /* CONFIG_FB_S3TRIO */
 	}
 
+	info = kmalloc(sizeof(struct fb_info_offb), GFP_ATOMIC);
+	fix = &info->fix;
+	var = &info->var;
+	disp = &info->disp;
+
 	strcpy(fix->id, "OFfb ");
 	strncat(fix->id, dp->name, sizeof(fix->id));
 	fix->id[sizeof(fix->id)-1] = '\0';
@@ -329,6 +335,7 @@
 	if ((pp = (int *)get_property(dp, "depth", &len)) != NULL
 	    && len == sizeof(int) && *pp != 8) {
 	    printk("%s: can't use depth = %d\n", dp->full_name, *pp);
+	    kfree(info);
 	    continue;
 	}
 	if ((pp = (int *)get_property(dp, "width", &len)) != NULL
@@ -352,11 +359,12 @@
 		    break;
 	    if (i >= dp->n_addrs) {
 		printk("no framebuffer address found for %s\n", dp->full_name);
+		kfree(info);
 		continue;
 	    }
 	    address = (u_long)dp->addrs[i].address;
 	}
-	fix->smem_start = ioremap(address, fix->smem_len);
+	fix->smem_start = (char *)address;
 	fix->type = FB_TYPE_PACKED_PIXELS;
 	fix->type_aux = 0;
 
@@ -379,7 +387,6 @@
 	var->nonstd = 0;
 	var->activate = 0;
 	var->height = var->width = -1;
-	var->accel = FB_ACCEL_NONE;
 	var->pixclock = 10000;
 	var->left_margin = var->right_margin = 16;
 	var->upper_margin = var->lower_margin = 16;
@@ -390,8 +397,11 @@
 	disp->var = *var;
 	disp->cmap.start = 0;
 	disp->cmap.len = 0;
-	disp->cmap.red = disp->cmap.green = disp->cmap.blue = disp->cmap.transp = NULL;
-	disp->screen_base = fix->smem_start;
+	disp->cmap.red = NULL;
+	disp->cmap.green = NULL;
+	disp->cmap.blue = NULL;
+	disp->cmap.transp = NULL;
+	disp->screen_base = ioremap(address, fix->smem_len);
 	disp->visual = fix->visual;
 	disp->type = fix->type;
 	disp->type_aux = fix->type_aux;
@@ -419,8 +429,10 @@
 	info->info.blank = &offbcon_blank;
 
 	err = register_framebuffer(&info->info);
-	if (err < 0)
-	    continue;
+	if (err < 0) {
+	    kfree(info);
+	    return mem_start;
+	}
 
 	for (i = 0; i < 16; i++) {
 	    int j = color_table[i];
@@ -441,15 +453,15 @@
 	    display_info.pitch = fix->line_length;
 	    display_info.mode = 0;
 	    strncpy(display_info.name, dp->name, sizeof(display_info.name));
-	    display_info.fb_address = iopa((unsigned long)fix->smem_start);
+	    display_info.fb_address = address;
 	    display_info.cmap_adr_address = 0;
 	    display_info.cmap_data_address = 0;
 	    display_info.disp_reg_address = 0;
 	    /* XXX kludge for ati */
 	    if (strncmp(dp->name, "ATY,", 4) == 0) {
-		    display_info.disp_reg_address = iopa(address + 0x7ffc00);
-		    display_info.cmap_adr_address = iopa(address + 0x7ffcc0);
-		    display_info.cmap_data_address = iopa(address + 0x7ffcc1);
+		    display_info.disp_reg_address = address + 0x7ffc00;
+		    display_info.cmap_adr_address = address + 0x7ffcc0;
+		    display_info.cmap_data_address = address + 0x7ffcc1;
 	    }
 	    console_fb_info = &info->info;
 	    console_set_cmap_ptr = offb_set_cmap;
@@ -593,6 +605,7 @@
      *    - console_setmode() should fill in a struct fb_var_screeninfo (using
      *	    the MacOS video mode database) and simply call a decode_var()
      *	    function, so console_setmode_ptr is no longer needed.
+     *	    console_getmode() should convert in the other direction.
      *
      *    - instead of using the console_* stuff (filled in by the frame
      *      buffer), we should use the correct struct fb_info for the
diff -u --recursive --new-file v2.1.106/linux/drivers/video/retz3fb.c linux/drivers/video/retz3fb.c
--- v2.1.106/linux/drivers/video/retz3fb.c	Thu Mar 26 15:57:04 1998
+++ linux/drivers/video/retz3fb.c	Wed Jun 24 14:44:02 1998
@@ -81,6 +81,8 @@
 	int hsync_len;	/* length of horizontal sync	*/
 	int vsync_len;	/* length of vertical sync	*/
 	int vmode;
+
+	int accel;
 };
 
 struct display_data {
@@ -196,7 +198,7 @@
 	"640x480", {		/* 640x480, 8 bpp */
 	    640, 480, 640, 480, 0, 0, 8, 0,
 	    {0, 8, 0}, {0, 8, 0}, {0, 8, 0}, {0, 0, 0},
-	    0, 0, -1, -1, FB_ACCEL_NCR77C32BLT, 38461, 28, 32, 12, 10, 96, 2,
+	    0, 0, -1, -1, FB_ACCELF_TEXT, 38461, 28, 32, 12, 10, 96, 2,
 	    FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED
 	}
     },
@@ -208,7 +210,7 @@
 	"800x600", {		/* 800x600, 8 bpp */
 	    800, 600, 800, 600, 0, 0, 8, 0,
 	    {0, 8, 0}, {0, 8, 0}, {0, 8, 0}, {0, 0, 0},
-	    0, 0, -1, -1, FB_ACCEL_NCR77C32BLT, 27778, 64, 24, 22, 1, 120, 2,
+	    0, 0, -1, -1, FB_ACCELF_TEXT, 27778, 64, 24, 22, 1, 120, 2,
 	    FB_SYNC_COMP_HIGH_ACT|FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED
 	}
     },
@@ -220,21 +222,21 @@
 	"1024x768i", {		/* 1024x768, 8 bpp, interlaced */
 	    1024, 768, 1024, 768, 0, 0, 8, 0,
 	    {0, 8, 0}, {0, 8, 0}, {0, 8, 0}, {0, 0, 0},
-	    0, 0, -1, -1, FB_ACCEL_NCR77C32BLT, 22222, 40, 40, 32, 9, 160, 8,
+	    0, 0, -1, -1, FB_ACCELF_TEXT, 22222, 40, 40, 32, 9, 160, 8,
 	    FB_SYNC_COMP_HIGH_ACT|FB_SYNC_VERT_HIGH_ACT, FB_VMODE_INTERLACED
 	}
     }, {
 	"640x480-16", {		/* 640x480, 16 bpp */
 	    640, 480, 640, 480, 0, 0, 16, 0,
 	    {11, 5, 0}, {5, 6, 0}, {0, 5, 0}, {0, 0, 0},
-	    0, 0, -1, -1, FB_ACCEL_NCR77C32BLT, 38461/2, 28, 32, 12, 10, 96, 2,
+	    0, 0, -1, -1, 0, 38461/2, 28, 32, 12, 10, 96, 2,
 	    FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED
 	}
     }, {
 	"640x480-24", {		/* 640x480, 24 bpp */
 	    640, 480, 640, 480, 0, 0, 24, 0,
 	    {8, 8, 8}, {8, 8, 8}, {8, 8, 8}, {0, 0, 0},
-	    0, 0, -1, -1, FB_ACCEL_NCR77C32BLT, 38461/3, 28, 32, 12, 10, 96, 2,
+	    0, 0, -1, -1, 0, 38461/3, 28, 32, 12, 10, 96, 2,
 	    FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED
 	}
     },
@@ -834,12 +836,11 @@
 static int retz3_encode_fix(struct fb_fix_screeninfo *fix,
 			    struct retz3fb_par *par)
 {
-	short i;
-
+	memset(fix, 0, sizeof(struct fb_fix_screeninfo));
 	strcpy(fix->id, retz3fb_name);
 	fix->smem_start = (char *)z3_fbmem;
 	fix->smem_len = z3_size;
-	fix->mmio_start = (unsigned char *)z3_regs;
+	fix->mmio_start = (char *)z3_regs;
 	fix->mmio_len = 0x00c00000;
 
 	fix->type = FB_TYPE_PACKED_PIXELS;
@@ -854,10 +855,7 @@
 	fix->ywrapstep = 0;
 	fix->line_length = 0;
 
-	fix->accel = FB_ACCEL_NCR77C32BLT;
-
-	for (i = 0; i < arraysize(fix->reserved); i++)
-		fix->reserved[i] = 0;
+	fix->accel = FB_ACCEL_NCR_77C32BLT;
 
 	return 0;
 }
@@ -891,6 +889,11 @@
 	par->hsync_len = var->hsync_len;
 	par->vsync_len = var->vsync_len;
 
+	if (var->accel_flags & FB_ACCELF_TEXT)
+	    par->accel = FB_ACCELF_TEXT;
+	else
+	    par->accel = 0;
+
 	return 0;
 }
 
@@ -903,8 +906,7 @@
 static int retz3_encode_var(struct fb_var_screeninfo *var,
 			    struct retz3fb_par *par)
 {
-	short i;
-
+	memset(var, 0, sizeof(struct fb_var_screeninfo));
 	var->xres = par->xres;
 	var->yres = par->yres;
 	var->xres_virtual = par->xres_vir;
@@ -926,7 +928,7 @@
 	var->height = -1;
 	var->width = -1;
 
-	var->accel = FB_ACCEL_NCR77C32BLT;
+	var->accel_flags = (par->accel && par->bpp == 8) ? FB_ACCELF_TEXT : 0;
 
 	var->pixclock = par->pixclock;
 
@@ -938,9 +940,6 @@
 	var->hsync_len = par->hsync_len;
 	var->vsync_len = par->vsync_len;
 
-	for (i = 0; i < arraysize(var->reserved); i++)
-		var->reserved[i] = 0;
-
 	var->vmode = par->vmode;
 	return 0;
 }
@@ -1272,7 +1271,7 @@
 	if (con == -1)
 		con = 0;
 
-	display->screen_base = (unsigned char *)fix.smem_start;
+	display->screen_base = fix.smem_start;
 	display->visual = fix.visual;
 	display->type = fix.type;
 	display->type_aux = fix.type_aux;
@@ -1283,7 +1282,11 @@
 	switch (display->var.bits_per_pixel) {
 #ifdef CONFIG_FBCON_CFB8
 	case 8:
-		display->dispsw = &fbcon_retz3_8;
+		if (display->var.accel_flags & FB_ACCELF_TEXT) {
+		    display->dispsw = &fbcon_retz3_8;
+#warning FIXME: We should reinit the graphics engine here
+		} else
+		    display->dispsw = &fbcon_cfb8;
 		break;
 #endif
 #ifdef CONFIG_FBCON_CFB16
@@ -1305,7 +1308,7 @@
 static int retz3fb_set_var(struct fb_var_screeninfo *var, int con,
 			   struct fb_info *info)
 {
-	int err, oldxres, oldyres, oldvxres, oldvyres, oldbpp;
+	int err, oldxres, oldyres, oldvxres, oldvyres, oldbpp, oldaccel;
 	struct display *display;
 
 	if (con >= 0)
@@ -1326,12 +1329,14 @@
 		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) {
+		    oldbpp != var->bits_per_pixel ||
+		    oldaccel != var->accel_flags) {
 
 			struct fb_fix_screeninfo fix;
 			retz3fb_get_fix(&fix, con, info);
@@ -1348,7 +1353,11 @@
 			switch (display->var.bits_per_pixel) {
 #ifdef CONFIG_FBCON_CFB8
 			case 8:
-				display->dispsw = &fbcon_retz3_8;
+				if (var->accel_flags & FB_ACCELF_TEXT) {
+					display->dispsw = &fbcon_retz3_8;
+#warning FIXME: We should reinit the graphics engine here
+				} else
+					display->dispsw = &fbcon_cfb8;
 				break;
 #endif
 #ifdef CONFIG_FBCON_CFB16
@@ -1448,7 +1457,7 @@
 static struct fb_ops retz3fb_ops = {
 	retz3fb_open, retz3fb_release, retz3fb_get_fix, retz3fb_get_var,
 	retz3fb_set_var, retz3fb_get_cmap, retz3fb_set_cmap,
-	retz3fb_pan_display, NULL, retz3fb_ioctl
+	retz3fb_pan_display, retz3fb_ioctl
 };
 
 
diff -u --recursive --new-file v2.1.106/linux/drivers/video/skeletonfb.c linux/drivers/video/skeletonfb.c
--- v2.1.106/linux/drivers/video/skeletonfb.c	Sun Jun  7 11:16:35 1998
+++ linux/drivers/video/skeletonfb.c	Wed Jun 24 14:44:02 1998
@@ -298,7 +298,7 @@
     fbgen_do_set_var(var, 1, &fbinfo.gen);
     err = register_framebuffer(&fb_info.gen.info);
     if (err < 0)
-	return err;
+	return mem_start;
     fbgen_set_disp(-1, &fb_info.gen.info);
     fbgen_install_cmap(0, &fb_info.gen);
     printk("fb%d: %s frame buffer device\n", GET_FB_IDX(fb_info.node),
@@ -365,7 +365,7 @@
 
 static struct fb_ops xxxfb_ops = {
     xxxfb_open, xxxfb_release, fbgen_get_fix, fbgen_get_var, fbgen_set_var,
-    fbgen_get_cmap, fbgen_set_cmap, fbgen_pan_display, NULL, fbgen_ioctl
+    fbgen_get_cmap, fbgen_set_cmap, fbgen_pan_display, fbgen_ioctl
 };
 
 
diff -u --recursive --new-file v2.1.106/linux/drivers/video/tgafb.c linux/drivers/video/tgafb.c
--- v2.1.106/linux/drivers/video/tgafb.c	Thu Mar 26 15:57:04 1998
+++ linux/drivers/video/tgafb.c	Wed Jun 24 14:44:02 1998
@@ -296,7 +296,7 @@
 
 static struct fb_ops tgafb_ops = {
     tgafb_open, tgafb_release, tgafb_get_fix, tgafb_get_var, tgafb_set_var,
-    tgafb_get_cmap, tgafb_set_cmap, tgafb_pan_display, NULL, tgafb_ioctl
+    tgafb_get_cmap, tgafb_set_cmap, tgafb_pan_display, tgafb_ioctl
 };
 
 
@@ -689,12 +689,13 @@
     fb_var.xres = fb_var.xres_virtual = 640;
     fb_var.yres = fb_var.yres_virtual = 480;
     fb_fix.line_length = 80*fb_var.bits_per_pixel;
-    fb_fix.smem_start = (char *)(tga_fb_base + LCA_DENSE_MEM);
+    fb_fix.smem_start = (char *)__pa(tga_fb_base + LCA_DENSE_MEM);
     fb_fix.smem_len = fb_fix.line_length*fb_var.yres;
     fb_fix.type = FB_TYPE_PACKED_PIXELS;
     fb_fix.type_aux = 0;
-    fb_fix.mmio_start = (unsigned char *)tga_regs_base;
+    fb_fix.mmio_start = (char *)__pa(tga_regs_base);
     fb_fix.mmio_len = 0x1000;		/* Is this sufficient? */
+    fb_fix.accel = FB_ACCEL_DEC_TGA;
 
     fb_var.xoffset = fb_var.yoffset = 0;
     fb_var.grayscale = 0;
@@ -714,7 +715,7 @@
     fb_var.nonstd = 0;
     fb_var.activate = 0;
     fb_var.height = fb_var.width = -1;
-    fb_var.accel = FB_ACCEL_TGA;
+    fb_var.accel_flags = 0;
     fb_var.pixclock = 39722;
     fb_var.left_margin = 40;
     fb_var.right_margin = 24;
@@ -729,7 +730,7 @@
     disp.cmap.start = 0;
     disp.cmap.len = 0;
     disp.cmap.red = disp.cmap.green = disp.cmap.blue = disp.cmap.transp = NULL;
-    disp.screen_base = fb_fix.smem_start;
+    disp.screen_base = (char *)tga_fb_base + LCA_DENSE_MEM;
     disp.visual = fb_fix.visual;
     disp.type = fb_fix.type;
     disp.type_aux = fb_fix.type_aux;
diff -u --recursive --new-file v2.1.106/linux/drivers/video/txtcon.c linux/drivers/video/txtcon.c
--- v2.1.106/linux/drivers/video/txtcon.c	Thu Mar 26 15:57:04 1998
+++ linux/drivers/video/txtcon.c	Wed Jun 24 14:44:02 1998
@@ -18,6 +18,7 @@
 #include <linux/types.h>
 #include <linux/kdev_t.h>
 #include <linux/console.h>
+#include <linux/init.h>
 
 
     /*
@@ -43,8 +44,7 @@
 static int txtcon_get_font(struct vc_data *conp, int *w, int *h, char *data);
 static int txtcon_set_font(struct vc_data *conp, int w, int h, char *data);
 static int txtcon_set_palette(struct vc_data *conp, unsigned char *table);
-static int txtcon_scrolldelta(int lines);
-static int txtcon_set_mode(struct vc_data *conp, int mode);
+static int txtcon_scrolldelta(struct vc_data *conp, int lines);
 
 
 static unsigned long txtcon_startup(unsigned long kmem_start,
@@ -141,12 +141,7 @@
 }
 
 
-static int txtcon_scrolldelta(int lines)
-{
-    return -ENOSYS;
-}
-
-static int txtcon_set_mode(struct vc_data *conp, int mode)
+static int txtcon_scrolldelta(struct vc_data *conp, int lines)
 {
     return -ENOSYS;
 }
@@ -173,6 +168,5 @@
     txtcon_get_font,
     txtcon_set_font,
     txtcon_set_palette,
-    txtcon_scrolldelta,
-    txtcon_set_mode
+    txtcon_scrolldelta
 };
diff -u --recursive --new-file v2.1.106/linux/drivers/video/vesafb.c linux/drivers/video/vesafb.c
--- v2.1.106/linux/drivers/video/vesafb.c	Wed Dec 31 16:00:00 1969
+++ linux/drivers/video/vesafb.c	Wed Jun 24 14:44:02 1998
@@ -0,0 +1,538 @@
+/*
+ * framebuffer driver for VBE 2.0 compliant graphic boards
+ *
+ * switching to graphics mode happens at boot time (while
+ * running in real mode, see arch/i386/video.S).
+ *
+ * (c) 1998 Gerd Knorr <kraxel@cs.tu-berlin.de>
+ *
+ */ 
+
+#include <linux/config.h>
+#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/delay.h>
+#include <linux/fb.h>
+#include <linux/console.h>
+#include <linux/selection.h>
+#include <linux/ioport.h>
+#include <linux/init.h>
+
+#include <asm/io.h>
+
+#include "fbcon.h"
+#include "fbcon-cfb8.h"
+#include "fbcon-cfb16.h"
+#include "fbcon-cfb32.h"
+
+#define dac_reg	(0x3c8)
+#define dac_val	(0x3c9)
+
+/* --------------------------------------------------------------------- */
+
+/*
+ * card parameters
+ */
+
+/* card */
+char *video_base;
+int   video_size;
+char *video_vbase;        /* mapped */
+
+/* mode */
+int  video_bpp;
+int  video_width;
+int  video_height;
+int  video_type = FB_TYPE_PACKED_PIXELS;
+int  video_visual;
+int  video_linelength;
+int  video_cmap_len;
+
+/* --------------------------------------------------------------------- */
+
+static struct fb_var_screeninfo vesafb_defined = {
+	0,0,0,0,	/* W,H, W, H (virtual) load xres,xres_virtual*/
+	0,0,		/* virtual -> visible no offset */
+	8,		/* depth -> load bits_per_pixel */
+	0,		/* greyscale ? */
+	{0,0,0},	/* R */
+	{0,0,0},	/* G */
+	{0,0,0},	/* B */
+	{0,0,0},	/* transparency */
+	0,		/* standard pixel format */
+	FB_ACTIVATE_NOW,
+	-1,-1,
+	0,
+	0L,0L,0L,0L,0L,
+	0L,0L,0,	/* No sync info */
+	FB_VMODE_NONINTERLACED,
+	{0,0,0,0,0,0}
+};
+
+#define NUM_TOTAL_MODES		1
+#define NUM_PREDEF_MODES	1
+
+static struct display disp;
+static struct fb_info fb_info;
+static struct { u_char red, green, blue, pad; } palette[256];
+
+static int inverse = 0;
+
+struct vesafb_par
+{
+	void *unused;
+};
+
+static int currcon = 0;
+static int current_par_valid = 0;
+struct vesafb_par current_par;
+
+/* --------------------------------------------------------------------- */
+/* speed up scrolling                                                    */
+
+#define USE_REDRAW   1
+#define USE_MEMMOVE  2
+  
+static vesafb_scroll = USE_REDRAW;
+static struct display_switch vesafb_sw;
+
+void vesafb_bmove(struct display *p, int sy, int sx, int dy, int dx,
+		  int height, int width)
+{
+	/*
+	 * this is really faster than memmove (at least with my box)
+	 *    read access to video memory is slow...
+	 */
+	update_screen(currcon);
+}
+
+/* --------------------------------------------------------------------- */
+
+	/*
+	 * Open/Release the frame buffer device
+	 */
+
+static int vesafb_open(struct fb_info *info)
+{
+	/*
+	 * Nothing, only a usage count for the moment
+	 */
+	MOD_INC_USE_COUNT;
+	return(0);
+}
+
+static int vesafb_release(struct fb_info *info)
+{
+	MOD_DEC_USE_COUNT;
+	return(0);
+}
+
+static void vesafb_encode_var(struct fb_var_screeninfo *var, 
+				struct vesafb_par *par)
+{
+	memcpy(var, &vesafb_defined, sizeof(struct fb_var_screeninfo));
+}
+
+static void vesafb_get_par(struct vesafb_par *par)
+{
+	*par=current_par;
+}
+
+static int fb_update_var(int con, struct fb_info *info)
+{
+	return 0;
+}
+
+static int do_fb_set_var(struct fb_var_screeninfo *var, int isactive)
+{
+	struct vesafb_par par;
+	
+	vesafb_get_par(&par);
+	vesafb_encode_var(var, &par);
+	return 0;
+}
+
+static void vesafb_encode_fix(struct fb_fix_screeninfo *fix, 
+				struct vesafb_par *par)
+{
+	memset(fix, 0, sizeof(struct fb_fix_screeninfo));
+	strcpy(fix->id,"VESA VGA");
+
+	fix->smem_start=(char *) video_base;
+	fix->smem_len=video_size;
+	fix->type = video_type;
+	fix->visual = video_visual;
+	fix->xpanstep=0;
+	fix->ypanstep=0;
+	fix->ywrapstep=0;
+	fix->line_length=video_linelength;
+	return;
+}
+
+static int vesafb_get_fix(struct fb_fix_screeninfo *fix, int con,
+			 struct fb_info *info)
+{
+	struct vesafb_par par;
+	vesafb_get_par(&par);
+	vesafb_encode_fix(fix, &par);
+	return 0;
+}
+
+static int vesafb_get_var(struct fb_var_screeninfo *var, int con,
+			 struct fb_info *info)
+{
+	struct vesafb_par par;
+	if(con==-1)
+	{
+		vesafb_get_par(&par);
+		vesafb_encode_var(var, &par);
+	}
+	else
+		*var=fb_display[con].var;
+	return 0;
+}
+
+static void vesafb_set_disp(int con)
+{
+	struct fb_fix_screeninfo fix;
+	struct display *display;
+	
+	if (con >= 0)
+		display = &fb_display[con];
+	else
+		display = &disp;	/* used during initialization */
+
+	vesafb_get_fix(&fix, con, 0);
+
+	display->screen_base = video_vbase;
+	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->next_line = fix.line_length;
+	display->can_soft_blank = 0;
+	display->inverse = inverse;
+
+	switch (video_bpp) {
+#ifdef CONFIG_FBCON_CFB8
+	case 8:
+		display->dispsw = &fbcon_cfb8;
+		break;
+#endif
+#ifdef CONFIG_FBCON_CFB16
+	case 15:
+	case 16:
+		display->dispsw = &fbcon_cfb16;
+		break;
+#endif
+#ifdef CONFIG_FBCON_CFB32
+	case 32:
+		display->dispsw = &fbcon_cfb32;
+		break;
+#endif
+	default:
+		display->dispsw = NULL;
+		break;
+	}
+	if (vesafb_scroll == USE_REDRAW) {
+		memcpy(&vesafb_sw,display->dispsw,sizeof(vesafb_sw));
+		vesafb_sw.bmove = vesafb_bmove;
+		display->dispsw = &vesafb_sw;
+	}
+}
+
+static int vesafb_set_var(struct fb_var_screeninfo *var, int con,
+			 struct fb_info *info)
+{
+	int err;
+	
+	if ((err=do_fb_set_var(var, 1)))
+		return err;
+	return 0;
+}
+
+static int vesa_getcolreg(unsigned regno, unsigned *red, unsigned *green,
+			  unsigned *blue, unsigned *transp,
+			  struct fb_info *fb_info)
+{
+	/*
+	 *  Read a single color register and split it into colors/transparent.
+	 *  Return != 0 for invalid regno.
+	 */
+
+	if (regno >= video_cmap_len)
+		return 1;
+
+	*red   = palette[regno].red;
+	*green = palette[regno].green;
+	*blue  = palette[regno].blue;
+	return 0;
+}
+
+static int vesa_setcolreg(unsigned regno, unsigned red, unsigned green,
+			  unsigned blue, unsigned transp,
+			  struct fb_info *fb_info)
+{
+	/*
+	 *  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.
+	 */
+	
+	if (regno >= video_cmap_len)
+		return 1;
+	
+	palette[regno].red   = red;
+	palette[regno].green = green;
+	palette[regno].blue  = blue;
+	
+	switch (video_bpp) {
+#ifdef CONFIG_FBCON_CFB8
+	case 8:
+		/* Hmm, can we do it _allways_ this way ??? */
+		outb_p(regno, dac_reg);
+		outb_p(red, dac_val);
+		outb_p(green, dac_val);
+		outb_p(blue, dac_val);
+		break;
+#endif
+#ifdef CONFIG_FBCON_CFB16
+	case 15:
+	case 16:
+		fbcon_cfb16_cmap[regno] =
+			(red << vesafb_defined.red.offset) | (green << 5) | blue;
+		break;
+#endif
+#ifdef CONFIG_FBCON_CFB24
+	case 24:
+		/* FIXME: todo */
+		break;
+#endif
+#ifdef CONFIG_FBCON_CFB32
+	case 32:
+		fbcon_cfb32_cmap[regno] =
+			(red   << vesafb_defined.red.offset)   |
+			(green << vesafb_defined.green.offset) |
+			(blue  << vesafb_defined.blue.offset);
+		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, &fb_display[con].var, 1,
+			    vesa_setcolreg, info);
+	else
+		fb_set_cmap(fb_default_cmap(video_cmap_len),
+			    &fb_display[con].var, 1, vesa_setcolreg,
+			    info);
+}
+
+static int vesafb_get_cmap(struct fb_cmap *cmap, int kspc, int con,
+			   struct fb_info *info)
+{
+	if (con == currcon) /* current console? */
+		return fb_get_cmap(cmap, &fb_display[con].var, kspc, vesa_getcolreg, info);
+	else if (fb_display[con].cmap.len) /* non default colormap? */
+		fb_copy_cmap(&fb_display[con].cmap, cmap, kspc ? 0 : 2);
+	else
+		fb_copy_cmap(fb_default_cmap(video_cmap_len),
+		     cmap, kspc ? 0 : 2);
+	return 0;
+}
+
+static int vesafb_set_cmap(struct fb_cmap *cmap, int kspc, int con,
+			   struct fb_info *info)
+{
+	int err;
+
+	if (!fb_display[con].cmap.len) {	/* no colormap allocated? */
+		err = fb_alloc_cmap(&fb_display[con].cmap,video_cmap_len,0);
+		if (err)
+			return err;
+	}
+	if (con == currcon)			/* current console? */
+		return fb_set_cmap(cmap, &fb_display[con].var, kspc, vesa_setcolreg, info);
+	else
+		fb_copy_cmap(cmap, &fb_display[con].cmap, kspc ? 0 : 1);
+	return 0;
+}
+
+static int vesafb_pan_display(struct fb_var_screeninfo *var, int con,
+			     struct fb_info *info)
+{
+	/* no panning */
+	return -EINVAL;
+}
+
+static int vesafb_ioctl(struct inode *inode, struct file *file, 
+		       unsigned int cmd, unsigned long arg, int con,
+		       struct fb_info *info)
+{
+	return -EINVAL;
+}
+
+static struct fb_ops vesafb_ops = {
+	vesafb_open,
+	vesafb_release,
+	vesafb_get_fix,
+	vesafb_get_var,
+	vesafb_set_var,
+	vesafb_get_cmap,
+	vesafb_set_cmap,
+	vesafb_pan_display,
+	vesafb_ioctl
+};
+
+void vesafb_setup(char *options, int *ints)
+{
+	char *this_opt;
+	
+	fb_info.fontname[0] = '\0';
+	
+	if (!options || !*options)
+		return;
+	
+	for(this_opt=strtok(options,","); this_opt; this_opt=strtok(NULL,",")) {
+		if (!*this_opt) continue;
+		
+		printk("vesafb_setup: option %s\n", this_opt);
+		
+		if (! strcmp(this_opt, "inverse"))
+			inverse=1;
+		else if (! strcmp(this_opt, "redraw"))
+			vesafb_scroll = USE_REDRAW;
+		else if (! strcmp(this_opt, "memmove"))
+			vesafb_scroll = USE_MEMMOVE;
+		else if (!strncmp(this_opt, "font:", 5))
+			strcpy(fb_info.fontname, this_opt+5);
+	}
+}
+
+static int vesafb_switch(int con, struct fb_info *info)
+{
+	/* Do we have to save the colormap? */
+	if (fb_display[currcon].cmap.len)
+		fb_get_cmap(&fb_display[currcon].cmap, &fb_display[currcon].var, 1,
+			    vesa_getcolreg, info);
+	
+	currcon = con;
+	/* Install new colormap */
+	do_install_cmap(con, info);
+	fb_update_var(con, info);
+	return 0;
+}
+
+/* 0 unblank, 1 blank, 2 no vsync, 3 no hsync, 4 off */
+
+static void vesafb_blank(int blank, struct fb_info *info)
+{
+	/* Not supported */
+}
+
+__initfunc(unsigned long vesafb_init(unsigned long mem_start))
+{
+	int i,j;
+
+	if (screen_info.orig_video_isVGA != VIDEO_TYPE_VLFB)
+		return mem_start;
+
+	video_base          = (char*)screen_info.lfb_base;
+	video_bpp           = screen_info.lfb_depth;
+	video_width         = screen_info.lfb_width;
+	video_height        = screen_info.lfb_height;
+	video_linelength    = screen_info.lfb_linelength;
+	video_size          = video_linelength * video_height /* screen_info.lfb_size */;
+	video_visual = (video_bpp == 8) ?
+		FB_VISUAL_PSEUDOCOLOR : FB_VISUAL_DIRECTCOLOR;
+        video_vbase = ioremap((unsigned long)video_base, video_size);
+
+	printk("vesafb: %dx%dx%d, linelength=%d\n",
+	       video_width, video_height, video_bpp, video_linelength);
+	printk("vesafb: framebuffer at 0x%p, mapped to 0x%p, size %d\n",
+	       video_base, video_vbase, video_size);
+	if (vesafb_scroll == USE_REDRAW)  printk("vesafb: scrolling=redraw\n");
+	if (vesafb_scroll == USE_MEMMOVE) printk("vesafb: scrolling=memmove\n");
+	 
+	vesafb_defined.xres=video_width;
+	vesafb_defined.yres=video_height;
+	vesafb_defined.xres_virtual=video_width;
+	vesafb_defined.yres_virtual=video_height;
+	vesafb_defined.bits_per_pixel=video_bpp;
+
+	if (video_bpp > 8) {
+		vesafb_defined.red.offset    = screen_info.red_pos;
+		vesafb_defined.red.length    = screen_info.red_size;
+		vesafb_defined.green.offset  = screen_info.green_pos;
+		vesafb_defined.green.length  = screen_info.green_size;
+		vesafb_defined.blue.offset   = screen_info.blue_pos;
+		vesafb_defined.blue.length   = screen_info.blue_size;
+		vesafb_defined.transp.offset = screen_info.rsvd_pos;
+		vesafb_defined.transp.length = screen_info.rsvd_size;
+		printk("vesafb: directcolor: "
+		       "size=%d:%d:%d:%d, shift=%d:%d:%d:%d\n",
+		       screen_info.rsvd_size,
+		       screen_info.red_size,
+		       screen_info.green_size,
+		       screen_info.blue_size,
+		       screen_info.rsvd_pos,
+		       screen_info.red_pos,
+		       screen_info.green_pos,
+		       screen_info.blue_pos);
+		video_cmap_len = 16;
+	} else {
+		vesafb_defined.red.length   = 6;
+		vesafb_defined.green.length = 6;
+		vesafb_defined.blue.length  = 6;
+		for(i = 0; i < 16; i++) {
+			j = color_table[i];
+			palette[i].red   = default_red[j];
+			palette[i].green = default_grn[j];
+			palette[i].blue  = default_blu[j];
+		}
+		video_cmap_len = 256;
+	}
+	request_region(0x3c0, 32, "vga+");
+	
+	strcpy(fb_info.modename, "VESA VGA");
+	fb_info.changevar = NULL;
+	fb_info.node = -1;
+	fb_info.fbops = &vesafb_ops;
+	fb_info.disp=&disp;
+	fb_info.switch_con=&vesafb_switch;
+	fb_info.updatevar=&fb_update_var;
+	fb_info.blank=&vesafb_blank;
+	do_fb_set_var(&vesafb_defined,1);
+
+	if (register_framebuffer(&fb_info)<0)
+		return mem_start;
+
+	vesafb_get_var(&disp.var, -1, &fb_info);
+	vesafb_set_disp(-1);
+
+	printk("fb%d: %s frame buffer device\n",
+	       GET_FB_IDX(fb_info.node), fb_info.modename);
+
+	return mem_start;
+}
+
+/*
+ * Overrides for Emacs so that we follow Linus's tabbing style.
+ * ---------------------------------------------------------------------------
+ * Local variables:
+ * c-basic-offset: 8
+ * End:
+ */
diff -u --recursive --new-file v2.1.106/linux/drivers/video/vfb.c linux/drivers/video/vfb.c
--- v2.1.106/linux/drivers/video/vfb.c	Thu Mar 26 15:57:04 1998
+++ linux/drivers/video/vfb.c	Wed Jun 24 14:44:02 1998
@@ -56,7 +56,7 @@
     /* 640x480, 8 bpp */
     640, 480, 640, 480, 0, 0, 8, 0,
     {0, 8, 0}, {0, 8, 0}, {0, 8, 0}, {0, 0, 0},
-    0, 0, -1, -1, FB_ACCEL_NONE, 20000, 64, 64, 32, 32, 64, 2,
+    0, 0, -1, -1, 0, 20000, 64, 64, 32, 32, 64, 2,
     0, FB_VMODE_NONINTERLACED
 };
 
@@ -114,7 +114,7 @@
 
 static struct fb_ops vfb_ops = {
     vfb_open, vfb_release, vfb_get_fix, vfb_get_var, vfb_set_var, vfb_get_cmap,
-    vfb_set_cmap, vfb_pan_display, NULL, vfb_ioctl
+    vfb_set_cmap, vfb_pan_display, vfb_ioctl
 };
 
 
@@ -250,7 +250,7 @@
 	    struct fb_fix_screeninfo fix;
 
 	    vfb_encode_fix(&fix, var);
-	    display->screen_base = (u_char *)fix.smem_start;
+	    display->screen_base = (char *)videomemory;
 	    display->visual = fix.visual;
 	    display->type = fix.type;
 	    display->type_aux = fix.type_aux;
@@ -501,7 +501,7 @@
 {
     memset(fix, 0, sizeof(struct fb_fix_screeninfo));
     strcpy(fix->id, vfb_name);
-    fix->smem_start = (caddr_t)videomemory;
+    fix->smem_start = (char *)videomemory;
     fix->smem_len = videomemorysize;
     fix->type = FB_TYPE_PACKED_PIXELS;
     fix->type_aux = 0;
diff -u --recursive --new-file v2.1.106/linux/drivers/video/vgacon.c linux/drivers/video/vgacon.c
--- v2.1.106/linux/drivers/video/vgacon.c	Thu Mar 26 15:57:04 1998
+++ linux/drivers/video/vgacon.c	Wed Jun 24 14:44:02 1998
@@ -40,7 +40,7 @@
  *
  *	- speed up scrolling by changing the screen origin
  *
- *	- add support for palette, loadable fonts and VESA blanking
+ *	- add support for loadable fonts and VESA blanking
  *
  * KNOWN PROBLEMS/TO DO ==================================================== */
 
@@ -103,8 +103,7 @@
 static int vgacon_get_font(struct vc_data *conp, int *w, int *h, char *data);
 static int vgacon_set_font(struct vc_data *conp, int w, int h, char *data);
 static int vgacon_set_palette(struct vc_data *conp, unsigned char *table);
-static int vgacon_scrolldelta(int lines);
-static int vgacon_set_mode(struct vc_data *conp, int mode);
+static int vgacon_scrolldelta(struct vc_data *conp, int lines);
 
 
 /*
@@ -117,8 +116,8 @@
 /* Description of the hardware situation */
 static unsigned long   vga_video_mem_base;	/* Base of video memory */
 static unsigned long   vga_video_mem_term;	/* End of video memory */
-static unsigned short  vga_video_port_reg;	/* Video register select port */
-static unsigned short  vga_video_port_val;	/* Video register value port */
+static u16             vga_video_port_reg;	/* Video register select port */
+static u16             vga_video_port_val;	/* Video register value port */
 static unsigned long   vga_video_num_columns;	/* Number of text columns */
 static unsigned long   vga_video_num_lines;	/* Number of text lines */
 static unsigned long   vga_video_size_row;
@@ -138,7 +137,7 @@
      *  VGA screen access
      */ 
 
-static inline void vga_writew(unsigned short val, unsigned short * addr)
+static inline void vga_writew(u16 val, u16 * addr)
 {
 #ifdef __powerpc__
 	st_le16(addr, val);
@@ -147,7 +146,7 @@
 #endif /* !__powerpc__ */
 }
 
-static inline unsigned short vga_readw(unsigned short * addr)
+static inline u16 vga_readw(u16 * addr)
 {
 #ifdef __powerpc__
 	return ld_le16(addr);
@@ -156,9 +155,9 @@
 #endif /* !__powerpc__ */	
 }
 
-static inline void vga_memsetw(void * s, unsigned short c, unsigned int count)
+static inline void vga_memsetw(void * s, u16 c, unsigned int count)
 {
-	unsigned short * addr = (unsigned short *) s;
+	u16 * addr = (u16 *) s;
 
 	while (count) {
 		count--;
@@ -166,8 +165,7 @@
 	}
 }
 
-static inline void vga_memmovew(unsigned short *to, unsigned short *from,
-				unsigned int count)
+static inline void vga_memmovew(u16 *to, u16 *from, unsigned int count)
 {
 	if (to < from) {
 	    while (count) {
@@ -213,8 +211,8 @@
 __initfunc(static unsigned long vgacon_startup(unsigned long kmem_start,
 					       const char **display_desc))
 {
-	unsigned short saved;
-	unsigned short *p;
+	u16 saved;
+	u16 *p;
 
 	vga_video_num_lines = ORIG_VIDEO_LINES;
 	vga_video_num_columns = ORIG_VIDEO_COLS;
@@ -313,7 +311,7 @@
 	 *	Find out if there is a graphics card present.
 	 *	Are there smarter methods around?
 	 */
-	p = (unsigned short *)vga_video_mem_base;
+	p = (u16 *)vga_video_mem_base;
 	saved = vga_readw(p);
 	vga_writew(0xAA55, p);
 	if (vga_readw(p) != 0xAA55) {
@@ -407,7 +405,7 @@
     p = (u16 *)(vga_video_mem_base+ypos*vga_video_size_row+xpos*2);
     sattr = conp->vc_attr << 8;
     while (count--)
-	vga_writew(sattr | *s++, p++);
+	vga_writew(sattr | ((int) (*s++) & 0xff), p++);
 }
 
 
@@ -480,13 +478,12 @@
     if (sx == 0 && dx == 0 && width == vga_video_num_columns) {
 	src = vga_video_mem_base + sy * vga_video_size_row;
 	dst = vga_video_mem_base + dy * vga_video_size_row;
-	vga_memmovew((unsigned short *)dst, (unsigned short *)src,
-		     height * width);
+	vga_memmovew((u16 *)dst, (u16 *)src, height * width);
     } else if (dy < sy || (dy == sy && dx < sx)) {
 	src = vga_video_mem_base + sy * vga_video_size_row + sx * 2;
 	dst = vga_video_mem_base + dy * vga_video_size_row + dx * 2;
 	for (rows = height; rows-- ;) {
-	    vga_memmovew((unsigned short *)dst, (unsigned short *)src, width);
+	    vga_memmovew((u16 *)dst, (u16 *)src, width);
 	    src += vga_video_size_row;
 	    dst += vga_video_size_row;
 	}
@@ -494,7 +491,7 @@
 	src = vga_video_mem_base + (sy+height-1) * vga_video_size_row + sx * 2;
 	dst = vga_video_mem_base + (dy+height-1) * vga_video_size_row + dx * 2;
 	for (rows = height; rows-- ;) {
-	    vga_memmovew((unsigned short *)dst, (unsigned short *)src, width);
+	    vga_memmovew((u16 *)dst, (u16 *)src, width);
 	    src -= vga_video_size_row;
 	    dst -= vga_video_size_row;
 	}
@@ -551,18 +548,12 @@
 	return 0;
 }
 
-static int vgacon_scrolldelta(int lines)
+static int vgacon_scrolldelta(struct vc_data *conp, int lines)
 {
     /* TODO */
     return -ENOSYS;
 }
 
-static int vgacon_set_mode(struct vc_data *conp, int mode)
-{
-    return -ENOSYS;
-}
-
-
 __initfunc(static int vgacon_show_logo( void ))
 {
     int height = 0;
@@ -585,5 +576,5 @@
     vgacon_startup, vgacon_init, vgacon_deinit, vgacon_clear, vgacon_putc,
     vgacon_putcs, vgacon_cursor, vgacon_scroll, vgacon_bmove, vgacon_switch,
     vgacon_blank, vgacon_get_font, vgacon_set_font, vgacon_set_palette,
-    vgacon_scrolldelta, vgacon_set_mode
+    vgacon_scrolldelta
 };
diff -u --recursive --new-file v2.1.106/linux/drivers/video/vgafb.c linux/drivers/video/vgafb.c
--- v2.1.106/linux/drivers/video/vgafb.c	Wed Dec 31 16:00:00 1969
+++ linux/drivers/video/vgafb.c	Wed Jun 24 14:44:02 1998
@@ -0,0 +1,746 @@
+/*
+ *  linux/drivers/video/vgafb.c -- VGA frame buffer device
+ *
+ *	Created 28 Mar 1998 by Geert Uytterhoeven
+ *	Hardware cursor support added on 14 Apr 1998 by Emmanuel Marty
+ *
+ *  This file is heavily based on vgacon.c. Read about its contributors there.
+ *
+ *  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 for
+ *  more details.
+ */
+
+
+
+
+/* KNOWN PROBLEMS/TO DO ===================================================== *
+ *
+ *	- add support for loadable fonts and VESA blanking
+ *
+ *	- for now only VGA _text_ mode is supported
+ *
+ * KNOWN PROBLEMS/TO DO ==================================================== */
+
+
+#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 <linux/fb.h>
+#include <linux/ioport.h>
+#include <linux/init.h>
+#include <linux/selection.h>
+#include <linux/console.h>
+
+#include <asm/io.h>
+#include <asm/uaccess.h>
+
+#include "fbcon.h"
+#include "fbcon-vga.h"
+
+
+#define BLANK 0x0020
+
+#define CAN_LOAD_EGA_FONTS	/* undefine if the user must not do this */
+#define CAN_LOAD_PALETTE	/* undefine if the user must not do this */
+
+#define dac_reg	(0x3c8)
+#define dac_val	(0x3c9)
+
+#ifdef __powerpc__
+#define VGA_OFFSET _ISA_MEM_BASE;
+#else
+#define VGA_OFFSET 0x0
+#endif
+
+
+static int currcon = 0;
+static struct display disp;
+static struct fb_info fb_info;
+static struct { u_char red, green, blue, pad; } palette[16];
+
+static struct fb_fix_screeninfo fb_fix = { { 0, } };
+static struct fb_var_screeninfo fb_var = { 0, };
+
+
+/* Description of the hardware situation */
+static unsigned char vga_video_type;
+static unsigned long vga_video_mem_base;	/* Base of video memory */
+static unsigned long vga_video_mem_term;	/* End of video memory */
+static u16 vga_video_port_reg;			/* Video register select port */
+static u16 vga_video_port_val;			/* Video register value port */
+static unsigned long vga_video_num_columns;	/* Number of text columns */
+static unsigned long vga_video_num_lines;	/* Number of text lines */
+static int vga_can_do_color = 0;
+
+
+    /*
+     *  VGA screen access
+     */ 
+
+static inline void vga_writew(u16 val, u16 *addr)
+{
+#ifdef __powerpc__
+    st_le16(addr, val);
+#else
+    writew(val, (unsigned long)addr);
+#endif /* !__powerpc__ */
+}
+
+static inline u16 vga_readw(u16 *addr)
+{
+#ifdef __powerpc__
+    return ld_le16(addr);
+#else
+    return readw((unsigned long)addr);
+#endif /* !__powerpc__ */	
+}
+
+static void vga_set_split(unsigned short linenum)
+{
+	unsigned long flags;
+	unsigned char overflow, fontsize;
+	
+	if (vga_video_type != VIDEO_TYPE_VGAC) {
+		return;
+	}
+
+	save_flags(flags); cli();
+
+	outb_p(0x07, vga_video_port_reg);
+	overflow = inb_p(vga_video_port_val);
+
+	outb_p(0x09, vga_video_port_reg);
+	fontsize = inb_p(vga_video_port_val);
+	
+	overflow &= ~0x10; overflow |= (linenum & 0x100) ? 0x10 : 0;
+	fontsize &= ~0x40; fontsize |= (linenum & 0x200) ? 0x40 : 0;
+	linenum  &=  0xff;
+
+	outb_p(0x18, vga_video_port_reg);
+	outb_p(linenum, vga_video_port_val);
+
+	outb_p(0x07, vga_video_port_reg);
+	outb_p(overflow, vga_video_port_val);
+
+	outb_p(0x09, vga_video_port_reg);
+	outb_p(fontsize, vga_video_port_val);
+
+	restore_flags(flags);
+}
+
+
+/*
+ * By replacing the four outb_p with two back to back outw, we can reduce
+ * the window of opportunity to see text mislocated to the RHS of the
+ * console during heavy scrolling activity. However there is the remote
+ * possibility that some pre-dinosaur hardware won't like the back to back
+ * I/O. Since the Xservers get away with it, we should be able to as well.
+ */
+static inline void write_vga(unsigned char reg, unsigned int val)
+{
+#ifndef SLOW_VGA
+    unsigned int v1, v2;
+
+    v1 = reg + (val & 0xff00);
+    v2 = reg + 1 + ((val << 8) & 0xff00);
+    outw(v1, vga_video_port_reg);
+    outw(v2, vga_video_port_reg);
+#else
+    outb_p(reg, vga_video_port_reg);
+    outb_p(val >> 8, vga_video_port_val);
+    outb_p(reg+1, vga_video_port_reg);
+    outb_p(val & 0xff, vga_video_port_val);
+#endif
+}
+
+static inline void vga_set_origin(unsigned short offset)
+{
+	write_vga(12, offset);
+}
+
+
+    /*
+     *  Interface used by the world
+     */
+
+static int vgafb_open(struct fb_info *info);
+static int vgafb_release(struct fb_info *info);
+static int vgafb_get_fix(struct fb_fix_screeninfo *fix, int con,
+			 struct fb_info *info);
+static int vgafb_get_var(struct fb_var_screeninfo *var, int con,
+			 struct fb_info *info);
+static int vgafb_set_var(struct fb_var_screeninfo *var, int con,
+			 struct fb_info *info);
+static int vgafb_pan_display(struct fb_var_screeninfo *var, int con,
+			     struct fb_info *info);
+static int vgafb_get_cmap(struct fb_cmap *cmap, int kspc, int con,
+			  struct fb_info *info);
+static int vgafb_set_cmap(struct fb_cmap *cmap, int kspc, int con,
+			  struct fb_info *info);
+static int vgafb_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
+     */
+
+unsigned long vgafb_init(unsigned long mem_start);
+void vgafb_setup(char *options, int *ints);
+static int vgafbcon_switch(int con, struct fb_info *info);
+static int vgafbcon_updatevar(int con, struct fb_info *info);
+static void vgafbcon_blank(int blank, struct fb_info *info);
+
+
+    /*
+     *  VGA text console with hardware cursor
+     */
+
+static struct display_switch fbcon_vgafb;
+
+
+    /*
+     *  Internal routines
+     */
+
+static int vgafb_getcolreg(u_int regno, u_int *red, u_int *green, u_int *blue,
+			   u_int *transp, struct fb_info *info);
+static int vgafb_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);
+
+
+static struct fb_ops vgafb_ops = {
+    vgafb_open, vgafb_release, vgafb_get_fix, vgafb_get_var, vgafb_set_var,
+    vgafb_get_cmap, vgafb_set_cmap, vgafb_pan_display, vgafb_ioctl
+};
+
+
+    /*
+     *  Open/Release the frame buffer device
+     */
+
+static int vgafb_open(struct fb_info *info)
+
+{
+    /*
+     *  Nothing, only a usage count for the moment
+     */
+
+    MOD_INC_USE_COUNT;
+    return(0);
+}
+
+static int vgafb_release(struct fb_info *info)
+{
+    MOD_DEC_USE_COUNT;
+    return(0);
+}
+
+
+    /*
+     *  Get the Fixed Part of the Display
+     */
+
+static int vgafb_get_fix(struct fb_fix_screeninfo *fix, int con,
+			 struct fb_info *info)
+{
+    memcpy(fix, &fb_fix, sizeof(fb_fix));
+    return 0;
+}
+
+
+    /*
+     *  Get the User Defined Part of the Display
+     */
+
+static int vgafb_get_var(struct fb_var_screeninfo *var, int con,
+			 struct fb_info *info)
+{
+    memcpy(var, &fb_var, sizeof(fb_var));
+    return 0;
+}
+
+
+    /*
+     *  Set the User Defined Part of the Display
+     */
+
+static int vgafb_set_var(struct fb_var_screeninfo *var, int con,
+			 struct fb_info *info)
+{
+    struct display *display;
+    int oldbpp = -1, err;
+
+    if (con >= 0)
+	display = &fb_display[con];
+    else
+	display = &disp;	/* used during initialization */
+
+    if (var->xres > fb_var.xres || var->yres > fb_var.yres ||
+	var->xres_virtual > fb_var.xres_virtual ||
+	var->yres_virtual > fb_var.yres_virtual ||
+	var->bits_per_pixel > fb_var.bits_per_pixel ||
+	var->nonstd || !(var->accel_flags & FB_ACCELF_TEXT) ||
+	(var->vmode & FB_VMODE_MASK) != FB_VMODE_NONINTERLACED)
+	return -EINVAL;
+    memcpy(var, &fb_var, sizeof(fb_var));
+
+    if ((var->activate & FB_ACTIVATE_MASK) == FB_ACTIVATE_NOW) {
+	oldbpp = display->var.bits_per_pixel;
+	display->var = *var;
+	vga_set_origin(var->yoffset/video_font_height*fb_fix.line_length/2);
+    }
+    if (oldbpp != var->bits_per_pixel) {
+	if ((err = fb_alloc_cmap(&display->cmap, 0, 0)))
+	    return err;
+	do_install_cmap(con, info);
+    }
+    return 0;
+}
+
+
+    /*
+     *  Pan or Wrap the Display
+     *
+     *  This call looks only at xoffset, yoffset and the FB_VMODE_YWRAP flag
+     */
+
+static int vgafb_pan_display(struct fb_var_screeninfo *var, int con,
+			     struct fb_info *info)
+{
+    if (var->xoffset || var->yoffset+var->yres > var->yres_virtual)
+	return -EINVAL;
+
+    vga_set_origin(var->yoffset/video_font_height*fb_fix.line_length/2);
+    return 0;
+}
+
+
+    /*
+     *  Get the Colormap
+     */
+
+static int vgafb_get_cmap(struct fb_cmap *cmap, int kspc, int con,
+			  struct fb_info *info)
+{
+    if (con == currcon) /* current console? */
+	return fb_get_cmap(cmap, &fb_display[con].var, kspc, vgafb_getcolreg,
+			   info);
+    else if (fb_display[con].cmap.len) /* non default colormap? */
+	fb_copy_cmap(&fb_display[con].cmap, cmap, kspc ? 0 : 2);
+    else
+	fb_copy_cmap(fb_default_cmap(1<<fb_display[con].var.bits_per_pixel),
+		     cmap, kspc ? 0 : 2);
+    return 0;
+}
+
+
+    /*
+     *  Set the Colormap
+     */
+
+static int vgafb_set_cmap(struct fb_cmap *cmap, int kspc, int con,
+			  struct fb_info *info)
+{
+    int err;
+
+    if (!fb_display[con].cmap.len) {    /* no colormap allocated? */
+	if ((err = fb_alloc_cmap(&fb_display[con].cmap,
+				 1<<fb_display[con].var.bits_per_pixel, 0)))
+	    return err;
+    }
+    if (con == currcon) {		/* current console? */
+	err = fb_set_cmap(cmap, &fb_display[con].var, kspc, vgafb_setcolreg,
+			  info);
+	return err;
+    } else
+	fb_copy_cmap(cmap, &fb_display[con].cmap, kspc ? 0 : 1);
+    return 0;
+}
+
+
+static int vgafb_ioctl(struct inode *inode, struct file *file, u_int cmd,
+		       u_long arg, int con, struct fb_info *info)
+{
+    return -EINVAL;
+}
+
+
+    /*
+     *  Move hardware vga cursor
+     */
+
+static void vga_write_cursor(int location)
+{
+    write_vga(14, location >> 1);
+}
+
+static void fbcon_vgafb_cursor(struct display *p, int mode, int x, int y)
+{
+    switch (mode) {
+	case CM_ERASE:
+	   vga_write_cursor(vga_video_mem_term - vga_video_mem_base - 1);
+	   break;
+
+	case CM_MOVE:
+	case CM_DRAW:
+	   vga_write_cursor(y*p->next_line + (x << 1));
+	   break;
+    }
+}
+
+
+    /*
+     *  Initialisation
+     */
+
+__initfunc(unsigned long vgafb_init(unsigned long mem_start))
+{
+    int err;
+    u16 saved;
+    u16 *p;
+
+    if (screen_info.orig_video_isVGA == VIDEO_TYPE_VLFB)
+	return mem_start;
+
+    vga_video_num_lines = ORIG_VIDEO_LINES;
+    vga_video_num_columns = ORIG_VIDEO_COLS;
+
+    if (ORIG_VIDEO_MODE == 7) {		/* Is this a monochrome display? */
+	vga_video_mem_base = 0xb0000 + VGA_OFFSET;
+	vga_video_port_reg = 0x3b4;
+	vga_video_port_val = 0x3b5;
+	if ((ORIG_VIDEO_EGA_BX & 0xff) != 0x10) {
+	    vga_video_type = VIDEO_TYPE_EGAM;
+	    vga_video_mem_term = 0xb8000 + VGA_OFFSET;
+	    strcpy(fb_fix.id, "EGA+");
+	    request_region(0x3b0, 16, "ega");
+	} else {
+	    vga_video_type = VIDEO_TYPE_MDA;
+	    vga_video_mem_term = 0xb1000 + VGA_OFFSET;
+	    strcpy(fb_fix.id, "*MDA");
+	    request_region(0x3b0, 12, "mda");
+	    request_region(0x3bf, 1, "mda");
+	}
+    } else {				/* If not, it is color. */
+	vga_can_do_color = 1;
+	vga_video_mem_base = 0xb8000  + VGA_OFFSET;
+	vga_video_port_reg = 0x3d4;
+	vga_video_port_val = 0x3d5;
+	if ((ORIG_VIDEO_EGA_BX & 0xff) != 0x10) {
+	    int i;
+
+	    vga_video_mem_term = 0xc0000 + VGA_OFFSET;
+
+	    if (!ORIG_VIDEO_ISVGA) {
+		vga_video_type = VIDEO_TYPE_EGAC;
+		strcpy(fb_fix.id, "EGA");
+		request_region(0x3c0, 32, "ega");
+	    } else {
+		vga_video_type = VIDEO_TYPE_VGAC;
+		strcpy(fb_fix.id, "VGA+");
+		request_region(0x3c0, 32, "vga+");
+
+#ifdef VGA_CAN_DO_64KB
+		/*
+		 * get 64K rather than 32K of video RAM.
+		 * This doesn't actually work on all "VGA"
+		 * controllers (it seems like setting MM=01
+		 * and COE=1 isn't necessarily a good idea)
+		 */
+		vga_video_mem_base = 0xa0000  + VGA_OFFSET;
+		vga_video_mem_term = 0xb0000  + VGA_OFFSET;
+		outb_p(6, 0x3ce);
+		outb_p(6, 0x3cf);
+#endif
+
+		/*
+		 * Normalise the palette registers, to point
+		 * the 16 screen colours to the first 16
+		 * DAC entries.
+		 */
+
+		for (i = 0; i < 16; i++) {
+		    inb_p(0x3da);
+		    outb_p(i, 0x3c0);
+		    outb_p(i, 0x3c0);
+		}
+		outb_p(0x20, 0x3c0);
+
+		/* now set the DAC registers back to their
+		 * default values */
+
+		for (i = 0; i < 16; i++) {
+		    outb_p(color_table[i], dac_reg);
+		    outb_p(default_red[i], dac_val);
+		    outb_p(default_grn[i], dac_val);
+		    outb_p(default_blu[i], dac_val);
+		}
+	    }
+	} else {
+		vga_video_type = VIDEO_TYPE_CGA;
+		vga_video_mem_term = 0xba000 + VGA_OFFSET;
+		strcpy(fb_fix.id, "*CGA");
+		request_region(0x3d4, 2, "cga");
+	}
+    }
+
+    /*
+     *	Find out if there is a graphics card present.
+     *	Are there smarter methods around?
+     */
+    p = (u16 *)vga_video_mem_base;
+    saved = vga_readw(p);
+    vga_writew(0xAA55, p);
+    if (vga_readw(p) != 0xAA55) {
+	vga_writew(saved, p);
+	return mem_start;
+    }
+    vga_writew(0x55AA, p);
+    if (vga_readw(p) != 0x55AA) {
+	vga_writew(saved, p);
+	return mem_start;
+    }
+    vga_writew(saved, p);
+
+    if (vga_video_type == VIDEO_TYPE_VGAC
+	|| vga_video_type == VIDEO_TYPE_EGAC
+	|| vga_video_type == VIDEO_TYPE_EGAM) {
+	    video_font_height = ORIG_VIDEO_POINTS;
+    } else {
+            video_font_height = 16;
+    }
+
+    /* This may be suboptimal but is a safe bet - go with it */
+    video_scan_lines = video_font_height * vga_video_num_lines;
+
+    fb_fix.smem_start = (char *) vga_video_mem_base;
+    fb_fix.smem_len = vga_video_mem_term - vga_video_mem_base;
+    fb_fix.type = FB_TYPE_VGA_TEXT;
+    fb_fix.type_aux = 0;
+    fb_fix.visual = FB_VISUAL_PSEUDOCOLOR;
+    fb_fix.xpanstep = 0;
+    fb_fix.ypanstep = video_font_height;
+    fb_fix.ywrapstep = 0;
+    fb_fix.line_length = 2*vga_video_num_columns;
+    fb_fix.mmio_start = NULL;
+    fb_fix.mmio_len = 0;
+    fb_fix.accel = FB_ACCEL_NONE;
+
+    fb_var.xres = vga_video_num_columns*8;
+    fb_var.yres = vga_video_num_lines*video_font_height;
+    fb_var.xres_virtual = fb_var.xres;
+    /* the cursor is put at the end of the video memory, hence the -2 */
+    fb_var.yres_virtual = ((fb_fix.smem_len-2)/fb_fix.line_length)*
+			  video_font_height;
+
+    fb_var.xoffset = fb_var.yoffset = 0;
+    fb_var.bits_per_pixel = vga_can_do_color ? 4 : 1;
+    fb_var.grayscale = !vga_can_do_color;
+    fb_var.red.offset = 0;
+    fb_var.red.length = 6;
+    fb_var.red.msb_right = 0;
+    fb_var.green.offset = 0;
+    fb_var.green.length = 6;
+    fb_var.green.msb_right = 0;
+    fb_var.blue.offset = 0;
+    fb_var.blue.length = 6;
+    fb_var.blue.msb_right = 0;
+    fb_var.transp.offset = 0;
+    fb_var.transp.length = 0;
+    fb_var.transp.msb_right = 0;
+    fb_var.nonstd = 0;
+    fb_var.activate = 0;
+    fb_var.height = fb_var.width = -1;
+    fb_var.accel_flags = FB_ACCELF_TEXT;
+    fb_var.pixclock = 39722;		/* 25.175 MHz */
+    fb_var.left_margin = 40;
+    fb_var.right_margin = 24;
+    fb_var.upper_margin = 39;
+    fb_var.lower_margin = 9;
+    fb_var.hsync_len = 96;
+    fb_var.vsync_len = 2;
+    fb_var.sync = 0;
+    fb_var.vmode = FB_VMODE_NONINTERLACED;
+
+    disp.var = fb_var;
+    disp.cmap.start = 0;
+    disp.cmap.len = 0;
+    disp.cmap.red = NULL;
+    disp.cmap.green = NULL;
+    disp.cmap.blue = NULL;
+    disp.cmap.transp = NULL;
+
+#ifdef __i386__
+    disp.screen_base = ioremap((unsigned long) fb_fix.smem_start,
+				fb_fix.smem_len);
+#else
+    disp.screen_base = bus_to_virt((unsigned long) fb_fix.smem_start);
+#endif
+    disp.visual = fb_fix.visual;
+    disp.type = fb_fix.type;
+    disp.type_aux = fb_fix.type_aux;
+    disp.ypanstep = fb_fix.ypanstep;
+    disp.ywrapstep = fb_fix.ywrapstep;
+    disp.line_length = fb_fix.line_length;
+    disp.can_soft_blank = vga_can_do_color;
+    disp.inverse = 0;
+    disp.dispsw = &fbcon_vgafb;
+
+    strcpy(fb_info.modename, fb_fix.id);
+    fb_info.node = -1;
+    fb_info.fbops = &vgafb_ops;
+    fb_info.disp = &disp;
+    fb_info.fontname[0] = '\0';
+    fb_info.changevar = NULL;
+    fb_info.switch_con = &vgafbcon_switch;
+    fb_info.updatevar = &vgafbcon_updatevar;
+    fb_info.blank = &vgafbcon_blank;
+
+    err = register_framebuffer(&fb_info);
+    if (err < 0)
+	return mem_start;
+
+    vgafb_set_var(&fb_var, -1, &fb_info);
+
+    printk("fb%d: VGA frame buffer device, using %dK of video memory\n",
+	   GET_FB_IDX(fb_info.node), fb_fix.smem_len>>10);
+
+    return mem_start;
+}
+
+__initfunc(void vgafb_setup(char *options, int *ints))
+{
+    /* nothing yet */
+}
+
+    /*
+     *  Update the `var' structure (called by fbcon.c)
+     */
+
+static int vgafbcon_updatevar(int con, struct fb_info *info)
+{
+	if (con == currcon) {
+		struct fb_var_screeninfo *var = &fb_display[currcon].var;
+
+		/* hardware scrolling */
+
+		vga_set_origin(var->yoffset / video_font_height *
+			fb_fix.line_length / 2);
+
+		vga_set_split(var->yres - ((var->vmode & FB_VMODE_YWRAP) ?
+			var->yoffset+1 : 0));
+	}
+
+	return 0;
+}
+
+static int vgafbcon_switch(int con, struct fb_info *info)
+{
+    /* Do we have to save the colormap? */
+    if (fb_display[currcon].cmap.len)
+	fb_get_cmap(&fb_display[currcon].cmap, &fb_display[currcon].var, 1,
+		    vgafb_getcolreg, info);
+
+    currcon = con;
+    /* Install new colormap */
+    do_install_cmap(con, info);
+    vgafbcon_updatevar(con, info);
+    return 0;
+}
+
+    /*
+     *  Blank the display.
+     */
+
+static void vgafbcon_blank(int blank, struct fb_info *info)
+{
+    int i;
+
+    outb_p(0, dac_reg);
+    if (blank)
+	for (i = 0; i < 16; i++) {
+	    outb_p(0, dac_val);
+	    outb_p(0, dac_val);
+	    outb_p(0, dac_val);
+	}
+    else
+	for (i = 0; i < 16; i++) {
+	    outb_p(palette[i].blue, dac_val);
+	    outb_p(palette[i].green, dac_val);
+	    outb_p(palette[i].blue, dac_val);
+	}
+}
+
+
+    /*
+     *  Read a single color register and split it into
+     *  colors/transparent. Return != 0 for invalid regno.
+     */
+
+static int vgafb_getcolreg(u_int regno, u_int *red, u_int *green, u_int *blue,
+			 u_int *transp, struct fb_info *info)
+{
+    if (regno > 15)
+	return 1;
+    *red = palette[regno].red;
+    *green = palette[regno].green;
+    *blue = palette[regno].blue;
+    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 vgafb_setcolreg(u_int regno, u_int red, u_int green, u_int blue,
+			 u_int transp, struct fb_info *info)
+{
+    if (regno > 15)
+	return 1;
+    palette[regno].red = red;
+    palette[regno].green = green;
+    palette[regno].blue = blue;
+
+    outb_p(regno, dac_reg);
+    outb_p(red, dac_val);
+    outb_p(green, dac_val);
+    outb_p(blue, dac_val);
+
+    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, &fb_display[con].var, 1,
+		    vgafb_setcolreg, info);
+    else
+	fb_set_cmap(fb_default_cmap(1<<fb_display[con].var.bits_per_pixel),
+				    &fb_display[con].var, 1, vgafb_setcolreg,
+				    info);
+}
+
+
+    /*
+     *  VGA text console with hardware cursor
+     */
+
+static struct display_switch fbcon_vgafb = {
+    fbcon_vga_setup, fbcon_vga_bmove, fbcon_vga_clear, fbcon_vga_putc,
+    fbcon_vga_putcs, fbcon_vga_revc, fbcon_vgafb_cursor
+};
diff -u --recursive --new-file v2.1.106/linux/drivers/video/virgefb.c linux/drivers/video/virgefb.c
--- v2.1.106/linux/drivers/video/virgefb.c	Thu Mar 26 15:57:04 1998
+++ linux/drivers/video/virgefb.c	Wed Jun 24 14:44:02 1998
@@ -90,6 +90,7 @@
    int xres;
    int yres;
    int bpp;
+   int accel;
 };
 
 static struct virgefb_par current_par;
@@ -163,49 +164,49 @@
 	"640x480-8", {		/* Cybervision 8 bpp */
 	    640, 480, 640, 480, 0, 0, 8, 0,
 	    {0, 8, 0}, {0, 8, 0}, {0, 8, 0}, {0, 0, 0},
-	    0, 0, -1, -1, FB_ACCEL_NONE, VIRGE8_PIXCLOCK, 64, 96, 35, 12, 112, 2,
+	    0, 0, -1, -1, FB_ACCELF_TEXT, VIRGE8_PIXCLOCK, 64, 96, 35, 12, 112, 2,
 	    FB_SYNC_COMP_HIGH_ACT|FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED
 	}
     }, {
 	"800x600-8", {		/* Cybervision 8 bpp */
 	    800, 600, 800, 600, 0, 0, 8, 0,
 	    {0, 8, 0}, {0, 8, 0}, {0, 8, 0}, {0, 0, 0},
-	    0, 0, -1, -1, FB_ACCEL_NONE, VIRGE8_PIXCLOCK, 64, 96, 35, 12, 112, 2,
+	    0, 0, -1, -1, FB_ACCELF_TEXT, VIRGE8_PIXCLOCK, 64, 96, 35, 12, 112, 2,
 	    FB_SYNC_COMP_HIGH_ACT|FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED
 	}
     }, {
 	"1024x768-8", {		/* Cybervision 8 bpp */
 	    1024, 768, 1024, 768, 0, 0, 8, 0,
 	    {0, 8, 0}, {0, 8, 0}, {0, 8, 0}, {0, 0, 0},
-	    0, 0, -1, -1, FB_ACCEL_NONE, VIRGE8_PIXCLOCK, 64, 96, 35, 12, 112, 2,
+	    0, 0, -1, -1, FB_ACCELF_TEXT, VIRGE8_PIXCLOCK, 64, 96, 35, 12, 112, 2,
 	    FB_SYNC_COMP_HIGH_ACT|FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED
 	}
     }, {
 	"1152x886-8", {		/* Cybervision 8 bpp */
 	    1152, 886, 1152, 886, 0, 0, 8, 0,
 	    {0, 8, 0}, {0, 8, 0}, {0, 8, 0}, {0, 0, 0},
-	    0, 0, -1, -1, FB_ACCEL_NONE, VIRGE8_PIXCLOCK, 64, 96, 35, 12, 112, 2,
+	    0, 0, -1, -1, FB_ACCELF_TEXT, VIRGE8_PIXCLOCK, 64, 96, 35, 12, 112, 2,
 	    FB_SYNC_COMP_HIGH_ACT|FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED
 	}
     }, {
 	"1280x1024-8", {	/* Cybervision 8 bpp */
 	    1280, 1024, 1280, 1024, 0, 0, 8, 0,
 	    {0, 8, 0}, {0, 8, 0}, {0, 8, 0}, {0, 0, 0},
-	    0, 0, -1, -1, FB_ACCEL_NONE, VIRGE8_PIXCLOCK, 64, 96, 35, 12, 112, 2,
+	    0, 0, -1, -1, FB_ACCELF_TEXT, VIRGE8_PIXCLOCK, 64, 96, 35, 12, 112, 2,
 	    FB_SYNC_COMP_HIGH_ACT|FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED
 	}
     }, {
 	"1600x1200-8", {	/* Cybervision 8 bpp */
 	    1600, 1200, 1600, 1200, 0, 0, 8, 0,
 	    {0, 8, 0}, {0, 8, 0}, {0, 8, 0}, {0, 0, 0},
-	    0, 0, -1, -1, FB_ACCEL_NONE, VIRGE8_PIXCLOCK, 64, 96, 35, 12, 112, 2,
+	    0, 0, -1, -1, FB_ACCELF_TEXT, VIRGE8_PIXCLOCK, 64, 96, 35, 12, 112, 2,
 	    FB_SYNC_COMP_HIGH_ACT|FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED
 	}
     }, {
 	"800x600-16", {		/* Cybervision 16 bpp */
 	    800, 600, 800, 600, 0, 0, 16, 0,
 	    {11, 5, 0}, {5, 6, 0}, {0, 5, 0}, {0, 0, 0},
-	    0, 0, -1, -1, FB_ACCEL_NONE, VIRGE16_PIXCLOCK, 64, 96, 35, 12, 112, 2,
+	    0, 0, -1, -1, 0, VIRGE16_PIXCLOCK, 64, 96, 35, 12, 112, 2,
 	    FB_SYNC_COMP_HIGH_ACT|FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED
 	}
     }
@@ -370,12 +371,11 @@
 static int Cyber_encode_fix(struct fb_fix_screeninfo *fix,
 			    struct virgefb_par *par)
 {
-	int i;
-
+	memset(fix, 0, sizeof(struct fb_fix_screeninfo));
 	strcpy(fix->id, virgefb_name);
-	fix->smem_start = (caddr_t)CyberMem;
+	fix->smem_start = (char *)CyberMem;
 	fix->smem_len = CyberSize;
-	fix->mmio_start = (unsigned char *)CyberRegs;
+	fix->mmio_start = (char *)CyberRegs;
 	fix->mmio_len = 0x10000; /* TODO: verify this for the CV64/3D */
 
 	fix->type = FB_TYPE_PACKED_PIXELS;
@@ -389,10 +389,7 @@
 	fix->ypanstep = 0;
 	fix->ywrapstep = 0;
 	fix->line_length = 0;
-
-	for (i = 0; i < arraysize(fix->reserved); i++)
-		fix->reserved[i] = 0;
-
+	fix->accel = FB_ACCEL_S3_VIRGE;
 	return(0);
 }
 
@@ -409,6 +406,10 @@
 	par->xres = var->xres;
 	par->yres = var->yres;
 	par->bpp = var->bits_per_pixel;
+	if (var->accel_flags & FB_ACCELF_TEXT)
+	    par->accel = FB_ACCELF_TEXT;
+	else
+	    par->accel = 0;
 #else
 	if (Cyberfb_Cyber8) {
 		par->xres = VIRGE8_WIDTH;
@@ -432,8 +433,7 @@
 static int Cyber_encode_var(struct fb_var_screeninfo *var,
 			    struct virgefb_par *par)
 {
-	int i;
-
+	memset(var, 0, sizeof(struct fb_var_screeninfo));
 	var->xres = par->xres;
 	var->yres = par->yres;
 	var->xres_virtual = par->xres;
@@ -470,7 +470,7 @@
 	var->height = -1;
 	var->width = -1;
 
-	var->accel = FB_ACCEL_S3VIRGE;
+	var->accel_flags = (par->accel && par->bpp == 8) ? FB_ACCELF_TEXT : 0;
 	DPRINTK("accel CV64/3D\n");
 
 	var->vmode = FB_VMODE_NONINTERLACED;
@@ -489,9 +489,6 @@
 	var->hsync_len = 112;
 	var->vsync_len = 2;
 
-	for (i = 0; i < arraysize(var->reserved); i++)
-		var->reserved[i] = 0;
-
 	return(0);
 }
 
@@ -841,7 +838,7 @@
 	virgefb_get_fix(&fix, con, info);
 	if (con == -1)
 		con = 0;
-	display->screen_base = (u_char *)fix.smem_start;
+	display->screen_base = fix.smem_start;
 	display->visual = fix.visual;
 	display->type = fix.type;
 	display->type_aux = fix.type_aux;
@@ -852,7 +849,11 @@
 	switch (display->var.bits_per_pixel) {
 #ifdef CONFIG_FBCON_CFB8
 	    case 8:
-		display->dispsw = &fbcon_virge8;
+		if (display->var.accel_flags & FB_ACCELF_TEXT) {
+		    display->dispsw = &fbcon_virge8;
+#warning FIXME: We should reinit the graphics engine here
+		} else
+		    display->dispsw = &fbcon_virge8;
 		break;
 #endif
 #ifdef CONFIG_FBCON_CFB16
@@ -874,7 +875,7 @@
 static int virgefb_set_var(struct fb_var_screeninfo *var, int con,
 			   struct fb_info *info)
 {
-	int err, oldxres, oldyres, oldvxres, oldvyres, oldbpp;
+	int err, oldxres, oldyres, oldvxres, oldvyres, oldbpp, oldaccel;
 
 	if ((err = do_fb_set_var(var, con == currcon)))
 		return(err);
@@ -884,11 +885,13 @@
 		oldvxres = fb_display[con].var.xres_virtual;
 		oldvyres = fb_display[con].var.yres_virtual;
 		oldbpp = fb_display[con].var.bits_per_pixel;
+		oldaccel = fb_display[con].var.accel_flags;
 		fb_display[con].var = *var;
 		if (oldxres != var->xres || oldyres != var->yres ||
 		    oldvxres != var->xres_virtual ||
 		    oldvyres != var->yres_virtual ||
-		    oldbpp != var->bits_per_pixel) {
+		    oldbpp != var->bits_per_pixel ||
+		    oldaccel != var->accel_flags) {
 			virgefb_set_disp(con, info);
 			(*fb_info.changevar)(con);
 			fb_alloc_cmap(&fb_display[con].cmap, 0, 0);
@@ -969,7 +972,7 @@
 static struct fb_ops virgefb_ops = {
 	virgefb_open, virgefb_release, virgefb_get_fix, virgefb_get_var,
 	virgefb_set_var, virgefb_get_cmap, virgefb_set_cmap,
-	virgefb_pan_display, NULL, virgefb_ioctl
+	virgefb_pan_display, virgefb_ioctl
 };
 
 
@@ -1030,7 +1033,7 @@
 
 		CyberMem = ZTWO_VADDR(board_addr);
 		printk("CV3D detected running in Z2 mode ... not yet supported!\n");
-		return -ENODEV;
+		return mem_start;
 	}
 	else
 	{
@@ -1169,7 +1172,7 @@
 
 static struct display_switch fbcon_virge8 = {
    fbcon_cfb8_setup, fbcon_virge8_bmove, fbcon_virge8_clear, fbcon_cfb8_putc,
-   fbcon_cfb8_putcs, fbcon_cfb8_revc
+   fbcon_cfb8_putcs, fbcon_cfb8_revc, NULL
 };
 #endif
 
diff -u --recursive --new-file v2.1.106/linux/fs/Config.in linux/fs/Config.in
--- v2.1.106/linux/fs/Config.in	Mon Apr  6 17:41:00 1998
+++ linux/fs/Config.in	Wed Jun 24 14:30:09 1998
@@ -9,15 +9,15 @@
 tristate 'Minix fs support' CONFIG_MINIX_FS
 tristate 'Second extended fs support' CONFIG_EXT2_FS
 
-tristate 'ISO9660 cdrom filesystem support' CONFIG_ISO9660_FS
+tristate 'ISO 9660 CDROM filesystem support' CONFIG_ISO9660_FS
 if [ "$CONFIG_ISO9660_FS" != "n" ]; then
-  bool 'Microsoft Joliet cdrom extensions' CONFIG_JOLIET
+  bool 'Microsoft Joliet CDROM extensions' CONFIG_JOLIET
 fi
 
 # msdos filesystems
 tristate 'DOS FAT fs support' CONFIG_FAT_FS
 dep_tristate 'MSDOS fs support' CONFIG_MSDOS_FS $CONFIG_FAT_FS
-dep_tristate 'umsdos: Unix like fs on top of std MSDOS FAT fs' CONFIG_UMSDOS_FS $CONFIG_MSDOS_FS
+dep_tristate 'UMSDOS: Unix-like filesystem on top of standard MSDOS filesystem' CONFIG_UMSDOS_FS $CONFIG_MSDOS_FS
 dep_tristate 'VFAT (Windows-95) fs support' CONFIG_VFAT_FS $CONFIG_FAT_FS
 
 bool '/proc filesystem support' CONFIG_PROC_FS
@@ -40,7 +40,7 @@
     fi
   fi
   tristate 'Coda filesystem support (advanced network fs)' CONFIG_CODA_FS
-  tristate 'SMB filesystem support (to mount WfW shares etc..)' CONFIG_SMB_FS
+  tristate 'SMB filesystem support (to mount WfW shares etc.)' CONFIG_SMB_FS
   if [ "$CONFIG_SMB_FS" != "n" ]; then
     bool 'SMB Win95 bug work-around' CONFIG_SMB_WIN95
   fi
@@ -53,7 +53,7 @@
 fi
 tristate 'OS/2 HPFS filesystem support (read only)' CONFIG_HPFS_FS
 
-tristate 'NTFS  filesystem support (read only)' CONFIG_NTFS_FS
+tristate 'NTFS filesystem support (read only)' CONFIG_NTFS_FS
 if [ "$CONFIG_NTFS_FS" != "n" -a "$CONFIG_EXPERIMENTAL" = "y" ]; then
   bool '   NTFS read-write support (experimental)' CONFIG_NTFS_RW
 fi
@@ -78,4 +78,3 @@
 fi
 bool 'Macintosh partition map support' CONFIG_MAC_PARTITION
 endmenu
-
diff -u --recursive --new-file v2.1.106/linux/fs/Makefile linux/fs/Makefile
--- v2.1.106/linux/fs/Makefile	Fri May  8 23:14:50 1998
+++ linux/fs/Makefile	Wed Jun 24 14:30:09 1998
@@ -1,11 +1,11 @@
 #
-# Makefile for the linux filesystem.
+# Makefile for the Linux filesystems.
 #
 # Note! Dependencies are done automagically by 'make dep', which also
 # removes any old dependencies. DON'T put your own dependencies here
-# unless it's something special (ie not a .c file).
+# unless it's something special (not a .c file).
 #
-# Note 2! The CFLAGS definitions are now in the main makefile...
+# Note 2! The CFLAGS definitions are now in the main makefile.
 
 L_TARGET := filesystems.a
 L_OBJS    = $(join $(SUB_DIRS),$(SUB_DIRS:%=/%.o))
diff -u --recursive --new-file v2.1.106/linux/fs/adfs/Makefile linux/fs/adfs/Makefile
--- v2.1.106/linux/fs/adfs/Makefile	Tue Jan 20 16:44:58 1998
+++ linux/fs/adfs/Makefile	Wed Jun 24 14:30:09 1998
@@ -1,11 +1,11 @@
 #
-# Makefile for the linux adfs-filesystem routines.
+# Makefile for the linux adfs filesystem routines.
 #
 # Note! Dependencies are done automagically by 'make dep', which also
 # removes any old dependencies. DON'T put your own dependencies here
-# unless it's something special (ie not a .c file).
+# unless it's something special (not a .c file).
 #
-# Note 2! The CFLAGS definitions are now in the main makefile...
+# Note 2! The CFLAGS definitions are now in the main makefile.
 
 O_TARGET := adfs.o
 O_OBJS   := dir.o file.o inode.o map.o namei.o super.o
diff -u --recursive --new-file v2.1.106/linux/fs/adfs/file.c linux/fs/adfs/file.c
--- v2.1.106/linux/fs/adfs/file.c	Tue Jan 20 16:44:58 1998
+++ linux/fs/adfs/file.c	Wed Jun 24 14:30:09 1998
@@ -28,7 +28,7 @@
 #include <linux/stat.h>
 
 /*
- * We have mostly NULL's here: the current defaults are ok for
+ * We have mostly NULLs here: the current defaults are OK for
  * the adfs filesystem.
  */
 static struct file_operations adfs_file_operations = {
diff -u --recursive --new-file v2.1.106/linux/fs/affs/Changes linux/fs/affs/Changes
--- v2.1.106/linux/fs/affs/Changes	Sun Jun  7 11:16:35 1998
+++ linux/fs/affs/Changes	Wed Jun 24 14:30:09 1998
@@ -37,7 +37,7 @@
 - truncate() zeroes the unused remainder of a
   partially used last block when a file is truncated.
   It also marks the inode dirty now (which is not
-  really neccessary as notify_change() will do
+  really necessary as notify_change() will do
   it anyway).
 
 - Added a few comments, fixed some typos (and
@@ -54,7 +54,7 @@
 patches he did. They're marked (BH). Thanks, Bill!
 
 - Cleanup of error handling in read_super().
-  Didn't release all ressources in case of an
+  Didn't release all resources in case of an
   error. (BH)
 
 - put_inode() releases the ext cache only if it's
@@ -72,7 +72,7 @@
 - getblock() did not invalidate the key cache
   when it allocated a new block.
 
-- Removed some unneccessary locks as Bill
+- Removed some unnecessary locks as Bill
   suggested.
 
 - Simplified match_name(), changed all hashing
@@ -129,7 +129,7 @@
   directory changes).
 
 - Handling of hard links rewritten. To the VFS
-  they appear now as normal unix links. They are
+  they appear now as normal Unix links. They are
   now resolved only once in lookup(). The backside
   is that unlink(), rename() and rmdir() have to
   be smart about them, but the result is worth the
@@ -165,7 +165,7 @@
 
 - Argument to volume option could overflow the
   name buffer. It is now silently truncated to
-  30 characters. (Damnit! This kind of bug
+  30 characters. (Damn it! This kind of bug
   is too embarrassing.)
 
 - Split inode.c into 2 files, the superblock
diff -u --recursive --new-file v2.1.106/linux/fs/affs/Makefile linux/fs/affs/Makefile
--- v2.1.106/linux/fs/affs/Makefile	Tue Dec  2 22:25:07 1997
+++ linux/fs/affs/Makefile	Wed Jun 24 14:30:09 1998
@@ -1,11 +1,11 @@
 #
-# Makefile for the linux affs-filesystem routines.
+# Makefile for the Linux affs filesystem routines.
 #
 # Note! Dependencies are done automagically by 'make dep', which also
 # removes any old dependencies. DON'T put your own dependencies here
-# unless it's something special (ie not a .c file).
+# unless it's something special (not a .c file).
 #
-# Note 2! The CFLAGS definitions are now in the main makefile...
+# Note 2! The CFLAGS definitions are now in the main makefile.
 
 O_TARGET := affs.o
 O_OBJS   := super.o namei.o inode.o file.o dir.o amigaffs.o bitmap.o symlink.o
diff -u --recursive --new-file v2.1.106/linux/fs/affs/amigaffs.c linux/fs/affs/amigaffs.c
--- v2.1.106/linux/fs/affs/amigaffs.c	Fri May  8 23:14:50 1998
+++ linux/fs/affs/amigaffs.c	Wed Jun 24 14:30:09 1998
@@ -213,7 +213,7 @@
 
 	/* Mark directory as changed.  We do this before anything else,
 	 * as it must be done anyway and doesn't hurt even if an
-	 * error occures later.
+	 * error occurs later.
 	 */
 	dir = iget(inode->i_sb,be32_to_cpu(FILE_END(bh->b_data,inode)->parent));
 	if (!dir)
diff -u --recursive --new-file v2.1.106/linux/fs/affs/dir.c linux/fs/affs/dir.c
--- v2.1.106/linux/fs/affs/dir.c	Tue Dec  2 22:25:07 1997
+++ linux/fs/affs/dir.c	Wed Jun 24 14:30:09 1998
@@ -5,7 +5,7 @@
  *
  *  (C) 1993  Ray Burr - Modified for Amiga FFS filesystem.
  *
- *  (C) 1992  Eric Youngdale Modified for ISO9660 filesystem.
+ *  (C) 1992  Eric Youngdale Modified for ISO 9660 filesystem.
  *
  *  (C) 1991  Linus Torvalds - minix filesystem
  *
diff -u --recursive --new-file v2.1.106/linux/fs/affs/file.c linux/fs/affs/file.c
--- v2.1.106/linux/fs/affs/file.c	Fri May  8 23:14:50 1998
+++ linux/fs/affs/file.c	Wed Jun 24 14:30:09 1998
@@ -5,7 +5,7 @@
  *
  *  (C) 1993  Ray Burr - Modified for Amiga FFS filesystem.
  *
- *  (C) 1992  Eric Youngdale Modified for ISO9660 filesystem.
+ *  (C) 1992  Eric Youngdale Modified for ISO 9660 filesystem.
  *
  *  (C) 1991  Linus Torvalds - minix filesystem
  *
@@ -134,7 +134,7 @@
 /* The keys of the extension blocks are stored in a 512-entry
  * deep cache. In order to save memory, not every key of later
  * extension blocks is stored - the larger the file gets, the
- * bigger the holes inbetween.
+ * bigger the holes in between.
  */
 
 static int
@@ -349,8 +349,8 @@
 
 /* With the affs, getting a random block from a file is not
  * a simple business. Since this fs does not allow holes,
- * it may be neccessary to allocate all the missing blocks
- * inbetween, as well as some new extension blocks. The OFS
+ * it may be necessary to allocate all the missing blocks
+ * in between, as well as some new extension blocks. The OFS
  * is even worse: All data blocks contain pointers to the
  * next ones, so you have to fix [n-1] after allocating [n].
  * What a mess.
diff -u --recursive --new-file v2.1.106/linux/fs/affs/super.c linux/fs/affs/super.c
--- v2.1.106/linux/fs/affs/super.c	Fri May  8 23:14:50 1998
+++ linux/fs/affs/super.c	Wed Jun 24 14:30:09 1998
@@ -5,7 +5,7 @@
  *
  *  (C) 1993  Ray Burr - Modified for Amiga FFS filesystem.
  *
- *  (C) 1992  Eric Youngdale Modified for ISO9660 filesystem.
+ *  (C) 1992  Eric Youngdale Modified for ISO 9660 filesystem.
  *
  *  (C) 1991  Linus Torvalds - minix filesystem
  */
diff -u --recursive --new-file v2.1.106/linux/fs/binfmt_elf.c linux/fs/binfmt_elf.c
--- v2.1.106/linux/fs/binfmt_elf.c	Sun Jun  7 11:16:35 1998
+++ linux/fs/binfmt_elf.c	Wed Jun 24 14:30:09 1998
@@ -324,8 +324,8 @@
 	/*
 	 * Now fill out the bss section.  First pad the last page up
 	 * to the page boundary, and then perform a mmap to make sure
-	 * that there are zeromapped pages up to and including the last
-	 * bss page.
+	 * that there are zero-mapped pages up to and including the 
+	 * last bss page.
 	 */
 	padzero(elf_bss);
 	elf_bss = ELF_PAGESTART(elf_bss + ELF_EXEC_PAGESIZE - 1); /* What we have mapped so far */
@@ -1222,7 +1222,7 @@
 	notes[2].datasz = sizeof(*current);
 	notes[2].data = current;
 
-	/* Try to dump the fpu. */
+	/* Try to dump the FPU. */
 	prstatus.pr_fpvalid = dump_fpu (regs, &fpu);
 	if (!prstatus.pr_fpvalid)
 	{
diff -u --recursive --new-file v2.1.106/linux/fs/buffer.c linux/fs/buffer.c
--- v2.1.106/linux/fs/buffer.c	Sun Jun  7 11:16:35 1998
+++ linux/fs/buffer.c	Wed Jun 24 14:30:09 1998
@@ -1053,10 +1053,13 @@
 	wait_on_buffer(buf);
 	mark_buffer_clean(buf);
 	clear_bit(BH_Protected, &buf->b_state);
-	buf->b_count--;
 	remove_from_hash_queue(buf);
 	buf->b_dev = NODEV;
 	refile_buffer(buf);
+	if (!--buf->b_count)
+		return;
+	printk("VFS: forgot an in-use buffer! (count=%d)\n",
+		buf->b_count);
 }
 
 /*
@@ -1065,19 +1068,19 @@
  */
 struct buffer_head * bread(kdev_t dev, int block, int size)
 {
-	struct buffer_head * bh;
+	struct buffer_head * bh = getblk(dev, block, size);
 
-	if (!(bh = getblk(dev, block, size))) {
-		printk("VFS: bread: impossible error\n");
+	if (bh) {
+		if (buffer_uptodate(bh))
+			return bh;
+		ll_rw_block(READ, 1, &bh);
+		wait_on_buffer(bh);
+		if (buffer_uptodate(bh))
+			return bh;
+		brelse(bh);
 		return NULL;
 	}
-	if (buffer_uptodate(bh))
-		return bh;
-	ll_rw_block(READ, 1, &bh);
-	wait_on_buffer(bh);
-	if (buffer_uptodate(bh))
-		return bh;
-	brelse(bh);
+	printk("VFS: bread: impossible error\n");
 	return NULL;
 }
 
@@ -1308,7 +1311,7 @@
 	if (!async)
 		return NULL;
 
-	/* Uhhuh. We're _really_ low on memory. Now we just
+	/* We're _really_ low on memory. Now we just
 	 * wait for old buffer heads to become free due to
 	 * finishing IO.  Since this is an async request and
 	 * the reserve list is empty, we're sure there are 
diff -u --recursive --new-file v2.1.106/linux/fs/coda/Makefile linux/fs/coda/Makefile
--- v2.1.106/linux/fs/coda/Makefile	Thu May  7 22:51:52 1998
+++ linux/fs/coda/Makefile	Wed Jun 24 14:30:09 1998
@@ -1,5 +1,5 @@
 #
-# Makefile for the linux Coda-filesystem routines.
+# Makefile for the Linux Coda filesystem routines.
 #
 
 O_TARGET := coda.o
@@ -7,7 +7,7 @@
             symlink.o pioctl.o sysctl.o stats.o
 M_OBJS   := $(O_TARGET)
 
-# If you want debugging output, please uncomment the following line
+# If you want debugging output, please uncomment the following line.
 
 # EXTRA_CFLAGS += -DDEBUG -DDEBUG_SMB_MALLOC=1
 
diff -u --recursive --new-file v2.1.106/linux/fs/coda/dir.c linux/fs/coda/dir.c
--- v2.1.106/linux/fs/coda/dir.c	Sun Jun  7 11:16:36 1998
+++ linux/fs/coda/dir.c	Wed Jun 24 14:30:09 1998
@@ -100,7 +100,7 @@
 
 
 /* inode operations for directories */
-/* acces routines: lookup, readlink, permission */
+/* access routines: lookup, readlink, permission */
 static int coda_lookup(struct inode *dir, struct dentry *entry)
 {
         struct coda_inode_info *dircnp;
diff -u --recursive --new-file v2.1.106/linux/fs/coda/psdev.c linux/fs/coda/psdev.c
--- v2.1.106/linux/fs/coda/psdev.c	Sun Jun  7 11:16:36 1998
+++ linux/fs/coda/psdev.c	Wed Jun 17 05:10:33 1998
@@ -401,15 +401,7 @@
 
 #ifdef CONFIG_PROC_FS
 
-struct proc_dir_entry proc_sys_root = {
-        PROC_SYS, 3, "sys",                     /* inode, name */
-        S_IFDIR | S_IRUGO | S_IXUGO, 2, 0, 0,   /* mode, nlink, uid, gid */
-        0, &proc_dir_inode_operations,          /* size, ops */
-        NULL, NULL,                             /* get_info, fill_inode */
-        NULL,                                   /* next */
-        NULL, NULL                              /* parent, subdir */
-};
-
+extern struct proc_dir_entry proc_sys_root;
 
 struct proc_dir_entry proc_sys_coda = {
         0, 4, "coda",
diff -u --recursive --new-file v2.1.106/linux/fs/devpts/Makefile linux/fs/devpts/Makefile
--- v2.1.106/linux/fs/devpts/Makefile	Mon Apr  6 17:41:00 1998
+++ linux/fs/devpts/Makefile	Wed Jun 24 14:30:09 1998
@@ -1,5 +1,5 @@
 #
-# Makefile for the linux /dev/pts virtual filesystem.
+# Makefile for the Linux /dev/pts virtual filesystem.
 #
 
 O_TARGET := devpts.o
diff -u --recursive --new-file v2.1.106/linux/fs/dquot.c linux/fs/dquot.c
--- v2.1.106/linux/fs/dquot.c	Sun Jun  7 11:16:36 1998
+++ linux/fs/dquot.c	Wed Jun 24 14:30:09 1998
@@ -1,9 +1,9 @@
 /*
  * Implementation of the diskquota system for the LINUX operating
- * system. QUOTA is implemented using the BSD systemcall interface as
+ * system. QUOTA is implemented using the BSD system call interface as
  * the means of communication with the user level. Currently only the
- * ext2-filesystem has support for diskquotas. Other filesystems may
- * be added in future time. This file contains the generic routines
+ * ext2 filesystem has support for disk quotas. Other filesystems may
+ * be added in the future. This file contains the generic routines
  * called by the different filesystems on allocation of an inode or
  * block. These routines take care of the administration needed to
  * have a consistent diskquota tracking system. The ideas of both
@@ -713,7 +713,7 @@
 
 /*
  * Initialize a dquot-struct with new quota info. This is used by the
- * systemcall interface functions.
+ * system call interface functions.
  */ 
 static int set_dqblk(kdev_t dev, int id, short type, int flags, struct dqblk *dqblk)
 {
@@ -970,7 +970,7 @@
 	short cnt, disc;
 
 	/*
-	 * Find out if this filesystems uses i_blocks.
+	 * Find out if this filesystem uses i_blocks.
 	 */
 	if (inode->i_blksize == 0)
 		blocks = isize_to_blocks(inode->i_size, BLOCK_SIZE);
@@ -1214,10 +1214,10 @@
 }
 
 /*
- * Ok this is the systemcall interface, this communicates with
- * the userlevel programs. Currently this only supports diskquota
- * calls. Maybe we need to add the process quotas etc in the future.
- * But we probably better use rlimits for that.
+ * This is the system call interface. This communicates with
+ * the user-level programs. Currently this only supports diskquota
+ * calls. Maybe we need to add the process quotas etc. in the future,
+ * but we probably should use rlimits for that.
  */
 asmlinkage int sys_quotactl(int cmd, const char *special, int id, caddr_t addr)
 {
diff -u --recursive --new-file v2.1.106/linux/fs/ext2/truncate.c linux/fs/ext2/truncate.c
--- v2.1.106/linux/fs/ext2/truncate.c	Thu Mar 26 15:57:04 1998
+++ linux/fs/ext2/truncate.c	Tue Jun 23 09:23:49 1998
@@ -14,6 +14,8 @@
  *
  *  Big-endian to little-endian byte-swapping/bitmaps by
  *        David S. Miller (davem@caip.rutgers.edu), 1995
+ *
+ *  General cleanup and race fixes, wsh, 1998
  */
 
 /*
@@ -47,6 +49,22 @@
 #endif
 
 /*
+ * Macros to return the block number for the inode size and offset.
+ * Currently we always hold the inode semaphore during truncate, so
+ * there's no need to test for changes during the operation.
+ */
+#define DIRECT_BLOCK(inode) \
+	((inode->i_size + inode->i_sb->s_blocksize - 1) / \
+			  inode->i_sb->s_blocksize)
+#define INDIRECT_BLOCK(inode,offset) ((int)DIRECT_BLOCK(inode) - offset)
+#define DINDIRECT_BLOCK(inode,offset) \
+	(INDIRECT_BLOCK(inode,offset) / addr_per_block)
+#define TINDIRECT_BLOCK(inode,offset) \
+	(INDIRECT_BLOCK(inode,offset) / (addr_per_block*addr_per_block))
+
+static u32 le32_zero = cpu_to_le32(0);
+
+/*
  * Truncate has the most races in the whole filesystem: coding it is
  * a pain in the a**. Especially as I don't do any locking...
  *
@@ -57,53 +75,136 @@
  *
  * The new code handles normal truncates (size = 0) as well as the more
  * general case (size = XXX). I hope.
+ *
+ *
+ * Truncate operations have been rewritten to avoid various races. The
+ * previous code was allowing blocking operations to precede a call to
+ * bforget(), possible allowing the buffer to be used again.
+ *
+ * We now ensure that b_count == 1 before calling bforget() and that the
+ * parent buffer (if any) is unlocked before clearing the block pointer.
+ * The operations are always performed in this order:
+ *	(1) Make sure that the parent buffer is unlocked.
+ *	(2) Use find_buffer() to find the block buffer without blocking,
+ *	    and set 'retry' if the buffer is locked or b_count > 1.
+ *	(3) Clear the block pointer in the parent (buffer or inode).
+ *	(4) Update the inode block count and mark the inode dirty.
+ *	(5) Forget the block buffer, if any. This call won't block, as
+ *	    we know the buffer is unlocked from (2).
+ *	(6) If the block pointer is in a (parent) buffer, mark the buffer
+ *	    dirty. (Note that this can block on a loop device.)
+ *	(7) Accumulate the blocks to free and/or update the block bitmap.
+ *	    (This operation will frequently block.)
+ *
+ * The requirement that parent buffers be unlocked follows from the general
+ * principle of not modifying a buffer that may be undergoing I/O. With the
+ * the present kernels there's no problem with modifying a locked inode, as
+ * the I_DIRTY bit is cleared before setting I_LOCK.
+ *		-- WSH, 1998
+ */
+
+/*
+ * Check whether any of the slots in an indirect block are
+ * still in use, and if not free the block.
  */
+static int check_block_empty(struct inode *inode, struct buffer_head *bh,
+				u32 *p, struct buffer_head *ind_bh)
+{
+	int addr_per_block = EXT2_ADDR_PER_BLOCK(inode->i_sb);
+	u32 * ind = (u32 *) bh->b_data;
+	int i, retry;
+
+	/* Make sure both buffers are unlocked */
+	do {
+		retry = 0;
+		if (buffer_locked(bh)) {
+			__wait_on_buffer(bh);
+			retry = 1;
+		}
+		if (ind_bh && buffer_locked(ind_bh)) {
+			__wait_on_buffer(ind_bh);
+			retry = 1;
+		}
+	} while (retry);
+
+	for (i = 0; i < addr_per_block; i++)
+		if (le32_to_cpu(*(ind++)))
+			goto in_use;
+
+	if (bh->b_count == 1) {
+		int tmp;
+		if (ind_bh) {
+			tmp = le32_to_cpu(*p);
+			*p = le32_zero;
+		} else {
+			tmp = *p;
+			*p = 0;
+		}
+		inode->i_blocks -= (inode->i_sb->s_blocksize / 512);
+		mark_inode_dirty(inode);
+		/*
+		 * Forget the buffer, then mark the parent buffer dirty.
+		 */
+		bforget(bh);
+		if (ind_bh)
+			mark_buffer_dirty(ind_bh, 1);
+		ext2_free_blocks (inode, tmp, 1);
+		goto out;
+	}
+	retry = 1;
+
+in_use:
+	if (IS_SYNC(inode) && buffer_dirty(bh)) {
+		ll_rw_block (WRITE, 1, &bh);
+		wait_on_buffer (bh);
+	}
+	brelse (bh);
+
+out:
+	return retry;
+}
 
 static int trunc_direct (struct inode * inode)
 {
-	u32 * p;
-	int i, tmp;
 	struct buffer_head * bh;
-	unsigned long block_to_free = 0;
-	unsigned long free_count = 0;
-	int retry = 0;
+	int i, retry = 0;
+	unsigned long block_to_free = 0, free_count = 0;
 	int blocks = inode->i_sb->s_blocksize / 512;
-#define DIRECT_BLOCK ((inode->i_size + inode->i_sb->s_blocksize - 1) / \
-			inode->i_sb->s_blocksize)
-	int direct_block = DIRECT_BLOCK;
+	int direct_block = DIRECT_BLOCK(inode);
 
-repeat:
 	for (i = direct_block ; i < EXT2_NDIR_BLOCKS ; i++) {
-		p = inode->u.ext2_i.i_data + i;
-		tmp = *p;
+		u32 * p = inode->u.ext2_i.i_data + i;
+		int tmp = *p;
+
 		if (!tmp)
 			continue;
-		bh = get_hash_table (inode->i_dev, tmp,
-				     inode->i_sb->s_blocksize);
-		if (i < direct_block) {
-			brelse (bh);
-			goto repeat;
-		}
-		if ((bh && bh->b_count != 1) || tmp != *p) {
-			retry = 1;
-			brelse (bh);
-			continue;
+
+		bh = find_buffer(inode->i_dev, tmp, inode->i_sb->s_blocksize);
+		if (bh) {
+			bh->b_count++;
+			if(bh->b_count != 1 || buffer_locked(bh)) {
+				brelse(bh);
+				retry = 1;
+				continue;
+			}
 		}
+
 		*p = 0;
 		inode->i_blocks -= blocks;
 		mark_inode_dirty(inode);
 		bforget(bh);
-		if (free_count == 0) {
-			block_to_free = tmp;
-			free_count++;
-		} else if (free_count > 0 && block_to_free == tmp - free_count)
+
+		/* accumulate blocks to free if they're contiguous */
+		if (free_count == 0)
+			goto free_this;
+		else if (block_to_free == tmp - free_count)
 			free_count++;
 		else {
 			ext2_free_blocks (inode, block_to_free, free_count);
+		free_this:
 			block_to_free = tmp;
 			free_count = 1;
 		}
-/*		ext2_free_blocks (inode, tmp, 1); */
 	}
 	if (free_count > 0)
 		ext2_free_blocks (inode, block_to_free, free_count);
@@ -111,174 +212,146 @@
 }
 
 static int trunc_indirect (struct inode * inode, int offset, u32 * p,
-			   int in_inode)
+			struct buffer_head *dind_bh)
 {
-	int i, tmp;
-	struct buffer_head * bh;
 	struct buffer_head * ind_bh;
-	u32 * ind;
-	unsigned long block_to_free = 0;
-	unsigned long free_count = 0;
-	int retry = 0;
-	int addr_per_block = EXT2_ADDR_PER_BLOCK(inode->i_sb);
-	int blocks = inode->i_sb->s_blocksize / 512;
-#define INDIRECT_BLOCK ((int)DIRECT_BLOCK - offset)
-	int indirect_block = INDIRECT_BLOCK;
+	int i, tmp, retry = 0;
+	unsigned long block_to_free = 0, free_count = 0;
+	int indirect_block, addr_per_block, blocks;
 
-	tmp = in_inode ? *p : le32_to_cpu(*p);
+	tmp = dind_bh ? le32_to_cpu(*p) : *p;
 	if (!tmp)
 		return 0;
 	ind_bh = bread (inode->i_dev, tmp, inode->i_sb->s_blocksize);
-	if (tmp != (in_inode ? *p : le32_to_cpu(*p))) {
+	if (tmp != (dind_bh ? le32_to_cpu(*p) : *p)) {
 		brelse (ind_bh);
 		return 1;
 	}
+	/* A read failure? Report error and clear slot (should be rare). */ 
 	if (!ind_bh) {
-		*p = in_inode ? 0 : cpu_to_le32(0);
+		ext2_error(inode->i_sb, "trunc_indirect",
+			"Read failure, inode=%ld, block=%d",
+			inode->i_ino, tmp);
+		if (dind_bh) {
+			*p = le32_zero;
+			mark_buffer_dirty(dind_bh, 1);
+		} else {
+			*p = 0;
+			mark_inode_dirty(inode);
+		}
 		return 0;
 	}
-repeat:
+
+	blocks = inode->i_sb->s_blocksize / 512;
+	addr_per_block = EXT2_ADDR_PER_BLOCK(inode->i_sb);
+	indirect_block = INDIRECT_BLOCK(inode, offset);
+	if (indirect_block < 0)
+		indirect_block = 0;
 	for (i = indirect_block ; i < addr_per_block ; i++) {
-		if (i < 0)
-			i = 0;
-		if (i < indirect_block)
-			goto repeat;
-		ind = i + (u32 *) ind_bh->b_data;
+		u32 * ind = i + (u32 *) ind_bh->b_data;
+		struct buffer_head * bh;
+
+		wait_on_buffer(ind_bh);
 		tmp = le32_to_cpu(*ind);
 		if (!tmp)
 			continue;
-		bh = get_hash_table (inode->i_dev, tmp,
-				     inode->i_sb->s_blocksize);
-		if (i < indirect_block) {
-			brelse (bh);
-			goto repeat;
+		/*
+		 * Use find_buffer so we don't block here.
+		 */
+		bh = find_buffer(inode->i_dev, tmp, inode->i_sb->s_blocksize);
+		if (bh) {
+			bh->b_count++;
+			if (bh->b_count != 1 || buffer_locked(bh)) {
+				brelse (bh);
+				retry = 1;
+				continue;
+			}
 		}
-		if ((bh && bh->b_count != 1) || tmp != le32_to_cpu(*ind)) {
-			retry = 1;
-			brelse (bh);
-			continue;
-		}
-		*ind = cpu_to_le32(0);
-		mark_buffer_dirty(ind_bh, 1);
+
+		*ind = le32_zero;
+		inode->i_blocks -= blocks;
+		mark_inode_dirty(inode);
 		bforget(bh);
-		if (free_count == 0) {
-			block_to_free = tmp;
-			free_count++;
-		} else if (free_count > 0 && block_to_free == tmp - free_count)
+		mark_buffer_dirty(ind_bh, 1);
+
+		/* accumulate blocks to free if they're contiguous */
+		if (free_count == 0)
+			goto free_this;
+		else if (block_to_free == tmp - free_count)
 			free_count++;
 		else {
 			ext2_free_blocks (inode, block_to_free, free_count);
+		free_this:
 			block_to_free = tmp;
 			free_count = 1;
 		}
-/*		ext2_free_blocks (inode, tmp, 1); */
-		inode->i_blocks -= blocks;
-		mark_inode_dirty(inode);
 	}
 	if (free_count > 0)
 		ext2_free_blocks (inode, block_to_free, free_count);
-	ind = (u32 *) ind_bh->b_data;
-	for (i = 0; i < addr_per_block; i++)
-		if (le32_to_cpu(*(ind++)))
-			break;
-	if (i >= addr_per_block) {
-		if (ind_bh->b_count != 1)
-			retry = 1;
-		else {
-			tmp = in_inode ? *p : le32_to_cpu(*p);
-			*p = in_inode ? 0 : cpu_to_le32(0);
-			inode->i_blocks -= blocks;
-			mark_inode_dirty(inode);
-			ext2_free_blocks (inode, tmp, 1);
-			bforget(ind_bh);
-			ind_bh = NULL;
-		}
-	}
-	if (IS_SYNC(inode) && ind_bh && buffer_dirty(ind_bh)) {
-		ll_rw_block (WRITE, 1, &ind_bh);
-		wait_on_buffer (ind_bh);
-	}
-	brelse (ind_bh);
+	/*
+	 * Check the block and dispose of the ind_bh buffer.
+	 */
+	retry |= check_block_empty(inode, ind_bh, p, dind_bh);
+
 	return retry;
 }
 
-static int trunc_dindirect (struct inode * inode, int offset,
-			    u32 * p, int in_inode)
+static int trunc_dindirect (struct inode * inode, int offset, u32 * p,
+			struct buffer_head * tind_bh)
 {
-	int i, tmp;
 	struct buffer_head * dind_bh;
-	u32 * dind;
-	int retry = 0;
-	int addr_per_block = EXT2_ADDR_PER_BLOCK(inode->i_sb);
-	int blocks = inode->i_sb->s_blocksize / 512;
-#define DINDIRECT_BLOCK (((int)DIRECT_BLOCK - offset) / addr_per_block)
-	int dindirect_block = DINDIRECT_BLOCK;
+	int i, tmp, retry = 0;
+	int dindirect_block, addr_per_block;
 
-	tmp = in_inode ? *p : le32_to_cpu(*p);
+	tmp = tind_bh ? le32_to_cpu(*p) : *p;
 	if (!tmp)
 		return 0;
 	dind_bh = bread (inode->i_dev, tmp, inode->i_sb->s_blocksize);
-	if (tmp != (in_inode ? *p : le32_to_cpu(*p))) {
+	if (tmp != (tind_bh ? le32_to_cpu(*p) : *p)) {
 		brelse (dind_bh);
 		return 1;
 	}
+	/* A read failure? Report error and clear slot (should be rare). */ 
 	if (!dind_bh) {
-		*p = in_inode ? 0 : cpu_to_le32(0);
-		return 0;
-	}
-repeat:
-	for (i = dindirect_block ; i < addr_per_block ; i++) {
-		if (i < 0)
-			i = 0;
-		if (i < dindirect_block)
-			goto repeat;
-		dind = i + (u32 *) dind_bh->b_data;
-		tmp = le32_to_cpu(*dind);
-		if (!tmp)
-			continue;
-		retry |= trunc_indirect(inode, offset + (i * addr_per_block),
-					dind, 0);
-		mark_buffer_dirty(dind_bh, 1);
-	}
-	dind = (u32 *) dind_bh->b_data;
-	for (i = 0; i < addr_per_block; i++)
-		if (le32_to_cpu(*(dind++)))
-			break;
-	if (i >= addr_per_block) {
-		if (dind_bh->b_count != 1)
-			retry = 1;
-		else {
-			tmp = in_inode ? *p : le32_to_cpu(*p);
-			*p = in_inode ? 0 : cpu_to_le32(0);
-			inode->i_blocks -= blocks;
+		ext2_error(inode->i_sb, "trunc_dindirect",
+			"Read failure, inode=%ld, block=%d",
+			inode->i_ino, tmp);
+		if (tind_bh) {
+			*p = le32_zero;
+			mark_buffer_dirty(tind_bh, 1);
+		} else {
+			*p = 0;
 			mark_inode_dirty(inode);
-			ext2_free_blocks (inode, tmp, 1);
-			bforget(dind_bh);
-			dind_bh = 0;
 		}
+		return 0;
 	}
-	if (IS_SYNC(inode) && dind_bh && buffer_dirty(dind_bh)) {
-		ll_rw_block (WRITE, 1, &dind_bh);
-		wait_on_buffer (dind_bh);
+
+	addr_per_block = EXT2_ADDR_PER_BLOCK(inode->i_sb);
+	dindirect_block = DINDIRECT_BLOCK(inode, offset);
+	if (dindirect_block < 0)
+		dindirect_block = 0;
+	for (i = dindirect_block ; i < addr_per_block ; i++) {
+		u32 * dind = i + (u32 *) dind_bh->b_data;
+
+		retry |= trunc_indirect(inode,
+					offset + (i * addr_per_block),
+					dind, dind_bh);
 	}
-	brelse (dind_bh);
+	/*
+	 * Check the block and dispose of the dind_bh buffer.
+	 */
+	retry |= check_block_empty(inode, dind_bh, p, tind_bh);
+
 	return retry;
 }
 
 static int trunc_tindirect (struct inode * inode)
 {
-	int i, tmp;
+	u32 * p = inode->u.ext2_i.i_data + EXT2_TIND_BLOCK;
 	struct buffer_head * tind_bh;
-	u32 * tind, * p;
-	int retry = 0;
-	int addr_per_block = EXT2_ADDR_PER_BLOCK(inode->i_sb);
-	int blocks = inode->i_sb->s_blocksize / 512;
-#define TINDIRECT_BLOCK (((int)DIRECT_BLOCK - (addr_per_block * addr_per_block + \
-			  addr_per_block + EXT2_NDIR_BLOCKS)) / \
-			  (addr_per_block * addr_per_block))
-	int tindirect_block = TINDIRECT_BLOCK;
+	int i, tmp, retry = 0;
+	int tindirect_block, addr_per_block, offset;
 
-	p = inode->u.ext2_i.i_data + EXT2_TIND_BLOCK;
 	if (!(tmp = *p))
 		return 0;
 	tind_bh = bread (inode->i_dev, tmp, inode->i_sb->s_blocksize);
@@ -286,53 +359,40 @@
 		brelse (tind_bh);
 		return 1;
 	}
+	/* A read failure? Report error and clear slot (should be rare). */ 
 	if (!tind_bh) {
+		ext2_error(inode->i_sb, "trunc_tindirect",
+			"Read failure, inode=%ld, block=%d",
+			inode->i_ino, tmp);
 		*p = 0;
+		mark_inode_dirty(inode);
 		return 0;
 	}
-repeat:
+
+	addr_per_block = EXT2_ADDR_PER_BLOCK(inode->i_sb);
+	offset = EXT2_NDIR_BLOCKS + addr_per_block + 
+		(addr_per_block * addr_per_block);
+	tindirect_block = TINDIRECT_BLOCK(inode, offset);
+	if (tindirect_block < 0)
+		tindirect_block = 0;
 	for (i = tindirect_block ; i < addr_per_block ; i++) {
-		if (i < 0)
-			i = 0;
-		if (i < tindirect_block)
-			goto repeat;
-		tind = i + (u32 *) tind_bh->b_data;
-		retry |= trunc_dindirect(inode, EXT2_NDIR_BLOCKS +
-			 addr_per_block + (i + 1) * addr_per_block * addr_per_block,
-			 tind, 0);
-		mark_buffer_dirty(tind_bh, 1);
-	}
-	tind = (u32 *) tind_bh->b_data;
-	for (i = 0; i < addr_per_block; i++)
-		if (le32_to_cpu(*(tind++)))
-			break;
-	if (i >= addr_per_block) {
-		if (tind_bh->b_count != 1)
-			retry = 1;
-		else {
-			tmp = *p;
-			*p = 0;
-			inode->i_blocks -= blocks;
-			mark_inode_dirty(inode);
-			ext2_free_blocks (inode, tmp, 1);
-			bforget(tind_bh);
-			tind_bh = 0;
-		}
-	}
-	if (IS_SYNC(inode) && tind_bh && buffer_dirty(tind_bh)) {
-		ll_rw_block (WRITE, 1, &tind_bh);
-		wait_on_buffer (tind_bh);
+		u32 * tind = i + (u32 *) tind_bh->b_data;
+
+		retry |= trunc_dindirect(inode,
+				offset + (i * addr_per_block * addr_per_block),
+				tind, tind_bh);
 	}
-	brelse (tind_bh);
+	/*
+	 * Check the block and dispose of the tind_bh buffer.
+	 */
+	retry |= check_block_empty(inode, tind_bh, p, NULL);
+
 	return retry;
 }
 		
 void ext2_truncate (struct inode * inode)
 {
-	int retry;
-	struct buffer_head * bh;
-	int err;
-	int offset;
+	int err, offset, retry;
 
 	if (!(S_ISREG(inode->i_mode) || S_ISDIR(inode->i_mode) ||
 	    S_ISLNK(inode->i_mode)))
@@ -342,11 +402,14 @@
 	ext2_discard_prealloc(inode);
 	while (1) {
 		retry = trunc_direct(inode);
-		retry |= trunc_indirect (inode, EXT2_IND_BLOCK,
-			(u32 *) &inode->u.ext2_i.i_data[EXT2_IND_BLOCK], 1);
-		retry |= trunc_dindirect (inode, EXT2_IND_BLOCK +
-			EXT2_ADDR_PER_BLOCK(inode->i_sb),
-			(u32 *) &inode->u.ext2_i.i_data[EXT2_DIND_BLOCK], 1);
+		retry |= trunc_indirect (inode, 
+				EXT2_IND_BLOCK,
+				(u32 *) &inode->u.ext2_i.i_data[EXT2_IND_BLOCK],
+				NULL);
+		retry |= trunc_dindirect (inode,
+				EXT2_IND_BLOCK+EXT2_ADDR_PER_BLOCK(inode->i_sb),
+				(u32 *)&inode->u.ext2_i.i_data[EXT2_DIND_BLOCK],
+				NULL);
 		retry |= trunc_tindirect (inode);
 		if (!retry)
 			break;
@@ -357,12 +420,13 @@
 	}
 	/*
 	 * If the file is not being truncated to a block boundary, the
-	 * contents of the partial block following the end of the file must be
-	 * zeroed in case it ever becomes accessible again because of
-	 * subsequent file growth.
+	 * contents of the partial block following the end of the file
+	 * must be zeroed in case it ever becomes accessible again due
+	 * to subsequent file growth.
 	 */
 	offset = inode->i_size & (inode->i_sb->s_blocksize - 1);
 	if (offset) {
+		struct buffer_head * bh;
 		bh = ext2_bread (inode,
 				 inode->i_size >> EXT2_BLOCK_SIZE_BITS(inode->i_sb),
 				 0, &err);
diff -u --recursive --new-file v2.1.106/linux/fs/fat/Makefile linux/fs/fat/Makefile
--- v2.1.106/linux/fs/fat/Makefile	Thu Jan  8 14:02:41 1998
+++ linux/fs/fat/Makefile	Wed Jun 24 14:30:09 1998
@@ -1,11 +1,11 @@
 #
-# Makefile for the linux fat-filesystem support.
+# Makefile for the Linux fat filesystem support.
 #
 # Note! Dependencies are done automagically by 'make dep', which also
 # removes any old dependencies. DON'T put your own dependencies here
-# unless it's something special (ie not a .c file).
+# unless it's something special (not a .c file).
 #
-# Note 2! The CFLAGS definitions are now in the main makefile...
+# Note 2! The CFLAGS definitions are now in the main makefile.
 
 O_TARGET := fat.o
 O_OBJS   := buffer.o cache.o dir.o file.o inode.o misc.o mmap.o tables.o cvf.o
diff -u --recursive --new-file v2.1.106/linux/fs/fat/buffer.c linux/fs/fat/buffer.c
--- v2.1.106/linux/fs/fat/buffer.c	Fri Jan 23 18:10:32 1998
+++ linux/fs/fat/buffer.c	Wed Jun 24 14:30:09 1998
@@ -53,7 +53,7 @@
 				 * larger hardware sector size. This allows for higher
 				 * capacity.
 
-				 * Most of the time, the MsDOS file system that sit
+				 * Most of the time, the MS-DOS filesystem that sits
 				 * on this device is totally unaligned. It use logically
 				 * 512 bytes sector size, with logical sector starting
 				 * in the middle of a hardware block. The bad news is
diff -u --recursive --new-file v2.1.106/linux/fs/fat/dir.c linux/fs/fat/dir.c
--- v2.1.106/linux/fs/fat/dir.c	Fri Jan 23 18:10:32 1998
+++ linux/fs/fat/dir.c	Wed Jun 24 14:30:09 1998
@@ -51,7 +51,7 @@
 };
 
 /*
- * Convert Unicode 16 to UTF8, translated unicode, or ascii.
+ * Convert Unicode 16 to UTF8, translated Unicode, or ASCII.
  * If uni_xlate is enabled and we
  * can't get a 1:1 conversion, use a colon as an escape character since
  * it is normally invalid on the vfat filesystem.  The following three
diff -u --recursive --new-file v2.1.106/linux/fs/fat/file.c linux/fs/fat/file.c
--- v2.1.106/linux/fs/fat/file.c	Tue Mar 10 10:03:33 1998
+++ linux/fs/fat/file.c	Wed Jun 24 14:30:09 1998
@@ -86,7 +86,7 @@
 /* #Specification: msdos / special devices / swap file
 	Swap file can't work on special devices with a large sector
 	size (1024 bytes hard sector). Those devices have a weird
-	MsDOS filesystem layout. Generally a single hardware sector
+	MS-DOS filesystem layout. Generally a single hardware sector
 	may contain 2 unrelated logical sector. This mean that there is
 	no easy way to do a mapping between disk sector of a file and virtual
 	memory. So swap file is difficult (not available right now)
@@ -236,8 +236,8 @@
 		to_reada = count_max / SECTOR_SIZE;
 		if (count_max & (SECTOR_SIZE-1)) to_reada++;
 		if (filp->f_reada || !MSDOS_I(inode)->i_binary){
-			/* Doing a read ahead on ascii file make sure we always */
-			/* pre read enough, since we don't know how many blocks */
+			/* Doing a read ahead on ASCII file make sure we always */
+			/* read enough, since we don't know how many blocks */
 			/* we really need */
 			int ahead = read_ahead[MAJOR(inode->i_dev)];
 			PRINTK (("to_reada %d ahead %d\n",to_reada,ahead));
diff -u --recursive --new-file v2.1.106/linux/fs/filesystems.c linux/fs/filesystems.c
--- v2.1.106/linux/fs/filesystems.c	Tue Jun 23 10:01:24 1998
+++ linux/fs/filesystems.c	Mon Jun 15 00:18:19 1998
@@ -144,10 +144,6 @@
 	init_adfs_fs();
 #endif
 
-#ifdef CONFIG_ADFS_FS
-	init_adfs_fs();
-#endif
-
 #ifdef CONFIG_DEVPTS_FS
 	init_devpts_fs();
 #endif
diff -u --recursive --new-file v2.1.106/linux/fs/hfs/ChangeLog linux/fs/hfs/ChangeLog
--- v2.1.106/linux/fs/hfs/ChangeLog	Sun Jun  7 11:16:36 1998
+++ linux/fs/hfs/ChangeLog	Wed Jun 24 14:30:10 1998
@@ -376,7 +376,7 @@
 	  dir.c, brec.c, btree.c, bitmap.c, bnode.c, bdelete.c, bins_del.c,
 	  binsert.c, Makefile, TODO, balloc.c:
 	First shot at portability to the DEC Alpha and non-gcc compilers.
-	This invloved a significant overhaul of the type system.
+	This involved a significant overhaul of the type system.
 
 Tue Feb  4 04:26:54 1997  Paul H. Hargrove  <hargrove@sccm.stanford.edu>
 
@@ -2346,7 +2346,7 @@
 	More code reorganization to abstract the btree operations.
 	Added the fork= mount option.
 	Added AppleDouble support.  Executor, from ARDI, can now run programs
-		from HFS filesystems mounted w/ the HFS module.
+		from HFS filesystems mounted with the HFS module.
 
 Jan 28, 1995: version 0.3 hargrove@sccm.stanford.edu (Paul H. Hargrove)
 	Major code reorganization.
diff -u --recursive --new-file v2.1.106/linux/fs/hfs/FAQ.txt linux/fs/hfs/FAQ.txt
--- v2.1.106/linux/fs/hfs/FAQ.txt	Sun Jan  4 10:40:17 1998
+++ linux/fs/hfs/FAQ.txt	Wed Jun 24 14:30:10 1998
@@ -42,7 +42,7 @@
 
   14.     In what ways can I write to HFS filesystems?
 
-  15.     Does the HFS filesystem work with 400k or 800k Macintosh
+  15.     Does the HFS filesystem work with 400 kB or 800 kB Macintosh
   diskettes?
 
   16.     How can I format an HFS filesystem?
diff -u --recursive --new-file v2.1.106/linux/fs/hfs/Makefile linux/fs/hfs/Makefile
--- v2.1.106/linux/fs/hfs/Makefile	Tue Mar 17 22:18:15 1998
+++ linux/fs/hfs/Makefile	Wed Jun 24 14:30:10 1998
@@ -1,11 +1,11 @@
 #
-# Makefile for the linux hfs-filesystem routines.
+# Makefile for the Linux hfs filesystem routines.
 #
 # Note! Dependencies are done automagically by 'make dep', which also
 # removes any old dependencies. DON'T put your own dependencies here
-# unless it's something special (ie not a .c file).
+# unless it's something special (not a .c file).
 #
-# Note 2! The CFLAGS definitions are now in the main makefile...
+# Note 2! The CFLAGS definitions are now in the main makefile.
 
 O_TARGET := hfs.o
 O_OBJS   := balloc.o bdelete.o bfind.o bins_del.o binsert.o bitmap.o bitops.o \
diff -u --recursive --new-file v2.1.106/linux/fs/hpfs/Makefile linux/fs/hpfs/Makefile
--- v2.1.106/linux/fs/hpfs/Makefile	Tue Aug 15 05:07:02 1995
+++ linux/fs/hpfs/Makefile	Wed Jun 24 14:30:10 1998
@@ -1,11 +1,11 @@
 #
-# Makefile for the linux HPFS filesystem routines.
+# Makefile for the Linux HPFS filesystem routines.
 #
 # Note! Dependencies are done automagically by 'make dep', which also
 # removes any old dependencies. DON'T put your own dependencies here
-# unless it's something special (ie not a .c file).
+# unless it's something special (not a .c file).
 #
-# Note 2! The CFLAGS definitions are now in the main makefile...
+# Note 2! The CFLAGS definitions are now in the main makefile.
 
 O_TARGET := hpfs.o
 O_OBJS   := hpfs_fs.o hpfs_caps.o
diff -u --recursive --new-file v2.1.106/linux/fs/hpfs/hpfs.h linux/fs/hpfs/hpfs.h
--- v2.1.106/linux/fs/hpfs/hpfs.h	Wed Apr  5 02:59:50 1995
+++ linux/fs/hpfs/hpfs.h	Wed Jun 24 14:30:10 1998
@@ -348,11 +348,11 @@
   } u;
 };
 
-/* fnode: root of allocation b+ tree, and EA's */
+/* fnode: root of allocation b+ tree, and EAs */
 
 /* Every file and every directory has one fnode, pointed to by the directory
-   entry and pointing to the file's sectors or directory's root dnode.  EA's
-   are also stored here, and there are said to be ACL's somewhere here too. */
+   entry and pointing to the file's sectors or directory's root dnode.  EAs
+   are also stored here, and there are said to be ACLs somewhere here too. */
 
 #define FNODE_MAGIC 0xf7e40aae
 
@@ -392,12 +392,12 @@
   } u;
 
   unsigned file_size;			/* file length, bytes */
-  unsigned n_needea;			/* number of EA's with NEEDEA set */
+  unsigned n_needea;			/* number of EAs with NEEDEA set */
   unsigned zero4[4];
   unsigned ea_offs;			/* offset from start of fnode
 					   to first fnode-resident ea */
   unsigned zero5[2];
-  unsigned char ea[316];		/* zero or more EA's, packed together
+  unsigned char ea[316];		/* zero or more EAs, packed together
 					   with no alignment padding.
 					   (Do not use this name, get here
 					   via fnode + ea_offs. I think.) */
@@ -454,7 +454,7 @@
   unsigned char namelen;		/* length of name, bytes */
   unsigned short valuelen;		/* length of value, bytes */
   /*
-    unsigned char name[namelen];	ascii attrib name
+    unsigned char name[namelen];	ASCII attrib name
     unsigned char nul;			terminating '\0', not counted
     unsigned char value[valuelen];	value, arbitrary
       if this.indirect, valuelen is 8 and the value is
diff -u --recursive --new-file v2.1.106/linux/fs/inode.c linux/fs/inode.c
--- v2.1.106/linux/fs/inode.c	Fri May  8 23:14:53 1998
+++ linux/fs/inode.c	Wed Jun 24 14:30:10 1998
@@ -596,9 +596,9 @@
 	}
 
 	/*
-	 * Uhhuh.. We need to expand. Note that "grow_inodes()" will
-	 * release the spinlock, but will return with the lock held
-	 * again if the allocation succeeded.
+	 * We need to expand. Note that "grow_inodes()" will
+	 * release the spinlock, but will return with the lock 
+	 * held again if the allocation succeeded.
 	 */
 	inode = grow_inodes();
 	if (inode) {
diff -u --recursive --new-file v2.1.106/linux/fs/ioctl.c linux/fs/ioctl.c
--- v2.1.106/linux/fs/ioctl.c	Tue Mar 10 10:03:34 1998
+++ linux/fs/ioctl.c	Wed Jun 24 14:30:10 1998
@@ -71,7 +71,7 @@
 				break;
 			flag = O_NONBLOCK;
 #ifdef __sparc__
-			/* SunOS compatability item. */
+			/* SunOS compatibility item. */
 			if(O_NONBLOCK != O_NDELAY)
 				flag |= O_NDELAY;
 #endif
diff -u --recursive --new-file v2.1.106/linux/fs/isofs/Makefile linux/fs/isofs/Makefile
--- v2.1.106/linux/fs/isofs/Makefile	Thu Oct 23 14:00:15 1997
+++ linux/fs/isofs/Makefile	Wed Jun 24 14:30:10 1998
@@ -1,11 +1,11 @@
 #
-# Makefile for the linux isofs-filesystem routines.
+# Makefile for the Linux isofs filesystem routines.
 #
 # Note! Dependencies are done automagically by 'make dep', which also
 # removes any old dependencies. DON'T put your own dependencies here
-# unless it's something special (ie not a .c file).
+# unless it's something special (not a .c file).
 #
-# Note 2! The CFLAGS definitions are now in the main makefile...
+# Note 2! The CFLAGS definitions are now in the main makefile.
 
 O_TARGET := isofs.o
 O_OBJS   := namei.o inode.o file.o dir.o util.o rock.o symlink.o
diff -u --recursive --new-file v2.1.106/linux/fs/isofs/dir.c linux/fs/isofs/dir.c
--- v2.1.106/linux/fs/isofs/dir.c	Tue Jun 23 10:01:25 1998
+++ linux/fs/isofs/dir.c	Wed Jun 24 14:30:10 1998
@@ -1,7 +1,7 @@
 /*
  *  linux/fs/isofs/dir.c
  *
- *  (C) 1992, 1993, 1994  Eric Youngdale Modified for ISO9660 filesystem.
+ *  (C) 1992, 1993, 1994  Eric Youngdale Modified for ISO 9660 filesystem.
  *
  *  (C) 1991  Linus Torvalds - minix filesystem
  *
@@ -74,7 +74,7 @@
 		if (c >= 'A' && c <= 'Z')
 			c |= 0x20;	/* lower case */
 
-		/* Drop trailing '.;1' (ISO9660:1988 7.5.1 requires period) */
+		/* Drop trailing '.;1' (ISO 9660:1988 7.5.1 requires period) */
 		if (c == '.' && i == len - 3 && old[i + 1] == ';' && old[i + 2] == '1')
 			break;
 
diff -u --recursive --new-file v2.1.106/linux/fs/isofs/file.c linux/fs/isofs/file.c
--- v2.1.106/linux/fs/isofs/file.c	Tue Jul  8 19:36:45 1997
+++ linux/fs/isofs/file.c	Wed Jun 24 14:30:10 1998
@@ -1,7 +1,7 @@
 /*
  *  linux/fs/isofs/file.c
  *
- *  (C) 1992, 1993, 1994  Eric Youngdale Modified for ISO9660 filesystem.
+ *  (C) 1992, 1993, 1994  Eric Youngdale Modified for ISO 9660 filesystem.
  *
  *  (C) 1991  Linus Torvalds - minix filesystem
  *
@@ -19,7 +19,7 @@
 #include <linux/iso_fs.h>
 
 /*
- * We have mostly NULL's here: the current defaults are ok for
+ * We have mostly NULLs here: the current defaults are OK for
  * the isofs filesystem.
  */
 static struct file_operations isofs_file_operations = {
diff -u --recursive --new-file v2.1.106/linux/fs/isofs/inode.c linux/fs/isofs/inode.c
--- v2.1.106/linux/fs/isofs/inode.c	Tue Jun 23 10:01:25 1998
+++ linux/fs/isofs/inode.c	Wed Jun 24 14:30:10 1998
@@ -2,11 +2,11 @@
  *  linux/fs/isofs/inode.c
  *
  *  (C) 1991  Linus Torvalds - minix filesystem
- *      1992, 1993, 1994  Eric Youngdale Modified for ISO9660 filesystem.
+ *      1992, 1993, 1994  Eric Youngdale Modified for ISO 9660 filesystem.
  *      1994  Eberhard Moenkeberg - multi session handling.
  *      1995  Mark Dobie - allow mounting of some weird VideoCDs and PhotoCDs.
  *	1997  Gordon Chaffee - Joliet CDs
- *	1998  Eric Lammerts - ISO9660 Level 3
+ *	1998  Eric Lammerts - ISO 9660 Level 3
  */
 
 #include <linux/config.h>
@@ -374,7 +374,7 @@
 			    } else if (sec->escape[2] == 0x45) {
 				joliet_level = 3;
 			    }
-			    printk("ISO9660 Extensions: Microsoft Joliet Level %d\n",
+			    printk("ISO 9660 Extensions: Microsoft Joliet Level %d\n",
 				   joliet_level);
 			}
 			goto root_found;
@@ -993,7 +993,7 @@
    enough error checking on the drive itself, but an open ended search
    makes me a little nervous.
 
-   The bsd iso filesystem uses the extent number for an inode, and this
+   The BSD iso filesystem uses the extent number for an inode, and this
    would work really nicely for us except that the read_inode function
    would not have any clean way of finding the actual directory record
    that goes with the file.  If we had such info, then it would pay
diff -u --recursive --new-file v2.1.106/linux/fs/isofs/joliet.c linux/fs/isofs/joliet.c
--- v2.1.106/linux/fs/isofs/joliet.c	Thu Oct 23 14:08:03 1997
+++ linux/fs/isofs/joliet.c	Wed Jun 24 14:30:10 1998
@@ -12,7 +12,7 @@
 #include <linux/iso_fs.h>
 
 /*
- * Convert Unicode 16 to UTF8 or ascii.
+ * Convert Unicode 16 to UTF8 or ASCII.
  */
 static int
 uni16_to_x8(unsigned char *ascii, unsigned char *uni, int len,
diff -u --recursive --new-file v2.1.106/linux/fs/isofs/namei.c linux/fs/isofs/namei.c
--- v2.1.106/linux/fs/isofs/namei.c	Tue Jun 23 10:01:25 1998
+++ linux/fs/isofs/namei.c	Wed Jun 24 14:30:10 1998
@@ -1,7 +1,7 @@
 /*
  *  linux/fs/isofs/namei.c
  *
- *  (C) 1992  Eric Youngdale Modified for ISO9660 filesystem.
+ *  (C) 1992  Eric Youngdale Modified for ISO 9660 filesystem.
  *
  *  (C) 1991  Linus Torvalds - minix filesystem
  */
diff -u --recursive --new-file v2.1.106/linux/fs/isofs/rock.c linux/fs/isofs/rock.c
--- v2.1.106/linux/fs/isofs/rock.c	Thu Dec 18 16:37:02 1997
+++ linux/fs/isofs/rock.c	Wed Jun 24 14:30:10 1998
@@ -266,7 +266,7 @@
 	break;
       case SIG('E','R'):
 	inode->i_sb->u.isofs_sb.s_rock = 1;
-	printk(KERN_DEBUG"ISO9660 Extensions: ");
+	printk(KERN_DEBUG"ISO 9660 Extensions: ");
 	{ int p;
 	  for(p=0;p<rr->u.ER.len_id;p++) printk("%c",rr->u.ER.data[p]);
 	};
diff -u --recursive --new-file v2.1.106/linux/fs/isofs/symlink.c linux/fs/isofs/symlink.c
--- v2.1.106/linux/fs/isofs/symlink.c	Sun Jan  4 00:53:41 1998
+++ linux/fs/isofs/symlink.c	Wed Jun 24 14:30:10 1998
@@ -1,7 +1,7 @@
 /*
  *  linux/fs/isofs/symlink.c
  *
- *  (C) 1992  Eric Youngdale Modified for ISO9660 filesystem.
+ *  (C) 1992  Eric Youngdale Modified for ISO 9660 filesystem.
  *
  *  Copyright (C) 1991, 1992  Linus Torvalds
  *
diff -u --recursive --new-file v2.1.106/linux/fs/isofs/util.c linux/fs/isofs/util.c
--- v2.1.106/linux/fs/isofs/util.c	Thu Oct 23 14:00:15 1997
+++ linux/fs/isofs/util.c	Wed Jun 24 14:30:10 1998
@@ -6,7 +6,7 @@
  *  convert numbers according to section 7.3.3, etc.
  *
  *  isofs special functions.  This file was lifted in its entirety from
- *  the 386bsd iso9660 filesystem, by Pace Willisson <pace@blitz.com>.
+ *  the 386BSD iso9660 filesystem, by Pace Willisson <pace@blitz.com>.
  */
 
 #include <linux/time.h>
@@ -87,7 +87,7 @@
 }
 
 /* 
- * We have to convert from a MM/DD/YY format to the unix ctime format.
+ * We have to convert from a MM/DD/YY format to the Unix ctime format.
  * We have to take into account leap years and all of that good stuff.
  * Unfortunately, the kernel does not have the information on hand to
  * take into account daylight savings time, but it shouldn't matter.
diff -u --recursive --new-file v2.1.106/linux/fs/minix/Makefile linux/fs/minix/Makefile
--- v2.1.106/linux/fs/minix/Makefile	Tue Aug 15 05:07:02 1995
+++ linux/fs/minix/Makefile	Wed Jun 24 14:30:10 1998
@@ -1,11 +1,11 @@
 #
-# Makefile for the linux minix-filesystem routines.
+# Makefile for the Linux minix filesystem routines.
 #
 # Note! Dependencies are done automagically by 'make dep', which also
 # removes any old dependencies. DON'T put your own dependencies here
-# unless it's something special (ie not a .c file).
+# unless it's something special (not a .c file).
 #
-# Note 2! The CFLAGS definitions are now in the main makefile...
+# Note 2! The CFLAGS definitions are now in the main makefile.
 
 O_TARGET := minix.o
 O_OBJS   := bitmap.o truncate.o namei.o inode.o file.o dir.o symlink.o fsync.o
diff -u --recursive --new-file v2.1.106/linux/fs/minix/file.c linux/fs/minix/file.c
--- v2.1.106/linux/fs/minix/file.c	Tue Oct 21 08:57:29 1997
+++ linux/fs/minix/file.c	Wed Jun 24 14:30:10 1998
@@ -30,7 +30,7 @@
 static ssize_t minix_file_write(struct file *, const char *, size_t, loff_t *);
 
 /*
- * We have mostly NULL's here: the current defaults are ok for
+ * We have mostly NULLs here: the current defaults are OK for
  * the minix filesystem.
  */
 static struct file_operations minix_file_operations = {
diff -u --recursive --new-file v2.1.106/linux/fs/minix/inode.c linux/fs/minix/inode.c
--- v2.1.106/linux/fs/minix/inode.c	Tue Jun 23 10:01:25 1998
+++ linux/fs/minix/inode.c	Wed Jun 24 14:30:10 1998
@@ -122,7 +122,7 @@
 
 /*
  * Check the root directory of the filesystem to make sure
- * it really _is_ a minix filesystem, and to check the size
+ * it really _is_ a Minix filesystem, and to check the size
  * of the directory entry.
  */
 static const char * minix_checkroot(struct super_block *s, struct inode *dir)
@@ -311,7 +311,7 @@
 
 out_no_fs:
 	if (!silent)
-		printk("VFS: Can't find a minix or minix V2 filesystem on dev "
+		printk("VFS: Can't find a Minix or Minix V2 filesystem on device "
 		       "%s.\n", kdevname(dev));
     out_release:
 	brelse(bh);
diff -u --recursive --new-file v2.1.106/linux/fs/minix/truncate.c linux/fs/minix/truncate.c
--- v2.1.106/linux/fs/minix/truncate.c	Thu Mar 26 15:57:05 1998
+++ linux/fs/minix/truncate.c	Wed Jun 24 14:30:10 1998
@@ -21,7 +21,7 @@
 
 /*
  * Truncate has the most races in the whole filesystem: coding it is
- * a pain in the a**. Especially as I don't do any locking...
+ * a pain in the a**, especially as I don't do any locking.
  *
  * The code may look a bit weird, but that's just because I've tried to
  * handle things like file-size changes in a somewhat graceful manner.
diff -u --recursive --new-file v2.1.106/linux/fs/msdos/Makefile linux/fs/msdos/Makefile
--- v2.1.106/linux/fs/msdos/Makefile	Tue Feb  6 23:39:28 1996
+++ linux/fs/msdos/Makefile	Wed Jun 24 14:30:10 1998
@@ -1,11 +1,11 @@
 #
-# Makefile for the linux msdos-filesystem routines.
+# Makefile for the Linux msdos filesystem routines.
 #
 # Note! Dependencies are done automagically by 'make dep', which also
 # removes any old dependencies. DON'T put your own dependencies here
 # unless it's something special (ie not a .c file).
 #
-# Note 2! The CFLAGS definitions are now in the main makefile...
+# Note 2! The CFLAGS definitions are now in the main makefile.
 
 O_TARGET := msdos.o
 O_OBJS   := namei.o
diff -u --recursive --new-file v2.1.106/linux/fs/namei.c linux/fs/namei.c
--- v2.1.106/linux/fs/namei.c	Fri May  8 23:14:53 1998
+++ linux/fs/namei.c	Wed Jun 24 14:30:10 1998
@@ -70,7 +70,7 @@
  * and the name already exists in form of a symlink, try to create the new
  * name indicated by the symlink. The old code always complained that the
  * name already exists, due to not following the symlink even if its target
- * is non-existant.  The new semantics affects also mknod() and link() when
+ * is nonexistent.  The new semantics affects also mknod() and link() when
  * the name is a symlink pointing to a non-existant name.
  *
  * I don't know which semantics is the right one, since I have no access
diff -u --recursive --new-file v2.1.106/linux/fs/nfs/Makefile linux/fs/nfs/Makefile
--- v2.1.106/linux/fs/nfs/Makefile	Mon Apr 14 16:28:17 1997
+++ linux/fs/nfs/Makefile	Wed Jun 24 14:30:10 1998
@@ -1,11 +1,11 @@
 #
-# Makefile for the linux nfs-filesystem routines.
+# Makefile for the Linux nfs filesystem routines.
 #
 # Note! Dependencies are done automagically by 'make dep', which also
 # removes any old dependencies. DON'T put your own dependencies here
-# unless it's something special (ie not a .c file).
+# unless it's something special (not a .c file).
 #
-# Note 2! The CFLAGS definitions are now in the main makefile...
+# Note 2! The CFLAGS definitions are now in the main makefile.
 
 O_TARGET := nfs.o
 O_OBJS   := inode.o file.o read.o write.o dir.o symlink.o proc.o \
diff -u --recursive --new-file v2.1.106/linux/fs/nfs/dir.c linux/fs/nfs/dir.c
--- v2.1.106/linux/fs/nfs/dir.c	Fri Jan 30 11:28:08 1998
+++ linux/fs/nfs/dir.c	Wed Jun 24 14:30:10 1998
@@ -1106,7 +1106,7 @@
 
 	/*
 	 * Drop the dentry in advance to force a new lookup.
-	 * Since nfs_proc_link doesn't return a filehandle,
+	 * Since nfs_proc_link doesn't return a file handle,
 	 * we can't use the existing dentry.
 	 */
 	d_drop(dentry);
diff -u --recursive --new-file v2.1.106/linux/fs/nfs/inode.c linux/fs/nfs/inode.c
--- v2.1.106/linux/fs/nfs/inode.c	Mon Apr  6 17:41:01 1998
+++ linux/fs/nfs/inode.c	Wed Jun 24 14:30:10 1998
@@ -448,7 +448,7 @@
 		dentry->d_parent->d_name.name, dentry->d_name.name,
 		fattr->fileid);
 
-	/* Install the filehandle in the dentry */
+	/* Install the file handle in the dentry */
 	*((struct nfs_fh *) dentry->d_fsdata) = *fhandle;
 
 #ifdef CONFIG_NFS_SNAPSHOT
diff -u --recursive --new-file v2.1.106/linux/fs/nfs/write.c linux/fs/nfs/write.c
--- v2.1.106/linux/fs/nfs/write.c	Tue Mar 10 10:03:34 1998
+++ linux/fs/nfs/write.c	Wed Jun 24 14:30:10 1998
@@ -19,10 +19,10 @@
  * from the writeback list to the writelock list.
  *
  * Note: we must make sure never to confuse the inode passed in the
- * write_page request with the one in page->inode. As far as I understant
+ * write_page request with the one in page->inode. As far as I understand
  * it, these are different when doing a swap-out.
  *
- * To understand everything that goes one here and in the nfs read code,
+ * To understand everything that goes on here and in the NFS read code,
  * one should be aware that a page is locked in exactly one of the following
  * cases:
  *
diff -u --recursive --new-file v2.1.106/linux/fs/nfsd/Makefile linux/fs/nfsd/Makefile
--- v2.1.106/linux/fs/nfsd/Makefile	Mon Apr  7 11:35:31 1997
+++ linux/fs/nfsd/Makefile	Wed Jun 24 14:30:10 1998
@@ -1,11 +1,11 @@
 #
-# Makefile for the linux nfs-filesystem routines.
+# Makefile for the Linux nfs filesystem routines.
 #
 # Note! Dependencies are done automagically by 'make dep', which also
 # removes any old dependencies. DON'T put your own dependencies here
-# unless it's something special (ie not a .c file).
+# unless it's something special (not a .c file).
 #
-# Note 2! The CFLAGS definitions are now in the main makefile...
+# Note 2! The CFLAGS definitions are now in the main makefile.
 
 O_TARGET := nfsd.o
 O_OBJS   := nfssvc.o nfsctl.o nfsproc.o nfsfh.o vfs.o \
diff -u --recursive --new-file v2.1.106/linux/fs/nfsd/nfsfh.c linux/fs/nfsd/nfsfh.c
--- v2.1.106/linux/fs/nfsd/nfsfh.c	Sun Jun  7 11:16:36 1998
+++ linux/fs/nfsd/nfsfh.c	Wed Jun 24 14:30:10 1998
@@ -1,7 +1,7 @@
 /*
  * linux/fs/nfsd/nfsfh.c
  *
- * NFS server filehandle treatment.
+ * NFS server file handle treatment.
  *
  * Copyright (C) 1995, 1996 Olaf Kirch <okir@monad.swb.de>
  */
@@ -182,7 +182,7 @@
 	int len, result = 0;
 
 #ifdef NFSD_DEBUG_VERBOSE
-printk("add_to_path_cache: cacheing %s/%s\n",
+printk("add_to_path_cache: caching %s/%s\n",
 dentry->d_parent->d_name.name, dentry->d_name.name);
 #endif
 	/*
@@ -222,7 +222,7 @@
 	return result;
 
 	/*
-	 * If the dentry's path length changed, just try again ...
+	 * If the dentry's path length changed, just try again.
 	 */
 retry:
 	kfree(new);
@@ -374,7 +374,7 @@
 /*
  * Look up a dentry given inode and parent inode numbers.
  *
- * This relies on the ability of a unix-like filesystem to return
+ * This relies on the ability of a Unix-like filesystem to return
  * the parent inode of a directory as the ".." (second) entry.
  *
  * This could be further optimized if we had an efficient way of
@@ -610,7 +610,7 @@
 /*
  * Add a dentry to the file or dir cache.
  *
- * Note: As NFS filehandles must have an inode, we don't accept
+ * Note: As NFS file handles must have an inode, we don't accept
  * negative dentries.
  */
 static int add_to_fhcache(struct dentry *dentry, int cache)
@@ -846,18 +846,18 @@
 }
 
 /*
- * The is the basic lookup mechanism for turning an NFS filehandle 
+ * The is the basic lookup mechanism for turning an NFS file handle 
  * into a dentry. There are several levels to the search:
  * (1) Look for the dentry pointer the short-term fhcache,
  *     and verify that it has the correct inode number.
  *
- * (2) Try to validate the dentry pointer in the filehandle,
+ * (2) Try to validate the dentry pointer in the file handle,
  *     and verify that it has the correct inode number. If this
  *     fails, check for a cached lookup in the fix-up list and
  *     repeat step (2) using the new dentry pointer.
  *
  * (3) Look up the dentry by using the inode and parent inode numbers
- *     to build the name string. This should succeed for any unix-like
+ *     to build the name string. This should succeed for any Unix-like
  *     filesystem.
  *
  * (4) Search for the parent dentry in the dir cache, and then
@@ -886,7 +886,7 @@
 	}
 
 	/*
-	 * Stage 2: Attempt to validate the dentry in the filehandle.
+	 * Stage 2: Attempt to validate the dentry in the file handle.
 	 */
 	dentry = fh->fh_dcookie;
 recheck:
@@ -896,7 +896,7 @@
 		if (dir->i_ino == fh->fh_dirino && dir->i_dev == fh->fh_dev) {
 			struct inode * inode = dentry->d_inode;
 			/*
-			 * NFS filehandles must always have an inode,
+			 * NFS file handles must always have an inode,
 			 * so we won't accept a negative dentry.
 			 */
 			if (inode && inode->i_ino == fh->fh_ino) {
@@ -929,7 +929,7 @@
 
 	/*
 	 * Stage 3: Look up the dentry based on the inode and parent inode
-	 * numbers. This should work for all unix-like filesystems ...
+	 * numbers. This should work for all Unix-like filesystems.
 	 */
 	looked_up = 1;
 	dentry = lookup_inode(fh->fh_dev, fh->fh_dirino, fh->fh_ino);
@@ -994,7 +994,7 @@
 /*
  * Perform sanity checks on the dentry in a client's file handle.
  *
- * Note that the filehandle dentry may need to be freed even after
+ * Note that the file handle dentry may need to be freed even after
  * an error return.
  */
 u32
@@ -1033,17 +1033,17 @@
 	nfsd_setuser(rqstp, exp);
 
 	/*
-	 * Look up the dentry using the NFS fh.
+	 * Look up the dentry using the NFS file handle.
 	 */
 	error = nfserr_stale;
 	dentry = find_fh_dentry(fh);
 	if (!dentry)
 		goto out;
 	/*
-	 * Note: it's possible that the returned dentry won't be the
-	 * one in the filehandle.  We can correct the FH for our use,
-	 * but unfortunately the client will keep sending the broken
-	 * one.  Hopefully the lookup will keep patching things up..
+	 * Note:  it's possible the returned dentry won't be the one in the
+         * file handle.  We can correct the file handle for our use, but
+         * unfortunately the client will keep sending the broken one.  Let's
+         * hope the lookup will keep patching things up.
 	 */
 	fhp->fh_dentry = dentry;
 	fhp->fh_export = exp;
@@ -1081,7 +1081,7 @@
 }
 
 /*
- * Compose a filehandle for an NFS reply.
+ * Compose a file handle for an NFS reply.
  *
  * Note that when first composed, the dentry may not yet have
  * an inode.  In this case a call to fh_update should be made
@@ -1121,7 +1121,7 @@
 }
 
 /*
- * Update filehandle information after changing a dentry.
+ * Update file handle information after changing a dentry.
  */
 void
 fh_update(struct svc_fh *fhp)
@@ -1147,7 +1147,7 @@
 }
 
 /*
- * Release a filehandle.  If the filehandle carries a dentry count,
+ * Release a file handle.  If the file handle carries a dentry count,
  * we add the dentry to the short-term cache rather than release it.
  */
 void
diff -u --recursive --new-file v2.1.106/linux/fs/nfsd/nfsproc.c linux/fs/nfsd/nfsproc.c
--- v2.1.106/linux/fs/nfsd/nfsproc.c	Tue Jun 23 10:01:25 1998
+++ linux/fs/nfsd/nfsproc.c	Wed Jun 24 14:30:10 1998
@@ -198,7 +198,7 @@
 	dprintk("nfsd: CREATE   %d/%ld %s\n",
 		SVCFH_DEV(dirfhp), SVCFH_INO(dirfhp), argp->name);
 
-	/* First verify the parent filehandle */
+	/* First verify the parent file handle */
 	nfserr = fh_verify(rqstp, dirfhp, S_IFDIR, MAY_EXEC);
 	if (nfserr)
 		goto done; /* must fh_put dirfhp even on error */
@@ -212,20 +212,20 @@
 		goto done;
 
 	/*
-	 * Do a lookup to verify the new filehandle.
+	 * Do a lookup to verify the new file handle.
 	 */
 	nfserr = nfsd_lookup(rqstp, dirfhp, argp->name, argp->len, newfhp);
 	if (nfserr) {
 		if (nfserr != nfserr_noent)
 			goto done;
 		/*
-		 * If the new filehandle wasn't verified, we can't tell
+		 * If the new file handle wasn't verified, we can't tell
 		 * whether the file exists or not. Time to bail ...
 		 */
 		nfserr = nfserr_acces;
 		if (!newfhp->fh_dverified) {
 			printk(KERN_WARNING 
-				"nfsd_proc_create: filehandle not verified\n");
+				"nfsd_proc_create: file handle not verified\n");
 			goto done;
 		}
 	}
diff -u --recursive --new-file v2.1.106/linux/fs/nfsd/vfs.c linux/fs/nfsd/vfs.c
--- v2.1.106/linux/fs/nfsd/vfs.c	Tue Jun 23 10:01:25 1998
+++ linux/fs/nfsd/vfs.c	Wed Jun 24 14:30:10 1998
@@ -121,7 +121,7 @@
 }
 
 /*
- * Check whether directory is a mount point, but it is alright if
+ * Check whether directory is a mount point, but it is all right if
  * this is precisely the local mount point being exported.
  */
 static inline int
@@ -178,7 +178,7 @@
 	}
 
 	/*
-	 * Note: we compose the filehandle now, but as the
+	 * Note: we compose the file handle now, but as the
 	 * dentry may be negative, it may need to be updated.
 	 */
 	fh_compose(resfh, exp, dchild);
@@ -611,7 +611,7 @@
 	if(!dirp->i_op || !dirp->i_op->lookup)
 		goto out;
 	/*
-	 * Check whether the response filehandle has been verified yet.
+	 * Check whether the response file handle has been verified yet.
 	 * If it has, the parent directory should already be locked.
 	 */
 	if (!resfhp->fh_dverified) {
@@ -679,7 +679,7 @@
 		write_inode_now(dirp);
 
 	/*
-	 * Update the filehandle to get the new inode info.
+	 * Update the file handle to get the new inode info.
 	 */
 	fh_update(resfhp);
 
diff -u --recursive --new-file v2.1.106/linux/fs/ntfs/attr.c linux/fs/ntfs/attr.c
--- v2.1.106/linux/fs/ntfs/attr.c	Fri Dec 19 15:24:21 1997
+++ linux/fs/ntfs/attr.c	Wed Jun 24 14:30:10 1998
@@ -399,7 +399,7 @@
 	clustersize=ino->vol->clustersize;
 	/* starting cluster of potential chunk
 	   there are three situations:
-	   a) in a large uncompressable or sparse chunk, 
+	   a) in a large uncompressible or sparse chunk, 
 	   s_vcn is in the middle of a run
 	   b) s_vcn is right on a run border
 	   c) when several runs make a chunk, s_vcn is before the chunks
diff -u --recursive --new-file v2.1.106/linux/fs/ntfs/dir.c linux/fs/ntfs/dir.c
--- v2.1.106/linux/fs/ntfs/dir.c	Fri Jan  2 01:42:58 1998
+++ linux/fs/ntfs/dir.c	Wed Jun 24 14:30:10 1998
@@ -419,7 +419,7 @@
 	error=ntfs_getdir_record(walk,nextblock);
 	if(!error && walk->type==DIR_INSERT && 
 	   (walk->u.flags & ITERATE_SPLIT_DONE)){
-		/* split has occured. adjust entry, insert new_entry */
+		/* split has occurred. adjust entry, insert new_entry */
 		NTFS_PUTU32(entry+length-8,walk->newblock);
 		/* reset flags, as the current block might be split again */
 		walk->u.flags &= ~ITERATE_SPLIT_DONE;
diff -u --recursive --new-file v2.1.106/linux/fs/ntfs/inode.c linux/fs/ntfs/inode.c
--- v2.1.106/linux/fs/ntfs/inode.c	Wed May 20 19:10:40 1998
+++ linux/fs/ntfs/inode.c	Wed Jun 24 14:30:10 1998
@@ -733,7 +733,7 @@
 /* Try to layout ino into store. Return 0 on success,
    E2BIG if it does not fit, 
    ENOMEM if memory allocation problem,
-   EOPNOTSUP if beyound our capabilities 
+   EOPNOTSUP if beyond our capabilities 
 */
 int 
 layout_inode(ntfs_inode *ino,ntfs_disk_inode *store)
diff -u --recursive --new-file v2.1.106/linux/fs/ntfs/support.c linux/fs/ntfs/support.c
--- v2.1.106/linux/fs/ntfs/support.c	Mon Feb 23 18:12:10 1998
+++ linux/fs/ntfs/support.c	Wed Jun 24 14:30:10 1998
@@ -96,7 +96,7 @@
 	return memmove(dest, src, n);
 }
 
-/* Warn that an error occured */
+/* Warn that an error occurred. */
 void ntfs_error(const char *fmt,...)
 {
         va_list ap;
diff -u --recursive --new-file v2.1.106/linux/fs/pipe.c linux/fs/pipe.c
--- v2.1.106/linux/fs/pipe.c	Thu May  7 22:51:53 1998
+++ linux/fs/pipe.c	Wed Jun 24 14:30:10 1998
@@ -188,8 +188,8 @@
 
 #ifdef FIFO_SUNOS_BRAINDAMAGE
 /*
- * Arggh. Why does SunOS have to have different select() behaviour
- * for pipes and fifos? Hate-Hate-Hate. SunOS lacks POLLHUP..
+ * Argh!  Why does SunOS have to have different select() behaviour
+ * for pipes and FIFOs?  Hate, hate, hate!  SunOS lacks POLLHUP.
  */
 static unsigned int fifo_poll(struct file * filp, poll_table * wait)
 {
@@ -293,7 +293,7 @@
 
 /*
  * The file_operations structs are not static because they
- * are also used in linux/fs/fifo.c to do operations on fifo's.
+ * are also used in linux/fs/fifo.c to do operations on FIFOs.
  */
 struct file_operations connecting_fifo_fops = {
 	pipe_lseek,
diff -u --recursive --new-file v2.1.106/linux/fs/proc/Makefile linux/fs/proc/Makefile
--- v2.1.106/linux/fs/proc/Makefile	Sat Aug 16 09:53:08 1997
+++ linux/fs/proc/Makefile	Wed Jun 24 14:30:10 1998
@@ -1,11 +1,11 @@
 #
-# Makefile for the linux proc-filesystem routines.
+# Makefile for the Linux proc filesystem routines.
 #
 # Note! Dependencies are done automagically by 'make dep', which also
 # removes any old dependencies. DON'T put your own dependencies here
-# unless it's something special (ie not a .c file).
+# unless it's something special (not a .c file).
 #
-# Note 2! The CFLAGS definitions are now in the main makefile...
+# Note 2! The CFLAGS definitions are now in the main makefile.
 
 O_TARGET := proc.o
 O_OBJS   := inode.o root.o base.o generic.o mem.o link.o fd.o array.o \
diff -u --recursive --new-file v2.1.106/linux/fs/proc/array.c linux/fs/proc/array.c
--- v2.1.106/linux/fs/proc/array.c	Tue Jun 23 10:01:25 1998
+++ linux/fs/proc/array.c	Wed Jun 24 14:30:10 1998
@@ -29,7 +29,7 @@
  * Yves Arrouye      :  remove removal of trailing spaces in get_array.
  *			<Yves.Arrouye@marin.fdn.fr>
 
- * Jerome Forissier  :  added per-cpu time information to /proc/stat
+ * Jerome Forissier  :  added per-CPU time information to /proc/stat
  *                      and /proc/<pid>/cpu extension
  *                      <forissier@isia.cma.fr>
  *			- Incorporation and non-SMP safe operation
@@ -232,7 +232,7 @@
 
 #ifdef __SMP__
 	len = sprintf(buffer,
-		"cpu  %u %u %u %lu\n",
+		"CPU  %u %u %u %lu\n",
 		kstat.cpu_user,
 		kstat.cpu_nice,
 		kstat.cpu_system,
@@ -842,7 +842,7 @@
 		tty_pgrp = -1;
 
 	/* scale priority and nice values from timeslices to -20..20 */
-	/* to make it look like a "normal" unix priority/nice value  */
+	/* to make it look like a "normal" Unix priority/nice value  */
 	priority = tsk->counter;
 	priority = 20 - (priority * 10 + DEF_PRIORITY / 2) / DEF_PRIORITY;
 	nice = tsk->priority;
diff -u --recursive --new-file v2.1.106/linux/fs/proc/base.c linux/fs/proc/base.c
--- v2.1.106/linux/fs/proc/base.c	Tue Mar 17 22:18:15 1998
+++ linux/fs/proc/base.c	Mon Jun 15 12:56:36 1998
@@ -62,10 +62,14 @@
 
 	read_lock(&tasklist_lock);
 	if (fill && (p = find_task_by_pid(pid)) != NULL) {
+		uid_t uid = 0;
+		gid_t gid = 0;
 		if (p->dumpable || ino == PROC_PID_INO) {
-			inode->i_uid = p->euid;
-			inode->i_gid = p->gid;
+			uid = p->euid;
+			gid = p->egid;
 		}
+		inode->i_uid = uid;
+		inode->i_gid = gid;
 	}
 	read_unlock(&tasklist_lock);
 }
diff -u --recursive --new-file v2.1.106/linux/fs/proc/net.c linux/fs/proc/net.c
--- v2.1.106/linux/fs/proc/net.c	Sat Jul  5 20:53:22 1997
+++ linux/fs/proc/net.c	Wed Jun 24 14:30:10 1998
@@ -20,7 +20,7 @@
  * Erik Schoenfelder (schoenfr@ibr.cs.tu-bs.de)
  *	      /proc/net/snmp.
  * Alan Cox (gw4pts@gw4pts.ampr.org) 1/95
- *	      Added Appletalk slots
+ *	      Added AppleTalk slots
  *
  *  proc net directory handling functions
  */
diff -u --recursive --new-file v2.1.106/linux/fs/proc/procfs_syms.c linux/fs/proc/procfs_syms.c
--- v2.1.106/linux/fs/proc/procfs_syms.c	Sun Jun  7 11:16:36 1998
+++ linux/fs/proc/procfs_syms.c	Wed Jun 17 05:10:33 1998
@@ -11,7 +11,9 @@
 extern int (* dispatch_scsi_info_ptr) (int ino, char *buffer, char **start,
 				       off_t offset, int length, int inout);
 extern struct inode_operations proc_scsi_inode_operations;
+extern struct proc_dir_entry proc_sys_root;
 
+EXPORT_SYMBOL(proc_sys_root);
 EXPORT_SYMBOL(proc_register);
 EXPORT_SYMBOL(proc_unregister);
 EXPORT_SYMBOL(create_proc_entry);
diff -u --recursive --new-file v2.1.106/linux/fs/romfs/Makefile linux/fs/romfs/Makefile
--- v2.1.106/linux/fs/romfs/Makefile	Fri Jan  3 03:03:42 1997
+++ linux/fs/romfs/Makefile	Wed Jun 24 14:30:10 1998
@@ -1,11 +1,11 @@
 #
-# Makefile for the linux romfs-filesystem routines.
+# Makefile for the linux romfs filesystem routines.
 #
 # Note! Dependencies are done automagically by 'make dep', which also
 # removes any old dependencies. DON'T put your own dependencies here
-# unless it's something special (ie not a .c file).
+# unless it's something special (not a .c file).
 #
-# Note 2! The CFLAGS definitions are now in the main makefile...
+# Note 2! The CFLAGS definitions are now in the main makefile.
 
 O_TARGET := romfs.o
 O_OBJS   := inode.o
diff -u --recursive --new-file v2.1.106/linux/fs/romfs/inode.c linux/fs/romfs/inode.c
--- v2.1.106/linux/fs/romfs/inode.c	Tue Jun 23 10:01:25 1998
+++ linux/fs/romfs/inode.c	Wed Jun 24 14:30:10 1998
@@ -334,7 +334,7 @@
 	maxoff = dir->i_sb->u.romfs_sb.s_maxsize;
 	offset = ntohl(ri.spec) & ROMFH_MASK;
 
-	/* ok, now find the file, whose name is in "dentry", in the
+	/* OK, now find the file whose name is in "dentry" in the
 	 * directory specified by "dir".  */
 
 	name = dentry->d_name.name;
diff -u --recursive --new-file v2.1.106/linux/fs/stat.c linux/fs/stat.c
--- v2.1.106/linux/fs/stat.c	Sun Jun  7 11:16:36 1998
+++ linux/fs/stat.c	Wed Jun 24 14:30:10 1998
@@ -92,7 +92,7 @@
 /*
  * Use minix fs values for the number of direct and indirect blocks.  The
  * count is now exact for the minix fs except that it counts zero blocks.
- * Everything is in BLOCK_SIZE'd units until the assignment to
+ * Everything is in units of BLOCK_SIZE until the assignment to
  * tmp.st_blksize.
  */
 #define D_B   7
diff -u --recursive --new-file v2.1.106/linux/fs/super.c linux/fs/super.c
--- v2.1.106/linux/fs/super.c	Thu May 14 19:47:43 1998
+++ linux/fs/super.c	Wed Jun 24 14:30:11 1998
@@ -5,8 +5,8 @@
  *
  *  super.c contains code to handle: - mount structures
  *                                   - super-block tables.
- *                                   - mount systemcall
- *                                   - umount systemcall
+ *                                   - mount system call
+ *                                   - umount system call
  *
  *  Added options to /proc/mounts
  *  Torbjörn Lindh (torbjorn.lindh@gopta.se), April 14, 1996.
@@ -645,9 +645,9 @@
 
 	/*
 	 * Before checking whether the filesystem is still busy,
-	 * make sure the kernel doesn't hold any quotafiles open
+	 * make sure the kernel doesn't hold any quota files open
 	 * on the device. If the umount fails, too bad -- there
-	 * are no quotas running anymore. Just turn them on again.
+	 * are no quotas running any more. Just turn them on again.
 	 */
 	DQUOT_OFF(dev);
 
@@ -810,12 +810,12 @@
  * [21-Mar-97] T.Schoebel-Theuer: Now this can be overridden when
  * supplying a leading "!" before the dir_name, allowing "stacks" of
  * mounted filesystems. The stacking will only influence any pathname lookups
- * _after_ the mount, but open filedescriptors or working directories that
+ * _after_ the mount, but open file descriptors or working directories that
  * are now covered remain valid. For example, when you overmount /home, any
  * process with old cwd /home/joe will continue to use the old versions,
  * as long as relative paths are used, but absolute paths like /home/joe/xxx
  * will go to the new "top of stack" version. In general, crossing a
- * mountpoint will always go to the top of stack element.
+ * mount point will always go to the top of stack element.
  * Anyone using this new feature must know what he/she is doing.
  */
 
diff -u --recursive --new-file v2.1.106/linux/fs/ufs/Makefile linux/fs/ufs/Makefile
--- v2.1.106/linux/fs/ufs/Makefile	Tue Oct 21 05:26:13 1997
+++ linux/fs/ufs/Makefile	Wed Jun 24 14:30:11 1998
@@ -1,11 +1,11 @@
 #
-# Makefile for the linux ufs-filesystem routines.
+# Makefile for the Linux ufs filesystem routines.
 #
 # Note! Dependencies are done automagically by 'make dep', which also
 # removes any old dependencies. DON'T put your own dependencies here
-# unless it's something special (ie not a .c file).
+# unless it's something special (not a .c file).
 #
-# Note 2! The CFLAGS definitions are now in the main makefile...
+# Note 2! The CFLAGS definitions are now in the main makefile.
 
 O_TARGET := ufs.o
 O_OBJS   := ufs_dir.o ufs_file.o ufs_inode.o ufs_namei.o \
diff -u --recursive --new-file v2.1.106/linux/fs/ufs/ufs_inode.c linux/fs/ufs/ufs_inode.c
--- v2.1.106/linux/fs/ufs/ufs_inode.c	Tue Feb 17 13:12:48 1998
+++ linux/fs/ufs/ufs_inode.c	Wed Jun 24 14:22:58 1998
@@ -249,6 +249,8 @@
 	        inode->i_op = &blkdev_inode_operations;
 	} else if (S_ISFIFO(inode->i_mode)) {
 	        init_fifo(inode);
+	} else if (S_ISSOCK(inode->i_mode)) {
+		/* nothing */
 	} else {
 	        printk("ufs_read_inode: unknown file type 0%o ino %lu dev %d/%d\n",
 	               inode->i_mode, inode->i_ino, MAJOR(inode->i_dev),
diff -u --recursive --new-file v2.1.106/linux/include/asm-alpha/apecs.h linux/include/asm-alpha/apecs.h
--- v2.1.106/linux/include/asm-alpha/apecs.h	Tue Jun  9 11:57:31 1998
+++ linux/include/asm-alpha/apecs.h	Wed Jun 24 14:30:11 1998
@@ -42,7 +42,7 @@
    we can't just use that here, because of header file looping... :-(
 
    Window 1 will be used for all DMA from the ISA bus; yes, that does
-   limit what memory an ISA floppy or soundcard or Ethernet can touch, but
+   limit what memory an ISA floppy or sound card or Ethernet can touch, but
    it's also a known limitation on other platforms as well. We use the
    same technique that is used on INTEL platforms with similar limitation:
    set MAX_DMA_ADDRESS and clear some pages' DMAable flags during mem_init().
diff -u --recursive --new-file v2.1.106/linux/include/asm-alpha/elf.h linux/include/asm-alpha/elf.h
--- v2.1.106/linux/include/asm-alpha/elf.h	Thu Feb 12 20:56:12 1998
+++ linux/include/asm-alpha/elf.h	Wed Jun 24 14:30:11 1998
@@ -99,7 +99,7 @@
 }
 
 /* This yields a mask that user programs can use to figure out what
-   instruction set this cpu supports.  This is trivial on Alpha, 
+   instruction set this CPU supports.  This is trivial on Alpha, 
    but not so on other machines. */
 
 #define ELF_HWCAP							\
diff -u --recursive --new-file v2.1.106/linux/include/asm-alpha/io.h linux/include/asm-alpha/io.h
--- v2.1.106/linux/include/asm-alpha/io.h	Tue Jun  9 11:57:31 1998
+++ linux/include/asm-alpha/io.h	Wed Jun 24 14:30:11 1998
@@ -5,7 +5,7 @@
 
 #include <asm/system.h>
 
-/* We don't use IO slowdowns on the alpha, but.. */
+/* We don't use IO slowdowns on the Alpha, but.. */
 #define __SLOW_DOWN_IO	do { } while (0)
 #define SLOW_DOWN_IO	do { } while (0)
 
@@ -242,7 +242,7 @@
 /*
  * XXX - We don't have csum_partial_copy_fromio() yet, so we cheat here and 
  * just copy it. The net code will then do the checksum later. Presently 
- * only used by some shared memory 8390 ethernet cards anyway.
+ * only used by some shared memory 8390 Ethernet cards anyway.
  */
 
 #define eth_io_copy_and_sum(skb,src,len,unused)	memcpy_fromio((skb)->data,(src),(len))
diff -u --recursive --new-file v2.1.106/linux/include/asm-alpha/linux_logo.h linux/include/asm-alpha/linux_logo.h
--- v2.1.106/linux/include/asm-alpha/linux_logo.h	Wed Dec 31 16:00:00 1969
+++ linux/include/asm-alpha/linux_logo.h	Wed Jun 24 14:44:02 1998
@@ -0,0 +1,69 @@
+/* $Id: linux_logo.h,v 1.2 1998/05/04 14:20:47 jj Exp $
+ * include/asm-alpha/linux_logo.h: This is a linux logo
+ *                                 to be displayed on boot.
+ *
+ * Copyright (C) 1996 Larry Ewing (lewing@isc.tamu.edu)
+ * Copyright (C) 1996 Jakub Jelinek (jj@sunsite.mff.cuni.cz)
+ *
+ * You can put anything here, but:
+ * LINUX_LOGO_COLORS has to be less than 224
+ * image size has to be 80x80
+ * values have to start from 0x20
+ * (i.e. RGB(linux_logo_red[0],
+ *	     linux_logo_green[0],
+ *	     linux_logo_blue[0]) is color 0x20)
+ * BW image has to be 80x80 as well, with MS bit
+ * on the left
+ * Serial_console ascii image can be any size,
+ * but should contain %s to display the version
+ */
+ 
+#include <linux/init.h>
+#include <linux/version.h>
+
+#define linux_logo_banner "Linux/AXP version " UTS_RELEASE
+
+#define LINUX_LOGO_COLORS 221
+
+#ifdef INCLUDE_LINUX_LOGO_DATA
+
+#define INCLUDE_LINUX_LOGO16
+#include <linux/linux_logo.h>
+
+/* Painted by Johnny Stenback <jst@uwasa.fi> */
+
+unsigned char *linux_serial_image __initdata = "\n"
+"         .u$e.\n"
+"       .$$$$$:S\n"
+"       $\"*$/\"*$$\n"
+"       $.`$ . ^F\n"
+"       4k+#+T.$F\n"
+"       4P+++\"$\"$\n"
+"       :R\"+  t$$B\n"
+"    ___#       $$$\n"
+"    |  |       R$$k\n"
+"   dd. | Linux  $!$\n"
+"   ddd |   AXP  $9$F\n"
+" '!!!!!$       !!#!`\n"
+"  !!!!!*     .!!!!!`\n"
+"'!!!!!!!W..e$$!!!!!!`    %s\n"
+" \"~^^~         ^~~^\n"
+"\n";
+
+#else
+
+/* prototypes only */
+extern unsigned char linux_logo_red[];
+extern unsigned char linux_logo_green[];
+extern unsigned char linux_logo_blue[];
+extern unsigned char linux_logo[];
+extern unsigned char linux_logo_bw[];
+extern unsigned char linux_logo16_red[];
+extern unsigned char linux_logo16_green[];
+extern unsigned char linux_logo16_blue[];
+extern unsigned char linux_logo16[];
+extern unsigned char *linux_serial_image;
+
+extern int (*console_show_logo)(void);
+
+#endif
diff -u --recursive --new-file v2.1.106/linux/include/asm-alpha/pgtable.h linux/include/asm-alpha/pgtable.h
--- v2.1.106/linux/include/asm-alpha/pgtable.h	Tue Jun 23 10:01:25 1998
+++ linux/include/asm-alpha/pgtable.h	Wed Jun 24 14:30:11 1998
@@ -3,9 +3,9 @@
 
 /*
  * This file contains the functions and defines necessary to modify and use
- * the alpha page table tree.
+ * the Alpha page table tree.
  *
- * This hopefully works with any standard alpha page-size, as defined
+ * This hopefully works with any standard Alpha page-size, as defined
  * in <asm/page.h> (currently 8192).
  */
 #include <linux/config.h>
@@ -14,7 +14,7 @@
 #include <asm/processor.h>	/* For TASK_SIZE */
 #include <asm/mmu_context.h>
 
-/* Caches aren't brain-dead on the alpha. */
+/* Caches aren't brain-dead on the Alpha. */
 #define flush_cache_all()			do { } while (0)
 #define flush_cache_mm(mm)			do { } while (0)
 #define flush_cache_range(mm, start, end)	do { } while (0)
@@ -42,7 +42,7 @@
 
 /*
  * Use a few helper functions to hide the ugly broken ASN
- * numbers on early alpha's (ev4 and ev45)
+ * numbers on early Alphas (ev4 and ev45)
  */
 #ifdef BROKEN_ASN
 
@@ -126,8 +126,8 @@
 }
 
 /*
- * Flush a specified range of user mapping: on the
- * alpha we flush the whole user tlb
+ * Flush a specified range of user mapping:  on the
+ * Alpha we flush the whole user tlb.
  */
 static inline void flush_tlb_range(struct mm_struct *mm,
 	unsigned long start, unsigned long end)
@@ -157,7 +157,7 @@
 
 #endif /* __SMP__ */
 
-/* Certain architectures need to do special things when pte's
+/* Certain architectures need to do special things when PTEs
  * within a page table are directly modified.  Thus, the following
  * hook is made available.
  */
@@ -174,17 +174,17 @@
 #define PGDIR_MASK	(~(PGDIR_SIZE-1))
 
 /*
- * entries per page directory level: the alpha is three-level, with
+ * Entries per page directory level:  the Alpha is three-level, with
  * all levels having a one-page page table.
  *
- * The PGD is special: the last entry is reserved for self-mapping.
+ * The PGD is special:  the last entry is reserved for self-mapping.
  */
 #define PTRS_PER_PTE	(1UL << (PAGE_SHIFT-3))
 #define PTRS_PER_PMD	(1UL << (PAGE_SHIFT-3))
 #define PTRS_PER_PGD	((1UL << (PAGE_SHIFT-3))-1)
 #define USER_PTRS_PER_PGD	(TASK_SIZE / PGDIR_SIZE)
 
-/* the no. of pointers that fit on a page: this will go away */
+/* Number of pointers that fit on a page:  this will go away. */
 #define PTRS_PER_PAGE	(1UL << (PAGE_SHIFT-3))
 
 #define VMALLOC_START		0xFFFFFE0000000000
@@ -208,7 +208,7 @@
 #define _PAGE_ACCESSED	0x40000
 
 /*
- * NOTE! The "accessed" bit isn't necessarily exact: it can be kept exactly
+ * NOTE! The "accessed" bit isn't necessarily exact:  it can be kept exactly
  * by software (use the KRE/URE/KWE/UWE bits appropriately), but I'll fake it.
  * Under Linux/AXP, the "accessed" bit just means "read", and I'll just use
  * the KRE/URE bits to watch for it. That way we don't need to overload the
@@ -242,7 +242,7 @@
 #define _PAGE_S(x) _PAGE_NORMAL(x)
 
 /*
- * The hardware can handle write-only mappings, but as the alpha
+ * The hardware can handle write-only mappings, but as the Alpha
  * architecture does byte-wide writes with a read-modify-write
  * sequence, it's not practical to have write-without-read privs.
  * Thus the "-w- -> rw-" and "-wx -> rwx" mapping here (and in
@@ -271,7 +271,7 @@
  * BAD_PAGETABLE is used when we need a bogus page-table, while
  * BAD_PAGE is used for a bogus page.
  *
- * ZERO_PAGE is a global shared page that is always zero: used
+ * ZERO_PAGE is a global shared page that is always zero:  used
  * for zero-mapped memory areas etc..
  */
 extern pte_t __bad_page(void);
@@ -297,7 +297,7 @@
   ((unsigned long)(address)>>(PAGE_SHIFT-SIZEOF_PTR_LOG2)&PTR_MASK&~PAGE_MASK)
 
 /*
- * Conversion functions: convert a page and protection to a page entry,
+ * Conversion functions:  convert a page and protection to a page entry,
  * and a page entry and page directory to the page they refer to.
  */
 extern inline pte_t mk_pte(unsigned long page, pgprot_t pgprot)
@@ -576,7 +576,7 @@
 extern pgd_t swapper_pg_dir[1024];
 
 /*
- * The alpha doesn't have any external MMU info: the kernel page
+ * The Alpha doesn't have any external MMU info:  the kernel page
  * tables contain all the necessary information.
  */
 extern inline void update_mmu_cache(struct vm_area_struct * vma,
@@ -585,8 +585,8 @@
 }
 
 /*
- * Non-present pages: high 24 bits are offset, next 8 bits type,
- * low 32 bits zero..
+ * Non-present pages:  high 24 bits are offset, next 8 bits type,
+ * low 32 bits zero.
  */
 extern inline pte_t mk_swap_pte(unsigned long type, unsigned long offset)
 { pte_t pte; pte_val(pte) = (type << 32) | (offset << 40); return pte; }
diff -u --recursive --new-file v2.1.106/linux/include/asm-alpha/signal.h linux/include/asm-alpha/signal.h
--- v2.1.106/linux/include/asm-alpha/signal.h	Tue Jun 23 10:01:25 1998
+++ linux/include/asm-alpha/signal.h	Wed Jun 24 14:30:11 1998
@@ -176,7 +176,7 @@
 
 /* sigstack(2) is deprecated, and will be withdrawn in a future version
    of the X/Open CAE Specification.  Use sigaltstack instead.  It is only
-   implemented here for OSF/1 compatability.  */
+   implemented here for OSF/1 compatibility.  */
 
 struct sigstack {
 	void *ss_sp;
diff -u --recursive --new-file v2.1.106/linux/include/asm-alpha/t2.h linux/include/asm-alpha/t2.h
--- v2.1.106/linux/include/asm-alpha/t2.h	Tue Jun  9 11:57:31 1998
+++ linux/include/asm-alpha/t2.h	Wed Jun 24 14:30:11 1998
@@ -554,7 +554,7 @@
 
 
 /*
- * Sable other cpu error frame - sable pfms section 3.43
+ * Sable other CPU error frame - sable pfms section 3.43
  */
 struct el_t2_data_other_cpu {
 	short	      elco_cpuid;	/* CPU ID */
@@ -578,7 +578,7 @@
 };
 
 /*
- * Sable other cpu error frame - sable pfms section 3.44
+ * Sable other CPU error frame - sable pfms section 3.44
  */
 struct el_t2_data_t2{
         struct el_t2_frame_header elct_hdr;	/* ID$T2-FRAME */
diff -u --recursive --new-file v2.1.106/linux/include/asm-alpha/uaccess.h linux/include/asm-alpha/uaccess.h
--- v2.1.106/linux/include/asm-alpha/uaccess.h	Mon Dec  1 10:34:12 1997
+++ linux/include/asm-alpha/uaccess.h	Wed Jun 24 14:30:11 1998
@@ -161,7 +161,7 @@
 		: "m"(__m(addr)), "1"(__gu_err))
 
 #ifdef __HAVE_CPU_BWX
-/* Those lucky bastards with ev56 and later cpus can do byte/word moves.  */
+/* Those lucky bastards with ev56 and later CPUs can do byte/word moves.  */
 
 #define __get_user_16(addr)				\
 	__asm__("1: ldwu %0,%2\n"			\
@@ -275,7 +275,7 @@
 		: "m"(__m(addr)), "rJ"(x), "0"(__pu_err))
 
 #ifdef __HAVE_CPU_BWX
-/* Those lucky bastards with ev56 and later cpus can do byte/word moves.  */
+/* Those lucky bastards with ev56 and later CPUs can do byte/word moves.  */
 
 #define __put_user_16(x,addr)					\
 __asm__ __volatile__("1: stw %r2,%1\n"				\
diff -u --recursive --new-file v2.1.106/linux/include/asm-i386/bugs.h linux/include/asm-i386/bugs.h
--- v2.1.106/linux/include/asm-i386/bugs.h	Sat May  2 14:19:54 1998
+++ linux/include/asm-i386/bugs.h	Wed Jun 24 15:51:17 1998
@@ -83,7 +83,7 @@
 	if (fpu_error)
 		return;
 	if (!ignore_irq13) {
-		printk("Ok, fpu using old IRQ13 error reporting\n");
+		printk("OK, FPU using old IRQ 13 error reporting\n");
 		return;
 	}
 	__asm__("fninit\n\t"
@@ -98,9 +98,9 @@
 		: "=m" (*&boot_cpu_data.fdiv_bug)
 		: "m" (*&x), "m" (*&y));
 	if (!boot_cpu_data.fdiv_bug)
-		printk("Ok, fpu using exception 16 error reporting.\n");
+		printk("OK, FPU using exception 16 error reporting.\n");
 	else
-		printk("Hmm, fpu using exception 16 error reporting with FDIV bug.\n");
+		printk("Hmm, FPU using exception 16 error reporting with FDIV bug.\n");
 }
 
 __initfunc(static void check_hlt(void))
@@ -111,7 +111,7 @@
 		return;
 	}
 	__asm__ __volatile__("hlt ; hlt ; hlt ; hlt");
-	printk("Ok.\n");
+	printk("OK.\n");
 }
 
 __initfunc(static void check_tlb(void))
@@ -145,9 +145,9 @@
 	  : "=eax" (res)
 	  : "edx" (inp)
 	  : "eax", "ecx", "edx", "edi" );
-	/* If this fails, it means that any user program may lock CPU hard. Too bad. */
+	/* If this fails, it means that any user program may lock the CPU hard. Too bad. */
 	if (res != 12345678) printk( "Buggy.\n" );
-		        else printk( "Ok.\n" );
+		        else printk( "OK.\n" );
 #endif
 }
 
diff -u --recursive --new-file v2.1.106/linux/include/asm-i386/elf.h linux/include/asm-i386/elf.h
--- v2.1.106/linux/include/asm-i386/elf.h	Thu Feb 12 20:56:12 1998
+++ linux/include/asm-i386/elf.h	Wed Jun 24 14:30:11 1998
@@ -71,7 +71,7 @@
 	pr_reg[16] = regs->xss;
 
 /* This yields a mask that user programs can use to figure out what
-   instruction set this cpu supports.  This could be done in userspace,
+   instruction set this CPU supports.  This could be done in user space,
    but it's not easy, and we've already done it here.  */
 
 #define ELF_HWCAP	(boot_cpu_data.x86_capability)
diff -u --recursive --new-file v2.1.106/linux/include/asm-i386/linux_logo.h linux/include/asm-i386/linux_logo.h
--- v2.1.106/linux/include/asm-i386/linux_logo.h	Wed Dec 31 16:00:00 1969
+++ linux/include/asm-i386/linux_logo.h	Wed Jun 24 15:51:48 1998
@@ -0,0 +1,92 @@
+/* $Id: linux_logo.h,v 1.3 1998/06/07 21:49:54 geert Exp $
+ * include/asm-i386/linux_logo.h: This is a linux logo
+ *                                to be displayed on boot.
+ *
+ * Copyright (C) 1996 Larry Ewing (lewing@isc.tamu.edu)
+ * Copyright (C) 1996 Jakub Jelinek (jj@sunsite.mff.cuni.cz)
+ *
+ * You can put anything here, but:
+ * LINUX_LOGO_COLORS has to be less than 224
+ * image size has to be 80x80
+ * values have to start from 0x20
+ * (i.e. RGB(linux_logo_red[0],
+ *	     linux_logo_green[0],
+ *	     linux_logo_blue[0]) is color 0x20)
+ * BW image has to be 80x80 as well, with MS bit
+ * on the left
+ * Serial_console ascii image can be any size,
+ * but should contain %s to display the version
+ */
+ 
+#include <linux/init.h>
+#include <linux/version.h>
+
+#define linux_logo_banner "Linux/ia32 version " UTS_RELEASE
+
+#define LINUX_LOGO_COLORS 221
+
+#ifdef INCLUDE_LINUX_LOGO_DATA
+
+#define INCLUDE_LINUX_LOGO16
+#include <linux/linux_logo.h>
+
+/* Painted by Johnny Stenback <jst@uwasa.fi> */
+
+unsigned char *linux_serial_image __initdata = "\n"
+"         .u$e.\n"
+"       .$$$$$:S\n"
+"       $\"*$/\"*$$\n"
+"       $.`$ . ^F\n"
+"       4k+#+T.$F\n"
+"       4P+++\"$\"$\n"
+"       :R\"+  t$$B\n"
+"    ___#       $$$\n"
+"    |  |       R$$k\n"
+"   dd. | Linux  $!$\n"
+"   ddd |  ia32  $9$F\n"
+" '!!!!!$       !!#!`\n"
+"  !!!!!*     .!!!!!`\n"
+"'!!!!!!!W..e$$!!!!!!`\n"
+" \"~^^~         ^~~^\n"
+"\n";
+
+/* The following created by Andrew Apted, May 1998 */
+
+unsigned char *linux_mda_image __initdata = "\n"
+"LINUX/IA32..........................\n"
+"::::::::::::::        ::::::::::::::\n"
+"::::::::::::             :::::::::::\n"
+"::::::::::::  ##   ##    :::::::::::\n"
+":::::::::::: # xxxx ##   :::::::::::\n"
+":::::::::::: xxxxxxxxx    ::::::::::\n"
+":::::::::::: ##xxx####     :::::::::\n"
+"::::::::::: ###########     ::::::::\n"
+":::::::::  #############      ::::::\n"
+"::::::::  ###############      :::::\n"
+"::::::   #################      ::::\n"
+"::::::  ##################      ::::\n"
+":::::xxx##################      ::::\n"
+":::xxxxxx  #############xxx   xxx:::\n"
+"xxxxxxxxxxx   ##########xxxxxxxxxx::\n"
+"xxxxxxxxxxxx ########## xxxxxxxxxxxx\n"
+"xxxxxxxxxxxxx#######    xxxxxxxxxxx:\n"
+":::::xxxxxxxx:::::::::::xxxxxx::::::\n\n";
+
+#else
+
+/* prototypes only */
+extern unsigned char linux_logo_red[];
+extern unsigned char linux_logo_green[];
+extern unsigned char linux_logo_blue[];
+extern unsigned char linux_logo[];
+extern unsigned char linux_logo_bw[];
+extern unsigned char linux_logo16_red[];
+extern unsigned char linux_logo16_green[];
+extern unsigned char linux_logo16_blue[];
+extern unsigned char linux_logo16[];
+extern unsigned char *linux_serial_image;
+extern unsigned char *linux_mda_image;
+
+extern int (*console_show_logo)(void);
+
+#endif
diff -u --recursive --new-file v2.1.106/linux/include/asm-i386/pgtable.h linux/include/asm-i386/pgtable.h
--- v2.1.106/linux/include/asm-i386/pgtable.h	Tue Jun 23 10:01:26 1998
+++ linux/include/asm-i386/pgtable.h	Wed Jun 24 15:51:17 1998
@@ -161,7 +161,7 @@
 #endif /* !__ASSEMBLY__ */
 
 
-/* Certain architectures need to do special things when pte's
+/* Certain architectures need to do special things when PTEs
  * within a page table are directly modified.  Thus, the following
  * hook is made available.
  */
diff -u --recursive --new-file v2.1.106/linux/include/asm-i386/smp.h linux/include/asm-i386/smp.h
--- v2.1.106/linux/include/asm-i386/smp.h	Fri May  8 23:14:54 1998
+++ linux/include/asm-i386/smp.h	Wed Jun 24 14:30:11 1998
@@ -183,7 +183,7 @@
  
 extern void smp_callin(void);
 extern void smp_boot_cpus(void);
-extern void smp_store_cpu_info(int id);		/* Store per cpu info (like the initial udelay numbers */
+extern void smp_store_cpu_info(int id);		/* Store per CPU info (like the initial udelay numbers */
 extern void smp_message_pass(int target, int msg, unsigned long data, int wait);
 
 extern volatile unsigned long smp_proc_in_lock[NR_CPUS]; /* for computing process time */
diff -u --recursive --new-file v2.1.106/linux/include/asm-i386/softirq.h linux/include/asm-i386/softirq.h
--- v2.1.106/linux/include/asm-i386/softirq.h	Fri Jan 30 15:50:57 1998
+++ linux/include/asm-i386/softirq.h	Wed Jun 24 14:30:11 1998
@@ -50,7 +50,7 @@
 	atomic_dec(&global_bh_lock);
 }
 
-/* These are for the irq's testing the lock */
+/* These are for the IRQs testing the lock */
 static inline int softirq_trylock(int cpu)
 {
 	if (!test_and_set_bit(0,&global_bh_count)) {
diff -u --recursive --new-file v2.1.106/linux/include/asm-i386/string.h linux/include/asm-i386/string.h
--- v2.1.106/linux/include/asm-i386/string.h	Mon Apr  6 17:41:01 1998
+++ linux/include/asm-i386/string.h	Wed Jun 24 14:30:11 1998
@@ -403,7 +403,7 @@
 		case 4:
 			*(unsigned long *)to = *(const unsigned long *)from;
 			return to;
-		case 6:	/* for ethernet addresses */
+		case 6:	/* for Ethernet addresses */
 			*(unsigned long *)to = *(const unsigned long *)from;
 			*(2+(unsigned short *)to) = *(2+(const unsigned short *)from);
 			return to;
diff -u --recursive --new-file v2.1.106/linux/include/asm-i386/vm86.h linux/include/asm-i386/vm86.h
--- v2.1.106/linux/include/asm-i386/vm86.h	Sun Jun  7 11:16:37 1998
+++ linux/include/asm-i386/vm86.h	Wed Jun 24 14:30:11 1998
@@ -60,7 +60,7 @@
 #define VM86_GET_AND_RESET_IRQ	6
 
 /*
- * This is the stack-layout seen by the user space programm when we have
+ * This is the stack-layout seen by the user space program when we have
  * done a translation of "SAVE_ALL" from vm86 mode. The real kernel layout
  * is 'kernel_vm86_regs' (see below).
  */
diff -u --recursive --new-file v2.1.106/linux/include/linux/atalk.h linux/include/linux/atalk.h
--- v2.1.106/linux/include/linux/atalk.h	Fri Feb  6 15:33:34 1998
+++ linux/include/linux/atalk.h	Wed Jun 24 15:52:10 1998
@@ -1,5 +1,5 @@
 /*
- *	Appletalk networking structures
+ *	AppleTalk networking structures
  *
  *	The following are directly referenced from the University Of Michigan
  *	netatalk for compatibility reasons.
@@ -108,7 +108,7 @@
 	/* And netatalk apps expect to stick the type in themselves */
 };
 
-/* Appletalk AARP headers */
+/* AppleTalk AARP headers */
 
 struct elapaarp
 {
diff -u --recursive --new-file v2.1.106/linux/include/linux/blk.h linux/include/linux/blk.h
--- v2.1.106/linux/include/linux/blk.h	Tue Jun 23 10:01:29 1998
+++ linux/include/linux/blk.h	Wed Jun 24 15:51:31 1998
@@ -137,8 +137,8 @@
 
 #elif (MAJOR_NR == HD_MAJOR)
 
-/* harddisk: timeout is 6 seconds.. */
-#define DEVICE_NAME "harddisk"
+/* Hard disk:  timeout is 6 seconds. */
+#define DEVICE_NAME "hard disk"
 #define DEVICE_INTR do_hd
 #define DEVICE_TIMEOUT HD_TIMER
 #define TIMEOUT_VALUE (6*HZ)
@@ -292,7 +292,7 @@
 #define DEVICE_OFF(device)
 
 #elif (MAJOR_NR == CM206_CDROM_MAJOR)
-#define DEVICE_NAME "Philips/LMS cd-rom cm206"
+#define DEVICE_NAME "Philips/LMS CD-ROM cm206"
 #define DEVICE_REQUEST do_cm206_request
 #define DEVICE_NR(device) (MINOR(device))
 #define DEVICE_ON(device)
diff -u --recursive --new-file v2.1.106/linux/include/linux/bpqether.h linux/include/linux/bpqether.h
--- v2.1.106/linux/include/linux/bpqether.h	Sun Nov 10 09:12:57 1996
+++ linux/include/linux/bpqether.h	Wed Jun 24 14:30:11 1998
@@ -20,7 +20,7 @@
 /* 
  * For SIOCSBPQETHOPT - this is compatible with PI2/PacketTwin card drivers,
  * currently not implemented, though. If someone wants to hook a radio
- * to his ethernet card he may find this useful... ;-)
+ * to his Ethernet card he may find this useful. ;-)
  */
 
 #define SIOCGBPQETHPARAM	0x5000  /* get Level 1 parameters */
diff -u --recursive --new-file v2.1.106/linux/include/linux/byteorder/generic.h linux/include/linux/byteorder/generic.h
--- v2.1.106/linux/include/linux/byteorder/generic.h	Fri Dec  5 11:01:37 1997
+++ linux/include/linux/byteorder/generic.h	Wed Jun 24 14:30:11 1998
@@ -55,7 +55,7 @@
  *	__constant_htons(__u16 x)
  *
  * Conversion of XX-bit integers (16- 32- or 64-)
- * between native cpu format and little/big endian format
+ * between native CPU format and little/big endian format
  * 64-bit stuff only defined for proper architectures
  *	cpu_to_[bl]eXX(__uXX x)
  *	[bl]eXX_to_cpu(__uXX x)
diff -u --recursive --new-file v2.1.106/linux/include/linux/byteorder/swab.h linux/include/linux/byteorder/swab.h
--- v2.1.106/linux/include/linux/byteorder/swab.h	Fri Dec  5 05:52:57 1997
+++ linux/include/linux/byteorder/swab.h	Wed Jun 24 14:30:11 1998
@@ -3,7 +3,7 @@
 
 /*
  * linux/byteorder/swab.h
- * Byteswapping, independently from cpu endianness
+ * Byte-swapping, independently from CPU endianness
  *	swabXX[ps]?(foo)
  *
  * Francois-Rene Rideau <rideau@ens.fr> 19971205
diff -u --recursive --new-file v2.1.106/linux/include/linux/coda.h linux/include/linux/coda.h
--- v2.1.106/linux/include/linux/coda.h	Sun Jun  7 11:16:39 1998
+++ linux/include/linux/coda.h	Wed Jun 24 14:30:11 1998
@@ -1,4 +1,3 @@
-
 /*
  *
  * Based on cfs.h from Mach, but revamped for increased simplicity.
diff -u --recursive --new-file v2.1.106/linux/include/linux/console.h linux/include/linux/console.h
--- v2.1.106/linux/include/linux/console.h	Wed Apr  1 20:11:54 1998
+++ linux/include/linux/console.h	Wed Jun 24 14:44:02 1998
@@ -27,24 +27,29 @@
 /* DPC: 1994-04-13 !!! con_putcs is new entry !!! */
 
 struct consw {
-	unsigned long (*con_startup)(unsigned long, const char **);
-	void   (*con_init)(struct vc_data *);
-	int    (*con_deinit)(struct vc_data *);
-	int    (*con_clear)(struct vc_data *, int, int, int, int);
-	int    (*con_putc)(struct vc_data *, int, int, int);
-	int    (*con_putcs)(struct vc_data *, const char *, int, int, int);
-	int    (*con_cursor)(struct vc_data *, int);
-	int    (*con_scroll)(struct vc_data *, int, int, int, int);
-	int    (*con_bmove)(struct vc_data *, int, int, int, int, int, int);
-	int    (*con_switch)(struct vc_data *);
-	int    (*con_blank)(int);
-	int    (*con_get_font)(struct vc_data *, int *, int *, char *);
-	int    (*con_set_font)(struct vc_data *, int, int, char *);
-	int    (*con_set_palette)(struct vc_data *, unsigned char *);
+	unsigned long	(*con_startup)(unsigned long, const char **);
+	void	(*con_init)(struct vc_data *);
+	void	(*con_deinit)(struct vc_data *);
+	void	(*con_clear)(struct vc_data *, int, int, int, int);
+	void	(*con_putc)(struct vc_data *, int, int, int);
+	void	(*con_putcs)(struct vc_data *, const char *, int, int, int);
+	void	(*con_cursor)(struct vc_data *, int);
+	void	(*con_scroll)(struct vc_data *, int, int, int, int);
+	void	(*con_bmove)(struct vc_data *, int, int, int, int, int, int);
+	int	(*con_switch)(struct vc_data *);
+	int	(*con_blank)(int);
+	int	(*con_get_font)(struct vc_data *, int *, int *, char *);
+	int	(*con_set_font)(struct vc_data *, int, int, char *);
+	int	(*con_set_palette)(struct vc_data *, unsigned char *);
+	int	(*con_scrolldelta)(struct vc_data *, int);
 };
 
 extern struct consw *conswitchp;
 
+extern struct consw fb_con;	/* frame buffer based console */
+extern struct consw vga_con;	/* VGA text console */
+extern struct consw compat_con;	/* console wrapper */
+
 /* flag bits */
 #define CON_INITED  (1)
 
@@ -101,5 +106,11 @@
 extern void register_console(struct console *);
 extern int unregister_console(struct console *);
 extern struct console *console_drivers;
+
+/* VEA Blanking Levels */
+#define VESA_NO_BLANKING        0
+#define VESA_VSYNC_SUSPEND      1
+#define VESA_HSYNC_SUSPEND      2
+#define VESA_POWERDOWN          3
 
 #endif /* linux/console.h */
diff -u --recursive --new-file v2.1.106/linux/include/linux/console_compat.h linux/include/linux/console_compat.h
--- v2.1.106/linux/include/linux/console_compat.h	Wed Dec 31 16:00:00 1969
+++ linux/include/linux/console_compat.h	Wed Jun 24 14:44:02 1998
@@ -0,0 +1,163 @@
+/*
+ *  linux/include/linux/console_compat.h -- Abstract console wrapper
+ *
+ *	Copyright (C) 1998 Geert Uytterhoeven
+ *
+ *  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
+ *  for more details.
+ */
+
+#ifndef _LINUX_CONSOLE_COMPAT_H_
+#define _LINUX_CONSOLE_COMPAT_H_
+
+#undef video_num_columns
+#undef video_num_lines
+#undef video_size_row
+#undef video_type
+#undef video_mem_base
+#undef video_mem_term
+#undef video_screen_size
+#undef can_do_color
+#undef scr_writew
+#undef scr_readw
+#undef memsetw
+#undef memcpyw
+#undef set_cursor
+#undef hide_cursor
+#undef set_get_cmap
+#undef set_palette
+#undef set_get_font
+#undef set_vesa_blanking
+#undef vesa_blank
+#undef vesa_powerdown
+#undef con_adjust_height
+#undef con_type_init
+#undef con_type_init_finish
+
+#define video_num_columns	compat_video_num_columns
+#define video_num_lines		compat_video_num_lines
+#define video_size_row		compat_video_size_row
+#define video_type		compat_video_type
+#define video_mem_base		compat_video_mem_base
+#define video_mem_term		compat_video_mem_term
+#define video_screen_size	compat_video_screen_size
+#define can_do_color		compat_can_do_color
+#define scr_writew		compat_scr_writew
+#define scr_readw		compat_scr_readw
+#define memsetw			compat_memsetw
+#define memcpyw			compat_memcpyw
+#define set_cursor		compat_set_cursor
+#define hide_cursor		compat_hide_cursor
+#define set_get_cmap		compat_set_get_cmap
+#define set_palette		compat_set_palette
+#define set_get_font		compat_set_get_font
+#define set_vesa_blanking	compat_set_vesa_blanking
+#define vesa_blank		compat_vesa_blank
+#define vesa_powerdown		compat_vesa_powerdown
+#define con_adjust_height	compat_con_adjust_height
+#define con_type_init		compat_con_type_init
+#define con_type_init_finish	compat_con_type_init_finish
+
+extern unsigned long compat_video_num_columns; 
+extern unsigned long compat_video_num_lines;
+extern unsigned long compat_video_size_row;    
+extern unsigned char compat_video_type;
+extern unsigned long compat_video_mem_base;
+extern unsigned long compat_video_mem_term;
+extern unsigned long compat_video_screen_size;
+extern int compat_can_do_color;
+extern void compat_set_cursor(int currcons);
+extern void compat_hide_cursor(void);
+extern int compat_set_get_cmap(unsigned char *arg, int set);
+extern void compat_set_palette(void);
+extern int compat_set_get_font(unsigned char * arg, int set, int ch512);
+extern void compat_set_vesa_blanking(unsigned long arg);
+extern void compat_vesa_blank(void);
+extern void compat_vesa_powerdown(void);
+extern int compat_con_adjust_height(unsigned long fontheight);
+extern void compat_con_type_init(const char **);
+extern void compat_con_type_init_finish(void);
+
+#if defined(CONFIG_SUN_CONSOLE)
+	void (*memsetw)(void *, unsigned short, unsigned int);
+	void (*memcpyw)(unsigned short *, unsigned short *, unsigned int);
+	void (*scr_writew)(unsigned short, unsigned short *);
+	unsigned short (*scr_readw)(unsigned short *);
+	void (*get_scrmem)(int);
+	void (*set_scrmem)(int, long);
+	void (*set_origin)(unsigned short);
+	void (*hide_cursor)(void);
+	void (*set_cursor)(int);
+	int (*set_get_font)(char *, int, int);
+	int (*con_adjust_height)(unsigned long);
+	int (*set_get_cmap)(unsigned char *, int);
+	void (*set_palette)(void);
+	void (*set_other_palette)(int);
+	void (*console_restore_palette)(void);
+	void (*con_type_init)(const char **);
+	void (*con_type_init_finish)(void);
+
+	/* VESA powerdown methods */
+	void (*vesa_blank)(void);
+	void (*vesa_unblank)(void);
+	void (*set_vesa_blanking)(const unsigned long);
+	void (*vesa_powerdown)(void);
+
+	void (*clear_screen)(void);
+	void (*render_screen)(void);
+	void (*clear_margin)(void);
+};
+
+#define compat_memsetw(s,c,count)	suncons_ops.memsetw((s),(c),(count))
+#define compat_memcpyw(to,from,count)	suncons_ops.memcpyw((to),(from),(count))
+#define compat_scr_writew(val,addr)	suncons_ops.scr_writew((val),(addr))
+#define compat_scr_readw(addr)		suncons_ops.scr_readw((addr))
+
+#elif defined(CONFIG_PMAC_CONSOLE)
+extern void pmac_blitc(unsigned, unsigned long);
+extern void compat_memsetw(unsigned short *p, unsigned short c, unsigned count);
+extern void compat_memcpyw(unsigned short *to, unsigned short *from, unsigned count);
+
+static inline void compat_scr_writew(unsigned short val, unsigned short * addr)
+{
+	if ((unsigned long)addr < video_mem_term &&
+	    (unsigned long)addr >= video_mem_base) {
+		if (*addr != val) {
+			*addr = val;
+			pmac_blitc(val, (unsigned long) addr);
+		}
+	} else
+		*addr = val;
+}
+
+static inline unsigned short compat_scr_readw(unsigned short * addr)
+{
+	return *addr;
+}
+#endif
+
+#if !defined(CONFIG_SUN_CONSOLE) && !defined(CONFIG_PMAC_CONSOLE)
+static inline void compat_memsetw(void * s, unsigned short c, unsigned int count)
+{
+	unsigned short * addr = (unsigned short *) s;
+
+	count /= 2;
+	while (count) {
+		count--;
+		scr_writew(c, addr++);
+	}
+}
+
+static inline void compat_memcpyw(unsigned short *to, unsigned short *from,
+				  unsigned int count)
+{
+	count /= 2;
+	while (count) {
+		count--;
+		scr_writew(scr_readw(from++), to++);
+	}
+}
+#endif
+
+#endif /* _LINUX_CONSOLE_COMPAT_H_ */
diff -u --recursive --new-file v2.1.106/linux/include/linux/console_struct.h linux/include/linux/console_struct.h
--- v2.1.106/linux/include/linux/console_struct.h	Mon Jan  5 00:23:17 1998
+++ linux/include/linux/console_struct.h	Wed Jun 24 14:44:02 1998
@@ -4,11 +4,22 @@
  * Data structure and defines shared between console.c, vga.c and tga.c
  */
 
+/*
+ * You can set here how should the cursor look by default.
+ * In case you set CONFIG_SOFTCURSOR, this might be really interesting.
+ */
+#define CUR_DEFAULT CUR_UNDERLINE
+
 #include <linux/config.h>
 
 #define NPAR 16
 
 struct vc_data {
+	unsigned short	vc_num;			/* Console number */
+	unsigned long	vc_cols;
+	unsigned long	vc_rows;
+	unsigned long	vc_size_row;
+	struct consw	*vc_sw;
 	unsigned long	vc_screenbuf_size;
 	unsigned short	vc_video_erase_char;	/* Background erase character */
 	unsigned char	vc_attr;		/* Current attributes */
@@ -23,13 +34,8 @@
 	unsigned long	vc_top,vc_bottom;
 	unsigned long	vc_state;
 	unsigned long	vc_npar,vc_par[NPAR];
-#ifdef CONFIG_FB_CONSOLE
-	unsigned short	*vc_video_mem_start;	/* Start of video RAM		*/
-	unsigned short	*vc_pos;
-#else
 	unsigned long	vc_pos;
 	unsigned long	vc_video_mem_start;	/* Start of video RAM		*/
-#endif
 	unsigned long	vc_video_mem_end;	/* End of video RAM (sort of)	*/
 	unsigned long	vc_saved_x;
 	unsigned long	vc_saved_y;
@@ -72,6 +78,7 @@
 	unsigned char 	vc_saved_G1;
 	unsigned int	vc_bell_pitch;		/* Console bell pitch */
 	unsigned int	vc_bell_duration;	/* Console bell duration */
+	unsigned int	vc_cursor_type;
 	/* additional information is in vt_kern.h */
 };
 
@@ -85,65 +92,12 @@
 
 extern struct vc vc_cons [MAX_NR_CONSOLES];
 
-#define screenbuf_size	(vc_cons[currcons].d->vc_screenbuf_size)
-#define origin		(vc_cons[currcons].d->vc_origin)
-#define scr_end	(vc_cons[currcons].d->vc_scr_end)
-#define pos		(vc_cons[currcons].d->vc_pos)
-#define top		(vc_cons[currcons].d->vc_top)
-#define bottom		(vc_cons[currcons].d->vc_bottom)
-#define x		(vc_cons[currcons].d->vc_x)
-#define y		(vc_cons[currcons].d->vc_y)
-#define vc_state	(vc_cons[currcons].d->vc_state)
-#define npar		(vc_cons[currcons].d->vc_npar)
-#define par		(vc_cons[currcons].d->vc_par)
-#define ques		(vc_cons[currcons].d->vc_ques)
-#define attr		(vc_cons[currcons].d->vc_attr)
-#define saved_x	(vc_cons[currcons].d->vc_saved_x)
-#define saved_y	(vc_cons[currcons].d->vc_saved_y)
-#define translate	(vc_cons[currcons].d->vc_translate)
-#define G0_charset	(vc_cons[currcons].d->vc_G0_charset)
-#define G1_charset	(vc_cons[currcons].d->vc_G1_charset)
-#define saved_G0	(vc_cons[currcons].d->vc_saved_G0)
-#define saved_G1	(vc_cons[currcons].d->vc_saved_G1)
-#define utf		(vc_cons[currcons].d->vc_utf)
-#define utf_count	(vc_cons[currcons].d->vc_utf_count)
-#define utf_char	(vc_cons[currcons].d->vc_utf_char)
-#define video_mem_start (vc_cons[currcons].d->vc_video_mem_start)
-#define video_mem_end	(vc_cons[currcons].d->vc_video_mem_end)
-#define video_erase_char (vc_cons[currcons].d->vc_video_erase_char)
-#define disp_ctrl	(vc_cons[currcons].d->vc_disp_ctrl)
-#define toggle_meta	(vc_cons[currcons].d->vc_toggle_meta)
-#define decscnm	(vc_cons[currcons].d->vc_decscnm)
-#define decom		(vc_cons[currcons].d->vc_decom)
-#define decawm		(vc_cons[currcons].d->vc_decawm)
-#define deccm		(vc_cons[currcons].d->vc_deccm)
-#define decim		(vc_cons[currcons].d->vc_decim)
-#define deccolm	(vc_cons[currcons].d->vc_deccolm)
-#define need_wrap	(vc_cons[currcons].d->vc_need_wrap)
-#define has_scrolled	(vc_cons[currcons].d->vc_has_scrolled)
-#define kmalloced	(vc_cons[currcons].d->vc_kmalloced)
-#define report_mouse	(vc_cons[currcons].d->vc_report_mouse)
-#define color		(vc_cons[currcons].d->vc_color)
-#define s_color	(vc_cons[currcons].d->vc_s_color)
-#define def_color	(vc_cons[currcons].d->vc_def_color)
-#define 	foreground	(color & 0x0f)
-#define 	background	(color & 0xf0)
-#define charset	(vc_cons[currcons].d->vc_charset)
-#define s_charset	(vc_cons[currcons].d->vc_s_charset)
-#define	intensity	(vc_cons[currcons].d->vc_intensity)
-#define	underline	(vc_cons[currcons].d->vc_underline)
-#define	blink		(vc_cons[currcons].d->vc_blink)
-#define	reverse		(vc_cons[currcons].d->vc_reverse)
-#define	s_intensity	(vc_cons[currcons].d->vc_s_intensity)
-#define	s_underline	(vc_cons[currcons].d->vc_s_underline)
-#define	s_blink		(vc_cons[currcons].d->vc_s_blink)
-#define	s_reverse	(vc_cons[currcons].d->vc_s_reverse)
-#define	ulcolor		(vc_cons[currcons].d->vc_ulcolor)
-#define	halfcolor	(vc_cons[currcons].d->vc_halfcolor)
-#define tab_stop	(vc_cons[currcons].d->vc_tab_stop)
-#define palette		(vc_cons[currcons].d->vc_palette)
-#define bell_pitch	(vc_cons[currcons].d->vc_bell_pitch)
-#define bell_duration	(vc_cons[currcons].d->vc_bell_duration)
-
-#define vcmode		(vt_cons[currcons]->vc_mode)
-#define structsize	(sizeof(struct vc_data) + sizeof(struct vt_struct))
+#define CUR_DEF		0
+#define CUR_NONE	1
+#define CUR_UNDERLINE	2
+#define CUR_LOWER_THIRD	3
+#define CUR_LOWER_HALF	4
+#define CUR_TWO_THIRDS	5
+#define CUR_BLOCK	6
+#define CUR_HWMASK	0x0f
+#define CUR_SWMASK	0xfff0
diff -u --recursive --new-file v2.1.106/linux/include/linux/elf.h linux/include/linux/elf.h
--- v2.1.106/linux/include/linux/elf.h	Fri May  8 23:14:56 1998
+++ linux/include/linux/elf.h	Wed Jun 24 14:30:11 1998
@@ -127,8 +127,8 @@
 #define AT_EUID   12	/* effective uid */
 #define AT_GID    13	/* real gid */
 #define AT_EGID   14	/* effective gid */
-#define AT_PLATFORM 15  /* string identifying cpu for optimizations */
-#define AT_HWCAP  16    /* arch dependent hints at cpu capabilities */
+#define AT_PLATFORM 15  /* string identifying CPU for optimizations */
+#define AT_HWCAP  16    /* arch dependent hints at CPU capabilities */
 
 typedef struct dynamic{
   Elf32_Sword d_tag;
@@ -206,7 +206,7 @@
 
 /* Bits present in AT_HWCAP, primarily for Sparc32.  */
 
-#define HWCAP_SPARC_FLUSH       1       /* The cpu supports flush insn.  */
+#define HWCAP_SPARC_FLUSH       1    /* CPU supports flush instruction. */
 #define HWCAP_SPARC_STBAR       2
 #define HWCAP_SPARC_SWAP        4
 #define HWCAP_SPARC_MULDIV      8
diff -u --recursive --new-file v2.1.106/linux/include/linux/fb.h linux/include/linux/fb.h
--- v2.1.106/linux/include/linux/fb.h	Thu Mar 26 15:57:05 1998
+++ linux/include/linux/fb.h	Wed Jun 24 14:44:02 1998
@@ -30,6 +30,8 @@
 #define FB_TYPE_PACKED_PIXELS		0	/* Packed Pixels	*/
 #define FB_TYPE_PLANES			1	/* Non interleaved planes */
 #define FB_TYPE_INTERLEAVED_PLANES	2	/* Interleaved planes	*/
+#define FB_TYPE_VGA_TEXT		3	/* VGA text/attributes	*/
+#define FB_TYPE_S3_MMIO_TEXT		4	/* S3 MMIO text		*/
 
 #define FB_VISUAL_MONO01		0	/* Monochr. 1=Black 0=White */
 #define FB_VISUAL_MONO10		1	/* Monochr. 1=White 0=Black */
@@ -37,11 +39,23 @@
 #define FB_VISUAL_PSEUDOCOLOR		3	/* Pseudo color (like atari) */
 #define FB_VISUAL_DIRECTCOLOR		4	/* Direct color */
 #define FB_VISUAL_STATIC_PSEUDOCOLOR	5	/* Pseudo color readonly */
-#define FB_VISUAL_STATIC_DIRECTCOLOR	6	/* Direct color readonly */
+
+#define FB_ACCEL_NONE		0	/* no hardware accelerator	*/
+#define FB_ACCEL_ATARIBLITT	1	/* Atari Blitter		*/
+#define FB_ACCEL_AMIGABLITT	2	/* Amiga Blitter                */
+#define FB_ACCEL_S3_TRIO64	3	/* Cybervision64 (S3 Trio64)    */
+#define FB_ACCEL_NCR_77C32BLT	4	/* RetinaZ3 (NCR 77C32BLT)      */
+#define FB_ACCEL_S3_VIRGE	5	/* Cybervision64/3D (S3 ViRGE)	*/
+#define FB_ACCEL_ATI_MACH64GX	6	/* ATI Mach 64GX family		*/
+#define FB_ACCEL_DEC_TGA	7	/* DEC 21030 TGA		*/
+#define FB_ACCEL_ATI_MACH64CT	8	/* ATI Mach 64CT family		*/
+#define FB_ACCEL_ATI_MACH64VT	9	/* ATI Mach 64CT family VT class */
+#define FB_ACCEL_ATI_MACH64GT	10	/* ATI Mach 64CT family GT class */
 
 struct fb_fix_screeninfo {
 	char id[16];			/* identification string eg "TT Builtin" */
 	char *smem_start;		/* Start of frame buffer mem */
+					/* (physical address) */
 	__u32 smem_len;			/* Length of frame buffer mem */
 	__u32 type;			/* see FB_TYPE_*		*/
 	__u32 type_aux;			/* Interleave for interleaved Planes */
@@ -50,12 +64,19 @@
 	__u16 ypanstep;			/* zero if no hardware panning  */
 	__u16 ywrapstep;		/* zero if no hardware ywrap    */
 	__u32 line_length;		/* length of a line in bytes    */
-	unsigned char *mmio_start;	/* Start of Memory Mapped I/O   */
+	char *mmio_start;		/* Start of Memory Mapped I/O   */
+					/* (physical address) */
 	__u32 mmio_len;			/* Length of Memory Mapped I/O  */
 	__u32 accel;			/* Type of acceleration available */
 	__u16 reserved[3];		/* Reserved for future compatibility */
 };
 
+/* Interpretation of offset for color fields: All offsets are from the right,
+ * inside a "pixel" value, which is exactly 'bits_per_pixel' wide (means: you
+ * can use the offset as right argument to <<). A pixel afterwards is a bit
+ * stream and is written to video memory as that unmodified. This implies
+ * big-endian byte order if bits_per_pixel is greater than 8.
+ */
 struct fb_bitfield {
 	__u32 offset;			/* beginning of bitfield	*/
 	__u32 length;			/* length of bitfield		*/
@@ -73,15 +94,7 @@
 #define FB_ACTIVATE_VBL	       16	/* activate values on next vbl  */
 #define FB_CHANGE_CMAP_VBL     32	/* change colormap on vbl	*/
 
-#define FB_ACCEL_NONE		0	/* no hardware accelerator	*/
-#define FB_ACCEL_ATARIBLITT	1	/* Atari Blitter		*/
-#define FB_ACCEL_AMIGABLITT	2	/* Amiga Blitter                */
-#define FB_ACCEL_S3TRIO64	3	/* Cybervision64 (S3 Trio64)    */
-#define FB_ACCEL_NCR77C32BLT	4	/* RetinaZ3 (NCR77C32BLT)       */
-#define FB_ACCEL_S3VIRGE	5	/* Cybervision64/3D (S3 ViRGE)	*/
-#define FB_ACCEL_MACH64		6	/* ATI Mach 64			*/
-#define FB_ACCEL_TGA		7	/* DEC 21030 TGA		*/
-#define FB_ACCEL_ATY		8	/* atyfb (ATI Mach64)		*/
+#define FB_ACCELF_TEXT		1	/* text mode acceleration */
 
 #define FB_SYNC_HOR_HIGH_ACT	1	/* horizontal sync high active	*/
 #define FB_SYNC_VERT_HIGH_ACT	2	/* vertical sync high active	*/
@@ -124,7 +137,7 @@
 	__u32 height;			/* height of picture in mm    */
 	__u32 width;			/* width of picture in mm     */
 
-	__u32 accel;			/* see FB_ACCEL_*		*/
+	__u32 accel_flags;		/* acceleration flags (hints)	*/
 
 	/* Timing: All values in pixclocks, except pixclock (of course) */
 	__u32 pixclock;			/* pixel clock in ps (pico seconds) */
@@ -154,10 +167,10 @@
 };
 
 struct fb_monspecs {
-	unsigned hfmin : 20;		/* hfreq lower limit (Hz) */
-	unsigned hfmax : 20; 		/* hfreq upper limit (Hz) */
-	unsigned vfmin : 10;		/* vfreq lower limit (Hz) */
-	unsigned vfmax : 10;		/* vfreq upper limit (Hz) */
+	__u32 hfmin;			/* hfreq lower limit (Hz) */
+	__u32 hfmax; 			/* hfreq upper limit (Hz) */
+	__u16 vfmin;			/* vfreq lower limit (Hz) */
+	__u16 vfmax;			/* vfreq upper limit (Hz) */
 	unsigned dpms : 1;		/* supports DPMS */
 };
 
@@ -196,8 +209,6 @@
     /* pan display */
     int (*fb_pan_display)(struct fb_var_screeninfo *var, int con,
 			  struct fb_info *info);
-    /* switch between text and graphics mode */
-    int (*fb_set_mode)(int mode, struct fb_info *info);
     /* perform fb specific ioctl */
     int (*fb_ioctl)(struct inode *inode, struct file *file, unsigned int cmd,
 		    unsigned long arg, int con, struct fb_info *info);
@@ -216,6 +227,7 @@
                                     /* are updated by fbcon.c */
    struct fb_cmap cmap;             /* colormap */
    char *screen_base;               /* pointer to top of virtual screen */    
+				    /* (virtual address) */
    int visual;
    int type;                        /* see FB_TYPE_* */
    int type_aux;                    /* Interleave for interleaved Planes */
@@ -265,6 +277,8 @@
    int (*updatevar)(int, struct fb_info*);
 					/* tell fb to update the vars */
    void (*blank)(int, struct fb_info*);	/* tell fb to (un)blank the screen */
+					/* arg = 0: unblank */
+					/* arg > 0: VESA level (arg-1) */
 
    /* From here on everything is device dependent */
 };
@@ -349,6 +363,12 @@
 		       struct fb_info *fb_info);
 extern struct fb_cmap *fb_default_cmap(int len);
 extern void fb_invert_cmaps(void);
+
+/* VESA Blanking Levels */
+#define VESA_NO_BLANKING	0
+#define VESA_VSYNC_SUSPEND	1
+#define VESA_HSYNC_SUSPEND	2
+#define VESA_POWERDOWN		3
 
 #endif /* __KERNEL__ */
 
diff -u --recursive --new-file v2.1.106/linux/include/linux/fd.h linux/include/linux/fd.h
--- v2.1.106/linux/include/linux/fd.h	Fri May  8 23:14:56 1998
+++ linux/include/linux/fd.h	Wed Jun 24 14:30:11 1998
@@ -116,7 +116,7 @@
  * Drive parameters (user modifiable)
  */
 struct floppy_drive_params {
-	signed char cmos;		/* cmos type */
+	signed char cmos;		/* CMOS type */
 	
 	/* Spec2 is (HLD<<1 | ND), where HLD is head load time (1=2ms, 2=4 ms 
 	 * etc) and ND is set means no DMA. Hardcoded to 6 (HLD=6ms, use DMA).
diff -u --recursive --new-file v2.1.106/linux/include/linux/kernel_stat.h linux/include/linux/kernel_stat.h
--- v2.1.106/linux/include/linux/kernel_stat.h	Fri Jan 23 18:10:32 1998
+++ linux/include/linux/kernel_stat.h	Wed Jun 24 14:51:52 1998
@@ -8,7 +8,7 @@
 
 /*
  * 'kernel_stat.h' contains the definitions needed for doing
- * some kernel statistics (cpu usage, context switches ...),
+ * some kernel statistics (CPU usage, context switches ...),
  * used by rstatd/perfmeter
  */
 
diff -u --recursive --new-file v2.1.106/linux/include/linux/linux_logo.h linux/include/linux/linux_logo.h
--- v2.1.106/linux/include/linux/linux_logo.h	Wed Dec 31 16:00:00 1969
+++ linux/include/linux/linux_logo.h	Wed Jun 24 14:44:02 1998
@@ -0,0 +1,1444 @@
+/* $Id: linux_logo.h,v 1.1 1998/05/04 14:21:03 jj Exp $
+ * include/linux/linux_logo.h: This is a linux logo
+ *                             to be displayed on boot.
+ *
+ * Copyright (C) 1996 Larry Ewing (lewing@isc.tamu.edu)
+ * Copyright (C) 1996 Jakub Jelinek (jj@sunsite.mff.cuni.cz)
+ *
+ * You can put anything here, but:
+ * LINUX_LOGO_COLORS has to be less than 224
+ * image size has to be 80x80
+ * values have to start from 0x20
+ * (i.e. RGB(linux_logo_red[0],
+ *           linux_logo_green[0],
+ *           linux_logo_blue[0]) is color 0x20)
+ * BW image has to be 80x80 as well, with MS bit
+ * on the left
+ * Serial_console ascii image can be any size,
+ * but should contain %s to display the version
+ */
+
+#if LINUX_LOGO_COLORS == 221
+
+unsigned char linux_logo_red[] __initdata = {
+  0xF3, 0xF6, 0xF8, 0xF7, 0xEF, 0xE7, 0xE5, 0xE3,
+  0xCA, 0xD4, 0xDD, 0xC8, 0xC7, 0xC4, 0xC2, 0xE5,
+  0xF1, 0xED, 0xEE, 0xE6, 0xC6, 0xDA, 0xDD, 0xE5,
+  0xD9, 0xC6, 0xE3, 0xD0, 0xC6, 0xBA, 0xB0, 0xB6,
+  0xBB, 0xBE, 0xB9, 0xB8, 0xB3, 0xB2, 0xB0, 0xAD,
+  0xAC, 0xA9, 0xA8, 0xA6, 0xA4, 0xA1, 0xA0, 0x9D,
+  0xA0, 0x9F, 0x9E, 0x9C, 0x9B, 0x99, 0x9A, 0x99,
+  0x98, 0x95, 0x96, 0x94, 0x93, 0x92, 0x8F, 0x8D,
+  0x8C, 0x8A, 0x87, 0x86, 0x83, 0x81, 0x0D, 0x03,
+  0x66, 0x44, 0x24, 0x08, 0xD6, 0xE6, 0xE9, 0xE6,
+  0xE7, 0xCA, 0xDC, 0xDB, 0xD5, 0xD0, 0xC9, 0xE2,
+  0xD5, 0xC6, 0xC4, 0xB3, 0xB2, 0xB9, 0xA9, 0x9A,
+  0xB2, 0x9D, 0xE8, 0xEC, 0xF5, 0xF5, 0xF4, 0xF4,
+  0xEC, 0xEE, 0xF0, 0xF5, 0xE0, 0xD6, 0xC5, 0xC2,
+  0xD9, 0xD5, 0xD8, 0xD6, 0xF6, 0xF4, 0xED, 0xEC,
+  0xEB, 0xF1, 0xF6, 0xF5, 0xF5, 0xEE, 0xEF, 0xEC,
+  0xE7, 0xE3, 0xE6, 0xD6, 0xDD, 0xC3, 0xD6, 0xD7,
+  0xCD, 0xCA, 0xC3, 0xAC, 0x95, 0x99, 0xB7, 0xA3,
+  0x8B, 0x88, 0x95, 0x8A, 0x94, 0xD2, 0xCC, 0xC4,
+  0xA8, 0x8E, 0x8F, 0xAE, 0xB8, 0xAC, 0xB6, 0xB4,
+  0xAD, 0xA5, 0xA0, 0x9B, 0x8B, 0xA3, 0x94, 0x87,
+  0x85, 0x89, 0x53, 0x80, 0x7D, 0x7C, 0x7A, 0x78,
+  0x76, 0x71, 0x73, 0x6E, 0x6B, 0x67, 0x65, 0x62,
+  0x4B, 0x5B, 0x5F, 0x53, 0x56, 0x52, 0x4F, 0x46,
+  0x42, 0x0F, 0x75, 0x78, 0x7D, 0x72, 0x5F, 0x6E,
+  0x7A, 0x75, 0x6A, 0x58, 0x48, 0x4F, 0x00, 0x2B,
+  0x37, 0x3E, 0x32, 0x33, 0x25, 0x2C, 0x3B, 0x11,
+  0x1D, 0x14, 0x06, 0x02, 0x00
+};
+
+unsigned char linux_logo_green[] __initdata = {
+  0xF3, 0xF6, 0xF8, 0xF7, 0xEF, 0xE7, 0xE5, 0xE3,
+  0xCA, 0xD4, 0xDD, 0xC8, 0xC7, 0xC4, 0xC2, 0xD3,
+  0xDA, 0xD4, 0xD7, 0xCC, 0xC1, 0xCC, 0xCB, 0xC9,
+  0xC5, 0xBC, 0xBC, 0xBB, 0xB7, 0xA5, 0xB0, 0xB6,
+  0xBB, 0xBE, 0xB9, 0xB8, 0xB3, 0xB2, 0xAD, 0xAD,
+  0xAC, 0xA9, 0xA8, 0xA6, 0xA4, 0xA1, 0xA0, 0x95,
+  0xA0, 0x9F, 0x9E, 0x9C, 0x9B, 0x99, 0x9A, 0x99,
+  0x98, 0x95, 0x96, 0x94, 0x93, 0x92, 0x8F, 0x8D,
+  0x8C, 0x8A, 0x87, 0x86, 0x83, 0x81, 0x08, 0x02,
+  0x53, 0x2E, 0x19, 0x06, 0xC6, 0xC8, 0xCF, 0xBD,
+  0xB3, 0xB6, 0xB4, 0xAB, 0xA5, 0xA3, 0x9B, 0xB6,
+  0xA7, 0x99, 0x92, 0xA4, 0x9E, 0x9D, 0x98, 0x8C,
+  0x8A, 0x86, 0xCD, 0xCC, 0xC9, 0xD7, 0xCA, 0xC4,
+  0xCA, 0xC3, 0xC7, 0xC3, 0xC8, 0xB4, 0x91, 0x8E,
+  0x8A, 0x82, 0x87, 0x85, 0xBD, 0xBF, 0xB6, 0xBC,
+  0xAE, 0xB7, 0xBC, 0xB8, 0xBF, 0xB6, 0xBC, 0xB5,
+  0xAB, 0xA6, 0xAD, 0xB2, 0xA5, 0x87, 0x9C, 0x96,
+  0x95, 0x8E, 0x87, 0x8F, 0x86, 0x86, 0x8E, 0x80,
+  0x7A, 0x70, 0x7B, 0x78, 0x78, 0x7F, 0x77, 0x6F,
+  0x70, 0x76, 0x59, 0x77, 0x68, 0x64, 0x7B, 0x7C,
+  0x75, 0x6D, 0x77, 0x69, 0x65, 0x5F, 0x5B, 0x54,
+  0x4F, 0x5B, 0x39, 0x80, 0x7D, 0x7C, 0x7A, 0x78,
+  0x76, 0x71, 0x73, 0x6E, 0x6B, 0x67, 0x65, 0x62,
+  0x4B, 0x5B, 0x5F, 0x53, 0x56, 0x52, 0x4F, 0x46,
+  0x42, 0x0B, 0x69, 0x66, 0x64, 0x57, 0x4A, 0x4E,
+  0x55, 0x4B, 0x46, 0x3B, 0x30, 0x33, 0x00, 0x2B,
+  0x37, 0x3E, 0x32, 0x33, 0x25, 0x2C, 0x29, 0x0D,
+  0x1D, 0x14, 0x06, 0x02, 0x00
+};
+
+unsigned char linux_logo_blue[] __initdata = {
+  0xF3, 0xF6, 0xF8, 0xF7, 0xEF, 0xEE, 0xE5, 0xDE,
+  0xD7, 0xD3, 0xDD, 0xC8, 0xC7, 0xC4, 0xC2, 0xB5,
+  0xB0, 0xA6, 0xAC, 0x9B, 0xB5, 0xB5, 0xAE, 0x84,
+  0x90, 0xA9, 0x81, 0x8D, 0x96, 0x86, 0xB0, 0xB6,
+  0xBB, 0xBE, 0xB9, 0xB8, 0xB3, 0xB2, 0xA7, 0xAD,
+  0xAC, 0xA9, 0xA8, 0xA6, 0xA4, 0xA1, 0xA5, 0x87,
+  0xA0, 0x9F, 0x9E, 0x9C, 0x9B, 0x9A, 0x9A, 0x99,
+  0x98, 0x95, 0x96, 0x94, 0x93, 0x92, 0x8F, 0x8D,
+  0x8C, 0x8A, 0x87, 0x86, 0x83, 0x81, 0xC8, 0xD7,
+  0x9B, 0x8E, 0x8C, 0xB2, 0x77, 0x77, 0x4E, 0x77,
+  0x69, 0x71, 0x78, 0x6B, 0x65, 0x66, 0x64, 0x59,
+  0x5C, 0x5A, 0x48, 0x72, 0x7B, 0x6B, 0x67, 0x6E,
+  0x42, 0x5B, 0x29, 0x36, 0x25, 0x10, 0x17, 0x14,
+  0x19, 0x16, 0x13, 0x0E, 0x08, 0x2E, 0x2E, 0x3D,
+  0x24, 0x24, 0x24, 0x24, 0x13, 0x12, 0x14, 0x14,
+  0x0E, 0x08, 0x0D, 0x0F, 0x08, 0x0D, 0x0E, 0x08,
+  0x08, 0x0C, 0x06, 0x06, 0x07, 0x16, 0x07, 0x0E,
+  0x08, 0x0A, 0x07, 0x0D, 0x2D, 0x3E, 0x09, 0x4E,
+  0x68, 0x52, 0x56, 0x58, 0x4B, 0x22, 0x20, 0x20,
+  0x27, 0x39, 0x28, 0x19, 0x1E, 0x1E, 0x08, 0x06,
+  0x07, 0x09, 0x08, 0x08, 0x05, 0x1D, 0x1F, 0x17,
+  0x18, 0x06, 0x79, 0x80, 0x7D, 0x7C, 0x7A, 0x78,
+  0x76, 0x71, 0x73, 0x6E, 0x6B, 0x68, 0x65, 0x62,
+  0x4B, 0x5B, 0x5F, 0x55, 0x56, 0x52, 0x4F, 0x46,
+  0x42, 0x5A, 0x14, 0x23, 0x3D, 0x2B, 0x21, 0x14,
+  0x06, 0x04, 0x03, 0x07, 0x09, 0x13, 0x2A, 0x3A,
+  0x37, 0x3E, 0x32, 0x33, 0x25, 0x2C, 0x07, 0x09,
+  0x1D, 0x14, 0x06, 0x02, 0x00
+};
+
+unsigned char linux_logo[] __initdata = {
+  0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57,
+  0x57, 0x57, 0x58, 0x57, 0x57, 0x57, 0x57, 0x57,
+  0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x58, 0x57,
+  0x58, 0x58, 0x59, 0x5C, 0x5D, 0x5F, 0x60, 0x61,
+  0x62, 0x61, 0x61, 0x62, 0x62, 0x62, 0x63, 0x63,
+  0x61, 0x61, 0x61, 0x61, 0x61, 0x60, 0x5E, 0x5E,
+  0x5E, 0x5D, 0x5D, 0x5C, 0x5D, 0x5B, 0x58, 0x58,
+  0x58, 0x57, 0x58, 0x57, 0x57, 0x57, 0x57, 0x58,
+  0x57, 0x57, 0x58, 0x57, 0x57, 0x58, 0x57, 0x57,
+  0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57,
+  0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57,
+  0x57, 0x57, 0x58, 0x57, 0x57, 0x57, 0x57, 0x57,
+  0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x58, 0x57,
+  0x54, 0x56, 0x57, 0x67, 0xFC, 0xFC, 0xFC, 0xFC,
+  0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0x67, 0x4C,
+  0x4A, 0x49, 0x4A, 0x49, 0x4A, 0x49, 0x49, 0x4A,
+  0x4A, 0x4B, 0x4B, 0x4B, 0x4C, 0x50, 0x51, 0x52,
+  0x54, 0x54, 0x56, 0x57, 0x57, 0x57, 0x57, 0x58,
+  0x57, 0x57, 0x58, 0x57, 0x57, 0x58, 0x57, 0x57,
+  0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57,
+  0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57,
+  0x57, 0x57, 0x58, 0x57, 0x57, 0x57, 0x57, 0x57,
+  0x57, 0x57, 0x57, 0x57, 0x58, 0x56, 0x56, 0x53,
+  0x52, 0x53, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC,
+  0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFB, 0xFB, 0xFB,
+  0x4B, 0x4B, 0x4B, 0x4A, 0x49, 0x4A, 0x4A, 0x49,
+  0x49, 0x49, 0x48, 0x49, 0x49, 0x4A, 0x4A, 0x4B,
+  0x4C, 0x4D, 0x52, 0x54, 0x56, 0x55, 0x57, 0x58,
+  0x57, 0x57, 0x58, 0x57, 0x57, 0x58, 0x57, 0x57,
+  0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57,
+  0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57,
+  0x57, 0x57, 0x58, 0x57, 0x57, 0x57, 0x57, 0x57,
+  0x57, 0x57, 0x55, 0x54, 0x53, 0x52, 0x51, 0x50,
+  0x50, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC,
+  0xFC, 0xFC, 0xFC, 0xFC, 0xF8, 0xF0, 0xF4, 0xFB,
+  0xFC, 0x67, 0x53, 0x50, 0x4D, 0x4C, 0x4C, 0x4C,
+  0x4B, 0x4A, 0x4A, 0x48, 0x49, 0x48, 0x48, 0x49,
+  0x49, 0x49, 0x4B, 0x4C, 0x50, 0x52, 0x53, 0x56,
+  0x57, 0x57, 0x58, 0x57, 0x57, 0x58, 0x57, 0x57,
+  0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57,
+  0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57,
+  0x57, 0x57, 0x58, 0x57, 0x57, 0x57, 0x57, 0x57,
+  0x55, 0x54, 0x53, 0x51, 0x51, 0x50, 0x4C, 0x4D,
+  0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC,
+  0xFC, 0xFC, 0xFC, 0xFC, 0xF4, 0xD2, 0xD7, 0xF5,
+  0xFC, 0xFC, 0x5D, 0x5D, 0x5C, 0x5C, 0x59, 0x58,
+  0x58, 0x56, 0x52, 0x4C, 0x4B, 0x4A, 0x4A, 0x48,
+  0x48, 0x48, 0x48, 0x48, 0x49, 0x4B, 0x4D, 0x51,
+  0x54, 0x56, 0x58, 0x57, 0x57, 0x58, 0x57, 0x57,
+  0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57,
+  0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57,
+  0x57, 0x57, 0x58, 0x57, 0x57, 0x57, 0x55, 0x54,
+  0x53, 0x52, 0x51, 0x4D, 0x4D, 0x4D, 0x50, 0x50,
+  0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC,
+  0xFC, 0xFC, 0xFC, 0xFC, 0xF4, 0x64, 0xD9, 0xF5,
+  0xF9, 0xFC, 0xFC, 0x64, 0x63, 0x62, 0x61, 0x61,
+  0x61, 0x60, 0x5E, 0x5B, 0x5A, 0x54, 0x52, 0x4C,
+  0x4B, 0x49, 0x49, 0x47, 0x47, 0x48, 0x49, 0x4B,
+  0x4C, 0x51, 0x53, 0x56, 0x57, 0x58, 0x57, 0x57,
+  0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57,
+  0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57,
+  0x57, 0x57, 0x58, 0x57, 0x57, 0x55, 0x53, 0x53,
+  0x51, 0x50, 0x50, 0x50, 0x50, 0x50, 0x53, 0xFC,
+  0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC,
+  0xFC, 0xFC, 0xFC, 0xFC, 0xF4, 0xF5, 0xF9, 0xFC,
+  0xFC, 0xFC, 0xFC, 0x64, 0x64, 0x64, 0x64, 0x64,
+  0x64, 0x64, 0x64, 0x63, 0x61, 0x61, 0x5E, 0x59,
+  0x55, 0x52, 0x4C, 0x4A, 0x49, 0x47, 0x48, 0x48,
+  0x49, 0x4B, 0x4D, 0x51, 0x54, 0x57, 0x57, 0x57,
+  0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57,
+  0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57,
+  0x57, 0x57, 0x58, 0x55, 0x54, 0x54, 0x52, 0x51,
+  0x51, 0x51, 0x51, 0x51, 0x53, 0x54, 0x59, 0xFC,
+  0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC,
+  0xFC, 0xFC, 0xFC, 0xFC, 0xF7, 0xFC, 0xFC, 0xFC,
+  0xFC, 0xFC, 0xFC, 0xFC, 0x60, 0x60, 0x60, 0x61,
+  0x62, 0x63, 0x64, 0x64, 0x65, 0x65, 0x64, 0x63,
+  0x61, 0x5E, 0x59, 0x56, 0x4D, 0x4B, 0x48, 0x48,
+  0x48, 0x48, 0x49, 0x4B, 0x50, 0x53, 0x56, 0x56,
+  0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57,
+  0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57,
+  0x57, 0x57, 0x56, 0x54, 0x53, 0x52, 0x51, 0x51,
+  0x51, 0x52, 0x53, 0x55, 0x59, 0x5D, 0x5E, 0xFC,
+  0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC,
+  0xFC, 0xFC, 0xFC, 0xFB, 0xFB, 0xFB, 0xFC, 0xFC,
+  0xFC, 0xFC, 0xFC, 0xFC, 0x4C, 0x4E, 0x51, 0x52,
+  0x57, 0x5A, 0x5E, 0x60, 0x61, 0x63, 0x65, 0xCB,
+  0x64, 0x64, 0x63, 0x60, 0x5C, 0x57, 0x50, 0x4B,
+  0x48, 0x47, 0x47, 0x47, 0x4A, 0x4C, 0x52, 0x53,
+  0x54, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57,
+  0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57,
+  0x55, 0x54, 0x53, 0x53, 0x51, 0x52, 0x52, 0x53,
+  0x53, 0x57, 0x5A, 0x5D, 0x5E, 0x5E, 0x60, 0xFC,
+  0xFC, 0xFC, 0xFB, 0xF9, 0xFC, 0xFC, 0xFC, 0xFC,
+  0xFC, 0xFC, 0xFC, 0xFA, 0xF9, 0xF5, 0xFB, 0xFC,
+  0xFC, 0xFC, 0xFC, 0xFC, 0xFB, 0x45, 0x3F, 0x3F,
+  0x45, 0x48, 0x4B, 0x4D, 0x54, 0x5A, 0x5E, 0x61,
+  0x63, 0xCB, 0xCB, 0x65, 0x64, 0x62, 0x5E, 0x57,
+  0x50, 0x4B, 0x48, 0x47, 0x47, 0x48, 0x4B, 0x4D,
+  0x51, 0x56, 0x56, 0x57, 0x57, 0x57, 0x57, 0x57,
+  0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x55,
+  0x54, 0x54, 0x53, 0x53, 0x52, 0x53, 0x54, 0x57,
+  0x59, 0x5C, 0x5E, 0x5E, 0x5E, 0x5E, 0x5E, 0xFC,
+  0xFC, 0xFA, 0xFC, 0xFA, 0xE0, 0xFC, 0xFC, 0xFC,
+  0xFB, 0xFB, 0xFB, 0xDF, 0xD8, 0xF9, 0xE0, 0xFC,
+  0xFC, 0xFC, 0xFC, 0xFC, 0xFB, 0x4C, 0x4A, 0x48,
+  0x48, 0x3E, 0x44, 0x43, 0x3F, 0x47, 0x4B, 0x52,
+  0x5A, 0x5E, 0x62, 0x64, 0xCB, 0xCB, 0x64, 0x61,
+  0x5E, 0x57, 0x4D, 0x49, 0x47, 0x47, 0x48, 0x4A,
+  0x4C, 0x52, 0x54, 0x56, 0x57, 0x57, 0x57, 0x57,
+  0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x55,
+  0x54, 0x53, 0x53, 0x54, 0x54, 0x55, 0x58, 0x5B,
+  0x5C, 0x5D, 0x5E, 0x5D, 0x5D, 0x5B, 0x58, 0xFC,
+  0xFC, 0xD8, 0x4C, 0x60, 0xFC, 0xF5, 0xFC, 0xFC,
+  0xFC, 0xF7, 0x5F, 0x48, 0x48, 0x2C, 0xF8, 0xF9,
+  0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0x4B, 0x4A, 0x49,
+  0x49, 0x49, 0x49, 0x47, 0x3E, 0x44, 0x42, 0x3F,
+  0x3E, 0x4B, 0x54, 0x5C, 0x61, 0x64, 0xCB, 0xCB,
+  0x64, 0x61, 0x5D, 0x53, 0x4B, 0x49, 0x47, 0x47,
+  0x49, 0x4B, 0x50, 0x53, 0x56, 0x57, 0x57, 0x57,
+  0x57, 0x57, 0x57, 0x57, 0x57, 0x55, 0x55, 0x54,
+  0x53, 0x53, 0x54, 0x56, 0x58, 0x5A, 0x5B, 0x5D,
+  0x5D, 0x5D, 0x5C, 0x5A, 0x54, 0x52, 0x4C, 0xFC,
+  0xF7, 0x4E, 0x2D, 0x29, 0x4E, 0xFC, 0xFC, 0xFC,
+  0xFB, 0x5F, 0x26, 0x24, 0x20, 0x2E, 0x65, 0xFC,
+  0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0x45, 0x3F, 0x45,
+  0x3E, 0x47, 0x47, 0x47, 0x47, 0x47, 0x3E, 0x44,
+  0x43, 0x40, 0x44, 0x49, 0x51, 0x5C, 0x62, 0x64,
+  0xCB, 0xCB, 0x63, 0x60, 0x58, 0x50, 0x49, 0x48,
+  0x48, 0x48, 0x4A, 0x4D, 0x53, 0x54, 0x57, 0x57,
+  0x57, 0x57, 0x57, 0x57, 0x55, 0x54, 0x54, 0x54,
+  0x54, 0x54, 0x55, 0x57, 0x59, 0x5B, 0x5C, 0x5D,
+  0x5C, 0x5A, 0x54, 0x51, 0x4C, 0x4C, 0x54, 0xFC,
+  0xF9, 0x23, 0xDB, 0x2D, 0x23, 0xFA, 0xFB, 0xFA,
+  0xF5, 0x27, 0x21, 0xD9, 0xF8, 0x20, 0x21, 0xFB,
+  0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0x5D, 0x58, 0x55,
+  0x50, 0x48, 0x45, 0x43, 0x44, 0x44, 0x45, 0x45,
+  0x3E, 0x3F, 0x43, 0x41, 0x3F, 0x48, 0x52, 0x5D,
+  0x63, 0x65, 0xCB, 0x65, 0x61, 0x5D, 0x52, 0x4B,
+  0x48, 0x47, 0x47, 0x49, 0x4C, 0x51, 0x54, 0x57,
+  0x57, 0x57, 0x57, 0x57, 0x55, 0x54, 0x54, 0x54,
+  0x54, 0x58, 0x5A, 0x59, 0x5B, 0x5B, 0x5B, 0x5A,
+  0x55, 0x52, 0x4D, 0x4D, 0x55, 0x5B, 0x5D, 0xFC,
+  0xF1, 0xF9, 0xFC, 0xD4, 0x21, 0xCC, 0xF7, 0xF8,
+  0xF2, 0x21, 0xD9, 0xFC, 0xF2, 0xFB, 0x21, 0x45,
+  0xFC, 0xFC, 0xFC, 0xFC, 0xFB, 0xD1, 0xD0, 0xCD,
+  0xCC, 0x63, 0x5E, 0x58, 0x50, 0x47, 0x43, 0x3F,
+  0x3F, 0x3F, 0x3F, 0x3F, 0x40, 0x41, 0x3F, 0x4A,
+  0x56, 0x5E, 0x64, 0xCB, 0x65, 0x63, 0x5E, 0x56,
+  0x4C, 0x48, 0x47, 0x47, 0x49, 0x4C, 0x51, 0x54,
+  0x58, 0x57, 0x57, 0x57, 0x57, 0x55, 0x54, 0x54,
+  0x57, 0x5A, 0x5A, 0x5C, 0x5B, 0x5A, 0x58, 0x54,
+  0x51, 0x4C, 0x55, 0x5D, 0x5D, 0x5B, 0x54, 0xFC,
+  0xF0, 0xF9, 0xFC, 0x65, 0x45, 0xCD, 0xFB, 0xFB,
+  0xF8, 0x26, 0xFB, 0xFC, 0xFC, 0xFC, 0x21, 0x27,
+  0xFB, 0xFC, 0xFC, 0xFC, 0xFB, 0xD7, 0x35, 0x34,
+  0x2F, 0x35, 0x36, 0x2F, 0x2F, 0x36, 0x2F, 0x2F,
+  0x36, 0x36, 0x35, 0x35, 0x43, 0x42, 0x41, 0x2E,
+  0x45, 0x4C, 0x5B, 0x62, 0x65, 0xCC, 0x64, 0x60,
+  0x58, 0x4D, 0x49, 0x47, 0x47, 0x49, 0x4C, 0x51,
+  0x58, 0x57, 0x57, 0x57, 0x57, 0x57, 0x55, 0x57,
+  0x58, 0x5A, 0x5A, 0x5B, 0x5A, 0x55, 0x54, 0x51,
+  0x53, 0x5C, 0x5D, 0x5D, 0x54, 0x4B, 0x4D, 0xFC,
+  0xFC, 0x44, 0xFC, 0xFB, 0x7B, 0xAB, 0xA8, 0xAE,
+  0xAB, 0x7F, 0xFC, 0xFC, 0xFB, 0xFB, 0x22, 0x2A,
+  0xFC, 0xFC, 0xFC, 0xFC, 0x36, 0x2F, 0x30, 0x30,
+  0x32, 0x30, 0x32, 0x30, 0x30, 0x30, 0x30, 0x30,
+  0x30, 0x30, 0x30, 0x30, 0x2F, 0x2F, 0x40, 0x41,
+  0x2E, 0x40, 0x48, 0x56, 0x5F, 0x64, 0xCC, 0x65,
+  0x61, 0x59, 0x50, 0x49, 0x47, 0x47, 0x49, 0x4C,
+  0x5A, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x58,
+  0x5A, 0x5A, 0x5A, 0x58, 0x55, 0x52, 0x51, 0x5A,
+  0x5D, 0x5D, 0x57, 0x4C, 0x51, 0x54, 0x5D, 0xFC,
+  0xFC, 0x2A, 0xFC, 0xC9, 0xAA, 0x8B, 0x8A, 0x8C,
+  0xAB, 0x8C, 0x8C, 0xFB, 0xFB, 0x23, 0x20, 0xF1,
+  0xFC, 0xFC, 0xFC, 0x3B, 0x33, 0x33, 0x32, 0x32,
+  0x31, 0x32, 0x30, 0x32, 0x32, 0x32, 0x32, 0x30,
+  0x31, 0x31, 0x31, 0x32, 0x33, 0x33, 0x3C, 0x41,
+  0x41, 0x2E, 0x2D, 0x45, 0x4D, 0x5D, 0x63, 0xCC,
+  0x65, 0x62, 0x5D, 0x51, 0x49, 0x47, 0x47, 0x4A,
+  0x59, 0x57, 0x57, 0x57, 0x57, 0x58, 0x58, 0x58,
+  0x5A, 0x5A, 0x58, 0x55, 0x53, 0x53, 0x5C, 0x5E,
+  0x59, 0x51, 0x4E, 0x54, 0x59, 0x5E, 0x62, 0xFC,
+  0xFC, 0xDB, 0xAA, 0xA1, 0x95, 0x9C, 0x8C, 0x88,
+  0x82, 0x83, 0x83, 0x8C, 0x88, 0xAE, 0xB9, 0xFB,
+  0xFC, 0xFC, 0xFC, 0x3C, 0x3B, 0x72, 0x38, 0x33,
+  0x33, 0x33, 0x31, 0x33, 0x31, 0x31, 0x31, 0x31,
+  0x33, 0x33, 0x38, 0x33, 0x72, 0x3B, 0x44, 0x2E,
+  0x41, 0x2E, 0x2E, 0x2D, 0x43, 0x4B, 0x5B, 0x63,
+  0xCB, 0xCC, 0x63, 0x5D, 0x51, 0x49, 0x47, 0x49,
+  0x5C, 0x58, 0x57, 0x57, 0x57, 0x57, 0x58, 0x58,
+  0x58, 0x58, 0x57, 0x53, 0x58, 0x5D, 0x5E, 0x55,
+  0x51, 0x53, 0x58, 0x5E, 0x60, 0x63, 0x64, 0xFC,
+  0xFC, 0xC0, 0xA6, 0x9D, 0x8B, 0x9C, 0x8C, 0x8C,
+  0x6E, 0x83, 0x88, 0x8C, 0x8C, 0x8C, 0x83, 0xE8,
+  0xFB, 0xFC, 0xFC, 0xFC, 0x33, 0x70, 0x70, 0x6F,
+  0x6F, 0x6F, 0x6F, 0x3A, 0x6F, 0x6D, 0x6F, 0x6F,
+  0x70, 0x6F, 0x6F, 0x70, 0x6F, 0x32, 0x5A, 0x48,
+  0x41, 0x2D, 0x2D, 0x2D, 0x2C, 0x41, 0x49, 0x5A,
+  0x62, 0xCB, 0xCB, 0x63, 0x5D, 0x50, 0x49, 0x4A,
+  0x5C, 0x58, 0x58, 0x57, 0x55, 0x57, 0x57, 0x57,
+  0x57, 0x55, 0x56, 0x59, 0x5E, 0x5C, 0x52, 0x53,
+  0x55, 0x5B, 0x5E, 0x61, 0x63, 0x64, 0x63, 0xFC,
+  0xE8, 0xBF, 0xA4, 0x99, 0x9C, 0x8C, 0x88, 0x88,
+  0x6E, 0x88, 0x8C, 0x8C, 0x8C, 0xC2, 0xA6, 0xC4,
+  0xFC, 0xFC, 0xFC, 0xFC, 0x36, 0x3A, 0x6F, 0x70,
+  0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70,
+  0x70, 0x70, 0x70, 0x70, 0x37, 0x32, 0xCD, 0x5E,
+  0x4C, 0x43, 0x2C, 0x2D, 0x2D, 0x2C, 0x2E, 0x47,
+  0x57, 0x61, 0x65, 0xCC, 0x63, 0x5C, 0x50, 0x4D,
+  0x5C, 0x5A, 0x57, 0x55, 0x55, 0x55, 0x58, 0x58,
+  0x55, 0x54, 0x5B, 0x5E, 0x5D, 0x53, 0x53, 0x55,
+  0x5D, 0x5E, 0x61, 0x61, 0x61, 0x61, 0x5E, 0xFC,
+  0xEA, 0xBE, 0xA4, 0x9B, 0x8B, 0x85, 0x8C, 0x6E,
+  0x8C, 0x8C, 0x8C, 0xA3, 0xAA, 0xA4, 0xA4, 0xE9,
+  0xFB, 0xFC, 0xFC, 0xFC, 0x36, 0x6D, 0x70, 0x73,
+  0x70, 0x70, 0x70, 0x73, 0x73, 0x73, 0x73, 0x70,
+  0x70, 0x70, 0x73, 0x70, 0x37, 0x38, 0xD1, 0xCF,
+  0x61, 0x4D, 0x44, 0x2C, 0x2D, 0x2E, 0x2C, 0x2E,
+  0x3E, 0x56, 0x61, 0xCB, 0xCC, 0x62, 0x5B, 0x57,
+  0x59, 0x58, 0x55, 0x54, 0x54, 0x55, 0x58, 0x58,
+  0x58, 0x5B, 0x5E, 0x5B, 0x53, 0x55, 0x55, 0x5C,
+  0x5E, 0x61, 0x61, 0x60, 0x5D, 0x5A, 0x4E, 0xFC,
+  0xFC, 0xEA, 0xAA, 0x9C, 0x8A, 0x85, 0x82, 0x8C,
+  0x8C, 0xA8, 0xEB, 0xA8, 0xA4, 0xA4, 0xAA, 0xFC,
+  0xFC, 0xFC, 0x64, 0xFB, 0x39, 0x31, 0x72, 0x78,
+  0x73, 0x78, 0x73, 0x74, 0x74, 0x74, 0x74, 0x73,
+  0x78, 0x70, 0x73, 0x73, 0x33, 0xCC, 0xD2, 0xD1,
+  0xCE, 0x62, 0x53, 0x3F, 0x2D, 0x2D, 0x41, 0x2C,
+  0x2E, 0x3E, 0x56, 0x62, 0xCB, 0xCB, 0x61, 0x5D,
+  0x54, 0x54, 0x54, 0x54, 0x56, 0x58, 0x58, 0x58,
+  0x5C, 0x5E, 0x5A, 0x55, 0x58, 0x58, 0x5B, 0x5E,
+  0x61, 0x5E, 0x5D, 0x5A, 0x52, 0x55, 0xCD, 0xFC,
+  0xFC, 0x34, 0xC9, 0xE8, 0xA8, 0xAE, 0xC2, 0xE8,
+  0xC3, 0xA6, 0xA7, 0xA6, 0xAA, 0x78, 0x2E, 0x42,
+  0xFC, 0xFC, 0xD2, 0x64, 0xF8, 0x31, 0x72, 0x73,
+  0x73, 0x73, 0x73, 0x74, 0x75, 0x75, 0x74, 0x73,
+  0x73, 0x73, 0x73, 0x72, 0x33, 0x5C, 0x64, 0xD2,
+  0xD1, 0xCF, 0x63, 0x54, 0x3F, 0x2C, 0x41, 0x41,
+  0x2C, 0x2E, 0x47, 0x58, 0x63, 0xCB, 0xCB, 0x62,
+  0x52, 0x53, 0x53, 0x56, 0x58, 0x58, 0x5A, 0x5B,
+  0x5E, 0x5A, 0x57, 0x58, 0x58, 0x58, 0x60, 0x60,
+  0x5D, 0x5A, 0x55, 0x4E, 0x64, 0xD2, 0xD1, 0xFC,
+  0xFC, 0x41, 0x3E, 0xC1, 0xC0, 0xA3, 0xA6, 0xA7,
+  0xA7, 0xA9, 0xAA, 0xB8, 0x2E, 0x3F, 0x2C, 0x41,
+  0xFC, 0xFC, 0xF7, 0xCE, 0xCD, 0x36, 0x72, 0x73,
+  0x74, 0x75, 0x78, 0x75, 0x75, 0x75, 0x74, 0x74,
+  0x74, 0x74, 0x78, 0x72, 0x6D, 0x49, 0x59, 0xCB,
+  0xD1, 0xD1, 0xD2, 0xCB, 0x56, 0x3F, 0x2C, 0x41,
+  0x40, 0x2D, 0x2E, 0x49, 0x5B, 0x64, 0xCC, 0x64,
+  0x51, 0x53, 0x53, 0x55, 0x58, 0x59, 0x5B, 0x5E,
+  0x59, 0x58, 0x58, 0x58, 0x55, 0x60, 0x60, 0x5C,
+  0x5A, 0x53, 0x5B, 0xD0, 0xD3, 0xD3, 0xD3, 0xFB,
+  0xFC, 0x40, 0x41, 0x45, 0xC4, 0xC0, 0xBE, 0xBE,
+  0xC1, 0xC0, 0x3C, 0x47, 0x2E, 0x21, 0x22, 0x20,
+  0x65, 0xFC, 0xFC, 0xFC, 0xFC, 0x6D, 0x72, 0x75,
+  0x78, 0x76, 0x75, 0x79, 0x76, 0x76, 0x76, 0x76,
+  0x75, 0x75, 0x75, 0x72, 0x6D, 0x2E, 0x48, 0x5D,
+  0xCE, 0xD1, 0xD4, 0xD3, 0xCB, 0x56, 0x43, 0x2C,
+  0x42, 0x43, 0x2E, 0x2E, 0x4A, 0x5D, 0x64, 0x64,
+  0x50, 0x52, 0x56, 0x58, 0x5C, 0x5D, 0x5E, 0x5D,
+  0x5A, 0x58, 0x58, 0x55, 0x61, 0x60, 0x58, 0x58,
+  0x4E, 0x61, 0xD1, 0xD4, 0xD4, 0xD1, 0xEE, 0xFC,
+  0xFC, 0x2B, 0x29, 0x2E, 0x3F, 0xB0, 0xAD, 0x81,
+  0x46, 0x2D, 0x46, 0x2C, 0x24, 0x22, 0x22, 0x23,
+  0x25, 0xFC, 0xFC, 0xFC, 0xFC, 0x6E, 0x73, 0x76,
+  0x76, 0x79, 0x79, 0x79, 0x76, 0x76, 0x79, 0x76,
+  0x79, 0x79, 0x79, 0x74, 0x3F, 0x41, 0x2C, 0x48,
+  0x5F, 0xCF, 0xD5, 0xD7, 0xD6, 0xCD, 0x57, 0x40,
+  0x2E, 0x3F, 0x44, 0x2E, 0x41, 0x4C, 0x60, 0x61,
+  0x51, 0x53, 0x58, 0x5C, 0x5D, 0x5E, 0x5D, 0x5C,
+  0x58, 0x57, 0x54, 0x5F, 0x5E, 0x55, 0x55, 0x52,
+  0x64, 0xD4, 0xD5, 0xD4, 0xD1, 0x5D, 0xFA, 0xFB,
+  0xF4, 0x21, 0x24, 0x41, 0x40, 0x44, 0x2E, 0x2E,
+  0x42, 0x41, 0x2A, 0x24, 0x22, 0x22, 0x22, 0x22,
+  0x23, 0xD9, 0xFC, 0xFC, 0xFC, 0xFC, 0xE5, 0xB8,
+  0x8F, 0x8F, 0x7A, 0x8F, 0x7A, 0x8F, 0x7A, 0x8F,
+  0x8F, 0x8F, 0xB8, 0xE5, 0x3F, 0x3E, 0x43, 0x2C,
+  0x48, 0x61, 0xD1, 0xD7, 0xD9, 0xD7, 0xD0, 0x57,
+  0x41, 0x2E, 0x3E, 0x44, 0x2D, 0x40, 0x52, 0x5D,
+  0x53, 0x55, 0x59, 0x5D, 0x5E, 0x5E, 0x5D, 0x5A,
+  0x57, 0x53, 0x5E, 0x5E, 0x54, 0x53, 0x54, 0x65,
+  0xD5, 0xD6, 0xD4, 0xCE, 0x53, 0xFB, 0xF9, 0xFC,
+  0x24, 0x22, 0x23, 0x23, 0x41, 0x42, 0x2E, 0x40,
+  0x2B, 0x21, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22,
+  0x23, 0x23, 0xFC, 0xFC, 0xFC, 0xFC, 0xE7, 0xBD,
+  0xB5, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93,
+  0x93, 0xB5, 0xC6, 0xEB, 0x2D, 0x47, 0x4A, 0x47,
+  0x2C, 0x3E, 0x61, 0xD4, 0xDC, 0xDC, 0xDA, 0xCF,
+  0x54, 0x41, 0x41, 0x3E, 0x45, 0x2C, 0x3F, 0x4A,
+  0x58, 0x5A, 0x5C, 0x5F, 0x60, 0x5E, 0x5D, 0x57,
+  0x51, 0x5D, 0x5D, 0x51, 0x53, 0x53, 0xCB, 0xD5,
+  0xD6, 0xD5, 0x63, 0x55, 0xFC, 0xFC, 0xFC, 0x2C,
+  0x23, 0x22, 0x23, 0x22, 0x20, 0x2D, 0x2C, 0x26,
+  0x21, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22,
+  0x22, 0x21, 0xF0, 0xFC, 0xFC, 0xFC, 0xE2, 0xC6,
+  0xB5, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93,
+  0x93, 0x93, 0xC7, 0xE3, 0x3E, 0x2E, 0x49, 0x52,
+  0x4C, 0x41, 0x44, 0x62, 0xD6, 0xDE, 0xDE, 0xD9,
+  0xD0, 0x51, 0x2E, 0x40, 0x47, 0x44, 0x2C, 0x42,
+  0x5D, 0x5D, 0x5F, 0x60, 0x60, 0x5D, 0x57, 0x51,
+  0x58, 0x5D, 0x4E, 0x52, 0x55, 0x64, 0xD5, 0xD6,
+  0xD4, 0x61, 0x59, 0x6B, 0xFC, 0xFC, 0xFC, 0x21,
+  0x23, 0x22, 0x23, 0x22, 0x23, 0x21, 0x23, 0x22,
+  0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22,
+  0x22, 0x21, 0x24, 0xFC, 0xFC, 0xFC, 0xE2, 0xC7,
+  0xB5, 0x90, 0x93, 0x93, 0x93, 0x90, 0x93, 0x93,
+  0x90, 0xB5, 0xC8, 0xE4, 0x5F, 0x45, 0x2E, 0x4D,
+  0x57, 0x57, 0x44, 0x43, 0x63, 0xDA, 0xDF, 0xDF,
+  0xD9, 0xCE, 0x4C, 0x2C, 0x3F, 0x3E, 0x40, 0x40,
+  0x60, 0x5E, 0x61, 0x61, 0x5E, 0x5B, 0x53, 0x52,
+  0x5C, 0x52, 0x52, 0x55, 0x61, 0xD4, 0xD5, 0xD1,
+  0x5E, 0x5B, 0x5C, 0xFB, 0xFC, 0xFC, 0x2A, 0x21,
+  0x23, 0x22, 0x23, 0x22, 0x22, 0x22, 0x23, 0x22,
+  0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22,
+  0x22, 0x22, 0x22, 0xFB, 0xFC, 0xFC, 0xB3, 0xC8,
+  0xB5, 0x90, 0x92, 0xB5, 0x93, 0x93, 0xB5, 0x93,
+  0x92, 0xB5, 0xC8, 0xB9, 0xD0, 0x5E, 0x44, 0x40,
+  0x52, 0x58, 0x57, 0x48, 0x40, 0x63, 0xD9, 0xE0,
+  0xE0, 0xD9, 0xCB, 0x49, 0x2D, 0x3F, 0x45, 0x3F,
+  0x63, 0x61, 0x62, 0x60, 0x5E, 0x55, 0x4D, 0x59,
+  0x53, 0x4E, 0x54, 0x5D, 0xD2, 0xD4, 0xD2, 0x5E,
+  0x5C, 0x5D, 0xFC, 0xFC, 0xFC, 0xF8, 0x29, 0x23,
+  0x23, 0x23, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22,
+  0x23, 0x22, 0x22, 0x23, 0x23, 0x23, 0x22, 0x22,
+  0x22, 0x22, 0x22, 0xF0, 0xFC, 0xFC, 0xB3, 0xC7,
+  0xB5, 0x93, 0xB5, 0x93, 0x93, 0x91, 0x93, 0x93,
+  0x91, 0xB5, 0xC7, 0xAD, 0xD6, 0xD2, 0x5E, 0x3F,
+  0x3F, 0x57, 0x57, 0x58, 0x4A, 0x41, 0x64, 0xDC,
+  0xF1, 0xDF, 0xDA, 0x61, 0x45, 0x2E, 0x43, 0x47,
+  0xCB, 0x63, 0x62, 0x5F, 0x58, 0x51, 0x53, 0x54,
+  0x4C, 0x52, 0x5C, 0xCD, 0xD3, 0xD2, 0x60, 0x5D,
+  0x5D, 0xFB, 0xFC, 0xFC, 0xFC, 0xDB, 0x49, 0x24,
+  0x21, 0x23, 0x23, 0x22, 0x26, 0x26, 0x2A, 0x24,
+  0x22, 0x23, 0x22, 0x21, 0x24, 0x26, 0x26, 0x2A,
+  0x29, 0x2B, 0x24, 0x25, 0xFC, 0xFC, 0xB3, 0xC5,
+  0x91, 0x91, 0x92, 0x91, 0x92, 0x92, 0x93, 0x93,
+  0x91, 0x93, 0xC6, 0xAD, 0xDC, 0xD9, 0xD4, 0x60,
+  0x43, 0x45, 0x58, 0x58, 0x57, 0x4B, 0x43, 0xCC,
+  0xDD, 0xF1, 0xD8, 0xD5, 0x5D, 0x43, 0x41, 0x47,
+  0xCD, 0x63, 0x62, 0x5D, 0x54, 0x4C, 0x55, 0x4B,
+  0x51, 0x58, 0x62, 0xD0, 0xD0, 0x62, 0x5D, 0x5D,
+  0x67, 0xFC, 0xFC, 0xFC, 0xFC, 0x58, 0x4E, 0x28,
+  0x2A, 0x20, 0x23, 0x22, 0x23, 0x2A, 0x23, 0x22,
+  0x22, 0x22, 0x23, 0x23, 0x25, 0x2A, 0x2E, 0x2D,
+  0x2E, 0x2E, 0x2E, 0x23, 0xFA, 0xFC, 0xB2, 0xBD,
+  0xB5, 0x90, 0x91, 0x93, 0x92, 0x90, 0x91, 0x93,
+  0x92, 0x91, 0xBD, 0xAD, 0xDE, 0xE0, 0xD8, 0xD7,
+  0x61, 0x40, 0x48, 0x58, 0x58, 0x58, 0x48, 0x44,
+  0xCF, 0xDE, 0xE0, 0xDD, 0xD0, 0x52, 0x41, 0x45,
+  0xCD, 0x63, 0x61, 0x58, 0x4D, 0x51, 0x4C, 0x4B,
+  0x54, 0x5D, 0xCC, 0xCE, 0x63, 0x61, 0x5D, 0x5D,
+  0xFB, 0xFC, 0xFC, 0xFC, 0xFC, 0x4B, 0x27, 0x21,
+  0x22, 0x22, 0x23, 0x22, 0x22, 0x24, 0x23, 0x22,
+  0x22, 0x22, 0x23, 0x22, 0x23, 0x23, 0x22, 0x20,
+  0x27, 0x2B, 0x41, 0x2B, 0x23, 0xFC, 0xB2, 0xB6,
+  0x93, 0x90, 0x92, 0xB5, 0x92, 0x90, 0xB5, 0x90,
+  0x92, 0x93, 0xBC, 0xAD, 0xDC, 0xF1, 0xF3, 0xF0,
+  0xD9, 0x61, 0x41, 0x4A, 0x58, 0x57, 0x57, 0x44,
+  0x49, 0xD2, 0xDD, 0xD8, 0xDA, 0x63, 0x4A, 0x45,
+  0xCC, 0x63, 0x5E, 0x52, 0x4B, 0x4C, 0x49, 0x51,
+  0x5C, 0x61, 0xCD, 0x65, 0x63, 0x5E, 0x4E, 0xCF,
+  0xFB, 0xFB, 0xF0, 0xFC, 0xD2, 0x2A, 0x22, 0x23,
+  0x22, 0x22, 0x23, 0x22, 0x22, 0x21, 0x22, 0x22,
+  0x22, 0x22, 0x23, 0x22, 0x23, 0x23, 0x22, 0x22,
+  0x23, 0x22, 0x26, 0x41, 0x27, 0xF9, 0x81, 0xB7,
+  0xB5, 0x91, 0x92, 0xB5, 0x91, 0xB5, 0x93, 0xB5,
+  0x93, 0xB6, 0xB7, 0xB9, 0xCB, 0xD8, 0xF3, 0xF2,
+  0xF2, 0xDB, 0x61, 0x2D, 0x51, 0x58, 0x57, 0x58,
+  0x41, 0x51, 0xD4, 0xDB, 0xDC, 0xD1, 0x5B, 0x4C,
+  0xCB, 0x62, 0x59, 0x4C, 0x4A, 0x49, 0x4B, 0x55,
+  0x60, 0x64, 0xCC, 0x64, 0x5E, 0x55, 0x60, 0xE1,
+  0xFB, 0xF8, 0xFC, 0xFC, 0x21, 0x22, 0x22, 0x23,
+  0x22, 0x22, 0x23, 0x22, 0x22, 0x21, 0x22, 0x22,
+  0x22, 0x22, 0x23, 0x22, 0x23, 0x23, 0x22, 0x22,
+  0x23, 0x22, 0x21, 0x24, 0x2D, 0x21, 0xB4, 0xBB,
+  0xB6, 0xB5, 0xB6, 0xB7, 0xB7, 0xB7, 0xB7, 0xB6,
+  0xB6, 0xB6, 0xBB, 0xB9, 0x45, 0xCB, 0xDF, 0xF3,
+  0xF3, 0xF3, 0xDB, 0x5E, 0x2C, 0x51, 0x58, 0x58,
+  0x52, 0x2D, 0x5C, 0xD4, 0xD9, 0xD5, 0x63, 0x58,
+  0x64, 0x60, 0x53, 0x49, 0x4A, 0x49, 0x52, 0x5C,
+  0x63, 0xCD, 0xCD, 0x63, 0x5C, 0x4E, 0x65, 0xFC,
+  0xFC, 0xF5, 0xFC, 0xD2, 0x23, 0x22, 0x22, 0x23,
+  0x22, 0x22, 0x23, 0x22, 0x22, 0x21, 0x22, 0x22,
+  0x22, 0x22, 0x23, 0x22, 0x23, 0x23, 0x22, 0x22,
+  0x23, 0x22, 0x21, 0x22, 0x25, 0x29, 0xB3, 0xC7,
+  0xB5, 0xB6, 0xB6, 0xB6, 0xB6, 0xB6, 0xB6, 0xB6,
+  0xB6, 0xB5, 0xC7, 0xAD, 0x57, 0x3F, 0xCB, 0xF0,
+  0xF3, 0xF3, 0xF2, 0xD9, 0x58, 0x41, 0x4C, 0x58,
+  0x57, 0x47, 0x42, 0x62, 0xD4, 0xD4, 0xCC, 0x60,
+  0x63, 0x5D, 0x50, 0x47, 0x48, 0x4B, 0x58, 0x60,
+  0xCC, 0xCE, 0xCD, 0x60, 0x53, 0x5C, 0x62, 0xFB,
+  0xF9, 0xFC, 0xFC, 0x21, 0x23, 0x22, 0x22, 0x23,
+  0x22, 0x22, 0x23, 0x23, 0x23, 0x21, 0x22, 0x22,
+  0x22, 0x22, 0x23, 0x22, 0x23, 0x23, 0x22, 0x22,
+  0x23, 0x22, 0x23, 0x23, 0x22, 0x23, 0x81, 0xC7,
+  0xB7, 0xB7, 0xBC, 0xB7, 0xBC, 0xBC, 0xBC, 0xB7,
+  0xB7, 0xB7, 0xC8, 0x80, 0x58, 0x57, 0x40, 0xCE,
+  0xF3, 0xF2, 0xF2, 0xF0, 0xD5, 0x4C, 0x3F, 0x4B,
+  0x52, 0x50, 0x2D, 0x4B, 0x64, 0xD2, 0xCC, 0x61,
+  0x60, 0x58, 0x4A, 0x47, 0x47, 0x4C, 0x59, 0x64,
+  0xD0, 0xD0, 0x64, 0x59, 0x49, 0x5D, 0xFB, 0xFC,
+  0xD9, 0xFC, 0xD6, 0x23, 0x22, 0x22, 0x22, 0x23,
+  0x22, 0x22, 0x23, 0x23, 0x21, 0x21, 0x22, 0x22,
+  0x22, 0x22, 0x23, 0x22, 0x23, 0x23, 0x22, 0x22,
+  0x23, 0x22, 0x23, 0x23, 0x22, 0x23, 0xB4, 0xC8,
+  0xBD, 0xB7, 0xBD, 0xBC, 0xBD, 0xC5, 0xBC, 0xC5,
+  0xBC, 0xBD, 0xC7, 0xAC, 0x58, 0x57, 0x58, 0x2C,
+  0xD1, 0xF0, 0xF3, 0xF3, 0xE0, 0xCD, 0x45, 0x3E,
+  0x48, 0x4B, 0x3F, 0x41, 0x56, 0x64, 0x65, 0x62,
+  0x5D, 0x52, 0x47, 0x48, 0x48, 0x53, 0x60, 0xCC,
+  0xD2, 0xD0, 0x63, 0x52, 0x4E, 0x53, 0xFB, 0xFB,
+  0xFC, 0xFC, 0x23, 0x23, 0x22, 0x23, 0x22, 0x23,
+  0x22, 0x22, 0x23, 0x23, 0x20, 0x21, 0x22, 0x22,
+  0x22, 0x22, 0x23, 0x22, 0x23, 0x23, 0x22, 0x22,
+  0x23, 0x22, 0x23, 0x22, 0x23, 0x22, 0xB4, 0xC7,
+  0xC5, 0xBC, 0xC5, 0xBD, 0xC5, 0xC5, 0xBD, 0xC5,
+  0xBC, 0xC6, 0xC7, 0xB9, 0x58, 0x57, 0x58, 0x57,
+  0x2D, 0xD4, 0xF1, 0xF2, 0xF0, 0xD9, 0x5D, 0x47,
+  0x48, 0x3F, 0x42, 0x2C, 0x48, 0x5C, 0x5F, 0x60,
+  0x58, 0x50, 0x47, 0x4A, 0x49, 0x55, 0x63, 0xD0,
+  0xD2, 0xCD, 0x5D, 0x49, 0x4E, 0xE1, 0xFC, 0xF0,
+  0xFC, 0xF8, 0x22, 0x22, 0x22, 0x23, 0x22, 0x23,
+  0x22, 0x22, 0x23, 0x20, 0x21, 0x21, 0x22, 0x22,
+  0x22, 0x22, 0x23, 0x22, 0x23, 0x23, 0x23, 0x22,
+  0x23, 0x22, 0x23, 0x23, 0x23, 0x22, 0xC4, 0xC8,
+  0xBD, 0xBD, 0xC6, 0xBD, 0xC6, 0xC6, 0xC5, 0xC6,
+  0xBD, 0xC6, 0xC7, 0xE4, 0x54, 0x57, 0x58, 0x57,
+  0x57, 0x43, 0xD7, 0xE0, 0xF1, 0xD8, 0xCD, 0x4B,
+  0x4A, 0x47, 0x42, 0x2C, 0x3F, 0x4D, 0x58, 0x5C,
+  0x52, 0x4B, 0x48, 0x4B, 0x4A, 0x58, 0xCB, 0xD3,
+  0xD2, 0xCD, 0x58, 0x47, 0x4A, 0xFC, 0xFC, 0xFB,
+  0xFC, 0x2B, 0x22, 0x22, 0x22, 0x23, 0x22, 0x23,
+  0x22, 0x22, 0x23, 0x26, 0x21, 0x21, 0x23, 0x22,
+  0x22, 0x22, 0x23, 0x22, 0x23, 0x23, 0x22, 0x23,
+  0x22, 0x23, 0x22, 0x23, 0x22, 0x23, 0xE5, 0xC8,
+  0xBA, 0xC5, 0xC6, 0xC6, 0xC6, 0xC7, 0xC6, 0xC7,
+  0xC5, 0xC6, 0xC8, 0xE5, 0x2E, 0x54, 0x58, 0x57,
+  0x57, 0x4C, 0x4D, 0xDA, 0xD8, 0xD8, 0xD4, 0x5C,
+  0x4B, 0x4B, 0x3F, 0x42, 0x44, 0x4A, 0x51, 0x58,
+  0x4B, 0x48, 0x4B, 0x51, 0x4D, 0x5F, 0xD0, 0xD1,
+  0xD0, 0x64, 0x51, 0x44, 0x6B, 0xFC, 0xFB, 0xFC,
+  0xFC, 0x21, 0x23, 0x22, 0x22, 0x23, 0x22, 0x23,
+  0x22, 0x22, 0x23, 0x26, 0x21, 0x23, 0x23, 0x22,
+  0x22, 0x22, 0x23, 0x22, 0x23, 0x23, 0x22, 0x23,
+  0x22, 0x23, 0x22, 0x23, 0x23, 0x23, 0xE5, 0xED,
+  0xE7, 0xBA, 0xC8, 0xC6, 0xC6, 0xC6, 0xC6, 0xC7,
+  0xC7, 0xE5, 0xED, 0xE6, 0x61, 0x41, 0x52, 0x58,
+  0x58, 0x57, 0x45, 0x5E, 0xD7, 0xDD, 0xD5, 0x60,
+  0x4B, 0x4C, 0x48, 0x4D, 0x4D, 0x50, 0x4D, 0x56,
+  0x4A, 0x3E, 0x53, 0x53, 0x52, 0x63, 0xD3, 0xD0,
+  0xCE, 0x60, 0x4A, 0x45, 0xFC, 0xFC, 0xF7, 0xFC,
+  0xFC, 0x21, 0x23, 0x23, 0x22, 0x23, 0x22, 0x23,
+  0x22, 0x23, 0x21, 0x2A, 0x20, 0x23, 0x23, 0x22,
+  0x22, 0x22, 0x23, 0x22, 0x23, 0x23, 0x22, 0x22,
+  0x23, 0x22, 0x23, 0x22, 0x21, 0x23, 0xEB, 0xF6,
+  0xF6, 0xED, 0xED, 0xED, 0xED, 0xED, 0xED, 0xED,
+  0xF6, 0xF6, 0xF6, 0xE6, 0xDB, 0x58, 0x45, 0x4B,
+  0x58, 0x57, 0x4D, 0x4B, 0x64, 0xD4, 0xD0, 0x5C,
+  0x48, 0x51, 0x4C, 0x5D, 0x5E, 0x5C, 0x56, 0x59,
+  0x3E, 0x4A, 0x58, 0x54, 0x52, 0x65, 0xD3, 0xD0,
+  0xCF, 0x5D, 0x48, 0xFC, 0xFC, 0xFC, 0xFA, 0xFC,
+  0xFC, 0x21, 0x22, 0x23, 0x22, 0x23, 0x22, 0x23,
+  0x22, 0x23, 0x21, 0x2A, 0x21, 0x23, 0x23, 0x22,
+  0x22, 0x22, 0x23, 0x22, 0x23, 0x23, 0x22, 0x22,
+  0x23, 0x22, 0x23, 0x22, 0x21, 0x4F, 0xE6, 0xC6,
+  0xC6, 0xBD, 0xC6, 0xBD, 0xBD, 0xBD, 0xBD, 0xC6,
+  0xC5, 0xBA, 0xC7, 0xE6, 0xF2, 0xD4, 0x49, 0x4B,
+  0x3E, 0x4D, 0x52, 0x3E, 0x52, 0x63, 0x64, 0x56,
+  0x48, 0x54, 0x4D, 0x61, 0xCC, 0xCC, 0x60, 0x60,
+  0x47, 0x4D, 0x5C, 0x53, 0x58, 0xCF, 0xD1, 0xCF,
+  0xD0, 0x59, 0x45, 0xFC, 0xFC, 0xFC, 0xEF, 0xF9,
+  0xFC, 0x21, 0x23, 0x22, 0x23, 0x22, 0x23, 0x22,
+  0x23, 0x22, 0x23, 0x2A, 0x21, 0x23, 0x23, 0x22,
+  0x22, 0x22, 0x23, 0x22, 0x23, 0x23, 0x22, 0x22,
+  0x23, 0x22, 0x23, 0x22, 0x23, 0x4F, 0xE4, 0xB9,
+  0xAF, 0x80, 0x80, 0x8E, 0x8E, 0x8E, 0x8E, 0x8F,
+  0x80, 0xB4, 0xB9, 0xE4, 0x7F, 0xDE, 0x61, 0x52,
+  0x54, 0x48, 0x3F, 0x43, 0x4D, 0x56, 0x59, 0x4B,
+  0x3E, 0x58, 0x53, 0x61, 0xD3, 0xD4, 0xCF, 0xCD,
+  0x4C, 0x58, 0x5F, 0x53, 0x5E, 0xD3, 0xD0, 0xCE,
+  0xCE, 0x52, 0x3F, 0xFC, 0xFC, 0xFC, 0xF7, 0x65,
+  0xFA, 0x22, 0x23, 0x22, 0x23, 0x22, 0x23, 0x22,
+  0x23, 0x22, 0x21, 0x2A, 0x23, 0x23, 0x23, 0x22,
+  0x22, 0x22, 0x23, 0x22, 0x23, 0x23, 0x22, 0x22,
+  0x23, 0x22, 0x23, 0x22, 0x21, 0xB1, 0xE4, 0xE6,
+  0x7C, 0xB1, 0x7C, 0xB1, 0xB2, 0xB2, 0xB3, 0x3D,
+  0xB3, 0x3C, 0xE5, 0xB3, 0xB0, 0xF1, 0xD0, 0x58,
+  0x5D, 0x4D, 0x40, 0x41, 0x48, 0x51, 0x4C, 0x3F,
+  0x3F, 0x4D, 0x5A, 0x5A, 0xD5, 0xD9, 0xD7, 0xD4,
+  0x57, 0x5E, 0x61, 0x4C, 0x63, 0xD4, 0xCF, 0xCE,
+  0xCB, 0x4D, 0x4A, 0xFC, 0xFC, 0xFC, 0xFC, 0xF0,
+  0xFB, 0x22, 0x23, 0x22, 0x23, 0x22, 0x23, 0x22,
+  0x23, 0x22, 0x23, 0x2A, 0x21, 0x23, 0x23, 0x22,
+  0x22, 0x22, 0x23, 0x22, 0x23, 0x23, 0x22, 0x22,
+  0x22, 0x23, 0x22, 0x23, 0x23, 0xB1, 0x81, 0x7D,
+  0x39, 0x35, 0x35, 0x36, 0x36, 0x36, 0x36, 0x36,
+  0x36, 0x36, 0x7C, 0xB2, 0xB0, 0xDF, 0xD2, 0x57,
+  0x60, 0x59, 0x5B, 0x59, 0x52, 0x4C, 0x4A, 0x40,
+  0x42, 0x4A, 0x53, 0x4D, 0xD2, 0xDE, 0xDE, 0xD9,
+  0x5E, 0x5E, 0x60, 0x4A, 0xCD, 0xD1, 0xCF, 0xCE,
+  0x63, 0x49, 0x5C, 0xFB, 0xE8, 0x89, 0x9F, 0xFC,
+  0xD6, 0x21, 0x21, 0x23, 0x22, 0x22, 0x23, 0x22,
+  0x23, 0x22, 0x21, 0x2A, 0x22, 0x23, 0x23, 0x22,
+  0x22, 0x22, 0x23, 0x22, 0x23, 0x23, 0x22, 0x22,
+  0x22, 0x23, 0x22, 0x23, 0x23, 0x22, 0x7F, 0xB9,
+  0x71, 0x6C, 0x38, 0x38, 0x33, 0x33, 0x33, 0x38,
+  0x38, 0x71, 0xAD, 0xE4, 0xD3, 0xDA, 0xCC, 0x52,
+  0x63, 0x60, 0xCE, 0xD4, 0xCF, 0x60, 0x4C, 0x40,
+  0x3F, 0x45, 0x4B, 0x5A, 0xCB, 0xD8, 0xDE, 0xDC,
+  0x5E, 0x5E, 0x5F, 0x4C, 0xD2, 0xD2, 0xCF, 0xCF,
+  0x61, 0x45, 0x5E, 0xA7, 0x9D, 0x95, 0x8B, 0x99,
+  0xFC, 0x41, 0x21, 0x23, 0x23, 0x22, 0x23, 0x22,
+  0x23, 0x22, 0x23, 0x2A, 0x23, 0x23, 0x23, 0x22,
+  0x22, 0x22, 0x23, 0x22, 0x23, 0x23, 0x22, 0x22,
+  0x22, 0x22, 0x23, 0x22, 0x23, 0x77, 0x77, 0xF6,
+  0xFC, 0x7D, 0x7D, 0x7E, 0x7E, 0x7E, 0x7E, 0x7D,
+  0x7D, 0xFC, 0x47, 0x64, 0xD0, 0xD0, 0x5D, 0x4B,
+  0x62, 0xCC, 0xD1, 0xDE, 0xDE, 0xD4, 0x5E, 0x43,
+  0x3F, 0x3E, 0x48, 0x53, 0x58, 0xDB, 0xD8, 0xDC,
+  0x5E, 0x5E, 0x5E, 0x53, 0xD4, 0xD2, 0xD0, 0xD0,
+  0x5E, 0x49, 0xA7, 0xA6, 0x89, 0x95, 0x8B, 0x9C,
+  0x9C, 0xFB, 0xD4, 0x22, 0x22, 0x22, 0x22, 0x23,
+  0x22, 0x23, 0x23, 0x2A, 0x22, 0x23, 0x23, 0x22,
+  0x22, 0x22, 0x23, 0x22, 0x23, 0x23, 0x22, 0x23,
+  0x23, 0x22, 0x23, 0x23, 0x98, 0x8C, 0x8C, 0x88,
+  0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xF8,
+  0xE9, 0x9C, 0x48, 0x5C, 0xD0, 0xCB, 0x48, 0x49,
+  0x5B, 0xCB, 0xCD, 0xE0, 0xF1, 0xDD, 0xD0, 0x4A,
+  0x41, 0x47, 0x45, 0x4C, 0x48, 0xD7, 0xDE, 0xDC,
+  0x5E, 0x5E, 0x5A, 0x58, 0xD1, 0xD0, 0xD0, 0xD2,
+  0x5C, 0x55, 0xA7, 0xA6, 0x87, 0x86, 0x89, 0x94,
+  0x9C, 0xA9, 0xFC, 0xF4, 0x22, 0x23, 0x22, 0x23,
+  0x22, 0x23, 0x22, 0x2A, 0x21, 0x23, 0x23, 0x22,
+  0x22, 0x22, 0x23, 0x22, 0x23, 0x23, 0x22, 0x23,
+  0x22, 0x23, 0x22, 0x23, 0xA4, 0x89, 0x8C, 0xAA,
+  0xFB, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xF7,
+  0x85, 0x88, 0x8D, 0x59, 0x64, 0x63, 0x47, 0x3E,
+  0x4C, 0x60, 0x61, 0xE0, 0xF0, 0xDF, 0xD9, 0x5D,
+  0x2E, 0x3E, 0x3E, 0x47, 0x4D, 0xCD, 0xDE, 0xDC,
+  0x5D, 0x5C, 0x51, 0x5D, 0xD1, 0xD2, 0xD2, 0xD4,
+  0x5A, 0xBE, 0xA7, 0x98, 0x8A, 0x8A, 0xA0, 0x8B,
+  0x86, 0x86, 0xF7, 0xFC, 0xF7, 0x26, 0x23, 0x23,
+  0x22, 0x22, 0x22, 0x22, 0x21, 0x22, 0x23, 0x22,
+  0x22, 0x22, 0x23, 0x22, 0x23, 0x23, 0x22, 0x23,
+  0x22, 0x21, 0x21, 0x21, 0xA1, 0x98, 0x9F, 0xBF,
+  0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xA7,
+  0x8C, 0x86, 0x8D, 0x59, 0x5E, 0x5D, 0x3F, 0x3E,
+  0x47, 0x53, 0x63, 0xD9, 0xF0, 0xF1, 0xDE, 0xD0,
+  0x43, 0x3E, 0x47, 0x45, 0x4A, 0x5B, 0xDC, 0xDA,
+  0x5D, 0x59, 0x49, 0x5F, 0xD1, 0xD2, 0xD3, 0xB9,
+  0xA5, 0xA7, 0x98, 0x9B, 0x96, 0x9D, 0x89, 0x89,
+  0x8B, 0x9C, 0x9D, 0xFC, 0xFC, 0xFC, 0x26, 0x22,
+  0x23, 0x23, 0x22, 0x22, 0x21, 0x22, 0x23, 0x22,
+  0x22, 0x22, 0x23, 0x22, 0x23, 0x23, 0x22, 0x23,
+  0x22, 0x22, 0x29, 0x2D, 0x99, 0x99, 0xA2, 0xAA,
+  0xC4, 0xFB, 0xFC, 0xFC, 0xFC, 0xF6, 0xBF, 0xA2,
+  0x9C, 0x9C, 0x8E, 0xDC, 0xCD, 0x51, 0x41, 0x3E,
+  0x45, 0x49, 0x58, 0xCD, 0xE0, 0xE0, 0xD8, 0xDA,
+  0x4C, 0x4A, 0x45, 0x45, 0x48, 0x47, 0xDA, 0xDA,
+  0x5C, 0x58, 0x44, 0x69, 0xA9, 0x98, 0xA4, 0xA6,
+  0xA1, 0xA4, 0x99, 0x9E, 0x9D, 0x8B, 0x8A, 0x97,
+  0x87, 0x9A, 0x8A, 0xC2, 0xFC, 0xFC, 0xFC, 0x4D,
+  0x21, 0x21, 0x23, 0x22, 0x21, 0x22, 0x23, 0x22,
+  0x22, 0x22, 0x23, 0x22, 0x23, 0x23, 0x23, 0x22,
+  0x21, 0x22, 0x2D, 0x34, 0xA4, 0xA2, 0xA2, 0xA9,
+  0xBF, 0xC0, 0xC3, 0xC1, 0xC0, 0xBE, 0xA6, 0x9D,
+  0x99, 0x87, 0xA2, 0xF1, 0xDC, 0x64, 0x42, 0x45,
+  0x47, 0x3E, 0x49, 0x4C, 0xDD, 0xDF, 0xD8, 0xDB,
+  0x5E, 0x4C, 0x48, 0x45, 0x45, 0x41, 0xD1, 0xD6,
+  0x5A, 0x55, 0x3F, 0xA7, 0xA1, 0x98, 0x9F, 0x99,
+  0x9F, 0x9D, 0x9A, 0x95, 0x8B, 0x97, 0x89, 0x8A,
+  0x88, 0x94, 0x9C, 0x8C, 0xFC, 0xFC, 0xFC, 0xFC,
+  0xF4, 0x21, 0x23, 0x22, 0x21, 0x22, 0x23, 0x22,
+  0x22, 0x22, 0x23, 0x22, 0x23, 0x23, 0x22, 0x23,
+  0x23, 0x23, 0x2C, 0x2C, 0xA8, 0xA2, 0xA4, 0xA4,
+  0xA9, 0xAA, 0xAA, 0xAA, 0xA9, 0xA6, 0x98, 0x9C,
+  0x8B, 0x88, 0x98, 0x8D, 0xD8, 0xD6, 0x4E, 0x47,
+  0x47, 0x49, 0x47, 0x3F, 0xDA, 0xDD, 0xDE, 0xDD,
+  0xCC, 0x4A, 0x4B, 0x3E, 0x45, 0x43, 0x61, 0xD4,
+  0x56, 0x51, 0x44, 0xA4, 0x9B, 0x8B, 0x9C, 0x9A,
+  0xA0, 0xA2, 0x98, 0x98, 0x8B, 0x8B, 0x98, 0x98,
+  0x84, 0x8B, 0x94, 0x8A, 0xA4, 0xFC, 0xFC, 0xFC,
+  0xFC, 0xF2, 0x21, 0x22, 0x21, 0x22, 0x23, 0x22,
+  0x22, 0x22, 0x23, 0x22, 0x23, 0x23, 0x23, 0x23,
+  0x23, 0x22, 0x2C, 0x2D, 0xC0, 0xA4, 0xA2, 0xA4,
+  0xA4, 0xA6, 0xA6, 0xA6, 0xA4, 0xA2, 0x9F, 0x89,
+  0x8B, 0x9C, 0x9C, 0x8B, 0x68, 0xDB, 0x5F, 0x4B,
+  0x3E, 0x49, 0x4B, 0x3E, 0xCC, 0xDA, 0xDC, 0xDD,
+  0xD3, 0x49, 0x52, 0x48, 0x45, 0x45, 0x53, 0xD0,
+  0x51, 0x4A, 0x44, 0xA4, 0x9B, 0x8B, 0x9C, 0xA0,
+  0x9B, 0x86, 0x89, 0x98, 0x89, 0x8A, 0x96, 0x8A,
+  0x9C, 0x89, 0x89, 0x9C, 0x8C, 0xF6, 0xFC, 0xFC,
+  0xFC, 0xFC, 0x21, 0x22, 0x21, 0x22, 0x23, 0x22,
+  0x22, 0x22, 0x22, 0x23, 0x22, 0x21, 0x22, 0x23,
+  0x22, 0x21, 0x2B, 0x34, 0xC0, 0xA8, 0xA4, 0xA2,
+  0xA2, 0x98, 0xA1, 0xA0, 0x98, 0x9F, 0x95, 0x8A,
+  0x94, 0xA1, 0x8A, 0x84, 0x9B, 0x68, 0xCC, 0x49,
+  0x4A, 0x47, 0x4C, 0x4B, 0x51, 0xD3, 0xDA, 0xDC,
+  0xD5, 0x56, 0x56, 0x4A, 0x3E, 0x45, 0x48, 0x63,
+  0x4A, 0x47, 0x3E, 0xA7, 0x98, 0x9D, 0x9E, 0x8B,
+  0x95, 0x9B, 0x89, 0x86, 0x9B, 0x8B, 0x89, 0x84,
+  0x9A, 0xA1, 0x95, 0x9A, 0x8C, 0xA4, 0xFC, 0xFC,
+  0xFC, 0xFA, 0x23, 0x22, 0x21, 0x22, 0x23, 0x22,
+  0x22, 0x22, 0x22, 0x23, 0x22, 0x21, 0x22, 0x23,
+  0x21, 0x23, 0x2C, 0xF6, 0xBF, 0xA9, 0xA2, 0x99,
+  0x9D, 0x9D, 0x9D, 0x9D, 0x9D, 0x9B, 0x87, 0x8B,
+  0x9C, 0x86, 0x9C, 0x8A, 0x87, 0x87, 0x89, 0x51,
+  0x54, 0x47, 0x4B, 0x50, 0x4B, 0xCF, 0xD6, 0xDC,
+  0xD5, 0x60, 0x54, 0x52, 0x48, 0x45, 0x40, 0x5A,
+  0x45, 0x43, 0x47, 0xA7, 0x98, 0x9B, 0x95, 0x95,
+  0x9A, 0x87, 0x98, 0x98, 0x8A, 0x86, 0x87, 0x9E,
+  0x9B, 0x95, 0x9D, 0x9D, 0x99, 0x85, 0xA6, 0xFA,
+  0xF2, 0x21, 0x23, 0x22, 0x21, 0x22, 0x23, 0x22,
+  0x22, 0x22, 0x22, 0x23, 0x22, 0x21, 0x22, 0x22,
+  0x21, 0x24, 0xFB, 0xF7, 0xBF, 0xA6, 0xA2, 0x99,
+  0x97, 0x89, 0x86, 0x89, 0x9C, 0x96, 0x9E, 0x94,
+  0x89, 0x99, 0x98, 0x89, 0x9E, 0x9B, 0x89, 0x8B,
+  0x58, 0x4B, 0x4A, 0x52, 0x48, 0xCC, 0xD3, 0xDA,
+  0xD3, 0x65, 0x4C, 0x58, 0x49, 0x3E, 0x2E, 0x4D,
+  0x40, 0x41, 0x45, 0xA9, 0xA1, 0x9B, 0x9E, 0x9C,
+  0x95, 0x8A, 0x94, 0x89, 0x96, 0x87, 0x9C, 0x9A,
+  0x84, 0x9D, 0x9C, 0x9E, 0x9A, 0x9C, 0x9D, 0xBB,
+  0x23, 0x23, 0x22, 0x22, 0x21, 0x22, 0x23, 0x22,
+  0x22, 0x22, 0x22, 0x23, 0x22, 0x21, 0x23, 0x23,
+  0x24, 0xFC, 0xFC, 0xF6, 0xBF, 0xA6, 0x9F, 0x99,
+  0x89, 0x95, 0x87, 0x94, 0x9D, 0x9E, 0x97, 0x9E,
+  0x95, 0x9B, 0x89, 0x95, 0x95, 0x9B, 0x89, 0x87,
+  0x5D, 0x56, 0x3E, 0x51, 0x3E, 0x60, 0xCF, 0xD3,
+  0xD2, 0xCD, 0x5C, 0x49, 0x4B, 0x3E, 0x2C, 0x48,
+  0x3E, 0x43, 0x3E, 0xA9, 0xA1, 0x9B, 0x97, 0x94,
+  0x95, 0x9A, 0x9C, 0x87, 0x87, 0x9B, 0x9C, 0x95,
+  0x9D, 0x89, 0x9A, 0x89, 0x9E, 0x9E, 0x8C, 0xA6,
+  0x20, 0x23, 0x23, 0x22, 0x23, 0x22, 0x23, 0x22,
+  0x22, 0x22, 0x22, 0x22, 0x21, 0x21, 0x20, 0x40,
+  0xFC, 0xFC, 0xFC, 0xEC, 0xBE, 0xA4, 0x9F, 0x99,
+  0x95, 0x9F, 0xA0, 0x88, 0x9D, 0x8B, 0x97, 0x95,
+  0x87, 0x95, 0x96, 0x95, 0x97, 0x94, 0x94, 0x98,
+  0xD3, 0x4C, 0x47, 0x4D, 0x42, 0x4C, 0x60, 0xCC,
+  0xCE, 0xD0, 0x65, 0x4B, 0x47, 0x44, 0x2B, 0x45,
+  0x4B, 0x47, 0x49, 0xA7, 0xA1, 0x9A, 0x97, 0x89,
+  0x95, 0x97, 0x97, 0x9E, 0x89, 0x95, 0x89, 0x9C,
+  0x87, 0x95, 0x97, 0x99, 0x95, 0x99, 0x9F, 0xA4,
+  0xC4, 0x21, 0x21, 0x23, 0x21, 0x23, 0x23, 0x23,
+  0x23, 0x23, 0x23, 0x23, 0x21, 0x20, 0xFC, 0xFC,
+  0xFC, 0xFC, 0xFC, 0xEA, 0xAA, 0xA6, 0xA2, 0x99,
+  0x8B, 0x9A, 0x95, 0x9E, 0x9E, 0x9A, 0x94, 0x87,
+  0x94, 0x94, 0x89, 0x94, 0x9B, 0x9B, 0xA7, 0xDC,
+  0xDB, 0x65, 0x2E, 0x3E, 0x43, 0x44, 0x49, 0x58,
+  0x63, 0xD3, 0xD3, 0x5E, 0x42, 0x42, 0x2D, 0x40,
+  0x54, 0x4C, 0x4A, 0xA7, 0xA0, 0x99, 0x9B, 0x94,
+  0xA0, 0x8A, 0x9B, 0x9D, 0x87, 0x95, 0x94, 0x8B,
+  0x8A, 0x98, 0x9C, 0x8A, 0x9B, 0x99, 0xA2, 0xA6,
+  0xBF, 0xEC, 0x2A, 0x20, 0x21, 0x23, 0x21, 0x20,
+  0x20, 0x20, 0x20, 0x4C, 0xF9, 0xFC, 0xFC, 0xFC,
+  0xFC, 0xFC, 0xFC, 0xEB, 0xAA, 0xA4, 0x9F, 0x9C,
+  0x8B, 0x9B, 0x88, 0x84, 0x9E, 0x9D, 0x96, 0x94,
+  0x94, 0x9A, 0x9B, 0x9B, 0xA4, 0xD5, 0xCD, 0xDE,
+  0xF1, 0xDA, 0x4C, 0x2D, 0x41, 0x2B, 0x42, 0x4C,
+  0x5E, 0xD4, 0xD7, 0xCD, 0x49, 0x2E, 0x2E, 0x41,
+  0x5E, 0x57, 0xA7, 0xA6, 0xA7, 0xA4, 0xA2, 0x98,
+  0x9D, 0x9C, 0xA1, 0x99, 0x9D, 0x88, 0x8B, 0x9C,
+  0x8A, 0x9C, 0x9C, 0x94, 0x9C, 0x89, 0xA0, 0xA6,
+  0xAA, 0xEB, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC,
+  0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC,
+  0xFC, 0xFC, 0xFB, 0xE9, 0xAA, 0xA6, 0xA2, 0x8B,
+  0x8B, 0x8A, 0x86, 0x9B, 0x9C, 0x98, 0xA0, 0x9B,
+  0x9B, 0x84, 0xA7, 0xB4, 0x61, 0xD1, 0xD2, 0xE0,
+  0xF1, 0xDC, 0x61, 0x2D, 0x2E, 0x3F, 0x56, 0x62,
+  0x5D, 0xD4, 0xD9, 0xD3, 0x54, 0x41, 0x41, 0x44,
+  0xCB, 0x60, 0x52, 0xA9, 0xA9, 0xA9, 0xA7, 0xA6,
+  0xA6, 0xA4, 0xA4, 0xA2, 0xA2, 0x9D, 0x95, 0x89,
+  0x9C, 0x8A, 0x9E, 0x9C, 0x8A, 0x9E, 0xA0, 0xA8,
+  0xC0, 0xE9, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC,
+  0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC,
+  0xFC, 0xFC, 0xFC, 0xE9, 0xAA, 0xA6, 0xA0, 0x99,
+  0x9C, 0x8B, 0x9A, 0x84, 0x9B, 0x9B, 0x98, 0x98,
+  0xA9, 0xB9, 0x49, 0x57, 0xCB, 0xD4, 0xD3, 0xF1,
+  0xD8, 0xDA, 0xCE, 0x3F, 0x41, 0x4B, 0x5D, 0xCB,
+  0x5E, 0xD6, 0xDB, 0xD6, 0x5D, 0x43, 0x3F, 0x49,
+  0xD1, 0xCC, 0x4F, 0xDD, 0xC3, 0xBB, 0xBF, 0xAA,
+  0xAA, 0xA9, 0xAA, 0xA8, 0xA8, 0xA6, 0xA6, 0xA2,
+  0x9C, 0x9F, 0x9B, 0x9A, 0x9D, 0xA2, 0xA8, 0xAA,
+  0xC1, 0xEA, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC,
+  0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC,
+  0xFC, 0xFC, 0xFC, 0xEA, 0xC0, 0xAA, 0xA6, 0xA2,
+  0xA2, 0x99, 0xA0, 0xA0, 0xA4, 0xA7, 0xA9, 0xC0,
+  0x67, 0x49, 0x54, 0x60, 0xD0, 0xD4, 0xCC, 0xDF,
+  0xD9, 0xD5, 0xD2, 0x3E, 0x47, 0x56, 0x60, 0xCD,
+  0x5D, 0xD9, 0xD9, 0xD6, 0x61, 0x3F, 0x47, 0x52,
+  0xD6, 0xD3, 0x62, 0x4D, 0x40, 0x4A, 0x57, 0xCA,
+  0xC3, 0xC1, 0xC1, 0xC0, 0xBF, 0xBF, 0xAA, 0xAA,
+  0xA6, 0xA4, 0xA4, 0xA4, 0xA6, 0xA8, 0xBE, 0xC1,
+  0xC9, 0xEB, 0xFB, 0xFB, 0xFC, 0xFC, 0xFC, 0xFC,
+  0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC,
+  0xFC, 0xFC, 0xFC, 0xEB, 0xC3, 0xC0, 0xAA, 0xA8,
+  0xA6, 0xA6, 0xA6, 0xA9, 0xAA, 0xC0, 0xE8, 0xD0,
+  0xD2, 0x4C, 0x5E, 0x64, 0xD0, 0xD1, 0x5F, 0xD9,
+  0xD5, 0xD1, 0xD0, 0x48, 0x52, 0x5C, 0x64, 0xCD,
+  0x5C, 0xDC, 0xD7, 0xD5, 0x62, 0x3F, 0x4C, 0x53,
+  0xDA, 0xD7, 0xCE, 0x56, 0x40, 0x4B, 0x52, 0x56,
+  0xCE, 0xDF, 0x6A, 0xEB, 0xE9, 0xC9, 0xC3, 0xC0,
+  0xC0, 0xBF, 0xBE, 0xAA, 0xBF, 0xC0, 0xC3, 0xC9,
+  0xEA, 0xF6, 0xEE, 0x58, 0x57, 0x5E, 0xD6, 0xD0,
+  0xD2, 0x61, 0xCB, 0xD6, 0xD6, 0xD4, 0xDF, 0xF3,
+  0xF2, 0xDD, 0xD7, 0xEB, 0xC9, 0xC1, 0xC0, 0xBF,
+  0xAA, 0xAA, 0xAA, 0xBE, 0xC3, 0xF0, 0xD2, 0xD2,
+  0xD2, 0x51, 0x62, 0xCC, 0xD0, 0xCC, 0x61, 0xD3,
+  0xCF, 0xCE, 0xD2, 0x48, 0x5A, 0x61, 0xCC, 0xCE,
+  0x5F, 0xD9, 0xD5, 0xD1, 0x63, 0x44, 0x56, 0x56,
+  0xDC, 0xD9, 0xD4, 0x5E, 0x42, 0x4A, 0x4C, 0x57,
+  0x5D, 0xD8, 0xE0, 0xD8, 0xDC, 0xCB, 0x66, 0xEC,
+  0xE8, 0xC3, 0xC3, 0xC3, 0xC3, 0xC9, 0xE8, 0xEA,
+  0xF6, 0x50, 0x3E, 0x58, 0x57, 0x5A, 0xD6, 0xD4,
+  0xCC, 0x4B, 0x53, 0x5C, 0x64, 0xD1, 0xDF, 0xF3,
+  0xF1, 0xDE, 0xD9, 0xF6, 0xEB, 0xC9, 0xC1, 0xC1,
+  0xC0, 0xC0, 0xC1, 0xC9, 0xF0, 0xD6, 0xCD, 0xD6,
+  0xD3, 0x53, 0xCB, 0xCF, 0xCD, 0x5F, 0x5F, 0xCE,
+  0xCF, 0xCD, 0xD0, 0x47, 0x5F, 0xCB, 0xCE, 0xCD,
+  0x63, 0xD6, 0xD3, 0xD1, 0x63, 0x3F, 0x58, 0x58,
+  0xDB, 0xDC, 0xDA, 0x65, 0x3E, 0x49, 0x49, 0x4D,
+  0x49, 0xDC, 0xDF, 0xE0, 0xDE, 0xD5, 0x47, 0x47,
+  0x46, 0x6B, 0xEB, 0xEA, 0xE9, 0xEA, 0xEB, 0xF6,
+  0xD0, 0x57, 0x57, 0x47, 0x47, 0x5B, 0xD4, 0xD4,
+  0xCD, 0x44, 0x3E, 0x4B, 0x50, 0x4B, 0x51, 0xD5,
+  0xDB, 0xD8, 0xDE, 0x4B, 0xF6, 0xF6, 0xEA, 0xE9,
+  0xE8, 0xEA, 0xEB, 0x67, 0x5E, 0xCC, 0xD6, 0xDC,
+  0xD5, 0x58, 0xCE, 0xCE, 0x62, 0x50, 0xCC, 0xD3,
+  0xD2, 0xCD, 0xCD, 0x4B, 0x64, 0xCE, 0xCE, 0x64,
+  0xCC, 0xD3, 0xD2, 0xD2, 0x61, 0x47, 0x5D, 0x5C,
+  0xDD, 0xDD, 0xD9, 0xD1, 0x4C, 0x47, 0x49, 0x4A,
+  0x4B, 0xD1, 0xD8, 0xE0, 0xDF, 0xDD, 0x5D, 0x4A,
+  0x48, 0x52, 0x51, 0x3F, 0xF6, 0xEC, 0xE0, 0xE0,
+  0xD3, 0x5E, 0x5F, 0x50, 0x4B, 0x50, 0xCB, 0xCE,
+  0x64, 0x45, 0x4C, 0x57, 0x57, 0x58, 0x52, 0xD6,
+  0xD3, 0xDE, 0xDF, 0xD1, 0x3E, 0x4B, 0xF6, 0xF6,
+  0xEC, 0x66, 0x53, 0x43, 0x56, 0xD1, 0xD9, 0xDE,
+  0xD4, 0x5E, 0xCE, 0xCC, 0x5B, 0x2C, 0xD4, 0xD5,
+  0xD2, 0xD0, 0x63, 0x5D, 0xCD, 0xD0, 0xCD, 0x5E,
+  0xD0, 0xCF, 0xCE, 0xD2, 0x5E, 0x50, 0x60, 0x5D,
+  0xDE, 0xDD, 0xDC, 0xD7, 0x5D, 0x45, 0x47, 0x3E,
+  0x4B, 0x5E, 0xDE, 0xDF, 0xE0, 0xD8, 0xCF, 0x3E,
+  0x45, 0x51, 0x58, 0x42, 0xCB, 0xDA, 0xDE, 0xD8,
+  0xD2, 0x61, 0xCC, 0xCF, 0xD6, 0xDA, 0xDA, 0xD5,
+  0xD0, 0x50, 0x44, 0x57, 0x57, 0x58, 0x45, 0xD1,
+  0xD1, 0xD7, 0xDF, 0xDF, 0xD7, 0xCF, 0x64, 0x60,
+  0xCE, 0xCE, 0xCE, 0x63, 0xCF, 0xDA, 0xDE, 0xD9,
+  0xCF, 0x63, 0xCD, 0x63, 0x4D, 0x4B, 0xD6, 0xD5,
+  0xCE, 0xD3, 0x60, 0xCB, 0xD0, 0xD0, 0x65, 0x47,
+  0xD0, 0xCC, 0xCC, 0xD1, 0x59, 0x5D, 0x63, 0x5E,
+  0xDD, 0xDD, 0xDE, 0xDC, 0xCB, 0x40, 0x48, 0x45,
+  0x3E, 0x3E, 0xD9, 0xDF, 0xE0, 0xDF, 0xDA, 0x51,
+  0x4C, 0x48, 0x56, 0x4C, 0x5B, 0xD2, 0xDA, 0xDB,
+  0xCB, 0x5F, 0xD0, 0xCC, 0xDC, 0xF0, 0xF3, 0xE0,
+  0xDD, 0xCC, 0x41, 0x50, 0x57, 0x57, 0x4B, 0x5D,
+  0xD3, 0xD1, 0xDE, 0xDF, 0xDE, 0xD7, 0xD0, 0xD0,
+  0xD5, 0xD6, 0xD6, 0xCE, 0xD7, 0xDC, 0xDA, 0xD5,
+  0x60, 0x63, 0x64, 0x5E, 0x47, 0x61, 0xD5, 0xD2,
+  0xCF, 0xD0, 0x59, 0xCD, 0xD1, 0xCF, 0x61, 0x4D,
+  0xCC, 0xCE, 0xCD, 0xD0, 0x52, 0x61, 0x64, 0x60,
+  0xDA, 0xDE, 0xDE, 0xDD, 0xD1, 0x4B, 0x4A, 0x45,
+  0x3E, 0x41, 0xCD, 0xDE, 0xE0, 0xF1, 0xDE, 0x63,
+  0x4A, 0x4A, 0x4A, 0x4B, 0x50, 0xCB, 0xD4, 0xD7,
+  0x5E, 0x54, 0x62, 0xD3, 0xD4, 0xF0, 0xF3, 0xF3,
+  0xF2, 0xDE, 0x61, 0x40, 0x49, 0x56, 0x4D, 0x3E,
+  0x4B, 0xCE, 0xD9, 0xD8, 0xD9, 0xD5, 0xCF, 0xD2,
+  0xD6, 0xD6, 0xD1, 0xD1, 0xD7, 0xD5, 0xCF, 0xD0,
+  0x54, 0x64, 0x63, 0x56, 0x2C, 0xCB, 0xD1, 0xCC,
+  0xD3, 0xCD, 0x54, 0xCF, 0xD1, 0xCE, 0x5E, 0x5C,
+  0xCE, 0xCE, 0xCE, 0xCB, 0x4B, 0x63, 0xCC, 0x61,
+  0xD4, 0xDC, 0xDE, 0xDE, 0xDA, 0x5D, 0x45, 0x45,
+  0x48, 0x3F, 0x52, 0xD9, 0xD8, 0xDF, 0xDF, 0xD2,
+  0x52, 0x4B, 0x3E, 0x2E, 0x47, 0x60, 0xCF, 0xD3,
+  0x59, 0x48, 0x50, 0x5E, 0xCC, 0xDE, 0xF2, 0xF2,
+  0xF3, 0xF3, 0xDD, 0x5D, 0x3E, 0x48, 0x47, 0x47,
+  0x58, 0xD1, 0xDA, 0xDA, 0xD5, 0xD1, 0xCD, 0xD2,
+  0xD3, 0xCF, 0xD3, 0xD1, 0xCD, 0xD3, 0xD2, 0x5E,
+  0x52, 0x64, 0x60, 0x4B, 0x45, 0x61, 0xCD, 0xD3,
+  0xD3, 0x64, 0x61, 0xD0, 0xD0, 0x64, 0x45, 0x63,
+  0xD0, 0xCE, 0xD0, 0x60, 0x56, 0xCB, 0xCC, 0x62,
+  0xCE, 0xDA, 0xDE, 0xD8, 0xDD, 0xCC, 0x45, 0x49,
+  0x3E, 0x47, 0x42, 0xD1, 0xDC, 0xD8, 0xD8, 0xD3,
+  0x5D, 0x4C, 0x49, 0x3F, 0x47, 0x59, 0xCD, 0xCF,
+  0x59, 0x2E, 0x48, 0x47, 0x52, 0x63, 0xF0, 0xF2,
+  0xF3, 0xF3, 0xF2, 0xDA, 0x52, 0x4B, 0x52, 0x58,
+  0x5E, 0x63, 0xD0, 0xD0, 0xD0, 0xCF, 0xCE, 0xCE,
+  0xCF, 0x65, 0x61, 0xD6, 0xD6, 0xD6, 0xCB, 0x4B,
+  0x61, 0x62, 0x5D, 0x43, 0x4B, 0x61, 0xD0, 0xD4,
+  0xD1, 0x61, 0xCE, 0xD2, 0xCD, 0x5E, 0x4A, 0xCE,
+  0xD0, 0xCC, 0xD0, 0x59, 0x61, 0xCC, 0xCC, 0x62,
+  0xD1, 0xD5, 0xDE, 0xD8, 0xDD, 0xCF, 0x4B, 0x4A,
+  0x45, 0x3E, 0x2D, 0xCB, 0xDC, 0xDE, 0xD8, 0xD5,
+  0x60, 0x54, 0x51, 0x4C, 0x4D, 0x5C, 0xCC, 0xCE,
+  0x5A, 0x2C, 0x50, 0x53, 0x3E, 0x59, 0xD8, 0xF3,
+  0xF2, 0xF3, 0xF3, 0xE0, 0x5E, 0x4A, 0x4C, 0x53,
+  0x5E, 0x63, 0xCC, 0xCC, 0xCC, 0xCD, 0xCF, 0xD3,
+  0x62, 0x53, 0xD6, 0xD6, 0xD6, 0xD6, 0x5B, 0x48,
+  0x64, 0x63, 0x59, 0x44, 0x57, 0x63, 0xD2, 0xD3,
+  0xD0, 0x5E, 0xD0, 0xD1, 0xCB, 0x58, 0x4C, 0xCF,
+  0xCF, 0xCE, 0xCE, 0x57, 0x63, 0xCC, 0xCD, 0x57,
+};
+
+unsigned char linux_logo_bw[] __initdata = {
+  0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+  0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x80, 0x00, 0x3F,
+  0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x1F,
+  0xFE, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+  0xFE, 0x3F, 0xFF, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF,
+  0xFF, 0xFF, 0xFE, 0x7F, 0xFF, 0xC7, 0xFF, 0xFF,
+  0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xFF, 0xFF, 0xC3,
+  0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xFF,
+  0xFB, 0xE3, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+  0xFD, 0xFF, 0xFF, 0xE1, 0xFF, 0xFF, 0xFF, 0xFF,
+  0xFF, 0xFF, 0xF9, 0xFF, 0xFF, 0xF1, 0xFF, 0xFF,
+  0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0xFF, 0xFF, 0xF1,
+  0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0xFF,
+  0xFF, 0xF8, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+  0xF9, 0xFF, 0xFF, 0xF8, 0xFF, 0xFF, 0xFF, 0xFF,
+  0xFF, 0xFF, 0xF9, 0xCF, 0xC3, 0xF8, 0xFF, 0xFF,
+  0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0x87, 0x81, 0xF9,
+  0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0xA7,
+  0x99, 0xF9, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+  0xF9, 0xF3, 0xBC, 0xF9, 0xFF, 0xFF, 0xFF, 0xFF,
+  0xFF, 0xFF, 0xF9, 0xE3, 0xBC, 0xF9, 0xFF, 0xFF,
+  0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0xB0, 0x3C, 0xF9,
+  0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0xB0,
+  0x19, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+  0xF9, 0xC0, 0x03, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF,
+  0xFF, 0xFF, 0xF9, 0x80, 0x01, 0xF8, 0xFF, 0xFF,
+  0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0x80, 0x01, 0xF8,
+  0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0x80,
+  0x01, 0xF8, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+  0xF9, 0xC0, 0x21, 0xD8, 0xFF, 0xFF, 0xFF, 0xFF,
+  0xFF, 0xFF, 0xF9, 0xB1, 0x80, 0xEC, 0xC0, 0x1F,
+  0xFF, 0xFF, 0xFF, 0xFF, 0xF1, 0x90, 0x00, 0xE4,
+  0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xF1, 0x8C,
+  0xC0, 0x7C, 0x04, 0x81, 0xFF, 0xFF, 0xFF, 0xFF,
+  0xE3, 0x80, 0x00, 0x7C, 0x40, 0x11, 0xFF, 0xFF,
+  0xFF, 0xFF, 0xE3, 0x80, 0x00, 0x7F, 0xD2, 0x29,
+  0xFF, 0xFF, 0xFF, 0xFF, 0x87, 0x00, 0x00, 0x3F,
+  0x80, 0x19, 0xFF, 0xFF, 0xFF, 0xFF, 0x0E, 0x00,
+  0x00, 0x3F, 0x80, 0x19, 0xFF, 0xFF, 0xFF, 0xFF,
+  0x1E, 0x00, 0x00, 0x1F, 0x80, 0x19, 0xFF, 0xFF,
+  0xFF, 0xFE, 0x1C, 0x00, 0x00, 0x1E, 0x80, 0x19,
+  0xFF, 0xFF, 0xFF, 0xFE, 0x3C, 0x00, 0x00, 0x1E,
+  0x80, 0x11, 0xFF, 0xFF, 0xFF, 0xFC, 0x7C, 0x00,
+  0x00, 0x0F, 0x80, 0x11, 0xFF, 0xFF, 0xFF, 0xFC,
+  0xF8, 0x00, 0x00, 0x0E, 0x80, 0x11, 0xFF, 0xFF,
+  0xFF, 0xFC, 0xF8, 0x00, 0x00, 0x06, 0x00, 0x11,
+  0xFF, 0xFF, 0xFF, 0xF8, 0xF8, 0x00, 0x00, 0x06,
+  0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xF9, 0xF0, 0x00,
+  0x00, 0x02, 0x00, 0x09, 0xFF, 0xFF, 0xFF, 0xF1,
+  0xF0, 0x00, 0x00, 0x02, 0x80, 0x10, 0xFF, 0xFF,
+  0xFF, 0xF1, 0xE0, 0x00, 0x00, 0x00, 0x97, 0x10,
+  0xFF, 0xFF, 0xFF, 0xE3, 0xE0, 0x00, 0x00, 0x00,
+  0xDF, 0xF0, 0xFF, 0xFF, 0xFF, 0xE3, 0xC0, 0x00,
+  0x00, 0x00, 0xFF, 0xF8, 0xFF, 0xFF, 0xFF, 0xC7,
+  0xC0, 0x00, 0x00, 0x01, 0xFF, 0xF8, 0xFF, 0xFF,
+  0xFF, 0xC7, 0x80, 0x00, 0x00, 0x01, 0xFF, 0xF8,
+  0xFF, 0xFF, 0xFF, 0x8F, 0x80, 0x00, 0x00, 0x01,
+  0xFF, 0xF8, 0xFF, 0xFF, 0xFF, 0x8F, 0x80, 0x00,
+  0x00, 0x01, 0xFF, 0xF8, 0xFF, 0xFF, 0xFF, 0x9F,
+  0x80, 0x00, 0x00, 0x01, 0xFF, 0xF8, 0xFF, 0xFF,
+  0xFF, 0x9F, 0x80, 0x00, 0x00, 0x01, 0x80, 0x18,
+  0xFF, 0xFF, 0xFF, 0x9E, 0x80, 0x00, 0x00, 0x03,
+  0xA8, 0x11, 0xFF, 0xFF, 0xFF, 0x9F, 0x80, 0x00,
+  0x00, 0x02, 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0x99,
+  0x80, 0x00, 0x00, 0x00, 0x00, 0x09, 0xFF, 0xFF,
+  0xFF, 0x00, 0x80, 0x00, 0x00, 0x01, 0xC0, 0x01,
+  0xFF, 0xFF, 0xFE, 0x20, 0x60, 0x00, 0x00, 0x00,
+  0xFF, 0xC3, 0xFF, 0xFF, 0xF8, 0x00, 0x30, 0x00,
+  0x00, 0x00, 0xFF, 0x0F, 0xFF, 0xFF, 0xC0, 0x40,
+  0x38, 0x00, 0x00, 0x00, 0xFE, 0x47, 0xFF, 0xFF,
+  0x81, 0x00, 0x1C, 0x00, 0x00, 0x00, 0xFC, 0x23,
+  0xFF, 0xFF, 0x90, 0x00, 0x1E, 0x00, 0x00, 0x00,
+  0x78, 0x11, 0xFF, 0xFF, 0x80, 0x00, 0x0F, 0x80,
+  0x00, 0x00, 0x00, 0x01, 0xFF, 0xFF, 0x80, 0x00,
+  0x07, 0xC0, 0x00, 0x00, 0x00, 0x08, 0xFF, 0xFF,
+  0xC0, 0x00, 0x07, 0xC0, 0x00, 0x00, 0x00, 0x04,
+  0x7F, 0xFF, 0x80, 0x00, 0x03, 0xC0, 0x00, 0x10,
+  0x00, 0x00, 0x1F, 0xFF, 0x80, 0x00, 0x01, 0x80,
+  0x00, 0x30, 0x00, 0x00, 0x0F, 0xFF, 0x80, 0x00,
+  0x00, 0x00, 0x00, 0x70, 0x00, 0x01, 0x4F, 0xFF,
+  0x80, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x00, 0x00,
+  0x0F, 0xFF, 0xC0, 0x00, 0x00, 0x80, 0x03, 0xF0,
+  0x00, 0x00, 0x8F, 0xFF, 0x80, 0x00, 0x00, 0x40,
+  0x0F, 0xF0, 0x00, 0x04, 0x1F, 0xFF, 0x80, 0x00,
+  0x00, 0x7F, 0xFF, 0xF0, 0x00, 0x10, 0x1F, 0xFF,
+  0xC0, 0x00, 0x00, 0x7F, 0xFF, 0xF0, 0x00, 0x40,
+  0xFF, 0xFF, 0x98, 0x00, 0x00, 0xFF, 0xFF, 0xF0,
+  0x00, 0x83, 0xFF, 0xFF, 0x81, 0xE0, 0x01, 0xFF,
+  0xFF, 0xF8, 0x02, 0x07, 0xFF, 0xFF, 0x80, 0x3F,
+  0x07, 0xE0, 0x00, 0x1C, 0x0C, 0x1F, 0xFF, 0xFF,
+  0xF8, 0x03, 0xFF, 0x80, 0x00, 0x1F, 0x78, 0x1F,
+  0xFF, 0xFF, 0xFF, 0x80, 0x7F, 0x00, 0x07, 0x0F,
+  0xF0, 0x7F, 0xFF, 0xFF, 0xFF, 0xFE, 0x0C, 0x07,
+  0xFF, 0x83, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+  0x00, 0x1F, 0xFF, 0xC0, 0x03, 0xFF, 0xFF, 0xFF,
+  0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x07, 0xFF,
+  0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+  0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+  0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+  0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+};
+
+#endif
+
+#ifdef INCLUDE_LINUX_LOGO16
+
+unsigned char linux_logo16_red[] __initdata = {
+    0x00, 0x90, 0xb0, 0x9c, 0xf7, 0x35, 0x83, 0xa5,
+    0x65, 0x8f, 0x98, 0xc9, 0xdb, 0xe1, 0xe7, 0xf8
+};
+
+unsigned char linux_logo16_green[] __initdata = {
+    0x00, 0x90, 0xb0, 0x9c, 0xf7, 0x2e, 0x83, 0xa5,
+    0x65, 0x6e, 0x98, 0x89, 0xbf, 0xac, 0xda, 0xf8
+};
+
+unsigned char linux_logo16_blue[] __initdata = {
+    0x00, 0x90, 0xaf, 0x9c, 0xf7, 0x2b, 0x82, 0xa5,
+    0x65, 0x41, 0x97, 0x1e, 0x60, 0x29, 0xa5, 0xf8
+};
+
+unsigned char linux_logo16[] __initdata = {
+    0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
+    0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xa1, 0x11, 0x11,
+    0x61, 0x16, 0x66, 0x66, 0x11, 0x11, 0x11, 0x11,
+    0x11, 0x11, 0x1a, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
+    0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
+    0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
+    0xaa, 0xaa, 0xaa, 0xaa, 0x33, 0xa8, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x87, 0x77, 0x77, 0x77, 0x77,
+    0x77, 0x77, 0x73, 0x33, 0x33, 0x3a, 0xaa, 0xaa,
+    0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
+    0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
+    0xaa, 0xaa, 0xa3, 0x33, 0x33, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x77, 0x77, 0x77, 0x77,
+    0x77, 0x27, 0x77, 0x77, 0x77, 0x33, 0x3a, 0xaa,
+    0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
+    0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
+    0xaa, 0xa3, 0x33, 0x33, 0x30, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x55, 0x50, 0x08, 0x33, 0x77, 0x77,
+    0x77, 0x72, 0x72, 0x27, 0x77, 0x77, 0x33, 0x33,
+    0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
+    0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
+    0xa3, 0x33, 0x33, 0x77, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x58, 0x85, 0x00, 0x11, 0x11, 0xaa,
+    0xa3, 0x37, 0x77, 0x72, 0x22, 0x22, 0x77, 0x73,
+    0x33, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
+    0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xa3,
+    0x33, 0x37, 0x77, 0x33, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x56, 0x85, 0x00, 0x06, 0x66, 0x11,
+    0x11, 0x1a, 0xa3, 0x37, 0x77, 0x72, 0x22, 0x77,
+    0x73, 0x33, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
+    0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x33,
+    0x33, 0x33, 0x33, 0x30, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x55, 0x00, 0x00, 0x06, 0x66, 0x66,
+    0x66, 0x66, 0x11, 0x1a, 0xa3, 0x77, 0x72, 0x22,
+    0x77, 0x73, 0x3a, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
+    0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x33, 0x33,
+    0x33, 0x33, 0x33, 0xa0, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x11,
+    0x66, 0x66, 0x66, 0x66, 0x11, 0xa3, 0x77, 0x22,
+    0x22, 0x77, 0x33, 0x33, 0xaa, 0xaa, 0xaa, 0xaa,
+    0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x33, 0x33, 0x33,
+    0x33, 0x3a, 0xa1, 0x10, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x77, 0x33,
+    0xaa, 0x11, 0x16, 0x66, 0x66, 0x61, 0x1a, 0x37,
+    0x22, 0x22, 0x77, 0x33, 0x3a, 0xaa, 0xaa, 0xaa,
+    0xaa, 0xaa, 0xaa, 0xaa, 0xa3, 0x33, 0x33, 0x33,
+    0x3a, 0xa1, 0x11, 0x10, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x02, 0x22,
+    0x22, 0x77, 0x3a, 0x11, 0x66, 0x66, 0x66, 0x1a,
+    0x37, 0x22, 0x22, 0x77, 0x33, 0x3a, 0xaa, 0xaa,
+    0xaa, 0xaa, 0xaa, 0xaa, 0x33, 0x33, 0x33, 0x3a,
+    0xa1, 0x11, 0x11, 0x10, 0x00, 0x00, 0x50, 0x00,
+    0x00, 0x05, 0x80, 0x50, 0x00, 0x00, 0x07, 0x72,
+    0x22, 0x22, 0x22, 0x73, 0xa1, 0x66, 0x66, 0x61,
+    0x1a, 0x77, 0x22, 0x27, 0x73, 0x33, 0xaa, 0xaa,
+    0xaa, 0xaa, 0xaa, 0xaa, 0x33, 0x33, 0x3a, 0xaa,
+    0x11, 0x11, 0x1a, 0xa0, 0x08, 0x71, 0x05, 0x00,
+    0x00, 0x12, 0x22, 0x50, 0x00, 0x00, 0x07, 0x77,
+    0x77, 0x72, 0x22, 0x22, 0x27, 0x31, 0x16, 0x66,
+    0x61, 0x13, 0x77, 0x22, 0x77, 0x33, 0x3a, 0xaa,
+    0xaa, 0xaa, 0xaa, 0xa3, 0x33, 0x33, 0xaa, 0xa1,
+    0x11, 0x1a, 0x33, 0x70, 0x07, 0x2e, 0x70, 0x00,
+    0x01, 0x44, 0x42, 0x60, 0x00, 0x00, 0x02, 0x22,
+    0x22, 0x22, 0x22, 0x22, 0x22, 0x27, 0x31, 0x66,
+    0x66, 0x61, 0xa3, 0x72, 0x22, 0x77, 0x33, 0xaa,
+    0xaa, 0xaa, 0xa3, 0x33, 0x33, 0xaa, 0xaa, 0x11,
+    0x1a, 0x33, 0x77, 0x30, 0x04, 0x82, 0x40, 0x00,
+    0x54, 0x48, 0x54, 0x40, 0x00, 0x00, 0x01, 0xaa,
+    0x32, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x31,
+    0x66, 0x66, 0x11, 0x37, 0x22, 0x27, 0x73, 0x3a,
+    0xaa, 0xaa, 0xa3, 0x33, 0x3a, 0xaa, 0xaa, 0xaa,
+    0xa3, 0x77, 0xaa, 0x10, 0x50, 0x08, 0x46, 0x05,
+    0x54, 0x80, 0x50, 0x42, 0x00, 0x00, 0x08, 0x66,
+    0x66, 0x1a, 0x32, 0x22, 0x22, 0x22, 0x22, 0x27,
+    0x31, 0x66, 0x66, 0x13, 0x72, 0x22, 0x77, 0x33,
+    0xaa, 0xaa, 0xaa, 0x33, 0xaa, 0xa1, 0xaa, 0xa3,
+    0x37, 0xa1, 0x1a, 0x30, 0x50, 0x06, 0x26, 0x00,
+    0x54, 0x00, 0x00, 0x44, 0x00, 0x00, 0x08, 0xe2,
+    0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0x22, 0x22,
+    0x27, 0xa6, 0x66, 0x61, 0xa7, 0x72, 0x27, 0x73,
+    0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x33,
+    0x31, 0x11, 0x37, 0x70, 0x02, 0x00, 0xab, 0xbb,
+    0xb6, 0x00, 0x00, 0xf4, 0x00, 0x00, 0xee, 0xee,
+    0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0x22,
+    0x22, 0x23, 0x16, 0x66, 0x1a, 0x37, 0x22, 0x77,
+    0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xa3, 0x3a,
+    0x11, 0xa7, 0x33, 0x10, 0x04, 0x09, 0xbd, 0xdd,
+    0xbd, 0xd0, 0x04, 0x45, 0x00, 0x0e, 0xee, 0xee,
+    0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0x22,
+    0x22, 0x22, 0x71, 0x66, 0x66, 0x13, 0x72, 0x27,
+    0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x33, 0x11,
+    0xa3, 0x73, 0xa1, 0x60, 0x08, 0xbd, 0xdd, 0xdd,
+    0xdd, 0xdd, 0xdb, 0x90, 0x00, 0x02, 0xec, 0xee,
+    0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xce, 0x22,
+    0x22, 0x22, 0x27, 0xa6, 0x66, 0x61, 0x37, 0x27,
+    0x1a, 0xaa, 0xaa, 0xaa, 0xaa, 0xa3, 0xa1, 0x1a,
+    0x33, 0xa1, 0x16, 0x60, 0x0b, 0xbd, 0xdd, 0xdd,
+    0xcd, 0xdd, 0xdd, 0xd9, 0x00, 0x00, 0xec, 0xcc,
+    0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xce, 0xa2,
+    0x22, 0x22, 0x22, 0x7a, 0x66, 0x66, 0x13, 0x77,
+    0x1a, 0xaa, 0xaa, 0xaa, 0xaa, 0x3a, 0x11, 0x33,
+    0xaa, 0x11, 0x66, 0x60, 0x9b, 0xdd, 0xdd, 0xdd,
+    0xcd, 0xdd, 0xdb, 0xb9, 0x00, 0x00, 0xec, 0xcc,
+    0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xee, 0x61,
+    0x72, 0x22, 0x22, 0x22, 0xa1, 0x66, 0x61, 0x37,
+    0x1a, 0xaa, 0xaa, 0xaa, 0xa3, 0xa1, 0x13, 0x3a,
+    0x11, 0x11, 0x11, 0x10, 0x5b, 0xdd, 0xdd, 0xdc,
+    0xdd, 0xdd, 0xbd, 0xd9, 0x00, 0x00, 0xec, 0xcc,
+    0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xee, 0x86,
+    0x17, 0x22, 0x22, 0x22, 0x23, 0x16, 0x66, 0xaa,
+    0xaa, 0xa3, 0x3a, 0xaa, 0xaa, 0x1a, 0x3a, 0xa1,
+    0x11, 0x11, 0x1a, 0x70, 0x05, 0xbd, 0xdd, 0xdd,
+    0xdb, 0x5b, 0xdd, 0xb0, 0x00, 0x60, 0x2e, 0xcc,
+    0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xe6, 0x88,
+    0x66, 0x32, 0x22, 0x22, 0x22, 0x36, 0x66, 0x11,
+    0x33, 0x33, 0x3a, 0xaa, 0x11, 0xaa, 0xaa, 0xa1,
+    0x11, 0x1a, 0x3a, 0x60, 0x02, 0x99, 0xbb, 0xb9,
+    0x9b, 0xbb, 0xbc, 0x22, 0x00, 0x86, 0x5e, 0xcc,
+    0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xe1, 0x68,
+    0x86, 0x63, 0x22, 0x22, 0x22, 0x2a, 0x66, 0x66,
+    0x33, 0x33, 0xaa, 0xaa, 0x1a, 0xaa, 0xaa, 0x11,
+    0x1a, 0xa7, 0x68, 0x80, 0x02, 0x2b, 0xbd, 0xbb,
+    0xbb, 0xb9, 0x22, 0x22, 0x00, 0x06, 0x6e, 0xcc,
+    0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xc7, 0xa6,
+    0x88, 0x86, 0x32, 0x22, 0x22, 0x27, 0xa6, 0x66,
+    0x33, 0x3a, 0xaa, 0xa1, 0xaa, 0xaa, 0xa1, 0x11,
+    0xa3, 0xa6, 0x88, 0x80, 0x02, 0x22, 0x9b, 0xbb,
+    0xbb, 0x22, 0x24, 0xf4, 0x60, 0x00, 0x0c, 0xcc,
+    0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xc2, 0x21,
+    0x68, 0x88, 0x63, 0x22, 0x22, 0x22, 0x71, 0x66,
+    0x33, 0x3a, 0x11, 0x11, 0xaa, 0xaa, 0x11, 0xaa,
+    0x71, 0x88, 0x88, 0x00, 0x02, 0xe2, 0x26, 0x99,
+    0x22, 0x22, 0x4f, 0xf4, 0x40, 0x00, 0x0c, 0xcc,
+    0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0x22, 0x22,
+    0x16, 0x88, 0x86, 0xa2, 0x22, 0x22, 0x27, 0x11,
+    0x33, 0xa1, 0x11, 0x11, 0xaa, 0x31, 0x1a, 0xa3,
+    0x68, 0x88, 0x81, 0x00, 0x54, 0x42, 0x22, 0x22,
+    0x22, 0x44, 0xff, 0xff, 0x48, 0x00, 0x00, 0x99,
+    0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0x99, 0x22, 0x22,
+    0x21, 0x88, 0x88, 0x6a, 0x22, 0x22, 0x22, 0x31,
+    0x3a, 0xa1, 0x11, 0x1a, 0xa3, 0x11, 0x33, 0x36,
+    0x88, 0x86, 0x30, 0x00, 0x4f, 0x44, 0x22, 0x22,
+    0x24, 0xff, 0xff, 0xff, 0x44, 0x00, 0x00, 0x99,
+    0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0x95, 0x22, 0x72,
+    0x22, 0x18, 0x88, 0x86, 0x32, 0x22, 0x22, 0x27,
+    0xaa, 0x11, 0x11, 0x1a, 0x31, 0x13, 0x33, 0x68,
+    0x88, 0x6a, 0x00, 0x02, 0x4f, 0x4f, 0x42, 0x24,
+    0x4f, 0xff, 0xff, 0xff, 0xf4, 0x50, 0x00, 0x99,
+    0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0x99, 0x22, 0x73,
+    0x72, 0x26, 0x88, 0x88, 0x63, 0x22, 0x22, 0x22,
+    0x11, 0x11, 0x11, 0xa3, 0xa1, 0x73, 0xa6, 0x88,
+    0x81, 0xa5, 0x00, 0x04, 0x4f, 0x4f, 0x44, 0x4f,
+    0xff, 0xff, 0xff, 0xff, 0xf4, 0x40, 0x00, 0x99,
+    0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0x99, 0x12, 0x27,
+    0xaa, 0x22, 0x68, 0x55, 0x86, 0x72, 0x22, 0x22,
+    0x11, 0x11, 0x1a, 0x33, 0x13, 0x3a, 0x18, 0x88,
+    0x1a, 0x10, 0x00, 0x44, 0x4f, 0x4f, 0xff, 0x4f,
+    0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x99,
+    0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0x99, 0x61, 0x22,
+    0x3a, 0xa2, 0x26, 0x85, 0x58, 0x67, 0x22, 0x22,
+    0x61, 0x61, 0x1a, 0x7a, 0x37, 0x31, 0x88, 0x81,
+    0x11, 0x00, 0x05, 0xe4, 0x44, 0xff, 0xff, 0xff,
+    0x4f, 0xf4, 0x44, 0xff, 0xff, 0xf5, 0x00, 0x99,
+    0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0x99, 0x88, 0x12,
+    0x2a, 0xaa, 0x72, 0x68, 0x55, 0x81, 0x22, 0x22,
+    0x66, 0x61, 0xa3, 0x33, 0x73, 0x16, 0x88, 0x11,
+    0x10, 0x00, 0x08, 0x74, 0x44, 0x4f, 0x44, 0x44,
+    0xf4, 0xf4, 0x44, 0x44, 0xe2, 0x44, 0x00, 0x99,
+    0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0x99, 0x88, 0x81,
+    0x22, 0xaa, 0xa7, 0x26, 0x85, 0x88, 0x12, 0x22,
+    0x66, 0x61, 0x37, 0xa7, 0x3a, 0x66, 0x66, 0x11,
+    0x80, 0x00, 0x0a, 0x72, 0x44, 0x4f, 0x44, 0x4f,
+    0xff, 0x44, 0x44, 0x22, 0x22, 0x24, 0x00, 0x99,
+    0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0x99, 0x85, 0x88,
+    0x12, 0x2a, 0xaa, 0x22, 0x68, 0x58, 0x63, 0x22,
+    0x66, 0x1a, 0x73, 0x77, 0x31, 0x66, 0x61, 0x11,
+    0x00, 0x00, 0x07, 0x44, 0xff, 0x4f, 0xf4, 0x4f,
+    0xff, 0x4f, 0x44, 0xf4, 0x42, 0x22, 0x40, 0x9b,
+    0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xb9, 0x85, 0x55,
+    0x81, 0x27, 0xaa, 0xa2, 0x78, 0x88, 0x86, 0x72,
+    0x66, 0x13, 0x77, 0x73, 0x11, 0x66, 0x61, 0x76,
+    0x00, 0x50, 0x84, 0xf4, 0xff, 0x4f, 0xf4, 0xff,
+    0xff, 0x4f, 0x44, 0xff, 0x4f, 0x42, 0x40, 0x9b,
+    0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xb9, 0x68, 0x55,
+    0x58, 0x12, 0x3a, 0xaa, 0x23, 0x88, 0x88, 0xa7,
+    0x66, 0xa7, 0x77, 0x7a, 0x16, 0x66, 0x1a, 0x15,
+    0x05, 0x00, 0x4f, 0xf4, 0xff, 0x4f, 0xf4, 0xff,
+    0xff, 0x4f, 0x44, 0xff, 0x4f, 0x44, 0x24, 0x9b,
+    0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xb9, 0x26, 0x55,
+    0x55, 0x81, 0x23, 0xaa, 0x32, 0x18, 0x88, 0x6a,
+    0x61, 0x37, 0x77, 0x31, 0x66, 0x66, 0x17, 0x60,
+    0x05, 0x08, 0x4f, 0xf4, 0xff, 0x4f, 0xf4, 0xff,
+    0xff, 0x4f, 0x44, 0xff, 0x4f, 0x4f, 0x4e, 0x99,
+    0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0x99, 0xa2, 0x65,
+    0x55, 0x58, 0xa2, 0x7a, 0xa2, 0x26, 0x88, 0x61,
+    0x61, 0x32, 0x27, 0xa1, 0x66, 0x61, 0x31, 0x60,
+    0x00, 0x04, 0x4f, 0xf4, 0xff, 0x44, 0x44, 0xff,
+    0xff, 0x4f, 0x44, 0xff, 0x4f, 0x44, 0xf4, 0x99,
+    0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0x9b, 0xaa, 0x26,
+    0x55, 0x55, 0x87, 0x27, 0x33, 0x27, 0x68, 0x61,
+    0x1a, 0x72, 0x27, 0xa6, 0x66, 0x6a, 0x71, 0x00,
+    0x80, 0x84, 0xff, 0xf4, 0xff, 0x44, 0x44, 0xff,
+    0xff, 0x4f, 0x44, 0xff, 0x4f, 0x44, 0xf4, 0x99,
+    0x9b, 0x9b, 0x99, 0xb9, 0xb9, 0x99, 0xaa, 0xa2,
+    0x85, 0x55, 0x56, 0x22, 0x27, 0x22, 0x36, 0x66,
+    0x13, 0x22, 0x23, 0x16, 0x86, 0x63, 0x73, 0x00,
+    0x00, 0x44, 0xf4, 0xf4, 0xff, 0x44, 0x44, 0xff,
+    0xff, 0x4f, 0x44, 0xff, 0x4f, 0x4f, 0x4f, 0x99,
+    0x9b, 0x99, 0x99, 0x99, 0xb9, 0x99, 0xaa, 0xaa,
+    0x28, 0x55, 0x58, 0x12, 0x22, 0x22, 0x21, 0x11,
+    0xa3, 0x27, 0x7a, 0x66, 0x86, 0x17, 0x75, 0x05,
+    0x05, 0xff, 0xf4, 0xf4, 0xff, 0x44, 0x44, 0xff,
+    0xff, 0x4f, 0x44, 0x4f, 0x4f, 0x44, 0x4f, 0x99,
+    0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x3a, 0xaa,
+    0xa2, 0x85, 0x58, 0x67, 0x72, 0x22, 0x27, 0xa1,
+    0x37, 0x27, 0x7a, 0x68, 0x86, 0xa2, 0x70, 0x00,
+    0x02, 0xff, 0xf4, 0xf4, 0xff, 0x44, 0x44, 0x4f,
+    0xff, 0x4f, 0x44, 0xf4, 0xf4, 0xf4, 0xf4, 0x99,
+    0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x23, 0xaa,
+    0xa7, 0x78, 0x88, 0x81, 0x77, 0x22, 0x27, 0x3a,
+    0x72, 0x73, 0x71, 0x68, 0x66, 0x32, 0x50, 0x00,
+    0x04, 0x4f, 0xf4, 0xf4, 0xff, 0x44, 0x44, 0x4f,
+    0xff, 0x4f, 0x44, 0xf4, 0xf4, 0xf4, 0x44, 0x95,
+    0x99, 0x99, 0x99, 0x99, 0x99, 0x55, 0x12, 0x3a,
+    0xaa, 0x21, 0x88, 0x81, 0x77, 0x27, 0x73, 0x73,
+    0x72, 0x33, 0x36, 0x86, 0x61, 0x72, 0x00, 0x00,
+    0x04, 0x44, 0xf4, 0xf4, 0xf4, 0x44, 0x44, 0x4f,
+    0xff, 0x4f, 0x44, 0xff, 0x4f, 0x4f, 0x44, 0x55,
+    0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x8a, 0x27,
+    0xaa, 0x77, 0x68, 0x61, 0x23, 0x71, 0x11, 0x3a,
+    0x27, 0xa3, 0x36, 0x86, 0x61, 0x20, 0x00, 0x00,
+    0x04, 0xf4, 0xf4, 0xf4, 0xf4, 0x44, 0x44, 0x4f,
+    0xff, 0x4f, 0x44, 0xff, 0x4f, 0x4f, 0x41, 0x59,
+    0x99, 0x99, 0x99, 0x99, 0x99, 0x95, 0x58, 0x77,
+    0x27, 0x32, 0x36, 0x63, 0x23, 0x71, 0x66, 0x11,
+    0x27, 0x13, 0xa6, 0x86, 0x6a, 0x20, 0x00, 0x50,
+    0x04, 0x4f, 0x4f, 0x4f, 0x4f, 0x44, 0x44, 0x4f,
+    0xff, 0x4f, 0x44, 0xff, 0x4f, 0x4f, 0x41, 0x99,
+    0x9b, 0xbb, 0xbb, 0xbb, 0xb9, 0x99, 0x68, 0x13,
+    0x32, 0x22, 0x73, 0xa7, 0x2a, 0x31, 0x88, 0x66,
+    0x7a, 0x13, 0x18, 0x66, 0x63, 0x20, 0x00, 0x06,
+    0x0f, 0x4f, 0x4f, 0x4f, 0x4f, 0x44, 0x44, 0x4f,
+    0xff, 0x4f, 0x44, 0xff, 0x4f, 0x4f, 0x49, 0x95,
+    0xa9, 0xa9, 0x99, 0x97, 0x92, 0x99, 0x65, 0x6a,
+    0x17, 0x22, 0x23, 0x72, 0x27, 0xaa, 0x88, 0x88,
+    0xa1, 0x17, 0x68, 0x66, 0x67, 0x70, 0x00, 0x05,
+    0x0f, 0x4f, 0x4f, 0x4f, 0x4f, 0x44, 0x44, 0x4f,
+    0xff, 0x4f, 0x44, 0xff, 0xf4, 0xf4, 0x49, 0x9c,
+    0x2e, 0xee, 0xee, 0xee, 0xee, 0xa9, 0x65, 0x8a,
+    0x1a, 0xaa, 0x37, 0x72, 0x27, 0x37, 0x88, 0x88,
+    0x11, 0x17, 0x68, 0x66, 0x67, 0x10, 0x9d, 0xd0,
+    0x84, 0x44, 0xff, 0x4f, 0x4f, 0x44, 0xf4, 0x4f,
+    0xff, 0x4f, 0x44, 0xff, 0xf4, 0xf4, 0x4f, 0x69,
+    0xcc, 0xee, 0xee, 0xee, 0xec, 0x99, 0x88, 0x63,
+    0x61, 0x68, 0x61, 0x72, 0x22, 0x7a, 0x68, 0x88,
+    0x11, 0x17, 0x88, 0x66, 0x12, 0x1b, 0xdd, 0xdd,
+    0x02, 0x44, 0x4f, 0x4f, 0x4f, 0x44, 0x44, 0x4f,
+    0xff, 0x4f, 0x44, 0xff, 0xff, 0x4f, 0x4c, 0xc5,
+    0x0c, 0xc1, 0x11, 0x1c, 0xc0, 0x26, 0x66, 0x17,
+    0x66, 0x88, 0x88, 0x12, 0x22, 0x23, 0xa8, 0x88,
+    0x11, 0x13, 0x88, 0x66, 0x17, 0xbb, 0xdd, 0xdd,
+    0xd0, 0x8f, 0xff, 0xf4, 0xf4, 0x44, 0xf4, 0x4f,
+    0xff, 0x4f, 0x44, 0xf4, 0x4f, 0x44, 0xdd, 0xdd,
+    0x00, 0x00, 0x00, 0x05, 0x9d, 0x21, 0x66, 0x27,
+    0xa6, 0x65, 0x58, 0x67, 0x22, 0x27, 0x28, 0x88,
+    0x11, 0xaa, 0x86, 0x68, 0x1a, 0xbb, 0xdd, 0xdd,
+    0xdb, 0x05, 0xf4, 0xf4, 0xf4, 0xf4, 0x44, 0x4f,
+    0xff, 0x4f, 0x44, 0xf4, 0xf4, 0xf4, 0xdd, 0xdb,
+    0x00, 0x00, 0x00, 0x00, 0xdd, 0xda, 0x66, 0x22,
+    0x71, 0x15, 0x55, 0x81, 0x22, 0x22, 0x76, 0x88,
+    0x11, 0x31, 0x88, 0x88, 0xab, 0xbd, 0xdd, 0xdd,
+    0xdd, 0x00, 0x04, 0x44, 0xff, 0xff, 0x4f, 0x4f,
+    0xff, 0x4f, 0x44, 0xf4, 0xf4, 0x44, 0xdd, 0xdb,
+    0x00, 0x00, 0x00, 0x0b, 0xdd, 0xda, 0x11, 0x22,
+    0x23, 0x68, 0x55, 0x86, 0x22, 0x22, 0x7a, 0x88,
+    0x1a, 0x71, 0x88, 0x89, 0xbb, 0xdd, 0xdd, 0xdd,
+    0xdd, 0xd0, 0x00, 0x4f, 0x44, 0xff, 0x4f, 0x4f,
+    0xff, 0x4f, 0x44, 0xf4, 0xff, 0xe2, 0xdd, 0xdb,
+    0x90, 0x00, 0x05, 0xbd, 0xdd, 0xb8, 0x63, 0x22,
+    0x27, 0xa6, 0x55, 0x88, 0x77, 0x22, 0x22, 0x88,
+    0x1a, 0x28, 0xbd, 0xdb, 0xdd, 0xdd, 0xdd, 0xdd,
+    0xdd, 0xdb, 0x00, 0x07, 0x44, 0x4f, 0x4f, 0x4f,
+    0xff, 0x4f, 0x44, 0x4f, 0x4f, 0x22, 0xdd, 0xdb,
+    0xbb, 0x9b, 0xbb, 0xbd, 0xdd, 0xd5, 0x86, 0x22,
+    0x22, 0x77, 0x85, 0x88, 0x17, 0x22, 0x22, 0x88,
+    0xaa, 0x2b, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
+    0xdd, 0xdd, 0x00, 0x00, 0x54, 0x4f, 0x4f, 0x4f,
+    0xff, 0x4f, 0x44, 0xf4, 0x44, 0x22, 0xbd, 0xdd,
+    0xbb, 0xbb, 0xbb, 0xdd, 0xdd, 0xdd, 0x88, 0x72,
+    0x27, 0x22, 0x88, 0x88, 0x67, 0x72, 0x22, 0x18,
+    0x33, 0x2d, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
+    0xdd, 0xdd, 0xd0, 0x00, 0x05, 0x4f, 0x4f, 0x4f,
+    0xff, 0x4f, 0x44, 0x44, 0x4f, 0x22, 0xbd, 0xdd,
+    0xdb, 0xbb, 0xdd, 0xdd, 0xdd, 0xdd, 0x88, 0x17,
+    0x27, 0x72, 0x68, 0x88, 0x87, 0x32, 0x22, 0x36,
+    0x37, 0x2d, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
+    0xdd, 0xdd, 0xd5, 0x00, 0x00, 0x4f, 0x4f, 0x4f,
+    0xff, 0xf4, 0xf4, 0xf4, 0xf4, 0x22, 0xbb, 0xdd,
+    0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xd8, 0x67,
+    0x72, 0x77, 0x38, 0x88, 0x83, 0x37, 0x22, 0x26,
+    0x72, 0x2b, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
+    0xdd, 0xdd, 0xdd, 0x00, 0x00, 0x4f, 0x4f, 0x4f,
+    0xff, 0xf4, 0xf4, 0xf4, 0x44, 0x25, 0xbb, 0xdd,
+    0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xd3,
+    0x32, 0x73, 0x76, 0x88, 0x81, 0x33, 0x22, 0x2a,
+    0x22, 0x2b, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
+    0xdd, 0xdd, 0xdd, 0xb0, 0x54, 0x4f, 0x4f, 0x4f,
+    0xff, 0xf4, 0xf4, 0xff, 0x44, 0x00, 0xbb, 0xdd,
+    0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
+    0xa7, 0x73, 0x26, 0x88, 0x86, 0x7a, 0x72, 0x27,
+    0x22, 0x2b, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
+    0xdd, 0xdd, 0xdd, 0xdb, 0x44, 0xff, 0x4f, 0x4f,
+    0xff, 0xf4, 0xf4, 0x44, 0x40, 0x05, 0xbb, 0xdd,
+    0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
+    0x13, 0x23, 0x21, 0x68, 0x86, 0x17, 0x72, 0x22,
+    0x22, 0x2b, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
+    0xdd, 0xdd, 0xdd, 0xdb, 0x44, 0x4f, 0x4f, 0x4f,
+    0xff, 0xff, 0x44, 0x42, 0x00, 0x05, 0xbd, 0xdd,
+    0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
+    0x87, 0x27, 0x27, 0x16, 0x66, 0x67, 0x22, 0x22,
+    0x72, 0x7b, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
+    0xdd, 0xdd, 0xdd, 0xdd, 0x94, 0x44, 0x44, 0x44,
+    0x44, 0x44, 0x44, 0x00, 0x00, 0x05, 0xbb, 0xdd,
+    0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xb8,
+    0x86, 0x22, 0x22, 0x7a, 0x68, 0x81, 0x22, 0x22,
+    0x37, 0x7b, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
+    0xdd, 0xdd, 0xdd, 0xdb, 0xb5, 0x44, 0x44, 0x44,
+    0x44, 0x47, 0x00, 0x00, 0x00, 0x05, 0xbd, 0xdd,
+    0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xd8, 0x68,
+    0x58, 0x72, 0x22, 0x27, 0x18, 0x86, 0x72, 0x22,
+    0x1a, 0xbb, 0xbd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
+    0xdd, 0xdd, 0xdd, 0xdb, 0xb5, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0xbb, 0xdd,
+    0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xb9, 0x18, 0x85,
+    0x58, 0x12, 0x22, 0x36, 0x18, 0x88, 0x32, 0x22,
+    0x61, 0x3b, 0xbb, 0xbb, 0xbd, 0xdd, 0xdd, 0xdd,
+    0xdd, 0xdd, 0xdd, 0xdb, 0xb9, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0xbb, 0xdd,
+    0xdd, 0xdd, 0xdd, 0xdd, 0xb9, 0x7a, 0x68, 0x85,
+    0x88, 0x62, 0x27, 0x16, 0x18, 0x88, 0x12, 0x27,
+    0x86, 0x18, 0x9b, 0xbb, 0xbb, 0xbb, 0xbb, 0xbd,
+    0xdd, 0xdd, 0xdd, 0xbb, 0xb5, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0xbb, 0xbd,
+    0xdd, 0xdd, 0xdb, 0xbb, 0x87, 0x31, 0x68, 0x65,
+    0x88, 0x82, 0x23, 0x16, 0x18, 0x88, 0x12, 0x23,
+    0x88, 0x67, 0x27, 0xa8, 0x9b, 0xbb, 0xbb, 0xbb,
+    0xbd, 0xdd, 0xbb, 0xbb, 0x95, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x9b, 0xbb,
+    0xbb, 0xbb, 0xbb, 0x96, 0x87, 0x16, 0x68, 0x18,
+    0x88, 0x62, 0x31, 0x66, 0x18, 0x88, 0x62, 0x73,
+    0x88, 0x63, 0x27, 0x33, 0x65, 0x55, 0x99, 0x9b,
+    0xbb, 0xbb, 0xbb, 0x99, 0x55, 0x0a, 0xa1, 0x86,
+    0x81, 0x68, 0x88, 0x55, 0x58, 0x85, 0x9b, 0xbb,
+    0xbb, 0xbb, 0x95, 0x88, 0x83, 0x66, 0x66, 0x18,
+    0x66, 0x82, 0xa1, 0x66, 0x18, 0x88, 0x62, 0x33,
+    0x88, 0x81, 0x27, 0x7a, 0x18, 0x58, 0x86, 0x85,
+    0x99, 0x99, 0x99, 0x95, 0x53, 0x2a, 0xaa, 0x88,
+    0x67, 0x31, 0x68, 0x55, 0x58, 0x85, 0x59, 0xbb,
+    0xbb, 0xb9, 0x58, 0x68, 0x83, 0x66, 0x61, 0x16,
+    0x66, 0x62, 0x16, 0x66, 0x68, 0x88, 0x62, 0xaa,
+    0x88, 0x86, 0x27, 0x77, 0x78, 0x55, 0x88, 0x22,
+    0x25, 0x55, 0x95, 0x55, 0x6a, 0xa2, 0x2a, 0x88,
+    0x62, 0x27, 0x37, 0x38, 0x88, 0x87, 0x55, 0x59,
+    0x95, 0x58, 0x16, 0x88, 0x8a, 0x66, 0x63, 0x68,
+    0x86, 0x67, 0x66, 0x66, 0x68, 0x88, 0x12, 0x11,
+    0x88, 0x88, 0x72, 0x77, 0x78, 0x85, 0x58, 0x17,
+    0x23, 0x32, 0x55, 0x55, 0x81, 0x13, 0x73, 0x66,
+    0x62, 0x7a, 0xaa, 0x38, 0x88, 0x58, 0x27, 0x55,
+    0x58, 0x32, 0x38, 0x88, 0x81, 0x66, 0xa2, 0x88,
+    0x86, 0x61, 0x66, 0x61, 0x66, 0x68, 0x13, 0x11,
+    0x88, 0x88, 0x12, 0x22, 0x71, 0x85, 0x58, 0x62,
+    0x23, 0xa2, 0x68, 0x88, 0x81, 0x66, 0x88, 0x88,
+    0x63, 0x2a, 0xaa, 0x28, 0x88, 0x55, 0x86, 0x61,
+    0x66, 0x66, 0x68, 0x88, 0x66, 0x66, 0x77, 0x88,
+    0x68, 0x16, 0x66, 0x62, 0x66, 0x68, 0xa1, 0x61,
+    0x88, 0x88, 0x62, 0x22, 0x22, 0x85, 0x55, 0x83,
+    0x72, 0x37, 0xa8, 0x88, 0x61, 0x66, 0x85, 0x55,
+    0x86, 0x23, 0xaa, 0x71, 0x88, 0x85, 0x88, 0x66,
+    0x88, 0x86, 0x88, 0x88, 0x16, 0x61, 0x21, 0x88,
+    0x66, 0xa6, 0x86, 0x17, 0x66, 0x66, 0x31, 0x61,
+    0x88, 0x88, 0x87, 0x72, 0x22, 0x68, 0x55, 0x86,
+    0x77, 0x77, 0x36, 0x88, 0x13, 0x68, 0x85, 0x55,
+    0x58, 0x12, 0x73, 0x72, 0x76, 0x88, 0x88, 0x68,
+    0x88, 0x88, 0x88, 0x66, 0x36, 0x63, 0x26, 0x86,
+    0x86, 0x36, 0x86, 0x11, 0x66, 0x66, 0x76, 0x61,
+    0x88, 0x88, 0x81, 0x22, 0x22, 0x38, 0x85, 0x58,
+    0x37, 0x22, 0x21, 0x68, 0xa2, 0x31, 0x68, 0x55,
+    0x55, 0x81, 0x22, 0x22, 0xa8, 0x88, 0x88, 0x68,
+    0x86, 0x88, 0x68, 0x81, 0x36, 0x17, 0x21, 0x68,
+    0x86, 0x16, 0x66, 0x26, 0x66, 0x61, 0x36, 0x66,
+    0x68, 0x88, 0x86, 0x27, 0x22, 0x28, 0x88, 0x88,
+    0x17, 0x72, 0x2a, 0x66, 0xa2, 0x22, 0x36, 0x55,
+    0x55, 0x58, 0x37, 0x3a, 0x16, 0x66, 0x66, 0x66,
+    0x66, 0x18, 0x88, 0x67, 0x16, 0x12, 0x71, 0x68,
+    0x81, 0x68, 0x61, 0x76, 0x66, 0x6a, 0x16, 0x66,
+    0x88, 0x88, 0x86, 0x77, 0x22, 0x26, 0x88, 0x88,
+    0x13, 0x37, 0x71, 0x66, 0xa2, 0x33, 0x2a, 0x85,
+    0x55, 0x55, 0x17, 0x73, 0x16, 0x66, 0x66, 0x68,
+    0x63, 0x88, 0x88, 0xa2, 0x66, 0xa2, 0xa6, 0x88,
+    0x61, 0x68, 0x6a, 0x76, 0x66, 0x6a, 0x66, 0x6a
+};
+
+#endif
diff -u --recursive --new-file v2.1.106/linux/include/linux/loop.h linux/include/linux/loop.h
--- v2.1.106/linux/include/linux/loop.h	Mon Jul  1 10:06:05 1996
+++ linux/include/linux/loop.h	Wed Jun 24 11:06:22 1998
@@ -17,7 +17,7 @@
        
 struct loop_device {
 	int		lo_number;
-	struct inode	*lo_inode;
+	struct dentry	*lo_dentry;
 	int		lo_refcnt;
 	kdev_t		lo_device;
 	int		lo_offset;
diff -u --recursive --new-file v2.1.106/linux/include/linux/mm.h linux/include/linux/mm.h
--- v2.1.106/linux/include/linux/mm.h	Tue Jun 23 10:01:29 1998
+++ linux/include/linux/mm.h	Wed Jun 24 15:51:17 1998
@@ -310,7 +310,7 @@
 extern int do_munmap(unsigned long, size_t);
 
 /* filemap.c */
-extern unsigned long page_unuse(unsigned long);
+extern unsigned long page_unuse(struct page *);
 extern int shrink_mmap(int, int);
 extern void truncate_inode_pages(struct inode *, unsigned long);
 extern unsigned long get_cached_page(struct inode *, unsigned long, int);
diff -u --recursive --new-file v2.1.106/linux/include/linux/msdos_fs_i.h linux/include/linux/msdos_fs_i.h
--- v2.1.106/linux/include/linux/msdos_fs_i.h	Fri Jan 23 18:10:32 1998
+++ linux/include/linux/msdos_fs_i.h	Wed Jun 24 14:30:11 1998
@@ -21,7 +21,7 @@
 
 		I have not put it conditional. With the advent of loadable
 		file system drivers, it would be very easy to compile
-		a MsDOS FS driver unaware of UMSDOS and then later to
+		a MS-DOS FS driver unaware of UMSDOS and then later to
 		load a (then incompatible) UMSDOS FS driver.
 	*/
 	struct pipe_inode_info reserved;
diff -u --recursive --new-file v2.1.106/linux/include/linux/netdevice.h linux/include/linux/netdevice.h
--- v2.1.106/linux/include/linux/netdevice.h	Tue Jun 23 10:01:29 1998
+++ linux/include/linux/netdevice.h	Wed Jun 24 15:52:09 1998
@@ -251,7 +251,7 @@
 
 	/* Protocol specific pointers */
 	
-	void 			*atalk_ptr;	/* Appletalk link 	*/
+	void 			*atalk_ptr;	/* AppleTalk link 	*/
 	void			*ip_ptr;	/* IPv4 specific data	*/  
 	void                    *dn_ptr;        /* DECnet specific data */
 
diff -u --recursive --new-file v2.1.106/linux/include/linux/pci.h linux/include/linux/pci.h
--- v2.1.106/linux/include/linux/pci.h	Wed May 20 19:10:41 1998
+++ linux/include/linux/pci.h	Wed Jun 24 14:26:13 1998
@@ -764,6 +764,11 @@
 #define PCI_DEVICE_ID_ALLIANCE_AT24	0x6424
 #define PCI_DEVICE_ID_ALLIANCE_AT3D	0x643d
 
+#define PCI_VENDOR_ID_SK		0x1148
+#define PCI_DEVICE_ID_SK_FP		0x4000
+#define PCI_DEVICE_ID_SK_TR		0x4200
+#define PCI_DEVICE_ID_SK_GE		0x4300
+
 #define PCI_VENDOR_ID_VMIC		0x114a
 #define PCI_DEVICE_ID_VMIC_VME		0x7587
 
diff -u --recursive --new-file v2.1.106/linux/include/linux/sched.h linux/include/linux/sched.h
--- v2.1.106/linux/include/linux/sched.h	Tue Jun 23 10:01:29 1998
+++ linux/include/linux/sched.h	Wed Jun 24 15:51:17 1998
@@ -32,6 +32,7 @@
 #define CLONE_FILES	0x00000400	/* set if open files shared between processes */
 #define CLONE_SIGHAND	0x00000800	/* set if signal handlers shared */
 #define CLONE_PID	0x00001000	/* set if pid shared */
+#define CLONE_PTRACE	0x00002000	/* set if we want to let tracing continue on the child too */
 
 /*
  * These are the constant used to fake the fixed-point load-average
@@ -350,7 +351,7 @@
 /* timeout */	0,SCHED_OTHER,0,0,0,0,0,0,0, \
 /* timer */	{ NULL, NULL, 0, 0, it_real_fn }, \
 /* utime */	{0,0,0,0},0, \
-/* per cpu times */ {0, }, {0, }, \
+/* per CPU times */ {0, }, {0, }, \
 /* flt */	0,0,0,0,0,0, \
 /* swp */	0,0,0,0,0, \
 /* process credentials */					\
diff -u --recursive --new-file v2.1.106/linux/include/linux/sdla_x25.h linux/include/linux/sdla_x25.h
--- v2.1.106/linux/include/linux/sdla_x25.h	Tue Mar 10 10:03:35 1998
+++ linux/include/linux/sdla_x25.h	Wed Jun 24 14:34:44 1998
@@ -18,7 +18,7 @@
 /*----------------------------------------------------------------------------
  * Notes:
  * ------
- * 1. All structures defined in this file are byte-alined.  To ensure
+ * 1. All structures defined in this file are byte-aligned.  To ensure
  *    portability of this code between different platforms and compilers, one
  *    of the following defines must be defined before including this file:
  *
@@ -104,7 +104,7 @@
 #define X25_READ		0x22	/* read X.25 packet */
 #define X25_WRITE		0x23	/* send X.25 packet */
 #define X25_PLACE_CALL		0x30	/* place a call on SVC */
-#define X25_ACCEPT_CALL		0x31	/* accept incomming call */
+#define X25_ACCEPT_CALL		0x31	/* accept incoming call */
 #define X25_CLEAR_CALL		0x32	/* clear call */
 #define X25_CLEAR_CONFRM	0x33	/* send clear confirmation packet */
 #define X25_RESET		0x34	/* send reset request packet */
@@ -116,14 +116,14 @@
 #define X25_REGISTRATION_RQST	0x3A	/* send registration request packet */
 #define X25_REGISTRATION_CONFRM	0x3B	/* send registration confirmation */
 #define X25_IS_DATA_AVAILABLE	0x40	/* querry receive queue */
-#define X25_INCOMMING_CALL_CTL	0x41	/* select incomming call options */
+#define X25_INCOMING_CALL_CTL	0x41	/* select incoming call options */
 #define X25_CONFIGURE_PVC	0x42	/* configure PVC */
 #define X25_GET_ACTIVE_CHANNELS	0x43	/* get a list of active circuits */
 #define X25_READ_CHANNEL_CONFIG	0x44	/* read virt. circuit configuration */
 #define X25_FLUSH_DATA_BUFFERS	0x45	/* flush X.25-level data buffers */
 #define X25_READ_HISTORY_TABLE	0x46	/* read asynchronous event log */
 #define X25_HISTORY_TABLE_CTL	0x47	/* control asynchronous event log */
-#define	X25_GET_TX_D_BIT_STATUS	0x48	/* is packet with D-bit acknowleged */
+#define	X25_GET_TX_D_BIT_STATUS	0x48	/* is packet with D-bit acknowledged */
 #define	X25_READ_STATISTICS	0x49	/* read X.25-level statistics */
 #define	X25_FLUSH_STATISTICS	0x4A	/* flush X.25-level statistics */
 #define	X25_READ_CONFIGURATION	0x50	/* read HDLC & X.25 configuration */
@@ -139,7 +139,7 @@
 #define X25RES_LINK_CLOSED	0x03
 #define X25RES_INVAL_LENGTH	0x04
 #define X25RES_INVAL_CMD	0x05
-#define X25RES_UNNUMBERED_FRAME	0x06	/* unnunbered frame received */
+#define X25RES_UNNUMBERED_FRAME	0x06	/* unnumbered frame received */
 #define X25RES_FRM_REJECT_MODE	0x07	/* link is in Frame Reject mode */
 #define X25RES_MODEM_FAILURE	0x08	/* DCD and/or CTS dropped */
 #define X25RES_N2_RETRY_LIMIT	0x09	/* N2 retry limit has been exceeded */
@@ -153,10 +153,10 @@
 #define X25RES_INVAL_FORMAT	0x37	/* invalid packet format */
 #define X25RES_D_BIT_NOT_SUPPRT	0x38	/* D-bit pragmatics not supported */
 #define X25RES_FACIL_NOT_SUPPRT	0x39	/* Call facility not supported */
-#define X25RES_INVAL_CALL_ARG	0x3A	/* errorneous call arguments */
-#define X25RES_INVAL_CALL_DATA	0x3B	/* errorneous call user data */
+#define X25RES_INVAL_CALL_ARG	0x3A	/* erroneous call arguments */
+#define X25RES_INVAL_CALL_DATA	0x3B	/* erroneous call user data */
 #define X25RES_ASYNC_PACKET	0x40	/* asynchronous packet received */
-#define X25RES_PROTO_VIOLATION	0x41	/* protocol violation occured */
+#define X25RES_PROTO_VIOLATION	0x41	/* protocol violation occurred */
 #define X25RES_PKT_TIMEOUT	0x42	/* X.25 packet time out */
 #define X25RES_PKT_RETRY_LIMIT	0x43	/* X.25 packet retry limit exceeded */
 /*----- Command-dependent results -----*/
@@ -167,7 +167,7 @@
 #define X25RES_LINK_IS_OPEN	0x01	/* HDLC_LINK_OPEN */
 #define X25RES_LINK_IS_DISC	0x02	/* HDLC_LINK_DISC */
 #define X25RES_LINK_IS_CLOSED	0x03	/* HDLC_LINK_CLOSE */
-#define X25RES_INVAL_PARAM	0x31	/* INCOMMING_CALL_CTL */
+#define X25RES_INVAL_PARAM	0x31	/* INCOMING_CALL_CTL */
 #define X25RES_INVAL_CONFIG	0x35	/* REGISTR_RQST/CONFRM */
 
 /*
@@ -239,7 +239,7 @@
 typedef struct X25Status
 {
 	unsigned short pvc_map	PACKED;	/* 00h: PVC map */
-	unsigned short icc_map	PACKED;	/* 02h: Incomming Chan. map */
+	unsigned short icc_map	PACKED;	/* 02h: Incoming Chan. map */
 	unsigned short twc_map	PACKED;	/* 04h: Two-way Cnan. map */
 	unsigned short ogc_map	PACKED;	/* 06h: Outgoing Chan. map */
 	TX25TimeStamp tstamp	PACKED;	/* 08h: timestamp (BCD) */
@@ -256,7 +256,7 @@
 #define X25_RX_INTR	0x01	/* receive interrupt */
 #define X25_TX_INTR	0x02	/* transmit interrupt */
 #define X25_MODEM_INTR	0x04	/* modem status interrupt (CTS/DCD) */
-#define X25_EVENT_INTR	0x10	/* asyncronous event encountered */
+#define X25_EVENT_INTR	0x10	/* asynchronous event encountered */
 #define X25_CMD_INTR	0x08	/* interface command complete */
 
 /*
@@ -390,8 +390,8 @@
 	unsigned short pktMTU		PACKED;	/* 0Fh:  */
 	unsigned short loPVC		PACKED;	/* 11h:  */
 	unsigned short hiPVC		PACKED;	/* 13h:  */
-	unsigned short loIncommingSVC	PACKED;	/* 15h:  */
-	unsigned short hiIncommingSVC	PACKED;	/* 17h:  */
+	unsigned short loIncomingSVC	PACKED;	/* 15h:  */
+	unsigned short hiIncomingSVC	PACKED;	/* 17h:  */
 	unsigned short loTwoWaySVC	PACKED;	/* 19h:  */
 	unsigned short hiTwoWaySVC	PACKED;	/* 1Bh:  */
 	unsigned short loOutgoingSVC	PACKED;	/* 1Dh:  */
@@ -421,8 +421,8 @@
 {
 	unsigned short loPVC		PACKED;	/* 00h: lowest PVC number */
 	unsigned short hiPVC		PACKED;	/* 02h: highest PVC number */
-	unsigned short loIncommingSVC	PACKED;	/* 04h: lowest incoming SVC */
-	unsigned short hiIncommingSVC	PACKED;	/* 06h: highest incoming SVC */
+	unsigned short loIncomingSVC	PACKED;	/* 04h: lowest incoming SVC */
+	unsigned short hiIncomingSVC	PACKED;	/* 06h: highest incoming SVC */
 	unsigned short loTwoWaySVC	PACKED;	/* 08h: lowest two-way SVC */
 	unsigned short hiTwoWaySVC	PACKED;	/* 0Ah: highest two-way SVC */
 	unsigned short loOutgoingSVC	PACKED;	/* 0Ch: lowest outgoing SVC */
@@ -499,7 +499,7 @@
 /*
  * Defines for the 'type' field.
  */
-#define X25LOG_INCOMMING	0x00
+#define X25LOG_INCOMING		0x00
 #define X25LOG_APPLICATION 	0x01
 #define X25LOG_AUTOMATIC	0x02
 #define X25LOG_ERROR		0x04
@@ -568,7 +568,7 @@
 #define X25_TRCERR_RX_BADCRC	0x20	/* receive CRC error */
 #define X25_TRCERR_RX_OVERRUN	0x30	/* receiver overrun error */
 #define X25_TRCERR_RX_TOO_LONG	0x40	/* excessive frame length error */
-#define X25_TRCERR_TX_ABORT	0x70	/* aborted frame transmittion error */
+#define X25_TRCERR_TX_ABORT	0x70	/* aborted frame transmission error */
 #define X25_TRCERR_TX_UNDERRUN	0x80	/* transmit underrun error */
 
 /*****************************************************************************
@@ -582,7 +582,7 @@
 	unsigned char data[0]	PACKED;
 } THDLCFrame;
 
-typedef struct X25Pkt			/*----- X.25 Paket Format ----------*/
+typedef struct X25Pkt			/*----- X.25 Packet Format ----------*/
 {
 	unsigned char lcn_hi	PACKED;	/* 4 MSB of Logical Channel Number */
 	unsigned char lcn_lo	PACKED;	/* 8 LSB of Logical Channel Number */
diff -u --recursive --new-file v2.1.106/linux/include/linux/selection.h linux/include/linux/selection.h
--- v2.1.106/linux/include/linux/selection.h	Fri Feb  6 15:33:21 1998
+++ linux/include/linux/selection.h	Wed Jun 24 14:44:02 1998
@@ -15,28 +15,13 @@
 extern int mouse_reporting(void);
 extern void mouse_report(struct tty_struct * tty, int butt, int mrx, int mry);
 
-#ifdef CONFIG_FB_CONSOLE
-extern unsigned long get_video_num_columns(unsigned int console);
-extern unsigned long get_video_num_lines(unsigned int console);
-extern unsigned long get_video_size_row(unsigned int console);
-#else
-#define get_video_num_columns(dummy) video_num_columns
-#define get_video_num_lines(dummy) video_num_lines
-#define get_video_size_row(dummy) video_size_row
-#endif
-
-extern unsigned long video_num_columns;
-extern unsigned long video_num_lines;
-extern unsigned long video_size_row;
-extern unsigned char video_type;
-extern unsigned long video_mem_base;
-extern unsigned long video_mem_term;
-extern unsigned long video_screen_size;
-extern unsigned short video_port_reg;
-extern unsigned short video_port_val;
+#define video_num_columns	(vc_cons[currcons].d->vc_cols)
+#define video_num_lines		(vc_cons[currcons].d->vc_rows)
+#define video_size_row		(vc_cons[currcons].d->vc_size_row)
+#define video_screen_size	(vc_cons[currcons].d->vc_screenbuf_size)
+#define can_do_color		(vc_cons[currcons].d->vc_can_do_color)
 
 extern int console_blanked;
-extern int can_do_color;
 
 extern unsigned long video_font_height;
 extern unsigned long video_scan_lines;
@@ -66,6 +51,8 @@
 	(((a) & 0x7000) >> 4) | (((a) & 0x0700) << 4))
 /* this latter line used to have masks 0xf000 and 0x0f00, but selection
    requires a self-inverse operation; moreover, the old version looks wrong */
+#define reverse_video_short_mono(a)	((a) ^ 0x800)
+#define complement_video_short(a)	((a) ^ (can_do_color ? 0x7700 : 0x800))
 
 extern void getconsxy(int currcons, char *p);
 extern void putconsxy(int currcons, char *p);
@@ -73,35 +60,12 @@
 
 /* how to access screen memory */
 
-#if defined(CONFIG_TGA_CONSOLE)
+#include <linux/config.h>
 
-extern int tga_blitc(unsigned int, unsigned long);
-extern unsigned long video_mem_term;
-
-/*
- * TGA console screen memory access
- * 
- * TGA is *not* a character/attribute cell device; font bitmaps must be rendered
- * to the screen pixels.
- *
- * We must test for an Alpha kernel virtual address that falls within
- *  the "shadow screen" memory. This condition indicates we really want 
- *  to write to the screen, so, we do... :-)
- *
- * NOTE also: there's only *TWO* operations: to put/get a character/attribute.
- *  All the others needed by VGA support go away, as Not Applicable for TGA.
- */
-static inline void scr_writew(unsigned short val, unsigned short * addr)
+static inline void scr_writew(unsigned short val, unsigned short *addr)
 {
-        /*
-         * always deposit the char/attr, then see if it was to "screen" mem.
-	 * if so, then render the char/attr onto the real screen.
-         */
-        *addr = val;
-        if ((unsigned long)addr < video_mem_term &&
-	    (unsigned long)addr >= video_mem_base) {
-                tga_blitc(val, (unsigned long) addr);
-        }
+	/* simply store the value in the "shadow screen" memory */
+	*addr = val;
 }
 
 static inline unsigned short scr_readw(unsigned short * addr)
@@ -109,90 +73,6 @@
 	return *addr;
 }
 
-#elif defined(CONFIG_SUN_CONSOLE)
-#include <linux/vt_kern.h>
-#include <linux/kd.h>
-extern int sun_blitc(unsigned int, unsigned long);
-extern void memsetw(void * s, unsigned short c, unsigned int count);
-extern void memcpyw(unsigned short *to, unsigned short *from, unsigned int count);
-extern unsigned long video_mem_term;
-
-/* Basically the same as the TGA stuff. */
-static inline void scr_writew(unsigned short val, unsigned short * addr)
-{
-        /*
-         * always deposit the char/attr, then see if it was to "screen" mem.
-	 * if so, then render the char/attr onto the real screen.
-         */
-	if (*addr != val) {
-        	*addr = val;
-		if ((unsigned long)addr < video_mem_term &&
-		    (unsigned long)addr >= video_mem_base &&
-		    vt_cons [fg_console]->vc_mode == KD_TEXT)
-			sun_blitc(val, (unsigned long) addr);
-	}
-}
-
-static inline unsigned short scr_readw(unsigned short * addr)
-{
-	return *addr;
-}
-
-#else /* CONFIG_TGA_CONSOLE  || CONFIG_SUN_CONSOLE */
-
-/*
- * normal VGA console access
- *
- */ 
-
-#include <asm/io.h> 
-
-/*
- * NOTE: "(long) addr < 0" tests for an Alpha kernel virtual address; this
- *  indicates a VC's backing store; otherwise, it's a bus memory address, for
- *  the VGA's screen memory, so we do the Alpha "swizzle"... :-)
- */
-static inline void scr_writeb(unsigned char val, unsigned char * addr)
-{
-	if ((long) addr < 0)
-		*addr = val;
-	else
-		writeb(val, (unsigned long) addr);
-}
-
-static inline unsigned char scr_readb(unsigned char * addr)
-{
-	if ((long) addr < 0)
-		return *addr;
-	return readb((unsigned long) addr);
-}
-
-static inline void scr_writew(unsigned short val, unsigned short * addr)
-{
-#ifdef __powerpc__
-	st_le16(addr, val);
-#else
-	if ((long) addr < 0)
-		*addr = val;
-	else
-		writew(val, (unsigned long) addr);
-#endif /* !__powerpc__ */
-}
-
-static inline unsigned short scr_readw(unsigned short * addr)
-{
-#ifdef __powerpc__
-	return ld_le16(addr);
-#else
-	if ((long) addr < 0)
-		return *addr;
-	return readw((unsigned long) addr);
-#endif /* !__powerpc__ */	
-}
-
-#endif /* CONFIG_TGA_CONSOLE */
-
-#ifndef CONFIG_SUN_CONSOLE
 static inline void memsetw(void * s, unsigned short c, unsigned int count)
 {
 	unsigned short * addr = (unsigned short *) s;
@@ -213,4 +93,3 @@
 		scr_writew(scr_readw(from++), to++);
 	}
 }
-#endif /* CONFIG_SUN_CONSOLE */
diff -u --recursive --new-file v2.1.106/linux/include/linux/socket.h linux/include/linux/socket.h
--- v2.1.106/linux/include/linux/socket.h	Sun Jun  7 11:16:39 1998
+++ linux/include/linux/socket.h	Wed Jun 24 14:30:11 1998
@@ -141,7 +141,7 @@
 #define AF_INET		2	/* Internet IP Protocol 	*/
 #define AF_AX25		3	/* Amateur Radio AX.25 		*/
 #define AF_IPX		4	/* Novell IPX 			*/
-#define AF_APPLETALK	5	/* Appletalk DDP 		*/
+#define AF_APPLETALK	5	/* AppleTalk DDP 		*/
 #define AF_NETROM	6	/* Amateur Radio NET/ROM 	*/
 #define AF_BRIDGE	7	/* Multiprotocol bridge 	*/
 #define AF_ATMPVC	8	/* ATM PVCs			*/
diff -u --recursive --new-file v2.1.106/linux/include/linux/tty.h linux/include/linux/tty.h
--- v2.1.106/linux/include/linux/tty.h	Tue Mar 17 22:18:15 1998
+++ linux/include/linux/tty.h	Wed Jun 24 15:51:17 1998
@@ -40,18 +40,36 @@
  */
 
 struct screen_info {
-	unsigned char  orig_x;
-	unsigned char  orig_y;
-	unsigned char  unused1[2];
-	unsigned short orig_video_page;
-	unsigned char  orig_video_mode;
-	unsigned char  orig_video_cols;
-	unsigned short unused2;
-	unsigned short orig_video_ega_bx;
-	unsigned short unused3;
-	unsigned char  orig_video_lines;
-	unsigned char  orig_video_isVGA;
-	unsigned short orig_video_points;
+	unsigned char  orig_x;			/* 0x00 */
+	unsigned char  orig_y;			/* 0x01 */
+	unsigned short dontuse1;		/* 0x02 -- EXT_MEM_K sits here */
+	unsigned short orig_video_page;		/* 0x04 */
+	unsigned char  orig_video_mode;		/* 0x06 */
+	unsigned char  orig_video_cols;		/* 0x07 */
+	unsigned short unused2;			/* 0x08 */
+	unsigned short orig_video_ega_bx;	/* 0x0a */
+	unsigned short unused3;			/* 0x0c */
+	unsigned char  orig_video_lines;	/* 0x0e */
+	unsigned char  orig_video_isVGA;	/* 0x0f */
+	unsigned short orig_video_points;	/* 0x10 */
+
+	/* VESA graphic mode -- linear frame buffer */
+	unsigned short lfb_width;		/* 0x12 */
+	unsigned short lfb_height;		/* 0x14 */
+	unsigned short lfb_depth;		/* 0x16 */
+	unsigned long  lfb_base;		/* 0x18 */
+	unsigned long  lfb_size;		/* 0x1c */
+	unsigned short dontuse2, dontuse3;	/* 0x20 -- CL_MAGIC and CL_OFFSET here */
+	unsigned short lfb_linelength;		/* 0x24 */
+	unsigned char  red_size;		/* 0x26 */
+	unsigned char  red_pos;			/* 0x27 */
+	unsigned char  green_size;		/* 0x28 */
+	unsigned char  green_pos;		/* 0x29 */
+	unsigned char  blue_size;		/* 0x2a */
+	unsigned char  blue_pos;		/* 0x2b */
+	unsigned char  rsvd_size;		/* 0x2c */
+	unsigned char  rsvd_pos;		/* 0x2d */
+						/* 0x2e -- 0x3f reserved for future expansion */
 };
 
 extern struct screen_info screen_info;
@@ -70,6 +88,7 @@
 #define VIDEO_TYPE_EGAM		0x20	/* EGA/VGA in Monochrome Mode	*/
 #define VIDEO_TYPE_EGAC		0x21	/* EGA in Color Mode		*/
 #define VIDEO_TYPE_VGAC		0x22	/* VGA+ in Color Mode		*/
+#define VIDEO_TYPE_VLFB		0x23	/* VESA VGA in graphic mode    	*/
 
 #define VIDEO_TYPE_TGAC		0x40	/* DEC TGA */
 
diff -u --recursive --new-file v2.1.106/linux/include/linux/vt_kern.h linux/include/linux/vt_kern.h
--- v2.1.106/linux/include/linux/vt_kern.h	Mon Jun 16 16:36:00 1997
+++ linux/include/linux/vt_kern.h	Wed Jun 24 14:44:02 1998
@@ -34,6 +34,8 @@
 int vc_allocate(unsigned int console);
 int vc_cons_allocated(unsigned int console);
 int vc_resize(unsigned long lines, unsigned long cols);
+void vc_resize_con(unsigned long lines, unsigned long cols,
+		   unsigned int currcons);
 void vc_disallocate(unsigned int console);
 
 #endif /* _VT_KERN_H */
diff -u --recursive --new-file v2.1.106/linux/init/main.c linux/init/main.c
--- v2.1.106/linux/init/main.c	Tue Jun 23 10:01:30 1998
+++ linux/init/main.c	Wed Jun 24 14:44:02 1998
@@ -530,7 +530,7 @@
 	{ "noinitrd", no_initrd },
 #endif
 #endif
-#if defined (CONFIG_AMIGA) || defined (CONFIG_ATARI)
+#ifdef CONFIG_FB
 	{ "video=", video_setup },
 #endif
 	{ "panic=", panic_setup },
diff -u --recursive --new-file v2.1.106/linux/kernel/acct.c linux/kernel/acct.c
--- v2.1.106/linux/kernel/acct.c	Thu May  7 22:51:55 1998
+++ linux/kernel/acct.c	Wed Jun 24 14:30:11 1998
@@ -257,7 +257,7 @@
 
 	/*
 	 * First check to see if there is enough free_space to continue the process
-	 * accounting system. Check_free_space toggle's the acct_active flag so we
+	 * accounting system. Check_free_space toggles the acct_active flag so we
 	 * need to check that after check_free_space.
 	 */
 	check_free_space();
diff -u --recursive --new-file v2.1.106/linux/kernel/fork.c linux/kernel/fork.c
--- v2.1.106/linux/kernel/fork.c	Tue Jun 23 10:01:30 1998
+++ linux/kernel/fork.c	Tue Jun 23 09:57:00 1998
@@ -453,6 +453,17 @@
 	return 0;
 }
 
+static inline void copy_flags(unsigned long clone_flags, struct task_struct *p)
+{
+	unsigned long new_flags = p->flags;
+
+	new_flags &= ~PF_SUPERPRIV;
+	new_flags |= PF_FORKNOEXEC;
+	if (!(clone_flags & CLONE_PTRACE))
+		new_flags &= ~(PF_PTRACED|PF_TRACESYS);
+	p->flags = new_flags;
+}
+
 /*
  *  Ok, this is the main fork-routine. It copies the system process
  * information (task[nr]) and sets up the necessary registers. It
@@ -485,22 +496,26 @@
 	p->did_exec = 0;
 	p->swappable = 0;
 	p->state = TASK_UNINTERRUPTIBLE;
-	p->flags &= ~(PF_PTRACED|PF_TRACESYS|PF_SUPERPRIV);
-	p->sigpending = 0;
-	p->flags |= PF_FORKNOEXEC;
+
+	copy_flags(clone_flags, p);
 	p->pid = get_pid(clone_flags);
+
 	p->next_run = NULL;
 	p->prev_run = NULL;
 	p->p_pptr = p->p_opptr = current;
 	p->p_cptr = NULL;
 	init_waitqueue(&p->wait_chldexit);
+
+	p->sigpending = 0;
 	sigemptyset(&p->signal);
 	p->sigqueue = NULL;
 	p->sigqueue_tail = &p->sigqueue;
+
 	p->it_real_value = p->it_virt_value = p->it_prof_value = 0;
 	p->it_real_incr = p->it_virt_incr = p->it_prof_incr = 0;
 	init_timer(&p->real_timer);
 	p->real_timer.data = (unsigned long) p;
+
 	p->leader = 0;		/* session leadership doesn't inherit */
 	p->tty_old_pgrp = 0;
 	p->times.tms_utime = p->times.tms_stime = 0;
diff -u --recursive --new-file v2.1.106/linux/kernel/kmod.c linux/kernel/kmod.c
--- v2.1.106/linux/kernel/kmod.c	Tue Jun 23 10:01:30 1998
+++ linux/kernel/kmod.c	Wed Jun 24 16:00:16 1998
@@ -33,7 +33,8 @@
 #define task_init task[smp_num_cpus]
 
 static inline void
-use_init_file_context(void) {
+use_init_file_context(void)
+{
 	lock_kernel();
 
 	/* don't use the user's root, use init's root instead */
@@ -63,7 +64,7 @@
 	spin_unlock_irq(&current->sigmask_lock);
 
 	for (i = 0; i < current->files->max_fds; i++ ) {
-	    if (current->files->fd[i]) close(i);
+		if (current->files->fd[i]) close(i);
 	}
 
 	/* Give kmod all privileges.. */
diff -u --recursive --new-file v2.1.106/linux/kernel/resource.c linux/kernel/resource.c
--- v2.1.106/linux/kernel/resource.c	Tue May 13 22:41:20 1997
+++ linux/kernel/resource.c	Wed Jun 24 14:30:11 1998
@@ -143,7 +143,7 @@
 		if (iotable[i].num == 0)
 			break;
 	if (i == IOTABLE_SIZE) {
-		/* Driver prints a warning typicaly. */
+		/* Driver prints a warning typically. */
 		return 0;
 	}
 
diff -u --recursive --new-file v2.1.106/linux/kernel/sched.c linux/kernel/sched.c
--- v2.1.106/linux/kernel/sched.c	Tue Jun 23 10:01:30 1998
+++ linux/kernel/sched.c	Wed Jun 24 14:30:11 1998
@@ -169,7 +169,7 @@
  * The run-queue lock locks the parts that actually access
  * and change the run-queues, and have to be interrupt-safe.
  */
-spinlock_t scheduler_lock = SPIN_LOCK_UNLOCKED;	/* should be aquired first */
+spinlock_t scheduler_lock = SPIN_LOCK_UNLOCKED;	/* should be acquired first */
 spinlock_t runqueue_lock = SPIN_LOCK_UNLOCKED;  /* second */
 rwlock_t tasklist_lock = RW_LOCK_UNLOCKED;	/* third */
 
@@ -1249,9 +1249,9 @@
 		newprio = 40;
 	/*
 	 * do a "normalization" of the priority (traditionally
-	 * unix nice values are -20..20, linux doesn't really
+	 * Unix nice values are -20 to 20; Linux doesn't really
 	 * use that kind of thing, but uses the length of the
-	 * timeslice instead (default 150 msec). The rounding is
+	 * timeslice instead (default 150 ms). The rounding is
 	 * why we want to avoid negative values.
 	 */
 	newprio = (newprio * DEF_PRIORITY + 10) / 20;
diff -u --recursive --new-file v2.1.106/linux/kernel/signal.c linux/kernel/signal.c
--- v2.1.106/linux/kernel/signal.c	Tue Jun 23 10:01:30 1998
+++ linux/kernel/signal.c	Wed Jun 24 14:30:11 1998
@@ -255,7 +255,7 @@
 		t->exit_code = 0;
 		sigdelsetmask(&t->signal, (sigmask(SIGSTOP)|sigmask(SIGTSTP)|
 					   sigmask(SIGTTOU)|sigmask(SIGTTIN)));
-		/* Inflict this corner case with recalculaions, not mainline */
+		/* Inflict this corner case with recalculations, not mainline */
 		recalc_sigpending(t);
 		break;
 
@@ -263,7 +263,7 @@
 	case SIGTTIN: case SIGTTOU:
 		/* If we're stopping again, cancel SIGCONT */
 		sigdelset(&t->signal, SIGCONT);
-		/* Inflict this corner case with recalculaions, not mainline */
+		/* Inflict this corner case with recalculations, not mainline */
 		recalc_sigpending(t);
 		break;
 	}
diff -u --recursive --new-file v2.1.106/linux/kernel/sys.c linux/kernel/sys.c
--- v2.1.106/linux/kernel/sys.c	Sun Jun  7 11:16:40 1998
+++ linux/kernel/sys.c	Wed Jun 24 14:30:11 1998
@@ -259,9 +259,9 @@
  *
  * The general idea is that a program which uses just setregid() will be
  * 100% compatible with BSD.  A program which uses just setgid() will be
- * 100% compatible with POSIX w/ Saved ID's. 
+ * 100% compatible with POSIX with saved IDs. 
  *
- * SMP: There are not races, the gid's are checked only by filesystem
+ * SMP: There are not races, the GIDs are checked only by filesystem
  *      operations (as far as semantic preservation is concerned).
  */
 asmlinkage int sys_setregid(gid_t rgid, gid_t egid)
@@ -366,7 +366,7 @@
  *
  * The general idea is that a program which uses just setreuid() will be
  * 100% compatible with BSD.  A program which uses just setuid() will be
- * 100% compatible with POSIX w/ Saved ID's. 
+ * 100% compatible with POSIX with saved IDs. 
  */
 asmlinkage int sys_setreuid(uid_t ruid, uid_t euid)
 {
@@ -421,7 +421,7 @@
 
 		
 /*
- * setuid() is implemented like SysV w/ SAVED_IDS 
+ * setuid() is implemented like SysV with SAVED_IDS 
  * 
  * Note that SAVED_ID's is deficient in that a setuid root program
  * like sendmail, for example, cannot set its uid to be a normal 
@@ -465,7 +465,7 @@
 
 
 /*
- * This function implementes a generic ability to update ruid, euid,
+ * This function implements a generic ability to update ruid, euid,
  * and suid.  This allows you to implement the 4.4 compatible seteuid().
  */
 asmlinkage int sys_setresuid(uid_t ruid, uid_t euid, uid_t suid)
@@ -763,7 +763,7 @@
 }
 
 /*
- * Supplementary group ID's
+ * Supplementary group IDs
  */
 asmlinkage int sys_getgroups(int gidsetsize, gid_t *grouplist)
 {
diff -u --recursive --new-file v2.1.106/linux/lib/inflate.c linux/lib/inflate.c
--- v2.1.106/linux/lib/inflate.c	Thu Apr 11 23:49:48 1996
+++ linux/lib/inflate.c	Wed Jun 24 14:30:11 1998
@@ -11,7 +11,7 @@
 /*
    Inflate deflated (PKZIP's method 8 compressed) data.  The compression
    method searches for as much of the current string of bytes (up to a
-   length of 258) in the previous 32K bytes.  If it doesn't find any
+   length of 258) in the previous 32 K bytes.  If it doesn't find any
    matches (of at least length 3), it codes the next byte.  Otherwise, it
    codes the length of the matched string and its distance backwards from
    the current position.  There is a single Huffman code that codes both
@@ -28,7 +28,7 @@
    There are (currently) three kinds of inflate blocks: stored, fixed, and
    dynamic.  The compressor deals with some chunk of data at a time, and
    decides which method to use on a chunk-by-chunk basis.  A chunk might
-   typically be 32K or 64K.  If the chunk is uncompressible, then the
+   typically be 32 K or 64 K.  If the chunk is incompressible, then the
    "stored" method is used.  In this case, the bytes are simply stored as
    is, eight bits per byte, with none of the above coding.  The bytes are
    preceded by a count, since there is no longer an EOB code.
@@ -143,11 +143,11 @@
 STATIC int inflate OF((void));
 
 
-/* The inflate algorithm uses a sliding 32K byte window on the uncompressed
+/* The inflate algorithm uses a sliding 32 K byte window on the uncompressed
    stream to find repeated byte strings.  This is implemented here as a
    circular buffer.  The index is updated simply by incrementing and then
-   and'ing with 0x7fff (32K-1). */
-/* It is left to other modules to supply the 32K area.  It is assumed
+   ANDing with 0x7fff (32K-1). */
+/* It is left to other modules to supply the 32 K area.  It is assumed
    to be usable as if it were declared "uch slide[32768];" or as just
    "uch *slide;" and then malloc'ed in the latter case.  The definition
    must be in unzip.h, included above. */
@@ -1044,7 +1044,7 @@
 }
 
 /* gzip flag byte */
-#define ASCII_FLAG   0x01 /* bit 0 set: file probably ascii text */
+#define ASCII_FLAG   0x01 /* bit 0 set: file probably ASCII text */
 #define CONTINUATION 0x02 /* bit 1 set: continuation of multi-part gzip file */
 #define EXTRA_FIELD  0x04 /* bit 2 set: extra field present */
 #define ORIG_NAME    0x08 /* bit 3 set: original file name present */
diff -u --recursive --new-file v2.1.106/linux/mm/filemap.c linux/mm/filemap.c
--- v2.1.106/linux/mm/filemap.c	Tue Jun 23 10:01:30 1998
+++ linux/mm/filemap.c	Wed Jun 24 14:30:11 1998
@@ -216,20 +216,19 @@
  * free it from the page hash-queues etc, as we don't want to keep it
  * in-core unnecessarily.
  */
-unsigned long page_unuse(unsigned long page)
+unsigned long page_unuse(struct page * page)
 {
-	struct page * p = mem_map + MAP_NR(page);
-	int count = atomic_read(&p->count);
+	int count = atomic_read(&page->count);
 
 	if (count != 2)
 		return count;
-	if (!p->inode)
+	if (!page->inode)
 		return count;
-	if (PageSwapCache(p))
+	if (PageSwapCache(page))
 		panic ("Doing a normal page_unuse of a swap cache page");
-	remove_page_from_hash_queue(p);
-	remove_page_from_inode_queue(p);
-	free_page(page);
+	remove_page_from_hash_queue(page);
+	remove_page_from_inode_queue(page);
+	__free_page(page);
 	return 1;
 }
 
@@ -902,7 +901,7 @@
 		goto success;
 
 	/*
-	 * Uhhuh.. Things didn't work out. Return zero to tell the
+	 * Things didn't work out. Return zero to tell the
 	 * mm layer so, possibly freeing the page cache page first.
 	 */
 failure:
@@ -1413,7 +1412,7 @@
 		set_bit(PG_uptodate, &page->flags);
 
 do_update_page:
-		/* Alright, the page is there.  Now update it. */
+		/* All right, the page is there.  Now update it. */
 		status = inode->i_op->updatepage(file, page, buf,
 							offset, bytes, sync);
 done_with_page:
diff -u --recursive --new-file v2.1.106/linux/mm/page_alloc.c linux/mm/page_alloc.c
--- v2.1.106/linux/mm/page_alloc.c	Fri May  8 23:14:57 1998
+++ linux/mm/page_alloc.c	Wed Jun 24 14:30:11 1998
@@ -101,7 +101,7 @@
 spinlock_t page_alloc_lock = SPIN_LOCK_UNLOCKED;
 
 /*
- * This routine is used by the kernel swap deamon to determine
+ * This routine is used by the kernel swap daemon to determine
  * whether we have "enough" free pages. It is fairly arbitrary,
  * but this had better return false if any reasonable "get_free_page()"
  * allocation could currently fail..
@@ -182,9 +182,11 @@
 		if (PageSwapCache(page))
 			panic ("Freeing swap cache page");
 		free_pages_ok(page->map_nr, 0);
+		return;
 	}
 	if (PageSwapCache(page) && atomic_read(&page->count) == 1)
-		panic ("Releasing swap cache page");
+		printk(KERN_WARNING "VM: Releasing swap cache page at %p",
+			__builtin_return_address(0));
 }
 
 void free_pages(unsigned long addr, unsigned long order)
@@ -202,8 +204,9 @@
 			return;
 		}
 		if (PageSwapCache(map) && atomic_read(&map->count) == 1)
-			panic ("Releasing swap cache pages at %p",
-			       __builtin_return_address(0));
+			printk(KERN_WARNING 
+				"VM: Releasing swap cache pages at %p",
+				__builtin_return_address(0));
 	}
 }
 
diff -u --recursive --new-file v2.1.106/linux/mm/page_io.c linux/mm/page_io.c
--- v2.1.106/linux/mm/page_io.c	Wed Apr  8 19:36:29 1998
+++ linux/mm/page_io.c	Wed Jun 24 14:30:11 1998
@@ -142,7 +142,7 @@
 		if (swapf->i_op->bmap == NULL
 			&& swapf->i_op->smap != NULL){
 			/*
-				With MsDOS, we use msdos_smap which return
+				With MS-DOS, we use msdos_smap which return
 				a sector number (not a cluster or block number).
 				It is a patch to enable the UMSDOS project.
 				Other people are working on better solution.
diff -u --recursive --new-file v2.1.106/linux/mm/slab.c linux/mm/slab.c
--- v2.1.106/linux/mm/slab.c	Tue Mar 17 22:18:15 1998
+++ linux/mm/slab.c	Wed Jun 24 14:30:11 1998
@@ -70,7 +70,7 @@
  *
  *	Calls to printk() are not 100% safe (the function is not threaded).  However,
  *	printk() is only used under an error condition, and the risk is v. small (not
- *	sure if the console write functions 'enjoy' executing multiple contextes in
+ *	sure if the console write functions 'enjoy' executing multiple contexts in
  *	parallel.  I guess they don't...).
  *	Note, for most calls to printk() any held cache-lock is dropped.  This is not
  *	always done for text size reasons - having *_unlock() everywhere is bloat.
@@ -92,11 +92,11 @@
  * index to hold the bufctls.  This allows the bufctl structure to
  * be small (one word), but limits the number of objects a slab (not
  * a cache) can contain when off-slab bufctls are used.  The limit is the
- * size of the largest general-cache that does not use off-slab bufctls,
+ * size of the largest general cache that does not use off-slab bufctls,
  * divided by the size of a bufctl.  For 32bit archs, is this 256/4 = 64.
  * This is not serious, as it is only for large objects, when it is unwise
  * to have too many per slab.
- * Note: This limit can be raised by introducing a general-cache whose size
+ * Note: This limit can be raised by introducing a general cache whose size
  * is less than 512 (PAGE_SIZE<<3), but greater than 256.
  */
 
@@ -124,12 +124,12 @@
  *
  * SLAB_DEBUG_SUPPORT	- 1 for kmem_cache_create() to honour; SLAB_DEBUG_FREE,
  *			  SLAB_DEBUG_INITIAL, SLAB_RED_ZONE & SLAB_POISON.
- *			  0 for faster, smaller, code (espically in the critical paths).
+ *			  0 for faster, smaller, code (especially in the critical paths).
  *
  * SLAB_STATS		- 1 to collect stats for /proc/slabinfo.
- *			  0 for faster, smaller, code (espically in the critical paths).
+ *			  0 for faster, smaller, code (especially in the critical paths).
  *
- * SLAB_SELFTEST	- 1 to perform a few tests, mainly for developement.
+ * SLAB_SELFTEST	- 1 to perform a few tests, mainly for development.
  */
 #define		SLAB_MGMT_CHECKS	1
 #define		SLAB_DEBUG_SUPPORT	0
@@ -180,7 +180,7 @@
 				 s_dma:1;
 } kmem_slab_t;
 
-/* When the slab mgmt is on-slab, this gives the size to use. */
+/* When the slab management is on-slab, this gives the size to use. */
 #define	slab_align_size		(L1_CACHE_ALIGN(sizeof(kmem_slab_t)))
 
 /* Test for end of slab chain. */
@@ -188,7 +188,7 @@
 
 /* s_magic */
 #define	SLAB_MAGIC_ALLOC	0xA5C32F2BUL	/* slab is alive */
-#define	SLAB_MAGIC_DESTROYED	0xB2F23C5AUL	/* slab has been destoryed */
+#define	SLAB_MAGIC_DESTROYED	0xB2F23C5AUL	/* slab has been destroyed */
 
 /* Bufctl's are used for linking objs within a slab, identifying what slab an obj
  * is in, and the address of the associated obj (for sanity checking with off-slab
@@ -260,9 +260,9 @@
 };
 
 /* internal c_flags */
-#define	SLAB_CFLGS_OFF_SLAB	0x010000UL	/* slab mgmt in own cache */
+#define	SLAB_CFLGS_OFF_SLAB	0x010000UL	/* slab management in own cache */
 #define	SLAB_CFLGS_BUFCTL	0x020000UL	/* bufctls in own cache */
-#define	SLAB_CFLGS_GENERAL	0x080000UL	/* a general-cache */
+#define	SLAB_CFLGS_GENERAL	0x080000UL	/* a general cache */
 
 /* c_dflags (dynamic flags).  Need to hold the spinlock to access this member */
 #define	SLAB_CFLGS_GROWN	0x000002UL	/* don't reap a recently grown */
@@ -307,7 +307,7 @@
 /* maximum num of pages for a slab (prevents large requests to the VM layer) */
 #define	SLAB_MAX_GFP_ORDER	5	/* 32 pages */
 
-/* the 'prefered' minimum num of objs per slab - maybe less for large objs */
+/* the 'preferred' minimum num of objs per slab - maybe less for large objs */
 #define	SLAB_MIN_OBJS_PER_SLAB	4
 
 /* If the num of objs per slab is <= SLAB_MIN_OBJS_PER_SLAB,
@@ -325,7 +325,7 @@
 #define	SLAB_SET_PAGE_SLAB(pg, x)	((pg)->prev = (struct page *)(x))
 #define	SLAB_GET_PAGE_SLAB(pg)		((kmem_slab_t *)(pg)->prev)
 
-/* Size description struct for general-caches. */
+/* Size description struct for general caches. */
 typedef struct cache_sizes {
 	size_t		 cs_size;
 	kmem_cache_t	*cs_cachep;
@@ -350,7 +350,7 @@
 	{0,		NULL}
 };
 
-/* Names for the general-caches.  Not placed into the sizes struct for
+/* Names for the general caches.  Not placed into the sizes struct for
  * a good reason; the string ptr is not needed while searching in kmalloc(),
  * and would 'get-in-the-way' in the h/w cache.
  */
@@ -396,7 +396,7 @@
 /* Place maintainer for reaping. */
 static	kmem_cache_t	*clock_searchp = &cache_cache;
 
-/* Internal slab mgmt cache, for when slab mgmt is off-slab. */
+/* Internal slab management cache, for when slab management is off-slab. */
 static kmem_cache_t	*cache_slabp = NULL;
 
 /* Max number of objs-per-slab for caches which use bufctl's.
@@ -463,9 +463,9 @@
 		char **names = cache_sizes_name;
 		cache_sizes_t *sizes = cache_sizes;
 		do {
-			/* For performance, all the general-caches are L1 aligned.
+			/* For performance, all the general caches are L1 aligned.
 			 * This should be particularly beneficial on SMP boxes, as it
-			 * elimantes "false sharing".
+			 * eliminates "false sharing".
 			 * Note for systems short on memory removing the alignment will
 			 * allow tighter packing of the smaller caches. */
 			if (!(sizes->cs_cachep =
@@ -562,7 +562,7 @@
 }
 #endif	/* SLAB_DEBUG_SUPPORT */
 
-/* Three slab chain funcs - all called with ints disabled and the appropiate
+/* Three slab chain funcs - all called with ints disabled and the appropriate
  * cache-lock held.
  */
 static inline void
@@ -630,7 +630,7 @@
 #if	SLAB_DEBUG_SUPPORT
 			else if (cachep->c_flags & SLAB_POISON) {
 				if (kmem_check_poison_obj(cachep, objp))
-					printk(KERN_ERR "kmem_slab_destory: "
+					printk(KERN_ERR "kmem_slab_destroy: "
 					       "Bad poison - %s\n", cachep->c_name);
 			}
 			if (cachep->c_flags & SLAB_RED_ZONE)
@@ -714,7 +714,7 @@
 	}
 
 	if (offset < 0 || offset > size) {
-		printk("%sOffset weired %d - %s\n", func_nm, (int) offset, name);
+		printk("%sOffset weird %d - %s\n", func_nm, (int) offset, name);
 		offset = 0;
 	}
 
@@ -781,11 +781,11 @@
 	if (flags & SLAB_HWCACHE_ALIGN)
 		align = L1_CACHE_BYTES;
 
-	/* Determine if the slab mgmt and/or bufclts are 'on' or 'off' slab. */
+	/* Determine if the slab management and/or bufclts are 'on' or 'off' slab. */
 	extra = sizeof(kmem_bufctl_t);
 	if (size < (PAGE_SIZE>>3)) {
 		/* Size is small(ish).  Use packing where bufctl size per
-		 * obj is low, and slab mngmnt is on-slab.
+		 * obj is low, and slab management is on-slab.
 		 */
 #if	0
 		if ((flags & SLAB_HIGH_PACK)) {
@@ -802,7 +802,7 @@
 		}
 #endif
 	} else {
-		/* Size is large, assume best to place the slab mngmnt obj
+		/* Size is large, assume best to place the slab management obj
 		 * off-slab (should allow better packing of objs).
 		 */
 		flags |= SLAB_CFLGS_OFF_SLAB;
@@ -811,7 +811,7 @@
 			/* To avoid waste the bufctls are off-slab... */
 			flags |= SLAB_CFLGS_BUFCTL;
 			extra = 0;
-		} /* else slab mngmnt is off-slab, but freelist ptrs are on. */
+		} /* else slab management is off-slab, but freelist pointers are on. */
 	}
 	size += extra;
 
@@ -1018,8 +1018,8 @@
 	printk(KERN_ERR "kmem_shrink: Invalid cache addr %p\n", cachep);
 	return 2;
 found:
-	/* Relase the sempahore before getting the cache-lock.  This could
-	 * mean multiple engines are shrinking the cache, but so what...
+	/* Release the semaphore before getting the cache-lock.  This could
+	 * mean multiple engines are shrinking the cache, but so what.
 	 */
 	up(&cache_chain_sem);
 	spin_lock_irq(&cachep->c_spinlock);
@@ -1041,17 +1041,17 @@
 	return ret;
 }
 
-/* Get the mem for a slab mgmt obj. */
+/* Get the memory for a slab management obj. */
 static inline kmem_slab_t *
 kmem_cache_slabmgmt(kmem_cache_t *cachep, void *objp, int local_flags)
 {
 	kmem_slab_t	*slabp;
 
 	if (SLAB_OFF_SLAB(cachep->c_flags)) {
-		/* Slab mgmt obj is off-slab. */
+		/* Slab management obj is off-slab. */
 		slabp = kmem_cache_alloc(cache_slabp, local_flags);
 	} else {
-		/* Slab mgmnt at end of slab mem, placed so that
+		/* Slab management at end of slab memory, placed so that
 		 * the position is 'coloured'.
 		 */
 		void *end;
@@ -1199,7 +1199,7 @@
 	if (!(objp = kmem_getpages(cachep, flags, &dma)))
 		goto failed;
 
-	/* Get slab mgmt. */
+	/* Get slab management. */
 	if (!(slabp = kmem_cache_slabmgmt(cachep, objp+offset, local_flags)))
 		goto opps1;
 	if (dma)
@@ -1253,7 +1253,7 @@
 	if (local_flags != SLAB_ATOMIC && cachep->c_gfporder) {
 		/* For large order (>0) slabs, we try again.
 		 * Needed because the gfp() functions are not good at giving
-		 * out contigious pages unless pushed (but do not push too hard).
+		 * out contiguous pages unless pushed (but do not push too hard).
 		 */
 		if (cachep->c_failures++ < 4 && cachep->c_freep == kmem_slab_end(cachep))
 			goto re_try;
@@ -1632,19 +1632,19 @@
 		goto bad_ptr;
 
 	/* Assume we own the page structure - hence no locking.
-	 * If someone is misbehaving (eg. someone calling us with a bad
+	 * If someone is misbehaving (for example, calling us with a bad
 	 * address), then access to the page structure can race with the
-	 * kmem_slab_destory() code.  Need to add a spin_lock to each page
+	 * kmem_slab_destroy() code.  Need to add a spin_lock to each page
 	 * structure, which would be useful in threading the gfp() functions....
 	 */
 	page = &mem_map[nr];
 	if (PageSlab(page)) {
 		kmem_cache_t	*cachep;
 
-		/* Here, we (again) assume the obj address is good.
+		/* Here, we again assume the obj address is good.
 		 * If it isn't, and happens to map onto another
-		 * general-cache page which has no active objs, then
-		 * we race....
+		 * general cache page which has no active objs, then
+		 * we race.
 		 */
 		cachep = SLAB_GET_PAGE_CACHE(page);
 		if (cachep && (cachep->c_flags & SLAB_CFLGS_GENERAL)) {
@@ -1698,9 +1698,9 @@
 {
 	cache_sizes_t	*csizep = cache_sizes;
 
-	/* This function could be moved to the header-file, and
+	/* This function could be moved to the header file, and
 	 * made inline so consumers can quickly determine what
-	 * cache-ptr they require.
+	 * cache pointer they require.
 	 */
 	for (; csizep->cs_size; csizep++) {
 		if (size > csizep->cs_size)
@@ -1729,7 +1729,7 @@
 		return;
 	}
 
-	/* We really need a test semphore op so we can avoid sleeping when
+	/* We really need a test semaphore op so we can avoid sleeping when
 	 * !wait is true.
 	 */
 	down(&cache_chain_sem);
@@ -1762,8 +1762,8 @@
 		dma_flag = 0;
 		full_free = 0;
 
-		/* Count num of fully free slabs.  Hopefully there are not many,
-		 * we are holding the cache lock....
+		/* Count the fully free slabs.  There should not be not many,
+		 * since we are holding the cache lock.
 		 */
 		slabp = searchp->c_lastp;
 		while (!slabp->s_inuse && slabp != kmem_slab_end(searchp)) {
@@ -1803,7 +1803,7 @@
 	up(&cache_chain_sem);
 
 	if (!best_cachep) {
-		/* couldn't find anthying to reap */
+		/* couldn't find anything to reap */
 		return;
 	}
 
diff -u --recursive --new-file v2.1.106/linux/mm/swap.c linux/mm/swap.c
--- v2.1.106/linux/mm/swap.c	Thu May  7 22:51:55 1998
+++ linux/mm/swap.c	Wed Jun 24 14:30:11 1998
@@ -6,7 +6,7 @@
 
 /*
  * This file contains the default values for the opereation of the
- * Linux VM subsystem. Finetuning documentation can be found in
+ * Linux VM subsystem. Fine-tuning documentation can be found in
  * linux/Documentation/sysctl/vm.txt.
  * Started 18.12.91
  * Swap aging added 23.2.95, Stephen Tweedie.
diff -u --recursive --new-file v2.1.106/linux/mm/swapfile.c linux/mm/swapfile.c
--- v2.1.106/linux/mm/swapfile.c	Tue Jun 23 10:01:30 1998
+++ linux/mm/swapfile.c	Wed Jun 24 14:30:11 1998
@@ -177,7 +177,7 @@
  * that the page has been used or is no longer needed.
  *
  * Always set the resulting pte to be nowrite (the same as COW pages
- * after one process has exited).  We don't know just how many ptes will
+ * after one process has exited).  We don't know just how many PTEs will
  * share this swap entry, so be cautious and let do_wp_page work out
  * what to do if a write is requested later.
  */
diff -u --recursive --new-file v2.1.106/linux/mm/vmscan.c linux/mm/vmscan.c
--- v2.1.106/linux/mm/vmscan.c	Thu May  7 22:51:55 1998
+++ linux/mm/vmscan.c	Wed Jun 24 14:30:11 1998
@@ -88,7 +88,7 @@
 	 * pages, then delete the swap cache.  We can only do this if
 	 * the swap page's reference count is one: ie. there are no
 	 * other references to it beyond the swap cache (as there must
-	 * still be pte's pointing to it if count > 1).
+	 * still be PTEs pointing to it if count > 1).
 	 * 
 	 * If the page has NOT been touched, and its age reaches zero,
 	 * then we are swapping it out:
@@ -107,7 +107,17 @@
 
 	if (PageSwapCache(page_map)) {
 		if (pte_write(pte)) {
+			struct page *found;
 			printk ("VM: Found a writable swap-cached page!\n");
+			/* Try to diagnose the problem ... */
+			found = find_page(&swapper_inode, page_map->offset);
+			if (found) {
+				printk("page=%p@%08lx, found=%p, count=%d\n",
+					page_map, page_map->offset,
+					found, atomic_read(&found->count));
+				__free_page(found);
+			} else 
+				printk ("Spurious, page not in cache\n");
 			return 0;
 		}
 	}
@@ -144,9 +154,8 @@
 			 * we have the swap cache set up to associate the
 			 * page with that swap entry.
 			 */
-			if (PageSwapCache(page_map)) {
-				entry = page_map->offset;
-			} else {
+        		entry = in_swap_cache(page_map);
+			if (!entry) {
 				entry = get_swap_page();
 				if (!entry)
 					return 0; /* No swap space left */
@@ -219,8 +228,8 @@
 	flush_cache_page(vma, address);
 	pte_clear(page_table);
 	flush_tlb_page(vma, address);
-	entry = page_unuse(page);
-	free_page(page);
+	entry = page_unuse(page_map);
+	__free_page(page_map);
 	return entry;
 }
 
@@ -584,6 +593,7 @@
 	}
 	/* As if we could ever get here - maybe we want to make this killable */
 	remove_wait_queue(&kswapd_wait, &wait);
+	unlock_kernel();
 	return 0;
 }
 
diff -u --recursive --new-file v2.1.106/linux/net/appletalk/aarp.c linux/net/appletalk/aarp.c
--- v2.1.106/linux/net/appletalk/aarp.c	Thu Feb 12 20:56:14 1998
+++ linux/net/appletalk/aarp.c	Wed Jun 24 14:33:10 1998
@@ -1,6 +1,6 @@
 /*
- *	AARP:		An implementation of the Appletalk aarp protocol for
- *			ethernet 'ELAP'.
+ *	AARP:		An implementation of the AppleTalk AARP protocol for
+ *			Ethernet 'ELAP'.
  *
  *		Alan Cox  <Alan.Cox@linux.org>
  *
@@ -20,7 +20,7 @@
  *
  *
  *	References:
- *		Inside Appletalk (2nd Ed).
+ *		Inside AppleTalk (2nd Ed).
  */
 
 #include <linux/config.h>
@@ -430,7 +430,7 @@
 	skb->nh.raw=skb->data;
 	
 	/*
-	 *	Check for localtalk first
+	 *	Check for LocalTalk first
 	 */
 	 
 	 
@@ -645,7 +645,7 @@
 
 /*
  *	This is called by the SNAP driver whenever we see an AARP SNAP
- *	frame. We currently only support ethernet.
+ *	frame. We currently only support Ethernet.
  */
 static int aarp_rcv(struct sk_buff *skb, struct device *dev, struct packet_type *pt)
 {
@@ -658,7 +658,7 @@
 	
 	
 	/*
-	 *	We only do ethernet SNAP AARP
+	 *	We only do Ethernet SNAP AARP
 	 */
 	 
 	if(dev->type!=ARPHRD_ETHER)
diff -u --recursive --new-file v2.1.106/linux/net/appletalk/ddp.c linux/net/appletalk/ddp.c
--- v2.1.106/linux/net/appletalk/ddp.c	Sun Jun  7 11:16:40 1998
+++ linux/net/appletalk/ddp.c	Wed Jun 24 14:33:10 1998
@@ -1,6 +1,6 @@
 /*
- *	DDP:	An implementation of the Appletalk DDP protocol for
- *		ethernet 'ELAP'.
+ *	DDP:	An implementation of the AppleTalk DDP protocol for
+ *		Ethernet 'ELAP'.
  *
  *		Alan Cox  <Alan.Cox@linux.org>
  *
@@ -18,17 +18,17 @@
  *		Alan Cox		:	Added firewall hooks.
  *		Alan Cox		:	Supports new ARPHRD_LOOPBACK
  *		Christer Weinigel	: 	Routing and /proc fixes.
- *		Bradford Johnson	:	Localtalk.
+ *		Bradford Johnson	:	LocalTalk.
  *		Tom Dyas		:	Module support.
  *		Alan Cox		:	Hooks for PPP (based on the
- *						localtalk hook).
+ *						LocalTalk hook).
  *		Alan Cox		:	Posix bits
  *		Alan Cox/Mike Freeman	:	Possible fix to NBP problems
  *		Bradford Johnson	:	IP-over-DDP (experimental)
  *		Jay Schulist		:	Moved IP-over-DDP to its own
  *						driver file. (ipddp.c & ipddp.h)
  *		Jay Schulist		:	Made work as module with 
- *						Appletalk drivers, cleaned it.
+ *						AppleTalk drivers, cleaned it.
  *
  *		This program is free software; you can redistribute it and/or
  *		modify it under the terms of the GNU General Public License
@@ -197,7 +197,7 @@
 	off_t begin=0;
 
 	/*
-	 * Output the appletalk data for the /proc virtual fs.
+	 * Output the AppleTalk data for the /proc filesystem.
 	 */
 
 	len += sprintf(buffer,"Type local_addr  remote_addr tx_queue rx_queue st uid\n");
@@ -241,7 +241,7 @@
 
 /**************************************************************************\
 *                                                                          *
-* Routing tables for the Appletalk socket layer.                           *
+* Routing tables for the AppleTalk socket layer.                           *
 *                                                                          *
 \**************************************************************************/
 
@@ -250,7 +250,7 @@
 static struct atalk_route atrtr_default; /* For probing devices or in a routerless network */
 
 /*
- * Appletalk interface control
+ * AppleTalk interface control
  */
 
 /*
@@ -476,7 +476,7 @@
 
 
 /*
- * Find a route for an appletalk packet. This ought to get cached in
+ * Find a route for an AppleTalk packet. This ought to get cached in
  * the socket (later on...). We know about host routes and the fact
  * that a route must be direct to broadcast.
  */
@@ -504,7 +504,7 @@
 
 
 /*
- * Given an appletalk network find the device to use. This can be
+ * Given an AppleTalk network, find the device to use. This can be
  * a simple lookup.
  */
 struct device *atrtr_get_dev(struct at_addr *sa)
@@ -732,8 +732,8 @@
 			nr=(struct netrange *)&sa->sat_zero[0];
 
 			/*
-			 * Phase 1 is fine on Localtalk but we don't do
-			 * Ethertalk phase 1. Anyone wanting to add it go ahead.
+			 * Phase 1 is fine on LocalTalk but we don't do
+			 * EtherTalk phase 1. Anyone wanting to add it go ahead.
 			 */
 			if(dev->type == ARPHRD_ETHER && nr->nr_phase != 2)
 				return (-EPROTONOSUPPORT);
@@ -947,7 +947,7 @@
 /**************************************************************************\
 *                                                                          *
 * Handling for system calls applied via the various interfaces to an       *
-* Appletalk socket object.                                                 *
+* AppleTalk socket object.                                                 *
 *                                                                          *
 \**************************************************************************/
 
@@ -1201,7 +1201,7 @@
 }
 
 /*
- * Find the name of an appletalk socket. Just copy the right
+ * Find the name of an AppleTalk socket. Just copy the right
  * fields into the sockaddr.
  */
 static int atalk_getname(struct socket *sock, struct sockaddr *uaddr,
@@ -1299,7 +1299,7 @@
 	 */
 	if(ddp->deh_sum && atalk_checksum(ddp, ddp->deh_len) != ddp->deh_sum)
 	{
-		/* Not a valid appletalk frame - dustbin time */
+		/* Not a valid AppleTalk frame - dustbin time */
 		kfree_skb(skb);
 		return (0);
 	}
@@ -1318,7 +1318,7 @@
 		atif = atalk_find_interface(ddp->deh_dnet, ddp->deh_dnode);
 
 	/* 
-	 * Not ours, so we route the packet via the correct Appletalk interface.
+	 * Not ours, so we route the packet via the correct AppleTalk interface.
 	 */
 	if(atif == NULL)
 	{
@@ -1377,7 +1377,7 @@
 		 * Send the buffer onwards
 		 *
 		 * Now we must always be careful. If it's come from 
-		 * localtalk to ethertalk it might not fit
+		 * LocalTalk to EtherTalk it might not fit
 		 *
 		 * Order matters here: If a packet has to be copied
 		 * to make a new headroom (rare hopefully) then it
@@ -1458,7 +1458,7 @@
 }
 
 /*
- * Receive a localtalk frame. We make some demands on the caller here.
+ * Receive a LocalTalk frame. We make some demands on the caller here.
  * Caller must provide enough headroom on the packet to pull the short
  * header and append a long one.
  */
@@ -1765,7 +1765,7 @@
 }
 
 /*
- * Appletalk ioctl calls.
+ * AppleTalk ioctl calls.
  */
 static int atalk_ioctl(struct socket *sock,unsigned int cmd, unsigned long arg)
 {
@@ -1910,7 +1910,7 @@
 static char ddp_snap_id[] = {0x08, 0x00, 0x07, 0x80, 0x9B};
 
 /*
- * Export symbols for use by drivers when Appletalk is a module.
+ * Export symbols for use by drivers when AppleTalk is a module.
  */
 EXPORT_SYMBOL(aarp_send_ddp);
 EXPORT_SYMBOL(atrtr_get_dev);
@@ -1969,7 +1969,7 @@
 	atalk_register_sysctl();
 #endif /* CONFIG_SYSCTL */
 
-	printk(KERN_INFO "Appletalk 0.18 for Linux NET3.037\n");
+	printk(KERN_INFO "AppleTalk 0.18 for Linux NET3.037\n");
 }
 
 #ifdef MODULE
@@ -1986,10 +1986,10 @@
  * Use counts are incremented/decremented when
  * sockets are created/deleted.
  *
- * Appletalk interfaces are not incremented untill atalkd is run
+ * AppleTalk interfaces are not incremented untill atalkd is run
  * and are only decremented when they are downed.
  *
- * Ergo, before the appletalk module can be removed, all Appletalk
+ * Ergo, before the AppleTalk module can be removed, all AppleTalk
  * sockets be closed from user space.
  */
 
diff -u --recursive --new-file v2.1.106/linux/net/appletalk/sysctl_net_atalk.c linux/net/appletalk/sysctl_net_atalk.c
--- v2.1.106/linux/net/appletalk/sysctl_net_atalk.c	Sat Sep 13 11:07:29 1997
+++ linux/net/appletalk/sysctl_net_atalk.c	Wed Jun 24 14:33:10 1998
@@ -1,5 +1,5 @@
 /* -*- linux-c -*-
- * sysctl_net_atalk.c: sysctl interface to net Appletalk subsystem.
+ * sysctl_net_atalk.c: sysctl interface to net AppleTalk subsystem.
  *
  * Begun April 1, 1996, Mike Shaver.
  * Added /proc/sys/net/atalk directory entry (empty =) ). [MS]
diff -u --recursive --new-file v2.1.106/linux/net/wanrouter/wanmain.c linux/net/wanrouter/wanmain.c
--- v2.1.106/linux/net/wanrouter/wanmain.c	Sun Jun  7 11:16:40 1998
+++ linux/net/wanrouter/wanmain.c	Wed Jun 24 14:34:44 1998
@@ -5,7 +5,7 @@
 *		the following common services for the WAN Link Drivers:
 *		 o WAN device managenment (registering, unregistering)
 *		 o Network interface management
-*		 o Physical connection management (dial-up, incomming calls)
+*		 o Physical connection management (dial-up, incoming calls)
 *		 o Logical connection management (switched virtual circuits)
 *		 o Protocol encapsulation/decapsulation
 *
diff -u --recursive --new-file v2.1.106/linux/scripts/Configure linux/scripts/Configure
--- v2.1.106/linux/scripts/Configure	Thu May  7 22:51:56 1998
+++ linux/scripts/Configure	Wed Jun 24 14:30:11 1998
@@ -1,7 +1,7 @@
 
 #! /bin/sh
 #
-# This script is used to configure the linux kernel.
+# This script is used to configure the Linux kernel.
 #
 # It was inspired by the challenge in the original Configure script
 # to ``do something better'', combined with the actual need to ``do
@@ -525,7 +525,7 @@
 mv .tmpconfig.h include/linux/autoconf.h
 
 echo
-echo "The linux kernel is now hopefully configured for your setup."
+echo "The Linux kernel should now be configured for your setup."
 echo "Check the top-level Makefile for additional configuration,"
 echo "and do a 'make dep ; make clean' if you want to be sure all"
 echo "the files are correctly re-made"
diff -u --recursive --new-file v2.1.106/linux/scripts/header.tk linux/scripts/header.tk
--- v2.1.106/linux/scripts/header.tk	Wed Apr  1 20:11:55 1998
+++ linux/scripts/header.tk	Wed Jun 24 14:30:11 1998
@@ -431,7 +431,7 @@
 	catch {destroy $w}
 	toplevel $w -class Dialog
 	message $w.m -width 400 -aspect 300 -text \
-		"The linux kernel is now hopefully configured for your setup. Check the top-level Makefile for additional configuration, and do a 'make dep ; make clean' if you want to be sure all the files are correctly re-made."  -relief raised 
+		"The Linux kernel should now be configured for your setup. Check the top-level Makefile for additional configuration, and do a 'make dep ; make clean' if you want to be sure all the files are correctly re-made."  -relief raised 
 	label $w.bm -bitmap info
 	pack $w.bm $w.m -pady 10 -side top -padx 10
 	wm title $w "Kernel build instructions" 
