]> git.neil.brown.name Git - history.git/commitdiff
Import 2.3.99pre4 2.3.99pre4
authorLinus Torvalds <torvalds@linuxfoundation.org>
Fri, 23 Nov 2007 20:33:49 +0000 (15:33 -0500)
committerLinus Torvalds <torvalds@linuxfoundation.org>
Fri, 23 Nov 2007 20:33:49 +0000 (15:33 -0500)
85 files changed:
CREDITS
Documentation/Configure.help
Documentation/filesystems/ntfs.txt
Documentation/sysrq.txt
MAINTAINERS
arch/i386/defconfig
arch/i386/kernel/head.S
arch/i386/kernel/setup.c
arch/m68k/config.in
arch/ppc/config.in
arch/ppc/kernel/feature.c
drivers/block/Config.in
drivers/block/md.c
drivers/block/nbd.c
drivers/block/rd.c
drivers/char/agp/agpgart_be.c
drivers/char/mem.c
drivers/net/defxx.c
drivers/net/ppp_async.c
drivers/net/ppp_generic.c
drivers/net/ppp_synctty.c
drivers/sound/Makefile
drivers/sound/dmasound.c [deleted file]
drivers/sound/dmasound.h [deleted file]
drivers/sound/dmasound/Config.in [new file with mode: 0644]
drivers/sound/dmasound/Makefile [new file with mode: 0644]
drivers/sound/dmasound/dmasound.h [new file with mode: 0644]
drivers/sound/dmasound/dmasound_atari.c [new file with mode: 0644]
drivers/sound/dmasound/dmasound_awacs.c [new file with mode: 0644]
drivers/sound/dmasound/dmasound_core.c [new file with mode: 0644]
drivers/sound/dmasound/dmasound_paula.c [new file with mode: 0644]
drivers/sound/dmasound/dmasound_q40.c [new file with mode: 0644]
drivers/usb/Config.in
drivers/usb/devices.c
drivers/usb/devio.c
drivers/usb/drivers.c
drivers/usb/evdev.c
drivers/usb/hub.c
drivers/usb/inode.c
drivers/usb/input.c
drivers/usb/joydev.c
drivers/usb/keybdev.c
drivers/usb/mousedev.c
drivers/usb/pegasus.c
drivers/usb/serial/ezusb_convert.pl
drivers/usb/serial/whiteheat.c
drivers/usb/serial/whiteheat.h [deleted file]
drivers/usb/serial/whiteheat_fw.h [new file with mode: 0644]
drivers/usb/uhci.c
drivers/usb/uhci.h
drivers/usb/usb-ohci.c
drivers/usb/usb.c
drivers/usb/usbdevice_fs.h [deleted file]
drivers/video/Makefile
drivers/video/amifb.c
drivers/video/atyfb.c
drivers/video/tgafb.c
fs/Config.in
fs/Makefile
fs/lockd/xdr4.c
fs/namei.c
fs/nfs/nfsroot.c
fs/nfs/write.c
fs/nfsd/lockd.c
fs/nfsd/nfs3xdr.c
fs/nfsd/nfsctl.c
fs/ntfs/Makefile
fs/ntfs/fs.c
fs/ramfs/Makefile [new file with mode: 0644]
fs/ramfs/inode.c [new file with mode: 0644]
fs/udf/file.c
fs/udf/inode.c
include/linux/bootmem.h
include/linux/input.h
include/linux/nbd.h
include/linux/ppp_channel.h
include/linux/raid/md_u.h
include/linux/udf_fs.h
include/linux/usb.h
include/linux/usbdevice_fs.h [new file with mode: 0644]
init/main.c
ipc/shm.c
kernel/panic.c
mm/bootmem.c
mm/slab.c

diff --git a/CREDITS b/CREDITS
index 0d1c6d77194bbf1d298623ed9852a6a961e6b5d2..bbab863c581a1f20c177f22e99dbfacb1ac0a63d 100644 (file)
--- a/CREDITS
+++ b/CREDITS
@@ -1381,7 +1381,7 @@ S: 370 01  Ceske Budejovice
 S: Czech Republic
 
 N: Bas Laarhoven
-E: bas@vimec.nl
+E: sjml@xs4all.nl
 D: Loadable modules and ftape driver
 S: J. Obrechtstr 23
 S: NL-5216 GP 's-Hertogenbosch
index 0cc8f44844755c04ac31b3d369c382e9844ea15a..eb5e4efecff84a82ee405d37633bad517a7882d3 100644 (file)
@@ -10227,11 +10227,10 @@ CONFIG_NFSD
   The module is called nfsd.o. If you want to compile it as a module,
   say M here and read Documentation/modules.txt. If unsure, say N.
 
-Provide NFSv3 server support (EXPERIMENTAL)
+Provide NFSv3 server support
 CONFIG_NFSD_V3
   If you would like to include the NFSv3 server as well as the NFSv2
-  server, say Y here.  File locking, via the NLMv4 protocol, is not
-  supported yet. If unsure, say N.
+  server, say Y here.  In unsure, say Y.
 
 OS/2 HPFS file system support
 CONFIG_HPFS_FS
@@ -10263,11 +10262,13 @@ CONFIG_NTFS_FS
 
 NTFS write support (DANGEROUS)
 CONFIG_NTFS_RW
-  If you say Y here, you will (hopefully) be able to write to NTFS
-  file systems as well as read from them. The read-write support
-  in NTFS is far from being complete and is not well tested. If you
+  If you say Y here, you will (maybe) be able to write to NTFS file
+  systems as well as read from them. The read-write support in
+  NTFS is far from being complete and is not well tested. If you
   enable this, back up your NTFS volume first since it may get
-  damaged.
+  damaged. Also, make sure to run chkdsk from within Microsoft
+  Windows NT after having performed any writes to a NTFS partition
+  from Linux to detect any problems as early as possible.
 
   If unsure, say N.
 
@@ -14424,12 +14425,44 @@ CONFIG_MULTIFACE_III_TTY
   If you want to compile it as a module, say M here and read
   Documentation/modules.txt.
 
-Amiga or Atari DMA sound support
-CONFIG_DMASOUND
-  If you want to use the internal audio of your Atari or Amiga in
-  Linux, answer Y to this question. This will provide a Sun-like
-  /dev/audio, compatible with the Linux/i386 sound system. Otherwise,
-  say N.
+Atari DMA sound support
+CONFIG_DMASOUND_ATARI
+  If you want to use the internal audio of your Atari in Linux, answer
+  Y to this question. This will provide a Sun-like /dev/audio,
+  compatible with the Linux/i386 sound system. Otherwise, say N.
+
+  This driver is also available as a module ( = 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.
+
+PowerMac DMA sound support
+CONFIG_DMASOUND_AWACS
+  If you want to use the internal audio of your PowerMac in Linux,
+  answer Y to this question. This will provide a Sun-like /dev/audio,
+  compatible with the Linux/i386 sound system. Otherwise, say N.
+
+  This driver is also available as a module ( = 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.
+
+Amiga DMA sound support
+CONFIG_DMASOUND_PAULA
+  If you want to use the internal audio of your Amiga in Linux, answer
+  Y to this question. This will provide a Sun-like /dev/audio,
+  compatible with the Linux/i386 sound system. Otherwise, say N.
+
+  This driver is also available as a module ( = 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.
+
+Q40 sound support
+CONFIG_DMASOUND_Q40
+  If you want to use the internal audio of your Q40 in Linux, answer
+  Y to this question. This will provide a Sun-like /dev/audio,
+  compatible with the Linux/i386 sound system. Otherwise, say N.
 
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you
index d9789eadbdeac002e4ec14aa82ed74a15a373ed0..8e7505bd490f4e84f22c994c0c864f171f44644b 100644 (file)
@@ -4,10 +4,13 @@ NTFS Overview
 To mount an NTFS volume, use the filesystem type 'ntfs'. The driver
 currently works only in read-only mode, with no fault-tolerance
 supported.  If you enable the experimental write support, make sure
-you can recover from a complete loss of data. For ftdisk support,
-limited success was reported with volume sets on top of the md driver,
-although mirror and stripe sets should work as well - if the md
-driver can be talked into using the same layout as Windows NT.
+you can recover from a complete loss of data and also always run
+chkdsk from within Microsoft Windows NT after performing a write to
+a NTFS partition from Linux to detect any problems as early as 
+possible. For ftdisk support, limited success was reported with 
+volume sets on top of the md driver, although mirror and stripe 
+sets should work as well - if the md driver can be talked into 
+using the same layout as Windows NT.
 
 The ntfs driver supports the following mount options:
 iocharset=name      Character set to use when returning file names.
index 49faf2dab4f626316a525ff2243aff0942de7cb3..b68e71cf9c9b63b2df70ed772f990a8359cd520b 100644 (file)
@@ -1,7 +1,7 @@
 
-                      MAGIC SYSRQ KEY DOCUMENTATION v1.31
+                      MAGIC SYSRQ KEY DOCUMENTATION v1.32
                      ------------------------------------
-                        [Mon Mar 13 21:45:48 EST 2000]
+                        [Sat Apr  8 22:15:03 CEST 2000]
 
 *  What is the magic SysRQ key?
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -113,13 +113,13 @@ virtual console (ALT+Fn) and then back again should also help.
 
 *  I hit SysRQ, but nothing seems to happen, what's wrong?
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-There are some keyboards which do not support 'SysRQ', you can try running
-'showkey -s' and pressing SysRQ or alt-SysRQ to see if it generates any
-0x54 codes. If it doesn't, you may define the magic sysrq sequence to a
-different key. Find the keycode with showkey, and change the define of
-'#define SYSRQ_KEY 0x54' in [/usr/src/linux/]include/asm/keyboard.h to
-the keycode of the key you wish to use, then recompile. Oh, and by the way,
-you exit 'showkey' by not typing anything for ten seconds.
+There are some keyboards that send different scancodes for SysRQ than the
+pre-defined 0x54. So if SysRQ doesn't work out of the box for a certain 
+keyboard, run 'showkey -s' to find out the proper scancode sequence. Then 
+use 'setkeycodes <sequence> 84' to define this sequence to the usual SysRQ 
+code (84 is decimal for 0x54). It's probably best to put this command in a
+boot script. Oh, and by the way, you exit 'showkey' by not typing anything 
+for ten seconds.
 
 *  I have more questions, who can I ask?
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
index fb12615f5cab91bf867f4008b9d859b05e0027d3..04b7177cb227ae0606b6d200a936c164e8024f9a 100644 (file)
@@ -740,6 +740,12 @@ M: emoenke@gwdg.de
 L:     linux-kernel@vger.rutgers.edu
 S:     Maintained
 
+NTFS FILESYSTEM
+P:     Anton Altaparmakov
+M:     aia21@cus.cam.ac.uk
+L:     linux-kernel@vger.rutgers.edu
+S:     Odd Fixes
+
 NVIDIA (RIVA) FRAMEBUFFER DRIVER
 P:     Jeff Garzik
 M:     jgarzik@mandrakesoft.com
index 340bbb728b1399dc368dba89b9a56f75378490e0..80f68ec31c13782b96966e9d124f348436a02cdd 100644 (file)
@@ -384,6 +384,7 @@ CONFIG_PCMCIA_PCNET=y
 # CONFIG_PCMCIA_SMC91C92 is not set
 # CONFIG_PCMCIA_XIRC2PS is not set
 # CONFIG_ARCNET_COM20020_CS is not set
+# CONFIG_PCMCIA_IBMTR is not set
 # CONFIG_PCMCIA_3C575 is not set
 # CONFIG_PCMCIA_XIRTULIP is not set
 CONFIG_NET_PCMCIA_RADIO=y
@@ -492,6 +493,7 @@ CONFIG_AUTOFS4_FS=y
 # CONFIG_VFAT_FS is not set
 # CONFIG_EFS_FS is not set
 # CONFIG_CRAMFS is not set
+# CONFIG_RAMFS is not set
 CONFIG_ISO9660_FS=y
 # CONFIG_JOLIET is not set
 # CONFIG_MINIX_FS is not set
index 7a8a17b636a27ebb70112dc2fce512e30aeeb895..ee759f2bcb6b1989a8f9ccf05fc19a39832429be 100644 (file)
@@ -70,22 +70,28 @@ startup_32:
  */
 #define cr4_bits mmu_cr4_features-__PAGE_OFFSET
        cmpl $0,cr4_bits
-       je 1f
-       movl %cr4,%eax          # Turn on 4Mb pages
+       je 3f
+       movl %cr4,%eax          # Turn on paging options (PSE,PAE,..)
        orl cr4_bits,%eax
        movl %eax,%cr4
+       jmp 3f
+1:
 #endif
 /*
- * Setup paging (intialize tables, then switch them on)
+ * Initialize page tables
  */
-1:
        movl $pg0-__PAGE_OFFSET,%edi /* initialize page tables */
        movl $007,%eax          /* "007" doesn't mean with right to kill, but
                                   PRESENT+RW+USER */
-1:     stosl
+2:     stosl
        add $0x1000,%eax
        cmp $empty_zero_page-__PAGE_OFFSET,%edi
-       jne 1b
+       jne 2b
+
+/*
+ * Enable paging
+ */
+3:
        movl $swapper_pg_dir-__PAGE_OFFSET,%eax
        movl %eax,%cr3          /* set the page table pointer.. */
        movl %cr0,%eax
index a9c7d26efa35ca9a98e200ec0e97a45301c900f1..71407c0eae914378cdf3743809b2cc3c6f13dd77 100644 (file)
@@ -727,7 +727,7 @@ void __init setup_arch(char **cmdline_p)
 
 #ifdef CONFIG_BLK_DEV_INITRD
        if (LOADER_TYPE && INITRD_START) {
-               if (INITRD_START + INITRD_SIZE < (max_low_pfn << PAGE_SHIFT)) {
+               if (INITRD_START + INITRD_SIZE <= (max_low_pfn << PAGE_SHIFT)) {
                        reserve_bootmem(INITRD_START, INITRD_SIZE);
                        initrd_start =
                                INITRD_START ? INITRD_START + PAGE_OFFSET : 0;
index 76ace0a5324e06a8dff8cc368633664a00b7e256..bc6eec37a9db0a5328d9464dbeb63990f1ba29fd 100644 (file)
@@ -484,7 +484,7 @@ comment 'Sound support'
 
 tristate 'Sound support' CONFIG_SOUND
 if [ "$CONFIG_SOUND" != "n" ]; then
-   dep_tristate '  Amiga or Atari DMA sound support' CONFIG_DMASOUND $CONFIG_SOUND
+   source drivers/sound/dmasound/Config.in
 fi
 endmenu
 
index 001eb30b5d08c4f5d62800416b336064f4949d20..e9499fbc9cfb2b46c9aedd6b3f2ef00cc8aee0b9 100644 (file)
@@ -256,7 +256,7 @@ mainmenu_option next_comment
 comment 'Sound'
 tristate 'Sound card support' CONFIG_SOUND
 if [ "$CONFIG_SOUND" != "n" ]; then
-  dep_tristate 'Amiga or PowerMac DMA sound support' CONFIG_DMASOUND $CONFIG_SOUND
+  source drivers/sound/dmasound/Config.in
   source drivers/sound/Config.in
 fi
 
index d14c7380acc1c7dddaca1f388a44a408004ca76a..d5baa3747096fd07d80abe1d5c4e3164f6e6c1be 100644 (file)
@@ -184,14 +184,14 @@ feature_init(void)
        if (controller_count)
                printk(KERN_INFO "Registered %d feature controller(s)\n", controller_count);
 
-#ifdef CONFIG_PMAC_PBOOK
-#ifdef CONFIG_DMASOUND_MODULE
-       /* On PowerBooks, we disable the sound chip when dmasound is a module */
+#if defined(CONFIG_PMAC_PBOOK) && !defined(CONFIG_DMASOUND_AWACS)
+       /* On PowerBooks, we disable the sound chip when dmasound is a module
+        * or not used at all
+        */
        if (controller_count && find_devices("via-pmu") != NULL) {
                feature_clear(controllers[0].device, FEATURE_Sound_power);
                feature_clear(controllers[0].device, FEATURE_Sound_CLK_enable);
        }
-#endif 
 #endif
 }
 
index 9faf26326b677f0b8f5c3b8d8440ddfcdf7db25c..146cbce88ebc4143e56780aa64d6d076ae8725e3 100644 (file)
@@ -46,9 +46,9 @@ dep_tristate '  Linear (append) mode' CONFIG_MD_LINEAR $CONFIG_BLK_DEV_MD
 dep_tristate '  RAID-0 (striping) mode' CONFIG_MD_STRIPED $CONFIG_BLK_DEV_MD
 #dep_tristate '  RAID-1 (mirroring) mode' CONFIG_MD_MIRRORING $CONFIG_BLK_DEV_MD
 #dep_tristate '  RAID-4/RAID-5 mode' CONFIG_MD_RAID5 $CONFIG_BLK_DEV_MD
-#if [ "$CONFIG_MD_LINEAR" = "y" -o "$CONFIG_MD_STRIPED" = "y" ]; then
-#   bool '    Boot support (linear, striped)' CONFIG_MD_BOOT
-#fi
+if [ "$CONFIG_MD_LINEAR" = "y" -o "$CONFIG_MD_STRIPED" = "y" ]; then
+   bool '    Boot support (linear, striped)' CONFIG_MD_BOOT
+fi
 tristate 'RAM disk support' CONFIG_BLK_DEV_RAM
 dep_bool '  Initial RAM disk (initrd) support' CONFIG_BLK_DEV_INITRD $CONFIG_BLK_DEV_RAM
 
index 1e7fa5f7589d2a25cf076268b7341f368e47f3d2..48796b4025f48d24075a3c78414926201c544347 100644 (file)
@@ -1805,6 +1805,136 @@ out:
 
 #undef OUT
 
+/* support old ioctls/init - cold add only */
+int do_md_add(mddev_t *mddev, kdev_t dev)
+{
+       int err;
+       mdk_rdev_t *rdev;
+       
+       if (mddev->sb || mddev->pers)
+               return -EBUSY;
+       err = md_import_device(dev, 0);
+       if (err) return err;
+       rdev = find_rdev_all(dev);
+       if (!rdev) {
+               MD_BUG();
+               return -EINVAL;
+       }
+       rdev->old_dev = dev;
+       rdev->desc_nr = mddev->nb_dev;
+       bind_rdev_to_array(rdev, mddev);
+       return 0;
+}
+
+#define SET_SB(x,v) mddev->sb->x = v
+#define SET_RSB(x,y) mddev->sb->disks[nr].x = y
+static void autorun_array (mddev_t *mddev);
+int do_md_start(mddev_t *mddev, int info)
+{
+       int pers = (info & 0xFF0000UL)>>16;
+//     int fault= (info & 0x00FF00UL)>>8;
+       int factor=(info & 0x0000FFUL);
+
+       struct md_list_head *tmp;
+       mdk_rdev_t *rdev, *rdev0=NULL;
+       int err = 0;
+
+       if (mddev->sb) {
+               printk("array md%d already has superbloc!!\n",
+                      mdidx(mddev));
+               return -EBUSY;
+       }
+       if (pers==1 || pers==2) {
+               /* non-persistant super block */
+               int devs = mddev->nb_dev;
+               if (alloc_array_sb(mddev))
+                       return -ENOMEM;
+               mddev->sb->major_version = MD_MAJOR_VERSION;
+               mddev->sb->minor_version = MD_MINOR_VERSION;
+               mddev->sb->patch_version = MD_PATCHLEVEL_VERSION;
+               mddev->sb->ctime = CURRENT_TIME;
+
+               SET_SB(level,pers_to_level(pers));
+               SET_SB(size,0);
+               SET_SB(nr_disks, devs);
+               SET_SB(raid_disks, devs);
+               SET_SB(md_minor,mdidx(mddev));
+               SET_SB(not_persistent, 1);
+
+               
+               SET_SB(state, 1<<MD_SB_CLEAN);
+               SET_SB(active_disks, devs);
+               SET_SB(working_disks, devs);
+               SET_SB(failed_disks, 0);
+               SET_SB(spare_disks, 0);
+
+               SET_SB(layout,0);
+               SET_SB(chunk_size, 1<<(factor+PAGE_SHIFT));
+
+               mddev->sb->md_magic = MD_SB_MAGIC;
+
+               /*
+                * Generate a 128 bit UUID
+                */
+               get_random_bytes(&mddev->sb->set_uuid0, 4);
+               get_random_bytes(&mddev->sb->set_uuid1, 4);
+               get_random_bytes(&mddev->sb->set_uuid2, 4);
+               get_random_bytes(&mddev->sb->set_uuid3, 4);
+
+               /* add each disc */
+               ITERATE_RDEV(mddev,rdev,tmp) {
+                       int nr, size;
+                       nr = rdev->desc_nr;
+                       SET_RSB(number,nr);
+                       SET_RSB(major,MAJOR(rdev->dev));
+                       SET_RSB(minor,MINOR(rdev->dev));
+                       SET_RSB(raid_disk,nr);
+                       SET_RSB(state,6); /* ACTIVE|SYNC */
+                       size = calc_dev_size(rdev->dev, mddev, 0);
+                       rdev->sb_offset = calc_dev_sboffset(rdev->dev, mddev, 0);
+
+                       if (!mddev->sb->size || (mddev->sb->size > size))
+                               mddev->sb->size = size;                 
+               }
+               sync_sbs(mddev);
+               err = do_md_run(mddev);
+               if (err)
+                       do_md_stop(mddev, 0);
+       } else {
+               /* persistant super block - ignore the info and read the superblocks */
+               ITERATE_RDEV(mddev,rdev,tmp) {
+                       if ((err = read_disk_sb(rdev))) {
+                               printk("md: could not read %s's sb, not importing!\n",
+                                      partition_name(rdev->dev));
+                               break;
+                       }
+                       if ((err = check_disk_sb(rdev))) {
+                               printk("md: %s has invalid sb, not importing!\n",
+                                      partition_name(rdev->dev));
+                               break;
+                       }
+                       rdev->desc_nr = rdev->sb->this_disk.number;
+                       if (!rdev0) rdev0=rdev;
+                       if (!uuid_equal(rdev0, rdev)) {
+                               printk("%s has different UUID to %s .. dropping\n",
+                                      partition_name(rdev->dev),
+                                      partition_name(rdev0->dev));
+                               err = -EINVAL;
+                               break;
+                       }
+                       if (!sb_equal(rdev0->sb, rdev->sb)) {
+                               printk("%s has same UUID as %s, but superblocks differ ...\n", partition_name(rdev->dev), partition_name(rdev0->dev));
+                               err = -EINVAL;
+                               break;
+                       }
+               }
+               if (!err)
+                       autorun_array(mddev);
+       }
+       return err;
+}
+#undef SET_SB
+#undef SET_RSB
 /*
  * We have to safely support old arrays too.
  */
@@ -2573,6 +2703,58 @@ static int md_ioctl (struct inode *inode, struct file *file,
                        }
                default:
        }
+       /* handle "old style" ioctls */
+       switch (cmd)
+       {
+       case START_MD:
+               if (!mddev)
+                       return -ENODEV;
+               err = lock_mddev(mddev);
+               if (err) {
+                       printk("ioctl lock interrupted, reason %d, cmd %d\n",err, cmd);
+                       goto abort;
+               }
+               err = do_md_start(mddev, (int) arg);
+               if (err) {
+                       printk("couldn't mdstart\n");
+                       goto abort_unlock;
+               }
+               goto done_unlock;
+       case STOP_MD:
+               if (!mddev)
+                       return -ENODEV;
+               err = lock_mddev(mddev);
+               if (err) {
+                       printk("ioctl lock interrupted, reason %d, cmd %d\n",err, cmd);
+                       goto abort_unlock;
+               }
+               err =  do_md_stop(mddev, 0);
+               if (err) {
+                       printk("couldn't mdstop\n");
+                       goto abort_unlock;
+               }
+               goto done_unlock;
+       case REGISTER_DEV:
+               /* add this device to an unstarted array,
+                * create the array if needed */
+               if (!mddev)
+                       mddev = alloc_mddev(dev);
+               if (!mddev) {
+                       err = -ENOMEM;
+                       goto abort;
+               }
+               err = lock_mddev(mddev);
+               if (err) {
+                       printk("ioctl, reason %d, cmd %d\n", err, cmd);
+                       goto abort;
+               }
+               err = do_md_add(mddev, to_kdev_t((dev_t) arg));
+               if (err) {
+                       printk("do_md_add failed %d\n", err);
+                       goto abort_unlock;
+               }
+               goto done_unlock;
+       }
 
        switch (cmd)
        {
@@ -2593,7 +2775,7 @@ static int md_ioctl (struct inode *inode, struct file *file,
                        err = set_array_info(mddev, (void *)arg);
                        if (err) {
                                printk("couldnt set array info. %d\n", err);
-                               goto abort;
+                               goto abort_unlock;
                        }
                        goto done_unlock;
 
@@ -3188,10 +3370,11 @@ void md__init raid_setup(char *str, int *ints)
 }
 
 #ifdef CONFIG_MD_BOOT
+#define MAX_MD_BOOT_DEVS       16
 struct {
        unsigned long set;
-       int pers[MAX_MD_DEVS];
-       kdev_t devices[MAX_MD_DEVS][MAX_REAL];
+       int pers[MAX_MD_BOOT_DEVS];
+       kdev_t devices[MAX_MD_BOOT_DEVS][MAX_REAL];
 } md_setup_args md__initdata = {
        0,{0},{{0}}
 };
@@ -3219,7 +3402,7 @@ static int __init md_setup(char *str)
           get_option(&str, &fault) != 2) {
                printk("md: Too few arguments supplied to md=.\n");
                return 0;
-       } else if (minor >= MAX_MD_DEVS) {
+       } else if (minor >= MAX_MD_BOOT_DEVS) {
                printk ("md: Minor device number too high.\n");
                return 0;
        } else if (md_setup_args.set & (1 << minor)) {
@@ -3229,13 +3412,13 @@ static int __init md_setup(char *str)
        switch(level) {
 #ifdef CONFIG_MD_LINEAR
        case -1:
-               level = LINEAR;
+               level = LINEAR<<16;
                pername = "linear";
                break;
 #endif
 #ifdef CONFIG_MD_STRIPED
        case 0:
-               level = STRIPED;
+               level = STRIPED<<16;
                pername = "striped";
                break;
 #endif
@@ -3263,7 +3446,7 @@ static int __init md_setup(char *str)
        printk ("md: Will configure md%d (%s) from %s, below.\n",
                minor, pername, devnames);
        md_setup_args.devices[minor][i] = (kdev_t) 0;
-       md_setup_args.pers[minor] = level | factor | (fault << FAULT_SHIFT);
+       md_setup_args.pers[minor] = level | factor | (fault << 8);
        md_setup_args.set |= (1 << minor);
        return 1;
 }
@@ -3273,7 +3456,7 @@ static void md_geninit (void)
 {
        int i;
 
-       for(i = 0; i < MAX_MD_DEVS; i++) {
+       for(i = 0; i < MAX_MD_BOOT_DEVS; i++) {
                md_blocksizes[i] = 1024;
                md_size[i] = 0;
                md_maxreadahead[i] = MD_READAHEAD;
@@ -3344,20 +3527,20 @@ int md__init md_init (void)
 }
 
 #ifdef CONFIG_MD_BOOT
-static void __init md_setup_drive(void)
+void __init md_setup_drive(void)
 {
-       if(md_setup_args.set)
-               do_md_setup(md_setup_args.str, md_setup_args.ints);
        int minor, i;
        kdev_t dev;
+       mddev_t*mddev;
 
-       for (minor = 0; minor < MAX_MD_DEVS; minor++) {
+       for (minor = 0; minor < MAX_MD_BOOT_DEVS; minor++) {
                if ((md_setup_args.set & (1 << minor)) == 0)
                        continue;
                printk("md: Loading md%d.\n", minor);
+               mddev = alloc_mddev(MKDEV(MD_MAJOR,minor));
                for (i = 0; (dev = md_setup_args.devices[minor][i]); i++)
-                       do_md_add (minor, dev);
-               do_md_run (minor, md_setup_args.pers[minor]);
+                       do_md_add (mddev, dev);
+               do_md_start (mddev, md_setup_args.pers[minor]);
        }
 }
 
index 0c3f5429f64d27931badf5bbc96f5d3927e38b69..b21be6bd261f42467159007db13bee688a7abd61 100644 (file)
@@ -350,6 +350,7 @@ static int nbd_ioctl(struct inode *inode, struct file *file,
 {
        struct nbd_device *lo;
        int dev, error, temp;
+       struct request sreq ;
 
        /* Anyone capable of this syscall can do *real bad* things */
 
@@ -363,6 +364,13 @@ static int nbd_ioctl(struct inode *inode, struct file *file,
 
        lo = &nbd_dev[dev];
        switch (cmd) {
+       case NBD_DISCONNECT:
+               printk("NBD_DISCONNECT\n") ;
+                sreq.cmd=2 ; /* shutdown command */
+                if (!lo->sock) return -EINVAL ;
+                nbd_send_req(lo->sock,&sreq) ;
+                return 0 ;
        case NBD_CLEAR_SOCK:
                down(&lo->queue_lock);
                nbd_clear_que(lo);
index a51dcd36feed51ea136260bb46b73372f0edd811..11a06ef616c4b15736e755e835f1949e19424ef5 100644 (file)
@@ -333,7 +333,8 @@ static int rd_open(struct inode * inode, struct file * filp)
         * Immunize device against invalidate_buffers() and prune_icache().
         */
        if (rd_inode[DEVICE_NR(inode->i_rdev)] == NULL) {
-               if((rd_inode[DEVICE_NR(inode->i_rdev)] = igrab(inode)) != NULL)
+               if (!inode->i_bdev) return -ENXIO;
+               if ((rd_inode[DEVICE_NR(inode->i_rdev)] = igrab(inode)) != NULL)
                        atomic_inc(&rd_inode[DEVICE_NR(inode->i_rdev)]->i_bdev->bd_openers);
        }
 
index fc4312f6460337bb89cae1537105334ca1286c69..447716420fee6a578b5a4074a92d61019edec1fa 100644 (file)
@@ -1764,6 +1764,30 @@ static struct {
 #endif /* CONFIG_AGP_INTEL */
 
 #ifdef CONFIG_AGP_SIS
+       { PCI_DEVICE_ID_SI_630,
+               PCI_VENDOR_ID_SI,
+               SIS_GENERIC,
+               "SiS",
+               "Generic",
+               sis_generic_setup },
+       { PCI_DEVICE_ID_SI_540,
+               PCI_VENDOR_ID_SI,
+               SIS_GENERIC,
+               "SiS",
+               "Generic",
+               sis_generic_setup },
+       { PCI_DEVICE_ID_SI_620,
+               PCI_VENDOR_ID_SI,
+               SIS_GENERIC,
+               "SiS",
+               "Generic",
+               sis_generic_setup },
+       { PCI_DEVICE_ID_SI_530,
+               PCI_VENDOR_ID_SI,
+               SIS_GENERIC,
+               "SiS",
+               "Generic",
+               sis_generic_setup },
        { 0,
                PCI_VENDOR_ID_SI,
                SIS_GENERIC,
index 897199f24a7a59c05bcd9f2ef7f6ce091eb26bc2..2d275e59259e5202ca95e82dab02e370543ddba9 100644 (file)
@@ -34,9 +34,6 @@ void soundcore_init(void);
 #ifdef CONFIG_SOUND_OSS
 void soundcard_init(void);
 #endif
-#ifdef CONFIG_DMASOUND
-void dmasound_init(void);
-#endif
 #endif
 #ifdef CONFIG_SPARCAUDIO
 extern int sparcaudio_init(void);
@@ -634,9 +631,6 @@ int __init chr_dev_init(void)
 #ifdef CONFIG_SOUND_OSS
        soundcard_init();
 #endif
-#ifdef CONFIG_DMASOUND
-       dmasound_init();
-#endif
 #endif
 #ifdef CONFIG_SPARCAUDIO
        sparcaudio_init();
index fe6b006036493693a10cca67275eac6f462f7d35..00fb093410c56cff71781fb33858d0885190306f 100644 (file)
@@ -216,7 +216,6 @@ static const char *version = "defxx.c:v1.05 2000/03/26  Lawrence V. Stefani (ste
 #include <linux/pci.h>
 #include <linux/delay.h>
 #include <linux/init.h>
-#include <linux/module.h>
 #include <asm/byteorder.h>
 #include <asm/bitops.h>
 #include <asm/io.h>
index e2649ef48b9d8726f44216a4bda826dbcf0ac55a..c3eb74c379592df67c372f822259b982d40785a8 100644 (file)
@@ -119,9 +119,11 @@ ppp_asynctty_open(struct tty_struct *tty)
        struct asyncppp *ap;
        int err;
 
+       MOD_INC_USE_COUNT;
+       err = -ENOMEM;
        ap = kmalloc(sizeof(*ap), GFP_KERNEL);
        if (ap == 0)
-               return -ENOMEM;
+               goto out;
 
        /* initialize the asyncppp structure */
        memset(ap, 0, sizeof(*ap));
@@ -140,15 +142,18 @@ ppp_asynctty_open(struct tty_struct *tty)
        ap->chan.ops = &async_ops;
        ap->chan.mtu = PPP_MRU;
        err = ppp_register_channel(&ap->chan);
-       if (err) {
-               kfree(ap);
-               return err;
-       }
+       if (err)
+               goto out_free;
 
        tty->disc_data = ap;
 
-       MOD_INC_USE_COUNT;
        return 0;
+
+ out_free:
+       kfree(ap);
+ out:
+       MOD_DEC_USE_COUNT;
+       return err;
 }
 
 /*
index ef51f464e013fe5b554890981289d9e6a0f36bd9..a70c1a8db66fd5a52546b93e84f235f05ec722f9 100644 (file)
@@ -19,7 +19,7 @@
  * PPP driver, written by Michael Callahan and Al Longyear, and
  * subsequently hacked by Paul Mackerras.
  *
- * ==FILEVERSION 20000323==
+ * ==FILEVERSION 20000406==
  */
 
 #include <linux/config.h>
@@ -125,12 +125,13 @@ struct ppp {
 
 /*
  * Bits in flags: SC_NO_TCP_CCID, SC_CCP_OPEN, SC_CCP_UP, SC_LOOP_TRAFFIC,
- * SC_MULTILINK, SC_MP_SHORTSEQ, SC_MP_XSHORTSEQ.
+ * SC_MULTILINK, SC_MP_SHORTSEQ, SC_MP_XSHORTSEQ, SC_COMP_TCP, SC_REJ_COMP_TCP.
  * Bits in rstate: SC_DECOMP_RUN, SC_DC_ERROR, SC_DC_FERROR.
  * Bits in xstate: SC_COMP_RUN
  */
 #define SC_FLAG_BITS   (SC_NO_TCP_CCID|SC_CCP_OPEN|SC_CCP_UP|SC_LOOP_TRAFFIC \
-                        |SC_MULTILINK|SC_MP_SHORTSEQ|SC_MP_XSHORTSEQ)
+                        |SC_MULTILINK|SC_MP_SHORTSEQ|SC_MP_XSHORTSEQ \
+                        |SC_COMP_TCP|SC_REJ_COMP_TCP)
 
 /*
  * Private data structure for each channel.
@@ -182,6 +183,14 @@ static int last_channel_index;
 /* We limit the length of ppp->file.rq to this (arbitrary) value */
 #define PPP_MAX_RQLEN  32
 
+/*
+ * Maximum number of multilink fragments queued up.
+ * This has to be large enough to cope with the maximum latency of
+ * the slowest channel relative to the others.  Strictly it should
+ * depend on the number of channels and their characteristics.
+ */
+#define PPP_MP_MAX_QLEN        128
+
 /* Multilink header bits. */
 #define B      0x80            /* this fragment begins a packet */
 #define E      0x40            /* this fragment ends a packet */
@@ -770,6 +779,7 @@ ppp_start_xmit(struct sk_buff *skb, struct net_device *dev)
 
  outf:
        kfree_skb(skb);
+       ++ppp->stats.tx_dropped;
        return 0;
 }
 
@@ -1039,7 +1049,8 @@ ppp_push(struct ppp *ppp)
 static int ppp_mp_explode(struct ppp *ppp, struct sk_buff *skb)
 {
        int nch, len, fragsize;
-       int i, bits, hdrlen;
+       int i, bits, hdrlen, mtu;
+       int flen, fnb;
        unsigned char *p, *q;
        struct list_head *list;
        struct channel *pch;
@@ -1047,6 +1058,7 @@ static int ppp_mp_explode(struct ppp *ppp, struct sk_buff *skb)
        struct ppp_channel *chan;
 
        nch = 0;
+       hdrlen = (ppp->flags & SC_MP_XSHORTSEQ)? MPHDRLEN_SSN: MPHDRLEN;
        list = &ppp->channels;
        while ((list = list->next) != &ppp->channels) {
                pch = list_entry(list, struct channel, clist);
@@ -1097,8 +1109,6 @@ static int ppp_mp_explode(struct ppp *ppp, struct sk_buff *skb)
 
        /* create a fragment for each channel */
        bits = B;
-       hdrlen = (ppp->flags & SC_MP_XSHORTSEQ)? MPHDRLEN_SSN: MPHDRLEN;
-       /* XXX gotta do A/C and prot compression here */
        do {
                list = list->next;
                if (list == &ppp->channels) {
@@ -1109,13 +1119,34 @@ static int ppp_mp_explode(struct ppp *ppp, struct sk_buff *skb)
                ++i;
                if (!pch->avail)
                        continue;
-               if (fragsize >= len) {
-                       fragsize = len;
-                       bits |= E;
+
+               /* check the channel's mtu and whether it is still attached. */
+               spin_lock_bh(&pch->downl);
+               if (pch->chan == 0 || (mtu = pch->chan->mtu) < hdrlen) {
+                       /* can't use this channel */
+                       spin_unlock_bh(&pch->downl);
+                       pch->avail = 0;
+                       if (--nch == 0)
+                               break;
+                       continue;
                }
-               frag = alloc_skb(fragsize + hdrlen, GFP_ATOMIC);
-               if (frag != 0) {
-                       q = skb_put(frag, fragsize + hdrlen);
+
+               /*
+                * We have to create multiple fragments for this channel
+                * if fragsize is greater than the channel's mtu.
+                */
+               if (fragsize > len)
+                       fragsize = len;
+               for (flen = fragsize; flen > 0; flen -= fnb) {
+                       fnb = flen;
+                       if (fnb > mtu + 2 - hdrlen)
+                               fnb = mtu + 2 - hdrlen;
+                       if (fnb >= len)
+                               bits |= E;
+                       frag = alloc_skb(fnb + hdrlen, GFP_ATOMIC);
+                       if (frag == 0)
+                               goto noskb;
+                       q = skb_put(frag, fnb + hdrlen);
                        /* make the MP header */
                        q[0] = PPP_MP >> 8;
                        q[1] = PPP_MP;
@@ -1130,29 +1161,31 @@ static int ppp_mp_explode(struct ppp *ppp, struct sk_buff *skb)
                        }
 
                        /* copy the data in */
-                       memcpy(q + hdrlen, p, fragsize);
+                       memcpy(q + hdrlen, p, fnb);
 
                        /* try to send it down the channel */
-                       spin_lock_bh(&pch->downl);
                        chan = pch->chan;
-                       if (chan != 0) {
-                               if (!chan->ops->start_xmit(chan, frag))
-                                       skb_queue_tail(&pch->file.xq, frag);
-                       } else {
-                               /* channel got unregistered, too bad */
-                               kfree_skb(skb);
-                       }
-                       spin_unlock_bh(&pch->downl);
+                       if (!chan->ops->start_xmit(chan, frag))
+                               skb_queue_tail(&pch->file.xq, frag);
                        pch->had_frag = 1;
+                       p += fnb;
+                       len -= fnb;
+                       ++ppp->nxseq;
+                       bits = 0;
                }
-               p += fragsize;
-               len -= fragsize;
-               ++ppp->nxseq;
-               bits = 0;
+               spin_unlock_bh(&pch->downl);
        } while (len > 0);
        ppp->nxchan = i;
 
        return 1;
+
+ noskb:
+       spin_unlock_bh(&pch->downl);
+       if (ppp->debug & 1)
+               printk(KERN_ERR "PPP: no memory (fragment)\n");
+       ++ppp->stats.tx_errors;
+       ++ppp->nxseq;
+       return 1;       /* abandon the frame */
 }
 #endif /* CONFIG_PPP_MULTILINK */
 
@@ -1434,7 +1467,7 @@ ppp_decompress_frame(struct ppp *ppp, struct sk_buff *skb)
 static void
 ppp_receive_mp_frame(struct ppp *ppp, struct sk_buff *skb, struct channel *pch)
 {
-       u32 mask, seq, minseq;
+       u32 mask, seq;
        struct list_head *l;
        int mphdrlen = (ppp->flags & SC_MP_SHORTSEQ)? MPHDRLEN_SSN: MPHDRLEN;
 
@@ -1452,19 +1485,35 @@ ppp_receive_mp_frame(struct ppp *ppp, struct sk_buff *skb, struct channel *pch)
        skb->BEbits = skb->data[2];
        skb_pull(skb, mphdrlen);        /* pull off PPP and MP headers */
 
-       /* Expand sequence number to 32 bits */
-       seq |= pch->lastseq & ~mask;
-       if (seq_before(seq, pch->lastseq)) {
-               if (seq_after(seq, pch->lastseq - 100)) {
-                       printk(KERN_DEBUG "PPP: MP fragments out of order"
-                              " (%u, %u)\n", pch->lastseq, seq);
-                       goto err;
-               }
+       /*
+        * Do protocol ID decompression on the first fragment of each packet.
+        */
+       if ((skb->BEbits & B) && (skb->data[0] & 1))
+               *skb_push(skb, 1) = 0;
+
+       /*
+        * Expand sequence number to 32 bits, making it as close
+        * as possible to ppp->minseq.
+        */
+       seq |= ppp->minseq & ~mask;
+       if ((int)(ppp->minseq - seq) > (int)(mask >> 1))
                seq += mask + 1;
-       }
+       else if ((int)(seq - ppp->minseq) > (int)(mask >> 1))
+               seq -= mask + 1;        /* should never happen */
        skb->sequence = seq;
        pch->lastseq = seq;
 
+       /*
+        * If this packet comes before the next one we were expecting,
+        * drop it.
+        */
+       if (seq_before(seq, ppp->nextseq)) {
+               kfree_skb(skb);
+               ++ppp->stats.rx_dropped;
+               ppp_receive_error(ppp);
+               return;
+       }
+
        /*
         * Reevaluate minseq, the minimum over all channels of the
         * last sequence number received on each channel.  Because of
@@ -1473,17 +1522,23 @@ ppp_receive_mp_frame(struct ppp *ppp, struct sk_buff *skb, struct channel *pch)
         * The list of channels can't change because we have the receive
         * side of the ppp unit locked.
         */
-       minseq = seq;
        for (l = ppp->channels.next; l != &ppp->channels; l = l->next) {
                struct channel *ch = list_entry(l, struct channel, clist);
-               if (seq_before(ch->lastseq, minseq))
-                       minseq = ch->lastseq;
+               if (seq_before(ch->lastseq, seq))
+                       seq = ch->lastseq;
        }
-       ppp->minseq = minseq;
+       if (seq_before(ppp->minseq, seq))
+               ppp->minseq = seq;
 
        /* Put the fragment on the reconstruction queue */
        ppp_mp_insert(ppp, skb);
 
+       /* If the queue is getting long, don't wait any longer for packets
+          before the start of the queue. */
+       if (skb_queue_len(&ppp->mrq) >= PPP_MP_MAX_QLEN
+           && seq_before(ppp->minseq, ppp->mrq.next->sequence))
+               ppp->minseq = ppp->mrq.next->sequence;
+
        /* Pull completed packets off the queue and receive them. */
        while ((skb = ppp_mp_reconstruct(ppp)) != 0)
                ppp_receive_nonmp_frame(ppp, skb);
@@ -1531,16 +1586,17 @@ ppp_mp_reconstruct(struct ppp *ppp)
        struct sk_buff *skb = NULL;
        int lost = 0, len = 0;
 
+       if (ppp->mrru == 0)     /* do nothing until mrru is set */
+               return NULL;
        head = list->next;
        tail = NULL;
        for (p = head; p != (struct sk_buff *) list; p = next) {
                next = p->next;
                if (seq_before(p->sequence, seq)) {
-                       /* this can't happen, anyway toss the skb */
+                       /* this can't happen, anyway ignore the skb */
                        printk(KERN_ERR "ppp_mp_reconstruct bad seq %u < %u\n",
                               p->sequence, seq);
-                       __skb_unlink(p, list);
-                       kfree_skb(p);
+                       head = next;
                        continue;
                }
                if (p->sequence != seq) {
@@ -1568,8 +1624,7 @@ ppp_mp_reconstruct(struct ppp *ppp)
                if (p->BEbits & B) {
                        head = p;
                        lost = 0;
-                       /* reset len, allow for protocol ID compression */
-                       len = p->data[0] & 1;
+                       len = 0;
                }
 
                len += p->len;
@@ -1580,6 +1635,11 @@ ppp_mp_reconstruct(struct ppp *ppp)
                                ++ppp->stats.rx_length_errors;
                                printk(KERN_DEBUG "PPP: reconstructed packet"
                                       " is too long (%d)\n", len);
+                       } else if (p == head) {
+                               /* fragment is complete packet - reuse skb */
+                               tail = p;
+                               skb = skb_get(p);
+                               break;
                        } else if ((skb = dev_alloc_skb(len)) == NULL) {
                                ++ppp->stats.rx_missed_errors;
                                printk(KERN_DEBUG "PPP: no memory for "
@@ -1610,19 +1670,14 @@ ppp_mp_reconstruct(struct ppp *ppp)
                        if (ppp->debug & 1)
                                printk(KERN_DEBUG "  missed pkts %u..%u\n",
                                       ppp->nextseq, head->sequence-1);
+                       ++ppp->stats.rx_dropped;
                        ppp_receive_error(ppp);
                }
 
-               /* uncompress protocol ID */
-               if (head->data[0] & 1)
-                       *skb_put(skb, 1) = 0;
-               p = head;
-               for (;;) {
-                       memcpy(skb_put(skb, p->len), p->data, p->len);
-                       if (p == tail)
-                               break;
-                       p = p->next;
-               }
+               if (head != tail)
+                       /* copy to a single skb */
+                       for (p = head; p != tail->next; p = p->next)
+                               memcpy(skb_put(skb, p->len), p->data, p->len);
                ppp->nextseq = tail->sequence + 1;
                head = tail->next;
        }
@@ -2206,6 +2261,9 @@ static void ppp_destroy_interface(struct ppp *ppp)
        }
        skb_queue_purge(&ppp->file.xq);
        skb_queue_purge(&ppp->file.rq);
+#ifdef CONFIG_PPP_MULTILINK
+       skb_queue_purge(&ppp->mrq);
+#endif /* CONFIG_PPP_MULTILINK */
        dev = ppp->dev;
        ppp->dev = 0;
        ppp_unlock(ppp);
@@ -2290,7 +2348,9 @@ ppp_connect_channel(struct channel *pch, int unit)
        if (pch->chan == 0)             /* need to check this?? */
                goto outr;
 
-       hdrlen = pch->chan->hdrlen + PPP_HDRLEN;
+       if (pch->file.hdrlen > ppp->file.hdrlen)
+               ppp->file.hdrlen = pch->file.hdrlen;
+       hdrlen = pch->file.hdrlen + 2;  /* for protocol bytes */
        if (ppp->dev && hdrlen > ppp->dev->hard_header_len)
                ppp->dev->hard_header_len = hdrlen;
        list_add_tail(&pch->clist, &ppp->channels);
index 81880ba90a91bfe085118fee7a60957a98e5fbce..e049ab4bd0313e76deb89be25b9849b129685812 100644 (file)
@@ -176,9 +176,11 @@ ppp_sync_open(struct tty_struct *tty)
        struct syncppp *ap;
        int err;
 
+       MOD_INC_USE_COUNT;
        ap = kmalloc(sizeof(*ap), GFP_KERNEL);
+       err = -ENOMEM;
        if (ap == 0)
-               return -ENOMEM;
+               goto out;
 
        /* initialize the syncppp structure */
        memset(ap, 0, sizeof(*ap));
@@ -193,16 +195,20 @@ ppp_sync_open(struct tty_struct *tty)
        ap->chan.private = ap;
        ap->chan.ops = &sync_ops;
        ap->chan.mtu = PPP_MRU;
+       ap->chan.hdrlen = 2;    /* for A/C bytes */
        err = ppp_register_channel(&ap->chan);
-       if (err) {
-               kfree(ap);
-               return err;
-       }
+       if (err)
+               goto out_free;
 
        tty->disc_data = ap;
 
-       MOD_INC_USE_COUNT;
        return 0;
+
+ out_free:
+       kfree(ap);
+ out:
+       MOD_DEC_USE_COUNT;
+       return err;
 }
 
 /*
index 4d039b21c04c60f251efd0cd285af0ca5e66c07b..876daf485082ec434f29f23c14d5a3082980306e 100644 (file)
@@ -35,7 +35,6 @@ obj-          :=
 # Each configuration option enables a list of files.
 
 obj-$(CONFIG_SOUND)            += soundcore.o
-obj-$(CONFIG_DMASOUND)         += dmasound.o
 obj-$(CONFIG_SOUND_OSS)                += sound.o
 obj-$(CONFIG_SOUND_CS4232)     += cs4232.o ad1848.o 
 
@@ -81,6 +80,17 @@ obj-$(CONFIG_SOUND_ESSSOLO1) += esssolo1.o
 obj-$(CONFIG_SOUND_MAESTRO)    += maestro.o
 obj-$(CONFIG_SOUND_TRIDENT)    += trident.o ac97_codec.o
 
+ifeq ($(CONFIG_DMASOUND),y)
+  SUB_DIRS += dmasound
+  MOD_SUB_DIRS += dmasound
+  obj-y += dmasound/dmasound.o
+else
+  ifeq ($(CONFIG_DMASOUND),m)
+    MOD_SUB_DIRS += dmasound
+  endif
+endif
+
+
 # Declare multi-part drivers.
 
 list-multi     := sound.o gus.o pas2.o sb.o sb_lib.o softoss2.o vidc_mod.o \
diff --git a/drivers/sound/dmasound.c b/drivers/sound/dmasound.c
deleted file mode 100644 (file)
index b6298ca..0000000
+++ /dev/null
@@ -1,5821 +0,0 @@
-
-/* linux/drivers/sound/dmasound.c */
-
-/*
-
-OSS/Free compatible Atari TT/Falcon and Amiga DMA sound driver for Linux/m68k
-Extended to support Power Macintosh for Linux/ppc by Paul Mackerras
-
-(c) 1995 by Michael Schlueter & Michael Marte
-
-Michael Schlueter (michael@duck.syd.de) did the basic structure of the VFS
-interface and the u-law to signed byte conversion.
-
-Michael Marte (marte@informatik.uni-muenchen.de) did the sound queue,
-/dev/mixer, /dev/sndstat and complemented the VFS interface. He would like
-to thank:
-Michael Schlueter for initial ideas and documentation on the MFP and
-the DMA sound hardware.
-Therapy? for their CD 'Troublegum' which really made me rock.
-
-/dev/sndstat is based on code by Hannu Savolainen, the author of the
-VoxWare family of drivers.
-
-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.
-
-History:
-1995/8/25      first release
-
-1995/9/02      ++roman: fixed atari_stram_alloc() call, the timer programming
-                       and several race conditions
-
-1995/9/14      ++roman: After some discussion with Michael Schlueter, revised
-                       the interrupt disabling
-                       Slightly speeded up U8->S8 translation by using long
-                       operations where possible
-                       Added 4:3 interpolation for /dev/audio
-
-1995/9/20      ++TeSche: Fixed a bug in sq_write and changed /dev/audio
-                       converting to play at 12517Hz instead of 6258Hz.
-
-1995/9/23      ++TeSche: Changed sq_interrupt() and sq_play() to pre-program
-                       the DMA for another frame while there's still one
-                       running. This allows the IRQ response to be
-                       arbitrarily delayed and playing will still continue.
-
-1995/10/14     ++Guenther_Kelleter@ac3.maus.de, ++TeSche: better support for
-                       Falcon audio (the Falcon doesn't raise an IRQ at the
-                       end of a frame, but at the beginning instead!). uses
-                       'if (codec_dma)' in lots of places to simply switch
-                       between Falcon and TT code.
-
-1995/11/06     ++TeSche: started introducing a hardware abstraction scheme
-                       (may perhaps also serve for Amigas?), can now play
-                       samples at almost all frequencies by means of a more
-                       generalized expand routine, takes a good deal of care
-                       to cut data only at sample sizes, buffer size is now
-                       a kernel runtime option, implemented fsync() & several
-                       minor improvements
-               ++Guenther: useful hints and bug fixes, cross-checked it for
-                       Falcons
-
-1996/3/9       ++geert: support added for Amiga, A-law, 16-bit little endian.
-                       Unification to drivers/sound/dmasound.c.
-
-1996/4/6       ++Martin Mitchell: updated to 1.3 kernel.
-
-1996/6/13       ++topi: fixed things that were broken (mainly the amiga
-                        14-bit routines), /dev/sndstat shows now the real
-                        hardware frequency, the lowpass filter is disabled
-                       by default now.
-
-1996/9/25      ++geert: modularization
-
-1998-06-10     ++andreas: converted to use sound_core
-
-*/
-
-
-#include <linux/module.h>
-#include <linux/sched.h>
-#include <linux/timer.h>
-#include <linux/major.h>
-#include <linux/config.h>
-#include <linux/fcntl.h>
-#include <linux/errno.h>
-#include <linux/mm.h>
-#include <linux/malloc.h>
-#include <linux/sound.h>
-#include <linux/init.h>
-#include <linux/delay.h>
-
-#if defined(__mc68000__) || defined(CONFIG_APUS)
-#include <asm/setup.h>
-#endif
-#include <asm/system.h>
-#include <asm/irq.h>
-#include <asm/pgtable.h>
-#include <asm/uaccess.h>
-
-#ifdef CONFIG_ATARI
-#include <asm/atarihw.h>
-#include <asm/atariints.h>
-#include <asm/atari_stram.h>
-#endif /* CONFIG_ATARI */
-#ifdef CONFIG_AMIGA
-#include <asm/amigahw.h>
-#include <asm/amigaints.h>
-#endif /* CONFIG_AMIGA */
-#ifdef CONFIG_PPC
-#include <linux/adb.h>
-#include <linux/cuda.h>
-#include <linux/pmu.h>
-#include <asm/prom.h>
-#include <asm/machdep.h>
-#include <asm/io.h>
-#include <asm/dbdma.h>
-#include <asm/feature.h>
-#include "awacs_defs.h"
-#include <linux/nvram.h>
-#include <linux/vt_kern.h>
-#endif /* CONFIG_PPC */
-
-#include "dmasound.h"
-#include <linux/soundcard.h>
-
-#define HAS_8BIT_TABLES
-
-#ifdef MODULE
-static int sq_unit = -1;
-static int mixer_unit = -1;
-static int state_unit = -1;
-static int irq_installed = 0;
-#endif /* MODULE */
-static char **sound_buffers = NULL;
-#ifdef CONFIG_PPC
-static char **sound_read_buffers = NULL;
-#endif
-
-#ifdef CONFIG_ATARI
-extern void atari_microwire_cmd(int cmd);
-#endif /* CONFIG_ATARI */
-
-#ifdef CONFIG_AMIGA
-   /*
-    *  The minimum period for audio depends on htotal (for OCS/ECS/AGA)
-    *  (Imported from arch/m68k/amiga/amisound.c)
-    */
-
-extern volatile u_short amiga_audio_min_period;
-
-
-   /*
-    *  amiga_mksound() should be able to restore the period after beeping
-    *  (Imported from arch/m68k/amiga/amisound.c)
-    */
-
-extern u_short amiga_audio_period;
-
-
-   /*
-    *  Audio DMA masks
-    */
-
-#define AMI_AUDIO_OFF  (DMAF_AUD0 | DMAF_AUD1 | DMAF_AUD2 | DMAF_AUD3)
-#define AMI_AUDIO_8    (DMAF_SETCLR | DMAF_MASTER | DMAF_AUD0 | DMAF_AUD1)
-#define AMI_AUDIO_14   (AMI_AUDIO_8 | DMAF_AUD2 | DMAF_AUD3)
-
-#endif /* CONFIG_AMIGA */
-
-#ifdef CONFIG_PPC
-/*
- * Interrupt numbers and addresses, obtained from the device tree.
- */
-static int awacs_irq, awacs_tx_irq, awacs_rx_irq;
-static volatile struct awacs_regs *awacs;
-static volatile struct dbdma_regs *awacs_txdma, *awacs_rxdma;
-static int awacs_rate_index;
-static int awacs_subframe;
-static int awacs_spkr_vol;
-static struct device_node* awacs_node;
-
-static int awacs_revision;
-#define AWACS_BURGUNDY 100             /* fake revision # for burgundy */
-
-/*
- * Space for the DBDMA command blocks.
- */
-static void *awacs_tx_cmd_space;
-static volatile struct dbdma_cmd *awacs_tx_cmds;
-
-static void *awacs_rx_cmd_space;
-static volatile struct dbdma_cmd *awacs_rx_cmds;
-
-/*
- * Cached values of AWACS registers (we can't read them).
- * Except on the burgundy. XXX
- */
-int awacs_reg[5];
-
-#define HAS_16BIT_TABLES
-#undef HAS_8BIT_TABLES
-
-/*
- * Stuff for outputting a beep.  The values range from -327 to +327
- * so we can multiply by an amplitude in the range 0..100 to get a
- * signed short value to put in the output buffer.
- */
-static short beep_wform[256] = {
-       0,      40,     79,     117,    153,    187,    218,    245,
-       269,    288,    304,    316,    323,    327,    327,    324,
-       318,    310,    299,    288,    275,    262,    249,    236,
-       224,    213,    204,    196,    190,    186,    183,    182,
-       182,    183,    186,    189,    192,    196,    200,    203,
-       206,    208,    209,    209,    209,    207,    204,    201,
-       197,    193,    188,    183,    179,    174,    170,    166,
-       163,    161,    160,    159,    159,    160,    161,    162,
-       164,    166,    168,    169,    171,    171,    171,    170,
-       169,    167,    163,    159,    155,    150,    144,    139,
-       133,    128,    122,    117,    113,    110,    107,    105,
-       103,    103,    103,    103,    104,    104,    105,    105,
-       105,    103,    101,    97,     92,     86,     78,     68,
-       58,     45,     32,     18,     3,      -11,    -26,    -41,
-       -55,    -68,    -79,    -88,    -95,    -100,   -102,   -102,
-       -99,    -93,    -85,    -75,    -62,    -48,    -33,    -16,
-       0,      16,     33,     48,     62,     75,     85,     93,
-       99,     102,    102,    100,    95,     88,     79,     68,
-       55,     41,     26,     11,     -3,     -18,    -32,    -45,
-       -58,    -68,    -78,    -86,    -92,    -97,    -101,   -103,
-       -105,   -105,   -105,   -104,   -104,   -103,   -103,   -103,
-       -103,   -105,   -107,   -110,   -113,   -117,   -122,   -128,
-       -133,   -139,   -144,   -150,   -155,   -159,   -163,   -167,
-       -169,   -170,   -171,   -171,   -171,   -169,   -168,   -166,
-       -164,   -162,   -161,   -160,   -159,   -159,   -160,   -161,
-       -163,   -166,   -170,   -174,   -179,   -183,   -188,   -193,
-       -197,   -201,   -204,   -207,   -209,   -209,   -209,   -208,
-       -206,   -203,   -200,   -196,   -192,   -189,   -186,   -183,
-       -182,   -182,   -183,   -186,   -190,   -196,   -204,   -213,
-       -224,   -236,   -249,   -262,   -275,   -288,   -299,   -310,
-       -318,   -324,   -327,   -327,   -323,   -316,   -304,   -288,
-       -269,   -245,   -218,   -187,   -153,   -117,   -79,    -40,
-};
-
-#define BEEP_SRATE     22050   /* 22050 Hz sample rate */
-#define BEEP_BUFLEN    512
-#define BEEP_VOLUME    15      /* 0 - 100 */
-
-static int beep_volume = BEEP_VOLUME;
-static int beep_playing = 0;
-static int awacs_beep_state = 0;
-static short *beep_buf;
-static volatile struct dbdma_cmd *beep_dbdma_cmd;
-static void (*orig_mksound)(unsigned int, unsigned int);
-static int is_pbook_3400;
-static unsigned char *latch_base;
-static int is_pbook_G3;
-static unsigned char *macio_base;
-
-/* Burgundy functions */
-static void awacs_burgundy_wcw(unsigned addr,unsigned newval);
-static unsigned awacs_burgundy_rcw(unsigned addr);
-static void awacs_burgundy_write_volume(unsigned address, int volume);
-static int awacs_burgundy_read_volume(unsigned address);
-static void awacs_burgundy_write_mvolume(unsigned address, int volume);
-static int awacs_burgundy_read_mvolume(unsigned address);
-
-#ifdef CONFIG_PMAC_PBOOK
-/*
- * Stuff for restoring after a sleep.
- */
-static int awacs_sleep_notify(struct pmu_sleep_notifier *self, int when);
-struct pmu_sleep_notifier awacs_sleep_notifier = {
-       awacs_sleep_notify, SLEEP_LEVEL_SOUND,
-};
-#endif /* CONFIG_PMAC_PBOOK */
-
-#endif /* CONFIG_PPC */
-
-/*** Some declarations *******************************************************/
-
-
-#define DMASND_TT              1
-#define DMASND_FALCON          2
-#define DMASND_AMIGA           3
-#define DMASND_AWACS           4
-
-#define MAX_CATCH_RADIUS       10
-#define MIN_BUFFERS            4
-#define MIN_BUFSIZE            4
-#define MAX_BUFSIZE            128     /* Limit for Amiga */
-
-static int catchRadius = 0;
-static int numBufs = 4, bufSize = 32;
-#ifdef CONFIG_PPC
-static int numReadBufs = 4, readbufSize = 32;
-#endif
-
-MODULE_PARM(catchRadius, "i");
-MODULE_PARM(numBufs, "i");
-MODULE_PARM(bufSize, "i");
-MODULE_PARM(numReadBufs, "i");
-MODULE_PARM(readbufSize, "i");
-
-#define arraysize(x)   (sizeof(x)/sizeof(*(x)))
-#define min(x, y)      ((x) < (y) ? (x) : (y))
-#define le2be16(x)     (((x)<<8 & 0xff00) | ((x)>>8 & 0x00ff))
-#define le2be16dbl(x)  (((x)<<8 & 0xff00ff00) | ((x)>>8 & 0x00ff00ff))
-
-#define IOCTL_IN(arg, ret) \
-       do { int error = get_user(ret, (int *)(arg)); \
-               if (error) return error; \
-       } while (0)
-#define IOCTL_OUT(arg, ret)    ioctl_return((int *)(arg), ret)
-
-
-/*** Some low level helpers **************************************************/
-
-#ifdef HAS_8BIT_TABLES
-/* 8 bit mu-law */
-
-static char ulaw2dma8[] = {
-       -126,   -122,   -118,   -114,   -110,   -106,   -102,   -98,
-       -94,    -90,    -86,    -82,    -78,    -74,    -70,    -66,
-       -63,    -61,    -59,    -57,    -55,    -53,    -51,    -49,
-       -47,    -45,    -43,    -41,    -39,    -37,    -35,    -33,
-       -31,    -30,    -29,    -28,    -27,    -26,    -25,    -24,
-       -23,    -22,    -21,    -20,    -19,    -18,    -17,    -16,
-       -16,    -15,    -15,    -14,    -14,    -13,    -13,    -12,
-       -12,    -11,    -11,    -10,    -10,    -9,     -9,     -8,
-       -8,     -8,     -7,     -7,     -7,     -7,     -6,     -6,
-       -6,     -6,     -5,     -5,     -5,     -5,     -4,     -4,
-       -4,     -4,     -4,     -4,     -3,     -3,     -3,     -3,
-       -3,     -3,     -3,     -3,     -2,     -2,     -2,     -2,
-       -2,     -2,     -2,     -2,     -2,     -2,     -2,     -2,
-       -1,     -1,     -1,     -1,     -1,     -1,     -1,     -1,
-       -1,     -1,     -1,     -1,     -1,     -1,     -1,     -1,
-       -1,     -1,     -1,     -1,     -1,     -1,     -1,     0,
-       125,    121,    117,    113,    109,    105,    101,    97,
-       93,     89,     85,     81,     77,     73,     69,     65,
-       62,     60,     58,     56,     54,     52,     50,     48,
-       46,     44,     42,     40,     38,     36,     34,     32,
-       30,     29,     28,     27,     26,     25,     24,     23,
-       22,     21,     20,     19,     18,     17,     16,     15,
-       15,     14,     14,     13,     13,     12,     12,     11,
-       11,     10,     10,     9,      9,      8,      8,      7,
-       7,      7,      6,      6,      6,      6,      5,      5,
-       5,      5,      4,      4,      4,      4,      3,      3,
-       3,      3,      3,      3,      2,      2,      2,      2,
-       2,      2,      2,      2,      1,      1,      1,      1,
-       1,      1,      1,      1,      1,      1,      1,      1,
-       0,      0,      0,      0,      0,      0,      0,      0,
-       0,      0,      0,      0,      0,      0,      0,      0,
-       0,      0,      0,      0,      0,      0,      0,      0
-};
-
-/* 8 bit A-law */
-
-static char alaw2dma8[] = {
-       -22,    -21,    -24,    -23,    -18,    -17,    -20,    -19,
-       -30,    -29,    -32,    -31,    -26,    -25,    -28,    -27,
-       -11,    -11,    -12,    -12,    -9,     -9,     -10,    -10,
-       -15,    -15,    -16,    -16,    -13,    -13,    -14,    -14,
-       -86,    -82,    -94,    -90,    -70,    -66,    -78,    -74,
-       -118,   -114,   -126,   -122,   -102,   -98,    -110,   -106,
-       -43,    -41,    -47,    -45,    -35,    -33,    -39,    -37,
-       -59,    -57,    -63,    -61,    -51,    -49,    -55,    -53,
-       -2,     -2,     -2,     -2,     -2,     -2,     -2,     -2,
-       -2,     -2,     -2,     -2,     -2,     -2,     -2,     -2,
-       -1,     -1,     -1,     -1,     -1,     -1,     -1,     -1,
-       -1,     -1,     -1,     -1,     -1,     -1,     -1,     -1,
-       -6,     -6,     -6,     -6,     -5,     -5,     -5,     -5,
-       -8,     -8,     -8,     -8,     -7,     -7,     -7,     -7,
-       -3,     -3,     -3,     -3,     -3,     -3,     -3,     -3,
-       -4,     -4,     -4,     -4,     -4,     -4,     -4,     -4,
-       21,     20,     23,     22,     17,     16,     19,     18,
-       29,     28,     31,     30,     25,     24,     27,     26,
-       10,     10,     11,     11,     8,      8,      9,      9,
-       14,     14,     15,     15,     12,     12,     13,     13,
-       86,     82,     94,     90,     70,     66,     78,     74,
-       118,    114,    126,    122,    102,    98,     110,    106,
-       43,     41,     47,     45,     35,     33,     39,     37,
-       59,     57,     63,     61,     51,     49,     55,     53,
-       1,      1,      1,      1,      1,      1,      1,      1,
-       1,      1,      1,      1,      1,      1,      1,      1,
-       0,      0,      0,      0,      0,      0,      0,      0,
-       0,      0,      0,      0,      0,      0,      0,      0,
-       5,      5,      5,      5,      4,      4,      4,      4,
-       7,      7,      7,      7,      6,      6,      6,      6,
-       2,      2,      2,      2,      2,      2,      2,      2,
-       3,      3,      3,      3,      3,      3,      3,      3
-};
-#endif /* HAS_8BIT_TABLES */
-
-#ifdef HAS_16BIT_TABLES
-
-/* 16 bit mu-law */
-
-static short ulaw2dma16[] = {
-       -32124, -31100, -30076, -29052, -28028, -27004, -25980, -24956,
-       -23932, -22908, -21884, -20860, -19836, -18812, -17788, -16764,
-       -15996, -15484, -14972, -14460, -13948, -13436, -12924, -12412,
-       -11900, -11388, -10876, -10364, -9852,  -9340,  -8828,  -8316,
-       -7932,  -7676,  -7420,  -7164,  -6908,  -6652,  -6396,  -6140,
-       -5884,  -5628,  -5372,  -5116,  -4860,  -4604,  -4348,  -4092,
-       -3900,  -3772,  -3644,  -3516,  -3388,  -3260,  -3132,  -3004,
-       -2876,  -2748,  -2620,  -2492,  -2364,  -2236,  -2108,  -1980,
-       -1884,  -1820,  -1756,  -1692,  -1628,  -1564,  -1500,  -1436,
-       -1372,  -1308,  -1244,  -1180,  -1116,  -1052,  -988,   -924,
-       -876,   -844,   -812,   -780,   -748,   -716,   -684,   -652,
-       -620,   -588,   -556,   -524,   -492,   -460,   -428,   -396,
-       -372,   -356,   -340,   -324,   -308,   -292,   -276,   -260,
-       -244,   -228,   -212,   -196,   -180,   -164,   -148,   -132,
-       -120,   -112,   -104,   -96,    -88,    -80,    -72,    -64,
-       -56,    -48,    -40,    -32,    -24,    -16,    -8,     0,
-       32124,  31100,  30076,  29052,  28028,  27004,  25980,  24956,
-       23932,  22908,  21884,  20860,  19836,  18812,  17788,  16764,
-       15996,  15484,  14972,  14460,  13948,  13436,  12924,  12412,
-       11900,  11388,  10876,  10364,  9852,   9340,   8828,   8316,
-       7932,   7676,   7420,   7164,   6908,   6652,   6396,   6140,
-       5884,   5628,   5372,   5116,   4860,   4604,   4348,   4092,
-       3900,   3772,   3644,   3516,   3388,   3260,   3132,   3004,
-       2876,   2748,   2620,   2492,   2364,   2236,   2108,   1980,
-       1884,   1820,   1756,   1692,   1628,   1564,   1500,   1436,
-       1372,   1308,   1244,   1180,   1116,   1052,   988,    924,
-       876,    844,    812,    780,    748,    716,    684,    652,
-       620,    588,    556,    524,    492,    460,    428,    396,
-       372,    356,    340,    324,    308,    292,    276,    260,
-       244,    228,    212,    196,    180,    164,    148,    132,
-       120,    112,    104,    96,     88,     80,     72,     64,
-       56,     48,     40,     32,     24,     16,     8,      0,
-};
-
-/* 16 bit A-law */
-
-static short alaw2dma16[] = {
-       -5504,  -5248,  -6016,  -5760,  -4480,  -4224,  -4992,  -4736,
-       -7552,  -7296,  -8064,  -7808,  -6528,  -6272,  -7040,  -6784,
-       -2752,  -2624,  -3008,  -2880,  -2240,  -2112,  -2496,  -2368,
-       -3776,  -3648,  -4032,  -3904,  -3264,  -3136,  -3520,  -3392,
-       -22016, -20992, -24064, -23040, -17920, -16896, -19968, -18944,
-       -30208, -29184, -32256, -31232, -26112, -25088, -28160, -27136,
-       -11008, -10496, -12032, -11520, -8960,  -8448,  -9984,  -9472,
-       -15104, -14592, -16128, -15616, -13056, -12544, -14080, -13568,
-       -344,   -328,   -376,   -360,   -280,   -264,   -312,   -296,
-       -472,   -456,   -504,   -488,   -408,   -392,   -440,   -424,
-       -88,    -72,    -120,   -104,   -24,    -8,     -56,    -40,
-       -216,   -200,   -248,   -232,   -152,   -136,   -184,   -168,
-       -1376,  -1312,  -1504,  -1440,  -1120,  -1056,  -1248,  -1184,
-       -1888,  -1824,  -2016,  -1952,  -1632,  -1568,  -1760,  -1696,
-       -688,   -656,   -752,   -720,   -560,   -528,   -624,   -592,
-       -944,   -912,   -1008,  -976,   -816,   -784,   -880,   -848,
-       5504,   5248,   6016,   5760,   4480,   4224,   4992,   4736,
-       7552,   7296,   8064,   7808,   6528,   6272,   7040,   6784,
-       2752,   2624,   3008,   2880,   2240,   2112,   2496,   2368,
-       3776,   3648,   4032,   3904,   3264,   3136,   3520,   3392,
-       22016,  20992,  24064,  23040,  17920,  16896,  19968,  18944,
-       30208,  29184,  32256,  31232,  26112,  25088,  28160,  27136,
-       11008,  10496,  12032,  11520,  8960,   8448,   9984,   9472,
-       15104,  14592,  16128,  15616,  13056,  12544,  14080,  13568,
-       344,    328,    376,    360,    280,    264,    312,    296,
-       472,    456,    504,    488,    408,    392,    440,    424,
-       88,     72,     120,    104,    24,     8,      56,     40,
-       216,    200,    248,    232,    152,    136,    184,    168,
-       1376,   1312,   1504,   1440,   1120,   1056,   1248,   1184,
-       1888,   1824,   2016,   1952,   1632,   1568,   1760,   1696,
-       688,    656,    752,    720,    560,    528,    624,    592,
-       944,    912,    1008,   976,    816,    784,    880,    848,
-};
-#endif /* HAS_16BIT_TABLES */
-
-
-#ifdef HAS_14BIT_TABLES
-
-/* 14 bit mu-law (LSB) */
-
-static char alaw2dma14l[] = {
-       33,     33,     33,     33,     33,     33,     33,     33,
-       33,     33,     33,     33,     33,     33,     33,     33,
-       33,     33,     33,     33,     33,     33,     33,     33,
-       33,     33,     33,     33,     33,     33,     33,     33,
-       1,      1,      1,      1,      1,      1,      1,      1,
-       1,      1,      1,      1,      1,      1,      1,      1,
-       49,     17,     49,     17,     49,     17,     49,     17,
-       49,     17,     49,     17,     49,     17,     49,     17,
-       41,     57,     9,      25,     41,     57,     9,      25,
-       41,     57,     9,      25,     41,     57,     9,      25,
-       37,     45,     53,     61,     5,      13,     21,     29,
-       37,     45,     53,     61,     5,      13,     21,     29,
-       35,     39,     43,     47,     51,     55,     59,     63,
-       3,      7,      11,     15,     19,     23,     27,     31,
-       34,     36,     38,     40,     42,     44,     46,     48,
-       50,     52,     54,     56,     58,     60,     62,     0,
-       31,     31,     31,     31,     31,     31,     31,     31,
-       31,     31,     31,     31,     31,     31,     31,     31,
-       31,     31,     31,     31,     31,     31,     31,     31,
-       31,     31,     31,     31,     31,     31,     31,     31,
-       63,     63,     63,     63,     63,     63,     63,     63,
-       63,     63,     63,     63,     63,     63,     63,     63,
-       15,     47,     15,     47,     15,     47,     15,     47,
-       15,     47,     15,     47,     15,     47,     15,     47,
-       23,     7,      55,     39,     23,     7,      55,     39,
-       23,     7,      55,     39,     23,     7,      55,     39,
-       27,     19,     11,     3,      59,     51,     43,     35,
-       27,     19,     11,     3,      59,     51,     43,     35,
-       29,     25,     21,     17,     13,     9,      5,      1,
-       61,     57,     53,     49,     45,     41,     37,     33,
-       30,     28,     26,     24,     22,     20,     18,     16,
-       14,     12,     10,     8,      6,      4,      2,      0
-};
-
-/* 14 bit A-law (LSB) */
-
-static char alaw2dma14l[] = {
-       32,     32,     32,     32,     32,     32,     32,     32,
-       32,     32,     32,     32,     32,     32,     32,     32,
-       16,     48,     16,     48,     16,     48,     16,     48,
-       16,     48,     16,     48,     16,     48,     16,     48,
-       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,
-       42,     46,     34,     38,     58,     62,     50,     54,
-       10,     14,     2,      6,      26,     30,     18,     22,
-       42,     46,     34,     38,     58,     62,     50,     54,
-       10,     14,     2,      6,      26,     30,     18,     22,
-       40,     56,     8,      24,     40,     56,     8,      24,
-       40,     56,     8,      24,     40,     56,     8,      24,
-       20,     28,     4,      12,     52,     60,     36,     44,
-       20,     28,     4,      12,     52,     60,     36,     44,
-       32,     32,     32,     32,     32,     32,     32,     32,
-       32,     32,     32,     32,     32,     32,     32,     32,
-       48,     16,     48,     16,     48,     16,     48,     16,
-       48,     16,     48,     16,     48,     16,     48,     16,
-       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,
-       22,     18,     30,     26,     6,      2,      14,     10,
-       54,     50,     62,     58,     38,     34,     46,     42,
-       22,     18,     30,     26,     6,      2,      14,     10,
-       54,     50,     62,     58,     38,     34,     46,     42,
-       24,     8,      56,     40,     24,     8,      56,     40,
-       24,     8,      56,     40,     24,     8,      56,     40,
-       44,     36,     60,     52,     12,     4,      28,     20,
-       44,     36,     60,     52,     12,     4,      28,     20
-};
-#endif /* HAS_14BIT_TABLES */
-
-
-/*** Translations ************************************************************/
-
-
-#ifdef CONFIG_ATARI
-static ssize_t ata_ct_law(const u_char *userPtr, size_t userCount,
-                         u_char frame[], ssize_t *frameUsed,
-                         ssize_t frameLeft);
-static ssize_t ata_ct_s8(const u_char *userPtr, size_t userCount,
-                        u_char frame[], ssize_t *frameUsed,
-                        ssize_t frameLeft);
-static ssize_t ata_ct_u8(const u_char *userPtr, size_t userCount,
-                        u_char frame[], ssize_t *frameUsed,
-                        ssize_t frameLeft);
-static ssize_t ata_ct_s16be(const u_char *userPtr, size_t userCount,
-                           u_char frame[], ssize_t *frameUsed,
-                           ssize_t frameLeft);
-static ssize_t ata_ct_u16be(const u_char *userPtr, size_t userCount,
-                           u_char frame[], ssize_t *frameUsed,
-                           ssize_t frameLeft);
-static ssize_t ata_ct_s16le(const u_char *userPtr, size_t userCount,
-                           u_char frame[], ssize_t *frameUsed,
-                           ssize_t frameLeft);
-static ssize_t ata_ct_u16le(const u_char *userPtr, size_t userCount,
-                           u_char frame[], ssize_t *frameUsed,
-                           ssize_t frameLeft);
-static ssize_t ata_ctx_law(const u_char *userPtr, size_t userCount,
-                          u_char frame[], ssize_t *frameUsed,
-                          ssize_t frameLeft);
-static ssize_t ata_ctx_s8(const u_char *userPtr, size_t userCount,
-                         u_char frame[], ssize_t *frameUsed,
-                         ssize_t frameLeft);
-static ssize_t ata_ctx_u8(const u_char *userPtr, size_t userCount,
-                         u_char frame[], ssize_t *frameUsed,
-                         ssize_t frameLeft);
-static ssize_t ata_ctx_s16be(const u_char *userPtr, size_t userCount,
-                            u_char frame[], ssize_t *frameUsed,
-                            ssize_t frameLeft);
-static ssize_t ata_ctx_u16be(const u_char *userPtr, size_t userCount,
-                            u_char frame[], ssize_t *frameUsed,
-                            ssize_t frameLeft);
-static ssize_t ata_ctx_s16le(const u_char *userPtr, size_t userCount,
-                            u_char frame[], ssize_t *frameUsed,
-                            ssize_t frameLeft);
-static ssize_t ata_ctx_u16le(const u_char *userPtr, size_t userCount,
-                            u_char frame[], ssize_t *frameUsed,
-                            ssize_t frameLeft);
-#endif /* CONFIG_ATARI */
-
-#ifdef CONFIG_AMIGA
-static ssize_t ami_ct_law(const u_char *userPtr, size_t userCount,
-                         u_char frame[], ssize_t *frameUsed,
-                         ssize_t frameLeft);
-static ssize_t ami_ct_s8(const u_char *userPtr, size_t userCount,
-                        u_char frame[], ssize_t *frameUsed,
-                        ssize_t frameLeft);
-static ssize_t ami_ct_u8(const u_char *userPtr, size_t userCount,
-                        u_char frame[], ssize_t *frameUsed,
-                        ssize_t frameLeft);
-static ssize_t ami_ct_s16be(const u_char *userPtr, size_t userCount,
-                           u_char frame[], ssize_t *frameUsed,
-                           ssize_t frameLeft);
-static ssize_t ami_ct_u16be(const u_char *userPtr, size_t userCount,
-                           u_char frame[], ssize_t *frameUsed,
-                           ssize_t frameLeft);
-static ssize_t ami_ct_s16le(const u_char *userPtr, size_t userCount,
-                           u_char frame[], ssize_t *frameUsed,
-                           ssize_t frameLeft);
-static ssize_t ami_ct_u16le(const u_char *userPtr, size_t userCount,
-                           u_char frame[], ssize_t *frameUsed,
-                           ssize_t frameLeft);
-#endif /* CONFIG_AMIGA */
-
-#ifdef CONFIG_PPC
-static ssize_t pmac_ct_law(const u_char *userPtr, size_t userCount,
-                          u_char frame[], ssize_t *frameUsed,
-                          ssize_t frameLeft);
-static ssize_t pmac_ct_s8(const u_char *userPtr, size_t userCount,
-                         u_char frame[], ssize_t *frameUsed,
-                         ssize_t frameLeft);
-static ssize_t pmac_ct_u8(const u_char *userPtr, size_t userCount,
-                         u_char frame[], ssize_t *frameUsed,
-                         ssize_t frameLeft);
-static ssize_t pmac_ct_s16(const u_char *userPtr, size_t userCount,
-                          u_char frame[], ssize_t *frameUsed,
-                          ssize_t frameLeft);
-static ssize_t pmac_ct_u16(const u_char *userPtr, size_t userCount,
-                          u_char frame[], ssize_t *frameUsed,
-                          ssize_t frameLeft);
-static ssize_t pmac_ctx_law(const u_char *userPtr, size_t userCount,
-                           u_char frame[], ssize_t *frameUsed,
-                           ssize_t frameLeft);
-static ssize_t pmac_ctx_s8(const u_char *userPtr, size_t userCount,
-                          u_char frame[], ssize_t *frameUsed,
-                          ssize_t frameLeft);
-static ssize_t pmac_ctx_u8(const u_char *userPtr, size_t userCount,
-                          u_char frame[], ssize_t *frameUsed,
-                          ssize_t frameLeft);
-static ssize_t pmac_ctx_s16(const u_char *userPtr, size_t userCount,
-                           u_char frame[], ssize_t *frameUsed,
-                           ssize_t frameLeft);
-static ssize_t pmac_ctx_u16(const u_char *userPtr, size_t userCount,
-                           u_char frame[], ssize_t *frameUsed,
-                           ssize_t frameLeft);
-static ssize_t pmac_ct_s16_read(const u_char *userPtr, size_t userCount,
-                          u_char frame[], ssize_t *frameUsed,
-                          ssize_t frameLeft);
-static ssize_t pmac_ct_u16_read(const u_char *userPtr, size_t userCount,
-                          u_char frame[], ssize_t *frameUsed,
-                          ssize_t frameLeft);
-#endif /* CONFIG_PPC */
-
-/*** Machine definitions *****************************************************/
-
-
-typedef struct {
-       int type;
-       void *(*dma_alloc)(unsigned int, int);
-       void (*dma_free)(void *, unsigned int);
-       int (*irqinit)(void);
-#ifdef MODULE
-       void (*irqcleanup)(void);
-#endif /* MODULE */
-       void (*init)(void);
-       void (*silence)(void);
-       int (*setFormat)(int);
-       int (*setVolume)(int);
-       int (*setBass)(int);
-       int (*setTreble)(int);
-       int (*setGain)(int);
-       void (*play)(void);
-} MACHINE;
-
-
-/*** Low level stuff *********************************************************/
-
-
-typedef struct {
-       int format;             /* AFMT_* */
-       int stereo;             /* 0 = mono, 1 = stereo */
-       int size;               /* 8/16 bit*/
-       int speed;              /* speed */
-} SETTINGS;
-
-typedef struct {
-       ssize_t (*ct_ulaw)(const u_char *, size_t, u_char *, ssize_t *, ssize_t);
-       ssize_t (*ct_alaw)(const u_char *, size_t, u_char *, ssize_t *, ssize_t);
-       ssize_t (*ct_s8)(const u_char *, size_t, u_char *, ssize_t *, ssize_t);
-       ssize_t (*ct_u8)(const u_char *, size_t, u_char *, ssize_t *, ssize_t);
-       ssize_t (*ct_s16be)(const u_char *, size_t, u_char *, ssize_t *, ssize_t);
-       ssize_t (*ct_u16be)(const u_char *, size_t, u_char *, ssize_t *, ssize_t);
-       ssize_t (*ct_s16le)(const u_char *, size_t, u_char *, ssize_t *, ssize_t);
-       ssize_t (*ct_u16le)(const u_char *, size_t, u_char *, ssize_t *, ssize_t);
-} TRANS;
-
-struct sound_settings {
-       MACHINE mach;           /* machine dependent things */
-       SETTINGS hard;          /* hardware settings */
-       SETTINGS soft;          /* software settings */
-       SETTINGS dsp;           /* /dev/dsp default settings */
-       TRANS *trans;           /* supported translations */
-#if defined(CONFIG_PPC)
-       TRANS *read_trans;      /* supported translations */
-#endif
-       int volume_left;        /* volume (range is machine dependent) */
-       int volume_right;
-       int bass;               /* tone (range is machine dependent) */
-       int treble;
-       int gain;
-       int minDev;             /* minor device number currently open */
-#if defined(CONFIG_ATARI) || defined(CONFIG_PPC)
-       int bal;                /* balance factor for expanding (not volume!) */
-       u_long data;            /* data for expanding */
-#endif /* CONFIG_ATARI */
-};
-
-static struct sound_settings sound;
-
-
-#ifdef CONFIG_ATARI
-static void *AtaAlloc(unsigned int size, int flags);
-static void AtaFree(void *, unsigned int size);
-static int AtaIrqInit(void);
-#ifdef MODULE
-static void AtaIrqCleanUp(void);
-#endif /* MODULE */
-static int AtaSetBass(int bass);
-static int AtaSetTreble(int treble);
-static void TTSilence(void);
-static void TTInit(void);
-static int TTSetFormat(int format);
-static int TTSetVolume(int volume);
-static int TTSetGain(int gain);
-static void FalconSilence(void);
-static void FalconInit(void);
-static int FalconSetFormat(int format);
-static int FalconSetVolume(int volume);
-static void ata_sq_play_next_frame(int index);
-static void AtaPlay(void);
-static void ata_sq_interrupt(int irq, void *dummy, struct pt_regs *fp);
-#endif /* CONFIG_ATARI */
-
-#ifdef CONFIG_AMIGA
-static void *AmiAlloc(unsigned int size, int flags);
-static void AmiFree(void *, unsigned int);
-static int AmiIrqInit(void);
-#ifdef MODULE
-static void AmiIrqCleanUp(void);
-#endif /* MODULE */
-static void AmiSilence(void);
-static void AmiInit(void);
-static int AmiSetFormat(int format);
-static int AmiSetVolume(int volume);
-static int AmiSetTreble(int treble);
-static void ami_sq_play_next_frame(int index);
-static void AmiPlay(void);
-static void ami_sq_interrupt(int irq, void *dummy, struct pt_regs *fp);
-#endif /* CONFIG_AMIGA */
-
-#ifdef CONFIG_PPC
-static void *PMacAlloc(unsigned int size, int flags);
-static void PMacFree(void *ptr, unsigned int size);
-static int PMacIrqInit(void);
-#ifdef MODULE
-static void PMacIrqCleanup(void);
-#endif /* MODULE */
-static void PMacSilence(void);
-static void PMacInit(void);
-static void PMacPlay(void);
-static void PMacRecord(void);
-static int PMacSetFormat(int format);
-static int PMacSetVolume(int volume);
-static void pmac_awacs_tx_intr(int irq, void *devid, struct pt_regs *regs);
-static void pmac_awacs_rx_intr(int irq, void *devid, struct pt_regs *regs);
-static void pmac_awacs_intr(int irq, void *devid, struct pt_regs *regs);
-static void awacs_write(int val);
-static int awacs_get_volume(int reg, int lshift);
-static int awacs_volume_setter(int volume, int n, int mute, int lshift);
-static void awacs_mksound(unsigned int hz, unsigned int ticks);
-static void awacs_nosound(unsigned long xx);
-#endif /* CONFIG_PPC */
-
-/*** Mid level stuff *********************************************************/
-
-
-static void sound_silence(void);
-static void sound_init(void);
-static int sound_set_format(int format);
-static int sound_set_speed(int speed);
-static int sound_set_stereo(int stereo);
-static int sound_set_volume(int volume);
-#ifdef CONFIG_ATARI
-static int sound_set_bass(int bass);
-#endif /* CONFIG_ATARI */
-#if defined(CONFIG_ATARI) || defined(CONFIG_AMIGA)
-static int sound_set_treble(int treble);
-#endif /* CONFIG_ATARI || CONFIG_AMIGA */
-static ssize_t sound_copy_translate(const u_char *userPtr,
-                                   size_t userCount,
-                                   u_char frame[], ssize_t *frameUsed,
-                                   ssize_t frameLeft);
-#ifdef CONFIG_PPC
-static ssize_t sound_copy_translate_read(const u_char *userPtr,
-                                   size_t userCount,
-                                   u_char frame[], ssize_t *frameUsed,
-                                   ssize_t frameLeft);
-#endif
-
-
-/*
- * /dev/mixer abstraction
- */
-
-struct sound_mixer {
-    int busy;
-    int modify_counter;
-};
-
-static struct sound_mixer mixer;
-
-/*
- * Sound queue stuff, the heart of the driver
- */
-
-struct sound_queue {
-       int max_count, block_size;
-       char **buffers;
-       int max_active;
-
-       /* it shouldn't be necessary to declare any of these volatile */
-       int front, rear, count;
-       int rear_size;
-       /*
-        *      The use of the playing field depends on the hardware
-        *
-        *      Atari, PMac: The number of frames that are loaded/playing
-        *
-        *      Amiga: Bit 0 is set: a frame is loaded
-        *             Bit 1 is set: a frame is playing
-        */
-       int active;
-       wait_queue_head_t action_queue, open_queue, sync_queue;
-       int open_mode;
-       int busy, syncing;
-#ifdef CONFIG_ATARI
-       int ignore_int;         /* ++TeSche: used for Falcon */
-#endif /* CONFIG_ATARI */
-#ifdef CONFIG_AMIGA
-       int block_size_half, block_size_quarter;
-#endif /* CONFIG_AMIGA */
-};
-
-static struct sound_queue sq;
-#ifdef CONFIG_PPC
-static struct sound_queue read_sq;
-#endif
-
-#define sq_block_address(i)    (sq.buffers[i])
-#define SIGNAL_RECEIVED        (signal_pending(current))
-#define NON_BLOCKING(open_mode)        (open_mode & O_NONBLOCK)
-#define ONE_SECOND     HZ      /* in jiffies (100ths of a second) */
-#define NO_TIME_LIMIT  0xffffffff
-#define SLEEP(queue, time_limit) \
-       interruptible_sleep_on_timeout(&queue, (time_limit));
-#define WAKE_UP(queue) (wake_up_interruptible(&queue))
-
-/*
- * /dev/sndstat
- */
-
-struct sound_state {
-       int busy;
-       char buf[512];
-       int len, ptr;
-};
-
-static struct sound_state state;
-
-/*** Common stuff ********************************************************/
-
-static long long sound_lseek(struct file *file, long long offset, int orig);
-static inline int ioctl_return(int *addr, int value)
-{
-       if (value < 0)
-               return(value);
-
-       return put_user(value, addr);
-}
-
-
-/*** Config & Setup **********************************************************/
-
-
-void dmasound_init(void);
-static int dmasound_setup(char *str);
-
-
-/*** Translations ************************************************************/
-
-
-/* ++TeSche: radically changed for new expanding purposes...
- *
- * These two routines now deal with copying/expanding/translating the samples
- * from user space into our buffer at the right frequency. They take care about
- * how much data there's actually to read, how much buffer space there is and
- * to convert samples into the right frequency/encoding. They will only work on
- * complete samples so it may happen they leave some bytes in the input stream
- * if the user didn't write a multiple of the current sample size. They both
- * return the number of bytes they've used from both streams so you may detect
- * such a situation. Luckily all programs should be able to cope with that.
- *
- * I think I've optimized anything as far as one can do in plain C, all
- * variables should fit in registers and the loops are really short. There's
- * one loop for every possible situation. Writing a more generalized and thus
- * parameterized loop would only produce slower code. Feel free to optimize
- * this in assembler if you like. :)
- *
- * I think these routines belong here because they're not yet really hardware
- * independent, especially the fact that the Falcon can play 16bit samples
- * only in stereo is hardcoded in both of them!
- *
- * ++geert: split in even more functions (one per format)
- */
-
-#ifdef CONFIG_ATARI
-static ssize_t ata_ct_law(const u_char *userPtr, size_t userCount,
-                         u_char frame[], ssize_t *frameUsed,
-                         ssize_t frameLeft)
-{
-       char *table = sound.soft.format == AFMT_MU_LAW ? ulaw2dma8 : alaw2dma8;
-       ssize_t count, used;
-       u_char *p = &frame[*frameUsed];
-
-       count = min(userCount, frameLeft);
-       if (sound.soft.stereo)
-               count &= ~1;
-       used = count;
-       while (count > 0) {
-               u_char data;
-               if (get_user(data, userPtr++))
-                       return -EFAULT;
-               *p++ = table[data];
-               count--;
-       }
-       *frameUsed += used;
-       return used;
-}
-
-
-static ssize_t ata_ct_s8(const u_char *userPtr, size_t userCount,
-                        u_char frame[], ssize_t *frameUsed,
-                        ssize_t frameLeft)
-{
-       ssize_t count, used;
-       void *p = &frame[*frameUsed];
-
-       count = min(userCount, frameLeft);
-       if (sound.soft.stereo)
-               count &= ~1;
-       used = count;
-       if (copy_from_user(p, userPtr, count))
-               return -EFAULT;
-       *frameUsed += used;
-       return(used);
-}
-
-
-static ssize_t ata_ct_u8(const u_char *userPtr, size_t userCount,
-                        u_char frame[], ssize_t *frameUsed,
-                        ssize_t frameLeft)
-{
-       ssize_t count, used;
-
-       if (!sound.soft.stereo) {
-               u_char *p = &frame[*frameUsed];
-               count = min(userCount, frameLeft);
-               used = count;
-               while (count > 0) {
-                       u_char data;
-                       if (get_user(data, userPtr++))
-                               return -EFAULT;
-                       *p++ = data ^ 0x80;
-                       count--;
-               }
-       } else {
-               u_short *p = (u_short *)&frame[*frameUsed];
-               count = min(userCount, frameLeft)>>1;
-               used = count*2;
-               while (count > 0) {
-                       u_short data;
-                       if (get_user(data, ((u_short *)userPtr)++))
-                               return -EFAULT;
-                       *p++ = data ^ 0x8080;
-                       count--;
-               }
-       }
-       *frameUsed += used;
-       return(used);
-}
-
-
-static ssize_t ata_ct_s16be(const u_char *userPtr, size_t userCount,
-                           u_char frame[], ssize_t *frameUsed,
-                           ssize_t frameLeft)
-{
-       ssize_t count, used;
-
-       if (!sound.soft.stereo) {
-               u_short *p = (u_short *)&frame[*frameUsed];
-               count = min(userCount, frameLeft)>>1;
-               used = count*2;
-               while (count > 0) {
-                       u_short data;
-                       if (get_user(data, ((u_short *)userPtr)++))
-                               return -EFAULT;
-                       *p++ = data;
-                       *p++ = data;
-                       count--;
-               }
-               *frameUsed += used*2;
-       } else {
-               void *p = (u_short *)&frame[*frameUsed];
-               count = min(userCount, frameLeft) & ~3;
-               used = count;
-               if (copy_from_user(p, userPtr, count))
-                       return -EFAULT;
-               *frameUsed += used;
-       }
-       return(used);
-}
-
-
-static ssize_t ata_ct_u16be(const u_char *userPtr, size_t userCount,
-                           u_char frame[], ssize_t *frameUsed,
-                           ssize_t frameLeft)
-{
-       ssize_t count, used;
-
-       if (!sound.soft.stereo) {
-               u_short *p = (u_short *)&frame[*frameUsed];
-               count = min(userCount, frameLeft)>>1;
-               used = count*2;
-               while (count > 0) {
-                       u_short data;
-                       if (get_user(data, ((u_short *)userPtr)++))
-                               return -EFAULT;
-                       data ^= 0x8000;
-                       *p++ = data;
-                       *p++ = data;
-                       count--;
-               }
-               *frameUsed += used*2;
-       } else {
-               u_long *p = (u_long *)&frame[*frameUsed];
-               count = min(userCount, frameLeft)>>2;
-               used = count*4;
-               while (count > 0) {
-                       u_long data;
-                       if (get_user(data, ((u_int *)userPtr)++))
-                               return -EFAULT;
-                       *p++ = data ^ 0x80008000;
-                       count--;
-               }
-               *frameUsed += used;
-       }
-       return(used);
-}
-
-
-static ssize_t ata_ct_s16le(const u_char *userPtr, size_t userCount,
-                           u_char frame[], ssize_t *frameUsed,
-                           ssize_t frameLeft)
-{
-       ssize_t count, used;
-
-       count = frameLeft;
-       if (!sound.soft.stereo) {
-               u_short *p = (u_short *)&frame[*frameUsed];
-               count = min(userCount, frameLeft)>>1;
-               used = count*2;
-               while (count > 0) {
-                       u_short data;
-                       if (get_user(data, ((u_short *)userPtr)++))
-                               return -EFAULT;
-                       data = le2be16(data);
-                       *p++ = data;
-                       *p++ = data;
-                       count--;
-               }
-               *frameUsed += used*2;
-       } else {
-               u_long *p = (u_long *)&frame[*frameUsed];
-               count = min(userCount, frameLeft)>>2;
-               used = count*4;
-               while (count > 0) {
-                       u_long data;
-                       if (get_user(data, ((u_int *)userPtr)++))
-                               return -EFAULT;
-                       data = le2be16dbl(data);
-                       *p++ = data;
-                       count--;
-               }
-               *frameUsed += used;
-       }
-       return(used);
-}
-
-
-static ssize_t ata_ct_u16le(const u_char *userPtr, size_t userCount,
-                           u_char frame[], ssize_t *frameUsed,
-                           ssize_t frameLeft)
-{
-       ssize_t count, used;
-
-       count = frameLeft;
-       if (!sound.soft.stereo) {
-               u_short *p = (u_short *)&frame[*frameUsed];
-               count = min(userCount, frameLeft)>>1;
-               used = count*2;
-               while (count > 0) {
-                       u_short data;
-                       if (get_user(data, ((u_short *)userPtr)++))
-                               return -EFAULT;
-                       data = le2be16(data) ^ 0x8000;
-                       *p++ = data;
-                       *p++ = data;
-               }
-               *frameUsed += used*2;
-       } else {
-               u_long *p = (u_long *)&frame[*frameUsed];
-               count = min(userCount, frameLeft)>>2;
-               used = count;
-               while (count > 0) {
-                       u_long data;
-                       if (get_user(data, ((u_int *)userPtr)++))
-                               return -EFAULT;
-                       data = le2be16dbl(data) ^ 0x80008000;
-                       *p++ = data;
-                       count--;
-               }
-               *frameUsed += used;
-       }
-       return(used);
-}
-
-
-static ssize_t ata_ctx_law(const u_char *userPtr, size_t userCount,
-                          u_char frame[], ssize_t *frameUsed,
-                          ssize_t frameLeft)
-{
-       char *table = sound.soft.format == AFMT_MU_LAW ? ulaw2dma8 : alaw2dma8;
-       /* this should help gcc to stuff everything into registers */
-       long bal = sound.bal;
-       long hSpeed = sound.hard.speed, sSpeed = sound.soft.speed;
-       ssize_t used, usedf;
-
-       used = userCount;
-       usedf = frameLeft;
-       if (!sound.soft.stereo) {
-               u_char *p = &frame[*frameUsed];
-               u_char data = sound.data;
-               while (frameLeft) {
-                       u_char c;
-                       if (bal < 0) {
-                               if (!userCount)
-                                       break;
-                               if (get_user(c, userPtr++))
-                                       return -EFAULT;
-                               data = table[c];
-                               userCount--;
-                               bal += hSpeed;
-                       }
-                       *p++ = data;
-                       frameLeft--;
-                       bal -= sSpeed;
-               }
-               sound.data = data;
-       } else {
-               u_short *p = (u_short *)&frame[*frameUsed];
-               u_short data = sound.data;
-               while (frameLeft >= 2) {
-                       u_char c;
-                       if (bal < 0) {
-                               if (userCount < 2)
-                                       break;
-                               if (get_user(c, userPtr++))
-                                       return -EFAULT;
-                               data = table[c] << 8;
-                               if (get_user(c, userPtr++))
-                                       return -EFAULT;
-                               data |= table[c];
-                               userCount -= 2;
-                               bal += hSpeed;
-                       }
-                       *p++ = data;
-                       frameLeft -= 2;
-                       bal -= sSpeed;
-               }
-               sound.data = data;
-       }
-       sound.bal = bal;
-       used -= userCount;
-       *frameUsed += usedf-frameLeft;
-       return(used);
-}
-
-
-static ssize_t ata_ctx_s8(const u_char *userPtr, size_t userCount,
-                         u_char frame[], ssize_t *frameUsed,
-                         ssize_t frameLeft)
-{
-       /* this should help gcc to stuff everything into registers */
-       long bal = sound.bal;
-       long hSpeed = sound.hard.speed, sSpeed = sound.soft.speed;
-       ssize_t used, usedf;
-
-       used = userCount;
-       usedf = frameLeft;
-       if (!sound.soft.stereo) {
-               u_char *p = &frame[*frameUsed];
-               u_char data = sound.data;
-               while (frameLeft) {
-                       if (bal < 0) {
-                               if (!userCount)
-                                       break;
-                               if (get_user(data, userPtr++))
-                                       return -EFAULT;
-                               userCount--;
-                               bal += hSpeed;
-                       }
-                       *p++ = data;
-                       frameLeft--;
-                       bal -= sSpeed;
-               }
-               sound.data = data;
-       } else {
-               u_short *p = (u_short *)&frame[*frameUsed];
-               u_short data = sound.data;
-               while (frameLeft >= 2) {
-                       if (bal < 0) {
-                               if (userCount < 2)
-                                       break;
-                               if (get_user(data, ((u_short *)userPtr)++))
-                                       return -EFAULT;
-                               userCount -= 2;
-                               bal += hSpeed;
-                       }
-                       *p++ = data;
-                       frameLeft -= 2;
-                       bal -= sSpeed;
-               }
-               sound.data = data;
-       }
-       sound.bal = bal;
-       used -= userCount;
-       *frameUsed += usedf-frameLeft;
-       return(used);
-}
-
-
-static ssize_t ata_ctx_u8(const u_char *userPtr, size_t userCount,
-                         u_char frame[], ssize_t *frameUsed,
-                         ssize_t frameLeft)
-{
-       /* this should help gcc to stuff everything into registers */
-       long bal = sound.bal;
-       long hSpeed = sound.hard.speed, sSpeed = sound.soft.speed;
-       ssize_t used, usedf;
-
-       used = userCount;
-       usedf = frameLeft;
-       if (!sound.soft.stereo) {
-               u_char *p = &frame[*frameUsed];
-               u_char data = sound.data;
-               while (frameLeft) {
-                       if (bal < 0) {
-                               if (!userCount)
-                                       break;
-                               if (get_user(data, userPtr++))
-                                       return -EFAULT;
-                               data ^= 0x80;
-                               userCount--;
-                               bal += hSpeed;
-                       }
-                       *p++ = data;
-                       frameLeft--;
-                       bal -= sSpeed;
-               }
-               sound.data = data;
-       } else {
-               u_short *p = (u_short *)&frame[*frameUsed];
-               u_short data = sound.data;
-               while (frameLeft >= 2) {
-                       if (bal < 0) {
-                               if (userCount < 2)
-                                       break;
-                               if (get_user(data, ((u_short *)userPtr)++))
-                                       return -EFAULT;
-                               data ^= 0x8080;
-                               userCount -= 2;
-                               bal += hSpeed;
-                       }
-                       *p++ = data;
-                       frameLeft -= 2;
-                       bal -= sSpeed;
-               }
-               sound.data = data;
-       }
-       sound.bal = bal;
-       used -= userCount;
-       *frameUsed += usedf-frameLeft;
-       return(used);
-}
-
-
-static ssize_t ata_ctx_s16be(const u_char *userPtr, size_t userCount,
-                            u_char frame[], ssize_t *frameUsed,
-                            ssize_t frameLeft)
-{
-       /* this should help gcc to stuff everything into registers */
-       long bal = sound.bal;
-       long hSpeed = sound.hard.speed, sSpeed = sound.soft.speed;
-       ssize_t used, usedf;
-
-       used = userCount;
-       usedf = frameLeft;
-       if (!sound.soft.stereo) {
-               u_short *p = (u_short *)&frame[*frameUsed];
-               u_short data = sound.data;
-               while (frameLeft >= 4) {
-                       if (bal < 0) {
-                               if (userCount < 2)
-                                       break;
-                               if (get_user(data, ((u_short *)userPtr)++))
-                                       return -EFAULT;
-                               userCount -= 2;
-                               bal += hSpeed;
-                       }
-                       *p++ = data;
-                       *p++ = data;
-                       frameLeft -= 4;
-                       bal -= sSpeed;
-               }
-               sound.data = data;
-       } else {
-               u_long *p = (u_long *)&frame[*frameUsed];
-               u_long data = sound.data;
-               while (frameLeft >= 4) {
-                       if (bal < 0) {
-                               if (userCount < 4)
-                                       break;
-                               if (get_user(data, ((u_int *)userPtr)++))
-                                       return -EFAULT;
-                               userCount -= 4;
-                               bal += hSpeed;
-                       }
-                       *p++ = data;
-                       frameLeft -= 4;
-                       bal -= sSpeed;
-               }
-               sound.data = data;
-       }
-       sound.bal = bal;
-       used -= userCount;
-       *frameUsed += usedf-frameLeft;
-       return(used);
-}
-
-
-static ssize_t ata_ctx_u16be(const u_char *userPtr, size_t userCount,
-                            u_char frame[], ssize_t *frameUsed,
-                            ssize_t frameLeft)
-{
-       /* this should help gcc to stuff everything into registers */
-       long bal = sound.bal;
-       long hSpeed = sound.hard.speed, sSpeed = sound.soft.speed;
-       ssize_t used, usedf;
-
-       used = userCount;
-       usedf = frameLeft;
-       if (!sound.soft.stereo) {
-               u_short *p = (u_short *)&frame[*frameUsed];
-               u_short data = sound.data;
-               while (frameLeft >= 4) {
-                       if (bal < 0) {
-                               if (userCount < 2)
-                                       break;
-                               if (get_user(data, ((u_short *)userPtr)++))
-                                       return -EFAULT;
-                               data ^= 0x8000;
-                               userCount -= 2;
-                               bal += hSpeed;
-                       }
-                       *p++ = data;
-                       *p++ = data;
-                       frameLeft -= 4;
-                       bal -= sSpeed;
-               }
-               sound.data = data;
-       } else {
-               u_long *p = (u_long *)&frame[*frameUsed];
-               u_long data = sound.data;
-               while (frameLeft >= 4) {
-                       if (bal < 0) {
-                               if (userCount < 4)
-                                       break;
-                               if (get_user(data, ((u_int *)userPtr)++))
-                                       return -EFAULT;
-                               data ^= 0x80008000;
-                               userCount -= 4;
-                               bal += hSpeed;
-                       }
-                       *p++ = data;
-                       frameLeft -= 4;
-                       bal -= sSpeed;
-               }
-               sound.data = data;
-       }
-       sound.bal = bal;
-       used -= userCount;
-       *frameUsed += usedf-frameLeft;
-       return(used);
-}
-
-
-static ssize_t ata_ctx_s16le(const u_char *userPtr, size_t userCount,
-                            u_char frame[], ssize_t *frameUsed,
-                            ssize_t frameLeft)
-{
-       /* this should help gcc to stuff everything into registers */
-       long bal = sound.bal;
-       long hSpeed = sound.hard.speed, sSpeed = sound.soft.speed;
-       ssize_t used, usedf;
-
-       used = userCount;
-       usedf = frameLeft;
-       if (!sound.soft.stereo) {
-               u_short *p = (u_short *)&frame[*frameUsed];
-               u_short data = sound.data;
-               while (frameLeft >= 4) {
-                       if (bal < 0) {
-                               if (userCount < 2)
-                                       break;
-                               if (get_user(data, ((u_short *)userPtr)++))
-                                       return -EFAULT;
-                               data = le2be16(data);
-                               userCount -= 2;
-                               bal += hSpeed;
-                       }
-                       *p++ = data;
-                       *p++ = data;
-                       frameLeft -= 4;
-                       bal -= sSpeed;
-               }
-               sound.data = data;
-       } else {
-               u_long *p = (u_long *)&frame[*frameUsed];
-               u_long data = sound.data;
-               while (frameLeft >= 4) {
-                       if (bal < 0) {
-                               if (userCount < 4)
-                                       break;
-                               if (get_user(data, ((u_int *)userPtr)++))
-                                       return -EFAULT;
-                               data = le2be16dbl(data);
-                               userCount -= 4;
-                               bal += hSpeed;
-                       }
-                       *p++ = data;
-                       frameLeft -= 4;
-                       bal -= sSpeed;
-               }
-               sound.data = data;
-       }
-       sound.bal = bal;
-       used -= userCount;
-       *frameUsed += usedf-frameLeft;
-       return(used);
-}
-
-
-static ssize_t ata_ctx_u16le(const u_char *userPtr, size_t userCount,
-                            u_char frame[], ssize_t *frameUsed,
-                            ssize_t frameLeft)
-{
-       /* this should help gcc to stuff everything into registers */
-       long bal = sound.bal;
-       long hSpeed = sound.hard.speed, sSpeed = sound.soft.speed;
-       ssize_t used, usedf;
-
-       used = userCount;
-       usedf = frameLeft;
-       if (!sound.soft.stereo) {
-               u_short *p = (u_short *)&frame[*frameUsed];
-               u_short data = sound.data;
-               while (frameLeft >= 4) {
-                       if (bal < 0) {
-                               if (userCount < 2)
-                                       break;
-                               if (get_user(data, ((u_short *)userPtr)++))
-                                       return -EFAULT;
-                               data = le2be16(data) ^ 0x8000;
-                               userCount -= 2;
-                               bal += hSpeed;
-                       }
-                       *p++ = data;
-                       *p++ = data;
-                       frameLeft -= 4;
-                       bal -= sSpeed;
-               }
-               sound.data = data;
-       } else {
-               u_long *p = (u_long *)&frame[*frameUsed];
-               u_long data = sound.data;
-               while (frameLeft >= 4) {
-                       if (bal < 0) {
-                               if (userCount < 4)
-                                       break;
-                               if (get_user(data, ((u_int *)userPtr)++))
-                                       return -EFAULT;
-                               data = le2be16dbl(data) ^ 0x80008000;
-                               userCount -= 4;
-                               bal += hSpeed;
-                       }
-                       *p++ = data;
-                       frameLeft -= 4;
-                       bal -= sSpeed;
-               }
-               sound.data = data;
-       }
-       sound.bal = bal;
-       used -= userCount;
-       *frameUsed += usedf-frameLeft;
-       return(used);
-}
-#endif /* CONFIG_ATARI */
-
-
-#ifdef CONFIG_AMIGA
-static ssize_t ami_ct_law(const u_char *userPtr, size_t userCount,
-                         u_char frame[], ssize_t *frameUsed,
-                         ssize_t frameLeft)
-{
-       char *table = sound.soft.format == AFMT_MU_LAW ? ulaw2dma8 : alaw2dma8;
-       ssize_t count, used;
-
-       if (!sound.soft.stereo) {
-               u_char *p = &frame[*frameUsed];
-               count = min(userCount, frameLeft) & ~1;
-               used = count;
-               while (count > 0) {
-                       u_char data;
-                       if (get_user(data, userPtr++))
-                               return -EFAULT;
-                       *p++ = table[data];
-                       count--;
-               }
-       } else {
-               u_char *left = &frame[*frameUsed>>1];
-               u_char *right = left+sq.block_size_half;
-               count = min(userCount, frameLeft)>>1 & ~1;
-               used = count*2;
-               while (count > 0) {
-                       u_char data;
-                       if (get_user(data, userPtr++))
-                               return -EFAULT;
-                       *left++ = table[data];
-                       if (get_user(data, userPtr++))
-                               return -EFAULT;
-                       *right++ = table[data];
-                       count--;
-               }
-       }
-       *frameUsed += used;
-       return(used);
-}
-
-
-static ssize_t ami_ct_s8(const u_char *userPtr, size_t userCount,
-                        u_char frame[], ssize_t *frameUsed, ssize_t frameLeft)
-{
-       ssize_t count, used;
-
-       if (!sound.soft.stereo) {
-               void *p = &frame[*frameUsed];
-               count = min(userCount, frameLeft) & ~1;
-               used = count;
-               if (copy_from_user(p, userPtr, count))
-                       return -EFAULT;
-       } else {
-               u_char *left = &frame[*frameUsed>>1];
-               u_char *right = left+sq.block_size_half;
-               count = min(userCount, frameLeft)>>1 & ~1;
-               used = count*2;
-               while (count > 0) {
-                       if (get_user(*left++, userPtr++)
-                           || get_user(*right++, userPtr++))
-                               return -EFAULT;
-                       count--;
-               }
-       }
-       *frameUsed += used;
-       return(used);
-}
-
-
-static ssize_t ami_ct_u8(const u_char *userPtr, size_t userCount,
-                        u_char frame[], ssize_t *frameUsed, ssize_t frameLeft)
-{
-       ssize_t count, used;
-
-       if (!sound.soft.stereo) {
-               char *p = &frame[*frameUsed];
-               count = min(userCount, frameLeft) & ~1;
-               used = count;
-               while (count > 0) {
-                       u_char data;
-                       if (get_user(data, userPtr++))
-                               return -EFAULT;
-                       *p++ = data ^ 0x80;
-                       count--;
-               }
-       } else {
-               u_char *left = &frame[*frameUsed>>1];
-               u_char *right = left+sq.block_size_half;
-               count = min(userCount, frameLeft)>>1 & ~1;
-               used = count*2;
-               while (count > 0) {
-                       u_char data;
-                       if (get_user(data, userPtr++))
-                               return -EFAULT;
-                       *left++ = data ^ 0x80;
-                       if (get_user(data, userPtr++))
-                               return -EFAULT;
-                       *right++ = data ^ 0x80;
-                       count--;
-               }
-       }
-       *frameUsed += used;
-       return(used);
-}
-
-
-static ssize_t ami_ct_s16be(const u_char *userPtr, size_t userCount,
-                           u_char frame[], ssize_t *frameUsed,
-                           ssize_t frameLeft)
-{
-       ssize_t count, used;
-       u_short data;
-
-       if (!sound.soft.stereo) {
-               u_char *high = &frame[*frameUsed>>1];
-               u_char *low = high+sq.block_size_half;
-               count = min(userCount, frameLeft)>>1 & ~1;
-               used = count*2;
-               while (count > 0) {
-                       if (get_user(data, ((u_short *)userPtr)++))
-                               return -EFAULT;
-                       *high++ = data>>8;
-                       *low++ = (data>>2) & 0x3f;
-                       count--;
-               }
-       } else {
-               u_char *lefth = &frame[*frameUsed>>2];
-               u_char *leftl = lefth+sq.block_size_quarter;
-               u_char *righth = lefth+sq.block_size_half;
-               u_char *rightl = righth+sq.block_size_quarter;
-               count = min(userCount, frameLeft)>>2 & ~1;
-               used = count*4;
-               while (count > 0) {
-                       if (get_user(data, ((u_short *)userPtr)++))
-                               return -EFAULT;
-                       *lefth++ = data>>8;
-                       *leftl++ = (data>>2) & 0x3f;
-                       if (get_user(data, ((u_short *)userPtr)++))
-                               return -EFAULT;
-                       *righth++ = data>>8;
-                       *rightl++ = (data>>2) & 0x3f;
-                       count--;
-               }
-       }
-       *frameUsed += used;
-       return(used);
-}
-
-
-static ssize_t ami_ct_u16be(const u_char *userPtr, size_t userCount,
-                           u_char frame[], ssize_t *frameUsed,
-                           ssize_t frameLeft)
-{
-       ssize_t count, used;
-       u_short data;
-
-       if (!sound.soft.stereo) {
-               u_char *high = &frame[*frameUsed>>1];
-               u_char *low = high+sq.block_size_half;
-               count = min(userCount, frameLeft)>>1 & ~1;
-               used = count*2;
-               while (count > 0) {
-                       if (get_user(data, ((u_short *)userPtr)++))
-                               return -EFAULT;
-                       data ^= 0x8000;
-                       *high++ = data>>8;
-                       *low++ = (data>>2) & 0x3f;
-                       count--;
-               }
-       } else {
-               u_char *lefth = &frame[*frameUsed>>2];
-               u_char *leftl = lefth+sq.block_size_quarter;
-               u_char *righth = lefth+sq.block_size_half;
-               u_char *rightl = righth+sq.block_size_quarter;
-               count = min(userCount, frameLeft)>>2 & ~1;
-               used = count*4;
-               while (count > 0) {
-                       if (get_user(data, ((u_short *)userPtr)++))
-                               return -EFAULT;
-                       data ^= 0x8000;
-                       *lefth++ = data>>8;
-                       *leftl++ = (data>>2) & 0x3f;
-                       if (get_user(data, ((u_short *)userPtr)++))
-                               return -EFAULT;
-                       data ^= 0x8000;
-                       *righth++ = data>>8;
-                       *rightl++ = (data>>2) & 0x3f;
-                       count--;
-               }
-       }
-       *frameUsed += used;
-       return(used);
-}
-
-
-static ssize_t ami_ct_s16le(const u_char *userPtr, size_t userCount,
-                           u_char frame[], ssize_t *frameUsed,
-                           ssize_t frameLeft)
-{
-       ssize_t count, used;
-       u_short data;
-
-       if (!sound.soft.stereo) {
-               u_char *high = &frame[*frameUsed>>1];
-               u_char *low = high+sq.block_size_half;
-               count = min(userCount, frameLeft)>>1 & ~1;
-               used = count*2;
-               while (count > 0) {
-                       if (get_user(data, ((u_short *)userPtr)++))
-                               return -EFAULT;
-                       data = le2be16(data);
-                       *high++ = data>>8;
-                       *low++ = (data>>2) & 0x3f;
-                       count--;
-               }
-       } else {
-               u_char *lefth = &frame[*frameUsed>>2];
-               u_char *leftl = lefth+sq.block_size_quarter;
-               u_char *righth = lefth+sq.block_size_half;
-               u_char *rightl = righth+sq.block_size_quarter;
-               count = min(userCount, frameLeft)>>2 & ~1;
-               used = count*4;
-               while (count > 0) {
-                       if (get_user(data, ((u_short *)userPtr)++))
-                               return -EFAULT;
-                       data = le2be16(data);
-                       *lefth++ = data>>8;
-                       *leftl++ = (data>>2) & 0x3f;
-                       if (get_user(data, ((u_short *)userPtr)++))
-                               return -EFAULT;
-                       data = le2be16(data);
-                       *righth++ = data>>8;
-                       *rightl++ = (data>>2) & 0x3f;
-                       count--;
-               }
-       }
-       *frameUsed += used;
-       return(used);
-}
-
-
-static ssize_t ami_ct_u16le(const u_char *userPtr, size_t userCount,
-                           u_char frame[], ssize_t *frameUsed,
-                           ssize_t frameLeft)
-{
-       ssize_t count, used;
-       u_short data;
-
-       if (!sound.soft.stereo) {
-               u_char *high = &frame[*frameUsed>>1];
-               u_char *low = high+sq.block_size_half;
-               count = min(userCount, frameLeft)>>1 & ~1;
-               used = count*2;
-               while (count > 0) {
-                       if (get_user(data, ((u_short *)userPtr)++))
-                               return -EFAULT;
-                       data = le2be16(data) ^ 0x8000;
-                       *high++ = data>>8;
-                       *low++ = (data>>2) & 0x3f;
-                       count--;
-               }
-       } else {
-               u_char *lefth = &frame[*frameUsed>>2];
-               u_char *leftl = lefth+sq.block_size_quarter;
-               u_char *righth = lefth+sq.block_size_half;
-               u_char *rightl = righth+sq.block_size_quarter;
-               count = min(userCount, frameLeft)>>2 & ~1;
-               used = count*4;
-               while (count > 0) {
-                       if (get_user(data, ((u_short *)userPtr)++))
-                               return -EFAULT;
-                       data = le2be16(data) ^ 0x8000;
-                       *lefth++ = data>>8;
-                       *leftl++ = (data>>2) & 0x3f;
-                       if (get_user(data, ((u_short *)userPtr)++))
-                               return -EFAULT;
-                       data = le2be16(data) ^ 0x8000;
-                       *righth++ = data>>8;
-                       *rightl++ = (data>>2) & 0x3f;
-                       count--;
-               }
-       }
-       *frameUsed += used;
-       return(used);
-}
-#endif /* CONFIG_AMIGA */
-
-#ifdef CONFIG_PPC
-static ssize_t pmac_ct_law(const u_char *userPtr, size_t userCount,
-                          u_char frame[], ssize_t *frameUsed,
-                          ssize_t frameLeft)
-{
-       short *table = sound.soft.format == AFMT_MU_LAW ? ulaw2dma16: alaw2dma16;
-       ssize_t count, used;
-       short *p = (short *) &frame[*frameUsed];
-       int val, stereo = sound.soft.stereo;
-
-       frameLeft >>= 2;
-       if (stereo)
-               userCount >>= 1;
-       used = count = min(userCount, frameLeft);
-       while (count > 0) {
-               u_char data;
-               if (get_user(data, userPtr++))
-                       return -EFAULT;
-               val = table[data];
-               *p++ = val;
-               if (stereo) {
-                       if (get_user(data, userPtr++))
-                               return -EFAULT;
-                       val = table[data];
-               }
-               *p++ = val;
-               count--;
-       }
-       *frameUsed += used * 4;
-       return stereo? used * 2: used;
-}
-
-
-static ssize_t pmac_ct_s8(const u_char *userPtr, size_t userCount,
-                         u_char frame[], ssize_t *frameUsed,
-                         ssize_t frameLeft)
-{
-       ssize_t count, used;
-       short *p = (short *) &frame[*frameUsed];
-       int val, stereo = sound.soft.stereo;
-
-       frameLeft >>= 2;
-       if (stereo)
-               userCount >>= 1;
-       used = count = min(userCount, frameLeft);
-       while (count > 0) {
-               u_char data;
-               if (get_user(data, userPtr++))
-                       return -EFAULT;
-               val = data << 8;
-               *p++ = val;
-               if (stereo) {
-                       if (get_user(data, userPtr++))
-                               return -EFAULT;
-                       val = data << 8;
-               }
-               *p++ = val;
-               count--;
-       }
-       *frameUsed += used * 4;
-       return stereo? used * 2: used;
-}
-
-
-static ssize_t pmac_ct_u8(const u_char *userPtr, size_t userCount,
-                         u_char frame[], ssize_t *frameUsed,
-                         ssize_t frameLeft)
-{
-       ssize_t count, used;
-       short *p = (short *) &frame[*frameUsed];
-       int val, stereo = sound.soft.stereo;
-
-       frameLeft >>= 2;
-       if (stereo)
-               userCount >>= 1;
-       used = count = min(userCount, frameLeft);
-       while (count > 0) {
-               u_char data;
-               if (get_user(data, userPtr++))
-                       return -EFAULT;
-               val = (data ^ 0x80) << 8;
-               *p++ = val;
-               if (stereo) {
-                       if (get_user(data, userPtr++))
-                               return -EFAULT;
-                       val = (data ^ 0x80) << 8;
-               }
-               *p++ = val;
-               count--;
-       }
-       *frameUsed += used * 4;
-       return stereo? used * 2: used;
-}
-
-
-static ssize_t pmac_ct_s16(const u_char *userPtr, size_t userCount,
-                          u_char frame[], ssize_t *frameUsed,
-                          ssize_t frameLeft)
-{
-       ssize_t count, used;
-       int stereo = sound.soft.stereo;
-       short *fp = (short *) &frame[*frameUsed];
-
-       frameLeft >>= 2;
-       userCount >>= (stereo? 2: 1);
-       used = count = min(userCount, frameLeft);
-       if (!stereo) {
-               short *up = (short *) userPtr;
-               while (count > 0) {
-                       short data;
-                       if (get_user(data, up++))
-                               return -EFAULT;
-                       *fp++ = data;
-                       *fp++ = data;
-                       count--;
-               }
-       } else {
-               if (copy_from_user(fp, userPtr, count * 4))
-                       return -EFAULT;
-       }
-       *frameUsed += used * 4;
-       return stereo? used * 4: used * 2;
-}
-
-static ssize_t pmac_ct_u16(const u_char *userPtr, size_t userCount,
-                          u_char frame[], ssize_t *frameUsed,
-                          ssize_t frameLeft)
-{
-       ssize_t count, used;
-       int mask = (sound.soft.format == AFMT_U16_LE? 0x0080: 0x8000);
-       int stereo = sound.soft.stereo;
-       short *fp = (short *) &frame[*frameUsed];
-       short *up = (short *) userPtr;
-
-       frameLeft >>= 2;
-       userCount >>= (stereo? 2: 1);
-       used = count = min(userCount, frameLeft);
-       while (count > 0) {
-               int data;
-               if (get_user(data, up++))
-                       return -EFAULT;
-               data ^= mask;
-               *fp++ = data;
-               if (stereo) {
-                       if (get_user(data, up++))
-                               return -EFAULT;
-                       data ^= mask;
-               }
-               *fp++ = data;
-               count--;
-       }
-       *frameUsed += used * 4;
-       return stereo? used * 4: used * 2;
-}
-
-
-static ssize_t pmac_ctx_law(const u_char *userPtr, size_t userCount,
-                           u_char frame[], ssize_t *frameUsed,
-                           ssize_t frameLeft)
-{
-       unsigned short *table = (unsigned short *)
-               (sound.soft.format == AFMT_MU_LAW ? ulaw2dma16: alaw2dma16);
-       unsigned int data = sound.data;
-       unsigned int *p = (unsigned int *) &frame[*frameUsed];
-       int bal = sound.bal;
-       int hSpeed = sound.hard.speed, sSpeed = sound.soft.speed;
-       int utotal, ftotal;
-       int stereo = sound.soft.stereo;
-       frameLeft >>= 2;
-       if (stereo)
-               userCount >>= 1;
-       ftotal = frameLeft;
-       utotal = userCount;
-       while (frameLeft) {
-               u_char c;
-               if (bal < 0) {
-                       if (userCount == 0)
-                               break;
-                       if (get_user(c, userPtr++))
-                               return -EFAULT;
-                       data = table[c];
-                       if (stereo) {
-                               if (get_user(c, userPtr++))
-                                       return -EFAULT;
-                               data = (data << 16) + table[c];
-                       } else
-                               data = (data << 16) + data;
-                       userCount--;
-                       bal += hSpeed;
-               }
-               *p++ = data;
-               frameLeft--;
-               bal -= sSpeed;
-       }
-       sound.bal = bal;
-       sound.data = data;
-       *frameUsed += (ftotal - frameLeft) * 4;
-       utotal -= userCount;
-       return stereo? utotal * 2: utotal;
-}
-
-
-static ssize_t pmac_ctx_s8(const u_char *userPtr, size_t userCount,
-                          u_char frame[], ssize_t *frameUsed,
-                          ssize_t frameLeft)
-{
-       unsigned int *p = (unsigned int *) &frame[*frameUsed];
-       unsigned int data = sound.data;
-       int bal = sound.bal;
-       int hSpeed = sound.hard.speed, sSpeed = sound.soft.speed;
-       int stereo = sound.soft.stereo;
-       int utotal, ftotal;
-
-       frameLeft >>= 2;
-       if (stereo)
-               userCount >>= 1;
-       ftotal = frameLeft;
-       utotal = userCount;
-       while (frameLeft) {
-               u_char c;
-               if (bal < 0) {
-                       if (userCount == 0)
-                               break;
-                       if (get_user(c, userPtr++))
-                               return -EFAULT;
-                       data = c << 8;
-                       if (stereo) {
-                               if (get_user(c, userPtr++))
-                                       return -EFAULT;
-                               data = (data << 16) + (c << 8);
-                       } else
-                               data = (data << 16) + data;
-                       userCount--;
-                       bal += hSpeed;
-               }
-               *p++ = data;
-               frameLeft--;
-               bal -= sSpeed;
-       }
-       sound.bal = bal;
-       sound.data = data;
-       *frameUsed += (ftotal - frameLeft) * 4;
-       utotal -= userCount;
-       return stereo? utotal * 2: utotal;
-}
-
-
-static ssize_t pmac_ctx_u8(const u_char *userPtr, size_t userCount,
-                          u_char frame[], ssize_t *frameUsed,
-                          ssize_t frameLeft)
-{
-       unsigned int *p = (unsigned int *) &frame[*frameUsed];
-       unsigned int data = sound.data;
-       int bal = sound.bal;
-       int hSpeed = sound.hard.speed, sSpeed = sound.soft.speed;
-       int stereo = sound.soft.stereo;
-       int utotal, ftotal;
-
-       frameLeft >>= 2;
-       if (stereo)
-               userCount >>= 1;
-       ftotal = frameLeft;
-       utotal = userCount;
-       while (frameLeft) {
-               u_char c;
-               if (bal < 0) {
-                       if (userCount == 0)
-                               break;
-                       if (get_user(c, userPtr++))
-                               return -EFAULT;
-                       data = (c ^ 0x80) << 8;
-                       if (stereo) {
-                               if (get_user(c, userPtr++))
-                                       return -EFAULT;
-                               data = (data << 16) + ((c ^ 0x80) << 8);
-                       } else
-                               data = (data << 16) + data;
-                       userCount--;
-                       bal += hSpeed;
-               }
-               *p++ = data;
-               frameLeft--;
-               bal -= sSpeed;
-       }
-       sound.bal = bal;
-       sound.data = data;
-       *frameUsed += (ftotal - frameLeft) * 4;
-       utotal -= userCount;
-       return stereo? utotal * 2: utotal;
-}
-
-
-static ssize_t pmac_ctx_s16(const u_char *userPtr, size_t userCount,
-                           u_char frame[], ssize_t *frameUsed,
-                           ssize_t frameLeft)
-{
-       unsigned int *p = (unsigned int *) &frame[*frameUsed];
-       unsigned int data = sound.data;
-       unsigned short *up = (unsigned short *) userPtr;
-       int bal = sound.bal;
-       int hSpeed = sound.hard.speed, sSpeed = sound.soft.speed;
-       int stereo = sound.soft.stereo;
-       int utotal, ftotal;
-
-       frameLeft >>= 2;
-       userCount >>= (stereo? 2: 1);
-       ftotal = frameLeft;
-       utotal = userCount;
-       while (frameLeft) {
-               unsigned short c;
-               if (bal < 0) {
-                       if (userCount == 0)
-                               break;
-                       if (get_user(data, up++))
-                               return -EFAULT;
-                       if (stereo) {
-                               if (get_user(c, up++))
-                                       return -EFAULT;
-                               data = (data << 16) + c;
-                       } else
-                               data = (data << 16) + data;
-                       userCount--;
-                       bal += hSpeed;
-               }
-               *p++ = data;
-               frameLeft--;
-               bal -= sSpeed;
-       }
-       sound.bal = bal;
-       sound.data = data;
-       *frameUsed += (ftotal - frameLeft) * 4;
-       utotal -= userCount;
-       return stereo? utotal * 4: utotal * 2;
-}
-
-
-static ssize_t pmac_ctx_u16(const u_char *userPtr, size_t userCount,
-                           u_char frame[], ssize_t *frameUsed,
-                           ssize_t frameLeft)
-{
-       int mask = (sound.soft.format == AFMT_U16_LE? 0x0080: 0x8000);
-       unsigned int *p = (unsigned int *) &frame[*frameUsed];
-       unsigned int data = sound.data;
-       unsigned short *up = (unsigned short *) userPtr;
-       int bal = sound.bal;
-       int hSpeed = sound.hard.speed, sSpeed = sound.soft.speed;
-       int stereo = sound.soft.stereo;
-       int utotal, ftotal;
-
-       frameLeft >>= 2;
-       userCount >>= (stereo? 2: 1);
-       ftotal = frameLeft;
-       utotal = userCount;
-       while (frameLeft) {
-               unsigned short c;
-               if (bal < 0) {
-                       if (userCount == 0)
-                               break;
-                       if (get_user(data, up++))
-                               return -EFAULT;
-                       data ^= mask;
-                       if (stereo) {
-                               if (get_user(c, up++))
-                                       return -EFAULT;
-                               data = (data << 16) + (c ^ mask);
-                       } else
-                               data = (data << 16) + data;
-                       userCount--;
-                       bal += hSpeed;
-               }
-               *p++ = data;
-               frameLeft--;
-               bal -= sSpeed;
-       }
-       sound.bal = bal;
-       sound.data = data;
-       *frameUsed += (ftotal - frameLeft) * 4;
-       utotal -= userCount;
-       return stereo? utotal * 4: utotal * 2;
-}
-
-static ssize_t pmac_ct_s8_read(const u_char *userPtr, size_t userCount,
-                         u_char frame[], ssize_t *frameUsed,
-                         ssize_t frameLeft)
-{
-       ssize_t count, used;
-       short *p = (short *) &frame[*frameUsed];
-       int val, stereo = sound.soft.stereo;
-
-       frameLeft >>= 2;
-       if (stereo)
-               userCount >>= 1;
-       used = count = min(userCount, frameLeft);
-       while (count > 0) {
-               u_char data;
-
-               val = *p++;
-               data = val >> 8;
-               if (put_user(data, (u_char *)userPtr++))
-                       return -EFAULT;
-               if (stereo) {
-                       val = *p;
-                       data = val >> 8;
-                       if (put_user(data, (u_char *)userPtr++))
-                               return -EFAULT;
-               }
-               p++;
-               count--;
-       }
-       *frameUsed += used * 4;
-       return stereo? used * 2: used;
-}
-
-
-static ssize_t pmac_ct_u8_read(const u_char *userPtr, size_t userCount,
-                         u_char frame[], ssize_t *frameUsed,
-                         ssize_t frameLeft)
-{
-       ssize_t count, used;
-       short *p = (short *) &frame[*frameUsed];
-       int val, stereo = sound.soft.stereo;
-
-       frameLeft >>= 2;
-       if (stereo)
-               userCount >>= 1;
-       used = count = min(userCount, frameLeft);
-       while (count > 0) {
-               u_char data;
-
-               val = *p++;
-               data = (val >> 8) ^ 0x80;
-               if (put_user(data, (u_char *)userPtr++))
-                       return -EFAULT;
-               if (stereo) {
-                       val = *p;
-                       data = (val >> 8) ^ 0x80;
-                       if (put_user(data, (u_char *)userPtr++))
-                               return -EFAULT;
-               }
-               p++;
-               count--;
-       }
-       *frameUsed += used * 4;
-       return stereo? used * 2: used;
-}
-
-
-static ssize_t pmac_ct_s16_read(const u_char *userPtr, size_t userCount,
-                          u_char frame[], ssize_t *frameUsed,
-                          ssize_t frameLeft)
-{
-       ssize_t count, used;
-       int stereo = sound.soft.stereo;
-       short *fp = (short *) &frame[*frameUsed];
-
-       frameLeft >>= 2;
-       userCount >>= (stereo? 2: 1);
-       used = count = min(userCount, frameLeft);
-       if (!stereo) {
-               short *up = (short *) userPtr;
-               while (count > 0) {
-                       short data;
-                       data = *fp;
-                       if (put_user(data, up++))
-                               return -EFAULT;
-                       fp+=2;
-                       count--;
-               }
-       } else {
-               if (copy_to_user((u_char *)userPtr, fp, count * 4))
-                       return -EFAULT;
-       }
-       *frameUsed += used * 4;
-       return stereo? used * 4: used * 2;
-}
-
-static ssize_t pmac_ct_u16_read(const u_char *userPtr, size_t userCount,
-                          u_char frame[], ssize_t *frameUsed,
-                          ssize_t frameLeft)
-{
-       ssize_t count, used;
-       int mask = (sound.soft.format == AFMT_U16_LE? 0x0080: 0x8000);
-       int stereo = sound.soft.stereo;
-       short *fp = (short *) &frame[*frameUsed];
-       short *up = (short *) userPtr;
-
-       frameLeft >>= 2;
-       userCount >>= (stereo? 2: 1);
-       used = count = min(userCount, frameLeft);
-       while (count > 0) {
-               int data;
-
-               data = *fp++;
-               data ^= mask;
-               if (put_user(data, up++))
-                       return -EFAULT;
-               if (stereo) {
-                       data = *fp;
-                       data ^= mask;
-                       if (put_user(data, up++))
-                               return -EFAULT;
-               }
-               fp++;
-               count--;
-       }
-       *frameUsed += used * 4;
-       return stereo? used * 4: used * 2;
-}
-
-
-#endif /* CONFIG_PPC */
-
-
-#ifdef CONFIG_ATARI
-static TRANS transTTNormal = {
-       ata_ct_law, ata_ct_law, ata_ct_s8, ata_ct_u8, NULL, NULL, NULL, NULL
-};
-
-static TRANS transTTExpanding = {
-       ata_ctx_law, ata_ctx_law, ata_ctx_s8, ata_ctx_u8, NULL, NULL, NULL, NULL
-};
-
-static TRANS transFalconNormal = {
-       ata_ct_law, ata_ct_law, ata_ct_s8, ata_ct_u8,
-       ata_ct_s16be, ata_ct_u16be, ata_ct_s16le, ata_ct_u16le
-};
-
-static TRANS transFalconExpanding = {
-       ata_ctx_law, ata_ctx_law, ata_ctx_s8, ata_ctx_u8,
-       ata_ctx_s16be, ata_ctx_u16be, ata_ctx_s16le, ata_ctx_u16le
-};
-#endif /* CONFIG_ATARI */
-
-#ifdef CONFIG_AMIGA
-static TRANS transAmiga = {
-       ami_ct_law, ami_ct_law, ami_ct_s8, ami_ct_u8,
-       ami_ct_s16be, ami_ct_u16be, ami_ct_s16le, ami_ct_u16le
-};
-#endif /* CONFIG_AMIGA */
-
-#ifdef CONFIG_PPC
-static TRANS transAwacsNormal = {
-       pmac_ct_law, pmac_ct_law, pmac_ct_s8, pmac_ct_u8,
-       pmac_ct_s16, pmac_ct_u16, pmac_ct_s16, pmac_ct_u16
-};
-
-static TRANS transAwacsExpand = {
-       pmac_ctx_law, pmac_ctx_law, pmac_ctx_s8, pmac_ctx_u8,
-       pmac_ctx_s16, pmac_ctx_u16, pmac_ctx_s16, pmac_ctx_u16
-};
-
-static TRANS transAwacsNormalRead = {
-       NULL, NULL, pmac_ct_s8_read, pmac_ct_u8_read,
-       pmac_ct_s16_read, pmac_ct_u16_read, pmac_ct_s16_read, pmac_ct_u16_read
-};
-#endif /* CONFIG_PPC */
-
-/*** Low level stuff *********************************************************/
-
-
-#ifdef CONFIG_ATARI
-
-/*
- * Atari (TT/Falcon)
- */
-
-static void *AtaAlloc(unsigned int size, int flags)
-{
-       return( atari_stram_alloc( size, NULL, "dmasound" ));
-}
-
-static void AtaFree(void *obj, unsigned int size)
-{
-       atari_stram_free( obj );
-}
-
-static int __init AtaIrqInit(void)
-{
-       /* Set up timer A. Timer A
-          will receive a signal upon end of playing from the sound
-          hardware. Furthermore Timer A is able to count events
-          and will cause an interrupt after a programmed number
-          of events. So all we need to keep the music playing is
-          to provide the sound hardware with new data upon
-          an interrupt from timer A. */
-       mfp.tim_ct_a = 0;       /* ++roman: Stop timer before programming! */
-       mfp.tim_dt_a = 1;       /* Cause interrupt after first event. */
-       mfp.tim_ct_a = 8;       /* Turn on event counting. */
-       /* Register interrupt handler. */
-       request_irq(IRQ_MFP_TIMA, ata_sq_interrupt, IRQ_TYPE_SLOW,
-                   "DMA sound", ata_sq_interrupt);
-       mfp.int_en_a |= 0x20;   /* Turn interrupt on. */
-       mfp.int_mk_a |= 0x20;
-       return(1);
-}
-
-#ifdef MODULE
-static void AtaIrqCleanUp(void)
-{
-       mfp.tim_ct_a = 0;       /* stop timer */
-       mfp.int_en_a &= ~0x20;  /* turn interrupt off */
-       free_irq(IRQ_MFP_TIMA, ata_sq_interrupt);
-}
-#endif /* MODULE */
-
-
-#define TONE_VOXWARE_TO_DB(v) \
-       (((v) < 0) ? -12 : ((v) > 100) ? 12 : ((v) - 50) * 6 / 25)
-#define TONE_DB_TO_VOXWARE(v) (((v) * 25 + ((v) > 0 ? 5 : -5)) / 6 + 50)
-
-
-static int AtaSetBass(int bass)
-{
-       sound.bass = TONE_VOXWARE_TO_DB(bass);
-       atari_microwire_cmd(MW_LM1992_BASS(sound.bass));
-       return(TONE_DB_TO_VOXWARE(sound.bass));
-}
-
-
-static int AtaSetTreble(int treble)
-{
-       sound.treble = TONE_VOXWARE_TO_DB(treble);
-       atari_microwire_cmd(MW_LM1992_TREBLE(sound.treble));
-       return(TONE_DB_TO_VOXWARE(sound.treble));
-}
-
-
-
-/*
- * TT
- */
-
-
-static void TTSilence(void)
-{
-       tt_dmasnd.ctrl = DMASND_CTRL_OFF;
-       atari_microwire_cmd(MW_LM1992_PSG_HIGH); /* mix in PSG signal 1:1 */
-}
-
-
-static void TTInit(void)
-{
-       int mode, i, idx;
-       const int freq[4] = {50066, 25033, 12517, 6258};
-
-       /* search a frequency that fits into the allowed error range */
-
-       idx = -1;
-       for (i = 0; i < arraysize(freq); i++)
-               /* this isn't as much useful for a TT than for a Falcon, but
-                * then it doesn't hurt very much to implement it for a TT too.
-                */
-               if ((100 * abs(sound.soft.speed - freq[i]) / freq[i]) < catchRadius)
-                       idx = i;
-       if (idx > -1) {
-               sound.soft.speed = freq[idx];
-               sound.trans = &transTTNormal;
-       } else
-               sound.trans = &transTTExpanding;
-
-       TTSilence();
-       sound.hard = sound.soft;
-
-       if (sound.hard.speed > 50066) {
-               /* we would need to squeeze the sound, but we won't do that */
-               sound.hard.speed = 50066;
-               mode = DMASND_MODE_50KHZ;
-               sound.trans = &transTTNormal;
-       } else if (sound.hard.speed > 25033) {
-               sound.hard.speed = 50066;
-               mode = DMASND_MODE_50KHZ;
-       } else if (sound.hard.speed > 12517) {
-               sound.hard.speed = 25033;
-               mode = DMASND_MODE_25KHZ;
-       } else if (sound.hard.speed > 6258) {
-               sound.hard.speed = 12517;
-               mode = DMASND_MODE_12KHZ;
-       } else {
-               sound.hard.speed = 6258;
-               mode = DMASND_MODE_6KHZ;
-       }
-
-       tt_dmasnd.mode = (sound.hard.stereo ?
-                         DMASND_MODE_STEREO : DMASND_MODE_MONO) |
-               DMASND_MODE_8BIT | mode;
-
-       sound.bal = -sound.soft.speed;
-}
-
-
-static int TTSetFormat(int format)
-{
-       /* TT sound DMA supports only 8bit modes */
-
-       switch (format) {
-       case AFMT_QUERY:
-               return(sound.soft.format);
-       case AFMT_MU_LAW:
-       case AFMT_A_LAW:
-       case AFMT_S8:
-       case AFMT_U8:
-               break;
-       default:
-               format = AFMT_S8;
-       }
-
-       sound.soft.format = format;
-       sound.soft.size = 8;
-       if (sound.minDev == SND_DEV_DSP) {
-               sound.dsp.format = format;
-               sound.dsp.size = 8;
-       }
-       TTInit();
-
-       return(format);
-}
-
-
-#define VOLUME_VOXWARE_TO_DB(v) \
-       (((v) < 0) ? -40 : ((v) > 100) ? 0 : ((v) * 2) / 5 - 40)
-#define VOLUME_DB_TO_VOXWARE(v) ((((v) + 40) * 5 + 1) / 2)
-
-
-static int TTSetVolume(int volume)
-{
-       sound.volume_left = VOLUME_VOXWARE_TO_DB(volume & 0xff);
-       atari_microwire_cmd(MW_LM1992_BALLEFT(sound.volume_left));
-       sound.volume_right = VOLUME_VOXWARE_TO_DB((volume & 0xff00) >> 8);
-       atari_microwire_cmd(MW_LM1992_BALRIGHT(sound.volume_right));
-       return(VOLUME_DB_TO_VOXWARE(sound.volume_left) |
-              (VOLUME_DB_TO_VOXWARE(sound.volume_right) << 8));
-}
-
-
-#define GAIN_VOXWARE_TO_DB(v) \
-       (((v) < 0) ? -80 : ((v) > 100) ? 0 : ((v) * 4) / 5 - 80)
-#define GAIN_DB_TO_VOXWARE(v) ((((v) + 80) * 5 + 1) / 4)
-
-static int TTSetGain(int gain)
-{
-       sound.gain = GAIN_VOXWARE_TO_DB(gain);
-       atari_microwire_cmd(MW_LM1992_VOLUME(sound.gain));
-       return GAIN_DB_TO_VOXWARE(sound.gain);
-}
-
-
-
-/*
- * Falcon
- */
-
-
-static void FalconSilence(void)
-{
-       /* stop playback, set sample rate 50kHz for PSG sound */
-       tt_dmasnd.ctrl = DMASND_CTRL_OFF;
-       tt_dmasnd.mode = DMASND_MODE_50KHZ | DMASND_MODE_STEREO | DMASND_MODE_8BIT;
-       tt_dmasnd.int_div = 0; /* STE compatible divider */
-       tt_dmasnd.int_ctrl = 0x0;
-       tt_dmasnd.cbar_src = 0x0000; /* no matrix inputs */
-       tt_dmasnd.cbar_dst = 0x0000; /* no matrix outputs */
-       tt_dmasnd.dac_src = 1; /* connect ADC to DAC, disconnect matrix */
-       tt_dmasnd.adc_src = 3; /* ADC Input = PSG */
-}
-
-
-static void FalconInit(void)
-{
-       int divider, i, idx;
-       const int freq[8] = {49170, 32780, 24585, 19668, 16390, 12292, 9834, 8195};
-
-       /* search a frequency that fits into the allowed error range */
-
-       idx = -1;
-       for (i = 0; i < arraysize(freq); i++)
-               /* if we will tolerate 3% error 8000Hz->8195Hz (2.38%) would
-                * be playable without expanding, but that now a kernel runtime
-                * option
-                */
-               if ((100 * abs(sound.soft.speed - freq[i]) / freq[i]) < catchRadius)
-                       idx = i;
-       if (idx > -1) {
-               sound.soft.speed = freq[idx];
-               sound.trans = &transFalconNormal;
-       } else
-               sound.trans = &transFalconExpanding;
-
-       FalconSilence();
-       sound.hard = sound.soft;
-
-       if (sound.hard.size == 16) {
-               /* the Falcon can play 16bit samples only in stereo */
-               sound.hard.stereo = 1;
-       }
-
-       if (sound.hard.speed > 49170) {
-               /* we would need to squeeze the sound, but we won't do that */
-               sound.hard.speed = 49170;
-               divider = 1;
-               sound.trans = &transFalconNormal;
-       } else if (sound.hard.speed > 32780) {
-               sound.hard.speed = 49170;
-               divider = 1;
-       } else if (sound.hard.speed > 24585) {
-               sound.hard.speed = 32780;
-               divider = 2;
-       } else if (sound.hard.speed > 19668) {
-               sound.hard.speed = 24585;
-               divider = 3;
-       } else if (sound.hard.speed > 16390) {
-               sound.hard.speed = 19668;
-               divider = 4;
-       } else if (sound.hard.speed > 12292) {
-               sound.hard.speed = 16390;
-               divider = 5;
-       } else if (sound.hard.speed > 9834) {
-               sound.hard.speed = 12292;
-               divider = 7;
-       } else if (sound.hard.speed > 8195) {
-               sound.hard.speed = 9834;
-               divider = 9;
-       } else {
-               sound.hard.speed = 8195;
-               divider = 11;
-       }
-       tt_dmasnd.int_div = divider;
-
-       /* Setup Falcon sound DMA for playback */
-       tt_dmasnd.int_ctrl = 0x4; /* Timer A int at play end */
-       tt_dmasnd.track_select = 0x0; /* play 1 track, track 1 */
-       tt_dmasnd.cbar_src = 0x0001; /* DMA(25MHz) --> DAC */
-       tt_dmasnd.cbar_dst = 0x0000;
-       tt_dmasnd.rec_track_select = 0;
-       tt_dmasnd.dac_src = 2; /* connect matrix to DAC */
-       tt_dmasnd.adc_src = 0; /* ADC Input = Mic */
-
-       tt_dmasnd.mode = (sound.hard.stereo ?
-                         DMASND_MODE_STEREO : DMASND_MODE_MONO) |
-               ((sound.hard.size == 8) ?
-                DMASND_MODE_8BIT : DMASND_MODE_16BIT) |
-               DMASND_MODE_6KHZ;
-
-       sound.bal = -sound.soft.speed;
-}
-
-
-static int FalconSetFormat(int format)
-{
-       int size;
-       /* Falcon sound DMA supports 8bit and 16bit modes */
-
-       switch (format) {
-       case AFMT_QUERY:
-               return(sound.soft.format);
-       case AFMT_MU_LAW:
-       case AFMT_A_LAW:
-       case AFMT_U8:
-       case AFMT_S8:
-               size = 8;
-               break;
-       case AFMT_S16_BE:
-       case AFMT_U16_BE:
-       case AFMT_S16_LE:
-       case AFMT_U16_LE:
-               size = 16;
-               break;
-       default: /* :-) */
-               size = 8;
-               format = AFMT_S8;
-       }
-
-       sound.soft.format = format;
-       sound.soft.size = size;
-       if (sound.minDev == SND_DEV_DSP) {
-               sound.dsp.format = format;
-               sound.dsp.size = sound.soft.size;
-       }
-
-       FalconInit();
-
-       return(format);
-}
-
-
-/* This is for the Falcon output *attenuation* in 1.5dB steps,
- * i.e. output level from 0 to -22.5dB in -1.5dB steps.
- */
-#define VOLUME_VOXWARE_TO_ATT(v) \
-       ((v) < 0 ? 15 : (v) > 100 ? 0 : 15 - (v) * 3 / 20)
-#define VOLUME_ATT_TO_VOXWARE(v) (100 - (v) * 20 / 3)
-
-
-static int FalconSetVolume(int volume)
-{
-       sound.volume_left = VOLUME_VOXWARE_TO_ATT(volume & 0xff);
-       sound.volume_right = VOLUME_VOXWARE_TO_ATT((volume & 0xff00) >> 8);
-       tt_dmasnd.output_atten = sound.volume_left << 8 | sound.volume_right << 4;
-       return(VOLUME_ATT_TO_VOXWARE(sound.volume_left) |
-              VOLUME_ATT_TO_VOXWARE(sound.volume_right) << 8);
-}
-
-
-static void ata_sq_play_next_frame(int index)
-{
-       char *start, *end;
-
-       /* used by AtaPlay() if all doubts whether there really is something
-        * to be played are already wiped out.
-        */
-       start = sq_block_address(sq.front);
-       end = start+((sq.count == index) ? sq.rear_size : sq.block_size);
-       /* end might not be a legal virtual address. */
-       DMASNDSetEnd(virt_to_phys(end - 1) + 1);
-       DMASNDSetBase(virt_to_phys(start));
-       /* Since only an even number of samples per frame can
-          be played, we might lose one byte here. (TO DO) */
-       sq.front = (sq.front+1) % sq.max_count;
-       sq.active++;
-       tt_dmasnd.ctrl = DMASND_CTRL_ON | DMASND_CTRL_REPEAT;
-}
-
-
-static void AtaPlay(void)
-{
-       /* ++TeSche: Note that sq.active is no longer just a flag but holds
-        * the number of frames the DMA is currently programmed for instead,
-        * may be 0, 1 (currently being played) or 2 (pre-programmed).
-        *
-        * Changes done to sq.count and sq.active are a bit more subtle again
-        * so now I must admit I also prefer disabling the irq here rather
-        * than considering all possible situations. But the point is that
-        * disabling the irq doesn't have any bad influence on this version of
-        * the driver as we benefit from having pre-programmed the DMA
-        * wherever possible: There's no need to reload the DMA at the exact
-        * time of an interrupt but only at some time while the pre-programmed
-        * frame is playing!
-        */
-       atari_disable_irq(IRQ_MFP_TIMA);
-
-       if (sq.active == 2 ||   /* DMA is 'full' */
-           sq.count <= 0) {    /* nothing to do */
-               atari_enable_irq(IRQ_MFP_TIMA);
-               return;
-       }
-
-       if (sq.active == 0) {
-               /* looks like there's nothing 'in' the DMA yet, so try
-                * to put two frames into it (at least one is available).
-                */
-               if (sq.count == 1 && sq.rear_size < sq.block_size && !sq.syncing) {
-                       /* hmmm, the only existing frame is not
-                        * yet filled and we're not syncing?
-                        */
-                       atari_enable_irq(IRQ_MFP_TIMA);
-                       return;
-               }
-               ata_sq_play_next_frame(1);
-               if (sq.count == 1) {
-                       /* no more frames */
-                       atari_enable_irq(IRQ_MFP_TIMA);
-                       return;
-               }
-               if (sq.count == 2 && sq.rear_size < sq.block_size && !sq.syncing) {
-                       /* hmmm, there were two frames, but the second
-                        * one is not yet filled and we're not syncing?
-                        */
-                       atari_enable_irq(IRQ_MFP_TIMA);
-                       return;
-               }
-               ata_sq_play_next_frame(2);
-       } else {
-               /* there's already a frame being played so we may only stuff
-                * one new into the DMA, but even if this may be the last
-                * frame existing the previous one is still on sq.count.
-                */
-               if (sq.count == 2 && sq.rear_size < sq.block_size && !sq.syncing) {
-                       /* hmmm, the only existing frame is not
-                        * yet filled and we're not syncing?
-                        */
-                       atari_enable_irq(IRQ_MFP_TIMA);
-                       return;
-               }
-               ata_sq_play_next_frame(2);
-       }
-       atari_enable_irq(IRQ_MFP_TIMA);
-}
-
-
-static void ata_sq_interrupt(int irq, void *dummy, struct pt_regs *fp)
-{
-#if 0
-       /* ++TeSche: if you should want to test this... */
-       static int cnt = 0;
-       if (sq.active == 2)
-               if (++cnt == 10) {
-                       /* simulate losing an interrupt */
-                       cnt = 0;
-                       return;
-               }
-#endif
-
-       if (sq.ignore_int && (sound.mach.type == DMASND_FALCON)) {
-               /* ++TeSche: Falcon only: ignore first irq because it comes
-                * immediately after starting a frame. after that, irqs come
-                * (almost) like on the TT.
-                */
-               sq.ignore_int = 0;
-               return;
-       }
-
-       if (!sq.active) {
-               /* playing was interrupted and sq_reset() has already cleared
-                * the sq variables, so better don't do anything here.
-                */
-               WAKE_UP(sq.sync_queue);
-               return;
-       }
-
-       /* Probably ;) one frame is finished. Well, in fact it may be that a
-        * pre-programmed one is also finished because there has been a long
-        * delay in interrupt delivery and we've completely lost one, but
-        * there's no way to detect such a situation. In such a case the last
-        * frame will be played more than once and the situation will recover
-        * as soon as the irq gets through.
-        */
-       sq.count--;
-       sq.active--;
-
-       if (!sq.active) {
-               tt_dmasnd.ctrl = DMASND_CTRL_OFF;
-               sq.ignore_int = 1;
-       }
-
-       WAKE_UP(sq.action_queue);
-       /* At least one block of the queue is free now
-          so wake up a writing process blocked because
-          of a full queue. */
-
-       if ((sq.active != 1) || (sq.count != 1))
-               /* We must be a bit carefully here: sq.count indicates the
-                * number of buffers used and not the number of frames to
-                * be played. If sq.count==1 and sq.active==1 that means
-                * the only remaining frame was already programmed earlier
-                * (and is currently running) so we mustn't call AtaPlay()
-                * here, otherwise we'll play one frame too much.
-                */
-               AtaPlay();
-
-       if (!sq.active) WAKE_UP(sq.sync_queue);
-       /* We are not playing after AtaPlay(), so there
-          is nothing to play any more. Wake up a process
-          waiting for audio output to drain. */
-}
-#endif /* CONFIG_ATARI */
-
-
-#ifdef CONFIG_AMIGA
-
-/*
- * Amiga
- */
-
-#define StopDMA() custom.aud[0].audvol = custom.aud[1].audvol = 0; \
-               custom.aud[2].audvol = custom.aud[3].audvol = 0; \
-               custom.dmacon = AMI_AUDIO_OFF;
-
-static void *AmiAlloc(unsigned int size, int flags)
-{
-       return amiga_chip_alloc((long)size, "dmasound");
-}
-
-static void AmiFree(void *obj, unsigned int size)
-{
-       amiga_chip_free (obj);
-}
-
-static int __init AmiIrqInit(void)
-{
-       /* turn off DMA for audio channels */
-       StopDMA();
-
-       /* Register interrupt handler. */
-       if (request_irq(IRQ_AMIGA_AUD0, ami_sq_interrupt, 0,
-                       "DMA sound", ami_sq_interrupt))
-               return(0);
-       return(1);
-}
-
-#ifdef MODULE
-static void AmiIrqCleanUp(void)
-{
-       /* turn off DMA for audio channels */
-       StopDMA();
-       /* release the interrupt */
-       free_irq(IRQ_AMIGA_AUD0, ami_sq_interrupt);
-}
-#endif /* MODULE */
-
-static void AmiSilence(void)
-{
-       /* turn off DMA for audio channels */
-       StopDMA();
-}
-
-
-static void AmiInit(void)
-{
-       int period, i;
-
-       AmiSilence();
-
-       if (sound.soft.speed)
-               period = amiga_colorclock/sound.soft.speed-1;
-       else
-               period = amiga_audio_min_period;
-       sound.hard = sound.soft;
-       sound.trans = &transAmiga;
-
-       if (period < amiga_audio_min_period) {
-               /* we would need to squeeze the sound, but we won't do that */
-               period = amiga_audio_min_period;
-       } else if (period > 65535) {
-               period = 65535;
-       }
-       sound.hard.speed = amiga_colorclock/(period+1);
-
-       for (i = 0; i < 4; i++)
-               custom.aud[i].audper = period;
-       amiga_audio_period = period;
-
-       AmiSetTreble(50);  /* recommended for newer amiga models */
-}
-
-
-static int AmiSetFormat(int format)
-{
-       int size;
-
-       /* Amiga sound DMA supports 8bit and 16bit (pseudo 14 bit) modes */
-
-       switch (format) {
-       case AFMT_QUERY:
-               return(sound.soft.format);
-       case AFMT_MU_LAW:
-       case AFMT_A_LAW:
-       case AFMT_U8:
-       case AFMT_S8:
-               size = 8;
-               break;
-       case AFMT_S16_BE:
-       case AFMT_U16_BE:
-       case AFMT_S16_LE:
-       case AFMT_U16_LE:
-               size = 16;
-               break;
-       default: /* :-) */
-               size = 8;
-               format = AFMT_S8;
-       }
-
-       sound.soft.format = format;
-       sound.soft.size = size;
-       if (sound.minDev == SND_DEV_DSP) {
-               sound.dsp.format = format;
-               sound.dsp.size = sound.soft.size;
-       }
-       AmiInit();
-
-       return(format);
-}
-
-
-#define VOLUME_VOXWARE_TO_AMI(v) \
-       (((v) < 0) ? 0 : ((v) > 100) ? 64 : ((v) * 64)/100)
-#define VOLUME_AMI_TO_VOXWARE(v) ((v)*100/64)
-
-static int AmiSetVolume(int volume)
-{
-       sound.volume_left = VOLUME_VOXWARE_TO_AMI(volume & 0xff);
-       custom.aud[0].audvol = sound.volume_left;
-       sound.volume_right = VOLUME_VOXWARE_TO_AMI((volume & 0xff00) >> 8);
-       custom.aud[1].audvol = sound.volume_right;
-       if (sound.hard.size == 16) {
-               if (sound.volume_left == 64 && sound.volume_right == 64) {
-                       custom.aud[2].audvol = 1;
-                       custom.aud[3].audvol = 1;
-               } else {
-                       custom.aud[2].audvol = 0;
-                       custom.aud[3].audvol = 0;
-               }
-       }
-       return(VOLUME_AMI_TO_VOXWARE(sound.volume_left) |
-              (VOLUME_AMI_TO_VOXWARE(sound.volume_right) << 8));
-}
-
-static int AmiSetTreble(int treble)
-{
-       sound.treble = treble;
-       if (treble < 50)
-               ciaa.pra &= ~0x02;
-       else
-               ciaa.pra |= 0x02;
-       return(treble);
-}
-
-
-#define AMI_PLAY_LOADED                1
-#define AMI_PLAY_PLAYING       2
-#define AMI_PLAY_MASK          3
-
-
-static void ami_sq_play_next_frame(int index)
-{
-       u_char *start, *ch0, *ch1, *ch2, *ch3;
-       u_long size;
-
-       /* used by AmiPlay() if all doubts whether there really is something
-        * to be played are already wiped out.
-        */
-       start = sq_block_address(sq.front);
-       size = (sq.count == index ? sq.rear_size : sq.block_size)>>1;
-
-       if (sound.hard.stereo) {
-               ch0 = start;
-               ch1 = start+sq.block_size_half;
-               size >>= 1;
-       } else {
-               ch0 = start;
-               ch1 = start;
-       }
-
-       custom.aud[0].audvol = sound.volume_left;
-       custom.aud[1].audvol = sound.volume_right;
-       if (sound.hard.size == 8) {
-               custom.aud[0].audlc = (u_short *)ZTWO_PADDR(ch0);
-               custom.aud[0].audlen = size;
-               custom.aud[1].audlc = (u_short *)ZTWO_PADDR(ch1);
-               custom.aud[1].audlen = size;
-               custom.dmacon = AMI_AUDIO_8;
-       } else {
-               size >>= 1;
-               custom.aud[0].audlc = (u_short *)ZTWO_PADDR(ch0);
-               custom.aud[0].audlen = size;
-               custom.aud[1].audlc = (u_short *)ZTWO_PADDR(ch1);
-               custom.aud[1].audlen = size;
-               if (sound.volume_left == 64 && sound.volume_right == 64) {
-                       /* We can play pseudo 14-bit only with the maximum volume */
-                       ch3 = ch0+sq.block_size_quarter;
-                       ch2 = ch1+sq.block_size_quarter;
-                       custom.aud[2].audvol = 1;  /* we are being affected by the beeps */
-                       custom.aud[3].audvol = 1;  /* restoring volume here helps a bit */
-                       custom.aud[2].audlc = (u_short *)ZTWO_PADDR(ch2);
-                       custom.aud[2].audlen = size;
-                       custom.aud[3].audlc = (u_short *)ZTWO_PADDR(ch3);
-                       custom.aud[3].audlen = size;
-                       custom.dmacon = AMI_AUDIO_14;
-               } else {
-                       custom.aud[2].audvol = 0;
-                       custom.aud[3].audvol = 0;
-                       custom.dmacon = AMI_AUDIO_8;
-               }
-       }
-       sq.front = (sq.front+1) % sq.max_count;
-       sq.active |= AMI_PLAY_LOADED;
-}
-
-
-static void AmiPlay(void)
-{
-       int minframes = 1;
-
-       custom.intena = IF_AUD0;
-
-       if (sq.active & AMI_PLAY_LOADED) {
-               /* There's already a frame loaded */
-               custom.intena = IF_SETCLR | IF_AUD0;
-               return;
-       }
-
-       if (sq.active & AMI_PLAY_PLAYING)
-               /* Increase threshold: frame 1 is already being played */
-               minframes = 2;
-
-       if (sq.count < minframes) {
-               /* Nothing to do */
-               custom.intena = IF_SETCLR | IF_AUD0;
-               return;
-       }
-
-       if (sq.count <= minframes && sq.rear_size < sq.block_size && !sq.syncing) {
-               /* hmmm, the only existing frame is not
-                * yet filled and we're not syncing?
-                */
-               custom.intena = IF_SETCLR | IF_AUD0;
-               return;
-       }
-
-       ami_sq_play_next_frame(minframes);
-
-       custom.intena = IF_SETCLR | IF_AUD0;
-}
-
-
-static void ami_sq_interrupt(int irq, void *dummy, struct pt_regs *fp)
-{
-       int minframes = 1;
-
-       custom.intena = IF_AUD0;
-
-       if (!sq.active) {
-               /* Playing was interrupted and sq_reset() has already cleared
-                * the sq variables, so better don't do anything here.
-                */
-               WAKE_UP(sq.sync_queue);
-               return;
-       }
-
-       if (sq.active & AMI_PLAY_PLAYING) {
-               /* We've just finished a frame */
-               sq.count--;
-               WAKE_UP(sq.action_queue);
-       }
-
-       if (sq.active & AMI_PLAY_LOADED)
-               /* Increase threshold: frame 1 is already being played */
-               minframes = 2;
-
-       /* Shift the flags */
-       sq.active = (sq.active<<1) & AMI_PLAY_MASK;
-
-       if (!sq.active)
-               /* No frame is playing, disable audio DMA */
-               StopDMA();
-
-       custom.intena = IF_SETCLR | IF_AUD0;
-
-       if (sq.count >= minframes)
-               /* Try to play the next frame */
-               AmiPlay();
-
-       if (!sq.active)
-               /* Nothing to play anymore.
-                  Wake up a process waiting for audio output to drain. */
-               WAKE_UP(sq.sync_queue);
-}
-#endif /* CONFIG_AMIGA */
-
-#ifdef CONFIG_PPC
-
-/*
- * PCI PowerMac, with AWACS and DBDMA.
- */
-
-static void *PMacAlloc(unsigned int size, int flags)
-{
-       return kmalloc(size, flags);
-}
-
-static void PMacFree(void *ptr, unsigned int size)
-{
-       kfree(ptr);
-}
-
-static int __init PMacIrqInit(void)
-{
-       if (request_irq(awacs_irq, pmac_awacs_intr, 0, "AWACS", 0)
-           || request_irq(awacs_tx_irq, pmac_awacs_tx_intr, 0, "AWACS out", 0)
-           || request_irq(awacs_rx_irq, pmac_awacs_rx_intr, 0, "AWACS in", 0))
-               return 0;
-       return 1;
-}
-
-#ifdef MODULE
-static void PMacIrqCleanup(void)
-{
-       /* turn off output dma */
-       out_le32(&awacs_txdma->control, RUN<<16);
-       /* disable interrupts from awacs interface */
-       out_le32(&awacs->control, in_le32(&awacs->control) & 0xfff);
-#ifdef CONFIG_PMAC_PBOOK
-       if (is_pbook_G3) {
-               feature_clear(awacs_node, FEATURE_Sound_power);
-               feature_clear(awacs_node, FEATURE_Sound_CLK_enable);
-       }
-#endif
-       free_irq(awacs_irq, 0);
-       free_irq(awacs_tx_irq, 0);
-       free_irq(awacs_rx_irq, 0);
-       kfree(awacs_tx_cmd_space);
-       if (awacs_rx_cmd_space)
-               kfree(awacs_rx_cmd_space);
-       if (beep_buf)
-               kfree(beep_buf);
-       kd_mksound = orig_mksound;
-#ifdef CONFIG_PMAC_PBOOK
-       pmu_unregister_sleep_notifier(&awacs_sleep_notifier);
-#endif
-}
-#endif /* MODULE */
-
-static void PMacSilence(void)
-{
-       /* turn off output dma */
-       out_le32(&awacs_txdma->control, RUN<<16);
-}
-
-static int awacs_freqs[8] = {
-       44100, 29400, 22050, 17640, 14700, 11025, 8820, 7350
-};
-static int awacs_freqs_ok[8] = { 1, 1, 1, 1, 1, 1, 1, 1 };
-
-static void PMacInit(void)
-{
-       int i, tolerance;
-
-       switch (sound.soft.format) {
-       case AFMT_S16_LE:
-       case AFMT_U16_LE:
-               sound.hard.format = AFMT_S16_LE;
-               break;
-       default:
-               sound.hard.format = AFMT_S16_BE;
-               break;
-       }
-       sound.hard.stereo = 1;
-       sound.hard.size = 16;
-
-       /*
-        * If we have a sample rate which is within catchRadius percent
-        * of the requested value, we don't have to expand the samples.
-        * Otherwise choose the next higher rate.
-        * N.B.: burgundy awacs (iMac and later) only works at 44100 Hz.
-        */
-       i = 8;
-       do {
-               tolerance = catchRadius * awacs_freqs[--i] / 100;
-               if (awacs_freqs_ok[i]
-                   && sound.soft.speed <= awacs_freqs[i] + tolerance)
-                       break;
-       } while (i > 0);
-       if (sound.soft.speed >= awacs_freqs[i] - tolerance)
-               sound.trans = &transAwacsNormal;
-       else
-               sound.trans = &transAwacsExpand;
-       sound.read_trans = &transAwacsNormalRead;
-       sound.hard.speed = awacs_freqs[i];
-       awacs_rate_index = i;
-
-       /* XXX disable error interrupt on burgundy for now */
-       out_le32(&awacs->control, MASK_IEPC | (i << 8) | 0x11
-                | (awacs_revision < AWACS_BURGUNDY? MASK_IEE: 0));
-       awacs_reg[1] = (awacs_reg[1] & ~MASK_SAMPLERATE) | (i << 3);
-       awacs_write(awacs_reg[1] | MASK_ADDR1);
-       out_le32(&awacs->byteswap, sound.hard.format != AFMT_S16_BE);
-
-       /* We really want to execute a DMA stop command, after the AWACS
-        * is initialized.
-        * For reasons I don't understand, it stops the hissing noise
-        * common to many PowerBook G3 systems (like mine :-).
-        */
-       out_le32(&awacs_txdma->control, (RUN|WAKE|FLUSH|PAUSE) << 16);
-       st_le16(&beep_dbdma_cmd->command, DBDMA_STOP);
-       out_le32(&awacs_txdma->cmdptr, virt_to_bus(beep_dbdma_cmd));
-       out_le32(&awacs_txdma->control, RUN | (RUN << 16));
-
-       sound.bal = -sound.soft.speed;
-}
-
-static int PMacSetFormat(int format)
-{
-       int size;
-
-       switch (format) {
-       case AFMT_QUERY:
-               return sound.soft.format;
-       case AFMT_MU_LAW:
-       case AFMT_A_LAW:
-       case AFMT_U8:
-       case AFMT_S8:
-               size = 8;
-               break;
-       case AFMT_S16_BE:
-       case AFMT_U16_BE:
-       case AFMT_S16_LE:
-       case AFMT_U16_LE:
-               size = 16;
-               break;
-       default: /* :-) */
-               printk(KERN_ERR "dmasound: unknown format 0x%x, using AFMT_U8\n",
-                      format);
-               size = 8;
-               format = AFMT_U8;
-       }
-
-       sound.soft.format = format;
-       sound.soft.size = size;
-       if (sound.minDev == SND_DEV_DSP) {
-               sound.dsp.format = format;
-               sound.dsp.size = size;
-       }
-
-       PMacInit();
-
-       return format;
-}
-
-#define AWACS_VOLUME_TO_MASK(x)        (15 - ((((x) - 1) * 15) / 99))
-#define AWACS_MASK_TO_VOLUME(y)        (100 - ((y) * 99 / 15))
-
-static int awacs_get_volume(int reg, int lshift)
-{
-       int volume;
-
-       volume = AWACS_MASK_TO_VOLUME((reg >> lshift) & 0xf);
-       volume |= AWACS_MASK_TO_VOLUME(reg & 0xf) << 8;
-       return volume;
-}
-
-static int awacs_volume_setter(int volume, int n, int mute, int lshift)
-{
-       int r1, rn;
-
-       if (mute && volume == 0) {
-               r1 = awacs_reg[1] | mute;
-       } else {
-               r1 = awacs_reg[1] & ~mute;
-               rn = awacs_reg[n] & ~(0xf | (0xf << lshift));
-               rn |= ((AWACS_VOLUME_TO_MASK(volume & 0xff) & 0xf) << lshift);
-               rn |= AWACS_VOLUME_TO_MASK((volume >> 8) & 0xff) & 0xf;
-               awacs_reg[n] = rn;
-               awacs_write((n << 12) | rn);
-               volume = awacs_get_volume(rn, lshift);
-       }
-       if (r1 != awacs_reg[1]) {
-               awacs_reg[1] = r1;
-               awacs_write(r1 | MASK_ADDR1);
-       }
-       return volume;
-}
-
-static int PMacSetVolume(int volume)
-{
-       return awacs_volume_setter(volume, 2, MASK_AMUTE, 6);
-}
-
-static void PMacPlay(void)
-{
-       volatile struct dbdma_cmd *cp;
-       int i, count;
-       unsigned long flags;
-
-       save_flags(flags); cli();
-       if (awacs_beep_state) {
-               /* sound takes precedence over beeps */
-               out_le32(&awacs_txdma->control, (RUN|PAUSE|FLUSH|WAKE) << 16);
-               out_le32(&awacs->control,
-                        (in_le32(&awacs->control) & ~0x1f00)
-                        | (awacs_rate_index << 8));
-               out_le32(&awacs->byteswap, sound.hard.format != AFMT_S16_BE);
-               out_le32(&awacs_txdma->cmdptr, virt_to_bus(&(awacs_tx_cmds[(sq.front+sq.active) % sq.max_count])));
-
-               beep_playing = 0;
-               awacs_beep_state = 0;
-       }
-       i = sq.front + sq.active;
-       if (i >= sq.max_count)
-               i -= sq.max_count;
-       while (sq.active < 2 && sq.active < sq.count) {
-               count = (sq.count == sq.active + 1)?sq.rear_size:sq.block_size;
-               if (count < sq.block_size && !sq.syncing)
-                       /* last block not yet filled, and we're not syncing. */
-                       break;
-               cp = &awacs_tx_cmds[i];
-               st_le16(&cp->req_count, count);
-               st_le16(&cp->xfer_status, 0);
-               if (++i >= sq.max_count)
-                       i = 0;
-               out_le16(&awacs_tx_cmds[i].command, DBDMA_STOP);
-               out_le16(&cp->command, OUTPUT_MORE + INTR_ALWAYS);
-               if (sq.active == 0)
-                       out_le32(&awacs_txdma->cmdptr, virt_to_bus(cp));
-               out_le32(&awacs_txdma->control, ((RUN|WAKE) << 16) + (RUN|WAKE));
-               ++sq.active;
-       }
-       restore_flags(flags);
-}
-
-
-static void PMacRecord(void)
-{
-       unsigned long flags;
-
-       if (read_sq.active)
-               return;
-
-       save_flags(flags); cli();
-
-       /* This is all we have to do......Just start it up.
-       */
-       out_le32(&awacs_rxdma->control, ((RUN|WAKE) << 16) + (RUN|WAKE));
-       read_sq.active = 1;
-
-        restore_flags(flags);
-}
-
-
-static void
-pmac_awacs_tx_intr(int irq, void *devid, struct pt_regs *regs)
-{
-       int i = sq.front;
-       int stat;
-       volatile struct dbdma_cmd *cp;
-
-       while (sq.active > 0) {
-               cp = &awacs_tx_cmds[i];
-               stat = ld_le16(&cp->xfer_status);
-               if ((stat & ACTIVE) == 0)
-                       break;  /* this frame is still going */
-               --sq.count;
-               --sq.active;
-               if (++i >= sq.max_count)
-                       i = 0;
-       }
-       if (i != sq.front)
-               WAKE_UP(sq.action_queue);
-       sq.front = i;
-
-       PMacPlay();
-
-       if (!sq.active)
-               WAKE_UP(sq.sync_queue);
-}
-
-
-static void
-pmac_awacs_rx_intr(int irq, void *devid, struct pt_regs *regs)
-{
-
-       /* For some reason on my PowerBook G3, I get one interrupt
-        * when the interrupt vector is installed (like something is
-        * pending).  This happens before the dbdma is initialize by
-        * us, so I just check the command pointer and if it is zero,
-        * just blow it off.
-        */
-       if (in_le32(&awacs_rxdma->cmdptr) == 0)
-               return;
-       
-       /* We also want to blow 'em off when shutting down.
-       */
-       if (read_sq.active == 0)
-               return;
-
-       /* Check multiple buffers in case we were held off from
-        * interrupt processing for a long time.  Geeze, I really hope
-        * this doesn't happen.
-        */
-       while (awacs_rx_cmds[read_sq.rear].xfer_status) {
-
-               /* Clear status and move on to next buffer.
-               */
-               awacs_rx_cmds[read_sq.rear].xfer_status = 0;
-               read_sq.rear++;
-
-               /* Wrap the buffer ring.
-               */
-               if (read_sq.rear >= read_sq.max_active)
-                       read_sq.rear = 0;
-
-               /* If we have caught up to the front buffer, bump it.
-                * This will cause weird (but not fatal) results if the
-                * read loop is currently using this buffer.  The user is
-                * behind in this case anyway, so weird things are going
-                * to happen.
-                */
-               if (read_sq.rear == read_sq.front) {
-                       read_sq.front++;
-                       if (read_sq.front >= read_sq.max_active)
-                               read_sq.front = 0;
-               }
-       }
-
-       WAKE_UP(read_sq.action_queue);
-}
-
-
-static void
-pmac_awacs_intr(int irq, void *devid, struct pt_regs *regs)
-{
-       int ctrl = in_le32(&awacs->control);
-
-       if (ctrl & MASK_PORTCHG) {
-               /* do something when headphone is plugged/unplugged? */
-       }
-       if (ctrl & MASK_CNTLERR) {
-               int err = (in_le32(&awacs->codec_stat) & MASK_ERRCODE) >> 16;
-               if (err != 0 && awacs_revision < AWACS_BURGUNDY)
-                       printk(KERN_ERR "AWACS: error %x\n", err);
-       }
-       /* Writing 1s to the CNTLERR and PORTCHG bits clears them... */
-       out_le32(&awacs->control, ctrl);
-}
-
-static void
-awacs_write(int val)
-{
-       if (awacs_revision >= AWACS_BURGUNDY)
-               return;
-       while (in_le32(&awacs->codec_ctrl) & MASK_NEWECMD)
-               ;       /* XXX should have timeout */
-       out_le32(&awacs->codec_ctrl, val | (awacs_subframe << 22));
-}
-
-static void awacs_nosound(unsigned long xx)
-{
-       unsigned long flags;
-
-       save_flags(flags); cli();
-       if (beep_playing) {
-               st_le16(&beep_dbdma_cmd->command, DBDMA_STOP);
-               out_le32(&awacs_txdma->control, (RUN|PAUSE|FLUSH|WAKE) << 16);
-               out_le32(&awacs->control,
-                        (in_le32(&awacs->control) & ~0x1f00)
-                        | (awacs_rate_index << 8));
-               out_le32(&awacs->byteswap, sound.hard.format != AFMT_S16_BE);
-               beep_playing = 0;
-       }
-       restore_flags(flags);
-}
-
-static struct timer_list beep_timer = {
-       NULL, NULL, 0, 0, awacs_nosound
-};
-
-static void awacs_mksound(unsigned int hz, unsigned int ticks)
-{
-       unsigned long flags;
-       int beep_speed = 0;
-       int srate;
-       int period, ncycles, nsamples;
-       int i, j, f;
-       short *p;
-       static int beep_hz_cache;
-       static int beep_nsamples_cache;
-       static int beep_volume_cache;
-
-       for (i = 0; i < 8 && awacs_freqs[i] >= BEEP_SRATE; ++i)
-               if (awacs_freqs_ok[i])
-                       beep_speed = i;
-       srate = awacs_freqs[beep_speed];
-
-       if (hz <= srate / BEEP_BUFLEN || hz > srate / 2) {
-#if 1
-               /* this is a hack for broken X server code */
-               hz = 750;
-               ticks = 12;
-#else
-               /* cancel beep currently playing */
-               awacs_nosound(0);
-               return;
-#endif
-       }
-       save_flags(flags); cli();
-       del_timer(&beep_timer);
-       if (ticks) {
-               beep_timer.expires = jiffies + ticks;
-               add_timer(&beep_timer);
-       }
-       if (beep_playing || sq.active || beep_buf == NULL) {
-               restore_flags(flags);
-               return;         /* too hard, sorry :-( */
-       }
-       beep_playing = 1;
-       st_le16(&beep_dbdma_cmd->command, OUTPUT_MORE + BR_ALWAYS);
-       restore_flags(flags);
-
-       if (hz == beep_hz_cache && beep_volume == beep_volume_cache) {
-               nsamples = beep_nsamples_cache;
-       } else {
-               period = srate * 256 / hz;      /* fixed point */
-               ncycles = BEEP_BUFLEN * 256 / period;
-               nsamples = (period * ncycles) >> 8;
-               f = ncycles * 65536 / nsamples;
-               j = 0;
-               p = beep_buf;
-               for (i = 0; i < nsamples; ++i, p += 2) {
-                       p[0] = p[1] = beep_wform[j >> 8] * beep_volume;
-                       j = (j + f) & 0xffff;
-               }
-               beep_hz_cache = hz;
-               beep_volume_cache = beep_volume;
-               beep_nsamples_cache = nsamples;
-       }
-
-       st_le16(&beep_dbdma_cmd->req_count, nsamples*4);
-       st_le16(&beep_dbdma_cmd->xfer_status, 0);
-       st_le32(&beep_dbdma_cmd->cmd_dep, virt_to_bus(beep_dbdma_cmd));
-       st_le32(&beep_dbdma_cmd->phy_addr, virt_to_bus(beep_buf));
-       awacs_beep_state = 1;
-
-       save_flags(flags); cli();
-       if (beep_playing) {     /* i.e. haven't been terminated already */
-               out_le32(&awacs_txdma->control, (RUN|WAKE|FLUSH|PAUSE) << 16);
-               out_le32(&awacs->control,
-                        (in_le32(&awacs->control) & ~0x1f00)
-                        | (beep_speed << 8));
-               out_le32(&awacs->byteswap, 0);
-               out_le32(&awacs_txdma->cmdptr, virt_to_bus(beep_dbdma_cmd));
-               out_le32(&awacs_txdma->control, RUN | (RUN << 16));
-       }
-       restore_flags(flags);
-}
-
-#ifdef CONFIG_PMAC_PBOOK
-/*
- * Save state when going to sleep, restore it afterwards.
- */
-static int awacs_sleep_notify(struct pmu_sleep_notifier *self, int when)
-{
-       switch (when) {
-       case PBOOK_SLEEP_NOW:
-               /* XXX we should stop any dma in progress when going to sleep
-                  and restart it when we wake. */
-               PMacSilence();
-               disable_irq(awacs_irq);
-               disable_irq(awacs_tx_irq);
-               if (is_pbook_G3) {
-                       feature_clear(awacs_node, FEATURE_Sound_CLK_enable);
-                       feature_clear(awacs_node, FEATURE_Sound_power);
-               }
-               break;
-       case PBOOK_WAKE:
-               /* There is still a problem on wake. Sound seems to work fine
-                  if I launch mpg123 and resumes fine if mpg123 was playing,
-                  but the console beep is dead until I do something with the
-                  mixer. Probably yet another timing issue */
-               if (!feature_test(awacs_node, FEATURE_Sound_CLK_enable)
-                   || !feature_test(awacs_node, FEATURE_Sound_power)) {
-                       /* these aren't present on the 3400 AFAIK -- paulus */
-                       feature_set(awacs_node, FEATURE_Sound_CLK_enable);
-                       feature_set(awacs_node, FEATURE_Sound_power);
-                       mdelay(1000);
-               }
-               out_le32(&awacs->control, MASK_IEPC
-                        | (awacs_rate_index << 8) | 0x11
-                        | (awacs_revision < AWACS_BURGUNDY? MASK_IEE: 0));
-               awacs_write(awacs_reg[0] | MASK_ADDR0);
-               awacs_write(awacs_reg[1] | MASK_ADDR1);
-               awacs_write(awacs_reg[2] | MASK_ADDR2);
-               awacs_write(awacs_reg[4] | MASK_ADDR4);
-               out_le32(&awacs->byteswap, sound.hard.format != AFMT_S16_BE);
-               enable_irq(awacs_irq);
-               enable_irq(awacs_tx_irq);
-               if (awacs_revision == 3) {
-                       mdelay(100);
-                       awacs_write(0x6000);
-                       mdelay(2);
-                       awacs_write(awacs_reg[1] | MASK_ADDR1);
-               }
-               /* enable CD sound input */
-               if (macio_base && is_pbook_G3) {
-                       out_8(macio_base + 0x37, 3);
-               } else if (is_pbook_3400) {
-                       feature_set(awacs_node, FEATURE_IOBUS_enable);
-                       udelay(10);
-                       in_8(latch_base + 0x190);
-               }
-               /* Resume pending sounds. */
-               PMacPlay();
-       }
-       return PBOOK_SLEEP_OK;
-}
-#endif /* CONFIG_PMAC_PBOOK */
-
-
-/* All the burgundy functions: */
-
-/* Waits for busy flag to clear */
-inline static void
-awacs_burgundy_busy_wait(void)
-{
-       while (in_le32(&awacs->codec_ctrl) & MASK_NEWECMD)
-               ;
-}
-
-inline static void
-awacs_burgundy_extend_wait(void)
-{
-       while (!(in_le32(&awacs->codec_stat) & MASK_EXTEND))
-               ;
-       while (in_le32(&awacs->codec_stat) & MASK_EXTEND)
-               ;
-}
-
-static void
-awacs_burgundy_wcw(unsigned addr, unsigned val)
-{
-       out_le32(&awacs->codec_ctrl, addr + 0x200c00 + (val & 0xff));
-       awacs_burgundy_busy_wait();
-       out_le32(&awacs->codec_ctrl, addr + 0x200d00 +((val>>8) & 0xff));
-       awacs_burgundy_busy_wait();              
-       out_le32(&awacs->codec_ctrl, addr + 0x200e00 +((val>>16) & 0xff));
-       awacs_burgundy_busy_wait();              
-       out_le32(&awacs->codec_ctrl, addr + 0x200f00 +((val>>24) & 0xff));
-       awacs_burgundy_busy_wait();
-}
-
-static unsigned
-awacs_burgundy_rcw(unsigned addr)
-{
-       unsigned val = 0;
-       unsigned long flags;
-
-       /* should have timeouts here */
-       save_flags(flags); cli();
-
-       out_le32(&awacs->codec_ctrl, addr + 0x100000);
-       awacs_burgundy_busy_wait();
-       awacs_burgundy_extend_wait();
-       val += (in_le32(&awacs->codec_stat) >> 4) & 0xff;
-
-       out_le32(&awacs->codec_ctrl, addr + 0x100100);
-       awacs_burgundy_busy_wait();              
-       awacs_burgundy_extend_wait();
-       val += ((in_le32(&awacs->codec_stat)>>4) & 0xff) <<8;
-
-       out_le32(&awacs->codec_ctrl, addr + 0x100200);
-       awacs_burgundy_busy_wait();              
-       awacs_burgundy_extend_wait();
-       val += ((in_le32(&awacs->codec_stat)>>4) & 0xff) <<16;
-
-       out_le32(&awacs->codec_ctrl, addr + 0x100300);
-       awacs_burgundy_busy_wait();
-       awacs_burgundy_extend_wait();
-       val += ((in_le32(&awacs->codec_stat)>>4) & 0xff) <<24;
-
-       restore_flags(flags);
-
-       return val;
-}
-
-
-static void
-awacs_burgundy_wcb(unsigned addr, unsigned val)
-{
-       out_le32(&awacs->codec_ctrl, addr + 0x300000 + (val & 0xff));
-       awacs_burgundy_busy_wait();
-}
-
-static unsigned
-awacs_burgundy_rcb(unsigned addr)
-{
-       unsigned val = 0;
-       unsigned long flags;
-
-       /* should have timeouts here */
-       save_flags(flags); cli();
-
-       out_le32(&awacs->codec_ctrl, addr + 0x100000);
-       awacs_burgundy_busy_wait();
-       awacs_burgundy_extend_wait();
-       val += (in_le32(&awacs->codec_stat) >> 4) & 0xff;
-
-       restore_flags(flags);
-
-       return val;
-}
-
-static int
-awacs_burgundy_check(void)
-{
-       /* Checks to see the chip is alive and kicking */
-       int error = in_le32(&awacs->codec_ctrl) & MASK_ERRCODE;
-  
-       return error == 0xf0000;
-}
-
-static int
-awacs_burgundy_init(void)
-{
-       if (awacs_burgundy_check()) {
-               printk(KERN_WARNING "AWACS: disabled by MacOS :-(\n");
-               return 1;
-       }
-
-       awacs_burgundy_wcb(MASK_ADDR_BURGUNDY_OUTPUTENABLES,
-                          DEF_BURGUNDY_OUTPUTENABLES);
-       awacs_burgundy_wcb(MASK_ADDR_BURGUNDY_MORE_OUTPUTENABLES,
-                          DEF_BURGUNDY_MORE_OUTPUTENABLES);
-       awacs_burgundy_wcw(MASK_ADDR_BURGUNDY_OUTPUTSELECTS,
-                          DEF_BURGUNDY_OUTPUTSELECTS);
-       
-       awacs_burgundy_wcb(MASK_ADDR_BURGUNDY_INPSEL21,
-                          DEF_BURGUNDY_INPSEL21);
-       awacs_burgundy_wcb(MASK_ADDR_BURGUNDY_INPSEL3,
-                          DEF_BURGUNDY_INPSEL3);
-       awacs_burgundy_wcb(MASK_ADDR_BURGUNDY_GAINCD,
-                          DEF_BURGUNDY_GAINCD);
-       awacs_burgundy_wcb(MASK_ADDR_BURGUNDY_GAINLINE,
-                          DEF_BURGUNDY_GAINLINE);
-       awacs_burgundy_wcb(MASK_ADDR_BURGUNDY_GAINMIC,
-                          DEF_BURGUNDY_GAINMIC);
-       awacs_burgundy_wcb(MASK_ADDR_BURGUNDY_GAINMODEM,
-                          DEF_BURGUNDY_GAINMODEM);
-       
-       awacs_burgundy_wcb(MASK_ADDR_BURGUNDY_ATTENSPEAKER,
-                          DEF_BURGUNDY_ATTENSPEAKER);
-       awacs_burgundy_wcb(MASK_ADDR_BURGUNDY_ATTENLINEOUT,
-                          DEF_BURGUNDY_ATTENLINEOUT);
-       awacs_burgundy_wcb(MASK_ADDR_BURGUNDY_ATTENHP,
-                          DEF_BURGUNDY_ATTENHP);
-       
-       awacs_burgundy_wcw(MASK_ADDR_BURGUNDY_MASTER_VOLUME,
-                          DEF_BURGUNDY_MASTER_VOLUME);
-       awacs_burgundy_wcw(MASK_ADDR_BURGUNDY_VOLCD,
-                          DEF_BURGUNDY_VOLCD);
-       awacs_burgundy_wcw(MASK_ADDR_BURGUNDY_VOLLINE,
-                          DEF_BURGUNDY_VOLLINE);
-       awacs_burgundy_wcw(MASK_ADDR_BURGUNDY_VOLMIC,
-                          DEF_BURGUNDY_VOLMIC);
-       return 0;
-}
-
-static void
-awacs_burgundy_write_volume(unsigned address, int volume)
-{
-       int hardvolume,lvolume,rvolume;
-
-       lvolume = (volume & 0xff) ? (volume & 0xff) + 155 : 0;
-       rvolume = ((volume >>8)&0xff) ? ((volume >> 8)&0xff ) + 155 : 0;
-
-       hardvolume = lvolume + (rvolume << 16);
-
-       awacs_burgundy_wcw(address, hardvolume);
-}
-
-static int
-awacs_burgundy_read_volume(unsigned address)
-{
-       int softvolume,wvolume;
-
-       wvolume = awacs_burgundy_rcw(address);
-
-       softvolume = (wvolume & 0xff) - 155;
-       softvolume += (((wvolume >> 16) & 0xff) - 155)<<8;
-
-       return softvolume > 0 ? softvolume : 0;
-}
-
-
-
-
-static int
-awacs_burgundy_read_mvolume(unsigned address)
-{
-       int lvolume,rvolume,wvolume;
-
-       wvolume = awacs_burgundy_rcw(address);
-
-       wvolume &= 0xffff;
-       
-       rvolume = (wvolume & 0xff) - 155;
-       lvolume = ((wvolume & 0xff00)>>8) - 155;
-
-       return lvolume + (rvolume << 8);
-}
-
-
-static void
-awacs_burgundy_write_mvolume(unsigned address, int volume)
-{
-       int lvolume,rvolume,hardvolume;
-
-       lvolume = (volume &0xff) ? (volume & 0xff) + 155 :0;
-       rvolume = ((volume >>8) & 0xff) ? (volume >> 8) + 155 :0;
-
-       hardvolume = lvolume + (rvolume << 8);
-       hardvolume += (hardvolume << 16);
-
-       awacs_burgundy_wcw(address, hardvolume);
-}
-
-/* End burgundy functions */
-
-
-
-
-
-/* Turn on sound output, needed on G3 desktop powermacs */
-static void
-awacs_enable_amp(int spkr_vol)
-{
-       struct adb_request req;
-
-       awacs_spkr_vol = spkr_vol;
-       if (sys_ctrler != SYS_CTRLER_CUDA)
-               return;
-
-       /* turn on headphones */
-       cuda_request(&req, NULL, 5, CUDA_PACKET, CUDA_GET_SET_IIC,
-                    0x8a, 4, 0);
-       while (!req.complete) cuda_poll();
-       cuda_request(&req, NULL, 5, CUDA_PACKET, CUDA_GET_SET_IIC,
-                    0x8a, 6, 0);
-       while (!req.complete) cuda_poll();
-
-       /* turn on speaker */
-       cuda_request(&req, NULL, 5, CUDA_PACKET, CUDA_GET_SET_IIC,
-                    0x8a, 3, (100 - (spkr_vol & 0xff)) * 32 / 100);
-       while (!req.complete) cuda_poll();
-       cuda_request(&req, NULL, 5, CUDA_PACKET, CUDA_GET_SET_IIC,
-                    0x8a, 5, (100 - ((spkr_vol >> 8) & 0xff)) * 32 / 100);
-       while (!req.complete) cuda_poll();
-
-       cuda_request(&req, NULL, 5, CUDA_PACKET,
-                    CUDA_GET_SET_IIC, 0x8a, 1, 0x29);
-       while (!req.complete) cuda_poll();
-}
-
-#endif /* CONFIG_PPC */
-
-/*** Machine definitions *****************************************************/
-
-
-#ifdef CONFIG_ATARI
-static MACHINE machTT = {
-       DMASND_TT, AtaAlloc, AtaFree, AtaIrqInit,
-#ifdef MODULE
-       AtaIrqCleanUp,
-#endif /* MODULE */
-       TTInit, TTSilence, TTSetFormat, TTSetVolume,
-       AtaSetBass, AtaSetTreble, TTSetGain,
-       AtaPlay
-};
-
-static MACHINE machFalcon = {
-       DMASND_FALCON, AtaAlloc, AtaFree, AtaIrqInit,
-#ifdef MODULE
-       AtaIrqCleanUp,
-#endif /* MODULE */
-       FalconInit, FalconSilence, FalconSetFormat, FalconSetVolume,
-       AtaSetBass, AtaSetTreble, NULL,
-       AtaPlay
-};
-#endif /* CONFIG_ATARI */
-
-#ifdef CONFIG_AMIGA
-static MACHINE machAmiga = {
-       DMASND_AMIGA, AmiAlloc, AmiFree, AmiIrqInit,
-#ifdef MODULE
-       AmiIrqCleanUp,
-#endif /* MODULE */
-       AmiInit, AmiSilence, AmiSetFormat, AmiSetVolume,
-       NULL, AmiSetTreble, NULL,
-       AmiPlay
-};
-#endif /* CONFIG_AMIGA */
-
-#ifdef CONFIG_PPC
-static MACHINE machPMac = {
-       DMASND_AWACS, PMacAlloc, PMacFree, PMacIrqInit,
-#ifdef MODULE
-       PMacIrqCleanup,
-#endif /* MODULE */
-       PMacInit, PMacSilence, PMacSetFormat, PMacSetVolume,
-       NULL, NULL, NULL,       /* bass, treble, gain */
-       PMacPlay
-};
-#endif /* CONFIG_AMIGA */
-
-
-/*** Mid level stuff *********************************************************/
-
-
-static void sound_silence(void)
-{
-       /* update hardware settings one more */
-       (*sound.mach.init)();
-
-       (*sound.mach.silence)();
-}
-
-
-static void sound_init(void)
-{
-       (*sound.mach.init)();
-}
-
-
-static int sound_set_format(int format)
-{
-       return(*sound.mach.setFormat)(format);
-}
-
-
-static int sound_set_speed(int speed)
-{
-       if (speed < 0)
-               return(sound.soft.speed);
-
-       sound.soft.speed = speed;
-       (*sound.mach.init)();
-       if (sound.minDev == SND_DEV_DSP)
-               sound.dsp.speed = sound.soft.speed;
-
-       return(sound.soft.speed);
-}
-
-
-static int sound_set_stereo(int stereo)
-{
-       if (stereo < 0)
-               return(sound.soft.stereo);
-
-       stereo = !!stereo;    /* should be 0 or 1 now */
-
-       sound.soft.stereo = stereo;
-       if (sound.minDev == SND_DEV_DSP)
-               sound.dsp.stereo = stereo;
-       (*sound.mach.init)();
-
-       return(stereo);
-}
-
-
-static int sound_set_volume(int volume)
-{
-       return(*sound.mach.setVolume)(volume);
-}
-
-
-#ifdef CONFIG_ATARI
-static int sound_set_bass(int bass)
-{
-       return(sound.mach.setBass ? (*sound.mach.setBass)(bass) : 50);
-}
-
-static int sound_set_gain(int gain)
-{
-       return sound.mach.setGain ? sound.mach.setGain(gain) : 100;
-}
-#endif /* CONFIG_ATARI */
-
-#if defined(CONFIG_ATARI) || defined(CONFIG_AMIGA)
-static int sound_set_treble(int treble)
-{
-       return(sound.mach.setTreble ? (*sound.mach.setTreble)(treble) : 50);
-}
-#endif /* CONFIG_ATARI || CONFIG_AMIGA */
-
-
-static ssize_t sound_copy_translate(const u_char *userPtr,
-                                   size_t userCount,
-                                   u_char frame[], ssize_t *frameUsed,
-                                   ssize_t frameLeft)
-{
-       ssize_t (*ct_func)(const u_char *, size_t, u_char *, ssize_t *, ssize_t) = NULL;
-
-       switch (sound.soft.format) {
-       case AFMT_MU_LAW:
-               ct_func = sound.trans->ct_ulaw;
-               break;
-       case AFMT_A_LAW:
-               ct_func = sound.trans->ct_alaw;
-               break;
-       case AFMT_S8:
-               ct_func = sound.trans->ct_s8;
-               break;
-       case AFMT_U8:
-               ct_func = sound.trans->ct_u8;
-               break;
-       case AFMT_S16_BE:
-               ct_func = sound.trans->ct_s16be;
-               break;
-       case AFMT_U16_BE:
-               ct_func = sound.trans->ct_u16be;
-               break;
-       case AFMT_S16_LE:
-               ct_func = sound.trans->ct_s16le;
-               break;
-       case AFMT_U16_LE:
-               ct_func = sound.trans->ct_u16le;
-               break;
-       }
-       if (ct_func)
-               return ct_func(userPtr, userCount, frame, frameUsed, frameLeft);
-       else
-               return 0;
-}
-
-#ifdef CONFIG_PPC
-static ssize_t sound_copy_translate_read(const u_char *userPtr,
-                                   size_t userCount,
-                                   u_char frame[], ssize_t *frameUsed,
-                                   ssize_t frameLeft)
-{
-       ssize_t (*ct_func)(const u_char *, size_t, u_char *, ssize_t *, ssize_t) = NULL;
-
-       switch (sound.soft.format) {
-       case AFMT_MU_LAW:
-               ct_func = sound.read_trans->ct_ulaw;
-               break;
-       case AFMT_A_LAW:
-               ct_func = sound.read_trans->ct_alaw;
-               break;
-       case AFMT_S8:
-               ct_func = sound.read_trans->ct_s8;
-               break;
-       case AFMT_U8:
-               ct_func = sound.read_trans->ct_u8;
-               break;
-       case AFMT_S16_BE:
-               ct_func = sound.read_trans->ct_s16be;
-               break;
-       case AFMT_U16_BE:
-               ct_func = sound.read_trans->ct_u16be;
-               break;
-       case AFMT_S16_LE:
-               ct_func = sound.read_trans->ct_s16le;
-               break;
-       case AFMT_U16_LE:
-               ct_func = sound.read_trans->ct_u16le;
-               break;
-       }
-       if (ct_func)
-               return ct_func(userPtr, userCount, frame, frameUsed, frameLeft);
-       else
-               return 0;
-}
-#endif
-
-
-/*
- * /dev/mixer abstraction
- */
-
-
-#define RECLEVEL_VOXWARE_TO_GAIN(v) \
-       ((v) < 0 ? 0 : (v) > 100 ? 15 : (v) * 3 / 20)
-#define RECLEVEL_GAIN_TO_VOXWARE(v) (((v) * 20 + 2) / 3)
-
-
-static int mixer_open(struct inode *inode, struct file *file)
-{
-       MOD_INC_USE_COUNT;
-       mixer.busy = 1;
-       return 0;
-}
-
-
-static int mixer_release(struct inode *inode, struct file *file)
-{
-       mixer.busy = 0;
-       MOD_DEC_USE_COUNT;
-       return 0;
-}
-
-
-static int mixer_ioctl(struct inode *inode, struct file *file, u_int cmd,
-                      u_long arg)
-{
-       int data;
-       if (_SIOC_DIR(cmd) & _SIOC_WRITE)
-           mixer.modify_counter++;
-       if (cmd == OSS_GETVERSION)
-           return IOCTL_OUT(arg, SOUND_VERSION);
-       switch (sound.mach.type) {
-#ifdef CONFIG_ATARI
-       case DMASND_FALCON:
-               switch (cmd) {
-               case SOUND_MIXER_INFO: {
-                   mixer_info info;
-                   strncpy(info.id, "FALCON", sizeof(info.id));
-                   strncpy(info.name, "FALCON", sizeof(info.name));
-                   info.name[sizeof(info.name)-1] = 0;
-                   info.modify_counter = mixer.modify_counter;
-                   copy_to_user_ret((int *)arg, &info, sizeof(info), -EFAULT);
-                   return 0;
-               }
-               case SOUND_MIXER_READ_DEVMASK:
-                       return IOCTL_OUT(arg, SOUND_MASK_VOLUME | SOUND_MASK_MIC | SOUND_MASK_SPEAKER);
-               case SOUND_MIXER_READ_RECMASK:
-                       return IOCTL_OUT(arg, SOUND_MASK_MIC);
-               case SOUND_MIXER_READ_STEREODEVS:
-                       return IOCTL_OUT(arg, SOUND_MASK_VOLUME | SOUND_MASK_MIC);
-               case SOUND_MIXER_READ_CAPS:
-                       return IOCTL_OUT(arg, SOUND_CAP_EXCL_INPUT);
-               case SOUND_MIXER_READ_VOLUME:
-                       return IOCTL_OUT(arg,
-                               VOLUME_ATT_TO_VOXWARE(sound.volume_left) |
-                               VOLUME_ATT_TO_VOXWARE(sound.volume_right) << 8);
-               case SOUND_MIXER_WRITE_MIC:
-                       IOCTL_IN(arg, data);
-                       tt_dmasnd.input_gain =
-                               RECLEVEL_VOXWARE_TO_GAIN(data & 0xff) << 4 |
-                               RECLEVEL_VOXWARE_TO_GAIN(data >> 8 & 0xff);
-                       /* fall thru, return set value */
-               case SOUND_MIXER_READ_MIC:
-                       return IOCTL_OUT(arg,
-                               RECLEVEL_GAIN_TO_VOXWARE(tt_dmasnd.input_gain >> 4 & 0xf) |
-                               RECLEVEL_GAIN_TO_VOXWARE(tt_dmasnd.input_gain & 0xf) << 8);
-               case SOUND_MIXER_READ_SPEAKER:
-                       {
-                               int porta;
-                               cli();
-                               sound_ym.rd_data_reg_sel = 14;
-                               porta = sound_ym.rd_data_reg_sel;
-                               sti();
-                               return IOCTL_OUT(arg, porta & 0x40 ? 0 : 100);
-                       }
-               case SOUND_MIXER_WRITE_VOLUME:
-                       IOCTL_IN(arg, data);
-                       return IOCTL_OUT(arg, sound_set_volume(data));
-               case SOUND_MIXER_WRITE_SPEAKER:
-                       {
-                               int porta;
-                               IOCTL_IN(arg, data);
-                               cli();
-                               sound_ym.rd_data_reg_sel = 14;
-                               porta = (sound_ym.rd_data_reg_sel & ~0x40) |
-                                       (data < 50 ? 0x40 : 0);
-                               sound_ym.wd_data = porta;
-                               sti();
-                               return IOCTL_OUT(arg, porta & 0x40 ? 0 : 100);
-                       }
-               }
-               break;
-
-       case DMASND_TT:
-               switch (cmd) {
-               case SOUND_MIXER_INFO: {
-                   mixer_info info;
-                   strncpy(info.id, "TT", sizeof(info.id));
-                   strncpy(info.name, "TT", sizeof(info.name));
-                   info.name[sizeof(info.name)-1] = 0;
-                   info.modify_counter = mixer.modify_counter;
-                   copy_to_user_ret((int *)arg, &info, sizeof(info), -EFAULT);
-                   return 0;
-               }
-               case SOUND_MIXER_READ_DEVMASK:
-                       return IOCTL_OUT(arg,
-                                        SOUND_MASK_VOLUME | SOUND_MASK_TREBLE | SOUND_MASK_BASS |
-                                        (MACH_IS_TT ? SOUND_MASK_SPEAKER : 0));
-               case SOUND_MIXER_READ_RECMASK:
-                       return IOCTL_OUT(arg, 0);
-               case SOUND_MIXER_READ_STEREODEVS:
-                       return IOCTL_OUT(arg, SOUND_MASK_VOLUME);
-               case SOUND_MIXER_READ_VOLUME:
-                       return IOCTL_OUT(arg,
-                                        VOLUME_DB_TO_VOXWARE(sound.volume_left) |
-                                        (VOLUME_DB_TO_VOXWARE(sound.volume_right) << 8));
-               case SOUND_MIXER_READ_BASS:
-                       return IOCTL_OUT(arg, TONE_DB_TO_VOXWARE(sound.bass));
-               case SOUND_MIXER_READ_TREBLE:
-                       return IOCTL_OUT(arg, TONE_DB_TO_VOXWARE(sound.treble));
-               case SOUND_MIXER_READ_OGAIN:
-                       return IOCTL_OUT(arg, GAIN_DB_TO_VOXWARE(sound.gain));
-               case SOUND_MIXER_READ_SPEAKER:
-                       {
-                               int porta;
-                               if (MACH_IS_TT) {
-                                       cli();
-                                       sound_ym.rd_data_reg_sel = 14;
-                                       porta = sound_ym.rd_data_reg_sel;
-                                       sti();
-                                       return IOCTL_OUT(arg, porta & 0x40 ? 0 : 100);
-                               }
-                       }
-                       break;
-               case SOUND_MIXER_WRITE_VOLUME:
-                       IOCTL_IN(arg, data);
-                       return IOCTL_OUT(arg, sound_set_volume(data));
-               case SOUND_MIXER_WRITE_BASS:
-                       IOCTL_IN(arg, data);
-                       return IOCTL_OUT(arg, sound_set_bass(data));
-               case SOUND_MIXER_WRITE_TREBLE:
-                       IOCTL_IN(arg, data);
-                       return IOCTL_OUT(arg, sound_set_treble(data));
-               case SOUND_MIXER_WRITE_OGAIN:
-                       IOCTL_IN(arg, data);
-                       return IOCTL_OUT(arg, sound_set_gain(data));
-               case SOUND_MIXER_WRITE_SPEAKER:
-                       if (MACH_IS_TT) {
-                               int porta;
-                               IOCTL_IN(arg, data);
-                               cli();
-                               sound_ym.rd_data_reg_sel = 14;
-                               porta = (sound_ym.rd_data_reg_sel & ~0x40) |
-                                       (data < 50 ? 0x40 : 0);
-                               sound_ym.wd_data = porta;
-                               sti();
-                               return IOCTL_OUT(arg, porta & 0x40 ? 0 : 100);
-                       }
-               }
-               break;
-#endif /* CONFIG_ATARI */
-
-#ifdef CONFIG_AMIGA
-       case DMASND_AMIGA:
-               switch (cmd) {
-               case SOUND_MIXER_INFO: {
-                   mixer_info info;
-                   strncpy(info.id, "AMIGA", sizeof(info.id));
-                   strncpy(info.name, "AMIGA", sizeof(info.name));
-                   info.name[sizeof(info.name)-1] = 0;
-                   info.modify_counter = mixer.modify_counter;
-                   copy_to_user_ret((int *)arg, &info, sizeof(info), -EFAULT);
-                   return 0;
-               }
-               case SOUND_MIXER_READ_DEVMASK:
-                       return IOCTL_OUT(arg, SOUND_MASK_VOLUME | SOUND_MASK_TREBLE);
-               case SOUND_MIXER_READ_RECMASK:
-                       return IOCTL_OUT(arg, 0);
-               case SOUND_MIXER_READ_STEREODEVS:
-                       return IOCTL_OUT(arg, SOUND_MASK_VOLUME);
-               case SOUND_MIXER_READ_VOLUME:
-                       return IOCTL_OUT(arg,
-                               VOLUME_AMI_TO_VOXWARE(sound.volume_left) |
-                               VOLUME_AMI_TO_VOXWARE(sound.volume_right) << 8);
-               case SOUND_MIXER_WRITE_VOLUME:
-                       IOCTL_IN(arg, data);
-                       return IOCTL_OUT(arg, sound_set_volume(data));
-               case SOUND_MIXER_READ_TREBLE:
-                       return IOCTL_OUT(arg, sound.treble);
-               case SOUND_MIXER_WRITE_TREBLE:
-                       IOCTL_IN(arg, data);
-                       return IOCTL_OUT(arg, sound_set_treble(data));
-               }
-               break;
-#endif /* CONFIG_AMIGA */
-
-#ifdef CONFIG_PPC
-       case DMASND_AWACS:
-               /* Different IOCTLS for burgundy*/
-               if (awacs_revision < AWACS_BURGUNDY) {
-                       switch (cmd) {
-                       case SOUND_MIXER_INFO: {
-                           mixer_info info;
-                           strncpy(info.id, "AWACS", sizeof(info.id));
-                           strncpy(info.name, "AWACS", sizeof(info.name));
-                           info.name[sizeof(info.name)-1] = 0;
-                           info.modify_counter = mixer.modify_counter;
-                           copy_to_user_ret((int *)arg, &info, 
-                                            sizeof(info), -EFAULT);
-                           return 0;
-                       }
-                       case SOUND_MIXER_READ_DEVMASK:
-                               data = SOUND_MASK_VOLUME | SOUND_MASK_SPEAKER
-                                       | SOUND_MASK_LINE | SOUND_MASK_MIC
-                                       | SOUND_MASK_CD | SOUND_MASK_RECLEV
-                                       | SOUND_MASK_ALTPCM
-                                       | SOUND_MASK_MONITOR;
-                               return IOCTL_OUT(arg, data);
-                       case SOUND_MIXER_READ_RECMASK:
-                               data = SOUND_MASK_LINE | SOUND_MASK_MIC
-                                       | SOUND_MASK_CD;
-                               return IOCTL_OUT(arg, data);
-                       case SOUND_MIXER_READ_RECSRC:
-                               data = 0;
-                               if (awacs_reg[0] & MASK_MUX_AUDIN)
-                                       data |= SOUND_MASK_LINE;
-                               if (awacs_reg[0] & MASK_MUX_MIC)
-                                       data |= SOUND_MASK_MIC;
-                               if (awacs_reg[0] & MASK_MUX_CD)
-                                       data |= SOUND_MASK_CD;
-                               if (awacs_reg[1] & MASK_LOOPTHRU)
-                                       data |= SOUND_MASK_MONITOR;
-                               return IOCTL_OUT(arg, data);
-                       case SOUND_MIXER_WRITE_RECSRC:
-                               IOCTL_IN(arg, data);
-                               data &= (SOUND_MASK_LINE
-                                        | SOUND_MASK_MIC | SOUND_MASK_CD
-                                        | SOUND_MASK_MONITOR);
-                               awacs_reg[0] &= ~(MASK_MUX_CD | MASK_MUX_MIC
-                                                 | MASK_MUX_AUDIN);
-                               awacs_reg[1] &= ~MASK_LOOPTHRU;
-                               if (data & SOUND_MASK_LINE)
-                                       awacs_reg[0] |= MASK_MUX_AUDIN;
-                               if (data & SOUND_MASK_MIC)
-                                       awacs_reg[0] |= MASK_MUX_MIC;
-                               if (data & SOUND_MASK_CD)
-                                       awacs_reg[0] |= MASK_MUX_CD;
-                               if (data & SOUND_MASK_MONITOR)
-                                       awacs_reg[1] |= MASK_LOOPTHRU;
-                               awacs_write(awacs_reg[0] | MASK_ADDR0);
-                               awacs_write(awacs_reg[1] | MASK_ADDR1);
-                               return IOCTL_OUT(arg, data);
-                       case SOUND_MIXER_READ_STEREODEVS:
-                               data = SOUND_MASK_VOLUME | SOUND_MASK_SPEAKER
-                                       | SOUND_MASK_RECLEV;
-                               return IOCTL_OUT(arg, data);
-                       case SOUND_MIXER_READ_CAPS:
-                               return IOCTL_OUT(arg, 0);
-                       case SOUND_MIXER_READ_VOLUME:
-                               data = (awacs_reg[1] & MASK_AMUTE)? 0:
-                                       awacs_get_volume(awacs_reg[2], 6);
-                               return IOCTL_OUT(arg, data);
-                       case SOUND_MIXER_WRITE_VOLUME:
-                               IOCTL_IN(arg, data);
-                               return IOCTL_OUT(arg, sound_set_volume(data));
-                       case SOUND_MIXER_READ_SPEAKER:
-                               if (awacs_revision == 3
-                                   && sys_ctrler == SYS_CTRLER_CUDA)
-                                       data = awacs_spkr_vol;
-                               else
-                                       data = (awacs_reg[1] & MASK_CMUTE)? 0:
-                                               awacs_get_volume(awacs_reg[4], 6);
-                               return IOCTL_OUT(arg, data);
-                       case SOUND_MIXER_WRITE_SPEAKER:
-                               IOCTL_IN(arg, data);
-                               if (awacs_revision == 3
-                                   && sys_ctrler == SYS_CTRLER_CUDA)
-                                       awacs_enable_amp(data);
-                               else
-                                       data = awacs_volume_setter(data, 4, MASK_CMUTE, 6);
-                               return IOCTL_OUT(arg, data);
-                       case SOUND_MIXER_WRITE_ALTPCM:  /* really bell volume */
-                               IOCTL_IN(arg, data);
-                               beep_volume = data & 0xff;
-                               /* fall through */
-                       case SOUND_MIXER_READ_ALTPCM:
-                               return IOCTL_OUT(arg, beep_volume);
-                       case SOUND_MIXER_WRITE_LINE:
-                               IOCTL_IN(arg, data);
-                               awacs_reg[0] &= ~MASK_MUX_AUDIN;
-                               if ((data & 0xff) >= 50)
-                                       awacs_reg[0] |= MASK_MUX_AUDIN;
-                               awacs_write(MASK_ADDR0 | awacs_reg[0]);
-                               /* fall through */
-                       case SOUND_MIXER_READ_LINE:
-                               data = (awacs_reg[0] & MASK_MUX_AUDIN)? 100: 0;
-                               return IOCTL_OUT(arg, data);
-                       case SOUND_MIXER_WRITE_MIC:
-                               IOCTL_IN(arg, data);
-                               data &= 0xff;
-                               awacs_reg[0] &= ~(MASK_MUX_MIC | MASK_GAINLINE);
-                               if (data >= 25) {
-                                       awacs_reg[0] |= MASK_MUX_MIC;
-                                       if (data >= 75)
-                                               awacs_reg[0] |= MASK_GAINLINE;
-                               }
-                               awacs_write(MASK_ADDR0 | awacs_reg[0]);
-                               /* fall through */
-                       case SOUND_MIXER_READ_MIC:
-                               data = (awacs_reg[0] & MASK_MUX_MIC)?
-                                       (awacs_reg[0] & MASK_GAINLINE? 100: 50): 0;
-                               return IOCTL_OUT(arg, data);
-                       case SOUND_MIXER_WRITE_CD:
-                               IOCTL_IN(arg, data);
-                               awacs_reg[0] &= ~MASK_MUX_CD;
-                               if ((data & 0xff) >= 50)
-                                       awacs_reg[0] |= MASK_MUX_CD;
-                               awacs_write(MASK_ADDR0 | awacs_reg[0]);
-                               /* fall through */
-                       case SOUND_MIXER_READ_CD:
-                               data = (awacs_reg[0] & MASK_MUX_CD)? 100: 0;
-                               return IOCTL_OUT(arg, data);
-                       case SOUND_MIXER_WRITE_RECLEV:
-                               IOCTL_IN(arg, data);
-                               data = awacs_volume_setter(data, 0, 0, 4);
-                               return IOCTL_OUT(arg, data);
-                       case SOUND_MIXER_READ_RECLEV:
-                               data = awacs_get_volume(awacs_reg[0], 4);
-                               return IOCTL_OUT(arg, data);
-                       }
-                       break;
-               } else {
-                       /* We are, we are, we are... Burgundy or better */
-                       switch(cmd) {
-                       case SOUND_MIXER_INFO: {
-                           mixer_info info;
-                           strncpy(info.id, "AWACS", sizeof(info.id));
-                           strncpy(info.name, "AWACS", sizeof(info.name));
-                           info.name[sizeof(info.name)-1] = 0;
-                           info.modify_counter = mixer.modify_counter;
-                           copy_to_user_ret((int *)arg, &info, 
-                                            sizeof(info), -EFAULT);
-                           return 0;
-                       }
-                       case SOUND_MIXER_READ_DEVMASK:
-                               data = SOUND_MASK_VOLUME | SOUND_MASK_CD |
-                                       SOUND_MASK_LINE | SOUND_MASK_MIC |
-                                       SOUND_MASK_SPEAKER | SOUND_MASK_ALTPCM;
-                               return IOCTL_OUT(arg, data);
-                       case SOUND_MIXER_READ_RECMASK:
-                               data = SOUND_MASK_LINE | SOUND_MASK_MIC
-                                       | SOUND_MASK_CD;
-                               return IOCTL_OUT(arg, data);
-                       case SOUND_MIXER_READ_RECSRC:
-                               data = 0;
-                               if (awacs_reg[0] & MASK_MUX_AUDIN)
-                                       data |= SOUND_MASK_LINE;
-                               if (awacs_reg[0] & MASK_MUX_MIC)
-                                       data |= SOUND_MASK_MIC;
-                               if (awacs_reg[0] & MASK_MUX_CD)
-                                       data |= SOUND_MASK_CD;
-                               return IOCTL_OUT(arg, data);
-                       case SOUND_MIXER_WRITE_RECSRC:
-                               IOCTL_IN(arg, data);
-                               data &= (SOUND_MASK_LINE
-                                        | SOUND_MASK_MIC | SOUND_MASK_CD);
-                               awacs_reg[0] &= ~(MASK_MUX_CD | MASK_MUX_MIC
-                                                 | MASK_MUX_AUDIN);
-                               if (data & SOUND_MASK_LINE)
-                                       awacs_reg[0] |= MASK_MUX_AUDIN;
-                               if (data & SOUND_MASK_MIC)
-                                       awacs_reg[0] |= MASK_MUX_MIC;
-                               if (data & SOUND_MASK_CD)
-                                       awacs_reg[0] |= MASK_MUX_CD;
-                               awacs_write(awacs_reg[0] | MASK_ADDR0);
-                               return IOCTL_OUT(arg, data);
-                       case SOUND_MIXER_READ_STEREODEVS:
-                               data = SOUND_MASK_VOLUME | SOUND_MASK_SPEAKER
-                                       | SOUND_MASK_RECLEV | SOUND_MASK_CD
-                                       | SOUND_MASK_LINE;
-                               return IOCTL_OUT(arg, data);
-                       case SOUND_MIXER_READ_CAPS:
-                               return IOCTL_OUT(arg, 0);
-                       case SOUND_MIXER_WRITE_VOLUME:
-                               IOCTL_IN(arg, data);
-                               awacs_burgundy_write_mvolume(MASK_ADDR_BURGUNDY_MASTER_VOLUME, data);
-                               /* Fall through */
-                       case SOUND_MIXER_READ_VOLUME:
-                               return IOCTL_OUT(arg, awacs_burgundy_read_mvolume(MASK_ADDR_BURGUNDY_MASTER_VOLUME));
-                       case SOUND_MIXER_WRITE_SPEAKER:
-                               IOCTL_IN(arg, data);
-
-                               if (!(data & 0xff)) {
-                                 /* Mute the left speaker */
-                                 awacs_burgundy_wcb(MASK_ADDR_BURGUNDY_MORE_OUTPUTENABLES,
-                                                    awacs_burgundy_rcb(MASK_ADDR_BURGUNDY_MORE_OUTPUTENABLES) & ~0x2);
-                               } else {
-                                 /* Unmute the left speaker */
-                                 awacs_burgundy_wcb(MASK_ADDR_BURGUNDY_MORE_OUTPUTENABLES,
-                                                    awacs_burgundy_rcb(MASK_ADDR_BURGUNDY_MORE_OUTPUTENABLES) | 0x2);
-                               }
-                               if (!(data & 0xff00)) {
-                                 /* Mute the right speaker */
-                                 awacs_burgundy_wcb(MASK_ADDR_BURGUNDY_MORE_OUTPUTENABLES,
-                                                    awacs_burgundy_rcb(MASK_ADDR_BURGUNDY_MORE_OUTPUTENABLES) & ~0x4);
-                               } else {
-                                 /* Unmute the right speaker */
-                                 awacs_burgundy_wcb(MASK_ADDR_BURGUNDY_MORE_OUTPUTENABLES,
-                                                    awacs_burgundy_rcb(MASK_ADDR_BURGUNDY_MORE_OUTPUTENABLES) | 0x4);
-                               }
-
-                               data = (((data&0xff)*16)/100 > 0xf ? 0xf :
-                                       (((data&0xff)*16)/100)) + 
-                                        ((((data>>8)*16)/100 > 0xf ? 0xf :
-                                       ((((data>>8)*16)/100)))<<4);
-
-                               awacs_burgundy_wcb(MASK_ADDR_BURGUNDY_ATTENSPEAKER, ~data);
-                               /* Fall through */
-                       case SOUND_MIXER_READ_SPEAKER:
-                               data = awacs_burgundy_rcb(MASK_ADDR_BURGUNDY_ATTENSPEAKER);
-                               data = (((data & 0xf)*100)/16) + ((((data>>4)*100)/16)<<8);
-                               return IOCTL_OUT(arg, ~data);
-                       case SOUND_MIXER_WRITE_ALTPCM:  /* really bell volume */
-                               IOCTL_IN(arg, data);
-                               beep_volume = data & 0xff;
-                               /* fall through */
-                       case SOUND_MIXER_READ_ALTPCM:
-                               return IOCTL_OUT(arg, beep_volume);
-                       case SOUND_MIXER_WRITE_LINE:
-                               IOCTL_IN(arg, data);
-                               awacs_burgundy_write_volume(MASK_ADDR_BURGUNDY_VOLLINE, data);
-
-                               /* fall through */
-                       case SOUND_MIXER_READ_LINE:
-                               data = awacs_burgundy_read_volume(MASK_ADDR_BURGUNDY_VOLLINE);                          
-                               return IOCTL_OUT(arg, data);
-                       case SOUND_MIXER_WRITE_MIC:
-                               IOCTL_IN(arg, data);
-                               /* Mic is mono device */
-                               data = (data << 8) + (data << 24);
-                               awacs_burgundy_write_volume(MASK_ADDR_BURGUNDY_VOLMIC, data);
-                               /* fall through */
-                       case SOUND_MIXER_READ_MIC:
-                               data = awacs_burgundy_read_volume(MASK_ADDR_BURGUNDY_VOLMIC);                           
-                               data <<= 24;
-                               return IOCTL_OUT(arg, data);
-                       case SOUND_MIXER_WRITE_CD:
-                               IOCTL_IN(arg, data);
-                               awacs_burgundy_write_volume(MASK_ADDR_BURGUNDY_VOLCD, data);
-                               /* fall through */
-                       case SOUND_MIXER_READ_CD:
-                               data = awacs_burgundy_read_volume(MASK_ADDR_BURGUNDY_VOLCD);
-                               return IOCTL_OUT(arg, data);
-                       case SOUND_MIXER_WRITE_RECLEV:
-                               IOCTL_IN(arg, data);
-                               data = awacs_volume_setter(data, 0, 0, 4);
-                               return IOCTL_OUT(arg, data);
-                       case SOUND_MIXER_READ_RECLEV:
-                               data = awacs_get_volume(awacs_reg[0], 4);
-                               return IOCTL_OUT(arg, data);
-                       case SOUND_MIXER_OUTMASK:
-                               break;
-                       case SOUND_MIXER_OUTSRC:
-                               break;
-                       }
-                       break;
-               }
-#endif
-       }
-
-       return -EINVAL;
-}
-
-
-static struct file_operations mixer_fops =
-{
-       llseek:         sound_lseek,
-       ioctl:          mixer_ioctl,
-       open:           mixer_open,
-       release:        mixer_release,
-};
-
-
-static void __init mixer_init(void)
-{
-#ifndef MODULE
-       int mixer_unit;
-#endif
-       mixer_unit = register_sound_mixer(&mixer_fops, -1);
-       if (mixer_unit < 0)
-               return;
-
-       mixer.busy = 0;
-       sound.treble = 0;
-       sound.bass = 0;
-       switch (sound.mach.type) {
-#ifdef CONFIG_ATARI
-       case DMASND_TT:
-               atari_microwire_cmd(MW_LM1992_VOLUME(0));
-               sound.volume_left = 0;
-               atari_microwire_cmd(MW_LM1992_BALLEFT(0));
-               sound.volume_right = 0;
-               atari_microwire_cmd(MW_LM1992_BALRIGHT(0));
-               atari_microwire_cmd(MW_LM1992_TREBLE(0));
-               atari_microwire_cmd(MW_LM1992_BASS(0));
-               break;
-       case DMASND_FALCON:
-               sound.volume_left = (tt_dmasnd.output_atten & 0xf00) >> 8;
-               sound.volume_right = (tt_dmasnd.output_atten & 0xf0) >> 4;
-               break;
-#endif /* CONFIG_ATARI */
-#ifdef CONFIG_AMIGA
-       case DMASND_AMIGA:
-               sound.volume_left = 64;
-               sound.volume_right = 64;
-               custom.aud[0].audvol = sound.volume_left;
-               custom.aud[3].audvol = 1;       /* For pseudo 14bit */
-               custom.aud[1].audvol = sound.volume_right;
-               custom.aud[2].audvol = 1;       /* For pseudo 14bit */
-               sound.treble = 50;
-               break;
-#endif /* CONFIG_AMIGA */
-       }
-}
-
-
-/*
- * Sound queue stuff, the heart of the driver
- */
-
-
-static int sq_allocate_buffers(void)
-{
-       int i;
-
-       if (sound_buffers)
-               return 0;
-       sound_buffers = kmalloc (numBufs * sizeof(char *), GFP_KERNEL);
-       if (!sound_buffers)
-               return -ENOMEM;
-       for (i = 0; i < numBufs; i++) {
-               sound_buffers[i] = sound.mach.dma_alloc (bufSize << 10, GFP_KERNEL);
-               if (!sound_buffers[i]) {
-                       while (i--)
-                               sound.mach.dma_free (sound_buffers[i], bufSize << 10);
-                       kfree (sound_buffers);
-                       sound_buffers = 0;
-                       return -ENOMEM;
-               }
-       }
-       return 0;
-}
-
-
-static void sq_release_buffers(void)
-{
-       int i;
-
-       if (sound_buffers) {
-               for (i = 0; i < numBufs; i++)
-                       sound.mach.dma_free (sound_buffers[i], bufSize << 10);
-               kfree (sound_buffers);
-               sound_buffers = 0;
-       }
-}
-
-
-#ifdef CONFIG_PPC
-static int sq_allocate_read_buffers(void)
-{
-       int i;
-       int j;
-
-       if (sound_read_buffers)
-               return 0;
-       sound_read_buffers = kmalloc(numReadBufs * sizeof(char *), GFP_KERNEL);
-       if (!sound_read_buffers)
-               return -ENOMEM;
-       for (i = 0; i < numBufs; i++) {
-               sound_read_buffers[i] = sound.mach.dma_alloc (readbufSize<<10,
-                                                             GFP_KERNEL);
-               if (!sound_read_buffers[i]) {
-                       while (i--)
-                               sound.mach.dma_free (sound_read_buffers[i],
-                                                    readbufSize << 10);
-                       kfree (sound_read_buffers);
-                       sound_read_buffers = 0;
-                       return -ENOMEM;
-               }
-               /* XXXX debugging code */
-               for (j=0; j<readbufSize; j++) {
-                       sound_read_buffers[i][j] = 0xef;
-               }
-       }
-       return 0;
-}
-
-static void sq_release_read_buffers(void)
-{
-       int i;
-       volatile struct dbdma_cmd *cp;
-       
-
-       if (sound_read_buffers) {
-               cp = awacs_rx_cmds;
-               for (i = 0; i < numReadBufs; i++,cp++) {
-                       st_le16(&cp->command, DBDMA_STOP);
-               }
-               /* We should probably wait for the thing to stop before we
-                  release the memory */
-               for (i = 0; i < numBufs; i++)
-                       sound.mach.dma_free (sound_read_buffers[i],
-                                            bufSize << 10);
-               kfree (sound_read_buffers);
-               sound_read_buffers = 0;
-       }
-}
-#endif
-
-
-static void sq_setup(int numBufs, int bufSize, char **write_buffers)
-{
-#ifdef CONFIG_PPC
-       int i;
-       volatile struct dbdma_cmd *cp;
-#endif /* CONFIG_PPC */
-
-       sq.max_count = numBufs;
-       sq.max_active = numBufs;
-       sq.block_size = bufSize;
-       sq.buffers = write_buffers;
-
-       sq.front = sq.count = 0;
-       sq.rear = -1;
-       sq.syncing = 0;
-       sq.active = 0;
-
-#ifdef CONFIG_ATARI
-       sq.ignore_int = 0;
-#endif /* CONFIG_ATARI */
-#ifdef CONFIG_AMIGA
-       sq.block_size_half = sq.block_size>>1;
-       sq.block_size_quarter = sq.block_size_half>>1;
-#endif /* CONFIG_AMIGA */
-#ifdef CONFIG_PPC
-       cp = awacs_tx_cmds;
-       memset((void *) cp, 0, (numBufs + 1) * sizeof(struct dbdma_cmd));
-       for (i = 0; i < numBufs; ++i, ++cp) {
-               st_le32(&cp->phy_addr, virt_to_bus(write_buffers[i]));
-       }
-       st_le16(&cp->command, DBDMA_NOP + BR_ALWAYS);
-       st_le32(&cp->cmd_dep, virt_to_bus(awacs_tx_cmds));
-       out_le32(&awacs_txdma->control, (RUN|PAUSE|FLUSH|WAKE) << 16);
-       out_le32(&awacs_txdma->cmdptr, virt_to_bus(awacs_tx_cmds));
-#endif /* CONFIG_PPC */
-}
-
-#ifdef CONFIG_PPC
-static void read_sq_setup(int numBufs, int bufSize, char **read_buffers)
-{
-       int i;
-       volatile struct dbdma_cmd *cp;
-
-       read_sq.max_count = numBufs;
-       read_sq.max_active = numBufs;
-       read_sq.block_size = bufSize;
-       read_sq.buffers = read_buffers;
-
-       read_sq.front = read_sq.count = 0;
-       read_sq.rear = 0;
-       read_sq.rear_size = 0;
-       read_sq.syncing = 0;
-       read_sq.active = 0;
-
-       cp = awacs_rx_cmds;
-       memset((void *) cp, 0, (numBufs + 1) * sizeof(struct dbdma_cmd));
-
-       /* Set dma buffers up in a loop */
-       for (i = 0; i < numBufs; i++,cp++) {
-               st_le32(&cp->phy_addr, virt_to_bus(read_buffers[i]));
-               st_le16(&cp->command, INPUT_MORE + INTR_ALWAYS);
-               st_le16(&cp->req_count, read_sq.block_size);
-               st_le16(&cp->xfer_status, 0);
-       }
-
-       /* The next two lines make the thing loop around.
-       */
-       st_le16(&cp->command, DBDMA_NOP + BR_ALWAYS);
-       st_le32(&cp->cmd_dep, virt_to_bus(awacs_rx_cmds));
-
-       /* Don't start until the first read is done.
-        * This will also abort any operations in progress if the DMA
-        * happens to be running (and it shouldn't).
-        */
-       out_le32(&awacs_rxdma->control, (RUN|PAUSE|FLUSH|WAKE) << 16);
-       out_le32(&awacs_rxdma->cmdptr, virt_to_bus(awacs_rx_cmds));
-
-}
-#endif /* CONFIG_PPC */
-
-
-static void sq_play(void)
-{
-       (*sound.mach.play)();
-}
-
-
-/* ++TeSche: radically changed this one too */
-
-static ssize_t sq_write(struct file *file, const char *src, size_t uLeft,
-                       loff_t *ppos)
-{
-       ssize_t uWritten = 0;
-       u_char *dest;
-       ssize_t uUsed, bUsed, bLeft;
-
-       /* ++TeSche: Is something like this necessary?
-        * Hey, that's an honest question! Or does any other part of the
-        * filesystem already checks this situation? I really don't know.
-        */
-       if (uLeft == 0)
-               return 0;
-
-       /* The interrupt doesn't start to play the last, incomplete frame.
-        * Thus we can append to it without disabling the interrupts! (Note
-        * also that sq.rear isn't affected by the interrupt.)
-        */
-
-       if (sq.count > 0 && (bLeft = sq.block_size-sq.rear_size) > 0) {
-               dest = sq_block_address(sq.rear);
-               bUsed = sq.rear_size;
-               uUsed = sound_copy_translate(src, uLeft, dest, &bUsed, bLeft);
-               if (uUsed <= 0)
-                       return uUsed;
-               src += uUsed;
-               uWritten += uUsed;
-               uLeft -= uUsed;
-               sq.rear_size = bUsed;
-       }
-
-       do {
-               while (sq.count == sq.max_active) {
-                       sq_play();
-                       if (NON_BLOCKING(sq.open_mode))
-                               return uWritten > 0 ? uWritten : -EAGAIN;
-                       SLEEP(sq.action_queue, ONE_SECOND);
-                       if (SIGNAL_RECEIVED)
-                               return uWritten > 0 ? uWritten : -EINTR;
-               }
-
-               /* Here, we can avoid disabling the interrupt by first
-                * copying and translating the data, and then updating
-                * the sq variables. Until this is done, the interrupt
-                * won't see the new frame and we can work on it
-                * undisturbed.
-                */
-
-               dest = sq_block_address((sq.rear+1) % sq.max_count);
-               bUsed = 0;
-               bLeft = sq.block_size;
-               uUsed = sound_copy_translate(src, uLeft, dest, &bUsed, bLeft);
-               if (uUsed <= 0)
-                       break;
-               src += uUsed;
-               uWritten += uUsed;
-               uLeft -= uUsed;
-               if (bUsed) {
-                       sq.rear = (sq.rear+1) % sq.max_count;
-                       sq.rear_size = bUsed;
-                       sq.count++;
-               }
-       } while (bUsed);   /* uUsed may have been 0 */
-
-       sq_play();
-
-       return uUsed < 0? uUsed: uWritten;
-}
-
-
-/***********/
-
-#ifdef CONFIG_PPC
-
-/* Here is how the values are used for reading.
- * The value 'active' simply indicates the DMA is running.  This is
- * done so the driver semantics are DMA starts when the first read is
- * posted.  The value 'front' indicates the buffer we should next
- * send to the user.  The value 'rear' indicates the buffer the DMA is
- * currently filling.  When 'front' == 'rear' the buffer "ring" is
- * empty (we always have an empty available).  The 'rear_size' is used
- * to track partial offsets into the current buffer.  Right now, I just keep
- * the DMA running.  If the reader can't keep up, the interrupt tosses
- * the oldest buffer.  We could also shut down the DMA in this case.
- */
-static ssize_t sq_read(struct file *file, char *dst, size_t uLeft,
-                       loff_t *ppos)
-{
-
-       ssize_t uRead, bLeft, bUsed, uUsed;
-
-       if (uLeft == 0)
-               return 0;
-
-       if (!read_sq.active)
-               PMacRecord();   /* Kick off the record process. */
-
-       uRead = 0;
-
-       /* Move what the user requests, depending upon other options.
-       */
-       while (uLeft > 0) {
-
-               /* When front == rear, the DMA is not done yet.
-               */
-               while (read_sq.front == read_sq.rear) {
-                       if (NON_BLOCKING(read_sq.open_mode)) {
-                              return uRead > 0 ? uRead : -EAGAIN;
-                       }
-                       SLEEP(read_sq.action_queue, ONE_SECOND);
-                       if (SIGNAL_RECEIVED)
-                               return uRead > 0 ? uRead : -EINTR;
-               }
-
-               /* The amount we move is either what is left in the
-                * current buffer or what the user wants.
-                */
-               bLeft = read_sq.block_size - read_sq.rear_size;
-               bUsed = read_sq.rear_size;
-               uUsed = sound_copy_translate_read(dst, uLeft,
-                       read_sq.buffers[read_sq.front], &bUsed, bLeft);
-               if (uUsed <= 0)
-                       return uUsed;
-               dst += uUsed;
-               uRead += uUsed;
-               uLeft -= uUsed;
-               read_sq.rear_size += bUsed;
-               if (read_sq.rear_size >= read_sq.block_size) {
-                       read_sq.rear_size = 0;
-                       read_sq.front++;
-                       if (read_sq.front >= read_sq.max_active)
-                               read_sq.front = 0;
-               }
-       }
-       return uRead;
-}
-#endif
-
-static int sq_open(struct inode *inode, struct file *file)
-{
-       int rc = 0;
-
-       MOD_INC_USE_COUNT;
-       if (file->f_mode & FMODE_WRITE) {
-               if (sq.busy) {
-                       rc = -EBUSY;
-                       if (NON_BLOCKING(file->f_flags))
-                               goto err_out;
-                       rc = -EINTR;
-                       while (sq.busy) {
-                               SLEEP(sq.open_queue, ONE_SECOND);
-                               if (SIGNAL_RECEIVED)
-                                       goto err_out;
-                       }
-               }
-               sq.busy = 1; /* Let's play spot-the-race-condition */
-
-               if (sq_allocate_buffers()) goto err_out_nobusy;
-
-               sq_setup(numBufs, bufSize<<10,sound_buffers);
-               sq.open_mode = file->f_mode;
-       }
-
-
-#ifdef CONFIG_PPC
-       if (file->f_mode & FMODE_READ) {
-               if (read_sq.busy) {
-                       rc = -EBUSY;
-                       if (NON_BLOCKING(file->f_flags))
-                               goto err_out;
-                       rc = -EINTR;
-                       while (read_sq.busy) {
-                               SLEEP(read_sq.open_queue, ONE_SECOND);
-                               if (SIGNAL_RECEIVED)
-                                       goto err_out;
-                       }
-                       rc = 0;
-               }
-               read_sq.busy = 1;
-               if (sq_allocate_read_buffers()) goto err_out_nobusy;
-
-               read_sq_setup(numReadBufs,readbufSize<<10, sound_read_buffers);
-               read_sq.open_mode = file->f_mode;
-       }                                                                      
-#endif
-
-#ifdef CONFIG_ATARI
-       sq.ignore_int = 1;
-#endif /* CONFIG_ATARI */
-       sound.minDev = MINOR(inode->i_rdev) & 0x0f;
-       sound.soft = sound.dsp;
-       sound.hard = sound.dsp;
-       sound_init();
-       if ((MINOR(inode->i_rdev) & 0x0f) == SND_DEV_AUDIO) {
-               sound_set_speed(8000);
-               sound_set_stereo(0);
-               sound_set_format(AFMT_MU_LAW);
-       }
-
-#if 0
-       if (file->f_mode == FMODE_READ) {
-               /* Start dma'ing straight away */
-               PMacRecord();
-       }
-#endif
-
-       return 0;
-
-err_out_nobusy:
-       if (file->f_mode & FMODE_WRITE) {
-               sq.busy = 0;
-               WAKE_UP(sq.open_queue);
-       }
-#ifdef CONFIG_PPC
-       if (file->f_mode & FMODE_READ) {
-               read_sq.busy = 0;
-               WAKE_UP(read_sq.open_queue);
-       }
-#endif
-err_out:
-       MOD_DEC_USE_COUNT;
-       return rc;
-}
-
-
-static void sq_reset(void)
-{
-       sound_silence();
-       sq.active = 0;
-       sq.count = 0;
-       sq.front = (sq.rear+1) % sq.max_count;
-}
-
-
-static int sq_fsync(struct file *filp, struct dentry *dentry)
-{
-       int rc = 0;
-
-       sq.syncing = 1;
-       sq_play();      /* there may be an incomplete frame waiting */
-
-       while (sq.active) {
-               SLEEP(sq.sync_queue, ONE_SECOND);
-               if (SIGNAL_RECEIVED) {
-                       /* While waiting for audio output to drain, an
-                        * interrupt occurred.  Stop audio output immediately
-                        * and clear the queue. */
-                       sq_reset();
-                       rc = -EINTR;
-                       break;
-               }
-       }
-
-       sq.syncing = 0;
-       return rc;
-}
-
-static int sq_release(struct inode *inode, struct file *file)
-{
-       int rc = 0;
-
-       if (sq.busy)
-               rc = sq_fsync(file, file->f_dentry);
-       sound.soft = sound.dsp;
-       sound.hard = sound.dsp;
-       sound_silence();
-
-#ifdef CONFIG_PPC
-       sq_release_read_buffers();
-#endif
-       sq_release_buffers();
-       MOD_DEC_USE_COUNT;
-
-       /* There is probably a DOS atack here. They change the mode flag. */
-       /* XXX add check here */
-#ifdef CONFIG_PPC
-       if (file->f_mode & FMODE_READ) {
-               read_sq.busy = 0;
-               WAKE_UP(read_sq.open_queue);
-       }
-#endif
-
-       if (file->f_mode & FMODE_WRITE) {
-               sq.busy = 0;
-               WAKE_UP(sq.open_queue);
-       }
-
-       /* Wake up a process waiting for the queue being released.
-        * Note: There may be several processes waiting for a call
-        * to open() returning. */
-
-       return rc;
-}
-
-
-static int sq_ioctl(struct inode *inode, struct file *file, u_int cmd,
-                   u_long arg)
-{
-       u_long fmt;
-       int data;
-       int size, nbufs;
-       audio_buf_info info;
-
-       switch (cmd) {
-       case SNDCTL_DSP_RESET:
-               sq_reset();
-               return 0;
-       case SNDCTL_DSP_POST:
-       case SNDCTL_DSP_SYNC:
-               return sq_fsync(file, file->f_dentry);
-
-               /* ++TeSche: before changing any of these it's
-                * probably wise to wait until sound playing has
-                * settled down. */
-       case SNDCTL_DSP_SPEED:
-               sq_fsync(file, file->f_dentry);
-               IOCTL_IN(arg, data);
-               return IOCTL_OUT(arg, sound_set_speed(data));
-       case SNDCTL_DSP_STEREO:
-               sq_fsync(file, file->f_dentry);
-               IOCTL_IN(arg, data);
-               return IOCTL_OUT(arg, sound_set_stereo(data));
-       case SOUND_PCM_WRITE_CHANNELS:
-               sq_fsync(file, file->f_dentry);
-               IOCTL_IN(arg, data);
-               return IOCTL_OUT(arg, sound_set_stereo(data-1)+1);
-       case SNDCTL_DSP_SETFMT:
-               sq_fsync(file, file->f_dentry);
-               IOCTL_IN(arg, data);
-               return IOCTL_OUT(arg, sound_set_format(data));
-       case SNDCTL_DSP_GETFMTS:
-               fmt = 0;
-               if (sound.trans) {
-                       if (sound.trans->ct_ulaw)
-                               fmt |= AFMT_MU_LAW;
-                       if (sound.trans->ct_alaw)
-                               fmt |= AFMT_A_LAW;
-                       if (sound.trans->ct_s8)
-                               fmt |= AFMT_S8;
-                       if (sound.trans->ct_u8)
-                               fmt |= AFMT_U8;
-                       if (sound.trans->ct_s16be)
-                               fmt |= AFMT_S16_BE;
-                       if (sound.trans->ct_u16be)
-                               fmt |= AFMT_U16_BE;
-                       if (sound.trans->ct_s16le)
-                               fmt |= AFMT_S16_LE;
-                       if (sound.trans->ct_u16le)
-                               fmt |= AFMT_U16_LE;
-               }
-               return IOCTL_OUT(arg, fmt);
-       case SNDCTL_DSP_GETBLKSIZE:
-               size = sq.block_size
-                       * sound.soft.size * (sound.soft.stereo + 1)
-                       / (sound.hard.size * (sound.hard.stereo + 1));
-               return IOCTL_OUT(arg, size);
-       case SNDCTL_DSP_SUBDIVIDE:
-               break;
-       case SNDCTL_DSP_SETFRAGMENT:
-               if (sq.count || sq.active || sq.syncing)
-                       return -EINVAL;
-               IOCTL_IN(arg, size);
-               nbufs = size >> 16;
-               if (nbufs < 2 || nbufs > numBufs)
-                       nbufs = numBufs;
-               size &= 0xffff;
-               if (size >= 8 && size <= 29) {
-                       size = 1 << size;
-                       size *= sound.hard.size * (sound.hard.stereo + 1);
-                       size /= sound.soft.size * (sound.soft.stereo + 1);
-                       if (size > (bufSize << 10))
-                               size = bufSize << 10;
-               } else
-                       size = bufSize << 10;
-               sq_setup(numBufs, size, sound_buffers);
-               sq.max_active = nbufs;
-               return 0;
-       case SNDCTL_DSP_GETOSPACE:
-               info.fragments = sq.max_active - sq.count;
-               info.fragstotal = sq.max_active;
-               info.fragsize = sq.block_size;
-               info.bytes = info.fragments * info.fragsize;
-               if (copy_to_user((void *)arg, &info, sizeof(info)))
-                       return -EFAULT;
-               return 0;
-
-       default:
-               return mixer_ioctl(inode, file, cmd, arg);
-       }
-       return -EINVAL;
-}
-
-
-
-static struct file_operations sq_fops =
-{
-       llseek:         sound_lseek,
-       write:          sq_write,
-       ioctl:          sq_ioctl,
-       open:           sq_open,
-       release:        sq_release,
-#ifdef CONFIG_PPC
-       read:           sq_read,                        /* sq_read */
-#endif
-};
-
-
-static void __init sq_init(void)
-{
-#ifndef MODULE
-       int sq_unit;
-#endif
-       sq_unit = register_sound_dsp(&sq_fops, -1);
-       if (sq_unit < 0)
-               return;
-
-       init_waitqueue_head(&sq.action_queue);
-       init_waitqueue_head(&sq.open_queue);
-       init_waitqueue_head(&sq.sync_queue);
-
-#ifdef CONFIG_PPC
-       init_waitqueue_head(&read_sq.action_queue);
-       init_waitqueue_head(&read_sq.open_queue);
-       init_waitqueue_head(&read_sq.sync_queue);
-#endif
-
-       sq.busy = 0;
-#ifdef CONFIG_PPC
-       read_sq.busy = 0;
-#endif
-
-       /* whatever you like as startup mode for /dev/dsp,
-        * (/dev/audio hasn't got a startup mode). note that
-        * once changed a new open() will *not* restore these!
-        */
-       sound.dsp.format = AFMT_U8;
-       sound.dsp.stereo = 0;
-       sound.dsp.size = 8;
-
-       /* set minimum rate possible without expanding */
-       switch (sound.mach.type) {
-#ifdef CONFIG_ATARI
-       case DMASND_TT:
-               sound.dsp.speed = 6258;
-               break;
-       case DMASND_FALCON:
-               sound.dsp.speed = 8195;
-               break;
-#endif /* CONFIG_ATARI */
-#ifdef CONFIG_AMIGA
-       case DMASND_AMIGA:
-               sound.dsp.speed = 8000;
-               break;
-#endif /* CONFIG_AMIGA */
-#ifdef CONFIG_PPC
-       case DMASND_AWACS:
-               sound.dsp.speed = 8000;
-               break;
-#endif /* CONFIG_PPC */
-       }
-
-       /* before the first open to /dev/dsp this wouldn't be set */
-       sound.soft = sound.dsp;
-       sound.hard = sound.dsp;
-
-       sound_silence();
-}
-
-/*
- * /dev/sndstat
- */
-
-
-/* state.buf should not overflow! */
-
-static int state_open(struct inode *inode, struct file *file)
-{
-       char *buffer = state.buf, *mach = "";
-#ifdef CONFIG_PPC
-       char awacs_buf[64];
-#endif
-       int len = 0;
-
-       if (state.busy)
-               return -EBUSY;
-
-       MOD_INC_USE_COUNT;
-       state.ptr = 0;
-       state.busy = 1;
-
-       switch (sound.mach.type) {
-#ifdef CONFIG_ATARI
-       case DMASND_TT:
-       case DMASND_FALCON:
-               mach = "Atari ";
-               break;
-#endif /* CONFIG_ATARI */
-#ifdef CONFIG_AMIGA
-       case DMASND_AMIGA:
-               mach = "Amiga ";
-               break;
-#endif /* CONFIG_AMIGA */
-#ifdef CONFIG_PPC
-       case DMASND_AWACS:
-               sprintf(awacs_buf, "PowerMac (AWACS rev %d) ", awacs_revision);
-               mach = awacs_buf;
-               break;
-#endif /* CONFIG_PPC */
-       }
-       len += sprintf(buffer+len, "%sDMA sound driver:\n", mach);
-
-       len += sprintf(buffer+len, "\tsound.format = 0x%x", sound.soft.format);
-       switch (sound.soft.format) {
-       case AFMT_MU_LAW:
-               len += sprintf(buffer+len, " (mu-law)");
-               break;
-       case AFMT_A_LAW:
-               len += sprintf(buffer+len, " (A-law)");
-               break;
-       case AFMT_U8:
-               len += sprintf(buffer+len, " (unsigned 8 bit)");
-               break;
-       case AFMT_S8:
-               len += sprintf(buffer+len, " (signed 8 bit)");
-               break;
-       case AFMT_S16_BE:
-               len += sprintf(buffer+len, " (signed 16 bit big)");
-               break;
-       case AFMT_U16_BE:
-               len += sprintf(buffer+len, " (unsigned 16 bit big)");
-               break;
-       case AFMT_S16_LE:
-               len += sprintf(buffer+len, " (signed 16 bit little)");
-               break;
-       case AFMT_U16_LE:
-               len += sprintf(buffer+len, " (unsigned 16 bit little)");
-               break;
-       }
-       len += sprintf(buffer+len, "\n");
-       len += sprintf(buffer+len, "\tsound.speed = %dHz (phys. %dHz)\n",
-                      sound.soft.speed, sound.hard.speed);
-       len += sprintf(buffer+len, "\tsound.stereo = 0x%x (%s)\n",
-                      sound.soft.stereo, sound.soft.stereo ? "stereo" : "mono");
-       switch (sound.mach.type) {
-#ifdef CONFIG_ATARI
-       case DMASND_TT:
-               len += sprintf(buffer+len, "\tsound.volume_left = %ddB [-40...0]\n",
-                              sound.volume_left);
-               len += sprintf(buffer+len, "\tsound.volume_right = %ddB [-40...0]\n",
-                              sound.volume_right);
-               len += sprintf(buffer+len, "\tsound.bass = %ddB [-12...+12]\n",
-                              sound.bass);
-               len += sprintf(buffer+len, "\tsound.treble = %ddB [-12...+12]\n",
-                              sound.treble);
-               break;
-       case DMASND_FALCON:
-               len += sprintf(buffer+len, "\tsound.volume_left = %ddB [-22.5...0]\n",
-                              sound.volume_left);
-               len += sprintf(buffer+len, "\tsound.volume_right = %ddB [-22.5...0]\n",
-                              sound.volume_right);
-               break;
-#endif /* CONFIG_ATARI */
-#ifdef CONFIG_AMIGA
-       case DMASND_AMIGA:
-               len += sprintf(buffer+len, "\tsound.volume_left = %d [0...64]\n",
-                              sound.volume_left);
-               len += sprintf(buffer+len, "\tsound.volume_right = %d [0...64]\n",
-                              sound.volume_right);
-               break;
-#endif /* CONFIG_AMIGA */
-       }
-       len += sprintf(buffer+len, "\tsq.block_size = %d sq.max_count = %d"
-                      " sq.max_active = %d\n",
-                      sq.block_size, sq.max_count, sq.max_active);
-       len += sprintf(buffer+len, "\tsq.count = %d sq.rear_size = %d\n", sq.count,
-                      sq.rear_size);
-       len += sprintf(buffer+len, "\tsq.active = %d sq.syncing = %d\n",
-                      sq.active, sq.syncing);
-       state.len = len;
-       return 0;
-}
-
-
-static int state_release(struct inode *inode, struct file *file)
-{
-       state.busy = 0;
-       MOD_DEC_USE_COUNT;
-       return 0;
-}
-
-
-static ssize_t state_read(struct file *file, char *buf, size_t count,
-                         loff_t *ppos)
-{
-       int n = state.len - state.ptr;
-       if (n > count)
-               n = count;
-       if (n <= 0)
-               return 0;
-       if (copy_to_user(buf, &state.buf[state.ptr], n))
-               return -EFAULT;
-       state.ptr += n;
-       return n;
-}
-
-
-static struct file_operations state_fops =
-{
-       llseek:         sound_lseek,
-       read:           state_read,
-       open:           state_open,
-       release:        state_release,
-};
-
-
-static void __init state_init(void)
-{
-#ifndef MODULE
-       int state_unit;
-#endif
-       state_unit = register_sound_special(&state_fops, SND_DEV_STATUS);
-       if (state_unit < 0)
-               return;
-       state.busy = 0;
-}
-
-
-/*** Common stuff ********************************************************/
-
-static long long sound_lseek(struct file *file, long long offset, int orig)
-{
-       return -ESPIPE;
-}
-
-
-/*** Config & Setup **********************************************************/
-
-
-void __init dmasound_init(void)
-{
-       int has_sound = 0;
-#ifdef CONFIG_PPC
-       struct device_node *np;
-#endif
-
-#if defined(__mc68000__) || defined(CONFIG_APUS)
-       switch (m68k_machtype) {
-#ifdef CONFIG_ATARI
-       case MACH_ATARI:
-               if (ATARIHW_PRESENT(PCM_8BIT)) {
-                       if (ATARIHW_PRESENT(CODEC))
-                               sound.mach = machFalcon;
-                       else if (ATARIHW_PRESENT(MICROWIRE))
-                               sound.mach = machTT;
-                       else
-                               break;
-                       if ((mfp.int_en_a & mfp.int_mk_a & 0x20) == 0)
-                               has_sound = 1;
-                       else
-                               printk("DMA sound driver: Timer A interrupt already in use\n");
-               }
-               break;
-
-#endif /* CONFIG_ATARI */
-#ifdef CONFIG_AMIGA
-       case MACH_AMIGA:
-               if (AMIGAHW_PRESENT(AMI_AUDIO)) {
-                       sound.mach = machAmiga;
-                       has_sound = 1;
-               }
-               break;
-#endif /* CONFIG_AMIGA */
-       }
-#endif /* __mc68000__||CONFIG_APUS */
-
-#ifdef CONFIG_PPC
-       awacs_subframe = 0;
-       awacs_revision = 0;
-       np = find_devices("awacs");
-       if (np == 0) {
-               /*
-                * powermac G3 models have a node called "davbus"
-                * with a child called "sound".
-                */
-               struct device_node *sound;
-               np = find_devices("davbus");
-               sound = find_devices("sound");
-               if (sound != 0 && sound->parent == np) {
-                       unsigned int *prop, l, i;
-                       prop = (unsigned int *)
-                               get_property(sound, "sub-frame", 0);
-                       if (prop != 0 && *prop >= 0 && *prop < 16)
-                               awacs_subframe = *prop;
-                       if (device_is_compatible(sound, "burgundy"))
-                               awacs_revision = AWACS_BURGUNDY;
-
-                       /* look for a property saying what sample rates
-                          are available */
-                       for (i = 0; i < 8; ++i)
-                               awacs_freqs_ok[i] = 0;
-                       prop = (unsigned int *) get_property
-                               (sound, "sample-rates", &l);
-                       if (prop == 0)
-                               prop = (unsigned int *) get_property
-                                       (sound, "output-frame-rates", &l);
-                       if (prop != 0) {
-                               for (l /= sizeof(int); l > 0; --l) {
-                                       /* sometimes the rate is in the
-                                          high-order 16 bits (?) */
-                                       unsigned int r = *prop++;
-                                       if (r >= 0x10000)
-                                               r >>= 16;
-                                       for (i = 0; i < 8; ++i) {
-                                               if (r == awacs_freqs[i]) {
-                                                       awacs_freqs_ok[i] = 1;
-                                                       break;
-                                               }
-                                       }
-                               }
-                       } else {
-                               /* assume just 44.1k is OK */
-                               awacs_freqs_ok[0] = 1;
-                       }
-               }
-       }
-       if (np != NULL && np->n_addrs >= 3 && np->n_intrs >= 3) {
-               int vol;
-               sound.mach = machPMac;
-               has_sound = 1;
-
-               awacs = (volatile struct awacs_regs *)
-                       ioremap(np->addrs[0].address, 0x80);
-               awacs_txdma = (volatile struct dbdma_regs *)
-                       ioremap(np->addrs[1].address, 0x100);
-               awacs_rxdma = (volatile struct dbdma_regs *)
-                       ioremap(np->addrs[2].address, 0x100);
-
-               awacs_irq = np->intrs[0].line;
-               awacs_tx_irq = np->intrs[1].line;
-               awacs_rx_irq = np->intrs[2].line;
-
-               awacs_tx_cmd_space = kmalloc((numBufs + 4) * sizeof(struct dbdma_cmd),
-                                            GFP_KERNEL);
-               if (awacs_tx_cmd_space == NULL) {
-                       printk(KERN_ERR "DMA sound driver: Not enough buffer memory, driver disabled!\n");
-                       return;
-               }
-               awacs_node = np;
-#ifdef CONFIG_PMAC_PBOOK
-               if (machine_is_compatible("PowerBook1,1")
-                   || machine_is_compatible("AAPL,PowerBook1998")) {
-                       feature_set(np, FEATURE_Sound_CLK_enable);
-                       feature_set(np, FEATURE_Sound_power);
-                       /* Shorter delay will not work */
-                       mdelay(1000);
-               }
-#endif
-               awacs_tx_cmds = (volatile struct dbdma_cmd *)
-                       DBDMA_ALIGN(awacs_tx_cmd_space);
-
-
-               awacs_rx_cmd_space = kmalloc((numReadBufs + 4) * sizeof(struct dbdma_cmd),
-                                            GFP_KERNEL);
-               if (awacs_rx_cmd_space == NULL) {
-                 printk("DMA sound driver: No memory for input");
-               }
-               awacs_rx_cmds = (volatile struct dbdma_cmd *)
-                 DBDMA_ALIGN(awacs_rx_cmd_space);
-
-
-
-               awacs_reg[0] = MASK_MUX_CD;
-               awacs_reg[1] = MASK_LOOPTHRU | MASK_PAROUT;
-               /* get default volume from nvram */
-               vol = (~nvram_read_byte(0x1308) & 7) << 1;
-               awacs_reg[2] = vol + (vol << 6);
-               awacs_reg[4] = vol + (vol << 6);
-               out_le32(&awacs->control, 0x11);
-               awacs_write(awacs_reg[0] + MASK_ADDR0);
-               awacs_write(awacs_reg[1] + MASK_ADDR1);
-               awacs_write(awacs_reg[2] + MASK_ADDR2);
-               awacs_write(awacs_reg[4] + MASK_ADDR4);
-
-               /* Initialize recent versions of the awacs */
-               if (awacs_revision == 0) {
-                       awacs_revision =
-                               (in_le32(&awacs->codec_stat) >> 12) & 0xf;
-                       if (awacs_revision == 3) {
-                               mdelay(100);
-                               awacs_write(0x6000);
-                               mdelay(2);
-                               awacs_write(awacs_reg[1] + MASK_ADDR1);
-                               awacs_enable_amp(100 * 0x101);
-                       }
-               }
-               if (awacs_revision >= AWACS_BURGUNDY)
-                       awacs_burgundy_init();
-
-               /* Initialize beep stuff */
-               beep_dbdma_cmd = awacs_tx_cmds + (numBufs + 1);
-               orig_mksound = kd_mksound;
-               kd_mksound = awacs_mksound;
-               beep_buf = (short *) kmalloc(BEEP_BUFLEN * 4, GFP_KERNEL);
-               if (beep_buf == NULL)
-                       printk(KERN_WARNING "dmasound: no memory for "
-                              "beep buffer\n");
-#ifdef CONFIG_PMAC_PBOOK
-               pmu_register_sleep_notifier(&awacs_sleep_notifier);
-#endif /* CONFIG_PMAC_PBOOK */
-
-               /* Powerbooks have odd ways of enabling inputs such as
-                  an expansion-bay CD or sound from an internal modem
-                  or a PC-card modem. */
-               if (machine_is_compatible("AAPL,3400/2400")
-                       || machine_is_compatible("AAPL,3500")) {
-                       is_pbook_3400 = 1;
-                       /*
-                        * Enable CD and PC-card sound inputs.
-                        * This is done by reading from address
-                        * f301a000, + 0x10 to enable the expansion-bay
-                        * CD sound input, + 0x80 to enable the PC-card
-                        * sound input.  The 0x100 enables the SCSI bus
-                        * terminator power.
-                        */
-                       latch_base = (unsigned char *) ioremap
-                               (0xf301a000, 0x1000);
-                       in_8(latch_base + 0x190);
-               } else if (machine_is_compatible("PowerBook1,1")
-                          || machine_is_compatible("AAPL,PowerBook1998")) {
-                       struct device_node* mio;
-                       macio_base = 0;
-                       is_pbook_G3 = 1;
-                       for (mio = np->parent; mio; mio = mio->parent) {
-                               if (strcmp(mio->name, "mac-io") == 0
-                                   && mio->n_addrs > 0) {
-                                       macio_base = (unsigned char *) ioremap
-                                               (mio->addrs[0].address, 0x40);
-                                       break;
-                               }
-                       }
-                       /* enable CD sound input */
-                       if (macio_base)
-                               out_8(macio_base + 0x37, 3);
-               }
-       }
-#endif /* CONFIG_PPC */
-
-       if (!has_sound)
-               return;
-
-       /* Set up sound queue, /dev/audio and /dev/dsp. */
-
-       /* Set default settings. */
-       sq_init();
-
-       /* Set up /dev/sndstat. */
-       state_init();
-
-       /* Set up /dev/mixer. */
-       mixer_init();
-
-       if (!sound.mach.irqinit()) {
-               printk(KERN_ERR "DMA sound driver: Interrupt initialization failed\n");
-               return;
-       }
-#ifdef MODULE
-       irq_installed = 1;
-#endif
-
-       printk(KERN_INFO "DMA sound driver installed, using %d buffers of %dk.\n",
-              numBufs, bufSize);
-
-       return;
-}
-
-
-static int __init dmasound_setup(char *str)
-{
-       int ints[6];
-
-       str = get_options(str, ARRAY_SIZE(ints), ints);
-
-       /* check the bootstrap parameter for "dmasound=" */
-
-       switch (ints[0]) {
-       case 3:
-               if ((ints[3] < 0) || (ints[3] > MAX_CATCH_RADIUS))
-                       printk("dmasound_setup: illegal catch radius, using default = %d\n", catchRadius);
-               else
-                       catchRadius = ints[3];
-               /* fall through */
-       case 2:
-               if (ints[1] < MIN_BUFFERS)
-                       printk("dmasound_setup: illegal number of buffers, using default = %d\n", numBufs);
-               else
-                       numBufs = ints[1];
-               if (ints[2] < MIN_BUFSIZE || ints[2] > MAX_BUFSIZE)
-                       printk("dmasound_setup: illegal buffer size, using default = %d\n", bufSize);
-               else
-                       bufSize = ints[2];
-               break;
-       case 0:
-               break;
-       default:
-               printk("dmasound_setup: illegal number of arguments\n");
-               return 0;
-       }
-       
-       return 1;
-}
-
-__setup("dmasound=", dmasound_setup);
-
-
-#ifdef MODULE
-
-int init_module(void)
-{
-       dmasound_init();
-       return 0;
-}
-
-
-void cleanup_module(void)
-{
-       if (irq_installed) {
-               sound_silence();
-               sound.mach.irqcleanup();
-       }
-
-#ifdef CONFIG_PPC
-       sq_release_read_buffers();
-#endif
-       sq_release_buffers();
-
-       if (mixer_unit >= 0)
-               unregister_sound_mixer(mixer_unit);
-       if (state_unit >= 0)
-               unregister_sound_special(state_unit);
-       if (sq_unit >= 0)
-               unregister_sound_dsp(sq_unit);
-}
-
-#endif /* MODULE */
diff --git a/drivers/sound/dmasound.h b/drivers/sound/dmasound.h
deleted file mode 100644 (file)
index fec3ad8..0000000
+++ /dev/null
@@ -1,36 +0,0 @@
-
-/* linux/drivers/sound/dmasound.h */
-
-/*
- * Minor numbers for the sound driver.
- *
- * Unfortunately Creative called the codec chip of SB as a DSP. For this
- * reason the /dev/dsp is reserved for digitized audio use. There is a
- * device for true DSP processors but it will be called something else.
- * In v3.0 it's /dev/sndproc but this could be a temporary solution.
- */
-
-#define SND_NDEVS      256     /* Number of supported devices */
-#define SND_DEV_CTL    0       /* Control port /dev/mixer */
-#define SND_DEV_SEQ    1       /* Sequencer output /dev/sequencer (FM
-                                  synthesizer and MIDI output) */
-#define SND_DEV_MIDIN  2       /* Raw midi access */
-#define SND_DEV_DSP    3       /* Digitized voice /dev/dsp */
-#define SND_DEV_AUDIO  4       /* Sparc compatible /dev/audio */
-#define SND_DEV_DSP16  5       /* Like /dev/dsp but 16 bits/sample */
-#define SND_DEV_STATUS 6       /* /dev/sndstat */
-/* #7 not in use now. Was in 2.4. Free for use after v3.0. */
-#define SND_DEV_SEQ2   8       /* /dev/sequencer, level 2 interface */
-#define SND_DEV_SNDPROC 9      /* /dev/sndproc for programmable devices */
-#define SND_DEV_PSS    SND_DEV_SNDPROC
-
-#define DSP_DEFAULT_SPEED      8000
-
-#define ON             1
-#define OFF            0
-
-#define MAX_AUDIO_DEV  5
-#define MAX_MIXER_DEV  2
-#define MAX_SYNTH_DEV  3
-#define MAX_MIDI_DEV   6
-#define MAX_TIMER_DEV  3
diff --git a/drivers/sound/dmasound/Config.in b/drivers/sound/dmasound/Config.in
new file mode 100644 (file)
index 0000000..c5f4c3c
--- /dev/null
@@ -0,0 +1,27 @@
+# drivers/sound/dmasound/Config.in
+
+if [ "$CONFIG_ATARI" = "y" ]; then
+   dep_tristate '  Atari DMA sound support' CONFIG_DMASOUND_ATARI $CONFIG_SOUND
+fi
+if [ "$CONFIG_ALL_PPC" = "y" ]; then
+   dep_tristate '  PowerMac DMA sound support' CONFIG_DMASOUND_AWACS $CONFIG_SOUND
+fi
+if [ "$CONFIG_AMIGA" = "y" -o "$CONFIG_APUS" = "y" ]; then
+   dep_tristate '  Amiga DMA sound support' CONFIG_DMASOUND_PAULA $CONFIG_SOUND
+fi
+if [ "$CONFIG_Q40" = "y" ]; then
+   dep_tristate '  Q40 sound support' CONFIG_DMASOUND_Q40 $CONFIG_SOUND
+fi
+if [ "$CONFIG_DMASOUND_ATARI" = "y" -o \
+     "$CONFIG_DMASOUND_AWACS" = "y" -o \
+     "$CONFIG_DMASOUND_PAULA" = "y" -o \
+     "$CONFIG_DMASOUND_Q40" = "y" ]; then
+   define_tristate CONFIG_DMASOUND y
+else
+   if [ "$CONFIG_DMASOUND_ATARI" = "m" -o \
+       "$CONFIG_DMASOUND_AWACS" = "m" -o \
+       "$CONFIG_DMASOUND_PAULA" = "m" -o \
+       "$CONFIG_DMASOUND_Q40" = "m" ]; then
+      define_tristate CONFIG_DMASOUND m
+   fi
+fi
diff --git a/drivers/sound/dmasound/Makefile b/drivers/sound/dmasound/Makefile
new file mode 100644 (file)
index 0000000..535146d
--- /dev/null
@@ -0,0 +1,38 @@
+#
+# Makefile for the DMA sound driver
+#
+# 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...
+
+O_TARGET    :=
+O_OBJS      :=
+OX_OBJS     :=
+M_OBJS      :=
+MX_OBJS     :=
+
+export-objs := dmasound_core.o
+
+obj-$(CONFIG_DMASOUND_ATARI)  += dmasound_core.o dmasound_atari.o
+obj-$(CONFIG_DMASOUND_AWACS)  += dmasound_core.o dmasound_awacs.o
+obj-$(CONFIG_DMASOUND_PAULA)  += dmasound_core.o dmasound_paula.o
+obj-$(CONFIG_DMASOUND_Q40)    += dmasound_core.o dmasound_q40.o
+
+# Files that are both resident and modular: remove from modular.
+
+obj-m       := $(filter-out $(obj-y), $(obj-m))
+
+# Translate to Rules.make lists.
+
+O_OBJS      := $(filter-out $(export-objs), $(obj-y))
+OX_OBJS     := $(filter     $(export-objs), $(obj-y))
+M_OBJS      := $(sort $(filter-out $(export-objs), $(obj-m)))
+MX_OBJS     := $(sort $(filter     $(export-objs), $(obj-m)))
+
+ifeq ($(CONFIG_DMASOUND),y)
+  O_TARGET = dmasound.o
+endif
+
+include $(TOPDIR)/Rules.make
diff --git a/drivers/sound/dmasound/dmasound.h b/drivers/sound/dmasound/dmasound.h
new file mode 100644 (file)
index 0000000..985785e
--- /dev/null
@@ -0,0 +1,246 @@
+
+/*
+ *  linux/drivers/sound/dmasound.h
+ *
+ *
+ *  Minor numbers for the sound driver.
+ *
+ *  Unfortunately Creative called the codec chip of SB as a DSP. For this
+ *  reason the /dev/dsp is reserved for digitized audio use. There is a
+ *  device for true DSP processors but it will be called something else.
+ *  In v3.0 it's /dev/sndproc but this could be a temporary solution.
+ */
+
+
+#include <linux/config.h>
+
+
+#define SND_NDEVS      256     /* Number of supported devices */
+#define SND_DEV_CTL    0       /* Control port /dev/mixer */
+#define SND_DEV_SEQ    1       /* Sequencer output /dev/sequencer (FM
+                                  synthesizer and MIDI output) */
+#define SND_DEV_MIDIN  2       /* Raw midi access */
+#define SND_DEV_DSP    3       /* Digitized voice /dev/dsp */
+#define SND_DEV_AUDIO  4       /* Sparc compatible /dev/audio */
+#define SND_DEV_DSP16  5       /* Like /dev/dsp but 16 bits/sample */
+#define SND_DEV_STATUS 6       /* /dev/sndstat */
+/* #7 not in use now. Was in 2.4. Free for use after v3.0. */
+#define SND_DEV_SEQ2   8       /* /dev/sequencer, level 2 interface */
+#define SND_DEV_SNDPROC 9      /* /dev/sndproc for programmable devices */
+#define SND_DEV_PSS    SND_DEV_SNDPROC
+
+#define DSP_DEFAULT_SPEED      8000
+
+#define ON             1
+#define OFF            0
+
+#define MAX_AUDIO_DEV  5
+#define MAX_MIXER_DEV  2
+#define MAX_SYNTH_DEV  3
+#define MAX_MIDI_DEV   6
+#define MAX_TIMER_DEV  3
+
+
+#define MAX_CATCH_RADIUS       10
+#define MIN_BUFFERS            4
+#define MIN_BUFSIZE            4       /* in KB */
+#define MAX_BUFSIZE            128     /* Limit for Amiga in KB */
+
+
+#define arraysize(x)   (sizeof(x)/sizeof(*(x)))
+#define min(x, y)      ((x) < (y) ? (x) : (y))
+#define le2be16(x)     (((x)<<8 & 0xff00) | ((x)>>8 & 0x00ff))
+#define le2be16dbl(x)  (((x)<<8 & 0xff00ff00) | ((x)>>8 & 0x00ff00ff))
+
+#define IOCTL_IN(arg, ret) \
+       do { int error = get_user(ret, (int *)(arg)); \
+               if (error) return error; \
+       } while (0)
+#define IOCTL_OUT(arg, ret)    ioctl_return((int *)(arg), ret)
+
+static inline int ioctl_return(int *addr, int value)
+{
+       return value < 0 ? value : put_user(value, addr);
+}
+
+
+    /*
+     *  Configuration
+     */
+
+#undef HAS_8BIT_TABLES
+#undef HAS_14BIT_TABLES
+#undef HAS_16BIT_TABLES
+#undef HAS_RECORD
+
+#if defined(CONFIG_DMASOUND_ATARI) || defined(CONFIG_DMASOUND_ATARI_MODULE) ||\
+    defined(CONFIG_DMASOUND_PAULA) || defined(CONFIG_DMASOUND_PAULA_MODULE) ||\
+    defined(CONFIG_DMASOUND_Q40) || defined(CONFIG_DMASOUND_Q40_MODULE)
+#define HAS_8BIT_TABLES
+#endif
+#if defined(CONFIG_DMASOUND_AWACS) || defined(CONFIG_DMASOUND_AWACS_MODULE)
+#define HAS_16BIT_TABLES
+#define HAS_RECORD
+#endif
+
+
+    /*
+     *  Initialization
+     */
+
+extern int dmasound_init(void);
+extern void dmasound_deinit(void);
+
+
+    /*
+     *  Machine definitions
+     */
+
+typedef struct {
+    const char *name;
+    const char *name2;
+    void (*open)(void);
+    void (*release)(void);
+    void *(*dma_alloc)(unsigned int, int);
+    void (*dma_free)(void *, unsigned int);
+    int (*irqinit)(void);
+#ifdef MODULE
+    void (*irqcleanup)(void);
+#endif /* MODULE */
+    void (*init)(void);
+    void (*silence)(void);
+    int (*setFormat)(int);
+    int (*setVolume)(int);
+    int (*setBass)(int);
+    int (*setTreble)(int);
+    int (*setGain)(int);
+    void (*play)(void);
+    void (*record)(void);                      /* optional */
+    void (*mixer_init)(void);                  /* optional */
+    int (*mixer_ioctl)(u_int, u_long);         /* optional */
+    void (*write_sq_setup)(void);              /* optional */
+    void (*read_sq_setup)(void);               /* optional */
+    void (*sq_open)(void);                     /* optional */
+    int (*state_info)(char *);                 /* optional */
+    void (*abort_read)(void);                  /* optional */
+    int min_dsp_speed;
+} MACHINE;
+
+
+    /*
+     *  Low level stuff
+     */
+
+typedef struct {
+    int format;                /* AFMT_* */
+    int stereo;                /* 0 = mono, 1 = stereo */
+    int size;          /* 8/16 bit*/
+    int speed;         /* speed */
+} SETTINGS;
+
+typedef struct {
+    ssize_t (*ct_ulaw)(const u_char *, size_t, u_char *, ssize_t *, ssize_t);
+    ssize_t (*ct_alaw)(const u_char *, size_t, u_char *, ssize_t *, ssize_t);
+    ssize_t (*ct_s8)(const u_char *, size_t, u_char *, ssize_t *, ssize_t);
+    ssize_t (*ct_u8)(const u_char *, size_t, u_char *, ssize_t *, ssize_t);
+    ssize_t (*ct_s16be)(const u_char *, size_t, u_char *, ssize_t *, ssize_t);
+    ssize_t (*ct_u16be)(const u_char *, size_t, u_char *, ssize_t *, ssize_t);
+    ssize_t (*ct_s16le)(const u_char *, size_t, u_char *, ssize_t *, ssize_t);
+    ssize_t (*ct_u16le)(const u_char *, size_t, u_char *, ssize_t *, ssize_t);
+} TRANS;
+
+struct sound_settings {
+    MACHINE mach;      /* machine dependent things */
+    SETTINGS hard;     /* hardware settings */
+    SETTINGS soft;     /* software settings */
+    SETTINGS dsp;      /* /dev/dsp default settings */
+    TRANS *trans_write;        /* supported translations */
+#ifdef HAS_RECORD
+    TRANS *trans_read; /* supported translations */
+#endif
+    int volume_left;   /* volume (range is machine dependent) */
+    int volume_right;
+    int bass;          /* tone (range is machine dependent) */
+    int treble;
+    int gain;
+    int minDev;                /* minor device number currently open */
+};
+
+extern struct sound_settings dmasound;
+
+extern char dmasound_ulaw2dma8[];
+extern char dmasound_alaw2dma8[];
+extern short dmasound_ulaw2dma16[];
+extern short dmasound_alaw2dma16[];
+
+
+    /*
+     *  Mid level stuff
+     */
+
+static inline int dmasound_set_volume(int volume)
+{
+       return dmasound.mach.setVolume(volume);
+}
+
+static inline int dmasound_set_bass(int bass)
+{
+       return dmasound.mach.setBass ? dmasound.mach.setBass(bass) : 50;
+}
+
+static inline int dmasound_set_treble(int treble)
+{
+       return dmasound.mach.setTreble ? dmasound.mach.setTreble(treble) : 50;
+}
+
+static inline int dmasound_set_gain(int gain)
+{
+       return dmasound.mach.setGain ? dmasound.mach.setGain(gain) : 100;
+}
+
+
+    /*
+     * Sound queue stuff, the heart of the driver
+     */
+
+struct sound_queue {
+    /* buffers allocated for this queue */
+    int numBufs;
+    int bufSize;                       /* in bytes */
+    char **buffers;
+
+    /* current parameters */
+    int max_count;
+    int block_size;                    /* in bytes */
+    int max_active;
+
+    /* it shouldn't be necessary to declare any of these volatile */
+    int front, rear, count;
+    int rear_size;
+    /*
+     * The use of the playing field depends on the hardware
+     *
+     * Atari, PMac: The number of frames that are loaded/playing
+     *
+     * Amiga: Bit 0 is set: a frame is loaded
+     *        Bit 1 is set: a frame is playing
+     */
+    int active;
+    wait_queue_head_t action_queue, open_queue, sync_queue;
+    int open_mode;
+    int busy, syncing;
+};
+
+#define SLEEP(queue)           interruptible_sleep_on_timeout(&queue, HZ)
+#define WAKE_UP(queue)         (wake_up_interruptible(&queue))
+
+extern struct sound_queue dmasound_write_sq;
+extern struct sound_queue dmasound_read_sq;
+
+#define write_sq       dmasound_write_sq
+#define read_sq                dmasound_read_sq
+
+extern int dmasound_catchRadius;
+
+#define catchRadius    dmasound_catchRadius
+
diff --git a/drivers/sound/dmasound/dmasound_atari.c b/drivers/sound/dmasound/dmasound_atari.c
new file mode 100644 (file)
index 0000000..ca6f07c
--- /dev/null
@@ -0,0 +1,1560 @@
+
+/*
+ *  linux/drivers/sound/dmasound_atari.c
+ *
+ *  Atari DMA Sound Driver
+ *
+ *  See linux/drivers/sound/dmasound_core.c for copyright and credits
+ */
+
+
+#include <linux/module.h>
+#include <linux/init.h>
+#include <linux/soundcard.h>
+#include <linux/mm.h>
+
+#include <asm/pgalloc.h>
+#include <asm/uaccess.h>
+#include <asm/atariints.h>
+#include <asm/atari_stram.h>
+
+#include "dmasound.h"
+
+
+extern void atari_microwire_cmd(int cmd);
+
+
+static int is_falcon;
+static int write_sq_ignore_int = 0;    /* ++TeSche: used for Falcon */
+
+static int expand_bal; /* Balance factor for expanding (not volume!) */
+static int expand_data;        /* Data for expanding */
+
+
+/*** Translations ************************************************************/
+
+
+/* ++TeSche: radically changed for new expanding purposes...
+ *
+ * These two routines now deal with copying/expanding/translating the samples
+ * from user space into our buffer at the right frequency. They take care about
+ * how much data there's actually to read, how much buffer space there is and
+ * to convert samples into the right frequency/encoding. They will only work on
+ * complete samples so it may happen they leave some bytes in the input stream
+ * if the user didn't write a multiple of the current sample size. They both
+ * return the number of bytes they've used from both streams so you may detect
+ * such a situation. Luckily all programs should be able to cope with that.
+ *
+ * I think I've optimized anything as far as one can do in plain C, all
+ * variables should fit in registers and the loops are really short. There's
+ * one loop for every possible situation. Writing a more generalized and thus
+ * parameterized loop would only produce slower code. Feel free to optimize
+ * this in assembler if you like. :)
+ *
+ * I think these routines belong here because they're not yet really hardware
+ * independent, especially the fact that the Falcon can play 16bit samples
+ * only in stereo is hardcoded in both of them!
+ *
+ * ++geert: split in even more functions (one per format)
+ */
+
+static ssize_t ata_ct_law(const u_char *userPtr, size_t userCount,
+                         u_char frame[], ssize_t *frameUsed,
+                         ssize_t frameLeft);
+static ssize_t ata_ct_s8(const u_char *userPtr, size_t userCount,
+                        u_char frame[], ssize_t *frameUsed,
+                        ssize_t frameLeft);
+static ssize_t ata_ct_u8(const u_char *userPtr, size_t userCount,
+                        u_char frame[], ssize_t *frameUsed,
+                        ssize_t frameLeft);
+static ssize_t ata_ct_s16be(const u_char *userPtr, size_t userCount,
+                           u_char frame[], ssize_t *frameUsed,
+                           ssize_t frameLeft);
+static ssize_t ata_ct_u16be(const u_char *userPtr, size_t userCount,
+                           u_char frame[], ssize_t *frameUsed,
+                           ssize_t frameLeft);
+static ssize_t ata_ct_s16le(const u_char *userPtr, size_t userCount,
+                           u_char frame[], ssize_t *frameUsed,
+                           ssize_t frameLeft);
+static ssize_t ata_ct_u16le(const u_char *userPtr, size_t userCount,
+                           u_char frame[], ssize_t *frameUsed,
+                           ssize_t frameLeft);
+static ssize_t ata_ctx_law(const u_char *userPtr, size_t userCount,
+                          u_char frame[], ssize_t *frameUsed,
+                          ssize_t frameLeft);
+static ssize_t ata_ctx_s8(const u_char *userPtr, size_t userCount,
+                         u_char frame[], ssize_t *frameUsed,
+                         ssize_t frameLeft);
+static ssize_t ata_ctx_u8(const u_char *userPtr, size_t userCount,
+                         u_char frame[], ssize_t *frameUsed,
+                         ssize_t frameLeft);
+static ssize_t ata_ctx_s16be(const u_char *userPtr, size_t userCount,
+                            u_char frame[], ssize_t *frameUsed,
+                            ssize_t frameLeft);
+static ssize_t ata_ctx_u16be(const u_char *userPtr, size_t userCount,
+                            u_char frame[], ssize_t *frameUsed,
+                            ssize_t frameLeft);
+static ssize_t ata_ctx_s16le(const u_char *userPtr, size_t userCount,
+                            u_char frame[], ssize_t *frameUsed,
+                            ssize_t frameLeft);
+static ssize_t ata_ctx_u16le(const u_char *userPtr, size_t userCount,
+                            u_char frame[], ssize_t *frameUsed,
+                            ssize_t frameLeft);
+
+
+/*** Low level stuff *********************************************************/
+
+
+static void AtaOpen(void);
+static void AtaRelease(void);
+static void *AtaAlloc(unsigned int size, int flags);
+static void AtaFree(void *, unsigned int size);
+static int AtaIrqInit(void);
+#ifdef MODULE
+static void AtaIrqCleanUp(void);
+#endif /* MODULE */
+static int AtaSetBass(int bass);
+static int AtaSetTreble(int treble);
+static void TTSilence(void);
+static void TTInit(void);
+static int TTSetFormat(int format);
+static int TTSetVolume(int volume);
+static int TTSetGain(int gain);
+static void FalconSilence(void);
+static void FalconInit(void);
+static int FalconSetFormat(int format);
+static int FalconSetVolume(int volume);
+static void AtaPlayNextFrame(int index);
+static void AtaPlay(void);
+static void AtaInterrupt(int irq, void *dummy, struct pt_regs *fp);
+
+/*** Mid level stuff *********************************************************/
+
+static void TTMixerInit(void);
+static void FalconMixerInit(void);
+static int AtaMixerIoctl(u_int cmd, u_long arg);
+static int TTMixerIoctl(u_int cmd, u_long arg);
+static int FalconMixerIoctl(u_int cmd, u_long arg);
+static void AtaWriteSqSetup(void);
+static void AtaSqOpen(void);
+static int TTStateInfo(char *buffer);
+static int FalconStateInfo(char *buffer);
+
+
+/*** Translations ************************************************************/
+
+
+static ssize_t ata_ct_law(const u_char *userPtr, size_t userCount,
+                         u_char frame[], ssize_t *frameUsed,
+                         ssize_t frameLeft)
+{
+       char *table = dmasound.soft.format == AFMT_MU_LAW ? dmasound_ulaw2dma8
+                                                         : dmasound_alaw2dma8;
+       ssize_t count, used;
+       u_char *p = &frame[*frameUsed];
+
+       count = min(userCount, frameLeft);
+       if (dmasound.soft.stereo)
+               count &= ~1;
+       used = count;
+       while (count > 0) {
+               u_char data;
+               if (get_user(data, userPtr++))
+                       return -EFAULT;
+               *p++ = table[data];
+               count--;
+       }
+       *frameUsed += used;
+       return used;
+}
+
+
+static ssize_t ata_ct_s8(const u_char *userPtr, size_t userCount,
+                        u_char frame[], ssize_t *frameUsed,
+                        ssize_t frameLeft)
+{
+       ssize_t count, used;
+       void *p = &frame[*frameUsed];
+
+       count = min(userCount, frameLeft);
+       if (dmasound.soft.stereo)
+               count &= ~1;
+       used = count;
+       if (copy_from_user(p, userPtr, count))
+               return -EFAULT;
+       *frameUsed += used;
+       return used;
+}
+
+
+static ssize_t ata_ct_u8(const u_char *userPtr, size_t userCount,
+                        u_char frame[], ssize_t *frameUsed,
+                        ssize_t frameLeft)
+{
+       ssize_t count, used;
+
+       if (!dmasound.soft.stereo) {
+               u_char *p = &frame[*frameUsed];
+               count = min(userCount, frameLeft);
+               used = count;
+               while (count > 0) {
+                       u_char data;
+                       if (get_user(data, userPtr++))
+                               return -EFAULT;
+                       *p++ = data ^ 0x80;
+                       count--;
+               }
+       } else {
+               u_short *p = (u_short *)&frame[*frameUsed];
+               count = min(userCount, frameLeft)>>1;
+               used = count*2;
+               while (count > 0) {
+                       u_short data;
+                       if (get_user(data, ((u_short *)userPtr)++))
+                               return -EFAULT;
+                       *p++ = data ^ 0x8080;
+                       count--;
+               }
+       }
+       *frameUsed += used;
+       return used;
+}
+
+
+static ssize_t ata_ct_s16be(const u_char *userPtr, size_t userCount,
+                           u_char frame[], ssize_t *frameUsed,
+                           ssize_t frameLeft)
+{
+       ssize_t count, used;
+
+       if (!dmasound.soft.stereo) {
+               u_short *p = (u_short *)&frame[*frameUsed];
+               count = min(userCount, frameLeft)>>1;
+               used = count*2;
+               while (count > 0) {
+                       u_short data;
+                       if (get_user(data, ((u_short *)userPtr)++))
+                               return -EFAULT;
+                       *p++ = data;
+                       *p++ = data;
+                       count--;
+               }
+               *frameUsed += used*2;
+       } else {
+               void *p = (u_short *)&frame[*frameUsed];
+               count = min(userCount, frameLeft) & ~3;
+               used = count;
+               if (copy_from_user(p, userPtr, count))
+                       return -EFAULT;
+               *frameUsed += used;
+       }
+       return used;
+}
+
+
+static ssize_t ata_ct_u16be(const u_char *userPtr, size_t userCount,
+                           u_char frame[], ssize_t *frameUsed,
+                           ssize_t frameLeft)
+{
+       ssize_t count, used;
+
+       if (!dmasound.soft.stereo) {
+               u_short *p = (u_short *)&frame[*frameUsed];
+               count = min(userCount, frameLeft)>>1;
+               used = count*2;
+               while (count > 0) {
+                       u_short data;
+                       if (get_user(data, ((u_short *)userPtr)++))
+                               return -EFAULT;
+                       data ^= 0x8000;
+                       *p++ = data;
+                       *p++ = data;
+                       count--;
+               }
+               *frameUsed += used*2;
+       } else {
+               u_long *p = (u_long *)&frame[*frameUsed];
+               count = min(userCount, frameLeft)>>2;
+               used = count*4;
+               while (count > 0) {
+                       u_long data;
+                       if (get_user(data, ((u_int *)userPtr)++))
+                               return -EFAULT;
+                       *p++ = data ^ 0x80008000;
+                       count--;
+               }
+               *frameUsed += used;
+       }
+       return used;
+}
+
+
+static ssize_t ata_ct_s16le(const u_char *userPtr, size_t userCount,
+                           u_char frame[], ssize_t *frameUsed,
+                           ssize_t frameLeft)
+{
+       ssize_t count, used;
+
+       count = frameLeft;
+       if (!dmasound.soft.stereo) {
+               u_short *p = (u_short *)&frame[*frameUsed];
+               count = min(userCount, frameLeft)>>1;
+               used = count*2;
+               while (count > 0) {
+                       u_short data;
+                       if (get_user(data, ((u_short *)userPtr)++))
+                               return -EFAULT;
+                       data = le2be16(data);
+                       *p++ = data;
+                       *p++ = data;
+                       count--;
+               }
+               *frameUsed += used*2;
+       } else {
+               u_long *p = (u_long *)&frame[*frameUsed];
+               count = min(userCount, frameLeft)>>2;
+               used = count*4;
+               while (count > 0) {
+                       u_long data;
+                       if (get_user(data, ((u_int *)userPtr)++))
+                               return -EFAULT;
+                       data = le2be16dbl(data);
+                       *p++ = data;
+                       count--;
+               }
+               *frameUsed += used;
+       }
+       return used;
+}
+
+
+static ssize_t ata_ct_u16le(const u_char *userPtr, size_t userCount,
+                           u_char frame[], ssize_t *frameUsed,
+                           ssize_t frameLeft)
+{
+       ssize_t count, used;
+
+       count = frameLeft;
+       if (!dmasound.soft.stereo) {
+               u_short *p = (u_short *)&frame[*frameUsed];
+               count = min(userCount, frameLeft)>>1;
+               used = count*2;
+               while (count > 0) {
+                       u_short data;
+                       if (get_user(data, ((u_short *)userPtr)++))
+                               return -EFAULT;
+                       data = le2be16(data) ^ 0x8000;
+                       *p++ = data;
+                       *p++ = data;
+               }
+               *frameUsed += used*2;
+       } else {
+               u_long *p = (u_long *)&frame[*frameUsed];
+               count = min(userCount, frameLeft)>>2;
+               used = count;
+               while (count > 0) {
+                       u_long data;
+                       if (get_user(data, ((u_int *)userPtr)++))
+                               return -EFAULT;
+                       data = le2be16dbl(data) ^ 0x80008000;
+                       *p++ = data;
+                       count--;
+               }
+               *frameUsed += used;
+       }
+       return used;
+}
+
+
+static ssize_t ata_ctx_law(const u_char *userPtr, size_t userCount,
+                          u_char frame[], ssize_t *frameUsed,
+                          ssize_t frameLeft)
+{
+       char *table = dmasound.soft.format == AFMT_MU_LAW ? dmasound_ulaw2dma8
+                                                         : dmasound_alaw2dma8;
+       /* this should help gcc to stuff everything into registers */
+       long bal = expand_bal;
+       long hSpeed = dmasound.hard.speed, sSpeed = dmasound.soft.speed;
+       ssize_t used, usedf;
+
+       used = userCount;
+       usedf = frameLeft;
+       if (!dmasound.soft.stereo) {
+               u_char *p = &frame[*frameUsed];
+               u_char data = expand_data;
+               while (frameLeft) {
+                       u_char c;
+                       if (bal < 0) {
+                               if (!userCount)
+                                       break;
+                               if (get_user(c, userPtr++))
+                                       return -EFAULT;
+                               data = table[c];
+                               userCount--;
+                               bal += hSpeed;
+                       }
+                       *p++ = data;
+                       frameLeft--;
+                       bal -= sSpeed;
+               }
+               expand_data = data;
+       } else {
+               u_short *p = (u_short *)&frame[*frameUsed];
+               u_short data = expand_data;
+               while (frameLeft >= 2) {
+                       u_char c;
+                       if (bal < 0) {
+                               if (userCount < 2)
+                                       break;
+                               if (get_user(c, userPtr++))
+                                       return -EFAULT;
+                               data = table[c] << 8;
+                               if (get_user(c, userPtr++))
+                                       return -EFAULT;
+                               data |= table[c];
+                               userCount -= 2;
+                               bal += hSpeed;
+                       }
+                       *p++ = data;
+                       frameLeft -= 2;
+                       bal -= sSpeed;
+               }
+               expand_data = data;
+       }
+       expand_bal = bal;
+       used -= userCount;
+       *frameUsed += usedf-frameLeft;
+       return used;
+}
+
+
+static ssize_t ata_ctx_s8(const u_char *userPtr, size_t userCount,
+                         u_char frame[], ssize_t *frameUsed,
+                         ssize_t frameLeft)
+{
+       /* this should help gcc to stuff everything into registers */
+       long bal = expand_bal;
+       long hSpeed = dmasound.hard.speed, sSpeed = dmasound.soft.speed;
+       ssize_t used, usedf;
+
+       used = userCount;
+       usedf = frameLeft;
+       if (!dmasound.soft.stereo) {
+               u_char *p = &frame[*frameUsed];
+               u_char data = expand_data;
+               while (frameLeft) {
+                       if (bal < 0) {
+                               if (!userCount)
+                                       break;
+                               if (get_user(data, userPtr++))
+                                       return -EFAULT;
+                               userCount--;
+                               bal += hSpeed;
+                       }
+                       *p++ = data;
+                       frameLeft--;
+                       bal -= sSpeed;
+               }
+               expand_data = data;
+       } else {
+               u_short *p = (u_short *)&frame[*frameUsed];
+               u_short data = expand_data;
+               while (frameLeft >= 2) {
+                       if (bal < 0) {
+                               if (userCount < 2)
+                                       break;
+                               if (get_user(data, ((u_short *)userPtr)++))
+                                       return -EFAULT;
+                               userCount -= 2;
+                               bal += hSpeed;
+                       }
+                       *p++ = data;
+                       frameLeft -= 2;
+                       bal -= sSpeed;
+               }
+               expand_data = data;
+       }
+       expand_bal = bal;
+       used -= userCount;
+       *frameUsed += usedf-frameLeft;
+       return used;
+}
+
+
+static ssize_t ata_ctx_u8(const u_char *userPtr, size_t userCount,
+                         u_char frame[], ssize_t *frameUsed,
+                         ssize_t frameLeft)
+{
+       /* this should help gcc to stuff everything into registers */
+       long bal = expand_bal;
+       long hSpeed = dmasound.hard.speed, sSpeed = dmasound.soft.speed;
+       ssize_t used, usedf;
+
+       used = userCount;
+       usedf = frameLeft;
+       if (!dmasound.soft.stereo) {
+               u_char *p = &frame[*frameUsed];
+               u_char data = expand_data;
+               while (frameLeft) {
+                       if (bal < 0) {
+                               if (!userCount)
+                                       break;
+                               if (get_user(data, userPtr++))
+                                       return -EFAULT;
+                               data ^= 0x80;
+                               userCount--;
+                               bal += hSpeed;
+                       }
+                       *p++ = data;
+                       frameLeft--;
+                       bal -= sSpeed;
+               }
+               expand_data = data;
+       } else {
+               u_short *p = (u_short *)&frame[*frameUsed];
+               u_short data = expand_data;
+               while (frameLeft >= 2) {
+                       if (bal < 0) {
+                               if (userCount < 2)
+                                       break;
+                               if (get_user(data, ((u_short *)userPtr)++))
+                                       return -EFAULT;
+                               data ^= 0x8080;
+                               userCount -= 2;
+                               bal += hSpeed;
+                       }
+                       *p++ = data;
+                       frameLeft -= 2;
+                       bal -= sSpeed;
+               }
+               expand_data = data;
+       }
+       expand_bal = bal;
+       used -= userCount;
+       *frameUsed += usedf-frameLeft;
+       return used;
+}
+
+
+static ssize_t ata_ctx_s16be(const u_char *userPtr, size_t userCount,
+                            u_char frame[], ssize_t *frameUsed,
+                            ssize_t frameLeft)
+{
+       /* this should help gcc to stuff everything into registers */
+       long bal = expand_bal;
+       long hSpeed = dmasound.hard.speed, sSpeed = dmasound.soft.speed;
+       ssize_t used, usedf;
+
+       used = userCount;
+       usedf = frameLeft;
+       if (!dmasound.soft.stereo) {
+               u_short *p = (u_short *)&frame[*frameUsed];
+               u_short data = expand_data;
+               while (frameLeft >= 4) {
+                       if (bal < 0) {
+                               if (userCount < 2)
+                                       break;
+                               if (get_user(data, ((u_short *)userPtr)++))
+                                       return -EFAULT;
+                               userCount -= 2;
+                               bal += hSpeed;
+                       }
+                       *p++ = data;
+                       *p++ = data;
+                       frameLeft -= 4;
+                       bal -= sSpeed;
+               }
+               expand_data = data;
+       } else {
+               u_long *p = (u_long *)&frame[*frameUsed];
+               u_long data = expand_data;
+               while (frameLeft >= 4) {
+                       if (bal < 0) {
+                               if (userCount < 4)
+                                       break;
+                               if (get_user(data, ((u_int *)userPtr)++))
+                                       return -EFAULT;
+                               userCount -= 4;
+                               bal += hSpeed;
+                       }
+                       *p++ = data;
+                       frameLeft -= 4;
+                       bal -= sSpeed;
+               }
+               expand_data = data;
+       }
+       expand_bal = bal;
+       used -= userCount;
+       *frameUsed += usedf-frameLeft;
+       return used;
+}
+
+
+static ssize_t ata_ctx_u16be(const u_char *userPtr, size_t userCount,
+                            u_char frame[], ssize_t *frameUsed,
+                            ssize_t frameLeft)
+{
+       /* this should help gcc to stuff everything into registers */
+       long bal = expand_bal;
+       long hSpeed = dmasound.hard.speed, sSpeed = dmasound.soft.speed;
+       ssize_t used, usedf;
+
+       used = userCount;
+       usedf = frameLeft;
+       if (!dmasound.soft.stereo) {
+               u_short *p = (u_short *)&frame[*frameUsed];
+               u_short data = expand_data;
+               while (frameLeft >= 4) {
+                       if (bal < 0) {
+                               if (userCount < 2)
+                                       break;
+                               if (get_user(data, ((u_short *)userPtr)++))
+                                       return -EFAULT;
+                               data ^= 0x8000;
+                               userCount -= 2;
+                               bal += hSpeed;
+                       }
+                       *p++ = data;
+                       *p++ = data;
+                       frameLeft -= 4;
+                       bal -= sSpeed;
+               }
+               expand_data = data;
+       } else {
+               u_long *p = (u_long *)&frame[*frameUsed];
+               u_long data = expand_data;
+               while (frameLeft >= 4) {
+                       if (bal < 0) {
+                               if (userCount < 4)
+                                       break;
+                               if (get_user(data, ((u_int *)userPtr)++))
+                                       return -EFAULT;
+                               data ^= 0x80008000;
+                               userCount -= 4;
+                               bal += hSpeed;
+                       }
+                       *p++ = data;
+                       frameLeft -= 4;
+                       bal -= sSpeed;
+               }
+               expand_data = data;
+       }
+       expand_bal = bal;
+       used -= userCount;
+       *frameUsed += usedf-frameLeft;
+       return used;
+}
+
+
+static ssize_t ata_ctx_s16le(const u_char *userPtr, size_t userCount,
+                            u_char frame[], ssize_t *frameUsed,
+                            ssize_t frameLeft)
+{
+       /* this should help gcc to stuff everything into registers */
+       long bal = expand_bal;
+       long hSpeed = dmasound.hard.speed, sSpeed = dmasound.soft.speed;
+       ssize_t used, usedf;
+
+       used = userCount;
+       usedf = frameLeft;
+       if (!dmasound.soft.stereo) {
+               u_short *p = (u_short *)&frame[*frameUsed];
+               u_short data = expand_data;
+               while (frameLeft >= 4) {
+                       if (bal < 0) {
+                               if (userCount < 2)
+                                       break;
+                               if (get_user(data, ((u_short *)userPtr)++))
+                                       return -EFAULT;
+                               data = le2be16(data);
+                               userCount -= 2;
+                               bal += hSpeed;
+                       }
+                       *p++ = data;
+                       *p++ = data;
+                       frameLeft -= 4;
+                       bal -= sSpeed;
+               }
+               expand_data = data;
+       } else {
+               u_long *p = (u_long *)&frame[*frameUsed];
+               u_long data = expand_data;
+               while (frameLeft >= 4) {
+                       if (bal < 0) {
+                               if (userCount < 4)
+                                       break;
+                               if (get_user(data, ((u_int *)userPtr)++))
+                                       return -EFAULT;
+                               data = le2be16dbl(data);
+                               userCount -= 4;
+                               bal += hSpeed;
+                       }
+                       *p++ = data;
+                       frameLeft -= 4;
+                       bal -= sSpeed;
+               }
+               expand_data = data;
+       }
+       expand_bal = bal;
+       used -= userCount;
+       *frameUsed += usedf-frameLeft;
+       return used;
+}
+
+
+static ssize_t ata_ctx_u16le(const u_char *userPtr, size_t userCount,
+                            u_char frame[], ssize_t *frameUsed,
+                            ssize_t frameLeft)
+{
+       /* this should help gcc to stuff everything into registers */
+       long bal = expand_bal;
+       long hSpeed = dmasound.hard.speed, sSpeed = dmasound.soft.speed;
+       ssize_t used, usedf;
+
+       used = userCount;
+       usedf = frameLeft;
+       if (!dmasound.soft.stereo) {
+               u_short *p = (u_short *)&frame[*frameUsed];
+               u_short data = expand_data;
+               while (frameLeft >= 4) {
+                       if (bal < 0) {
+                               if (userCount < 2)
+                                       break;
+                               if (get_user(data, ((u_short *)userPtr)++))
+                                       return -EFAULT;
+                               data = le2be16(data) ^ 0x8000;
+                               userCount -= 2;
+                               bal += hSpeed;
+                       }
+                       *p++ = data;
+                       *p++ = data;
+                       frameLeft -= 4;
+                       bal -= sSpeed;
+               }
+               expand_data = data;
+       } else {
+               u_long *p = (u_long *)&frame[*frameUsed];
+               u_long data = expand_data;
+               while (frameLeft >= 4) {
+                       if (bal < 0) {
+                               if (userCount < 4)
+                                       break;
+                               if (get_user(data, ((u_int *)userPtr)++))
+                                       return -EFAULT;
+                               data = le2be16dbl(data) ^ 0x80008000;
+                               userCount -= 4;
+                               bal += hSpeed;
+                       }
+                       *p++ = data;
+                       frameLeft -= 4;
+                       bal -= sSpeed;
+               }
+               expand_data = data;
+       }
+       expand_bal = bal;
+       used -= userCount;
+       *frameUsed += usedf-frameLeft;
+       return used;
+}
+
+
+static TRANS transTTNormal = {
+       ct_ulaw:        ata_ct_law,
+       ct_alaw:        ata_ct_law,
+       ct_s8:          ata_ct_s8,
+       ct_u8:          ata_ct_u8,
+};
+
+static TRANS transTTExpanding = {
+       ct_ulaw:        ata_ctx_law,
+       ct_alaw:        ata_ctx_law,
+       ct_s8:          ata_ctx_s8,
+       ct_u8:          ata_ctx_u8,
+};
+
+static TRANS transFalconNormal = {
+       ct_ulaw:        ata_ct_law,
+       ct_alaw:        ata_ct_law,
+       ct_s8:          ata_ct_s8,
+       ct_u8:          ata_ct_u8,
+       ct_s16be:       ata_ct_s16be,
+       ct_u16be:       ata_ct_u16be,
+       ct_s16le:       ata_ct_s16le,
+       ct_u16le:       ata_ct_u16le
+};
+
+static TRANS transFalconExpanding = {
+       ct_ulaw:        ata_ctx_law,
+       ct_alaw:        ata_ctx_law,
+       ct_s8:          ata_ctx_s8,
+       ct_u8:          ata_ctx_u8,
+       ct_s16be:       ata_ctx_s16be,
+       ct_u16be:       ata_ctx_u16be,
+       ct_s16le:       ata_ctx_s16le,
+       ct_u16le:       ata_ctx_u16le,
+};
+
+
+/*** Low level stuff *********************************************************/
+
+
+
+/*
+ * Atari (TT/Falcon)
+ */
+
+static void AtaOpen(void)
+{
+       MOD_INC_USE_COUNT;
+}
+
+static void AtaRelease(void)
+{
+       MOD_DEC_USE_COUNT;
+}
+
+static void *AtaAlloc(unsigned int size, int flags)
+{
+       return atari_stram_alloc( size, NULL, "dmasound" );
+}
+
+static void AtaFree(void *obj, unsigned int size)
+{
+       atari_stram_free( obj );
+}
+
+static int __init AtaIrqInit(void)
+{
+       /* Set up timer A. Timer A
+          will receive a signal upon end of playing from the sound
+          hardware. Furthermore Timer A is able to count events
+          and will cause an interrupt after a programmed number
+          of events. So all we need to keep the music playing is
+          to provide the sound hardware with new data upon
+          an interrupt from timer A. */
+       mfp.tim_ct_a = 0;       /* ++roman: Stop timer before programming! */
+       mfp.tim_dt_a = 1;       /* Cause interrupt after first event. */
+       mfp.tim_ct_a = 8;       /* Turn on event counting. */
+       /* Register interrupt handler. */
+       request_irq(IRQ_MFP_TIMA, AtaInterrupt, IRQ_TYPE_SLOW, "DMA sound",
+                   AtaInterrupt);
+       mfp.int_en_a |= 0x20;   /* Turn interrupt on. */
+       mfp.int_mk_a |= 0x20;
+       return 1;
+}
+
+#ifdef MODULE
+static void AtaIrqCleanUp(void)
+{
+       mfp.tim_ct_a = 0;       /* stop timer */
+       mfp.int_en_a &= ~0x20;  /* turn interrupt off */
+       free_irq(IRQ_MFP_TIMA, AtaInterrupt);
+}
+#endif /* MODULE */
+
+
+#define TONE_VOXWARE_TO_DB(v) \
+       (((v) < 0) ? -12 : ((v) > 100) ? 12 : ((v) - 50) * 6 / 25)
+#define TONE_DB_TO_VOXWARE(v) (((v) * 25 + ((v) > 0 ? 5 : -5)) / 6 + 50)
+
+
+static int AtaSetBass(int bass)
+{
+       dmasound.bass = TONE_VOXWARE_TO_DB(bass);
+       atari_microwire_cmd(MW_LM1992_BASS(dmasound.bass));
+       return TONE_DB_TO_VOXWARE(dmasound.bass);
+}
+
+
+static int AtaSetTreble(int treble)
+{
+       dmasound.treble = TONE_VOXWARE_TO_DB(treble);
+       atari_microwire_cmd(MW_LM1992_TREBLE(dmasound.treble));
+       return TONE_DB_TO_VOXWARE(dmasound.treble);
+}
+
+
+
+/*
+ * TT
+ */
+
+
+static void TTSilence(void)
+{
+       tt_dmasnd.ctrl = DMASND_CTRL_OFF;
+       atari_microwire_cmd(MW_LM1992_PSG_HIGH); /* mix in PSG signal 1:1 */
+}
+
+
+static void TTInit(void)
+{
+       int mode, i, idx;
+       const int freq[4] = {50066, 25033, 12517, 6258};
+
+       /* search a frequency that fits into the allowed error range */
+
+       idx = -1;
+       for (i = 0; i < arraysize(freq); i++)
+               /* this isn't as much useful for a TT than for a Falcon, but
+                * then it doesn't hurt very much to implement it for a TT too.
+                */
+               if ((100 * abs(dmasound.soft.speed - freq[i]) / freq[i]) < catchRadius)
+                       idx = i;
+       if (idx > -1) {
+               dmasound.soft.speed = freq[idx];
+               dmasound.trans_write = &transTTNormal;
+       } else
+               dmasound.trans_write = &transTTExpanding;
+
+       TTSilence();
+       dmasound.hard = dmasound.soft;
+
+       if (dmasound.hard.speed > 50066) {
+               /* we would need to squeeze the sound, but we won't do that */
+               dmasound.hard.speed = 50066;
+               mode = DMASND_MODE_50KHZ;
+               dmasound.trans_write = &transTTNormal;
+       } else if (dmasound.hard.speed > 25033) {
+               dmasound.hard.speed = 50066;
+               mode = DMASND_MODE_50KHZ;
+       } else if (dmasound.hard.speed > 12517) {
+               dmasound.hard.speed = 25033;
+               mode = DMASND_MODE_25KHZ;
+       } else if (dmasound.hard.speed > 6258) {
+               dmasound.hard.speed = 12517;
+               mode = DMASND_MODE_12KHZ;
+       } else {
+               dmasound.hard.speed = 6258;
+               mode = DMASND_MODE_6KHZ;
+       }
+
+       tt_dmasnd.mode = (dmasound.hard.stereo ?
+                         DMASND_MODE_STEREO : DMASND_MODE_MONO) |
+               DMASND_MODE_8BIT | mode;
+
+       expand_bal = -dmasound.soft.speed;
+}
+
+
+static int TTSetFormat(int format)
+{
+       /* TT sound DMA supports only 8bit modes */
+
+       switch (format) {
+       case AFMT_QUERY:
+               return dmasound.soft.format;
+       case AFMT_MU_LAW:
+       case AFMT_A_LAW:
+       case AFMT_S8:
+       case AFMT_U8:
+               break;
+       default:
+               format = AFMT_S8;
+       }
+
+       dmasound.soft.format = format;
+       dmasound.soft.size = 8;
+       if (dmasound.minDev == SND_DEV_DSP) {
+               dmasound.dsp.format = format;
+               dmasound.dsp.size = 8;
+       }
+       TTInit();
+
+       return format;
+}
+
+
+#define VOLUME_VOXWARE_TO_DB(v) \
+       (((v) < 0) ? -40 : ((v) > 100) ? 0 : ((v) * 2) / 5 - 40)
+#define VOLUME_DB_TO_VOXWARE(v) ((((v) + 40) * 5 + 1) / 2)
+
+
+static int TTSetVolume(int volume)
+{
+       dmasound.volume_left = VOLUME_VOXWARE_TO_DB(volume & 0xff);
+       atari_microwire_cmd(MW_LM1992_BALLEFT(dmasound.volume_left));
+       dmasound.volume_right = VOLUME_VOXWARE_TO_DB((volume & 0xff00) >> 8);
+       atari_microwire_cmd(MW_LM1992_BALRIGHT(dmasound.volume_right));
+       return VOLUME_DB_TO_VOXWARE(dmasound.volume_left) |
+              (VOLUME_DB_TO_VOXWARE(dmasound.volume_right) << 8);
+}
+
+
+#define GAIN_VOXWARE_TO_DB(v) \
+       (((v) < 0) ? -80 : ((v) > 100) ? 0 : ((v) * 4) / 5 - 80)
+#define GAIN_DB_TO_VOXWARE(v) ((((v) + 80) * 5 + 1) / 4)
+
+static int TTSetGain(int gain)
+{
+       dmasound.gain = GAIN_VOXWARE_TO_DB(gain);
+       atari_microwire_cmd(MW_LM1992_VOLUME(dmasound.gain));
+       return GAIN_DB_TO_VOXWARE(dmasound.gain);
+}
+
+
+
+/*
+ * Falcon
+ */
+
+
+static void FalconSilence(void)
+{
+       /* stop playback, set sample rate 50kHz for PSG sound */
+       tt_dmasnd.ctrl = DMASND_CTRL_OFF;
+       tt_dmasnd.mode = DMASND_MODE_50KHZ | DMASND_MODE_STEREO | DMASND_MODE_8BIT;
+       tt_dmasnd.int_div = 0; /* STE compatible divider */
+       tt_dmasnd.int_ctrl = 0x0;
+       tt_dmasnd.cbar_src = 0x0000; /* no matrix inputs */
+       tt_dmasnd.cbar_dst = 0x0000; /* no matrix outputs */
+       tt_dmasnd.dac_src = 1; /* connect ADC to DAC, disconnect matrix */
+       tt_dmasnd.adc_src = 3; /* ADC Input = PSG */
+}
+
+
+static void FalconInit(void)
+{
+       int divider, i, idx;
+       const int freq[8] = {49170, 32780, 24585, 19668, 16390, 12292, 9834, 8195};
+
+       /* search a frequency that fits into the allowed error range */
+
+       idx = -1;
+       for (i = 0; i < arraysize(freq); i++)
+               /* if we will tolerate 3% error 8000Hz->8195Hz (2.38%) would
+                * be playable without expanding, but that now a kernel runtime
+                * option
+                */
+               if ((100 * abs(dmasound.soft.speed - freq[i]) / freq[i]) < catchRadius)
+                       idx = i;
+       if (idx > -1) {
+               dmasound.soft.speed = freq[idx];
+               dmasound.trans_write = &transFalconNormal;
+       } else
+               dmasound.trans_write = &transFalconExpanding;
+
+       FalconSilence();
+       dmasound.hard = dmasound.soft;
+
+       if (dmasound.hard.size == 16) {
+               /* the Falcon can play 16bit samples only in stereo */
+               dmasound.hard.stereo = 1;
+       }
+
+       if (dmasound.hard.speed > 49170) {
+               /* we would need to squeeze the sound, but we won't do that */
+               dmasound.hard.speed = 49170;
+               divider = 1;
+               dmasound.trans_write = &transFalconNormal;
+       } else if (dmasound.hard.speed > 32780) {
+               dmasound.hard.speed = 49170;
+               divider = 1;
+       } else if (dmasound.hard.speed > 24585) {
+               dmasound.hard.speed = 32780;
+               divider = 2;
+       } else if (dmasound.hard.speed > 19668) {
+               dmasound.hard.speed = 24585;
+               divider = 3;
+       } else if (dmasound.hard.speed > 16390) {
+               dmasound.hard.speed = 19668;
+               divider = 4;
+       } else if (dmasound.hard.speed > 12292) {
+               dmasound.hard.speed = 16390;
+               divider = 5;
+       } else if (dmasound.hard.speed > 9834) {
+               dmasound.hard.speed = 12292;
+               divider = 7;
+       } else if (dmasound.hard.speed > 8195) {
+               dmasound.hard.speed = 9834;
+               divider = 9;
+       } else {
+               dmasound.hard.speed = 8195;
+               divider = 11;
+       }
+       tt_dmasnd.int_div = divider;
+
+       /* Setup Falcon sound DMA for playback */
+       tt_dmasnd.int_ctrl = 0x4; /* Timer A int at play end */
+       tt_dmasnd.track_select = 0x0; /* play 1 track, track 1 */
+       tt_dmasnd.cbar_src = 0x0001; /* DMA(25MHz) --> DAC */
+       tt_dmasnd.cbar_dst = 0x0000;
+       tt_dmasnd.rec_track_select = 0;
+       tt_dmasnd.dac_src = 2; /* connect matrix to DAC */
+       tt_dmasnd.adc_src = 0; /* ADC Input = Mic */
+
+       tt_dmasnd.mode = (dmasound.hard.stereo ?
+                         DMASND_MODE_STEREO : DMASND_MODE_MONO) |
+               ((dmasound.hard.size == 8) ?
+                DMASND_MODE_8BIT : DMASND_MODE_16BIT) |
+               DMASND_MODE_6KHZ;
+
+       expand_bal = -dmasound.soft.speed;
+}
+
+
+static int FalconSetFormat(int format)
+{
+       int size;
+       /* Falcon sound DMA supports 8bit and 16bit modes */
+
+       switch (format) {
+       case AFMT_QUERY:
+               return dmasound.soft.format;
+       case AFMT_MU_LAW:
+       case AFMT_A_LAW:
+       case AFMT_U8:
+       case AFMT_S8:
+               size = 8;
+               break;
+       case AFMT_S16_BE:
+       case AFMT_U16_BE:
+       case AFMT_S16_LE:
+       case AFMT_U16_LE:
+               size = 16;
+               break;
+       default: /* :-) */
+               size = 8;
+               format = AFMT_S8;
+       }
+
+       dmasound.soft.format = format;
+       dmasound.soft.size = size;
+       if (dmasound.minDev == SND_DEV_DSP) {
+               dmasound.dsp.format = format;
+               dmasound.dsp.size = dmasound.soft.size;
+       }
+
+       FalconInit();
+
+       return format;
+}
+
+
+/* This is for the Falcon output *attenuation* in 1.5dB steps,
+ * i.e. output level from 0 to -22.5dB in -1.5dB steps.
+ */
+#define VOLUME_VOXWARE_TO_ATT(v) \
+       ((v) < 0 ? 15 : (v) > 100 ? 0 : 15 - (v) * 3 / 20)
+#define VOLUME_ATT_TO_VOXWARE(v) (100 - (v) * 20 / 3)
+
+
+static int FalconSetVolume(int volume)
+{
+       dmasound.volume_left = VOLUME_VOXWARE_TO_ATT(volume & 0xff);
+       dmasound.volume_right = VOLUME_VOXWARE_TO_ATT((volume & 0xff00) >> 8);
+       tt_dmasnd.output_atten = dmasound.volume_left << 8 | dmasound.volume_right << 4;
+       return VOLUME_ATT_TO_VOXWARE(dmasound.volume_left) |
+              VOLUME_ATT_TO_VOXWARE(dmasound.volume_right) << 8;
+}
+
+
+static void AtaPlayNextFrame(int index)
+{
+       char *start, *end;
+
+       /* used by AtaPlay() if all doubts whether there really is something
+        * to be played are already wiped out.
+        */
+       start = write_sq.buffers[write_sq.front];
+       end = start+((write_sq.count == index) ? write_sq.rear_size
+                                              : write_sq.block_size);
+       /* end might not be a legal virtual address. */
+       DMASNDSetEnd(virt_to_phys(end - 1) + 1);
+       DMASNDSetBase(virt_to_phys(start));
+       /* Since only an even number of samples per frame can
+          be played, we might lose one byte here. (TO DO) */
+       write_sq.front = (write_sq.front+1) % write_sq.max_count;
+       write_sq.active++;
+       tt_dmasnd.ctrl = DMASND_CTRL_ON | DMASND_CTRL_REPEAT;
+}
+
+
+static void AtaPlay(void)
+{
+       /* ++TeSche: Note that write_sq.active is no longer just a flag but
+        * holds the number of frames the DMA is currently programmed for
+        * instead, may be 0, 1 (currently being played) or 2 (pre-programmed).
+        *
+        * Changes done to write_sq.count and write_sq.active are a bit more
+        * subtle again so now I must admit I also prefer disabling the irq
+        * here rather than considering all possible situations. But the point
+        * is that disabling the irq doesn't have any bad influence on this
+        * version of the driver as we benefit from having pre-programmed the
+        * DMA wherever possible: There's no need to reload the DMA at the
+        * exact time of an interrupt but only at some time while the
+        * pre-programmed frame is playing!
+        */
+       atari_disable_irq(IRQ_MFP_TIMA);
+
+       if (write_sq.active == 2 ||     /* DMA is 'full' */
+           write_sq.count <= 0) {      /* nothing to do */
+               atari_enable_irq(IRQ_MFP_TIMA);
+               return;
+       }
+
+       if (write_sq.active == 0) {
+               /* looks like there's nothing 'in' the DMA yet, so try
+                * to put two frames into it (at least one is available).
+                */
+               if (write_sq.count == 1 &&
+                   write_sq.rear_size < write_sq.block_size &&
+                   !write_sq.syncing) {
+                       /* hmmm, the only existing frame is not
+                        * yet filled and we're not syncing?
+                        */
+                       atari_enable_irq(IRQ_MFP_TIMA);
+                       return;
+               }
+               AtaPlayNextFrame(1);
+               if (write_sq.count == 1) {
+                       /* no more frames */
+                       atari_enable_irq(IRQ_MFP_TIMA);
+                       return;
+               }
+               if (write_sq.count == 2 &&
+                   write_sq.rear_size < write_sq.block_size &&
+                   !write_sq.syncing) {
+                       /* hmmm, there were two frames, but the second
+                        * one is not yet filled and we're not syncing?
+                        */
+                       atari_enable_irq(IRQ_MFP_TIMA);
+                       return;
+               }
+               AtaPlayNextFrame(2);
+       } else {
+               /* there's already a frame being played so we may only stuff
+                * one new into the DMA, but even if this may be the last
+                * frame existing the previous one is still on write_sq.count.
+                */
+               if (write_sq.count == 2 &&
+                   write_sq.rear_size < write_sq.block_size &&
+                   !write_sq.syncing) {
+                       /* hmmm, the only existing frame is not
+                        * yet filled and we're not syncing?
+                        */
+                       atari_enable_irq(IRQ_MFP_TIMA);
+                       return;
+               }
+               AtaPlayNextFrame(2);
+       }
+       atari_enable_irq(IRQ_MFP_TIMA);
+}
+
+
+static void AtaInterrupt(int irq, void *dummy, struct pt_regs *fp)
+{
+#if 0
+       /* ++TeSche: if you should want to test this... */
+       static int cnt = 0;
+       if (write_sq.active == 2)
+               if (++cnt == 10) {
+                       /* simulate losing an interrupt */
+                       cnt = 0;
+                       return;
+               }
+#endif
+
+       if (write_sq_ignore_int && is_falcon) {
+               /* ++TeSche: Falcon only: ignore first irq because it comes
+                * immediately after starting a frame. after that, irqs come
+                * (almost) like on the TT.
+                */
+               write_sq_ignore_int = 0;
+               return;
+       }
+
+       if (!write_sq.active) {
+               /* playing was interrupted and sq_reset() has already cleared
+                * the sq variables, so better don't do anything here.
+                */
+               WAKE_UP(write_sq.sync_queue);
+               return;
+       }
+
+       /* Probably ;) one frame is finished. Well, in fact it may be that a
+        * pre-programmed one is also finished because there has been a long
+        * delay in interrupt delivery and we've completely lost one, but
+        * there's no way to detect such a situation. In such a case the last
+        * frame will be played more than once and the situation will recover
+        * as soon as the irq gets through.
+        */
+       write_sq.count--;
+       write_sq.active--;
+
+       if (!write_sq.active) {
+               tt_dmasnd.ctrl = DMASND_CTRL_OFF;
+               write_sq_ignore_int = 1;
+       }
+
+       WAKE_UP(write_sq.action_queue);
+       /* At least one block of the queue is free now
+          so wake up a writing process blocked because
+          of a full queue. */
+
+       if ((write_sq.active != 1) || (write_sq.count != 1))
+               /* We must be a bit carefully here: write_sq.count indicates the
+                * number of buffers used and not the number of frames to be
+                * played. If write_sq.count==1 and write_sq.active==1 that
+                * means the only remaining frame was already programmed
+                * earlier (and is currently running) so we mustn't call
+                * AtaPlay() here, otherwise we'll play one frame too much.
+                */
+               AtaPlay();
+
+       if (!write_sq.active) WAKE_UP(write_sq.sync_queue);
+       /* We are not playing after AtaPlay(), so there
+          is nothing to play any more. Wake up a process
+          waiting for audio output to drain. */
+}
+
+
+/*** Mid level stuff *********************************************************/
+
+
+/*
+ * /dev/mixer abstraction
+ */
+
+#define RECLEVEL_VOXWARE_TO_GAIN(v)    \
+       ((v) < 0 ? 0 : (v) > 100 ? 15 : (v) * 3 / 20)
+#define RECLEVEL_GAIN_TO_VOXWARE(v)    (((v) * 20 + 2) / 3)
+
+
+static void __init TTMixerInit(void)
+{
+       atari_microwire_cmd(MW_LM1992_VOLUME(0));
+       dmasound.volume_left = 0;
+       atari_microwire_cmd(MW_LM1992_BALLEFT(0));
+       dmasound.volume_right = 0;
+       atari_microwire_cmd(MW_LM1992_BALRIGHT(0));
+       atari_microwire_cmd(MW_LM1992_TREBLE(0));
+       atari_microwire_cmd(MW_LM1992_BASS(0));
+}
+
+static void __init FalconMixerInit(void)
+{
+       dmasound.volume_left = (tt_dmasnd.output_atten & 0xf00) >> 8;
+       dmasound.volume_right = (tt_dmasnd.output_atten & 0xf0) >> 4;
+}
+
+static int AtaMixerIoctl(u_int cmd, u_long arg)
+{
+       int data;
+       switch (cmd) {
+           case SOUND_MIXER_READ_SPEAKER:
+                   if (is_falcon || MACH_IS_TT) {
+                           int porta;
+                           cli();
+                           sound_ym.rd_data_reg_sel = 14;
+                           porta = sound_ym.rd_data_reg_sel;
+                           sti();
+                           return IOCTL_OUT(arg, porta & 0x40 ? 0 : 100);
+                   }
+                   break;
+           case SOUND_MIXER_WRITE_VOLUME:
+                   IOCTL_IN(arg, data);
+                   return IOCTL_OUT(arg, dmasound_set_volume(data));
+           case SOUND_MIXER_WRITE_SPEAKER:
+                   if (is_falcon || MACH_IS_TT) {
+                           int porta;
+                           IOCTL_IN(arg, data);
+                           cli();
+                           sound_ym.rd_data_reg_sel = 14;
+                           porta = (sound_ym.rd_data_reg_sel & ~0x40) |
+                                   (data < 50 ? 0x40 : 0);
+                           sound_ym.wd_data = porta;
+                           sti();
+                           return IOCTL_OUT(arg, porta & 0x40 ? 0 : 100);
+                   }
+       }
+       return -EINVAL;
+}
+
+
+static int TTMixerIoctl(u_int cmd, u_long arg)
+{
+       int data;
+       switch (cmd) {
+           case SOUND_MIXER_READ_RECMASK:
+               return IOCTL_OUT(arg, 0);
+           case SOUND_MIXER_READ_DEVMASK:
+               return IOCTL_OUT(arg,
+                                SOUND_MASK_VOLUME | SOUND_MASK_TREBLE | SOUND_MASK_BASS |
+                                (MACH_IS_TT ? SOUND_MASK_SPEAKER : 0));
+           case SOUND_MIXER_READ_STEREODEVS:
+               return IOCTL_OUT(arg, SOUND_MASK_VOLUME);
+           case SOUND_MIXER_READ_VOLUME:
+               return IOCTL_OUT(arg,
+                                VOLUME_DB_TO_VOXWARE(dmasound.volume_left) |
+                                (VOLUME_DB_TO_VOXWARE(dmasound.volume_right) << 8));
+           case SOUND_MIXER_READ_BASS:
+               return IOCTL_OUT(arg, TONE_DB_TO_VOXWARE(dmasound.bass));
+           case SOUND_MIXER_READ_TREBLE:
+               return IOCTL_OUT(arg, TONE_DB_TO_VOXWARE(dmasound.treble));
+           case SOUND_MIXER_READ_OGAIN:
+               return IOCTL_OUT(arg, GAIN_DB_TO_VOXWARE(dmasound.gain));
+           case SOUND_MIXER_WRITE_BASS:
+               IOCTL_IN(arg, data);
+               return IOCTL_OUT(arg, dmasound_set_bass(data));
+           case SOUND_MIXER_WRITE_TREBLE:
+               IOCTL_IN(arg, data);
+               return IOCTL_OUT(arg, dmasound_set_treble(data));
+           case SOUND_MIXER_WRITE_OGAIN:
+               IOCTL_IN(arg, data);
+               return IOCTL_OUT(arg, dmasound_set_gain(data));
+       }
+       return AtaMixerIoctl(cmd, arg);
+}
+
+static int FalconMixerIoctl(u_int cmd, u_long arg)
+{
+       int data;
+       switch (cmd) {
+           case SOUND_MIXER_READ_RECMASK:
+               return IOCTL_OUT(arg, SOUND_MASK_MIC);
+           case SOUND_MIXER_READ_DEVMASK:
+               return IOCTL_OUT(arg, SOUND_MASK_VOLUME | SOUND_MASK_MIC | SOUND_MASK_SPEAKER);
+           case SOUND_MIXER_READ_STEREODEVS:
+               return IOCTL_OUT(arg, SOUND_MASK_VOLUME | SOUND_MASK_MIC);
+           case SOUND_MIXER_READ_VOLUME:
+               return IOCTL_OUT(arg,
+                       VOLUME_ATT_TO_VOXWARE(dmasound.volume_left) |
+                       VOLUME_ATT_TO_VOXWARE(dmasound.volume_right) << 8);
+           case SOUND_MIXER_READ_CAPS:
+               return IOCTL_OUT(arg, SOUND_CAP_EXCL_INPUT);
+           case SOUND_MIXER_WRITE_MIC:
+               IOCTL_IN(arg, data);
+               tt_dmasnd.input_gain =
+                       RECLEVEL_VOXWARE_TO_GAIN(data & 0xff) << 4 |
+                       RECLEVEL_VOXWARE_TO_GAIN(data >> 8 & 0xff);
+               /* fall thru, return set value */
+           case SOUND_MIXER_READ_MIC:
+               return IOCTL_OUT(arg,
+                       RECLEVEL_GAIN_TO_VOXWARE(tt_dmasnd.input_gain >> 4 & 0xf) |
+                       RECLEVEL_GAIN_TO_VOXWARE(tt_dmasnd.input_gain & 0xf) << 8);
+       }
+       return AtaMixerIoctl(cmd, arg);
+}
+
+static void AtaWriteSqSetup(void)
+{
+       write_sq_ignore_int = 0;
+}
+
+static void AtaSqOpen(void)
+{
+       write_sq_ignore_int = 1;
+}
+
+static int TTStateInfo(char *buffer)
+{
+       int len = 0;
+       len += sprintf(buffer+len, "\tsound.volume_left = %ddB [-40...0]\n",
+                      dmasound.volume_left);
+       len += sprintf(buffer+len, "\tsound.volume_right = %ddB [-40...0]\n",
+                      dmasound.volume_right);
+       len += sprintf(buffer+len, "\tsound.bass = %ddB [-12...+12]\n",
+                      dmasound.bass);
+       len += sprintf(buffer+len, "\tsound.treble = %ddB [-12...+12]\n",
+                      dmasound.treble);
+       return len;
+}
+
+static int FalconStateInfo(char *buffer)
+{
+       int len = 0;
+       len += sprintf(buffer+len, "\tsound.volume_left = %ddB [-22.5...0]\n",
+                      dmasound.volume_left);
+       len += sprintf(buffer+len, "\tsound.volume_right = %ddB [-22.5...0]\n",
+                      dmasound.volume_right);
+       return len;
+}
+
+
+/*** Machine definitions *****************************************************/
+
+
+static MACHINE machTT = {
+       name:           "Atari",
+       name2:          "TT",
+       open:           AtaOpen,
+       release:        AtaRelease,
+       dma_alloc:      AtaAlloc,
+       dma_free:       AtaFree,
+       irqinit:        AtaIrqInit,
+#ifdef MODULE
+       irqcleanup:     AtaIrqCleanUp,
+#endif /* MODULE */
+       init:           TTInit,
+       silence:        TTSilence,
+       setFormat:      TTSetFormat,
+       setVolume:      TTSetVolume,
+       setBass:        AtaSetBass,
+       setTreble:      AtaSetTreble,
+       setGain:        TTSetGain,
+       play:           AtaPlay,
+       mixer_init:     TTMixerInit,
+       mixer_ioctl:    TTMixerIoctl,
+       write_sq_setup: AtaWriteSqSetup,
+       sq_open:        AtaSqOpen,
+       state_info:     TTStateInfo,
+       min_dsp_speed:  6258,
+};
+
+static MACHINE machFalcon = {
+       name:           "Atari",
+       name2:          "FALCON",
+       dma_alloc:      AtaAlloc,
+       dma_free:       AtaFree,
+       irqinit:        AtaIrqInit,
+#ifdef MODULE
+       irqcleanup:     AtaIrqCleanUp,
+#endif /* MODULE */
+       init:           FalconInit,
+       silence:        FalconSilence,
+       setFormat:      FalconSetFormat,
+       setVolume:      FalconSetVolume,
+       setBass:        AtaSetBass,
+       setTreble:      AtaSetTreble,
+       play:           AtaPlay,
+       mixer_init:     FalconMixerInit,
+       mixer_ioctl:    FalconMixerIoctl,
+       write_sq_setup: AtaWriteSqSetup,
+       sq_open:        AtaSqOpen,
+       state_info:     FalconStateInfo,
+       min_dsp_speed:  8195,
+};
+
+
+/*** Config & Setup **********************************************************/
+
+
+static int __init dmasound_atari_init(void)
+{
+       if (MACH_IS_ATARI && ATARIHW_PRESENT(PCM_8BIT)) {
+           if (ATARIHW_PRESENT(CODEC)) {
+               dmasound.mach = machFalcon;
+               is_falcon = 1;
+           } else if (ATARIHW_PRESENT(MICROWIRE)) {
+               dmasound.mach = machTT;
+               is_falcon = 0;
+           } else
+               return -ENODEV;
+           if ((mfp.int_en_a & mfp.int_mk_a & 0x20) == 0)
+               return dmasound_init();
+           else {
+               printk("DMA sound driver: Timer A interrupt already in use\n");
+               return -EBUSY;
+           }
+       }
+       return -ENODEV;
+}
+
+static void __exit dmasound_atari_cleanup(void)
+{
+       dmasound_deinit();
+}
+
+module_init(dmasound_atari_init);
+module_exit(dmasound_atari_cleanup);
diff --git a/drivers/sound/dmasound/dmasound_awacs.c b/drivers/sound/dmasound/dmasound_awacs.c
new file mode 100644 (file)
index 0000000..55669c6
--- /dev/null
@@ -0,0 +1,2113 @@
+
+/*
+ *  linux/drivers/sound/dmasound_awacs.c
+ *
+ *  PowerMac DMA Sound Driver
+ *
+ *  See linux/drivers/sound/dmasound_core.c for copyright and credits
+ */
+
+
+#include <linux/module.h>
+#include <linux/config.h>
+#include <linux/malloc.h>
+#include <linux/init.h>
+#include <linux/delay.h>
+#include <linux/soundcard.h>
+#include <linux/adb.h>
+#include <linux/nvram.h>
+#include <linux/vt_kern.h>
+#include <linux/cuda.h>
+
+#include <asm/uaccess.h>
+#include <asm/prom.h>
+#include <asm/machdep.h>
+#include <asm/io.h>
+#include <asm/dbdma.h>
+
+#include "awacs_defs.h"
+#include "dmasound.h"
+
+
+/*
+ * Interrupt numbers and addresses, obtained from the device tree.
+ */
+static int awacs_irq, awacs_tx_irq, awacs_rx_irq;
+static volatile struct awacs_regs *awacs;
+static volatile struct dbdma_regs *awacs_txdma, *awacs_rxdma;
+static int awacs_rate_index;
+static int awacs_subframe;
+static int awacs_spkr_vol;
+static struct device_node* awacs_node;
+
+static char awacs_name[64];
+static int awacs_revision;
+#define AWACS_BURGUNDY 100             /* fake revision # for burgundy */
+
+/*
+ * Space for the DBDMA command blocks.
+ */
+static void *awacs_tx_cmd_space;
+static volatile struct dbdma_cmd *awacs_tx_cmds;
+
+static void *awacs_rx_cmd_space;
+static volatile struct dbdma_cmd *awacs_rx_cmds;
+
+/*
+ * Cached values of AWACS registers (we can't read them).
+ * Except on the burgundy. XXX
+ */
+int awacs_reg[5];
+
+#define HAS_16BIT_TABLES
+#undef HAS_8BIT_TABLES
+
+/*
+ * Stuff for outputting a beep.  The values range from -327 to +327
+ * so we can multiply by an amplitude in the range 0..100 to get a
+ * signed short value to put in the output buffer.
+ */
+static short beep_wform[256] = {
+       0,      40,     79,     117,    153,    187,    218,    245,
+       269,    288,    304,    316,    323,    327,    327,    324,
+       318,    310,    299,    288,    275,    262,    249,    236,
+       224,    213,    204,    196,    190,    186,    183,    182,
+       182,    183,    186,    189,    192,    196,    200,    203,
+       206,    208,    209,    209,    209,    207,    204,    201,
+       197,    193,    188,    183,    179,    174,    170,    166,
+       163,    161,    160,    159,    159,    160,    161,    162,
+       164,    166,    168,    169,    171,    171,    171,    170,
+       169,    167,    163,    159,    155,    150,    144,    139,
+       133,    128,    122,    117,    113,    110,    107,    105,
+       103,    103,    103,    103,    104,    104,    105,    105,
+       105,    103,    101,    97,     92,     86,     78,     68,
+       58,     45,     32,     18,     3,      -11,    -26,    -41,
+       -55,    -68,    -79,    -88,    -95,    -100,   -102,   -102,
+       -99,    -93,    -85,    -75,    -62,    -48,    -33,    -16,
+       0,      16,     33,     48,     62,     75,     85,     93,
+       99,     102,    102,    100,    95,     88,     79,     68,
+       55,     41,     26,     11,     -3,     -18,    -32,    -45,
+       -58,    -68,    -78,    -86,    -92,    -97,    -101,   -103,
+       -105,   -105,   -105,   -104,   -104,   -103,   -103,   -103,
+       -103,   -105,   -107,   -110,   -113,   -117,   -122,   -128,
+       -133,   -139,   -144,   -150,   -155,   -159,   -163,   -167,
+       -169,   -170,   -171,   -171,   -171,   -169,   -168,   -166,
+       -164,   -162,   -161,   -160,   -159,   -159,   -160,   -161,
+       -163,   -166,   -170,   -174,   -179,   -183,   -188,   -193,
+       -197,   -201,   -204,   -207,   -209,   -209,   -209,   -208,
+       -206,   -203,   -200,   -196,   -192,   -189,   -186,   -183,
+       -182,   -182,   -183,   -186,   -190,   -196,   -204,   -213,
+       -224,   -236,   -249,   -262,   -275,   -288,   -299,   -310,
+       -318,   -324,   -327,   -327,   -323,   -316,   -304,   -288,
+       -269,   -245,   -218,   -187,   -153,   -117,   -79,    -40,
+};
+
+#define BEEP_SRATE     22050   /* 22050 Hz sample rate */
+#define BEEP_BUFLEN    512
+#define BEEP_VOLUME    15      /* 0 - 100 */
+
+static int beep_volume = BEEP_VOLUME;
+static int beep_playing = 0;
+static int awacs_beep_state = 0;
+static short *beep_buf;
+static volatile struct dbdma_cmd *beep_dbdma_cmd;
+static void (*orig_mksound)(unsigned int, unsigned int);
+static int is_pbook_3400;
+static unsigned char *latch_base;
+static int is_pbook_G3;
+static unsigned char *macio_base;
+
+/* Burgundy functions */
+static void awacs_burgundy_wcw(unsigned addr,unsigned newval);
+static unsigned awacs_burgundy_rcw(unsigned addr);
+static void awacs_burgundy_write_volume(unsigned address, int volume);
+static int awacs_burgundy_read_volume(unsigned address);
+static void awacs_burgundy_write_mvolume(unsigned address, int volume);
+static int awacs_burgundy_read_mvolume(unsigned address);
+
+#ifdef CONFIG_PMAC_PBOOK
+/*
+ * Stuff for restoring after a sleep.
+ */
+static int awacs_sleep_notify(struct pmu_sleep_notifier *self, int when);
+struct pmu_sleep_notifier awacs_sleep_notifier = {
+       awacs_sleep_notify, SLEEP_LEVEL_SOUND,
+};
+#endif /* CONFIG_PMAC_PBOOK */
+
+static int expand_bal; /* Balance factor for expanding (not volume!) */
+static int expand_data;        /* Data for expanding */
+
+
+/*** Translations ************************************************************/
+
+
+/* ++TeSche: radically changed for new expanding purposes...
+ *
+ * These two routines now deal with copying/expanding/translating the samples
+ * from user space into our buffer at the right frequency. They take care about
+ * how much data there's actually to read, how much buffer space there is and
+ * to convert samples into the right frequency/encoding. They will only work on
+ * complete samples so it may happen they leave some bytes in the input stream
+ * if the user didn't write a multiple of the current sample size. They both
+ * return the number of bytes they've used from both streams so you may detect
+ * such a situation. Luckily all programs should be able to cope with that.
+ *
+ * I think I've optimized anything as far as one can do in plain C, all
+ * variables should fit in registers and the loops are really short. There's
+ * one loop for every possible situation. Writing a more generalized and thus
+ * parameterized loop would only produce slower code. Feel free to optimize
+ * this in assembler if you like. :)
+ *
+ * I think these routines belong here because they're not yet really hardware
+ * independent, especially the fact that the Falcon can play 16bit samples
+ * only in stereo is hardcoded in both of them!
+ *
+ * ++geert: split in even more functions (one per format)
+ */
+
+static ssize_t pmac_ct_law(const u_char *userPtr, size_t userCount,
+                          u_char frame[], ssize_t *frameUsed,
+                          ssize_t frameLeft);
+static ssize_t pmac_ct_s8(const u_char *userPtr, size_t userCount,
+                         u_char frame[], ssize_t *frameUsed,
+                         ssize_t frameLeft);
+static ssize_t pmac_ct_u8(const u_char *userPtr, size_t userCount,
+                         u_char frame[], ssize_t *frameUsed,
+                         ssize_t frameLeft);
+static ssize_t pmac_ct_s16(const u_char *userPtr, size_t userCount,
+                          u_char frame[], ssize_t *frameUsed,
+                          ssize_t frameLeft);
+static ssize_t pmac_ct_u16(const u_char *userPtr, size_t userCount,
+                          u_char frame[], ssize_t *frameUsed,
+                          ssize_t frameLeft);
+static ssize_t pmac_ctx_law(const u_char *userPtr, size_t userCount,
+                           u_char frame[], ssize_t *frameUsed,
+                           ssize_t frameLeft);
+static ssize_t pmac_ctx_s8(const u_char *userPtr, size_t userCount,
+                          u_char frame[], ssize_t *frameUsed,
+                          ssize_t frameLeft);
+static ssize_t pmac_ctx_u8(const u_char *userPtr, size_t userCount,
+                          u_char frame[], ssize_t *frameUsed,
+                          ssize_t frameLeft);
+static ssize_t pmac_ctx_s16(const u_char *userPtr, size_t userCount,
+                           u_char frame[], ssize_t *frameUsed,
+                           ssize_t frameLeft);
+static ssize_t pmac_ctx_u16(const u_char *userPtr, size_t userCount,
+                           u_char frame[], ssize_t *frameUsed,
+                           ssize_t frameLeft);
+static ssize_t pmac_ct_s16_read(const u_char *userPtr, size_t userCount,
+                          u_char frame[], ssize_t *frameUsed,
+                          ssize_t frameLeft);
+static ssize_t pmac_ct_u16_read(const u_char *userPtr, size_t userCount,
+                          u_char frame[], ssize_t *frameUsed,
+                          ssize_t frameLeft);
+
+
+/*** Low level stuff *********************************************************/
+
+
+static void PMacOpen(void);
+static void PMacRelease(void);
+static void *PMacAlloc(unsigned int size, int flags);
+static void PMacFree(void *ptr, unsigned int size);
+static int PMacIrqInit(void);
+#ifdef MODULE
+static void PMacIrqCleanup(void);
+#endif
+static void PMacSilence(void);
+static void PMacInit(void);
+static int PMacSetFormat(int format);
+static int PMacSetVolume(int volume);
+static void PMacPlay(void);
+static void PMacRecord(void);
+static void pmac_awacs_tx_intr(int irq, void *devid, struct pt_regs *regs);
+static void pmac_awacs_rx_intr(int irq, void *devid, struct pt_regs *regs);
+static void pmac_awacs_intr(int irq, void *devid, struct pt_regs *regs);
+static void awacs_write(int val);
+static int awacs_get_volume(int reg, int lshift);
+static int awacs_volume_setter(int volume, int n, int mute, int lshift);
+static void awacs_mksound(unsigned int hz, unsigned int ticks);
+static void awacs_nosound(unsigned long xx);
+
+
+/*** Mid level stuff **********************************************************/
+
+
+static int PMacMixerIoctl(u_int cmd, u_long arg);
+static void PMacWriteSqSetup(void);
+static void PMacReadSqSetup(void);
+static void PMacAbortRead(void);
+
+
+/*** Translations ************************************************************/
+
+
+static ssize_t pmac_ct_law(const u_char *userPtr, size_t userCount,
+                          u_char frame[], ssize_t *frameUsed,
+                          ssize_t frameLeft)
+{
+       short *table = dmasound.soft.format == AFMT_MU_LAW
+               ? dmasound_ulaw2dma16 : dmasound_alaw2dma16;
+       ssize_t count, used;
+       short *p = (short *) &frame[*frameUsed];
+       int val, stereo = dmasound.soft.stereo;
+
+       frameLeft >>= 2;
+       if (stereo)
+               userCount >>= 1;
+       used = count = min(userCount, frameLeft);
+       while (count > 0) {
+               u_char data;
+               if (get_user(data, userPtr++))
+                       return -EFAULT;
+               val = table[data];
+               *p++ = val;
+               if (stereo) {
+                       if (get_user(data, userPtr++))
+                               return -EFAULT;
+                       val = table[data];
+               }
+               *p++ = val;
+               count--;
+       }
+       *frameUsed += used * 4;
+       return stereo? used * 2: used;
+}
+
+
+static ssize_t pmac_ct_s8(const u_char *userPtr, size_t userCount,
+                         u_char frame[], ssize_t *frameUsed,
+                         ssize_t frameLeft)
+{
+       ssize_t count, used;
+       short *p = (short *) &frame[*frameUsed];
+       int val, stereo = dmasound.soft.stereo;
+
+       frameLeft >>= 2;
+       if (stereo)
+               userCount >>= 1;
+       used = count = min(userCount, frameLeft);
+       while (count > 0) {
+               u_char data;
+               if (get_user(data, userPtr++))
+                       return -EFAULT;
+               val = data << 8;
+               *p++ = val;
+               if (stereo) {
+                       if (get_user(data, userPtr++))
+                               return -EFAULT;
+                       val = data << 8;
+               }
+               *p++ = val;
+               count--;
+       }
+       *frameUsed += used * 4;
+       return stereo? used * 2: used;
+}
+
+
+static ssize_t pmac_ct_u8(const u_char *userPtr, size_t userCount,
+                         u_char frame[], ssize_t *frameUsed,
+                         ssize_t frameLeft)
+{
+       ssize_t count, used;
+       short *p = (short *) &frame[*frameUsed];
+       int val, stereo = dmasound.soft.stereo;
+
+       frameLeft >>= 2;
+       if (stereo)
+               userCount >>= 1;
+       used = count = min(userCount, frameLeft);
+       while (count > 0) {
+               u_char data;
+               if (get_user(data, userPtr++))
+                       return -EFAULT;
+               val = (data ^ 0x80) << 8;
+               *p++ = val;
+               if (stereo) {
+                       if (get_user(data, userPtr++))
+                               return -EFAULT;
+                       val = (data ^ 0x80) << 8;
+               }
+               *p++ = val;
+               count--;
+       }
+       *frameUsed += used * 4;
+       return stereo? used * 2: used;
+}
+
+
+static ssize_t pmac_ct_s16(const u_char *userPtr, size_t userCount,
+                          u_char frame[], ssize_t *frameUsed,
+                          ssize_t frameLeft)
+{
+       ssize_t count, used;
+       int stereo = dmasound.soft.stereo;
+       short *fp = (short *) &frame[*frameUsed];
+
+       frameLeft >>= 2;
+       userCount >>= (stereo? 2: 1);
+       used = count = min(userCount, frameLeft);
+       if (!stereo) {
+               short *up = (short *) userPtr;
+               while (count > 0) {
+                       short data;
+                       if (get_user(data, up++))
+                               return -EFAULT;
+                       *fp++ = data;
+                       *fp++ = data;
+                       count--;
+               }
+       } else {
+               if (copy_from_user(fp, userPtr, count * 4))
+                       return -EFAULT;
+       }
+       *frameUsed += used * 4;
+       return stereo? used * 4: used * 2;
+}
+
+static ssize_t pmac_ct_u16(const u_char *userPtr, size_t userCount,
+                          u_char frame[], ssize_t *frameUsed,
+                          ssize_t frameLeft)
+{
+       ssize_t count, used;
+       int mask = (dmasound.soft.format == AFMT_U16_LE? 0x0080: 0x8000);
+       int stereo = dmasound.soft.stereo;
+       short *fp = (short *) &frame[*frameUsed];
+       short *up = (short *) userPtr;
+
+       frameLeft >>= 2;
+       userCount >>= (stereo? 2: 1);
+       used = count = min(userCount, frameLeft);
+       while (count > 0) {
+               int data;
+               if (get_user(data, up++))
+                       return -EFAULT;
+               data ^= mask;
+               *fp++ = data;
+               if (stereo) {
+                       if (get_user(data, up++))
+                               return -EFAULT;
+                       data ^= mask;
+               }
+               *fp++ = data;
+               count--;
+       }
+       *frameUsed += used * 4;
+       return stereo? used * 4: used * 2;
+}
+
+
+static ssize_t pmac_ctx_law(const u_char *userPtr, size_t userCount,
+                           u_char frame[], ssize_t *frameUsed,
+                           ssize_t frameLeft)
+{
+       unsigned short *table = (unsigned short *)
+               (dmasound.soft.format == AFMT_MU_LAW
+                ? dmasound_ulaw2dma16 : dmasound_alaw2dma16);
+       unsigned int data = expand_data;
+       unsigned int *p = (unsigned int *) &frame[*frameUsed];
+       int bal = expand_bal;
+       int hSpeed = dmasound.hard.speed, sSpeed = dmasound.soft.speed;
+       int utotal, ftotal;
+       int stereo = dmasound.soft.stereo;
+
+       frameLeft >>= 2;
+       if (stereo)
+               userCount >>= 1;
+       ftotal = frameLeft;
+       utotal = userCount;
+       while (frameLeft) {
+               u_char c;
+               if (bal < 0) {
+                       if (userCount == 0)
+                               break;
+                       if (get_user(c, userPtr++))
+                               return -EFAULT;
+                       data = table[c];
+                       if (stereo) {
+                               if (get_user(c, userPtr++))
+                                       return -EFAULT;
+                               data = (data << 16) + table[c];
+                       } else
+                               data = (data << 16) + data;
+                       userCount--;
+                       bal += hSpeed;
+               }
+               *p++ = data;
+               frameLeft--;
+               bal -= sSpeed;
+       }
+       expand_bal = bal;
+       expand_data = data;
+       *frameUsed += (ftotal - frameLeft) * 4;
+       utotal -= userCount;
+       return stereo? utotal * 2: utotal;
+}
+
+
+static ssize_t pmac_ctx_s8(const u_char *userPtr, size_t userCount,
+                          u_char frame[], ssize_t *frameUsed,
+                          ssize_t frameLeft)
+{
+       unsigned int *p = (unsigned int *) &frame[*frameUsed];
+       unsigned int data = expand_data;
+       int bal = expand_bal;
+       int hSpeed = dmasound.hard.speed, sSpeed = dmasound.soft.speed;
+       int stereo = dmasound.soft.stereo;
+       int utotal, ftotal;
+
+       frameLeft >>= 2;
+       if (stereo)
+               userCount >>= 1;
+       ftotal = frameLeft;
+       utotal = userCount;
+       while (frameLeft) {
+               u_char c;
+               if (bal < 0) {
+                       if (userCount == 0)
+                               break;
+                       if (get_user(c, userPtr++))
+                               return -EFAULT;
+                       data = c << 8;
+                       if (stereo) {
+                               if (get_user(c, userPtr++))
+                                       return -EFAULT;
+                               data = (data << 16) + (c << 8);
+                       } else
+                               data = (data << 16) + data;
+                       userCount--;
+                       bal += hSpeed;
+               }
+               *p++ = data;
+               frameLeft--;
+               bal -= sSpeed;
+       }
+       expand_bal = bal;
+       expand_data = data;
+       *frameUsed += (ftotal - frameLeft) * 4;
+       utotal -= userCount;
+       return stereo? utotal * 2: utotal;
+}
+
+
+static ssize_t pmac_ctx_u8(const u_char *userPtr, size_t userCount,
+                          u_char frame[], ssize_t *frameUsed,
+                          ssize_t frameLeft)
+{
+       unsigned int *p = (unsigned int *) &frame[*frameUsed];
+       unsigned int data = expand_data;
+       int bal = expand_bal;
+       int hSpeed = dmasound.hard.speed, sSpeed = dmasound.soft.speed;
+       int stereo = dmasound.soft.stereo;
+       int utotal, ftotal;
+
+       frameLeft >>= 2;
+       if (stereo)
+               userCount >>= 1;
+       ftotal = frameLeft;
+       utotal = userCount;
+       while (frameLeft) {
+               u_char c;
+               if (bal < 0) {
+                       if (userCount == 0)
+                               break;
+                       if (get_user(c, userPtr++))
+                               return -EFAULT;
+                       data = (c ^ 0x80) << 8;
+                       if (stereo) {
+                               if (get_user(c, userPtr++))
+                                       return -EFAULT;
+                               data = (data << 16) + ((c ^ 0x80) << 8);
+                       } else
+                               data = (data << 16) + data;
+                       userCount--;
+                       bal += hSpeed;
+               }
+               *p++ = data;
+               frameLeft--;
+               bal -= sSpeed;
+       }
+       expand_bal = bal;
+       expand_data = data;
+       *frameUsed += (ftotal - frameLeft) * 4;
+       utotal -= userCount;
+       return stereo? utotal * 2: utotal;
+}
+
+
+static ssize_t pmac_ctx_s16(const u_char *userPtr, size_t userCount,
+                           u_char frame[], ssize_t *frameUsed,
+                           ssize_t frameLeft)
+{
+       unsigned int *p = (unsigned int *) &frame[*frameUsed];
+       unsigned int data = expand_data;
+       unsigned short *up = (unsigned short *) userPtr;
+       int bal = expand_bal;
+       int hSpeed = dmasound.hard.speed, sSpeed = dmasound.soft.speed;
+       int stereo = dmasound.soft.stereo;
+       int utotal, ftotal;
+
+       frameLeft >>= 2;
+       userCount >>= (stereo? 2: 1);
+       ftotal = frameLeft;
+       utotal = userCount;
+       while (frameLeft) {
+               unsigned short c;
+               if (bal < 0) {
+                       if (userCount == 0)
+                               break;
+                       if (get_user(data, up++))
+                               return -EFAULT;
+                       if (stereo) {
+                               if (get_user(c, up++))
+                                       return -EFAULT;
+                               data = (data << 16) + c;
+                       } else
+                               data = (data << 16) + data;
+                       userCount--;
+                       bal += hSpeed;
+               }
+               *p++ = data;
+               frameLeft--;
+               bal -= sSpeed;
+       }
+       expand_bal = bal;
+       expand_data = data;
+       *frameUsed += (ftotal - frameLeft) * 4;
+       utotal -= userCount;
+       return stereo? utotal * 4: utotal * 2;
+}
+
+
+static ssize_t pmac_ctx_u16(const u_char *userPtr, size_t userCount,
+                           u_char frame[], ssize_t *frameUsed,
+                           ssize_t frameLeft)
+{
+       int mask = (dmasound.soft.format == AFMT_U16_LE? 0x0080: 0x8000);
+       unsigned int *p = (unsigned int *) &frame[*frameUsed];
+       unsigned int data = expand_data;
+       unsigned short *up = (unsigned short *) userPtr;
+       int bal = expand_bal;
+       int hSpeed = dmasound.hard.speed, sSpeed = dmasound.soft.speed;
+       int stereo = dmasound.soft.stereo;
+       int utotal, ftotal;
+
+       frameLeft >>= 2;
+       userCount >>= (stereo? 2: 1);
+       ftotal = frameLeft;
+       utotal = userCount;
+       while (frameLeft) {
+               unsigned short c;
+               if (bal < 0) {
+                       if (userCount == 0)
+                               break;
+                       if (get_user(data, up++))
+                               return -EFAULT;
+                       data ^= mask;
+                       if (stereo) {
+                               if (get_user(c, up++))
+                                       return -EFAULT;
+                               data = (data << 16) + (c ^ mask);
+                       } else
+                               data = (data << 16) + data;
+                       userCount--;
+                       bal += hSpeed;
+               }
+               *p++ = data;
+               frameLeft--;
+               bal -= sSpeed;
+       }
+       expand_bal = bal;
+       expand_data = data;
+       *frameUsed += (ftotal - frameLeft) * 4;
+       utotal -= userCount;
+       return stereo? utotal * 4: utotal * 2;
+}
+
+static ssize_t pmac_ct_s8_read(const u_char *userPtr, size_t userCount,
+                         u_char frame[], ssize_t *frameUsed,
+                         ssize_t frameLeft)
+{
+       ssize_t count, used;
+       short *p = (short *) &frame[*frameUsed];
+       int val, stereo = dmasound.soft.stereo;
+
+       frameLeft >>= 2;
+       if (stereo)
+               userCount >>= 1;
+       used = count = min(userCount, frameLeft);
+       while (count > 0) {
+               u_char data;
+
+               val = *p++;
+               data = val >> 8;
+               if (put_user(data, (u_char *)userPtr++))
+                       return -EFAULT;
+               if (stereo) {
+                       val = *p;
+                       data = val >> 8;
+                       if (put_user(data, (u_char *)userPtr++))
+                               return -EFAULT;
+               }
+               p++;
+               count--;
+       }
+       *frameUsed += used * 4;
+       return stereo? used * 2: used;
+}
+
+
+static ssize_t pmac_ct_u8_read(const u_char *userPtr, size_t userCount,
+                         u_char frame[], ssize_t *frameUsed,
+                         ssize_t frameLeft)
+{
+       ssize_t count, used;
+       short *p = (short *) &frame[*frameUsed];
+       int val, stereo = dmasound.soft.stereo;
+
+       frameLeft >>= 2;
+       if (stereo)
+               userCount >>= 1;
+       used = count = min(userCount, frameLeft);
+       while (count > 0) {
+               u_char data;
+
+               val = *p++;
+               data = (val >> 8) ^ 0x80;
+               if (put_user(data, (u_char *)userPtr++))
+                       return -EFAULT;
+               if (stereo) {
+                       val = *p;
+                       data = (val >> 8) ^ 0x80;
+                       if (put_user(data, (u_char *)userPtr++))
+                               return -EFAULT;
+               }
+               p++;
+               count--;
+       }
+       *frameUsed += used * 4;
+       return stereo? used * 2: used;
+}
+
+
+static ssize_t pmac_ct_s16_read(const u_char *userPtr, size_t userCount,
+                          u_char frame[], ssize_t *frameUsed,
+                          ssize_t frameLeft)
+{
+       ssize_t count, used;
+       int stereo = dmasound.soft.stereo;
+       short *fp = (short *) &frame[*frameUsed];
+
+       frameLeft >>= 2;
+       userCount >>= (stereo? 2: 1);
+       used = count = min(userCount, frameLeft);
+       if (!stereo) {
+               short *up = (short *) userPtr;
+               while (count > 0) {
+                       short data;
+                       data = *fp;
+                       if (put_user(data, up++))
+                               return -EFAULT;
+                       fp+=2;
+                       count--;
+               }
+       } else {
+               if (copy_to_user((u_char *)userPtr, fp, count * 4))
+                       return -EFAULT;
+       }
+       *frameUsed += used * 4;
+       return stereo? used * 4: used * 2;
+}
+
+static ssize_t pmac_ct_u16_read(const u_char *userPtr, size_t userCount,
+                          u_char frame[], ssize_t *frameUsed,
+                          ssize_t frameLeft)
+{
+       ssize_t count, used;
+       int mask = (dmasound.soft.format == AFMT_U16_LE? 0x0080: 0x8000);
+       int stereo = dmasound.soft.stereo;
+       short *fp = (short *) &frame[*frameUsed];
+       short *up = (short *) userPtr;
+
+       frameLeft >>= 2;
+       userCount >>= (stereo? 2: 1);
+       used = count = min(userCount, frameLeft);
+       while (count > 0) {
+               int data;
+
+               data = *fp++;
+               data ^= mask;
+               if (put_user(data, up++))
+                       return -EFAULT;
+               if (stereo) {
+                       data = *fp;
+                       data ^= mask;
+                       if (put_user(data, up++))
+                               return -EFAULT;
+               }
+               fp++;
+               count--;
+       }
+       *frameUsed += used * 4;
+       return stereo? used * 4: used * 2;
+}
+
+
+static TRANS transAwacsNormal = {
+       ct_ulaw:        pmac_ct_law,
+       ct_alaw:        pmac_ct_law,
+       ct_s8:          pmac_ct_s8,
+       ct_u8:          pmac_ct_u8,
+       ct_s16be:       pmac_ct_s16,
+       ct_u16be:       pmac_ct_u16,
+       ct_s16le:       pmac_ct_s16,
+       ct_u16le:       pmac_ct_u16,
+};
+
+static TRANS transAwacsExpand = {
+       ct_ulaw:        pmac_ctx_law,
+       ct_alaw:        pmac_ctx_law,
+       ct_s8:          pmac_ctx_s8,
+       ct_u8:          pmac_ctx_u8,
+       ct_s16be:       pmac_ctx_s16,
+       ct_u16be:       pmac_ctx_u16,
+       ct_s16le:       pmac_ctx_s16,
+       ct_u16le:       pmac_ctx_u16,
+};
+
+static TRANS transAwacsNormalRead = {
+       ct_s8:          pmac_ct_s8_read,
+       ct_u8:          pmac_ct_u8_read,
+       ct_s16be:       pmac_ct_s16_read,
+       ct_u16be:       pmac_ct_u16_read,
+       ct_s16le:       pmac_ct_s16_read,
+       ct_u16le:       pmac_ct_u16_read,
+};
+
+/*** Low level stuff *********************************************************/
+
+
+
+/*
+ * PCI PowerMac, with AWACS and DBDMA.
+ */
+
+static void PMacOpen(void)
+{
+       MOD_INC_USE_COUNT;
+}
+
+static void PMacRelease(void)
+{
+       MOD_DEC_USE_COUNT;
+}
+
+static void *PMacAlloc(unsigned int size, int flags)
+{
+       return kmalloc(size, flags);
+}
+
+static void PMacFree(void *ptr, unsigned int size)
+{
+       kfree(ptr);
+}
+
+static int __init PMacIrqInit(void)
+{
+       if (request_irq(awacs_irq, pmac_awacs_intr, 0, "AWACS", 0)
+           || request_irq(awacs_tx_irq, pmac_awacs_tx_intr, 0, "AWACS out", 0)
+           || request_irq(awacs_rx_irq, pmac_awacs_rx_intr, 0, "AWACS in", 0))
+               return 0;
+       return 1;
+}
+
+#ifdef MODULE
+static void PMacIrqCleanup(void)
+{
+       /* turn off output dma */
+       out_le32(&awacs_txdma->control, RUN<<16);
+       /* disable interrupts from awacs interface */
+       out_le32(&awacs->control, in_le32(&awacs->control) & 0xfff);
+#ifdef CONFIG_PMAC_PBOOK
+       if (is_pbook_G3) {
+               feature_clear(awacs_node, FEATURE_Sound_power);
+               feature_clear(awacs_node, FEATURE_Sound_CLK_enable);
+       }
+#endif
+       free_irq(awacs_irq, 0);
+       free_irq(awacs_tx_irq, 0);
+       free_irq(awacs_rx_irq, 0);
+       kfree(awacs_tx_cmd_space);
+       if (awacs_rx_cmd_space)
+               kfree(awacs_rx_cmd_space);
+       if (beep_buf)
+               kfree(beep_buf);
+       kd_mksound = orig_mksound;
+#ifdef CONFIG_PMAC_PBOOK
+       pmu_unregister_sleep_notifier(&awacs_sleep_notifier);
+#endif
+}
+#endif /* MODULE */
+
+static void PMacSilence(void)
+{
+       /* turn off output dma */
+       out_le32(&awacs_txdma->control, RUN<<16);
+}
+
+static int awacs_freqs[8] = {
+       44100, 29400, 22050, 17640, 14700, 11025, 8820, 7350
+};
+static int awacs_freqs_ok[8] = { 1, 1, 1, 1, 1, 1, 1, 1 };
+
+static void PMacInit(void)
+{
+       int i, tolerance;
+
+       switch (dmasound.soft.format) {
+       case AFMT_S16_LE:
+       case AFMT_U16_LE:
+               dmasound.hard.format = AFMT_S16_LE;
+               break;
+       default:
+               dmasound.hard.format = AFMT_S16_BE;
+               break;
+       }
+       dmasound.hard.stereo = 1;
+       dmasound.hard.size = 16;
+
+       /*
+        * If we have a sample rate which is within catchRadius percent
+        * of the requested value, we don't have to expand the samples.
+        * Otherwise choose the next higher rate.
+        * N.B.: burgundy awacs (iMac and later) only works at 44100 Hz.
+        */
+       i = 8;
+       do {
+               tolerance = catchRadius * awacs_freqs[--i] / 100;
+               if (awacs_freqs_ok[i]
+                   && dmasound.soft.speed <= awacs_freqs[i] + tolerance)
+                       break;
+       } while (i > 0);
+       if (dmasound.soft.speed >= awacs_freqs[i] - tolerance)
+               dmasound.trans_write = &transAwacsNormal;
+       else
+               dmasound.trans_write = &transAwacsExpand;
+       dmasound.trans_read = &transAwacsNormalRead;
+       dmasound.hard.speed = awacs_freqs[i];
+       awacs_rate_index = i;
+
+       /* XXX disable error interrupt on burgundy for now */
+       out_le32(&awacs->control, MASK_IEPC | (i << 8) | 0x11
+                | (awacs_revision < AWACS_BURGUNDY? MASK_IEE: 0));
+       awacs_reg[1] = (awacs_reg[1] & ~MASK_SAMPLERATE) | (i << 3);
+       awacs_write(awacs_reg[1] | MASK_ADDR1);
+       out_le32(&awacs->byteswap, dmasound.hard.format != AFMT_S16_BE);
+
+       /* We really want to execute a DMA stop command, after the AWACS
+        * is initialized.
+        * For reasons I don't understand, it stops the hissing noise
+        * common to many PowerBook G3 systems (like mine :-).
+        */
+       out_le32(&awacs_txdma->control, (RUN|WAKE|FLUSH|PAUSE) << 16);
+       st_le16(&beep_dbdma_cmd->command, DBDMA_STOP);
+       out_le32(&awacs_txdma->cmdptr, virt_to_bus(beep_dbdma_cmd));
+       out_le32(&awacs_txdma->control, RUN | (RUN << 16));
+
+       expand_bal = -dmasound.soft.speed;
+}
+
+static int PMacSetFormat(int format)
+{
+       int size;
+
+       switch (format) {
+       case AFMT_QUERY:
+               return dmasound.soft.format;
+       case AFMT_MU_LAW:
+       case AFMT_A_LAW:
+       case AFMT_U8:
+       case AFMT_S8:
+               size = 8;
+               break;
+       case AFMT_S16_BE:
+       case AFMT_U16_BE:
+       case AFMT_S16_LE:
+       case AFMT_U16_LE:
+               size = 16;
+               break;
+       default: /* :-) */
+               printk(KERN_ERR "dmasound: unknown format 0x%x, using AFMT_U8\n",
+                      format);
+               size = 8;
+               format = AFMT_U8;
+       }
+
+       dmasound.soft.format = format;
+       dmasound.soft.size = size;
+       if (dmasound.minDev == SND_DEV_DSP) {
+               dmasound.dsp.format = format;
+               dmasound.dsp.size = size;
+       }
+
+       PMacInit();
+
+       return format;
+}
+
+#define AWACS_VOLUME_TO_MASK(x)        (15 - ((((x) - 1) * 15) / 99))
+#define AWACS_MASK_TO_VOLUME(y)        (100 - ((y) * 99 / 15))
+
+static int awacs_get_volume(int reg, int lshift)
+{
+       int volume;
+
+       volume = AWACS_MASK_TO_VOLUME((reg >> lshift) & 0xf);
+       volume |= AWACS_MASK_TO_VOLUME(reg & 0xf) << 8;
+       return volume;
+}
+
+static int awacs_volume_setter(int volume, int n, int mute, int lshift)
+{
+       int r1, rn;
+
+       if (mute && volume == 0) {
+               r1 = awacs_reg[1] | mute;
+       } else {
+               r1 = awacs_reg[1] & ~mute;
+               rn = awacs_reg[n] & ~(0xf | (0xf << lshift));
+               rn |= ((AWACS_VOLUME_TO_MASK(volume & 0xff) & 0xf) << lshift);
+               rn |= AWACS_VOLUME_TO_MASK((volume >> 8) & 0xff) & 0xf;
+               awacs_reg[n] = rn;
+               awacs_write((n << 12) | rn);
+               volume = awacs_get_volume(rn, lshift);
+       }
+       if (r1 != awacs_reg[1]) {
+               awacs_reg[1] = r1;
+               awacs_write(r1 | MASK_ADDR1);
+       }
+       return volume;
+}
+
+static int PMacSetVolume(int volume)
+{
+       return awacs_volume_setter(volume, 2, MASK_AMUTE, 6);
+}
+
+static void PMacPlay(void)
+{
+       volatile struct dbdma_cmd *cp;
+       int i, count;
+       unsigned long flags;
+
+       save_flags(flags); cli();
+       if (awacs_beep_state) {
+               /* sound takes precedence over beeps */
+               out_le32(&awacs_txdma->control, (RUN|PAUSE|FLUSH|WAKE) << 16);
+               out_le32(&awacs->control,
+                        (in_le32(&awacs->control) & ~0x1f00)
+                        | (awacs_rate_index << 8));
+               out_le32(&awacs->byteswap, dmasound.hard.format != AFMT_S16_BE);
+               out_le32(&awacs_txdma->cmdptr, virt_to_bus(&(awacs_tx_cmds[(write_sq.front+write_sq.active) % write_sq.max_count])));
+
+               beep_playing = 0;
+               awacs_beep_state = 0;
+       }
+       i = write_sq.front + write_sq.active;
+       if (i >= write_sq.max_count)
+               i -= write_sq.max_count;
+       while (write_sq.active < 2 && write_sq.active < write_sq.count) {
+               count = (write_sq.count == write_sq.active + 1)?write_sq.rear_size:write_sq.block_size;
+               if (count < write_sq.block_size && !write_sq.syncing)
+                       /* last block not yet filled, and we're not syncing. */
+                       break;
+               cp = &awacs_tx_cmds[i];
+               st_le16(&cp->req_count, count);
+               st_le16(&cp->xfer_status, 0);
+               if (++i >= write_sq.max_count)
+                       i = 0;
+               out_le16(&awacs_tx_cmds[i].command, DBDMA_STOP);
+               out_le16(&cp->command, OUTPUT_MORE + INTR_ALWAYS);
+               if (write_sq.active == 0)
+                       out_le32(&awacs_txdma->cmdptr, virt_to_bus(cp));
+               out_le32(&awacs_txdma->control, ((RUN|WAKE) << 16) + (RUN|WAKE));
+               ++write_sq.active;
+       }
+       restore_flags(flags);
+}
+
+
+static void PMacRecord(void)
+{
+       unsigned long flags;
+
+       if (read_sq.active)
+               return;
+
+       save_flags(flags); cli();
+
+       /* This is all we have to do......Just start it up.
+       */
+       out_le32(&awacs_rxdma->control, ((RUN|WAKE) << 16) + (RUN|WAKE));
+       read_sq.active = 1;
+
+       restore_flags(flags);
+}
+
+
+static void
+pmac_awacs_tx_intr(int irq, void *devid, struct pt_regs *regs)
+{
+       int i = write_sq.front;
+       int stat;
+       volatile struct dbdma_cmd *cp;
+
+       while (write_sq.active > 0) {
+               cp = &awacs_tx_cmds[i];
+               stat = ld_le16(&cp->xfer_status);
+               if ((stat & ACTIVE) == 0)
+                       break;  /* this frame is still going */
+               --write_sq.count;
+               --write_sq.active;
+               if (++i >= write_sq.max_count)
+                       i = 0;
+       }
+       if (i != write_sq.front)
+               WAKE_UP(write_sq.action_queue);
+       write_sq.front = i;
+
+       PMacPlay();
+
+       if (!write_sq.active)
+               WAKE_UP(write_sq.sync_queue);
+}
+
+
+static void
+pmac_awacs_rx_intr(int irq, void *devid, struct pt_regs *regs)
+{
+
+       /* For some reason on my PowerBook G3, I get one interrupt
+        * when the interrupt vector is installed (like something is
+        * pending).  This happens before the dbdma is initialize by
+        * us, so I just check the command pointer and if it is zero,
+        * just blow it off.
+        */
+       if (in_le32(&awacs_rxdma->cmdptr) == 0)
+               return;
+
+       /* We also want to blow 'em off when shutting down.
+       */
+       if (read_sq.active == 0)
+               return;
+
+       /* Check multiple buffers in case we were held off from
+        * interrupt processing for a long time.  Geeze, I really hope
+        * this doesn't happen.
+        */
+       while (awacs_rx_cmds[read_sq.rear].xfer_status) {
+
+               /* Clear status and move on to next buffer.
+               */
+               awacs_rx_cmds[read_sq.rear].xfer_status = 0;
+               read_sq.rear++;
+
+               /* Wrap the buffer ring.
+               */
+               if (read_sq.rear >= read_sq.max_active)
+                       read_sq.rear = 0;
+
+               /* If we have caught up to the front buffer, bump it.
+                * This will cause weird (but not fatal) results if the
+                * read loop is currently using this buffer.  The user is
+                * behind in this case anyway, so weird things are going
+                * to happen.
+                */
+               if (read_sq.rear == read_sq.front) {
+                       read_sq.front++;
+                       if (read_sq.front >= read_sq.max_active)
+                               read_sq.front = 0;
+               }
+       }
+
+       WAKE_UP(read_sq.action_queue);
+}
+
+
+static void
+pmac_awacs_intr(int irq, void *devid, struct pt_regs *regs)
+{
+       int ctrl = in_le32(&awacs->control);
+
+       if (ctrl & MASK_PORTCHG) {
+               /* do something when headphone is plugged/unplugged? */
+       }
+       if (ctrl & MASK_CNTLERR) {
+               int err = (in_le32(&awacs->codec_stat) & MASK_ERRCODE) >> 16;
+               if (err != 0 && awacs_revision < AWACS_BURGUNDY)
+                       printk(KERN_ERR "AWACS: error %x\n", err);
+       }
+       /* Writing 1s to the CNTLERR and PORTCHG bits clears them... */
+       out_le32(&awacs->control, ctrl);
+}
+
+static void
+awacs_write(int val)
+{
+       if (awacs_revision >= AWACS_BURGUNDY)
+               return;
+       while (in_le32(&awacs->codec_ctrl) & MASK_NEWECMD)
+               ;       /* XXX should have timeout */
+       out_le32(&awacs->codec_ctrl, val | (awacs_subframe << 22));
+}
+
+static void awacs_nosound(unsigned long xx)
+{
+       unsigned long flags;
+
+       save_flags(flags); cli();
+       if (beep_playing) {
+               st_le16(&beep_dbdma_cmd->command, DBDMA_STOP);
+               out_le32(&awacs_txdma->control, (RUN|PAUSE|FLUSH|WAKE) << 16);
+               out_le32(&awacs->control,
+                        (in_le32(&awacs->control) & ~0x1f00)
+                        | (awacs_rate_index << 8));
+               out_le32(&awacs->byteswap, dmasound.hard.format != AFMT_S16_BE);
+               beep_playing = 0;
+       }
+       restore_flags(flags);
+}
+
+static struct timer_list beep_timer = {
+       NULL, NULL, 0, 0, awacs_nosound
+};
+
+static void awacs_mksound(unsigned int hz, unsigned int ticks)
+{
+       unsigned long flags;
+       int beep_speed = 0;
+       int srate;
+       int period, ncycles, nsamples;
+       int i, j, f;
+       short *p;
+       static int beep_hz_cache;
+       static int beep_nsamples_cache;
+       static int beep_volume_cache;
+
+       for (i = 0; i < 8 && awacs_freqs[i] >= BEEP_SRATE; ++i)
+               if (awacs_freqs_ok[i])
+                       beep_speed = i;
+       srate = awacs_freqs[beep_speed];
+
+       if (hz <= srate / BEEP_BUFLEN || hz > srate / 2) {
+#if 1
+               /* this is a hack for broken X server code */
+               hz = 750;
+               ticks = 12;
+#else
+               /* cancel beep currently playing */
+               awacs_nosound(0);
+               return;
+#endif
+       }
+       save_flags(flags); cli();
+       del_timer(&beep_timer);
+       if (ticks) {
+               beep_timer.expires = jiffies + ticks;
+               add_timer(&beep_timer);
+       }
+       if (beep_playing || write_sq.active || beep_buf == NULL) {
+               restore_flags(flags);
+               return;         /* too hard, sorry :-( */
+       }
+       beep_playing = 1;
+       st_le16(&beep_dbdma_cmd->command, OUTPUT_MORE + BR_ALWAYS);
+       restore_flags(flags);
+
+       if (hz == beep_hz_cache && beep_volume == beep_volume_cache) {
+               nsamples = beep_nsamples_cache;
+       } else {
+               period = srate * 256 / hz;      /* fixed point */
+               ncycles = BEEP_BUFLEN * 256 / period;
+               nsamples = (period * ncycles) >> 8;
+               f = ncycles * 65536 / nsamples;
+               j = 0;
+               p = beep_buf;
+               for (i = 0; i < nsamples; ++i, p += 2) {
+                       p[0] = p[1] = beep_wform[j >> 8] * beep_volume;
+                       j = (j + f) & 0xffff;
+               }
+               beep_hz_cache = hz;
+               beep_volume_cache = beep_volume;
+               beep_nsamples_cache = nsamples;
+       }
+
+       st_le16(&beep_dbdma_cmd->req_count, nsamples*4);
+       st_le16(&beep_dbdma_cmd->xfer_status, 0);
+       st_le32(&beep_dbdma_cmd->cmd_dep, virt_to_bus(beep_dbdma_cmd));
+       st_le32(&beep_dbdma_cmd->phy_addr, virt_to_bus(beep_buf));
+       awacs_beep_state = 1;
+
+       save_flags(flags); cli();
+       if (beep_playing) {     /* i.e. haven't been terminated already */
+               out_le32(&awacs_txdma->control, (RUN|WAKE|FLUSH|PAUSE) << 16);
+               out_le32(&awacs->control,
+                        (in_le32(&awacs->control) & ~0x1f00)
+                        | (beep_speed << 8));
+               out_le32(&awacs->byteswap, 0);
+               out_le32(&awacs_txdma->cmdptr, virt_to_bus(beep_dbdma_cmd));
+               out_le32(&awacs_txdma->control, RUN | (RUN << 16));
+       }
+       restore_flags(flags);
+}
+
+#ifdef CONFIG_PMAC_PBOOK
+/*
+ * Save state when going to sleep, restore it afterwards.
+ */
+static int awacs_sleep_notify(struct pmu_sleep_notifier *self, int when)
+{
+       switch (when) {
+       case PBOOK_SLEEP_NOW:
+               /* XXX we should stop any dma in progress when going to sleep
+                  and restart it when we wake. */
+               PMacSilence();
+               disable_irq(awacs_irq);
+               disable_irq(awacs_tx_irq);
+               if (is_pbook_G3) {
+                       feature_clear(awacs_node, FEATURE_Sound_CLK_enable);
+                       feature_clear(awacs_node, FEATURE_Sound_power);
+               }
+               break;
+       case PBOOK_WAKE:
+               /* There is still a problem on wake. Sound seems to work fine
+                  if I launch mpg123 and resumes fine if mpg123 was playing,
+                  but the console beep is dead until I do something with the
+                  mixer. Probably yet another timing issue */
+               if (!feature_test(awacs_node, FEATURE_Sound_CLK_enable)
+                   || !feature_test(awacs_node, FEATURE_Sound_power)) {
+                       /* these aren't present on the 3400 AFAIK -- paulus */
+                       feature_set(awacs_node, FEATURE_Sound_CLK_enable);
+                       feature_set(awacs_node, FEATURE_Sound_power);
+                       mdelay(1000);
+               }
+               out_le32(&awacs->control, MASK_IEPC
+                        | (awacs_rate_index << 8) | 0x11
+                        | (awacs_revision < AWACS_BURGUNDY? MASK_IEE: 0));
+               awacs_write(awacs_reg[0] | MASK_ADDR0);
+               awacs_write(awacs_reg[1] | MASK_ADDR1);
+               awacs_write(awacs_reg[2] | MASK_ADDR2);
+               awacs_write(awacs_reg[4] | MASK_ADDR4);
+               out_le32(&awacs->byteswap, dmasound.hard.format != AFMT_S16_BE);
+               enable_irq(awacs_irq);
+               enable_irq(awacs_tx_irq);
+               if (awacs_revision == 3) {
+                       mdelay(100);
+                       awacs_write(0x6000);
+                       mdelay(2);
+                       awacs_write(awacs_reg[1] | MASK_ADDR1);
+               }
+               /* enable CD sound input */
+               if (macio_base && is_pbook_G3) {
+                       out_8(macio_base + 0x37, 3);
+               } else if (is_pbook_3400) {
+                       feature_set(awacs_node, FEATURE_IOBUS_enable);
+                       udelay(10);
+                       in_8(latch_base + 0x190);
+               }
+               /* Resume pending sounds. */
+               PMacPlay();
+       }
+       return PBOOK_SLEEP_OK;
+}
+#endif /* CONFIG_PMAC_PBOOK */
+
+
+/* All the burgundy functions: */
+
+/* Waits for busy flag to clear */
+inline static void
+awacs_burgundy_busy_wait(void)
+{
+       while (in_le32(&awacs->codec_ctrl) & MASK_NEWECMD)
+               ;
+}
+
+inline static void
+awacs_burgundy_extend_wait(void)
+{
+       while (!(in_le32(&awacs->codec_stat) & MASK_EXTEND))
+               ;
+       while (in_le32(&awacs->codec_stat) & MASK_EXTEND)
+               ;
+}
+
+static void
+awacs_burgundy_wcw(unsigned addr, unsigned val)
+{
+       out_le32(&awacs->codec_ctrl, addr + 0x200c00 + (val & 0xff));
+       awacs_burgundy_busy_wait();
+       out_le32(&awacs->codec_ctrl, addr + 0x200d00 +((val>>8) & 0xff));
+       awacs_burgundy_busy_wait();
+       out_le32(&awacs->codec_ctrl, addr + 0x200e00 +((val>>16) & 0xff));
+       awacs_burgundy_busy_wait();
+       out_le32(&awacs->codec_ctrl, addr + 0x200f00 +((val>>24) & 0xff));
+       awacs_burgundy_busy_wait();
+}
+
+static unsigned
+awacs_burgundy_rcw(unsigned addr)
+{
+       unsigned val = 0;
+       unsigned long flags;
+
+       /* should have timeouts here */
+       save_flags(flags); cli();
+
+       out_le32(&awacs->codec_ctrl, addr + 0x100000);
+       awacs_burgundy_busy_wait();
+       awacs_burgundy_extend_wait();
+       val += (in_le32(&awacs->codec_stat) >> 4) & 0xff;
+
+       out_le32(&awacs->codec_ctrl, addr + 0x100100);
+       awacs_burgundy_busy_wait();
+       awacs_burgundy_extend_wait();
+       val += ((in_le32(&awacs->codec_stat)>>4) & 0xff) <<8;
+
+       out_le32(&awacs->codec_ctrl, addr + 0x100200);
+       awacs_burgundy_busy_wait();
+       awacs_burgundy_extend_wait();
+       val += ((in_le32(&awacs->codec_stat)>>4) & 0xff) <<16;
+
+       out_le32(&awacs->codec_ctrl, addr + 0x100300);
+       awacs_burgundy_busy_wait();
+       awacs_burgundy_extend_wait();
+       val += ((in_le32(&awacs->codec_stat)>>4) & 0xff) <<24;
+
+       restore_flags(flags);
+
+       return val;
+}
+
+
+static void
+awacs_burgundy_wcb(unsigned addr, unsigned val)
+{
+       out_le32(&awacs->codec_ctrl, addr + 0x300000 + (val & 0xff));
+       awacs_burgundy_busy_wait();
+}
+
+static unsigned
+awacs_burgundy_rcb(unsigned addr)
+{
+       unsigned val = 0;
+       unsigned long flags;
+
+       /* should have timeouts here */
+       save_flags(flags); cli();
+
+       out_le32(&awacs->codec_ctrl, addr + 0x100000);
+       awacs_burgundy_busy_wait();
+       awacs_burgundy_extend_wait();
+       val += (in_le32(&awacs->codec_stat) >> 4) & 0xff;
+
+       restore_flags(flags);
+
+       return val;
+}
+
+static int
+awacs_burgundy_check(void)
+{
+       /* Checks to see the chip is alive and kicking */
+       int error = in_le32(&awacs->codec_ctrl) & MASK_ERRCODE;
+
+       return error == 0xf0000;
+}
+
+static int
+awacs_burgundy_init(void)
+{
+       if (awacs_burgundy_check()) {
+               printk(KERN_WARNING "AWACS: disabled by MacOS :-(\n");
+               return 1;
+       }
+
+       awacs_burgundy_wcb(MASK_ADDR_BURGUNDY_OUTPUTENABLES,
+                          DEF_BURGUNDY_OUTPUTENABLES);
+       awacs_burgundy_wcb(MASK_ADDR_BURGUNDY_MORE_OUTPUTENABLES,
+                          DEF_BURGUNDY_MORE_OUTPUTENABLES);
+       awacs_burgundy_wcw(MASK_ADDR_BURGUNDY_OUTPUTSELECTS,
+                          DEF_BURGUNDY_OUTPUTSELECTS);
+
+       awacs_burgundy_wcb(MASK_ADDR_BURGUNDY_INPSEL21,
+                          DEF_BURGUNDY_INPSEL21);
+       awacs_burgundy_wcb(MASK_ADDR_BURGUNDY_INPSEL3,
+                          DEF_BURGUNDY_INPSEL3);
+       awacs_burgundy_wcb(MASK_ADDR_BURGUNDY_GAINCD,
+                          DEF_BURGUNDY_GAINCD);
+       awacs_burgundy_wcb(MASK_ADDR_BURGUNDY_GAINLINE,
+                          DEF_BURGUNDY_GAINLINE);
+       awacs_burgundy_wcb(MASK_ADDR_BURGUNDY_GAINMIC,
+                          DEF_BURGUNDY_GAINMIC);
+       awacs_burgundy_wcb(MASK_ADDR_BURGUNDY_GAINMODEM,
+                          DEF_BURGUNDY_GAINMODEM);
+
+       awacs_burgundy_wcb(MASK_ADDR_BURGUNDY_ATTENSPEAKER,
+                          DEF_BURGUNDY_ATTENSPEAKER);
+       awacs_burgundy_wcb(MASK_ADDR_BURGUNDY_ATTENLINEOUT,
+                          DEF_BURGUNDY_ATTENLINEOUT);
+       awacs_burgundy_wcb(MASK_ADDR_BURGUNDY_ATTENHP,
+                          DEF_BURGUNDY_ATTENHP);
+
+       awacs_burgundy_wcw(MASK_ADDR_BURGUNDY_MASTER_VOLUME,
+                          DEF_BURGUNDY_MASTER_VOLUME);
+       awacs_burgundy_wcw(MASK_ADDR_BURGUNDY_VOLCD,
+                          DEF_BURGUNDY_VOLCD);
+       awacs_burgundy_wcw(MASK_ADDR_BURGUNDY_VOLLINE,
+                          DEF_BURGUNDY_VOLLINE);
+       awacs_burgundy_wcw(MASK_ADDR_BURGUNDY_VOLMIC,
+                          DEF_BURGUNDY_VOLMIC);
+       return 0;
+}
+
+static void
+awacs_burgundy_write_volume(unsigned address, int volume)
+{
+       int hardvolume,lvolume,rvolume;
+
+       lvolume = (volume & 0xff) ? (volume & 0xff) + 155 : 0;
+       rvolume = ((volume >>8)&0xff) ? ((volume >> 8)&0xff ) + 155 : 0;
+
+       hardvolume = lvolume + (rvolume << 16);
+
+       awacs_burgundy_wcw(address, hardvolume);
+}
+
+static int
+awacs_burgundy_read_volume(unsigned address)
+{
+       int softvolume,wvolume;
+
+       wvolume = awacs_burgundy_rcw(address);
+
+       softvolume = (wvolume & 0xff) - 155;
+       softvolume += (((wvolume >> 16) & 0xff) - 155)<<8;
+
+       return softvolume > 0 ? softvolume : 0;
+}
+
+
+
+
+static int
+awacs_burgundy_read_mvolume(unsigned address)
+{
+       int lvolume,rvolume,wvolume;
+
+       wvolume = awacs_burgundy_rcw(address);
+
+       wvolume &= 0xffff;
+
+       rvolume = (wvolume & 0xff) - 155;
+       lvolume = ((wvolume & 0xff00)>>8) - 155;
+
+       return lvolume + (rvolume << 8);
+}
+
+
+static void
+awacs_burgundy_write_mvolume(unsigned address, int volume)
+{
+       int lvolume,rvolume,hardvolume;
+
+       lvolume = (volume &0xff) ? (volume & 0xff) + 155 :0;
+       rvolume = ((volume >>8) & 0xff) ? (volume >> 8) + 155 :0;
+
+       hardvolume = lvolume + (rvolume << 8);
+       hardvolume += (hardvolume << 16);
+
+       awacs_burgundy_wcw(address, hardvolume);
+}
+
+/* End burgundy functions */
+
+
+
+
+
+/* Turn on sound output, needed on G3 desktop powermacs */
+static void
+awacs_enable_amp(int spkr_vol)
+{
+       struct adb_request req;
+
+       awacs_spkr_vol = spkr_vol;
+       if (sys_ctrler != SYS_CTRLER_CUDA)
+               return;
+
+       /* turn on headphones */
+       cuda_request(&req, NULL, 5, CUDA_PACKET, CUDA_GET_SET_IIC,
+                    0x8a, 4, 0);
+       while (!req.complete) cuda_poll();
+       cuda_request(&req, NULL, 5, CUDA_PACKET, CUDA_GET_SET_IIC,
+                    0x8a, 6, 0);
+       while (!req.complete) cuda_poll();
+
+       /* turn on speaker */
+       cuda_request(&req, NULL, 5, CUDA_PACKET, CUDA_GET_SET_IIC,
+                    0x8a, 3, (100 - (spkr_vol & 0xff)) * 32 / 100);
+       while (!req.complete) cuda_poll();
+       cuda_request(&req, NULL, 5, CUDA_PACKET, CUDA_GET_SET_IIC,
+                    0x8a, 5, (100 - ((spkr_vol >> 8) & 0xff)) * 32 / 100);
+       while (!req.complete) cuda_poll();
+
+       cuda_request(&req, NULL, 5, CUDA_PACKET,
+                    CUDA_GET_SET_IIC, 0x8a, 1, 0x29);
+       while (!req.complete) cuda_poll();
+}
+
+
+/*** Mid level stuff *********************************************************/
+
+
+/*
+ * /dev/mixer abstraction
+ */
+
+static int PMacMixerIoctl(u_int cmd, u_long arg)
+{
+       int data;
+       /* Different IOCTLS for burgundy*/
+       if (awacs_revision < AWACS_BURGUNDY) {
+               switch (cmd) {
+               case SOUND_MIXER_READ_DEVMASK:
+                       data = SOUND_MASK_VOLUME | SOUND_MASK_SPEAKER
+                               | SOUND_MASK_LINE | SOUND_MASK_MIC
+                               | SOUND_MASK_CD | SOUND_MASK_RECLEV
+                               | SOUND_MASK_ALTPCM
+                               | SOUND_MASK_MONITOR;
+                       return IOCTL_OUT(arg, data);
+               case SOUND_MIXER_READ_RECMASK:
+                       data = SOUND_MASK_LINE | SOUND_MASK_MIC
+                               | SOUND_MASK_CD;
+                       return IOCTL_OUT(arg, data);
+               case SOUND_MIXER_READ_RECSRC:
+                       data = 0;
+                       if (awacs_reg[0] & MASK_MUX_AUDIN)
+                               data |= SOUND_MASK_LINE;
+                       if (awacs_reg[0] & MASK_MUX_MIC)
+                               data |= SOUND_MASK_MIC;
+                       if (awacs_reg[0] & MASK_MUX_CD)
+                               data |= SOUND_MASK_CD;
+                       if (awacs_reg[1] & MASK_LOOPTHRU)
+                               data |= SOUND_MASK_MONITOR;
+                       return IOCTL_OUT(arg, data);
+               case SOUND_MIXER_WRITE_RECSRC:
+                       IOCTL_IN(arg, data);
+                       data &= (SOUND_MASK_LINE
+                                | SOUND_MASK_MIC | SOUND_MASK_CD
+                                | SOUND_MASK_MONITOR);
+                       awacs_reg[0] &= ~(MASK_MUX_CD | MASK_MUX_MIC
+                                         | MASK_MUX_AUDIN);
+                       awacs_reg[1] &= ~MASK_LOOPTHRU;
+                       if (data & SOUND_MASK_LINE)
+                               awacs_reg[0] |= MASK_MUX_AUDIN;
+                       if (data & SOUND_MASK_MIC)
+                               awacs_reg[0] |= MASK_MUX_MIC;
+                       if (data & SOUND_MASK_CD)
+                               awacs_reg[0] |= MASK_MUX_CD;
+                       if (data & SOUND_MASK_MONITOR)
+                               awacs_reg[1] |= MASK_LOOPTHRU;
+                       awacs_write(awacs_reg[0] | MASK_ADDR0);
+                       awacs_write(awacs_reg[1] | MASK_ADDR1);
+                       return IOCTL_OUT(arg, data);
+               case SOUND_MIXER_READ_STEREODEVS:
+                       data = SOUND_MASK_VOLUME | SOUND_MASK_SPEAKER
+                               | SOUND_MASK_RECLEV;
+                       return IOCTL_OUT(arg, data);
+               case SOUND_MIXER_READ_CAPS:
+                       return IOCTL_OUT(arg, 0);
+               case SOUND_MIXER_READ_VOLUME:
+                       data = (awacs_reg[1] & MASK_AMUTE)? 0:
+                               awacs_get_volume(awacs_reg[2], 6);
+                       return IOCTL_OUT(arg, data);
+               case SOUND_MIXER_WRITE_VOLUME:
+                       IOCTL_IN(arg, data);
+                       return IOCTL_OUT(arg, dmasound_set_volume(data));
+               case SOUND_MIXER_READ_SPEAKER:
+                       if (awacs_revision == 3
+                           && sys_ctrler == SYS_CTRLER_CUDA)
+                               data = awacs_spkr_vol;
+                       else
+                               data = (awacs_reg[1] & MASK_CMUTE)? 0:
+                                       awacs_get_volume(awacs_reg[4], 6);
+                       return IOCTL_OUT(arg, data);
+               case SOUND_MIXER_WRITE_SPEAKER:
+                       IOCTL_IN(arg, data);
+                       if (awacs_revision == 3
+                           && sys_ctrler == SYS_CTRLER_CUDA)
+                               awacs_enable_amp(data);
+                       else
+                               data = awacs_volume_setter(data, 4, MASK_CMUTE, 6);
+                       return IOCTL_OUT(arg, data);
+               case SOUND_MIXER_WRITE_ALTPCM:  /* really bell volume */
+                       IOCTL_IN(arg, data);
+                       beep_volume = data & 0xff;
+                       /* fall through */
+               case SOUND_MIXER_READ_ALTPCM:
+                       return IOCTL_OUT(arg, beep_volume);
+               case SOUND_MIXER_WRITE_LINE:
+                       IOCTL_IN(arg, data);
+                       awacs_reg[0] &= ~MASK_MUX_AUDIN;
+                       if ((data & 0xff) >= 50)
+                               awacs_reg[0] |= MASK_MUX_AUDIN;
+                       awacs_write(MASK_ADDR0 | awacs_reg[0]);
+                       /* fall through */
+               case SOUND_MIXER_READ_LINE:
+                       data = (awacs_reg[0] & MASK_MUX_AUDIN)? 100: 0;
+                       return IOCTL_OUT(arg, data);
+               case SOUND_MIXER_WRITE_MIC:
+                       IOCTL_IN(arg, data);
+                       data &= 0xff;
+                       awacs_reg[0] &= ~(MASK_MUX_MIC | MASK_GAINLINE);
+                       if (data >= 25) {
+                               awacs_reg[0] |= MASK_MUX_MIC;
+                               if (data >= 75)
+                                       awacs_reg[0] |= MASK_GAINLINE;
+                       }
+                       awacs_write(MASK_ADDR0 | awacs_reg[0]);
+                       /* fall through */
+               case SOUND_MIXER_READ_MIC:
+                       data = (awacs_reg[0] & MASK_MUX_MIC)?
+                               (awacs_reg[0] & MASK_GAINLINE? 100: 50): 0;
+                       return IOCTL_OUT(arg, data);
+               case SOUND_MIXER_WRITE_CD:
+                       IOCTL_IN(arg, data);
+                       awacs_reg[0] &= ~MASK_MUX_CD;
+                       if ((data & 0xff) >= 50)
+                               awacs_reg[0] |= MASK_MUX_CD;
+                       awacs_write(MASK_ADDR0 | awacs_reg[0]);
+                       /* fall through */
+               case SOUND_MIXER_READ_CD:
+                       data = (awacs_reg[0] & MASK_MUX_CD)? 100: 0;
+                       return IOCTL_OUT(arg, data);
+               case SOUND_MIXER_WRITE_RECLEV:
+                       IOCTL_IN(arg, data);
+                       data = awacs_volume_setter(data, 0, 0, 4);
+                       return IOCTL_OUT(arg, data);
+               case SOUND_MIXER_READ_RECLEV:
+                       data = awacs_get_volume(awacs_reg[0], 4);
+                       return IOCTL_OUT(arg, data);
+               }
+       } else {
+               /* We are, we are, we are... Burgundy or better */
+               switch(cmd) {
+               case SOUND_MIXER_READ_DEVMASK:
+                       data = SOUND_MASK_VOLUME | SOUND_MASK_CD |
+                               SOUND_MASK_LINE | SOUND_MASK_MIC |
+                               SOUND_MASK_SPEAKER | SOUND_MASK_ALTPCM;
+                       return IOCTL_OUT(arg, data);
+               case SOUND_MIXER_READ_RECMASK:
+                       data = SOUND_MASK_LINE | SOUND_MASK_MIC
+                               | SOUND_MASK_CD;
+                       return IOCTL_OUT(arg, data);
+               case SOUND_MIXER_READ_RECSRC:
+                       data = 0;
+                       if (awacs_reg[0] & MASK_MUX_AUDIN)
+                               data |= SOUND_MASK_LINE;
+                       if (awacs_reg[0] & MASK_MUX_MIC)
+                               data |= SOUND_MASK_MIC;
+                       if (awacs_reg[0] & MASK_MUX_CD)
+                               data |= SOUND_MASK_CD;
+                       return IOCTL_OUT(arg, data);
+               case SOUND_MIXER_WRITE_RECSRC:
+                       IOCTL_IN(arg, data);
+                       data &= (SOUND_MASK_LINE
+                                | SOUND_MASK_MIC | SOUND_MASK_CD);
+                       awacs_reg[0] &= ~(MASK_MUX_CD | MASK_MUX_MIC
+                                         | MASK_MUX_AUDIN);
+                       if (data & SOUND_MASK_LINE)
+                               awacs_reg[0] |= MASK_MUX_AUDIN;
+                       if (data & SOUND_MASK_MIC)
+                               awacs_reg[0] |= MASK_MUX_MIC;
+                       if (data & SOUND_MASK_CD)
+                               awacs_reg[0] |= MASK_MUX_CD;
+                       awacs_write(awacs_reg[0] | MASK_ADDR0);
+                       return IOCTL_OUT(arg, data);
+               case SOUND_MIXER_READ_STEREODEVS:
+                       data = SOUND_MASK_VOLUME | SOUND_MASK_SPEAKER
+                               | SOUND_MASK_RECLEV | SOUND_MASK_CD
+                               | SOUND_MASK_LINE;
+                       return IOCTL_OUT(arg, data);
+               case SOUND_MIXER_READ_CAPS:
+                       return IOCTL_OUT(arg, 0);
+               case SOUND_MIXER_WRITE_VOLUME:
+                       IOCTL_IN(arg, data);
+                       awacs_burgundy_write_mvolume(MASK_ADDR_BURGUNDY_MASTER_VOLUME, data);
+                       /* Fall through */
+               case SOUND_MIXER_READ_VOLUME:
+                       return IOCTL_OUT(arg, awacs_burgundy_read_mvolume(MASK_ADDR_BURGUNDY_MASTER_VOLUME));
+               case SOUND_MIXER_WRITE_SPEAKER:
+                       IOCTL_IN(arg, data);
+
+                       if (!(data & 0xff)) {
+                         /* Mute the left speaker */
+                         awacs_burgundy_wcb(MASK_ADDR_BURGUNDY_MORE_OUTPUTENABLES,
+                                            awacs_burgundy_rcb(MASK_ADDR_BURGUNDY_MORE_OUTPUTENABLES) & ~0x2);
+                       } else {
+                         /* Unmute the left speaker */
+                         awacs_burgundy_wcb(MASK_ADDR_BURGUNDY_MORE_OUTPUTENABLES,
+                                            awacs_burgundy_rcb(MASK_ADDR_BURGUNDY_MORE_OUTPUTENABLES) | 0x2);
+                       }
+                       if (!(data & 0xff00)) {
+                         /* Mute the right speaker */
+                         awacs_burgundy_wcb(MASK_ADDR_BURGUNDY_MORE_OUTPUTENABLES,
+                                            awacs_burgundy_rcb(MASK_ADDR_BURGUNDY_MORE_OUTPUTENABLES) & ~0x4);
+                       } else {
+                         /* Unmute the right speaker */
+                         awacs_burgundy_wcb(MASK_ADDR_BURGUNDY_MORE_OUTPUTENABLES,
+                                            awacs_burgundy_rcb(MASK_ADDR_BURGUNDY_MORE_OUTPUTENABLES) | 0x4);
+                       }
+
+                       data = (((data&0xff)*16)/100 > 0xf ? 0xf :
+                               (((data&0xff)*16)/100)) +
+                                ((((data>>8)*16)/100 > 0xf ? 0xf :
+                               ((((data>>8)*16)/100)))<<4);
+
+                       awacs_burgundy_wcb(MASK_ADDR_BURGUNDY_ATTENSPEAKER, ~data);
+                       /* Fall through */
+               case SOUND_MIXER_READ_SPEAKER:
+                       data = awacs_burgundy_rcb(MASK_ADDR_BURGUNDY_ATTENSPEAKER);
+                       data = (((data & 0xf)*100)/16) + ((((data>>4)*100)/16)<<8);
+                       return IOCTL_OUT(arg, ~data);
+               case SOUND_MIXER_WRITE_ALTPCM:  /* really bell volume */
+                       IOCTL_IN(arg, data);
+                       beep_volume = data & 0xff;
+                       /* fall through */
+               case SOUND_MIXER_READ_ALTPCM:
+                       return IOCTL_OUT(arg, beep_volume);
+               case SOUND_MIXER_WRITE_LINE:
+                       IOCTL_IN(arg, data);
+                       awacs_burgundy_write_volume(MASK_ADDR_BURGUNDY_VOLLINE, data);
+
+                       /* fall through */
+               case SOUND_MIXER_READ_LINE:
+                       data = awacs_burgundy_read_volume(MASK_ADDR_BURGUNDY_VOLLINE);
+                       return IOCTL_OUT(arg, data);
+               case SOUND_MIXER_WRITE_MIC:
+                       IOCTL_IN(arg, data);
+                       /* Mic is mono device */
+                       data = (data << 8) + (data << 24);
+                       awacs_burgundy_write_volume(MASK_ADDR_BURGUNDY_VOLMIC, data);
+                       /* fall through */
+               case SOUND_MIXER_READ_MIC:
+                       data = awacs_burgundy_read_volume(MASK_ADDR_BURGUNDY_VOLMIC);
+                       data <<= 24;
+                       return IOCTL_OUT(arg, data);
+               case SOUND_MIXER_WRITE_CD:
+                       IOCTL_IN(arg, data);
+                       awacs_burgundy_write_volume(MASK_ADDR_BURGUNDY_VOLCD, data);
+                       /* fall through */
+               case SOUND_MIXER_READ_CD:
+                       data = awacs_burgundy_read_volume(MASK_ADDR_BURGUNDY_VOLCD);
+                       return IOCTL_OUT(arg, data);
+               case SOUND_MIXER_WRITE_RECLEV:
+                       IOCTL_IN(arg, data);
+                       data = awacs_volume_setter(data, 0, 0, 4);
+                       return IOCTL_OUT(arg, data);
+               case SOUND_MIXER_READ_RECLEV:
+                       data = awacs_get_volume(awacs_reg[0], 4);
+                       return IOCTL_OUT(arg, data);
+               case SOUND_MIXER_OUTMASK:
+                       break;
+               case SOUND_MIXER_OUTSRC:
+                       break;
+               }
+       }
+       return -EINVAL;
+}
+
+
+static void PMacWriteSqSetup(void)
+{
+       int i;
+       volatile struct dbdma_cmd *cp;
+
+       cp = awacs_tx_cmds;
+       memset((void *)cp, 0, (write_sq.numBufs+1) * sizeof(struct dbdma_cmd));
+       for (i = 0; i < write_sq.numBufs; ++i, ++cp) {
+               st_le32(&cp->phy_addr, virt_to_bus(write_sq.buffers[i]));
+       }
+       st_le16(&cp->command, DBDMA_NOP + BR_ALWAYS);
+       st_le32(&cp->cmd_dep, virt_to_bus(awacs_tx_cmds));
+       out_le32(&awacs_txdma->control, (RUN|PAUSE|FLUSH|WAKE) << 16);
+       out_le32(&awacs_txdma->cmdptr, virt_to_bus(awacs_tx_cmds));
+}
+
+static void PMacReadSqSetup(void)
+{
+       int i;
+       volatile struct dbdma_cmd *cp;
+
+       cp = awacs_rx_cmds;
+       memset((void *)cp, 0, (read_sq.numBufs+1) * sizeof(struct dbdma_cmd));
+
+       /* Set dma buffers up in a loop */
+       for (i = 0; i < read_sq.numBufs; i++,cp++) {
+               st_le32(&cp->phy_addr, virt_to_bus(read_sq.buffers[i]));
+               st_le16(&cp->command, INPUT_MORE + INTR_ALWAYS);
+               st_le16(&cp->req_count, read_sq.block_size);
+               st_le16(&cp->xfer_status, 0);
+       }
+
+       /* The next two lines make the thing loop around.
+       */
+       st_le16(&cp->command, DBDMA_NOP + BR_ALWAYS);
+       st_le32(&cp->cmd_dep, virt_to_bus(awacs_rx_cmds));
+
+       /* Don't start until the first read is done.
+        * This will also abort any operations in progress if the DMA
+        * happens to be running (and it shouldn't).
+        */
+       out_le32(&awacs_rxdma->control, (RUN|PAUSE|FLUSH|WAKE) << 16);
+       out_le32(&awacs_rxdma->cmdptr, virt_to_bus(awacs_rx_cmds));
+
+}
+
+static void PMacAbortRead(void)
+{
+       int i;
+       volatile struct dbdma_cmd *cp;
+
+       cp = awacs_rx_cmds;
+       for (i = 0; i < read_sq.numBufs; i++,cp++)
+               st_le16(&cp->command, DBDMA_STOP);
+       /*
+        * We should probably wait for the thing to stop before we
+        * release the memory
+        */
+}
+
+
+/*** Machine definitions *****************************************************/
+
+
+static MACHINE machPMac = {
+       name:           awacs_name,
+       name2:          "AWACS",
+       open:           PMacOpen,
+       release:        PMacRelease,
+       dma_alloc:      PMacAlloc,
+       dma_free:       PMacFree,
+       irqinit:        PMacIrqInit,
+#ifdef MODULE
+       irqcleanup:     PMacIrqCleanup,
+#endif /* MODULE */
+       init:           PMacInit,
+       silence:        PMacSilence,
+       setFormat:      PMacSetFormat,
+       setVolume:      PMacSetVolume,
+       play:           PMacPlay,
+       record:         PMacRecord,
+       mixer_ioctl:    PMacMixerIoctl,
+       write_sq_setup: PMacWriteSqSetup,
+       read_sq_setup:  PMacReadSqSetup,
+       abort_read:     PMacAbortRead,
+       min_dsp_speed:  8000
+};
+
+
+/*** Config & Setup **********************************************************/
+
+
+int __init dmasound_awacs_init(void)
+{
+       struct device_node *np;
+
+       if (_machine != _MACH_Pmac)
+               return -ENODEV;
+
+       awacs_subframe = 0;
+       awacs_revision = 0;
+       np = find_devices("awacs");
+       if (np == 0) {
+               /*
+                * powermac G3 models have a node called "davbus"
+                * with a child called "sound".
+                */
+               struct device_node *sound;
+               np = find_devices("davbus");
+               sound = find_devices("sound");
+               if (sound != 0 && sound->parent == np) {
+                       unsigned int *prop, l, i;
+                       prop = (unsigned int *)
+                               get_property(sound, "sub-frame", 0);
+                       if (prop != 0 && *prop >= 0 && *prop < 16)
+                               awacs_subframe = *prop;
+                       if (device_is_compatible(sound, "burgundy"))
+                               awacs_revision = AWACS_BURGUNDY;
+
+                       /* look for a property saying what sample rates
+                          are available */
+                       for (i = 0; i < 8; ++i)
+                               awacs_freqs_ok[i] = 0;
+                       prop = (unsigned int *) get_property
+                               (sound, "sample-rates", &l);
+                       if (prop == 0)
+                               prop = (unsigned int *) get_property
+                                       (sound, "output-frame-rates", &l);
+                       if (prop != 0) {
+                               for (l /= sizeof(int); l > 0; --l) {
+                                       /* sometimes the rate is in the
+                                          high-order 16 bits (?) */
+                                       unsigned int r = *prop++;
+                                       if (r >= 0x10000)
+                                               r >>= 16;
+                                       for (i = 0; i < 8; ++i) {
+                                               if (r == awacs_freqs[i]) {
+                                                       awacs_freqs_ok[i] = 1;
+                                                       break;
+                                               }
+                                       }
+                               }
+                       } else {
+                               /* assume just 44.1k is OK */
+                               awacs_freqs_ok[0] = 1;
+                       }
+               }
+       }
+       if (np != NULL && np->n_addrs >= 3 && np->n_intrs >= 3) {
+               int vol;
+               dmasound.mach = machPMac;
+
+               awacs = (volatile struct awacs_regs *)
+                       ioremap(np->addrs[0].address, 0x80);
+               awacs_txdma = (volatile struct dbdma_regs *)
+                       ioremap(np->addrs[1].address, 0x100);
+               awacs_rxdma = (volatile struct dbdma_regs *)
+                       ioremap(np->addrs[2].address, 0x100);
+
+               awacs_irq = np->intrs[0].line;
+               awacs_tx_irq = np->intrs[1].line;
+               awacs_rx_irq = np->intrs[2].line;
+
+               awacs_tx_cmd_space = kmalloc((write_sq.numBufs + 4) * sizeof(struct dbdma_cmd),
+                                            GFP_KERNEL);
+               if (awacs_tx_cmd_space == NULL) {
+                       printk(KERN_ERR "DMA sound driver: Not enough buffer memory, driver disabled!\n");
+                       return -ENOMEM;
+               }
+               awacs_node = np;
+#ifdef CONFIG_PMAC_PBOOK
+               if (machine_is_compatible("PowerBook1,1")
+                   || machine_is_compatible("AAPL,PowerBook1998")) {
+                       feature_set(np, FEATURE_Sound_CLK_enable);
+                       feature_set(np, FEATURE_Sound_power);
+                       /* Shorter delay will not work */
+                       mdelay(1000);
+               }
+#endif
+               awacs_tx_cmds = (volatile struct dbdma_cmd *)
+                       DBDMA_ALIGN(awacs_tx_cmd_space);
+
+
+               awacs_rx_cmd_space = kmalloc((read_sq.numBufs + 4) * sizeof(struct dbdma_cmd),
+                                            GFP_KERNEL);
+               if (awacs_rx_cmd_space == NULL) {
+                 printk("DMA sound driver: No memory for input");
+               }
+               awacs_rx_cmds = (volatile struct dbdma_cmd *)
+                 DBDMA_ALIGN(awacs_rx_cmd_space);
+
+
+
+               awacs_reg[0] = MASK_MUX_CD;
+               awacs_reg[1] = MASK_LOOPTHRU | MASK_PAROUT;
+               /* get default volume from nvram */
+               vol = (~nvram_read_byte(0x1308) & 7) << 1;
+               awacs_reg[2] = vol + (vol << 6);
+               awacs_reg[4] = vol + (vol << 6);
+               out_le32(&awacs->control, 0x11);
+               awacs_write(awacs_reg[0] + MASK_ADDR0);
+               awacs_write(awacs_reg[1] + MASK_ADDR1);
+               awacs_write(awacs_reg[2] + MASK_ADDR2);
+               awacs_write(awacs_reg[4] + MASK_ADDR4);
+
+               /* Initialize recent versions of the awacs */
+               if (awacs_revision == 0) {
+                       awacs_revision =
+                               (in_le32(&awacs->codec_stat) >> 12) & 0xf;
+                       if (awacs_revision == 3) {
+                               mdelay(100);
+                               awacs_write(0x6000);
+                               mdelay(2);
+                               awacs_write(awacs_reg[1] + MASK_ADDR1);
+                               awacs_enable_amp(100 * 0x101);
+                       }
+               }
+               if (awacs_revision >= AWACS_BURGUNDY)
+                       awacs_burgundy_init();
+
+               /* Initialize beep stuff */
+               beep_dbdma_cmd = awacs_tx_cmds + (write_sq.numBufs + 1);
+               orig_mksound = kd_mksound;
+               kd_mksound = awacs_mksound;
+               beep_buf = (short *) kmalloc(BEEP_BUFLEN * 4, GFP_KERNEL);
+               if (beep_buf == NULL)
+                       printk(KERN_WARNING "dmasound: no memory for "
+                              "beep buffer\n");
+#ifdef CONFIG_PMAC_PBOOK
+               pmu_register_sleep_notifier(&awacs_sleep_notifier);
+#endif /* CONFIG_PMAC_PBOOK */
+
+               /* Powerbooks have odd ways of enabling inputs such as
+                  an expansion-bay CD or sound from an internal modem
+                  or a PC-card modem. */
+               if (machine_is_compatible("AAPL,3400/2400")
+                       || machine_is_compatible("AAPL,3500")) {
+                       is_pbook_3400 = 1;
+                       /*
+                        * Enable CD and PC-card sound inputs.
+                        * This is done by reading from address
+                        * f301a000, + 0x10 to enable the expansion-bay
+                        * CD sound input, + 0x80 to enable the PC-card
+                        * sound input.  The 0x100 enables the SCSI bus
+                        * terminator power.
+                        */
+                       latch_base = (unsigned char *) ioremap
+                               (0xf301a000, 0x1000);
+                       in_8(latch_base + 0x190);
+               } else if (machine_is_compatible("PowerBook1,1")
+                          || machine_is_compatible("AAPL,PowerBook1998")) {
+                       struct device_node* mio;
+                       macio_base = 0;
+                       is_pbook_G3 = 1;
+                       for (mio = np->parent; mio; mio = mio->parent) {
+                               if (strcmp(mio->name, "mac-io") == 0
+                                   && mio->n_addrs > 0) {
+                                       macio_base = (unsigned char *) ioremap
+                                               (mio->addrs[0].address, 0x40);
+                                       break;
+                               }
+                       }
+                       /* enable CD sound input */
+                       if (macio_base)
+                               out_8(macio_base + 0x37, 3);
+               }
+               sprintf(awacs_name, "PowerMac (AWACS rev %d) ",
+                       awacs_revision);
+               return dmasound_init();
+       }
+       return -ENODEV;
+}
+
+static void __exit dmasound_awacs_cleanup(void)
+{
+       dmasound_deinit();
+}
+
+module_init(dmasound_awacs_init);
+module_exit(dmasound_awacs_cleanup);
diff --git a/drivers/sound/dmasound/dmasound_core.c b/drivers/sound/dmasound/dmasound_core.c
new file mode 100644 (file)
index 0000000..594ee92
--- /dev/null
@@ -0,0 +1,1313 @@
+
+/*
+ *  linux/drivers/sound/dmasound.c
+ *
+ *
+ *  OSS/Free compatible Atari TT/Falcon and Amiga DMA sound driver for
+ *  Linux/m68k
+ *  Extended to support Power Macintosh for Linux/ppc by Paul Mackerras
+ *
+ *  (c) 1995 by Michael Schlueter & Michael Marte
+ *
+ *  Michael Schlueter (michael@duck.syd.de) did the basic structure of the VFS
+ *  interface and the u-law to signed byte conversion.
+ *
+ *  Michael Marte (marte@informatik.uni-muenchen.de) did the sound queue,
+ *  /dev/mixer, /dev/sndstat and complemented the VFS interface. He would like
+ *  to thank:
+ *    - Michael Schlueter for initial ideas and documentation on the MFP and
+ *     the DMA sound hardware.
+ *    - Therapy? for their CD 'Troublegum' which really made me rock.
+ *
+ *  /dev/sndstat is based on code by Hannu Savolainen, the author of the
+ *  VoxWare family of drivers.
+ *
+ *  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.
+ *
+ *  History:
+ *
+ *     1995/8/25       First release
+ *
+ *     1995/9/02       Roman Hodek:
+ *                       - Fixed atari_stram_alloc() call, the timer
+ *                         programming and several race conditions
+ *     1995/9/14       Roman Hodek:
+ *                       - After some discussion with Michael Schlueter,
+ *                         revised the interrupt disabling
+ *                       - Slightly speeded up U8->S8 translation by using
+ *                         long operations where possible
+ *                       - Added 4:3 interpolation for /dev/audio
+ *
+ *     1995/9/20       Torsten Scherer:
+ *                       - Fixed a bug in sq_write and changed /dev/audio
+ *                         converting to play at 12517Hz instead of 6258Hz.
+ *
+ *     1995/9/23       Torsten Scherer:
+ *                       - Changed sq_interrupt() and sq_play() to pre-program
+ *                         the DMA for another frame while there's still one
+ *                         running. This allows the IRQ response to be
+ *                         arbitrarily delayed and playing will still continue.
+ *
+ *     1995/10/14      Guenther Kelleter, Torsten Scherer:
+ *                       - Better support for Falcon audio (the Falcon doesn't
+ *                         raise an IRQ at the end of a frame, but at the
+ *                         beginning instead!). uses 'if (codec_dma)' in lots
+ *                         of places to simply switch between Falcon and TT
+ *                         code.
+ *
+ *     1995/11/06      Torsten Scherer:
+ *                       - Started introducing a hardware abstraction scheme
+ *                         (may perhaps also serve for Amigas?)
+ *                       - Can now play samples at almost all frequencies by
+ *                         means of a more generalized expand routine
+ *                       - Takes a good deal of care to cut data only at
+ *                         sample sizes
+ *                       - Buffer size is now a kernel runtime option
+ *                       - Implemented fsync() & several minor improvements
+ *                     Guenther Kelleter:
+ *                       - Useful hints and bug fixes
+ *                       - Cross-checked it for Falcons
+ *
+ *     1996/3/9        Geert Uytterhoeven:
+ *                       - Support added for Amiga, A-law, 16-bit little
+ *                         endian.
+ *                       - Unification to drivers/sound/dmasound.c.
+ *
+ *     1996/4/6        Martin Mitchell:
+ *                       - Updated to 1.3 kernel.
+ *
+ *     1996/6/13       Topi Kanerva:
+ *                       - Fixed things that were broken (mainly the amiga
+ *                         14-bit routines)
+ *                       - /dev/sndstat shows now the real hardware frequency
+ *                       - The lowpass filter is disabled by default now
+ *
+ *     1996/9/25       Geert Uytterhoeven:
+ *                       - Modularization
+ *
+ *     1998/6/10       Andreas Schwab:
+ *                       - Converted to use sound_core
+ *
+ *     1999/12/28      Richard Zidlicky:
+ *                       - Added support for Q40
+ *
+ *     2000/2/27       Geert Uytterhoeven:
+ *                       - Clean up and split the code into 4 parts:
+ *                           o dmasound_core: machine-independent code
+ *                           o dmasound_atari: Atari TT and Falcon support
+ *                           o dmasound_awacs: Apple PowerMac support
+ *                           o dmasound_paula: Amiga support
+ *
+ *     2000/3/25       Geert Uytterhoeven:
+ *                       - Integration of dmasound_q40
+ *                       - Small clean ups
+ */
+
+
+#include <linux/module.h>
+#include <linux/malloc.h>
+#include <linux/sound.h>
+#include <linux/init.h>
+#include <linux/soundcard.h>
+
+#include <asm/uaccess.h>
+
+#include "dmasound.h"
+
+
+    /*
+     *  Declarations
+     */
+
+int dmasound_catchRadius = 0;
+static unsigned int numWriteBufs = 4;
+static unsigned int writeBufSize = 32; /* in KB! */
+#ifdef HAS_RECORD
+static unsigned int numReadBufs = 4;
+static unsigned int readBufSize = 32;  /* in KB! */
+#endif
+
+MODULE_PARM(dmasound_catchRadius, "i");
+MODULE_PARM(numWriteBufs, "i");
+MODULE_PARM(writeBufSize, "i");
+MODULE_PARM(numReadBufs, "i");
+MODULE_PARM(readBufSize, "i");
+
+#ifdef MODULE
+static int sq_unit = -1;
+static int mixer_unit = -1;
+static int state_unit = -1;
+static int irq_installed = 0;
+#endif /* MODULE */
+
+
+    /*
+     *  Conversion tables
+     */
+
+#ifdef HAS_8BIT_TABLES
+/* 8 bit mu-law */
+
+char dmasound_ulaw2dma8[] = {
+       -126,   -122,   -118,   -114,   -110,   -106,   -102,   -98,
+       -94,    -90,    -86,    -82,    -78,    -74,    -70,    -66,
+       -63,    -61,    -59,    -57,    -55,    -53,    -51,    -49,
+       -47,    -45,    -43,    -41,    -39,    -37,    -35,    -33,
+       -31,    -30,    -29,    -28,    -27,    -26,    -25,    -24,
+       -23,    -22,    -21,    -20,    -19,    -18,    -17,    -16,
+       -16,    -15,    -15,    -14,    -14,    -13,    -13,    -12,
+       -12,    -11,    -11,    -10,    -10,    -9,     -9,     -8,
+       -8,     -8,     -7,     -7,     -7,     -7,     -6,     -6,
+       -6,     -6,     -5,     -5,     -5,     -5,     -4,     -4,
+       -4,     -4,     -4,     -4,     -3,     -3,     -3,     -3,
+       -3,     -3,     -3,     -3,     -2,     -2,     -2,     -2,
+       -2,     -2,     -2,     -2,     -2,     -2,     -2,     -2,
+       -1,     -1,     -1,     -1,     -1,     -1,     -1,     -1,
+       -1,     -1,     -1,     -1,     -1,     -1,     -1,     -1,
+       -1,     -1,     -1,     -1,     -1,     -1,     -1,     0,
+       125,    121,    117,    113,    109,    105,    101,    97,
+       93,     89,     85,     81,     77,     73,     69,     65,
+       62,     60,     58,     56,     54,     52,     50,     48,
+       46,     44,     42,     40,     38,     36,     34,     32,
+       30,     29,     28,     27,     26,     25,     24,     23,
+       22,     21,     20,     19,     18,     17,     16,     15,
+       15,     14,     14,     13,     13,     12,     12,     11,
+       11,     10,     10,     9,      9,      8,      8,      7,
+       7,      7,      6,      6,      6,      6,      5,      5,
+       5,      5,      4,      4,      4,      4,      3,      3,
+       3,      3,      3,      3,      2,      2,      2,      2,
+       2,      2,      2,      2,      1,      1,      1,      1,
+       1,      1,      1,      1,      1,      1,      1,      1,
+       0,      0,      0,      0,      0,      0,      0,      0,
+       0,      0,      0,      0,      0,      0,      0,      0,
+       0,      0,      0,      0,      0,      0,      0,      0
+};
+
+/* 8 bit A-law */
+
+char dmasound_alaw2dma8[] = {
+       -22,    -21,    -24,    -23,    -18,    -17,    -20,    -19,
+       -30,    -29,    -32,    -31,    -26,    -25,    -28,    -27,
+       -11,    -11,    -12,    -12,    -9,     -9,     -10,    -10,
+       -15,    -15,    -16,    -16,    -13,    -13,    -14,    -14,
+       -86,    -82,    -94,    -90,    -70,    -66,    -78,    -74,
+       -118,   -114,   -126,   -122,   -102,   -98,    -110,   -106,
+       -43,    -41,    -47,    -45,    -35,    -33,    -39,    -37,
+       -59,    -57,    -63,    -61,    -51,    -49,    -55,    -53,
+       -2,     -2,     -2,     -2,     -2,     -2,     -2,     -2,
+       -2,     -2,     -2,     -2,     -2,     -2,     -2,     -2,
+       -1,     -1,     -1,     -1,     -1,     -1,     -1,     -1,
+       -1,     -1,     -1,     -1,     -1,     -1,     -1,     -1,
+       -6,     -6,     -6,     -6,     -5,     -5,     -5,     -5,
+       -8,     -8,     -8,     -8,     -7,     -7,     -7,     -7,
+       -3,     -3,     -3,     -3,     -3,     -3,     -3,     -3,
+       -4,     -4,     -4,     -4,     -4,     -4,     -4,     -4,
+       21,     20,     23,     22,     17,     16,     19,     18,
+       29,     28,     31,     30,     25,     24,     27,     26,
+       10,     10,     11,     11,     8,      8,      9,      9,
+       14,     14,     15,     15,     12,     12,     13,     13,
+       86,     82,     94,     90,     70,     66,     78,     74,
+       118,    114,    126,    122,    102,    98,     110,    106,
+       43,     41,     47,     45,     35,     33,     39,     37,
+       59,     57,     63,     61,     51,     49,     55,     53,
+       1,      1,      1,      1,      1,      1,      1,      1,
+       1,      1,      1,      1,      1,      1,      1,      1,
+       0,      0,      0,      0,      0,      0,      0,      0,
+       0,      0,      0,      0,      0,      0,      0,      0,
+       5,      5,      5,      5,      4,      4,      4,      4,
+       7,      7,      7,      7,      6,      6,      6,      6,
+       2,      2,      2,      2,      2,      2,      2,      2,
+       3,      3,      3,      3,      3,      3,      3,      3
+};
+#endif /* HAS_8BIT_TABLES */
+
+#ifdef HAS_16BIT_TABLES
+
+/* 16 bit mu-law */
+
+short dmasound_ulaw2dma16[] = {
+       -32124, -31100, -30076, -29052, -28028, -27004, -25980, -24956,
+       -23932, -22908, -21884, -20860, -19836, -18812, -17788, -16764,
+       -15996, -15484, -14972, -14460, -13948, -13436, -12924, -12412,
+       -11900, -11388, -10876, -10364, -9852,  -9340,  -8828,  -8316,
+       -7932,  -7676,  -7420,  -7164,  -6908,  -6652,  -6396,  -6140,
+       -5884,  -5628,  -5372,  -5116,  -4860,  -4604,  -4348,  -4092,
+       -3900,  -3772,  -3644,  -3516,  -3388,  -3260,  -3132,  -3004,
+       -2876,  -2748,  -2620,  -2492,  -2364,  -2236,  -2108,  -1980,
+       -1884,  -1820,  -1756,  -1692,  -1628,  -1564,  -1500,  -1436,
+       -1372,  -1308,  -1244,  -1180,  -1116,  -1052,  -988,   -924,
+       -876,   -844,   -812,   -780,   -748,   -716,   -684,   -652,
+       -620,   -588,   -556,   -524,   -492,   -460,   -428,   -396,
+       -372,   -356,   -340,   -324,   -308,   -292,   -276,   -260,
+       -244,   -228,   -212,   -196,   -180,   -164,   -148,   -132,
+       -120,   -112,   -104,   -96,    -88,    -80,    -72,    -64,
+       -56,    -48,    -40,    -32,    -24,    -16,    -8,     0,
+       32124,  31100,  30076,  29052,  28028,  27004,  25980,  24956,
+       23932,  22908,  21884,  20860,  19836,  18812,  17788,  16764,
+       15996,  15484,  14972,  14460,  13948,  13436,  12924,  12412,
+       11900,  11388,  10876,  10364,  9852,   9340,   8828,   8316,
+       7932,   7676,   7420,   7164,   6908,   6652,   6396,   6140,
+       5884,   5628,   5372,   5116,   4860,   4604,   4348,   4092,
+       3900,   3772,   3644,   3516,   3388,   3260,   3132,   3004,
+       2876,   2748,   2620,   2492,   2364,   2236,   2108,   1980,
+       1884,   1820,   1756,   1692,   1628,   1564,   1500,   1436,
+       1372,   1308,   1244,   1180,   1116,   1052,   988,    924,
+       876,    844,    812,    780,    748,    716,    684,    652,
+       620,    588,    556,    524,    492,    460,    428,    396,
+       372,    356,    340,    324,    308,    292,    276,    260,
+       244,    228,    212,    196,    180,    164,    148,    132,
+       120,    112,    104,    96,     88,     80,     72,     64,
+       56,     48,     40,     32,     24,     16,     8,      0,
+};
+
+/* 16 bit A-law */
+
+short dmasound_alaw2dma16[] = {
+       -5504,  -5248,  -6016,  -5760,  -4480,  -4224,  -4992,  -4736,
+       -7552,  -7296,  -8064,  -7808,  -6528,  -6272,  -7040,  -6784,
+       -2752,  -2624,  -3008,  -2880,  -2240,  -2112,  -2496,  -2368,
+       -3776,  -3648,  -4032,  -3904,  -3264,  -3136,  -3520,  -3392,
+       -22016, -20992, -24064, -23040, -17920, -16896, -19968, -18944,
+       -30208, -29184, -32256, -31232, -26112, -25088, -28160, -27136,
+       -11008, -10496, -12032, -11520, -8960,  -8448,  -9984,  -9472,
+       -15104, -14592, -16128, -15616, -13056, -12544, -14080, -13568,
+       -344,   -328,   -376,   -360,   -280,   -264,   -312,   -296,
+       -472,   -456,   -504,   -488,   -408,   -392,   -440,   -424,
+       -88,    -72,    -120,   -104,   -24,    -8,     -56,    -40,
+       -216,   -200,   -248,   -232,   -152,   -136,   -184,   -168,
+       -1376,  -1312,  -1504,  -1440,  -1120,  -1056,  -1248,  -1184,
+       -1888,  -1824,  -2016,  -1952,  -1632,  -1568,  -1760,  -1696,
+       -688,   -656,   -752,   -720,   -560,   -528,   -624,   -592,
+       -944,   -912,   -1008,  -976,   -816,   -784,   -880,   -848,
+       5504,   5248,   6016,   5760,   4480,   4224,   4992,   4736,
+       7552,   7296,   8064,   7808,   6528,   6272,   7040,   6784,
+       2752,   2624,   3008,   2880,   2240,   2112,   2496,   2368,
+       3776,   3648,   4032,   3904,   3264,   3136,   3520,   3392,
+       22016,  20992,  24064,  23040,  17920,  16896,  19968,  18944,
+       30208,  29184,  32256,  31232,  26112,  25088,  28160,  27136,
+       11008,  10496,  12032,  11520,  8960,   8448,   9984,   9472,
+       15104,  14592,  16128,  15616,  13056,  12544,  14080,  13568,
+       344,    328,    376,    360,    280,    264,    312,    296,
+       472,    456,    504,    488,    408,    392,    440,    424,
+       88,     72,     120,    104,    24,     8,      56,     40,
+       216,    200,    248,    232,    152,    136,    184,    168,
+       1376,   1312,   1504,   1440,   1120,   1056,   1248,   1184,
+       1888,   1824,   2016,   1952,   1632,   1568,   1760,   1696,
+       688,    656,    752,    720,    560,    528,    624,    592,
+       944,    912,    1008,   976,    816,    784,    880,    848,
+};
+#endif /* HAS_16BIT_TABLES */
+
+
+#ifdef HAS_14BIT_TABLES
+
+    /*
+     *  Unused for now. Where are the MSB parts anyway??
+     */
+
+/* 14 bit mu-law (LSB) */
+
+char dmasound_ulaw2dma14l[] = {
+       33,     33,     33,     33,     33,     33,     33,     33,
+       33,     33,     33,     33,     33,     33,     33,     33,
+       33,     33,     33,     33,     33,     33,     33,     33,
+       33,     33,     33,     33,     33,     33,     33,     33,
+       1,      1,      1,      1,      1,      1,      1,      1,
+       1,      1,      1,      1,      1,      1,      1,      1,
+       49,     17,     49,     17,     49,     17,     49,     17,
+       49,     17,     49,     17,     49,     17,     49,     17,
+       41,     57,     9,      25,     41,     57,     9,      25,
+       41,     57,     9,      25,     41,     57,     9,      25,
+       37,     45,     53,     61,     5,      13,     21,     29,
+       37,     45,     53,     61,     5,      13,     21,     29,
+       35,     39,     43,     47,     51,     55,     59,     63,
+       3,      7,      11,     15,     19,     23,     27,     31,
+       34,     36,     38,     40,     42,     44,     46,     48,
+       50,     52,     54,     56,     58,     60,     62,     0,
+       31,     31,     31,     31,     31,     31,     31,     31,
+       31,     31,     31,     31,     31,     31,     31,     31,
+       31,     31,     31,     31,     31,     31,     31,     31,
+       31,     31,     31,     31,     31,     31,     31,     31,
+       63,     63,     63,     63,     63,     63,     63,     63,
+       63,     63,     63,     63,     63,     63,     63,     63,
+       15,     47,     15,     47,     15,     47,     15,     47,
+       15,     47,     15,     47,     15,     47,     15,     47,
+       23,     7,      55,     39,     23,     7,      55,     39,
+       23,     7,      55,     39,     23,     7,      55,     39,
+       27,     19,     11,     3,      59,     51,     43,     35,
+       27,     19,     11,     3,      59,     51,     43,     35,
+       29,     25,     21,     17,     13,     9,      5,      1,
+       61,     57,     53,     49,     45,     41,     37,     33,
+       30,     28,     26,     24,     22,     20,     18,     16,
+       14,     12,     10,     8,      6,      4,      2,      0
+};
+
+/* 14 bit A-law (LSB) */
+
+char dmasound_alaw2dma14l[] = {
+       32,     32,     32,     32,     32,     32,     32,     32,
+       32,     32,     32,     32,     32,     32,     32,     32,
+       16,     48,     16,     48,     16,     48,     16,     48,
+       16,     48,     16,     48,     16,     48,     16,     48,
+       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,
+       42,     46,     34,     38,     58,     62,     50,     54,
+       10,     14,     2,      6,      26,     30,     18,     22,
+       42,     46,     34,     38,     58,     62,     50,     54,
+       10,     14,     2,      6,      26,     30,     18,     22,
+       40,     56,     8,      24,     40,     56,     8,      24,
+       40,     56,     8,      24,     40,     56,     8,      24,
+       20,     28,     4,      12,     52,     60,     36,     44,
+       20,     28,     4,      12,     52,     60,     36,     44,
+       32,     32,     32,     32,     32,     32,     32,     32,
+       32,     32,     32,     32,     32,     32,     32,     32,
+       48,     16,     48,     16,     48,     16,     48,     16,
+       48,     16,     48,     16,     48,     16,     48,     16,
+       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,
+       22,     18,     30,     26,     6,      2,      14,     10,
+       54,     50,     62,     58,     38,     34,     46,     42,
+       22,     18,     30,     26,     6,      2,      14,     10,
+       54,     50,     62,     58,     38,     34,     46,     42,
+       24,     8,      56,     40,     24,     8,      56,     40,
+       24,     8,      56,     40,     24,     8,      56,     40,
+       44,     36,     60,     52,     12,     4,      28,     20,
+       44,     36,     60,     52,     12,     4,      28,     20
+};
+#endif /* HAS_14BIT_TABLES */
+
+
+    /*
+     *  Common stuff
+     */
+
+static long long sound_lseek(struct file *file, long long offset, int orig)
+{
+       return -ESPIPE;
+}
+
+
+    /*
+     *  Mid level stuff
+     */
+
+struct sound_settings dmasound;
+
+static inline void sound_silence(void)
+{
+       /* update hardware settings one more */
+       dmasound.mach.init();
+
+       dmasound.mach.silence();
+}
+
+static inline void sound_init(void)
+{
+       dmasound.mach.init();
+}
+
+static inline int sound_set_format(int format)
+{
+       return dmasound.mach.setFormat(format);
+}
+
+static int sound_set_speed(int speed)
+{
+       if (speed < 0)
+               return dmasound.soft.speed;
+
+       dmasound.soft.speed = speed;
+       dmasound.mach.init();
+       if (dmasound.minDev == SND_DEV_DSP)
+               dmasound.dsp.speed = dmasound.soft.speed;
+
+       return dmasound.soft.speed;
+}
+
+static int sound_set_stereo(int stereo)
+{
+       if (stereo < 0)
+               return dmasound.soft.stereo;
+
+       stereo = !!stereo;    /* should be 0 or 1 now */
+
+       dmasound.soft.stereo = stereo;
+       if (dmasound.minDev == SND_DEV_DSP)
+               dmasound.dsp.stereo = stereo;
+       dmasound.mach.init();
+
+       return stereo;
+}
+
+static ssize_t sound_copy_translate(TRANS *trans, const u_char *userPtr,
+                                   size_t userCount, u_char frame[],
+                                   ssize_t *frameUsed, ssize_t frameLeft)
+{
+       ssize_t (*ct_func)(const u_char *, size_t, u_char *, ssize_t *, ssize_t);
+
+       switch (dmasound.soft.format) {
+           case AFMT_MU_LAW:
+               ct_func = trans->ct_ulaw;
+               break;
+           case AFMT_A_LAW:
+               ct_func = trans->ct_alaw;
+               break;
+           case AFMT_S8:
+               ct_func = trans->ct_s8;
+               break;
+           case AFMT_U8:
+               ct_func = trans->ct_u8;
+               break;
+           case AFMT_S16_BE:
+               ct_func = trans->ct_s16be;
+               break;
+           case AFMT_U16_BE:
+               ct_func = trans->ct_u16be;
+               break;
+           case AFMT_S16_LE:
+               ct_func = trans->ct_s16le;
+               break;
+           case AFMT_U16_LE:
+               ct_func = trans->ct_u16le;
+               break;
+           default:
+               return 0;
+       }
+       return ct_func(userPtr, userCount, frame, frameUsed, frameLeft);
+}
+
+
+    /*
+     *  /dev/mixer abstraction
+     */
+
+static struct {
+    int busy;
+    int modify_counter;
+} mixer;
+
+static int mixer_open(struct inode *inode, struct file *file)
+{
+       MOD_INC_USE_COUNT;
+       dmasound.mach.open();
+       mixer.busy = 1;
+       return 0;
+}
+
+static int mixer_release(struct inode *inode, struct file *file)
+{
+       mixer.busy = 0;
+       dmasound.mach.release();
+       MOD_DEC_USE_COUNT;
+       return 0;
+}
+static int mixer_ioctl(struct inode *inode, struct file *file, u_int cmd,
+                      u_long arg)
+{
+       if (_SIOC_DIR(cmd) & _SIOC_WRITE)
+           mixer.modify_counter++;
+       switch (cmd) {
+           case OSS_GETVERSION:
+               return IOCTL_OUT(arg, SOUND_VERSION);
+           case SOUND_MIXER_INFO:
+               {
+                   mixer_info info;
+                   strncpy(info.id, dmasound.mach.name2, sizeof(info.id));
+                   strncpy(info.name, dmasound.mach.name2, sizeof(info.name));
+                   info.name[sizeof(info.name)-1] = 0;
+                   info.modify_counter = mixer.modify_counter;
+                   copy_to_user_ret((int *)arg, &info, sizeof(info), -EFAULT);
+                   return 0;
+               }
+       }
+       if (dmasound.mach.mixer_ioctl)
+           return dmasound.mach.mixer_ioctl(cmd, arg);
+       return -EINVAL;
+}
+
+static struct file_operations mixer_fops =
+{
+       llseek:         sound_lseek,
+       ioctl:          mixer_ioctl,
+       open:           mixer_open,
+       release:        mixer_release,
+};
+
+static void __init mixer_init(void)
+{
+#ifndef MODULE
+       int mixer_unit;
+#endif
+       mixer_unit = register_sound_mixer(&mixer_fops, -1);
+       if (mixer_unit < 0)
+               return;
+
+       mixer.busy = 0;
+       dmasound.treble = 0;
+       dmasound.bass = 0;
+       if (dmasound.mach.mixer_init)
+           dmasound.mach.mixer_init();
+}
+
+
+    /*
+     *  Sound queue stuff, the heart of the driver
+     */
+
+struct sound_queue dmasound_write_sq;
+#ifdef HAS_RECORD
+struct sound_queue dmasound_read_sq;
+#endif
+
+static int sq_allocate_buffers(struct sound_queue *sq, int num, int size)
+{
+       int i;
+
+       if (sq->buffers)
+               return 0;
+       sq->numBufs = num;
+       sq->bufSize = size;
+       sq->buffers = kmalloc (num * sizeof(char *), GFP_KERNEL);
+       if (!sq->buffers)
+               return -ENOMEM;
+       for (i = 0; i < num; i++) {
+               sq->buffers[i] = dmasound.mach.dma_alloc(size, GFP_KERNEL);
+               if (!sq->buffers[i]) {
+                       while (i--)
+                               dmasound.mach.dma_free(sq->buffers[i], size);
+                       kfree(sq->buffers);
+                       sq->buffers = 0;
+                       return -ENOMEM;
+               }
+       }
+       return 0;
+}
+
+static void sq_release_buffers(struct sound_queue *sq)
+{
+       int i;
+
+       if (sq->buffers) {
+               if (sq != &write_sq && dmasound.mach.abort_read)
+                       dmasound.mach.abort_read();
+               for (i = 0; i < sq->numBufs; i++)
+                       dmasound.mach.dma_free(sq->buffers[i], sq->bufSize);
+               kfree(sq->buffers);
+               sq->buffers = NULL;
+       }
+}
+
+static void sq_setup(struct sound_queue *sq, int max_count, int max_active,
+                    int block_size)
+{
+       void (*setup_func)(void);
+
+       sq->max_count = max_count;
+       sq->max_active = max_active;
+       sq->block_size = block_size;
+
+       sq->front = sq->count = sq->rear_size = 0;
+       sq->syncing = 0;
+       sq->active = 0;
+
+       if (sq == &write_sq) {
+           sq->rear = -1;
+           setup_func = dmasound.mach.write_sq_setup;
+       } else {
+           sq->rear = 0;
+           setup_func = dmasound.mach.read_sq_setup;
+       }
+       if (setup_func)
+           setup_func();
+}
+
+static inline void sq_play(void)
+{
+       dmasound.mach.play();
+}
+
+static ssize_t sq_write(struct file *file, const char *src, size_t uLeft,
+                       loff_t *ppos)
+{
+       ssize_t uWritten = 0;
+       u_char *dest;
+       ssize_t uUsed, bUsed, bLeft;
+
+       /* ++TeSche: Is something like this necessary?
+        * Hey, that's an honest question! Or does any other part of the
+        * filesystem already checks this situation? I really don't know.
+        */
+       if (uLeft == 0)
+               return 0;
+
+       /* The interrupt doesn't start to play the last, incomplete frame.
+        * Thus we can append to it without disabling the interrupts! (Note
+        * also that write_sq.rear isn't affected by the interrupt.)
+        */
+
+       if (write_sq.count > 0 &&
+           (bLeft = write_sq.block_size-write_sq.rear_size) > 0) {
+               dest = write_sq.buffers[write_sq.rear];
+               bUsed = write_sq.rear_size;
+               uUsed = sound_copy_translate(dmasound.trans_write, src, uLeft,
+                                            dest, &bUsed, bLeft);
+               if (uUsed <= 0)
+                       return uUsed;
+               src += uUsed;
+               uWritten += uUsed;
+               uLeft -= uUsed;
+               write_sq.rear_size = bUsed;
+       }
+
+       do {
+               while (write_sq.count == write_sq.max_active) {
+                       sq_play();
+                       if (write_sq.open_mode & O_NONBLOCK)
+                               return uWritten > 0 ? uWritten : -EAGAIN;
+                       SLEEP(write_sq.action_queue);
+                       if (signal_pending(current))
+                               return uWritten > 0 ? uWritten : -EINTR;
+               }
+
+               /* Here, we can avoid disabling the interrupt by first
+                * copying and translating the data, and then updating
+                * the write_sq variables. Until this is done, the interrupt
+                * won't see the new frame and we can work on it
+                * undisturbed.
+                */
+
+               dest = write_sq.buffers[(write_sq.rear+1) % write_sq.max_count];
+               bUsed = 0;
+               bLeft = write_sq.block_size;
+               uUsed = sound_copy_translate(dmasound.trans_write, src, uLeft,
+                                            dest, &bUsed, bLeft);
+               if (uUsed <= 0)
+                       break;
+               src += uUsed;
+               uWritten += uUsed;
+               uLeft -= uUsed;
+               if (bUsed) {
+                       write_sq.rear = (write_sq.rear+1) % write_sq.max_count;
+                       write_sq.rear_size = bUsed;
+                       write_sq.count++;
+               }
+       } while (bUsed);   /* uUsed may have been 0 */
+
+       sq_play();
+
+       return uUsed < 0? uUsed: uWritten;
+}
+
+#ifdef HAS_RECORD
+    /*
+     *  Here is how the values are used for reading.
+     *  The value 'active' simply indicates the DMA is running.  This is done
+     *  so the driver semantics are DMA starts when the first read is posted.
+     *  The value 'front' indicates the buffer we should next send to the user.
+     *  The value 'rear' indicates the buffer the DMA is currently filling.
+     *  When 'front' == 'rear' the buffer "ring" is empty (we always have an
+     *  empty available).  The 'rear_size' is used to track partial offsets
+     *  into the current buffer.  Right now, I just keep the DMA running.  If
+     *  the reader can't keep up, the interrupt tosses the oldest buffer.  We
+     *  could also shut down the DMA in this case.
+     */
+
+static ssize_t sq_read(struct file *file, char *dst, size_t uLeft,
+                      loff_t *ppos)
+{
+
+       ssize_t uRead, bLeft, bUsed, uUsed;
+
+       if (uLeft == 0)
+               return 0;
+
+       if (!read_sq.active && dmasound.mach.record)
+               dmasound.mach.record(); /* Kick off the record process. */
+
+       uRead = 0;
+
+       /* Move what the user requests, depending upon other options.
+       */
+       while (uLeft > 0) {
+
+               /* When front == rear, the DMA is not done yet.
+               */
+               while (read_sq.front == read_sq.rear) {
+                       if (read_sq.open_mode & O_NONBLOCK) {
+                              return uRead > 0 ? uRead : -EAGAIN;
+                       }
+                       SLEEP(read_sq.action_queue);
+                       if (signal_pending(current))
+                               return uRead > 0 ? uRead : -EINTR;
+               }
+
+               /* The amount we move is either what is left in the
+                * current buffer or what the user wants.
+                */
+               bLeft = read_sq.block_size - read_sq.rear_size;
+               bUsed = read_sq.rear_size;
+               uUsed = sound_copy_translate(dmasound.trans_read, dst, uLeft,
+                                            read_sq.buffers[read_sq.front],
+                                            &bUsed, bLeft);
+               if (uUsed <= 0)
+                       return uUsed;
+               dst += uUsed;
+               uRead += uUsed;
+               uLeft -= uUsed;
+               read_sq.rear_size += bUsed;
+               if (read_sq.rear_size >= read_sq.block_size) {
+                       read_sq.rear_size = 0;
+                       read_sq.front++;
+                       if (read_sq.front >= read_sq.max_active)
+                               read_sq.front = 0;
+               }
+       }
+       return uRead;
+}
+#endif /* HAS_RECORD */
+
+static inline void sq_init_waitqueue(struct sound_queue *sq)
+{
+       init_waitqueue_head(&sq->action_queue);
+       init_waitqueue_head(&sq->open_queue);
+       init_waitqueue_head(&sq->sync_queue);
+       sq->busy = 0;
+}
+
+static inline void sq_wake_up(struct sound_queue *sq, struct file *file,
+                             mode_t mode)
+{
+       if (file->f_mode & mode) {
+               sq->busy = 0;
+               WAKE_UP(sq->open_queue);
+       }
+}
+
+static int sq_open2(struct sound_queue *sq, struct file *file, mode_t mode,
+                   int numbufs, int bufsize)
+{
+       int rc = 0;
+
+       if (file->f_mode & mode) {
+               if (sq->busy) {
+                       rc = -EBUSY;
+                       if (file->f_flags & O_NONBLOCK)
+                               return rc;
+                       rc = -EINTR;
+                       while (sq->busy) {
+                               SLEEP(sq->open_queue);
+                               if (signal_pending(current))
+                                       return rc;
+                       }
+                       rc = 0;
+               }
+               sq->busy = 1; /* Let's play spot-the-race-condition */
+
+               if (sq_allocate_buffers(sq, numbufs, bufsize)) {
+                       sq_wake_up(sq, file, mode);
+                       return rc;
+               }
+
+               sq_setup(sq, numbufs, numbufs, bufsize);
+               sq->open_mode = file->f_mode;
+       }
+       return rc;
+}
+
+#define write_sq_init_waitqueue()      sq_init_waitqueue(&write_sq)
+#define write_sq_wake_up(file)         sq_wake_up(&write_sq, file, FMODE_WRITE)
+#define write_sq_release_buffers()     sq_release_buffers(&write_sq)
+#define write_sq_open(file)    \
+       sq_open2(&write_sq, file, FMODE_WRITE, numWriteBufs, writeBufSize << 10)
+
+#ifdef HAS_RECORD
+#define read_sq_init_waitqueue()       sq_init_waitqueue(&read_sq)
+#define read_sq_wake_up(file)          sq_wake_up(&read_sq, file, FMODE_READ)
+#define read_sq_release_buffers()      sq_release_buffers(&read_sq)
+#define read_sq_open(file)     \
+       sq_open2(&read_sq, file, FMODE_READ, numReadBufs, readBufSize << 10)
+#else /* !HAS_RECORD */
+#define read_sq_init_waitqueue()       do {} while (0)
+#define read_sq_wake_up(file)          do {} while (0)
+#define read_sq_release_buffers()      do {} while (0)
+#define read_sq_open(file)             (0)
+#endif /* !HAS_RECORD */
+
+static int sq_open(struct inode *inode, struct file *file)
+{
+       int rc;
+
+       MOD_INC_USE_COUNT;
+       dmasound.mach.open();
+       if ((rc = write_sq_open(file)) || (rc = read_sq_open(file))) {
+               dmasound.mach.release();
+               MOD_DEC_USE_COUNT;
+               return rc;
+       }
+
+       if (dmasound.mach.sq_open)
+           dmasound.mach.sq_open();
+       dmasound.minDev = MINOR(inode->i_rdev) & 0x0f;
+       dmasound.soft = dmasound.dsp;
+       dmasound.hard = dmasound.dsp;
+       sound_init();
+       if ((MINOR(inode->i_rdev) & 0x0f) == SND_DEV_AUDIO) {
+               sound_set_speed(8000);
+               sound_set_stereo(0);
+               sound_set_format(AFMT_MU_LAW);
+       }
+
+#if 0
+       if (file->f_mode == FMODE_READ && dmasound.mach.record) {
+               /* Start dma'ing straight away */
+               dmasound.mach.record();
+       }
+#endif
+
+       return 0;
+}
+
+static void sq_reset(void)
+{
+       sound_silence();
+       write_sq.active = 0;
+       write_sq.count = 0;
+       write_sq.front = (write_sq.rear+1) % write_sq.max_count;
+}
+
+static int sq_fsync(struct file *filp, struct dentry *dentry)
+{
+       int rc = 0;
+
+       write_sq.syncing = 1;
+       sq_play();      /* there may be an incomplete frame waiting */
+
+       while (write_sq.active) {
+               SLEEP(write_sq.sync_queue);
+               if (signal_pending(current)) {
+                       /* While waiting for audio output to drain, an
+                        * interrupt occurred.  Stop audio output immediately
+                        * and clear the queue. */
+                       sq_reset();
+                       rc = -EINTR;
+                       break;
+               }
+       }
+
+       write_sq.syncing = 0;
+       return rc;
+}
+
+static int sq_release(struct inode *inode, struct file *file)
+{
+       int rc = 0;
+
+       if (write_sq.busy)
+               rc = sq_fsync(file, file->f_dentry);
+       dmasound.soft = dmasound.dsp;
+       dmasound.hard = dmasound.dsp;
+       sound_silence();
+
+       write_sq_release_buffers();
+       read_sq_release_buffers();
+       dmasound.mach.release();
+       MOD_DEC_USE_COUNT;
+
+       /* There is probably a DOS atack here. They change the mode flag. */
+       /* XXX add check here */
+       read_sq_wake_up(file);
+       write_sq_wake_up(file);
+
+       /* Wake up a process waiting for the queue being released.
+        * Note: There may be several processes waiting for a call
+        * to open() returning. */
+
+       return rc;
+}
+
+static int sq_ioctl(struct inode *inode, struct file *file, u_int cmd,
+                   u_long arg)
+{
+       u_long fmt;
+       int data;
+       int size, nbufs;
+       audio_buf_info info;
+
+       switch (cmd) {
+       case SNDCTL_DSP_RESET:
+               sq_reset();
+               return 0;
+       case SNDCTL_DSP_POST:
+       case SNDCTL_DSP_SYNC:
+               return sq_fsync(file, file->f_dentry);
+
+               /* ++TeSche: before changing any of these it's
+                * probably wise to wait until sound playing has
+                * settled down. */
+       case SNDCTL_DSP_SPEED:
+               sq_fsync(file, file->f_dentry);
+               IOCTL_IN(arg, data);
+               return IOCTL_OUT(arg, sound_set_speed(data));
+       case SNDCTL_DSP_STEREO:
+               sq_fsync(file, file->f_dentry);
+               IOCTL_IN(arg, data);
+               return IOCTL_OUT(arg, sound_set_stereo(data));
+       case SOUND_PCM_WRITE_CHANNELS:
+               sq_fsync(file, file->f_dentry);
+               IOCTL_IN(arg, data);
+               return IOCTL_OUT(arg, sound_set_stereo(data-1)+1);
+       case SNDCTL_DSP_SETFMT:
+               sq_fsync(file, file->f_dentry);
+               IOCTL_IN(arg, data);
+               return IOCTL_OUT(arg, sound_set_format(data));
+       case SNDCTL_DSP_GETFMTS:
+               fmt = 0;
+               if (dmasound.trans_write) {
+                       if (dmasound.trans_write->ct_ulaw)
+                               fmt |= AFMT_MU_LAW;
+                       if (dmasound.trans_write->ct_alaw)
+                               fmt |= AFMT_A_LAW;
+                       if (dmasound.trans_write->ct_s8)
+                               fmt |= AFMT_S8;
+                       if (dmasound.trans_write->ct_u8)
+                               fmt |= AFMT_U8;
+                       if (dmasound.trans_write->ct_s16be)
+                               fmt |= AFMT_S16_BE;
+                       if (dmasound.trans_write->ct_u16be)
+                               fmt |= AFMT_U16_BE;
+                       if (dmasound.trans_write->ct_s16le)
+                               fmt |= AFMT_S16_LE;
+                       if (dmasound.trans_write->ct_u16le)
+                               fmt |= AFMT_U16_LE;
+               }
+               return IOCTL_OUT(arg, fmt);
+       case SNDCTL_DSP_GETBLKSIZE:
+               size = write_sq.block_size
+                       * dmasound.soft.size * (dmasound.soft.stereo + 1)
+                       / (dmasound.hard.size * (dmasound.hard.stereo + 1));
+               return IOCTL_OUT(arg, size);
+       case SNDCTL_DSP_SUBDIVIDE:
+               break;
+       case SNDCTL_DSP_SETFRAGMENT:
+               if (write_sq.count || write_sq.active || write_sq.syncing)
+                       return -EINVAL;
+               IOCTL_IN(arg, size);
+               nbufs = size >> 16;
+               if (nbufs < 2 || nbufs > write_sq.numBufs)
+                       nbufs = write_sq.numBufs;
+               size &= 0xffff;
+               if (size >= 8 && size <= 29) {
+                       size = 1 << size;
+                       size *= dmasound.hard.size * (dmasound.hard.stereo + 1);
+                       size /= dmasound.soft.size * (dmasound.soft.stereo + 1);
+                       if (size > write_sq.bufSize)
+                               size = write_sq.bufSize;
+               } else
+                       size = write_sq.bufSize;
+               sq_setup(&write_sq, write_sq.numBufs, nbufs, size);
+               return 0;
+       case SNDCTL_DSP_GETOSPACE:
+               info.fragments = write_sq.max_active - write_sq.count;
+               info.fragstotal = write_sq.max_active;
+               info.fragsize = write_sq.block_size;
+               info.bytes = info.fragments * info.fragsize;
+               if (copy_to_user((void *)arg, &info, sizeof(info)))
+                       return -EFAULT;
+               return 0;
+
+       default:
+               return mixer_ioctl(inode, file, cmd, arg);
+       }
+       return -EINVAL;
+}
+
+static struct file_operations sq_fops =
+{
+       llseek:         sound_lseek,
+       write:          sq_write,
+       ioctl:          sq_ioctl,
+       open:           sq_open,
+       release:        sq_release,
+#ifdef HAS_RECORD
+       read:           sq_read,
+#endif
+};
+
+static void __init sq_init(void)
+{
+#ifndef MODULE
+       int sq_unit;
+#endif
+       sq_unit = register_sound_dsp(&sq_fops, -1);
+       if (sq_unit < 0)
+               return;
+
+       write_sq_init_waitqueue();
+       read_sq_init_waitqueue();
+
+       /* whatever you like as startup mode for /dev/dsp,
+        * (/dev/audio hasn't got a startup mode). note that
+        * once changed a new open() will *not* restore these!
+        */
+       dmasound.dsp.format = AFMT_U8;
+       dmasound.dsp.stereo = 0;
+       dmasound.dsp.size = 8;
+
+       /* set minimum rate possible without expanding */
+       dmasound.dsp.speed = dmasound.mach.min_dsp_speed;
+
+       /* before the first open to /dev/dsp this wouldn't be set */
+       dmasound.soft = dmasound.dsp;
+       dmasound.hard = dmasound.dsp;
+
+       sound_silence();
+}
+
+
+    /*
+     *  /dev/sndstat
+     */
+
+static struct {
+    int busy;
+    char buf[512];     /* state.buf should not overflow! */
+    int len, ptr;
+} state;
+
+static int state_open(struct inode *inode, struct file *file)
+{
+       char *buffer = state.buf;
+       int len = 0;
+
+       if (state.busy)
+               return -EBUSY;
+
+       MOD_INC_USE_COUNT;
+       dmasound.mach.open();
+       state.ptr = 0;
+       state.busy = 1;
+
+       len += sprintf(buffer+len, "%sDMA sound driver:\n", dmasound.mach.name);
+
+       len += sprintf(buffer+len, "\tsound.format = 0x%x",
+                      dmasound.soft.format);
+       switch (dmasound.soft.format) {
+           case AFMT_MU_LAW:
+               len += sprintf(buffer+len, " (mu-law)");
+               break;
+           case AFMT_A_LAW:
+               len += sprintf(buffer+len, " (A-law)");
+               break;
+           case AFMT_U8:
+               len += sprintf(buffer+len, " (unsigned 8 bit)");
+               break;
+           case AFMT_S8:
+               len += sprintf(buffer+len, " (signed 8 bit)");
+               break;
+           case AFMT_S16_BE:
+               len += sprintf(buffer+len, " (signed 16 bit big)");
+               break;
+           case AFMT_U16_BE:
+               len += sprintf(buffer+len, " (unsigned 16 bit big)");
+               break;
+           case AFMT_S16_LE:
+               len += sprintf(buffer+len, " (signed 16 bit little)");
+               break;
+           case AFMT_U16_LE:
+               len += sprintf(buffer+len, " (unsigned 16 bit little)");
+               break;
+       }
+       len += sprintf(buffer+len, "\n");
+       len += sprintf(buffer+len, "\tsound.speed = %dHz (phys. %dHz)\n",
+                      dmasound.soft.speed, dmasound.hard.speed);
+       len += sprintf(buffer+len, "\tsound.stereo = 0x%x (%s)\n",
+                      dmasound.soft.stereo,
+                      dmasound.soft.stereo ? "stereo" : "mono");
+       if (dmasound.mach.state_info)
+           len += dmasound.mach.state_info(buffer);
+       len += sprintf(buffer+len, "\tsq.block_size = %d sq.max_count = %d"
+                      " sq.max_active = %d\n",
+                      write_sq.block_size, write_sq.max_count,
+                      write_sq.max_active);
+       len += sprintf(buffer+len, "\tsq.count = %d sq.rear_size = %d\n",
+                      write_sq.count, write_sq.rear_size);
+       len += sprintf(buffer+len, "\tsq.active = %d sq.syncing = %d\n",
+                      write_sq.active, write_sq.syncing);
+       state.len = len;
+       return 0;
+}
+
+static int state_release(struct inode *inode, struct file *file)
+{
+       state.busy = 0;
+       dmasound.mach.release();
+       MOD_DEC_USE_COUNT;
+       return 0;
+}
+
+static ssize_t state_read(struct file *file, char *buf, size_t count,
+                         loff_t *ppos)
+{
+       int n = state.len - state.ptr;
+       if (n > count)
+               n = count;
+       if (n <= 0)
+               return 0;
+       if (copy_to_user(buf, &state.buf[state.ptr], n))
+               return -EFAULT;
+       state.ptr += n;
+       return n;
+}
+
+static struct file_operations state_fops =
+{
+       llseek:         sound_lseek,
+       read:           state_read,
+       open:           state_open,
+       release:        state_release,
+};
+
+static void __init state_init(void)
+{
+#ifndef MODULE
+       int state_unit;
+#endif
+       state_unit = register_sound_special(&state_fops, SND_DEV_STATUS);
+       if (state_unit < 0)
+               return;
+       state.busy = 0;
+}
+
+
+    /*
+     *  Config & Setup
+     *
+     *  This function is called by _one_ chipset-specific driver
+     */
+
+int __init dmasound_init(void)
+{
+       if (irq_installed)
+               return -EBUSY;
+
+       /* Set up sound queue, /dev/audio and /dev/dsp. */
+
+       /* Set default settings. */
+       sq_init();
+
+       /* Set up /dev/sndstat. */
+       state_init();
+
+       /* Set up /dev/mixer. */
+       mixer_init();
+
+       if (!dmasound.mach.irqinit()) {
+               printk(KERN_ERR "DMA sound driver: Interrupt initialization failed\n");
+               return -ENODEV;
+       }
+#ifdef MODULE
+       irq_installed = 1;
+#endif
+
+       printk(KERN_INFO "DMA sound driver installed, using %d buffers of %dk.\n",
+              numWriteBufs, writeBufSize);
+
+       return 0;
+}
+
+#ifdef MODULE
+
+void dmasound_deinit(void)
+{
+       if (irq_installed) {
+               sound_silence();
+               dmasound.mach.irqcleanup();
+       }
+
+       write_sq_release_buffers();
+       read_sq_release_buffers();
+
+       if (mixer_unit >= 0)
+               unregister_sound_mixer(mixer_unit);
+       if (state_unit >= 0)
+               unregister_sound_special(state_unit);
+       if (sq_unit >= 0)
+               unregister_sound_dsp(sq_unit);
+}
+
+#else /* !MODULE */
+
+static int __init dmasound_setup(char *str)
+{
+       int ints[6];
+
+       str = get_options(str, ARRAY_SIZE(ints), ints);
+
+       /* check the bootstrap parameter for "dmasound=" */
+
+       switch (ints[0]) {
+       case 3:
+               if ((ints[3] < 0) || (ints[3] > MAX_CATCH_RADIUS))
+                       printk("dmasound_setup: illegal catch radius, using default = %d\n", catchRadius);
+               else
+                       catchRadius = ints[3];
+               /* fall through */
+       case 2:
+               if (ints[1] < MIN_BUFFERS)
+                       printk("dmasound_setup: illegal number of buffers, using default = %d\n", numWriteBufs);
+               else
+                       numWriteBufs = ints[1];
+               if (ints[2] < MIN_BUFSIZE || ints[2] > MAX_BUFSIZE)
+                       printk("dmasound_setup: illegal buffer size, using default = %dK\n", writeBufSize);
+               else
+                       writeBufSize = ints[2];
+               break;
+       case 0:
+               break;
+       default:
+               printk("dmasound_setup: illegal number of arguments\n");
+               return 0;
+       }
+       return 1;
+}
+
+__setup("dmasound=", dmasound_setup);
+
+#endif /* !MODULE */
+
+
+    /*
+     *  Visible symbols for modules
+     */
+
+EXPORT_SYMBOL(dmasound);
+EXPORT_SYMBOL(dmasound_init);
+#ifdef MODULE
+EXPORT_SYMBOL(dmasound_deinit);
+#endif
+EXPORT_SYMBOL(dmasound_write_sq);
+#ifdef HAS_RECORD
+EXPORT_SYMBOL(dmasound_read_sq);
+#endif
+EXPORT_SYMBOL(dmasound_catchRadius);
+#ifdef HAS_8BIT_TABLES
+EXPORT_SYMBOL(dmasound_ulaw2dma8);
+EXPORT_SYMBOL(dmasound_alaw2dma8);
+#endif
+#ifdef HAS_16BIT_TABLES
+EXPORT_SYMBOL(dmasound_ulaw2dma16);
+EXPORT_SYMBOL(dmasound_alaw2dma16);
+#endif
+#ifdef HAS_14BIT_TABLES
+EXPORT_SYMBOL(dmasound_ulaw2dma14l);
+EXPORT_SYMBOL(dmasound_ulaw2dma14h);
+EXPORT_SYMBOL(dmasound_alaw2dma14l);
+EXPORT_SYMBOL(dmasound_alaw2dma14h);
+#endif
+
diff --git a/drivers/sound/dmasound/dmasound_paula.c b/drivers/sound/dmasound/dmasound_paula.c
new file mode 100644 (file)
index 0000000..97e9e6c
--- /dev/null
@@ -0,0 +1,690 @@
+
+/*
+ *  linux/drivers/sound/dmasound_paula.c
+ *
+ *  Amiga DMA Sound Driver
+ *
+ *  See linux/drivers/sound/dmasound_core.c for copyright and credits
+ */
+
+
+#include <linux/module.h>
+#include <linux/mm.h>
+#include <linux/init.h>
+#include <linux/ioport.h>
+#include <linux/soundcard.h>
+
+#include <asm/uaccess.h>
+#include <asm/setup.h>
+#include <asm/amigahw.h>
+#include <asm/amigaints.h>
+
+#include "dmasound.h"
+
+
+   /*
+    *  The minimum period for audio depends on htotal (for OCS/ECS/AGA)
+    *  (Imported from arch/m68k/amiga/amisound.c)
+    *
+    *  FIXME: if amifb is not used, there should be a method to change htotal
+    */
+
+extern volatile u_short amiga_audio_min_period;
+
+
+   /*
+    *  amiga_mksound() should be able to restore the period after beeping
+    *  (Imported from arch/m68k/amiga/amisound.c)
+    */
+
+extern u_short amiga_audio_period;
+
+
+   /*
+    *  Audio DMA masks
+    */
+
+#define AMI_AUDIO_OFF  (DMAF_AUD0 | DMAF_AUD1 | DMAF_AUD2 | DMAF_AUD3)
+#define AMI_AUDIO_8    (DMAF_SETCLR | DMAF_MASTER | DMAF_AUD0 | DMAF_AUD1)
+#define AMI_AUDIO_14   (AMI_AUDIO_8 | DMAF_AUD2 | DMAF_AUD3)
+
+
+    /*
+     *  Helper pointers for 16(14)-bit sound
+     */
+
+static int write_sq_block_size_half, write_sq_block_size_quarter;
+
+
+/*** Low level stuff *********************************************************/
+
+
+static void AmiOpen(void);
+static void AmiRelease(void);
+static void *AmiAlloc(unsigned int size, int flags);
+static void AmiFree(void *obj, unsigned int size);
+static int AmiIrqInit(void);
+#ifdef MODULE
+static void AmiIrqCleanUp(void);
+#endif
+static void AmiSilence(void);
+static void AmiInit(void);
+static int AmiSetFormat(int format);
+static int AmiSetVolume(int volume);
+static int AmiSetTreble(int treble);
+static void AmiPlayNextFrame(int index);
+static void AmiPlay(void);
+static void AmiInterrupt(int irq, void *dummy, struct pt_regs *fp);
+
+
+/*** Mid level stuff *********************************************************/
+
+static void AmiMixerInit(void);
+static int AmiMixerIoctl(u_int cmd, u_long arg);
+static void AmiWriteSqSetup(void);
+static int AmiStateInfo(char *buffer);
+
+
+/*** Translations ************************************************************/
+
+/* ++TeSche: radically changed for new expanding purposes...
+ *
+ * These two routines now deal with copying/expanding/translating the samples
+ * from user space into our buffer at the right frequency. They take care about
+ * how much data there's actually to read, how much buffer space there is and
+ * to convert samples into the right frequency/encoding. They will only work on
+ * complete samples so it may happen they leave some bytes in the input stream
+ * if the user didn't write a multiple of the current sample size. They both
+ * return the number of bytes they've used from both streams so you may detect
+ * such a situation. Luckily all programs should be able to cope with that.
+ *
+ * I think I've optimized anything as far as one can do in plain C, all
+ * variables should fit in registers and the loops are really short. There's
+ * one loop for every possible situation. Writing a more generalized and thus
+ * parameterized loop would only produce slower code. Feel free to optimize
+ * this in assembler if you like. :)
+ *
+ * I think these routines belong here because they're not yet really hardware
+ * independent, especially the fact that the Falcon can play 16bit samples
+ * only in stereo is hardcoded in both of them!
+ *
+ * ++geert: split in even more functions (one per format)
+ */
+
+
+    /*
+     *  Native format
+     */
+
+static ssize_t ami_ct_s8(const u_char *userPtr, size_t userCount,
+                        u_char frame[], ssize_t *frameUsed, ssize_t frameLeft)
+{
+       ssize_t count, used;
+
+       if (!dmasound.soft.stereo) {
+               void *p = &frame[*frameUsed];
+               count = min(userCount, frameLeft) & ~1;
+               used = count;
+               if (copy_from_user(p, userPtr, count))
+                       return -EFAULT;
+       } else {
+               u_char *left = &frame[*frameUsed>>1];
+               u_char *right = left+write_sq_block_size_half;
+               count = min(userCount, frameLeft)>>1 & ~1;
+               used = count*2;
+               while (count > 0) {
+                       if (get_user(*left++, userPtr++)
+                           || get_user(*right++, userPtr++))
+                               return -EFAULT;
+                       count--;
+               }
+       }
+       *frameUsed += used;
+       return used;
+}
+
+
+    /*
+     *  Copy and convert 8 bit data
+     */
+
+#define GENERATE_AMI_CT8(funcname, convsample)                         \
+static ssize_t funcname(const u_char *userPtr, size_t userCount,       \
+                       u_char frame[], ssize_t *frameUsed,             \
+                       ssize_t frameLeft)                              \
+{                                                                      \
+       ssize_t count, used;                                            \
+                                                                       \
+       if (!dmasound.soft.stereo) {                                    \
+               u_char *p = &frame[*frameUsed];                         \
+               count = min(userCount, frameLeft) & ~1;                 \
+               used = count;                                           \
+               while (count > 0) {                                     \
+                       u_char data;                                    \
+                       if (get_user(data, userPtr++))                  \
+                               return -EFAULT;                         \
+                       *p++ = convsample(data);                        \
+                       count--;                                        \
+               }                                                       \
+       } else {                                                        \
+               u_char *left = &frame[*frameUsed>>1];                   \
+               u_char *right = left+write_sq_block_size_half;          \
+               count = min(userCount, frameLeft)>>1 & ~1;              \
+               used = count*2;                                         \
+               while (count > 0) {                                     \
+                       u_char data;                                    \
+                       if (get_user(data, userPtr++))                  \
+                               return -EFAULT;                         \
+                       *left++ = convsample(data);                     \
+                       if (get_user(data, userPtr++))                  \
+                               return -EFAULT;                         \
+                       *right++ = convsample(data);                    \
+                       count--;                                        \
+               }                                                       \
+       }                                                               \
+       *frameUsed += used;                                             \
+       return used;                                                    \
+}
+
+#define AMI_CT_ULAW(x) (dmasound_ulaw2dma8[(x)])
+#define AMI_CT_ALAW(x) (dmasound_alaw2dma8[(x)])
+#define AMI_CT_U8(x)   ((x) ^ 0x80)
+
+GENERATE_AMI_CT8(ami_ct_ulaw, AMI_CT_ULAW)
+GENERATE_AMI_CT8(ami_ct_alaw, AMI_CT_ALAW)
+GENERATE_AMI_CT8(ami_ct_u8, AMI_CT_U8)
+
+
+    /*
+     *  Copy and convert 16 bit data
+     */
+
+#define GENERATE_AMI_CT_16(funcname, convsample)                       \
+static ssize_t funcname(const u_char *userPtr, size_t userCount,       \
+                       u_char frame[], ssize_t *frameUsed,             \
+                       ssize_t frameLeft)                              \
+{                                                                      \
+       ssize_t count, used;                                            \
+       u_short data;                                                   \
+                                                                       \
+       if (!dmasound.soft.stereo) {                                    \
+               u_char *high = &frame[*frameUsed>>1];                   \
+               u_char *low = high+write_sq_block_size_half;            \
+               count = min(userCount, frameLeft)>>1 & ~1;              \
+               used = count*2;                                         \
+               while (count > 0) {                                     \
+                       if (get_user(data, ((u_short *)userPtr)++))     \
+                               return -EFAULT;                         \
+                       data = convsample(data);                        \
+                       *high++ = data>>8;                              \
+                       *low++ = (data>>2) & 0x3f;                      \
+                       count--;                                        \
+               }                                                       \
+       } else {                                                        \
+               u_char *lefth = &frame[*frameUsed>>2];                  \
+               u_char *leftl = lefth+write_sq_block_size_quarter;      \
+               u_char *righth = lefth+write_sq_block_size_half;        \
+               u_char *rightl = righth+write_sq_block_size_quarter;    \
+               count = min(userCount, frameLeft)>>2 & ~1;              \
+               used = count*4;                                         \
+               while (count > 0) {                                     \
+                       if (get_user(data, ((u_short *)userPtr)++))     \
+                               return -EFAULT;                         \
+                       data = convsample(data);                        \
+                       *lefth++ = data>>8;                             \
+                       *leftl++ = (data>>2) & 0x3f;                    \
+                       if (get_user(data, ((u_short *)userPtr)++))     \
+                               return -EFAULT;                         \
+                       data = convsample(data);                        \
+                       *righth++ = data>>8;                            \
+                       *rightl++ = (data>>2) & 0x3f;                   \
+                       count--;                                        \
+               }                                                       \
+       }                                                               \
+       *frameUsed += used;                                             \
+       return used;                                                    \
+}
+
+#define AMI_CT_S16BE(x)        (x)
+#define AMI_CT_U16BE(x)        ((x) ^ 0x8000)
+#define AMI_CT_S16LE(x)        (le2be16((x)))
+#define AMI_CT_U16LE(x)        (le2be16((x)) ^ 0x8000)
+
+GENERATE_AMI_CT_16(ami_ct_s16be, AMI_CT_S16BE)
+GENERATE_AMI_CT_16(ami_ct_u16be, AMI_CT_U16BE)
+GENERATE_AMI_CT_16(ami_ct_s16le, AMI_CT_S16LE)
+GENERATE_AMI_CT_16(ami_ct_u16le, AMI_CT_U16LE)
+
+
+static TRANS transAmiga = {
+       ct_ulaw:        ami_ct_ulaw,
+       ct_alaw:        ami_ct_alaw,
+       ct_s8:          ami_ct_s8,
+       ct_u8:          ami_ct_u8,
+       ct_s16be:       ami_ct_s16be,
+       ct_u16be:       ami_ct_u16be,
+       ct_s16le:       ami_ct_s16le,
+       ct_u16le:       ami_ct_u16le,
+};
+
+/*** Low level stuff *********************************************************/
+
+
+static void AmiOpen(void)
+{
+       MOD_INC_USE_COUNT;
+}
+
+static void AmiRelease(void)
+{
+       MOD_DEC_USE_COUNT;
+}
+
+static inline void StopDMA(void)
+{
+       custom.aud[0].audvol = custom.aud[1].audvol = 0;
+       custom.aud[2].audvol = custom.aud[3].audvol = 0;
+       custom.dmacon = AMI_AUDIO_OFF;
+}
+
+static void *AmiAlloc(unsigned int size, int flags)
+{
+       return amiga_chip_alloc((long)size, "dmasound [Paula]");
+}
+
+static void AmiFree(void *obj, unsigned int size)
+{
+       amiga_chip_free (obj);
+}
+
+static int __init AmiIrqInit(void)
+{
+       /* turn off DMA for audio channels */
+       StopDMA();
+
+       /* Register interrupt handler. */
+       if (request_irq(IRQ_AMIGA_AUD0, AmiInterrupt, 0, "DMA sound",
+                       AmiInterrupt))
+               return 0;
+       return 1;
+}
+
+#ifdef MODULE
+static void AmiIrqCleanUp(void)
+{
+       /* turn off DMA for audio channels */
+       StopDMA();
+       /* release the interrupt */
+       free_irq(IRQ_AMIGA_AUD0, AmiInterrupt);
+}
+#endif /* MODULE */
+
+static void AmiSilence(void)
+{
+       /* turn off DMA for audio channels */
+       StopDMA();
+}
+
+
+static void AmiInit(void)
+{
+       int period, i;
+
+       AmiSilence();
+
+       if (dmasound.soft.speed)
+               period = amiga_colorclock/dmasound.soft.speed-1;
+       else
+               period = amiga_audio_min_period;
+       dmasound.hard = dmasound.soft;
+       dmasound.trans_write = &transAmiga;
+
+       if (period < amiga_audio_min_period) {
+               /* we would need to squeeze the sound, but we won't do that */
+               period = amiga_audio_min_period;
+       } else if (period > 65535) {
+               period = 65535;
+       }
+       dmasound.hard.speed = amiga_colorclock/(period+1);
+
+       for (i = 0; i < 4; i++)
+               custom.aud[i].audper = period;
+       amiga_audio_period = period;
+
+       AmiSetTreble(50);  /* recommended for newer amiga models */
+}
+
+
+static int AmiSetFormat(int format)
+{
+       int size;
+
+       /* Amiga sound DMA supports 8bit and 16bit (pseudo 14 bit) modes */
+
+       switch (format) {
+       case AFMT_QUERY:
+               return dmasound.soft.format;
+       case AFMT_MU_LAW:
+       case AFMT_A_LAW:
+       case AFMT_U8:
+       case AFMT_S8:
+               size = 8;
+               break;
+       case AFMT_S16_BE:
+       case AFMT_U16_BE:
+       case AFMT_S16_LE:
+       case AFMT_U16_LE:
+               size = 16;
+               break;
+       default: /* :-) */
+               size = 8;
+               format = AFMT_S8;
+       }
+
+       dmasound.soft.format = format;
+       dmasound.soft.size = size;
+       if (dmasound.minDev == SND_DEV_DSP) {
+               dmasound.dsp.format = format;
+               dmasound.dsp.size = dmasound.soft.size;
+       }
+       AmiInit();
+
+       return format;
+}
+
+
+#define VOLUME_VOXWARE_TO_AMI(v) \
+       (((v) < 0) ? 0 : ((v) > 100) ? 64 : ((v) * 64)/100)
+#define VOLUME_AMI_TO_VOXWARE(v) ((v)*100/64)
+
+static int AmiSetVolume(int volume)
+{
+       dmasound.volume_left = VOLUME_VOXWARE_TO_AMI(volume & 0xff);
+       custom.aud[0].audvol = dmasound.volume_left;
+       dmasound.volume_right = VOLUME_VOXWARE_TO_AMI((volume & 0xff00) >> 8);
+       custom.aud[1].audvol = dmasound.volume_right;
+       if (dmasound.hard.size == 16) {
+               if (dmasound.volume_left == 64 && dmasound.volume_right == 64) {
+                       custom.aud[2].audvol = 1;
+                       custom.aud[3].audvol = 1;
+               } else {
+                       custom.aud[2].audvol = 0;
+                       custom.aud[3].audvol = 0;
+               }
+       }
+       return VOLUME_AMI_TO_VOXWARE(dmasound.volume_left) |
+              (VOLUME_AMI_TO_VOXWARE(dmasound.volume_right) << 8);
+}
+
+static int AmiSetTreble(int treble)
+{
+       dmasound.treble = treble;
+       if (treble < 50)
+               ciaa.pra &= ~0x02;
+       else
+               ciaa.pra |= 0x02;
+       return treble;
+}
+
+
+#define AMI_PLAY_LOADED                1
+#define AMI_PLAY_PLAYING       2
+#define AMI_PLAY_MASK          3
+
+
+static void AmiPlayNextFrame(int index)
+{
+       u_char *start, *ch0, *ch1, *ch2, *ch3;
+       u_long size;
+
+       /* used by AmiPlay() if all doubts whether there really is something
+        * to be played are already wiped out.
+        */
+       start = write_sq.buffers[write_sq.front];
+       size = (write_sq.count == index ? write_sq.rear_size
+                                       : write_sq.block_size)>>1;
+
+       if (dmasound.hard.stereo) {
+               ch0 = start;
+               ch1 = start+write_sq_block_size_half;
+               size >>= 1;
+       } else {
+               ch0 = start;
+               ch1 = start;
+       }
+
+       custom.aud[0].audvol = dmasound.volume_left;
+       custom.aud[1].audvol = dmasound.volume_right;
+       if (dmasound.hard.size == 8) {
+               custom.aud[0].audlc = (u_short *)ZTWO_PADDR(ch0);
+               custom.aud[0].audlen = size;
+               custom.aud[1].audlc = (u_short *)ZTWO_PADDR(ch1);
+               custom.aud[1].audlen = size;
+               custom.dmacon = AMI_AUDIO_8;
+       } else {
+               size >>= 1;
+               custom.aud[0].audlc = (u_short *)ZTWO_PADDR(ch0);
+               custom.aud[0].audlen = size;
+               custom.aud[1].audlc = (u_short *)ZTWO_PADDR(ch1);
+               custom.aud[1].audlen = size;
+               if (dmasound.volume_left == 64 && dmasound.volume_right == 64) {
+                       /* We can play pseudo 14-bit only with the maximum volume */
+                       ch3 = ch0+write_sq_block_size_quarter;
+                       ch2 = ch1+write_sq_block_size_quarter;
+                       custom.aud[2].audvol = 1;  /* we are being affected by the beeps */
+                       custom.aud[3].audvol = 1;  /* restoring volume here helps a bit */
+                       custom.aud[2].audlc = (u_short *)ZTWO_PADDR(ch2);
+                       custom.aud[2].audlen = size;
+                       custom.aud[3].audlc = (u_short *)ZTWO_PADDR(ch3);
+                       custom.aud[3].audlen = size;
+                       custom.dmacon = AMI_AUDIO_14;
+               } else {
+                       custom.aud[2].audvol = 0;
+                       custom.aud[3].audvol = 0;
+                       custom.dmacon = AMI_AUDIO_8;
+               }
+       }
+       write_sq.front = (write_sq.front+1) % write_sq.max_count;
+       write_sq.active |= AMI_PLAY_LOADED;
+}
+
+
+static void AmiPlay(void)
+{
+       int minframes = 1;
+
+       custom.intena = IF_AUD0;
+
+       if (write_sq.active & AMI_PLAY_LOADED) {
+               /* There's already a frame loaded */
+               custom.intena = IF_SETCLR | IF_AUD0;
+               return;
+       }
+
+       if (write_sq.active & AMI_PLAY_PLAYING)
+               /* Increase threshold: frame 1 is already being played */
+               minframes = 2;
+
+       if (write_sq.count < minframes) {
+               /* Nothing to do */
+               custom.intena = IF_SETCLR | IF_AUD0;
+               return;
+       }
+
+       if (write_sq.count <= minframes &&
+           write_sq.rear_size < write_sq.block_size && !write_sq.syncing) {
+               /* hmmm, the only existing frame is not
+                * yet filled and we're not syncing?
+                */
+               custom.intena = IF_SETCLR | IF_AUD0;
+               return;
+       }
+
+       AmiPlayNextFrame(minframes);
+
+       custom.intena = IF_SETCLR | IF_AUD0;
+}
+
+
+static void AmiInterrupt(int irq, void *dummy, struct pt_regs *fp)
+{
+       int minframes = 1;
+
+       custom.intena = IF_AUD0;
+
+       if (!write_sq.active) {
+               /* Playing was interrupted and sq_reset() has already cleared
+                * the sq variables, so better don't do anything here.
+                */
+               WAKE_UP(write_sq.sync_queue);
+               return;
+       }
+
+       if (write_sq.active & AMI_PLAY_PLAYING) {
+               /* We've just finished a frame */
+               write_sq.count--;
+               WAKE_UP(write_sq.action_queue);
+       }
+
+       if (write_sq.active & AMI_PLAY_LOADED)
+               /* Increase threshold: frame 1 is already being played */
+               minframes = 2;
+
+       /* Shift the flags */
+       write_sq.active = (write_sq.active<<1) & AMI_PLAY_MASK;
+
+       if (!write_sq.active)
+               /* No frame is playing, disable audio DMA */
+               StopDMA();
+
+       custom.intena = IF_SETCLR | IF_AUD0;
+
+       if (write_sq.count >= minframes)
+               /* Try to play the next frame */
+               AmiPlay();
+
+       if (!write_sq.active)
+               /* Nothing to play anymore.
+                  Wake up a process waiting for audio output to drain. */
+               WAKE_UP(write_sq.sync_queue);
+}
+
+/*** Mid level stuff *********************************************************/
+
+
+/*
+ * /dev/mixer abstraction
+ */
+
+static void __init AmiMixerInit(void)
+{
+       dmasound.volume_left = 64;
+       dmasound.volume_right = 64;
+       custom.aud[0].audvol = dmasound.volume_left;
+       custom.aud[3].audvol = 1;       /* For pseudo 14bit */
+       custom.aud[1].audvol = dmasound.volume_right;
+       custom.aud[2].audvol = 1;       /* For pseudo 14bit */
+       dmasound.treble = 50;
+}
+
+static int AmiMixerIoctl(u_int cmd, u_long arg)
+{
+       int data;
+       switch (cmd) {
+           case SOUND_MIXER_READ_DEVMASK:
+                   return IOCTL_OUT(arg, SOUND_MASK_VOLUME | SOUND_MASK_TREBLE);
+           case SOUND_MIXER_READ_RECMASK:
+                   return IOCTL_OUT(arg, 0);
+           case SOUND_MIXER_READ_STEREODEVS:
+                   return IOCTL_OUT(arg, SOUND_MASK_VOLUME);
+           case SOUND_MIXER_READ_VOLUME:
+                   return IOCTL_OUT(arg,
+                           VOLUME_AMI_TO_VOXWARE(dmasound.volume_left) |
+                           VOLUME_AMI_TO_VOXWARE(dmasound.volume_right) << 8);
+           case SOUND_MIXER_WRITE_VOLUME:
+                   IOCTL_IN(arg, data);
+                   return IOCTL_OUT(arg, dmasound_set_volume(data));
+           case SOUND_MIXER_READ_TREBLE:
+                   return IOCTL_OUT(arg, dmasound.treble);
+           case SOUND_MIXER_WRITE_TREBLE:
+                   IOCTL_IN(arg, data);
+                   return IOCTL_OUT(arg, dmasound_set_treble(data));
+       }
+       return -EINVAL;
+}
+
+
+static void AmiWriteSqSetup(void)
+{
+       write_sq_block_size_half = write_sq.block_size>>1;
+       write_sq_block_size_quarter = write_sq_block_size_half>>1;
+}
+
+
+static int AmiStateInfo(char *buffer)
+{
+       int len = 0;
+       len += sprintf(buffer+len, "\tsound.volume_left = %d [0...64]\n",
+                      dmasound.volume_left);
+       len += sprintf(buffer+len, "\tsound.volume_right = %d [0...64]\n",
+                      dmasound.volume_right);
+       return len;
+}
+
+
+/*** Machine definitions *****************************************************/
+
+
+static MACHINE machAmiga = {
+       name:           "Amiga",
+       name2:          "AMIGA",
+       open:           AmiOpen,
+       release:        AmiRelease,
+       dma_alloc:      AmiAlloc,
+       dma_free:       AmiFree,
+       irqinit:        AmiIrqInit,
+#ifdef MODULE
+       irqcleanup:     AmiIrqCleanUp,
+#endif /* MODULE */
+       init:           AmiInit,
+       silence:        AmiSilence,
+       setFormat:      AmiSetFormat,
+       setVolume:      AmiSetVolume,
+       setTreble:      AmiSetTreble,
+       play:           AmiPlay,
+       mixer_init:     AmiMixerInit,
+       mixer_ioctl:    AmiMixerIoctl,
+       write_sq_setup: AmiWriteSqSetup,
+       state_info:     AmiStateInfo,
+       min_dsp_speed:  8000
+};
+
+
+/*** Config & Setup **********************************************************/
+
+
+int __init dmasound_paula_init(void)
+{
+       int err;
+
+       if (MACH_IS_AMIGA && AMIGAHW_PRESENT(AMI_AUDIO)) {
+           if (!request_mem_region(CUSTOM_PHYSADDR+0xa0, 0x40,
+                                   "dmasound [Paula]"))
+               return -EBUSY;
+           dmasound.mach = machAmiga;
+           err = dmasound_init();
+           if (err)
+               release_mem_region(CUSTOM_PHYSADDR+0xa0, 0x40);
+           return err;
+       } else
+           return -ENODEV;
+}
+
+static void __exit dmasound_paula_cleanup(void)
+{
+       dmasound_deinit();
+       release_mem_region(CUSTOM_PHYSADDR+0xa0, 0x40);
+}
+
+module_init(dmasound_paula_init);
+module_exit(dmasound_paula_cleanup);
diff --git a/drivers/sound/dmasound/dmasound_q40.c b/drivers/sound/dmasound/dmasound_q40.c
new file mode 100644 (file)
index 0000000..1c4d43d
--- /dev/null
@@ -0,0 +1,587 @@
+
+/*
+ *  linux/drivers/sound/dmasound_q40.c
+ *
+ *  Q40 DMA Sound Driver
+ *
+ *  See linux/drivers/sound/dmasound_core.c for copyright and credits
+ */
+
+
+#include <linux/module.h>
+#include <linux/init.h>
+#include <linux/malloc.h>
+#include <linux/soundcard.h>
+
+#include <asm/uaccess.h>
+#include <asm/q40_master.h>
+
+#include "dmasound.h"
+
+
+static int expand_bal; /* Balance factor for expanding (not volume!) */
+static int expand_data;        /* Data for expanding */
+
+
+/*** Low level stuff *********************************************************/
+
+
+static void Q40Open(void);
+static void Q40Release(void);
+static void *Q40Alloc(unsigned int size, int flags);
+static void Q40Free(void *, unsigned int);
+static int Q40IrqInit(void);
+#ifdef MODULE
+static void Q40IrqCleanUp(void);
+#endif
+static void Q40Silence(void);
+static void Q40Init(void);
+static int Q40SetFormat(int format);
+static int Q40SetVolume(int volume);
+static void Q40PlayNextFrame(int index);
+static void Q40Play(void);
+static void Q40StereoInterrupt(int irq, void *dummy, struct pt_regs *fp);
+static void Q40MonoInterrupt(int irq, void *dummy, struct pt_regs *fp);
+static void Q40Interrupt(void);
+
+
+/*** Mid level stuff *********************************************************/
+
+
+#if 1
+/* userCount, frameUsed, frameLeft == byte counts */
+static ssize_t q40_ct_law(const u_char *userPtr, size_t userCount,
+                          u_char frame[], ssize_t *frameUsed,
+                          ssize_t frameLeft)
+{
+       char *table = dmasound.soft.format == AFMT_MU_LAW ? dmasound_ulaw2dma8: dmasound_alaw2dma8;
+       ssize_t count, used;
+       u_char *p = (u_char *) &frame[*frameUsed];
+
+       used = count = min(userCount, frameLeft);
+       if (copy_from_user(p,userPtr,count))
+         return -EFAULT;
+       while (count > 0) {
+               *p = table[*p]+128;
+               p++;
+               count--;
+       }
+       *frameUsed += used ;
+       return used;
+}
+#else
+static ssize_t q40_ct_law(const u_char *userPtr, size_t userCount,
+                          u_char frame[], ssize_t *frameUsed,
+                          ssize_t frameLeft)
+{
+       char *table = dmasound.soft.format == AFMT_MU_LAW ? dmasound_ulaw2dma8: dmasound_alaw2dma8;
+       ssize_t count, used;
+       u_char *p = (u_char *) &frame[*frameUsed];
+       u_char val;
+       int stereo = sound.soft.stereo;
+
+
+       frameLeft >>= 1;
+       if (stereo)
+               userCount >>= 1;
+       used = count = min(userCount, frameLeft);
+       while (count > 0) {
+               u_char data;
+               if (get_user(data, userPtr++))
+                       return -EFAULT;
+               val = table[data]+128;
+               *p++ = val;
+               if (stereo) {
+                       if (get_user(data, userPtr++))
+                               return -EFAULT;
+                       val = table[data]+128;
+               }
+               *p++ = val;
+               count--;
+       }
+       *frameUsed += used * 2;
+       return stereo? used * 2: used;
+}
+#endif
+
+#if 1
+static ssize_t q40_ct_s8(const u_char *userPtr, size_t userCount,
+                         u_char frame[], ssize_t *frameUsed,
+                         ssize_t frameLeft)
+{
+       ssize_t count, used;
+       u_char *p = (u_char *) &frame[*frameUsed];
+
+       used = count = min(userCount, frameLeft);
+       if (copy_from_user(p,userPtr,count))
+         return -EFAULT;
+       while (count > 0) {
+               *p = *p + 128;
+               p++;
+               count--;
+       }
+       *frameUsed += used;
+       return used;
+}
+#else
+static ssize_t q40_ct_s8(const u_char *userPtr, size_t userCount,
+                         u_char frame[], ssize_t *frameUsed,
+                         ssize_t frameLeft)
+{
+       ssize_t count, used;
+       u_char *p = (u_char *) &frame[*frameUsed];
+       u_char val;
+       int stereo = dmasound.soft.stereo;
+
+       frameLeft >>= 1;
+       if (stereo)
+               userCount >>= 1;
+       used = count = min(userCount, frameLeft);
+       while (count > 0) {
+               u_char data;
+               if (get_user(data, userPtr++))
+                       return -EFAULT;
+               val = data + 128;
+               *p++ = val;
+               if (stereo) {
+                       if (get_user(data, userPtr++))
+                               return -EFAULT;
+                       val = data + 128;
+               }
+               *p++ = val;
+               count--;
+       }
+       *frameUsed += used * 2;
+       return stereo? used * 2: used;
+}
+#endif
+
+#if 1
+static ssize_t q40_ct_u8(const u_char *userPtr, size_t userCount,
+                         u_char frame[], ssize_t *frameUsed,
+                         ssize_t frameLeft)
+{
+       ssize_t count, used;
+       u_char *p = (u_char *) &frame[*frameUsed];
+
+       used = count = min(userCount, frameLeft);
+       if (copy_from_user(p,userPtr,count))
+         return -EFAULT;
+       *frameUsed += used;
+       return used;
+}
+#else
+static ssize_t q40_ct_u8(const u_char *userPtr, size_t userCount,
+                         u_char frame[], ssize_t *frameUsed,
+                         ssize_t frameLeft)
+{
+       ssize_t count, used;
+       u_char *p = (u_char *) &frame[*frameUsed];
+       u_char val;
+       int stereo = dmasound.soft.stereo;
+
+
+       frameLeft >>= 1;
+       if (stereo)
+               userCount >>= 1;
+       used = count = min(userCount, frameLeft);
+       while (count > 0) {
+               u_char data;
+               if (get_user(data, userPtr++))
+                       return -EFAULT;
+               val = data;
+               *p++ = val;
+               if (stereo) {
+                       if (get_user(data, userPtr++))
+                               return -EFAULT;
+                       val = data;
+               }
+               *p++ = val;
+               count--;
+       }
+       *frameUsed += used * 2;
+       return stereo? used * 2: used;
+}
+#endif
+
+/* a bit too complicated to optimise right now ..*/
+static ssize_t q40_ctx_law(const u_char *userPtr, size_t userCount,
+                           u_char frame[], ssize_t *frameUsed,
+                           ssize_t frameLeft)
+{
+       unsigned char *table = (unsigned char *)
+               (dmasound.soft.format == AFMT_MU_LAW ? dmasound_ulaw2dma8: dmasound_alaw2dma8);
+       unsigned int data = expand_data;
+       u_char *p = (u_char *) &frame[*frameUsed];
+       int bal = expand_bal;
+       int hSpeed = dmasound.hard.speed, sSpeed = dmasound.soft.speed;
+       int utotal, ftotal;
+       ftotal = frameLeft;
+       utotal = userCount;
+       while (frameLeft) {
+               u_char c;
+               if (bal < 0) {
+                       if (userCount == 0)
+                               break;
+                       if (get_user(c, userPtr++))
+                               return -EFAULT;
+                       data = table[c];
+                       data += 0x80;
+                       userCount--;
+                       bal += hSpeed;
+               }
+               *p++ = data;
+               frameLeft--;
+               bal -= sSpeed;
+       }
+       expand_bal = bal;
+       expand_data = data;
+       *frameUsed += (ftotal - frameLeft);
+       utotal -= userCount;
+       return utotal;
+}
+
+
+static ssize_t q40_ctx_s8(const u_char *userPtr, size_t userCount,
+                          u_char frame[], ssize_t *frameUsed,
+                          ssize_t frameLeft)
+{
+       u_char *p = (u_char *) &frame[*frameUsed];
+       unsigned int data = expand_data;
+       int bal = expand_bal;
+       int hSpeed = dmasound.hard.speed, sSpeed = dmasound.soft.speed;
+       int utotal, ftotal;
+
+
+       ftotal = frameLeft;
+       utotal = userCount;
+       while (frameLeft) {
+               u_char c;
+               if (bal < 0) {
+                       if (userCount == 0)
+                               break;
+                       if (get_user(c, userPtr++))
+                               return -EFAULT;
+                       data = c ;
+                       data += 0x80;
+                       userCount--;
+                       bal += hSpeed;
+               }
+               *p++ = data;
+               frameLeft--;
+               bal -= sSpeed;
+       }
+       expand_bal = bal;
+       expand_data = data;
+       *frameUsed += (ftotal - frameLeft);
+       utotal -= userCount;
+       return utotal;
+}
+
+
+static ssize_t q40_ctx_u8(const u_char *userPtr, size_t userCount,
+                          u_char frame[], ssize_t *frameUsed,
+                          ssize_t frameLeft)
+{
+       u_char *p = (u_char *) &frame[*frameUsed];
+       unsigned int data = expand_data;
+       int bal = expand_bal;
+       int hSpeed = dmasound.hard.speed, sSpeed = dmasound.soft.speed;
+       int utotal, ftotal;
+
+       ftotal = frameLeft;
+       utotal = userCount;
+       while (frameLeft) {
+               u_char c;
+               if (bal < 0) {
+                       if (userCount == 0)
+                               break;
+                       if (get_user(c, userPtr++))
+                               return -EFAULT;
+                       data = c ;
+                       userCount--;
+                       bal += hSpeed;
+               }
+               *p++ = data;
+               frameLeft--;
+               bal -= sSpeed;
+       }
+       expand_bal = bal;
+       expand_data = data;
+       *frameUsed += (ftotal - frameLeft) ;
+       utotal -= userCount;
+       return utotal;
+}
+
+
+static TRANS transQ40Normal = {
+       q40_ct_law, q40_ct_law, q40_ct_s8, q40_ct_u8, NULL, NULL, NULL, NULL
+};
+
+static TRANS transQ40Expanding = {
+       q40_ctx_law, q40_ctx_law, q40_ctx_s8, q40_ctx_u8, NULL, NULL, NULL, NULL
+};
+
+
+/*** Low level stuff *********************************************************/
+
+
+static void Q40Open(void)
+{
+       MOD_INC_USE_COUNT;
+}
+
+static void Q40Release(void)
+{
+       MOD_DEC_USE_COUNT;
+}
+
+
+static void *Q40Alloc(unsigned int size, int flags)
+{
+         return kmalloc(size, flags); /* change to vmalloc */
+}
+
+static void Q40Free(void *ptr, unsigned int size)
+{
+       kfree(ptr);
+}
+
+static int __init Q40IrqInit(void)
+{
+       /* Register interrupt handler. */
+       request_irq(Q40_IRQ_SAMPLE, Q40StereoInterrupt, 0,
+                   "DMA sound", Q40Interrupt);
+
+       return(1);
+}
+
+
+#ifdef MODULE
+static void Q40IrqCleanUp(void)
+{
+        master_outb(0,SAMPLE_ENABLE_REG);
+       free_irq(Q40_IRQ_SAMPLE, Q40Interrupt);
+}
+#endif /* MODULE */
+
+
+static void Q40Silence(void)
+{
+        master_outb(0,SAMPLE_ENABLE_REG);
+       *DAC_LEFT=*DAC_RIGHT=0;
+}
+
+static char *q40_pp=NULL;
+static unsigned int q40_sc=0;
+
+static void Q40PlayNextFrame(int index)
+{
+       u_char *start;
+       u_long size;
+       u_char speed;
+
+       /* used by Q40Play() if all doubts whether there really is something
+        * to be played are already wiped out.
+        */
+       start = write_sq.buffers[write_sq.front];
+       size = (write_sq.count == index ? write_sq.rear_size : write_sq.block_size);
+
+       q40_pp=start;
+       q40_sc=size;
+               
+       write_sq.front = (write_sq.front+1) % write_sq.max_count;
+       write_sq.active++;
+
+       speed=(dmasound.hard.speed==10000 ? 0 : 1);
+
+       master_outb( 0,SAMPLE_ENABLE_REG);
+       free_irq(Q40_IRQ_SAMPLE, Q40Interrupt);
+       if (dmasound.soft.stereo)
+               request_irq(Q40_IRQ_SAMPLE, Q40StereoInterrupt, 0,
+                   "Q40 sound", Q40Interrupt);
+         else
+               request_irq(Q40_IRQ_SAMPLE, Q40MonoInterrupt, 0,
+                   "Q40 sound", Q40Interrupt);
+
+       master_outb( speed, SAMPLE_RATE_REG);
+       master_outb( 1,SAMPLE_CLEAR_REG);
+       master_outb( 1,SAMPLE_ENABLE_REG);
+}
+
+static void Q40Play(void)
+{
+        unsigned long flags;
+
+       if (write_sq.active || write_sq.count<=0 ) {
+               /* There's already a frame loaded */
+               return;
+       }
+
+       /* nothing in the queue */
+       if (write_sq.count <= 1 && write_sq.rear_size < write_sq.block_size && !write_sq.syncing) {
+                /* hmmm, the only existing frame is not
+                 * yet filled and we're not syncing?
+                 */
+                return;
+       }
+       save_flags(flags); cli();
+       Q40PlayNextFrame(1);
+       restore_flags(flags);
+}
+
+static void Q40StereoInterrupt(int irq, void *dummy, struct pt_regs *fp)
+{
+        if (q40_sc>1){
+            *DAC_LEFT=*q40_pp++;
+           *DAC_RIGHT=*q40_pp++;
+           q40_sc -=2;
+           master_outb(1,SAMPLE_CLEAR_REG);
+       }else Q40Interrupt();
+}
+static void Q40MonoInterrupt(int irq, void *dummy, struct pt_regs *fp)
+{
+        if (q40_sc>0){
+            *DAC_LEFT=*q40_pp;
+           *DAC_RIGHT=*q40_pp++;
+           q40_sc --;
+           master_outb(1,SAMPLE_CLEAR_REG);        
+       }else Q40Interrupt();
+}
+static void Q40Interrupt(void)
+{
+       if (!write_sq.active) {
+                 /* playing was interrupted and sq_reset() has already cleared
+                  * the sq variables, so better don't do anything here.
+                  */
+                  WAKE_UP(write_sq.sync_queue);
+                  master_outb(0,SAMPLE_ENABLE_REG); /* better safe */
+                  goto exit;
+       } else write_sq.active=0;
+       write_sq.count--;
+       Q40Play();
+
+       if (q40_sc<2)
+             { /* there was nothing to play, disable irq */
+               master_outb(0,SAMPLE_ENABLE_REG);
+               *DAC_LEFT=*DAC_RIGHT=0;
+             }
+       WAKE_UP(write_sq.action_queue);
+
+ exit:
+       master_outb(1,SAMPLE_CLEAR_REG);
+}
+
+
+static void Q40Init(void)
+{
+       int i, idx;
+       const int freq[] = {10000, 20000};
+
+       /* search a frequency that fits into the allowed error range */
+
+       idx = -1;
+       for (i = 0; i < 2; i++)
+               if ((100 * abs(dmasound.soft.speed - freq[i]) / freq[i]) <= catchRadius)
+                       idx = i;
+
+       dmasound.hard = dmasound.soft;
+       /*sound.hard.stereo=1;*/ /* no longer true */
+       dmasound.hard.size=8;
+
+       if (idx > -1) {
+               dmasound.soft.speed = freq[idx];
+               dmasound.trans_write = &transQ40Normal;
+       } else
+               dmasound.trans_write = &transQ40Expanding;
+
+       Q40Silence();
+
+       if (dmasound.hard.speed > 20000) {
+               /* we would need to squeeze the sound, but we won't do that */
+               dmasound.hard.speed = 20000;
+               dmasound.trans_write = &transQ40Normal;
+       } else if (dmasound.hard.speed > 10000) {
+               dmasound.hard.speed = 20000;
+       } else {
+               dmasound.hard.speed = 10000;
+       }
+       expand_bal = -dmasound.soft.speed;
+}
+
+
+static int Q40SetFormat(int format)
+{
+       /* Q40 sound supports only 8bit modes */
+
+       switch (format) {
+       case AFMT_QUERY:
+               return(dmasound.soft.format);
+       case AFMT_MU_LAW:
+       case AFMT_A_LAW:
+       case AFMT_S8:
+       case AFMT_U8:
+               break;
+       default:
+               format = AFMT_S8;
+       }
+
+       dmasound.soft.format = format;
+       dmasound.soft.size = 8;
+       if (dmasound.minDev == SND_DEV_DSP) {
+               dmasound.dsp.format = format;
+               dmasound.dsp.size = 8;
+       }
+       Q40Init();
+
+       return(format);
+}
+
+static int Q40SetVolume(int volume)
+{
+    return 0;
+}
+
+
+/*** Machine definitions *****************************************************/
+
+
+static MACHINE machQ40 = {
+       name:           "Q40",
+       name2:          "Q40",
+       open:           Q40Open,
+       release:        Q40Release,
+       dma_alloc:      Q40Alloc,
+       dma_free:       Q40Free,
+       irqinit:        Q40IrqInit,
+#ifdef MODULE
+       irqcleanup:     Q40IrqCleanUp,
+#endif /* MODULE */
+       init:           Q40Init,
+       silence:        Q40Silence, 
+       setFormat:      Q40SetFormat, 
+       setVolume:      Q40SetVolume,
+       play:           Q40Play
+};
+
+
+/*** Config & Setup **********************************************************/
+
+
+int __init dmasound_q40_init(void)
+{
+       if (MACH_IS_Q40) {
+           dmasound.mach = machQ40;
+           return dmasound_init();
+       } else
+           return -ENODEV;
+}
+
+static void __exit dmasound_q40_cleanup(void)
+{
+       dmasound_deinit();
+}
+
+module_init(dmasound_q40_init);
+module_exit(dmasound_q40_cleanup);
index ee001d0154bbc18d3ec02a780ee2873299f5e681..460a4410591fccee3e3d9c4f1fb06d220402cdc0 100644 (file)
@@ -66,12 +66,8 @@ comment 'USB HID'
    dep_tristate '  Keyboard support' CONFIG_INPUT_KEYBDEV $CONFIG_USB
    dep_tristate '  Mouse support' CONFIG_INPUT_MOUSEDEV $CONFIG_USB
    if [ "$CONFIG_INPUT_MOUSEDEV" != "n" ]; then
-      bool '    Mix all mice into one device' CONFIG_INPUT_MOUSEDEV_MIX
-      bool '    Support for digitizers' CONFIG_INPUT_MOUSEDEV_DIGITIZER
-      if [ "$CONFIG_INPUT_MOUSEDEV_DIGITIZER" != "n" ]; then
-         int '     Horizontal screen resolution' CONFIG_INPUT_MOUSEDEV_SCREEN_X 1024
-         int '      Vertical screen resolution' CONFIG_INPUT_MOUSEDEV_SCREEN_Y 768
-      fi
+      int '   Horizontal screen resolution' CONFIG_INPUT_MOUSEDEV_SCREEN_X 1024
+      int '   Vertical screen resolution' CONFIG_INPUT_MOUSEDEV_SCREEN_Y 768
    fi
    dep_tristate '  Joystick support' CONFIG_INPUT_JOYDEV $CONFIG_USB
    dep_tristate '  Event interface support' CONFIG_INPUT_EVDEV $CONFIG_USB
index 099d90372dbf87e53ee9637a099b2e06139cda34..874887a6398274060580bd0d5d56b527e76ef449 100644 (file)
 #include <linux/slab.h>
 #include <linux/poll.h>
 #include <linux/usb.h>
+#include <linux/usbdevice_fs.h>
 #include <asm/uaccess.h>
 
-#include "usbdevice_fs.h"
-
 #define MAX_TOPO_LEVEL         6
 
 /* Define ALLOW_SERIAL_NUMBER if you want to see the serial number of devices */
index c28614d0707b67b1e5262a4f98b385636ef058f1..933895934ae7e8ac13b8f7e6f0d3d5f85537f3bf 100644 (file)
@@ -41,9 +41,9 @@
 #include <linux/signal.h>
 #include <linux/poll.h>
 #include <linux/usb.h>
+#include <linux/usbdevice_fs.h>
 #include <asm/uaccess.h>
 
-#include "usbdevice_fs.h"
 
 struct async {
         struct list_head asynclist;
index 0dcc9f71992692df3e6d671ef791e66fa566d680..11e16b784c8838e428b18170bf0920ffcbe28079 100644 (file)
 #include <linux/fs.h>
 #include <linux/mm.h>
 #include <linux/usb.h>
+#include <linux/usbdevice_fs.h>
 #include <asm/uaccess.h>
 
-#include "usbdevice_fs.h"
-
-
 /*****************************************************************/
 
 /*
index f184cd03d867e8b3c8d0a6ddb8e3d9ac65a25aaf..1d42f7df0c86d847c4a0852d5cead150725d2ab6 100644 (file)
@@ -40,6 +40,7 @@
 
 struct evdev {
        int used;
+       int open;
        int minor;
        struct input_handle handle;
        wait_queue_head_t wait;
@@ -98,6 +99,9 @@ static int evdev_release(struct inode * inode, struct file * file)
        while (*listptr && (*listptr != list))
                listptr = &((*listptr)->next);
        *listptr = (*listptr)->next;
+
+       if (!--list->evdev->open)
+               input_close_device(&list->evdev->handle);       
        
        if (!--list->evdev->used) {
                input_unregister_minor(list->evdev->devfs);
@@ -135,6 +139,9 @@ static int evdev_open(struct inode * inode, struct file * file)
 
        list->evdev->used++;
 
+       if (!list->evdev->open++)
+               input_open_device(&list->evdev->handle);        
+
        return 0;
 }
 
@@ -250,7 +257,7 @@ static struct file_operations evdev_fops = {
        fasync:         evdev_fasync,
 };
 
-static int evdev_connect(struct input_handler *handler, struct input_dev *dev)
+static struct input_handle *evdev_connect(struct input_handler *handler, struct input_dev *dev)
 {
        struct evdev *evdev;
        int minor;
@@ -258,11 +265,11 @@ static int evdev_connect(struct input_handler *handler, struct input_dev *dev)
        for (minor = 0; minor < EVDEV_MINORS && evdev_table[minor]; minor++);
        if (evdev_table[minor]) {
                printk(KERN_ERR "evdev: no more free evdev devices\n");
-               return -1;
+               return NULL;
        }
 
        if (!(evdev = kmalloc(sizeof(struct evdev), GFP_KERNEL)))
-               return -1;
+               return NULL;
        memset(evdev, 0, sizeof(struct evdev));
 
        init_waitqueue_head(&evdev->wait);
@@ -276,19 +283,19 @@ static int evdev_connect(struct input_handler *handler, struct input_dev *dev)
 
        evdev->used = 1;
 
-       input_open_device(&evdev->handle);
        evdev->devfs = input_register_minor("event%d", minor, EVDEV_MINOR_BASE);
 
        printk("event%d: Event device for input%d\n", minor, dev->number);
 
-       return 0;
+       return &evdev->handle;
 }
 
 static void evdev_disconnect(struct input_handle *handle)
 {
        struct evdev *evdev = handle->private;
 
-       input_close_device(handle);
+       if (evdev->open)
+               input_close_device(handle);
 
        if (!--evdev->used) {
                input_unregister_minor(evdev->devfs);
index 8c76969d742f35b6b71c6facc95a8e127c6bffce..821dedb4aecb9859a5db9d22531c0cc71f9411f2 100644 (file)
@@ -614,5 +614,28 @@ void usb_hub_cleanup(void)
        usb_deregister(&hub_driver);
 } /* usb_hub_cleanup() */
 
+int usb_reset_device(struct usb_device *dev)
+{
+       struct usb_device *parent = dev->parent;
+       int i;
+
+       if (!parent) {
+               err("attempting to reset root hub!");
+               return -EINVAL;
+       }
+
+       for (i = 0; i < parent->maxchild; i++) {
+               if (parent->children[i] == dev) {
+                       usb_set_port_feature(parent, i + 1,
+                               USB_PORT_FEAT_RESET);
 
+                       usb_disconnect(&dev);
+                       usb_hub_port_connect_change(parent, i);
+
+                       return 0;
+               }
+       }
+
+       return -ENOENT;
+}
 
index c30f2eaff5c0658ef0bb7187dacd3e32b8894d0b..50970155b6625675d1a8767f11b9418c24bc8653 100644 (file)
 #include <linux/init.h>
 #include <linux/proc_fs.h>
 #include <linux/usb.h>
+#include <linux/usbdevice_fs.h>
 #include <asm/uaccess.h>
 
-#include "usbdevice_fs.h"
-
 /* --------------------------------------------------------------------- */
 
 static LIST_HEAD(superlist);
index 01cceeacffbf251ae9272335f6feb86a422c70ae..73f39db7ca2210d826fe5e165587825d859eb4c1 100644 (file)
 
 MODULE_AUTHOR("Vojtech Pavlik <vojtech@suse.cz>");
 
-#ifndef MODULE
 EXPORT_SYMBOL(input_register_device);
 EXPORT_SYMBOL(input_unregister_device);
 EXPORT_SYMBOL(input_register_handler);
 EXPORT_SYMBOL(input_unregister_handler);
+EXPORT_SYMBOL(input_register_minor);
+EXPORT_SYMBOL(input_unregister_minor);
 EXPORT_SYMBOL(input_open_device);
 EXPORT_SYMBOL(input_close_device);
 EXPORT_SYMBOL(input_event);
-#endif
 
 #define INPUT_MAJOR    13
+#define INPUT_DEVICES  256
 
 static struct input_dev *input_dev = NULL;
 static struct input_handler *input_handler = NULL;
 static struct input_handler *input_table[8] = { NULL, /* ... */ };
 static devfs_handle_t input_devfs_handle = NULL;
 static int input_number = 0;
+static long input_devices[NBITS(INPUT_DEVICES)] = { 0, /* ... */ };
 
 void input_event(struct input_dev *dev, unsigned int type, unsigned int code, int value)
 {
@@ -145,7 +147,8 @@ void input_event(struct input_dev *dev, unsigned int type, unsigned int code, in
  */
 
        while (handle) {
-               handle->handler->event(handle, type, code, value);
+               if (handle->open)
+                       handle->handler->event(handle, type, code, value);
                handle = handle->dnext;
        }
 }
@@ -157,9 +160,48 @@ static void input_repeat_key(unsigned long data)
        mod_timer(&dev->timer, jiffies + dev->rep[REP_PERIOD]);
 }
 
+int input_open_device(struct input_handle *handle)
+{
+       handle->open++;
+       if (handle->dev->open)
+               return handle->dev->open(handle->dev);
+       return 0;
+}
+
+void input_close_device(struct input_handle *handle)
+{
+       if (handle->dev->close)
+               handle->dev->close(handle->dev);
+       handle->open--;
+}
+
+static void input_link_handle(struct input_handle *handle)
+{
+       handle->dnext = handle->dev->handle;
+       handle->hnext = handle->handler->handle;
+       handle->dev->handle = handle;
+       handle->handler->handle = handle;
+}
+
+static void input_unlink_handle(struct input_handle *handle)
+{
+       struct input_handle **handleptr;
+
+       handleptr = &handle->dev->handle;
+       while (*handleptr && (*handleptr != handle))
+               handleptr = &((*handleptr)->dnext);
+       *handleptr = (*handleptr)->dnext;
+
+       handleptr = &handle->handler->handle;
+       while (*handleptr && (*handleptr != handle))
+               handleptr = &((*handleptr)->hnext);
+       *handleptr = (*handleptr)->hnext;
+}
+
 void input_register_device(struct input_dev *dev)
 {
        struct input_handler *handler = input_handler;
+       struct input_handle *handle;
 
 /*
  * Initialize repeat timer to default values.
@@ -175,17 +217,25 @@ void input_register_device(struct input_dev *dev)
  * Add the device.
  */
 
-       MOD_INC_USE_COUNT;
-       dev->number = input_number++;
+       if (input_number >= INPUT_DEVICES) {
+               printk(KERN_WARNING "input: ran out of input device numbers!\n");
+               dev->number = input_number;
+       } else {
+               dev->number = find_first_zero_bit(input_devices, INPUT_DEVICES);
+               set_bit(dev->number, input_devices);
+       }
+               
        dev->next = input_dev;  
        input_dev = dev;
+       input_number++;
 
 /*
  * Notify handlers.
  */
 
        while (handler) {
-               handler->connect(handler, dev);
+               if ((handle = handler->connect(handler, dev)))
+                       input_link_handle(handle);
                handler = handler->next;
        }
 }
@@ -206,6 +256,7 @@ void input_unregister_device(struct input_dev *dev)
  */
 
        while (handle) {
+               input_unlink_handle(handle);
                handle->handler->disconnect(handle);
                handle = handle->dnext;
        }
@@ -219,12 +270,15 @@ void input_unregister_device(struct input_dev *dev)
        *devptr = (*devptr)->next;
 
        input_number--;
-       MOD_DEC_USE_COUNT;
+
+       if (dev->number < INPUT_DEVICES)
+               clear_bit(dev->number, input_devices);
 }
 
 void input_register_handler(struct input_handler *handler)
 {
        struct input_dev *dev = input_dev;
+       struct input_handle *handle;
 
 /*
  * Add minors if needed.
@@ -245,7 +299,8 @@ void input_register_handler(struct input_handler *handler)
  */
 
        while (dev) {
-               handler->connect(handler, dev);
+               if ((handle = handler->connect(handler, dev)))
+                       input_link_handle(handle);
                dev = dev->next;
        }
 }
@@ -260,6 +315,7 @@ void input_unregister_handler(struct input_handler *handler)
  */
 
        while (handle) {
+               input_unlink_handle(handle);
                handler->disconnect(handle);
                handle = handle->hnext;
        }
@@ -281,44 +337,6 @@ void input_unregister_handler(struct input_handler *handler)
                input_table[handler->minor >> 5] = NULL;
 }
 
-void input_open_device(struct input_handle *handle)
-{
-       handle->dnext = handle->dev->handle;
-       handle->hnext = handle->handler->handle;
-       handle->dev->handle = handle;
-       handle->handler->handle = handle;
-
-       if (handle->dev->open)
-               handle->dev->open(handle->dev);
-}
-
-void input_close_device(struct input_handle *handle)
-{
-       struct input_handle **handleptr;
-
-       if (handle->dev->close)
-               handle->dev->close(handle->dev);
-/*
- * Remove from device list of handles.
- */
-
-       handleptr = &handle->dev->handle;
-
-       while (*handleptr && (*handleptr != handle))
-               handleptr = &((*handleptr)->dnext);
-       *handleptr = (*handleptr)->dnext;
-
-/*
- * Remove from handler list of handles.
- */
-
-       handleptr = &handle->handler->handle;
-
-       while (*handleptr && (*handleptr != handle))
-               handleptr = &((*handleptr)->hnext);
-       *handleptr = (*handleptr)->hnext;
-}
-
 static int input_open_file(struct inode *inode, struct file *file)
 {
        struct input_handler *handler = input_table[MINOR(inode->i_rdev) >> 5];
index ea08cff431b74bddc81838548a0c41ef819e1009..585740db906809454a05fd5119063f3c08724510 100644 (file)
@@ -51,6 +51,7 @@
 
 struct joydev {
        int used;
+       int open;
        int minor;
        char name[32];
        struct input_handle handle;
@@ -165,6 +166,9 @@ static int joydev_release(struct inode * inode, struct file * file)
        while (*listptr && (*listptr != list))
                listptr = &((*listptr)->next);
        *listptr = (*listptr)->next;
+
+       if (!--list->joydev->open)
+               input_close_device(&list->joydev->handle);
        
        if (!--list->joydev->used) {
                input_unregister_minor(list->joydev->devfs);
@@ -202,6 +206,9 @@ static int joydev_open(struct inode *inode, struct file *file)
 
        list->joydev->used++;
 
+       if (!list->joydev->open++)
+               input_open_device(&list->joydev->handle);
+
        return 0;
 }
 
@@ -371,7 +378,7 @@ static struct file_operations joydev_fops = {
        fasync:         joydev_fasync,
 };
 
-static int joydev_connect(struct input_handler *handler, struct input_dev *dev)
+static struct input_handle *joydev_connect(struct input_handler *handler, struct input_dev *dev)
 {
        struct joydev *joydev;
        int i, j, minor;
@@ -379,16 +386,16 @@ static int joydev_connect(struct input_handler *handler, struct input_dev *dev)
        if (!(test_bit(EV_KEY, dev->evbit) && test_bit(EV_ABS, dev->evbit) &&
              test_bit(ABS_X, dev->absbit) && test_bit(ABS_Y, dev->absbit) &&
             (test_bit(BTN_TRIGGER, dev->keybit) || test_bit(BTN_A, dev->keybit)
-               || test_bit(BTN_1, dev->keybit)))) return -1;
+               || test_bit(BTN_1, dev->keybit)))) return NULL; 
 
        for (minor = 0; minor < JOYDEV_MINORS && joydev_table[minor]; minor++);
        if (joydev_table[minor]) {
                printk(KERN_ERR "joydev: no more free joydev devices\n");
-               return -1;
+               return NULL;
        }
 
        if (!(joydev = kmalloc(sizeof(struct joydev), GFP_KERNEL)))
-               return -1;
+               return NULL;
        memset(joydev, 0, sizeof(struct joydev));
 
        init_waitqueue_head(&joydev->wait);
@@ -439,19 +446,19 @@ static int joydev_connect(struct input_handler *handler, struct input_dev *dev)
                joydev->corr[i].coef[3] = (1 << 29) / ((dev->absmax[j] - dev->absmin[j]) / 2 - 2 * dev->absflat[j]);
        }
 
-       input_open_device(&joydev->handle);     
        joydev->devfs = input_register_minor("js%d", minor, JOYDEV_MINOR_BASE);
 
        printk("js%d: Joystick device for input%d\n", minor, dev->number);
 
-       return 0;
+       return &joydev->handle;
 }
 
 static void joydev_disconnect(struct input_handle *handle)
 {
        struct joydev *joydev = handle->private;
 
-       input_close_device(handle);
+       if (joydev->open)
+               input_close_device(handle);     
 
        if (!--joydev->used) {
                input_unregister_minor(joydev->devfs);
index 7c94c185b23ac8b785f28ab79cf56bc6a5987677..4723ba11ba41533bfd5df8a1bd6c8d438d168ee6 100644 (file)
 #include <linux/module.h>
 #include <linux/kbd_kern.h>
 
-#if defined(CONFIG_X86) || defined(CONFIG_IA64)
+#if defined(CONFIG_X86) || defined(CONFIG_IA64) || defined(CONFIG_ALPHA) || defined(CONFIG_MIPS)
+
+static int x86_sysrq_alt = 0;
+
+static unsigned short x86_keycodes[256] =
+       { 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15,
+        16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
+        32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,
+        48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63,
+        64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79,
+        80, 81, 82, 83, 89, 85, 86, 87, 88,115,119,120,121,375,123, 90,
+       284,285,309,298,312, 91,327,328,329,331,333,335,336,337,338,339,
+       367,294,293,286,350, 92,334,512,116,377,109,111,373,347,348,349,
+       360, 93, 94, 95, 98,376,100,101,357,316,354,304,289,102,351,355,
+       103,104,105,275,281,272,306,106,274,107,288,364,358,363,362,361,
+       291,108,381,290,287,292,279,305,280, 99,112,257,258,113,270,114,
+       118,117,125,374,379,259,260,261,262,263,264,265,266,267,268,269,
+       271,273,276,277,278,282,283,295,296,297,299,300,301,302,303,307,
+       308,310,313,314,315,317,318,319,320,321,322,323,324,325,326,330,
+       332,340,341,342,343,344,345,346,356,359,365,368,369,370,371,372 };
+
+static int emulate_raw(unsigned int keycode, int down)
+{
+       if (keycode > 255 || !x86_keycodes[keycode])
+               return -1; 
+
+       if (keycode == KEY_PAUSE) {
+               handle_scancode(0xe1, 1);
+               handle_scancode(0x1d, down);
+               handle_scancode(0x45, down);
+               return 0;
+       } 
+
+       if (keycode == KEY_SYSRQ && x86_sysrq_alt) {
+               handle_scancode(0x54, down);
+               return 0;
+       }
+
+       if (x86_keycodes[keycode] & 0x100)
+               handle_scancode(0xe0, 1);
 
-static unsigned char keybdev_x86_e0s[] = 
-       { 0x1c, 0x1d, 0x35, 0x2a, 0x38, 0x39, 0x47, 0x48,
-         0x49, 0x4b, 0x4d, 0x4f, 0x50, 0x51, 0x52, 0x53,
-         0x26, 0x25, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x00,
-         0x23, 0x24, 0x25, 0x26, 0x27 };
+       handle_scancode(x86_keycodes[keycode] & 0x7f, down);
 
-#elif CONFIG_ADB_KEYBOARD
+       if (keycode == KEY_SYSRQ) {
+               handle_scancode(0xe0, 1);
+               handle_scancode(0x37, down);
+       }
+
+       if (keycode == KEY_LEFTALT || keycode == KEY_RIGHTALT)
+               x86_sysrq_alt = down;
 
-static unsigned char keybdev_mac_codes[256] =
+       return 0;
+}
+
+#elif defined(CONFIG_ADB_KEYBOARD)
+
+static unsigned char mac_keycodes[128] =
        { 0, 53, 18, 19, 20, 21, 23, 22, 26, 28, 25, 29, 27, 24, 51, 48,
         12, 13, 14, 15, 17, 16, 32, 34, 31, 35, 33, 30, 36, 54,128,  1,
          2,  3,  5,  4, 38, 40, 37, 41, 39, 50, 56, 42,  6,  7,  8,  9,
@@ -56,10 +102,19 @@ static unsigned char keybdev_mac_codes[256] =
         76,125, 75,105,124,  0,115, 62,116, 59, 60,119, 61,121,114,117,
          0,  0,  0,  0,127, 81,  0,113,  0,  0,  0,  0,  0, 55, 55 };
 
+static int emulate_raw(unsigned int code, unsigned char upflag)
+{
+       if (keycode > 127 || !mac_keycodes[keycode])
+               return -1;
+
+       handle_scancode(mac_keycodes[keycode] & 0x7f, down);
+
+       return 0;
+}
+
 #endif
 
 static struct input_handler keybdev_handler;
-static int keybdev_alt = 0;
 
 void keybdev_ledfunc(unsigned int led)
 {
@@ -76,70 +131,30 @@ void keybdev_ledfunc(unsigned int led)
 
 void keybdev_event(struct input_handle *handle, unsigned int type, unsigned int code, int down)
 {
-       if (type != EV_KEY || code > 255) return;
+       if (type != EV_KEY) return;
 
-#if defined(CONFIG_X86) || defined(CONFIG_IA64)
-
-       if (code >= 189) {
-               printk(KERN_WARNING "keybdev.c: can't emulate keycode %d\n", code);
-               return; 
-       } else if (code >= 162) {
-               handle_scancode(0xe0, 1);
-               handle_scancode(code - 161, down);
-       } else if (code >= 125) {
-               handle_scancode(0xe0, 1);
-               handle_scancode(code - 34, down);
-       } else if (code == 119) {
-               handle_scancode(0xe1, 1);
-               handle_scancode(0x1d, down);
-               handle_scancode(0x45, down);
-       } else if (code >= 96) {
-               if (code == 99 && keybdev_alt) {
-                        handle_scancode(84, down);
-               } else {
-                       handle_scancode(0xe0, 1);
-                       handle_scancode(keybdev_x86_e0s[code - 96], down);
-                       if (code == 99) {
-                               handle_scancode(0xe0, 1);
-                               handle_scancode(0x37, down);
-                       }
-               }
-       } else if (code == 84) {
-               handle_scancode(43, down);
-       } else handle_scancode(code, down);
-
-       if (code == 56 || code == 100) keybdev_alt = down;
-
-#elif CONFIG_ADB_KEYBOARD
-
-       if (code < 128 && keybdev_mac_codes[code]) 
-               handle_scancode(keybdev_mac_codes[code] & 0x7f, down);
-       else
-               printk(KERN_WARNING "keybdev.c: can't emulate keycode %d\n", code);
-
-#else
-#error "Cannot generate rawmode keyboard for your architecture yet."
-#endif
+       if (emulate_raw(code, down))
+               printk(KERN_WARNING "keyboard.c: can't emulate rawmode for keycode %d\n", code);
 
        tasklet_schedule(&keyboard_tasklet);
 }
 
-static int keybdev_connect(struct input_handler *handler, struct input_dev *dev)
+static struct input_handle *keybdev_connect(struct input_handler *handler, struct input_dev *dev)
 {
        struct input_handle *handle;
        int i;
 
        if (!test_bit(EV_KEY, dev->evbit))
-               return -1;
+               return NULL;
 
        for (i = KEY_RESERVED; i < BTN_MISC; i++)
                if (test_bit(i, dev->keybit)) break;
 
        if (i == BTN_MISC)
-               return -1;
+               return NULL;
 
        if (!(handle = kmalloc(sizeof(struct input_handle), GFP_KERNEL)))
-               return -1;
+               return NULL;
        memset(handle, 0, sizeof(struct input_handle));
 
        handle->dev = dev;
@@ -149,15 +164,13 @@ static int keybdev_connect(struct input_handler *handler, struct input_dev *dev)
 
        printk("keybdev.c: Adding keyboard: input%d\n", dev->number);
 
-       return 0;
+       return handle;
 }
 
 static void keybdev_disconnect(struct input_handle *handle)
 {
        printk("keybdev.c: Removing keyboard: input%d\n", handle->dev->number);
-
        input_close_device(handle);
-
        kfree(handle);
 }
        
index 6b1eeb10e2022abcd428751e39c707be212cb397..765f61556d035b8f34d9542ff07ca4162a37b6e4 100644 (file)
@@ -30,6 +30,7 @@
 
 #define MOUSEDEV_MINOR_BASE    32
 #define MOUSEDEV_MINORS                32
+#define MOUSEDEV_MIX           31
 
 #include <linux/malloc.h>
 #include <linux/poll.h>
 
 struct mousedev {
        int used;
+       int open;
        int minor;
        wait_queue_head_t wait;
        struct mousedev_list *list;
+       struct input_handle handle;
        devfs_handle_t devfs;
 };
 
@@ -70,72 +73,80 @@ struct mousedev_list {
 static unsigned char mousedev_genius_seq[] = { 0xe8, 3, 0xe6, 0xe6, 0xe6 };
 static unsigned char mousedev_imps_seq[] = { 0xf3, 200, 0xf3, 100, 0xf3, 80 };
 
+static struct input_handler mousedev_handler;
+
 static struct mousedev *mousedev_table[MOUSEDEV_MINORS];
+static struct mousedev mousedev_mix;
 
 static void mousedev_event(struct input_handle *handle, unsigned int type, unsigned int code, int value)
 {
-       struct mousedev *mousedev = handle->private;
-       struct mousedev_list *list = mousedev->list;
+       struct mousedev *mousedevs[3] = { handle->private, &mousedev_mix, NULL };
+       struct mousedev **mousedev = mousedevs;
+       struct mousedev_list *list;
        int index, size;
 
-       while (list) {
-               switch (type) {
-                       case EV_ABS:
-                               switch (code) {
-                                       case ABS_X:     
-                                               size = handle->dev->absmax[ABS_X] - handle->dev->absmin[ABS_X];
-                                               list->dx += (value * CONFIG_MOUSEDEV_SCREEN_X - list->oldx) / size;
-                                               list->oldx += list->dx * size;
-                                               break;
-                                       case ABS_Y:
-                                               size = handle->dev->absmax[ABS_Y] - handle->dev->absmin[ABS_Y];
-                                               list->dy -= (value * CONFIG_MOUSEDEV_SCREEN_Y - list->oldy) / size;
-                                               list->oldy -= list->dy * size;
-                                               break;
-                               }
-                               break;
-                       case EV_REL:
-                               switch (code) {
-                                       case REL_X:     list->dx += value; break;
-                                       case REL_Y:     list->dy -= value; break;
-                                       case REL_WHEEL: if (list->mode) list->dz -= value; break;
-                               }
-                               break;
+       while (*mousedev) {
+               list = (*mousedev)->list;
+               while (list) {
+                       switch (type) {
+                               case EV_ABS:
+                                       switch (code) {
+                                               case ABS_X:     
+                                                       size = handle->dev->absmax[ABS_X] - handle->dev->absmin[ABS_X];
+                                                       list->dx += (value * CONFIG_MOUSEDEV_SCREEN_X - list->oldx) / size;
+                                                       list->oldx += list->dx * size;
+                                                       break;
+                                               case ABS_Y:
+                                                       size = handle->dev->absmax[ABS_Y] - handle->dev->absmin[ABS_Y];
+                                                       list->dy -= (value * CONFIG_MOUSEDEV_SCREEN_Y - list->oldy) / size;
+                                                       list->oldy -= list->dy * size;
+                                                       break;
+                                       }
+                                       break;
+                               case EV_REL:
+                                       switch (code) {
+                                               case REL_X:     list->dx += value; break;
+                                               case REL_Y:     list->dy -= value; break;
+                                               case REL_WHEEL: if (list->mode) list->dz -= value; break;
+                                       }
+                                       break;
+
+                               case EV_KEY:
+                                       switch (code) {
+                                               case BTN_0:
+                                               case BTN_TOUCH:
+                                               case BTN_LEFT:   index = 0; break;
+                                               case BTN_4:
+                                               case BTN_EXTRA:  if (list->mode > 1) { index = 4; break; }
+                                               case BTN_STYLUS:
+                                               case BTN_1:
+                                               case BTN_RIGHT:  index = 1; break;
+                                               case BTN_3:
+                                               case BTN_SIDE:   if (list->mode > 1) { index = 3; break; }
+                                               case BTN_2:
+                                               case BTN_STYLUS2:
+                                               case BTN_MIDDLE: index = 2; break;      
+                                               default: return;
+                                       }
+                                       switch (value) {
+                                               case 0: clear_bit(index, &list->buttons); break;
+                                               case 1: set_bit(index, &list->buttons); break;
+                                               case 2: return;
+                                       }
+                                       break;
+                       }
+                                       
+                       list->ready = 1;
 
-                       case EV_KEY:
-                               switch (code) {
-                                       case BTN_0:
-                                       case BTN_TOUCH:
-                                       case BTN_LEFT:   index = 0; break;
-                                       case BTN_4:
-                                       case BTN_EXTRA:  if (list->mode > 1) { index = 4; break; }
-                                       case BTN_STYLUS:
-                                       case BTN_1:
-                                       case BTN_RIGHT:  index = 1; break;
-                                       case BTN_3:
-                                       case BTN_SIDE:   if (list->mode > 1) { index = 3; break; }
-                                       case BTN_2:
-                                       case BTN_STYLUS2:
-                                       case BTN_MIDDLE: index = 2; break;      
-                                       default: return;
-                               }
-                               switch (value) {
-                                       case 0: clear_bit(index, &list->buttons); break;
-                                       case 1: set_bit(index, &list->buttons); break;
-                                       case 2: return;
-                               }
-                               break;
-               }
-                               
-               list->ready = 1;
+                       if (list->fasync)
+                               kill_fasync(list->fasync, SIGIO, POLL_IN);
 
-               if (list->fasync)
-                       kill_fasync(list->fasync, SIGIO, POLL_IN);
+                       list = list->next;
+               }
 
-               list = list->next;
+               wake_up_interruptible(&((*mousedev)->wait));
+               mousedev++;
        }
-
-       wake_up_interruptible(&mousedev->wait);
 }
 
 static int mousedev_fasync(int fd, struct file *file, int on)
@@ -156,6 +167,21 @@ static int mousedev_release(struct inode * inode, struct file * file)
        while (*listptr && (*listptr != list))
                listptr = &((*listptr)->next);
        *listptr = (*listptr)->next;
+
+       if (!--list->mousedev->open) {
+               if (list->mousedev->minor == MOUSEDEV_MIX) {
+                       struct input_handle *handle = mousedev_handler.handle;
+                       while (handle) {
+                               struct mousedev *mousedev = handle->private;
+                               if (!mousedev->open)
+                                       input_close_device(handle);
+                               handle = handle->hnext;
+                       }
+               } else {
+                       if (!mousedev_mix.open) 
+                               input_close_device(&list->mousedev->handle);
+               }
+       }
        
        if (!--list->mousedev->used) {
                input_unregister_minor(list->mousedev->devfs);
@@ -188,9 +214,24 @@ static int mousedev_open(struct inode * inode, struct file * file)
        list->mousedev = mousedev_table[i];
        list->next = mousedev_table[i]->list;
        mousedev_table[i]->list = list;
+       file->private_data = list;
+
        list->mousedev->used++;
 
-       file->private_data = list;
+       if (!list->mousedev->open++) {
+               if (list->mousedev->minor == MOUSEDEV_MIX) {
+                       struct input_handle *handle = mousedev_handler.handle;
+                       while (handle) {
+                               struct mousedev *mousedev = handle->private;
+                               if (!mousedev->open)
+                                       input_open_device(handle);
+                               handle = handle->hnext;
+                       }
+               } else {
+                       if (!mousedev_mix.open) 
+                               input_open_device(&list->mousedev->handle);
+               }
+       }
 
        return 0;
 }
@@ -342,63 +383,59 @@ struct file_operations mousedev_fops = {
        fasync:         mousedev_fasync,
 };
 
-static int mousedev_connect(struct input_handler *handler, struct input_dev *dev)
+static struct input_handle *mousedev_connect(struct input_handler *handler, struct input_dev *dev)
 {
        struct mousedev *mousedev;
-       struct input_handle *handle;
        int minor = 0;
 
        if (!test_bit(EV_KEY, dev->evbit) ||
           (!test_bit(BTN_LEFT, dev->keybit) && !test_bit(BTN_TOUCH, dev->keybit)))
-               return -1;
+               return NULL;
 
        if ((!test_bit(EV_REL, dev->evbit) || !test_bit(REL_X, dev->relbit)) &&
            (!test_bit(EV_ABS, dev->evbit) || !test_bit(ABS_X, dev->absbit)))
-               return -1;
+               return NULL;
 
-#ifndef CONFIG_INPUT_MOUSEDEV_MIX
        for (minor = 0; minor < MOUSEDEV_MINORS && mousedev_table[minor]; minor++);
        if (mousedev_table[minor]) {
                printk(KERN_ERR "mousedev: no more free mousedev devices\n");
-               return -1;
+               return NULL;
        }
 
        if (!(mousedev = kmalloc(sizeof(struct mousedev), GFP_KERNEL)))
-               return -1;
+               return NULL;
        memset(mousedev, 0, sizeof(struct mousedev));
        init_waitqueue_head(&mousedev->wait);
 
-       mousedev->devfs = input_register_minor("mouse%d", minor, MOUSEDEV_MINOR_BASE);
-#else
-       mousedev = mousedev_table[0];
-#endif
-
-       if (!(handle = kmalloc(sizeof(struct input_handle), GFP_KERNEL))) {
-               if (!mousedev->used) kfree(mousedev);
-               return -1;
-       }
-       memset(handle, 0, sizeof(struct input_handle));
-
-       mousedev->used++;
+       mousedev->used = 1;
        mousedev->minor = minor;
        mousedev_table[minor] = mousedev;
 
-       handle->dev = dev;
-       handle->handler = handler;
-       handle->private = mousedev;
+       mousedev->handle.dev = dev;
+       mousedev->handle.handler = handler;
+       mousedev->handle.private = mousedev;
+
+       mousedev->devfs = input_register_minor("mouse%d", minor, MOUSEDEV_MINOR_BASE);
 
-       input_open_device(handle);
+       if (mousedev_mix.open) {
+               input_open_device(&mousedev->handle);
+               mousedev_mix.open++;
+       }
 
        printk("mouse%d: PS/2 mouse device for input%d\n", minor, dev->number);
 
-       return 0;
+       return &mousedev->handle;
 }
 
 static void mousedev_disconnect(struct input_handle *handle)
 {
        struct mousedev *mousedev = handle->private;
-       input_close_device(handle);
-       kfree(handle);
+
+       if (mousedev->open || mousedev_mix.open) {
+               input_close_device(handle);
+               mousedev_mix.open--;
+       }
+
        if (!--mousedev->used) {
                input_unregister_minor(mousedev->devfs);
                mousedev_table[mousedev->minor] = NULL;
@@ -418,23 +455,21 @@ static int __init mousedev_init(void)
 {
        input_register_handler(&mousedev_handler);
 
-#ifdef CONFIG_INPUT_MOUSEDEV_MIX
-       if (!(mousedev_table[0] = kmalloc(sizeof(struct mousedev), GFP_KERNEL)))
-               return -1;
-       memset(mousedev_table[0], 0, sizeof(struct mousedev));
-       init_waitqueue_head(&mousedev_table[0]->wait);
-       mousedev_table[0]->devfs = input_register_minor("mouse%d", 0, MOUSEDEV_MINOR_BASE);
-       mousedev_table[0]->used = 1;
-#endif
+       memset(&mousedev_mix, 0, sizeof(struct mousedev));
+       init_waitqueue_head(&mousedev_mix.wait);
+       mousedev_table[MOUSEDEV_MIX] = &mousedev_mix;
+       mousedev_mix.used = 1;
+       mousedev_mix.minor = MOUSEDEV_MIX;
+       mousedev_mix.devfs = input_register_minor("mice", MOUSEDEV_MIX, MOUSEDEV_MINOR_BASE);
+
+       printk("mice: PS/2 mouse device common for all mice\n");
+
        return 0;
 }
 
 static void __exit mousedev_exit(void)
 {
-#ifdef CONFIG_INPUT_MOUSEDEV_MIX
-       input_unregister_minor(mousedev_table[0]->devfs);
-       kfree(mousedev_table[0]);
-#endif
+       input_unregister_minor(mousedev_mix.devfs);
        input_unregister_handler(&mousedev_handler);
 }
 
index c00fdd2df4811a87c78a87382b8e78cf9998bb73..d16a65725a740d79c63a8dc00feee15021f00cb0 100644 (file)
@@ -16,7 +16,7 @@
 #include <linux/usb.h>
 
 
-static const char *version = __FILE__ ": v0.3.8 2000/04/04 Written by Petko Manolov (petkan@spct.net)\n";
+static const char *version = __FILE__ ": v0.3.9 2000/04/11 Written by Petko Manolov (petkan@spct.net)\n";
 
 
 #define        PEGASUS_MTU             1500
@@ -178,8 +178,9 @@ static int pegasus_start_net(struct net_device *dev, struct usb_device *usb)
                return 2;
 
        if ((~temp & 4) && !loopback) {
-               err("link NOT established - %x", temp);
-               return 3;
+               warn("%s: link NOT established (0x%x), check the cable.",
+                       dev->name, temp);
+               /* return 3; FIXME */
        }
 
        if (pegasus_read_phy_word(usb, 5, &partmedia))
@@ -384,7 +385,7 @@ static void pegasus_set_rx_mode(struct net_device *net)
 
        if (net->flags & IFF_PROMISC) {
                info("%s: Promiscuous mode enabled", net->name);
-               pegasus_set_register(pegasus->usb, 2, 0x04);
+/*             pegasus_set_register(pegasus->usb, 2, 0x04); FIXME */
        } else if ((net->mc_count > multicast_filter_limit) ||
                        (net->flags & IFF_ALLMULTI)) {
                pegasus_set_register(pegasus->usb, 0, 0xfa);
@@ -407,7 +408,7 @@ static int check_device_ids( __u16 vendor, __u16 product )
                        return i;
                i++;
        }
-       return  0;
+       return  -1;
 }
 
 static void * pegasus_probe(struct usb_device *dev, unsigned int ifnum)
@@ -416,7 +417,7 @@ static void * pegasus_probe(struct usb_device *dev, unsigned int ifnum)
        struct pegasus *pegasus;
        int     dev_indx;
 
-       if ( !(dev_indx = check_device_ids(dev->descriptor.idVendor, dev->descriptor.idProduct)) ) {
+       if ( (dev_indx = check_device_ids(dev->descriptor.idVendor, dev->descriptor.idProduct)) == -1 ) {
                return NULL;
        }
 
@@ -459,7 +460,7 @@ static void * pegasus_probe(struct usb_device *dev, unsigned int ifnum)
        FILL_BULK_URB(&pegasus->tx_urb, dev, usb_sndbulkpipe(dev, 2),
                        pegasus->tx_buff, PEGASUS_MAX_MTU, pegasus_write_bulk,
                        pegasus);
-       FILL_INT_URB(&pegasus->intr_urb, dev, usb_rcvintpipe(dev, 0),
+       FILL_INT_URB(&pegasus->intr_urb, dev, usb_rcvintpipe(dev, 3),
                        pegasus->intr_buff, 8, pegasus_irq, pegasus, 250);
 
 
index b4f08b2d722036a8f4c5ff2cb8d4eb475d237a09..3c69e4c1c11e7041ced90b97cc35198738e3c5ac 100644 (file)
@@ -27,6 +27,8 @@ while (<STDIN>) {
     push(@records, [$addr, \@bytes]);
 }
 
+@sorted_records = sort { $a->[0] <=> $b->[0] } @records;
+
 print <<"EOF";
 /*
  * ${basename}_fw.h
@@ -39,7 +41,7 @@ print <<"EOF";
 EOF
 
 print "static const struct ezusb_hex_record ${basename}_firmware[] = {\n";
-foreach $r (@records) {
+foreach $r (@sorted_records) {
     printf("{ 0x%04x,\t%d,\t{", $r->[0], scalar(@{$r->[1]}));
     print join(", ", map {sprintf('0x%02x', $_);} @{$r->[1]});
     print "} },\n";
index e434624e53c81c6a8e7ed161dd2e551d8fcbaa2b..aa6c14b0b8e323d1c8fcd064d95521a4bc3052d0 100644 (file)
@@ -43,7 +43,7 @@
 
 #include "usb-serial.h"
 
-#include "whiteheat.h"         /* firmware for the ConnectTech WhiteHEAT device */
+#include "whiteheat_fw.h"              /* firmware for the ConnectTech WhiteHEAT device */
 
 
 #define CONNECT_TECH_VENDOR_ID         0x0710
@@ -217,7 +217,7 @@ static int  whiteheat_startup (struct usb_serial *serial)
        }
        while (record->address != 0xffff) {
                response = ezusb_writememory (serial, record->address, 
-                               (unsigned char *)record->data, record->data_size, 0xa0);
+                               (unsigned char *)record->data, record->data_size, 0xa3);
                if (response < 0) {
                        err("ezusb_writememory failed for first firmware step (%d %04X %p %d)", 
                                response, record->address, record->data, record->data_size);
diff --git a/drivers/usb/serial/whiteheat.h b/drivers/usb/serial/whiteheat.h
deleted file mode 100644 (file)
index d7053e3..0000000
+++ /dev/null
@@ -1,1542 +0,0 @@
-/*****************************************************************************
- *
- *      whiteheat.h  --  ConnectTech WhiteHEAT Firmware.
- *
- *      Copyright (C) 2000  ConnectTech Inc (http://www.connecttech.com/)
- *
- *      This program is free software; you can redistribute it and/or modify
- *      it under the terms of the GNU General Public License as published by
- *      the Free Software Foundation; either version 2 of the License, or
- *      (at your option) any later version.
- *
- *      This program is distributed in the hope that it will be useful,
- *      but WITHOUT ANY WARRANTY; without even the implied warranty of
- *      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *      GNU General Public License for more details.
- *
- *      You should have received a copy of the GNU General Public License
- *      along with this program; if not, write to the Free Software
- *      Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- *
- * (01/16/2000) gkh
- *     Fixed my intel hex processing tool, so now the firmware actually
- *     matches the original file (this was causing a few problems...)
- *
- * (01/15/2000) gkh
- *     Added debug loader firmware if DEBUG is #defined:
- *             Port 1 LED flashes when the vend_ax program is running
- *             Port 2 LED flashes when any SETUP command arrives
- *             Port 3 LED flashes when any valid VENDOR request occurs
- *             Port 4 LED flashes when the EXTERNAL RAM DOWNLOAD request occurs
- *
- * version 1.0 (01/09/2000) gkh
- *     Original firmware from ConnectTech massaged a little to be program
- *     readable.
- *
- *****************************************************************************/
-
-#define whiteheat_DATE "20000106"
-
-struct whiteheat_hex_record {
-       __u16   address;
-       __u8    data_size;
-       __u8    data[16];
-};
-
-static const struct whiteheat_hex_record whiteheat_firmware[] = {
-{ 0x0000,      3,      {0x02, 0x91, 0xc9} },
-{ 0x0003,      3,      {0x02, 0x13, 0x12} },
-{ 0x000b,      3,      {0x02, 0x0a, 0x8d} },
-{ 0x0033,      3,      {0x02, 0x07, 0x84} },
-{ 0x0043,      3,      {0x02, 0x09, 0x00} },
-{ 0x0053,      3,      {0x02, 0x0f, 0x6e} },
-{ 0x005b,      3,      {0x02, 0x11, 0xb9} },
-{ 0x0300,      16,     {0x90, 0x7f, 0xe9, 0xe0, 0x70, 0x03, 0x02, 0x04, 0x03, 0x14, 0x70, 0x03, 0x02, 0x04, 0x77, 0x24} },
-{ 0x0310,      16,     {0xfe, 0x70, 0x03, 0x02, 0x04, 0xca, 0x24, 0xfb, 0x70, 0x03, 0x02, 0x03, 0xf4, 0x14, 0x70, 0x03} },
-{ 0x0320,      16,     {0x02, 0x03, 0xe2, 0x14, 0x70, 0x03, 0x02, 0x03, 0xca, 0x14, 0x70, 0x03, 0x02, 0x03, 0xd9, 0x24} },
-{ 0x0330,      16,     {0x05, 0x60, 0x03, 0x02, 0x05, 0x19, 0x90, 0x7f, 0xeb, 0xe0, 0x24, 0xfe, 0x60, 0x16, 0x14, 0x60} },
-{ 0x0340,      16,     {0x36, 0x24, 0x02, 0x70, 0x7b, 0x74, 0x12, 0x90, 0x7f, 0xd4, 0xf0, 0x74, 0x00, 0x90, 0x7f, 0xd5} },
-{ 0x0350,      16,     {0xf0, 0x02, 0x05, 0x20, 0x90, 0x7f, 0xea, 0xe0, 0xff, 0x12, 0x09, 0x58, 0xea, 0x49, 0x60, 0x0d} },
-{ 0x0360,      16,     {0xea, 0x90, 0x7f, 0xd4, 0xf0, 0xe9, 0x90, 0x7f, 0xd5, 0xf0, 0x02, 0x05, 0x20, 0x90, 0x7f, 0xb4} },
-{ 0x0370,      16,     {0xe0, 0x44, 0x01, 0xf0, 0x02, 0x05, 0x20, 0x90, 0x7f, 0xea, 0xe0, 0xff, 0x12, 0x08, 0xa9, 0xea} },
-{ 0x0380,      16,     {0x49, 0x60, 0x33, 0x12, 0x9a, 0x48, 0xf5, 0x5e, 0x90, 0x7f, 0xee, 0xe0, 0xff, 0xe5, 0x5e, 0xd3} },
-{ 0x0390,      16,     {0x9f, 0x40, 0x03, 0xe0, 0xf5, 0x5e, 0xe5, 0x5e, 0xd3, 0x94, 0x40, 0x40, 0x03, 0x75, 0x5e, 0x40} },
-{ 0x03a0,      16,     {0xae, 0x02, 0xaf, 0x01, 0x7c, 0x7f, 0x7d, 0x00, 0xab, 0x5e, 0x12, 0x1b, 0x0c, 0x90, 0x7f, 0xb5} },
-{ 0x03b0,      16,     {0xe5, 0x5e, 0xf0, 0x02, 0x05, 0x20, 0x90, 0x7f, 0xb4, 0xe0, 0x44, 0x01, 0xf0, 0x02, 0x05, 0x20} },
-{ 0x03c0,      16,     {0x90, 0x7f, 0xb4, 0xe0, 0x44, 0x01, 0xf0, 0x02, 0x05, 0x20, 0x90, 0x7f, 0x00, 0xe5, 0x21, 0xf0} },
-{ 0x03d0,      16,     {0x90, 0x7f, 0xb5, 0x74, 0x01, 0xf0, 0x02, 0x05, 0x20, 0x90, 0x7f, 0xea, 0xe0, 0xf5, 0x21, 0x02} },
-{ 0x03e0,      16,     {0x05, 0x20, 0x90, 0x7f, 0xea, 0xe0, 0xf5, 0x31, 0xd2, 0x02, 0x43, 0x88, 0x10, 0xd2, 0xeb, 0xd2} },
-{ 0x03f0,      16,     {0xa8, 0x02, 0x05, 0x20, 0x90, 0x7f, 0x00, 0xe5, 0x31, 0xf0, 0x90, 0x7f, 0xb5, 0x74, 0x01, 0xf0} },
-{ 0x0400,      16,     {0x02, 0x05, 0x20, 0x90, 0x7f, 0xe8, 0xe0, 0x24, 0x7f, 0x60, 0x24, 0x14, 0x60, 0x31, 0x24, 0x02} },
-{ 0x0410,      16,     {0x70, 0x5b, 0xa2, 0x00, 0xe4, 0x33, 0xff, 0x25, 0xe0, 0xff, 0xa2, 0x05, 0xe4, 0x33, 0x4f, 0x90} },
-{ 0x0420,      16,     {0x7f, 0x00, 0xf0, 0xe4, 0xa3, 0xf0, 0x90, 0x7f, 0xb5, 0x74, 0x02, 0xf0, 0x02, 0x05, 0x20, 0xe4} },
-{ 0x0430,      16,     {0x90, 0x7f, 0x00, 0xf0, 0xa3, 0xf0, 0x90, 0x7f, 0xb5, 0x74, 0x02, 0xf0, 0x02, 0x05, 0x20, 0x90} },
-{ 0x0440,      16,     {0x7f, 0xec, 0xe0, 0xf4, 0x54, 0x80, 0xff, 0xc4, 0x54, 0x0f, 0xff, 0xe0, 0x54, 0x07, 0x2f, 0x25} },
-{ 0x0450,      16,     {0xe0, 0x24, 0xb4, 0xf5, 0x82, 0xe4, 0x34, 0x7f, 0xf5, 0x83, 0xe0, 0x54, 0x01, 0x90, 0x7f, 0x00} },
-{ 0x0460,      16,     {0xf0, 0xe4, 0xa3, 0xf0, 0x90, 0x7f, 0xb5, 0x74, 0x02, 0xf0, 0x02, 0x05, 0x20, 0x90, 0x7f, 0xb4} },
-{ 0x0470,      16,     {0xe0, 0x44, 0x01, 0xf0, 0x02, 0x05, 0x20, 0x90, 0x7f, 0xe8, 0xe0, 0x24, 0xfe, 0x60, 0x1d, 0x24} },
-{ 0x0480,      16,     {0x02, 0x60, 0x03, 0x02, 0x05, 0x20, 0x90, 0x7f, 0xea, 0xe0, 0xb4, 0x01, 0x05, 0xc2, 0x00, 0x02} },
-{ 0x0490,      16,     {0x05, 0x20, 0x90, 0x7f, 0xb4, 0xe0, 0x44, 0x01, 0xf0, 0x02, 0x05, 0x20, 0x90, 0x7f, 0xea, 0xe0} },
-{ 0x04a0,      16,     {0x70, 0x1f, 0x90, 0x7f, 0xec, 0xe0, 0xf4, 0x54, 0x80, 0xff, 0xc4, 0x54, 0x0f, 0xff, 0xe0, 0x54} },
-{ 0x04b0,      16,     {0x07, 0x2f, 0x25, 0xe0, 0x24, 0xb4, 0xf5, 0x82, 0xe4, 0x34, 0x7f, 0xf5, 0x83, 0xe4, 0xf0, 0x80} },
-{ 0x04c0,      16,     {0x5f, 0x90, 0x7f, 0xb4, 0xe0, 0x44, 0x01, 0xf0, 0x80, 0x56, 0x90, 0x7f, 0xe8, 0xe0, 0x24, 0xfe} },
-{ 0x04d0,      16,     {0x60, 0x18, 0x24, 0x02, 0x70, 0x4a, 0x90, 0x7f, 0xea, 0xe0, 0xb4, 0x01, 0x04, 0xd2, 0x00, 0x80} },
-{ 0x04e0,      16,     {0x3f, 0x90, 0x7f, 0xb4, 0xe0, 0x44, 0x01, 0xf0, 0x80, 0x36, 0x90, 0x7f, 0xea, 0xe0, 0x70, 0x20} },
-{ 0x04f0,      16,     {0x90, 0x7f, 0xec, 0xe0, 0xf4, 0x54, 0x80, 0xff, 0xc4, 0x54, 0x0f, 0xff, 0xe0, 0x54, 0x07, 0x2f} },
-{ 0x0500,      16,     {0x25, 0xe0, 0x24, 0xb4, 0xf5, 0x82, 0xe4, 0x34, 0x7f, 0xf5, 0x83, 0x74, 0x01, 0xf0, 0x80, 0x10} },
-{ 0x0510,      16,     {0x90, 0x7f, 0xb4, 0xe0, 0x44, 0x01, 0xf0, 0x80, 0x07, 0x90, 0x7f, 0xb4, 0xe0, 0x44, 0x01, 0xf0} },
-{ 0x0520,      7,      {0x90, 0x7f, 0xb4, 0xe0, 0x44, 0x02, 0xf0} },
-{ 0x0527,      1,      {0x22} },
-{ 0x0528,      16,     {0x75, 0x5a, 0xff, 0x75, 0x59, 0xff, 0x75, 0x58, 0x0f, 0x75, 0x57, 0x00, 0xd2, 0x03, 0xc2, 0x06} },
-{ 0x0538,      16,     {0xc2, 0x02, 0xc2, 0x00, 0xc2, 0x05, 0xc2, 0x01, 0x90, 0x02, 0x9e, 0x74, 0x19, 0xf0, 0xe4, 0x90} },
-{ 0x0548,      16,     {0x01, 0x5b, 0xf0, 0xc2, 0x04, 0x90, 0x01, 0x5e, 0xf0, 0xa3, 0xf0, 0xc2, 0xaf, 0xc2, 0xa8, 0x12} },
-{ 0x0558,      16,     {0x0a, 0xfa, 0xe4, 0x90, 0x02, 0x4d, 0xf0, 0x90, 0x01, 0x00, 0xf0, 0xa3, 0xf0, 0xa3, 0xf0, 0xa3} },
-{ 0x0568,      16,     {0xf0, 0xa3, 0xf0, 0xa3, 0x74, 0x10, 0xf0, 0xa3, 0x74, 0x01, 0xf0, 0xa3, 0x74, 0x08, 0xf0, 0x7e} },
-{ 0x0578,      16,     {0x01, 0x7f, 0x00, 0x12, 0x19, 0xc1, 0x75, 0x5c, 0x12, 0x75, 0x5d, 0x0a, 0x90, 0x01, 0x0b, 0xe0} },
-{ 0x0588,      16,     {0xff, 0x05, 0x5d, 0xe5, 0x5d, 0xac, 0x5c, 0x70, 0x02, 0x05, 0x5c, 0x14, 0xf5, 0x82, 0x8c, 0x83} },
-{ 0x0598,      16,     {0xef, 0xf0, 0x90, 0x01, 0x0c, 0xe0, 0x44, 0x80, 0xff, 0x05, 0x5d, 0xe5, 0x5d, 0xac, 0x5c, 0x70} },
-{ 0x05a8,      16,     {0x02, 0x05, 0x5c, 0x14, 0xf5, 0x82, 0x8c, 0x83, 0xef, 0xf0, 0x90, 0x01, 0x0d, 0xe0, 0xff, 0x05} },
-{ 0x05b8,      16,     {0x5d, 0xe5, 0x5d, 0xac, 0x5c, 0x70, 0x02, 0x05, 0x5c, 0x14, 0xf5, 0x82, 0x8c, 0x83, 0xef, 0xf0} },
-{ 0x05c8,      16,     {0x90, 0x01, 0x0e, 0xe0, 0xff, 0x05, 0x5d, 0xe5, 0x5d, 0xac, 0x5c, 0x70, 0x02, 0x05, 0x5c, 0x14} },
-{ 0x05d8,      16,     {0xf5, 0x82, 0x8c, 0x83, 0xef, 0xf0, 0x90, 0x12, 0x0a, 0xe4, 0x93, 0xff, 0x74, 0x01, 0x93, 0x90} },
-{ 0x05e8,      16,     {0x01, 0x1c, 0xcf, 0xf0, 0xa3, 0xef, 0xf0, 0x90, 0x01, 0x1c, 0xe0, 0xff, 0xa3, 0xe0, 0xfe, 0xef} },
-{ 0x05f8,      16,     {0x6e, 0xff, 0x90, 0x01, 0x1c, 0xf0, 0xa3, 0xe0, 0x6f, 0xff, 0xf0, 0x90, 0x01, 0x1c, 0xe0, 0x6f} },
-{ 0x0608,      16,     {0xf0, 0xe0, 0xfe, 0xa3, 0xe0, 0xff, 0xe4, 0xfc, 0xfd, 0x75, 0x62, 0x10, 0x75, 0x63, 0x02, 0x75} },
-{ 0x0618,      16,     {0x64, 0x12, 0x75, 0x65, 0xac, 0x12, 0x8e, 0x35, 0x75, 0x5c, 0x12, 0x75, 0x5d, 0xb2, 0x90, 0x01} },
-{ 0x0628,      16,     {0x0d, 0xe0, 0xff, 0x05, 0x5d, 0xe5, 0x5d, 0xac, 0x5c, 0x70, 0x02, 0x05, 0x5c, 0x14, 0xf5, 0x82} },
-{ 0x0638,      16,     {0x8c, 0x83, 0xef, 0xf0, 0x90, 0x01, 0x0e, 0xe0, 0xff, 0x05, 0x5d, 0xe5, 0x5d, 0xac, 0x5c, 0x70} },
-{ 0x0648,      16,     {0x02, 0x05, 0x5c, 0x14, 0xf5, 0x82, 0x8c, 0x83, 0xef, 0xf0, 0x90, 0x7f, 0x92, 0xe0, 0xff, 0xc4} },
-{ 0x0658,      16,     {0x54, 0x0f, 0x24, 0x41, 0xff, 0x05, 0x5d, 0xe5, 0x5d, 0xac, 0x5c, 0x70, 0x02, 0x05, 0x5c, 0x14} },
-{ 0x0668,      16,     {0xf5, 0x82, 0x8c, 0x83, 0xef, 0xf0, 0x05, 0x5d, 0xe5, 0x5d, 0xae, 0x5c, 0x70, 0x02, 0x05, 0x5c} },
-{ 0x0678,      16,     {0x14, 0xf5, 0x82, 0x8e, 0x83, 0xe4, 0xf0, 0x75, 0x82, 0x10, 0x75, 0x83, 0x01, 0xe0, 0xfc, 0xa3} },
-{ 0x0688,      16,     {0xe0, 0xfd, 0xa3, 0xe0, 0xfe, 0xa3, 0xe0, 0xff, 0x90, 0x01, 0x18, 0x12, 0x9b, 0xfb, 0x7e, 0x01} },
-{ 0x0698,      16,     {0x7f, 0x18, 0x12, 0x84, 0x61, 0x90, 0x01, 0x18, 0xe0, 0xfc, 0xa3, 0xe0, 0xfd, 0xa3, 0xe0, 0xfe} },
-{ 0x06a8,      16,     {0xa3, 0xe0, 0xff, 0x75, 0x62, 0x0a, 0x75, 0x63, 0x06, 0x75, 0x64, 0x12, 0x75, 0x65, 0xb8, 0x12} },
-{ 0x06b8,      16,     {0x8e, 0x35, 0xd2, 0xe8, 0x43, 0xd8, 0x20, 0x90, 0x7f, 0xab, 0x74, 0xff, 0xf0, 0x53, 0x91, 0xef} },
-{ 0x06c8,      16,     {0x90, 0x7f, 0xaf, 0xe0, 0x44, 0x01, 0xf0, 0x90, 0x7f, 0xae, 0xe0, 0x44, 0x1f, 0xf0, 0xd2, 0xaf} },
-{ 0x06d8,      16,     {0x20, 0x01, 0x2e, 0x20, 0x01, 0x2b, 0xa2, 0x03, 0x92, 0x07, 0x12, 0x09, 0xa7, 0x75, 0x56, 0x50} },
-{ 0x06e8,      16,     {0x75, 0x55, 0x6d, 0x75, 0x54, 0x33, 0x75, 0x53, 0x00, 0x20, 0x01, 0xe4, 0x7f, 0xff, 0x7e, 0xff} },
-{ 0x06f8,      16,     {0x7d, 0xff, 0x7c, 0xff, 0x78, 0x53, 0x12, 0x9b, 0xe4, 0xec, 0x4d, 0x4e, 0x4f, 0x60, 0xd1, 0x80} },
-{ 0x0708,      16,     {0xe8, 0x30, 0x01, 0x05, 0x12, 0x03, 0x00, 0xc2, 0x01, 0x30, 0x06, 0x0d, 0x12, 0x08, 0xfb, 0x50} },
-{ 0x0718,      16,     {0x06, 0x12, 0x0a, 0x00, 0x12, 0x09, 0xf4, 0xc2, 0x06, 0x12, 0x90, 0x58, 0x12, 0x98, 0x7d, 0xe4} },
-{ 0x0728,      16,     {0xff, 0x74, 0x01, 0xa8, 0x07, 0x08, 0x80, 0x02, 0xc3, 0x33, 0xd8, 0xfc, 0xfe, 0x90, 0x01, 0x5b} },
-{ 0x0738,      16,     {0xe0, 0x5e, 0x60, 0x14, 0x74, 0x27, 0x2f, 0xf8, 0xe6, 0xd3, 0x94, 0x0a, 0x40, 0x04, 0x7e, 0x01} },
-{ 0x0748,      16,     {0x80, 0x02, 0x7e, 0x00, 0x8e, 0x5b, 0x80, 0x03, 0x75, 0x5b, 0x01, 0x74, 0x68, 0x2f, 0xf5, 0x82} },
-{ 0x0758,      16,     {0xe4, 0x34, 0x20, 0xf5, 0x83, 0xe5, 0x5b, 0xf0, 0x0f, 0xbf, 0x04, 0xc5, 0xe5, 0x2b, 0xd3, 0x94} },
-{ 0x0768,      16,     {0x0a, 0x40, 0x04, 0x7f, 0x01, 0x80, 0x02, 0x7f, 0x00, 0x90, 0x20, 0x6c, 0xef, 0xf0, 0x90, 0x02} },
-{ 0x0778,      11,     {0x4d, 0xe0, 0x64, 0x0f, 0x70, 0x8b, 0x12, 0x93, 0x50, 0x80, 0x86} },
-{ 0x0783,      1,      {0x22} },
-{ 0x0784,      4,      {0x53, 0xd8, 0xef, 0x32} },
-{ 0x0788,      16,     {0xe4, 0x90, 0x7f, 0x9c, 0xf0, 0x7f, 0x0a, 0xfe, 0x12, 0x08, 0x92, 0x90, 0x7f, 0x96, 0x74, 0x89} },
-{ 0x0798,      16,     {0xf0, 0x90, 0x7f, 0x9c, 0x74, 0xcf, 0xf0, 0x7f, 0xf4, 0x7e, 0x01, 0x12, 0x08, 0x92, 0x90, 0x7f} },
-{ 0x07a8,      16,     {0x96, 0xe0, 0x54, 0xfe, 0xf0, 0x7f, 0x0a, 0x7e, 0x00, 0x12, 0x08, 0x92, 0x7f, 0x02, 0x7d, 0xff} },
-{ 0x07b8,      16,     {0x12, 0x11, 0x4b, 0x7f, 0x05, 0x7e, 0x00, 0x12, 0x08, 0x92, 0x90, 0x7f, 0x96, 0xe0, 0x44, 0x02} },
-{ 0x07c8,      16,     {0xf0, 0xe0, 0x54, 0x7f, 0xf0, 0x7f, 0x05, 0x7e, 0x00, 0x12, 0x08, 0x92, 0x90, 0x7f, 0x96, 0xe0} },
-{ 0x07d8,      16,     {0x44, 0x40, 0xf0, 0x7f, 0x05, 0x7e, 0x00, 0x12, 0x08, 0x92, 0x90, 0x7f, 0x96, 0xe0, 0x54, 0xbf} },
-{ 0x07e8,      16,     {0xf0, 0x7f, 0x32, 0x7e, 0x00, 0x12, 0x08, 0x92, 0x90, 0x7f, 0x96, 0xe0, 0x44, 0x40, 0xf0, 0x7f} },
-{ 0x07f8,      7,      {0x32, 0x7e, 0x00, 0x12, 0x08, 0x92, 0x22} },
-{ 0x07ff,      16,     {0x90, 0x7f, 0x96, 0xe0, 0x54, 0xfd, 0xf0, 0xe0, 0x44, 0x80, 0xf0, 0x7f, 0x0a, 0x7e, 0x00, 0x12} },
-{ 0x080f,      16,     {0x08, 0x92, 0x7f, 0x02, 0xe4, 0xfd, 0x12, 0x11, 0x4b, 0x7f, 0x05, 0x7e, 0x00, 0x12, 0x08, 0x92} },
-{ 0x081f,      16,     {0x90, 0x7f, 0x96, 0xe0, 0x54, 0xbf, 0xf0, 0x7f, 0x05, 0x7e, 0x00, 0x12, 0x08, 0x92, 0x90, 0x7f} },
-{ 0x082f,      16,     {0x96, 0xe0, 0x44, 0x04, 0xf0, 0x7f, 0x05, 0x7e, 0x00, 0x12, 0x08, 0x92, 0x90, 0x7f, 0x96, 0xe0} },
-{ 0x083f,      16,     {0x54, 0xf7, 0xf0, 0x7f, 0x05, 0x7e, 0x00, 0x12, 0x08, 0x92, 0x90, 0x7f, 0x96, 0xe0, 0x44, 0x01} },
-{ 0x084f,      12,     {0xf0, 0x7f, 0x05, 0x7e, 0x00, 0x12, 0x08, 0x92, 0x12, 0x0a, 0x00, 0x22} },
-{ 0x085b,      16,     {0x90, 0x11, 0xef, 0xe4, 0x93, 0x70, 0x2f, 0x90, 0x7f, 0x93, 0x74, 0x30, 0xf0, 0x90, 0x7f, 0x94} },
-{ 0x086b,      16,     {0x74, 0x3c, 0xf0, 0x90, 0x7f, 0x95, 0x74, 0xc6, 0xf0, 0xe4, 0x90, 0x7f, 0x97, 0xf0, 0x90, 0x7f} },
-{ 0x087b,      16,     {0x9d, 0x74, 0x02, 0xf0, 0x90, 0x7f, 0xe2, 0x74, 0x12, 0xf0, 0x12, 0x07, 0x88, 0x75, 0x82, 0xef} },
-{ 0x088b,      7,      {0x75, 0x83, 0x11, 0x74, 0xff, 0xf0, 0x22} },
-{ 0x0892,      16,     {0x8e, 0x6d, 0x8f, 0x6e, 0xe5, 0x6e, 0x15, 0x6e, 0xae, 0x6d, 0x70, 0x02, 0x15, 0x6d, 0x4e, 0x60} },
-{ 0x08a2,      7,      {0x05, 0x12, 0x08, 0xea, 0x80, 0xee, 0x22} },
-{ 0x08a9,      2,      {0x8f, 0x5f} },
-{ 0x08ab,      16,     {0xe4, 0xf5, 0x60, 0x75, 0x61, 0xff, 0x75, 0x62, 0x12, 0x75, 0x63, 0x6a, 0xab, 0x61, 0xaa, 0x62} },
-{ 0x08bb,      16,     {0xa9, 0x63, 0x90, 0x00, 0x01, 0x12, 0x9a, 0x61, 0xb4, 0x03, 0x1d, 0xaf, 0x60, 0x05, 0x60, 0xef} },
-{ 0x08cb,      16,     {0xb5, 0x5f, 0x01, 0x22, 0x12, 0x9a, 0x48, 0x7e, 0x00, 0x29, 0xff, 0xee, 0x3a, 0xa9, 0x07, 0x75} },
-{ 0x08db,      14,     {0x61, 0xff, 0xf5, 0x62, 0x89, 0x63, 0x80, 0xd4, 0x7b, 0x00, 0x7a, 0x00, 0x79, 0x00} },
-{ 0x08e9,      1,      {0x22} },
-{ 0x08ea,      16,     {0x74, 0x00, 0xf5, 0x86, 0x90, 0xfd, 0xa5, 0x7c, 0x05, 0xa3, 0xe5, 0x82, 0x45, 0x83, 0x70, 0xf9} },
-{ 0x08fa,      1,      {0x22} },
-{ 0x08fb,      5,      {0x12, 0x07, 0xff, 0xd3, 0x22} },
-{ 0x0900,      16,     {0x02, 0x0b, 0x17, 0x00, 0x02, 0x0b, 0x4a, 0x00, 0x02, 0x0b, 0x2f, 0x00, 0x02, 0x0b, 0x89, 0x00} },
-{ 0x0910,      16,     {0x02, 0x0b, 0x73, 0x00, 0x02, 0x09, 0xf9, 0x00, 0x02, 0x09, 0xfa, 0x00, 0x02, 0x09, 0xfb, 0x00} },
-{ 0x0920,      16,     {0x02, 0x0b, 0xa4, 0x00, 0x02, 0x0c, 0x78, 0x00, 0x02, 0x0b, 0xd9, 0x00, 0x02, 0x0c, 0xc5, 0x00} },
-{ 0x0930,      16,     {0x02, 0x0c, 0x0e, 0x00, 0x02, 0x0d, 0x12, 0x00, 0x02, 0x0c, 0x43, 0x00, 0x02, 0x0d, 0x5f, 0x00} },
-{ 0x0940,      16,     {0x02, 0x09, 0xfc, 0x00, 0x02, 0x09, 0xfe, 0x00, 0x02, 0x09, 0xfd, 0x00, 0x02, 0x09, 0xff, 0x00} },
-{ 0x0950,      8,      {0x02, 0x0d, 0xac, 0x00, 0x02, 0x0d, 0xc2, 0x00} },
-{ 0x0958,      16,     {0xe4, 0xfe, 0x75, 0x61, 0xff, 0x75, 0x62, 0x12, 0x75, 0x63, 0x12, 0xab, 0x61, 0xaa, 0x62, 0xa9} },
-{ 0x0968,      16,     {0x63, 0x90, 0x00, 0x01, 0x12, 0x9a, 0x61, 0x64, 0x02, 0x70, 0x2d, 0xad, 0x06, 0x0e, 0xed, 0xb5} },
-{ 0x0978,      16,     {0x07, 0x01, 0x22, 0x90, 0x00, 0x02, 0x12, 0x9a, 0xba, 0x85, 0xf0, 0x5f, 0xf5, 0x60, 0x62, 0x5f} },
-{ 0x0988,      16,     {0xe5, 0x5f, 0x62, 0x60, 0xe5, 0x60, 0x62, 0x5f, 0x29, 0xfd, 0xe5, 0x5f, 0x3a, 0xa9, 0x05, 0x75} },
-{ 0x0998,      14,     {0x61, 0xff, 0xf5, 0x62, 0x89, 0x63, 0x80, 0xc3, 0x7b, 0x00, 0x7a, 0x00, 0x79, 0x00} },
-{ 0x09a6,      1,      {0x22} },
-{ 0x09a7,      16,     {0x90, 0x7f, 0xd6, 0xe0, 0x54, 0xfb, 0xf0, 0xe0, 0x44, 0x08, 0xf0, 0x30, 0x07, 0x04, 0xe0, 0x44} },
-{ 0x09b7,      16,     {0x02, 0xf0, 0x7f, 0xd0, 0x7e, 0x07, 0x12, 0x08, 0x92, 0x90, 0x7f, 0xd6, 0xe0, 0x54, 0xf7, 0xf0} },
-{ 0x09c7,      5,      {0xe0, 0x44, 0x04, 0xf0, 0x22} },
-{ 0x09cc,      16,     {0x53, 0x8e, 0xf7, 0xe5, 0x89, 0x54, 0xf1, 0x44, 0x01, 0xf5, 0x89, 0x75, 0x8c, 0xb1, 0xd2, 0xa9} },
-{ 0x09dc,      16,     {0x75, 0x98, 0x40, 0x75, 0xcb, 0xff, 0x75, 0xca, 0xf3, 0x75, 0xc8, 0x34, 0xe4, 0xff, 0x7f, 0x05} },
-{ 0x09ec,      7,      {0x78, 0x27, 0xe4, 0xf6, 0x08, 0xdf, 0xfc} },
-{ 0x09f3,      1,      {0x22} },
-{ 0x09f4,      5,      {0x12, 0x07, 0x88, 0xd3, 0x22} },
-{ 0x09f9,      1,      {0x32} },
-{ 0x09fa,      1,      {0x32} },
-{ 0x09fb,      1,      {0x32} },
-{ 0x09fc,      1,      {0x32} },
-{ 0x09fd,      1,      {0x32} },
-{ 0x09fe,      1,      {0x32} },
-{ 0x09ff,      1,      {0x32} },
-{ 0x0a00,      9,      {0x90, 0x7f, 0xd6, 0xe0, 0x44, 0x80, 0xf0, 0x80, 0x74} },
-{ 0x0a7d,      16,     {0x43, 0x87, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22} },
-{ 0x0a8d,      16,     {0xc0, 0xe0, 0xc0, 0x83, 0xc0, 0x82, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x00, 0xc0, 0x06, 0xc0} },
-{ 0x0a9d,      1,      {0x07} },
-{ 0x0a9e,      16,     {0x30, 0x04, 0x16, 0x75, 0x8c, 0xf8, 0x75, 0x8a, 0x30, 0x7f, 0x2f, 0xae, 0x07, 0x1f, 0xee, 0x60} },
-{ 0x0aae,      16,     {0x3c, 0x90, 0x20, 0x00, 0x74, 0x55, 0xf0, 0x80, 0xf2, 0x75, 0x8c, 0xb1, 0x7f, 0x27, 0xef, 0xd3} },
-{ 0x0abe,      16,     {0x94, 0x2b, 0x50, 0x09, 0xa8, 0x07, 0xe6, 0x60, 0x01, 0x16, 0x0f, 0x80, 0xf1, 0x90, 0x02, 0x9e} },
-{ 0x0ace,      16,     {0xe0, 0x60, 0x02, 0x14, 0xf0, 0x90, 0x01, 0x5e, 0xe0, 0x70, 0x02, 0xa3, 0xe0, 0x60, 0x0e, 0x90} },
-{ 0x0ade,      13,     {0x01, 0x5f, 0xe0, 0x24, 0xff, 0xf0, 0x90, 0x01, 0x5e, 0xe0, 0x34, 0xff, 0xf0} },
-{ 0x0aeb,      15,     {0xd0, 0x07, 0xd0, 0x06, 0xd0, 0x00, 0xd0, 0xd0, 0xd0, 0x82, 0xd0, 0x83, 0xd0, 0xe0, 0x32} },
-{ 0x0afa,      16,     {0xd2, 0x00, 0x75, 0x8e, 0x10, 0xe4, 0x90, 0x7f, 0x92, 0xf0, 0x12, 0x0f, 0x72, 0x12, 0x08, 0x5b} },
-{ 0x0b0a,      13,     {0x12, 0x0e, 0x0f, 0x12, 0x8f, 0x06, 0x12, 0x11, 0x9c, 0x12, 0x09, 0xcc, 0x22} },
-{ 0x0b17,      16,     {0xc0, 0xe0, 0xc0, 0x83, 0xc0, 0x82, 0xd2, 0x01, 0x53, 0x91, 0xef, 0x90, 0x7f, 0xab, 0x74, 0x01} },
-{ 0x0b27,      8,      {0xf0, 0xd0, 0x82, 0xd0, 0x83, 0xd0, 0xe0, 0x32} },
-{ 0x0b2f,      16,     {0xc0, 0xe0, 0xc0, 0x83, 0xc0, 0x82, 0x90, 0x7f, 0xc4, 0xe4, 0xf0, 0x53, 0x91, 0xef, 0x90, 0x7f} },
-{ 0x0b3f,      11,     {0xab, 0x74, 0x04, 0xf0, 0xd0, 0x82, 0xd0, 0x83, 0xd0, 0xe0, 0x32} },
-{ 0x0b4a,      16,     {0xc0, 0xe0, 0xc0, 0x83, 0xc0, 0x82, 0x53, 0x91, 0xef, 0x90, 0x7f, 0xab, 0x74, 0x02, 0xf0, 0x90} },
-{ 0x0b5a,      16,     {0x7f, 0xd8, 0xe0, 0x70, 0x0d, 0x90, 0x7f, 0xd9, 0xe0, 0x70, 0x07, 0xe5, 0x2b, 0x70, 0x03, 0x75} },
-{ 0x0b6a,      9,      {0x2b, 0x14, 0xd0, 0x82, 0xd0, 0x83, 0xd0, 0xe0, 0x32} },
-{ 0x0b73,      16,     {0xc0, 0xe0, 0xc0, 0x83, 0xc0, 0x82, 0x53, 0x91, 0xef, 0x90, 0x7f, 0xab, 0x74, 0x10, 0xf0, 0xd0} },
-{ 0x0b83,      6,      {0x82, 0xd0, 0x83, 0xd0, 0xe0, 0x32} },
-{ 0x0b89,      16,     {0xc0, 0xe0, 0xc0, 0x83, 0xc0, 0x82, 0x30, 0x02, 0x02, 0xd2, 0x06, 0x53, 0x91, 0xef, 0x90, 0x7f} },
-{ 0x0b99,      11,     {0xab, 0x74, 0x08, 0xf0, 0xd0, 0x82, 0xd0, 0x83, 0xd0, 0xe0, 0x32} },
-{ 0x0ba4,      16,     {0xc0, 0xe0, 0xc0, 0x83, 0xc0, 0x82, 0x53, 0x91, 0xef, 0x90, 0x7f, 0xa9, 0x74, 0x02, 0xf0, 0xe5} },
-{ 0x0bb4,      16,     {0x30, 0x30, 0xe0, 0x13, 0xe5, 0x3b, 0x30, 0xe0, 0x07, 0x90, 0x20, 0x04, 0xe0, 0x44, 0x01, 0xf0} },
-{ 0x0bc4,      16,     {0x90, 0x20, 0x01, 0xe0, 0x44, 0x01, 0xf0, 0xe5, 0x2b, 0x70, 0x03, 0x75, 0x2b, 0x14, 0xd0, 0x82} },
-{ 0x0bd4,      5,      {0xd0, 0x83, 0xd0, 0xe0, 0x32} },
-{ 0x0bd9,      16,     {0xc0, 0xe0, 0xc0, 0x83, 0xc0, 0x82, 0x53, 0x91, 0xef, 0x90, 0x7f, 0xa9, 0x74, 0x04, 0xf0, 0xe5} },
-{ 0x0be9,      16,     {0x30, 0x30, 0xe1, 0x13, 0xe5, 0x3b, 0x30, 0xe1, 0x07, 0x90, 0x20, 0x0c, 0xe0, 0x44, 0x01, 0xf0} },
-{ 0x0bf9,      16,     {0x90, 0x20, 0x09, 0xe0, 0x44, 0x01, 0xf0, 0xe5, 0x2b, 0x70, 0x03, 0x75, 0x2b, 0x14, 0xd0, 0x82} },
-{ 0x0c09,      5,      {0xd0, 0x83, 0xd0, 0xe0, 0x32} },
-{ 0x0c0e,      16,     {0xc0, 0xe0, 0xc0, 0x83, 0xc0, 0x82, 0x53, 0x91, 0xef, 0x90, 0x7f, 0xa9, 0x74, 0x08, 0xf0, 0xe5} },
-{ 0x0c1e,      16,     {0x30, 0x30, 0xe2, 0x13, 0xe5, 0x3b, 0x30, 0xe2, 0x07, 0x90, 0x20, 0x14, 0xe0, 0x44, 0x01, 0xf0} },
-{ 0x0c2e,      16,     {0x90, 0x20, 0x11, 0xe0, 0x44, 0x01, 0xf0, 0xe5, 0x2b, 0x70, 0x03, 0x75, 0x2b, 0x14, 0xd0, 0x82} },
-{ 0x0c3e,      5,      {0xd0, 0x83, 0xd0, 0xe0, 0x32} },
-{ 0x0c43,      16,     {0xc0, 0xe0, 0xc0, 0x83, 0xc0, 0x82, 0x53, 0x91, 0xef, 0x90, 0x7f, 0xa9, 0x74, 0x10, 0xf0, 0xe5} },
-{ 0x0c53,      16,     {0x30, 0x30, 0xe3, 0x13, 0xe5, 0x3b, 0x30, 0xe3, 0x07, 0x90, 0x20, 0x1c, 0xe0, 0x44, 0x01, 0xf0} },
-{ 0x0c63,      16,     {0x90, 0x20, 0x19, 0xe0, 0x44, 0x01, 0xf0, 0xe5, 0x2b, 0x70, 0x03, 0x75, 0x2b, 0x14, 0xd0, 0x82} },
-{ 0x0c73,      5,      {0xd0, 0x83, 0xd0, 0xe0, 0x32} },
-{ 0x0c78,      16,     {0xc0, 0xe0, 0xc0, 0x83, 0xc0, 0x82, 0xc0, 0x85, 0xc0, 0x84, 0xc0, 0x86, 0x75, 0x86, 0x00, 0x53} },
-{ 0x0c88,      16,     {0x91, 0xef, 0x90, 0x7f, 0xaa, 0x74, 0x02, 0xf0, 0xe5, 0x30, 0x20, 0xe0, 0x06, 0x90, 0x7f, 0xc7} },
-{ 0x0c98,      16,     {0xf0, 0x80, 0x16, 0xe5, 0x3b, 0x30, 0xe0, 0x0a, 0x90, 0x7f, 0xc7, 0xe0, 0x90, 0x02, 0x96, 0xf0} },
-{ 0x0ca8,      16,     {0x80, 0x07, 0x90, 0x20, 0x01, 0xe0, 0x44, 0x02, 0xf0, 0xe5, 0x2b, 0x70, 0x03, 0x75, 0x2b, 0x14} },
-{ 0x0cb8,      13,     {0xd0, 0x86, 0xd0, 0x84, 0xd0, 0x85, 0xd0, 0x82, 0xd0, 0x83, 0xd0, 0xe0, 0x32} },
-{ 0x0cc5,      16,     {0xc0, 0xe0, 0xc0, 0x83, 0xc0, 0x82, 0xc0, 0x85, 0xc0, 0x84, 0xc0, 0x86, 0x75, 0x86, 0x00, 0x53} },
-{ 0x0cd5,      16,     {0x91, 0xef, 0x90, 0x7f, 0xaa, 0x74, 0x04, 0xf0, 0xe5, 0x30, 0x20, 0xe1, 0x06, 0x90, 0x7f, 0xc9} },
-{ 0x0ce5,      16,     {0xf0, 0x80, 0x16, 0xe5, 0x3b, 0x30, 0xe1, 0x0a, 0x90, 0x7f, 0xc9, 0xe0, 0x90, 0x02, 0x97, 0xf0} },
-{ 0x0cf5,      16,     {0x80, 0x07, 0x90, 0x20, 0x09, 0xe0, 0x44, 0x02, 0xf0, 0xe5, 0x2b, 0x70, 0x03, 0x75, 0x2b, 0x14} },
-{ 0x0d05,      13,     {0xd0, 0x86, 0xd0, 0x84, 0xd0, 0x85, 0xd0, 0x82, 0xd0, 0x83, 0xd0, 0xe0, 0x32} },
-{ 0x0d12,      16,     {0xc0, 0xe0, 0xc0, 0x83, 0xc0, 0x82, 0xc0, 0x85, 0xc0, 0x84, 0xc0, 0x86, 0x75, 0x86, 0x00, 0x53} },
-{ 0x0d22,      16,     {0x91, 0xef, 0x90, 0x7f, 0xaa, 0x74, 0x08, 0xf0, 0xe5, 0x30, 0x20, 0xe2, 0x06, 0x90, 0x7f, 0xcb} },
-{ 0x0d32,      16,     {0xf0, 0x80, 0x16, 0xe5, 0x3b, 0x30, 0xe2, 0x0a, 0x90, 0x7f, 0xcb, 0xe0, 0x90, 0x02, 0x98, 0xf0} },
-{ 0x0d42,      16,     {0x80, 0x07, 0x90, 0x20, 0x11, 0xe0, 0x44, 0x02, 0xf0, 0xe5, 0x2b, 0x70, 0x03, 0x75, 0x2b, 0x14} },
-{ 0x0d52,      13,     {0xd0, 0x86, 0xd0, 0x84, 0xd0, 0x85, 0xd0, 0x82, 0xd0, 0x83, 0xd0, 0xe0, 0x32} },
-{ 0x0d5f,      16,     {0xc0, 0xe0, 0xc0, 0x83, 0xc0, 0x82, 0xc0, 0x85, 0xc0, 0x84, 0xc0, 0x86, 0x75, 0x86, 0x00, 0x53} },
-{ 0x0d6f,      16,     {0x91, 0xef, 0x90, 0x7f, 0xaa, 0x74, 0x10, 0xf0, 0xe5, 0x30, 0x20, 0xe3, 0x06, 0x90, 0x7f, 0xcd} },
-{ 0x0d7f,      16,     {0xf0, 0x80, 0x16, 0xe5, 0x3b, 0x30, 0xe3, 0x0a, 0x90, 0x7f, 0xcd, 0xe0, 0x90, 0x02, 0x99, 0xf0} },
-{ 0x0d8f,      16,     {0x80, 0x07, 0x90, 0x20, 0x19, 0xe0, 0x44, 0x02, 0xf0, 0xe5, 0x2b, 0x70, 0x03, 0x75, 0x2b, 0x14} },
-{ 0x0d9f,      13,     {0xd0, 0x86, 0xd0, 0x84, 0xd0, 0x85, 0xd0, 0x82, 0xd0, 0x83, 0xd0, 0xe0, 0x32} },
-{ 0x0dac,      16,     {0xc0, 0xe0, 0xc0, 0x83, 0xc0, 0x82, 0x53, 0x91, 0xef, 0x90, 0x7f, 0xa9, 0x74, 0x80, 0xf0, 0xd0} },
-{ 0x0dbc,      6,      {0x82, 0xd0, 0x83, 0xd0, 0xe0, 0x32} },
-{ 0x0dc2,      16,     {0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x83, 0xc0, 0x82, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x00, 0xc0} },
-{ 0x0dd2,      16,     {0x01, 0xc0, 0x02, 0xc0, 0x03, 0xc0, 0x04, 0xc0, 0x05, 0xc0, 0x06, 0xc0, 0x07, 0x53, 0x91, 0xef} },
-{ 0x0de2,      16,     {0x90, 0x7f, 0xaa, 0x74, 0x80, 0xf0, 0x7e, 0x7b, 0x7f, 0x40, 0x12, 0x8c, 0xfb, 0x90, 0x7f, 0xd3} },
-{ 0x0df2,      16,     {0xe4, 0xf0, 0xd0, 0x07, 0xd0, 0x06, 0xd0, 0x05, 0xd0, 0x04, 0xd0, 0x03, 0xd0, 0x02, 0xd0, 0x01} },
-{ 0x0e02,      13,     {0xd0, 0x00, 0xd0, 0xd0, 0xd0, 0x82, 0xd0, 0x83, 0xd0, 0xf0, 0xd0, 0xe0, 0x32} },
-{ 0x0e0f,      16,     {0x90, 0x01, 0x20, 0x12, 0x9c, 0x07, 0x00, 0x00, 0x25, 0x80, 0x90, 0x01, 0x24, 0x74, 0x08, 0xf0} },
-{ 0x0e1f,      16,     {0xa3, 0x74, 0x01, 0xf0, 0xa3, 0x74, 0x6e, 0xf0, 0xa3, 0xf0, 0xe4, 0xa3, 0xf0, 0xa3, 0xf0, 0xa3} },
-{ 0x0e2f,      16,     {0xf0, 0xa3, 0xf0, 0x90, 0x01, 0x1e, 0xf0, 0x90, 0x01, 0x1e, 0xe0, 0xff, 0xc3, 0x94, 0x04, 0x50} },
-{ 0x0e3f,      16,     {0x13, 0xef, 0x04, 0xa3, 0xf0, 0x7e, 0x01, 0x7f, 0x1f, 0x12, 0x84, 0xf4, 0x90, 0x01, 0x1e, 0xe0} },
-{ 0x0e4f,      16,     {0x04, 0xf0, 0x80, 0xe3, 0xe4, 0xf5, 0x26, 0x90, 0x01, 0x1e, 0xf0, 0x90, 0x01, 0x1e, 0xe0, 0xff} },
-{ 0x0e5f,      16,     {0xc3, 0x94, 0x04, 0x50, 0x1a, 0x74, 0x96, 0x2f, 0xf5, 0x82, 0xe4, 0x34, 0x02, 0xf5, 0x83, 0xe4} },
-{ 0x0e6f,      16,     {0xf0, 0x74, 0x22, 0x2f, 0xf8, 0xe4, 0xf6, 0x90, 0x01, 0x1e, 0xe0, 0x04, 0xf0, 0x80, 0xdc, 0xe4} },
-{ 0x0e7f,      16,     {0xf5, 0x30, 0xe5, 0xc0, 0x60, 0x2f, 0x90, 0x01, 0x1e, 0x74, 0x01, 0xf0, 0x90, 0x01, 0x1e, 0xe0} },
-{ 0x0e8f,      16,     {0xff, 0xd3, 0x94, 0x04, 0x50, 0x1f, 0xef, 0x14, 0xff, 0x74, 0x01, 0xa8, 0x07, 0x08, 0x80, 0x02} },
-{ 0x0e9f,      16,     {0xc3, 0x33, 0xd8, 0xfc, 0x42, 0x30, 0x7e, 0x01, 0x7f, 0x1e, 0x12, 0x82, 0xea, 0x90, 0x01, 0x1e} },
-{ 0x0eaf,      16,     {0xe0, 0x04, 0xf0, 0x80, 0xd7, 0xe4, 0xf5, 0x3a, 0x90, 0x01, 0x1e, 0xf0, 0x90, 0x01, 0x1e, 0xe0} },
-{ 0x0ebf,      16,     {0xff, 0x75, 0xf0, 0x08, 0xa4, 0x24, 0x06, 0xf5, 0x82, 0xe4, 0x34, 0x20, 0xf5, 0x83, 0xe0, 0x54} },
-{ 0x0ecf,      16,     {0xf0, 0xfe, 0x74, 0x63, 0x2f, 0xf5, 0x82, 0xe4, 0x34, 0x01, 0xf5, 0x83, 0xee, 0xf0, 0x74, 0x36} },
-{ 0x0edf,      16,     {0x2f, 0xf8, 0xa6, 0x06, 0x74, 0x32, 0x2f, 0xf8, 0xe4, 0xf6, 0x74, 0x2c, 0x2f, 0xf8, 0xe4, 0xf6} },
-{ 0x0eef,      16,     {0x74, 0x9a, 0x2f, 0xf5, 0x82, 0xe4, 0x34, 0x02, 0xf5, 0x83, 0xe4, 0xf0, 0x90, 0x01, 0x1e, 0xe0} },
-{ 0x0eff,      16,     {0x04, 0xf0, 0xe0, 0xb4, 0x04, 0xb6, 0x90, 0x20, 0x60, 0xe0, 0x54, 0x0f, 0xf5, 0x5e, 0x60, 0x5e} },
-{ 0x0f0f,      16,     {0xe4, 0x90, 0x01, 0x1e, 0xf0, 0x90, 0x01, 0x1e, 0xe0, 0xff, 0xc3, 0x94, 0x04, 0x50, 0xe7, 0x74} },
-{ 0x0f1f,      16,     {0x01, 0xa8, 0x07, 0x08, 0x80, 0x02, 0xc3, 0x33, 0xd8, 0xfc, 0x55, 0x5e, 0x60, 0x38, 0x90, 0x01} },
-{ 0x0f2f,      1,      {0x1e} },
-{ 0x0f30,      16,     {0xe0, 0xff, 0x75, 0xf0, 0x08, 0xa4, 0x24, 0x02, 0xf5, 0x82, 0xe4, 0x34, 0x20, 0xf5, 0x83, 0xe0} },
-{ 0x0f40,      16,     {0xfe, 0xef, 0x75, 0xf0, 0x08, 0xa4, 0x24, 0x05, 0xf5, 0x82, 0xe4, 0x34, 0x20, 0xf5, 0x83, 0xe0} },
-{ 0x0f50,      16,     {0xef, 0x75, 0xf0, 0x08, 0xa4, 0x24, 0x06, 0xf5, 0x82, 0xe4, 0x34, 0x20, 0xf5, 0x83, 0xe0, 0xfe} },
-{ 0x0f60,      14,     {0x7d, 0x06, 0x12, 0x82, 0x60, 0x90, 0x01, 0x1e, 0xe0, 0x04, 0xf0, 0x80, 0xa7, 0x22} },
-{ 0x0f6e,      4,      {0x53, 0x91, 0xbf, 0x32} },
-{ 0x0f72,      16,     {0x7b, 0xff, 0x7a, 0x12, 0x79, 0x1b, 0x90, 0x00, 0x04, 0x12, 0x9a, 0x61, 0xfd, 0x8b, 0x60, 0x75} },
-{ 0x0f82,      16,     {0x61, 0x12, 0x75, 0x62, 0x24, 0xe4, 0x90, 0x7f, 0xe1, 0xf0, 0x90, 0x7f, 0xe0, 0xf0, 0xf5, 0x5e} },
-{ 0x0f92,      16,     {0xf5, 0x5f, 0x90, 0x02, 0x4c, 0xf0, 0x90, 0x7f, 0xdf, 0xf0, 0x90, 0x7f, 0xde, 0xf0, 0x90, 0x7f} },
-{ 0x0fa2,      16,     {0xa9, 0x74, 0xff, 0xf0, 0x90, 0x7f, 0xaa, 0xf0, 0xe4, 0xfc, 0xec, 0x25, 0xe0, 0x24, 0xb4, 0xf5} },
-{ 0x0fb2,      16,     {0x82, 0xe4, 0x34, 0x7f, 0xf5, 0x83, 0xe4, 0xf0, 0x0c, 0xbc, 0x10, 0xee, 0xe4, 0x90, 0x7f, 0xdd} },
-{ 0x0fc2,      16,     {0xf0, 0xaf, 0x05, 0x1d, 0xef, 0x70, 0x03, 0x02, 0x11, 0x38, 0xab, 0x60, 0xaa, 0x61, 0xa9, 0x62} },
-{ 0x0fd2,      16,     {0x90, 0x00, 0x01, 0x12, 0x9a, 0x61, 0x64, 0x05, 0x60, 0x03, 0x02, 0x11, 0x27, 0x90, 0x00, 0x03} },
-{ 0x0fe2,      16,     {0x12, 0x9a, 0x61, 0x64, 0x01, 0x60, 0x03, 0x02, 0x10, 0xae, 0x90, 0x00, 0x02, 0x12, 0x9a, 0x61} },
-{ 0x0ff2,      16,     {0xff, 0x54, 0x7f, 0xfc, 0xd3, 0x94, 0x07, 0x50, 0x03, 0x02, 0x10, 0x88, 0xec, 0xc3, 0x94, 0x10} },
-{ 0x1002,      16,     {0x40, 0x03, 0x02, 0x10, 0x88, 0xef, 0x30, 0xe7, 0x42, 0xe5, 0x5f, 0xae, 0x5e, 0x78, 0x02, 0xce} },
-{ 0x1012,      16,     {0xc3, 0x13, 0xce, 0x13, 0xd8, 0xf9, 0xff, 0x74, 0xf0, 0x2c, 0xf5, 0x82, 0xe4, 0x34, 0x7f, 0xf5} },
-{ 0x1022,      16,     {0x83, 0xef, 0xf0, 0x90, 0x7f, 0xe0, 0xe0, 0xff, 0xec, 0x24, 0xf8, 0xfe, 0x74, 0x01, 0xa8, 0x06} },
-{ 0x1032,      16,     {0x08, 0x80, 0x02, 0xc3, 0x33, 0xd8, 0xfc, 0x4f, 0x90, 0x7f, 0xe0, 0xf0, 0x90, 0x02, 0x4c, 0xe0} },
-{ 0x1042,      16,     {0x04, 0xf0, 0x90, 0x7f, 0xdd, 0xe0, 0x44, 0x80, 0xf0, 0x80, 0x3e, 0xe5, 0x5f, 0xae, 0x5e, 0x78} },
-{ 0x1052,      16,     {0x02, 0xce, 0xc3, 0x13, 0xce, 0x13, 0xd8, 0xf9, 0xff, 0x74, 0xe8, 0x2c, 0xf5, 0x82, 0xe4, 0x34} },
-{ 0x1062,      16,     {0x7f, 0xf5, 0x83, 0xef, 0xf0, 0x90, 0x7f, 0xe1, 0xe0, 0xff, 0xec, 0x24, 0xf8, 0xfe, 0x74, 0x01} },
-{ 0x1072,      16,     {0xa8, 0x06, 0x08, 0x80, 0x02, 0xc3, 0x33, 0xd8, 0xfc, 0x4f, 0x90, 0x7f, 0xe1, 0xf0, 0x90, 0x02} },
-{ 0x1082,      16,     {0x4c, 0xe0, 0x04, 0xf0, 0x80, 0x03, 0x7f, 0xff, 0x22, 0x90, 0x00, 0x04, 0x12, 0x9a, 0x61, 0x25} },
-{ 0x1092,      16,     {0x5f, 0xf5, 0x5f, 0xe4, 0x35, 0x5e, 0xf5, 0x5e, 0x90, 0x00, 0x05, 0x12, 0x9a, 0x61, 0xfe, 0xe4} },
-{ 0x10a2,      16,     {0x25, 0x5f, 0xf5, 0x5f, 0xee, 0x35, 0x5e, 0xf5, 0x5e, 0x02, 0x11, 0x2a, 0xab, 0x60, 0xaa, 0x61} },
-{ 0x10b2,      16,     {0xa9, 0x62, 0x90, 0x00, 0x03, 0x12, 0x9a, 0x61, 0xff, 0x64, 0x02, 0x60, 0x05, 0xef, 0x64, 0x03} },
-{ 0x10c2,      16,     {0x70, 0x60, 0x90, 0x00, 0x02, 0x12, 0x9a, 0x61, 0xff, 0x54, 0x7f, 0xfc, 0xd3, 0x94, 0x07, 0x50} },
-{ 0x10d2,      16,     {0x4e, 0xef, 0x30, 0xe7, 0x1e, 0x90, 0x7f, 0xde, 0xe0, 0xff, 0x74, 0x01, 0xa8, 0x04, 0x08, 0x80} },
-{ 0x10e2,      16,     {0x02, 0xc3, 0x33, 0xd8, 0xfc, 0xfe, 0x4f, 0x90, 0x7f, 0xde, 0xf0, 0x90, 0x7f, 0xac, 0xe0, 0x4e} },
-{ 0x10f2,      16,     {0xf0, 0x80, 0x35, 0x90, 0x7f, 0xdf, 0xe0, 0xff, 0x74, 0x01, 0xa8, 0x04, 0x08, 0x80, 0x02, 0xc3} },
-{ 0x1102,      16,     {0x33, 0xd8, 0xfc, 0xfe, 0x4f, 0x90, 0x7f, 0xdf, 0xf0, 0x90, 0x7f, 0xad, 0xe0, 0x4e, 0xf0, 0xec} },
-{ 0x1112,      16,     {0x25, 0xe0, 0x24, 0xc5, 0xf5, 0x82, 0xe4, 0x34, 0x7f, 0xf5, 0x83, 0xec, 0xf0, 0x80, 0x09, 0x7f} },
-{ 0x1122,      16,     {0xff, 0x22, 0x7f, 0xff, 0x22, 0x7f, 0xff, 0x22, 0x74, 0x07, 0x25, 0x62, 0xf5, 0x62, 0xe4, 0x35} },
-{ 0x1132,      16,     {0x61, 0xf5, 0x61, 0x02, 0x0f, 0xc3, 0x20, 0x03, 0x0d, 0x90, 0x02, 0x4c, 0xe0, 0x60, 0x07, 0x90} },
-{ 0x1142,      8,      {0x7f, 0xae, 0xe0, 0x44, 0x02, 0xf0, 0x7f, 0x00} },
-{ 0x114a,      1,      {0x22} },
-{ 0x114b,      2,      {0xae, 0x07} },
-{ 0x114d,      16,     {0x7c, 0x02, 0xec, 0x14, 0x60, 0x15, 0x14, 0x70, 0x1e, 0x90, 0x7f, 0xa5, 0xe0, 0x44, 0x80, 0xf0} },
-{ 0x115d,      16,     {0xee, 0x25, 0xe0, 0x44, 0x40, 0x90, 0x7f, 0xa6, 0xf0, 0x80, 0x0c, 0x90, 0x7f, 0xa6, 0xed, 0xf0} },
-{ 0x116d,      16,     {0x90, 0x7f, 0xa5, 0xe0, 0x44, 0x40, 0xf0, 0x90, 0x7f, 0xa5, 0xe0, 0xfb, 0x30, 0xe0, 0xf8, 0xbc} },
-{ 0x117d,      16,     {0x02, 0x0a, 0x20, 0xe1, 0x07, 0xe0, 0x44, 0x40, 0xf0, 0x7f, 0x07, 0x22, 0xeb, 0x30, 0xe2, 0x0a} },
-{ 0x118d,      14,     {0x90, 0x7f, 0xa5, 0xe0, 0x44, 0x40, 0xf0, 0x7f, 0x06, 0x22, 0xdc, 0xb6, 0x7f, 0x08} },
-{ 0x119b,      1,      {0x22} },
-{ 0x119c,      16,     {0x7f, 0x05, 0x7e, 0x00, 0x12, 0x08, 0x92, 0x7f, 0x02, 0x7d, 0xff, 0x12, 0x11, 0x4b, 0x7f, 0x05} },
-{ 0x11ac,      13,     {0x7e, 0x00, 0x12, 0x08, 0x92, 0x7f, 0x03, 0x7d, 0xff, 0x12, 0x11, 0x4b, 0x22} },
-{ 0x11b9,      16,     {0xc0, 0xe0, 0xc0, 0x83, 0xc0, 0x82, 0xc2, 0xa9, 0x90, 0x02, 0x9e, 0x74, 0x19, 0xf0, 0xd2, 0xa9} },
-{ 0x11c9,      15,     {0x53, 0x91, 0x7f, 0x90, 0x01, 0x62, 0xe4, 0xf0, 0xd0, 0x82, 0xd0, 0x83, 0xd0, 0xe0, 0x32} },
-{ 0x11d8,      16,     {0x8f, 0x82, 0x8e, 0x83, 0xe0, 0x14, 0xff, 0x74, 0x01, 0xa8, 0x07, 0x08, 0x80, 0x02, 0xc3, 0x33} },
-{ 0x11e8,      7,      {0xd8, 0xfc, 0x42, 0x3a, 0x7f, 0x00, 0x22} },
-{ 0x11ef,      3,      {0x00, 0x02, 0x28} },
-{ 0x1200,      16,     {0x12, 0x01, 0x00, 0x01, 0xff, 0xff, 0xff, 0x40, 0x10, 0x07, 0x01, 0x80, 0x42, 0x00, 0x01, 0x02} },
-{ 0x1210,      16,     {0x03, 0x01, 0x09, 0x02, 0x58, 0x00, 0x01, 0x01, 0x04, 0x80, 0x3c, 0x09, 0x04, 0x00, 0x00, 0x0a} },
-{ 0x1220,      16,     {0xff, 0xff, 0xff, 0x05, 0x07, 0x05, 0x81, 0x02, 0x40, 0x00, 0x00, 0x07, 0x05, 0x01, 0x02, 0x40} },
-{ 0x1230,      16,     {0x00, 0x00, 0x07, 0x05, 0x82, 0x02, 0x40, 0x00, 0x00, 0x07, 0x05, 0x02, 0x02, 0x40, 0x00, 0x00} },
-{ 0x1240,      16,     {0x07, 0x05, 0x83, 0x02, 0x40, 0x00, 0x00, 0x07, 0x05, 0x03, 0x02, 0x40, 0x00, 0x00, 0x07, 0x05} },
-{ 0x1250,      16,     {0x84, 0x02, 0x40, 0x00, 0x00, 0x07, 0x05, 0x04, 0x02, 0x40, 0x00, 0x00, 0x07, 0x05, 0x87, 0x02} },
-{ 0x1260,      16,     {0x40, 0x00, 0x00, 0x07, 0x05, 0x07, 0x02, 0x40, 0x00, 0x00, 0x04, 0x03, 0x09, 0x04, 0x24, 0x03} },
-{ 0x1270,      16,     {0x43, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x6e, 0x00, 0x65, 0x00, 0x63, 0x00, 0x74, 0x00, 0x20, 0x00} },
-{ 0x1280,      16,     {0x54, 0x00, 0x65, 0x00, 0x63, 0x00, 0x68, 0x00, 0x20, 0x00, 0x49, 0x00, 0x6e, 0x00, 0x63, 0x00} },
-{ 0x1290,      16,     {0x2e, 0x00, 0x18, 0x03, 0x57, 0x00, 0x68, 0x00, 0x69, 0x00, 0x74, 0x00, 0x65, 0x00, 0x48, 0x00} },
-{ 0x12a0,      16,     {0x45, 0x00, 0x41, 0x00, 0x54, 0x00, 0x2d, 0x00, 0x34, 0x00, 0x1a, 0x03, 0x58, 0x00, 0x58, 0x00} },
-{ 0x12b0,      16,     {0x2d, 0x00, 0x58, 0x00, 0x58, 0x00, 0x2d, 0x00, 0x58, 0x00, 0x58, 0x00, 0x58, 0x00, 0x58, 0x00} },
-{ 0x12c0,      16,     {0x58, 0x00, 0x58, 0x00, 0x2a, 0x03, 0x43, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x66, 0x00, 0x69, 0x00} },
-{ 0x12d0,      16,     {0x67, 0x00, 0x75, 0x00, 0x72, 0x00, 0x61, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6f, 0x00, 0x6e, 0x00} },
-{ 0x12e0,      16,     {0x20, 0x00, 0x53, 0x00, 0x74, 0x00, 0x72, 0x00, 0x69, 0x00, 0x6e, 0x00, 0x67, 0x00, 0x22, 0x03} },
-{ 0x12f0,      16,     {0x49, 0x00, 0x6e, 0x00, 0x74, 0x00, 0x65, 0x00, 0x72, 0x00, 0x66, 0x00, 0x61, 0x00, 0x63, 0x00} },
-{ 0x1300,      16,     {0x65, 0x00, 0x20, 0x00, 0x53, 0x00, 0x74, 0x00, 0x72, 0x00, 0x69, 0x00, 0x6e, 0x00, 0x67, 0x00} },
-{ 0x1310,      2,      {0x00, 0x00} },
-{ 0x1312,      16,     {0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x83, 0xc0, 0x82, 0xc0, 0x85, 0xc0, 0x84, 0xc0, 0x86, 0xc0, 0xd0} },
-{ 0x1322,      16,     {0x75, 0x86, 0x00, 0x75, 0xd0, 0x18, 0x90, 0x20, 0x60, 0xe0, 0x54, 0x0f, 0xf5, 0xf0, 0x70, 0x11} },
-{ 0x1332,      16,     {0xd0, 0xd0, 0xd0, 0x86, 0xd0, 0x84, 0xd0, 0x85, 0xd0, 0x82, 0xd0, 0x83, 0xd0, 0xf0, 0xd0, 0xe0} },
-{ 0x1342,      16,     {0x32, 0x75, 0x86, 0x00, 0x10, 0xf0, 0x0b, 0x10, 0xf1, 0x12, 0x10, 0xf2, 0x19, 0x10, 0xf3, 0x20} },
-{ 0x1352,      16,     {0x80, 0xd4, 0xe5, 0x27, 0x70, 0x03, 0x75, 0x27, 0x14, 0x02, 0x13, 0x7c, 0xe5, 0x28, 0x70, 0x03} },
-{ 0x1362,      16,     {0x75, 0x28, 0x14, 0x02, 0x15, 0x0d, 0xe5, 0x29, 0x70, 0x03, 0x75, 0x29, 0x14, 0x02, 0x16, 0x9e} },
-{ 0x1372,      16,     {0xe5, 0x2a, 0x70, 0x03, 0x75, 0x2a, 0x14, 0x02, 0x18, 0x2f, 0x90, 0x20, 0x02, 0xe0, 0x54, 0x3f} },
-{ 0x1382,      16,     {0x20, 0xe2, 0x3a, 0x20, 0xe1, 0x0b, 0x20, 0xe4, 0x0b, 0x20, 0xe5, 0x14, 0x60, 0x09, 0x02, 0x13} },
-{ 0x1392,      16,     {0x43, 0x02, 0x14, 0x65, 0x02, 0x13, 0x43, 0x43, 0x82, 0x04, 0xe0, 0xf5, 0x36, 0x02, 0x13, 0x43} },
-{ 0x13a2,      16,     {0x43, 0x82, 0x04, 0xe0, 0x43, 0x2c, 0x01, 0x02, 0x13, 0x43, 0x53, 0x82, 0xf8, 0x43, 0x82, 0x05} },
-{ 0x13b2,      16,     {0xe0, 0x42, 0x32, 0x53, 0x82, 0xfb, 0xe0, 0x54, 0xfb, 0xf0, 0x02, 0x13, 0x43, 0x30, 0xe1, 0x02} },
-{ 0x13c2,      16,     {0x80, 0xe8, 0xf5, 0x85, 0xe5, 0x3b, 0x30, 0xe0, 0x0a, 0x53, 0x82, 0xf8, 0x43, 0x82, 0x04, 0xe0} },
-{ 0x13d2,      16,     {0x54, 0xfe, 0xf0, 0xe5, 0x85, 0x20, 0xe3, 0x56, 0x90, 0x20, 0x50, 0x74, 0x00, 0xf0, 0x90, 0x20} },
-{ 0x13e2,      16,     {0x58, 0x74, 0x01, 0xf0, 0x90, 0x7f, 0xe2, 0xe0, 0x44, 0x40, 0xf0, 0x90, 0x7f, 0xe3, 0x05, 0x86} },
-{ 0x13f2,      16,     {0x90, 0x7e, 0x80, 0x05, 0x86, 0xe5, 0x85, 0xf0, 0xa3, 0xe5, 0x84, 0xf0, 0x05, 0x86, 0x90, 0x7f} },
-{ 0x1402,      16,     {0xe5, 0xe5, 0x3c, 0xfd, 0x03, 0x03, 0x03, 0xfe, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0} },
-{ 0x1412,      16,     {0xde, 0xf6, 0x90, 0x7f, 0xe2, 0xe0, 0x54, 0xbf, 0xf0, 0x90, 0x20, 0x58, 0x74, 0x00, 0xf0, 0x90} },
-{ 0x1422,      16,     {0x7f, 0xb7, 0xed, 0xf0, 0x90, 0x20, 0x01, 0xe0, 0x54, 0xfe, 0xf0, 0x02, 0x13, 0x43, 0x7f, 0x40} },
-{ 0x1432,      16,     {0x90, 0x7e, 0x80, 0x05, 0x86, 0x90, 0x20, 0x00, 0xe5, 0x84, 0xfe, 0x24, 0x05, 0xfd, 0x8d, 0x84} },
-{ 0x1442,      16,     {0xe0, 0x8e, 0x84, 0x30, 0xe0, 0x09, 0xe0, 0x05, 0x86, 0xf0, 0xa3, 0x05, 0x86, 0xdf, 0xef, 0x05} },
-{ 0x1452,      16,     {0x86, 0xc3, 0x74, 0x40, 0x9f, 0x90, 0x7f, 0xb7, 0xf0, 0x05, 0x86, 0xa3, 0xe0, 0x54, 0xfe, 0xf0} },
-{ 0x1462,      16,     {0x02, 0x13, 0x43, 0x53, 0x2c, 0xfa, 0xe5, 0x22, 0x60, 0x08, 0x75, 0x22, 0x00, 0xd2, 0xe7, 0xfe} },
-{ 0x1472,      16,     {0x80, 0x0a, 0x90, 0x7f, 0xc7, 0xe0, 0xfe, 0x70, 0x03, 0x02, 0x14, 0xff, 0x90, 0x20, 0x50, 0x74} },
-{ 0x1482,      16,     {0x00, 0xf0, 0x90, 0x20, 0x58, 0x74, 0x01, 0xf0, 0x90, 0x7f, 0xe2, 0xe0, 0x44, 0x40, 0xf0, 0x90} },
-{ 0x1492,      16,     {0x7f, 0xe3, 0x05, 0x86, 0x90, 0x7e, 0x40, 0x05, 0x86, 0xe5, 0x85, 0xf0, 0xa3, 0xe5, 0x84, 0xf0} },
-{ 0x14a2,      16,     {0x05, 0x86, 0x90, 0x7f, 0xe5, 0xee, 0x30, 0xe7, 0x08, 0x05, 0x86, 0xe0, 0x24, 0x38, 0xf0, 0x05} },
-{ 0x14b2,      16,     {0x86, 0xee, 0x54, 0x7f, 0xfe, 0x54, 0x07, 0xfb, 0xee, 0x54, 0x78, 0x60, 0x30, 0x03, 0x03, 0x03} },
-{ 0x14c2,      16,     {0x30, 0xe3, 0x04, 0x74, 0x07, 0x7b, 0x08, 0xfd, 0xfc, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0} },
-{ 0x14d2,      16,     {0xe0, 0xdd, 0xf6, 0xeb, 0xfe, 0x60, 0x19, 0xec, 0x64, 0x07, 0x70, 0x11, 0x8b, 0x22, 0x90, 0x7f} },
-{ 0x14e2,      16,     {0xe2, 0xe0, 0x54, 0xbf, 0xf0, 0x90, 0x20, 0x58, 0x74, 0x00, 0xf0, 0x80, 0x1b, 0xe0, 0xde, 0xfd} },
-{ 0x14f2,      16,     {0x90, 0x7f, 0xe2, 0xe0, 0x54, 0xbf, 0xf0, 0x90, 0x20, 0x58, 0x74, 0x00, 0xf0, 0x90, 0x20, 0x01} },
-{ 0x1502,      16,     {0xe0, 0x54, 0xfd, 0xf0, 0x90, 0x7f, 0xc7, 0xf0, 0x02, 0x13, 0x43, 0x90, 0x20, 0x0a, 0xe0, 0x54} },
-{ 0x1512,      16,     {0x3f, 0x20, 0xe2, 0x3a, 0x20, 0xe1, 0x0b, 0x20, 0xe4, 0x0b, 0x20, 0xe5, 0x14, 0x60, 0x09, 0x02} },
-{ 0x1522,      16,     {0x13, 0x43, 0x02, 0x15, 0xf6, 0x02, 0x13, 0x43, 0x43, 0x82, 0x04, 0xe0, 0xf5, 0x37, 0x02, 0x13} },
-{ 0x1532,      16,     {0x43, 0x43, 0x82, 0x04, 0xe0, 0x43, 0x2d, 0x01, 0x02, 0x13, 0x43, 0x53, 0x82, 0xf8, 0x43, 0x82} },
-{ 0x1542,      16,     {0x05, 0xe0, 0x42, 0x33, 0x53, 0x82, 0xfb, 0xe0, 0x54, 0xfb, 0xf0, 0x02, 0x13, 0x43, 0x30, 0xe1} },
-{ 0x1552,      16,     {0x02, 0x80, 0xe8, 0xf5, 0x85, 0xe5, 0x3b, 0x30, 0xe1, 0x0a, 0x53, 0x82, 0xf8, 0x43, 0x82, 0x04} },
-{ 0x1562,      16,     {0xe0, 0x54, 0xfe, 0xf0, 0xe5, 0x85, 0x20, 0xe3, 0x56, 0x90, 0x20, 0x50, 0x74, 0x01, 0xf0, 0x90} },
-{ 0x1572,      16,     {0x20, 0x58, 0x74, 0x01, 0xf0, 0x90, 0x7f, 0xe2, 0xe0, 0x44, 0x40, 0xf0, 0x90, 0x7f, 0xe3, 0x05} },
-{ 0x1582,      16,     {0x86, 0x90, 0x7e, 0x00, 0x05, 0x86, 0xe5, 0x85, 0xf0, 0xa3, 0xe5, 0x84, 0xf0, 0x05, 0x86, 0x90} },
-{ 0x1592,      16,     {0x7f, 0xe5, 0xe5, 0x3d, 0xfd, 0x03, 0x03, 0x03, 0xfe, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0} },
-{ 0x15a2,      16,     {0xf0, 0xde, 0xf6, 0x90, 0x7f, 0xe2, 0xe0, 0x54, 0xbf, 0xf0, 0x90, 0x20, 0x58, 0x74, 0x00, 0xf0} },
-{ 0x15b2,      16,     {0x90, 0x7f, 0xb9, 0xed, 0xf0, 0x90, 0x20, 0x09, 0xe0, 0x54, 0xfe, 0xf0, 0x02, 0x13, 0x43, 0x7f} },
-{ 0x15c2,      16,     {0x40, 0x90, 0x7e, 0x00, 0x05, 0x86, 0x90, 0x20, 0x08, 0xe5, 0x84, 0xfe, 0x24, 0x05, 0xfd, 0x8d} },
-{ 0x15d2,      16,     {0x84, 0xe0, 0x8e, 0x84, 0x30, 0xe0, 0x09, 0xe0, 0x05, 0x86, 0xf0, 0xa3, 0x05, 0x86, 0xdf, 0xef} },
-{ 0x15e2,      16,     {0x05, 0x86, 0xc3, 0x74, 0x40, 0x9f, 0x90, 0x7f, 0xb9, 0xf0, 0x05, 0x86, 0xa3, 0xe0, 0x54, 0xfe} },
-{ 0x15f2,      16,     {0xf0, 0x02, 0x13, 0x43, 0x53, 0x2d, 0xfa, 0xe5, 0x23, 0x60, 0x08, 0x75, 0x23, 0x00, 0xd2, 0xe7} },
-{ 0x1602,      16,     {0xfe, 0x80, 0x0a, 0x90, 0x7f, 0xc9, 0xe0, 0xfe, 0x70, 0x03, 0x02, 0x16, 0x90, 0x90, 0x20, 0x50} },
-{ 0x1612,      16,     {0x74, 0x01, 0xf0, 0x90, 0x20, 0x58, 0x74, 0x01, 0xf0, 0x90, 0x7f, 0xe2, 0xe0, 0x44, 0x40, 0xf0} },
-{ 0x1622,      16,     {0x90, 0x7f, 0xe3, 0x05, 0x86, 0x90, 0x7d, 0xc0, 0x05, 0x86, 0xe5, 0x85, 0xf0, 0xa3, 0xe5, 0x84} },
-{ 0x1632,      16,     {0xf0, 0x05, 0x86, 0x90, 0x7f, 0xe5, 0xee, 0x30, 0xe7, 0x08, 0x05, 0x86, 0xe0, 0x24, 0x38, 0xf0} },
-{ 0x1642,      16,     {0x05, 0x86, 0xee, 0x54, 0x7f, 0xfe, 0x54, 0x07, 0xfb, 0xee, 0x54, 0x78, 0x60, 0x30, 0x03, 0x03} },
-{ 0x1652,      16,     {0x03, 0x30, 0xe3, 0x04, 0x74, 0x07, 0x7b, 0x08, 0xfd, 0xfc, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0} },
-{ 0x1662,      16,     {0xe0, 0xe0, 0xdd, 0xf6, 0xeb, 0xfe, 0x60, 0x19, 0xec, 0x64, 0x07, 0x70, 0x11, 0x8b, 0x23, 0x90} },
-{ 0x1672,      16,     {0x7f, 0xe2, 0xe0, 0x54, 0xbf, 0xf0, 0x90, 0x20, 0x58, 0x74, 0x00, 0xf0, 0x80, 0x1b, 0xe0, 0xde} },
-{ 0x1682,      14,     {0xfd, 0x90, 0x7f, 0xe2, 0xe0, 0x54, 0xbf, 0xf0, 0x90, 0x20, 0x58, 0x74, 0x00, 0xf0} },
-{ 0x1690,      16,     {0x90, 0x20, 0x09, 0xe0, 0x54, 0xfd, 0xf0, 0x90, 0x7f, 0xc9, 0xf0, 0x02, 0x13, 0x43, 0x90, 0x20} },
-{ 0x16a0,      16,     {0x12, 0xe0, 0x54, 0x3f, 0x20, 0xe2, 0x3a, 0x20, 0xe1, 0x0b, 0x20, 0xe4, 0x0b, 0x20, 0xe5, 0x14} },
-{ 0x16b0,      16,     {0x60, 0x09, 0x02, 0x13, 0x43, 0x02, 0x17, 0x87, 0x02, 0x13, 0x43, 0x43, 0x82, 0x04, 0xe0, 0xf5} },
-{ 0x16c0,      16,     {0x38, 0x02, 0x13, 0x43, 0x43, 0x82, 0x04, 0xe0, 0x43, 0x2e, 0x01, 0x02, 0x13, 0x43, 0x53, 0x82} },
-{ 0x16d0,      16,     {0xf8, 0x43, 0x82, 0x05, 0xe0, 0x42, 0x34, 0x53, 0x82, 0xfb, 0xe0, 0x54, 0xfb, 0xf0, 0x02, 0x13} },
-{ 0x16e0,      16,     {0x43, 0x30, 0xe1, 0x02, 0x80, 0xe8, 0xf5, 0x85, 0xe5, 0x3b, 0x30, 0xe2, 0x0a, 0x53, 0x82, 0xf8} },
-{ 0x16f0,      16,     {0x43, 0x82, 0x04, 0xe0, 0x54, 0xfe, 0xf0, 0xe5, 0x85, 0x20, 0xe3, 0x56, 0x90, 0x20, 0x50, 0x74} },
-{ 0x1700,      16,     {0x02, 0xf0, 0x90, 0x20, 0x58, 0x74, 0x01, 0xf0, 0x90, 0x7f, 0xe2, 0xe0, 0x44, 0x40, 0xf0, 0x90} },
-{ 0x1710,      16,     {0x7f, 0xe3, 0x05, 0x86, 0x90, 0x7d, 0x80, 0x05, 0x86, 0xe5, 0x85, 0xf0, 0xa3, 0xe5, 0x84, 0xf0} },
-{ 0x1720,      16,     {0x05, 0x86, 0x90, 0x7f, 0xe5, 0xe5, 0x3e, 0xfd, 0x03, 0x03, 0x03, 0xfe, 0xf0, 0xf0, 0xf0, 0xf0} },
-{ 0x1730,      16,     {0xf0, 0xf0, 0xf0, 0xf0, 0xde, 0xf6, 0x90, 0x7f, 0xe2, 0xe0, 0x54, 0xbf, 0xf0, 0x90, 0x20, 0x58} },
-{ 0x1740,      16,     {0x74, 0x00, 0xf0, 0x90, 0x7f, 0xbb, 0xed, 0xf0, 0x90, 0x20, 0x11, 0xe0, 0x54, 0xfe, 0xf0, 0x02} },
-{ 0x1750,      16,     {0x13, 0x43, 0x7f, 0x40, 0x90, 0x7d, 0x80, 0x05, 0x86, 0x90, 0x20, 0x10, 0xe5, 0x84, 0xfe, 0x24} },
-{ 0x1760,      16,     {0x05, 0xfd, 0x8d, 0x84, 0xe0, 0x8e, 0x84, 0x30, 0xe0, 0x09, 0xe0, 0x05, 0x86, 0xf0, 0xa3, 0x05} },
-{ 0x1770,      16,     {0x86, 0xdf, 0xef, 0x05, 0x86, 0xc3, 0x74, 0x40, 0x9f, 0x90, 0x7f, 0xbb, 0xf0, 0x05, 0x86, 0xa3} },
-{ 0x1780,      16,     {0xe0, 0x54, 0xfe, 0xf0, 0x02, 0x13, 0x43, 0x53, 0x2e, 0xfa, 0xe5, 0x24, 0x60, 0x08, 0x75, 0x24} },
-{ 0x1790,      16,     {0x00, 0xd2, 0xe7, 0xfe, 0x80, 0x0a, 0x90, 0x7f, 0xcb, 0xe0, 0xfe, 0x70, 0x03, 0x02, 0x18, 0x21} },
-{ 0x17a0,      16,     {0x90, 0x20, 0x50, 0x74, 0x02, 0xf0, 0x90, 0x20, 0x58, 0x74, 0x01, 0xf0, 0x90, 0x7f, 0xe2, 0xe0} },
-{ 0x17b0,      16,     {0x44, 0x40, 0xf0, 0x90, 0x7f, 0xe3, 0x05, 0x86, 0x90, 0x7d, 0x40, 0x05, 0x86, 0xe5, 0x85, 0xf0} },
-{ 0x17c0,      16,     {0xa3, 0xe5, 0x84, 0xf0, 0x05, 0x86, 0x90, 0x7f, 0xe5, 0xee, 0x30, 0xe7, 0x08, 0x05, 0x86, 0xe0} },
-{ 0x17d0,      16,     {0x24, 0x38, 0xf0, 0x05, 0x86, 0xee, 0x54, 0x7f, 0xfe, 0x54, 0x07, 0xfb, 0xee, 0x54, 0x78, 0x60} },
-{ 0x17e0,      16,     {0x30, 0x03, 0x03, 0x03, 0x30, 0xe3, 0x04, 0x74, 0x07, 0x7b, 0x08, 0xfd, 0xfc, 0xe0, 0xe0, 0xe0} },
-{ 0x17f0,      16,     {0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xdd, 0xf6, 0xeb, 0xfe, 0x60, 0x19, 0xec, 0x64, 0x07, 0x70, 0x11} },
-{ 0x1800,      16,     {0x8b, 0x24, 0x90, 0x7f, 0xe2, 0xe0, 0x54, 0xbf, 0xf0, 0x90, 0x20, 0x58, 0x74, 0x00, 0xf0, 0x80} },
-{ 0x1810,      16,     {0x1b, 0xe0, 0xde, 0xfd, 0x90, 0x7f, 0xe2, 0xe0, 0x54, 0xbf, 0xf0, 0x90, 0x20, 0x58, 0x74, 0x00} },
-{ 0x1820,      16,     {0xf0, 0x90, 0x20, 0x11, 0xe0, 0x54, 0xfd, 0xf0, 0x90, 0x7f, 0xcb, 0xf0, 0x02, 0x13, 0x43, 0x90} },
-{ 0x1830,      16,     {0x20, 0x1a, 0xe0, 0x54, 0x3f, 0x20, 0xe2, 0x3a, 0x20, 0xe1, 0x0b, 0x20, 0xe4, 0x0b, 0x20, 0xe5} },
-{ 0x1840,      16,     {0x14, 0x60, 0x09, 0x02, 0x13, 0x43, 0x02, 0x19, 0x18, 0x02, 0x13, 0x43, 0x43, 0x82, 0x04, 0xe0} },
-{ 0x1850,      16,     {0xf5, 0x39, 0x02, 0x13, 0x43, 0x43, 0x82, 0x04, 0xe0, 0x43, 0x2f, 0x01, 0x02, 0x13, 0x43, 0x53} },
-{ 0x1860,      16,     {0x82, 0xf8, 0x43, 0x82, 0x05, 0xe0, 0x42, 0x35, 0x53, 0x82, 0xfb, 0xe0, 0x54, 0xfb, 0xf0, 0x02} },
-{ 0x1870,      16,     {0x13, 0x43, 0x30, 0xe1, 0x02, 0x80, 0xe8, 0xf5, 0x85, 0xe5, 0x3b, 0x30, 0xe3, 0x0a, 0x53, 0x82} },
-{ 0x1880,      16,     {0xf8, 0x43, 0x82, 0x04, 0xe0, 0x54, 0xfe, 0xf0, 0xe5, 0x85, 0x20, 0xe3, 0x56, 0x90, 0x20, 0x50} },
-{ 0x1890,      16,     {0x74, 0x03, 0xf0, 0x90, 0x20, 0x58, 0x74, 0x01, 0xf0, 0x90, 0x7f, 0xe2, 0xe0, 0x44, 0x40, 0xf0} },
-{ 0x18a0,      16,     {0x90, 0x7f, 0xe3, 0x05, 0x86, 0x90, 0x7d, 0x00, 0x05, 0x86, 0xe5, 0x85, 0xf0, 0xa3, 0xe5, 0x84} },
-{ 0x18b0,      16,     {0xf0, 0x05, 0x86, 0x90, 0x7f, 0xe5, 0xe5, 0x3f, 0xfd, 0x03, 0x03, 0x03, 0xfe, 0xf0, 0xf0, 0xf0} },
-{ 0x18c0,      16,     {0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xde, 0xf6, 0x90, 0x7f, 0xe2, 0xe0, 0x54, 0xbf, 0xf0, 0x90, 0x20} },
-{ 0x18d0,      16,     {0x58, 0x74, 0x00, 0xf0, 0x90, 0x7f, 0xbd, 0xed, 0xf0, 0x90, 0x20, 0x19, 0xe0, 0x54, 0xfe, 0xf0} },
-{ 0x18e0,      16,     {0x02, 0x13, 0x43, 0x7f, 0x40, 0x90, 0x7d, 0x00, 0x05, 0x86, 0x90, 0x20, 0x18, 0xe5, 0x84, 0xfe} },
-{ 0x18f0,      16,     {0x24, 0x05, 0xfd, 0x8d, 0x84, 0xe0, 0x8e, 0x84, 0x30, 0xe0, 0x09, 0xe0, 0x05, 0x86, 0xf0, 0xa3} },
-{ 0x1900,      16,     {0x05, 0x86, 0xdf, 0xef, 0x05, 0x86, 0xc3, 0x74, 0x40, 0x9f, 0x90, 0x7f, 0xbd, 0xf0, 0x05, 0x86} },
-{ 0x1910,      16,     {0xa3, 0xe0, 0x54, 0xfe, 0xf0, 0x02, 0x13, 0x43, 0x53, 0x2f, 0xfa, 0xe5, 0x25, 0x60, 0x08, 0x75} },
-{ 0x1920,      16,     {0x25, 0x00, 0xd2, 0xe7, 0xfe, 0x80, 0x0a, 0x90, 0x7f, 0xcd, 0xe0, 0xfe, 0x70, 0x03, 0x02, 0x19} },
-{ 0x1930,      16,     {0xb2, 0x90, 0x20, 0x50, 0x74, 0x03, 0xf0, 0x90, 0x20, 0x58, 0x74, 0x01, 0xf0, 0x90, 0x7f, 0xe2} },
-{ 0x1940,      16,     {0xe0, 0x44, 0x40, 0xf0, 0x90, 0x7f, 0xe3, 0x05, 0x86, 0x90, 0x7c, 0xc0, 0x05, 0x86, 0xe5, 0x85} },
-{ 0x1950,      16,     {0xf0, 0xa3, 0xe5, 0x84, 0xf0, 0x05, 0x86, 0x90, 0x7f, 0xe5, 0xee, 0x30, 0xe7, 0x08, 0x05, 0x86} },
-{ 0x1960,      16,     {0xe0, 0x24, 0x38, 0xf0, 0x05, 0x86, 0xee, 0x54, 0x7f, 0xfe, 0x54, 0x07, 0xfb, 0xee, 0x54, 0x78} },
-{ 0x1970,      16,     {0x60, 0x30, 0x03, 0x03, 0x03, 0x30, 0xe3, 0x04, 0x74, 0x07, 0x7b, 0x08, 0xfd, 0xfc, 0xe0, 0xe0} },
-{ 0x1980,      16,     {0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xdd, 0xf6, 0xeb, 0xfe, 0x60, 0x19, 0xec, 0x64, 0x07, 0x70} },
-{ 0x1990,      16,     {0x11, 0x8b, 0x25, 0x90, 0x7f, 0xe2, 0xe0, 0x54, 0xbf, 0xf0, 0x90, 0x20, 0x58, 0x74, 0x00, 0xf0} },
-{ 0x19a0,      16,     {0x80, 0x1b, 0xe0, 0xde, 0xfd, 0x90, 0x7f, 0xe2, 0xe0, 0x54, 0xbf, 0xf0, 0x90, 0x20, 0x58, 0x74} },
-{ 0x19b0,      16,     {0x00, 0xf0, 0x90, 0x20, 0x19, 0xe0, 0x54, 0xfd, 0xf0, 0x90, 0x7f, 0xcd, 0xf0, 0x02, 0x13, 0x43} },
-{ 0x19c0,      1,      {0x32} },
-{ 0x19c1,      4,      {0xad, 0x07, 0xac, 0x06} },
-{ 0x19c5,      16,     {0x79, 0x06, 0xed, 0x24, 0x04, 0xf5, 0x82, 0xe4, 0x3c, 0xf5, 0x83, 0xe0, 0xfa, 0xa3, 0xe0, 0xfb} },
-{ 0x19d5,      16,     {0x4a, 0x70, 0x03, 0x02, 0x1b, 0x09, 0xe9, 0xb4, 0x07, 0x00, 0x40, 0x03, 0x02, 0x1a, 0xdb, 0x90} },
-{ 0x19e5,      16,     {0x19, 0xeb, 0xf8, 0x28, 0x28, 0x73, 0x02, 0x1a, 0xb9, 0x02, 0x1a, 0x71, 0x02, 0x1a, 0x5a, 0x02} },
-{ 0x19f5,      16,     {0x1a, 0x40, 0x02, 0x1a, 0x2f, 0x02, 0x1a, 0x1a, 0x02, 0x1a, 0x00, 0x90, 0x7f, 0xa5, 0xe0, 0x44} },
-{ 0x1a05,      16,     {0x80, 0xf0, 0x8d, 0x82, 0x8c, 0x83, 0xa3, 0xe0, 0xff, 0x25, 0xe0, 0x44, 0xa0, 0x90, 0x7f, 0xa6} },
-{ 0x1a15,      16,     {0xf0, 0x19, 0x02, 0x1a, 0xdb, 0x19, 0x8d, 0x82, 0x8c, 0x83, 0xe0, 0xc3, 0x94, 0x20, 0x40, 0x0a} },
-{ 0x1a25,      16,     {0xa3, 0xa3, 0xe0, 0x90, 0x7f, 0xa6, 0xf0, 0x02, 0x1a, 0xdb, 0x8d, 0x82, 0x8c, 0x83, 0xa3, 0xa3} },
-{ 0x1a35,      16,     {0xe0, 0xa3, 0xe0, 0x90, 0x7f, 0xa6, 0xf0, 0x19, 0x02, 0x1a, 0xdb, 0x90, 0x7f, 0xa5, 0xe0, 0x44} },
-{ 0x1a45,      16,     {0x80, 0xf0, 0x8d, 0x82, 0x8c, 0x83, 0xa3, 0xe0, 0xff, 0x25, 0xe0, 0x44, 0xa1, 0x90, 0x7f, 0xa6} },
-{ 0x1a55,      16,     {0xf0, 0x19, 0x02, 0x1a, 0xdb, 0xeb, 0x64, 0x01, 0x4a, 0x70, 0x08, 0x90, 0x7f, 0xa5, 0xe0, 0x44} },
-{ 0x1a65,      16,     {0x20, 0xf0, 0x19, 0x90, 0x7f, 0xa6, 0xe0, 0xf5, 0x69, 0x19, 0x80, 0x6a, 0xed, 0x24, 0x04, 0xf5} },
-{ 0x1a75,      16,     {0x82, 0xe4, 0x3c, 0xf5, 0x83, 0xe0, 0xfe, 0xa3, 0xe0, 0x64, 0x02, 0x4e, 0x70, 0x08, 0x90, 0x7f} },
-{ 0x1a85,      16,     {0xa5, 0xe0, 0x44, 0x20, 0xf0, 0x19, 0x90, 0x7f, 0xa6, 0xe0, 0xff, 0xed, 0x24, 0x06, 0xf5, 0x82} },
-{ 0x1a95,      16,     {0xe4, 0x3c, 0xf5, 0x83, 0xe4, 0x75, 0xf0, 0x01, 0x12, 0x9a, 0xa4, 0x85, 0xf0, 0x82, 0xf5, 0x83} },
-{ 0x1aa5,      16,     {0xef, 0xf0, 0xed, 0x24, 0x04, 0xf5, 0x82, 0xe4, 0x3c, 0xf5, 0x83, 0x74, 0xff, 0xf5, 0xf0, 0x12} },
-{ 0x1ab5,      16,     {0x9a, 0x8e, 0x80, 0x22, 0x90, 0x7f, 0xa5, 0xe0, 0x44, 0x40, 0xf0, 0x90, 0x7f, 0xa6, 0xe0, 0xff} },
-{ 0x1ac5,      16,     {0xed, 0x24, 0x06, 0xf5, 0x82, 0xe4, 0x3c, 0xf5, 0x83, 0xe0, 0xfa, 0xa3, 0xe0, 0xf5, 0x82, 0x8a} },
-{ 0x1ad5,      16,     {0x83, 0xef, 0xf0, 0x7f, 0x08, 0x22, 0x90, 0x7f, 0xa5, 0xe0, 0xf5, 0x69, 0x30, 0xe0, 0xf7, 0x30} },
-{ 0x1ae5,      16,     {0xe2, 0x07, 0xe0, 0x44, 0x40, 0xf0, 0x7f, 0x06, 0x22, 0xe9, 0xd3, 0x94, 0x02, 0x50, 0x03, 0x02} },
-{ 0x1af5,      16,     {0x19, 0xc7, 0xe5, 0x69, 0x30, 0xe1, 0x03, 0x02, 0x19, 0xc7, 0x90, 0x7f, 0xa5, 0xe0, 0x44, 0x40} },
-{ 0x1b05,      6,      {0xf0, 0x7f, 0x07, 0x22, 0x7f, 0x08} },
-{ 0x1b0b,      1,      {0x22} },
-{ 0x1b0c,      16,     {0x8e, 0x5f, 0x8f, 0x60, 0x8c, 0x61, 0x8d, 0x62, 0xaf, 0x03, 0x1b, 0xef, 0x60, 0x24, 0x05, 0x60} },
-{ 0x1b1c,      16,     {0xe5, 0x60, 0xae, 0x5f, 0x70, 0x02, 0x05, 0x5f, 0x14, 0xf5, 0x82, 0x8e, 0x83, 0xe0, 0xff, 0x05} },
-{ 0x1b2c,      16,     {0x62, 0xe5, 0x62, 0xac, 0x61, 0x70, 0x02, 0x05, 0x61, 0x14, 0xf5, 0x82, 0x8c, 0x83, 0xef, 0xf0} },
-{ 0x1b3c,      3,      {0x80, 0xd6, 0x22} },
-{ 0x8000,      4,      {0x8e, 0x69, 0x8f, 0x6a} },
-{ 0x8004,      16,     {0x75, 0x6b, 0x03, 0xe5, 0x6a, 0x24, 0x04, 0xf5, 0x82, 0xe4, 0x35, 0x69, 0xf5, 0x83, 0xe0, 0xfe} },
-{ 0x8014,      16,     {0xa3, 0xe0, 0x4e, 0x70, 0x03, 0x02, 0x81, 0x0e, 0xe5, 0x6b, 0x60, 0x4e, 0x14, 0x60, 0x38, 0x14} },
-{ 0x8024,      16,     {0x60, 0x20, 0x14, 0x60, 0x03, 0x02, 0x80, 0xb2, 0x90, 0x7f, 0xa5, 0xe0, 0x44, 0x80, 0xf0, 0x85} },
-{ 0x8034,      16,     {0x6a, 0x82, 0x85, 0x69, 0x83, 0xa3, 0xe0, 0xff, 0x25, 0xe0, 0x44, 0xa0, 0x90, 0x7f, 0xa6, 0xf0} },
-{ 0x8044,      16,     {0x80, 0x6c, 0x85, 0x6a, 0x82, 0x85, 0x69, 0x83, 0xe0, 0xc3, 0x94, 0x20, 0x40, 0x09, 0xa3, 0xa3} },
-{ 0x8054,      16,     {0xe0, 0x90, 0x7f, 0xa6, 0xf0, 0x80, 0x57, 0x15, 0x6b, 0x85, 0x6a, 0x82, 0x85, 0x69, 0x83, 0xa3} },
-{ 0x8064,      16,     {0xa3, 0xe0, 0xa3, 0xe0, 0x90, 0x7f, 0xa6, 0xf0, 0x80, 0x44, 0xe5, 0x6a, 0x24, 0x06, 0xf5, 0x82} },
-{ 0x8074,      16,     {0xe4, 0x35, 0x69, 0xf5, 0x83, 0xe4, 0x75, 0xf0, 0x01, 0x12, 0x9a, 0xa4, 0x85, 0xf0, 0x82, 0xf5} },
-{ 0x8084,      16,     {0x83, 0xe0, 0x90, 0x7f, 0xa6, 0xf0, 0x90, 0x7f, 0xa5, 0xe0, 0x44, 0x40, 0xf0, 0xe5, 0x6a, 0x24} },
-{ 0x8094,      16,     {0x04, 0xf5, 0x82, 0xe4, 0x35, 0x69, 0xf5, 0x83, 0x74, 0xff, 0xf5, 0xf0, 0x12, 0x9a, 0x8e, 0x85} },
-{ 0x80a4,      16,     {0x6a, 0x82, 0x85, 0x69, 0x83, 0xa3, 0xa3, 0xe4, 0x75, 0xf0, 0x01, 0x12, 0x9a, 0x8e, 0x90, 0x7f} },
-{ 0x80b4,      16,     {0xa5, 0xe0, 0xf5, 0x6c, 0x30, 0xe0, 0xf7, 0x30, 0xe2, 0x07, 0xe0, 0x44, 0x40, 0xf0, 0x7f, 0x06} },
-{ 0x80c4,      16,     {0x22, 0xe5, 0x6c, 0x20, 0xe1, 0x0a, 0x90, 0x7f, 0xa5, 0xe0, 0x44, 0x40, 0xf0, 0x7f, 0x07, 0x22} },
-{ 0x80d4,      16,     {0xe5, 0x6b, 0x70, 0x31, 0x7f, 0x01, 0x7e, 0x00, 0x12, 0x08, 0x92, 0x90, 0x7f, 0xa5, 0xe0, 0x44} },
-{ 0x80e4,      16,     {0x80, 0xf0, 0x85, 0x6a, 0x82, 0x85, 0x69, 0x83, 0xa3, 0xe0, 0xff, 0x25, 0xe0, 0x44, 0xa0, 0x90} },
-{ 0x80f4,      16,     {0x7f, 0xa6, 0xf0, 0x90, 0x7f, 0xa5, 0xe0, 0xf5, 0x6c, 0x30, 0xe0, 0xf7, 0x30, 0xe1, 0xd5, 0x75} },
-{ 0x8104,      12,     {0x6b, 0x03, 0x02, 0x80, 0x07, 0x15, 0x6b, 0x02, 0x80, 0x07, 0x7f, 0x08} },
-{ 0x8110,      1,      {0x22} },
-{ 0x8111,      2,      {0xac, 0x07} },
-{ 0x8113,      16,     {0x90, 0x7f, 0xa5, 0xe0, 0x44, 0x80, 0xf0, 0xec, 0x25, 0xe0, 0x44, 0x41, 0x90, 0x7f, 0xa6, 0xf0} },
-{ 0x8123,      16,     {0x7b, 0x3c, 0xaf, 0x03, 0x1b, 0xef, 0x70, 0x16, 0x90, 0x7f, 0xa5, 0xe0, 0x44, 0x40, 0xf0, 0x90} },
-{ 0x8133,      16,     {0x7f, 0xa6, 0xe0, 0xfd, 0x7d, 0x32, 0xaf, 0x05, 0x1d, 0xef, 0x60, 0xd4, 0x80, 0xf8, 0x90, 0x7f} },
-{ 0x8143,      16,     {0xa5, 0xe0, 0xfd, 0x30, 0xe0, 0xdc, 0x20, 0xe1, 0x09, 0xe0, 0x44, 0x40, 0xf0, 0x7e, 0xff, 0x7f} },
-{ 0x8153,      16,     {0xf9, 0x22, 0xed, 0x30, 0xe2, 0x0c, 0x90, 0x7f, 0xa5, 0xe0, 0x44, 0x40, 0xf0, 0x7e, 0xff, 0x7f} },
-{ 0x8163,      16,     {0xfa, 0x22, 0x90, 0x7f, 0xa5, 0xe0, 0x44, 0x20, 0xf0, 0x90, 0x7f, 0xa6, 0xe0, 0xfd, 0x7b, 0x1e} },
-{ 0x8173,      16,     {0xaf, 0x03, 0x1b, 0xef, 0x70, 0x16, 0x90, 0x7f, 0xa5, 0xe0, 0x44, 0x40, 0xf0, 0x90, 0x7f, 0xa6} },
-{ 0x8183,      16,     {0xe0, 0xfd, 0x7d, 0x32, 0xaf, 0x05, 0x1d, 0xef, 0x60, 0x86, 0x80, 0xf8, 0x90, 0x7f, 0xa5, 0xe0} },
-{ 0x8193,      16,     {0xfd, 0x20, 0xe0, 0xdc, 0x7b, 0x3c, 0xaf, 0x03, 0x1b, 0xef, 0x70, 0x19, 0x90, 0x7f, 0xa5, 0xe0} },
-{ 0x81a3,      16,     {0x44, 0x40, 0xf0, 0x90, 0x7f, 0xa6, 0xe0, 0xfd, 0x7d, 0x32, 0xaf, 0x05, 0x1d, 0xef, 0x70, 0x03} },
-{ 0x81b3,      16,     {0x02, 0x81, 0x13, 0x80, 0xf5, 0x90, 0x7f, 0xa5, 0xe0, 0xfd, 0x30, 0xe0, 0xd9, 0x30, 0xe2, 0x09} },
-{ 0x81c3,      16,     {0xe0, 0x44, 0x40, 0xf0, 0x7e, 0xff, 0x7f, 0xfa, 0x22, 0xc2, 0xaf, 0x90, 0x7f, 0xa5, 0xe0, 0x44} },
-{ 0x81d3,      12,     {0x40, 0xf0, 0x90, 0x7f, 0xa6, 0xe0, 0xfd, 0xd2, 0xaf, 0xff, 0x7e, 0x00} },
-{ 0x81df,      1,      {0x22} },
-{ 0x81e0,      16,     {0xef, 0x75, 0xf0, 0x08, 0xa4, 0x24, 0x00, 0xf5, 0x82, 0xe4, 0x34, 0x20, 0xab, 0x82, 0xfa, 0xf5} },
-{ 0x81f0,      16,     {0x83, 0xa3, 0xa3, 0xa3, 0xe0, 0xf9, 0x74, 0xbf, 0xf0, 0x8b, 0x82, 0x8a, 0x83, 0xa3, 0xa3, 0xe0} },
-{ 0x8200,      16,     {0x44, 0x10, 0xf0, 0x8b, 0x82, 0x8a, 0x83, 0xa3, 0xa3, 0xa3, 0xe4, 0xf0, 0x8b, 0x82, 0x8a, 0x83} },
-{ 0x8210,      16,     {0xa3, 0xf0, 0xed, 0x60, 0x29, 0x74, 0x01, 0x7e, 0x00, 0xa8, 0x07, 0x08, 0x80, 0x05, 0xc3, 0x33} },
-{ 0x8220,      16,     {0xce, 0x33, 0xce, 0xd8, 0xf9, 0xff, 0xe4, 0xef, 0x55, 0x3b, 0x60, 0x0a, 0x8b, 0x82, 0x8a, 0x83} },
-{ 0x8230,      16,     {0xa3, 0x74, 0x01, 0xf0, 0x80, 0x08, 0x8b, 0x82, 0x8a, 0x83, 0xa3, 0x74, 0xad, 0xf0, 0x8b, 0x82} },
-{ 0x8240,      16,     {0x8a, 0x83, 0xa3, 0xa3, 0xa3, 0x74, 0xbf, 0xf0, 0x8b, 0x82, 0x8a, 0x83, 0xa3, 0xa3, 0xe0, 0x54} },
-{ 0x8250,      15,     {0xef, 0xf0, 0xae, 0x02, 0xaf, 0x03, 0x8f, 0x82, 0x8e, 0x83, 0xa3, 0xa3, 0xa3, 0xe9, 0xf0} },
-{ 0x825f,      1,      {0x22} },
-{ 0x8260,      4,      {0x8f, 0x68, 0x8d, 0x69} },
-{ 0x8264,      16,     {0xe4, 0xf5, 0x6a, 0x74, 0x3c, 0x2f, 0xf8, 0x76, 0x08, 0xe5, 0x68, 0x75, 0xf0, 0x0d, 0xa4, 0x24} },
-{ 0x8274,      16,     {0xa0, 0xf5, 0x82, 0xe4, 0x34, 0x02, 0xf5, 0x83, 0xe0, 0xfc, 0xa3, 0xe0, 0xfd, 0xa3, 0xe0, 0xfe} },
-{ 0x8284,      16,     {0xa3, 0xe0, 0xff, 0x7b, 0x80, 0x7a, 0x25, 0x79, 0x00, 0x78, 0x00, 0xc3, 0x12, 0x9b, 0xc0, 0x50} },
-{ 0x8294,      16,     {0x3c, 0xe5, 0x68, 0x75, 0xf0, 0x0d, 0xa4, 0x24, 0xa0, 0xf5, 0x82, 0xe4, 0x34, 0x02, 0xf5, 0x83} },
-{ 0x82a4,      16,     {0xe0, 0xfc, 0xa3, 0xe0, 0xfd, 0xa3, 0xe0, 0xfe, 0xa3, 0xe0, 0xff, 0x7b, 0x00, 0x7a, 0x96, 0x78} },
-{ 0x82b4,      16,     {0x00, 0xc3, 0x12, 0x9b, 0xc0, 0x40, 0x0c, 0x75, 0x6a, 0x40, 0x74, 0x3c, 0x25, 0x68, 0xf8, 0x76} },
-{ 0x82c4,      16,     {0x10, 0x80, 0x0a, 0x75, 0x6a, 0x80, 0x74, 0x3c, 0x25, 0x68, 0xf8, 0x76, 0x38, 0xe5, 0x6a, 0x45} },
-{ 0x82d4,      16,     {0x69, 0x44, 0x01, 0xff, 0xe5, 0x68, 0x75, 0xf0, 0x08, 0xa4, 0x24, 0x02, 0xf5, 0x82, 0xe4, 0x34} },
-{ 0x82e4,      5,      {0x20, 0xf5, 0x83, 0xef, 0xf0} },
-{ 0x82e9,      1,      {0x22} },
-{ 0x82ea,      16,     {0x8f, 0x82, 0x8e, 0x83, 0xe0, 0x14, 0xf5, 0x5f, 0x75, 0xf0, 0x08, 0xa4, 0x24, 0x00, 0xf5, 0x82} },
-{ 0x82fa,      16,     {0xe4, 0x34, 0x20, 0xaf, 0x82, 0xf5, 0x61, 0x8f, 0x62, 0xf5, 0x83, 0xe5, 0x82, 0x24, 0x04, 0xf5} },
-{ 0x830a,      16,     {0x82, 0xe4, 0x35, 0x83, 0xf5, 0x83, 0xe0, 0x44, 0x03, 0xf0, 0xaf, 0x5f, 0x7d, 0x06, 0x12, 0x82} },
-{ 0x831a,      16,     {0x60, 0xaf, 0x5f, 0x7d, 0x01, 0x12, 0x81, 0xe0, 0x85, 0x62, 0x82, 0x85, 0x61, 0x83, 0xa3, 0xa3} },
-{ 0x832a,      16,     {0xe0, 0x20, 0xe0, 0x28, 0xe0, 0xf5, 0x60, 0xe5, 0x62, 0x24, 0x05, 0xf5, 0x82, 0xe4, 0x35, 0x61} },
-{ 0x833a,      16,     {0xf5, 0x83, 0xe0, 0xf5, 0x60, 0xe5, 0x62, 0x24, 0x06, 0xf5, 0x82, 0xe4, 0x35, 0x61, 0xf5, 0x83} },
-{ 0x834a,      16,     {0xe0, 0xf5, 0x60, 0xaf, 0x5f, 0x7d, 0x06, 0x12, 0x82, 0x60, 0x80, 0xcc, 0x74, 0x96, 0x25, 0x5f} },
-{ 0x835a,      16,     {0xf5, 0x82, 0xe4, 0x34, 0x02, 0xf5, 0x83, 0xe4, 0xf0, 0xe5, 0x5f, 0x25, 0xe0, 0xff, 0xc3, 0x74} },
-{ 0x836a,      16,     {0x0c, 0x9f, 0x75, 0xf0, 0x40, 0xa4, 0x24, 0x40, 0xf5, 0x82, 0xe5, 0xf0, 0x34, 0x7b, 0xaf, 0x82} },
-{ 0x837a,      16,     {0xfe, 0xe5, 0x5f, 0x25, 0xe0, 0x24, 0x8d, 0xf5, 0x82, 0xe4, 0x34, 0x02, 0xf5, 0x83, 0xee, 0xf0} },
-{ 0x838a,      16,     {0xa3, 0xef, 0xf0, 0xaf, 0x5f, 0x74, 0x01, 0xa8, 0x07, 0x08, 0x80, 0x02, 0xc3, 0x33, 0xd8, 0xfc} },
-{ 0x839a,      4,      {0x42, 0x30, 0x7f, 0x00} },
-{ 0x839e,      1,      {0x22} },
-{ 0x839f,      16,     {0x8f, 0x82, 0x8e, 0x83, 0xe0, 0x14, 0xf5, 0x47, 0x75, 0xf0, 0x08, 0xa4, 0x24, 0x00, 0xf5, 0x82} },
-{ 0x83af,      16,     {0xe4, 0x34, 0x20, 0xaf, 0x82, 0xf5, 0x49, 0x8f, 0x4a, 0x74, 0x96, 0x25, 0x47, 0xf5, 0x82, 0xe4} },
-{ 0x83bf,      16,     {0x34, 0x02, 0xf5, 0x83, 0xe4, 0xf0, 0xe5, 0x4a, 0x24, 0x04, 0xf5, 0x82, 0xe4, 0x35, 0x49, 0xf5} },
-{ 0x83cf,      16,     {0x83, 0xe0, 0x54, 0xfc, 0xf0, 0xaf, 0x47, 0xe4, 0xfd, 0x12, 0x81, 0xe0, 0xaf, 0x47, 0x7d, 0x06} },
-{ 0x83df,      16,     {0x12, 0x82, 0x60, 0xe5, 0x4a, 0x24, 0x05, 0xf5, 0x82, 0xe4, 0x35, 0x49, 0xf5, 0x83, 0xe0, 0x30} },
-{ 0x83ef,      16,     {0xe0, 0x0b, 0x85, 0x4a, 0x82, 0x85, 0x49, 0x83, 0xe0, 0xf5, 0x48, 0x80, 0xe6, 0xaf, 0x47, 0x74} },
-{ 0x83ff,      16,     {0x01, 0xa8, 0x07, 0x08, 0x80, 0x02, 0xc3, 0x33, 0xd8, 0xfc, 0xf4, 0x52, 0x30, 0xe5, 0x47, 0x25} },
-{ 0x840f,      13,     {0xe0, 0x24, 0xc7, 0xf5, 0x82, 0xe4, 0x34, 0x7f, 0xf5, 0x83, 0xe4, 0xf0, 0xff} },
-{ 0x841c,      1,      {0x22} },
-{ 0x841d,      4,      {0x8e, 0x47, 0x8f, 0x48} },
-{ 0x8421,      16,     {0x8f, 0x82, 0x8e, 0x83, 0xe0, 0x14, 0xf5, 0x49, 0x75, 0xf0, 0x08, 0xa4, 0x24, 0x01, 0xf5, 0x82} },
-{ 0x8431,      16,     {0xe4, 0x34, 0x20, 0xf5, 0x83, 0xe0, 0x54, 0x03, 0x70, 0x23, 0x85, 0x48, 0x82, 0x8e, 0x83, 0xa3} },
-{ 0x8441,      16,     {0xe0, 0x30, 0xe0, 0x07, 0xaf, 0x49, 0x7d, 0x02, 0x12, 0x82, 0x60, 0x85, 0x48, 0x82, 0x85, 0x47} },
-{ 0x8451,      15,     {0x83, 0xa3, 0xe0, 0x30, 0xe1, 0x07, 0xaf, 0x49, 0x7d, 0x04, 0x12, 0x82, 0x60, 0x7f, 0x00} },
-{ 0x8460,      1,      {0x22} },
-{ 0x8461,      16,     {0x8f, 0x82, 0x8e, 0x83, 0xc0, 0x83, 0xc0, 0x82, 0xe0, 0xfd, 0xa3, 0xa3, 0xa3, 0xe0, 0xfc, 0xed} },
-{ 0x8471,      16,     {0x6c, 0xd0, 0x82, 0xd0, 0x83, 0xf0, 0x8f, 0x82, 0x8e, 0x83, 0xa3, 0xa3, 0xa3, 0xc0, 0x83, 0xc0} },
-{ 0x8481,      16,     {0x82, 0xe0, 0xfd, 0x8f, 0x82, 0x8e, 0x83, 0xe0, 0xfc, 0xed, 0x6c, 0xd0, 0x82, 0xd0, 0x83, 0xf0} },
-{ 0x8491,      16,     {0x8f, 0x82, 0x8e, 0x83, 0xc0, 0x83, 0xc0, 0x82, 0xa3, 0xa3, 0xa3, 0xe0, 0xfd, 0xec, 0x6d, 0xd0} },
-{ 0x84a1,      16,     {0x82, 0xd0, 0x83, 0xf0, 0x8f, 0x82, 0x8e, 0x83, 0xa3, 0xc0, 0x83, 0xc0, 0x82, 0xe0, 0xfd, 0x8f} },
-{ 0x84b1,      16,     {0x82, 0x8e, 0x83, 0xa3, 0xa3, 0xe0, 0xfc, 0xed, 0x6c, 0xd0, 0x82, 0xd0, 0x83, 0xf0, 0x8f, 0x82} },
-{ 0x84c1,      16,     {0x8e, 0x83, 0xa3, 0xa3, 0xc0, 0x83, 0xc0, 0x82, 0xe0, 0xfd, 0x8f, 0x82, 0x8e, 0x83, 0xa3, 0xe0} },
-{ 0x84d1,      16,     {0xfc, 0xed, 0x6c, 0xd0, 0x82, 0xd0, 0x83, 0xf0, 0x8f, 0x82, 0x8e, 0x83, 0xa3, 0xc0, 0x83, 0xc0} },
-{ 0x84e1,      16,     {0x82, 0xe0, 0xfd, 0x8f, 0x82, 0x8e, 0x83, 0xa3, 0xa3, 0xe0, 0xff, 0xed, 0x6f, 0xd0, 0x82, 0xd0} },
-{ 0x84f1,      3,      {0x83, 0xf0, 0x22} },
-{ 0x84f4,      4,      {0x8e, 0x5f, 0x8f, 0x60} },
-{ 0x84f8,      16,     {0x8f, 0x82, 0x8e, 0x83, 0xe0, 0xff, 0x75, 0xf0, 0x08, 0xa4, 0x24, 0xf8, 0xf5, 0x82, 0xe4, 0x34} },
-{ 0x8508,      16,     {0x1f, 0xad, 0x82, 0xf5, 0x66, 0x8d, 0x67, 0xaa, 0x5f, 0xa9, 0x60, 0x7b, 0x01, 0xc0, 0x03, 0xc0} },
-{ 0x8518,      16,     {0x01, 0xef, 0x75, 0xf0, 0x0d, 0xa4, 0x24, 0x92, 0xf9, 0x74, 0x02, 0x35, 0xf0, 0xa8, 0x01, 0xfc} },
-{ 0x8528,      16,     {0xad, 0x03, 0xd0, 0x01, 0xd0, 0x03, 0x7e, 0x00, 0x7f, 0x0d, 0x12, 0x9a, 0x1f, 0x85, 0x60, 0x82} },
-{ 0x8538,      16,     {0x85, 0x5f, 0x83, 0xa3, 0xe0, 0xf8, 0xa3, 0xe0, 0xf9, 0xa3, 0xe0, 0xfa, 0xa3, 0xe0, 0xfb, 0x7f} },
-{ 0x8548,      16,     {0x00, 0x7e, 0x08, 0x7d, 0x07, 0x7c, 0x00, 0x12, 0x9b, 0x2e, 0x8f, 0x64, 0x8e, 0x63, 0x8d, 0x62} },
-{ 0x8558,      16,     {0x8c, 0x61, 0x7b, 0x00, 0x7a, 0x00, 0x79, 0x00, 0x78, 0x00, 0xc3, 0x12, 0x9b, 0xc0, 0x70, 0x09} },
-{ 0x8568,      16,     {0x75, 0x64, 0x01, 0xf5, 0x63, 0xf5, 0x62, 0xf5, 0x61, 0x7f, 0xff, 0x7e, 0xff, 0x7d, 0x00, 0x7c} },
-{ 0x8578,      16,     {0x00, 0xab, 0x64, 0xaa, 0x63, 0xa9, 0x62, 0xa8, 0x61, 0xd3, 0x12, 0x9b, 0xc0, 0x40, 0x0c, 0x75} },
-{ 0x8588,      16,     {0x64, 0xff, 0x75, 0x63, 0xff, 0x75, 0x62, 0x00, 0x75, 0x61, 0x00, 0x85, 0x67, 0x82, 0x85, 0x66} },
-{ 0x8598,      16,     {0x83, 0xa3, 0xa3, 0xa3, 0xe0, 0x44, 0x80, 0xf0, 0x85, 0x67, 0x82, 0x85, 0x66, 0x83, 0xe5, 0x64} },
-{ 0x85a8,      16,     {0xf0, 0xaf, 0x64, 0xae, 0x63, 0xad, 0x62, 0xac, 0x61, 0x78, 0x08, 0x12, 0x9b, 0xd1, 0x85, 0x67} },
-{ 0x85b8,      16,     {0x82, 0x85, 0x66, 0x83, 0xa3, 0xef, 0xf0, 0x85, 0x67, 0x82, 0x85, 0x66, 0x83, 0xa3, 0xa3, 0xa3} },
-{ 0x85c8,      16,     {0xe0, 0x54, 0x7f, 0xf0, 0xe4, 0xf5, 0x65, 0xe5, 0x60, 0x24, 0x08, 0xf5, 0x82, 0xe4, 0x35, 0x5f} },
-{ 0x85d8,      16,     {0xf5, 0x83, 0xe0, 0xff, 0xb4, 0x62, 0x05, 0x43, 0x65, 0x0a, 0x80, 0x10, 0xef, 0xb4, 0x72, 0x05} },
-{ 0x85e8,      16,     {0x43, 0x65, 0x08, 0x80, 0x07, 0xef, 0xb4, 0x74, 0x03, 0x43, 0x65, 0x02, 0xe5, 0x60, 0x24, 0x0b} },
-{ 0x85f8,      16,     {0xf5, 0x82, 0xe4, 0x35, 0x5f, 0xf5, 0x83, 0xe0, 0xff, 0x30, 0xe3, 0x03, 0x43, 0x65, 0x80, 0xef} },
-{ 0x8608,      16,     {0x30, 0xe7, 0x12, 0x43, 0x65, 0x40, 0xe5, 0x67, 0x24, 0x04, 0xf5, 0x82, 0xe4, 0x35, 0x66, 0xf5} },
-{ 0x8618,      16,     {0x83, 0xe0, 0x44, 0x02, 0xf0, 0xe5, 0x60, 0x24, 0x0b, 0xf5, 0x82, 0xe4, 0x35, 0x5f, 0xf5, 0x83} },
-{ 0x8628,      16,     {0xe0, 0xff, 0x20, 0xe1, 0x03, 0x30, 0xe4, 0x27, 0x85, 0x60, 0x82, 0x85, 0x5f, 0x83, 0xe0, 0x14} },
-{ 0x8638,      16,     {0xff, 0x74, 0x01, 0xa8, 0x07, 0x08, 0x80, 0x02, 0xc3, 0x33, 0xd8, 0xfc, 0x42, 0x3b, 0xe5, 0x67} },
-{ 0x8648,      16,     {0x24, 0x04, 0xf5, 0x82, 0xe4, 0x35, 0x66, 0xf5, 0x83, 0xe0, 0x44, 0x01, 0xf0, 0x80, 0x17, 0x85} },
-{ 0x8658,      16,     {0x60, 0x82, 0x85, 0x5f, 0x83, 0xe0, 0x14, 0xff, 0x74, 0x01, 0xa8, 0x07, 0x08, 0x80, 0x02, 0xc3} },
-{ 0x8668,      16,     {0x33, 0xd8, 0xfc, 0xf4, 0x52, 0x3b, 0x85, 0x67, 0x82, 0x85, 0x66, 0x83, 0xa3, 0xa3, 0xa3, 0x74} },
-{ 0x8678,      16,     {0xbf, 0xf0, 0x85, 0x67, 0x82, 0x85, 0x66, 0x83, 0xa3, 0xa3, 0xe4, 0xf0, 0xe5, 0x65, 0xf0, 0xe5} },
-{ 0x8688,      16,     {0x60, 0x24, 0x0a, 0xf5, 0x82, 0xe4, 0x35, 0x5f, 0xf5, 0x83, 0xe0, 0xff, 0xe5, 0x67, 0x24, 0x04} },
-{ 0x8698,      16,     {0xf5, 0x82, 0xe4, 0x35, 0x66, 0xf5, 0x83, 0xef, 0xf0, 0xe5, 0x60, 0x24, 0x0a, 0xf5, 0x82, 0xe4} },
-{ 0x86a8,      16,     {0x35, 0x5f, 0xf5, 0x83, 0xe0, 0xff, 0xe5, 0x67, 0x24, 0x05, 0xf5, 0x82, 0xe4, 0x35, 0x66, 0xf5} },
-{ 0x86b8,      16,     {0x83, 0xef, 0xf0, 0xe5, 0x60, 0x24, 0x09, 0xf5, 0x82, 0xe4, 0x35, 0x5f, 0xf5, 0x83, 0xe0, 0xff} },
-{ 0x86c8,      16,     {0xe5, 0x67, 0x24, 0x06, 0xf5, 0x82, 0xe4, 0x35, 0x66, 0xf5, 0x83, 0xef, 0xf0, 0xe5, 0x60, 0x24} },
-{ 0x86d8,      16,     {0x09, 0xf5, 0x82, 0xe4, 0x35, 0x5f, 0xf5, 0x83, 0xe0, 0xff, 0xe5, 0x67, 0x24, 0x07, 0xf5, 0x82} },
-{ 0x86e8,      16,     {0xe4, 0x35, 0x66, 0xf5, 0x83, 0xef, 0xf0, 0x85, 0x67, 0x82, 0x85, 0x66, 0x83, 0xa3, 0xa3, 0xa3} },
-{ 0x86f8,      16,     {0xe4, 0xf0, 0x85, 0x67, 0x82, 0x85, 0x66, 0x83, 0xa3, 0xa3, 0xf0, 0x85, 0x60, 0x82, 0x85, 0x5f} },
-{ 0x8708,      16,     {0x83, 0xe0, 0x14, 0xff, 0x7d, 0x06, 0x12, 0x82, 0x60, 0x75, 0x65, 0x08, 0xe5, 0x60, 0x24, 0x0c} },
-{ 0x8718,      16,     {0xf5, 0x82, 0xe4, 0x35, 0x5f, 0xf5, 0x83, 0xe0, 0x60, 0x03, 0x43, 0x65, 0x10, 0xe5, 0x67, 0x24} },
-{ 0x8728,      16,     {0x04, 0xf5, 0x82, 0xe4, 0x35, 0x66, 0xf5, 0x83, 0xe0, 0x54, 0x03, 0x45, 0x65, 0xf0, 0xe5, 0x60} },
-{ 0x8738,      16,     {0x24, 0x06, 0xf5, 0x82, 0xe4, 0x35, 0x5f, 0xf5, 0x83, 0xe0, 0x14, 0xff, 0x25, 0xe0, 0x25, 0xe0} },
-{ 0x8748,      16,     {0xff, 0xe5, 0x60, 0x24, 0x05, 0xf5, 0x82, 0xe4, 0x35, 0x5f, 0xf5, 0x83, 0xe0, 0x24, 0xfb, 0x4f} },
-{ 0x8758,      16,     {0xf5, 0x65, 0xe5, 0x60, 0x24, 0x07, 0xf5, 0x82, 0xe4, 0x35, 0x5f, 0xf5, 0x83, 0xe0, 0x24, 0xd0} },
-{ 0x8768,      16,     {0x60, 0x15, 0x14, 0x60, 0x17, 0x24, 0xc2, 0x60, 0x09, 0x24, 0x0a, 0x70, 0x12, 0x43, 0x65, 0x18} },
-{ 0x8778,      16,     {0x80, 0x0d, 0x43, 0x65, 0x08, 0x80, 0x08, 0x43, 0x65, 0x38, 0x80, 0x03, 0x43, 0x65, 0x28, 0x85} },
-{ 0x8788,      13,     {0x67, 0x82, 0x85, 0x66, 0x83, 0xa3, 0xa3, 0xa3, 0xe5, 0x65, 0xf0, 0x7f, 0x00} },
-{ 0x8795,      1,      {0x22} },
-{ 0x8796,      4,      {0x8e, 0x47, 0x8f, 0x48} },
-{ 0x879a,      16,     {0x8f, 0x82, 0x8e, 0x83, 0xe0, 0x14, 0xf5, 0x4a, 0x75, 0xf0, 0x08, 0xa4, 0x24, 0x00, 0xf5, 0x82} },
-{ 0x87aa,      16,     {0xe4, 0x34, 0x20, 0xaf, 0x82, 0xf5, 0x4d, 0x8f, 0x4e, 0x7e, 0x7b, 0x7f, 0x80, 0xef, 0x24, 0x01} },
-{ 0x87ba,      16,     {0xf5, 0x4c, 0xe4, 0x3e, 0xf5, 0x4b, 0x8f, 0x82, 0x8e, 0x83, 0x74, 0x08, 0xf0, 0xe5, 0x4a, 0x04} },
-{ 0x87ca,      16,     {0x85, 0x4c, 0x82, 0x85, 0x4b, 0x83, 0xf0, 0xa3, 0xe4, 0xf0, 0xe5, 0x4e, 0x24, 0x06, 0xf5, 0x82} },
-{ 0x87da,      16,     {0xe4, 0x35, 0x4d, 0xf5, 0x83, 0xe0, 0x85, 0x4c, 0x82, 0x85, 0x4b, 0x83, 0xa3, 0xa3, 0xf0, 0xe5} },
-{ 0x87ea,      16,     {0x4e, 0x24, 0x05, 0xf5, 0x82, 0xe4, 0x35, 0x4d, 0xf5, 0x83, 0xe0, 0x54, 0x1e, 0x85, 0x4c, 0x82} },
-{ 0x87fa,      16,     {0x85, 0x4b, 0x83, 0xa3, 0xa3, 0xa3, 0xf0, 0x85, 0x48, 0x82, 0x85, 0x47, 0x83, 0xe0, 0x24, 0x2b} },
-{ 0x880a,      16,     {0xf8, 0xe6, 0xff, 0xe5, 0x4c, 0x24, 0x04, 0xf5, 0x82, 0xe4, 0x35, 0x4b, 0xf5, 0x83, 0xef, 0xf0} },
-{ 0x881a,      16,     {0xaf, 0x4a, 0x74, 0x01, 0xa8, 0x07, 0x08, 0x80, 0x02, 0xc3, 0x33, 0xd8, 0xfc, 0xf5, 0x49, 0x7f} },
-{ 0x882a,      16,     {0x02, 0x12, 0x81, 0x11, 0xc3, 0xee, 0x64, 0x80, 0x94, 0x80, 0x40, 0xf3, 0xe5, 0x49, 0x5f, 0xff} },
-{ 0x883a,      16,     {0xe5, 0x4c, 0x24, 0x05, 0xf5, 0x82, 0xe4, 0x35, 0x4b, 0xf5, 0x83, 0xef, 0xf0, 0x90, 0x7f, 0xc3} },
-{ 0x884a,      5,      {0x74, 0x07, 0xf0, 0x7f, 0x00} },
-{ 0x884f,      1,      {0x22} },
-{ 0x8850,      16,     {0x8f, 0x82, 0x8e, 0x83, 0xe0, 0x75, 0xf0, 0x08, 0xa4, 0x24, 0xf8, 0xf5, 0x82, 0xe4, 0x34, 0x1f} },
-{ 0x8860,      16,     {0xaf, 0x82, 0xf5, 0x47, 0x8f, 0x48, 0x7e, 0x7b, 0x7f, 0x80, 0xef, 0x24, 0x01, 0xfd, 0xe4, 0x3e} },
-{ 0x8870,      16,     {0xfc, 0x8f, 0x82, 0x8e, 0x83, 0x74, 0x0a, 0xf0, 0xe5, 0x48, 0x24, 0x04, 0xf5, 0x82, 0xe4, 0x35} },
-{ 0x8880,      16,     {0x47, 0xf5, 0x83, 0xe0, 0x8d, 0x82, 0x8c, 0x83, 0xf0, 0x90, 0x7f, 0xc3, 0x74, 0x02, 0xf0, 0x7f} },
-{ 0x8890,      1,      {0x00} },
-{ 0x8891,      1,      {0x22} },
-{ 0x8892,      16,     {0x8f, 0x82, 0x8e, 0x83, 0xe0, 0x75, 0xf0, 0x08, 0xa4, 0x24, 0xf8, 0xf5, 0x82, 0xe4, 0x34, 0x1f} },
-{ 0x88a2,      16,     {0xad, 0x82, 0xfc, 0x8f, 0x82, 0xa3, 0xe0, 0x60, 0x0f, 0xed, 0x24, 0x04, 0xf5, 0x82, 0xe4, 0x3c} },
-{ 0x88b2,      16,     {0xf5, 0x83, 0xe0, 0x44, 0x02, 0xf0, 0x80, 0x11, 0xae, 0x04, 0xaf, 0x05, 0xef, 0x24, 0x04, 0xf5} },
-{ 0x88c2,      11,     {0x82, 0xe4, 0x3e, 0xf5, 0x83, 0xe0, 0x54, 0xfd, 0xf0, 0x7f, 0x00} },
-{ 0x88cd,      1,      {0x22} },
-{ 0x88ce,      16,     {0x8f, 0x82, 0x8e, 0x83, 0xe0, 0x75, 0xf0, 0x08, 0xa4, 0x24, 0xf8, 0xf5, 0x82, 0xe4, 0x34, 0x1f} },
-{ 0x88de,      16,     {0xad, 0x82, 0xfc, 0x8f, 0x82, 0xa3, 0xe0, 0x60, 0x0f, 0xed, 0x24, 0x04, 0xf5, 0x82, 0xe4, 0x3c} },
-{ 0x88ee,      16,     {0xf5, 0x83, 0xe0, 0x44, 0x01, 0xf0, 0x80, 0x11, 0xae, 0x04, 0xaf, 0x05, 0xef, 0x24, 0x04, 0xf5} },
-{ 0x88fe,      11,     {0x82, 0xe4, 0x3e, 0xf5, 0x83, 0xe0, 0x54, 0xfe, 0xf0, 0x7f, 0x00} },
-{ 0x8909,      1,      {0x22} },
-{ 0x890a,      16,     {0x8f, 0x82, 0x8e, 0x83, 0xe0, 0x75, 0xf0, 0x08, 0xa4, 0x24, 0xf8, 0xf5, 0x82, 0xe4, 0x34, 0x1f} },
-{ 0x891a,      16,     {0xad, 0x82, 0xfc, 0x8f, 0x82, 0xa3, 0xe0, 0x60, 0x0d, 0x8d, 0x82, 0x8c, 0x83, 0xa3, 0xa3, 0xa3} },
-{ 0x892a,      16,     {0xe0, 0x44, 0x40, 0xf0, 0x80, 0x0f, 0xae, 0x04, 0xaf, 0x05, 0x8f, 0x82, 0x8e, 0x83, 0xa3, 0xa3} },
-{ 0x893a,      7,      {0xa3, 0xe0, 0x54, 0xbf, 0xf0, 0x7f, 0x00} },
-{ 0x8941,      1,      {0x22} },
-{ 0x8942,      4,      {0x8e, 0x47, 0x8f, 0x48} },
-{ 0x8946,      16,     {0x8f, 0x82, 0x8e, 0x83, 0xa3, 0xe0, 0xf5, 0x4b, 0x8f, 0x82, 0x8e, 0x83, 0xe0, 0x24, 0xfe, 0x60} },
-{ 0x8956,      16,     {0x16, 0x14, 0x60, 0x1f, 0x14, 0x60, 0x28, 0x24, 0x03, 0x70, 0x2e, 0x7e, 0x7e, 0x7f, 0x80, 0x75} },
-{ 0x8966,      16,     {0x49, 0x7e, 0x75, 0x4a, 0x80, 0x80, 0x22, 0x7e, 0x7e, 0x7f, 0x00, 0x75, 0x49, 0x7e, 0x75, 0x4a} },
-{ 0x8976,      16,     {0x00, 0x80, 0x16, 0x7e, 0x7d, 0x7f, 0x80, 0x75, 0x49, 0x7d, 0x75, 0x4a, 0x80, 0x80, 0x0a, 0x7e} },
-{ 0x8986,      16,     {0x7d, 0x7f, 0x00, 0x75, 0x49, 0x7d, 0x75, 0x4a, 0x00, 0xe5, 0x4b, 0x70, 0x20, 0x85, 0x4a, 0x82} },
-{ 0x8996,      16,     {0x85, 0x49, 0x83, 0x74, 0xff, 0xf0, 0x85, 0x48, 0x82, 0x85, 0x47, 0x83, 0xe0, 0x25, 0xe0, 0x24} },
-{ 0x89a6,      16,     {0xb5, 0xf5, 0x82, 0xe4, 0x34, 0x7f, 0xf5, 0x83, 0x74, 0x01, 0xf0, 0x80, 0x3a, 0xe5, 0x48, 0x24} },
-{ 0x89b6,      16,     {0x02, 0xff, 0xe4, 0x35, 0x47, 0xfe, 0xe5, 0x4b, 0x60, 0x10, 0x8f, 0x82, 0x8e, 0x83, 0xe0, 0x85} },
-{ 0x89c6,      16,     {0x4a, 0x82, 0x85, 0x49, 0x83, 0xf0, 0x15, 0x4b, 0x80, 0xec, 0x85, 0x48, 0x82, 0x85, 0x47, 0x83} },
-{ 0x89d6,      16,     {0xa3, 0xe0, 0xff, 0x85, 0x48, 0x82, 0x85, 0x47, 0x83, 0xe0, 0x25, 0xe0, 0x24, 0xb5, 0xf5, 0x82} },
-{ 0x89e6,      9,      {0xe4, 0x34, 0x7f, 0xf5, 0x83, 0xef, 0xf0, 0x7f, 0x00} },
-{ 0x89ef,      1,      {0x22} },
-{ 0x89f0,      16,     {0xef, 0x24, 0x01, 0xf5, 0x48, 0xe4, 0x3e, 0xf5, 0x47, 0x7c, 0x7b, 0x7d, 0x80, 0x7e, 0x7b, 0x7f} },
-{ 0x8a00,      16,     {0x80, 0x8f, 0x82, 0x8e, 0x83, 0x74, 0x07, 0xf0, 0xef, 0x24, 0x01, 0xff, 0xe4, 0x3e, 0x90, 0x01} },
-{ 0x8a10,      16,     {0x31, 0xf0, 0xa3, 0xef, 0xf0, 0x85, 0x48, 0x82, 0x85, 0x47, 0x83, 0xa3, 0xa3, 0xa3, 0xe0, 0xfe} },
-{ 0x8a20,      16,     {0xa3, 0xe0, 0x8e, 0x49, 0xf5, 0x4a, 0x85, 0x48, 0x82, 0x85, 0x47, 0x83, 0xe0, 0x24, 0x9e, 0x60} },
-{ 0x8a30,      16,     {0x61, 0x24, 0xf9, 0x60, 0x0e, 0x24, 0xf1, 0x70, 0x03, 0x02, 0x8a, 0xdd, 0x24, 0x14, 0x60, 0x03} },
-{ 0x8a40,      16,     {0x02, 0x8b, 0x30, 0x85, 0x48, 0x82, 0x85, 0x47, 0x83, 0xa3, 0xe0, 0xfe, 0xa3, 0xe0, 0xff, 0xc3} },
-{ 0x8a50,      16,     {0xe4, 0x9f, 0xf5, 0x4c, 0x74, 0x01, 0x9e, 0xf5, 0x4b, 0xd3, 0xe5, 0x4c, 0x94, 0x40, 0xe5, 0x4b} },
-{ 0x8a60,      16,     {0x94, 0x00, 0x40, 0x06, 0x75, 0x4b, 0x00, 0x75, 0x4c, 0x40, 0xd3, 0xe5, 0x4a, 0x95, 0x4c, 0xe5} },
-{ 0x8a70,      16,     {0x49, 0x95, 0x4b, 0x50, 0x03, 0x02, 0x8b, 0x30, 0xae, 0x4b, 0xaf, 0x4c, 0x85, 0x48, 0x82, 0x85} },
-{ 0x8a80,      16,     {0x47, 0x83, 0xa3, 0xa3, 0xa3, 0xee, 0xf0, 0xfe, 0xa3, 0xef, 0xf0, 0x8e, 0x49, 0xf5, 0x4a, 0x02} },
-{ 0x8a90,      16,     {0x8b, 0x30, 0x85, 0x48, 0x82, 0x85, 0x47, 0x83, 0xa3, 0xe0, 0xfe, 0xa3, 0xe0, 0xff, 0xc3, 0x74} },
-{ 0x8aa0,      16,     {0x30, 0x9f, 0xf5, 0x4c, 0xe4, 0x9e, 0xf5, 0x4b, 0xd3, 0xe5, 0x4c, 0x94, 0x40, 0xe5, 0x4b, 0x94} },
-{ 0x8ab0,      16,     {0x00, 0x40, 0x06, 0x75, 0x4b, 0x00, 0x75, 0x4c, 0x40, 0xd3, 0xe5, 0x4a, 0x95, 0x4c, 0xe5, 0x49} },
-{ 0x8ac0,      16,     {0x95, 0x4b, 0x40, 0x6c, 0xae, 0x4b, 0xaf, 0x4c, 0x85, 0x48, 0x82, 0x85, 0x47, 0x83, 0xa3, 0xa3} },
-{ 0x8ad0,      16,     {0xa3, 0xee, 0xf0, 0xfe, 0xa3, 0xef, 0xf0, 0x8e, 0x49, 0xf5, 0x4a, 0x80, 0x53, 0x85, 0x48, 0x82} },
-{ 0x8ae0,      16,     {0x85, 0x47, 0x83, 0xa3, 0xe0, 0xfe, 0xa3, 0xe0, 0xff, 0xc3, 0xe4, 0x9f, 0xf5, 0x4c, 0xe4, 0x9e} },
-{ 0x8af0,      16,     {0xf5, 0x4b, 0x45, 0x4c, 0x70, 0x07, 0xf5, 0x4b, 0x75, 0x4c, 0x40, 0x80, 0x11, 0xd3, 0xe5, 0x4c} },
-{ 0x8b00,      16,     {0x94, 0x40, 0xe5, 0x4b, 0x94, 0x00, 0x40, 0x06, 0x75, 0x4b, 0x00, 0x75, 0x4c, 0x40, 0xd3, 0xe5} },
-{ 0x8b10,      16,     {0x4a, 0x95, 0x4c, 0xe5, 0x49, 0x95, 0x4b, 0x40, 0x17, 0xae, 0x4b, 0xaf, 0x4c, 0x85, 0x48, 0x82} },
-{ 0x8b20,      16,     {0x85, 0x47, 0x83, 0xa3, 0xa3, 0xa3, 0xee, 0xf0, 0xfe, 0xa3, 0xef, 0xf0, 0x8e, 0x49, 0xf5, 0x4a} },
-{ 0x8b30,      16,     {0x85, 0x48, 0x82, 0x85, 0x47, 0x83, 0xe0, 0x24, 0x9e, 0x70, 0x03, 0x02, 0x8b, 0xf0, 0x24, 0xf9} },
-{ 0x8b40,      16,     {0x60, 0x58, 0x24, 0xf1, 0x70, 0x03, 0x02, 0x8c, 0x40, 0x24, 0x14, 0x60, 0x03, 0x02, 0x8c, 0x84} },
-{ 0x8b50,      16,     {0x85, 0x48, 0x82, 0x85, 0x47, 0x83, 0xa3, 0xe0, 0xfe, 0xa3, 0xe0, 0xff, 0xd3, 0x94, 0xff, 0xee} },
-{ 0x8b60,      16,     {0x94, 0x00, 0x40, 0x03, 0x02, 0x8c, 0x84, 0x90, 0x01, 0x2c, 0xef, 0xf0, 0xe5, 0x4a, 0x15, 0x4a} },
-{ 0x8b70,      16,     {0xae, 0x49, 0x70, 0x02, 0x15, 0x49, 0x4e, 0x70, 0x03, 0x02, 0x8c, 0x84, 0x90, 0x01, 0x2c, 0xe0} },
-{ 0x8b80,      16,     {0xff, 0x04, 0xf0, 0xa8, 0x07, 0xe6, 0xff, 0x90, 0x01, 0x31, 0xe4, 0x75, 0xf0, 0x01, 0x12, 0x9a} },
-{ 0x8b90,      16,     {0xa4, 0x85, 0xf0, 0x82, 0xf5, 0x83, 0xef, 0xf0, 0x80, 0xd2, 0x85, 0x48, 0x82, 0x85, 0x47, 0x83} },
-{ 0x8ba0,      16,     {0xa3, 0xe0, 0xfe, 0xa3, 0xe0, 0xff, 0xc3, 0x94, 0x80, 0xee, 0x94, 0x00, 0x50, 0x03, 0x02, 0x8c} },
-{ 0x8bb0,      16,     {0x84, 0xd3, 0xef, 0x94, 0xff, 0xee, 0x94, 0x00, 0x40, 0x03, 0x02, 0x8c, 0x84, 0x90, 0x01, 0x2d} },
-{ 0x8bc0,      16,     {0xef, 0xf0, 0xe5, 0x4a, 0x15, 0x4a, 0xae, 0x49, 0x70, 0x02, 0x15, 0x49, 0x4e, 0x70, 0x03, 0x02} },
-{ 0x8bd0,      16,     {0x8c, 0x84, 0x90, 0x01, 0x2d, 0xe0, 0xff, 0x04, 0xf0, 0xa8, 0x07, 0xe6, 0xff, 0x90, 0x01, 0x31} },
-{ 0x8be0,      16,     {0xe4, 0x75, 0xf0, 0x01, 0x12, 0x9a, 0xa4, 0x85, 0xf0, 0x82, 0xf5, 0x83, 0xef, 0xf0, 0x80, 0xd2} },
-{ 0x8bf0,      16,     {0x85, 0x48, 0x82, 0x85, 0x47, 0x83, 0xa3, 0xe0, 0xfe, 0xa3, 0xe0, 0xff, 0xc3, 0x94, 0x20, 0xee} },
-{ 0x8c00,      16,     {0x94, 0x00, 0x50, 0x03, 0x02, 0x8c, 0x84, 0xd3, 0xef, 0x94, 0x2f, 0xee, 0x94, 0x00, 0x50, 0x74} },
-{ 0x8c10,      16,     {0x90, 0x01, 0x2e, 0xef, 0xf0, 0xe5, 0x4a, 0x15, 0x4a, 0xae, 0x49, 0x70, 0x02, 0x15, 0x49, 0x4e} },
-{ 0x8c20,      16,     {0x60, 0x62, 0x90, 0x01, 0x2e, 0xe0, 0xff, 0x04, 0xf0, 0xa8, 0x07, 0xe6, 0xff, 0x90, 0x01, 0x31} },
-{ 0x8c30,      16,     {0xe4, 0x75, 0xf0, 0x01, 0x12, 0x9a, 0xa4, 0x85, 0xf0, 0x82, 0xf5, 0x83, 0xef, 0xf0, 0x80, 0xd5} },
-{ 0x8c40,      16,     {0x85, 0x48, 0x82, 0x85, 0x47, 0x83, 0xa3, 0xe0, 0xff, 0xa3, 0xe0, 0x90, 0x01, 0x2f, 0xcf, 0xf0} },
-{ 0x8c50,      16,     {0xa3, 0xef, 0xf0, 0xe5, 0x4a, 0x15, 0x4a, 0xae, 0x49, 0x70, 0x02, 0x15, 0x49, 0x4e, 0x60, 0x24} },
-{ 0x8c60,      16,     {0x90, 0x01, 0x2f, 0xe4, 0x75, 0xf0, 0x01, 0x12, 0x9a, 0xa4, 0x85, 0xf0, 0x82, 0xf5, 0x83, 0xe0} },
-{ 0x8c70,      16,     {0xff, 0x90, 0x01, 0x31, 0xe4, 0x75, 0xf0, 0x01, 0x12, 0x9a, 0xa4, 0x85, 0xf0, 0x82, 0xf5, 0x83} },
-{ 0x8c80,      16,     {0xef, 0xf0, 0x80, 0xcf, 0x85, 0x48, 0x82, 0x85, 0x47, 0x83, 0xa3, 0xa3, 0xa3, 0xe0, 0xa3, 0xe0} },
-{ 0x8c90,      6,      {0x90, 0x7f, 0xc3, 0xf0, 0x7f, 0x00} },
-{ 0x8c96,      1,      {0x22} },
-{ 0x8c97,      16,     {0x7e, 0x7b, 0x7f, 0x80, 0xef, 0x24, 0x01, 0xfd, 0xe4, 0x3e, 0xfc, 0x8f, 0x82, 0x8e, 0x83, 0x74} },
-{ 0x8ca7,      16,     {0x0b, 0xf0, 0x90, 0x20, 0x70, 0xe0, 0x54, 0xf0, 0xff, 0xc4, 0x54, 0x0f, 0x8d, 0x82, 0x8c, 0x83} },
-{ 0x8cb7,      16,     {0xf0, 0x90, 0x11, 0xf0, 0xe4, 0x93, 0x8d, 0x82, 0x8c, 0x83, 0xa3, 0xf0, 0x90, 0x11, 0xf1, 0xe4} },
-{ 0x8cc7,      16,     {0x93, 0x8d, 0x82, 0x8c, 0x83, 0xa3, 0xa3, 0xf0, 0xe4, 0x90, 0x01, 0x33, 0xf0, 0xa3, 0xf0, 0xa3} },
-{ 0x8cd7,      16,     {0xf0, 0xa3, 0xf0, 0xa3, 0xf0, 0xa3, 0x74, 0x10, 0xf0, 0xed, 0x24, 0x03, 0xfe, 0xe4, 0x3c, 0xa3} },
-{ 0x8ce7,      16,     {0xf0, 0xa3, 0xce, 0xf0, 0x7e, 0x01, 0x7f, 0x33, 0x12, 0x19, 0xc1, 0x90, 0x7f, 0xc3, 0x74, 0x14} },
-{ 0x8cf7,      3,      {0xf0, 0x7f, 0x00} },
-{ 0x8cfa,      1,      {0x22} },
-{ 0x8cfb,      4,      {0x8e, 0x40, 0x8f, 0x41} },
-{ 0x8cff,      16,     {0x85, 0x40, 0x43, 0x85, 0x41, 0x44, 0x85, 0x44, 0x82, 0x85, 0x43, 0x83, 0xe0, 0x14, 0xb4, 0x0f} },
-{ 0x8d0f,      16,     {0x00, 0x40, 0x03, 0x02, 0x8e, 0x32, 0x90, 0x8d, 0x1c, 0xf8, 0x28, 0x28, 0x73, 0x02, 0x8d, 0x49} },
-{ 0x8d1f,      16,     {0x02, 0x8d, 0x5a, 0x02, 0x8d, 0x6b, 0x02, 0x8d, 0x8e, 0x02, 0x8d, 0x9f, 0x02, 0x8d, 0xb0, 0x02} },
-{ 0x8d2f,      16,     {0x8d, 0xc0, 0x02, 0x8d, 0xcb, 0x02, 0x8d, 0xdb, 0x02, 0x8d, 0xeb, 0x02, 0x8d, 0xfb, 0x02, 0x8e} },
-{ 0x8d3f,      16,     {0x02, 0x02, 0x8e, 0x32, 0x02, 0x8e, 0x12, 0x02, 0x8e, 0x22, 0xe5, 0x44, 0x24, 0x01, 0xff, 0xe4} },
-{ 0x8d4f,      16,     {0x35, 0x43, 0xfe, 0x12, 0x82, 0xea, 0x8f, 0x42, 0x02, 0x8e, 0x32, 0xe5, 0x44, 0x24, 0x01, 0xff} },
-{ 0x8d5f,      16,     {0xe4, 0x35, 0x43, 0xfe, 0x12, 0x83, 0x9f, 0x8f, 0x42, 0x02, 0x8e, 0x32, 0xe5, 0x44, 0x24, 0x01} },
-{ 0x8d6f,      16,     {0xf5, 0x46, 0xe4, 0x35, 0x43, 0xf5, 0x45, 0xe5, 0x46, 0x24, 0x01, 0xff, 0xe4, 0x35, 0x45, 0xfe} },
-{ 0x8d7f,      16,     {0x12, 0x84, 0x61, 0xaf, 0x46, 0xae, 0x45, 0x12, 0x84, 0xf4, 0x8f, 0x42, 0x02, 0x8e, 0x32, 0xe5} },
-{ 0x8d8f,      16,     {0x44, 0x24, 0x01, 0xff, 0xe4, 0x35, 0x43, 0xfe, 0x12, 0x88, 0x92, 0x8f, 0x42, 0x02, 0x8e, 0x32} },
-{ 0x8d9f,      16,     {0xe5, 0x44, 0x24, 0x01, 0xff, 0xe4, 0x35, 0x43, 0xfe, 0x12, 0x88, 0xce, 0x8f, 0x42, 0x02, 0x8e} },
-{ 0x8daf,      16,     {0x32, 0xe5, 0x44, 0x24, 0x01, 0xff, 0xe4, 0x35, 0x43, 0xfe, 0x12, 0x89, 0x0a, 0x8f, 0x42, 0x80} },
-{ 0x8dbf,      16,     {0x72, 0xaf, 0x41, 0xae, 0x40, 0x12, 0x89, 0xf0, 0x8f, 0x42, 0x80, 0x67, 0xe5, 0x44, 0x24, 0x01} },
-{ 0x8dcf,      16,     {0xff, 0xe4, 0x35, 0x43, 0xfe, 0x12, 0x87, 0x96, 0x8f, 0x42, 0x80, 0x57, 0xe5, 0x44, 0x24, 0x01} },
-{ 0x8ddf,      16,     {0xff, 0xe4, 0x35, 0x43, 0xfe, 0x12, 0x84, 0x1d, 0x8f, 0x42, 0x80, 0x47, 0xe5, 0x44, 0x24, 0x01} },
-{ 0x8def,      16,     {0xff, 0xe4, 0x35, 0x43, 0xfe, 0x12, 0x88, 0x50, 0x8f, 0x42, 0x80, 0x37, 0x12, 0x8c, 0x97, 0x8f} },
-{ 0x8dff,      16,     {0x42, 0x80, 0x30, 0xe5, 0x44, 0x24, 0x01, 0xff, 0xe4, 0x35, 0x43, 0xfe, 0x12, 0x11, 0xd8, 0x8f} },
-{ 0x8e0f,      16,     {0x42, 0x80, 0x20, 0xe5, 0x44, 0x24, 0x01, 0xff, 0xe4, 0x35, 0x43, 0xfe, 0x12, 0x89, 0x42, 0x8f} },
-{ 0x8e1f,      16,     {0x42, 0x80, 0x10, 0xaf, 0x41, 0xae, 0x40, 0x7c, 0x02, 0x7d, 0x4d, 0x7b, 0x40, 0x12, 0x1b, 0x0c} },
-{ 0x8e2f,      5,      {0xe4, 0xf5, 0x42, 0xaf, 0x42} },
-{ 0x8e34,      1,      {0x22} },
-{ 0x8e35,      8,      {0x8f, 0x61, 0x8e, 0x60, 0x8d, 0x5f, 0x8c, 0x5e} },
-{ 0x8e3d,      16,     {0x75, 0x68, 0x01, 0x75, 0x69, 0x3b, 0xe4, 0xf5, 0x67, 0xaf, 0x63, 0x15, 0x63, 0xef, 0x70, 0x03} },
-{ 0x8e4d,      16,     {0x02, 0x8e, 0xd3, 0xaf, 0x62, 0xe4, 0xfc, 0xfd, 0xfe, 0xf8, 0xf9, 0xfa, 0xab, 0x07, 0xaf, 0x61} },
-{ 0x8e5d,      16,     {0xae, 0x60, 0xad, 0x5f, 0xac, 0x5e, 0x12, 0x9b, 0x2e, 0xaf, 0x03, 0x8f, 0x66, 0xaf, 0x61, 0xae} },
-{ 0x8e6d,      16,     {0x60, 0xad, 0x5f, 0xac, 0x5e, 0xc0, 0x04, 0xc0, 0x05, 0xc0, 0x06, 0xc0, 0x07, 0xaf, 0x62, 0xe4} },
-{ 0x8e7d,      16,     {0xfc, 0xfd, 0xfe, 0xf8, 0xf9, 0xfa, 0xab, 0x07, 0xd0, 0x07, 0xd0, 0x06, 0xd0, 0x05, 0xd0, 0x04} },
-{ 0x8e8d,      16,     {0x12, 0x9b, 0x2e, 0x8f, 0x61, 0x8e, 0x60, 0x8d, 0x5f, 0x8c, 0x5e, 0xe5, 0x66, 0x24, 0x30, 0xf5} },
-{ 0x8e9d,      16,     {0x66, 0xd3, 0x94, 0x39, 0x40, 0x06, 0x74, 0x07, 0x25, 0x66, 0xf5, 0x66, 0x05, 0x69, 0xe5, 0x69} },
-{ 0x8ead,      16,     {0xae, 0x68, 0x70, 0x02, 0x05, 0x68, 0x14, 0xf5, 0x82, 0x8e, 0x83, 0xe4, 0xf0, 0x05, 0x69, 0xe5} },
-{ 0x8ebd,      16,     {0x69, 0xae, 0x68, 0x70, 0x02, 0x05, 0x68, 0x14, 0xf5, 0x82, 0x8e, 0x83, 0xe5, 0x66, 0xf0, 0x05} },
-{ 0x8ecd,      16,     {0x67, 0x05, 0x67, 0x02, 0x8e, 0x46, 0xe5, 0x69, 0x15, 0x69, 0x70, 0x02, 0x15, 0x68, 0xaf, 0x67} },
-{ 0x8edd,      16,     {0x15, 0x67, 0xef, 0x60, 0x23, 0xe5, 0x69, 0x15, 0x69, 0xae, 0x68, 0x70, 0x02, 0x15, 0x68, 0xf5} },
-{ 0x8eed,      16,     {0x82, 0x8e, 0x83, 0xe0, 0xff, 0x05, 0x65, 0xe5, 0x65, 0xac, 0x64, 0x70, 0x02, 0x05, 0x64, 0x14} },
-{ 0x8efd,      8,      {0xf5, 0x82, 0x8c, 0x83, 0xef, 0xf0, 0x80, 0xd6} },
-{ 0x8f05,      1,      {0x22} },
-{ 0x8f06,      16,     {0xe4, 0x90, 0x01, 0x67, 0xf0, 0x7e, 0x01, 0x7f, 0x68, 0x90, 0x01, 0x5c, 0xee, 0xf0, 0xa3, 0xef} },
-{ 0x8f16,      10,     {0xf0, 0x90, 0x01, 0x60, 0xee, 0xf0, 0xa3, 0xef, 0xf0, 0x22} },
-{ 0x8f20,      16,     {0xaa, 0x07, 0xa9, 0x05, 0x90, 0x01, 0x67, 0xe0, 0xc3, 0x94, 0x40, 0x50, 0x61, 0xac, 0x02, 0x74} },
-{ 0x8f30,      16,     {0x01, 0x7e, 0x00, 0xa8, 0x04, 0x08, 0x80, 0x05, 0xc3, 0x33, 0xce, 0x33, 0xce, 0xd8, 0xf9, 0xff} },
-{ 0x8f40,      16,     {0xe4, 0xef, 0x55, 0x30, 0x60, 0x45, 0xea, 0x04, 0xff, 0x90, 0x01, 0x60, 0xe0, 0xfc, 0xa3, 0xe0} },
-{ 0x8f50,      16,     {0xfd, 0xf5, 0x82, 0x8c, 0x83, 0xef, 0xf0, 0xa3, 0xe9, 0xf0, 0x8d, 0x82, 0x8c, 0x83, 0xa3, 0xa3} },
-{ 0x8f60,      16,     {0xeb, 0xf0, 0x90, 0x01, 0x60, 0xe4, 0x75, 0xf0, 0x03, 0x12, 0x9a, 0x8e, 0xfc, 0xd3, 0xe5, 0xf0} },
-{ 0x8f70,      16,     {0x94, 0x25, 0xec, 0x94, 0x02, 0x40, 0x0a, 0x90, 0x01, 0x60, 0x74, 0x01, 0xf0, 0xa3, 0x74, 0x68} },
-{ 0x8f80,      16,     {0xf0, 0xc2, 0xaf, 0x90, 0x01, 0x67, 0xe0, 0x04, 0xf0, 0xd2, 0xaf, 0x7f, 0x01, 0x22, 0x7f, 0x00} },
-{ 0x8f90,      1,      {0x22} },
-{ 0x8f91,      16,     {0x90, 0x01, 0x67, 0xe0, 0xd3, 0x94, 0x00, 0x40, 0x55, 0x90, 0x01, 0x5c, 0xe0, 0xfc, 0xa3, 0xe0} },
-{ 0x8fa1,      16,     {0xaa, 0x04, 0xf9, 0x7b, 0x01, 0xc0, 0x03, 0xc0, 0x02, 0xc0, 0x01, 0xaa, 0x06, 0xa9, 0x07, 0xa8} },
-{ 0x8fb1,      16,     {0x01, 0xac, 0x02, 0xad, 0x03, 0xd0, 0x01, 0xd0, 0x02, 0xd0, 0x03, 0x7e, 0x00, 0x7f, 0x03, 0x12} },
-{ 0x8fc1,      16,     {0x9a, 0x1f, 0x90, 0x01, 0x5c, 0xe4, 0x75, 0xf0, 0x03, 0x12, 0x9a, 0x8e, 0xfc, 0xd3, 0xe5, 0xf0} },
-{ 0x8fd1,      16,     {0x94, 0x25, 0xec, 0x94, 0x02, 0x40, 0x0a, 0x90, 0x01, 0x5c, 0x74, 0x01, 0xf0, 0xa3, 0x74, 0x68} },
-{ 0x8fe1,      16,     {0xf0, 0xc2, 0xaf, 0x90, 0x01, 0x67, 0xe0, 0x14, 0xf0, 0xd2, 0xaf, 0x7f, 0x01, 0x22, 0x7f, 0x00} },
-{ 0x8ff1,      1,      {0x22} },
-{ 0x8ff2,      16,     {0x90, 0x7f, 0xc2, 0xe0, 0x20, 0xe1, 0x5e, 0x7e, 0x7b, 0x7f, 0x80, 0x75, 0x63, 0x7b, 0x75, 0x64} },
-{ 0x9002,      16,     {0x80, 0xe5, 0x64, 0x24, 0x01, 0xff, 0xe4, 0x35, 0x63, 0xa9, 0x07, 0x7b, 0x01, 0x8b, 0x65, 0xf5} },
-{ 0x9012,      16,     {0x66, 0x89, 0x67, 0xfe, 0x12, 0x8f, 0x91, 0xef, 0x60, 0x3b, 0xab, 0x65, 0xaa, 0x66, 0xa9, 0x67} },
-{ 0x9022,      16,     {0x12, 0x9a, 0x48, 0x14, 0xff, 0x90, 0x00, 0x01, 0x12, 0x9a, 0x61, 0xb4, 0x02, 0x16, 0xc2, 0xaf} },
-{ 0x9032,      16,     {0xef, 0x75, 0xf0, 0x08, 0xa4, 0x24, 0x01, 0xf5, 0x82, 0xe4, 0x34, 0x20, 0xf5, 0x83, 0xe0, 0x44} },
-{ 0x9042,      16,     {0x04, 0xf0, 0xd2, 0xaf, 0x85, 0x64, 0x82, 0x85, 0x63, 0x83, 0x74, 0x0d, 0xf0, 0x90, 0x7f, 0xc3} },
-{ 0x9052,      5,      {0x74, 0x04, 0xf0, 0xd2, 0xaf} },
-{ 0x9057,      1,      {0x22} },
-{ 0x9058,      16,     {0x12, 0x8f, 0xf2, 0xe4, 0xf5, 0x5e, 0x74, 0x36, 0x25, 0x5e, 0xf8, 0xe6, 0x54, 0xf0, 0xf5, 0x5f} },
-{ 0x9068,      16,     {0x74, 0x63, 0x25, 0x5e, 0xf5, 0x82, 0xe4, 0x34, 0x01, 0xf5, 0x83, 0xe0, 0x65, 0x5f, 0xff, 0xc4} },
-{ 0x9078,      16,     {0x54, 0x0f, 0xf5, 0x60, 0x60, 0x22, 0x74, 0x63, 0x25, 0x5e, 0xf5, 0x82, 0xe4, 0x34, 0x01, 0xf5} },
-{ 0x9088,      16,     {0x83, 0xe5, 0x5f, 0xf0, 0xaf, 0x5e, 0x7d, 0x01, 0xe5, 0x5f, 0x45, 0x60, 0xfb, 0x12, 0x8f, 0x20} },
-{ 0x9098,      16,     {0xef, 0x70, 0x05, 0x12, 0x8f, 0xf2, 0x80, 0xec, 0x05, 0x5e, 0xe5, 0x5e, 0xc3, 0x94, 0x04, 0x40} },
-{ 0x90a8,      16,     {0xb5, 0x12, 0x8f, 0xf2, 0xe5, 0x3a, 0x60, 0x48, 0xe4, 0xf5, 0x5e, 0xaf, 0x5e, 0x74, 0x01, 0xa8} },
-{ 0x90b8,      16,     {0x07, 0x08, 0x80, 0x02, 0xc3, 0x33, 0xd8, 0xfc, 0xf5, 0x5f, 0x55, 0x3a, 0x60, 0x29, 0xe5, 0x5e} },
-{ 0x90c8,      16,     {0x75, 0xf0, 0x08, 0xa4, 0x24, 0x05, 0xf5, 0x82, 0xe4, 0x34, 0x20, 0xf5, 0x83, 0xe0, 0x30, 0xe6} },
-{ 0x90d8,      16,     {0x16, 0xaf, 0x5e, 0x7d, 0x04, 0x7b, 0x80, 0x12, 0x8f, 0x20, 0xef, 0x70, 0x05, 0x12, 0x8f, 0xf2} },
-{ 0x90e8,      16,     {0x80, 0xef, 0xe5, 0x5f, 0xf4, 0x52, 0x3a, 0x05, 0x5e, 0xe5, 0x5e, 0xc3, 0x94, 0x04, 0x40, 0xbb} },
-{ 0x90f8,      16,     {0x90, 0x02, 0x9e, 0xe0, 0x60, 0x03, 0x02, 0x91, 0xc5, 0x74, 0x19, 0xf0, 0x7f, 0x02, 0x12, 0x81} },
-{ 0x9108,      16,     {0x11, 0x8e, 0x61, 0x8f, 0x62, 0xc3, 0xe5, 0x61, 0x64, 0x80, 0x94, 0x80, 0x40, 0xee, 0x90, 0x01} },
-{ 0x9118,      16,     {0x5b, 0xe0, 0x65, 0x62, 0xf0, 0x60, 0x37, 0xe4, 0xf5, 0x5e, 0xaf, 0x5e, 0x74, 0x01, 0xa8, 0x07} },
-{ 0x9128,      16,     {0x08, 0x80, 0x02, 0xc3, 0x33, 0xd8, 0xfc, 0xf5, 0x5f, 0x90, 0x01, 0x5b, 0xe0, 0x55, 0x5f, 0x60} },
-{ 0x9138,      16,     {0x14, 0xaf, 0x5e, 0x7d, 0x08, 0xe5, 0x5f, 0x55, 0x62, 0xfb, 0x12, 0x8f, 0x20, 0xef, 0x70, 0x05} },
-{ 0x9148,      16,     {0x12, 0x8f, 0xf2, 0x80, 0xec, 0x05, 0x5e, 0xe5, 0x5e, 0xc3, 0x94, 0x04, 0x40, 0xcc, 0x90, 0x01} },
-{ 0x9158,      16,     {0x5b, 0xe5, 0x62, 0xf0, 0xe4, 0xf5, 0x5e, 0xc2, 0xaf, 0x74, 0x32, 0x25, 0x5e, 0xf8, 0xe6, 0xf5} },
-{ 0x9168,      16,     {0x5f, 0xe4, 0xf6, 0xd2, 0xaf, 0x53, 0x5f, 0x1e, 0xe5, 0x5f, 0x60, 0x11, 0xaf, 0x5e, 0x7d, 0x02} },
-{ 0x9178,      16,     {0xab, 0x5f, 0x12, 0x8f, 0x20, 0xef, 0x70, 0x05, 0x12, 0x8f, 0xf2, 0x80, 0xef, 0x74, 0x2c, 0x25} },
-{ 0x9188,      16,     {0x5e, 0xf8, 0xe6, 0xf5, 0x5f, 0x74, 0x9a, 0x25, 0x5e, 0xf5, 0x82, 0xe4, 0x34, 0x02, 0xf5, 0x83} },
-{ 0x9198,      16,     {0xe0, 0x65, 0x5f, 0x60, 0x11, 0xaf, 0x5e, 0x7d, 0x04, 0xab, 0x5f, 0x12, 0x8f, 0x20, 0xef, 0x70} },
-{ 0x91a8,      16,     {0x05, 0x12, 0x8f, 0xf2, 0x80, 0xef, 0x74, 0x9a, 0x25, 0x5e, 0xf5, 0x82, 0xe4, 0x34, 0x02, 0xf5} },
-{ 0x91b8,      16,     {0x83, 0xe5, 0x5f, 0xf0, 0x05, 0x5e, 0xe5, 0x5e, 0xc3, 0x94, 0x04, 0x40, 0x9a, 0x12, 0x8f, 0xf2} },
-{ 0x91c8,      1,      {0x22} },
-{ 0x91c9,      12,     {0x78, 0x7f, 0xe4, 0xf6, 0xd8, 0xfd, 0x75, 0x81, 0x6e, 0x02, 0x92, 0x10} },
-{ 0x91d5,      16,     {0x02, 0x05, 0x28, 0xe4, 0x93, 0xa3, 0xf8, 0xe4, 0x93, 0xa3, 0x40, 0x03, 0xf6, 0x80, 0x01, 0xf2} },
-{ 0x91e5,      16,     {0x08, 0xdf, 0xf4, 0x80, 0x29, 0xe4, 0x93, 0xa3, 0xf8, 0x54, 0x07, 0x24, 0x0c, 0xc8, 0xc3, 0x33} },
-{ 0x91f5,      16,     {0xc4, 0x54, 0x0f, 0x44, 0x20, 0xc8, 0x83, 0x40, 0x04, 0xf4, 0x56, 0x80, 0x01, 0x46, 0xf6, 0xdf} },
-{ 0x9205,      16,     {0xe4, 0x80, 0x0b, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x90, 0x92, 0x55, 0xe4, 0x7e} },
-{ 0x9215,      16,     {0x01, 0x93, 0x60, 0xbc, 0xa3, 0xff, 0x54, 0x3f, 0x30, 0xe5, 0x09, 0x54, 0x1f, 0xfe, 0xe4, 0x93} },
-{ 0x9225,      16,     {0xa3, 0x60, 0x01, 0x0e, 0xcf, 0x54, 0xc0, 0x25, 0xe0, 0x60, 0xa8, 0x40, 0xb8, 0xe4, 0x93, 0xa3} },
-{ 0x9235,      16,     {0xfa, 0xe4, 0x93, 0xa3, 0xf8, 0xe4, 0x93, 0xa3, 0xc8, 0xc5, 0x82, 0xc8, 0xca, 0xc5, 0x83, 0xca} },
-{ 0x9245,      16,     {0xf0, 0xa3, 0xc8, 0xc5, 0x82, 0xc8, 0xca, 0xc5, 0x83, 0xca, 0xdf, 0xe9, 0xde, 0xe7, 0x80, 0xbe} },
-{ 0x9255,      16,     {0x60, 0x24, 0x02, 0x28, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x81, 0x82, 0x84, 0x88} },
-{ 0x9265,      16,     {0x90, 0xa0, 0xc0, 0xc1, 0xc2, 0xc4, 0xc8, 0xd0, 0xe0, 0xe1, 0xe2, 0xe4, 0xe8, 0xf0, 0xf1, 0xf2} },
-{ 0x9275,      8,      {0xf4, 0xf8, 0xf9, 0xfa, 0xfc, 0xfd, 0xfe, 0xff} },
-{ 0x927d,      1,      {0x00} },
-{ 0x927e,      11,     {0xc0, 0xe0, 0xc0, 0x83, 0xc0, 0x82, 0xc0, 0xd0, 0x75, 0xd0, 0x18} },
-{ 0x9289,      16,     {0x90, 0x20, 0x60, 0xe0, 0x54, 0x0f, 0xfe, 0x30, 0xe0, 0x05, 0x90, 0x20, 0x02, 0xe0, 0xff, 0xee} },
-{ 0x9299,      16,     {0x30, 0xe1, 0x05, 0x90, 0x20, 0x0a, 0xe0, 0xff, 0xee, 0x30, 0xe2, 0x05, 0x90, 0x20, 0x12, 0xe0} },
-{ 0x92a9,      16,     {0xff, 0xee, 0x30, 0xe3, 0x05, 0x90, 0x20, 0x1a, 0xe0, 0xff, 0x90, 0x01, 0x62, 0xe0, 0xb5, 0x1e} },
-{ 0x92b9,      10,     {0x04, 0xe4, 0xf0, 0x80, 0x05, 0x90, 0x01, 0x62, 0xee, 0xf0} },
-{ 0x92c3,      9,      {0xd0, 0xd0, 0xd0, 0x82, 0xd0, 0x83, 0xd0, 0xe0, 0x32} },
-{ 0x92cc,      2,      {0xa9, 0x03} },
-{ 0x92ce,      16,     {0xef, 0x75, 0xf0, 0x08, 0xa4, 0x24, 0x00, 0xf5, 0x82, 0xe4, 0x34, 0x20, 0xab, 0x82, 0xfa, 0xe5} },
-{ 0x92de,      16,     {0x6c, 0x45, 0x6d, 0xf5, 0x6e, 0xe9, 0x60, 0x14, 0x8a, 0x83, 0xe5, 0x82, 0x24, 0x04, 0xf5, 0x82} },
-{ 0x92ee,      16,     {0xe4, 0x35, 0x83, 0xf5, 0x83, 0xe0, 0x4d, 0xf0, 0xe4, 0xfe, 0x80, 0x13, 0xeb, 0x24, 0x04, 0xf5} },
-{ 0x92fe,      16,     {0x82, 0xe4, 0x3a, 0xf5, 0x83, 0xe0, 0xff, 0xed, 0xf4, 0xfc, 0xef, 0x5c, 0xf0, 0xae, 0x6e, 0xeb} },
-{ 0x930e,      16,     {0x24, 0x06, 0xf5, 0x82, 0xe4, 0x3a, 0xf5, 0x83, 0xe0, 0x55, 0x6e, 0xfc, 0xb5, 0x06, 0x03, 0xaf} },
-{ 0x931e,      16,     {0x05, 0x22, 0xe5, 0x6c, 0x5c, 0xfe, 0xe5, 0x6d, 0x5c, 0xfd, 0xe9, 0x60, 0x16, 0xee, 0x70, 0x04} },
-{ 0x932e,      16,     {0x7f, 0x01, 0x80, 0x02, 0x7f, 0x00, 0xae, 0x07, 0xed, 0x70, 0x04, 0x7f, 0x01, 0x80, 0x02, 0x7f} },
-{ 0x933e,      16,     {0x00, 0xad, 0x07, 0xee, 0x60, 0x03, 0xaf, 0x6c, 0x22, 0xed, 0x60, 0x03, 0xaf, 0x6d, 0x22, 0x7f} },
-{ 0x934e,      1,      {0x00} },
-{ 0x934f,      1,      {0x22} },
-{ 0x9350,      16,     {0x7e, 0x7b, 0x7f, 0x80, 0xef, 0x24, 0x01, 0xf5, 0x66, 0xe4, 0x3e, 0xf5, 0x65, 0x75, 0x63, 0x02} },
-{ 0x9360,      16,     {0x75, 0x64, 0x4e, 0x8f, 0x82, 0x8e, 0x83, 0x74, 0x0f, 0xf0, 0x85, 0x64, 0x82, 0x85, 0x63, 0x83} },
-{ 0x9370,      16,     {0xe0, 0x85, 0x66, 0x82, 0x85, 0x65, 0x83, 0xf0, 0x85, 0x64, 0x82, 0x85, 0x63, 0x83, 0xa3, 0xe0} },
-{ 0x9380,      16,     {0x85, 0x66, 0x82, 0x85, 0x65, 0x83, 0xa3, 0xf0, 0x85, 0x66, 0x82, 0x85, 0x65, 0x83, 0xa3, 0xa3} },
-{ 0x9390,      16,     {0x74, 0xff, 0xf0, 0xe5, 0x66, 0x24, 0x03, 0xf5, 0x68, 0xe4, 0x35, 0x65, 0xf5, 0x67, 0x85, 0x64} },
-{ 0x93a0,      16,     {0x82, 0x85, 0x63, 0x83, 0xe0, 0x14, 0xb4, 0x0b, 0x00, 0x40, 0x03, 0x02, 0x98, 0x43, 0x90, 0x93} },
-{ 0x93b0,      16,     {0xb5, 0xf8, 0x28, 0x28, 0x73, 0x02, 0x93, 0xd6, 0x02, 0x94, 0x7c, 0x02, 0x95, 0xba, 0x02, 0x95} },
-{ 0x93c0,      16,     {0xda, 0x02, 0x95, 0xda, 0x02, 0x96, 0x7f, 0x02, 0x96, 0xbd, 0x02, 0x96, 0xe4, 0x02, 0x97, 0xa6} },
-{ 0x93d0,      16,     {0x02, 0x97, 0xda, 0x02, 0x98, 0x0b, 0xe4, 0xf5, 0x5e, 0xe5, 0x5e, 0x75, 0xf0, 0x08, 0xa4, 0x24} },
-{ 0x93e0,      16,     {0x00, 0xf5, 0x82, 0xe4, 0x34, 0x20, 0xaf, 0x82, 0xf5, 0x61, 0x8f, 0x62, 0xe4, 0xff, 0xe4, 0xfe} },
-{ 0x93f0,      16,     {0xef, 0x60, 0x10, 0x74, 0x28, 0x2e, 0xf5, 0x82, 0xe4, 0x34, 0x02, 0xf5, 0x83, 0xe0, 0xf4, 0xf5} },
-{ 0x9400,      16,     {0x5f, 0x80, 0x0d, 0x74, 0x28, 0x2e, 0xf5, 0x82, 0xe4, 0x34, 0x02, 0xf5, 0x83, 0xe0, 0xf5, 0x5f} },
-{ 0x9410,      16,     {0xe5, 0x62, 0x24, 0x07, 0xf5, 0x82, 0xe4, 0x35, 0x61, 0xf5, 0x83, 0xe5, 0x5f, 0xf0, 0xe0, 0xf5} },
-{ 0x9420,      16,     {0x60, 0x65, 0x5f, 0x60, 0x3d, 0x85, 0x66, 0x82, 0x85, 0x65, 0x83, 0xa3, 0xa3, 0xe4, 0xf0, 0xe5} },
-{ 0x9430,      16,     {0x5e, 0x04, 0xfd, 0x05, 0x68, 0xe5, 0x68, 0xaa, 0x67, 0x70, 0x02, 0x05, 0x67, 0x14, 0xf5, 0x82} },
-{ 0x9440,      16,     {0x8a, 0x83, 0xed, 0xf0, 0x05, 0x68, 0xe5, 0x68, 0xac, 0x67, 0x70, 0x02, 0x05, 0x67, 0x14, 0xf5} },
-{ 0x9450,      16,     {0x82, 0x8c, 0x83, 0xe5, 0x5f, 0xf0, 0x85, 0x68, 0x82, 0x85, 0x67, 0x83, 0xe5, 0x60, 0xf0, 0x02} },
-{ 0x9460,      16,     {0x98, 0x4e, 0x0e, 0xee, 0x64, 0x24, 0x70, 0x88, 0x0f, 0xef, 0x64, 0x02, 0x70, 0x80, 0x05, 0x5e} },
-{ 0x9470,      16,     {0xe5, 0x5e, 0x64, 0x04, 0x60, 0x03, 0x02, 0x93, 0xd9, 0x02, 0x98, 0x4e, 0x7e, 0x20, 0x7f, 0x00} },
-{ 0x9480,      16,     {0x75, 0x61, 0x20, 0x75, 0x62, 0x00, 0xe4, 0xf5, 0x5e, 0xaf, 0x62, 0xae, 0x61, 0xe4, 0xfd, 0x12} },
-{ 0x9490,      16,     {0x81, 0xe0, 0x74, 0x08, 0x25, 0x62, 0xf5, 0x62, 0xe4, 0x35, 0x61, 0xf5, 0x61, 0x05, 0x5e, 0xe5} },
-{ 0x94a0,      16,     {0x5e, 0xd3, 0x94, 0x03, 0x40, 0xe3, 0x90, 0x00, 0x04, 0x74, 0x92, 0xf0, 0xa3, 0x74, 0x7e, 0xf0} },
-{ 0x94b0,      16,     {0xe4, 0xf5, 0x60, 0x7e, 0x20, 0x7f, 0x00, 0x75, 0x61, 0x20, 0x75, 0x62, 0x00, 0xf5, 0x5e, 0xaf} },
-{ 0x94c0,      16,     {0x5e, 0x74, 0x01, 0xa8, 0x07, 0x08, 0x80, 0x02, 0xc3, 0x33, 0xd8, 0xfc, 0xf5, 0x5f, 0x90, 0x01} },
-{ 0x94d0,      16,     {0x62, 0xf0, 0x90, 0x01, 0x5e, 0xe4, 0xf0, 0xa3, 0x74, 0x0a, 0xf0, 0x85, 0x62, 0x82, 0x85, 0x61} },
-{ 0x94e0,      16,     {0x83, 0xa3, 0x74, 0x02, 0xf0, 0x90, 0x01, 0x62, 0xe0, 0x65, 0x5f, 0x70, 0x39, 0x90, 0x01, 0x5e} },
-{ 0x94f0,      16,     {0xe0, 0x70, 0x02, 0xa3, 0xe0, 0x70, 0xee, 0x85, 0x66, 0x82, 0x85, 0x65, 0x83, 0xa3, 0xa3, 0xf0} },
-{ 0x9500,      16,     {0xe5, 0x5e, 0x04, 0xff, 0x05, 0x68, 0xe5, 0x68, 0xac, 0x67, 0x70, 0x02, 0x05, 0x67, 0x14, 0xf5} },
-{ 0x9510,      16,     {0x82, 0x8c, 0x83, 0xef, 0xf0, 0x85, 0x68, 0x82, 0x85, 0x67, 0x83, 0x74, 0xff, 0xf0, 0xe4, 0x90} },
-{ 0x9520,      16,     {0x01, 0x62, 0xf0, 0x75, 0x60, 0xff, 0x90, 0x01, 0x62, 0xe0, 0xff, 0x60, 0x3c, 0x85, 0x66, 0x82} },
-{ 0x9530,      16,     {0x85, 0x65, 0x83, 0xa3, 0xa3, 0xe4, 0xf0, 0xe5, 0x5e, 0x04, 0xfe, 0x05, 0x68, 0xe5, 0x68, 0xac} },
-{ 0x9540,      16,     {0x67, 0x70, 0x02, 0x05, 0x67, 0x14, 0xf5, 0x82, 0x8c, 0x83, 0xee, 0xf0, 0x05, 0x68, 0xe5, 0x68} },
-{ 0x9550,      16,     {0xac, 0x67, 0x70, 0x02, 0x05, 0x67, 0x14, 0xf5, 0x82, 0x8c, 0x83, 0xef, 0xf0, 0x85, 0x68, 0x82} },
-{ 0x9560,      16,     {0x85, 0x67, 0x83, 0xe5, 0x5f, 0xf0, 0x75, 0x60, 0xff, 0xe5, 0x60, 0x70, 0x16, 0x74, 0x08, 0x25} },
-{ 0x9570,      16,     {0x62, 0xf5, 0x62, 0xe4, 0x35, 0x61, 0xf5, 0x61, 0x05, 0x5e, 0xe5, 0x5e, 0x64, 0x04, 0x60, 0x03} },
-{ 0x9580,      16,     {0x02, 0x94, 0xbf, 0x7e, 0x20, 0x7f, 0x00, 0x75, 0x61, 0x20, 0x75, 0x62, 0x00, 0xe4, 0xf5, 0x5e} },
-{ 0x9590,      16,     {0xaf, 0x62, 0xae, 0x61, 0x7d, 0x01, 0x12, 0x81, 0xe0, 0x74, 0x08, 0x25, 0x62, 0xf5, 0x62, 0xe4} },
-{ 0x95a0,      16,     {0x35, 0x61, 0xf5, 0x61, 0x05, 0x5e, 0xe5, 0x5e, 0xd3, 0x94, 0x03, 0x40, 0xe3, 0x90, 0x00, 0x04} },
-{ 0x95b0,      16,     {0x74, 0x13, 0xf0, 0xa3, 0x74, 0x12, 0xf0, 0x02, 0x98, 0x4e, 0x85, 0x64, 0x82, 0x85, 0x63, 0x83} },
-{ 0x95c0,      16,     {0xa3, 0xe0, 0x14, 0xff, 0x74, 0x01, 0xa8, 0x07, 0x08, 0x80, 0x02, 0xc3, 0x33, 0xd8, 0xfc, 0x90} },
-{ 0x95d0,      16,     {0x02, 0x95, 0xf0, 0x90, 0x01, 0x62, 0xf0, 0x02, 0x98, 0x4e, 0x90, 0x01, 0x5e, 0x74, 0x03, 0xf0} },
-{ 0x95e0,      16,     {0xa3, 0x74, 0xe8, 0xf0, 0xe4, 0xf5, 0x60, 0x90, 0x02, 0x95, 0xe0, 0xff, 0x90, 0x01, 0x62, 0xe0} },
-{ 0x95f0,      16,     {0xb5, 0x07, 0x1e, 0x90, 0x01, 0x5e, 0xe0, 0x70, 0x02, 0xa3, 0xe0, 0x70, 0xea, 0x85, 0x66, 0x82} },
-{ 0x9600,      16,     {0x85, 0x65, 0x83, 0xa3, 0xa3, 0xf0, 0x85, 0x68, 0x82, 0x85, 0x67, 0x83, 0x74, 0xff, 0xf0, 0xf5} },
-{ 0x9610,      16,     {0x60, 0xe5, 0x60, 0x60, 0x03, 0x02, 0x98, 0x4e, 0x90, 0x01, 0x5e, 0xf0, 0xa3, 0x74, 0x96, 0xf0} },
-{ 0x9620,      16,     {0x90, 0x01, 0x5e, 0xe0, 0x70, 0x02, 0xa3, 0xe0, 0x70, 0xf6, 0x7f, 0x02, 0x12, 0x81, 0x11, 0xc3} },
-{ 0x9630,      16,     {0xee, 0x64, 0x80, 0x94, 0x80, 0x40, 0xf3, 0xef, 0x54, 0x0f, 0xf5, 0x60, 0x90, 0x02, 0x95, 0xe0} },
-{ 0x9640,      16,     {0x55, 0x60, 0x70, 0x04, 0x7f, 0x01, 0x80, 0x02, 0x7f, 0x00, 0x8f, 0x5f, 0x85, 0x64, 0x82, 0x85} },
-{ 0x9650,      16,     {0x63, 0x83, 0xe0, 0xb4, 0x05, 0x0c, 0xe5, 0x5f, 0x70, 0x04, 0x7f, 0x01, 0x80, 0x02, 0x7f, 0x00} },
-{ 0x9660,      16,     {0x8f, 0x5f, 0xe5, 0x5f, 0x70, 0x03, 0x02, 0x98, 0x4e, 0x85, 0x66, 0x82, 0x85, 0x65, 0x83, 0xa3} },
-{ 0x9670,      16,     {0xa3, 0xe4, 0xf0, 0x85, 0x68, 0x82, 0x85, 0x67, 0x83, 0xe5, 0x60, 0xf0, 0x02, 0x98, 0x4e, 0x7e} },
-{ 0x9680,      16,     {0x20, 0x7f, 0x00, 0x75, 0x61, 0x20, 0x75, 0x62, 0x00, 0xaf, 0x62, 0xae, 0x61, 0xe4, 0xfd, 0x12} },
-{ 0x9690,      16,     {0x81, 0xe0, 0x85, 0x62, 0x82, 0x85, 0x61, 0x83, 0xa3, 0xa3, 0xa3, 0xe0, 0x44, 0x80, 0xf0, 0x85} },
-{ 0x96a0,      16,     {0x62, 0x82, 0x85, 0x61, 0x83, 0x74, 0x01, 0xf0, 0xa3, 0xe4, 0xf0, 0x85, 0x62, 0x82, 0x85, 0x61} },
-{ 0x96b0,      16,     {0x83, 0xa3, 0xa3, 0xa3, 0xe0, 0x54, 0x7f, 0xf0, 0xd2, 0x04, 0x02, 0x98, 0x4e, 0xc2, 0x04, 0x7e} },
-{ 0x96c0,      16,     {0x20, 0x7f, 0x00, 0x75, 0x61, 0x20, 0x75, 0x62, 0x00, 0xe5, 0x62, 0x24, 0x05, 0xf5, 0x82, 0xe4} },
-{ 0x96d0,      16,     {0x35, 0x61, 0xf5, 0x83, 0xe0, 0x30, 0xe6, 0xf1, 0xaf, 0x62, 0xae, 0x61, 0x7d, 0x01, 0x12, 0x81} },
-{ 0x96e0,      16,     {0xe0, 0x02, 0x98, 0x4e, 0xe4, 0xf5, 0x60, 0xf5, 0x5e, 0xe5, 0x5e, 0x75, 0xf0, 0x08, 0xa4, 0x24} },
-{ 0x96f0,      16,     {0x00, 0xf5, 0x82, 0xe4, 0x34, 0x20, 0xaf, 0x82, 0xf5, 0x61, 0x8f, 0x62, 0xfe, 0xe4, 0xfd, 0x12} },
-{ 0x9700,      16,     {0x81, 0xe0, 0xe5, 0x62, 0x24, 0x04, 0xf5, 0x82, 0xe4, 0x35, 0x61, 0xf5, 0x83, 0xe0, 0x54, 0xfc} },
-{ 0x9710,      16,     {0xf0, 0xaf, 0x5e, 0x7d, 0x01, 0x7b, 0x01, 0x75, 0x6c, 0x80, 0x75, 0x6d, 0x40, 0x12, 0x92, 0xcc} },
-{ 0x9720,      16,     {0x8f, 0x60, 0xe5, 0x60, 0x70, 0x11, 0xaf, 0x5e, 0x7d, 0x02, 0x7b, 0x01, 0x75, 0x6c, 0x10, 0x75} },
-{ 0x9730,      16,     {0x6d, 0x20, 0x12, 0x92, 0xcc, 0x8f, 0x60, 0xe5, 0x60, 0x70, 0x10, 0xaf, 0x5e, 0x7d, 0x01, 0xfb} },
-{ 0x9740,      16,     {0x75, 0x6c, 0x80, 0x75, 0x6d, 0x40, 0x12, 0x92, 0xcc, 0x8f, 0x60, 0xe5, 0x60, 0x70, 0x10, 0xaf} },
-{ 0x9750,      16,     {0x5e, 0x7d, 0x02, 0xfb, 0x75, 0x6c, 0x10, 0x75, 0x6d, 0x20, 0x12, 0x92, 0xcc, 0x8f, 0x60, 0xaf} },
-{ 0x9760,      16,     {0x62, 0xae, 0x61, 0x7d, 0x01, 0x12, 0x81, 0xe0, 0xe5, 0x60, 0x60, 0x2b, 0x85, 0x66, 0x82, 0x85} },
-{ 0x9770,      16,     {0x65, 0x83, 0xa3, 0xa3, 0xe4, 0xf0, 0xe5, 0x5e, 0x04, 0xff, 0x05, 0x68, 0xe5, 0x68, 0xac, 0x67} },
-{ 0x9780,      16,     {0x70, 0x02, 0x05, 0x67, 0x14, 0xf5, 0x82, 0x8c, 0x83, 0xef, 0xf0, 0x85, 0x68, 0x82, 0x85, 0x67} },
-{ 0x9790,      16,     {0x83, 0xe5, 0x60, 0xf0, 0x02, 0x98, 0x4e, 0x05, 0x5e, 0xe5, 0x5e, 0xd3, 0x94, 0x03, 0x50, 0x03} },
-{ 0x97a0,      16,     {0x02, 0x96, 0xe9, 0x02, 0x98, 0x4e, 0xe4, 0x90, 0x02, 0xd3, 0xf0, 0xa3, 0xf0, 0xa3, 0xf0, 0xa3} },
-{ 0x97b0,      16,     {0xf0, 0xa3, 0xf0, 0xa3, 0x74, 0x10, 0xf0, 0xa3, 0x74, 0x98, 0xf0, 0xa3, 0x74, 0x6d, 0xf0, 0x7e} },
-{ 0x97c0,      16,     {0x02, 0x7f, 0xd3, 0x12, 0x80, 0x00, 0xef, 0x64, 0x08, 0x70, 0x03, 0x02, 0x98, 0x4e, 0x85, 0x66} },
-{ 0x97d0,      16,     {0x82, 0x85, 0x65, 0x83, 0xa3, 0xa3, 0xe4, 0xf0, 0x80, 0x74, 0xe4, 0x90, 0x02, 0xd3, 0xf0, 0xa3} },
-{ 0x97e0,      16,     {0xf0, 0xa3, 0xf0, 0xa3, 0xf0, 0xa3, 0xf0, 0xa3, 0x74, 0x10, 0xf0, 0xa3, 0xe5, 0x67, 0xf0, 0xa3} },
-{ 0x97f0,      16,     {0xe5, 0x68, 0xf0, 0x7e, 0x02, 0x7f, 0xd3, 0x12, 0x19, 0xc1, 0xef, 0x64, 0x08, 0x60, 0x4f, 0x85} },
-{ 0x9800,      16,     {0x66, 0x82, 0x85, 0x65, 0x83, 0xa3, 0xa3, 0xe4, 0xf0, 0x80, 0x43, 0xe4, 0x90, 0x02, 0xd3, 0xf0} },
-{ 0x9810,      16,     {0xa3, 0xf0, 0xa3, 0xf0, 0xa3, 0xf0, 0xa3, 0xf0, 0xa3, 0x74, 0x10, 0xf0, 0xe5, 0x64, 0x24, 0x02} },
-{ 0x9820,      16,     {0x90, 0x02, 0xda, 0xf0, 0xe4, 0x35, 0x63, 0x90, 0x02, 0xd9, 0xf0, 0x7e, 0x02, 0x7f, 0xd3, 0x12} },
-{ 0x9830,      16,     {0x80, 0x00, 0xef, 0x64, 0x08, 0x60, 0x17, 0x85, 0x66, 0x82, 0x85, 0x65, 0x83, 0xa3, 0xa3, 0xe4} },
-{ 0x9840,      16,     {0xf0, 0x80, 0x0b, 0x85, 0x66, 0x82, 0x85, 0x65, 0x83, 0xa3, 0xa3, 0x74, 0x01, 0xf0, 0x90, 0x01} },
-{ 0x9850,      16,     {0x5e, 0xe4, 0xf0, 0xa3, 0x74, 0x0a, 0xf0, 0x90, 0x01, 0x5e, 0xe0, 0x70, 0x02, 0xa3, 0xe0, 0x70} },
-{ 0x9860,      12,     {0xf6, 0x90, 0x7f, 0xc3, 0x74, 0x24, 0xf0, 0xe4, 0x90, 0x02, 0x4d, 0xf0} },
-{ 0x986c,      1,      {0x22} },
-{ 0x986d,      16,     {0xff, 0xfe, 0xfd, 0xfc, 0xfb, 0xfa, 0xf9, 0xf8, 0xf7, 0xf6, 0xf5, 0xf4, 0xf3, 0xf2, 0xf1, 0xf0} },
-{ 0x987d,      16,     {0xe4, 0xfd, 0x74, 0x01, 0x7e, 0x00, 0xa8, 0x05, 0x08, 0x80, 0x05, 0xc3, 0x33, 0xce, 0x33, 0xce} },
-{ 0x988d,      16,     {0xd8, 0xf9, 0xff, 0xe5, 0x3b, 0xfb, 0xe4, 0xef, 0x5b, 0x70, 0x03, 0x02, 0x99, 0x45, 0xed, 0x75} },
-{ 0x989d,      16,     {0xf0, 0x08, 0xa4, 0x24, 0x00, 0xf5, 0x82, 0xe4, 0x34, 0x20, 0xaf, 0x82, 0xfe, 0xf5, 0x83, 0xe5} },
-{ 0x98ad,      16,     {0x82, 0x24, 0x05, 0xf5, 0x82, 0xe4, 0x35, 0x83, 0xf5, 0x83, 0xe0, 0x54, 0x60, 0x64, 0x60, 0x60} },
-{ 0x98bd,      16,     {0x03, 0x02, 0x99, 0x45, 0xef, 0x24, 0x06, 0xf5, 0x82, 0xe4, 0x3e, 0xf5, 0x83, 0xe0, 0xfc, 0x74} },
-{ 0x98cd,      16,     {0x36, 0x2d, 0xf8, 0xec, 0xf6, 0x30, 0xe5, 0x70, 0x74, 0x96, 0x2d, 0xf5, 0x82, 0xe4, 0x34, 0x02} },
-{ 0x98dd,      16,     {0xf5, 0x83, 0xe0, 0x60, 0x63, 0xed, 0x25, 0xe0, 0x24, 0x8d, 0xf5, 0x82, 0xe4, 0x34, 0x02, 0xf5} },
-{ 0x98ed,      16,     {0x83, 0xe4, 0x75, 0xf0, 0x01, 0x12, 0x9a, 0xa4, 0x85, 0xf0, 0x82, 0xf5, 0x83, 0xe0, 0x8f, 0x82} },
-{ 0x98fd,      16,     {0x8e, 0x83, 0xf0, 0x74, 0x96, 0x2d, 0xf5, 0x82, 0xe4, 0x34, 0x02, 0xf5, 0x83, 0xe0, 0x14, 0xf0} },
-{ 0x990d,      16,     {0x70, 0x36, 0xed, 0x25, 0xe0, 0x24, 0xc7, 0xf5, 0x82, 0xe4, 0x34, 0x7f, 0xf5, 0x83, 0xe4, 0xf0} },
-{ 0x991d,      16,     {0xed, 0x25, 0xe0, 0xff, 0xc3, 0x74, 0x0c, 0x9f, 0x75, 0xf0, 0x40, 0xa4, 0x24, 0x40, 0xf5, 0x82} },
-{ 0x992d,      16,     {0xe5, 0xf0, 0x34, 0x7b, 0xaf, 0x82, 0xfe, 0xed, 0x25, 0xe0, 0x24, 0x8d, 0xf5, 0x82, 0xe4, 0x34} },
-{ 0x993d,      16,     {0x02, 0xf5, 0x83, 0xee, 0xf0, 0xa3, 0xef, 0xf0, 0x0d, 0xed, 0x64, 0x04, 0x60, 0x03, 0x02, 0x98} },
-{ 0x994d,      1,      {0x7f} },
-{ 0x994e,      1,      {0x22} },
-{ 0x994f,      16,     {0xe7, 0x09, 0xf6, 0x08, 0xdf, 0xfa, 0x80, 0x46, 0xe7, 0x09, 0xf2, 0x08, 0xdf, 0xfa, 0x80, 0x3e} },
-{ 0x995f,      16,     {0x88, 0x82, 0x8c, 0x83, 0xe7, 0x09, 0xf0, 0xa3, 0xdf, 0xfa, 0x80, 0x32, 0xe3, 0x09, 0xf6, 0x08} },
-{ 0x996f,      16,     {0xdf, 0xfa, 0x80, 0x78, 0xe3, 0x09, 0xf2, 0x08, 0xdf, 0xfa, 0x80, 0x70, 0x88, 0x82, 0x8c, 0x83} },
-{ 0x997f,      16,     {0xe3, 0x09, 0xf0, 0xa3, 0xdf, 0xfa, 0x80, 0x64, 0x89, 0x82, 0x8a, 0x83, 0xe0, 0xa3, 0xf6, 0x08} },
-{ 0x998f,      16,     {0xdf, 0xfa, 0x80, 0x58, 0x89, 0x82, 0x8a, 0x83, 0xe0, 0xa3, 0xf2, 0x08, 0xdf, 0xfa, 0x80, 0x4c} },
-{ 0x999f,      16,     {0x80, 0xd2, 0x80, 0xfa, 0x80, 0xc6, 0x80, 0xd4, 0x80, 0x69, 0x80, 0xf2, 0x80, 0x33, 0x80, 0x10} },
-{ 0x99af,      16,     {0x80, 0xa6, 0x80, 0xea, 0x80, 0x9a, 0x80, 0xa8, 0x80, 0xda, 0x80, 0xe2, 0x80, 0xca, 0x80, 0x33} },
-{ 0x99bf,      16,     {0x89, 0x82, 0x8a, 0x83, 0xec, 0xfa, 0xe4, 0x93, 0xa3, 0xc8, 0xc5, 0x82, 0xc8, 0xcc, 0xc5, 0x83} },
-{ 0x99cf,      16,     {0xcc, 0xf0, 0xa3, 0xc8, 0xc5, 0x82, 0xc8, 0xcc, 0xc5, 0x83, 0xcc, 0xdf, 0xe9, 0xde, 0xe7, 0x80} },
-{ 0x99df,      16,     {0x0d, 0x89, 0x82, 0x8a, 0x83, 0xe4, 0x93, 0xa3, 0xf6, 0x08, 0xdf, 0xf9, 0xec, 0xfa, 0xa9, 0xf0} },
-{ 0x99ef,      16,     {0xed, 0xfb, 0x22, 0x89, 0x82, 0x8a, 0x83, 0xec, 0xfa, 0xe0, 0xa3, 0xc8, 0xc5, 0x82, 0xc8, 0xcc} },
-{ 0x99ff,      16,     {0xc5, 0x83, 0xcc, 0xf0, 0xa3, 0xc8, 0xc5, 0x82, 0xc8, 0xcc, 0xc5, 0x83, 0xcc, 0xdf, 0xea, 0xde} },
-{ 0x9a0f,      16,     {0xe8, 0x80, 0xdb, 0x89, 0x82, 0x8a, 0x83, 0xe4, 0x93, 0xa3, 0xf2, 0x08, 0xdf, 0xf9, 0x80, 0xcc} },
-{ 0x9a1f,      16,     {0x88, 0xf0, 0xed, 0x24, 0x02, 0xb4, 0x04, 0x00, 0x50, 0xc2, 0xf5, 0x82, 0xeb, 0x24, 0x02, 0xb4} },
-{ 0x9a2f,      16,     {0x04, 0x00, 0x50, 0xb8, 0x23, 0x23, 0x45, 0x82, 0xf5, 0x82, 0xef, 0x4e, 0x60, 0xae, 0xef, 0x60} },
-{ 0x9a3f,      9,      {0x01, 0x0e, 0xe5, 0x82, 0x23, 0x90, 0x99, 0x9f, 0x73} },
-{ 0x9a48,      16,     {0xbb, 0x01, 0x06, 0x89, 0x82, 0x8a, 0x83, 0xe0, 0x22, 0x50, 0x02, 0xe7, 0x22, 0xbb, 0xfe, 0x02} },
-{ 0x9a58,      9,      {0xe3, 0x22, 0x89, 0x82, 0x8a, 0x83, 0xe4, 0x93, 0x22} },
-{ 0x9a61,      16,     {0xbb, 0x01, 0x0c, 0xe5, 0x82, 0x29, 0xf5, 0x82, 0xe5, 0x83, 0x3a, 0xf5, 0x83, 0xe0, 0x22, 0x50} },
-{ 0x9a71,      16,     {0x06, 0xe9, 0x25, 0x82, 0xf8, 0xe6, 0x22, 0xbb, 0xfe, 0x06, 0xe9, 0x25, 0x82, 0xf8, 0xe2, 0x22} },
-{ 0x9a81,      13,     {0xe5, 0x82, 0x29, 0xf5, 0x82, 0xe5, 0x83, 0x3a, 0xf5, 0x83, 0xe4, 0x93, 0x22} },
-{ 0x9a8e,      16,     {0xc5, 0xf0, 0xf8, 0xa3, 0xe0, 0x28, 0xf0, 0xc5, 0xf0, 0xf8, 0xe5, 0x82, 0x15, 0x82, 0x70, 0x02} },
-{ 0x9a9e,      6,      {0x15, 0x83, 0xe0, 0x38, 0xf0, 0x22} },
-{ 0x9aa4,      16,     {0xa3, 0xf8, 0xe0, 0xc5, 0xf0, 0x25, 0xf0, 0xf0, 0xe5, 0x82, 0x15, 0x82, 0x70, 0x02, 0x15, 0x83} },
-{ 0x9ab4,      6,      {0xe0, 0xc8, 0x38, 0xf0, 0xe8, 0x22} },
-{ 0x9aba,      16,     {0xbb, 0x01, 0x10, 0xe5, 0x82, 0x29, 0xf5, 0x82, 0xe5, 0x83, 0x3a, 0xf5, 0x83, 0xe0, 0xf5, 0xf0} },
-{ 0x9aca,      16,     {0xa3, 0xe0, 0x22, 0x50, 0x09, 0xe9, 0x25, 0x82, 0xf8, 0x86, 0xf0, 0x08, 0xe6, 0x22, 0xbb, 0xfe} },
-{ 0x9ada,      16,     {0x0a, 0xe9, 0x25, 0x82, 0xf8, 0xe2, 0xf5, 0xf0, 0x08, 0xe2, 0x22, 0xe5, 0x83, 0x2a, 0xf5, 0x83} },
-{ 0x9aea,      8,      {0xe9, 0x93, 0xf5, 0xf0, 0xa3, 0xe9, 0x93, 0x22} },
-{ 0x9af2,      16,     {0x75, 0xf0, 0x08, 0x75, 0x82, 0x00, 0xef, 0x2f, 0xff, 0xee, 0x33, 0xfe, 0xcd, 0x33, 0xcd, 0xcc} },
-{ 0x9b02,      16,     {0x33, 0xcc, 0xc5, 0x82, 0x33, 0xc5, 0x82, 0x9b, 0xed, 0x9a, 0xec, 0x99, 0xe5, 0x82, 0x98, 0x40} },
-{ 0x9b12,      16,     {0x0c, 0xf5, 0x82, 0xee, 0x9b, 0xfe, 0xed, 0x9a, 0xfd, 0xec, 0x99, 0xfc, 0x0f, 0xd5, 0xf0, 0xd6} },
-{ 0x9b22,      16,     {0xe4, 0xce, 0xfb, 0xe4, 0xcd, 0xfa, 0xe4, 0xcc, 0xf9, 0xa8, 0x82, 0x22, 0xb8, 0x00, 0xc1, 0xb9} },
-{ 0x9b32,      16,     {0x00, 0x59, 0xba, 0x00, 0x2d, 0xec, 0x8b, 0xf0, 0x84, 0xcf, 0xce, 0xcd, 0xfc, 0xe5, 0xf0, 0xcb} },
-{ 0x9b42,      16,     {0xf9, 0x78, 0x18, 0xef, 0x2f, 0xff, 0xee, 0x33, 0xfe, 0xed, 0x33, 0xfd, 0xec, 0x33, 0xfc, 0xeb} },
-{ 0x9b52,      16,     {0x33, 0xfb, 0x10, 0xd7, 0x03, 0x99, 0x40, 0x04, 0xeb, 0x99, 0xfb, 0x0f, 0xd8, 0xe5, 0xe4, 0xf9} },
-{ 0x9b62,      16,     {0xfa, 0x22, 0x78, 0x18, 0xef, 0x2f, 0xff, 0xee, 0x33, 0xfe, 0xed, 0x33, 0xfd, 0xec, 0x33, 0xfc} },
-{ 0x9b72,      16,     {0xc9, 0x33, 0xc9, 0x10, 0xd7, 0x05, 0x9b, 0xe9, 0x9a, 0x40, 0x07, 0xec, 0x9b, 0xfc, 0xe9, 0x9a} },
-{ 0x9b82,      16,     {0xf9, 0x0f, 0xd8, 0xe0, 0xe4, 0xc9, 0xfa, 0xe4, 0xcc, 0xfb, 0x22, 0x75, 0xf0, 0x10, 0xef, 0x2f} },
-{ 0x9b92,      16,     {0xff, 0xee, 0x33, 0xfe, 0xed, 0x33, 0xfd, 0xcc, 0x33, 0xcc, 0xc8, 0x33, 0xc8, 0x10, 0xd7, 0x07} },
-{ 0x9ba2,      16,     {0x9b, 0xec, 0x9a, 0xe8, 0x99, 0x40, 0x0a, 0xed, 0x9b, 0xfd, 0xec, 0x9a, 0xfc, 0xe8, 0x99, 0xf8} },
-{ 0x9bb2,      14,     {0x0f, 0xd5, 0xf0, 0xda, 0xe4, 0xcd, 0xfb, 0xe4, 0xcc, 0xfa, 0xe4, 0xc8, 0xf9, 0x22} },
-{ 0x9bc0,      16,     {0xeb, 0x9f, 0xf5, 0xf0, 0xea, 0x9e, 0x42, 0xf0, 0xe9, 0x9d, 0x42, 0xf0, 0xe8, 0x9c, 0x45, 0xf0} },
-{ 0x9bd0,      1,      {0x22} },
-{ 0x9bd1,      16,     {0xe8, 0x60, 0x0f, 0xec, 0xc3, 0x13, 0xfc, 0xed, 0x13, 0xfd, 0xee, 0x13, 0xfe, 0xef, 0x13, 0xff} },
-{ 0x9be1,      3,      {0xd8, 0xf1, 0x22} },
-{ 0x9be4,      16,     {0x08, 0x08, 0x08, 0xe6, 0xcf, 0x2f, 0xf6, 0x18, 0xe6, 0xce, 0x3e, 0xf6, 0x18, 0xe6, 0xcd, 0x3d} },
-{ 0x9bf4,      7,      {0xf6, 0x18, 0xe6, 0xcc, 0x3c, 0xf6, 0x22} },
-{ 0x9bfb,      12,     {0xec, 0xf0, 0xa3, 0xed, 0xf0, 0xa3, 0xee, 0xf0, 0xa3, 0xef, 0xf0, 0x22} },
-{ 0x9c07,      16,     {0xa8, 0x82, 0x85, 0x83, 0xf0, 0xd0, 0x83, 0xd0, 0x82, 0x12, 0x9c, 0x1e, 0x12, 0x9c, 0x1e, 0x12} },
-{ 0x9c17,      16,     {0x9c, 0x1e, 0x12, 0x9c, 0x1e, 0xe4, 0x73, 0xe4, 0x93, 0xa3, 0xc5, 0x83, 0xc5, 0xf0, 0xc5, 0x83} },
-{ 0x9c27,      16,     {0xc8, 0xc5, 0x82, 0xc8, 0xf0, 0xa3, 0xc5, 0x83, 0xc5, 0xf0, 0xc5, 0x83, 0xc8, 0xc5, 0x82, 0xc8} },
-{ 0x9c37,      1,      {0x22} },
-{ 0xffff,      0,      {0x00} }
-};
-
-#ifdef DEBUG
-static const struct whiteheat_hex_record whiteheat_loader[] = {
-{ 0x0000,      3,      {0x02, 0x09, 0x8d} },
-{ 0x0033,      3,      {0x02, 0x0e, 0x70} },
-{ 0x0043,      3,      {0x02, 0x0b, 0x00} },
-{ 0x004b,      3,      {0x02, 0x05, 0xb3} },
-{ 0x0100,      16,     {0x90, 0x7f, 0xa5, 0xe0, 0x54, 0x10, 0xff, 0xc4, 0x54, 0x0f, 0x44, 0x50, 0xf5, 0x0f, 0x13, 0xe4} },
-{ 0x0110,      16,     {0x33, 0xf5, 0x11, 0x90, 0x7f, 0xe9, 0xe0, 0x24, 0x5e, 0xb4, 0x07, 0x00, 0x40, 0x03, 0x02, 0x03} },
-{ 0x0120,      16,     {0x7c, 0x90, 0x01, 0x28, 0xf8, 0x28, 0x28, 0x73, 0x02, 0x01, 0xbc, 0x02, 0x01, 0xbc, 0x02, 0x01} },
-{ 0x0130,      16,     {0x91, 0x02, 0x01, 0x3d, 0x02, 0x01, 0x53, 0x02, 0x01, 0x6f, 0x02, 0x01, 0x9a, 0x90, 0x7f, 0x00} },
-{ 0x0140,      16,     {0xe5, 0x11, 0xf0, 0x90, 0x7f, 0xb5, 0x74, 0x01, 0xf0, 0x90, 0x7f, 0xb4, 0xe0, 0x44, 0x02, 0xf0} },
-{ 0x0150,      16,     {0x02, 0x03, 0x7c, 0x90, 0x7f, 0x92, 0xe0, 0xff, 0xc4, 0x54, 0x0f, 0x90, 0x7f, 0x00, 0xf0, 0x90} },
-{ 0x0160,      16,     {0x7f, 0xb5, 0x74, 0x01, 0xf0, 0x90, 0x7f, 0xb4, 0xe0, 0x44, 0x02, 0xf0, 0x02, 0x03, 0x7c, 0x12} },
-{ 0x0170,      16,     {0x0a, 0x89, 0x50, 0x07, 0xe4, 0x90, 0x7f, 0x00, 0xf0, 0x80, 0x06, 0x90, 0x7f, 0x00, 0x74, 0x0f} },
-{ 0x0180,      16,     {0xf0, 0x90, 0x7f, 0xb5, 0x74, 0x01, 0xf0, 0x90, 0x7f, 0xb4, 0xe0, 0x44, 0x02, 0xf0, 0x02, 0x03} },
-{ 0x0190,      16,     {0x7c, 0x90, 0x7f, 0xea, 0xe0, 0xf5, 0x0f, 0x02, 0x03, 0x7c, 0x90, 0x7f, 0x00, 0x74, 0x07, 0xf0} },
-{ 0x01a0,      16,     {0x90, 0x7f, 0xb5, 0x74, 0x01, 0xf0, 0x90, 0x7f, 0xb4, 0xe0, 0x44, 0x02, 0xf0, 0x7f, 0xe8, 0x7e} },
-{ 0x01b0,      16,     {0x03, 0x12, 0x0d, 0xd5, 0xd2, 0x06, 0x12, 0x0d, 0x0d, 0x02, 0x03, 0x7c, 0x90, 0x7f, 0xea, 0xe0} },
-{ 0x01c0,      16,     {0x75, 0x29, 0x00, 0xf5, 0x2a, 0xa3, 0xe0, 0xfe, 0xe4, 0xee, 0x42, 0x29, 0x90, 0x7f, 0xee, 0xe0} },
-{ 0x01d0,      16,     {0x75, 0x2b, 0x00, 0xf5, 0x2c, 0xa3, 0xe0, 0xfe, 0xe4, 0xee, 0x42, 0x2b, 0x90, 0x7f, 0xe8, 0xe0} },
-{ 0x01e0,      16,     {0x64, 0xc0, 0x60, 0x03, 0x02, 0x02, 0xc9, 0xe5, 0x2c, 0x45, 0x2b, 0x70, 0x03, 0x02, 0x03, 0x7c} },
-{ 0x01f0,      16,     {0xc3, 0xe5, 0x2c, 0x94, 0x40, 0xe5, 0x2b, 0x94, 0x00, 0x50, 0x08, 0x85, 0x2b, 0x2d, 0x85, 0x2c} },
-{ 0x0200,      16,     {0x2e, 0x80, 0x06, 0x75, 0x2d, 0x00, 0x75, 0x2e, 0x40, 0x90, 0x7f, 0xe9, 0xe0, 0x64, 0xa3, 0x70} },
-{ 0x0210,      16,     {0x34, 0xf5, 0x31, 0xf5, 0x32, 0xc3, 0xe5, 0x32, 0x95, 0x2e, 0xe5, 0x31, 0x95, 0x2d, 0x50, 0x5c} },
-{ 0x0220,      16,     {0xe5, 0x2a, 0x25, 0x32, 0xf5, 0x82, 0xe5, 0x31, 0x35, 0x29, 0xf5, 0x83, 0xe0, 0xff, 0x74, 0x00} },
-{ 0x0230,      16,     {0x25, 0x32, 0xf5, 0x82, 0xe4, 0x34, 0x7f, 0xf5, 0x83, 0xef, 0xf0, 0x05, 0x32, 0xe5, 0x32, 0x70} },
-{ 0x0240,      16,     {0x02, 0x05, 0x31, 0x80, 0xd0, 0xe4, 0xf5, 0x31, 0xf5, 0x32, 0xc3, 0xe5, 0x32, 0x95, 0x2e, 0xe5} },
-{ 0x0250,      16,     {0x31, 0x95, 0x2d, 0x50, 0x18, 0x74, 0x00, 0x25, 0x32, 0xf5, 0x82, 0xe4, 0x34, 0x7f, 0xf5, 0x83} },
-{ 0x0260,      16,     {0x74, 0xcd, 0xf0, 0x05, 0x32, 0xe5, 0x32, 0x70, 0x02, 0x05, 0x31, 0x80, 0xdd, 0xaf, 0x2a, 0xae} },
-{ 0x0270,      16,     {0x29, 0xad, 0x2e, 0x7a, 0x7f, 0x79, 0x00, 0x7b, 0x00, 0x12, 0x0b, 0xf4, 0x90, 0x7f, 0xb5, 0xe5} },
-{ 0x0280,      16,     {0x2e, 0xf0, 0xe5, 0x2e, 0x25, 0x2a, 0xf5, 0x2a, 0xe5, 0x2d, 0x35, 0x29, 0xf5, 0x29, 0xc3, 0xe5} },
-{ 0x0290,      16,     {0x2c, 0x95, 0x2e, 0xf5, 0x2c, 0xe5, 0x2b, 0x95, 0x2d, 0xf5, 0x2b, 0x90, 0x7f, 0x92, 0xe0, 0xff} },
-{ 0x02a0,      16,     {0xc4, 0x54, 0x0f, 0x75, 0x2f, 0x00, 0xf5, 0x30, 0xd3, 0x94, 0x00, 0xe5, 0x2f, 0x94, 0x00, 0x50} },
-{ 0x02b0,      16,     {0x0c, 0x90, 0x7f, 0xb4, 0xe0, 0x20, 0xe1, 0x03, 0x02, 0x01, 0xe7, 0x80, 0xf4, 0x90, 0x7f, 0xb4} },
-{ 0x02c0,      16,     {0xe0, 0x20, 0xe2, 0x03, 0x02, 0x01, 0xe7, 0x80, 0xf4, 0x90, 0x7f, 0xe8, 0xe0, 0x64, 0x40, 0x60} },
-{ 0x02d0,      16,     {0x03, 0x02, 0x03, 0x7c, 0xe5, 0x2c, 0x45, 0x2b, 0x70, 0x03, 0x02, 0x03, 0x7c, 0xe4, 0x90, 0x7f} },
-{ 0x02e0,      16,     {0xc5, 0xf0, 0x90, 0x7f, 0x92, 0xe0, 0xff, 0xc4, 0x54, 0x0f, 0x75, 0x2f, 0x00, 0xf5, 0x30, 0xd3} },
-{ 0x02f0,      16,     {0x94, 0x00, 0xe5, 0x2f, 0x94, 0x00, 0x50, 0x09, 0x90, 0x7f, 0xc4, 0xe0, 0x30, 0xe1, 0x09, 0x80} },
-{ 0x0300,      16,     {0xf7, 0x90, 0x7f, 0xb4, 0xe0, 0x20, 0xe3, 0xf9, 0x90, 0x7f, 0xc5, 0xe0, 0x75, 0x2d, 0x00, 0xf5} },
-{ 0x0310,      16,     {0x2e, 0x90, 0x7f, 0xe9, 0xe0, 0x64, 0xa3, 0x70, 0x38, 0x90, 0x20, 0x6b, 0xf0, 0xf5, 0x31, 0xf5} },
-{ 0x0320,      16,     {0x32, 0xc3, 0xe5, 0x32, 0x95, 0x2e, 0xe5, 0x31, 0x95, 0x2d, 0x50, 0x34, 0x74, 0xc0, 0x25, 0x32} },
-{ 0x0330,      16,     {0xf5, 0x82, 0xe4, 0x34, 0x7e, 0xf5, 0x83, 0xe0, 0xff, 0xe5, 0x2a, 0x25, 0x32, 0xf5, 0x82, 0xe5} },
-{ 0x0340,      16,     {0x31, 0x35, 0x29, 0xf5, 0x83, 0xef, 0xf0, 0x05, 0x32, 0xe5, 0x32, 0x70, 0x02, 0x05, 0x31, 0x80} },
-{ 0x0350,      16,     {0xd0, 0xaf, 0x2a, 0xae, 0x29, 0xad, 0x2e, 0x7a, 0x7e, 0x79, 0xc0, 0x7b, 0xc0, 0x12, 0x0c, 0x80} },
-{ 0x0360,      16,     {0xe5, 0x2e, 0x25, 0x2a, 0xf5, 0x2a, 0xe5, 0x2d, 0x35, 0x29, 0xf5, 0x29, 0xc3, 0xe5, 0x2c, 0x95} },
-{ 0x0370,      13,     {0x2e, 0xf5, 0x2c, 0xe5, 0x2b, 0x95, 0x2d, 0xf5, 0x2b, 0x02, 0x02, 0xd4, 0xc3} },
-{ 0x037d,      1,      {0x22} },
-{ 0x037e,      16,     {0x90, 0x7f, 0xe9, 0xe0, 0x70, 0x03, 0x02, 0x04, 0x56, 0x14, 0x70, 0x03, 0x02, 0x04, 0xd2, 0x24} },
-{ 0x038e,      16,     {0xfe, 0x70, 0x03, 0x02, 0x05, 0x46, 0x24, 0xfb, 0x70, 0x03, 0x02, 0x04, 0x50, 0x14, 0x70, 0x03} },
-{ 0x039e,      16,     {0x02, 0x04, 0x4a, 0x14, 0x70, 0x03, 0x02, 0x04, 0x3e, 0x14, 0x70, 0x03, 0x02, 0x04, 0x44, 0x24} },
-{ 0x03ae,      16,     {0x05, 0x60, 0x03, 0x02, 0x05, 0x9a, 0x12, 0x0e, 0x7b, 0x40, 0x03, 0x02, 0x05, 0xab, 0x90, 0x7f} },
-{ 0x03be,      16,     {0xeb, 0xe0, 0x24, 0xfe, 0x60, 0x16, 0x14, 0x60, 0x40, 0x24, 0x02, 0x70, 0x69, 0x74, 0x11, 0x90} },
-{ 0x03ce,      16,     {0x7f, 0xd4, 0xf0, 0x74, 0x00, 0x90, 0x7f, 0xd5, 0xf0, 0x02, 0x05, 0xab, 0x90, 0x7f, 0xea, 0xe0} },
-{ 0x03de,      16,     {0xff, 0x12, 0x0b, 0x58, 0x8b, 0x26, 0x8a, 0x27, 0x89, 0x28, 0xea, 0x49, 0x60, 0x11, 0xae, 0x02} },
-{ 0x03ee,      16,     {0xee, 0x90, 0x7f, 0xd4, 0xf0, 0xaf, 0x01, 0xef, 0x90, 0x7f, 0xd5, 0xf0, 0x02, 0x05, 0xab, 0x90} },
-{ 0x03fe,      16,     {0x7f, 0xb4, 0xe0, 0x44, 0x01, 0xf0, 0x02, 0x05, 0xab, 0x90, 0x7f, 0xea, 0xe0, 0xff, 0x12, 0x0c} },
-{ 0x040e,      16,     {0x3f, 0x8b, 0x26, 0x8a, 0x27, 0x89, 0x28, 0xea, 0x49, 0x60, 0x11, 0xae, 0x02, 0xee, 0x90, 0x7f} },
-{ 0x041e,      16,     {0xd4, 0xf0, 0xaf, 0x01, 0xef, 0x90, 0x7f, 0xd5, 0xf0, 0x02, 0x05, 0xab, 0x90, 0x7f, 0xb4, 0xe0} },
-{ 0x042e,      16,     {0x44, 0x01, 0xf0, 0x02, 0x05, 0xab, 0x90, 0x7f, 0xb4, 0xe0, 0x44, 0x01, 0xf0, 0x02, 0x05, 0xab} },
-{ 0x043e,      16,     {0x12, 0x0e, 0x52, 0x02, 0x05, 0xab, 0x12, 0x0e, 0x60, 0x02, 0x05, 0xab, 0x12, 0x0a, 0xf7, 0x02} },
-{ 0x044e,      16,     {0x05, 0xab, 0x12, 0x08, 0xf1, 0x02, 0x05, 0xab, 0x12, 0x0e, 0x7d, 0x40, 0x03, 0x02, 0x05, 0xab} },
-{ 0x045e,      16,     {0x90, 0x7f, 0xe8, 0xe0, 0x24, 0x7f, 0x60, 0x24, 0x14, 0x60, 0x31, 0x24, 0x02, 0x70, 0x5b, 0xa2} },
-{ 0x046e,      16,     {0x00, 0xe4, 0x33, 0xff, 0x25, 0xe0, 0xff, 0xa2, 0x02, 0xe4, 0x33, 0x4f, 0x90, 0x7f, 0x00, 0xf0} },
-{ 0x047e,      16,     {0xe4, 0xa3, 0xf0, 0x90, 0x7f, 0xb5, 0x74, 0x02, 0xf0, 0x02, 0x05, 0xab, 0xe4, 0x90, 0x7f, 0x00} },
-{ 0x048e,      16,     {0xf0, 0xa3, 0xf0, 0x90, 0x7f, 0xb5, 0x74, 0x02, 0xf0, 0x02, 0x05, 0xab, 0x90, 0x7f, 0xec, 0xe0} },
-{ 0x049e,      16,     {0xf4, 0x54, 0x80, 0xff, 0xc4, 0x54, 0x0f, 0xff, 0xe0, 0x54, 0x07, 0x2f, 0x25, 0xe0, 0x24, 0xb4} },
-{ 0x04ae,      16,     {0xf5, 0x82, 0xe4, 0x34, 0x7f, 0xf5, 0x83, 0xe0, 0x54, 0xfd, 0x90, 0x7f, 0x00, 0xf0, 0xe4, 0xa3} },
-{ 0x04be,      16,     {0xf0, 0x90, 0x7f, 0xb5, 0x74, 0x02, 0xf0, 0x02, 0x05, 0xab, 0x90, 0x7f, 0xb4, 0xe0, 0x44, 0x01} },
-{ 0x04ce,      16,     {0xf0, 0x02, 0x05, 0xab, 0x12, 0x0e, 0x7f, 0x40, 0x03, 0x02, 0x05, 0xab, 0x90, 0x7f, 0xe8, 0xe0} },
-{ 0x04de,      16,     {0x24, 0xfe, 0x60, 0x1d, 0x24, 0x02, 0x60, 0x03, 0x02, 0x05, 0xab, 0x90, 0x7f, 0xea, 0xe0, 0xb4} },
-{ 0x04ee,      16,     {0x01, 0x05, 0xc2, 0x00, 0x02, 0x05, 0xab, 0x90, 0x7f, 0xb4, 0xe0, 0x44, 0x01, 0xf0, 0x02, 0x05} },
-{ 0x04fe,      16,     {0xab, 0x90, 0x7f, 0xea, 0xe0, 0x70, 0x38, 0x90, 0x7f, 0xec, 0xe0, 0xf4, 0x54, 0x80, 0xff, 0xc4} },
-{ 0x050e,      16,     {0x54, 0x0f, 0xff, 0xe0, 0x54, 0x07, 0x2f, 0x25, 0xe0, 0x24, 0xb4, 0xf5, 0x82, 0xe4, 0x34, 0x7f} },
-{ 0x051e,      16,     {0xf5, 0x83, 0xe4, 0xf0, 0x90, 0x7f, 0xec, 0xe0, 0x54, 0x80, 0xff, 0x13, 0x13, 0x13, 0x54, 0x1f} },
-{ 0x052e,      16,     {0xff, 0xe0, 0x54, 0x07, 0x2f, 0x90, 0x7f, 0xd7, 0xf0, 0xe0, 0x44, 0x20, 0xf0, 0x80, 0x6e, 0x90} },
-{ 0x053e,      16,     {0x7f, 0xb4, 0xe0, 0x44, 0x01, 0xf0, 0x80, 0x65, 0x12, 0x0e, 0x81, 0x50, 0x60, 0x90, 0x7f, 0xe8} },
-{ 0x054e,      16,     {0xe0, 0x24, 0xfe, 0x60, 0x18, 0x24, 0x02, 0x70, 0x54, 0x90, 0x7f, 0xea, 0xe0, 0xb4, 0x01, 0x04} },
-{ 0x055e,      16,     {0xd2, 0x00, 0x80, 0x49, 0x90, 0x7f, 0xb4, 0xe0, 0x44, 0x01, 0xf0, 0x80, 0x40, 0x90, 0x7f, 0xea} },
-{ 0x056e,      16,     {0xe0, 0x70, 0x20, 0x90, 0x7f, 0xec, 0xe0, 0xf4, 0x54, 0x80, 0xff, 0xc4, 0x54, 0x0f, 0xff, 0xe0} },
-{ 0x057e,      16,     {0x54, 0x07, 0x2f, 0x25, 0xe0, 0x24, 0xb4, 0xf5, 0x82, 0xe4, 0x34, 0x7f, 0xf5, 0x83, 0x74, 0x01} },
-{ 0x058e,      16,     {0xf0, 0x80, 0x1a, 0x90, 0x7f, 0xb4, 0xe0, 0x44, 0x01, 0xf0, 0x80, 0x11, 0xe4, 0x90, 0x20, 0x6a} },
-{ 0x059e,      16,     {0xf0, 0x12, 0x01, 0x00, 0x50, 0x07, 0x90, 0x7f, 0xb4, 0xe0, 0x44, 0x01, 0xf0, 0x90, 0x7f, 0xb4} },
-{ 0x05ae,      4,      {0xe0, 0x44, 0x02, 0xf0} },
-{ 0x05b2,      1,      {0x22} },
-{ 0x05b3,      16,     {0xc0, 0xe0, 0xc0, 0x83, 0xc0, 0x82, 0xc0, 0x85, 0xc0, 0x84, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xc0} },
-{ 0x05c3,      16,     {0xd0, 0xc0, 0x00, 0xc0, 0x01, 0xc0, 0x02, 0xc0, 0x03, 0xc0, 0x06, 0xc0, 0x07, 0x90, 0x7f, 0xa5} },
-{ 0x05d3,      16,     {0xe0, 0x30, 0xe2, 0x06, 0x75, 0x0d, 0x06, 0x02, 0x06, 0x7f, 0x90, 0x7f, 0xa5, 0xe0, 0x20, 0xe1} },
-{ 0x05e3,      16,     {0x0c, 0xe5, 0x0d, 0x64, 0x02, 0x60, 0x06, 0x75, 0x0d, 0x07, 0x02, 0x06, 0x7f, 0xaf, 0x0d, 0xef} },
-{ 0x05f3,      16,     {0x24, 0xfe, 0x60, 0x48, 0x14, 0x60, 0x2c, 0x24, 0xfe, 0x60, 0x77, 0x24, 0x04, 0x60, 0x03, 0x02} },
-{ 0x0603,      16,     {0x06, 0x7f, 0xab, 0x09, 0xaa, 0x0a, 0xa9, 0x0b, 0xaf, 0x0c, 0x05, 0x0c, 0x8f, 0x82, 0x75, 0x83} },
-{ 0x0613,      16,     {0x00, 0x12, 0x07, 0x85, 0x90, 0x7f, 0xa6, 0xf0, 0xe5, 0x0c, 0x65, 0x08, 0x70, 0x5e, 0x75, 0x0d} },
-{ 0x0623,      16,     {0x05, 0x80, 0x59, 0x90, 0x7f, 0xa6, 0xe0, 0xab, 0x09, 0xaa, 0x0a, 0xa9, 0x0b, 0xae, 0x0c, 0x8e} },
-{ 0x0633,      16,     {0x82, 0x75, 0x83, 0x00, 0x12, 0x07, 0xb2, 0x75, 0x0d, 0x02, 0x80, 0x40, 0xe5, 0x08, 0x24, 0xfe} },
-{ 0x0643,      16,     {0xb5, 0x0c, 0x07, 0x90, 0x7f, 0xa5, 0xe0, 0x44, 0x20, 0xf0, 0xe5, 0x08, 0x14, 0xb5, 0x0c, 0x0a} },
-{ 0x0653,      16,     {0x90, 0x7f, 0xa5, 0xe0, 0x44, 0x40, 0xf0, 0xe4, 0xf5, 0x0d, 0x90, 0x7f, 0xa6, 0xe0, 0xab, 0x09} },
-{ 0x0663,      16,     {0xaa, 0x0a, 0xa9, 0x0b, 0xae, 0x0c, 0x8e, 0x82, 0x75, 0x83, 0x00, 0x12, 0x07, 0xb2, 0x05, 0x0c} },
-{ 0x0673,      16,     {0x80, 0x0a, 0x90, 0x7f, 0xa5, 0xe0, 0x44, 0x40, 0xf0, 0xe4, 0xf5, 0x0d, 0x53, 0x91, 0xdf, 0xd0} },
-{ 0x0683,      16,     {0x07, 0xd0, 0x06, 0xd0, 0x03, 0xd0, 0x02, 0xd0, 0x01, 0xd0, 0x00, 0xd0, 0xd0, 0xd0, 0x86, 0xd0} },
-{ 0x0693,      10,     {0x84, 0xd0, 0x85, 0xd0, 0x82, 0xd0, 0x83, 0xd0, 0xe0, 0x32} },
-{ 0x069d,      16,     {0xc2, 0x04, 0xd2, 0x05, 0xe4, 0xf5, 0x25, 0xc2, 0x03, 0xc2, 0x00, 0xc2, 0x02, 0xc2, 0x01, 0x12} },
-{ 0x06ad,      16,     {0x0e, 0x74, 0xd2, 0xe8, 0x43, 0xd8, 0x20, 0x90, 0x7f, 0xab, 0x74, 0xff, 0xf0, 0x90, 0x7f, 0xa9} },
-{ 0x06bd,      16,     {0xf0, 0x90, 0x7f, 0xaa, 0xf0, 0x53, 0x91, 0xef, 0x90, 0x7f, 0x95, 0xe0, 0x44, 0xc0, 0xf0, 0x90} },
-{ 0x06cd,      16,     {0x7f, 0x93, 0x74, 0x30, 0xf0, 0x12, 0x0a, 0x19, 0x75, 0x24, 0x48, 0x75, 0x23, 0x92, 0x75, 0x22} },
-{ 0x06dd,      16,     {0x00, 0x75, 0x21, 0x00, 0xe4, 0xff, 0xfe, 0x7e, 0x05, 0x90, 0x20, 0x68, 0x74, 0x01, 0xf0, 0xa3} },
-{ 0x06ed,      16,     {0xde, 0xfc, 0x7e, 0x00, 0x7f, 0x05, 0x90, 0x7f, 0xaf, 0xe0, 0x44, 0x01, 0xf0, 0x90, 0x7f, 0xae} },
-{ 0x06fd,      16,     {0xe0, 0x44, 0x0d, 0xf0, 0xd2, 0xaf, 0x12, 0x0e, 0x68, 0x30, 0x01, 0x0a, 0xe4, 0x90, 0x20, 0x69} },
-{ 0x070d,      16,     {0xf0, 0x12, 0x03, 0x7e, 0xc2, 0x01, 0x30, 0x04, 0x1a, 0x12, 0x0e, 0x77, 0x50, 0x13, 0x12, 0x09} },
-{ 0x071d,      16,     {0x00, 0x30, 0x00, 0x07, 0x90, 0x7f, 0xd6, 0xe0, 0x30, 0xe7, 0xf3, 0x12, 0x0d, 0x8b, 0x12, 0x0e} },
-{ 0x072d,      16,     {0x79, 0xc2, 0x03, 0x7f, 0xff, 0x7e, 0xff, 0x7d, 0xff, 0x7c, 0xff, 0x78, 0x21, 0x12, 0x08, 0x1d} },
-{ 0x073d,      16,     {0x7b, 0x00, 0x7a, 0x00, 0x79, 0x00, 0x78, 0x00, 0xc3, 0x12, 0x08, 0x0c, 0x70, 0x1b, 0x75, 0x24} },
-{ 0x074d,      16,     {0x48, 0x75, 0x23, 0x92, 0xf5, 0x22, 0xf5, 0x21, 0x63, 0x25, 0xff, 0x90, 0x20, 0x68, 0xe5, 0x25} },
-{ 0x075d,      14,     {0xf0, 0xa3, 0x74, 0x01, 0xf0, 0xa3, 0xf0, 0xa3, 0xf0, 0x12, 0x08, 0xff, 0x80, 0x9b} },
-{ 0x076b,      1,      {0x22} },
-{ 0x076c,      16,     {0xbb, 0x01, 0x06, 0x89, 0x82, 0x8a, 0x83, 0xe0, 0x22, 0x50, 0x02, 0xe7, 0x22, 0xbb, 0xfe, 0x02} },
-{ 0x077c,      9,      {0xe3, 0x22, 0x89, 0x82, 0x8a, 0x83, 0xe4, 0x93, 0x22} },
-{ 0x0785,      16,     {0xbb, 0x01, 0x0c, 0xe5, 0x82, 0x29, 0xf5, 0x82, 0xe5, 0x83, 0x3a, 0xf5, 0x83, 0xe0, 0x22, 0x50} },
-{ 0x0795,      16,     {0x06, 0xe9, 0x25, 0x82, 0xf8, 0xe6, 0x22, 0xbb, 0xfe, 0x06, 0xe9, 0x25, 0x82, 0xf8, 0xe2, 0x22} },
-{ 0x07a5,      13,     {0xe5, 0x82, 0x29, 0xf5, 0x82, 0xe5, 0x83, 0x3a, 0xf5, 0x83, 0xe4, 0x93, 0x22} },
-{ 0x07b2,      16,     {0xf8, 0xbb, 0x01, 0x0d, 0xe5, 0x82, 0x29, 0xf5, 0x82, 0xe5, 0x83, 0x3a, 0xf5, 0x83, 0xe8, 0xf0} },
-{ 0x07c2,      16,     {0x22, 0x50, 0x06, 0xe9, 0x25, 0x82, 0xc8, 0xf6, 0x22, 0xbb, 0xfe, 0x05, 0xe9, 0x25, 0x82, 0xc8} },
-{ 0x07d2,      2,      {0xf2, 0x22} },
-{ 0x07d4,      16,     {0xbb, 0x01, 0x10, 0xe5, 0x82, 0x29, 0xf5, 0x82, 0xe5, 0x83, 0x3a, 0xf5, 0x83, 0xe0, 0xf5, 0xf0} },
-{ 0x07e4,      16,     {0xa3, 0xe0, 0x22, 0x50, 0x09, 0xe9, 0x25, 0x82, 0xf8, 0x86, 0xf0, 0x08, 0xe6, 0x22, 0xbb, 0xfe} },
-{ 0x07f4,      16,     {0x0a, 0xe9, 0x25, 0x82, 0xf8, 0xe2, 0xf5, 0xf0, 0x08, 0xe2, 0x22, 0xe5, 0x83, 0x2a, 0xf5, 0x83} },
-{ 0x0804,      8,      {0xe9, 0x93, 0xf5, 0xf0, 0xa3, 0xe9, 0x93, 0x22} },
-{ 0x080c,      16,     {0xeb, 0x9f, 0xf5, 0xf0, 0xea, 0x9e, 0x42, 0xf0, 0xe9, 0x9d, 0x42, 0xf0, 0xe8, 0x9c, 0x45, 0xf0} },
-{ 0x081c,      1,      {0x22} },
-{ 0x081d,      16,     {0x08, 0x08, 0x08, 0xe6, 0x2f, 0xff, 0xf6, 0x18, 0xe6, 0x3e, 0xfe, 0xf6, 0x18, 0xe6, 0x3d, 0xfd} },
-{ 0x082d,      7,      {0xf6, 0x18, 0xe6, 0x3c, 0xfc, 0xf6, 0x22} },
-{ 0x0834,      4,      {0x8c, 0x34, 0x8d, 0x35} },
-{ 0x0838,      16,     {0x90, 0x7f, 0x95, 0xe0, 0x44, 0xc0, 0xf0, 0xe4, 0xf5, 0x36, 0xf5, 0x37, 0xc3, 0xe5, 0x37, 0x95} },
-{ 0x0848,      16,     {0x35, 0xe5, 0x36, 0x95, 0x34, 0x50, 0x69, 0xef, 0x25, 0x37, 0xf5, 0x82, 0xe5, 0x36, 0x3e, 0xf5} },
-{ 0x0858,      16,     {0x83, 0x74, 0xff, 0xf0, 0xf4, 0x60, 0x02, 0xc3, 0x22, 0xef, 0x25, 0x37, 0xf5, 0x82, 0xe5, 0x36} },
-{ 0x0868,      16,     {0x3e, 0xf5, 0x83, 0xe4, 0xf0, 0x60, 0x02, 0xc3, 0x22, 0xef, 0x25, 0x37, 0xf5, 0x82, 0xe5, 0x36} },
-{ 0x0878,      16,     {0x3e, 0xf5, 0x83, 0x74, 0xaa, 0xf0, 0x64, 0xaa, 0x60, 0x02, 0xc3, 0x22, 0xef, 0x25, 0x37, 0xf5} },
-{ 0x0888,      16,     {0x82, 0xe5, 0x36, 0x3e, 0xf5, 0x83, 0x74, 0x55, 0xf0, 0x64, 0x55, 0x60, 0x02, 0xc3, 0x22, 0xad} },
-{ 0x0898,      16,     {0x37, 0xe5, 0x37, 0x2f, 0xf5, 0x82, 0xe5, 0x36, 0x3e, 0xf5, 0x83, 0xed, 0xf0, 0xfc, 0xac, 0x05} },
-{ 0x08a8,      16,     {0xed, 0x6c, 0x60, 0x02, 0xc3, 0x22, 0x05, 0x37, 0xe5, 0x37, 0x70, 0x02, 0x05, 0x36, 0x80, 0x8c} },
-{ 0x08b8,      16,     {0xe4, 0xf5, 0x36, 0xf5, 0x37, 0xc3, 0xe5, 0x37, 0x95, 0x35, 0xe5, 0x36, 0x95, 0x34, 0x50, 0x27} },
-{ 0x08c8,      16,     {0xef, 0x25, 0x37, 0xf5, 0x82, 0xe5, 0x36, 0x3e, 0xf5, 0x83, 0xe0, 0x65, 0x37, 0x60, 0x02, 0xc3} },
-{ 0x08d8,      16,     {0x22, 0xef, 0x25, 0x37, 0xf5, 0x82, 0xe5, 0x36, 0x3e, 0xf5, 0x83, 0xe4, 0xf0, 0x05, 0x37, 0xe5} },
-{ 0x08e8,      8,      {0x37, 0x70, 0x02, 0x05, 0x36, 0x80, 0xce, 0xd3} },
-{ 0x08f0,      1,      {0x22} },
-{ 0x08f1,      14,     {0x90, 0x7f, 0x00, 0xe5, 0x10, 0xf0, 0x90, 0x7f, 0xb5, 0x74, 0x01, 0xf0, 0xd3, 0x22} },
-{ 0x08ff,      1,      {0x22} },
-{ 0x0900,      9,      {0x90, 0x7f, 0xd6, 0xe0, 0x44, 0x80, 0xf0, 0x80, 0x74} },
-{ 0x097d,      16,     {0x43, 0x87, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22} },
-{ 0x098d,      12,     {0x78, 0x7f, 0xe4, 0xf6, 0xd8, 0xfd, 0x75, 0x81, 0x3a, 0x02, 0x09, 0xd4} },
-{ 0x0999,      16,     {0x02, 0x06, 0x9d, 0xe4, 0x93, 0xa3, 0xf8, 0xe4, 0x93, 0xa3, 0x40, 0x03, 0xf6, 0x80, 0x01, 0xf2} },
-{ 0x09a9,      16,     {0x08, 0xdf, 0xf4, 0x80, 0x29, 0xe4, 0x93, 0xa3, 0xf8, 0x54, 0x07, 0x24, 0x0c, 0xc8, 0xc3, 0x33} },
-{ 0x09b9,      16,     {0xc4, 0x54, 0x0f, 0x44, 0x20, 0xc8, 0x83, 0x40, 0x04, 0xf4, 0x56, 0x80, 0x01, 0x46, 0xf6, 0xdf} },
-{ 0x09c9,      16,     {0xe4, 0x80, 0x0b, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x90, 0x0e, 0x2d, 0xe4, 0x7e} },
-{ 0x09d9,      16,     {0x01, 0x93, 0x60, 0xbc, 0xa3, 0xff, 0x54, 0x3f, 0x30, 0xe5, 0x09, 0x54, 0x1f, 0xfe, 0xe4, 0x93} },
-{ 0x09e9,      16,     {0xa3, 0x60, 0x01, 0x0e, 0xcf, 0x54, 0xc0, 0x25, 0xe0, 0x60, 0xa8, 0x40, 0xb8, 0xe4, 0x93, 0xa3} },
-{ 0x09f9,      16,     {0xfa, 0xe4, 0x93, 0xa3, 0xf8, 0xe4, 0x93, 0xa3, 0xc8, 0xc5, 0x82, 0xc8, 0xca, 0xc5, 0x83, 0xca} },
-{ 0x0a09,      16,     {0xf0, 0xa3, 0xc8, 0xc5, 0x82, 0xc8, 0xca, 0xc5, 0x83, 0xca, 0xdf, 0xe9, 0xde, 0xe7, 0x80, 0xbe} },
-{ 0x0a19,      16,     {0xe4, 0x90, 0x7f, 0x9c, 0xf0, 0x7f, 0x0a, 0xfe, 0x12, 0x0d, 0xd5, 0x90, 0x7f, 0x96, 0x74, 0x89} },
-{ 0x0a29,      16,     {0xf0, 0x90, 0x7f, 0x9c, 0x74, 0xcf, 0xf0, 0x7f, 0xf4, 0x7e, 0x01, 0x12, 0x0d, 0xd5, 0x90, 0x7f} },
-{ 0x0a39,      16,     {0x96, 0xe0, 0x54, 0xfe, 0xf0, 0x7f, 0x0a, 0x7e, 0x00, 0x12, 0x0d, 0xd5, 0x7f, 0x05, 0x7e, 0x00} },
-{ 0x0a49,      16,     {0x12, 0x0d, 0xd5, 0x90, 0x7f, 0x96, 0xe0, 0x44, 0x02, 0xf0, 0xe0, 0x54, 0x7f, 0xf0, 0x7f, 0x05} },
-{ 0x0a59,      16,     {0x7e, 0x00, 0x12, 0x0d, 0xd5, 0x90, 0x7f, 0x96, 0xe0, 0x44, 0x40, 0xf0, 0x7f, 0x05, 0x7e, 0x00} },
-{ 0x0a69,      16,     {0x12, 0x0d, 0xd5, 0x90, 0x7f, 0x96, 0xe0, 0x54, 0xbf, 0xf0, 0x7f, 0x32, 0x7e, 0x00, 0x12, 0x0d} },
-{ 0x0a79,      16,     {0xd5, 0x90, 0x7f, 0x96, 0xe0, 0x44, 0x40, 0xf0, 0x7f, 0x32, 0x7e, 0x00, 0x12, 0x0d, 0xd5, 0x22} },
-{ 0x0a89,      16,     {0x75, 0x33, 0x01, 0xe5, 0x33, 0x60, 0x1b, 0x7f, 0x01, 0x12, 0x0e, 0x18, 0x7f, 0x00, 0x7e, 0x0e} },
-{ 0x0a99,      16,     {0x7d, 0x00, 0x7c, 0x01, 0x12, 0x08, 0x34, 0xe4, 0x33, 0xf5, 0x33, 0x70, 0x05, 0x7f, 0x0f, 0x12} },
-{ 0x0aa9,      16,     {0x0e, 0x18, 0xe5, 0x33, 0x60, 0x1b, 0x7f, 0x02, 0x12, 0x0e, 0x18, 0x7f, 0x00, 0x7e, 0x80, 0x7d} },
-{ 0x0ab9,      16,     {0x00, 0x7c, 0x80, 0x12, 0x08, 0x34, 0xe4, 0x33, 0xf5, 0x33, 0x70, 0x05, 0x7f, 0x0f, 0x12, 0x0e} },
-{ 0x0ac9,      16,     {0x18, 0xe5, 0x33, 0x60, 0x1b, 0x7f, 0x03, 0x12, 0x0e, 0x18, 0x7f, 0x00, 0x7e, 0x20, 0x7d, 0x40} },
-{ 0x0ad9,      16,     {0x7c, 0x5b, 0x12, 0x08, 0x34, 0xe4, 0x33, 0xf5, 0x33, 0x70, 0x05, 0x7f, 0x0f, 0x12, 0x0e, 0x18} },
-{ 0x0ae9,      13,     {0xe5, 0x33, 0x60, 0x05, 0xe4, 0xff, 0x12, 0x0e, 0x18, 0xe5, 0x33, 0x24, 0xff} },
-{ 0x0af6,      1,      {0x22} },
-{ 0x0af7,      8,      {0x90, 0x7f, 0xea, 0xe0, 0xf5, 0x10, 0xd3, 0x22} },
-{ 0x0aff,      1,      {0x32} },
-{ 0x0b00,      16,     {0x02, 0x0d, 0xa5, 0x00, 0x02, 0x0d, 0xec, 0x00, 0x02, 0x0d, 0x70, 0x00, 0x02, 0x0d, 0xbd, 0x00} },
-{ 0x0b10,      16,     {0x02, 0x0e, 0x02, 0x00, 0x02, 0x0a, 0xff, 0x00, 0x02, 0x0e, 0x83, 0x00, 0x02, 0x0e, 0x84, 0x00} },
-{ 0x0b20,      16,     {0x02, 0x0e, 0x85, 0x00, 0x02, 0x0e, 0x86, 0x00, 0x02, 0x0e, 0x87, 0x00, 0x02, 0x0e, 0x88, 0x00} },
-{ 0x0b30,      16,     {0x02, 0x0e, 0x89, 0x00, 0x02, 0x0e, 0x8a, 0x00, 0x02, 0x0e, 0x8b, 0x00, 0x02, 0x0e, 0x8c, 0x00} },
-{ 0x0b40,      16,     {0x02, 0x0e, 0x8d, 0x00, 0x02, 0x0e, 0x8e, 0x00, 0x02, 0x0e, 0x8f, 0x00, 0x02, 0x0e, 0x90, 0x00} },
-{ 0x0b50,      8,      {0x02, 0x0e, 0x91, 0x00, 0x02, 0x0e, 0x92, 0x00} },
-{ 0x0b58,      16,     {0xe4, 0xfe, 0x75, 0x2b, 0xff, 0x75, 0x2c, 0x11, 0x75, 0x2d, 0x12, 0xab, 0x2b, 0xaa, 0x2c, 0xa9} },
-{ 0x0b68,      16,     {0x2d, 0x90, 0x00, 0x01, 0x12, 0x07, 0x85, 0x64, 0x02, 0x70, 0x2d, 0xad, 0x06, 0x0e, 0xed, 0xb5} },
-{ 0x0b78,      16,     {0x07, 0x01, 0x22, 0x90, 0x00, 0x02, 0x12, 0x07, 0xd4, 0x85, 0xf0, 0x29, 0xf5, 0x2a, 0x62, 0x29} },
-{ 0x0b88,      16,     {0xe5, 0x29, 0x62, 0x2a, 0xe5, 0x2a, 0x62, 0x29, 0x29, 0xfd, 0xe5, 0x29, 0x3a, 0xa9, 0x05, 0x75} },
-{ 0x0b98,      14,     {0x2b, 0xff, 0xf5, 0x2c, 0x89, 0x2d, 0x80, 0xc3, 0x7b, 0x00, 0x7a, 0x00, 0x79, 0x00} },
-{ 0x0ba6,      1,      {0x22} },
-{ 0x0ba7,      6,      {0xab, 0x07, 0xaa, 0x06, 0xac, 0x05} },
-{ 0x0bad,      16,     {0xe4, 0xfd, 0xe5, 0x11, 0x60, 0x11, 0xea, 0xff, 0xae, 0x05, 0x0d, 0xee, 0x24, 0x10, 0xf5, 0x82} },
-{ 0x0bbd,      16,     {0xe4, 0x34, 0x0f, 0xf5, 0x83, 0xef, 0xf0, 0xeb, 0xae, 0x05, 0x0d, 0x74, 0x10, 0x2e, 0xf5, 0x82} },
-{ 0x0bcd,      16,     {0xe4, 0x34, 0x0f, 0xf5, 0x83, 0xeb, 0xf0, 0xaf, 0x05, 0x0d, 0x74, 0x10, 0x2f, 0xf5, 0x82, 0xe4} },
-{ 0x0bdd,      16,     {0x34, 0x0f, 0xf5, 0x83, 0xec, 0xf0, 0xaf, 0x0f, 0x7a, 0x0f, 0x7b, 0x10, 0x12, 0x0d, 0x51, 0x7f} },
-{ 0x0bed,      6,      {0x0a, 0x7e, 0x00, 0x12, 0x0d, 0xd5} },
-{ 0x0bf3,      1,      {0x22} },
-{ 0x0bf4,      10,     {0x8e, 0x33, 0x8f, 0x34, 0x8d, 0x35, 0x8a, 0x36, 0x8b, 0x37} },
-{ 0x0bfe,      16,     {0xe4, 0xfd, 0xf5, 0x38, 0xe5, 0x11, 0x60, 0x12, 0xe5, 0x33, 0xff, 0xae, 0x05, 0x0d, 0xee, 0x24} },
-{ 0x0c0e,      16,     {0x13, 0xf5, 0x82, 0xe4, 0x34, 0x0f, 0xf5, 0x83, 0xef, 0xf0, 0xe5, 0x34, 0xae, 0x05, 0x0d, 0x74} },
-{ 0x0c1e,      16,     {0x13, 0x2e, 0xf5, 0x82, 0xe4, 0x34, 0x0f, 0xf5, 0x83, 0xe5, 0x34, 0xf0, 0xaf, 0x0f, 0x7a, 0x0f} },
-{ 0x0c2e,      16,     {0x7b, 0x13, 0x12, 0x0d, 0x51, 0xaf, 0x0f, 0xad, 0x35, 0xab, 0x37, 0xaa, 0x36, 0x12, 0x0d, 0x32} },
-{ 0x0c3e,      1,      {0x22} },
-{ 0x0c3f,      2,      {0x8f, 0x29} },
-{ 0x0c41,      16,     {0xe4, 0xf5, 0x2a, 0x75, 0x2b, 0xff, 0x75, 0x2c, 0x11, 0x75, 0x2d, 0x32, 0xab, 0x2b, 0xaa, 0x2c} },
-{ 0x0c51,      16,     {0xa9, 0x2d, 0x90, 0x00, 0x01, 0x12, 0x07, 0x85, 0xb4, 0x03, 0x1d, 0xaf, 0x2a, 0x05, 0x2a, 0xef} },
-{ 0x0c61,      16,     {0xb5, 0x29, 0x01, 0x22, 0x12, 0x07, 0x6c, 0x7e, 0x00, 0x29, 0xff, 0xee, 0x3a, 0xa9, 0x07, 0x75} },
-{ 0x0c71,      14,     {0x2b, 0xff, 0xf5, 0x2c, 0x89, 0x2d, 0x80, 0xd4, 0x7b, 0x00, 0x7a, 0x00, 0x79, 0x00} },
-{ 0x0c7f,      1,      {0x22} },
-{ 0x0c80,      10,     {0x8e, 0x33, 0x8f, 0x34, 0x8d, 0x35, 0x8a, 0x36, 0x8b, 0x37} },
-{ 0x0c8a,      16,     {0xe4, 0xf5, 0x38, 0xe5, 0x38, 0xc3, 0x95, 0x35, 0x50, 0x20, 0x05, 0x34, 0xe5, 0x34, 0xae, 0x33} },
-{ 0x0c9a,      16,     {0x70, 0x02, 0x05, 0x33, 0x14, 0xff, 0xe5, 0x37, 0x25, 0x38, 0xf5, 0x82, 0xe4, 0x35, 0x36, 0xf5} },
-{ 0x0caa,      10,     {0x83, 0xe0, 0xfd, 0x12, 0x0b, 0xa7, 0x05, 0x38, 0x80, 0xd9} },
-{ 0x0cb4,      1,      {0x22} },
-{ 0x0cb5,      16,     {0xa9, 0x07, 0xe5, 0x0d, 0x70, 0x25, 0x90, 0x7f, 0xa5, 0xe0, 0x44, 0x80, 0xf0, 0xe9, 0x25, 0xe0} },
-{ 0x0cc5,      16,     {0x44, 0x01, 0x90, 0x7f, 0xa6, 0xf0, 0x8d, 0x08, 0xaf, 0x03, 0xa9, 0x07, 0x75, 0x09, 0x01, 0x8a} },
-{ 0x0cd5,      13,     {0x0a, 0x89, 0x0b, 0xe4, 0xf5, 0x0c, 0x75, 0x0d, 0x03, 0xd3, 0x22, 0xc3, 0x22} },
-{ 0x0ce2,      16,     {0xa9, 0x07, 0xe5, 0x0d, 0x70, 0x23, 0x90, 0x7f, 0xa5, 0xe0, 0x44, 0x80, 0xf0, 0xe9, 0x25, 0xe0} },
-{ 0x0cf2,      16,     {0x90, 0x7f, 0xa6, 0xf0, 0x8d, 0x08, 0xaf, 0x03, 0xa9, 0x07, 0x75, 0x09, 0x01, 0x8a, 0x0a, 0x89} },
-{ 0x0d02,      11,     {0x0b, 0xe4, 0xf5, 0x0c, 0x75, 0x0d, 0x01, 0xd3, 0x22, 0xc3, 0x22} },
-{ 0x0d0d,      16,     {0x90, 0x7f, 0xd6, 0xe0, 0x54, 0xfb, 0xf0, 0xe0, 0x44, 0x08, 0xf0, 0x30, 0x06, 0x04, 0xe0, 0x44} },
-{ 0x0d1d,      16,     {0x02, 0xf0, 0x7f, 0xd0, 0x7e, 0x07, 0x12, 0x0d, 0xd5, 0x90, 0x7f, 0xd6, 0xe0, 0x54, 0xf7, 0xf0} },
-{ 0x0d2d,      5,      {0xe0, 0x44, 0x04, 0xf0, 0x22} },
-{ 0x0d32,      16,     {0x12, 0x0c, 0xb5, 0xe5, 0x0d, 0x24, 0xfa, 0x60, 0x10, 0x14, 0x60, 0x07, 0x24, 0x07, 0x70, 0xf3} },
-{ 0x0d42,      15,     {0x7f, 0x08, 0x22, 0xe4, 0xf5, 0x0d, 0x7f, 0x07, 0x22, 0xe4, 0xf5, 0x0d, 0x7f, 0x06, 0x22} },
-{ 0x0d51,      16,     {0x12, 0x0c, 0xe2, 0xe5, 0x0d, 0x24, 0xfa, 0x60, 0x10, 0x14, 0x60, 0x07, 0x24, 0x07, 0x70, 0xf3} },
-{ 0x0d61,      15,     {0x7f, 0x08, 0x22, 0xe4, 0xf5, 0x0d, 0x7f, 0x07, 0x22, 0xe4, 0xf5, 0x0d, 0x7f, 0x06, 0x22} },
-{ 0x0d70,      16,     {0xc0, 0xe0, 0xc0, 0x83, 0xc0, 0x82, 0x90, 0x7f, 0xc4, 0xe4, 0xf0, 0x53, 0x91, 0xef, 0x90, 0x7f} },
-{ 0x0d80,      11,     {0xab, 0x74, 0x04, 0xf0, 0xd0, 0x82, 0xd0, 0x83, 0xd0, 0xe0, 0x32} },
-{ 0x0d8b,      16,     {0x90, 0x7f, 0xd6, 0xe0, 0x30, 0xe7, 0x12, 0xe0, 0x44, 0x01, 0xf0, 0x7f, 0x14, 0x7e, 0x00, 0x12} },
-{ 0x0d9b,      10,     {0x0d, 0xd5, 0x90, 0x7f, 0xd6, 0xe0, 0x54, 0xfe, 0xf0, 0x22} },
-{ 0x0da5,      16,     {0xc0, 0xe0, 0xc0, 0x83, 0xc0, 0x82, 0xd2, 0x01, 0x53, 0x91, 0xef, 0x90, 0x7f, 0xab, 0x74, 0x01} },
-{ 0x0db5,      8,      {0xf0, 0xd0, 0x82, 0xd0, 0x83, 0xd0, 0xe0, 0x32} },
-{ 0x0dbd,      16,     {0xc0, 0xe0, 0xc0, 0x83, 0xc0, 0x82, 0xd2, 0x03, 0x53, 0x91, 0xef, 0x90, 0x7f, 0xab, 0x74, 0x08} },
-{ 0x0dcd,      8,      {0xf0, 0xd0, 0x82, 0xd0, 0x83, 0xd0, 0xe0, 0x32} },
-{ 0x0dd5,      16,     {0x8e, 0x39, 0x8f, 0x3a, 0xe5, 0x3a, 0x15, 0x3a, 0xae, 0x39, 0x70, 0x02, 0x15, 0x39, 0x4e, 0x60} },
-{ 0x0de5,      7,      {0x05, 0x12, 0x0e, 0x41, 0x80, 0xee, 0x22} },
-{ 0x0dec,      16,     {0xc0, 0xe0, 0xc0, 0x83, 0xc0, 0x82, 0x53, 0x91, 0xef, 0x90, 0x7f, 0xab, 0x74, 0x02, 0xf0, 0xd0} },
-{ 0x0dfc,      6,      {0x82, 0xd0, 0x83, 0xd0, 0xe0, 0x32} },
-{ 0x0e02,      16,     {0xc0, 0xe0, 0xc0, 0x83, 0xc0, 0x82, 0x53, 0x91, 0xef, 0x90, 0x7f, 0xab, 0x74, 0x10, 0xf0, 0xd0} },
-{ 0x0e12,      6,      {0x82, 0xd0, 0x83, 0xd0, 0xe0, 0x32} },
-{ 0x0e18,      16,     {0xae, 0x07, 0x7f, 0x21, 0x7d, 0x01, 0x74, 0x00, 0x2e, 0xf5, 0x82, 0xe4, 0x34, 0x0f, 0xab, 0x82} },
-{ 0x0e28,      5,      {0xfa, 0x12, 0x0d, 0x51, 0x22} },
-{ 0x0e2d,      16,     {0x50, 0x0f, 0x00, 0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x98, 0x88, 0x83, 0xc6} },
-{ 0x0e3d,      3,      {0xa1, 0x86, 0x8e} },
-{ 0x0e40,      1,      {0x00} },
-{ 0x0e41,      16,     {0x74, 0x00, 0xf5, 0x86, 0x90, 0xfd, 0xa5, 0x7c, 0x05, 0xa3, 0xe5, 0x82, 0x45, 0x83, 0x70, 0xf9} },
-{ 0x0e51,      1,      {0x22} },
-{ 0x0e52,      14,     {0x90, 0x7f, 0x00, 0xe5, 0x0e, 0xf0, 0x90, 0x7f, 0xb5, 0x74, 0x01, 0xf0, 0xd3, 0x22} },
-{ 0x0e60,      8,      {0x90, 0x7f, 0xea, 0xe0, 0xf5, 0x0e, 0xd3, 0x22} },
-{ 0x0e68,      8,      {0xe4, 0xf5, 0x0d, 0xd2, 0xe9, 0xd2, 0xaf, 0x22} },
-{ 0x0e70,      4,      {0x53, 0xd8, 0xef, 0x32} },
-{ 0x0e74,      3,      {0xd2, 0x00, 0x22} },
-{ 0x0e77,      2,      {0xd3, 0x22} },
-{ 0x0e79,      2,      {0xd3, 0x22} },
-{ 0x0e7b,      2,      {0xd3, 0x22} },
-{ 0x0e7d,      2,      {0xd3, 0x22} },
-{ 0x0e7f,      2,      {0xd3, 0x22} },
-{ 0x0e81,      2,      {0xd3, 0x22} },
-{ 0x0e83,      1,      {0x32} },
-{ 0x0e84,      1,      {0x32} },
-{ 0x0e85,      1,      {0x32} },
-{ 0x0e86,      1,      {0x32} },
-{ 0x0e87,      1,      {0x32} },
-{ 0x0e88,      1,      {0x32} },
-{ 0x0e89,      1,      {0x32} },
-{ 0x0e8a,      1,      {0x32} },
-{ 0x0e8b,      1,      {0x32} },
-{ 0x0e8c,      1,      {0x32} },
-{ 0x0e8d,      1,      {0x32} },
-{ 0x0e8e,      1,      {0x32} },
-{ 0x0e8f,      1,      {0x32} },
-{ 0x0e90,      1,      {0x32} },
-{ 0x0e91,      1,      {0x32} },
-{ 0x0e92,      1,      {0x32} },
-{ 0x1100,      16,     {0x12, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x40, 0x47, 0x05, 0x10, 0x27, 0x01, 0x00, 0x01, 0x02} },
-{ 0x1110,      16,     {0x00, 0x01, 0x09, 0x02, 0x20, 0x00, 0x01, 0x01, 0x03, 0xa0, 0x00, 0x09, 0x04, 0x00, 0x00, 0x02} },
-{ 0x1120,      16,     {0xff, 0x00, 0x00, 0x04, 0x07, 0x05, 0x82, 0x02, 0x40, 0x00, 0x00, 0x07, 0x05, 0x02, 0x02, 0x40} },
-{ 0x1130,      16,     {0x00, 0x00, 0x04, 0x03, 0x09, 0x04, 0x26, 0x03, 0x41, 0x00, 0x6e, 0x00, 0x63, 0x00, 0x68, 0x00} },
-{ 0x1140,      16,     {0x6f, 0x00, 0x72, 0x00, 0x20, 0x00, 0x43, 0x00, 0x68, 0x00, 0x69, 0x00, 0x70, 0x00, 0x73, 0x00} },
-{ 0x1150,      16,     {0x2c, 0x00, 0x20, 0x00, 0x49, 0x00, 0x6e, 0x00, 0x63, 0x00, 0x2e, 0x00, 0x28, 0x03, 0x46, 0x00} },
-{ 0x1160,      16,     {0x69, 0x00, 0x72, 0x00, 0x6d, 0x00, 0x77, 0x00, 0x61, 0x00, 0x72, 0x00, 0x65, 0x00, 0x20, 0x00} },
-{ 0x1170,      16,     {0x46, 0x00, 0x72, 0x00, 0x61, 0x00, 0x6d, 0x00, 0x65, 0x00, 0x57, 0x00, 0x6f, 0x00, 0x72, 0x00} },
-{ 0x1180,      16,     {0x6b, 0x00, 0x73, 0x00, 0x2a, 0x03, 0x43, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x66, 0x00, 0x69, 0x00} },
-{ 0x1190,      16,     {0x67, 0x00, 0x75, 0x00, 0x72, 0x00, 0x61, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6f, 0x00, 0x6e, 0x00} },
-{ 0x11a0,      16,     {0x20, 0x00, 0x53, 0x00, 0x74, 0x00, 0x72, 0x00, 0x69, 0x00, 0x6e, 0x00, 0x67, 0x00, 0x22, 0x03} },
-{ 0x11b0,      16,     {0x49, 0x00, 0x6e, 0x00, 0x74, 0x00, 0x65, 0x00, 0x72, 0x00, 0x66, 0x00, 0x61, 0x00, 0x63, 0x00} },
-{ 0x11c0,      16,     {0x65, 0x00, 0x20, 0x00, 0x53, 0x00, 0x74, 0x00, 0x72, 0x00, 0x69, 0x00, 0x6e, 0x00, 0x67, 0x00} },
-{ 0x11d0,      2,      {0x00, 0x00} },
-{ 0xffff,      0,      {0x00} }
-};
-
-#else
-
-static const struct whiteheat_hex_record whiteheat_loader[] = {
-{ 0x0000,      3,      {0x02, 0x09, 0x8d} },
-{ 0x0033,      3,      {0x02, 0x08, 0xfb} },
-{ 0x0043,      3,      {0x02, 0x0b, 0x00} },
-{ 0x004b,      3,      {0x02, 0x05, 0xaa} },
-{ 0x0100,      16,     {0x90, 0x7f, 0xa5, 0xe0, 0x54, 0x10, 0xff, 0xc4, 0x54, 0x0f, 0x44, 0x50, 0xf5, 0x0f, 0x13, 0xe4} },
-{ 0x0110,      16,     {0x33, 0xf5, 0x11, 0x90, 0x7f, 0xe9, 0xe0, 0x24, 0x5e, 0xb4, 0x07, 0x00, 0x40, 0x03, 0x02, 0x03} },
-{ 0x0120,      16,     {0x78, 0x90, 0x01, 0x28, 0xf8, 0x28, 0x28, 0x73, 0x02, 0x01, 0xbc, 0x02, 0x01, 0xbc, 0x02, 0x01} },
-{ 0x0130,      16,     {0x91, 0x02, 0x01, 0x3d, 0x02, 0x01, 0x53, 0x02, 0x01, 0x6f, 0x02, 0x01, 0x9a, 0x90, 0x7f, 0x00} },
-{ 0x0140,      16,     {0xe5, 0x11, 0xf0, 0x90, 0x7f, 0xb5, 0x74, 0x01, 0xf0, 0x90, 0x7f, 0xb4, 0xe0, 0x44, 0x02, 0xf0} },
-{ 0x0150,      16,     {0x02, 0x03, 0x78, 0x90, 0x7f, 0x92, 0xe0, 0xff, 0xc4, 0x54, 0x0f, 0x90, 0x7f, 0x00, 0xf0, 0x90} },
-{ 0x0160,      16,     {0x7f, 0xb5, 0x74, 0x01, 0xf0, 0x90, 0x7f, 0xb4, 0xe0, 0x44, 0x02, 0xf0, 0x02, 0x03, 0x78, 0x12} },
-{ 0x0170,      16,     {0x0a, 0x89, 0x50, 0x07, 0xe4, 0x90, 0x7f, 0x00, 0xf0, 0x80, 0x06, 0x90, 0x7f, 0x00, 0x74, 0x0f} },
-{ 0x0180,      16,     {0xf0, 0x90, 0x7f, 0xb5, 0x74, 0x01, 0xf0, 0x90, 0x7f, 0xb4, 0xe0, 0x44, 0x02, 0xf0, 0x02, 0x03} },
-{ 0x0190,      16,     {0x78, 0x90, 0x7f, 0xea, 0xe0, 0xf5, 0x0f, 0x02, 0x03, 0x78, 0x90, 0x7f, 0x00, 0x74, 0x07, 0xf0} },
-{ 0x01a0,      16,     {0x90, 0x7f, 0xb5, 0x74, 0x01, 0xf0, 0x90, 0x7f, 0xb4, 0xe0, 0x44, 0x02, 0xf0, 0x7f, 0xe8, 0x7e} },
-{ 0x01b0,      16,     {0x03, 0x12, 0x0d, 0x94, 0xd2, 0x06, 0x12, 0x0c, 0xcc, 0x02, 0x03, 0x78, 0x90, 0x7f, 0xea, 0xe0} },
-{ 0x01c0,      16,     {0x75, 0x28, 0x00, 0xf5, 0x29, 0xa3, 0xe0, 0xfe, 0xe4, 0xee, 0x42, 0x28, 0x90, 0x7f, 0xee, 0xe0} },
-{ 0x01d0,      16,     {0x75, 0x2a, 0x00, 0xf5, 0x2b, 0xa3, 0xe0, 0xfe, 0xe4, 0xee, 0x42, 0x2a, 0x90, 0x7f, 0xe8, 0xe0} },
-{ 0x01e0,      16,     {0x64, 0xc0, 0x60, 0x03, 0x02, 0x02, 0xc9, 0xe5, 0x2b, 0x45, 0x2a, 0x70, 0x03, 0x02, 0x03, 0x78} },
-{ 0x01f0,      16,     {0xc3, 0xe5, 0x2b, 0x94, 0x40, 0xe5, 0x2a, 0x94, 0x00, 0x50, 0x08, 0x85, 0x2a, 0x2c, 0x85, 0x2b} },
-{ 0x0200,      16,     {0x2d, 0x80, 0x06, 0x75, 0x2c, 0x00, 0x75, 0x2d, 0x40, 0x90, 0x7f, 0xe9, 0xe0, 0x64, 0xa3, 0x70} },
-{ 0x0210,      16,     {0x34, 0xf5, 0x30, 0xf5, 0x31, 0xc3, 0xe5, 0x31, 0x95, 0x2d, 0xe5, 0x30, 0x95, 0x2c, 0x50, 0x5c} },
-{ 0x0220,      16,     {0xe5, 0x29, 0x25, 0x31, 0xf5, 0x82, 0xe5, 0x30, 0x35, 0x28, 0xf5, 0x83, 0xe0, 0xff, 0x74, 0x00} },
-{ 0x0230,      16,     {0x25, 0x31, 0xf5, 0x82, 0xe4, 0x34, 0x7f, 0xf5, 0x83, 0xef, 0xf0, 0x05, 0x31, 0xe5, 0x31, 0x70} },
-{ 0x0240,      16,     {0x02, 0x05, 0x30, 0x80, 0xd0, 0xe4, 0xf5, 0x30, 0xf5, 0x31, 0xc3, 0xe5, 0x31, 0x95, 0x2d, 0xe5} },
-{ 0x0250,      16,     {0x30, 0x95, 0x2c, 0x50, 0x18, 0x74, 0x00, 0x25, 0x31, 0xf5, 0x82, 0xe4, 0x34, 0x7f, 0xf5, 0x83} },
-{ 0x0260,      16,     {0x74, 0xcd, 0xf0, 0x05, 0x31, 0xe5, 0x31, 0x70, 0x02, 0x05, 0x30, 0x80, 0xdd, 0xaf, 0x29, 0xae} },
-{ 0x0270,      16,     {0x28, 0xad, 0x2d, 0x7a, 0x7f, 0x79, 0x00, 0x7b, 0x00, 0x12, 0x0b, 0xf4, 0x90, 0x7f, 0xb5, 0xe5} },
-{ 0x0280,      16,     {0x2d, 0xf0, 0xe5, 0x2d, 0x25, 0x29, 0xf5, 0x29, 0xe5, 0x2c, 0x35, 0x28, 0xf5, 0x28, 0xc3, 0xe5} },
-{ 0x0290,      16,     {0x2b, 0x95, 0x2d, 0xf5, 0x2b, 0xe5, 0x2a, 0x95, 0x2c, 0xf5, 0x2a, 0x90, 0x7f, 0x92, 0xe0, 0xff} },
-{ 0x02a0,      16,     {0xc4, 0x54, 0x0f, 0x75, 0x2e, 0x00, 0xf5, 0x2f, 0xd3, 0x94, 0x00, 0xe5, 0x2e, 0x94, 0x00, 0x50} },
-{ 0x02b0,      16,     {0x0c, 0x90, 0x7f, 0xb4, 0xe0, 0x20, 0xe1, 0x03, 0x02, 0x01, 0xe7, 0x80, 0xf4, 0x90, 0x7f, 0xb4} },
-{ 0x02c0,      16,     {0xe0, 0x20, 0xe2, 0x03, 0x02, 0x01, 0xe7, 0x80, 0xf4, 0x90, 0x7f, 0xe8, 0xe0, 0x64, 0x40, 0x60} },
-{ 0x02d0,      16,     {0x03, 0x02, 0x03, 0x78, 0xe5, 0x2b, 0x45, 0x2a, 0x70, 0x03, 0x02, 0x03, 0x78, 0xe4, 0x90, 0x7f} },
-{ 0x02e0,      16,     {0xc5, 0xf0, 0x90, 0x7f, 0x92, 0xe0, 0xff, 0xc4, 0x54, 0x0f, 0x75, 0x2e, 0x00, 0xf5, 0x2f, 0xd3} },
-{ 0x02f0,      16,     {0x94, 0x00, 0xe5, 0x2e, 0x94, 0x00, 0x50, 0x09, 0x90, 0x7f, 0xc4, 0xe0, 0x30, 0xe1, 0x09, 0x80} },
-{ 0x0300,      16,     {0xf7, 0x90, 0x7f, 0xb4, 0xe0, 0x20, 0xe3, 0xf9, 0x90, 0x7f, 0xc5, 0xe0, 0x75, 0x2c, 0x00, 0xf5} },
-{ 0x0310,      16,     {0x2d, 0x90, 0x7f, 0xe9, 0xe0, 0x64, 0xa3, 0x70, 0x34, 0xf5, 0x30, 0xf5, 0x31, 0xc3, 0xe5, 0x31} },
-{ 0x0320,      16,     {0x95, 0x2d, 0xe5, 0x30, 0x95, 0x2c, 0x50, 0x34, 0x74, 0xc0, 0x25, 0x31, 0xf5, 0x82, 0xe4, 0x34} },
-{ 0x0330,      1,      {0x7e} },
-{ 0x0331,      16,     {0xf5, 0x83, 0xe0, 0xff, 0xe5, 0x29, 0x25, 0x31, 0xf5, 0x82, 0xe5, 0x30, 0x35, 0x28, 0xf5, 0x83} },
-{ 0x0341,      16,     {0xef, 0xf0, 0x05, 0x31, 0xe5, 0x31, 0x70, 0x02, 0x05, 0x30, 0x80, 0xd0, 0xaf, 0x29, 0xae, 0x28} },
-{ 0x0351,      16,     {0xad, 0x2d, 0x7a, 0x7e, 0x79, 0xc0, 0x7b, 0xc0, 0x12, 0x0c, 0x3f, 0xe5, 0x2d, 0x25, 0x29, 0xf5} },
-{ 0x0361,      16,     {0x29, 0xe5, 0x2c, 0x35, 0x28, 0xf5, 0x28, 0xc3, 0xe5, 0x2b, 0x95, 0x2d, 0xf5, 0x2b, 0xe5, 0x2a} },
-{ 0x0371,      9,      {0x95, 0x2c, 0xf5, 0x2a, 0x02, 0x02, 0xd4, 0xc3, 0x22} },
-{ 0x037a,      16,     {0x90, 0x7f, 0xe9, 0xe0, 0x70, 0x03, 0x02, 0x04, 0x52, 0x14, 0x70, 0x03, 0x02, 0x04, 0xce, 0x24} },
-{ 0x038a,      16,     {0xfe, 0x70, 0x03, 0x02, 0x05, 0x42, 0x24, 0xfb, 0x70, 0x03, 0x02, 0x04, 0x4c, 0x14, 0x70, 0x03} },
-{ 0x039a,      16,     {0x02, 0x04, 0x46, 0x14, 0x70, 0x03, 0x02, 0x04, 0x3a, 0x14, 0x70, 0x03, 0x02, 0x04, 0x40, 0x24} },
-{ 0x03aa,      16,     {0x05, 0x60, 0x03, 0x02, 0x05, 0x96, 0x12, 0x0e, 0x44, 0x40, 0x03, 0x02, 0x05, 0xa2, 0x90, 0x7f} },
-{ 0x03ba,      16,     {0xeb, 0xe0, 0x24, 0xfe, 0x60, 0x16, 0x14, 0x60, 0x40, 0x24, 0x02, 0x70, 0x69, 0x74, 0x11, 0x90} },
-{ 0x03ca,      16,     {0x7f, 0xd4, 0xf0, 0x74, 0x00, 0x90, 0x7f, 0xd5, 0xf0, 0x02, 0x05, 0xa2, 0x90, 0x7f, 0xea, 0xe0} },
-{ 0x03da,      16,     {0xff, 0x12, 0x0b, 0x58, 0x8b, 0x25, 0x8a, 0x26, 0x89, 0x27, 0xea, 0x49, 0x60, 0x11, 0xae, 0x02} },
-{ 0x03ea,      16,     {0xee, 0x90, 0x7f, 0xd4, 0xf0, 0xaf, 0x01, 0xef, 0x90, 0x7f, 0xd5, 0xf0, 0x02, 0x05, 0xa2, 0x90} },
-{ 0x03fa,      16,     {0x7f, 0xb4, 0xe0, 0x44, 0x01, 0xf0, 0x02, 0x05, 0xa2, 0x90, 0x7f, 0xea, 0xe0, 0xff, 0x12, 0x08} },
-{ 0x040a,      16,     {0xba, 0x8b, 0x25, 0x8a, 0x26, 0x89, 0x27, 0xea, 0x49, 0x60, 0x11, 0xae, 0x02, 0xee, 0x90, 0x7f} },
-{ 0x041a,      16,     {0xd4, 0xf0, 0xaf, 0x01, 0xef, 0x90, 0x7f, 0xd5, 0xf0, 0x02, 0x05, 0xa2, 0x90, 0x7f, 0xb4, 0xe0} },
-{ 0x042a,      16,     {0x44, 0x01, 0xf0, 0x02, 0x05, 0xa2, 0x90, 0x7f, 0xb4, 0xe0, 0x44, 0x01, 0xf0, 0x02, 0x05, 0xa2} },
-{ 0x043a,      16,     {0x12, 0x0e, 0x1f, 0x02, 0x05, 0xa2, 0x12, 0x0e, 0x2d, 0x02, 0x05, 0xa2, 0x12, 0x0a, 0xf7, 0x02} },
-{ 0x044a,      16,     {0x05, 0xa2, 0x12, 0x0e, 0x11, 0x02, 0x05, 0xa2, 0x12, 0x0e, 0x46, 0x40, 0x03, 0x02, 0x05, 0xa2} },
-{ 0x045a,      16,     {0x90, 0x7f, 0xe8, 0xe0, 0x24, 0x7f, 0x60, 0x24, 0x14, 0x60, 0x31, 0x24, 0x02, 0x70, 0x5b, 0xa2} },
-{ 0x046a,      16,     {0x00, 0xe4, 0x33, 0xff, 0x25, 0xe0, 0xff, 0xa2, 0x02, 0xe4, 0x33, 0x4f, 0x90, 0x7f, 0x00, 0xf0} },
-{ 0x047a,      16,     {0xe4, 0xa3, 0xf0, 0x90, 0x7f, 0xb5, 0x74, 0x02, 0xf0, 0x02, 0x05, 0xa2, 0xe4, 0x90, 0x7f, 0x00} },
-{ 0x048a,      16,     {0xf0, 0xa3, 0xf0, 0x90, 0x7f, 0xb5, 0x74, 0x02, 0xf0, 0x02, 0x05, 0xa2, 0x90, 0x7f, 0xec, 0xe0} },
-{ 0x049a,      16,     {0xf4, 0x54, 0x80, 0xff, 0xc4, 0x54, 0x0f, 0xff, 0xe0, 0x54, 0x07, 0x2f, 0x25, 0xe0, 0x24, 0xb4} },
-{ 0x04aa,      16,     {0xf5, 0x82, 0xe4, 0x34, 0x7f, 0xf5, 0x83, 0xe0, 0x54, 0xfd, 0x90, 0x7f, 0x00, 0xf0, 0xe4, 0xa3} },
-{ 0x04ba,      16,     {0xf0, 0x90, 0x7f, 0xb5, 0x74, 0x02, 0xf0, 0x02, 0x05, 0xa2, 0x90, 0x7f, 0xb4, 0xe0, 0x44, 0x01} },
-{ 0x04ca,      16,     {0xf0, 0x02, 0x05, 0xa2, 0x12, 0x0e, 0x48, 0x40, 0x03, 0x02, 0x05, 0xa2, 0x90, 0x7f, 0xe8, 0xe0} },
-{ 0x04da,      16,     {0x24, 0xfe, 0x60, 0x1d, 0x24, 0x02, 0x60, 0x03, 0x02, 0x05, 0xa2, 0x90, 0x7f, 0xea, 0xe0, 0xb4} },
-{ 0x04ea,      16,     {0x01, 0x05, 0xc2, 0x00, 0x02, 0x05, 0xa2, 0x90, 0x7f, 0xb4, 0xe0, 0x44, 0x01, 0xf0, 0x02, 0x05} },
-{ 0x04fa,      16,     {0xa2, 0x90, 0x7f, 0xea, 0xe0, 0x70, 0x38, 0x90, 0x7f, 0xec, 0xe0, 0xf4, 0x54, 0x80, 0xff, 0xc4} },
-{ 0x050a,      16,     {0x54, 0x0f, 0xff, 0xe0, 0x54, 0x07, 0x2f, 0x25, 0xe0, 0x24, 0xb4, 0xf5, 0x82, 0xe4, 0x34, 0x7f} },
-{ 0x051a,      16,     {0xf5, 0x83, 0xe4, 0xf0, 0x90, 0x7f, 0xec, 0xe0, 0x54, 0x80, 0xff, 0x13, 0x13, 0x13, 0x54, 0x1f} },
-{ 0x052a,      16,     {0xff, 0xe0, 0x54, 0x07, 0x2f, 0x90, 0x7f, 0xd7, 0xf0, 0xe0, 0x44, 0x20, 0xf0, 0x80, 0x69, 0x90} },
-{ 0x053a,      16,     {0x7f, 0xb4, 0xe0, 0x44, 0x01, 0xf0, 0x80, 0x60, 0x12, 0x0e, 0x4a, 0x50, 0x5b, 0x90, 0x7f, 0xe8} },
-{ 0x054a,      16,     {0xe0, 0x24, 0xfe, 0x60, 0x18, 0x24, 0x02, 0x70, 0x4f, 0x90, 0x7f, 0xea, 0xe0, 0xb4, 0x01, 0x04} },
-{ 0x055a,      16,     {0xd2, 0x00, 0x80, 0x44, 0x90, 0x7f, 0xb4, 0xe0, 0x44, 0x01, 0xf0, 0x80, 0x3b, 0x90, 0x7f, 0xea} },
-{ 0x056a,      16,     {0xe0, 0x70, 0x20, 0x90, 0x7f, 0xec, 0xe0, 0xf4, 0x54, 0x80, 0xff, 0xc4, 0x54, 0x0f, 0xff, 0xe0} },
-{ 0x057a,      16,     {0x54, 0x07, 0x2f, 0x25, 0xe0, 0x24, 0xb4, 0xf5, 0x82, 0xe4, 0x34, 0x7f, 0xf5, 0x83, 0x74, 0x01} },
-{ 0x058a,      16,     {0xf0, 0x80, 0x15, 0x90, 0x7f, 0xb4, 0xe0, 0x44, 0x01, 0xf0, 0x80, 0x0c, 0x12, 0x01, 0x00, 0x50} },
-{ 0x059a,      16,     {0x07, 0x90, 0x7f, 0xb4, 0xe0, 0x44, 0x01, 0xf0, 0x90, 0x7f, 0xb4, 0xe0, 0x44, 0x02, 0xf0, 0x22} },
-{ 0x05aa,      16,     {0xc0, 0xe0, 0xc0, 0x83, 0xc0, 0x82, 0xc0, 0x85, 0xc0, 0x84, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xc0} },
-{ 0x05ba,      16,     {0xd0, 0xc0, 0x00, 0xc0, 0x01, 0xc0, 0x02, 0xc0, 0x03, 0xc0, 0x06, 0xc0, 0x07, 0x90, 0x7f, 0xa5} },
-{ 0x05ca,      16,     {0xe0, 0x30, 0xe2, 0x06, 0x75, 0x0d, 0x06, 0x02, 0x06, 0x76, 0x90, 0x7f, 0xa5, 0xe0, 0x20, 0xe1} },
-{ 0x05da,      16,     {0x0c, 0xe5, 0x0d, 0x64, 0x02, 0x60, 0x06, 0x75, 0x0d, 0x07, 0x02, 0x06, 0x76, 0xaf, 0x0d, 0xef} },
-{ 0x05ea,      16,     {0x24, 0xfe, 0x60, 0x48, 0x14, 0x60, 0x2c, 0x24, 0xfe, 0x60, 0x77, 0x24, 0x04, 0x60, 0x03, 0x02} },
-{ 0x05fa,      16,     {0x06, 0x76, 0xab, 0x09, 0xaa, 0x0a, 0xa9, 0x0b, 0xaf, 0x0c, 0x05, 0x0c, 0x8f, 0x82, 0x75, 0x83} },
-{ 0x060a,      16,     {0x00, 0x12, 0x08, 0x22, 0x90, 0x7f, 0xa6, 0xf0, 0xe5, 0x0c, 0x65, 0x08, 0x70, 0x5e, 0x75, 0x0d} },
-{ 0x061a,      16,     {0x05, 0x80, 0x59, 0x90, 0x7f, 0xa6, 0xe0, 0xab, 0x09, 0xaa, 0x0a, 0xa9, 0x0b, 0xae, 0x0c, 0x8e} },
-{ 0x062a,      16,     {0x82, 0x75, 0x83, 0x00, 0x12, 0x08, 0x4f, 0x75, 0x0d, 0x02, 0x80, 0x40, 0xe5, 0x08, 0x24, 0xfe} },
-{ 0x063a,      16,     {0xb5, 0x0c, 0x07, 0x90, 0x7f, 0xa5, 0xe0, 0x44, 0x20, 0xf0, 0xe5, 0x08, 0x14, 0xb5, 0x0c, 0x0a} },
-{ 0x064a,      16,     {0x90, 0x7f, 0xa5, 0xe0, 0x44, 0x40, 0xf0, 0xe4, 0xf5, 0x0d, 0x90, 0x7f, 0xa6, 0xe0, 0xab, 0x09} },
-{ 0x065a,      16,     {0xaa, 0x0a, 0xa9, 0x0b, 0xae, 0x0c, 0x8e, 0x82, 0x75, 0x83, 0x00, 0x12, 0x08, 0x4f, 0x05, 0x0c} },
-{ 0x066a,      16,     {0x80, 0x0a, 0x90, 0x7f, 0xa5, 0xe0, 0x44, 0x40, 0xf0, 0xe4, 0xf5, 0x0d, 0x53, 0x91, 0xdf, 0xd0} },
-{ 0x067a,      16,     {0x07, 0xd0, 0x06, 0xd0, 0x03, 0xd0, 0x02, 0xd0, 0x01, 0xd0, 0x00, 0xd0, 0xd0, 0xd0, 0x86, 0xd0} },
-{ 0x068a,      10,     {0x84, 0xd0, 0x85, 0xd0, 0x82, 0xd0, 0x83, 0xd0, 0xe0, 0x32} },
-{ 0x0694,      16,     {0x8c, 0x33, 0x8d, 0x34, 0x90, 0x7f, 0x95, 0xe0, 0x44, 0xc0, 0xf0, 0xe4, 0xf5, 0x35, 0xf5, 0x36} },
-{ 0x06a4,      16,     {0xc3, 0xe5, 0x36, 0x95, 0x34, 0xe5, 0x35, 0x95, 0x33, 0x50, 0x69, 0xef, 0x25, 0x36, 0xf5, 0x82} },
-{ 0x06b4,      16,     {0xe5, 0x35, 0x3e, 0xf5, 0x83, 0x74, 0xff, 0xf0, 0xf4, 0x60, 0x02, 0xc3, 0x22, 0xef, 0x25, 0x36} },
-{ 0x06c4,      16,     {0xf5, 0x82, 0xe5, 0x35, 0x3e, 0xf5, 0x83, 0xe4, 0xf0, 0x60, 0x02, 0xc3, 0x22, 0xef, 0x25, 0x36} },
-{ 0x06d4,      16,     {0xf5, 0x82, 0xe5, 0x35, 0x3e, 0xf5, 0x83, 0x74, 0xaa, 0xf0, 0x64, 0xaa, 0x60, 0x02, 0xc3, 0x22} },
-{ 0x06e4,      16,     {0xef, 0x25, 0x36, 0xf5, 0x82, 0xe5, 0x35, 0x3e, 0xf5, 0x83, 0x74, 0x55, 0xf0, 0x64, 0x55, 0x60} },
-{ 0x06f4,      16,     {0x02, 0xc3, 0x22, 0xad, 0x36, 0xe5, 0x36, 0x2f, 0xf5, 0x82, 0xe5, 0x35, 0x3e, 0xf5, 0x83, 0xed} },
-{ 0x0704,      16,     {0xf0, 0xfc, 0xac, 0x05, 0xed, 0x6c, 0x60, 0x02, 0xc3, 0x22, 0x05, 0x36, 0xe5, 0x36, 0x70, 0x02} },
-{ 0x0714,      16,     {0x05, 0x35, 0x80, 0x8c, 0xe4, 0xf5, 0x35, 0xf5, 0x36, 0xc3, 0xe5, 0x36, 0x95, 0x34, 0xe5, 0x35} },
-{ 0x0724,      16,     {0x95, 0x33, 0x50, 0x27, 0xef, 0x25, 0x36, 0xf5, 0x82, 0xe5, 0x35, 0x3e, 0xf5, 0x83, 0xe0, 0x65} },
-{ 0x0734,      16,     {0x36, 0x60, 0x02, 0xc3, 0x22, 0xef, 0x25, 0x36, 0xf5, 0x82, 0xe5, 0x35, 0x3e, 0xf5, 0x83, 0xe4} },
-{ 0x0744,      13,     {0xf0, 0x05, 0x36, 0xe5, 0x36, 0x70, 0x02, 0x05, 0x35, 0x80, 0xce, 0xd3, 0x22} },
-{ 0x0751,      16,     {0xc2, 0x04, 0xd2, 0x05, 0xc2, 0x03, 0xc2, 0x00, 0xc2, 0x02, 0xc2, 0x01, 0x12, 0x0e, 0x3d, 0xd2} },
-{ 0x0761,      16,     {0xe8, 0x43, 0xd8, 0x20, 0x90, 0x7f, 0xab, 0x74, 0xff, 0xf0, 0x90, 0x7f, 0xa9, 0xf0, 0x90, 0x7f} },
-{ 0x0771,      16,     {0xaa, 0xf0, 0x53, 0x91, 0xef, 0x90, 0x7f, 0x95, 0xe0, 0x44, 0xc0, 0xf0, 0x90, 0x7f, 0x93, 0x74} },
-{ 0x0781,      16,     {0x30, 0xf0, 0x12, 0x0a, 0x19, 0x90, 0x7f, 0xaf, 0xe0, 0x44, 0x01, 0xf0, 0x90, 0x7f, 0xae, 0xe0} },
-{ 0x0791,      16,     {0x44, 0x0d, 0xf0, 0xd2, 0xaf, 0x12, 0x0e, 0x35, 0x20, 0x01, 0x42, 0x75, 0x24, 0x00, 0x75, 0x23} },
-{ 0x07a1,      16,     {0x00, 0x75, 0x22, 0x00, 0x75, 0x21, 0x00, 0x7f, 0x48, 0x7e, 0x92, 0x7d, 0x00, 0x7c, 0x00, 0xab} },
-{ 0x07b1,      16,     {0x24, 0xaa, 0x23, 0xa9, 0x22, 0xa8, 0x21, 0xc3, 0x12, 0x08, 0xa9, 0x50, 0xdb, 0x20, 0x01, 0xd8} },
-{ 0x07c1,      16,     {0x7a, 0x00, 0x79, 0x00, 0x78, 0x00, 0xe5, 0x24, 0x24, 0x01, 0xf5, 0x24, 0xea, 0x35, 0x23, 0xf5} },
-{ 0x07d1,      16,     {0x23, 0xe9, 0x35, 0x22, 0xf5, 0x22, 0xe8, 0x35, 0x21, 0xf5, 0x21, 0x80, 0xca, 0x30, 0x01, 0x05} },
-{ 0x07e1,      16,     {0x12, 0x03, 0x7a, 0xc2, 0x01, 0x30, 0x04, 0x1a, 0x12, 0x0e, 0x40, 0x50, 0x13, 0x12, 0x09, 0x00} },
-{ 0x07f1,      16,     {0x30, 0x00, 0x07, 0x90, 0x7f, 0xd6, 0xe0, 0x30, 0xe7, 0xf3, 0x12, 0x0d, 0x4a, 0x12, 0x0e, 0x42} },
-{ 0x0801,      8,      {0xc2, 0x03, 0x12, 0x08, 0xff, 0x80, 0xd6, 0x22} },
-{ 0x0809,      16,     {0xbb, 0x01, 0x06, 0x89, 0x82, 0x8a, 0x83, 0xe0, 0x22, 0x50, 0x02, 0xe7, 0x22, 0xbb, 0xfe, 0x02} },
-{ 0x0819,      9,      {0xe3, 0x22, 0x89, 0x82, 0x8a, 0x83, 0xe4, 0x93, 0x22} },
-{ 0x0822,      16,     {0xbb, 0x01, 0x0c, 0xe5, 0x82, 0x29, 0xf5, 0x82, 0xe5, 0x83, 0x3a, 0xf5, 0x83, 0xe0, 0x22, 0x50} },
-{ 0x0832,      16,     {0x06, 0xe9, 0x25, 0x82, 0xf8, 0xe6, 0x22, 0xbb, 0xfe, 0x06, 0xe9, 0x25, 0x82, 0xf8, 0xe2, 0x22} },
-{ 0x0842,      13,     {0xe5, 0x82, 0x29, 0xf5, 0x82, 0xe5, 0x83, 0x3a, 0xf5, 0x83, 0xe4, 0x93, 0x22} },
-{ 0x084f,      16,     {0xf8, 0xbb, 0x01, 0x0d, 0xe5, 0x82, 0x29, 0xf5, 0x82, 0xe5, 0x83, 0x3a, 0xf5, 0x83, 0xe8, 0xf0} },
-{ 0x085f,      16,     {0x22, 0x50, 0x06, 0xe9, 0x25, 0x82, 0xc8, 0xf6, 0x22, 0xbb, 0xfe, 0x05, 0xe9, 0x25, 0x82, 0xc8} },
-{ 0x086f,      2,      {0xf2, 0x22} },
-{ 0x0871,      16,     {0xbb, 0x01, 0x10, 0xe5, 0x82, 0x29, 0xf5, 0x82, 0xe5, 0x83, 0x3a, 0xf5, 0x83, 0xe0, 0xf5, 0xf0} },
-{ 0x0881,      16,     {0xa3, 0xe0, 0x22, 0x50, 0x09, 0xe9, 0x25, 0x82, 0xf8, 0x86, 0xf0, 0x08, 0xe6, 0x22, 0xbb, 0xfe} },
-{ 0x0891,      16,     {0x0a, 0xe9, 0x25, 0x82, 0xf8, 0xe2, 0xf5, 0xf0, 0x08, 0xe2, 0x22, 0xe5, 0x83, 0x2a, 0xf5, 0x83} },
-{ 0x08a1,      8,      {0xe9, 0x93, 0xf5, 0xf0, 0xa3, 0xe9, 0x93, 0x22} },
-{ 0x08a9,      16,     {0xeb, 0x9f, 0xf5, 0xf0, 0xea, 0x9e, 0x42, 0xf0, 0xe9, 0x9d, 0x42, 0xf0, 0xe8, 0x9c, 0x45, 0xf0} },
-{ 0x08b9,      1,      {0x22} },
-{ 0x08ba,      2,      {0x8f, 0x28} },
-{ 0x08bc,      16,     {0xe4, 0xf5, 0x29, 0x75, 0x2a, 0xff, 0x75, 0x2b, 0x11, 0x75, 0x2c, 0x32, 0xab, 0x2a, 0xaa, 0x2b} },
-{ 0x08cc,      16,     {0xa9, 0x2c, 0x90, 0x00, 0x01, 0x12, 0x08, 0x22, 0xb4, 0x03, 0x1d, 0xaf, 0x29, 0x05, 0x29, 0xef} },
-{ 0x08dc,      16,     {0xb5, 0x28, 0x01, 0x22, 0x12, 0x08, 0x09, 0x7e, 0x00, 0x29, 0xff, 0xee, 0x3a, 0xa9, 0x07, 0x75} },
-{ 0x08ec,      14,     {0x2a, 0xff, 0xf5, 0x2b, 0x89, 0x2c, 0x80, 0xd4, 0x7b, 0x00, 0x7a, 0x00, 0x79, 0x00} },
-{ 0x08fa,      1,      {0x22} },
-{ 0x08fb,      4,      {0x53, 0xd8, 0xef, 0x32} },
-{ 0x08ff,      1,      {0x22} },
-{ 0x0900,      9,      {0x90, 0x7f, 0xd6, 0xe0, 0x44, 0x80, 0xf0, 0x80, 0x74} },
-{ 0x097d,      16,     {0x43, 0x87, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22} },
-{ 0x098d,      12,     {0x78, 0x7f, 0xe4, 0xf6, 0xd8, 0xfd, 0x75, 0x81, 0x39, 0x02, 0x09, 0xd4} },
-{ 0x0999,      16,     {0x02, 0x07, 0x51, 0xe4, 0x93, 0xa3, 0xf8, 0xe4, 0x93, 0xa3, 0x40, 0x03, 0xf6, 0x80, 0x01, 0xf2} },
-{ 0x09a9,      16,     {0x08, 0xdf, 0xf4, 0x80, 0x29, 0xe4, 0x93, 0xa3, 0xf8, 0x54, 0x07, 0x24, 0x0c, 0xc8, 0xc3, 0x33} },
-{ 0x09b9,      16,     {0xc4, 0x54, 0x0f, 0x44, 0x20, 0xc8, 0x83, 0x40, 0x04, 0xf4, 0x56, 0x80, 0x01, 0x46, 0xf6, 0xdf} },
-{ 0x09c9,      16,     {0xe4, 0x80, 0x0b, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x90, 0x0d, 0xec, 0xe4, 0x7e} },
-{ 0x09d9,      16,     {0x01, 0x93, 0x60, 0xbc, 0xa3, 0xff, 0x54, 0x3f, 0x30, 0xe5, 0x09, 0x54, 0x1f, 0xfe, 0xe4, 0x93} },
-{ 0x09e9,      16,     {0xa3, 0x60, 0x01, 0x0e, 0xcf, 0x54, 0xc0, 0x25, 0xe0, 0x60, 0xa8, 0x40, 0xb8, 0xe4, 0x93, 0xa3} },
-{ 0x09f9,      16,     {0xfa, 0xe4, 0x93, 0xa3, 0xf8, 0xe4, 0x93, 0xa3, 0xc8, 0xc5, 0x82, 0xc8, 0xca, 0xc5, 0x83, 0xca} },
-{ 0x0a09,      16,     {0xf0, 0xa3, 0xc8, 0xc5, 0x82, 0xc8, 0xca, 0xc5, 0x83, 0xca, 0xdf, 0xe9, 0xde, 0xe7, 0x80, 0xbe} },
-{ 0x0a19,      16,     {0xe4, 0x90, 0x7f, 0x9c, 0xf0, 0x7f, 0x0a, 0xfe, 0x12, 0x0d, 0x94, 0x90, 0x7f, 0x96, 0x74, 0x89} },
-{ 0x0a29,      16,     {0xf0, 0x90, 0x7f, 0x9c, 0x74, 0xcf, 0xf0, 0x7f, 0xf4, 0x7e, 0x01, 0x12, 0x0d, 0x94, 0x90, 0x7f} },
-{ 0x0a39,      16,     {0x96, 0xe0, 0x54, 0xfe, 0xf0, 0x7f, 0x0a, 0x7e, 0x00, 0x12, 0x0d, 0x94, 0x7f, 0x05, 0x7e, 0x00} },
-{ 0x0a49,      16,     {0x12, 0x0d, 0x94, 0x90, 0x7f, 0x96, 0xe0, 0x44, 0x02, 0xf0, 0xe0, 0x54, 0x7f, 0xf0, 0x7f, 0x05} },
-{ 0x0a59,      16,     {0x7e, 0x00, 0x12, 0x0d, 0x94, 0x90, 0x7f, 0x96, 0xe0, 0x44, 0x40, 0xf0, 0x7f, 0x05, 0x7e, 0x00} },
-{ 0x0a69,      16,     {0x12, 0x0d, 0x94, 0x90, 0x7f, 0x96, 0xe0, 0x54, 0xbf, 0xf0, 0x7f, 0x32, 0x7e, 0x00, 0x12, 0x0d} },
-{ 0x0a79,      16,     {0x94, 0x90, 0x7f, 0x96, 0xe0, 0x44, 0x40, 0xf0, 0x7f, 0x32, 0x7e, 0x00, 0x12, 0x0d, 0x94, 0x22} },
-{ 0x0a89,      16,     {0x75, 0x32, 0x01, 0xe5, 0x32, 0x60, 0x1b, 0x7f, 0x01, 0x12, 0x0d, 0xd7, 0x7f, 0x00, 0x7e, 0x0e} },
-{ 0x0a99,      16,     {0x7d, 0x00, 0x7c, 0x01, 0x12, 0x06, 0x94, 0xe4, 0x33, 0xf5, 0x32, 0x70, 0x05, 0x7f, 0x0f, 0x12} },
-{ 0x0aa9,      16,     {0x0d, 0xd7, 0xe5, 0x32, 0x60, 0x1b, 0x7f, 0x02, 0x12, 0x0d, 0xd7, 0x7f, 0x00, 0x7e, 0x80, 0x7d} },
-{ 0x0ab9,      16,     {0x00, 0x7c, 0x80, 0x12, 0x06, 0x94, 0xe4, 0x33, 0xf5, 0x32, 0x70, 0x05, 0x7f, 0x0f, 0x12, 0x0d} },
-{ 0x0ac9,      16,     {0xd7, 0xe5, 0x32, 0x60, 0x1b, 0x7f, 0x03, 0x12, 0x0d, 0xd7, 0x7f, 0x00, 0x7e, 0x20, 0x7d, 0x40} },
-{ 0x0ad9,      16,     {0x7c, 0x5b, 0x12, 0x06, 0x94, 0xe4, 0x33, 0xf5, 0x32, 0x70, 0x05, 0x7f, 0x0f, 0x12, 0x0d, 0xd7} },
-{ 0x0ae9,      14,     {0xe5, 0x32, 0x60, 0x05, 0xe4, 0xff, 0x12, 0x0d, 0xd7, 0xe5, 0x32, 0x24, 0xff, 0x22} },
-{ 0x0af7,      8,      {0x90, 0x7f, 0xea, 0xe0, 0xf5, 0x10, 0xd3, 0x22} },
-{ 0x0aff,      1,      {0x32} },
-{ 0x0b00,      16,     {0x02, 0x0d, 0x64, 0x00, 0x02, 0x0d, 0xab, 0x00, 0x02, 0x0d, 0x2f, 0x00, 0x02, 0x0d, 0x7c, 0x00} },
-{ 0x0b10,      16,     {0x02, 0x0d, 0xc1, 0x00, 0x02, 0x0a, 0xff, 0x00, 0x02, 0x0e, 0x4c, 0x00, 0x02, 0x0e, 0x4d, 0x00} },
-{ 0x0b20,      16,     {0x02, 0x0e, 0x4e, 0x00, 0x02, 0x0e, 0x4f, 0x00, 0x02, 0x0e, 0x50, 0x00, 0x02, 0x0e, 0x51, 0x00} },
-{ 0x0b30,      16,     {0x02, 0x0e, 0x52, 0x00, 0x02, 0x0e, 0x53, 0x00, 0x02, 0x0e, 0x54, 0x00, 0x02, 0x0e, 0x55, 0x00} },
-{ 0x0b40,      16,     {0x02, 0x0e, 0x56, 0x00, 0x02, 0x0e, 0x57, 0x00, 0x02, 0x0e, 0x58, 0x00, 0x02, 0x0e, 0x59, 0x00} },
-{ 0x0b50,      8,      {0x02, 0x0e, 0x5a, 0x00, 0x02, 0x0e, 0x5b, 0x00} },
-{ 0x0b58,      16,     {0xe4, 0xfe, 0x75, 0x2a, 0xff, 0x75, 0x2b, 0x11, 0x75, 0x2c, 0x12, 0xab, 0x2a, 0xaa, 0x2b, 0xa9} },
-{ 0x0b68,      16,     {0x2c, 0x90, 0x00, 0x01, 0x12, 0x08, 0x22, 0x64, 0x02, 0x70, 0x2d, 0xad, 0x06, 0x0e, 0xed, 0xb5} },
-{ 0x0b78,      16,     {0x07, 0x01, 0x22, 0x90, 0x00, 0x02, 0x12, 0x08, 0x71, 0x85, 0xf0, 0x28, 0xf5, 0x29, 0x62, 0x28} },
-{ 0x0b88,      16,     {0xe5, 0x28, 0x62, 0x29, 0xe5, 0x29, 0x62, 0x28, 0x29, 0xfd, 0xe5, 0x28, 0x3a, 0xa9, 0x05, 0x75} },
-{ 0x0b98,      14,     {0x2a, 0xff, 0xf5, 0x2b, 0x89, 0x2c, 0x80, 0xc3, 0x7b, 0x00, 0x7a, 0x00, 0x79, 0x00} },
-{ 0x0ba6,      1,      {0x22} },
-{ 0x0ba7,      16,     {0xab, 0x07, 0xaa, 0x06, 0xac, 0x05, 0xe4, 0xfd, 0xe5, 0x11, 0x60, 0x11, 0xea, 0xff, 0xae, 0x05} },
-{ 0x0bb7,      16,     {0x0d, 0xee, 0x24, 0x10, 0xf5, 0x82, 0xe4, 0x34, 0x0f, 0xf5, 0x83, 0xef, 0xf0, 0xeb, 0xae, 0x05} },
-{ 0x0bc7,      16,     {0x0d, 0x74, 0x10, 0x2e, 0xf5, 0x82, 0xe4, 0x34, 0x0f, 0xf5, 0x83, 0xeb, 0xf0, 0xaf, 0x05, 0x0d} },
-{ 0x0bd7,      16,     {0x74, 0x10, 0x2f, 0xf5, 0x82, 0xe4, 0x34, 0x0f, 0xf5, 0x83, 0xec, 0xf0, 0xaf, 0x0f, 0x7a, 0x0f} },
-{ 0x0be7,      13,     {0x7b, 0x10, 0x12, 0x0d, 0x10, 0x7f, 0x0a, 0x7e, 0x00, 0x12, 0x0d, 0x94, 0x22} },
-{ 0x0bf4,      16,     {0x8e, 0x32, 0x8f, 0x33, 0x8d, 0x34, 0x8a, 0x35, 0x8b, 0x36, 0xe4, 0xfd, 0xf5, 0x37, 0xe5, 0x11} },
-{ 0x0c04,      16,     {0x60, 0x12, 0xe5, 0x32, 0xff, 0xae, 0x05, 0x0d, 0xee, 0x24, 0x13, 0xf5, 0x82, 0xe4, 0x34, 0x0f} },
-{ 0x0c14,      16,     {0xf5, 0x83, 0xef, 0xf0, 0xe5, 0x33, 0xae, 0x05, 0x0d, 0x74, 0x13, 0x2e, 0xf5, 0x82, 0xe4, 0x34} },
-{ 0x0c24,      16,     {0x0f, 0xf5, 0x83, 0xe5, 0x33, 0xf0, 0xaf, 0x0f, 0x7a, 0x0f, 0x7b, 0x13, 0x12, 0x0d, 0x10, 0xaf} },
-{ 0x0c34,      11,     {0x0f, 0xad, 0x34, 0xab, 0x36, 0xaa, 0x35, 0x12, 0x0c, 0xf1, 0x22} },
-{ 0x0c3f,      16,     {0x8e, 0x32, 0x8f, 0x33, 0x8d, 0x34, 0x8a, 0x35, 0x8b, 0x36, 0xe4, 0xf5, 0x37, 0xe5, 0x37, 0xc3} },
-{ 0x0c4f,      16,     {0x95, 0x34, 0x50, 0x20, 0x05, 0x33, 0xe5, 0x33, 0xae, 0x32, 0x70, 0x02, 0x05, 0x32, 0x14, 0xff} },
-{ 0x0c5f,      16,     {0xe5, 0x36, 0x25, 0x37, 0xf5, 0x82, 0xe4, 0x35, 0x35, 0xf5, 0x83, 0xe0, 0xfd, 0x12, 0x0b, 0xa7} },
-{ 0x0c6f,      5,      {0x05, 0x37, 0x80, 0xd9, 0x22} },
-{ 0x0c74,      16,     {0xa9, 0x07, 0xe5, 0x0d, 0x70, 0x25, 0x90, 0x7f, 0xa5, 0xe0, 0x44, 0x80, 0xf0, 0xe9, 0x25, 0xe0} },
-{ 0x0c84,      16,     {0x44, 0x01, 0x90, 0x7f, 0xa6, 0xf0, 0x8d, 0x08, 0xaf, 0x03, 0xa9, 0x07, 0x75, 0x09, 0x01, 0x8a} },
-{ 0x0c94,      13,     {0x0a, 0x89, 0x0b, 0xe4, 0xf5, 0x0c, 0x75, 0x0d, 0x03, 0xd3, 0x22, 0xc3, 0x22} },
-{ 0x0ca1,      16,     {0xa9, 0x07, 0xe5, 0x0d, 0x70, 0x23, 0x90, 0x7f, 0xa5, 0xe0, 0x44, 0x80, 0xf0, 0xe9, 0x25, 0xe0} },
-{ 0x0cb1,      16,     {0x90, 0x7f, 0xa6, 0xf0, 0x8d, 0x08, 0xaf, 0x03, 0xa9, 0x07, 0x75, 0x09, 0x01, 0x8a, 0x0a, 0x89} },
-{ 0x0cc1,      11,     {0x0b, 0xe4, 0xf5, 0x0c, 0x75, 0x0d, 0x01, 0xd3, 0x22, 0xc3, 0x22} },
-{ 0x0ccc,      16,     {0x90, 0x7f, 0xd6, 0xe0, 0x54, 0xfb, 0xf0, 0xe0, 0x44, 0x08, 0xf0, 0x30, 0x06, 0x04, 0xe0, 0x44} },
-{ 0x0cdc,      16,     {0x02, 0xf0, 0x7f, 0xd0, 0x7e, 0x07, 0x12, 0x0d, 0x94, 0x90, 0x7f, 0xd6, 0xe0, 0x54, 0xf7, 0xf0} },
-{ 0x0cec,      5,      {0xe0, 0x44, 0x04, 0xf0, 0x22} },
-{ 0x0cf1,      16,     {0x12, 0x0c, 0x74, 0xe5, 0x0d, 0x24, 0xfa, 0x60, 0x10, 0x14, 0x60, 0x07, 0x24, 0x07, 0x70, 0xf3} },
-{ 0x0d01,      15,     {0x7f, 0x08, 0x22, 0xe4, 0xf5, 0x0d, 0x7f, 0x07, 0x22, 0xe4, 0xf5, 0x0d, 0x7f, 0x06, 0x22} },
-{ 0x0d10,      16,     {0x12, 0x0c, 0xa1, 0xe5, 0x0d, 0x24, 0xfa, 0x60, 0x10, 0x14, 0x60, 0x07, 0x24, 0x07, 0x70, 0xf3} },
-{ 0x0d20,      15,     {0x7f, 0x08, 0x22, 0xe4, 0xf5, 0x0d, 0x7f, 0x07, 0x22, 0xe4, 0xf5, 0x0d, 0x7f, 0x06, 0x22} },
-{ 0x0d2f,      16,     {0xc0, 0xe0, 0xc0, 0x83, 0xc0, 0x82, 0x90, 0x7f, 0xc4, 0xe4, 0xf0, 0x53, 0x91, 0xef, 0x90, 0x7f} },
-{ 0x0d3f,      11,     {0xab, 0x74, 0x04, 0xf0, 0xd0, 0x82, 0xd0, 0x83, 0xd0, 0xe0, 0x32} },
-{ 0x0d4a,      16,     {0x90, 0x7f, 0xd6, 0xe0, 0x30, 0xe7, 0x12, 0xe0, 0x44, 0x01, 0xf0, 0x7f, 0x14, 0x7e, 0x00, 0x12} },
-{ 0x0d5a,      10,     {0x0d, 0x94, 0x90, 0x7f, 0xd6, 0xe0, 0x54, 0xfe, 0xf0, 0x22} },
-{ 0x0d64,      16,     {0xc0, 0xe0, 0xc0, 0x83, 0xc0, 0x82, 0xd2, 0x01, 0x53, 0x91, 0xef, 0x90, 0x7f, 0xab, 0x74, 0x01} },
-{ 0x0d74,      8,      {0xf0, 0xd0, 0x82, 0xd0, 0x83, 0xd0, 0xe0, 0x32} },
-{ 0x0d7c,      16,     {0xc0, 0xe0, 0xc0, 0x83, 0xc0, 0x82, 0xd2, 0x03, 0x53, 0x91, 0xef, 0x90, 0x7f, 0xab, 0x74, 0x08} },
-{ 0x0d8c,      8,      {0xf0, 0xd0, 0x82, 0xd0, 0x83, 0xd0, 0xe0, 0x32} },
-{ 0x0d94,      16,     {0x8e, 0x38, 0x8f, 0x39, 0xe5, 0x39, 0x15, 0x39, 0xae, 0x38, 0x70, 0x02, 0x15, 0x38, 0x4e, 0x60} },
-{ 0x0da4,      7,      {0x05, 0x12, 0x0e, 0x00, 0x80, 0xee, 0x22} },
-{ 0x0dab,      16,     {0xc0, 0xe0, 0xc0, 0x83, 0xc0, 0x82, 0x53, 0x91, 0xef, 0x90, 0x7f, 0xab, 0x74, 0x02, 0xf0, 0xd0} },
-{ 0x0dbb,      6,      {0x82, 0xd0, 0x83, 0xd0, 0xe0, 0x32} },
-{ 0x0dc1,      16,     {0xc0, 0xe0, 0xc0, 0x83, 0xc0, 0x82, 0x53, 0x91, 0xef, 0x90, 0x7f, 0xab, 0x74, 0x10, 0xf0, 0xd0} },
-{ 0x0dd1,      6,      {0x82, 0xd0, 0x83, 0xd0, 0xe0, 0x32} },
-{ 0x0dd7,      16,     {0xae, 0x07, 0x7f, 0x21, 0x7d, 0x01, 0x74, 0x00, 0x2e, 0xf5, 0x82, 0xe4, 0x34, 0x0f, 0xab, 0x82} },
-{ 0x0de7,      5,      {0xfa, 0x12, 0x0d, 0x10, 0x22} },
-{ 0x0dec,      16,     {0x50, 0x0f, 0x00, 0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x98, 0x88, 0x83, 0xc6} },
-{ 0x0dfc,      3,      {0xa1, 0x86, 0x8e} },
-{ 0x0dff,      1,      {0x00} },
-{ 0x0e00,      16,     {0x74, 0x00, 0xf5, 0x86, 0x90, 0xfd, 0xa5, 0x7c, 0x05, 0xa3, 0xe5, 0x82, 0x45, 0x83, 0x70, 0xf9} },
-{ 0x0e10,      1,      {0x22} },
-{ 0x0e11,      14,     {0x90, 0x7f, 0x00, 0xe5, 0x10, 0xf0, 0x90, 0x7f, 0xb5, 0x74, 0x01, 0xf0, 0xd3, 0x22} },
-{ 0x0e1f,      14,     {0x90, 0x7f, 0x00, 0xe5, 0x0e, 0xf0, 0x90, 0x7f, 0xb5, 0x74, 0x01, 0xf0, 0xd3, 0x22} },
-{ 0x0e2d,      8,      {0x90, 0x7f, 0xea, 0xe0, 0xf5, 0x0e, 0xd3, 0x22} },
-{ 0x0e35,      8,      {0xe4, 0xf5, 0x0d, 0xd2, 0xe9, 0xd2, 0xaf, 0x22} },
-{ 0x0e3d,      3,      {0xd2, 0x00, 0x22} },
-{ 0x0e40,      2,      {0xd3, 0x22} },
-{ 0x0e42,      2,      {0xd3, 0x22} },
-{ 0x0e44,      2,      {0xd3, 0x22} },
-{ 0x0e46,      2,      {0xd3, 0x22} },
-{ 0x0e48,      2,      {0xd3, 0x22} },
-{ 0x0e4a,      2,      {0xd3, 0x22} },
-{ 0x0e4c,      1,      {0x32} },
-{ 0x0e4d,      1,      {0x32} },
-{ 0x0e4e,      1,      {0x32} },
-{ 0x0e4f,      1,      {0x32} },
-{ 0x0e50,      1,      {0x32} },
-{ 0x0e51,      1,      {0x32} },
-{ 0x0e52,      1,      {0x32} },
-{ 0x0e53,      1,      {0x32} },
-{ 0x0e54,      1,      {0x32} },
-{ 0x0e55,      1,      {0x32} },
-{ 0x0e56,      1,      {0x32} },
-{ 0x0e57,      1,      {0x32} },
-{ 0x0e58,      1,      {0x32} },
-{ 0x0e59,      1,      {0x32} },
-{ 0x0e5a,      1,      {0x32} },
-{ 0x0e5b,      1,      {0x32} },
-{ 0x1100,      16,     {0x12, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x40, 0x47, 0x05, 0x10, 0x27, 0x01, 0x00, 0x01, 0x02} },
-{ 0x1110,      16,     {0x00, 0x01, 0x09, 0x02, 0x20, 0x00, 0x01, 0x01, 0x03, 0xa0, 0x00, 0x09, 0x04, 0x00, 0x00, 0x02} },
-{ 0x1120,      16,     {0xff, 0x00, 0x00, 0x04, 0x07, 0x05, 0x82, 0x02, 0x40, 0x00, 0x00, 0x07, 0x05, 0x02, 0x02, 0x40} },
-{ 0x1130,      16,     {0x00, 0x00, 0x04, 0x03, 0x09, 0x04, 0x26, 0x03, 0x41, 0x00, 0x6e, 0x00, 0x63, 0x00, 0x68, 0x00} },
-{ 0x1140,      16,     {0x6f, 0x00, 0x72, 0x00, 0x20, 0x00, 0x43, 0x00, 0x68, 0x00, 0x69, 0x00, 0x70, 0x00, 0x73, 0x00} },
-{ 0x1150,      16,     {0x2c, 0x00, 0x20, 0x00, 0x49, 0x00, 0x6e, 0x00, 0x63, 0x00, 0x2e, 0x00, 0x28, 0x03, 0x46, 0x00} },
-{ 0x1160,      16,     {0x69, 0x00, 0x72, 0x00, 0x6d, 0x00, 0x77, 0x00, 0x61, 0x00, 0x72, 0x00, 0x65, 0x00, 0x20, 0x00} },
-{ 0x1170,      16,     {0x46, 0x00, 0x72, 0x00, 0x61, 0x00, 0x6d, 0x00, 0x65, 0x00, 0x57, 0x00, 0x6f, 0x00, 0x72, 0x00} },
-{ 0x1180,      16,     {0x6b, 0x00, 0x73, 0x00, 0x2a, 0x03, 0x43, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x66, 0x00, 0x69, 0x00} },
-{ 0x1190,      16,     {0x67, 0x00, 0x75, 0x00, 0x72, 0x00, 0x61, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6f, 0x00, 0x6e, 0x00} },
-{ 0x11a0,      16,     {0x20, 0x00, 0x53, 0x00, 0x74, 0x00, 0x72, 0x00, 0x69, 0x00, 0x6e, 0x00, 0x67, 0x00, 0x22, 0x03} },
-{ 0x11b0,      16,     {0x49, 0x00, 0x6e, 0x00, 0x74, 0x00, 0x65, 0x00, 0x72, 0x00, 0x66, 0x00, 0x61, 0x00, 0x63, 0x00} },
-{ 0x11c0,      16,     {0x65, 0x00, 0x20, 0x00, 0x53, 0x00, 0x74, 0x00, 0x72, 0x00, 0x69, 0x00, 0x6e, 0x00, 0x67, 0x00} },
-{ 0x11d0,      2,      {0x00, 0x00} },
-{ 0xffff,      0,      {0x00} }
-};
-#endif
diff --git a/drivers/usb/serial/whiteheat_fw.h b/drivers/usb/serial/whiteheat_fw.h
new file mode 100644 (file)
index 0000000..7d942ba
--- /dev/null
@@ -0,0 +1,1556 @@
+/*****************************************************************************
+ *
+ *      whiteheat.h  --  ConnectTech WhiteHEAT Firmware.
+ *
+ *      Copyright (C) 2000  ConnectTech Inc (http://www.connecttech.com/)
+ *
+ *      This program is free software; you can redistribute it and/or modify
+ *      it under the terms of the GNU General Public License as published by
+ *      the Free Software Foundation; either version 2 of the License, or
+ *      (at your option) any later version.
+ *
+ *      This program is distributed in the hope that it will be useful,
+ *      but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *      GNU General Public License for more details.
+ *
+ *      You should have received a copy of the GNU General Public License
+ *      along with this program; if not, write to the Free Software
+ *      Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ * (04/09/2000) gkh
+ *     Updated the firmware with the latest provided by ConnectTech.
+ *
+ * (01/16/2000) gkh
+ *     Fixed my intel hex processing tool, so now the firmware actually
+ *     matches the original file (this was causing a few problems...)
+ *
+ * (01/15/2000) gkh
+ *     Added debug loader firmware if DEBUG is #defined:
+ *             Port 1 LED flashes when the vend_ax program is running
+ *             Port 2 LED flashes when any SETUP command arrives
+ *             Port 3 LED flashes when any valid VENDOR request occurs
+ *             Port 4 LED flashes when the EXTERNAL RAM DOWNLOAD request occurs
+ *
+ * version 1.0 (01/09/2000) gkh
+ *     Original firmware from ConnectTech massaged a little to be program
+ *     readable.
+ *
+ *****************************************************************************/
+
+#define whiteheat_DATE "20000106"
+
+struct whiteheat_hex_record {
+       __u16   address;
+       __u8    data_size;
+       __u8    data[16];
+};
+
+static const struct whiteheat_hex_record whiteheat_firmware[] = {
+{ 0x0000,      3,      {0x02, 0x93, 0xa9} },
+{ 0x0003,      3,      {0x02, 0x13, 0x12} },
+{ 0x000b,      3,      {0x02, 0x0a, 0x80} },
+{ 0x0033,      3,      {0x02, 0x08, 0x15} },
+{ 0x0043,      3,      {0x02, 0x0a, 0x00} },
+{ 0x005b,      3,      {0x02, 0x82, 0x31} },
+{ 0x0370,      16,     {0x90, 0x7f, 0xe9, 0xe0, 0x70, 0x03, 0x02, 0x04, 0x73, 0x14, 0x70, 0x03, 0x02, 0x04, 0xe7, 0x24} },
+{ 0x0380,      16,     {0xfe, 0x70, 0x03, 0x02, 0x05, 0x45, 0x24, 0xfb, 0x70, 0x03, 0x02, 0x04, 0x64, 0x14, 0x70, 0x03} },
+{ 0x0390,      16,     {0x02, 0x04, 0x52, 0x14, 0x70, 0x03, 0x02, 0x04, 0x3a, 0x14, 0x70, 0x03, 0x02, 0x04, 0x49, 0x24} },
+{ 0x03a0,      16,     {0x05, 0x60, 0x03, 0x02, 0x05, 0x94, 0x90, 0x7f, 0xeb, 0xe0, 0x24, 0xfe, 0x60, 0x16, 0x14, 0x60} },
+{ 0x03b0,      16,     {0x36, 0x24, 0x02, 0x70, 0x7b, 0x74, 0x12, 0x90, 0x7f, 0xd4, 0xf0, 0x74, 0x00, 0x90, 0x7f, 0xd5} },
+{ 0x03c0,      16,     {0xf0, 0x02, 0x05, 0x9b, 0x90, 0x7f, 0xea, 0xe0, 0xff, 0x12, 0x09, 0x7b, 0xea, 0x49, 0x60, 0x0d} },
+{ 0x03d0,      16,     {0xea, 0x90, 0x7f, 0xd4, 0xf0, 0xe9, 0x90, 0x7f, 0xd5, 0xf0, 0x02, 0x05, 0x9b, 0x90, 0x7f, 0xb4} },
+{ 0x03e0,      16,     {0xe0, 0x44, 0x01, 0xf0, 0x02, 0x05, 0x9b, 0x90, 0x7f, 0xea, 0xe0, 0xff, 0x12, 0x09, 0x3a, 0xea} },
+{ 0x03f0,      16,     {0x49, 0x60, 0x33, 0x12, 0x9b, 0x72, 0xf5, 0x4b, 0x90, 0x7f, 0xee, 0xe0, 0xff, 0xe5, 0x4b, 0xd3} },
+{ 0x0400,      16,     {0x9f, 0x40, 0x03, 0xe0, 0xf5, 0x4b, 0xe5, 0x4b, 0xd3, 0x94, 0x40, 0x40, 0x03, 0x75, 0x4b, 0x40} },
+{ 0x0410,      16,     {0xae, 0x02, 0xaf, 0x01, 0x7c, 0x7f, 0x7d, 0x00, 0xab, 0x4b, 0x12, 0x8d, 0xd9, 0x90, 0x7f, 0xb5} },
+{ 0x0420,      16,     {0xe5, 0x4b, 0xf0, 0x02, 0x05, 0x9b, 0x90, 0x7f, 0xb4, 0xe0, 0x44, 0x01, 0xf0, 0x02, 0x05, 0x9b} },
+{ 0x0430,      16,     {0x90, 0x7f, 0xb4, 0xe0, 0x44, 0x01, 0xf0, 0x02, 0x05, 0x9b, 0x90, 0x7f, 0x00, 0xe5, 0x21, 0xf0} },
+{ 0x0440,      16,     {0x90, 0x7f, 0xb5, 0x74, 0x01, 0xf0, 0x02, 0x05, 0x9b, 0x90, 0x7f, 0xea, 0xe0, 0xf5, 0x21, 0x02} },
+{ 0x0450,      16,     {0x05, 0x9b, 0x90, 0x7f, 0xea, 0xe0, 0xf5, 0x31, 0xd2, 0x02, 0x43, 0x88, 0x10, 0xd2, 0xeb, 0xd2} },
+{ 0x0460,      16,     {0xa8, 0x02, 0x05, 0x9b, 0x90, 0x7f, 0x00, 0xe5, 0x31, 0xf0, 0x90, 0x7f, 0xb5, 0x74, 0x01, 0xf0} },
+{ 0x0470,      16,     {0x02, 0x05, 0x9b, 0x90, 0x7f, 0xe8, 0xe0, 0x24, 0x7f, 0x60, 0x24, 0x14, 0x60, 0x31, 0x24, 0x02} },
+{ 0x0480,      16,     {0x70, 0x5b, 0xa2, 0x00, 0xe4, 0x33, 0xff, 0x25, 0xe0, 0xff, 0xa2, 0x05, 0xe4, 0x33, 0x4f, 0x90} },
+{ 0x0490,      16,     {0x7f, 0x00, 0xf0, 0xe4, 0xa3, 0xf0, 0x90, 0x7f, 0xb5, 0x74, 0x02, 0xf0, 0x02, 0x05, 0x9b, 0xe4} },
+{ 0x04a0,      16,     {0x90, 0x7f, 0x00, 0xf0, 0xa3, 0xf0, 0x90, 0x7f, 0xb5, 0x74, 0x02, 0xf0, 0x02, 0x05, 0x9b, 0x90} },
+{ 0x04b0,      16,     {0x7f, 0xec, 0xe0, 0xf4, 0x54, 0x80, 0xff, 0xc4, 0x54, 0x0f, 0xff, 0xe0, 0x54, 0x07, 0x2f, 0x25} },
+{ 0x04c0,      16,     {0xe0, 0x24, 0xb4, 0xf5, 0x82, 0xe4, 0x34, 0x7f, 0xf5, 0x83, 0xe0, 0x54, 0x01, 0x90, 0x7f, 0x00} },
+{ 0x04d0,      16,     {0xf0, 0xe4, 0xa3, 0xf0, 0x90, 0x7f, 0xb5, 0x74, 0x02, 0xf0, 0x02, 0x05, 0x9b, 0x90, 0x7f, 0xb4} },
+{ 0x04e0,      16,     {0xe0, 0x44, 0x01, 0xf0, 0x02, 0x05, 0x9b, 0x90, 0x7f, 0xe8, 0xe0, 0x24, 0xfe, 0x60, 0x1d, 0x24} },
+{ 0x04f0,      16,     {0x02, 0x60, 0x03, 0x02, 0x05, 0x9b, 0x90, 0x7f, 0xea, 0xe0, 0xb4, 0x01, 0x05, 0xc2, 0x00, 0x02} },
+{ 0x0500,      16,     {0x05, 0x9b, 0x90, 0x7f, 0xb4, 0xe0, 0x44, 0x01, 0xf0, 0x02, 0x05, 0x9b, 0x90, 0x7f, 0xea, 0xe0} },
+{ 0x0510,      16,     {0x70, 0x2a, 0x90, 0x7f, 0xec, 0xe0, 0xff, 0xf4, 0x54, 0x80, 0xfe, 0xc4, 0x54, 0x0f, 0xfe, 0xef} },
+{ 0x0520,      16,     {0x54, 0x07, 0xfd, 0x2e, 0x25, 0xe0, 0x24, 0xb4, 0xf5, 0x82, 0xe4, 0x34, 0x7f, 0xf5, 0x83, 0xe4} },
+{ 0x0530,      16,     {0xf0, 0x90, 0x7f, 0xd7, 0xed, 0xf0, 0xef, 0x44, 0x20, 0xf0, 0x80, 0x5f, 0x90, 0x7f, 0xb4, 0xe0} },
+{ 0x0540,      16,     {0x44, 0x01, 0xf0, 0x80, 0x56, 0x90, 0x7f, 0xe8, 0xe0, 0x24, 0xfe, 0x60, 0x18, 0x24, 0x02, 0x70} },
+{ 0x0550,      16,     {0x4a, 0x90, 0x7f, 0xea, 0xe0, 0xb4, 0x01, 0x04, 0xd2, 0x00, 0x80, 0x3f, 0x90, 0x7f, 0xb4, 0xe0} },
+{ 0x0560,      16,     {0x44, 0x01, 0xf0, 0x80, 0x36, 0x90, 0x7f, 0xea, 0xe0, 0x70, 0x20, 0x90, 0x7f, 0xec, 0xe0, 0xf4} },
+{ 0x0570,      16,     {0x54, 0x80, 0xff, 0xc4, 0x54, 0x0f, 0xff, 0xe0, 0x54, 0x07, 0x2f, 0x25, 0xe0, 0x24, 0xb4, 0xf5} },
+{ 0x0580,      16,     {0x82, 0xe4, 0x34, 0x7f, 0xf5, 0x83, 0x74, 0x01, 0xf0, 0x80, 0x10, 0x90, 0x7f, 0xb4, 0xe0, 0x44} },
+{ 0x0590,      16,     {0x01, 0xf0, 0x80, 0x07, 0x90, 0x7f, 0xb4, 0xe0, 0x44, 0x01, 0xf0, 0x90, 0x7f, 0xb4, 0xe0, 0x44} },
+{ 0x05a0,      2,      {0x02, 0xf0} },
+{ 0x05a2,      1,      {0x22} },
+{ 0x05a3,      16,     {0x75, 0x47, 0xff, 0x75, 0x46, 0xff, 0x75, 0x45, 0x0f, 0x75, 0x44, 0x00, 0xd2, 0x03, 0xc2, 0x06} },
+{ 0x05b3,      16,     {0xc2, 0x02, 0xc2, 0x00, 0xc2, 0x05, 0xc2, 0x01, 0x90, 0x03, 0x00, 0x74, 0x19, 0xf0, 0xe4, 0x90} },
+{ 0x05c3,      16,     {0x01, 0xbc, 0xf0, 0xc2, 0x04, 0x90, 0x01, 0xc0, 0xf0, 0xa3, 0xf0, 0xc2, 0xaf, 0xc2, 0xa8, 0x12} },
+{ 0x05d3,      16,     {0x0b, 0x8d, 0xe4, 0x90, 0x02, 0xaf, 0xf0, 0x90, 0x01, 0x00, 0xf0, 0xa3, 0xf0, 0xa3, 0xf0, 0xa3} },
+{ 0x05e3,      16,     {0xf0, 0xa3, 0xf0, 0xa3, 0x74, 0x10, 0xf0, 0xa3, 0x74, 0x01, 0xf0, 0xa3, 0x74, 0x08, 0xf0, 0x7e} },
+{ 0x05f3,      16,     {0x01, 0x7f, 0x00, 0x12, 0x19, 0xc1, 0x75, 0x49, 0x12, 0x75, 0x4a, 0x0a, 0x90, 0x01, 0x0b, 0xe0} },
+{ 0x0603,      16,     {0xff, 0x05, 0x4a, 0xe5, 0x4a, 0xac, 0x49, 0x70, 0x02, 0x05, 0x49, 0x14, 0xf5, 0x82, 0x8c, 0x83} },
+{ 0x0613,      16,     {0xef, 0xf0, 0x90, 0x01, 0x0c, 0xe0, 0x44, 0x80, 0xff, 0x05, 0x4a, 0xe5, 0x4a, 0xac, 0x49, 0x70} },
+{ 0x0623,      16,     {0x02, 0x05, 0x49, 0x14, 0xf5, 0x82, 0x8c, 0x83, 0xef, 0xf0, 0x90, 0x01, 0x0d, 0xe0, 0xff, 0x05} },
+{ 0x0633,      16,     {0x4a, 0xe5, 0x4a, 0xac, 0x49, 0x70, 0x02, 0x05, 0x49, 0x14, 0xf5, 0x82, 0x8c, 0x83, 0xef, 0xf0} },
+{ 0x0643,      16,     {0x90, 0x01, 0x0e, 0xe0, 0xff, 0x05, 0x4a, 0xe5, 0x4a, 0xac, 0x49, 0x70, 0x02, 0x05, 0x49, 0x14} },
+{ 0x0653,      16,     {0xf5, 0x82, 0x8c, 0x83, 0xef, 0xf0, 0x90, 0x12, 0x0a, 0xe4, 0x93, 0xff, 0x74, 0x01, 0x93, 0x90} },
+{ 0x0663,      16,     {0x01, 0x1c, 0xcf, 0xf0, 0xa3, 0xef, 0xf0, 0x90, 0x01, 0x1c, 0xe0, 0xff, 0xa3, 0xe0, 0xfe, 0xef} },
+{ 0x0673,      16,     {0x6e, 0xff, 0x90, 0x01, 0x1c, 0xf0, 0xa3, 0xe0, 0x6f, 0xff, 0xf0, 0x90, 0x01, 0x1c, 0xe0, 0x6f} },
+{ 0x0683,      16,     {0xf0, 0xe0, 0xfe, 0xa3, 0xe0, 0xff, 0xe4, 0xfc, 0xfd, 0x75, 0x4f, 0x10, 0x75, 0x50, 0x02, 0x75} },
+{ 0x0693,      16,     {0x51, 0x12, 0x75, 0x52, 0xac, 0x12, 0x90, 0x15, 0x75, 0x49, 0x12, 0x75, 0x4a, 0xb2, 0x90, 0x01} },
+{ 0x06a3,      16,     {0x0d, 0xe0, 0xff, 0x05, 0x4a, 0xe5, 0x4a, 0xac, 0x49, 0x70, 0x02, 0x05, 0x49, 0x14, 0xf5, 0x82} },
+{ 0x06b3,      16,     {0x8c, 0x83, 0xef, 0xf0, 0x90, 0x01, 0x0e, 0xe0, 0xff, 0x05, 0x4a, 0xe5, 0x4a, 0xac, 0x49, 0x70} },
+{ 0x06c3,      16,     {0x02, 0x05, 0x49, 0x14, 0xf5, 0x82, 0x8c, 0x83, 0xef, 0xf0, 0x90, 0x7f, 0x92, 0xe0, 0xff, 0xc4} },
+{ 0x06d3,      16,     {0x54, 0x0f, 0x24, 0x41, 0xff, 0x05, 0x4a, 0xe5, 0x4a, 0xac, 0x49, 0x70, 0x02, 0x05, 0x49, 0x14} },
+{ 0x06e3,      16,     {0xf5, 0x82, 0x8c, 0x83, 0xef, 0xf0, 0x05, 0x4a, 0xe5, 0x4a, 0xae, 0x49, 0x70, 0x02, 0x05, 0x49} },
+{ 0x06f3,      16,     {0x14, 0xf5, 0x82, 0x8e, 0x83, 0xe4, 0xf0, 0x75, 0x82, 0x10, 0x75, 0x83, 0x01, 0xe0, 0xfc, 0xa3} },
+{ 0x0703,      16,     {0xe0, 0xfd, 0xa3, 0xe0, 0xfe, 0xa3, 0xe0, 0xff, 0x90, 0x01, 0x18, 0x12, 0x9d, 0x25, 0x7e, 0x01} },
+{ 0x0713,      16,     {0x7f, 0x18, 0x12, 0x85, 0x08, 0x90, 0x01, 0x18, 0xe0, 0xfc, 0xa3, 0xe0, 0xfd, 0xa3, 0xe0, 0xfe} },
+{ 0x0723,      16,     {0xa3, 0xe0, 0xff, 0x75, 0x4f, 0x0a, 0x75, 0x50, 0x06, 0x75, 0x51, 0x12, 0x75, 0x52, 0xb8, 0x12} },
+{ 0x0733,      16,     {0x90, 0x15, 0xd2, 0xe8, 0x43, 0xd8, 0x20, 0x90, 0x7f, 0xab, 0x74, 0xff, 0xf0, 0x53, 0x91, 0xef} },
+{ 0x0743,      16,     {0x90, 0x7f, 0xaf, 0xe0, 0x44, 0x01, 0xf0, 0x90, 0x7f, 0xae, 0xe0, 0x44, 0x1f, 0xf0, 0xd2, 0xaf} },
+{ 0x0753,      16,     {0x20, 0x01, 0x2e, 0x20, 0x01, 0x2b, 0xa2, 0x03, 0x92, 0x07, 0x12, 0x09, 0xca, 0x75, 0x43, 0x50} },
+{ 0x0763,      16,     {0x75, 0x42, 0x6d, 0x75, 0x41, 0x33, 0x75, 0x40, 0x00, 0x20, 0x01, 0xe4, 0x7f, 0xff, 0x7e, 0xff} },
+{ 0x0773,      16,     {0x7d, 0xff, 0x7c, 0xff, 0x78, 0x40, 0x12, 0x9d, 0x0e, 0xec, 0x4d, 0x4e, 0x4f, 0x60, 0xd1, 0x80} },
+{ 0x0783,      16,     {0xe8, 0x30, 0x01, 0x05, 0x12, 0x03, 0x70, 0xc2, 0x01, 0x30, 0x06, 0x0d, 0x12, 0x0a, 0xed, 0x50} },
+{ 0x0793,      16,     {0x06, 0x12, 0x0b, 0x00, 0x12, 0x0a, 0xf2, 0xc2, 0x06, 0x12, 0x92, 0x38, 0x90, 0x01, 0xbd, 0xe0} },
+{ 0x07a3,      16,     {0x60, 0x10, 0x7e, 0x7b, 0x7f, 0x40, 0x12, 0x8e, 0xc1, 0xe4, 0x90, 0x01, 0xbd, 0xf0, 0x90, 0x7f} },
+{ 0x07b3,      16,     {0xd3, 0xf0, 0x90, 0x02, 0xaf, 0xe0, 0xb4, 0x0f, 0x03, 0x12, 0x95, 0x30, 0x12, 0x99, 0xcc, 0xe4} },
+{ 0x07c3,      16,     {0xff, 0x74, 0x01, 0xa8, 0x07, 0x08, 0x80, 0x02, 0xc3, 0x33, 0xd8, 0xfc, 0xfe, 0x90, 0x01, 0xbc} },
+{ 0x07d3,      16,     {0xe0, 0x5e, 0x60, 0x14, 0x74, 0x27, 0x2f, 0xf8, 0xe6, 0xd3, 0x94, 0x0a, 0x40, 0x04, 0x7e, 0x01} },
+{ 0x07e3,      16,     {0x80, 0x02, 0x7e, 0x00, 0x8e, 0x48, 0x80, 0x03, 0x75, 0x48, 0x01, 0x74, 0x68, 0x2f, 0xf5, 0x82} },
+{ 0x07f3,      16,     {0xe4, 0x34, 0x20, 0xf5, 0x83, 0xe5, 0x48, 0xf0, 0x0f, 0xbf, 0x04, 0xc5, 0xe5, 0x2b, 0xd3, 0x94} },
+{ 0x0803,      16,     {0x0a, 0x40, 0x04, 0x7f, 0x01, 0x80, 0x02, 0x7f, 0x00, 0x90, 0x20, 0x6c, 0xef, 0xf0, 0x02, 0x07} },
+{ 0x0813,      1,      {0x84} },
+{ 0x0814,      1,      {0x22} },
+{ 0x0815,      4,      {0x53, 0xd8, 0xef, 0x32} },
+{ 0x0819,      16,     {0xe4, 0x90, 0x7f, 0x9c, 0xf0, 0x7f, 0x0a, 0xfe, 0x12, 0x09, 0x23, 0x90, 0x7f, 0x96, 0x74, 0x89} },
+{ 0x0829,      16,     {0xf0, 0x90, 0x7f, 0x9c, 0x74, 0xcf, 0xf0, 0x7f, 0xf4, 0x7e, 0x01, 0x12, 0x09, 0x23, 0x90, 0x7f} },
+{ 0x0839,      16,     {0x96, 0xe0, 0x54, 0xfe, 0xf0, 0x7f, 0x0a, 0x7e, 0x00, 0x12, 0x09, 0x23, 0x7f, 0x02, 0x7d, 0xff} },
+{ 0x0849,      16,     {0x12, 0x81, 0xe0, 0x7f, 0x05, 0x7e, 0x00, 0x12, 0x09, 0x23, 0x90, 0x7f, 0x96, 0xe0, 0x44, 0x02} },
+{ 0x0859,      16,     {0xf0, 0xe0, 0x54, 0x7f, 0xf0, 0x7f, 0x05, 0x7e, 0x00, 0x12, 0x09, 0x23, 0x90, 0x7f, 0x96, 0xe0} },
+{ 0x0869,      16,     {0x44, 0x40, 0xf0, 0x7f, 0x05, 0x7e, 0x00, 0x12, 0x09, 0x23, 0x90, 0x7f, 0x96, 0xe0, 0x54, 0xbf} },
+{ 0x0879,      16,     {0xf0, 0x7f, 0x32, 0x7e, 0x00, 0x12, 0x09, 0x23, 0x90, 0x7f, 0x96, 0xe0, 0x44, 0x40, 0xf0, 0x7f} },
+{ 0x0889,      7,      {0x32, 0x7e, 0x00, 0x12, 0x09, 0x23, 0x22} },
+{ 0x0890,      16,     {0x90, 0x7f, 0x96, 0xe0, 0x54, 0xfd, 0xf0, 0xe0, 0x44, 0x80, 0xf0, 0x7f, 0x0a, 0x7e, 0x00, 0x12} },
+{ 0x08a0,      16,     {0x09, 0x23, 0x7f, 0x02, 0xe4, 0xfd, 0x12, 0x81, 0xe0, 0x7f, 0x05, 0x7e, 0x00, 0x12, 0x09, 0x23} },
+{ 0x08b0,      16,     {0x90, 0x7f, 0x96, 0xe0, 0x54, 0xbf, 0xf0, 0x7f, 0x05, 0x7e, 0x00, 0x12, 0x09, 0x23, 0x90, 0x7f} },
+{ 0x08c0,      16,     {0x96, 0xe0, 0x44, 0x04, 0xf0, 0x7f, 0x05, 0x7e, 0x00, 0x12, 0x09, 0x23, 0x90, 0x7f, 0x96, 0xe0} },
+{ 0x08d0,      16,     {0x54, 0xf7, 0xf0, 0x7f, 0x05, 0x7e, 0x00, 0x12, 0x09, 0x23, 0x90, 0x7f, 0x96, 0xe0, 0x44, 0x01} },
+{ 0x08e0,      12,     {0xf0, 0x7f, 0x05, 0x7e, 0x00, 0x12, 0x09, 0x23, 0x12, 0x0b, 0x00, 0x22} },
+{ 0x08ec,      16,     {0x90, 0x11, 0xfc, 0xe4, 0x93, 0x70, 0x2f, 0x90, 0x7f, 0x93, 0x74, 0x30, 0xf0, 0x90, 0x7f, 0x94} },
+{ 0x08fc,      16,     {0x74, 0x3c, 0xf0, 0x90, 0x7f, 0x95, 0x74, 0xc6, 0xf0, 0xe4, 0x90, 0x7f, 0x97, 0xf0, 0x90, 0x7f} },
+{ 0x090c,      16,     {0x9d, 0x74, 0x02, 0xf0, 0x90, 0x7f, 0xe2, 0x74, 0x12, 0xf0, 0x12, 0x08, 0x19, 0x75, 0x82, 0xfc} },
+{ 0x091c,      7,      {0x75, 0x83, 0x11, 0x74, 0xff, 0xf0, 0x22} },
+{ 0x0923,      16,     {0x8e, 0x58, 0x8f, 0x59, 0xe5, 0x59, 0x15, 0x59, 0xae, 0x58, 0x70, 0x02, 0x15, 0x58, 0x4e, 0x60} },
+{ 0x0933,      7,      {0x05, 0x12, 0x09, 0xef, 0x80, 0xee, 0x22} },
+{ 0x093a,      2,      {0x8f, 0x4c} },
+{ 0x093c,      16,     {0xe4, 0xf5, 0x4d, 0x75, 0x4e, 0xff, 0x75, 0x4f, 0x12, 0x75, 0x50, 0x6a, 0xab, 0x4e, 0xaa, 0x4f} },
+{ 0x094c,      16,     {0xa9, 0x50, 0x90, 0x00, 0x01, 0x12, 0x9b, 0x8b, 0xb4, 0x03, 0x1d, 0xaf, 0x4d, 0x05, 0x4d, 0xef} },
+{ 0x095c,      16,     {0xb5, 0x4c, 0x01, 0x22, 0x12, 0x9b, 0x72, 0x7e, 0x00, 0x29, 0xff, 0xee, 0x3a, 0xa9, 0x07, 0x75} },
+{ 0x096c,      14,     {0x4e, 0xff, 0xf5, 0x4f, 0x89, 0x50, 0x80, 0xd4, 0x7b, 0x00, 0x7a, 0x00, 0x79, 0x00} },
+{ 0x097a,      1,      {0x22} },
+{ 0x097b,      16,     {0xe4, 0xfe, 0x75, 0x4e, 0xff, 0x75, 0x4f, 0x12, 0x75, 0x50, 0x12, 0xab, 0x4e, 0xaa, 0x4f, 0xa9} },
+{ 0x098b,      16,     {0x50, 0x90, 0x00, 0x01, 0x12, 0x9b, 0x8b, 0x64, 0x02, 0x70, 0x2d, 0xad, 0x06, 0x0e, 0xed, 0xb5} },
+{ 0x099b,      16,     {0x07, 0x01, 0x22, 0x90, 0x00, 0x02, 0x12, 0x9b, 0xe4, 0x85, 0xf0, 0x4c, 0xf5, 0x4d, 0x62, 0x4c} },
+{ 0x09ab,      16,     {0xe5, 0x4c, 0x62, 0x4d, 0xe5, 0x4d, 0x62, 0x4c, 0x29, 0xfd, 0xe5, 0x4c, 0x3a, 0xa9, 0x05, 0x75} },
+{ 0x09bb,      14,     {0x4e, 0xff, 0xf5, 0x4f, 0x89, 0x50, 0x80, 0xc3, 0x7b, 0x00, 0x7a, 0x00, 0x79, 0x00} },
+{ 0x09c9,      1,      {0x22} },
+{ 0x09ca,      16,     {0x90, 0x7f, 0xd6, 0xe0, 0x54, 0xfb, 0xf0, 0xe0, 0x44, 0x08, 0xf0, 0x30, 0x07, 0x04, 0xe0, 0x44} },
+{ 0x09da,      16,     {0x02, 0xf0, 0x7f, 0xd0, 0x7e, 0x07, 0x12, 0x09, 0x23, 0x90, 0x7f, 0xd6, 0xe0, 0x54, 0xf7, 0xf0} },
+{ 0x09ea,      5,      {0xe0, 0x44, 0x04, 0xf0, 0x22} },
+{ 0x09ef,      16,     {0x74, 0x00, 0xf5, 0x86, 0x90, 0xfd, 0xa5, 0x7c, 0x05, 0xa3, 0xe5, 0x82, 0x45, 0x83, 0x70, 0xf9} },
+{ 0x09ff,      1,      {0x22} },
+{ 0x0a00,      16,     {0x02, 0x0b, 0xaa, 0x00, 0x02, 0x0b, 0xdd, 0x00, 0x02, 0x0b, 0xc2, 0x00, 0x02, 0x0c, 0x1c, 0x00} },
+{ 0x0a10,      16,     {0x02, 0x0c, 0x06, 0x00, 0x02, 0x0a, 0xf7, 0x00, 0x02, 0x0a, 0xf8, 0x00, 0x02, 0x0a, 0xf9, 0x00} },
+{ 0x0a20,      16,     {0x02, 0x0c, 0x37, 0x00, 0x02, 0x0d, 0x27, 0x00, 0x02, 0x0c, 0x73, 0x00, 0x02, 0x0d, 0x7b, 0x00} },
+{ 0x0a30,      16,     {0x02, 0x0c, 0xaf, 0x00, 0x02, 0x0d, 0xcf, 0x00, 0x02, 0x0c, 0xeb, 0x00, 0x02, 0x0e, 0x23, 0x00} },
+{ 0x0a40,      16,     {0x02, 0x0a, 0xfa, 0x00, 0x02, 0x0a, 0xfc, 0x00, 0x02, 0x0a, 0xfb, 0x00, 0x02, 0x0a, 0xfd, 0x00} },
+{ 0x0a50,      8,      {0x02, 0x0e, 0x77, 0x00, 0x02, 0x0e, 0x8d, 0x00} },
+{ 0x0a58,      16,     {0x53, 0x8e, 0xf7, 0xe5, 0x89, 0x54, 0xf1, 0x44, 0x01, 0xf5, 0x89, 0x75, 0x8c, 0xb1, 0xd2, 0xa9} },
+{ 0x0a68,      16,     {0x75, 0x98, 0x40, 0x75, 0xcb, 0xff, 0x75, 0xca, 0xf3, 0x75, 0xc8, 0x34, 0xe4, 0xff, 0x7f, 0x05} },
+{ 0x0a78,      7,      {0x78, 0x27, 0xe4, 0xf6, 0x08, 0xdf, 0xfc} },
+{ 0x0a7f,      1,      {0x22} },
+{ 0x0a80,      16,     {0xc0, 0xe0, 0xc0, 0x83, 0xc0, 0x82, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x00, 0xc0, 0x06, 0xc0} },
+{ 0x0a90,      1,      {0x07} },
+{ 0x0a91,      16,     {0x30, 0x04, 0x16, 0x75, 0x8c, 0xf8, 0x75, 0x8a, 0x30, 0x7f, 0x2f, 0xae, 0x07, 0x1f, 0xee, 0x60} },
+{ 0x0aa1,      16,     {0x3c, 0x90, 0x20, 0x00, 0x74, 0x55, 0xf0, 0x80, 0xf2, 0x75, 0x8c, 0xb1, 0x7f, 0x27, 0xef, 0xd3} },
+{ 0x0ab1,      16,     {0x94, 0x2b, 0x50, 0x09, 0xa8, 0x07, 0xe6, 0x60, 0x01, 0x16, 0x0f, 0x80, 0xf1, 0x90, 0x03, 0x00} },
+{ 0x0ac1,      16,     {0xe0, 0x60, 0x02, 0x14, 0xf0, 0x90, 0x01, 0xc0, 0xe0, 0x70, 0x02, 0xa3, 0xe0, 0x60, 0x0e, 0x90} },
+{ 0x0ad1,      13,     {0x01, 0xc1, 0xe0, 0x24, 0xff, 0xf0, 0x90, 0x01, 0xc0, 0xe0, 0x34, 0xff, 0xf0} },
+{ 0x0ade,      15,     {0xd0, 0x07, 0xd0, 0x06, 0xd0, 0x00, 0xd0, 0xd0, 0xd0, 0x82, 0xd0, 0x83, 0xd0, 0xe0, 0x32} },
+{ 0x0aed,      5,      {0x12, 0x08, 0x90, 0xd3, 0x22} },
+{ 0x0af2,      5,      {0x12, 0x08, 0x19, 0xd3, 0x22} },
+{ 0x0af7,      1,      {0x32} },
+{ 0x0af8,      1,      {0x32} },
+{ 0x0af9,      1,      {0x32} },
+{ 0x0afa,      1,      {0x32} },
+{ 0x0afb,      1,      {0x32} },
+{ 0x0afc,      1,      {0x32} },
+{ 0x0afd,      1,      {0x32} },
+{ 0x0b00,      9,      {0x90, 0x7f, 0xd6, 0xe0, 0x44, 0x80, 0xf0, 0x80, 0x74} },
+{ 0x0b7d,      16,     {0x43, 0x87, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22} },
+{ 0x0b8d,      16,     {0xd2, 0x00, 0x75, 0x8e, 0x10, 0xe4, 0x90, 0x7f, 0x92, 0xf0, 0x12, 0x10, 0x0c, 0x12, 0x08, 0xec} },
+{ 0x0b9d,      13,     {0x12, 0x0e, 0xa9, 0x12, 0x90, 0xe6, 0x12, 0x1b, 0x0c, 0x12, 0x0a, 0x58, 0x22} },
+{ 0x0baa,      16,     {0xc0, 0xe0, 0xc0, 0x83, 0xc0, 0x82, 0xd2, 0x01, 0x53, 0x91, 0xef, 0x90, 0x7f, 0xab, 0x74, 0x01} },
+{ 0x0bba,      8,      {0xf0, 0xd0, 0x82, 0xd0, 0x83, 0xd0, 0xe0, 0x32} },
+{ 0x0bc2,      16,     {0xc0, 0xe0, 0xc0, 0x83, 0xc0, 0x82, 0x90, 0x7f, 0xc4, 0xe4, 0xf0, 0x53, 0x91, 0xef, 0x90, 0x7f} },
+{ 0x0bd2,      11,     {0xab, 0x74, 0x04, 0xf0, 0xd0, 0x82, 0xd0, 0x83, 0xd0, 0xe0, 0x32} },
+{ 0x0bdd,      16,     {0xc0, 0xe0, 0xc0, 0x83, 0xc0, 0x82, 0x53, 0x91, 0xef, 0x90, 0x7f, 0xab, 0x74, 0x02, 0xf0, 0x90} },
+{ 0x0bed,      16,     {0x7f, 0xd8, 0xe0, 0x70, 0x0d, 0x90, 0x7f, 0xd9, 0xe0, 0x70, 0x07, 0xe5, 0x2b, 0x70, 0x03, 0x75} },
+{ 0x0bfd,      9,      {0x2b, 0x14, 0xd0, 0x82, 0xd0, 0x83, 0xd0, 0xe0, 0x32} },
+{ 0x0c06,      16,     {0xc0, 0xe0, 0xc0, 0x83, 0xc0, 0x82, 0x53, 0x91, 0xef, 0x90, 0x7f, 0xab, 0x74, 0x10, 0xf0, 0xd0} },
+{ 0x0c16,      6,      {0x82, 0xd0, 0x83, 0xd0, 0xe0, 0x32} },
+{ 0x0c1c,      16,     {0xc0, 0xe0, 0xc0, 0x83, 0xc0, 0x82, 0x30, 0x02, 0x02, 0xd2, 0x06, 0x53, 0x91, 0xef, 0x90, 0x7f} },
+{ 0x0c2c,      11,     {0xab, 0x74, 0x08, 0xf0, 0xd0, 0x82, 0xd0, 0x83, 0xd0, 0xe0, 0x32} },
+{ 0x0c37,      16,     {0xc0, 0xe0, 0xc0, 0x83, 0xc0, 0x82, 0xc0, 0xd0, 0x75, 0xd0, 0x10, 0x53, 0x91, 0xef, 0x90, 0x7f} },
+{ 0x0c47,      16,     {0xa9, 0x74, 0x02, 0xf0, 0xe5, 0x30, 0x30, 0xe0, 0x13, 0xe5, 0x3b, 0x30, 0xe0, 0x07, 0x90, 0x20} },
+{ 0x0c57,      16,     {0x04, 0xe0, 0x44, 0x01, 0xf0, 0x90, 0x20, 0x01, 0xe0, 0x44, 0x01, 0xf0, 0xe5, 0x2b, 0x70, 0x03} },
+{ 0x0c67,      12,     {0x75, 0x2b, 0x14, 0xd0, 0xd0, 0xd0, 0x82, 0xd0, 0x83, 0xd0, 0xe0, 0x32} },
+{ 0x0c73,      16,     {0xc0, 0xe0, 0xc0, 0x83, 0xc0, 0x82, 0xc0, 0xd0, 0x75, 0xd0, 0x10, 0x53, 0x91, 0xef, 0x90, 0x7f} },
+{ 0x0c83,      16,     {0xa9, 0x74, 0x04, 0xf0, 0xe5, 0x30, 0x30, 0xe1, 0x13, 0xe5, 0x3b, 0x30, 0xe1, 0x07, 0x90, 0x20} },
+{ 0x0c93,      16,     {0x0c, 0xe0, 0x44, 0x01, 0xf0, 0x90, 0x20, 0x09, 0xe0, 0x44, 0x01, 0xf0, 0xe5, 0x2b, 0x70, 0x03} },
+{ 0x0ca3,      12,     {0x75, 0x2b, 0x14, 0xd0, 0xd0, 0xd0, 0x82, 0xd0, 0x83, 0xd0, 0xe0, 0x32} },
+{ 0x0caf,      16,     {0xc0, 0xe0, 0xc0, 0x83, 0xc0, 0x82, 0xc0, 0xd0, 0x75, 0xd0, 0x10, 0x53, 0x91, 0xef, 0x90, 0x7f} },
+{ 0x0cbf,      16,     {0xa9, 0x74, 0x08, 0xf0, 0xe5, 0x30, 0x30, 0xe2, 0x13, 0xe5, 0x3b, 0x30, 0xe2, 0x07, 0x90, 0x20} },
+{ 0x0ccf,      16,     {0x14, 0xe0, 0x44, 0x01, 0xf0, 0x90, 0x20, 0x11, 0xe0, 0x44, 0x01, 0xf0, 0xe5, 0x2b, 0x70, 0x03} },
+{ 0x0cdf,      12,     {0x75, 0x2b, 0x14, 0xd0, 0xd0, 0xd0, 0x82, 0xd0, 0x83, 0xd0, 0xe0, 0x32} },
+{ 0x0ceb,      16,     {0xc0, 0xe0, 0xc0, 0x83, 0xc0, 0x82, 0xc0, 0xd0, 0x75, 0xd0, 0x10, 0x53, 0x91, 0xef, 0x90, 0x7f} },
+{ 0x0cfb,      16,     {0xa9, 0x74, 0x10, 0xf0, 0xe5, 0x30, 0x30, 0xe3, 0x13, 0xe5, 0x3b, 0x30, 0xe3, 0x07, 0x90, 0x20} },
+{ 0x0d0b,      16,     {0x1c, 0xe0, 0x44, 0x01, 0xf0, 0x90, 0x20, 0x19, 0xe0, 0x44, 0x01, 0xf0, 0xe5, 0x2b, 0x70, 0x03} },
+{ 0x0d1b,      12,     {0x75, 0x2b, 0x14, 0xd0, 0xd0, 0xd0, 0x82, 0xd0, 0x83, 0xd0, 0xe0, 0x32} },
+{ 0x0d27,      16,     {0xc0, 0xe0, 0xc0, 0x83, 0xc0, 0x82, 0xc0, 0x85, 0xc0, 0x84, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xc0} },
+{ 0x0d37,      16,     {0xd0, 0x75, 0xd0, 0x10, 0x53, 0x91, 0xef, 0x90, 0x7f, 0xaa, 0x74, 0x02, 0xf0, 0xe5, 0x30, 0x20} },
+{ 0x0d47,      16,     {0xe0, 0x06, 0x90, 0x7f, 0xc7, 0xf0, 0x80, 0x16, 0xe5, 0x3b, 0x30, 0xe0, 0x0a, 0x90, 0x7f, 0xc7} },
+{ 0x0d57,      16,     {0xe0, 0x90, 0x02, 0xf8, 0xf0, 0x80, 0x07, 0x90, 0x20, 0x01, 0xe0, 0x44, 0x02, 0xf0, 0xe5, 0x2b} },
+{ 0x0d67,      16,     {0x70, 0x03, 0x75, 0x2b, 0x14, 0xd0, 0xd0, 0xd0, 0x86, 0xd0, 0x84, 0xd0, 0x85, 0xd0, 0x82, 0xd0} },
+{ 0x0d77,      4,      {0x83, 0xd0, 0xe0, 0x32} },
+{ 0x0d7b,      16,     {0xc0, 0xe0, 0xc0, 0x83, 0xc0, 0x82, 0xc0, 0x85, 0xc0, 0x84, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xc0} },
+{ 0x0d8b,      16,     {0xd0, 0x75, 0xd0, 0x10, 0x53, 0x91, 0xef, 0x90, 0x7f, 0xaa, 0x74, 0x04, 0xf0, 0xe5, 0x30, 0x20} },
+{ 0x0d9b,      16,     {0xe1, 0x06, 0x90, 0x7f, 0xc9, 0xf0, 0x80, 0x16, 0xe5, 0x3b, 0x30, 0xe1, 0x0a, 0x90, 0x7f, 0xc9} },
+{ 0x0dab,      16,     {0xe0, 0x90, 0x02, 0xf9, 0xf0, 0x80, 0x07, 0x90, 0x20, 0x09, 0xe0, 0x44, 0x02, 0xf0, 0xe5, 0x2b} },
+{ 0x0dbb,      16,     {0x70, 0x03, 0x75, 0x2b, 0x14, 0xd0, 0xd0, 0xd0, 0x86, 0xd0, 0x84, 0xd0, 0x85, 0xd0, 0x82, 0xd0} },
+{ 0x0dcb,      4,      {0x83, 0xd0, 0xe0, 0x32} },
+{ 0x0dcf,      16,     {0xc0, 0xe0, 0xc0, 0x83, 0xc0, 0x82, 0xc0, 0x85, 0xc0, 0x84, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xc0} },
+{ 0x0ddf,      16,     {0xd0, 0x75, 0xd0, 0x10, 0x53, 0x91, 0xef, 0x90, 0x7f, 0xaa, 0x74, 0x08, 0xf0, 0xe5, 0x30, 0x20} },
+{ 0x0def,      16,     {0xe2, 0x06, 0x90, 0x7f, 0xcb, 0xf0, 0x80, 0x16, 0xe5, 0x3b, 0x30, 0xe2, 0x0a, 0x90, 0x7f, 0xcb} },
+{ 0x0dff,      16,     {0xe0, 0x90, 0x02, 0xfa, 0xf0, 0x80, 0x07, 0x90, 0x20, 0x11, 0xe0, 0x44, 0x02, 0xf0, 0xe5, 0x2b} },
+{ 0x0e0f,      16,     {0x70, 0x03, 0x75, 0x2b, 0x14, 0xd0, 0xd0, 0xd0, 0x86, 0xd0, 0x84, 0xd0, 0x85, 0xd0, 0x82, 0xd0} },
+{ 0x0e1f,      4,      {0x83, 0xd0, 0xe0, 0x32} },
+{ 0x0e23,      16,     {0xc0, 0xe0, 0xc0, 0x83, 0xc0, 0x82, 0xc0, 0x85, 0xc0, 0x84, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xc0} },
+{ 0x0e33,      16,     {0xd0, 0x75, 0xd0, 0x10, 0x53, 0x91, 0xef, 0x90, 0x7f, 0xaa, 0x74, 0x10, 0xf0, 0xe5, 0x30, 0x20} },
+{ 0x0e43,      16,     {0xe3, 0x06, 0x90, 0x7f, 0xcd, 0xf0, 0x80, 0x16, 0xe5, 0x3b, 0x30, 0xe3, 0x0a, 0x90, 0x7f, 0xcd} },
+{ 0x0e53,      16,     {0xe0, 0x90, 0x02, 0xfb, 0xf0, 0x80, 0x07, 0x90, 0x20, 0x19, 0xe0, 0x44, 0x02, 0xf0, 0xe5, 0x2b} },
+{ 0x0e63,      16,     {0x70, 0x03, 0x75, 0x2b, 0x14, 0xd0, 0xd0, 0xd0, 0x86, 0xd0, 0x84, 0xd0, 0x85, 0xd0, 0x82, 0xd0} },
+{ 0x0e73,      4,      {0x83, 0xd0, 0xe0, 0x32} },
+{ 0x0e77,      16,     {0xc0, 0xe0, 0xc0, 0x83, 0xc0, 0x82, 0x53, 0x91, 0xef, 0x90, 0x7f, 0xa9, 0x74, 0x80, 0xf0, 0xd0} },
+{ 0x0e87,      6,      {0x82, 0xd0, 0x83, 0xd0, 0xe0, 0x32} },
+{ 0x0e8d,      16,     {0xc0, 0xe0, 0xc0, 0x83, 0xc0, 0x82, 0x53, 0x91, 0xef, 0x90, 0x7f, 0xaa, 0x74, 0x80, 0xf0, 0x90} },
+{ 0x0e9d,      12,     {0x01, 0xbd, 0x74, 0xff, 0xf0, 0xd0, 0x82, 0xd0, 0x83, 0xd0, 0xe0, 0x32} },
+{ 0x0ea9,      16,     {0x90, 0x01, 0x20, 0x12, 0x9d, 0x31, 0x00, 0x00, 0x25, 0x80, 0x90, 0x01, 0x24, 0x74, 0x08, 0xf0} },
+{ 0x0eb9,      16,     {0xa3, 0x74, 0x01, 0xf0, 0xa3, 0x74, 0x6e, 0xf0, 0xa3, 0xf0, 0xa3, 0x74, 0x13, 0xf0, 0xa3, 0x74} },
+{ 0x0ec9,      16,     {0x11, 0xf0, 0xe4, 0xa3, 0xf0, 0xa3, 0xf0, 0x90, 0x01, 0x1e, 0xf0, 0x90, 0x01, 0x1e, 0xe0, 0xff} },
+{ 0x0ed9,      16,     {0xc3, 0x94, 0x04, 0x50, 0x13, 0xef, 0x04, 0xa3, 0xf0, 0x7e, 0x01, 0x7f, 0x1f, 0x12, 0x85, 0xe1} },
+{ 0x0ee9,      16,     {0x90, 0x01, 0x1e, 0xe0, 0x04, 0xf0, 0x80, 0xe3, 0xe4, 0xf5, 0x26, 0x90, 0x01, 0x1e, 0xf0, 0x90} },
+{ 0x0ef9,      16,     {0x01, 0x1e, 0xe0, 0xff, 0xc3, 0x94, 0x04, 0x50, 0x1a, 0x74, 0xf8, 0x2f, 0xf5, 0x82, 0xe4, 0x34} },
+{ 0x0f09,      16,     {0x02, 0xf5, 0x83, 0xe4, 0xf0, 0x74, 0x22, 0x2f, 0xf8, 0xe4, 0xf6, 0x90, 0x01, 0x1e, 0xe0, 0x04} },
+{ 0x0f19,      16,     {0xf0, 0x80, 0xdc, 0xe4, 0xf5, 0x30, 0xe5, 0xc0, 0x60, 0x2f, 0x90, 0x01, 0x1e, 0x74, 0x01, 0xf0} },
+{ 0x0f29,      16,     {0x90, 0x01, 0x1e, 0xe0, 0xff, 0xd3, 0x94, 0x04, 0x50, 0x1f, 0xef, 0x14, 0xff, 0x74, 0x01, 0xa8} },
+{ 0x0f39,      16,     {0x07, 0x08, 0x80, 0x02, 0xc3, 0x33, 0xd8, 0xfc, 0x42, 0x30, 0x7e, 0x01, 0x7f, 0x1e, 0x12, 0x83} },
+{ 0x0f49,      16,     {0x5f, 0x90, 0x01, 0x1e, 0xe0, 0x04, 0xf0, 0x80, 0xd7, 0xe4, 0xf5, 0x3a, 0x90, 0x01, 0x1e, 0xf0} },
+{ 0x0f59,      16,     {0x90, 0x01, 0x1e, 0xe0, 0xff, 0x75, 0xf0, 0x08, 0xa4, 0x24, 0x06, 0xf5, 0x82, 0xe4, 0x34, 0x20} },
+{ 0x0f69,      16,     {0xf5, 0x83, 0xe0, 0x54, 0xf0, 0xfe, 0x74, 0xc5, 0x2f, 0xf5, 0x82, 0xe4, 0x34, 0x01, 0xf5, 0x83} },
+{ 0x0f79,      16,     {0xee, 0xf0, 0x74, 0x36, 0x2f, 0xf8, 0xa6, 0x06, 0x74, 0x32, 0x2f, 0xf8, 0xe4, 0xf6, 0x74, 0x2c} },
+{ 0x0f89,      16,     {0x2f, 0xf8, 0xe4, 0xf6, 0x74, 0xfc, 0x2f, 0xf5, 0x82, 0xe4, 0x34, 0x02, 0xf5, 0x83, 0xe4, 0xf0} },
+{ 0x0f99,      16,     {0x90, 0x01, 0x1e, 0xe0, 0x04, 0xf0, 0xe0, 0xb4, 0x04, 0xb6, 0x90, 0x20, 0x60, 0xe0, 0x54, 0x0f} },
+{ 0x0fa9,      16,     {0xf5, 0x4b, 0x60, 0x5e, 0xe4, 0x90, 0x01, 0x1e, 0xf0, 0x90, 0x01, 0x1e, 0xe0, 0xff, 0xc3, 0x94} },
+{ 0x0fb9,      16,     {0x04, 0x50, 0xe7, 0x74, 0x01, 0xa8, 0x07, 0x08, 0x80, 0x02, 0xc3, 0x33, 0xd8, 0xfc, 0x55, 0x4b} },
+{ 0x0fc9,      16,     {0x60, 0x38, 0x90, 0x01, 0x1e, 0xe0, 0xff, 0x75, 0xf0, 0x08, 0xa4, 0x24, 0x02, 0xf5, 0x82, 0xe4} },
+{ 0x0fd9,      16,     {0x34, 0x20, 0xf5, 0x83, 0xe0, 0xfe, 0xef, 0x75, 0xf0, 0x08, 0xa4, 0x24, 0x05, 0xf5, 0x82, 0xe4} },
+{ 0x0fe9,      16,     {0x34, 0x20, 0xf5, 0x83, 0xe0, 0xef, 0x75, 0xf0, 0x08, 0xa4, 0x24, 0x06, 0xf5, 0x82, 0xe4, 0x34} },
+{ 0x0ff9,      16,     {0x20, 0xf5, 0x83, 0xe0, 0xfe, 0x7d, 0x06, 0x12, 0x82, 0xd5, 0x90, 0x01, 0x1e, 0xe0, 0x04, 0xf0} },
+{ 0x1009,      3,      {0x80, 0xa7, 0x22} },
+{ 0x100c,      16,     {0x7b, 0xff, 0x7a, 0x12, 0x79, 0x1b, 0x90, 0x00, 0x04, 0x12, 0x9b, 0x8b, 0xfd, 0x8b, 0x4d, 0x75} },
+{ 0x101c,      16,     {0x4e, 0x12, 0x75, 0x4f, 0x24, 0xe4, 0x90, 0x7f, 0xe1, 0xf0, 0x90, 0x7f, 0xe0, 0xf0, 0xf5, 0x4b} },
+{ 0x102c,      16,     {0xf5, 0x4c, 0x90, 0x02, 0xae, 0xf0, 0x90, 0x7f, 0xdf, 0xf0, 0x90, 0x7f, 0xde, 0xf0, 0x90, 0x7f} },
+{ 0x103c,      16,     {0xa9, 0x74, 0xff, 0xf0, 0x90, 0x7f, 0xaa, 0xf0, 0xe4, 0xfc, 0xec, 0x25, 0xe0, 0x24, 0xb4, 0xf5} },
+{ 0x104c,      16,     {0x82, 0xe4, 0x34, 0x7f, 0xf5, 0x83, 0xe4, 0xf0, 0x0c, 0xbc, 0x10, 0xee, 0xe4, 0x90, 0x7f, 0xdd} },
+{ 0x105c,      16,     {0xf0, 0xaf, 0x05, 0x1d, 0xef, 0x70, 0x03, 0x02, 0x11, 0xd2, 0xab, 0x4d, 0xaa, 0x4e, 0xa9, 0x4f} },
+{ 0x106c,      16,     {0x90, 0x00, 0x01, 0x12, 0x9b, 0x8b, 0x64, 0x05, 0x60, 0x03, 0x02, 0x11, 0xc1, 0x90, 0x00, 0x03} },
+{ 0x107c,      16,     {0x12, 0x9b, 0x8b, 0x64, 0x01, 0x60, 0x03, 0x02, 0x11, 0x48, 0x90, 0x00, 0x02, 0x12, 0x9b, 0x8b} },
+{ 0x108c,      16,     {0xff, 0x54, 0x7f, 0xfc, 0xd3, 0x94, 0x07, 0x50, 0x03, 0x02, 0x11, 0x22, 0xec, 0xc3, 0x94, 0x10} },
+{ 0x109c,      16,     {0x40, 0x03, 0x02, 0x11, 0x22, 0xef, 0x30, 0xe7, 0x42, 0xe5, 0x4c, 0xae, 0x4b, 0x78, 0x02, 0xce} },
+{ 0x10ac,      16,     {0xc3, 0x13, 0xce, 0x13, 0xd8, 0xf9, 0xff, 0x74, 0xf0, 0x2c, 0xf5, 0x82, 0xe4, 0x34, 0x7f, 0xf5} },
+{ 0x10bc,      16,     {0x83, 0xef, 0xf0, 0x90, 0x7f, 0xe0, 0xe0, 0xff, 0xec, 0x24, 0xf8, 0xfe, 0x74, 0x01, 0xa8, 0x06} },
+{ 0x10cc,      16,     {0x08, 0x80, 0x02, 0xc3, 0x33, 0xd8, 0xfc, 0x4f, 0x90, 0x7f, 0xe0, 0xf0, 0x90, 0x02, 0xae, 0xe0} },
+{ 0x10dc,      16,     {0x04, 0xf0, 0x90, 0x7f, 0xdd, 0xe0, 0x44, 0x80, 0xf0, 0x80, 0x3e, 0xe5, 0x4c, 0xae, 0x4b, 0x78} },
+{ 0x10ec,      16,     {0x02, 0xce, 0xc3, 0x13, 0xce, 0x13, 0xd8, 0xf9, 0xff, 0x74, 0xe8, 0x2c, 0xf5, 0x82, 0xe4, 0x34} },
+{ 0x10fc,      16,     {0x7f, 0xf5, 0x83, 0xef, 0xf0, 0x90, 0x7f, 0xe1, 0xe0, 0xff, 0xec, 0x24, 0xf8, 0xfe, 0x74, 0x01} },
+{ 0x110c,      16,     {0xa8, 0x06, 0x08, 0x80, 0x02, 0xc3, 0x33, 0xd8, 0xfc, 0x4f, 0x90, 0x7f, 0xe1, 0xf0, 0x90, 0x02} },
+{ 0x111c,      16,     {0xae, 0xe0, 0x04, 0xf0, 0x80, 0x03, 0x7f, 0xff, 0x22, 0x90, 0x00, 0x04, 0x12, 0x9b, 0x8b, 0x25} },
+{ 0x112c,      16,     {0x4c, 0xf5, 0x4c, 0xe4, 0x35, 0x4b, 0xf5, 0x4b, 0x90, 0x00, 0x05, 0x12, 0x9b, 0x8b, 0xfe, 0xe4} },
+{ 0x113c,      16,     {0x25, 0x4c, 0xf5, 0x4c, 0xee, 0x35, 0x4b, 0xf5, 0x4b, 0x02, 0x11, 0xc4, 0xab, 0x4d, 0xaa, 0x4e} },
+{ 0x114c,      16,     {0xa9, 0x4f, 0x90, 0x00, 0x03, 0x12, 0x9b, 0x8b, 0xff, 0x64, 0x02, 0x60, 0x05, 0xef, 0x64, 0x03} },
+{ 0x115c,      16,     {0x70, 0x60, 0x90, 0x00, 0x02, 0x12, 0x9b, 0x8b, 0xff, 0x54, 0x7f, 0xfc, 0xd3, 0x94, 0x07, 0x50} },
+{ 0x116c,      16,     {0x4e, 0xef, 0x30, 0xe7, 0x1e, 0x90, 0x7f, 0xde, 0xe0, 0xff, 0x74, 0x01, 0xa8, 0x04, 0x08, 0x80} },
+{ 0x117c,      16,     {0x02, 0xc3, 0x33, 0xd8, 0xfc, 0xfe, 0x4f, 0x90, 0x7f, 0xde, 0xf0, 0x90, 0x7f, 0xac, 0xe0, 0x4e} },
+{ 0x118c,      16,     {0xf0, 0x80, 0x35, 0x90, 0x7f, 0xdf, 0xe0, 0xff, 0x74, 0x01, 0xa8, 0x04, 0x08, 0x80, 0x02, 0xc3} },
+{ 0x119c,      16,     {0x33, 0xd8, 0xfc, 0xfe, 0x4f, 0x90, 0x7f, 0xdf, 0xf0, 0x90, 0x7f, 0xad, 0xe0, 0x4e, 0xf0, 0xec} },
+{ 0x11ac,      16,     {0x25, 0xe0, 0x24, 0xc5, 0xf5, 0x82, 0xe4, 0x34, 0x7f, 0xf5, 0x83, 0xec, 0xf0, 0x80, 0x09, 0x7f} },
+{ 0x11bc,      16,     {0xff, 0x22, 0x7f, 0xff, 0x22, 0x7f, 0xff, 0x22, 0x74, 0x07, 0x25, 0x4f, 0xf5, 0x4f, 0xe4, 0x35} },
+{ 0x11cc,      16,     {0x4e, 0xf5, 0x4e, 0x02, 0x10, 0x5d, 0x20, 0x03, 0x0d, 0x90, 0x02, 0xae, 0xe0, 0x60, 0x07, 0x90} },
+{ 0x11dc,      8,      {0x7f, 0xae, 0xe0, 0x44, 0x02, 0xf0, 0x7f, 0x00} },
+{ 0x11e4,      1,      {0x22} },
+{ 0x11e5,      16,     {0x8f, 0x82, 0x8e, 0x83, 0xe0, 0x14, 0xff, 0x74, 0x01, 0xa8, 0x07, 0x08, 0x80, 0x02, 0xc3, 0x33} },
+{ 0x11f5,      7,      {0xd8, 0xfc, 0x42, 0x3a, 0x7f, 0x00, 0x22} },
+{ 0x11fc,      3,      {0x00, 0x03, 0x15} },
+{ 0x1200,      16,     {0x12, 0x01, 0x00, 0x01, 0xff, 0xff, 0xff, 0x40, 0x10, 0x07, 0x01, 0x80, 0x42, 0x00, 0x01, 0x02} },
+{ 0x1210,      16,     {0x03, 0x01, 0x09, 0x02, 0x58, 0x00, 0x01, 0x01, 0x04, 0x80, 0x3c, 0x09, 0x04, 0x00, 0x00, 0x0a} },
+{ 0x1220,      16,     {0xff, 0xff, 0xff, 0x05, 0x07, 0x05, 0x81, 0x02, 0x40, 0x00, 0x00, 0x07, 0x05, 0x01, 0x02, 0x40} },
+{ 0x1230,      16,     {0x00, 0x00, 0x07, 0x05, 0x82, 0x02, 0x40, 0x00, 0x00, 0x07, 0x05, 0x02, 0x02, 0x40, 0x00, 0x00} },
+{ 0x1240,      16,     {0x07, 0x05, 0x83, 0x02, 0x40, 0x00, 0x00, 0x07, 0x05, 0x03, 0x02, 0x40, 0x00, 0x00, 0x07, 0x05} },
+{ 0x1250,      16,     {0x84, 0x02, 0x40, 0x00, 0x00, 0x07, 0x05, 0x04, 0x02, 0x40, 0x00, 0x00, 0x07, 0x05, 0x87, 0x02} },
+{ 0x1260,      16,     {0x40, 0x00, 0x00, 0x07, 0x05, 0x07, 0x02, 0x40, 0x00, 0x00, 0x04, 0x03, 0x09, 0x04, 0x24, 0x03} },
+{ 0x1270,      16,     {0x43, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x6e, 0x00, 0x65, 0x00, 0x63, 0x00, 0x74, 0x00, 0x20, 0x00} },
+{ 0x1280,      16,     {0x54, 0x00, 0x65, 0x00, 0x63, 0x00, 0x68, 0x00, 0x20, 0x00, 0x49, 0x00, 0x6e, 0x00, 0x63, 0x00} },
+{ 0x1290,      16,     {0x2e, 0x00, 0x18, 0x03, 0x57, 0x00, 0x68, 0x00, 0x69, 0x00, 0x74, 0x00, 0x65, 0x00, 0x48, 0x00} },
+{ 0x12a0,      16,     {0x45, 0x00, 0x41, 0x00, 0x54, 0x00, 0x2d, 0x00, 0x34, 0x00, 0x1a, 0x03, 0x58, 0x00, 0x58, 0x00} },
+{ 0x12b0,      16,     {0x2d, 0x00, 0x58, 0x00, 0x58, 0x00, 0x2d, 0x00, 0x58, 0x00, 0x58, 0x00, 0x58, 0x00, 0x58, 0x00} },
+{ 0x12c0,      16,     {0x58, 0x00, 0x58, 0x00, 0x2a, 0x03, 0x43, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x66, 0x00, 0x69, 0x00} },
+{ 0x12d0,      16,     {0x67, 0x00, 0x75, 0x00, 0x72, 0x00, 0x61, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6f, 0x00, 0x6e, 0x00} },
+{ 0x12e0,      16,     {0x20, 0x00, 0x53, 0x00, 0x74, 0x00, 0x72, 0x00, 0x69, 0x00, 0x6e, 0x00, 0x67, 0x00, 0x22, 0x03} },
+{ 0x12f0,      16,     {0x49, 0x00, 0x6e, 0x00, 0x74, 0x00, 0x65, 0x00, 0x72, 0x00, 0x66, 0x00, 0x61, 0x00, 0x63, 0x00} },
+{ 0x1300,      16,     {0x65, 0x00, 0x20, 0x00, 0x53, 0x00, 0x74, 0x00, 0x72, 0x00, 0x69, 0x00, 0x6e, 0x00, 0x67, 0x00} },
+{ 0x1310,      2,      {0x00, 0x00} },
+{ 0x1312,      16,     {0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x83, 0xc0, 0x82, 0xc0, 0x85, 0xc0, 0x84, 0xc0, 0x86, 0xc0, 0xd0} },
+{ 0x1322,      16,     {0x75, 0x86, 0x00, 0x75, 0xd0, 0x18, 0x90, 0x20, 0x60, 0xe0, 0x54, 0x0f, 0xf5, 0xf0, 0x70, 0x11} },
+{ 0x1332,      16,     {0xd0, 0xd0, 0xd0, 0x86, 0xd0, 0x84, 0xd0, 0x85, 0xd0, 0x82, 0xd0, 0x83, 0xd0, 0xf0, 0xd0, 0xe0} },
+{ 0x1342,      16,     {0x32, 0x75, 0x86, 0x00, 0x10, 0xf0, 0x0b, 0x10, 0xf1, 0x12, 0x10, 0xf2, 0x19, 0x10, 0xf3, 0x20} },
+{ 0x1352,      16,     {0x80, 0xd4, 0xe5, 0x27, 0x70, 0x03, 0x75, 0x27, 0x14, 0x02, 0x13, 0x7c, 0xe5, 0x28, 0x70, 0x03} },
+{ 0x1362,      16,     {0x75, 0x28, 0x14, 0x02, 0x15, 0x0d, 0xe5, 0x29, 0x70, 0x03, 0x75, 0x29, 0x14, 0x02, 0x16, 0x9e} },
+{ 0x1372,      16,     {0xe5, 0x2a, 0x70, 0x03, 0x75, 0x2a, 0x14, 0x02, 0x18, 0x2f, 0x90, 0x20, 0x02, 0xe0, 0x54, 0x3f} },
+{ 0x1382,      16,     {0x20, 0xe2, 0x3a, 0x20, 0xe1, 0x0b, 0x20, 0xe4, 0x0b, 0x20, 0xe5, 0x14, 0x60, 0x09, 0x02, 0x13} },
+{ 0x1392,      16,     {0x43, 0x02, 0x14, 0x65, 0x02, 0x13, 0x43, 0x43, 0x82, 0x04, 0xe0, 0xf5, 0x36, 0x02, 0x13, 0x43} },
+{ 0x13a2,      16,     {0x43, 0x82, 0x04, 0xe0, 0x43, 0x2c, 0x01, 0x02, 0x13, 0x43, 0x53, 0x82, 0xf8, 0x43, 0x82, 0x05} },
+{ 0x13b2,      16,     {0xe0, 0x42, 0x32, 0x53, 0x82, 0xfb, 0xe0, 0x54, 0xfb, 0xf0, 0x02, 0x13, 0x43, 0x30, 0xe1, 0x02} },
+{ 0x13c2,      16,     {0x80, 0xe8, 0xf5, 0x85, 0xe5, 0x3b, 0x30, 0xe0, 0x0a, 0x53, 0x82, 0xf8, 0x43, 0x82, 0x04, 0xe0} },
+{ 0x13d2,      16,     {0x54, 0xfe, 0xf0, 0xe5, 0x85, 0x20, 0xe3, 0x56, 0x90, 0x20, 0x50, 0x74, 0x00, 0xf0, 0x90, 0x20} },
+{ 0x13e2,      16,     {0x58, 0x74, 0x01, 0xf0, 0x90, 0x7f, 0xe2, 0xe0, 0x44, 0x40, 0xf0, 0x90, 0x7f, 0xe3, 0x05, 0x86} },
+{ 0x13f2,      16,     {0x90, 0x7e, 0x80, 0x05, 0x86, 0xe5, 0x85, 0xf0, 0xa3, 0xe5, 0x84, 0xf0, 0x05, 0x86, 0x90, 0x7f} },
+{ 0x1402,      16,     {0xe5, 0xe5, 0x3c, 0xfd, 0x03, 0x03, 0x03, 0xfe, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0} },
+{ 0x1412,      16,     {0xde, 0xf6, 0x90, 0x7f, 0xe2, 0xe0, 0x54, 0xbf, 0xf0, 0x90, 0x20, 0x58, 0x74, 0x00, 0xf0, 0x90} },
+{ 0x1422,      16,     {0x7f, 0xb7, 0xed, 0xf0, 0x90, 0x20, 0x01, 0xe0, 0x54, 0xfe, 0xf0, 0x02, 0x13, 0x43, 0x7f, 0x40} },
+{ 0x1432,      16,     {0x90, 0x7e, 0x80, 0x05, 0x86, 0x90, 0x20, 0x00, 0xe5, 0x84, 0xfe, 0x24, 0x05, 0xfd, 0x8d, 0x84} },
+{ 0x1442,      16,     {0xe0, 0x8e, 0x84, 0x30, 0xe0, 0x09, 0xe0, 0x05, 0x86, 0xf0, 0xa3, 0x05, 0x86, 0xdf, 0xef, 0x05} },
+{ 0x1452,      16,     {0x86, 0xc3, 0x74, 0x40, 0x9f, 0x90, 0x7f, 0xb7, 0xf0, 0x05, 0x86, 0xa3, 0xe0, 0x54, 0xfe, 0xf0} },
+{ 0x1462,      16,     {0x02, 0x13, 0x43, 0x53, 0x2c, 0xfa, 0xe5, 0x22, 0x60, 0x08, 0x75, 0x22, 0x00, 0xd2, 0xe7, 0xfe} },
+{ 0x1472,      16,     {0x80, 0x0a, 0x90, 0x7f, 0xc7, 0xe0, 0xfe, 0x70, 0x03, 0x02, 0x14, 0xff, 0x90, 0x20, 0x50, 0x74} },
+{ 0x1482,      16,     {0x00, 0xf0, 0x90, 0x20, 0x58, 0x74, 0x01, 0xf0, 0x90, 0x7f, 0xe2, 0xe0, 0x44, 0x40, 0xf0, 0x90} },
+{ 0x1492,      16,     {0x7f, 0xe3, 0x05, 0x86, 0x90, 0x7e, 0x40, 0x05, 0x86, 0xe5, 0x85, 0xf0, 0xa3, 0xe5, 0x84, 0xf0} },
+{ 0x14a2,      16,     {0x05, 0x86, 0x90, 0x7f, 0xe5, 0xee, 0x30, 0xe7, 0x08, 0x05, 0x86, 0xe0, 0x24, 0x38, 0xf0, 0x05} },
+{ 0x14b2,      16,     {0x86, 0xee, 0x54, 0x7f, 0xfe, 0x54, 0x07, 0xfb, 0xee, 0x54, 0x78, 0x60, 0x30, 0x03, 0x03, 0x03} },
+{ 0x14c2,      16,     {0x30, 0xe3, 0x04, 0x74, 0x07, 0x7b, 0x08, 0xfd, 0xfc, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0} },
+{ 0x14d2,      16,     {0xe0, 0xdd, 0xf6, 0xeb, 0xfe, 0x60, 0x19, 0xec, 0x64, 0x07, 0x70, 0x11, 0x8b, 0x22, 0x90, 0x7f} },
+{ 0x14e2,      16,     {0xe2, 0xe0, 0x54, 0xbf, 0xf0, 0x90, 0x20, 0x58, 0x74, 0x00, 0xf0, 0x80, 0x1b, 0xe0, 0xde, 0xfd} },
+{ 0x14f2,      16,     {0x90, 0x7f, 0xe2, 0xe0, 0x54, 0xbf, 0xf0, 0x90, 0x20, 0x58, 0x74, 0x00, 0xf0, 0x90, 0x20, 0x01} },
+{ 0x1502,      16,     {0xe0, 0x54, 0xfd, 0xf0, 0x90, 0x7f, 0xc7, 0xf0, 0x02, 0x13, 0x43, 0x90, 0x20, 0x0a, 0xe0, 0x54} },
+{ 0x1512,      16,     {0x3f, 0x20, 0xe2, 0x3a, 0x20, 0xe1, 0x0b, 0x20, 0xe4, 0x0b, 0x20, 0xe5, 0x14, 0x60, 0x09, 0x02} },
+{ 0x1522,      16,     {0x13, 0x43, 0x02, 0x15, 0xf6, 0x02, 0x13, 0x43, 0x43, 0x82, 0x04, 0xe0, 0xf5, 0x37, 0x02, 0x13} },
+{ 0x1532,      16,     {0x43, 0x43, 0x82, 0x04, 0xe0, 0x43, 0x2d, 0x01, 0x02, 0x13, 0x43, 0x53, 0x82, 0xf8, 0x43, 0x82} },
+{ 0x1542,      16,     {0x05, 0xe0, 0x42, 0x33, 0x53, 0x82, 0xfb, 0xe0, 0x54, 0xfb, 0xf0, 0x02, 0x13, 0x43, 0x30, 0xe1} },
+{ 0x1552,      16,     {0x02, 0x80, 0xe8, 0xf5, 0x85, 0xe5, 0x3b, 0x30, 0xe1, 0x0a, 0x53, 0x82, 0xf8, 0x43, 0x82, 0x04} },
+{ 0x1562,      16,     {0xe0, 0x54, 0xfe, 0xf0, 0xe5, 0x85, 0x20, 0xe3, 0x56, 0x90, 0x20, 0x50, 0x74, 0x01, 0xf0, 0x90} },
+{ 0x1572,      16,     {0x20, 0x58, 0x74, 0x01, 0xf0, 0x90, 0x7f, 0xe2, 0xe0, 0x44, 0x40, 0xf0, 0x90, 0x7f, 0xe3, 0x05} },
+{ 0x1582,      16,     {0x86, 0x90, 0x7e, 0x00, 0x05, 0x86, 0xe5, 0x85, 0xf0, 0xa3, 0xe5, 0x84, 0xf0, 0x05, 0x86, 0x90} },
+{ 0x1592,      16,     {0x7f, 0xe5, 0xe5, 0x3d, 0xfd, 0x03, 0x03, 0x03, 0xfe, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0} },
+{ 0x15a2,      16,     {0xf0, 0xde, 0xf6, 0x90, 0x7f, 0xe2, 0xe0, 0x54, 0xbf, 0xf0, 0x90, 0x20, 0x58, 0x74, 0x00, 0xf0} },
+{ 0x15b2,      16,     {0x90, 0x7f, 0xb9, 0xed, 0xf0, 0x90, 0x20, 0x09, 0xe0, 0x54, 0xfe, 0xf0, 0x02, 0x13, 0x43, 0x7f} },
+{ 0x15c2,      16,     {0x40, 0x90, 0x7e, 0x00, 0x05, 0x86, 0x90, 0x20, 0x08, 0xe5, 0x84, 0xfe, 0x24, 0x05, 0xfd, 0x8d} },
+{ 0x15d2,      16,     {0x84, 0xe0, 0x8e, 0x84, 0x30, 0xe0, 0x09, 0xe0, 0x05, 0x86, 0xf0, 0xa3, 0x05, 0x86, 0xdf, 0xef} },
+{ 0x15e2,      16,     {0x05, 0x86, 0xc3, 0x74, 0x40, 0x9f, 0x90, 0x7f, 0xb9, 0xf0, 0x05, 0x86, 0xa3, 0xe0, 0x54, 0xfe} },
+{ 0x15f2,      16,     {0xf0, 0x02, 0x13, 0x43, 0x53, 0x2d, 0xfa, 0xe5, 0x23, 0x60, 0x08, 0x75, 0x23, 0x00, 0xd2, 0xe7} },
+{ 0x1602,      16,     {0xfe, 0x80, 0x0a, 0x90, 0x7f, 0xc9, 0xe0, 0xfe, 0x70, 0x03, 0x02, 0x16, 0x90, 0x90, 0x20, 0x50} },
+{ 0x1612,      16,     {0x74, 0x01, 0xf0, 0x90, 0x20, 0x58, 0x74, 0x01, 0xf0, 0x90, 0x7f, 0xe2, 0xe0, 0x44, 0x40, 0xf0} },
+{ 0x1622,      16,     {0x90, 0x7f, 0xe3, 0x05, 0x86, 0x90, 0x7d, 0xc0, 0x05, 0x86, 0xe5, 0x85, 0xf0, 0xa3, 0xe5, 0x84} },
+{ 0x1632,      16,     {0xf0, 0x05, 0x86, 0x90, 0x7f, 0xe5, 0xee, 0x30, 0xe7, 0x08, 0x05, 0x86, 0xe0, 0x24, 0x38, 0xf0} },
+{ 0x1642,      16,     {0x05, 0x86, 0xee, 0x54, 0x7f, 0xfe, 0x54, 0x07, 0xfb, 0xee, 0x54, 0x78, 0x60, 0x30, 0x03, 0x03} },
+{ 0x1652,      16,     {0x03, 0x30, 0xe3, 0x04, 0x74, 0x07, 0x7b, 0x08, 0xfd, 0xfc, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0} },
+{ 0x1662,      16,     {0xe0, 0xe0, 0xdd, 0xf6, 0xeb, 0xfe, 0x60, 0x19, 0xec, 0x64, 0x07, 0x70, 0x11, 0x8b, 0x23, 0x90} },
+{ 0x1672,      16,     {0x7f, 0xe2, 0xe0, 0x54, 0xbf, 0xf0, 0x90, 0x20, 0x58, 0x74, 0x00, 0xf0, 0x80, 0x1b, 0xe0, 0xde} },
+{ 0x1682,      14,     {0xfd, 0x90, 0x7f, 0xe2, 0xe0, 0x54, 0xbf, 0xf0, 0x90, 0x20, 0x58, 0x74, 0x00, 0xf0} },
+{ 0x1690,      16,     {0x90, 0x20, 0x09, 0xe0, 0x54, 0xfd, 0xf0, 0x90, 0x7f, 0xc9, 0xf0, 0x02, 0x13, 0x43, 0x90, 0x20} },
+{ 0x16a0,      16,     {0x12, 0xe0, 0x54, 0x3f, 0x20, 0xe2, 0x3a, 0x20, 0xe1, 0x0b, 0x20, 0xe4, 0x0b, 0x20, 0xe5, 0x14} },
+{ 0x16b0,      16,     {0x60, 0x09, 0x02, 0x13, 0x43, 0x02, 0x17, 0x87, 0x02, 0x13, 0x43, 0x43, 0x82, 0x04, 0xe0, 0xf5} },
+{ 0x16c0,      16,     {0x38, 0x02, 0x13, 0x43, 0x43, 0x82, 0x04, 0xe0, 0x43, 0x2e, 0x01, 0x02, 0x13, 0x43, 0x53, 0x82} },
+{ 0x16d0,      16,     {0xf8, 0x43, 0x82, 0x05, 0xe0, 0x42, 0x34, 0x53, 0x82, 0xfb, 0xe0, 0x54, 0xfb, 0xf0, 0x02, 0x13} },
+{ 0x16e0,      16,     {0x43, 0x30, 0xe1, 0x02, 0x80, 0xe8, 0xf5, 0x85, 0xe5, 0x3b, 0x30, 0xe2, 0x0a, 0x53, 0x82, 0xf8} },
+{ 0x16f0,      16,     {0x43, 0x82, 0x04, 0xe0, 0x54, 0xfe, 0xf0, 0xe5, 0x85, 0x20, 0xe3, 0x56, 0x90, 0x20, 0x50, 0x74} },
+{ 0x1700,      16,     {0x02, 0xf0, 0x90, 0x20, 0x58, 0x74, 0x01, 0xf0, 0x90, 0x7f, 0xe2, 0xe0, 0x44, 0x40, 0xf0, 0x90} },
+{ 0x1710,      16,     {0x7f, 0xe3, 0x05, 0x86, 0x90, 0x7d, 0x80, 0x05, 0x86, 0xe5, 0x85, 0xf0, 0xa3, 0xe5, 0x84, 0xf0} },
+{ 0x1720,      16,     {0x05, 0x86, 0x90, 0x7f, 0xe5, 0xe5, 0x3e, 0xfd, 0x03, 0x03, 0x03, 0xfe, 0xf0, 0xf0, 0xf0, 0xf0} },
+{ 0x1730,      16,     {0xf0, 0xf0, 0xf0, 0xf0, 0xde, 0xf6, 0x90, 0x7f, 0xe2, 0xe0, 0x54, 0xbf, 0xf0, 0x90, 0x20, 0x58} },
+{ 0x1740,      16,     {0x74, 0x00, 0xf0, 0x90, 0x7f, 0xbb, 0xed, 0xf0, 0x90, 0x20, 0x11, 0xe0, 0x54, 0xfe, 0xf0, 0x02} },
+{ 0x1750,      16,     {0x13, 0x43, 0x7f, 0x40, 0x90, 0x7d, 0x80, 0x05, 0x86, 0x90, 0x20, 0x10, 0xe5, 0x84, 0xfe, 0x24} },
+{ 0x1760,      16,     {0x05, 0xfd, 0x8d, 0x84, 0xe0, 0x8e, 0x84, 0x30, 0xe0, 0x09, 0xe0, 0x05, 0x86, 0xf0, 0xa3, 0x05} },
+{ 0x1770,      16,     {0x86, 0xdf, 0xef, 0x05, 0x86, 0xc3, 0x74, 0x40, 0x9f, 0x90, 0x7f, 0xbb, 0xf0, 0x05, 0x86, 0xa3} },
+{ 0x1780,      16,     {0xe0, 0x54, 0xfe, 0xf0, 0x02, 0x13, 0x43, 0x53, 0x2e, 0xfa, 0xe5, 0x24, 0x60, 0x08, 0x75, 0x24} },
+{ 0x1790,      16,     {0x00, 0xd2, 0xe7, 0xfe, 0x80, 0x0a, 0x90, 0x7f, 0xcb, 0xe0, 0xfe, 0x70, 0x03, 0x02, 0x18, 0x21} },
+{ 0x17a0,      16,     {0x90, 0x20, 0x50, 0x74, 0x02, 0xf0, 0x90, 0x20, 0x58, 0x74, 0x01, 0xf0, 0x90, 0x7f, 0xe2, 0xe0} },
+{ 0x17b0,      16,     {0x44, 0x40, 0xf0, 0x90, 0x7f, 0xe3, 0x05, 0x86, 0x90, 0x7d, 0x40, 0x05, 0x86, 0xe5, 0x85, 0xf0} },
+{ 0x17c0,      16,     {0xa3, 0xe5, 0x84, 0xf0, 0x05, 0x86, 0x90, 0x7f, 0xe5, 0xee, 0x30, 0xe7, 0x08, 0x05, 0x86, 0xe0} },
+{ 0x17d0,      16,     {0x24, 0x38, 0xf0, 0x05, 0x86, 0xee, 0x54, 0x7f, 0xfe, 0x54, 0x07, 0xfb, 0xee, 0x54, 0x78, 0x60} },
+{ 0x17e0,      16,     {0x30, 0x03, 0x03, 0x03, 0x30, 0xe3, 0x04, 0x74, 0x07, 0x7b, 0x08, 0xfd, 0xfc, 0xe0, 0xe0, 0xe0} },
+{ 0x17f0,      16,     {0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xdd, 0xf6, 0xeb, 0xfe, 0x60, 0x19, 0xec, 0x64, 0x07, 0x70, 0x11} },
+{ 0x1800,      16,     {0x8b, 0x24, 0x90, 0x7f, 0xe2, 0xe0, 0x54, 0xbf, 0xf0, 0x90, 0x20, 0x58, 0x74, 0x00, 0xf0, 0x80} },
+{ 0x1810,      16,     {0x1b, 0xe0, 0xde, 0xfd, 0x90, 0x7f, 0xe2, 0xe0, 0x54, 0xbf, 0xf0, 0x90, 0x20, 0x58, 0x74, 0x00} },
+{ 0x1820,      16,     {0xf0, 0x90, 0x20, 0x11, 0xe0, 0x54, 0xfd, 0xf0, 0x90, 0x7f, 0xcb, 0xf0, 0x02, 0x13, 0x43, 0x90} },
+{ 0x1830,      16,     {0x20, 0x1a, 0xe0, 0x54, 0x3f, 0x20, 0xe2, 0x3a, 0x20, 0xe1, 0x0b, 0x20, 0xe4, 0x0b, 0x20, 0xe5} },
+{ 0x1840,      16,     {0x14, 0x60, 0x09, 0x02, 0x13, 0x43, 0x02, 0x19, 0x18, 0x02, 0x13, 0x43, 0x43, 0x82, 0x04, 0xe0} },
+{ 0x1850,      16,     {0xf5, 0x39, 0x02, 0x13, 0x43, 0x43, 0x82, 0x04, 0xe0, 0x43, 0x2f, 0x01, 0x02, 0x13, 0x43, 0x53} },
+{ 0x1860,      16,     {0x82, 0xf8, 0x43, 0x82, 0x05, 0xe0, 0x42, 0x35, 0x53, 0x82, 0xfb, 0xe0, 0x54, 0xfb, 0xf0, 0x02} },
+{ 0x1870,      16,     {0x13, 0x43, 0x30, 0xe1, 0x02, 0x80, 0xe8, 0xf5, 0x85, 0xe5, 0x3b, 0x30, 0xe3, 0x0a, 0x53, 0x82} },
+{ 0x1880,      16,     {0xf8, 0x43, 0x82, 0x04, 0xe0, 0x54, 0xfe, 0xf0, 0xe5, 0x85, 0x20, 0xe3, 0x56, 0x90, 0x20, 0x50} },
+{ 0x1890,      16,     {0x74, 0x03, 0xf0, 0x90, 0x20, 0x58, 0x74, 0x01, 0xf0, 0x90, 0x7f, 0xe2, 0xe0, 0x44, 0x40, 0xf0} },
+{ 0x18a0,      16,     {0x90, 0x7f, 0xe3, 0x05, 0x86, 0x90, 0x7d, 0x00, 0x05, 0x86, 0xe5, 0x85, 0xf0, 0xa3, 0xe5, 0x84} },
+{ 0x18b0,      16,     {0xf0, 0x05, 0x86, 0x90, 0x7f, 0xe5, 0xe5, 0x3f, 0xfd, 0x03, 0x03, 0x03, 0xfe, 0xf0, 0xf0, 0xf0} },
+{ 0x18c0,      16,     {0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xde, 0xf6, 0x90, 0x7f, 0xe2, 0xe0, 0x54, 0xbf, 0xf0, 0x90, 0x20} },
+{ 0x18d0,      16,     {0x58, 0x74, 0x00, 0xf0, 0x90, 0x7f, 0xbd, 0xed, 0xf0, 0x90, 0x20, 0x19, 0xe0, 0x54, 0xfe, 0xf0} },
+{ 0x18e0,      16,     {0x02, 0x13, 0x43, 0x7f, 0x40, 0x90, 0x7d, 0x00, 0x05, 0x86, 0x90, 0x20, 0x18, 0xe5, 0x84, 0xfe} },
+{ 0x18f0,      16,     {0x24, 0x05, 0xfd, 0x8d, 0x84, 0xe0, 0x8e, 0x84, 0x30, 0xe0, 0x09, 0xe0, 0x05, 0x86, 0xf0, 0xa3} },
+{ 0x1900,      16,     {0x05, 0x86, 0xdf, 0xef, 0x05, 0x86, 0xc3, 0x74, 0x40, 0x9f, 0x90, 0x7f, 0xbd, 0xf0, 0x05, 0x86} },
+{ 0x1910,      16,     {0xa3, 0xe0, 0x54, 0xfe, 0xf0, 0x02, 0x13, 0x43, 0x53, 0x2f, 0xfa, 0xe5, 0x25, 0x60, 0x08, 0x75} },
+{ 0x1920,      16,     {0x25, 0x00, 0xd2, 0xe7, 0xfe, 0x80, 0x0a, 0x90, 0x7f, 0xcd, 0xe0, 0xfe, 0x70, 0x03, 0x02, 0x19} },
+{ 0x1930,      16,     {0xb2, 0x90, 0x20, 0x50, 0x74, 0x03, 0xf0, 0x90, 0x20, 0x58, 0x74, 0x01, 0xf0, 0x90, 0x7f, 0xe2} },
+{ 0x1940,      16,     {0xe0, 0x44, 0x40, 0xf0, 0x90, 0x7f, 0xe3, 0x05, 0x86, 0x90, 0x7c, 0xc0, 0x05, 0x86, 0xe5, 0x85} },
+{ 0x1950,      16,     {0xf0, 0xa3, 0xe5, 0x84, 0xf0, 0x05, 0x86, 0x90, 0x7f, 0xe5, 0xee, 0x30, 0xe7, 0x08, 0x05, 0x86} },
+{ 0x1960,      16,     {0xe0, 0x24, 0x38, 0xf0, 0x05, 0x86, 0xee, 0x54, 0x7f, 0xfe, 0x54, 0x07, 0xfb, 0xee, 0x54, 0x78} },
+{ 0x1970,      16,     {0x60, 0x30, 0x03, 0x03, 0x03, 0x30, 0xe3, 0x04, 0x74, 0x07, 0x7b, 0x08, 0xfd, 0xfc, 0xe0, 0xe0} },
+{ 0x1980,      16,     {0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xdd, 0xf6, 0xeb, 0xfe, 0x60, 0x19, 0xec, 0x64, 0x07, 0x70} },
+{ 0x1990,      16,     {0x11, 0x8b, 0x25, 0x90, 0x7f, 0xe2, 0xe0, 0x54, 0xbf, 0xf0, 0x90, 0x20, 0x58, 0x74, 0x00, 0xf0} },
+{ 0x19a0,      16,     {0x80, 0x1b, 0xe0, 0xde, 0xfd, 0x90, 0x7f, 0xe2, 0xe0, 0x54, 0xbf, 0xf0, 0x90, 0x20, 0x58, 0x74} },
+{ 0x19b0,      16,     {0x00, 0xf0, 0x90, 0x20, 0x19, 0xe0, 0x54, 0xfd, 0xf0, 0x90, 0x7f, 0xcd, 0xf0, 0x02, 0x13, 0x43} },
+{ 0x19c0,      1,      {0x32} },
+{ 0x19c1,      4,      {0xad, 0x07, 0xac, 0x06} },
+{ 0x19c5,      16,     {0x79, 0x06, 0xed, 0x24, 0x04, 0xf5, 0x82, 0xe4, 0x3c, 0xf5, 0x83, 0xe0, 0xfa, 0xa3, 0xe0, 0xfb} },
+{ 0x19d5,      16,     {0x4a, 0x70, 0x03, 0x02, 0x1b, 0x09, 0xe9, 0xb4, 0x07, 0x00, 0x40, 0x03, 0x02, 0x1a, 0xdb, 0x90} },
+{ 0x19e5,      16,     {0x19, 0xeb, 0xf8, 0x28, 0x28, 0x73, 0x02, 0x1a, 0xb9, 0x02, 0x1a, 0x71, 0x02, 0x1a, 0x5a, 0x02} },
+{ 0x19f5,      16,     {0x1a, 0x40, 0x02, 0x1a, 0x2f, 0x02, 0x1a, 0x1a, 0x02, 0x1a, 0x00, 0x90, 0x7f, 0xa5, 0xe0, 0x44} },
+{ 0x1a05,      16,     {0x80, 0xf0, 0x8d, 0x82, 0x8c, 0x83, 0xa3, 0xe0, 0xff, 0x25, 0xe0, 0x44, 0xa0, 0x90, 0x7f, 0xa6} },
+{ 0x1a15,      16,     {0xf0, 0x19, 0x02, 0x1a, 0xdb, 0x19, 0x8d, 0x82, 0x8c, 0x83, 0xe0, 0xc3, 0x94, 0x20, 0x40, 0x0a} },
+{ 0x1a25,      16,     {0xa3, 0xa3, 0xe0, 0x90, 0x7f, 0xa6, 0xf0, 0x02, 0x1a, 0xdb, 0x8d, 0x82, 0x8c, 0x83, 0xa3, 0xa3} },
+{ 0x1a35,      16,     {0xe0, 0xa3, 0xe0, 0x90, 0x7f, 0xa6, 0xf0, 0x19, 0x02, 0x1a, 0xdb, 0x90, 0x7f, 0xa5, 0xe0, 0x44} },
+{ 0x1a45,      16,     {0x80, 0xf0, 0x8d, 0x82, 0x8c, 0x83, 0xa3, 0xe0, 0xff, 0x25, 0xe0, 0x44, 0xa1, 0x90, 0x7f, 0xa6} },
+{ 0x1a55,      16,     {0xf0, 0x19, 0x02, 0x1a, 0xdb, 0xeb, 0x64, 0x01, 0x4a, 0x70, 0x08, 0x90, 0x7f, 0xa5, 0xe0, 0x44} },
+{ 0x1a65,      16,     {0x20, 0xf0, 0x19, 0x90, 0x7f, 0xa6, 0xe0, 0xf5, 0x54, 0x19, 0x80, 0x6a, 0xed, 0x24, 0x04, 0xf5} },
+{ 0x1a75,      16,     {0x82, 0xe4, 0x3c, 0xf5, 0x83, 0xe0, 0xfe, 0xa3, 0xe0, 0x64, 0x02, 0x4e, 0x70, 0x08, 0x90, 0x7f} },
+{ 0x1a85,      16,     {0xa5, 0xe0, 0x44, 0x20, 0xf0, 0x19, 0x90, 0x7f, 0xa6, 0xe0, 0xff, 0xed, 0x24, 0x06, 0xf5, 0x82} },
+{ 0x1a95,      16,     {0xe4, 0x3c, 0xf5, 0x83, 0xe4, 0x75, 0xf0, 0x01, 0x12, 0x9b, 0xce, 0x85, 0xf0, 0x82, 0xf5, 0x83} },
+{ 0x1aa5,      16,     {0xef, 0xf0, 0xed, 0x24, 0x04, 0xf5, 0x82, 0xe4, 0x3c, 0xf5, 0x83, 0x74, 0xff, 0xf5, 0xf0, 0x12} },
+{ 0x1ab5,      16,     {0x9b, 0xb8, 0x80, 0x22, 0x90, 0x7f, 0xa5, 0xe0, 0x44, 0x40, 0xf0, 0x90, 0x7f, 0xa6, 0xe0, 0xff} },
+{ 0x1ac5,      16,     {0xed, 0x24, 0x06, 0xf5, 0x82, 0xe4, 0x3c, 0xf5, 0x83, 0xe0, 0xfa, 0xa3, 0xe0, 0xf5, 0x82, 0x8a} },
+{ 0x1ad5,      16,     {0x83, 0xef, 0xf0, 0x7f, 0x08, 0x22, 0x90, 0x7f, 0xa5, 0xe0, 0xf5, 0x54, 0x30, 0xe0, 0xf7, 0x30} },
+{ 0x1ae5,      16,     {0xe2, 0x07, 0xe0, 0x44, 0x40, 0xf0, 0x7f, 0x06, 0x22, 0xe9, 0xd3, 0x94, 0x02, 0x50, 0x03, 0x02} },
+{ 0x1af5,      16,     {0x19, 0xc7, 0xe5, 0x54, 0x30, 0xe1, 0x03, 0x02, 0x19, 0xc7, 0x90, 0x7f, 0xa5, 0xe0, 0x44, 0x40} },
+{ 0x1b05,      6,      {0xf0, 0x7f, 0x07, 0x22, 0x7f, 0x08} },
+{ 0x1b0b,      1,      {0x22} },
+{ 0x1b0c,      16,     {0x7f, 0x05, 0x7e, 0x00, 0x12, 0x09, 0x23, 0x7f, 0x02, 0x7d, 0xff, 0x12, 0x81, 0xe0, 0x7f, 0x05} },
+{ 0x1b1c,      13,     {0x7e, 0x00, 0x12, 0x09, 0x23, 0x7f, 0x03, 0x7d, 0xff, 0x12, 0x81, 0xe0, 0x22} },
+{ 0x1b29,      16,     {0xff, 0xfe, 0xfd, 0xfc, 0xfb, 0xfa, 0xf9, 0xf8, 0xf7, 0xf6, 0xf5, 0xf4, 0xf3, 0xf2, 0xf1, 0xf0} },
+{ 0x8000,      4,      {0x8e, 0x54, 0x8f, 0x55} },
+{ 0x8004,      16,     {0x75, 0x56, 0x03, 0xe5, 0x55, 0x24, 0x04, 0xf5, 0x82, 0xe4, 0x35, 0x54, 0xf5, 0x83, 0xe0, 0xfe} },
+{ 0x8014,      16,     {0xa3, 0xe0, 0x4e, 0x70, 0x03, 0x02, 0x81, 0x0e, 0xe5, 0x56, 0x60, 0x4e, 0x14, 0x60, 0x38, 0x14} },
+{ 0x8024,      16,     {0x60, 0x20, 0x14, 0x60, 0x03, 0x02, 0x80, 0xb2, 0x90, 0x7f, 0xa5, 0xe0, 0x44, 0x80, 0xf0, 0x85} },
+{ 0x8034,      16,     {0x55, 0x82, 0x85, 0x54, 0x83, 0xa3, 0xe0, 0xff, 0x25, 0xe0, 0x44, 0xa0, 0x90, 0x7f, 0xa6, 0xf0} },
+{ 0x8044,      16,     {0x80, 0x6c, 0x85, 0x55, 0x82, 0x85, 0x54, 0x83, 0xe0, 0xc3, 0x94, 0x20, 0x40, 0x09, 0xa3, 0xa3} },
+{ 0x8054,      16,     {0xe0, 0x90, 0x7f, 0xa6, 0xf0, 0x80, 0x57, 0x15, 0x56, 0x85, 0x55, 0x82, 0x85, 0x54, 0x83, 0xa3} },
+{ 0x8064,      16,     {0xa3, 0xe0, 0xa3, 0xe0, 0x90, 0x7f, 0xa6, 0xf0, 0x80, 0x44, 0xe5, 0x55, 0x24, 0x06, 0xf5, 0x82} },
+{ 0x8074,      16,     {0xe4, 0x35, 0x54, 0xf5, 0x83, 0xe4, 0x75, 0xf0, 0x01, 0x12, 0x9b, 0xce, 0x85, 0xf0, 0x82, 0xf5} },
+{ 0x8084,      16,     {0x83, 0xe0, 0x90, 0x7f, 0xa6, 0xf0, 0x90, 0x7f, 0xa5, 0xe0, 0x44, 0x40, 0xf0, 0xe5, 0x55, 0x24} },
+{ 0x8094,      16,     {0x04, 0xf5, 0x82, 0xe4, 0x35, 0x54, 0xf5, 0x83, 0x74, 0xff, 0xf5, 0xf0, 0x12, 0x9b, 0xb8, 0x85} },
+{ 0x80a4,      16,     {0x55, 0x82, 0x85, 0x54, 0x83, 0xa3, 0xa3, 0xe4, 0x75, 0xf0, 0x01, 0x12, 0x9b, 0xb8, 0x90, 0x7f} },
+{ 0x80b4,      16,     {0xa5, 0xe0, 0xf5, 0x57, 0x30, 0xe0, 0xf7, 0x30, 0xe2, 0x07, 0xe0, 0x44, 0x40, 0xf0, 0x7f, 0x06} },
+{ 0x80c4,      16,     {0x22, 0xe5, 0x57, 0x20, 0xe1, 0x0a, 0x90, 0x7f, 0xa5, 0xe0, 0x44, 0x40, 0xf0, 0x7f, 0x07, 0x22} },
+{ 0x80d4,      16,     {0xe5, 0x56, 0x70, 0x31, 0x7f, 0x01, 0x7e, 0x00, 0x12, 0x09, 0x23, 0x90, 0x7f, 0xa5, 0xe0, 0x44} },
+{ 0x80e4,      16,     {0x80, 0xf0, 0x85, 0x55, 0x82, 0x85, 0x54, 0x83, 0xa3, 0xe0, 0xff, 0x25, 0xe0, 0x44, 0xa0, 0x90} },
+{ 0x80f4,      16,     {0x7f, 0xa6, 0xf0, 0x90, 0x7f, 0xa5, 0xe0, 0xf5, 0x57, 0x30, 0xe0, 0xf7, 0x30, 0xe1, 0xd5, 0x75} },
+{ 0x8104,      12,     {0x56, 0x03, 0x02, 0x80, 0x07, 0x15, 0x56, 0x02, 0x80, 0x07, 0x7f, 0x08} },
+{ 0x8110,      1,      {0x22} },
+{ 0x8111,      2,      {0xac, 0x07} },
+{ 0x8113,      16,     {0x90, 0x7f, 0xa5, 0xe0, 0x44, 0x80, 0xf0, 0xec, 0x25, 0xe0, 0x44, 0x41, 0x90, 0x7f, 0xa6, 0xf0} },
+{ 0x8123,      16,     {0x7b, 0x3c, 0xaf, 0x03, 0x1b, 0xef, 0x70, 0x16, 0x90, 0x7f, 0xa5, 0xe0, 0x44, 0x40, 0xf0, 0x90} },
+{ 0x8133,      16,     {0x7f, 0xa6, 0xe0, 0xfd, 0x7d, 0x32, 0xaf, 0x05, 0x1d, 0xef, 0x60, 0xd4, 0x80, 0xf8, 0x90, 0x7f} },
+{ 0x8143,      16,     {0xa5, 0xe0, 0xfd, 0x30, 0xe0, 0xdc, 0x20, 0xe1, 0x09, 0xe0, 0x44, 0x40, 0xf0, 0x7e, 0xff, 0x7f} },
+{ 0x8153,      16,     {0xf9, 0x22, 0xed, 0x30, 0xe2, 0x0c, 0x90, 0x7f, 0xa5, 0xe0, 0x44, 0x40, 0xf0, 0x7e, 0xff, 0x7f} },
+{ 0x8163,      16,     {0xfa, 0x22, 0x90, 0x7f, 0xa5, 0xe0, 0x44, 0x20, 0xf0, 0x90, 0x7f, 0xa6, 0xe0, 0xfd, 0x7b, 0x1e} },
+{ 0x8173,      16,     {0xaf, 0x03, 0x1b, 0xef, 0x70, 0x16, 0x90, 0x7f, 0xa5, 0xe0, 0x44, 0x40, 0xf0, 0x90, 0x7f, 0xa6} },
+{ 0x8183,      16,     {0xe0, 0xfd, 0x7d, 0x32, 0xaf, 0x05, 0x1d, 0xef, 0x60, 0x86, 0x80, 0xf8, 0x90, 0x7f, 0xa5, 0xe0} },
+{ 0x8193,      16,     {0xfd, 0x20, 0xe0, 0xdc, 0x7b, 0x3c, 0xaf, 0x03, 0x1b, 0xef, 0x70, 0x19, 0x90, 0x7f, 0xa5, 0xe0} },
+{ 0x81a3,      16,     {0x44, 0x40, 0xf0, 0x90, 0x7f, 0xa6, 0xe0, 0xfd, 0x7d, 0x32, 0xaf, 0x05, 0x1d, 0xef, 0x70, 0x03} },
+{ 0x81b3,      16,     {0x02, 0x81, 0x13, 0x80, 0xf5, 0x90, 0x7f, 0xa5, 0xe0, 0xfd, 0x30, 0xe0, 0xd9, 0x30, 0xe2, 0x09} },
+{ 0x81c3,      16,     {0xe0, 0x44, 0x40, 0xf0, 0x7e, 0xff, 0x7f, 0xfa, 0x22, 0xc2, 0xaf, 0x90, 0x7f, 0xa5, 0xe0, 0x44} },
+{ 0x81d3,      12,     {0x40, 0xf0, 0x90, 0x7f, 0xa6, 0xe0, 0xfd, 0xd2, 0xaf, 0xff, 0x7e, 0x00} },
+{ 0x81df,      1,      {0x22} },
+{ 0x81e0,      2,      {0xae, 0x07} },
+{ 0x81e2,      16,     {0x7c, 0x02, 0xec, 0x14, 0x60, 0x15, 0x14, 0x70, 0x1e, 0x90, 0x7f, 0xa5, 0xe0, 0x44, 0x80, 0xf0} },
+{ 0x81f2,      16,     {0xee, 0x25, 0xe0, 0x44, 0x40, 0x90, 0x7f, 0xa6, 0xf0, 0x80, 0x0c, 0x90, 0x7f, 0xa6, 0xed, 0xf0} },
+{ 0x8202,      16,     {0x90, 0x7f, 0xa5, 0xe0, 0x44, 0x40, 0xf0, 0x90, 0x7f, 0xa5, 0xe0, 0xfb, 0x30, 0xe0, 0xf8, 0xbc} },
+{ 0x8212,      16,     {0x02, 0x0a, 0x20, 0xe1, 0x07, 0xe0, 0x44, 0x40, 0xf0, 0x7f, 0x07, 0x22, 0xeb, 0x30, 0xe2, 0x0a} },
+{ 0x8222,      14,     {0x90, 0x7f, 0xa5, 0xe0, 0x44, 0x40, 0xf0, 0x7f, 0x06, 0x22, 0xdc, 0xb6, 0x7f, 0x08} },
+{ 0x8230,      1,      {0x22} },
+{ 0x8231,      16,     {0xc0, 0xe0, 0xc0, 0x83, 0xc0, 0x82, 0xc2, 0xa9, 0x90, 0x03, 0x00, 0x74, 0x19, 0xf0, 0xd2, 0xa9} },
+{ 0x8241,      15,     {0x53, 0x91, 0x7f, 0x90, 0x01, 0xc4, 0xe4, 0xf0, 0xd0, 0x82, 0xd0, 0x83, 0xd0, 0xe0, 0x32} },
+{ 0x8250,      16,     {0xef, 0x75, 0xf0, 0x08, 0xa4, 0x24, 0x00, 0xf5, 0x82, 0xe4, 0x34, 0x20, 0xab, 0x82, 0xfa, 0xf5} },
+{ 0x8260,      16,     {0x83, 0xa3, 0xe4, 0xf0, 0x8b, 0x82, 0x8a, 0x83, 0xa3, 0xa3, 0xa3, 0xe0, 0xf5, 0x5e, 0x74, 0xbf} },
+{ 0x8270,      16,     {0xf0, 0x8b, 0x82, 0x8a, 0x83, 0xa3, 0xa3, 0xe0, 0x44, 0x10, 0xf0, 0x8b, 0x82, 0x8a, 0x83, 0xa3} },
+{ 0x8280,      16,     {0xa3, 0xa3, 0xe4, 0xf0, 0x8b, 0x82, 0x8a, 0x83, 0xa3, 0xf0, 0xf9, 0xed, 0x60, 0x1d, 0x74, 0x01} },
+{ 0x8290,      16,     {0x7e, 0x00, 0xa8, 0x07, 0x08, 0x80, 0x05, 0xc3, 0x33, 0xce, 0x33, 0xce, 0xd8, 0xf9, 0xff, 0xe4} },
+{ 0x82a0,      16,     {0xef, 0x55, 0x3b, 0x60, 0x04, 0x79, 0x09, 0x80, 0x02, 0x79, 0x0d, 0x8b, 0x82, 0x8a, 0x83, 0xa3} },
+{ 0x82b0,      16,     {0xa3, 0xa3, 0x74, 0xbf, 0xf0, 0x8b, 0x82, 0x8a, 0x83, 0xa3, 0xa3, 0xe0, 0x54, 0xef, 0xf0, 0x8b} },
+{ 0x82c0,      16,     {0x82, 0x8a, 0x83, 0xa3, 0xa3, 0xa3, 0xe5, 0x5e, 0xf0, 0xae, 0x02, 0xaf, 0x03, 0x8f, 0x82, 0x8e} },
+{ 0x82d0,      4,      {0x83, 0xa3, 0xe9, 0xf0} },
+{ 0x82d4,      1,      {0x22} },
+{ 0x82d5,      4,      {0x8f, 0x5e, 0x8d, 0x5f} },
+{ 0x82d9,      16,     {0xe4, 0xf5, 0x60, 0x74, 0x3c, 0x2f, 0xf8, 0x76, 0x08, 0xe5, 0x5e, 0x75, 0xf0, 0x0d, 0xa4, 0x24} },
+{ 0x82e9,      16,     {0x02, 0xf5, 0x82, 0xe4, 0x34, 0x03, 0xf5, 0x83, 0xe0, 0xfc, 0xa3, 0xe0, 0xfd, 0xa3, 0xe0, 0xfe} },
+{ 0x82f9,      16,     {0xa3, 0xe0, 0xff, 0x7b, 0x80, 0x7a, 0x25, 0x79, 0x00, 0x78, 0x00, 0xc3, 0x12, 0x9c, 0xea, 0x50} },
+{ 0x8309,      16,     {0x3c, 0xe5, 0x5e, 0x75, 0xf0, 0x0d, 0xa4, 0x24, 0x02, 0xf5, 0x82, 0xe4, 0x34, 0x03, 0xf5, 0x83} },
+{ 0x8319,      16,     {0xe0, 0xfc, 0xa3, 0xe0, 0xfd, 0xa3, 0xe0, 0xfe, 0xa3, 0xe0, 0xff, 0x7b, 0x00, 0x7a, 0x96, 0x78} },
+{ 0x8329,      16,     {0x00, 0xc3, 0x12, 0x9c, 0xea, 0x40, 0x0c, 0x75, 0x60, 0x40, 0x74, 0x3c, 0x25, 0x5e, 0xf8, 0x76} },
+{ 0x8339,      16,     {0x10, 0x80, 0x0a, 0x75, 0x60, 0x80, 0x74, 0x3c, 0x25, 0x5e, 0xf8, 0x76, 0x38, 0xe5, 0x60, 0x45} },
+{ 0x8349,      16,     {0x5f, 0x44, 0x01, 0xff, 0xe5, 0x5e, 0x75, 0xf0, 0x08, 0xa4, 0x24, 0x02, 0xf5, 0x82, 0xe4, 0x34} },
+{ 0x8359,      5,      {0x20, 0xf5, 0x83, 0xef, 0xf0} },
+{ 0x835e,      1,      {0x22} },
+{ 0x835f,      16,     {0x8f, 0x82, 0x8e, 0x83, 0xe0, 0x14, 0xf5, 0x54, 0x75, 0xf0, 0x08, 0xa4, 0x24, 0x00, 0xf5, 0x82} },
+{ 0x836f,      16,     {0xe4, 0x34, 0x20, 0xaf, 0x82, 0xf5, 0x55, 0x8f, 0x56, 0xe5, 0x54, 0x25, 0xe0, 0x24, 0xc6, 0xf5} },
+{ 0x837f,      16,     {0x82, 0xe4, 0x34, 0x7f, 0xf5, 0x83, 0xe0, 0x20, 0xe1, 0x0f, 0xe5, 0x54, 0x25, 0xe0, 0x24, 0xc7} },
+{ 0x838f,      16,     {0xf5, 0x82, 0xe4, 0x34, 0x7f, 0xf5, 0x83, 0xe4, 0xf0, 0x74, 0x22, 0x25, 0x54, 0xf8, 0xe4, 0xf6} },
+{ 0x839f,      16,     {0xe5, 0x56, 0x24, 0x04, 0xf5, 0x82, 0xe4, 0x35, 0x55, 0xf5, 0x83, 0xe0, 0x44, 0x03, 0xf0, 0xaf} },
+{ 0x83af,      16,     {0x54, 0x7d, 0x06, 0x12, 0x82, 0xd5, 0xaf, 0x54, 0x7d, 0x01, 0x12, 0x82, 0x50, 0x85, 0x56, 0x82} },
+{ 0x83bf,      16,     {0x85, 0x55, 0x83, 0xa3, 0xa3, 0xe0, 0x20, 0xe0, 0x22, 0xe0, 0xff, 0xe5, 0x56, 0x24, 0x05, 0xf5} },
+{ 0x83cf,      16,     {0x82, 0xe4, 0x35, 0x55, 0xf5, 0x83, 0xe0, 0xe5, 0x56, 0x24, 0x06, 0xf5, 0x82, 0xe4, 0x35, 0x55} },
+{ 0x83df,      16,     {0xf5, 0x83, 0xe0, 0xff, 0xaf, 0x54, 0x7d, 0x06, 0x12, 0x82, 0xd5, 0x74, 0xf8, 0x25, 0x54, 0xf5} },
+{ 0x83ef,      16,     {0x82, 0xe4, 0x34, 0x02, 0xf5, 0x83, 0xe4, 0xf0, 0xe5, 0x54, 0x25, 0xe0, 0xff, 0xc3, 0x74, 0x0c} },
+{ 0x83ff,      16,     {0x9f, 0x75, 0xf0, 0x40, 0xa4, 0x24, 0x40, 0xf5, 0x82, 0xe5, 0xf0, 0x34, 0x7b, 0xaf, 0x82, 0xfe} },
+{ 0x840f,      16,     {0xe5, 0x54, 0x25, 0xe0, 0x24, 0xef, 0xf5, 0x82, 0xe4, 0x34, 0x02, 0xf5, 0x83, 0xee, 0xf0, 0xa3} },
+{ 0x841f,      16,     {0xef, 0xf0, 0xaf, 0x54, 0x74, 0x01, 0xa8, 0x07, 0x08, 0x80, 0x02, 0xc3, 0x33, 0xd8, 0xfc, 0x42} },
+{ 0x842f,      3,      {0x30, 0x7f, 0x00} },
+{ 0x8432,      1,      {0x22} },
+{ 0x8433,      16,     {0x8f, 0x82, 0x8e, 0x83, 0xe0, 0x14, 0xf5, 0x54, 0xff, 0xe4, 0xfd, 0x12, 0x82, 0x50, 0x74, 0xf8} },
+{ 0x8443,      16,     {0x25, 0x54, 0xf5, 0x82, 0xe4, 0x34, 0x02, 0xf5, 0x83, 0xe4, 0xf0, 0xe5, 0x54, 0x75, 0xf0, 0x08} },
+{ 0x8453,      16,     {0xa4, 0x24, 0x00, 0xf5, 0x82, 0xe4, 0x34, 0x20, 0xaf, 0x82, 0xf5, 0x56, 0x8f, 0x57, 0xf5, 0x83} },
+{ 0x8463,      16,     {0xe5, 0x82, 0x24, 0x04, 0xf5, 0x82, 0xe4, 0x35, 0x83, 0xf5, 0x83, 0xe0, 0x54, 0xfc, 0xf0, 0xaf} },
+{ 0x8473,      16,     {0x54, 0x7d, 0x06, 0x12, 0x82, 0xd5, 0xe5, 0x57, 0x24, 0x05, 0xf5, 0x82, 0xe4, 0x35, 0x56, 0xf5} },
+{ 0x8483,      16,     {0x83, 0xe0, 0x30, 0xe0, 0x09, 0x85, 0x57, 0x82, 0x85, 0x56, 0x83, 0xe0, 0xf5, 0x55, 0xaf, 0x54} },
+{ 0x8493,      16,     {0x74, 0x01, 0xa8, 0x07, 0x08, 0x80, 0x02, 0xc3, 0x33, 0xd8, 0xfc, 0xf4, 0x52, 0x30, 0xe5, 0x54} },
+{ 0x84a3,      16,     {0x25, 0xe0, 0x24, 0xc6, 0xf5, 0x82, 0xe4, 0x34, 0x7f, 0xf5, 0x83, 0xe0, 0x20, 0xe1, 0x0f, 0xe5} },
+{ 0x84b3,      16,     {0x54, 0x25, 0xe0, 0x24, 0xc7, 0xf5, 0x82, 0xe4, 0x34, 0x7f, 0xf5, 0x83, 0xe4, 0xf0, 0x7f, 0x00} },
+{ 0x84c3,      1,      {0x22} },
+{ 0x84c4,      4,      {0x8e, 0x54, 0x8f, 0x55} },
+{ 0x84c8,      16,     {0x8f, 0x82, 0x8e, 0x83, 0xe0, 0x14, 0xf5, 0x56, 0x75, 0xf0, 0x08, 0xa4, 0x24, 0x01, 0xf5, 0x82} },
+{ 0x84d8,      16,     {0xe4, 0x34, 0x20, 0xf5, 0x83, 0xe0, 0x54, 0x03, 0x70, 0x23, 0x85, 0x55, 0x82, 0x8e, 0x83, 0xa3} },
+{ 0x84e8,      16,     {0xe0, 0x30, 0xe0, 0x07, 0xaf, 0x56, 0x7d, 0x02, 0x12, 0x82, 0xd5, 0x85, 0x55, 0x82, 0x85, 0x54} },
+{ 0x84f8,      15,     {0x83, 0xa3, 0xe0, 0x30, 0xe1, 0x07, 0xaf, 0x56, 0x7d, 0x04, 0x12, 0x82, 0xd5, 0x7f, 0x00} },
+{ 0x8507,      1,      {0x22} },
+{ 0x8508,      16,     {0x8f, 0x82, 0x8e, 0x83, 0xc0, 0x83, 0xc0, 0x82, 0xe0, 0xfd, 0xa3, 0xa3, 0xa3, 0xe0, 0xfc, 0xed} },
+{ 0x8518,      16,     {0x6c, 0xd0, 0x82, 0xd0, 0x83, 0xf0, 0x8f, 0x82, 0x8e, 0x83, 0xa3, 0xa3, 0xa3, 0xc0, 0x83, 0xc0} },
+{ 0x8528,      16,     {0x82, 0xe0, 0xfd, 0x8f, 0x82, 0x8e, 0x83, 0xe0, 0xfc, 0xed, 0x6c, 0xd0, 0x82, 0xd0, 0x83, 0xf0} },
+{ 0x8538,      16,     {0x8f, 0x82, 0x8e, 0x83, 0xc0, 0x83, 0xc0, 0x82, 0xa3, 0xa3, 0xa3, 0xe0, 0xfd, 0xec, 0x6d, 0xd0} },
+{ 0x8548,      16,     {0x82, 0xd0, 0x83, 0xf0, 0x8f, 0x82, 0x8e, 0x83, 0xa3, 0xc0, 0x83, 0xc0, 0x82, 0xe0, 0xfd, 0x8f} },
+{ 0x8558,      16,     {0x82, 0x8e, 0x83, 0xa3, 0xa3, 0xe0, 0xfc, 0xed, 0x6c, 0xd0, 0x82, 0xd0, 0x83, 0xf0, 0x8f, 0x82} },
+{ 0x8568,      16,     {0x8e, 0x83, 0xa3, 0xa3, 0xc0, 0x83, 0xc0, 0x82, 0xe0, 0xfd, 0x8f, 0x82, 0x8e, 0x83, 0xa3, 0xe0} },
+{ 0x8578,      16,     {0xfc, 0xed, 0x6c, 0xd0, 0x82, 0xd0, 0x83, 0xf0, 0x8f, 0x82, 0x8e, 0x83, 0xa3, 0xc0, 0x83, 0xc0} },
+{ 0x8588,      16,     {0x82, 0xe0, 0xfd, 0x8f, 0x82, 0x8e, 0x83, 0xa3, 0xa3, 0xe0, 0xff, 0xed, 0x6f, 0xd0, 0x82, 0xd0} },
+{ 0x8598,      3,      {0x83, 0xf0, 0x22} },
+{ 0x859b,      16,     {0x79, 0x0d, 0x8e, 0x54, 0x8f, 0x55, 0x8f, 0x82, 0x8e, 0x83, 0xe0, 0x75, 0xf0, 0x0d, 0xa4, 0x24} },
+{ 0x85ab,      16,     {0xf4, 0xf5, 0x82, 0xe4, 0x34, 0x02, 0xaf, 0x82, 0xfe, 0xad, 0x01, 0x19, 0xed, 0x60, 0x24, 0x0f} },
+{ 0x85bb,      16,     {0xef, 0xac, 0x06, 0x70, 0x01, 0x0e, 0x14, 0xf5, 0x82, 0x8c, 0x83, 0xe0, 0xfd, 0x05, 0x55, 0xe5} },
+{ 0x85cb,      16,     {0x55, 0xaa, 0x54, 0x70, 0x02, 0x05, 0x54, 0x14, 0xf5, 0x82, 0x8a, 0x83, 0xe0, 0x6d, 0x60, 0xd9} },
+{ 0x85db,      5,      {0x7f, 0x01, 0x22, 0x7f, 0x00} },
+{ 0x85e0,      1,      {0x22} },
+{ 0x85e1,      4,      {0x8e, 0x54, 0x8f, 0x55} },
+{ 0x85e5,      16,     {0x8f, 0x82, 0x8e, 0x83, 0xe0, 0x14, 0xf5, 0x5b, 0x75, 0xf0, 0x08, 0xa4, 0x24, 0x00, 0xf5, 0x82} },
+{ 0x85f5,      16,     {0xe4, 0x34, 0x20, 0xaf, 0x82, 0xf5, 0x5c, 0x8f, 0x5d, 0xaa, 0x06, 0xa9, 0x55, 0x7b, 0x01, 0xc0} },
+{ 0x8605,      16,     {0x03, 0xc0, 0x01, 0xe5, 0x5b, 0x75, 0xf0, 0x0d, 0xa4, 0x24, 0x01, 0xf9, 0x74, 0x03, 0x35, 0xf0} },
+{ 0x8615,      16,     {0xa8, 0x01, 0xfc, 0xad, 0x03, 0xd0, 0x01, 0xd0, 0x03, 0x7e, 0x00, 0x7f, 0x0d, 0x12, 0x9b, 0x49} },
+{ 0x8625,      16,     {0x85, 0x55, 0x82, 0x85, 0x54, 0x83, 0xa3, 0xe0, 0xfc, 0xa3, 0xe0, 0xfd, 0xa3, 0xe0, 0xfe, 0xa3} },
+{ 0x8635,      16,     {0xe0, 0xff, 0x7b, 0x08, 0x7a, 0x00, 0x79, 0x00, 0x78, 0x00, 0xd3, 0x12, 0x9c, 0xea, 0x40, 0x10} },
+{ 0x8645,      16,     {0x85, 0x55, 0x82, 0x85, 0x54, 0x83, 0xa3, 0x12, 0x9d, 0x31, 0x00, 0x00, 0x00, 0x08, 0x80, 0x2e} },
+{ 0x8655,      16,     {0x85, 0x55, 0x82, 0x85, 0x54, 0x83, 0xa3, 0xe0, 0xfc, 0xa3, 0xe0, 0xfd, 0xa3, 0xe0, 0xfe, 0xa3} },
+{ 0x8665,      16,     {0xe0, 0xff, 0x7b, 0x00, 0x7a, 0x08, 0x79, 0x07, 0x78, 0x00, 0xc3, 0x12, 0x9c, 0xea, 0x50, 0x0e} },
+{ 0x8675,      16,     {0x85, 0x55, 0x82, 0x85, 0x54, 0x83, 0xa3, 0x12, 0x9d, 0x31, 0x00, 0x07, 0x08, 0x00, 0x85, 0x55} },
+{ 0x8685,      16,     {0x82, 0x85, 0x54, 0x83, 0xa3, 0xe0, 0xf8, 0xa3, 0xe0, 0xf9, 0xa3, 0xe0, 0xfa, 0xa3, 0xe0, 0xfb} },
+{ 0x8695,      16,     {0x7f, 0x00, 0x7e, 0x50, 0x7d, 0x46, 0x7c, 0x00, 0x12, 0x9c, 0x58, 0x8f, 0x59, 0x8e, 0x58, 0x8d} },
+{ 0x86a5,      16,     {0x57, 0x8c, 0x56, 0x7b, 0x0a, 0x7a, 0x00, 0x79, 0x00, 0x78, 0x00, 0x12, 0x9c, 0x58, 0xaf, 0x03} },
+{ 0x86b5,      16,     {0x8f, 0x5a, 0xaf, 0x59, 0xae, 0x58, 0xad, 0x57, 0xac, 0x56, 0x7b, 0x0a, 0x7a, 0x00, 0x79, 0x00} },
+{ 0x86c5,      16,     {0x78, 0x00, 0x12, 0x9c, 0x58, 0x8f, 0x59, 0x8e, 0x58, 0x8d, 0x57, 0x8c, 0x56, 0xe5, 0x5a, 0xc3} },
+{ 0x86d5,      16,     {0x94, 0x05, 0x40, 0x15, 0xe5, 0x59, 0x24, 0x01, 0xf5, 0x59, 0xe4, 0x35, 0x58, 0xf5, 0x58, 0xe4} },
+{ 0x86e5,      16,     {0x35, 0x57, 0xf5, 0x57, 0xe4, 0x35, 0x56, 0xf5, 0x56, 0x85, 0x5d, 0x82, 0x85, 0x5c, 0x83, 0xa3} },
+{ 0x86f5,      16,     {0xe4, 0xf0, 0x85, 0x5d, 0x82, 0x85, 0x5c, 0x83, 0xa3, 0xa3, 0xa3, 0xe0, 0x44, 0x80, 0xf0, 0x85} },
+{ 0x8705,      16,     {0x5d, 0x82, 0x85, 0x5c, 0x83, 0xe5, 0x59, 0xf0, 0xaf, 0x59, 0xae, 0x58, 0xad, 0x57, 0xac, 0x56} },
+{ 0x8715,      16,     {0x78, 0x08, 0x12, 0x9c, 0xfb, 0x85, 0x5d, 0x82, 0x85, 0x5c, 0x83, 0xa3, 0xef, 0xf0, 0x85, 0x5d} },
+{ 0x8725,      16,     {0x82, 0x85, 0x5c, 0x83, 0xa3, 0xa3, 0xa3, 0xe0, 0x54, 0x7f, 0xf0, 0xe4, 0xf5, 0x5a, 0xe5, 0x55} },
+{ 0x8735,      16,     {0x24, 0x08, 0xf5, 0x82, 0xe4, 0x35, 0x54, 0xf5, 0x83, 0xe0, 0xff, 0xb4, 0x62, 0x05, 0x43, 0x5a} },
+{ 0x8745,      16,     {0x0a, 0x80, 0x10, 0xef, 0xb4, 0x72, 0x05, 0x43, 0x5a, 0x08, 0x80, 0x07, 0xef, 0xb4, 0x74, 0x03} },
+{ 0x8755,      16,     {0x43, 0x5a, 0x02, 0xe5, 0x55, 0x24, 0x0b, 0xf5, 0x82, 0xe4, 0x35, 0x54, 0xf5, 0x83, 0xe0, 0xff} },
+{ 0x8765,      16,     {0x30, 0xe3, 0x03, 0x43, 0x5a, 0x80, 0xef, 0x30, 0xe7, 0x12, 0x43, 0x5a, 0x40, 0xe5, 0x5d, 0x24} },
+{ 0x8775,      16,     {0x04, 0xf5, 0x82, 0xe4, 0x35, 0x5c, 0xf5, 0x83, 0xe0, 0x44, 0x02, 0xf0, 0xe5, 0x55, 0x24, 0x0b} },
+{ 0x8785,      16,     {0xf5, 0x82, 0xe4, 0x35, 0x54, 0xf5, 0x83, 0xe0, 0xff, 0x20, 0xe1, 0x03, 0x30, 0xe4, 0x23, 0xaf} },
+{ 0x8795,      16,     {0x5b, 0x74, 0x01, 0xa8, 0x07, 0x08, 0x80, 0x02, 0xc3, 0x33, 0xd8, 0xfc, 0x42, 0x3b, 0xe5, 0x5d} },
+{ 0x87a5,      16,     {0x24, 0x04, 0xf5, 0x82, 0xe4, 0x35, 0x5c, 0xf5, 0x83, 0xe0, 0x44, 0x01, 0xf0, 0xe4, 0xf5, 0x5a} },
+{ 0x87b5,      16,     {0x80, 0x10, 0xaf, 0x5b, 0x74, 0x01, 0xa8, 0x07, 0x08, 0x80, 0x02, 0xc3, 0x33, 0xd8, 0xfc, 0xf4} },
+{ 0x87c5,      16,     {0x52, 0x3b, 0x85, 0x5d, 0x82, 0x85, 0x5c, 0x83, 0xa3, 0xa3, 0xa3, 0x74, 0xbf, 0xf0, 0x85, 0x5d} },
+{ 0x87d5,      16,     {0x82, 0x85, 0x5c, 0x83, 0xa3, 0xa3, 0xe4, 0xf0, 0xe5, 0x5a, 0xf0, 0xe5, 0x55, 0x24, 0x0a, 0xf5} },
+{ 0x87e5,      16,     {0x82, 0xe4, 0x35, 0x54, 0xf5, 0x83, 0xe0, 0xff, 0xe5, 0x5d, 0x24, 0x04, 0xf5, 0x82, 0xe4, 0x35} },
+{ 0x87f5,      16,     {0x5c, 0xf5, 0x83, 0xef, 0xf0, 0xe5, 0x55, 0x24, 0x0a, 0xf5, 0x82, 0xe4, 0x35, 0x54, 0xf5, 0x83} },
+{ 0x8805,      16,     {0xe0, 0xff, 0xe5, 0x5d, 0x24, 0x05, 0xf5, 0x82, 0xe4, 0x35, 0x5c, 0xf5, 0x83, 0xef, 0xf0, 0xe5} },
+{ 0x8815,      16,     {0x55, 0x24, 0x09, 0xf5, 0x82, 0xe4, 0x35, 0x54, 0xf5, 0x83, 0xe0, 0xff, 0xe5, 0x5d, 0x24, 0x06} },
+{ 0x8825,      16,     {0xf5, 0x82, 0xe4, 0x35, 0x5c, 0xf5, 0x83, 0xef, 0xf0, 0xe5, 0x55, 0x24, 0x09, 0xf5, 0x82, 0xe4} },
+{ 0x8835,      16,     {0x35, 0x54, 0xf5, 0x83, 0xe0, 0xff, 0xe5, 0x5d, 0x24, 0x07, 0xf5, 0x82, 0xe4, 0x35, 0x5c, 0xf5} },
+{ 0x8845,      16,     {0x83, 0xef, 0xf0, 0x85, 0x5d, 0x82, 0x85, 0x5c, 0x83, 0xa3, 0xa3, 0xa3, 0xe4, 0xf0, 0x85, 0x5d} },
+{ 0x8855,      16,     {0x82, 0x85, 0x5c, 0x83, 0xa3, 0xa3, 0xf0, 0xaf, 0x5b, 0x7d, 0x06, 0x12, 0x82, 0xd5, 0x75, 0x5a} },
+{ 0x8865,      16,     {0x08, 0xe5, 0x55, 0x24, 0x0c, 0xf5, 0x82, 0xe4, 0x35, 0x54, 0xf5, 0x83, 0xe0, 0x60, 0x03, 0x43} },
+{ 0x8875,      16,     {0x5a, 0x10, 0xe5, 0x5d, 0x24, 0x04, 0xf5, 0x82, 0xe4, 0x35, 0x5c, 0xf5, 0x83, 0xe0, 0x54, 0x03} },
+{ 0x8885,      16,     {0x45, 0x5a, 0xf0, 0xe5, 0x55, 0x24, 0x06, 0xf5, 0x82, 0xe4, 0x35, 0x54, 0xf5, 0x83, 0xe0, 0x14} },
+{ 0x8895,      16,     {0xff, 0x25, 0xe0, 0x25, 0xe0, 0xff, 0xe5, 0x55, 0x24, 0x05, 0xf5, 0x82, 0xe4, 0x35, 0x54, 0xf5} },
+{ 0x88a5,      16,     {0x83, 0xe0, 0x24, 0xfb, 0x4f, 0xf5, 0x5a, 0xe5, 0x55, 0x24, 0x07, 0xf5, 0x82, 0xe4, 0x35, 0x54} },
+{ 0x88b5,      16,     {0xf5, 0x83, 0xe0, 0x24, 0xd0, 0x60, 0x15, 0x14, 0x60, 0x17, 0x24, 0xc2, 0x60, 0x09, 0x24, 0x0a} },
+{ 0x88c5,      16,     {0x70, 0x12, 0x43, 0x5a, 0x18, 0x80, 0x0d, 0x43, 0x5a, 0x08, 0x80, 0x08, 0x43, 0x5a, 0x38, 0x80} },
+{ 0x88d5,      16,     {0x03, 0x43, 0x5a, 0x28, 0x85, 0x5d, 0x82, 0x85, 0x5c, 0x83, 0xa3, 0xa3, 0xa3, 0xe5, 0x5a, 0xf0} },
+{ 0x88e5,      9,      {0xaf, 0x5b, 0x7d, 0x01, 0x12, 0x82, 0x50, 0x7f, 0x00} },
+{ 0x88ee,      1,      {0x22} },
+{ 0x88ef,      16,     {0x8f, 0x82, 0x8e, 0x83, 0xe0, 0x14, 0xff, 0x75, 0xf0, 0x08, 0xa4, 0x24, 0x00, 0xf5, 0x82, 0xe4} },
+{ 0x88ff,      16,     {0x34, 0x20, 0xad, 0x82, 0xfc, 0x90, 0x01, 0x2c, 0x74, 0x08, 0xf0, 0xef, 0x04, 0xa3, 0xf0, 0xe4} },
+{ 0x890f,      16,     {0xa3, 0xf0, 0x8d, 0x82, 0x8c, 0x83, 0xe5, 0x82, 0x24, 0x06, 0xf5, 0x82, 0xe4, 0x35, 0x83, 0xf5} },
+{ 0x891f,      16,     {0x83, 0xe0, 0x90, 0x01, 0x2f, 0xf0, 0x8d, 0x82, 0x8c, 0x83, 0xe5, 0x82, 0x24, 0x05, 0xf5, 0x82} },
+{ 0x892f,      16,     {0xe4, 0x35, 0x83, 0xf5, 0x83, 0xe0, 0x54, 0x1e, 0x90, 0x01, 0x30, 0xf0, 0x74, 0x2c, 0x2f, 0xf8} },
+{ 0x893f,      16,     {0xe6, 0xa3, 0xf0, 0x74, 0x01, 0xa8, 0x07, 0x08, 0x80, 0x02, 0xc3, 0x33, 0xd8, 0xfc, 0xf5, 0x54} },
+{ 0x894f,      16,     {0x7f, 0x02, 0x12, 0x81, 0x11, 0xc3, 0xee, 0x64, 0x80, 0x94, 0x80, 0x40, 0xf3, 0xe5, 0x54, 0x5f} },
+{ 0x895f,      16,     {0x90, 0x01, 0x32, 0xf0, 0x7e, 0x01, 0x7f, 0x2c, 0x75, 0x60, 0x00, 0x75, 0x5f, 0x00, 0x75, 0x5e} },
+{ 0x896f,      11,     {0x00, 0x75, 0x5d, 0x00, 0x7d, 0x07, 0x12, 0x8e, 0x0c, 0x7f, 0x00} },
+{ 0x897a,      1,      {0x22} },
+{ 0x897b,      16,     {0x8f, 0x82, 0x8e, 0x83, 0xe0, 0x75, 0xf0, 0x08, 0xa4, 0x24, 0xf8, 0xf5, 0x82, 0xe4, 0x34, 0x1f} },
+{ 0x898b,      16,     {0xaf, 0x82, 0xfe, 0x90, 0x01, 0x33, 0x74, 0x0a, 0xf0, 0x8f, 0x82, 0x8e, 0x83, 0xe5, 0x82, 0x24} },
+{ 0x899b,      16,     {0x04, 0xf5, 0x82, 0xe4, 0x35, 0x83, 0xf5, 0x83, 0xe0, 0x90, 0x01, 0x34, 0xf0, 0x7e, 0x01, 0x7f} },
+{ 0x89ab,      16,     {0x33, 0x75, 0x60, 0x00, 0x75, 0x5f, 0x00, 0x75, 0x5e, 0x00, 0x75, 0x5d, 0x00, 0x7d, 0x02, 0x12} },
+{ 0x89bb,      4,      {0x8e, 0x0c, 0x7f, 0x00} },
+{ 0x89bf,      1,      {0x22} },
+{ 0x89c0,      16,     {0x8f, 0x82, 0x8e, 0x83, 0xe0, 0x75, 0xf0, 0x08, 0xa4, 0x24, 0xf8, 0xf5, 0x82, 0xe4, 0x34, 0x1f} },
+{ 0x89d0,      16,     {0xad, 0x82, 0xfc, 0x8f, 0x82, 0xa3, 0xe0, 0x60, 0x0f, 0xed, 0x24, 0x04, 0xf5, 0x82, 0xe4, 0x3c} },
+{ 0x89e0,      16,     {0xf5, 0x83, 0xe0, 0x44, 0x02, 0xf0, 0x80, 0x11, 0xae, 0x04, 0xaf, 0x05, 0xef, 0x24, 0x04, 0xf5} },
+{ 0x89f0,      11,     {0x82, 0xe4, 0x3e, 0xf5, 0x83, 0xe0, 0x54, 0xfd, 0xf0, 0x7f, 0x00} },
+{ 0x89fb,      1,      {0x22} },
+{ 0x89fc,      16,     {0x8f, 0x82, 0x8e, 0x83, 0xe0, 0x75, 0xf0, 0x08, 0xa4, 0x24, 0xf8, 0xf5, 0x82, 0xe4, 0x34, 0x1f} },
+{ 0x8a0c,      16,     {0xad, 0x82, 0xfc, 0x8f, 0x82, 0xa3, 0xe0, 0x60, 0x0f, 0xed, 0x24, 0x04, 0xf5, 0x82, 0xe4, 0x3c} },
+{ 0x8a1c,      16,     {0xf5, 0x83, 0xe0, 0x44, 0x01, 0xf0, 0x80, 0x11, 0xae, 0x04, 0xaf, 0x05, 0xef, 0x24, 0x04, 0xf5} },
+{ 0x8a2c,      11,     {0x82, 0xe4, 0x3e, 0xf5, 0x83, 0xe0, 0x54, 0xfe, 0xf0, 0x7f, 0x00} },
+{ 0x8a37,      1,      {0x22} },
+{ 0x8a38,      16,     {0x8f, 0x82, 0x8e, 0x83, 0xe0, 0x75, 0xf0, 0x08, 0xa4, 0x24, 0xf8, 0xf5, 0x82, 0xe4, 0x34, 0x1f} },
+{ 0x8a48,      16,     {0xad, 0x82, 0xfc, 0x8f, 0x82, 0xa3, 0xe0, 0x60, 0x0d, 0x8d, 0x82, 0x8c, 0x83, 0xa3, 0xa3, 0xa3} },
+{ 0x8a58,      16,     {0xe0, 0x44, 0x40, 0xf0, 0x80, 0x0f, 0xae, 0x04, 0xaf, 0x05, 0x8f, 0x82, 0x8e, 0x83, 0xa3, 0xa3} },
+{ 0x8a68,      7,      {0xa3, 0xe0, 0x54, 0xbf, 0xf0, 0x7f, 0x00} },
+{ 0x8a6f,      1,      {0x22} },
+{ 0x8a70,      4,      {0x8e, 0x54, 0x8f, 0x55} },
+{ 0x8a74,      16,     {0x8f, 0x82, 0x8e, 0x83, 0xa3, 0xe0, 0xf5, 0x58, 0x8f, 0x82, 0x8e, 0x83, 0xe0, 0x24, 0xfe, 0x60} },
+{ 0x8a84,      16,     {0x16, 0x14, 0x60, 0x1f, 0x14, 0x60, 0x28, 0x24, 0x03, 0x70, 0x2e, 0x7e, 0x7e, 0x7f, 0x80, 0x75} },
+{ 0x8a94,      16,     {0x56, 0x7e, 0x75, 0x57, 0x80, 0x80, 0x22, 0x7e, 0x7e, 0x7f, 0x00, 0x75, 0x56, 0x7e, 0x75, 0x57} },
+{ 0x8aa4,      16,     {0x00, 0x80, 0x16, 0x7e, 0x7d, 0x7f, 0x80, 0x75, 0x56, 0x7d, 0x75, 0x57, 0x80, 0x80, 0x0a, 0x7e} },
+{ 0x8ab4,      16,     {0x7d, 0x7f, 0x00, 0x75, 0x56, 0x7d, 0x75, 0x57, 0x00, 0xe5, 0x58, 0x70, 0x20, 0x85, 0x57, 0x82} },
+{ 0x8ac4,      16,     {0x85, 0x56, 0x83, 0x74, 0xff, 0xf0, 0x85, 0x55, 0x82, 0x85, 0x54, 0x83, 0xe0, 0x25, 0xe0, 0x24} },
+{ 0x8ad4,      16,     {0xb5, 0xf5, 0x82, 0xe4, 0x34, 0x7f, 0xf5, 0x83, 0x74, 0x01, 0xf0, 0x80, 0x4d, 0xe5, 0x55, 0x24} },
+{ 0x8ae4,      16,     {0x02, 0xff, 0xe4, 0x35, 0x54, 0xfe, 0xe5, 0x58, 0x60, 0x23, 0x0f, 0xef, 0xac, 0x06, 0x70, 0x01} },
+{ 0x8af4,      16,     {0x0e, 0x14, 0xf5, 0x82, 0x8c, 0x83, 0xe0, 0xfd, 0x05, 0x57, 0xe5, 0x57, 0xaa, 0x56, 0x70, 0x02} },
+{ 0x8b04,      16,     {0x05, 0x56, 0x14, 0xf5, 0x82, 0x8a, 0x83, 0xed, 0xf0, 0x15, 0x58, 0x80, 0xd9, 0x85, 0x55, 0x82} },
+{ 0x8b14,      16,     {0x85, 0x54, 0x83, 0xa3, 0xe0, 0xff, 0x85, 0x55, 0x82, 0x85, 0x54, 0x83, 0xe0, 0x25, 0xe0, 0x24} },
+{ 0x8b24,      12,     {0xb5, 0xf5, 0x82, 0xe4, 0x34, 0x7f, 0xf5, 0x83, 0xef, 0xf0, 0x7f, 0x00} },
+{ 0x8b30,      1,      {0x22} },
+{ 0x8b31,      16,     {0xef, 0x24, 0x05, 0xf5, 0x55, 0xe4, 0x3e, 0xf5, 0x54, 0x90, 0x01, 0x35, 0x74, 0x07, 0xf0, 0x90} },
+{ 0x8b41,      16,     {0x01, 0x7a, 0x74, 0x01, 0xf0, 0xa3, 0x74, 0x36, 0xf0, 0x85, 0x55, 0x82, 0x85, 0x54, 0x83, 0xa3} },
+{ 0x8b51,      16,     {0xa3, 0xa3, 0xe0, 0xfe, 0xa3, 0xe0, 0x8e, 0x56, 0xf5, 0x57, 0x85, 0x55, 0x82, 0x85, 0x54, 0x83} },
+{ 0x8b61,      16,     {0xe0, 0x24, 0x9e, 0x60, 0x61, 0x24, 0xf9, 0x60, 0x0e, 0x24, 0xf1, 0x70, 0x03, 0x02, 0x8c, 0x12} },
+{ 0x8b71,      16,     {0x24, 0x14, 0x60, 0x03, 0x02, 0x8c, 0x5e, 0x85, 0x55, 0x82, 0x85, 0x54, 0x83, 0xa3, 0xe0, 0xfe} },
+{ 0x8b81,      16,     {0xa3, 0xe0, 0xff, 0xc3, 0xe4, 0x9f, 0xf5, 0x59, 0x74, 0x01, 0x9e, 0xf5, 0x58, 0xd3, 0xe5, 0x59} },
+{ 0x8b91,      16,     {0x94, 0x40, 0xe5, 0x58, 0x94, 0x00, 0x40, 0x06, 0x75, 0x58, 0x00, 0x75, 0x59, 0x40, 0xd3, 0xe5} },
+{ 0x8ba1,      16,     {0x57, 0x95, 0x59, 0xe5, 0x56, 0x95, 0x58, 0x50, 0x03, 0x02, 0x8c, 0x61, 0xae, 0x58, 0xaf, 0x59} },
+{ 0x8bb1,      16,     {0x85, 0x55, 0x82, 0x85, 0x54, 0x83, 0xa3, 0xa3, 0xa3, 0xee, 0xf0, 0xfe, 0xa3, 0xef, 0xf0, 0x8e} },
+{ 0x8bc1,      16,     {0x56, 0xf5, 0x57, 0x02, 0x8c, 0x61, 0x85, 0x55, 0x82, 0x85, 0x54, 0x83, 0xa3, 0xe0, 0xfe, 0xa3} },
+{ 0x8bd1,      16,     {0xe0, 0xff, 0xc3, 0x74, 0x30, 0x9f, 0xf5, 0x59, 0xe4, 0x9e, 0xf5, 0x58, 0xd3, 0xe5, 0x59, 0x94} },
+{ 0x8be1,      16,     {0x10, 0xe5, 0x58, 0x94, 0x00, 0x40, 0x06, 0x75, 0x58, 0x00, 0x75, 0x59, 0x10, 0xd3, 0xe5, 0x57} },
+{ 0x8bf1,      16,     {0x95, 0x59, 0xe5, 0x56, 0x95, 0x58, 0x40, 0x68, 0xae, 0x58, 0xaf, 0x59, 0x85, 0x55, 0x82, 0x85} },
+{ 0x8c01,      16,     {0x54, 0x83, 0xa3, 0xa3, 0xa3, 0xee, 0xf0, 0xfe, 0xa3, 0xef, 0xf0, 0x8e, 0x56, 0xf5, 0x57, 0x80} },
+{ 0x8c11,      16,     {0x4f, 0x85, 0x55, 0x82, 0x85, 0x54, 0x83, 0xa3, 0xe0, 0xfe, 0xa3, 0xe0, 0xff, 0xc3, 0xe4, 0x9f} },
+{ 0x8c21,      16,     {0xf5, 0x59, 0xe4, 0x9e, 0xf5, 0x58, 0x45, 0x59, 0x60, 0x0b, 0xd3, 0xe5, 0x59, 0x94, 0x40, 0xe5} },
+{ 0x8c31,      16,     {0x58, 0x94, 0x00, 0x40, 0x06, 0x75, 0x58, 0x00, 0x75, 0x59, 0x40, 0xd3, 0xe5, 0x57, 0x95, 0x59} },
+{ 0x8c41,      16,     {0xe5, 0x56, 0x95, 0x58, 0x40, 0x17, 0xae, 0x58, 0xaf, 0x59, 0x85, 0x55, 0x82, 0x85, 0x54, 0x83} },
+{ 0x8c51,      16,     {0xa3, 0xa3, 0xa3, 0xee, 0xf0, 0xfe, 0xa3, 0xef, 0xf0, 0x8e, 0x56, 0xf5, 0x57, 0x7f, 0x01, 0x22} },
+{ 0x8c61,      16,     {0x85, 0x55, 0x82, 0x85, 0x54, 0x83, 0xe0, 0x24, 0x9e, 0x70, 0x03, 0x02, 0x8d, 0x21, 0x24, 0xf9} },
+{ 0x8c71,      16,     {0x60, 0x58, 0x24, 0xf1, 0x70, 0x03, 0x02, 0x8d, 0x71, 0x24, 0x14, 0x60, 0x03, 0x02, 0x8d, 0xb5} },
+{ 0x8c81,      16,     {0x85, 0x55, 0x82, 0x85, 0x54, 0x83, 0xa3, 0xe0, 0xfe, 0xa3, 0xe0, 0xff, 0xd3, 0x94, 0xff, 0xee} },
+{ 0x8c91,      16,     {0x94, 0x00, 0x40, 0x03, 0x02, 0x8d, 0xb5, 0x90, 0x01, 0x75, 0xef, 0xf0, 0xe5, 0x57, 0x15, 0x57} },
+{ 0x8ca1,      16,     {0xae, 0x56, 0x70, 0x02, 0x15, 0x56, 0x4e, 0x70, 0x03, 0x02, 0x8d, 0xb5, 0x90, 0x01, 0x75, 0xe0} },
+{ 0x8cb1,      16,     {0xff, 0x04, 0xf0, 0xa8, 0x07, 0xe6, 0xff, 0x90, 0x01, 0x7a, 0xe4, 0x75, 0xf0, 0x01, 0x12, 0x9b} },
+{ 0x8cc1,      16,     {0xce, 0x85, 0xf0, 0x82, 0xf5, 0x83, 0xef, 0xf0, 0x80, 0xd2, 0x85, 0x55, 0x82, 0x85, 0x54, 0x83} },
+{ 0x8cd1,      16,     {0xa3, 0xe0, 0xfe, 0xa3, 0xe0, 0xff, 0xc3, 0x94, 0x80, 0xee, 0x94, 0x00, 0x50, 0x03, 0x02, 0x8d} },
+{ 0x8ce1,      16,     {0xb5, 0xd3, 0xef, 0x94, 0xff, 0xee, 0x94, 0x00, 0x40, 0x03, 0x02, 0x8d, 0xb5, 0x90, 0x01, 0x76} },
+{ 0x8cf1,      16,     {0xef, 0xf0, 0xe5, 0x57, 0x15, 0x57, 0xae, 0x56, 0x70, 0x02, 0x15, 0x56, 0x4e, 0x70, 0x03, 0x02} },
+{ 0x8d01,      16,     {0x8d, 0xb5, 0x90, 0x01, 0x76, 0xe0, 0xff, 0x04, 0xf0, 0xa8, 0x07, 0xe6, 0xff, 0x90, 0x01, 0x7a} },
+{ 0x8d11,      16,     {0xe4, 0x75, 0xf0, 0x01, 0x12, 0x9b, 0xce, 0x85, 0xf0, 0x82, 0xf5, 0x83, 0xef, 0xf0, 0x80, 0xd2} },
+{ 0x8d21,      16,     {0x85, 0x55, 0x82, 0x85, 0x54, 0x83, 0xa3, 0xe0, 0xfe, 0xa3, 0xe0, 0xff, 0xc3, 0x94, 0x20, 0xee} },
+{ 0x8d31,      16,     {0x94, 0x00, 0x50, 0x03, 0x02, 0x8d, 0xb5, 0xd3, 0xef, 0x94, 0x2f, 0xee, 0x94, 0x00, 0x50, 0x74} },
+{ 0x8d41,      16,     {0x90, 0x01, 0x77, 0xef, 0xf0, 0xe5, 0x57, 0x15, 0x57, 0xae, 0x56, 0x70, 0x02, 0x15, 0x56, 0x4e} },
+{ 0x8d51,      16,     {0x60, 0x62, 0x90, 0x01, 0x77, 0xe0, 0xff, 0x04, 0xf0, 0xa8, 0x07, 0xe6, 0xff, 0x90, 0x01, 0x7a} },
+{ 0x8d61,      16,     {0xe4, 0x75, 0xf0, 0x01, 0x12, 0x9b, 0xce, 0x85, 0xf0, 0x82, 0xf5, 0x83, 0xef, 0xf0, 0x80, 0xd5} },
+{ 0x8d71,      16,     {0x85, 0x55, 0x82, 0x85, 0x54, 0x83, 0xa3, 0xe0, 0xff, 0xa3, 0xe0, 0x90, 0x01, 0x78, 0xcf, 0xf0} },
+{ 0x8d81,      16,     {0xa3, 0xef, 0xf0, 0xe5, 0x57, 0x15, 0x57, 0xae, 0x56, 0x70, 0x02, 0x15, 0x56, 0x4e, 0x60, 0x24} },
+{ 0x8d91,      16,     {0x90, 0x01, 0x78, 0xe4, 0x75, 0xf0, 0x01, 0x12, 0x9b, 0xce, 0x85, 0xf0, 0x82, 0xf5, 0x83, 0xe0} },
+{ 0x8da1,      16,     {0xff, 0x90, 0x01, 0x7a, 0xe4, 0x75, 0xf0, 0x01, 0x12, 0x9b, 0xce, 0x85, 0xf0, 0x82, 0xf5, 0x83} },
+{ 0x8db1,      16,     {0xef, 0xf0, 0x80, 0xcf, 0x7e, 0x01, 0x7f, 0x35, 0x85, 0x55, 0x82, 0x85, 0x54, 0x83, 0xa3, 0xa3} },
+{ 0x8dc1,      16,     {0xa3, 0xe0, 0xa3, 0xe0, 0x04, 0xfd, 0x75, 0x60, 0x00, 0x75, 0x5f, 0x00, 0x75, 0x5e, 0x00, 0x75} },
+{ 0x8dd1,      7,      {0x5d, 0x00, 0x12, 0x8e, 0x0c, 0x7f, 0x00} },
+{ 0x8dd8,      1,      {0x22} },
+{ 0x8dd9,      16,     {0x8e, 0x61, 0x8f, 0x62, 0x8c, 0x63, 0x8d, 0x64, 0xaf, 0x03, 0x1b, 0xef, 0x60, 0x24, 0x05, 0x62} },
+{ 0x8de9,      16,     {0xe5, 0x62, 0xae, 0x61, 0x70, 0x02, 0x05, 0x61, 0x14, 0xf5, 0x82, 0x8e, 0x83, 0xe0, 0xff, 0x05} },
+{ 0x8df9,      16,     {0x64, 0xe5, 0x64, 0xac, 0x63, 0x70, 0x02, 0x05, 0x63, 0x14, 0xf5, 0x82, 0x8c, 0x83, 0xef, 0xf0} },
+{ 0x8e09,      3,      {0x80, 0xd6, 0x22} },
+{ 0x8e0c,      16,     {0x8d, 0x5c, 0xab, 0x07, 0xaa, 0x06, 0xaf, 0x60, 0xae, 0x5f, 0xad, 0x5e, 0xac, 0x5d, 0xec, 0x4d} },
+{ 0x8e1c,      16,     {0x4e, 0x4f, 0x60, 0x1c, 0x90, 0x7f, 0xc2, 0xe0, 0x30, 0xe1, 0x1c, 0x7f, 0xff, 0x7e, 0xff, 0x7d} },
+{ 0x8e2c,      16,     {0xff, 0x7c, 0xff, 0x78, 0x5d, 0x12, 0x9d, 0x0e, 0xec, 0x4d, 0x4e, 0x4f, 0x60, 0x09, 0x80, 0xe4} },
+{ 0x8e3c,      16,     {0x90, 0x7f, 0xc2, 0xe0, 0x20, 0xe1, 0xf9, 0x90, 0x7f, 0xc2, 0xe0, 0x20, 0xe1, 0x16, 0xaf, 0x03} },
+{ 0x8e4c,      16,     {0xae, 0x02, 0x7c, 0x7b, 0x7d, 0x80, 0xab, 0x5c, 0x12, 0x8d, 0xd9, 0x90, 0x7f, 0xc3, 0xe5, 0x5c} },
+{ 0x8e5c,      7,      {0xf0, 0x7f, 0x01, 0x22, 0x7f, 0x00, 0x22} },
+{ 0x8e63,      16,     {0x90, 0x01, 0x84, 0x74, 0x0b, 0xf0, 0x90, 0x20, 0x70, 0xe0, 0x54, 0xf0, 0xff, 0xc4, 0x54, 0x0f} },
+{ 0x8e73,      16,     {0x90, 0x01, 0x85, 0xf0, 0x90, 0x11, 0xfd, 0xe4, 0x93, 0x90, 0x01, 0x86, 0xf0, 0x90, 0x11, 0xfe} },
+{ 0x8e83,      16,     {0xe4, 0x93, 0x90, 0x01, 0x87, 0xf0, 0xe4, 0x90, 0x01, 0x7c, 0xf0, 0xa3, 0xf0, 0xa3, 0xf0, 0xa3} },
+{ 0x8e93,      16,     {0xf0, 0xa3, 0xf0, 0xa3, 0x74, 0x10, 0xf0, 0xa3, 0x74, 0x01, 0xf0, 0xa3, 0x74, 0x88, 0xf0, 0x7e} },
+{ 0x8ea3,      16,     {0x01, 0x7f, 0x7c, 0x12, 0x19, 0xc1, 0x7e, 0x01, 0x7f, 0x84, 0x75, 0x60, 0x00, 0x75, 0x5f, 0x00} },
+{ 0x8eb3,      13,     {0x75, 0x5e, 0x00, 0x75, 0x5d, 0x00, 0x7d, 0x14, 0x12, 0x8e, 0x0c, 0x7f, 0x00} },
+{ 0x8ec0,      1,      {0x22} },
+{ 0x8ec1,      4,      {0x8e, 0x4b, 0x8f, 0x4c} },
+{ 0x8ec5,      16,     {0x85, 0x4b, 0x4e, 0x85, 0x4c, 0x4f, 0xe5, 0x4f, 0x24, 0x01, 0xf5, 0x53, 0xe4, 0x35, 0x4e, 0xf5} },
+{ 0x8ed5,      16,     {0x52, 0x85, 0x4f, 0x82, 0x85, 0x4e, 0x83, 0xe0, 0x14, 0xb4, 0x0f, 0x00, 0x40, 0x03, 0x02, 0x8f} },
+{ 0x8ee5,      16,     {0xd6, 0x90, 0x8e, 0xed, 0xf8, 0x28, 0x28, 0x73, 0x02, 0x8f, 0x1a, 0x02, 0x8f, 0x26, 0x02, 0x8f} },
+{ 0x8ef5,      16,     {0x32, 0x02, 0x8f, 0x5c, 0x02, 0x8f, 0x67, 0x02, 0x8f, 0x72, 0x02, 0x8f, 0x7d, 0x02, 0x8f, 0x88} },
+{ 0x8f05,      16,     {0x02, 0x8f, 0x93, 0x02, 0x8f, 0x9e, 0x02, 0x8f, 0xa9, 0x02, 0x8f, 0xb0, 0x02, 0x8f, 0xd6, 0x02} },
+{ 0x8f15,      16,     {0x8f, 0xbb, 0x02, 0x8f, 0xc6, 0xaf, 0x53, 0xae, 0x52, 0x12, 0x83, 0x5f, 0x8f, 0x4d, 0x02, 0x8f} },
+{ 0x8f25,      16,     {0xd6, 0xaf, 0x53, 0xae, 0x52, 0x12, 0x84, 0x33, 0x8f, 0x4d, 0x02, 0x8f, 0xd6, 0x85, 0x52, 0x50} },
+{ 0x8f35,      16,     {0x85, 0x53, 0x51, 0xe5, 0x51, 0x24, 0x01, 0xff, 0xe4, 0x35, 0x50, 0xfe, 0x12, 0x85, 0x08, 0xaf} },
+{ 0x8f45,      16,     {0x51, 0xae, 0x50, 0x12, 0x85, 0x9b, 0xef, 0x70, 0x03, 0x02, 0x8f, 0xd6, 0xaf, 0x51, 0xae, 0x50} },
+{ 0x8f55,      16,     {0x12, 0x85, 0xe1, 0x8f, 0x4d, 0x80, 0x7a, 0xaf, 0x53, 0xae, 0x52, 0x12, 0x89, 0xc0, 0x8f, 0x4d} },
+{ 0x8f65,      16,     {0x80, 0x6f, 0xaf, 0x53, 0xae, 0x52, 0x12, 0x89, 0xfc, 0x8f, 0x4d, 0x80, 0x64, 0xaf, 0x53, 0xae} },
+{ 0x8f75,      16,     {0x52, 0x12, 0x8a, 0x38, 0x8f, 0x4d, 0x80, 0x59, 0xaf, 0x4c, 0xae, 0x4b, 0x12, 0x8b, 0x31, 0x8f} },
+{ 0x8f85,      16,     {0x4d, 0x80, 0x4e, 0xaf, 0x53, 0xae, 0x52, 0x12, 0x88, 0xef, 0x8f, 0x4d, 0x80, 0x43, 0xaf, 0x53} },
+{ 0x8f95,      16,     {0xae, 0x52, 0x12, 0x84, 0xc4, 0x8f, 0x4d, 0x80, 0x38, 0xaf, 0x53, 0xae, 0x52, 0x12, 0x89, 0x7b} },
+{ 0x8fa5,      16,     {0x8f, 0x4d, 0x80, 0x2d, 0x12, 0x8e, 0x63, 0x8f, 0x4d, 0x80, 0x26, 0xaf, 0x53, 0xae, 0x52, 0x12} },
+{ 0x8fb5,      16,     {0x11, 0xe5, 0x8f, 0x4d, 0x80, 0x1b, 0xaf, 0x53, 0xae, 0x52, 0x12, 0x8a, 0x70, 0x8f, 0x4d, 0x80} },
+{ 0x8fc5,      16,     {0x10, 0xaf, 0x4c, 0xae, 0x4b, 0x7c, 0x02, 0x7d, 0xaf, 0x7b, 0x40, 0x12, 0x8d, 0xd9, 0xe4, 0xf5} },
+{ 0x8fd5,      16,     {0x4d, 0x85, 0x4f, 0x82, 0x85, 0x4e, 0x83, 0xe0, 0xff, 0x14, 0x24, 0xfa, 0x50, 0x04, 0x24, 0xfe} },
+{ 0x8fe5,      16,     {0x70, 0x2b, 0x90, 0x01, 0x98, 0x74, 0x10, 0xf0, 0xa3, 0xef, 0xf0, 0x85, 0x53, 0x82, 0x85, 0x52} },
+{ 0x8ff5,      16,     {0x83, 0xe0, 0x90, 0x01, 0x9a, 0xf0, 0x7e, 0x01, 0x7f, 0x98, 0x75, 0x60, 0x00, 0x75, 0x5f, 0x00} },
+{ 0x9005,      15,     {0x75, 0x5e, 0x00, 0x75, 0x5d, 0x00, 0x7d, 0x03, 0x12, 0x8e, 0x0c, 0x8f, 0x4d, 0xaf, 0x4d} },
+{ 0x9014,      1,      {0x22} },
+{ 0x9015,      8,      {0x8f, 0x4e, 0x8e, 0x4d, 0x8d, 0x4c, 0x8c, 0x4b} },
+{ 0x901d,      16,     {0x75, 0x55, 0x01, 0x75, 0x56, 0x9c, 0xe4, 0xf5, 0x54, 0xaf, 0x50, 0x15, 0x50, 0xef, 0x70, 0x03} },
+{ 0x902d,      16,     {0x02, 0x90, 0xb3, 0xaf, 0x4f, 0xe4, 0xfc, 0xfd, 0xfe, 0xf8, 0xf9, 0xfa, 0xab, 0x07, 0xaf, 0x4e} },
+{ 0x903d,      16,     {0xae, 0x4d, 0xad, 0x4c, 0xac, 0x4b, 0x12, 0x9c, 0x58, 0xaf, 0x03, 0x8f, 0x53, 0xaf, 0x4e, 0xae} },
+{ 0x904d,      16,     {0x4d, 0xad, 0x4c, 0xac, 0x4b, 0xc0, 0x04, 0xc0, 0x05, 0xc0, 0x06, 0xc0, 0x07, 0xaf, 0x4f, 0xe4} },
+{ 0x905d,      16,     {0xfc, 0xfd, 0xfe, 0xf8, 0xf9, 0xfa, 0xab, 0x07, 0xd0, 0x07, 0xd0, 0x06, 0xd0, 0x05, 0xd0, 0x04} },
+{ 0x906d,      16,     {0x12, 0x9c, 0x58, 0x8f, 0x4e, 0x8e, 0x4d, 0x8d, 0x4c, 0x8c, 0x4b, 0xe5, 0x53, 0x24, 0x30, 0xf5} },
+{ 0x907d,      16,     {0x53, 0xd3, 0x94, 0x39, 0x40, 0x06, 0x74, 0x07, 0x25, 0x53, 0xf5, 0x53, 0x05, 0x56, 0xe5, 0x56} },
+{ 0x908d,      16,     {0xae, 0x55, 0x70, 0x02, 0x05, 0x55, 0x14, 0xf5, 0x82, 0x8e, 0x83, 0xe4, 0xf0, 0x05, 0x56, 0xe5} },
+{ 0x909d,      16,     {0x56, 0xae, 0x55, 0x70, 0x02, 0x05, 0x55, 0x14, 0xf5, 0x82, 0x8e, 0x83, 0xe5, 0x53, 0xf0, 0x05} },
+{ 0x90ad,      16,     {0x54, 0x05, 0x54, 0x02, 0x90, 0x26, 0xe5, 0x56, 0x15, 0x56, 0x70, 0x02, 0x15, 0x55, 0xaf, 0x54} },
+{ 0x90bd,      16,     {0x15, 0x54, 0xef, 0x60, 0x23, 0xe5, 0x56, 0x15, 0x56, 0xae, 0x55, 0x70, 0x02, 0x15, 0x55, 0xf5} },
+{ 0x90cd,      16,     {0x82, 0x8e, 0x83, 0xe0, 0xff, 0x05, 0x52, 0xe5, 0x52, 0xac, 0x51, 0x70, 0x02, 0x05, 0x51, 0x14} },
+{ 0x90dd,      8,      {0xf5, 0x82, 0x8c, 0x83, 0xef, 0xf0, 0x80, 0xd6} },
+{ 0x90e5,      1,      {0x22} },
+{ 0x90e6,      16,     {0xe4, 0x90, 0x01, 0xc9, 0xf0, 0x7e, 0x01, 0x7f, 0xca, 0x90, 0x01, 0xbe, 0xee, 0xf0, 0xa3, 0xef} },
+{ 0x90f6,      10,     {0xf0, 0x90, 0x01, 0xc2, 0xee, 0xf0, 0xa3, 0xef, 0xf0, 0x22} },
+{ 0x9100,      16,     {0xaa, 0x07, 0xa9, 0x05, 0x90, 0x01, 0xc9, 0xe0, 0xc3, 0x94, 0x40, 0x50, 0x61, 0xac, 0x02, 0x74} },
+{ 0x9110,      16,     {0x01, 0x7e, 0x00, 0xa8, 0x04, 0x08, 0x80, 0x05, 0xc3, 0x33, 0xce, 0x33, 0xce, 0xd8, 0xf9, 0xff} },
+{ 0x9120,      16,     {0xe4, 0xef, 0x55, 0x30, 0x60, 0x45, 0xea, 0x04, 0xff, 0x90, 0x01, 0xc2, 0xe0, 0xfc, 0xa3, 0xe0} },
+{ 0x9130,      16,     {0xfd, 0xf5, 0x82, 0x8c, 0x83, 0xef, 0xf0, 0xa3, 0xe9, 0xf0, 0x8d, 0x82, 0x8c, 0x83, 0xa3, 0xa3} },
+{ 0x9140,      16,     {0xeb, 0xf0, 0x90, 0x01, 0xc2, 0xe4, 0x75, 0xf0, 0x03, 0x12, 0x9b, 0xb8, 0xfc, 0xd3, 0xe5, 0xf0} },
+{ 0x9150,      16,     {0x94, 0x87, 0xec, 0x94, 0x02, 0x40, 0x0a, 0x90, 0x01, 0xc2, 0x74, 0x01, 0xf0, 0xa3, 0x74, 0xca} },
+{ 0x9160,      16,     {0xf0, 0xc2, 0xaf, 0x90, 0x01, 0xc9, 0xe0, 0x04, 0xf0, 0xd2, 0xaf, 0x7f, 0x01, 0x22, 0x7f, 0x00} },
+{ 0x9170,      1,      {0x22} },
+{ 0x9171,      16,     {0x90, 0x01, 0xc9, 0xe0, 0xd3, 0x94, 0x00, 0x40, 0x55, 0x90, 0x01, 0xbe, 0xe0, 0xfc, 0xa3, 0xe0} },
+{ 0x9181,      16,     {0xaa, 0x04, 0xf9, 0x7b, 0x01, 0xc0, 0x03, 0xc0, 0x02, 0xc0, 0x01, 0xaa, 0x06, 0xa9, 0x07, 0xa8} },
+{ 0x9191,      16,     {0x01, 0xac, 0x02, 0xad, 0x03, 0xd0, 0x01, 0xd0, 0x02, 0xd0, 0x03, 0x7e, 0x00, 0x7f, 0x03, 0x12} },
+{ 0x91a1,      16,     {0x9b, 0x49, 0x90, 0x01, 0xbe, 0xe4, 0x75, 0xf0, 0x03, 0x12, 0x9b, 0xb8, 0xfc, 0xd3, 0xe5, 0xf0} },
+{ 0x91b1,      16,     {0x94, 0x87, 0xec, 0x94, 0x02, 0x40, 0x0a, 0x90, 0x01, 0xbe, 0x74, 0x01, 0xf0, 0xa3, 0x74, 0xca} },
+{ 0x91c1,      16,     {0xf0, 0xc2, 0xaf, 0x90, 0x01, 0xc9, 0xe0, 0x14, 0xf0, 0xd2, 0xaf, 0x7f, 0x01, 0x22, 0x7f, 0x00} },
+{ 0x91d1,      1,      {0x22} },
+{ 0x91d2,      16,     {0x90, 0x7f, 0xc2, 0xe0, 0x20, 0xe1, 0x5e, 0x7e, 0x7b, 0x7f, 0x80, 0x75, 0x50, 0x7b, 0x75, 0x51} },
+{ 0x91e2,      16,     {0x80, 0xe5, 0x51, 0x24, 0x01, 0xff, 0xe4, 0x35, 0x50, 0xa9, 0x07, 0x7b, 0x01, 0x8b, 0x52, 0xf5} },
+{ 0x91f2,      16,     {0x53, 0x89, 0x54, 0xfe, 0x12, 0x91, 0x71, 0xef, 0x60, 0x3b, 0xab, 0x52, 0xaa, 0x53, 0xa9, 0x54} },
+{ 0x9202,      16,     {0x12, 0x9b, 0x72, 0x14, 0xff, 0x90, 0x00, 0x01, 0x12, 0x9b, 0x8b, 0xb4, 0x02, 0x16, 0xc2, 0xaf} },
+{ 0x9212,      16,     {0xef, 0x75, 0xf0, 0x08, 0xa4, 0x24, 0x01, 0xf5, 0x82, 0xe4, 0x34, 0x20, 0xf5, 0x83, 0xe0, 0x44} },
+{ 0x9222,      16,     {0x04, 0xf0, 0xd2, 0xaf, 0x85, 0x51, 0x82, 0x85, 0x50, 0x83, 0x74, 0x0d, 0xf0, 0x90, 0x7f, 0xc3} },
+{ 0x9232,      5,      {0x74, 0x04, 0xf0, 0xd2, 0xaf} },
+{ 0x9237,      1,      {0x22} },
+{ 0x9238,      16,     {0x12, 0x91, 0xd2, 0xe4, 0xf5, 0x4b, 0x74, 0x36, 0x25, 0x4b, 0xf8, 0xe6, 0x54, 0xf0, 0xf5, 0x4c} },
+{ 0x9248,      16,     {0x74, 0xc5, 0x25, 0x4b, 0xf5, 0x82, 0xe4, 0x34, 0x01, 0xf5, 0x83, 0xe0, 0x65, 0x4c, 0xff, 0xc4} },
+{ 0x9258,      16,     {0x54, 0x0f, 0xf5, 0x4d, 0x60, 0x22, 0x74, 0xc5, 0x25, 0x4b, 0xf5, 0x82, 0xe4, 0x34, 0x01, 0xf5} },
+{ 0x9268,      16,     {0x83, 0xe5, 0x4c, 0xf0, 0xaf, 0x4b, 0x7d, 0x01, 0xe5, 0x4c, 0x45, 0x4d, 0xfb, 0x12, 0x91, 0x00} },
+{ 0x9278,      16,     {0xef, 0x70, 0x05, 0x12, 0x91, 0xd2, 0x80, 0xec, 0x05, 0x4b, 0xe5, 0x4b, 0xc3, 0x94, 0x04, 0x40} },
+{ 0x9288,      16,     {0xb5, 0x12, 0x91, 0xd2, 0xe5, 0x3a, 0x60, 0x48, 0xe4, 0xf5, 0x4b, 0xaf, 0x4b, 0x74, 0x01, 0xa8} },
+{ 0x9298,      16,     {0x07, 0x08, 0x80, 0x02, 0xc3, 0x33, 0xd8, 0xfc, 0xf5, 0x4c, 0x55, 0x3a, 0x60, 0x29, 0xe5, 0x4b} },
+{ 0x92a8,      16,     {0x75, 0xf0, 0x08, 0xa4, 0x24, 0x05, 0xf5, 0x82, 0xe4, 0x34, 0x20, 0xf5, 0x83, 0xe0, 0x30, 0xe6} },
+{ 0x92b8,      16,     {0x16, 0xaf, 0x4b, 0x7d, 0x04, 0x7b, 0x80, 0x12, 0x91, 0x00, 0xef, 0x70, 0x05, 0x12, 0x91, 0xd2} },
+{ 0x92c8,      16,     {0x80, 0xef, 0xe5, 0x4c, 0xf4, 0x52, 0x3a, 0x05, 0x4b, 0xe5, 0x4b, 0xc3, 0x94, 0x04, 0x40, 0xbb} },
+{ 0x92d8,      16,     {0x90, 0x03, 0x00, 0xe0, 0x60, 0x03, 0x02, 0x93, 0xa5, 0x74, 0x19, 0xf0, 0x7f, 0x02, 0x12, 0x81} },
+{ 0x92e8,      16,     {0x11, 0x8e, 0x4e, 0x8f, 0x4f, 0xc3, 0xe5, 0x4e, 0x64, 0x80, 0x94, 0x80, 0x40, 0xee, 0x90, 0x01} },
+{ 0x92f8,      16,     {0xbc, 0xe0, 0x65, 0x4f, 0xf0, 0x60, 0x37, 0xe4, 0xf5, 0x4b, 0xaf, 0x4b, 0x74, 0x01, 0xa8, 0x07} },
+{ 0x9308,      16,     {0x08, 0x80, 0x02, 0xc3, 0x33, 0xd8, 0xfc, 0xf5, 0x4c, 0x90, 0x01, 0xbc, 0xe0, 0x55, 0x4c, 0x60} },
+{ 0x9318,      16,     {0x14, 0xaf, 0x4b, 0x7d, 0x08, 0xe5, 0x4c, 0x55, 0x4f, 0xfb, 0x12, 0x91, 0x00, 0xef, 0x70, 0x05} },
+{ 0x9328,      16,     {0x12, 0x91, 0xd2, 0x80, 0xec, 0x05, 0x4b, 0xe5, 0x4b, 0xc3, 0x94, 0x04, 0x40, 0xcc, 0x90, 0x01} },
+{ 0x9338,      16,     {0xbc, 0xe5, 0x4f, 0xf0, 0xe4, 0xf5, 0x4b, 0xc2, 0xaf, 0x74, 0x32, 0x25, 0x4b, 0xf8, 0xe6, 0xf5} },
+{ 0x9348,      16,     {0x4c, 0xe4, 0xf6, 0xd2, 0xaf, 0x53, 0x4c, 0x1e, 0xe5, 0x4c, 0x60, 0x11, 0xaf, 0x4b, 0x7d, 0x02} },
+{ 0x9358,      16,     {0xab, 0x4c, 0x12, 0x91, 0x00, 0xef, 0x70, 0x05, 0x12, 0x91, 0xd2, 0x80, 0xef, 0x74, 0x2c, 0x25} },
+{ 0x9368,      16,     {0x4b, 0xf8, 0xe6, 0xf5, 0x4c, 0x74, 0xfc, 0x25, 0x4b, 0xf5, 0x82, 0xe4, 0x34, 0x02, 0xf5, 0x83} },
+{ 0x9378,      16,     {0xe0, 0x65, 0x4c, 0x60, 0x11, 0xaf, 0x4b, 0x7d, 0x04, 0xab, 0x4c, 0x12, 0x91, 0x00, 0xef, 0x70} },
+{ 0x9388,      16,     {0x05, 0x12, 0x91, 0xd2, 0x80, 0xef, 0x74, 0xfc, 0x25, 0x4b, 0xf5, 0x82, 0xe4, 0x34, 0x02, 0xf5} },
+{ 0x9398,      16,     {0x83, 0xe5, 0x4c, 0xf0, 0x05, 0x4b, 0xe5, 0x4b, 0xc3, 0x94, 0x04, 0x40, 0x9a, 0x12, 0x91, 0xd2} },
+{ 0x93a8,      1,      {0x22} },
+{ 0x93a9,      12,     {0x78, 0x7f, 0xe4, 0xf6, 0xd8, 0xfd, 0x75, 0x81, 0x64, 0x02, 0x93, 0xf0} },
+{ 0x93b5,      16,     {0x02, 0x05, 0xa3, 0xe4, 0x93, 0xa3, 0xf8, 0xe4, 0x93, 0xa3, 0x40, 0x03, 0xf6, 0x80, 0x01, 0xf2} },
+{ 0x93c5,      16,     {0x08, 0xdf, 0xf4, 0x80, 0x29, 0xe4, 0x93, 0xa3, 0xf8, 0x54, 0x07, 0x24, 0x0c, 0xc8, 0xc3, 0x33} },
+{ 0x93d5,      16,     {0xc4, 0x54, 0x0f, 0x44, 0x20, 0xc8, 0x83, 0x40, 0x04, 0xf4, 0x56, 0x80, 0x01, 0x46, 0xf6, 0xdf} },
+{ 0x93e5,      16,     {0xe4, 0x80, 0x0b, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x90, 0x94, 0x35, 0xe4, 0x7e} },
+{ 0x93f5,      16,     {0x01, 0x93, 0x60, 0xbc, 0xa3, 0xff, 0x54, 0x3f, 0x30, 0xe5, 0x09, 0x54, 0x1f, 0xfe, 0xe4, 0x93} },
+{ 0x9405,      16,     {0xa3, 0x60, 0x01, 0x0e, 0xcf, 0x54, 0xc0, 0x25, 0xe0, 0x60, 0xa8, 0x40, 0xb8, 0xe4, 0x93, 0xa3} },
+{ 0x9415,      16,     {0xfa, 0xe4, 0x93, 0xa3, 0xf8, 0xe4, 0x93, 0xa3, 0xc8, 0xc5, 0x82, 0xc8, 0xca, 0xc5, 0x83, 0xca} },
+{ 0x9425,      16,     {0xf0, 0xa3, 0xc8, 0xc5, 0x82, 0xc8, 0xca, 0xc5, 0x83, 0xca, 0xdf, 0xe9, 0xde, 0xe7, 0x80, 0xbe} },
+{ 0x9435,      16,     {0x60, 0x24, 0x02, 0x8a, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x81, 0x82, 0x84, 0x88} },
+{ 0x9445,      16,     {0x90, 0xa0, 0xc0, 0xc1, 0xc2, 0xc4, 0xc8, 0xd0, 0xe0, 0xe1, 0xe2, 0xe4, 0xe8, 0xf0, 0xf1, 0xf2} },
+{ 0x9455,      8,      {0xf4, 0xf8, 0xf9, 0xfa, 0xfc, 0xfd, 0xfe, 0xff} },
+{ 0x945d,      1,      {0x00} },
+{ 0x945e,      11,     {0xc0, 0xe0, 0xc0, 0x83, 0xc0, 0x82, 0xc0, 0xd0, 0x75, 0xd0, 0x18} },
+{ 0x9469,      16,     {0x90, 0x20, 0x60, 0xe0, 0x54, 0x0f, 0xfe, 0x30, 0xe0, 0x05, 0x90, 0x20, 0x02, 0xe0, 0xff, 0xee} },
+{ 0x9479,      16,     {0x30, 0xe1, 0x05, 0x90, 0x20, 0x0a, 0xe0, 0xff, 0xee, 0x30, 0xe2, 0x05, 0x90, 0x20, 0x12, 0xe0} },
+{ 0x9489,      16,     {0xff, 0xee, 0x30, 0xe3, 0x05, 0x90, 0x20, 0x1a, 0xe0, 0xff, 0x90, 0x01, 0xc4, 0xe0, 0xb5, 0x1e} },
+{ 0x9499,      10,     {0x04, 0xe4, 0xf0, 0x80, 0x05, 0x90, 0x01, 0xc4, 0xee, 0xf0} },
+{ 0x94a3,      9,      {0xd0, 0xd0, 0xd0, 0x82, 0xd0, 0x83, 0xd0, 0xe0, 0x32} },
+{ 0x94ac,      2,      {0xa9, 0x03} },
+{ 0x94ae,      16,     {0xef, 0x75, 0xf0, 0x08, 0xa4, 0x24, 0x00, 0xf5, 0x82, 0xe4, 0x34, 0x20, 0xab, 0x82, 0xfa, 0xe5} },
+{ 0x94be,      16,     {0x57, 0x45, 0x58, 0xf5, 0x59, 0xe9, 0x60, 0x14, 0x8a, 0x83, 0xe5, 0x82, 0x24, 0x04, 0xf5, 0x82} },
+{ 0x94ce,      16,     {0xe4, 0x35, 0x83, 0xf5, 0x83, 0xe0, 0x4d, 0xf0, 0xe4, 0xfe, 0x80, 0x13, 0xeb, 0x24, 0x04, 0xf5} },
+{ 0x94de,      16,     {0x82, 0xe4, 0x3a, 0xf5, 0x83, 0xe0, 0xff, 0xed, 0xf4, 0xfc, 0xef, 0x5c, 0xf0, 0xae, 0x59, 0xeb} },
+{ 0x94ee,      16,     {0x24, 0x06, 0xf5, 0x82, 0xe4, 0x3a, 0xf5, 0x83, 0xe0, 0x55, 0x59, 0xfc, 0xb5, 0x06, 0x03, 0xaf} },
+{ 0x94fe,      16,     {0x05, 0x22, 0xe5, 0x57, 0x5c, 0xfe, 0xe5, 0x58, 0x5c, 0xfd, 0xe9, 0x60, 0x16, 0xee, 0x70, 0x04} },
+{ 0x950e,      16,     {0x7f, 0x01, 0x80, 0x02, 0x7f, 0x00, 0xae, 0x07, 0xed, 0x70, 0x04, 0x7f, 0x01, 0x80, 0x02, 0x7f} },
+{ 0x951e,      16,     {0x00, 0xad, 0x07, 0xee, 0x60, 0x03, 0xaf, 0x57, 0x22, 0xed, 0x60, 0x03, 0xaf, 0x58, 0x22, 0x7f} },
+{ 0x952e,      1,      {0x00} },
+{ 0x952f,      1,      {0x22} },
+{ 0x9530,      16,     {0x75, 0x50, 0x02, 0x75, 0x51, 0xb0, 0x90, 0x03, 0x35, 0x74, 0x0f, 0xf0, 0x85, 0x51, 0x82, 0x85} },
+{ 0x9540,      16,     {0x50, 0x83, 0xe0, 0xff, 0x90, 0x03, 0x36, 0xf0, 0x85, 0x51, 0x82, 0x85, 0x50, 0x83, 0xa3, 0xe0} },
+{ 0x9550,      16,     {0x90, 0x03, 0x37, 0xf0, 0xa3, 0x74, 0xff, 0xf0, 0x75, 0x52, 0x03, 0x75, 0x53, 0x39, 0xef, 0x14} },
+{ 0x9560,      16,     {0xb4, 0x0b, 0x00, 0x40, 0x03, 0x02, 0x99, 0x98, 0x90, 0x95, 0x6f, 0xf8, 0x28, 0x28, 0x73, 0x02} },
+{ 0x9570,      16,     {0x95, 0x90, 0x02, 0x96, 0x2f, 0x02, 0x97, 0x34, 0x02, 0x97, 0x54, 0x02, 0x97, 0x54, 0x02, 0x97} },
+{ 0x9580,      16,     {0xef, 0x02, 0x98, 0x2a, 0x02, 0x98, 0x4f, 0x02, 0x99, 0x0d, 0x02, 0x99, 0x39, 0x02, 0x99, 0x65} },
+{ 0x9590,      16,     {0xe4, 0xf5, 0x4b, 0xe5, 0x4b, 0x75, 0xf0, 0x08, 0xa4, 0x24, 0x00, 0xf5, 0x82, 0xe4, 0x34, 0x20} },
+{ 0x95a0,      16,     {0xaf, 0x82, 0xf5, 0x4e, 0x8f, 0x4f, 0xe4, 0xff, 0xe4, 0xfe, 0xef, 0x60, 0x10, 0x74, 0x8a, 0x2e} },
+{ 0x95b0,      16,     {0xf5, 0x82, 0xe4, 0x34, 0x02, 0xf5, 0x83, 0xe0, 0xf4, 0xf5, 0x4c, 0x80, 0x0d, 0x74, 0x8a, 0x2e} },
+{ 0x95c0,      16,     {0xf5, 0x82, 0xe4, 0x34, 0x02, 0xf5, 0x83, 0xe0, 0xf5, 0x4c, 0xe5, 0x4f, 0x24, 0x07, 0xf5, 0x82} },
+{ 0x95d0,      16,     {0xe4, 0x35, 0x4e, 0xf5, 0x83, 0xe5, 0x4c, 0xf0, 0xe0, 0xf5, 0x4d, 0x65, 0x4c, 0x60, 0x38, 0xe4} },
+{ 0x95e0,      16,     {0x90, 0x03, 0x38, 0xf0, 0xe5, 0x4b, 0x04, 0xfd, 0x05, 0x53, 0xe5, 0x53, 0xaa, 0x52, 0x70, 0x02} },
+{ 0x95f0,      16,     {0x05, 0x52, 0x14, 0xf5, 0x82, 0x8a, 0x83, 0xed, 0xf0, 0x05, 0x53, 0xe5, 0x53, 0xac, 0x52, 0x70} },
+{ 0x9600,      16,     {0x02, 0x05, 0x52, 0x14, 0xf5, 0x82, 0x8c, 0x83, 0xe5, 0x4c, 0xf0, 0x85, 0x53, 0x82, 0x85, 0x52} },
+{ 0x9610,      16,     {0x83, 0xe5, 0x4d, 0xf0, 0x02, 0x99, 0x9e, 0x0e, 0xbe, 0x24, 0x8f, 0x0f, 0xef, 0x64, 0x02, 0x70} },
+{ 0x9620,      16,     {0x87, 0x05, 0x4b, 0xe5, 0x4b, 0x64, 0x04, 0x60, 0x03, 0x02, 0x95, 0x93, 0x02, 0x99, 0x9e, 0xe4} },
+{ 0x9630,      16,     {0xf5, 0x4b, 0xaf, 0x4b, 0xe4, 0xfd, 0x12, 0x82, 0x50, 0x05, 0x4b, 0xe5, 0x4b, 0xd3, 0x94, 0x03} },
+{ 0x9640,      16,     {0x40, 0xf0, 0x90, 0x00, 0x04, 0x74, 0x94, 0xf0, 0xa3, 0x74, 0x5e, 0xf0, 0xe4, 0xf5, 0x4d, 0x7e} },
+{ 0x9650,      16,     {0x20, 0x7f, 0x00, 0x75, 0x4e, 0x20, 0x75, 0x4f, 0x00, 0xf5, 0x4b, 0xaf, 0x4b, 0x74, 0x01, 0xa8} },
+{ 0x9660,      16,     {0x07, 0x08, 0x80, 0x02, 0xc3, 0x33, 0xd8, 0xfc, 0xf5, 0x4c, 0x90, 0x01, 0xc4, 0xf0, 0x90, 0x01} },
+{ 0x9670,      16,     {0xc0, 0xe4, 0xf0, 0xa3, 0x74, 0x0a, 0xf0, 0x85, 0x4f, 0x82, 0x85, 0x4e, 0x83, 0xa3, 0x74, 0x02} },
+{ 0x9680,      16,     {0xf0, 0x90, 0x01, 0xc4, 0xe0, 0xb5, 0x4c, 0x34, 0x90, 0x01, 0xc0, 0xe0, 0x70, 0x02, 0xa3, 0xe0} },
+{ 0x9690,      16,     {0x70, 0xef, 0x90, 0x03, 0x38, 0xf0, 0xe5, 0x4b, 0x04, 0xff, 0x05, 0x53, 0xe5, 0x53, 0xac, 0x52} },
+{ 0x96a0,      16,     {0x70, 0x02, 0x05, 0x52, 0x14, 0xf5, 0x82, 0x8c, 0x83, 0xef, 0xf0, 0x85, 0x53, 0x82, 0x85, 0x52} },
+{ 0x96b0,      16,     {0x83, 0x74, 0xff, 0xf0, 0xe4, 0x90, 0x01, 0xc4, 0xf0, 0x75, 0x4d, 0xff, 0x90, 0x01, 0xc4, 0xe0} },
+{ 0x96c0,      16,     {0xff, 0x60, 0x37, 0xe4, 0x90, 0x03, 0x38, 0xf0, 0xe5, 0x4b, 0x04, 0xfe, 0x05, 0x53, 0xe5, 0x53} },
+{ 0x96d0,      16,     {0xac, 0x52, 0x70, 0x02, 0x05, 0x52, 0x14, 0xf5, 0x82, 0x8c, 0x83, 0xee, 0xf0, 0x05, 0x53, 0xe5} },
+{ 0x96e0,      16,     {0x53, 0xac, 0x52, 0x70, 0x02, 0x05, 0x52, 0x14, 0xf5, 0x82, 0x8c, 0x83, 0xef, 0xf0, 0x85, 0x53} },
+{ 0x96f0,      16,     {0x82, 0x85, 0x52, 0x83, 0xe5, 0x4c, 0xf0, 0x75, 0x4d, 0xff, 0xe5, 0x4d, 0x70, 0x16, 0x74, 0x08} },
+{ 0x9700,      16,     {0x25, 0x4f, 0xf5, 0x4f, 0xe4, 0x35, 0x4e, 0xf5, 0x4e, 0x05, 0x4b, 0xe5, 0x4b, 0x64, 0x04, 0x60} },
+{ 0x9710,      16,     {0x03, 0x02, 0x96, 0x5b, 0xe4, 0xf5, 0x4b, 0xaf, 0x4b, 0x7d, 0x01, 0x12, 0x82, 0x50, 0x05, 0x4b} },
+{ 0x9720,      16,     {0xe5, 0x4b, 0xd3, 0x94, 0x03, 0x40, 0xf0, 0x90, 0x00, 0x04, 0x74, 0x13, 0xf0, 0xa3, 0x74, 0x12} },
+{ 0x9730,      16,     {0xf0, 0x02, 0x99, 0x9e, 0x85, 0x51, 0x82, 0x85, 0x50, 0x83, 0xa3, 0xe0, 0x14, 0xff, 0x74, 0x01} },
+{ 0x9740,      16,     {0xa8, 0x07, 0x08, 0x80, 0x02, 0xc3, 0x33, 0xd8, 0xfc, 0x90, 0x02, 0xf7, 0xf0, 0x90, 0x01, 0xc4} },
+{ 0x9750,      16,     {0xf0, 0x02, 0x99, 0x9e, 0x90, 0x01, 0xc0, 0x74, 0x03, 0xf0, 0xa3, 0x74, 0xe8, 0xf0, 0xe4, 0xf5} },
+{ 0x9760,      16,     {0x4d, 0x90, 0x02, 0xf7, 0xe0, 0xff, 0x90, 0x01, 0xc4, 0xe0, 0xb5, 0x07, 0x19, 0x90, 0x01, 0xc0} },
+{ 0x9770,      16,     {0xe0, 0x70, 0x02, 0xa3, 0xe0, 0x70, 0xea, 0x90, 0x03, 0x38, 0xf0, 0x85, 0x53, 0x82, 0x85, 0x52} },
+{ 0x9780,      16,     {0x83, 0x74, 0xff, 0xf0, 0xf5, 0x4d, 0xe5, 0x4d, 0x60, 0x03, 0x02, 0x99, 0x9e, 0x90, 0x01, 0xc0} },
+{ 0x9790,      16,     {0xf0, 0xa3, 0x74, 0x96, 0xf0, 0x90, 0x01, 0xc0, 0xe0, 0x70, 0x02, 0xa3, 0xe0, 0x70, 0xf6, 0x7f} },
+{ 0x97a0,      16,     {0x02, 0x12, 0x81, 0x11, 0xc3, 0xee, 0x64, 0x80, 0x94, 0x80, 0x40, 0xf3, 0xef, 0x54, 0x0f, 0xf5} },
+{ 0x97b0,      16,     {0x4d, 0x90, 0x02, 0xf7, 0xe0, 0x55, 0x4d, 0x70, 0x04, 0x7f, 0x01, 0x80, 0x02, 0x7f, 0x00, 0x8f} },
+{ 0x97c0,      16,     {0x4c, 0x85, 0x51, 0x82, 0x85, 0x50, 0x83, 0xe0, 0xb4, 0x05, 0x0c, 0xe5, 0x4c, 0x70, 0x04, 0x7f} },
+{ 0x97d0,      16,     {0x01, 0x80, 0x02, 0x7f, 0x00, 0x8f, 0x4c, 0xe5, 0x4c, 0x70, 0x03, 0x02, 0x99, 0x9e, 0xe4, 0x90} },
+{ 0x97e0,      16,     {0x03, 0x38, 0xf0, 0x85, 0x53, 0x82, 0x85, 0x52, 0x83, 0xe5, 0x4d, 0xf0, 0x02, 0x99, 0x9e, 0xe4} },
+{ 0x97f0,      16,     {0xff, 0xfd, 0x12, 0x82, 0x50, 0x7e, 0x20, 0x7f, 0x00, 0x75, 0x4e, 0x20, 0x75, 0x4f, 0x00, 0x85} },
+{ 0x9800,      16,     {0x4f, 0x82, 0x85, 0x4e, 0x83, 0xa3, 0xa3, 0xa3, 0xe0, 0x44, 0x80, 0xf0, 0x85, 0x4f, 0x82, 0x85} },
+{ 0x9810,      16,     {0x4e, 0x83, 0x74, 0x01, 0xf0, 0xa3, 0xe4, 0xf0, 0x85, 0x4f, 0x82, 0x85, 0x4e, 0x83, 0xa3, 0xa3} },
+{ 0x9820,      16,     {0xa3, 0xe0, 0x54, 0x7f, 0xf0, 0xd2, 0x04, 0x02, 0x99, 0x9e, 0xc2, 0x04, 0x7e, 0x20, 0x7f, 0x00} },
+{ 0x9830,      16,     {0x75, 0x4e, 0x20, 0x75, 0x4f, 0x00, 0xe5, 0x4f, 0x24, 0x05, 0xf5, 0x82, 0xe4, 0x35, 0x4e, 0xf5} },
+{ 0x9840,      16,     {0x83, 0xe0, 0x30, 0xe6, 0xf1, 0xe4, 0xff, 0x7d, 0x01, 0x12, 0x82, 0x50, 0x02, 0x99, 0x9e, 0xe4} },
+{ 0x9850,      16,     {0xf5, 0x4d, 0xf5, 0x4b, 0xaf, 0x4b, 0xe4, 0xfd, 0x12, 0x82, 0x50, 0xe5, 0x4b, 0x75, 0xf0, 0x08} },
+{ 0x9860,      16,     {0xa4, 0x24, 0x00, 0xf5, 0x82, 0xe4, 0x34, 0x20, 0xaf, 0x82, 0xf5, 0x4e, 0x8f, 0x4f, 0xf5, 0x83} },
+{ 0x9870,      16,     {0xe5, 0x82, 0x24, 0x04, 0xf5, 0x82, 0xe4, 0x35, 0x83, 0xf5, 0x83, 0xe0, 0x54, 0xfc, 0xf0, 0xaf} },
+{ 0x9880,      16,     {0x4b, 0x7d, 0x01, 0x7b, 0x01, 0x75, 0x57, 0x80, 0x75, 0x58, 0x40, 0x12, 0x94, 0xac, 0x8f, 0x4d} },
+{ 0x9890,      16,     {0xe5, 0x4d, 0x70, 0x11, 0xaf, 0x4b, 0x7d, 0x02, 0x7b, 0x01, 0x75, 0x57, 0x10, 0x75, 0x58, 0x20} },
+{ 0x98a0,      16,     {0x12, 0x94, 0xac, 0x8f, 0x4d, 0xe5, 0x4d, 0x70, 0x10, 0xaf, 0x4b, 0x7d, 0x01, 0xfb, 0x75, 0x57} },
+{ 0x98b0,      16,     {0x80, 0x75, 0x58, 0x40, 0x12, 0x94, 0xac, 0x8f, 0x4d, 0xe5, 0x4d, 0x70, 0x10, 0xaf, 0x4b, 0x7d} },
+{ 0x98c0,      16,     {0x02, 0xfb, 0x75, 0x57, 0x10, 0x75, 0x58, 0x20, 0x12, 0x94, 0xac, 0x8f, 0x4d, 0xaf, 0x4b, 0x7d} },
+{ 0x98d0,      16,     {0x01, 0x12, 0x82, 0x50, 0xe5, 0x4d, 0x60, 0x26, 0xe4, 0x90, 0x03, 0x38, 0xf0, 0xe5, 0x4b, 0x04} },
+{ 0x98e0,      16,     {0xff, 0x05, 0x53, 0xe5, 0x53, 0xac, 0x52, 0x70, 0x02, 0x05, 0x52, 0x14, 0xf5, 0x82, 0x8c, 0x83} },
+{ 0x98f0,      16,     {0xef, 0xf0, 0x85, 0x53, 0x82, 0x85, 0x52, 0x83, 0xe5, 0x4d, 0xf0, 0x02, 0x99, 0x9e, 0x05, 0x4b} },
+{ 0x9900,      16,     {0xe5, 0x4b, 0xd3, 0x94, 0x03, 0x50, 0x03, 0x02, 0x98, 0x54, 0x02, 0x99, 0x9e, 0xe4, 0x90, 0x03} },
+{ 0x9910,      16,     {0x59, 0xf0, 0xa3, 0xf0, 0xa3, 0xf0, 0xa3, 0xf0, 0xa3, 0xf0, 0xa3, 0x74, 0x10, 0xf0, 0xa3, 0x74} },
+{ 0x9920,      16,     {0x1b, 0xf0, 0xa3, 0x74, 0x29, 0xf0, 0x7e, 0x03, 0x7f, 0x59, 0x12, 0x80, 0x00, 0xef, 0x64, 0x08} },
+{ 0x9930,      16,     {0x60, 0x6c, 0xe4, 0x90, 0x03, 0x38, 0xf0, 0x80, 0x65, 0xe4, 0x90, 0x03, 0x59, 0xf0, 0xa3, 0xf0} },
+{ 0x9940,      16,     {0xa3, 0xf0, 0xa3, 0xf0, 0xa3, 0xf0, 0xa3, 0x74, 0x10, 0xf0, 0xa3, 0xe5, 0x52, 0xf0, 0xa3, 0xe5} },
+{ 0x9950,      16,     {0x53, 0xf0, 0x7e, 0x03, 0x7f, 0x59, 0x12, 0x19, 0xc1, 0xef, 0x64, 0x08, 0x60, 0x40, 0xe4, 0x90} },
+{ 0x9960,      16,     {0x03, 0x38, 0xf0, 0x80, 0x39, 0xe4, 0x90, 0x03, 0x59, 0xf0, 0xa3, 0xf0, 0xa3, 0xf0, 0xa3, 0xf0} },
+{ 0x9970,      16,     {0xa3, 0xf0, 0xa3, 0x74, 0x10, 0xf0, 0xe5, 0x51, 0x24, 0x02, 0x90, 0x03, 0x60, 0xf0, 0xe4, 0x35} },
+{ 0x9980,      16,     {0x50, 0x90, 0x03, 0x5f, 0xf0, 0x7e, 0x03, 0x7f, 0x59, 0x12, 0x80, 0x00, 0xef, 0x64, 0x08, 0x60} },
+{ 0x9990,      16,     {0x0d, 0xe4, 0x90, 0x03, 0x38, 0xf0, 0x80, 0x06, 0x90, 0x03, 0x38, 0x74, 0x01, 0xf0, 0x90, 0x01} },
+{ 0x99a0,      16,     {0xc0, 0xe4, 0xf0, 0xa3, 0x74, 0x0a, 0xf0, 0x90, 0x01, 0xc0, 0xe0, 0x70, 0x02, 0xa3, 0xe0, 0x70} },
+{ 0x99b0,      16,     {0xf6, 0x7e, 0x03, 0x7f, 0x35, 0x75, 0x60, 0x00, 0x75, 0x5f, 0x00, 0x75, 0x5e, 0x00, 0x75, 0x5d} },
+{ 0x99c0,      11,     {0x00, 0x7d, 0x24, 0x12, 0x8e, 0x0c, 0xe4, 0x90, 0x02, 0xaf, 0xf0} },
+{ 0x99cb,      1,      {0x22} },
+{ 0x99cc,      16,     {0xe4, 0xff, 0x74, 0xf8, 0x2f, 0xf5, 0x82, 0xe4, 0x34, 0x02, 0xf5, 0x83, 0xe0, 0x70, 0x03, 0x02} },
+{ 0x99dc,      16,     {0x9a, 0x6f, 0x74, 0x36, 0x2f, 0xf8, 0xe6, 0x20, 0xe5, 0x03, 0x02, 0x9a, 0x6f, 0xef, 0x75, 0xf0} },
+{ 0x99ec,      16,     {0x08, 0xa4, 0x24, 0x00, 0xf5, 0x82, 0xe4, 0x34, 0x20, 0xad, 0x82, 0xfc, 0xf5, 0x83, 0xe5, 0x82} },
+{ 0x99fc,      16,     {0x24, 0x05, 0xf5, 0x82, 0xe4, 0x35, 0x83, 0xf5, 0x83, 0xe0, 0x54, 0x60, 0x64, 0x60, 0x70, 0x63} },
+{ 0x9a0c,      16,     {0xef, 0x25, 0xe0, 0x24, 0xef, 0xf5, 0x82, 0xe4, 0x34, 0x02, 0xf5, 0x83, 0xe4, 0x75, 0xf0, 0x01} },
+{ 0x9a1c,      16,     {0x12, 0x9b, 0xce, 0x85, 0xf0, 0x82, 0xf5, 0x83, 0xe0, 0x8d, 0x82, 0x8c, 0x83, 0xf0, 0x74, 0xf8} },
+{ 0x9a2c,      16,     {0x2f, 0xf5, 0x82, 0xe4, 0x34, 0x02, 0xf5, 0x83, 0xe0, 0x14, 0xf0, 0x70, 0x36, 0xef, 0x25, 0xe0} },
+{ 0x9a3c,      16,     {0x24, 0xc7, 0xf5, 0x82, 0xe4, 0x34, 0x7f, 0xf5, 0x83, 0xe4, 0xf0, 0xef, 0x25, 0xe0, 0xfe, 0xc3} },
+{ 0x9a4c,      16,     {0x74, 0x0c, 0x9e, 0x75, 0xf0, 0x40, 0xa4, 0x24, 0x40, 0xf5, 0x82, 0xe5, 0xf0, 0x34, 0x7b, 0xad} },
+{ 0x9a5c,      16,     {0x82, 0xfc, 0xef, 0x25, 0xe0, 0x24, 0xef, 0xf5, 0x82, 0xe4, 0x34, 0x02, 0xf5, 0x83, 0xec, 0xf0} },
+{ 0x9a6c,      12,     {0xa3, 0xed, 0xf0, 0x0f, 0xef, 0x64, 0x04, 0x60, 0x03, 0x02, 0x99, 0xce} },
+{ 0x9a78,      1,      {0x22} },
+{ 0x9a79,      16,     {0xe7, 0x09, 0xf6, 0x08, 0xdf, 0xfa, 0x80, 0x46, 0xe7, 0x09, 0xf2, 0x08, 0xdf, 0xfa, 0x80, 0x3e} },
+{ 0x9a89,      16,     {0x88, 0x82, 0x8c, 0x83, 0xe7, 0x09, 0xf0, 0xa3, 0xdf, 0xfa, 0x80, 0x32, 0xe3, 0x09, 0xf6, 0x08} },
+{ 0x9a99,      16,     {0xdf, 0xfa, 0x80, 0x78, 0xe3, 0x09, 0xf2, 0x08, 0xdf, 0xfa, 0x80, 0x70, 0x88, 0x82, 0x8c, 0x83} },
+{ 0x9aa9,      16,     {0xe3, 0x09, 0xf0, 0xa3, 0xdf, 0xfa, 0x80, 0x64, 0x89, 0x82, 0x8a, 0x83, 0xe0, 0xa3, 0xf6, 0x08} },
+{ 0x9ab9,      16,     {0xdf, 0xfa, 0x80, 0x58, 0x89, 0x82, 0x8a, 0x83, 0xe0, 0xa3, 0xf2, 0x08, 0xdf, 0xfa, 0x80, 0x4c} },
+{ 0x9ac9,      16,     {0x80, 0xd2, 0x80, 0xfa, 0x80, 0xc6, 0x80, 0xd4, 0x80, 0x69, 0x80, 0xf2, 0x80, 0x33, 0x80, 0x10} },
+{ 0x9ad9,      16,     {0x80, 0xa6, 0x80, 0xea, 0x80, 0x9a, 0x80, 0xa8, 0x80, 0xda, 0x80, 0xe2, 0x80, 0xca, 0x80, 0x33} },
+{ 0x9ae9,      16,     {0x89, 0x82, 0x8a, 0x83, 0xec, 0xfa, 0xe4, 0x93, 0xa3, 0xc8, 0xc5, 0x82, 0xc8, 0xcc, 0xc5, 0x83} },
+{ 0x9af9,      16,     {0xcc, 0xf0, 0xa3, 0xc8, 0xc5, 0x82, 0xc8, 0xcc, 0xc5, 0x83, 0xcc, 0xdf, 0xe9, 0xde, 0xe7, 0x80} },
+{ 0x9b09,      16,     {0x0d, 0x89, 0x82, 0x8a, 0x83, 0xe4, 0x93, 0xa3, 0xf6, 0x08, 0xdf, 0xf9, 0xec, 0xfa, 0xa9, 0xf0} },
+{ 0x9b19,      16,     {0xed, 0xfb, 0x22, 0x89, 0x82, 0x8a, 0x83, 0xec, 0xfa, 0xe0, 0xa3, 0xc8, 0xc5, 0x82, 0xc8, 0xcc} },
+{ 0x9b29,      16,     {0xc5, 0x83, 0xcc, 0xf0, 0xa3, 0xc8, 0xc5, 0x82, 0xc8, 0xcc, 0xc5, 0x83, 0xcc, 0xdf, 0xea, 0xde} },
+{ 0x9b39,      16,     {0xe8, 0x80, 0xdb, 0x89, 0x82, 0x8a, 0x83, 0xe4, 0x93, 0xa3, 0xf2, 0x08, 0xdf, 0xf9, 0x80, 0xcc} },
+{ 0x9b49,      16,     {0x88, 0xf0, 0xed, 0x24, 0x02, 0xb4, 0x04, 0x00, 0x50, 0xc2, 0xf5, 0x82, 0xeb, 0x24, 0x02, 0xb4} },
+{ 0x9b59,      16,     {0x04, 0x00, 0x50, 0xb8, 0x23, 0x23, 0x45, 0x82, 0xf5, 0x82, 0xef, 0x4e, 0x60, 0xae, 0xef, 0x60} },
+{ 0x9b69,      9,      {0x01, 0x0e, 0xe5, 0x82, 0x23, 0x90, 0x9a, 0xc9, 0x73} },
+{ 0x9b72,      16,     {0xbb, 0x01, 0x06, 0x89, 0x82, 0x8a, 0x83, 0xe0, 0x22, 0x50, 0x02, 0xe7, 0x22, 0xbb, 0xfe, 0x02} },
+{ 0x9b82,      9,      {0xe3, 0x22, 0x89, 0x82, 0x8a, 0x83, 0xe4, 0x93, 0x22} },
+{ 0x9b8b,      16,     {0xbb, 0x01, 0x0c, 0xe5, 0x82, 0x29, 0xf5, 0x82, 0xe5, 0x83, 0x3a, 0xf5, 0x83, 0xe0, 0x22, 0x50} },
+{ 0x9b9b,      16,     {0x06, 0xe9, 0x25, 0x82, 0xf8, 0xe6, 0x22, 0xbb, 0xfe, 0x06, 0xe9, 0x25, 0x82, 0xf8, 0xe2, 0x22} },
+{ 0x9bab,      13,     {0xe5, 0x82, 0x29, 0xf5, 0x82, 0xe5, 0x83, 0x3a, 0xf5, 0x83, 0xe4, 0x93, 0x22} },
+{ 0x9bb8,      16,     {0xc5, 0xf0, 0xf8, 0xa3, 0xe0, 0x28, 0xf0, 0xc5, 0xf0, 0xf8, 0xe5, 0x82, 0x15, 0x82, 0x70, 0x02} },
+{ 0x9bc8,      6,      {0x15, 0x83, 0xe0, 0x38, 0xf0, 0x22} },
+{ 0x9bce,      16,     {0xa3, 0xf8, 0xe0, 0xc5, 0xf0, 0x25, 0xf0, 0xf0, 0xe5, 0x82, 0x15, 0x82, 0x70, 0x02, 0x15, 0x83} },
+{ 0x9bde,      6,      {0xe0, 0xc8, 0x38, 0xf0, 0xe8, 0x22} },
+{ 0x9be4,      16,     {0xbb, 0x01, 0x10, 0xe5, 0x82, 0x29, 0xf5, 0x82, 0xe5, 0x83, 0x3a, 0xf5, 0x83, 0xe0, 0xf5, 0xf0} },
+{ 0x9bf4,      16,     {0xa3, 0xe0, 0x22, 0x50, 0x09, 0xe9, 0x25, 0x82, 0xf8, 0x86, 0xf0, 0x08, 0xe6, 0x22, 0xbb, 0xfe} },
+{ 0x9c04,      16,     {0x0a, 0xe9, 0x25, 0x82, 0xf8, 0xe2, 0xf5, 0xf0, 0x08, 0xe2, 0x22, 0xe5, 0x83, 0x2a, 0xf5, 0x83} },
+{ 0x9c14,      8,      {0xe9, 0x93, 0xf5, 0xf0, 0xa3, 0xe9, 0x93, 0x22} },
+{ 0x9c1c,      16,     {0x75, 0xf0, 0x08, 0x75, 0x82, 0x00, 0xef, 0x2f, 0xff, 0xee, 0x33, 0xfe, 0xcd, 0x33, 0xcd, 0xcc} },
+{ 0x9c2c,      16,     {0x33, 0xcc, 0xc5, 0x82, 0x33, 0xc5, 0x82, 0x9b, 0xed, 0x9a, 0xec, 0x99, 0xe5, 0x82, 0x98, 0x40} },
+{ 0x9c3c,      16,     {0x0c, 0xf5, 0x82, 0xee, 0x9b, 0xfe, 0xed, 0x9a, 0xfd, 0xec, 0x99, 0xfc, 0x0f, 0xd5, 0xf0, 0xd6} },
+{ 0x9c4c,      16,     {0xe4, 0xce, 0xfb, 0xe4, 0xcd, 0xfa, 0xe4, 0xcc, 0xf9, 0xa8, 0x82, 0x22, 0xb8, 0x00, 0xc1, 0xb9} },
+{ 0x9c5c,      16,     {0x00, 0x59, 0xba, 0x00, 0x2d, 0xec, 0x8b, 0xf0, 0x84, 0xcf, 0xce, 0xcd, 0xfc, 0xe5, 0xf0, 0xcb} },
+{ 0x9c6c,      16,     {0xf9, 0x78, 0x18, 0xef, 0x2f, 0xff, 0xee, 0x33, 0xfe, 0xed, 0x33, 0xfd, 0xec, 0x33, 0xfc, 0xeb} },
+{ 0x9c7c,      16,     {0x33, 0xfb, 0x10, 0xd7, 0x03, 0x99, 0x40, 0x04, 0xeb, 0x99, 0xfb, 0x0f, 0xd8, 0xe5, 0xe4, 0xf9} },
+{ 0x9c8c,      16,     {0xfa, 0x22, 0x78, 0x18, 0xef, 0x2f, 0xff, 0xee, 0x33, 0xfe, 0xed, 0x33, 0xfd, 0xec, 0x33, 0xfc} },
+{ 0x9c9c,      16,     {0xc9, 0x33, 0xc9, 0x10, 0xd7, 0x05, 0x9b, 0xe9, 0x9a, 0x40, 0x07, 0xec, 0x9b, 0xfc, 0xe9, 0x9a} },
+{ 0x9cac,      16,     {0xf9, 0x0f, 0xd8, 0xe0, 0xe4, 0xc9, 0xfa, 0xe4, 0xcc, 0xfb, 0x22, 0x75, 0xf0, 0x10, 0xef, 0x2f} },
+{ 0x9cbc,      16,     {0xff, 0xee, 0x33, 0xfe, 0xed, 0x33, 0xfd, 0xcc, 0x33, 0xcc, 0xc8, 0x33, 0xc8, 0x10, 0xd7, 0x07} },
+{ 0x9ccc,      16,     {0x9b, 0xec, 0x9a, 0xe8, 0x99, 0x40, 0x0a, 0xed, 0x9b, 0xfd, 0xec, 0x9a, 0xfc, 0xe8, 0x99, 0xf8} },
+{ 0x9cdc,      14,     {0x0f, 0xd5, 0xf0, 0xda, 0xe4, 0xcd, 0xfb, 0xe4, 0xcc, 0xfa, 0xe4, 0xc8, 0xf9, 0x22} },
+{ 0x9cea,      16,     {0xeb, 0x9f, 0xf5, 0xf0, 0xea, 0x9e, 0x42, 0xf0, 0xe9, 0x9d, 0x42, 0xf0, 0xe8, 0x9c, 0x45, 0xf0} },
+{ 0x9cfa,      1,      {0x22} },
+{ 0x9cfb,      16,     {0xe8, 0x60, 0x0f, 0xec, 0xc3, 0x13, 0xfc, 0xed, 0x13, 0xfd, 0xee, 0x13, 0xfe, 0xef, 0x13, 0xff} },
+{ 0x9d0b,      3,      {0xd8, 0xf1, 0x22} },
+{ 0x9d0e,      16,     {0x08, 0x08, 0x08, 0xe6, 0xcf, 0x2f, 0xf6, 0x18, 0xe6, 0xce, 0x3e, 0xf6, 0x18, 0xe6, 0xcd, 0x3d} },
+{ 0x9d1e,      7,      {0xf6, 0x18, 0xe6, 0xcc, 0x3c, 0xf6, 0x22} },
+{ 0x9d25,      12,     {0xec, 0xf0, 0xa3, 0xed, 0xf0, 0xa3, 0xee, 0xf0, 0xa3, 0xef, 0xf0, 0x22} },
+{ 0x9d31,      16,     {0xa8, 0x82, 0x85, 0x83, 0xf0, 0xd0, 0x83, 0xd0, 0x82, 0x12, 0x9d, 0x48, 0x12, 0x9d, 0x48, 0x12} },
+{ 0x9d41,      16,     {0x9d, 0x48, 0x12, 0x9d, 0x48, 0xe4, 0x73, 0xe4, 0x93, 0xa3, 0xc5, 0x83, 0xc5, 0xf0, 0xc5, 0x83} },
+{ 0x9d51,      16,     {0xc8, 0xc5, 0x82, 0xc8, 0xf0, 0xa3, 0xc5, 0x83, 0xc5, 0xf0, 0xc5, 0x83, 0xc8, 0xc5, 0x82, 0xc8} },
+{ 0x9d61,      1,      {0x22} },
+{ 0xffff,      0,      {0x00} }
+};
+
+#ifdef DEBUG
+static const struct whiteheat_hex_record whiteheat_loader[] = {
+{ 0x0000,      3,      {0x02, 0x09, 0x8d} },
+{ 0x0033,      3,      {0x02, 0x0e, 0x70} },
+{ 0x0043,      3,      {0x02, 0x0b, 0x00} },
+{ 0x004b,      3,      {0x02, 0x05, 0xb3} },
+{ 0x0100,      16,     {0x90, 0x7f, 0xa5, 0xe0, 0x54, 0x10, 0xff, 0xc4, 0x54, 0x0f, 0x44, 0x50, 0xf5, 0x0f, 0x13, 0xe4} },
+{ 0x0110,      16,     {0x33, 0xf5, 0x11, 0x90, 0x7f, 0xe9, 0xe0, 0x24, 0x5e, 0xb4, 0x07, 0x00, 0x40, 0x03, 0x02, 0x03} },
+{ 0x0120,      16,     {0x7c, 0x90, 0x01, 0x28, 0xf8, 0x28, 0x28, 0x73, 0x02, 0x01, 0xbc, 0x02, 0x01, 0xbc, 0x02, 0x01} },
+{ 0x0130,      16,     {0x91, 0x02, 0x01, 0x3d, 0x02, 0x01, 0x53, 0x02, 0x01, 0x6f, 0x02, 0x01, 0x9a, 0x90, 0x7f, 0x00} },
+{ 0x0140,      16,     {0xe5, 0x11, 0xf0, 0x90, 0x7f, 0xb5, 0x74, 0x01, 0xf0, 0x90, 0x7f, 0xb4, 0xe0, 0x44, 0x02, 0xf0} },
+{ 0x0150,      16,     {0x02, 0x03, 0x7c, 0x90, 0x7f, 0x92, 0xe0, 0xff, 0xc4, 0x54, 0x0f, 0x90, 0x7f, 0x00, 0xf0, 0x90} },
+{ 0x0160,      16,     {0x7f, 0xb5, 0x74, 0x01, 0xf0, 0x90, 0x7f, 0xb4, 0xe0, 0x44, 0x02, 0xf0, 0x02, 0x03, 0x7c, 0x12} },
+{ 0x0170,      16,     {0x0a, 0x89, 0x50, 0x07, 0xe4, 0x90, 0x7f, 0x00, 0xf0, 0x80, 0x06, 0x90, 0x7f, 0x00, 0x74, 0x0f} },
+{ 0x0180,      16,     {0xf0, 0x90, 0x7f, 0xb5, 0x74, 0x01, 0xf0, 0x90, 0x7f, 0xb4, 0xe0, 0x44, 0x02, 0xf0, 0x02, 0x03} },
+{ 0x0190,      16,     {0x7c, 0x90, 0x7f, 0xea, 0xe0, 0xf5, 0x0f, 0x02, 0x03, 0x7c, 0x90, 0x7f, 0x00, 0x74, 0x07, 0xf0} },
+{ 0x01a0,      16,     {0x90, 0x7f, 0xb5, 0x74, 0x01, 0xf0, 0x90, 0x7f, 0xb4, 0xe0, 0x44, 0x02, 0xf0, 0x7f, 0xe8, 0x7e} },
+{ 0x01b0,      16,     {0x03, 0x12, 0x0d, 0xd5, 0xd2, 0x06, 0x12, 0x0d, 0x0d, 0x02, 0x03, 0x7c, 0x90, 0x7f, 0xea, 0xe0} },
+{ 0x01c0,      16,     {0x75, 0x29, 0x00, 0xf5, 0x2a, 0xa3, 0xe0, 0xfe, 0xe4, 0xee, 0x42, 0x29, 0x90, 0x7f, 0xee, 0xe0} },
+{ 0x01d0,      16,     {0x75, 0x2b, 0x00, 0xf5, 0x2c, 0xa3, 0xe0, 0xfe, 0xe4, 0xee, 0x42, 0x2b, 0x90, 0x7f, 0xe8, 0xe0} },
+{ 0x01e0,      16,     {0x64, 0xc0, 0x60, 0x03, 0x02, 0x02, 0xc9, 0xe5, 0x2c, 0x45, 0x2b, 0x70, 0x03, 0x02, 0x03, 0x7c} },
+{ 0x01f0,      16,     {0xc3, 0xe5, 0x2c, 0x94, 0x40, 0xe5, 0x2b, 0x94, 0x00, 0x50, 0x08, 0x85, 0x2b, 0x2d, 0x85, 0x2c} },
+{ 0x0200,      16,     {0x2e, 0x80, 0x06, 0x75, 0x2d, 0x00, 0x75, 0x2e, 0x40, 0x90, 0x7f, 0xe9, 0xe0, 0x64, 0xa3, 0x70} },
+{ 0x0210,      16,     {0x34, 0xf5, 0x31, 0xf5, 0x32, 0xc3, 0xe5, 0x32, 0x95, 0x2e, 0xe5, 0x31, 0x95, 0x2d, 0x50, 0x5c} },
+{ 0x0220,      16,     {0xe5, 0x2a, 0x25, 0x32, 0xf5, 0x82, 0xe5, 0x31, 0x35, 0x29, 0xf5, 0x83, 0xe0, 0xff, 0x74, 0x00} },
+{ 0x0230,      16,     {0x25, 0x32, 0xf5, 0x82, 0xe4, 0x34, 0x7f, 0xf5, 0x83, 0xef, 0xf0, 0x05, 0x32, 0xe5, 0x32, 0x70} },
+{ 0x0240,      16,     {0x02, 0x05, 0x31, 0x80, 0xd0, 0xe4, 0xf5, 0x31, 0xf5, 0x32, 0xc3, 0xe5, 0x32, 0x95, 0x2e, 0xe5} },
+{ 0x0250,      16,     {0x31, 0x95, 0x2d, 0x50, 0x18, 0x74, 0x00, 0x25, 0x32, 0xf5, 0x82, 0xe4, 0x34, 0x7f, 0xf5, 0x83} },
+{ 0x0260,      16,     {0x74, 0xcd, 0xf0, 0x05, 0x32, 0xe5, 0x32, 0x70, 0x02, 0x05, 0x31, 0x80, 0xdd, 0xaf, 0x2a, 0xae} },
+{ 0x0270,      16,     {0x29, 0xad, 0x2e, 0x7a, 0x7f, 0x79, 0x00, 0x7b, 0x00, 0x12, 0x0b, 0xf4, 0x90, 0x7f, 0xb5, 0xe5} },
+{ 0x0280,      16,     {0x2e, 0xf0, 0xe5, 0x2e, 0x25, 0x2a, 0xf5, 0x2a, 0xe5, 0x2d, 0x35, 0x29, 0xf5, 0x29, 0xc3, 0xe5} },
+{ 0x0290,      16,     {0x2c, 0x95, 0x2e, 0xf5, 0x2c, 0xe5, 0x2b, 0x95, 0x2d, 0xf5, 0x2b, 0x90, 0x7f, 0x92, 0xe0, 0xff} },
+{ 0x02a0,      16,     {0xc4, 0x54, 0x0f, 0x75, 0x2f, 0x00, 0xf5, 0x30, 0xd3, 0x94, 0x00, 0xe5, 0x2f, 0x94, 0x00, 0x50} },
+{ 0x02b0,      16,     {0x0c, 0x90, 0x7f, 0xb4, 0xe0, 0x20, 0xe1, 0x03, 0x02, 0x01, 0xe7, 0x80, 0xf4, 0x90, 0x7f, 0xb4} },
+{ 0x02c0,      16,     {0xe0, 0x20, 0xe2, 0x03, 0x02, 0x01, 0xe7, 0x80, 0xf4, 0x90, 0x7f, 0xe8, 0xe0, 0x64, 0x40, 0x60} },
+{ 0x02d0,      16,     {0x03, 0x02, 0x03, 0x7c, 0xe5, 0x2c, 0x45, 0x2b, 0x70, 0x03, 0x02, 0x03, 0x7c, 0xe4, 0x90, 0x7f} },
+{ 0x02e0,      16,     {0xc5, 0xf0, 0x90, 0x7f, 0x92, 0xe0, 0xff, 0xc4, 0x54, 0x0f, 0x75, 0x2f, 0x00, 0xf5, 0x30, 0xd3} },
+{ 0x02f0,      16,     {0x94, 0x00, 0xe5, 0x2f, 0x94, 0x00, 0x50, 0x09, 0x90, 0x7f, 0xc4, 0xe0, 0x30, 0xe1, 0x09, 0x80} },
+{ 0x0300,      16,     {0xf7, 0x90, 0x7f, 0xb4, 0xe0, 0x20, 0xe3, 0xf9, 0x90, 0x7f, 0xc5, 0xe0, 0x75, 0x2d, 0x00, 0xf5} },
+{ 0x0310,      16,     {0x2e, 0x90, 0x7f, 0xe9, 0xe0, 0x64, 0xa3, 0x70, 0x38, 0x90, 0x20, 0x6b, 0xf0, 0xf5, 0x31, 0xf5} },
+{ 0x0320,      16,     {0x32, 0xc3, 0xe5, 0x32, 0x95, 0x2e, 0xe5, 0x31, 0x95, 0x2d, 0x50, 0x34, 0x74, 0xc0, 0x25, 0x32} },
+{ 0x0330,      16,     {0xf5, 0x82, 0xe4, 0x34, 0x7e, 0xf5, 0x83, 0xe0, 0xff, 0xe5, 0x2a, 0x25, 0x32, 0xf5, 0x82, 0xe5} },
+{ 0x0340,      16,     {0x31, 0x35, 0x29, 0xf5, 0x83, 0xef, 0xf0, 0x05, 0x32, 0xe5, 0x32, 0x70, 0x02, 0x05, 0x31, 0x80} },
+{ 0x0350,      16,     {0xd0, 0xaf, 0x2a, 0xae, 0x29, 0xad, 0x2e, 0x7a, 0x7e, 0x79, 0xc0, 0x7b, 0xc0, 0x12, 0x0c, 0x80} },
+{ 0x0360,      16,     {0xe5, 0x2e, 0x25, 0x2a, 0xf5, 0x2a, 0xe5, 0x2d, 0x35, 0x29, 0xf5, 0x29, 0xc3, 0xe5, 0x2c, 0x95} },
+{ 0x0370,      13,     {0x2e, 0xf5, 0x2c, 0xe5, 0x2b, 0x95, 0x2d, 0xf5, 0x2b, 0x02, 0x02, 0xd4, 0xc3} },
+{ 0x037d,      1,      {0x22} },
+{ 0x037e,      16,     {0x90, 0x7f, 0xe9, 0xe0, 0x70, 0x03, 0x02, 0x04, 0x56, 0x14, 0x70, 0x03, 0x02, 0x04, 0xd2, 0x24} },
+{ 0x038e,      16,     {0xfe, 0x70, 0x03, 0x02, 0x05, 0x46, 0x24, 0xfb, 0x70, 0x03, 0x02, 0x04, 0x50, 0x14, 0x70, 0x03} },
+{ 0x039e,      16,     {0x02, 0x04, 0x4a, 0x14, 0x70, 0x03, 0x02, 0x04, 0x3e, 0x14, 0x70, 0x03, 0x02, 0x04, 0x44, 0x24} },
+{ 0x03ae,      16,     {0x05, 0x60, 0x03, 0x02, 0x05, 0x9a, 0x12, 0x0e, 0x7b, 0x40, 0x03, 0x02, 0x05, 0xab, 0x90, 0x7f} },
+{ 0x03be,      16,     {0xeb, 0xe0, 0x24, 0xfe, 0x60, 0x16, 0x14, 0x60, 0x40, 0x24, 0x02, 0x70, 0x69, 0x74, 0x11, 0x90} },
+{ 0x03ce,      16,     {0x7f, 0xd4, 0xf0, 0x74, 0x00, 0x90, 0x7f, 0xd5, 0xf0, 0x02, 0x05, 0xab, 0x90, 0x7f, 0xea, 0xe0} },
+{ 0x03de,      16,     {0xff, 0x12, 0x0b, 0x58, 0x8b, 0x26, 0x8a, 0x27, 0x89, 0x28, 0xea, 0x49, 0x60, 0x11, 0xae, 0x02} },
+{ 0x03ee,      16,     {0xee, 0x90, 0x7f, 0xd4, 0xf0, 0xaf, 0x01, 0xef, 0x90, 0x7f, 0xd5, 0xf0, 0x02, 0x05, 0xab, 0x90} },
+{ 0x03fe,      16,     {0x7f, 0xb4, 0xe0, 0x44, 0x01, 0xf0, 0x02, 0x05, 0xab, 0x90, 0x7f, 0xea, 0xe0, 0xff, 0x12, 0x0c} },
+{ 0x040e,      16,     {0x3f, 0x8b, 0x26, 0x8a, 0x27, 0x89, 0x28, 0xea, 0x49, 0x60, 0x11, 0xae, 0x02, 0xee, 0x90, 0x7f} },
+{ 0x041e,      16,     {0xd4, 0xf0, 0xaf, 0x01, 0xef, 0x90, 0x7f, 0xd5, 0xf0, 0x02, 0x05, 0xab, 0x90, 0x7f, 0xb4, 0xe0} },
+{ 0x042e,      16,     {0x44, 0x01, 0xf0, 0x02, 0x05, 0xab, 0x90, 0x7f, 0xb4, 0xe0, 0x44, 0x01, 0xf0, 0x02, 0x05, 0xab} },
+{ 0x043e,      16,     {0x12, 0x0e, 0x52, 0x02, 0x05, 0xab, 0x12, 0x0e, 0x60, 0x02, 0x05, 0xab, 0x12, 0x0a, 0xf7, 0x02} },
+{ 0x044e,      16,     {0x05, 0xab, 0x12, 0x08, 0xf1, 0x02, 0x05, 0xab, 0x12, 0x0e, 0x7d, 0x40, 0x03, 0x02, 0x05, 0xab} },
+{ 0x045e,      16,     {0x90, 0x7f, 0xe8, 0xe0, 0x24, 0x7f, 0x60, 0x24, 0x14, 0x60, 0x31, 0x24, 0x02, 0x70, 0x5b, 0xa2} },
+{ 0x046e,      16,     {0x00, 0xe4, 0x33, 0xff, 0x25, 0xe0, 0xff, 0xa2, 0x02, 0xe4, 0x33, 0x4f, 0x90, 0x7f, 0x00, 0xf0} },
+{ 0x047e,      16,     {0xe4, 0xa3, 0xf0, 0x90, 0x7f, 0xb5, 0x74, 0x02, 0xf0, 0x02, 0x05, 0xab, 0xe4, 0x90, 0x7f, 0x00} },
+{ 0x048e,      16,     {0xf0, 0xa3, 0xf0, 0x90, 0x7f, 0xb5, 0x74, 0x02, 0xf0, 0x02, 0x05, 0xab, 0x90, 0x7f, 0xec, 0xe0} },
+{ 0x049e,      16,     {0xf4, 0x54, 0x80, 0xff, 0xc4, 0x54, 0x0f, 0xff, 0xe0, 0x54, 0x07, 0x2f, 0x25, 0xe0, 0x24, 0xb4} },
+{ 0x04ae,      16,     {0xf5, 0x82, 0xe4, 0x34, 0x7f, 0xf5, 0x83, 0xe0, 0x54, 0xfd, 0x90, 0x7f, 0x00, 0xf0, 0xe4, 0xa3} },
+{ 0x04be,      16,     {0xf0, 0x90, 0x7f, 0xb5, 0x74, 0x02, 0xf0, 0x02, 0x05, 0xab, 0x90, 0x7f, 0xb4, 0xe0, 0x44, 0x01} },
+{ 0x04ce,      16,     {0xf0, 0x02, 0x05, 0xab, 0x12, 0x0e, 0x7f, 0x40, 0x03, 0x02, 0x05, 0xab, 0x90, 0x7f, 0xe8, 0xe0} },
+{ 0x04de,      16,     {0x24, 0xfe, 0x60, 0x1d, 0x24, 0x02, 0x60, 0x03, 0x02, 0x05, 0xab, 0x90, 0x7f, 0xea, 0xe0, 0xb4} },
+{ 0x04ee,      16,     {0x01, 0x05, 0xc2, 0x00, 0x02, 0x05, 0xab, 0x90, 0x7f, 0xb4, 0xe0, 0x44, 0x01, 0xf0, 0x02, 0x05} },
+{ 0x04fe,      16,     {0xab, 0x90, 0x7f, 0xea, 0xe0, 0x70, 0x38, 0x90, 0x7f, 0xec, 0xe0, 0xf4, 0x54, 0x80, 0xff, 0xc4} },
+{ 0x050e,      16,     {0x54, 0x0f, 0xff, 0xe0, 0x54, 0x07, 0x2f, 0x25, 0xe0, 0x24, 0xb4, 0xf5, 0x82, 0xe4, 0x34, 0x7f} },
+{ 0x051e,      16,     {0xf5, 0x83, 0xe4, 0xf0, 0x90, 0x7f, 0xec, 0xe0, 0x54, 0x80, 0xff, 0x13, 0x13, 0x13, 0x54, 0x1f} },
+{ 0x052e,      16,     {0xff, 0xe0, 0x54, 0x07, 0x2f, 0x90, 0x7f, 0xd7, 0xf0, 0xe0, 0x44, 0x20, 0xf0, 0x80, 0x6e, 0x90} },
+{ 0x053e,      16,     {0x7f, 0xb4, 0xe0, 0x44, 0x01, 0xf0, 0x80, 0x65, 0x12, 0x0e, 0x81, 0x50, 0x60, 0x90, 0x7f, 0xe8} },
+{ 0x054e,      16,     {0xe0, 0x24, 0xfe, 0x60, 0x18, 0x24, 0x02, 0x70, 0x54, 0x90, 0x7f, 0xea, 0xe0, 0xb4, 0x01, 0x04} },
+{ 0x055e,      16,     {0xd2, 0x00, 0x80, 0x49, 0x90, 0x7f, 0xb4, 0xe0, 0x44, 0x01, 0xf0, 0x80, 0x40, 0x90, 0x7f, 0xea} },
+{ 0x056e,      16,     {0xe0, 0x70, 0x20, 0x90, 0x7f, 0xec, 0xe0, 0xf4, 0x54, 0x80, 0xff, 0xc4, 0x54, 0x0f, 0xff, 0xe0} },
+{ 0x057e,      16,     {0x54, 0x07, 0x2f, 0x25, 0xe0, 0x24, 0xb4, 0xf5, 0x82, 0xe4, 0x34, 0x7f, 0xf5, 0x83, 0x74, 0x01} },
+{ 0x058e,      16,     {0xf0, 0x80, 0x1a, 0x90, 0x7f, 0xb4, 0xe0, 0x44, 0x01, 0xf0, 0x80, 0x11, 0xe4, 0x90, 0x20, 0x6a} },
+{ 0x059e,      16,     {0xf0, 0x12, 0x01, 0x00, 0x50, 0x07, 0x90, 0x7f, 0xb4, 0xe0, 0x44, 0x01, 0xf0, 0x90, 0x7f, 0xb4} },
+{ 0x05ae,      4,      {0xe0, 0x44, 0x02, 0xf0} },
+{ 0x05b2,      1,      {0x22} },
+{ 0x05b3,      16,     {0xc0, 0xe0, 0xc0, 0x83, 0xc0, 0x82, 0xc0, 0x85, 0xc0, 0x84, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xc0} },
+{ 0x05c3,      16,     {0xd0, 0xc0, 0x00, 0xc0, 0x01, 0xc0, 0x02, 0xc0, 0x03, 0xc0, 0x06, 0xc0, 0x07, 0x90, 0x7f, 0xa5} },
+{ 0x05d3,      16,     {0xe0, 0x30, 0xe2, 0x06, 0x75, 0x0d, 0x06, 0x02, 0x06, 0x7f, 0x90, 0x7f, 0xa5, 0xe0, 0x20, 0xe1} },
+{ 0x05e3,      16,     {0x0c, 0xe5, 0x0d, 0x64, 0x02, 0x60, 0x06, 0x75, 0x0d, 0x07, 0x02, 0x06, 0x7f, 0xaf, 0x0d, 0xef} },
+{ 0x05f3,      16,     {0x24, 0xfe, 0x60, 0x48, 0x14, 0x60, 0x2c, 0x24, 0xfe, 0x60, 0x77, 0x24, 0x04, 0x60, 0x03, 0x02} },
+{ 0x0603,      16,     {0x06, 0x7f, 0xab, 0x09, 0xaa, 0x0a, 0xa9, 0x0b, 0xaf, 0x0c, 0x05, 0x0c, 0x8f, 0x82, 0x75, 0x83} },
+{ 0x0613,      16,     {0x00, 0x12, 0x07, 0x85, 0x90, 0x7f, 0xa6, 0xf0, 0xe5, 0x0c, 0x65, 0x08, 0x70, 0x5e, 0x75, 0x0d} },
+{ 0x0623,      16,     {0x05, 0x80, 0x59, 0x90, 0x7f, 0xa6, 0xe0, 0xab, 0x09, 0xaa, 0x0a, 0xa9, 0x0b, 0xae, 0x0c, 0x8e} },
+{ 0x0633,      16,     {0x82, 0x75, 0x83, 0x00, 0x12, 0x07, 0xb2, 0x75, 0x0d, 0x02, 0x80, 0x40, 0xe5, 0x08, 0x24, 0xfe} },
+{ 0x0643,      16,     {0xb5, 0x0c, 0x07, 0x90, 0x7f, 0xa5, 0xe0, 0x44, 0x20, 0xf0, 0xe5, 0x08, 0x14, 0xb5, 0x0c, 0x0a} },
+{ 0x0653,      16,     {0x90, 0x7f, 0xa5, 0xe0, 0x44, 0x40, 0xf0, 0xe4, 0xf5, 0x0d, 0x90, 0x7f, 0xa6, 0xe0, 0xab, 0x09} },
+{ 0x0663,      16,     {0xaa, 0x0a, 0xa9, 0x0b, 0xae, 0x0c, 0x8e, 0x82, 0x75, 0x83, 0x00, 0x12, 0x07, 0xb2, 0x05, 0x0c} },
+{ 0x0673,      16,     {0x80, 0x0a, 0x90, 0x7f, 0xa5, 0xe0, 0x44, 0x40, 0xf0, 0xe4, 0xf5, 0x0d, 0x53, 0x91, 0xdf, 0xd0} },
+{ 0x0683,      16,     {0x07, 0xd0, 0x06, 0xd0, 0x03, 0xd0, 0x02, 0xd0, 0x01, 0xd0, 0x00, 0xd0, 0xd0, 0xd0, 0x86, 0xd0} },
+{ 0x0693,      10,     {0x84, 0xd0, 0x85, 0xd0, 0x82, 0xd0, 0x83, 0xd0, 0xe0, 0x32} },
+{ 0x069d,      16,     {0xc2, 0x04, 0xd2, 0x05, 0xe4, 0xf5, 0x25, 0xc2, 0x03, 0xc2, 0x00, 0xc2, 0x02, 0xc2, 0x01, 0x12} },
+{ 0x06ad,      16,     {0x0e, 0x74, 0xd2, 0xe8, 0x43, 0xd8, 0x20, 0x90, 0x7f, 0xab, 0x74, 0xff, 0xf0, 0x90, 0x7f, 0xa9} },
+{ 0x06bd,      16,     {0xf0, 0x90, 0x7f, 0xaa, 0xf0, 0x53, 0x91, 0xef, 0x90, 0x7f, 0x95, 0xe0, 0x44, 0xc0, 0xf0, 0x90} },
+{ 0x06cd,      16,     {0x7f, 0x93, 0x74, 0x30, 0xf0, 0x12, 0x0a, 0x19, 0x75, 0x24, 0x48, 0x75, 0x23, 0x92, 0x75, 0x22} },
+{ 0x06dd,      16,     {0x00, 0x75, 0x21, 0x00, 0xe4, 0xff, 0xfe, 0x7e, 0x05, 0x90, 0x20, 0x68, 0x74, 0x01, 0xf0, 0xa3} },
+{ 0x06ed,      16,     {0xde, 0xfc, 0x7e, 0x00, 0x7f, 0x05, 0x90, 0x7f, 0xaf, 0xe0, 0x44, 0x01, 0xf0, 0x90, 0x7f, 0xae} },
+{ 0x06fd,      16,     {0xe0, 0x44, 0x0d, 0xf0, 0xd2, 0xaf, 0x12, 0x0e, 0x68, 0x30, 0x01, 0x0a, 0xe4, 0x90, 0x20, 0x69} },
+{ 0x070d,      16,     {0xf0, 0x12, 0x03, 0x7e, 0xc2, 0x01, 0x30, 0x04, 0x1a, 0x12, 0x0e, 0x77, 0x50, 0x13, 0x12, 0x09} },
+{ 0x071d,      16,     {0x00, 0x30, 0x00, 0x07, 0x90, 0x7f, 0xd6, 0xe0, 0x30, 0xe7, 0xf3, 0x12, 0x0d, 0x8b, 0x12, 0x0e} },
+{ 0x072d,      16,     {0x79, 0xc2, 0x03, 0x7f, 0xff, 0x7e, 0xff, 0x7d, 0xff, 0x7c, 0xff, 0x78, 0x21, 0x12, 0x08, 0x1d} },
+{ 0x073d,      16,     {0x7b, 0x00, 0x7a, 0x00, 0x79, 0x00, 0x78, 0x00, 0xc3, 0x12, 0x08, 0x0c, 0x70, 0x1b, 0x75, 0x24} },
+{ 0x074d,      16,     {0x48, 0x75, 0x23, 0x92, 0xf5, 0x22, 0xf5, 0x21, 0x63, 0x25, 0xff, 0x90, 0x20, 0x68, 0xe5, 0x25} },
+{ 0x075d,      14,     {0xf0, 0xa3, 0x74, 0x01, 0xf0, 0xa3, 0xf0, 0xa3, 0xf0, 0x12, 0x08, 0xff, 0x80, 0x9b} },
+{ 0x076b,      1,      {0x22} },
+{ 0x076c,      16,     {0xbb, 0x01, 0x06, 0x89, 0x82, 0x8a, 0x83, 0xe0, 0x22, 0x50, 0x02, 0xe7, 0x22, 0xbb, 0xfe, 0x02} },
+{ 0x077c,      9,      {0xe3, 0x22, 0x89, 0x82, 0x8a, 0x83, 0xe4, 0x93, 0x22} },
+{ 0x0785,      16,     {0xbb, 0x01, 0x0c, 0xe5, 0x82, 0x29, 0xf5, 0x82, 0xe5, 0x83, 0x3a, 0xf5, 0x83, 0xe0, 0x22, 0x50} },
+{ 0x0795,      16,     {0x06, 0xe9, 0x25, 0x82, 0xf8, 0xe6, 0x22, 0xbb, 0xfe, 0x06, 0xe9, 0x25, 0x82, 0xf8, 0xe2, 0x22} },
+{ 0x07a5,      13,     {0xe5, 0x82, 0x29, 0xf5, 0x82, 0xe5, 0x83, 0x3a, 0xf5, 0x83, 0xe4, 0x93, 0x22} },
+{ 0x07b2,      16,     {0xf8, 0xbb, 0x01, 0x0d, 0xe5, 0x82, 0x29, 0xf5, 0x82, 0xe5, 0x83, 0x3a, 0xf5, 0x83, 0xe8, 0xf0} },
+{ 0x07c2,      16,     {0x22, 0x50, 0x06, 0xe9, 0x25, 0x82, 0xc8, 0xf6, 0x22, 0xbb, 0xfe, 0x05, 0xe9, 0x25, 0x82, 0xc8} },
+{ 0x07d2,      2,      {0xf2, 0x22} },
+{ 0x07d4,      16,     {0xbb, 0x01, 0x10, 0xe5, 0x82, 0x29, 0xf5, 0x82, 0xe5, 0x83, 0x3a, 0xf5, 0x83, 0xe0, 0xf5, 0xf0} },
+{ 0x07e4,      16,     {0xa3, 0xe0, 0x22, 0x50, 0x09, 0xe9, 0x25, 0x82, 0xf8, 0x86, 0xf0, 0x08, 0xe6, 0x22, 0xbb, 0xfe} },
+{ 0x07f4,      16,     {0x0a, 0xe9, 0x25, 0x82, 0xf8, 0xe2, 0xf5, 0xf0, 0x08, 0xe2, 0x22, 0xe5, 0x83, 0x2a, 0xf5, 0x83} },
+{ 0x0804,      8,      {0xe9, 0x93, 0xf5, 0xf0, 0xa3, 0xe9, 0x93, 0x22} },
+{ 0x080c,      16,     {0xeb, 0x9f, 0xf5, 0xf0, 0xea, 0x9e, 0x42, 0xf0, 0xe9, 0x9d, 0x42, 0xf0, 0xe8, 0x9c, 0x45, 0xf0} },
+{ 0x081c,      1,      {0x22} },
+{ 0x081d,      16,     {0x08, 0x08, 0x08, 0xe6, 0x2f, 0xff, 0xf6, 0x18, 0xe6, 0x3e, 0xfe, 0xf6, 0x18, 0xe6, 0x3d, 0xfd} },
+{ 0x082d,      7,      {0xf6, 0x18, 0xe6, 0x3c, 0xfc, 0xf6, 0x22} },
+{ 0x0834,      4,      {0x8c, 0x34, 0x8d, 0x35} },
+{ 0x0838,      16,     {0x90, 0x7f, 0x95, 0xe0, 0x44, 0xc0, 0xf0, 0xe4, 0xf5, 0x36, 0xf5, 0x37, 0xc3, 0xe5, 0x37, 0x95} },
+{ 0x0848,      16,     {0x35, 0xe5, 0x36, 0x95, 0x34, 0x50, 0x69, 0xef, 0x25, 0x37, 0xf5, 0x82, 0xe5, 0x36, 0x3e, 0xf5} },
+{ 0x0858,      16,     {0x83, 0x74, 0xff, 0xf0, 0xf4, 0x60, 0x02, 0xc3, 0x22, 0xef, 0x25, 0x37, 0xf5, 0x82, 0xe5, 0x36} },
+{ 0x0868,      16,     {0x3e, 0xf5, 0x83, 0xe4, 0xf0, 0x60, 0x02, 0xc3, 0x22, 0xef, 0x25, 0x37, 0xf5, 0x82, 0xe5, 0x36} },
+{ 0x0878,      16,     {0x3e, 0xf5, 0x83, 0x74, 0xaa, 0xf0, 0x64, 0xaa, 0x60, 0x02, 0xc3, 0x22, 0xef, 0x25, 0x37, 0xf5} },
+{ 0x0888,      16,     {0x82, 0xe5, 0x36, 0x3e, 0xf5, 0x83, 0x74, 0x55, 0xf0, 0x64, 0x55, 0x60, 0x02, 0xc3, 0x22, 0xad} },
+{ 0x0898,      16,     {0x37, 0xe5, 0x37, 0x2f, 0xf5, 0x82, 0xe5, 0x36, 0x3e, 0xf5, 0x83, 0xed, 0xf0, 0xfc, 0xac, 0x05} },
+{ 0x08a8,      16,     {0xed, 0x6c, 0x60, 0x02, 0xc3, 0x22, 0x05, 0x37, 0xe5, 0x37, 0x70, 0x02, 0x05, 0x36, 0x80, 0x8c} },
+{ 0x08b8,      16,     {0xe4, 0xf5, 0x36, 0xf5, 0x37, 0xc3, 0xe5, 0x37, 0x95, 0x35, 0xe5, 0x36, 0x95, 0x34, 0x50, 0x27} },
+{ 0x08c8,      16,     {0xef, 0x25, 0x37, 0xf5, 0x82, 0xe5, 0x36, 0x3e, 0xf5, 0x83, 0xe0, 0x65, 0x37, 0x60, 0x02, 0xc3} },
+{ 0x08d8,      16,     {0x22, 0xef, 0x25, 0x37, 0xf5, 0x82, 0xe5, 0x36, 0x3e, 0xf5, 0x83, 0xe4, 0xf0, 0x05, 0x37, 0xe5} },
+{ 0x08e8,      8,      {0x37, 0x70, 0x02, 0x05, 0x36, 0x80, 0xce, 0xd3} },
+{ 0x08f0,      1,      {0x22} },
+{ 0x08f1,      14,     {0x90, 0x7f, 0x00, 0xe5, 0x10, 0xf0, 0x90, 0x7f, 0xb5, 0x74, 0x01, 0xf0, 0xd3, 0x22} },
+{ 0x08ff,      1,      {0x22} },
+{ 0x0900,      9,      {0x90, 0x7f, 0xd6, 0xe0, 0x44, 0x80, 0xf0, 0x80, 0x74} },
+{ 0x097d,      16,     {0x43, 0x87, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22} },
+{ 0x098d,      12,     {0x78, 0x7f, 0xe4, 0xf6, 0xd8, 0xfd, 0x75, 0x81, 0x3a, 0x02, 0x09, 0xd4} },
+{ 0x0999,      16,     {0x02, 0x06, 0x9d, 0xe4, 0x93, 0xa3, 0xf8, 0xe4, 0x93, 0xa3, 0x40, 0x03, 0xf6, 0x80, 0x01, 0xf2} },
+{ 0x09a9,      16,     {0x08, 0xdf, 0xf4, 0x80, 0x29, 0xe4, 0x93, 0xa3, 0xf8, 0x54, 0x07, 0x24, 0x0c, 0xc8, 0xc3, 0x33} },
+{ 0x09b9,      16,     {0xc4, 0x54, 0x0f, 0x44, 0x20, 0xc8, 0x83, 0x40, 0x04, 0xf4, 0x56, 0x80, 0x01, 0x46, 0xf6, 0xdf} },
+{ 0x09c9,      16,     {0xe4, 0x80, 0x0b, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x90, 0x0e, 0x2d, 0xe4, 0x7e} },
+{ 0x09d9,      16,     {0x01, 0x93, 0x60, 0xbc, 0xa3, 0xff, 0x54, 0x3f, 0x30, 0xe5, 0x09, 0x54, 0x1f, 0xfe, 0xe4, 0x93} },
+{ 0x09e9,      16,     {0xa3, 0x60, 0x01, 0x0e, 0xcf, 0x54, 0xc0, 0x25, 0xe0, 0x60, 0xa8, 0x40, 0xb8, 0xe4, 0x93, 0xa3} },
+{ 0x09f9,      16,     {0xfa, 0xe4, 0x93, 0xa3, 0xf8, 0xe4, 0x93, 0xa3, 0xc8, 0xc5, 0x82, 0xc8, 0xca, 0xc5, 0x83, 0xca} },
+{ 0x0a09,      16,     {0xf0, 0xa3, 0xc8, 0xc5, 0x82, 0xc8, 0xca, 0xc5, 0x83, 0xca, 0xdf, 0xe9, 0xde, 0xe7, 0x80, 0xbe} },
+{ 0x0a19,      16,     {0xe4, 0x90, 0x7f, 0x9c, 0xf0, 0x7f, 0x0a, 0xfe, 0x12, 0x0d, 0xd5, 0x90, 0x7f, 0x96, 0x74, 0x89} },
+{ 0x0a29,      16,     {0xf0, 0x90, 0x7f, 0x9c, 0x74, 0xcf, 0xf0, 0x7f, 0xf4, 0x7e, 0x01, 0x12, 0x0d, 0xd5, 0x90, 0x7f} },
+{ 0x0a39,      16,     {0x96, 0xe0, 0x54, 0xfe, 0xf0, 0x7f, 0x0a, 0x7e, 0x00, 0x12, 0x0d, 0xd5, 0x7f, 0x05, 0x7e, 0x00} },
+{ 0x0a49,      16,     {0x12, 0x0d, 0xd5, 0x90, 0x7f, 0x96, 0xe0, 0x44, 0x02, 0xf0, 0xe0, 0x54, 0x7f, 0xf0, 0x7f, 0x05} },
+{ 0x0a59,      16,     {0x7e, 0x00, 0x12, 0x0d, 0xd5, 0x90, 0x7f, 0x96, 0xe0, 0x44, 0x40, 0xf0, 0x7f, 0x05, 0x7e, 0x00} },
+{ 0x0a69,      16,     {0x12, 0x0d, 0xd5, 0x90, 0x7f, 0x96, 0xe0, 0x54, 0xbf, 0xf0, 0x7f, 0x32, 0x7e, 0x00, 0x12, 0x0d} },
+{ 0x0a79,      16,     {0xd5, 0x90, 0x7f, 0x96, 0xe0, 0x44, 0x40, 0xf0, 0x7f, 0x32, 0x7e, 0x00, 0x12, 0x0d, 0xd5, 0x22} },
+{ 0x0a89,      16,     {0x75, 0x33, 0x01, 0xe5, 0x33, 0x60, 0x1b, 0x7f, 0x01, 0x12, 0x0e, 0x18, 0x7f, 0x00, 0x7e, 0x0e} },
+{ 0x0a99,      16,     {0x7d, 0x00, 0x7c, 0x01, 0x12, 0x08, 0x34, 0xe4, 0x33, 0xf5, 0x33, 0x70, 0x05, 0x7f, 0x0f, 0x12} },
+{ 0x0aa9,      16,     {0x0e, 0x18, 0xe5, 0x33, 0x60, 0x1b, 0x7f, 0x02, 0x12, 0x0e, 0x18, 0x7f, 0x00, 0x7e, 0x80, 0x7d} },
+{ 0x0ab9,      16,     {0x00, 0x7c, 0x80, 0x12, 0x08, 0x34, 0xe4, 0x33, 0xf5, 0x33, 0x70, 0x05, 0x7f, 0x0f, 0x12, 0x0e} },
+{ 0x0ac9,      16,     {0x18, 0xe5, 0x33, 0x60, 0x1b, 0x7f, 0x03, 0x12, 0x0e, 0x18, 0x7f, 0x00, 0x7e, 0x20, 0x7d, 0x40} },
+{ 0x0ad9,      16,     {0x7c, 0x5b, 0x12, 0x08, 0x34, 0xe4, 0x33, 0xf5, 0x33, 0x70, 0x05, 0x7f, 0x0f, 0x12, 0x0e, 0x18} },
+{ 0x0ae9,      13,     {0xe5, 0x33, 0x60, 0x05, 0xe4, 0xff, 0x12, 0x0e, 0x18, 0xe5, 0x33, 0x24, 0xff} },
+{ 0x0af6,      1,      {0x22} },
+{ 0x0af7,      8,      {0x90, 0x7f, 0xea, 0xe0, 0xf5, 0x10, 0xd3, 0x22} },
+{ 0x0aff,      1,      {0x32} },
+{ 0x0b00,      16,     {0x02, 0x0d, 0xa5, 0x00, 0x02, 0x0d, 0xec, 0x00, 0x02, 0x0d, 0x70, 0x00, 0x02, 0x0d, 0xbd, 0x00} },
+{ 0x0b10,      16,     {0x02, 0x0e, 0x02, 0x00, 0x02, 0x0a, 0xff, 0x00, 0x02, 0x0e, 0x83, 0x00, 0x02, 0x0e, 0x84, 0x00} },
+{ 0x0b20,      16,     {0x02, 0x0e, 0x85, 0x00, 0x02, 0x0e, 0x86, 0x00, 0x02, 0x0e, 0x87, 0x00, 0x02, 0x0e, 0x88, 0x00} },
+{ 0x0b30,      16,     {0x02, 0x0e, 0x89, 0x00, 0x02, 0x0e, 0x8a, 0x00, 0x02, 0x0e, 0x8b, 0x00, 0x02, 0x0e, 0x8c, 0x00} },
+{ 0x0b40,      16,     {0x02, 0x0e, 0x8d, 0x00, 0x02, 0x0e, 0x8e, 0x00, 0x02, 0x0e, 0x8f, 0x00, 0x02, 0x0e, 0x90, 0x00} },
+{ 0x0b50,      8,      {0x02, 0x0e, 0x91, 0x00, 0x02, 0x0e, 0x92, 0x00} },
+{ 0x0b58,      16,     {0xe4, 0xfe, 0x75, 0x2b, 0xff, 0x75, 0x2c, 0x11, 0x75, 0x2d, 0x12, 0xab, 0x2b, 0xaa, 0x2c, 0xa9} },
+{ 0x0b68,      16,     {0x2d, 0x90, 0x00, 0x01, 0x12, 0x07, 0x85, 0x64, 0x02, 0x70, 0x2d, 0xad, 0x06, 0x0e, 0xed, 0xb5} },
+{ 0x0b78,      16,     {0x07, 0x01, 0x22, 0x90, 0x00, 0x02, 0x12, 0x07, 0xd4, 0x85, 0xf0, 0x29, 0xf5, 0x2a, 0x62, 0x29} },
+{ 0x0b88,      16,     {0xe5, 0x29, 0x62, 0x2a, 0xe5, 0x2a, 0x62, 0x29, 0x29, 0xfd, 0xe5, 0x29, 0x3a, 0xa9, 0x05, 0x75} },
+{ 0x0b98,      14,     {0x2b, 0xff, 0xf5, 0x2c, 0x89, 0x2d, 0x80, 0xc3, 0x7b, 0x00, 0x7a, 0x00, 0x79, 0x00} },
+{ 0x0ba6,      1,      {0x22} },
+{ 0x0ba7,      6,      {0xab, 0x07, 0xaa, 0x06, 0xac, 0x05} },
+{ 0x0bad,      16,     {0xe4, 0xfd, 0xe5, 0x11, 0x60, 0x11, 0xea, 0xff, 0xae, 0x05, 0x0d, 0xee, 0x24, 0x10, 0xf5, 0x82} },
+{ 0x0bbd,      16,     {0xe4, 0x34, 0x0f, 0xf5, 0x83, 0xef, 0xf0, 0xeb, 0xae, 0x05, 0x0d, 0x74, 0x10, 0x2e, 0xf5, 0x82} },
+{ 0x0bcd,      16,     {0xe4, 0x34, 0x0f, 0xf5, 0x83, 0xeb, 0xf0, 0xaf, 0x05, 0x0d, 0x74, 0x10, 0x2f, 0xf5, 0x82, 0xe4} },
+{ 0x0bdd,      16,     {0x34, 0x0f, 0xf5, 0x83, 0xec, 0xf0, 0xaf, 0x0f, 0x7a, 0x0f, 0x7b, 0x10, 0x12, 0x0d, 0x51, 0x7f} },
+{ 0x0bed,      6,      {0x0a, 0x7e, 0x00, 0x12, 0x0d, 0xd5} },
+{ 0x0bf3,      1,      {0x22} },
+{ 0x0bf4,      10,     {0x8e, 0x33, 0x8f, 0x34, 0x8d, 0x35, 0x8a, 0x36, 0x8b, 0x37} },
+{ 0x0bfe,      16,     {0xe4, 0xfd, 0xf5, 0x38, 0xe5, 0x11, 0x60, 0x12, 0xe5, 0x33, 0xff, 0xae, 0x05, 0x0d, 0xee, 0x24} },
+{ 0x0c0e,      16,     {0x13, 0xf5, 0x82, 0xe4, 0x34, 0x0f, 0xf5, 0x83, 0xef, 0xf0, 0xe5, 0x34, 0xae, 0x05, 0x0d, 0x74} },
+{ 0x0c1e,      16,     {0x13, 0x2e, 0xf5, 0x82, 0xe4, 0x34, 0x0f, 0xf5, 0x83, 0xe5, 0x34, 0xf0, 0xaf, 0x0f, 0x7a, 0x0f} },
+{ 0x0c2e,      16,     {0x7b, 0x13, 0x12, 0x0d, 0x51, 0xaf, 0x0f, 0xad, 0x35, 0xab, 0x37, 0xaa, 0x36, 0x12, 0x0d, 0x32} },
+{ 0x0c3e,      1,      {0x22} },
+{ 0x0c3f,      2,      {0x8f, 0x29} },
+{ 0x0c41,      16,     {0xe4, 0xf5, 0x2a, 0x75, 0x2b, 0xff, 0x75, 0x2c, 0x11, 0x75, 0x2d, 0x32, 0xab, 0x2b, 0xaa, 0x2c} },
+{ 0x0c51,      16,     {0xa9, 0x2d, 0x90, 0x00, 0x01, 0x12, 0x07, 0x85, 0xb4, 0x03, 0x1d, 0xaf, 0x2a, 0x05, 0x2a, 0xef} },
+{ 0x0c61,      16,     {0xb5, 0x29, 0x01, 0x22, 0x12, 0x07, 0x6c, 0x7e, 0x00, 0x29, 0xff, 0xee, 0x3a, 0xa9, 0x07, 0x75} },
+{ 0x0c71,      14,     {0x2b, 0xff, 0xf5, 0x2c, 0x89, 0x2d, 0x80, 0xd4, 0x7b, 0x00, 0x7a, 0x00, 0x79, 0x00} },
+{ 0x0c7f,      1,      {0x22} },
+{ 0x0c80,      10,     {0x8e, 0x33, 0x8f, 0x34, 0x8d, 0x35, 0x8a, 0x36, 0x8b, 0x37} },
+{ 0x0c8a,      16,     {0xe4, 0xf5, 0x38, 0xe5, 0x38, 0xc3, 0x95, 0x35, 0x50, 0x20, 0x05, 0x34, 0xe5, 0x34, 0xae, 0x33} },
+{ 0x0c9a,      16,     {0x70, 0x02, 0x05, 0x33, 0x14, 0xff, 0xe5, 0x37, 0x25, 0x38, 0xf5, 0x82, 0xe4, 0x35, 0x36, 0xf5} },
+{ 0x0caa,      10,     {0x83, 0xe0, 0xfd, 0x12, 0x0b, 0xa7, 0x05, 0x38, 0x80, 0xd9} },
+{ 0x0cb4,      1,      {0x22} },
+{ 0x0cb5,      16,     {0xa9, 0x07, 0xe5, 0x0d, 0x70, 0x25, 0x90, 0x7f, 0xa5, 0xe0, 0x44, 0x80, 0xf0, 0xe9, 0x25, 0xe0} },
+{ 0x0cc5,      16,     {0x44, 0x01, 0x90, 0x7f, 0xa6, 0xf0, 0x8d, 0x08, 0xaf, 0x03, 0xa9, 0x07, 0x75, 0x09, 0x01, 0x8a} },
+{ 0x0cd5,      13,     {0x0a, 0x89, 0x0b, 0xe4, 0xf5, 0x0c, 0x75, 0x0d, 0x03, 0xd3, 0x22, 0xc3, 0x22} },
+{ 0x0ce2,      16,     {0xa9, 0x07, 0xe5, 0x0d, 0x70, 0x23, 0x90, 0x7f, 0xa5, 0xe0, 0x44, 0x80, 0xf0, 0xe9, 0x25, 0xe0} },
+{ 0x0cf2,      16,     {0x90, 0x7f, 0xa6, 0xf0, 0x8d, 0x08, 0xaf, 0x03, 0xa9, 0x07, 0x75, 0x09, 0x01, 0x8a, 0x0a, 0x89} },
+{ 0x0d02,      11,     {0x0b, 0xe4, 0xf5, 0x0c, 0x75, 0x0d, 0x01, 0xd3, 0x22, 0xc3, 0x22} },
+{ 0x0d0d,      16,     {0x90, 0x7f, 0xd6, 0xe0, 0x54, 0xfb, 0xf0, 0xe0, 0x44, 0x08, 0xf0, 0x30, 0x06, 0x04, 0xe0, 0x44} },
+{ 0x0d1d,      16,     {0x02, 0xf0, 0x7f, 0xd0, 0x7e, 0x07, 0x12, 0x0d, 0xd5, 0x90, 0x7f, 0xd6, 0xe0, 0x54, 0xf7, 0xf0} },
+{ 0x0d2d,      5,      {0xe0, 0x44, 0x04, 0xf0, 0x22} },
+{ 0x0d32,      16,     {0x12, 0x0c, 0xb5, 0xe5, 0x0d, 0x24, 0xfa, 0x60, 0x10, 0x14, 0x60, 0x07, 0x24, 0x07, 0x70, 0xf3} },
+{ 0x0d42,      15,     {0x7f, 0x08, 0x22, 0xe4, 0xf5, 0x0d, 0x7f, 0x07, 0x22, 0xe4, 0xf5, 0x0d, 0x7f, 0x06, 0x22} },
+{ 0x0d51,      16,     {0x12, 0x0c, 0xe2, 0xe5, 0x0d, 0x24, 0xfa, 0x60, 0x10, 0x14, 0x60, 0x07, 0x24, 0x07, 0x70, 0xf3} },
+{ 0x0d61,      15,     {0x7f, 0x08, 0x22, 0xe4, 0xf5, 0x0d, 0x7f, 0x07, 0x22, 0xe4, 0xf5, 0x0d, 0x7f, 0x06, 0x22} },
+{ 0x0d70,      16,     {0xc0, 0xe0, 0xc0, 0x83, 0xc0, 0x82, 0x90, 0x7f, 0xc4, 0xe4, 0xf0, 0x53, 0x91, 0xef, 0x90, 0x7f} },
+{ 0x0d80,      11,     {0xab, 0x74, 0x04, 0xf0, 0xd0, 0x82, 0xd0, 0x83, 0xd0, 0xe0, 0x32} },
+{ 0x0d8b,      16,     {0x90, 0x7f, 0xd6, 0xe0, 0x30, 0xe7, 0x12, 0xe0, 0x44, 0x01, 0xf0, 0x7f, 0x14, 0x7e, 0x00, 0x12} },
+{ 0x0d9b,      10,     {0x0d, 0xd5, 0x90, 0x7f, 0xd6, 0xe0, 0x54, 0xfe, 0xf0, 0x22} },
+{ 0x0da5,      16,     {0xc0, 0xe0, 0xc0, 0x83, 0xc0, 0x82, 0xd2, 0x01, 0x53, 0x91, 0xef, 0x90, 0x7f, 0xab, 0x74, 0x01} },
+{ 0x0db5,      8,      {0xf0, 0xd0, 0x82, 0xd0, 0x83, 0xd0, 0xe0, 0x32} },
+{ 0x0dbd,      16,     {0xc0, 0xe0, 0xc0, 0x83, 0xc0, 0x82, 0xd2, 0x03, 0x53, 0x91, 0xef, 0x90, 0x7f, 0xab, 0x74, 0x08} },
+{ 0x0dcd,      8,      {0xf0, 0xd0, 0x82, 0xd0, 0x83, 0xd0, 0xe0, 0x32} },
+{ 0x0dd5,      16,     {0x8e, 0x39, 0x8f, 0x3a, 0xe5, 0x3a, 0x15, 0x3a, 0xae, 0x39, 0x70, 0x02, 0x15, 0x39, 0x4e, 0x60} },
+{ 0x0de5,      7,      {0x05, 0x12, 0x0e, 0x41, 0x80, 0xee, 0x22} },
+{ 0x0dec,      16,     {0xc0, 0xe0, 0xc0, 0x83, 0xc0, 0x82, 0x53, 0x91, 0xef, 0x90, 0x7f, 0xab, 0x74, 0x02, 0xf0, 0xd0} },
+{ 0x0dfc,      6,      {0x82, 0xd0, 0x83, 0xd0, 0xe0, 0x32} },
+{ 0x0e02,      16,     {0xc0, 0xe0, 0xc0, 0x83, 0xc0, 0x82, 0x53, 0x91, 0xef, 0x90, 0x7f, 0xab, 0x74, 0x10, 0xf0, 0xd0} },
+{ 0x0e12,      6,      {0x82, 0xd0, 0x83, 0xd0, 0xe0, 0x32} },
+{ 0x0e18,      16,     {0xae, 0x07, 0x7f, 0x21, 0x7d, 0x01, 0x74, 0x00, 0x2e, 0xf5, 0x82, 0xe4, 0x34, 0x0f, 0xab, 0x82} },
+{ 0x0e28,      5,      {0xfa, 0x12, 0x0d, 0x51, 0x22} },
+{ 0x0e2d,      16,     {0x50, 0x0f, 0x00, 0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x98, 0x88, 0x83, 0xc6} },
+{ 0x0e3d,      3,      {0xa1, 0x86, 0x8e} },
+{ 0x0e40,      1,      {0x00} },
+{ 0x0e41,      16,     {0x74, 0x00, 0xf5, 0x86, 0x90, 0xfd, 0xa5, 0x7c, 0x05, 0xa3, 0xe5, 0x82, 0x45, 0x83, 0x70, 0xf9} },
+{ 0x0e51,      1,      {0x22} },
+{ 0x0e52,      14,     {0x90, 0x7f, 0x00, 0xe5, 0x0e, 0xf0, 0x90, 0x7f, 0xb5, 0x74, 0x01, 0xf0, 0xd3, 0x22} },
+{ 0x0e60,      8,      {0x90, 0x7f, 0xea, 0xe0, 0xf5, 0x0e, 0xd3, 0x22} },
+{ 0x0e68,      8,      {0xe4, 0xf5, 0x0d, 0xd2, 0xe9, 0xd2, 0xaf, 0x22} },
+{ 0x0e70,      4,      {0x53, 0xd8, 0xef, 0x32} },
+{ 0x0e74,      3,      {0xd2, 0x00, 0x22} },
+{ 0x0e77,      2,      {0xd3, 0x22} },
+{ 0x0e79,      2,      {0xd3, 0x22} },
+{ 0x0e7b,      2,      {0xd3, 0x22} },
+{ 0x0e7d,      2,      {0xd3, 0x22} },
+{ 0x0e7f,      2,      {0xd3, 0x22} },
+{ 0x0e81,      2,      {0xd3, 0x22} },
+{ 0x0e83,      1,      {0x32} },
+{ 0x0e84,      1,      {0x32} },
+{ 0x0e85,      1,      {0x32} },
+{ 0x0e86,      1,      {0x32} },
+{ 0x0e87,      1,      {0x32} },
+{ 0x0e88,      1,      {0x32} },
+{ 0x0e89,      1,      {0x32} },
+{ 0x0e8a,      1,      {0x32} },
+{ 0x0e8b,      1,      {0x32} },
+{ 0x0e8c,      1,      {0x32} },
+{ 0x0e8d,      1,      {0x32} },
+{ 0x0e8e,      1,      {0x32} },
+{ 0x0e8f,      1,      {0x32} },
+{ 0x0e90,      1,      {0x32} },
+{ 0x0e91,      1,      {0x32} },
+{ 0x0e92,      1,      {0x32} },
+{ 0x1100,      16,     {0x12, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x40, 0x47, 0x05, 0x10, 0x27, 0x01, 0x00, 0x01, 0x02} },
+{ 0x1110,      16,     {0x00, 0x01, 0x09, 0x02, 0x20, 0x00, 0x01, 0x01, 0x03, 0xa0, 0x00, 0x09, 0x04, 0x00, 0x00, 0x02} },
+{ 0x1120,      16,     {0xff, 0x00, 0x00, 0x04, 0x07, 0x05, 0x82, 0x02, 0x40, 0x00, 0x00, 0x07, 0x05, 0x02, 0x02, 0x40} },
+{ 0x1130,      16,     {0x00, 0x00, 0x04, 0x03, 0x09, 0x04, 0x26, 0x03, 0x41, 0x00, 0x6e, 0x00, 0x63, 0x00, 0x68, 0x00} },
+{ 0x1140,      16,     {0x6f, 0x00, 0x72, 0x00, 0x20, 0x00, 0x43, 0x00, 0x68, 0x00, 0x69, 0x00, 0x70, 0x00, 0x73, 0x00} },
+{ 0x1150,      16,     {0x2c, 0x00, 0x20, 0x00, 0x49, 0x00, 0x6e, 0x00, 0x63, 0x00, 0x2e, 0x00, 0x28, 0x03, 0x46, 0x00} },
+{ 0x1160,      16,     {0x69, 0x00, 0x72, 0x00, 0x6d, 0x00, 0x77, 0x00, 0x61, 0x00, 0x72, 0x00, 0x65, 0x00, 0x20, 0x00} },
+{ 0x1170,      16,     {0x46, 0x00, 0x72, 0x00, 0x61, 0x00, 0x6d, 0x00, 0x65, 0x00, 0x57, 0x00, 0x6f, 0x00, 0x72, 0x00} },
+{ 0x1180,      16,     {0x6b, 0x00, 0x73, 0x00, 0x2a, 0x03, 0x43, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x66, 0x00, 0x69, 0x00} },
+{ 0x1190,      16,     {0x67, 0x00, 0x75, 0x00, 0x72, 0x00, 0x61, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6f, 0x00, 0x6e, 0x00} },
+{ 0x11a0,      16,     {0x20, 0x00, 0x53, 0x00, 0x74, 0x00, 0x72, 0x00, 0x69, 0x00, 0x6e, 0x00, 0x67, 0x00, 0x22, 0x03} },
+{ 0x11b0,      16,     {0x49, 0x00, 0x6e, 0x00, 0x74, 0x00, 0x65, 0x00, 0x72, 0x00, 0x66, 0x00, 0x61, 0x00, 0x63, 0x00} },
+{ 0x11c0,      16,     {0x65, 0x00, 0x20, 0x00, 0x53, 0x00, 0x74, 0x00, 0x72, 0x00, 0x69, 0x00, 0x6e, 0x00, 0x67, 0x00} },
+{ 0x11d0,      2,      {0x00, 0x00} },
+{ 0xffff,      0,      {0x00} }
+};
+
+#else
+
+static const struct whiteheat_hex_record whiteheat_loader[] = {
+{ 0x0000,      3,      {0x02, 0x09, 0x8d} },
+{ 0x0033,      3,      {0x02, 0x08, 0xfb} },
+{ 0x0043,      3,      {0x02, 0x0b, 0x00} },
+{ 0x004b,      3,      {0x02, 0x05, 0xaa} },
+{ 0x0100,      16,     {0x90, 0x7f, 0xa5, 0xe0, 0x54, 0x10, 0xff, 0xc4, 0x54, 0x0f, 0x44, 0x50, 0xf5, 0x0f, 0x13, 0xe4} },
+{ 0x0110,      16,     {0x33, 0xf5, 0x11, 0x90, 0x7f, 0xe9, 0xe0, 0x24, 0x5e, 0xb4, 0x07, 0x00, 0x40, 0x03, 0x02, 0x03} },
+{ 0x0120,      16,     {0x78, 0x90, 0x01, 0x28, 0xf8, 0x28, 0x28, 0x73, 0x02, 0x01, 0xbc, 0x02, 0x01, 0xbc, 0x02, 0x01} },
+{ 0x0130,      16,     {0x91, 0x02, 0x01, 0x3d, 0x02, 0x01, 0x53, 0x02, 0x01, 0x6f, 0x02, 0x01, 0x9a, 0x90, 0x7f, 0x00} },
+{ 0x0140,      16,     {0xe5, 0x11, 0xf0, 0x90, 0x7f, 0xb5, 0x74, 0x01, 0xf0, 0x90, 0x7f, 0xb4, 0xe0, 0x44, 0x02, 0xf0} },
+{ 0x0150,      16,     {0x02, 0x03, 0x78, 0x90, 0x7f, 0x92, 0xe0, 0xff, 0xc4, 0x54, 0x0f, 0x90, 0x7f, 0x00, 0xf0, 0x90} },
+{ 0x0160,      16,     {0x7f, 0xb5, 0x74, 0x01, 0xf0, 0x90, 0x7f, 0xb4, 0xe0, 0x44, 0x02, 0xf0, 0x02, 0x03, 0x78, 0x12} },
+{ 0x0170,      16,     {0x0a, 0x89, 0x50, 0x07, 0xe4, 0x90, 0x7f, 0x00, 0xf0, 0x80, 0x06, 0x90, 0x7f, 0x00, 0x74, 0x0f} },
+{ 0x0180,      16,     {0xf0, 0x90, 0x7f, 0xb5, 0x74, 0x01, 0xf0, 0x90, 0x7f, 0xb4, 0xe0, 0x44, 0x02, 0xf0, 0x02, 0x03} },
+{ 0x0190,      16,     {0x78, 0x90, 0x7f, 0xea, 0xe0, 0xf5, 0x0f, 0x02, 0x03, 0x78, 0x90, 0x7f, 0x00, 0x74, 0x07, 0xf0} },
+{ 0x01a0,      16,     {0x90, 0x7f, 0xb5, 0x74, 0x01, 0xf0, 0x90, 0x7f, 0xb4, 0xe0, 0x44, 0x02, 0xf0, 0x7f, 0xe8, 0x7e} },
+{ 0x01b0,      16,     {0x03, 0x12, 0x0d, 0x94, 0xd2, 0x06, 0x12, 0x0c, 0xcc, 0x02, 0x03, 0x78, 0x90, 0x7f, 0xea, 0xe0} },
+{ 0x01c0,      16,     {0x75, 0x28, 0x00, 0xf5, 0x29, 0xa3, 0xe0, 0xfe, 0xe4, 0xee, 0x42, 0x28, 0x90, 0x7f, 0xee, 0xe0} },
+{ 0x01d0,      16,     {0x75, 0x2a, 0x00, 0xf5, 0x2b, 0xa3, 0xe0, 0xfe, 0xe4, 0xee, 0x42, 0x2a, 0x90, 0x7f, 0xe8, 0xe0} },
+{ 0x01e0,      16,     {0x64, 0xc0, 0x60, 0x03, 0x02, 0x02, 0xc9, 0xe5, 0x2b, 0x45, 0x2a, 0x70, 0x03, 0x02, 0x03, 0x78} },
+{ 0x01f0,      16,     {0xc3, 0xe5, 0x2b, 0x94, 0x40, 0xe5, 0x2a, 0x94, 0x00, 0x50, 0x08, 0x85, 0x2a, 0x2c, 0x85, 0x2b} },
+{ 0x0200,      16,     {0x2d, 0x80, 0x06, 0x75, 0x2c, 0x00, 0x75, 0x2d, 0x40, 0x90, 0x7f, 0xe9, 0xe0, 0x64, 0xa3, 0x70} },
+{ 0x0210,      16,     {0x34, 0xf5, 0x30, 0xf5, 0x31, 0xc3, 0xe5, 0x31, 0x95, 0x2d, 0xe5, 0x30, 0x95, 0x2c, 0x50, 0x5c} },
+{ 0x0220,      16,     {0xe5, 0x29, 0x25, 0x31, 0xf5, 0x82, 0xe5, 0x30, 0x35, 0x28, 0xf5, 0x83, 0xe0, 0xff, 0x74, 0x00} },
+{ 0x0230,      16,     {0x25, 0x31, 0xf5, 0x82, 0xe4, 0x34, 0x7f, 0xf5, 0x83, 0xef, 0xf0, 0x05, 0x31, 0xe5, 0x31, 0x70} },
+{ 0x0240,      16,     {0x02, 0x05, 0x30, 0x80, 0xd0, 0xe4, 0xf5, 0x30, 0xf5, 0x31, 0xc3, 0xe5, 0x31, 0x95, 0x2d, 0xe5} },
+{ 0x0250,      16,     {0x30, 0x95, 0x2c, 0x50, 0x18, 0x74, 0x00, 0x25, 0x31, 0xf5, 0x82, 0xe4, 0x34, 0x7f, 0xf5, 0x83} },
+{ 0x0260,      16,     {0x74, 0xcd, 0xf0, 0x05, 0x31, 0xe5, 0x31, 0x70, 0x02, 0x05, 0x30, 0x80, 0xdd, 0xaf, 0x29, 0xae} },
+{ 0x0270,      16,     {0x28, 0xad, 0x2d, 0x7a, 0x7f, 0x79, 0x00, 0x7b, 0x00, 0x12, 0x0b, 0xf4, 0x90, 0x7f, 0xb5, 0xe5} },
+{ 0x0280,      16,     {0x2d, 0xf0, 0xe5, 0x2d, 0x25, 0x29, 0xf5, 0x29, 0xe5, 0x2c, 0x35, 0x28, 0xf5, 0x28, 0xc3, 0xe5} },
+{ 0x0290,      16,     {0x2b, 0x95, 0x2d, 0xf5, 0x2b, 0xe5, 0x2a, 0x95, 0x2c, 0xf5, 0x2a, 0x90, 0x7f, 0x92, 0xe0, 0xff} },
+{ 0x02a0,      16,     {0xc4, 0x54, 0x0f, 0x75, 0x2e, 0x00, 0xf5, 0x2f, 0xd3, 0x94, 0x00, 0xe5, 0x2e, 0x94, 0x00, 0x50} },
+{ 0x02b0,      16,     {0x0c, 0x90, 0x7f, 0xb4, 0xe0, 0x20, 0xe1, 0x03, 0x02, 0x01, 0xe7, 0x80, 0xf4, 0x90, 0x7f, 0xb4} },
+{ 0x02c0,      16,     {0xe0, 0x20, 0xe2, 0x03, 0x02, 0x01, 0xe7, 0x80, 0xf4, 0x90, 0x7f, 0xe8, 0xe0, 0x64, 0x40, 0x60} },
+{ 0x02d0,      16,     {0x03, 0x02, 0x03, 0x78, 0xe5, 0x2b, 0x45, 0x2a, 0x70, 0x03, 0x02, 0x03, 0x78, 0xe4, 0x90, 0x7f} },
+{ 0x02e0,      16,     {0xc5, 0xf0, 0x90, 0x7f, 0x92, 0xe0, 0xff, 0xc4, 0x54, 0x0f, 0x75, 0x2e, 0x00, 0xf5, 0x2f, 0xd3} },
+{ 0x02f0,      16,     {0x94, 0x00, 0xe5, 0x2e, 0x94, 0x00, 0x50, 0x09, 0x90, 0x7f, 0xc4, 0xe0, 0x30, 0xe1, 0x09, 0x80} },
+{ 0x0300,      16,     {0xf7, 0x90, 0x7f, 0xb4, 0xe0, 0x20, 0xe3, 0xf9, 0x90, 0x7f, 0xc5, 0xe0, 0x75, 0x2c, 0x00, 0xf5} },
+{ 0x0310,      16,     {0x2d, 0x90, 0x7f, 0xe9, 0xe0, 0x64, 0xa3, 0x70, 0x34, 0xf5, 0x30, 0xf5, 0x31, 0xc3, 0xe5, 0x31} },
+{ 0x0320,      16,     {0x95, 0x2d, 0xe5, 0x30, 0x95, 0x2c, 0x50, 0x34, 0x74, 0xc0, 0x25, 0x31, 0xf5, 0x82, 0xe4, 0x34} },
+{ 0x0330,      1,      {0x7e} },
+{ 0x0331,      16,     {0xf5, 0x83, 0xe0, 0xff, 0xe5, 0x29, 0x25, 0x31, 0xf5, 0x82, 0xe5, 0x30, 0x35, 0x28, 0xf5, 0x83} },
+{ 0x0341,      16,     {0xef, 0xf0, 0x05, 0x31, 0xe5, 0x31, 0x70, 0x02, 0x05, 0x30, 0x80, 0xd0, 0xaf, 0x29, 0xae, 0x28} },
+{ 0x0351,      16,     {0xad, 0x2d, 0x7a, 0x7e, 0x79, 0xc0, 0x7b, 0xc0, 0x12, 0x0c, 0x3f, 0xe5, 0x2d, 0x25, 0x29, 0xf5} },
+{ 0x0361,      16,     {0x29, 0xe5, 0x2c, 0x35, 0x28, 0xf5, 0x28, 0xc3, 0xe5, 0x2b, 0x95, 0x2d, 0xf5, 0x2b, 0xe5, 0x2a} },
+{ 0x0371,      9,      {0x95, 0x2c, 0xf5, 0x2a, 0x02, 0x02, 0xd4, 0xc3, 0x22} },
+{ 0x037a,      16,     {0x90, 0x7f, 0xe9, 0xe0, 0x70, 0x03, 0x02, 0x04, 0x52, 0x14, 0x70, 0x03, 0x02, 0x04, 0xce, 0x24} },
+{ 0x038a,      16,     {0xfe, 0x70, 0x03, 0x02, 0x05, 0x42, 0x24, 0xfb, 0x70, 0x03, 0x02, 0x04, 0x4c, 0x14, 0x70, 0x03} },
+{ 0x039a,      16,     {0x02, 0x04, 0x46, 0x14, 0x70, 0x03, 0x02, 0x04, 0x3a, 0x14, 0x70, 0x03, 0x02, 0x04, 0x40, 0x24} },
+{ 0x03aa,      16,     {0x05, 0x60, 0x03, 0x02, 0x05, 0x96, 0x12, 0x0e, 0x44, 0x40, 0x03, 0x02, 0x05, 0xa2, 0x90, 0x7f} },
+{ 0x03ba,      16,     {0xeb, 0xe0, 0x24, 0xfe, 0x60, 0x16, 0x14, 0x60, 0x40, 0x24, 0x02, 0x70, 0x69, 0x74, 0x11, 0x90} },
+{ 0x03ca,      16,     {0x7f, 0xd4, 0xf0, 0x74, 0x00, 0x90, 0x7f, 0xd5, 0xf0, 0x02, 0x05, 0xa2, 0x90, 0x7f, 0xea, 0xe0} },
+{ 0x03da,      16,     {0xff, 0x12, 0x0b, 0x58, 0x8b, 0x25, 0x8a, 0x26, 0x89, 0x27, 0xea, 0x49, 0x60, 0x11, 0xae, 0x02} },
+{ 0x03ea,      16,     {0xee, 0x90, 0x7f, 0xd4, 0xf0, 0xaf, 0x01, 0xef, 0x90, 0x7f, 0xd5, 0xf0, 0x02, 0x05, 0xa2, 0x90} },
+{ 0x03fa,      16,     {0x7f, 0xb4, 0xe0, 0x44, 0x01, 0xf0, 0x02, 0x05, 0xa2, 0x90, 0x7f, 0xea, 0xe0, 0xff, 0x12, 0x08} },
+{ 0x040a,      16,     {0xba, 0x8b, 0x25, 0x8a, 0x26, 0x89, 0x27, 0xea, 0x49, 0x60, 0x11, 0xae, 0x02, 0xee, 0x90, 0x7f} },
+{ 0x041a,      16,     {0xd4, 0xf0, 0xaf, 0x01, 0xef, 0x90, 0x7f, 0xd5, 0xf0, 0x02, 0x05, 0xa2, 0x90, 0x7f, 0xb4, 0xe0} },
+{ 0x042a,      16,     {0x44, 0x01, 0xf0, 0x02, 0x05, 0xa2, 0x90, 0x7f, 0xb4, 0xe0, 0x44, 0x01, 0xf0, 0x02, 0x05, 0xa2} },
+{ 0x043a,      16,     {0x12, 0x0e, 0x1f, 0x02, 0x05, 0xa2, 0x12, 0x0e, 0x2d, 0x02, 0x05, 0xa2, 0x12, 0x0a, 0xf7, 0x02} },
+{ 0x044a,      16,     {0x05, 0xa2, 0x12, 0x0e, 0x11, 0x02, 0x05, 0xa2, 0x12, 0x0e, 0x46, 0x40, 0x03, 0x02, 0x05, 0xa2} },
+{ 0x045a,      16,     {0x90, 0x7f, 0xe8, 0xe0, 0x24, 0x7f, 0x60, 0x24, 0x14, 0x60, 0x31, 0x24, 0x02, 0x70, 0x5b, 0xa2} },
+{ 0x046a,      16,     {0x00, 0xe4, 0x33, 0xff, 0x25, 0xe0, 0xff, 0xa2, 0x02, 0xe4, 0x33, 0x4f, 0x90, 0x7f, 0x00, 0xf0} },
+{ 0x047a,      16,     {0xe4, 0xa3, 0xf0, 0x90, 0x7f, 0xb5, 0x74, 0x02, 0xf0, 0x02, 0x05, 0xa2, 0xe4, 0x90, 0x7f, 0x00} },
+{ 0x048a,      16,     {0xf0, 0xa3, 0xf0, 0x90, 0x7f, 0xb5, 0x74, 0x02, 0xf0, 0x02, 0x05, 0xa2, 0x90, 0x7f, 0xec, 0xe0} },
+{ 0x049a,      16,     {0xf4, 0x54, 0x80, 0xff, 0xc4, 0x54, 0x0f, 0xff, 0xe0, 0x54, 0x07, 0x2f, 0x25, 0xe0, 0x24, 0xb4} },
+{ 0x04aa,      16,     {0xf5, 0x82, 0xe4, 0x34, 0x7f, 0xf5, 0x83, 0xe0, 0x54, 0xfd, 0x90, 0x7f, 0x00, 0xf0, 0xe4, 0xa3} },
+{ 0x04ba,      16,     {0xf0, 0x90, 0x7f, 0xb5, 0x74, 0x02, 0xf0, 0x02, 0x05, 0xa2, 0x90, 0x7f, 0xb4, 0xe0, 0x44, 0x01} },
+{ 0x04ca,      16,     {0xf0, 0x02, 0x05, 0xa2, 0x12, 0x0e, 0x48, 0x40, 0x03, 0x02, 0x05, 0xa2, 0x90, 0x7f, 0xe8, 0xe0} },
+{ 0x04da,      16,     {0x24, 0xfe, 0x60, 0x1d, 0x24, 0x02, 0x60, 0x03, 0x02, 0x05, 0xa2, 0x90, 0x7f, 0xea, 0xe0, 0xb4} },
+{ 0x04ea,      16,     {0x01, 0x05, 0xc2, 0x00, 0x02, 0x05, 0xa2, 0x90, 0x7f, 0xb4, 0xe0, 0x44, 0x01, 0xf0, 0x02, 0x05} },
+{ 0x04fa,      16,     {0xa2, 0x90, 0x7f, 0xea, 0xe0, 0x70, 0x38, 0x90, 0x7f, 0xec, 0xe0, 0xf4, 0x54, 0x80, 0xff, 0xc4} },
+{ 0x050a,      16,     {0x54, 0x0f, 0xff, 0xe0, 0x54, 0x07, 0x2f, 0x25, 0xe0, 0x24, 0xb4, 0xf5, 0x82, 0xe4, 0x34, 0x7f} },
+{ 0x051a,      16,     {0xf5, 0x83, 0xe4, 0xf0, 0x90, 0x7f, 0xec, 0xe0, 0x54, 0x80, 0xff, 0x13, 0x13, 0x13, 0x54, 0x1f} },
+{ 0x052a,      16,     {0xff, 0xe0, 0x54, 0x07, 0x2f, 0x90, 0x7f, 0xd7, 0xf0, 0xe0, 0x44, 0x20, 0xf0, 0x80, 0x69, 0x90} },
+{ 0x053a,      16,     {0x7f, 0xb4, 0xe0, 0x44, 0x01, 0xf0, 0x80, 0x60, 0x12, 0x0e, 0x4a, 0x50, 0x5b, 0x90, 0x7f, 0xe8} },
+{ 0x054a,      16,     {0xe0, 0x24, 0xfe, 0x60, 0x18, 0x24, 0x02, 0x70, 0x4f, 0x90, 0x7f, 0xea, 0xe0, 0xb4, 0x01, 0x04} },
+{ 0x055a,      16,     {0xd2, 0x00, 0x80, 0x44, 0x90, 0x7f, 0xb4, 0xe0, 0x44, 0x01, 0xf0, 0x80, 0x3b, 0x90, 0x7f, 0xea} },
+{ 0x056a,      16,     {0xe0, 0x70, 0x20, 0x90, 0x7f, 0xec, 0xe0, 0xf4, 0x54, 0x80, 0xff, 0xc4, 0x54, 0x0f, 0xff, 0xe0} },
+{ 0x057a,      16,     {0x54, 0x07, 0x2f, 0x25, 0xe0, 0x24, 0xb4, 0xf5, 0x82, 0xe4, 0x34, 0x7f, 0xf5, 0x83, 0x74, 0x01} },
+{ 0x058a,      16,     {0xf0, 0x80, 0x15, 0x90, 0x7f, 0xb4, 0xe0, 0x44, 0x01, 0xf0, 0x80, 0x0c, 0x12, 0x01, 0x00, 0x50} },
+{ 0x059a,      16,     {0x07, 0x90, 0x7f, 0xb4, 0xe0, 0x44, 0x01, 0xf0, 0x90, 0x7f, 0xb4, 0xe0, 0x44, 0x02, 0xf0, 0x22} },
+{ 0x05aa,      16,     {0xc0, 0xe0, 0xc0, 0x83, 0xc0, 0x82, 0xc0, 0x85, 0xc0, 0x84, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xc0} },
+{ 0x05ba,      16,     {0xd0, 0xc0, 0x00, 0xc0, 0x01, 0xc0, 0x02, 0xc0, 0x03, 0xc0, 0x06, 0xc0, 0x07, 0x90, 0x7f, 0xa5} },
+{ 0x05ca,      16,     {0xe0, 0x30, 0xe2, 0x06, 0x75, 0x0d, 0x06, 0x02, 0x06, 0x76, 0x90, 0x7f, 0xa5, 0xe0, 0x20, 0xe1} },
+{ 0x05da,      16,     {0x0c, 0xe5, 0x0d, 0x64, 0x02, 0x60, 0x06, 0x75, 0x0d, 0x07, 0x02, 0x06, 0x76, 0xaf, 0x0d, 0xef} },
+{ 0x05ea,      16,     {0x24, 0xfe, 0x60, 0x48, 0x14, 0x60, 0x2c, 0x24, 0xfe, 0x60, 0x77, 0x24, 0x04, 0x60, 0x03, 0x02} },
+{ 0x05fa,      16,     {0x06, 0x76, 0xab, 0x09, 0xaa, 0x0a, 0xa9, 0x0b, 0xaf, 0x0c, 0x05, 0x0c, 0x8f, 0x82, 0x75, 0x83} },
+{ 0x060a,      16,     {0x00, 0x12, 0x08, 0x22, 0x90, 0x7f, 0xa6, 0xf0, 0xe5, 0x0c, 0x65, 0x08, 0x70, 0x5e, 0x75, 0x0d} },
+{ 0x061a,      16,     {0x05, 0x80, 0x59, 0x90, 0x7f, 0xa6, 0xe0, 0xab, 0x09, 0xaa, 0x0a, 0xa9, 0x0b, 0xae, 0x0c, 0x8e} },
+{ 0x062a,      16,     {0x82, 0x75, 0x83, 0x00, 0x12, 0x08, 0x4f, 0x75, 0x0d, 0x02, 0x80, 0x40, 0xe5, 0x08, 0x24, 0xfe} },
+{ 0x063a,      16,     {0xb5, 0x0c, 0x07, 0x90, 0x7f, 0xa5, 0xe0, 0x44, 0x20, 0xf0, 0xe5, 0x08, 0x14, 0xb5, 0x0c, 0x0a} },
+{ 0x064a,      16,     {0x90, 0x7f, 0xa5, 0xe0, 0x44, 0x40, 0xf0, 0xe4, 0xf5, 0x0d, 0x90, 0x7f, 0xa6, 0xe0, 0xab, 0x09} },
+{ 0x065a,      16,     {0xaa, 0x0a, 0xa9, 0x0b, 0xae, 0x0c, 0x8e, 0x82, 0x75, 0x83, 0x00, 0x12, 0x08, 0x4f, 0x05, 0x0c} },
+{ 0x066a,      16,     {0x80, 0x0a, 0x90, 0x7f, 0xa5, 0xe0, 0x44, 0x40, 0xf0, 0xe4, 0xf5, 0x0d, 0x53, 0x91, 0xdf, 0xd0} },
+{ 0x067a,      16,     {0x07, 0xd0, 0x06, 0xd0, 0x03, 0xd0, 0x02, 0xd0, 0x01, 0xd0, 0x00, 0xd0, 0xd0, 0xd0, 0x86, 0xd0} },
+{ 0x068a,      10,     {0x84, 0xd0, 0x85, 0xd0, 0x82, 0xd0, 0x83, 0xd0, 0xe0, 0x32} },
+{ 0x0694,      16,     {0x8c, 0x33, 0x8d, 0x34, 0x90, 0x7f, 0x95, 0xe0, 0x44, 0xc0, 0xf0, 0xe4, 0xf5, 0x35, 0xf5, 0x36} },
+{ 0x06a4,      16,     {0xc3, 0xe5, 0x36, 0x95, 0x34, 0xe5, 0x35, 0x95, 0x33, 0x50, 0x69, 0xef, 0x25, 0x36, 0xf5, 0x82} },
+{ 0x06b4,      16,     {0xe5, 0x35, 0x3e, 0xf5, 0x83, 0x74, 0xff, 0xf0, 0xf4, 0x60, 0x02, 0xc3, 0x22, 0xef, 0x25, 0x36} },
+{ 0x06c4,      16,     {0xf5, 0x82, 0xe5, 0x35, 0x3e, 0xf5, 0x83, 0xe4, 0xf0, 0x60, 0x02, 0xc3, 0x22, 0xef, 0x25, 0x36} },
+{ 0x06d4,      16,     {0xf5, 0x82, 0xe5, 0x35, 0x3e, 0xf5, 0x83, 0x74, 0xaa, 0xf0, 0x64, 0xaa, 0x60, 0x02, 0xc3, 0x22} },
+{ 0x06e4,      16,     {0xef, 0x25, 0x36, 0xf5, 0x82, 0xe5, 0x35, 0x3e, 0xf5, 0x83, 0x74, 0x55, 0xf0, 0x64, 0x55, 0x60} },
+{ 0x06f4,      16,     {0x02, 0xc3, 0x22, 0xad, 0x36, 0xe5, 0x36, 0x2f, 0xf5, 0x82, 0xe5, 0x35, 0x3e, 0xf5, 0x83, 0xed} },
+{ 0x0704,      16,     {0xf0, 0xfc, 0xac, 0x05, 0xed, 0x6c, 0x60, 0x02, 0xc3, 0x22, 0x05, 0x36, 0xe5, 0x36, 0x70, 0x02} },
+{ 0x0714,      16,     {0x05, 0x35, 0x80, 0x8c, 0xe4, 0xf5, 0x35, 0xf5, 0x36, 0xc3, 0xe5, 0x36, 0x95, 0x34, 0xe5, 0x35} },
+{ 0x0724,      16,     {0x95, 0x33, 0x50, 0x27, 0xef, 0x25, 0x36, 0xf5, 0x82, 0xe5, 0x35, 0x3e, 0xf5, 0x83, 0xe0, 0x65} },
+{ 0x0734,      16,     {0x36, 0x60, 0x02, 0xc3, 0x22, 0xef, 0x25, 0x36, 0xf5, 0x82, 0xe5, 0x35, 0x3e, 0xf5, 0x83, 0xe4} },
+{ 0x0744,      13,     {0xf0, 0x05, 0x36, 0xe5, 0x36, 0x70, 0x02, 0x05, 0x35, 0x80, 0xce, 0xd3, 0x22} },
+{ 0x0751,      16,     {0xc2, 0x04, 0xd2, 0x05, 0xc2, 0x03, 0xc2, 0x00, 0xc2, 0x02, 0xc2, 0x01, 0x12, 0x0e, 0x3d, 0xd2} },
+{ 0x0761,      16,     {0xe8, 0x43, 0xd8, 0x20, 0x90, 0x7f, 0xab, 0x74, 0xff, 0xf0, 0x90, 0x7f, 0xa9, 0xf0, 0x90, 0x7f} },
+{ 0x0771,      16,     {0xaa, 0xf0, 0x53, 0x91, 0xef, 0x90, 0x7f, 0x95, 0xe0, 0x44, 0xc0, 0xf0, 0x90, 0x7f, 0x93, 0x74} },
+{ 0x0781,      16,     {0x30, 0xf0, 0x12, 0x0a, 0x19, 0x90, 0x7f, 0xaf, 0xe0, 0x44, 0x01, 0xf0, 0x90, 0x7f, 0xae, 0xe0} },
+{ 0x0791,      16,     {0x44, 0x0d, 0xf0, 0xd2, 0xaf, 0x12, 0x0e, 0x35, 0x20, 0x01, 0x42, 0x75, 0x24, 0x00, 0x75, 0x23} },
+{ 0x07a1,      16,     {0x00, 0x75, 0x22, 0x00, 0x75, 0x21, 0x00, 0x7f, 0x48, 0x7e, 0x92, 0x7d, 0x00, 0x7c, 0x00, 0xab} },
+{ 0x07b1,      16,     {0x24, 0xaa, 0x23, 0xa9, 0x22, 0xa8, 0x21, 0xc3, 0x12, 0x08, 0xa9, 0x50, 0xdb, 0x20, 0x01, 0xd8} },
+{ 0x07c1,      16,     {0x7a, 0x00, 0x79, 0x00, 0x78, 0x00, 0xe5, 0x24, 0x24, 0x01, 0xf5, 0x24, 0xea, 0x35, 0x23, 0xf5} },
+{ 0x07d1,      16,     {0x23, 0xe9, 0x35, 0x22, 0xf5, 0x22, 0xe8, 0x35, 0x21, 0xf5, 0x21, 0x80, 0xca, 0x30, 0x01, 0x05} },
+{ 0x07e1,      16,     {0x12, 0x03, 0x7a, 0xc2, 0x01, 0x30, 0x04, 0x1a, 0x12, 0x0e, 0x40, 0x50, 0x13, 0x12, 0x09, 0x00} },
+{ 0x07f1,      16,     {0x30, 0x00, 0x07, 0x90, 0x7f, 0xd6, 0xe0, 0x30, 0xe7, 0xf3, 0x12, 0x0d, 0x4a, 0x12, 0x0e, 0x42} },
+{ 0x0801,      8,      {0xc2, 0x03, 0x12, 0x08, 0xff, 0x80, 0xd6, 0x22} },
+{ 0x0809,      16,     {0xbb, 0x01, 0x06, 0x89, 0x82, 0x8a, 0x83, 0xe0, 0x22, 0x50, 0x02, 0xe7, 0x22, 0xbb, 0xfe, 0x02} },
+{ 0x0819,      9,      {0xe3, 0x22, 0x89, 0x82, 0x8a, 0x83, 0xe4, 0x93, 0x22} },
+{ 0x0822,      16,     {0xbb, 0x01, 0x0c, 0xe5, 0x82, 0x29, 0xf5, 0x82, 0xe5, 0x83, 0x3a, 0xf5, 0x83, 0xe0, 0x22, 0x50} },
+{ 0x0832,      16,     {0x06, 0xe9, 0x25, 0x82, 0xf8, 0xe6, 0x22, 0xbb, 0xfe, 0x06, 0xe9, 0x25, 0x82, 0xf8, 0xe2, 0x22} },
+{ 0x0842,      13,     {0xe5, 0x82, 0x29, 0xf5, 0x82, 0xe5, 0x83, 0x3a, 0xf5, 0x83, 0xe4, 0x93, 0x22} },
+{ 0x084f,      16,     {0xf8, 0xbb, 0x01, 0x0d, 0xe5, 0x82, 0x29, 0xf5, 0x82, 0xe5, 0x83, 0x3a, 0xf5, 0x83, 0xe8, 0xf0} },
+{ 0x085f,      16,     {0x22, 0x50, 0x06, 0xe9, 0x25, 0x82, 0xc8, 0xf6, 0x22, 0xbb, 0xfe, 0x05, 0xe9, 0x25, 0x82, 0xc8} },
+{ 0x086f,      2,      {0xf2, 0x22} },
+{ 0x0871,      16,     {0xbb, 0x01, 0x10, 0xe5, 0x82, 0x29, 0xf5, 0x82, 0xe5, 0x83, 0x3a, 0xf5, 0x83, 0xe0, 0xf5, 0xf0} },
+{ 0x0881,      16,     {0xa3, 0xe0, 0x22, 0x50, 0x09, 0xe9, 0x25, 0x82, 0xf8, 0x86, 0xf0, 0x08, 0xe6, 0x22, 0xbb, 0xfe} },
+{ 0x0891,      16,     {0x0a, 0xe9, 0x25, 0x82, 0xf8, 0xe2, 0xf5, 0xf0, 0x08, 0xe2, 0x22, 0xe5, 0x83, 0x2a, 0xf5, 0x83} },
+{ 0x08a1,      8,      {0xe9, 0x93, 0xf5, 0xf0, 0xa3, 0xe9, 0x93, 0x22} },
+{ 0x08a9,      16,     {0xeb, 0x9f, 0xf5, 0xf0, 0xea, 0x9e, 0x42, 0xf0, 0xe9, 0x9d, 0x42, 0xf0, 0xe8, 0x9c, 0x45, 0xf0} },
+{ 0x08b9,      1,      {0x22} },
+{ 0x08ba,      2,      {0x8f, 0x28} },
+{ 0x08bc,      16,     {0xe4, 0xf5, 0x29, 0x75, 0x2a, 0xff, 0x75, 0x2b, 0x11, 0x75, 0x2c, 0x32, 0xab, 0x2a, 0xaa, 0x2b} },
+{ 0x08cc,      16,     {0xa9, 0x2c, 0x90, 0x00, 0x01, 0x12, 0x08, 0x22, 0xb4, 0x03, 0x1d, 0xaf, 0x29, 0x05, 0x29, 0xef} },
+{ 0x08dc,      16,     {0xb5, 0x28, 0x01, 0x22, 0x12, 0x08, 0x09, 0x7e, 0x00, 0x29, 0xff, 0xee, 0x3a, 0xa9, 0x07, 0x75} },
+{ 0x08ec,      14,     {0x2a, 0xff, 0xf5, 0x2b, 0x89, 0x2c, 0x80, 0xd4, 0x7b, 0x00, 0x7a, 0x00, 0x79, 0x00} },
+{ 0x08fa,      1,      {0x22} },
+{ 0x08fb,      4,      {0x53, 0xd8, 0xef, 0x32} },
+{ 0x08ff,      1,      {0x22} },
+{ 0x0900,      9,      {0x90, 0x7f, 0xd6, 0xe0, 0x44, 0x80, 0xf0, 0x80, 0x74} },
+{ 0x097d,      16,     {0x43, 0x87, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22} },
+{ 0x098d,      12,     {0x78, 0x7f, 0xe4, 0xf6, 0xd8, 0xfd, 0x75, 0x81, 0x39, 0x02, 0x09, 0xd4} },
+{ 0x0999,      16,     {0x02, 0x07, 0x51, 0xe4, 0x93, 0xa3, 0xf8, 0xe4, 0x93, 0xa3, 0x40, 0x03, 0xf6, 0x80, 0x01, 0xf2} },
+{ 0x09a9,      16,     {0x08, 0xdf, 0xf4, 0x80, 0x29, 0xe4, 0x93, 0xa3, 0xf8, 0x54, 0x07, 0x24, 0x0c, 0xc8, 0xc3, 0x33} },
+{ 0x09b9,      16,     {0xc4, 0x54, 0x0f, 0x44, 0x20, 0xc8, 0x83, 0x40, 0x04, 0xf4, 0x56, 0x80, 0x01, 0x46, 0xf6, 0xdf} },
+{ 0x09c9,      16,     {0xe4, 0x80, 0x0b, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x90, 0x0d, 0xec, 0xe4, 0x7e} },
+{ 0x09d9,      16,     {0x01, 0x93, 0x60, 0xbc, 0xa3, 0xff, 0x54, 0x3f, 0x30, 0xe5, 0x09, 0x54, 0x1f, 0xfe, 0xe4, 0x93} },
+{ 0x09e9,      16,     {0xa3, 0x60, 0x01, 0x0e, 0xcf, 0x54, 0xc0, 0x25, 0xe0, 0x60, 0xa8, 0x40, 0xb8, 0xe4, 0x93, 0xa3} },
+{ 0x09f9,      16,     {0xfa, 0xe4, 0x93, 0xa3, 0xf8, 0xe4, 0x93, 0xa3, 0xc8, 0xc5, 0x82, 0xc8, 0xca, 0xc5, 0x83, 0xca} },
+{ 0x0a09,      16,     {0xf0, 0xa3, 0xc8, 0xc5, 0x82, 0xc8, 0xca, 0xc5, 0x83, 0xca, 0xdf, 0xe9, 0xde, 0xe7, 0x80, 0xbe} },
+{ 0x0a19,      16,     {0xe4, 0x90, 0x7f, 0x9c, 0xf0, 0x7f, 0x0a, 0xfe, 0x12, 0x0d, 0x94, 0x90, 0x7f, 0x96, 0x74, 0x89} },
+{ 0x0a29,      16,     {0xf0, 0x90, 0x7f, 0x9c, 0x74, 0xcf, 0xf0, 0x7f, 0xf4, 0x7e, 0x01, 0x12, 0x0d, 0x94, 0x90, 0x7f} },
+{ 0x0a39,      16,     {0x96, 0xe0, 0x54, 0xfe, 0xf0, 0x7f, 0x0a, 0x7e, 0x00, 0x12, 0x0d, 0x94, 0x7f, 0x05, 0x7e, 0x00} },
+{ 0x0a49,      16,     {0x12, 0x0d, 0x94, 0x90, 0x7f, 0x96, 0xe0, 0x44, 0x02, 0xf0, 0xe0, 0x54, 0x7f, 0xf0, 0x7f, 0x05} },
+{ 0x0a59,      16,     {0x7e, 0x00, 0x12, 0x0d, 0x94, 0x90, 0x7f, 0x96, 0xe0, 0x44, 0x40, 0xf0, 0x7f, 0x05, 0x7e, 0x00} },
+{ 0x0a69,      16,     {0x12, 0x0d, 0x94, 0x90, 0x7f, 0x96, 0xe0, 0x54, 0xbf, 0xf0, 0x7f, 0x32, 0x7e, 0x00, 0x12, 0x0d} },
+{ 0x0a79,      16,     {0x94, 0x90, 0x7f, 0x96, 0xe0, 0x44, 0x40, 0xf0, 0x7f, 0x32, 0x7e, 0x00, 0x12, 0x0d, 0x94, 0x22} },
+{ 0x0a89,      16,     {0x75, 0x32, 0x01, 0xe5, 0x32, 0x60, 0x1b, 0x7f, 0x01, 0x12, 0x0d, 0xd7, 0x7f, 0x00, 0x7e, 0x0e} },
+{ 0x0a99,      16,     {0x7d, 0x00, 0x7c, 0x01, 0x12, 0x06, 0x94, 0xe4, 0x33, 0xf5, 0x32, 0x70, 0x05, 0x7f, 0x0f, 0x12} },
+{ 0x0aa9,      16,     {0x0d, 0xd7, 0xe5, 0x32, 0x60, 0x1b, 0x7f, 0x02, 0x12, 0x0d, 0xd7, 0x7f, 0x00, 0x7e, 0x80, 0x7d} },
+{ 0x0ab9,      16,     {0x00, 0x7c, 0x80, 0x12, 0x06, 0x94, 0xe4, 0x33, 0xf5, 0x32, 0x70, 0x05, 0x7f, 0x0f, 0x12, 0x0d} },
+{ 0x0ac9,      16,     {0xd7, 0xe5, 0x32, 0x60, 0x1b, 0x7f, 0x03, 0x12, 0x0d, 0xd7, 0x7f, 0x00, 0x7e, 0x20, 0x7d, 0x40} },
+{ 0x0ad9,      16,     {0x7c, 0x5b, 0x12, 0x06, 0x94, 0xe4, 0x33, 0xf5, 0x32, 0x70, 0x05, 0x7f, 0x0f, 0x12, 0x0d, 0xd7} },
+{ 0x0ae9,      14,     {0xe5, 0x32, 0x60, 0x05, 0xe4, 0xff, 0x12, 0x0d, 0xd7, 0xe5, 0x32, 0x24, 0xff, 0x22} },
+{ 0x0af7,      8,      {0x90, 0x7f, 0xea, 0xe0, 0xf5, 0x10, 0xd3, 0x22} },
+{ 0x0aff,      1,      {0x32} },
+{ 0x0b00,      16,     {0x02, 0x0d, 0x64, 0x00, 0x02, 0x0d, 0xab, 0x00, 0x02, 0x0d, 0x2f, 0x00, 0x02, 0x0d, 0x7c, 0x00} },
+{ 0x0b10,      16,     {0x02, 0x0d, 0xc1, 0x00, 0x02, 0x0a, 0xff, 0x00, 0x02, 0x0e, 0x4c, 0x00, 0x02, 0x0e, 0x4d, 0x00} },
+{ 0x0b20,      16,     {0x02, 0x0e, 0x4e, 0x00, 0x02, 0x0e, 0x4f, 0x00, 0x02, 0x0e, 0x50, 0x00, 0x02, 0x0e, 0x51, 0x00} },
+{ 0x0b30,      16,     {0x02, 0x0e, 0x52, 0x00, 0x02, 0x0e, 0x53, 0x00, 0x02, 0x0e, 0x54, 0x00, 0x02, 0x0e, 0x55, 0x00} },
+{ 0x0b40,      16,     {0x02, 0x0e, 0x56, 0x00, 0x02, 0x0e, 0x57, 0x00, 0x02, 0x0e, 0x58, 0x00, 0x02, 0x0e, 0x59, 0x00} },
+{ 0x0b50,      8,      {0x02, 0x0e, 0x5a, 0x00, 0x02, 0x0e, 0x5b, 0x00} },
+{ 0x0b58,      16,     {0xe4, 0xfe, 0x75, 0x2a, 0xff, 0x75, 0x2b, 0x11, 0x75, 0x2c, 0x12, 0xab, 0x2a, 0xaa, 0x2b, 0xa9} },
+{ 0x0b68,      16,     {0x2c, 0x90, 0x00, 0x01, 0x12, 0x08, 0x22, 0x64, 0x02, 0x70, 0x2d, 0xad, 0x06, 0x0e, 0xed, 0xb5} },
+{ 0x0b78,      16,     {0x07, 0x01, 0x22, 0x90, 0x00, 0x02, 0x12, 0x08, 0x71, 0x85, 0xf0, 0x28, 0xf5, 0x29, 0x62, 0x28} },
+{ 0x0b88,      16,     {0xe5, 0x28, 0x62, 0x29, 0xe5, 0x29, 0x62, 0x28, 0x29, 0xfd, 0xe5, 0x28, 0x3a, 0xa9, 0x05, 0x75} },
+{ 0x0b98,      14,     {0x2a, 0xff, 0xf5, 0x2b, 0x89, 0x2c, 0x80, 0xc3, 0x7b, 0x00, 0x7a, 0x00, 0x79, 0x00} },
+{ 0x0ba6,      1,      {0x22} },
+{ 0x0ba7,      16,     {0xab, 0x07, 0xaa, 0x06, 0xac, 0x05, 0xe4, 0xfd, 0xe5, 0x11, 0x60, 0x11, 0xea, 0xff, 0xae, 0x05} },
+{ 0x0bb7,      16,     {0x0d, 0xee, 0x24, 0x10, 0xf5, 0x82, 0xe4, 0x34, 0x0f, 0xf5, 0x83, 0xef, 0xf0, 0xeb, 0xae, 0x05} },
+{ 0x0bc7,      16,     {0x0d, 0x74, 0x10, 0x2e, 0xf5, 0x82, 0xe4, 0x34, 0x0f, 0xf5, 0x83, 0xeb, 0xf0, 0xaf, 0x05, 0x0d} },
+{ 0x0bd7,      16,     {0x74, 0x10, 0x2f, 0xf5, 0x82, 0xe4, 0x34, 0x0f, 0xf5, 0x83, 0xec, 0xf0, 0xaf, 0x0f, 0x7a, 0x0f} },
+{ 0x0be7,      13,     {0x7b, 0x10, 0x12, 0x0d, 0x10, 0x7f, 0x0a, 0x7e, 0x00, 0x12, 0x0d, 0x94, 0x22} },
+{ 0x0bf4,      16,     {0x8e, 0x32, 0x8f, 0x33, 0x8d, 0x34, 0x8a, 0x35, 0x8b, 0x36, 0xe4, 0xfd, 0xf5, 0x37, 0xe5, 0x11} },
+{ 0x0c04,      16,     {0x60, 0x12, 0xe5, 0x32, 0xff, 0xae, 0x05, 0x0d, 0xee, 0x24, 0x13, 0xf5, 0x82, 0xe4, 0x34, 0x0f} },
+{ 0x0c14,      16,     {0xf5, 0x83, 0xef, 0xf0, 0xe5, 0x33, 0xae, 0x05, 0x0d, 0x74, 0x13, 0x2e, 0xf5, 0x82, 0xe4, 0x34} },
+{ 0x0c24,      16,     {0x0f, 0xf5, 0x83, 0xe5, 0x33, 0xf0, 0xaf, 0x0f, 0x7a, 0x0f, 0x7b, 0x13, 0x12, 0x0d, 0x10, 0xaf} },
+{ 0x0c34,      11,     {0x0f, 0xad, 0x34, 0xab, 0x36, 0xaa, 0x35, 0x12, 0x0c, 0xf1, 0x22} },
+{ 0x0c3f,      16,     {0x8e, 0x32, 0x8f, 0x33, 0x8d, 0x34, 0x8a, 0x35, 0x8b, 0x36, 0xe4, 0xf5, 0x37, 0xe5, 0x37, 0xc3} },
+{ 0x0c4f,      16,     {0x95, 0x34, 0x50, 0x20, 0x05, 0x33, 0xe5, 0x33, 0xae, 0x32, 0x70, 0x02, 0x05, 0x32, 0x14, 0xff} },
+{ 0x0c5f,      16,     {0xe5, 0x36, 0x25, 0x37, 0xf5, 0x82, 0xe4, 0x35, 0x35, 0xf5, 0x83, 0xe0, 0xfd, 0x12, 0x0b, 0xa7} },
+{ 0x0c6f,      5,      {0x05, 0x37, 0x80, 0xd9, 0x22} },
+{ 0x0c74,      16,     {0xa9, 0x07, 0xe5, 0x0d, 0x70, 0x25, 0x90, 0x7f, 0xa5, 0xe0, 0x44, 0x80, 0xf0, 0xe9, 0x25, 0xe0} },
+{ 0x0c84,      16,     {0x44, 0x01, 0x90, 0x7f, 0xa6, 0xf0, 0x8d, 0x08, 0xaf, 0x03, 0xa9, 0x07, 0x75, 0x09, 0x01, 0x8a} },
+{ 0x0c94,      13,     {0x0a, 0x89, 0x0b, 0xe4, 0xf5, 0x0c, 0x75, 0x0d, 0x03, 0xd3, 0x22, 0xc3, 0x22} },
+{ 0x0ca1,      16,     {0xa9, 0x07, 0xe5, 0x0d, 0x70, 0x23, 0x90, 0x7f, 0xa5, 0xe0, 0x44, 0x80, 0xf0, 0xe9, 0x25, 0xe0} },
+{ 0x0cb1,      16,     {0x90, 0x7f, 0xa6, 0xf0, 0x8d, 0x08, 0xaf, 0x03, 0xa9, 0x07, 0x75, 0x09, 0x01, 0x8a, 0x0a, 0x89} },
+{ 0x0cc1,      11,     {0x0b, 0xe4, 0xf5, 0x0c, 0x75, 0x0d, 0x01, 0xd3, 0x22, 0xc3, 0x22} },
+{ 0x0ccc,      16,     {0x90, 0x7f, 0xd6, 0xe0, 0x54, 0xfb, 0xf0, 0xe0, 0x44, 0x08, 0xf0, 0x30, 0x06, 0x04, 0xe0, 0x44} },
+{ 0x0cdc,      16,     {0x02, 0xf0, 0x7f, 0xd0, 0x7e, 0x07, 0x12, 0x0d, 0x94, 0x90, 0x7f, 0xd6, 0xe0, 0x54, 0xf7, 0xf0} },
+{ 0x0cec,      5,      {0xe0, 0x44, 0x04, 0xf0, 0x22} },
+{ 0x0cf1,      16,     {0x12, 0x0c, 0x74, 0xe5, 0x0d, 0x24, 0xfa, 0x60, 0x10, 0x14, 0x60, 0x07, 0x24, 0x07, 0x70, 0xf3} },
+{ 0x0d01,      15,     {0x7f, 0x08, 0x22, 0xe4, 0xf5, 0x0d, 0x7f, 0x07, 0x22, 0xe4, 0xf5, 0x0d, 0x7f, 0x06, 0x22} },
+{ 0x0d10,      16,     {0x12, 0x0c, 0xa1, 0xe5, 0x0d, 0x24, 0xfa, 0x60, 0x10, 0x14, 0x60, 0x07, 0x24, 0x07, 0x70, 0xf3} },
+{ 0x0d20,      15,     {0x7f, 0x08, 0x22, 0xe4, 0xf5, 0x0d, 0x7f, 0x07, 0x22, 0xe4, 0xf5, 0x0d, 0x7f, 0x06, 0x22} },
+{ 0x0d2f,      16,     {0xc0, 0xe0, 0xc0, 0x83, 0xc0, 0x82, 0x90, 0x7f, 0xc4, 0xe4, 0xf0, 0x53, 0x91, 0xef, 0x90, 0x7f} },
+{ 0x0d3f,      11,     {0xab, 0x74, 0x04, 0xf0, 0xd0, 0x82, 0xd0, 0x83, 0xd0, 0xe0, 0x32} },
+{ 0x0d4a,      16,     {0x90, 0x7f, 0xd6, 0xe0, 0x30, 0xe7, 0x12, 0xe0, 0x44, 0x01, 0xf0, 0x7f, 0x14, 0x7e, 0x00, 0x12} },
+{ 0x0d5a,      10,     {0x0d, 0x94, 0x90, 0x7f, 0xd6, 0xe0, 0x54, 0xfe, 0xf0, 0x22} },
+{ 0x0d64,      16,     {0xc0, 0xe0, 0xc0, 0x83, 0xc0, 0x82, 0xd2, 0x01, 0x53, 0x91, 0xef, 0x90, 0x7f, 0xab, 0x74, 0x01} },
+{ 0x0d74,      8,      {0xf0, 0xd0, 0x82, 0xd0, 0x83, 0xd0, 0xe0, 0x32} },
+{ 0x0d7c,      16,     {0xc0, 0xe0, 0xc0, 0x83, 0xc0, 0x82, 0xd2, 0x03, 0x53, 0x91, 0xef, 0x90, 0x7f, 0xab, 0x74, 0x08} },
+{ 0x0d8c,      8,      {0xf0, 0xd0, 0x82, 0xd0, 0x83, 0xd0, 0xe0, 0x32} },
+{ 0x0d94,      16,     {0x8e, 0x38, 0x8f, 0x39, 0xe5, 0x39, 0x15, 0x39, 0xae, 0x38, 0x70, 0x02, 0x15, 0x38, 0x4e, 0x60} },
+{ 0x0da4,      7,      {0x05, 0x12, 0x0e, 0x00, 0x80, 0xee, 0x22} },
+{ 0x0dab,      16,     {0xc0, 0xe0, 0xc0, 0x83, 0xc0, 0x82, 0x53, 0x91, 0xef, 0x90, 0x7f, 0xab, 0x74, 0x02, 0xf0, 0xd0} },
+{ 0x0dbb,      6,      {0x82, 0xd0, 0x83, 0xd0, 0xe0, 0x32} },
+{ 0x0dc1,      16,     {0xc0, 0xe0, 0xc0, 0x83, 0xc0, 0x82, 0x53, 0x91, 0xef, 0x90, 0x7f, 0xab, 0x74, 0x10, 0xf0, 0xd0} },
+{ 0x0dd1,      6,      {0x82, 0xd0, 0x83, 0xd0, 0xe0, 0x32} },
+{ 0x0dd7,      16,     {0xae, 0x07, 0x7f, 0x21, 0x7d, 0x01, 0x74, 0x00, 0x2e, 0xf5, 0x82, 0xe4, 0x34, 0x0f, 0xab, 0x82} },
+{ 0x0de7,      5,      {0xfa, 0x12, 0x0d, 0x10, 0x22} },
+{ 0x0dec,      16,     {0x50, 0x0f, 0x00, 0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x98, 0x88, 0x83, 0xc6} },
+{ 0x0dfc,      3,      {0xa1, 0x86, 0x8e} },
+{ 0x0dff,      1,      {0x00} },
+{ 0x0e00,      16,     {0x74, 0x00, 0xf5, 0x86, 0x90, 0xfd, 0xa5, 0x7c, 0x05, 0xa3, 0xe5, 0x82, 0x45, 0x83, 0x70, 0xf9} },
+{ 0x0e10,      1,      {0x22} },
+{ 0x0e11,      14,     {0x90, 0x7f, 0x00, 0xe5, 0x10, 0xf0, 0x90, 0x7f, 0xb5, 0x74, 0x01, 0xf0, 0xd3, 0x22} },
+{ 0x0e1f,      14,     {0x90, 0x7f, 0x00, 0xe5, 0x0e, 0xf0, 0x90, 0x7f, 0xb5, 0x74, 0x01, 0xf0, 0xd3, 0x22} },
+{ 0x0e2d,      8,      {0x90, 0x7f, 0xea, 0xe0, 0xf5, 0x0e, 0xd3, 0x22} },
+{ 0x0e35,      8,      {0xe4, 0xf5, 0x0d, 0xd2, 0xe9, 0xd2, 0xaf, 0x22} },
+{ 0x0e3d,      3,      {0xd2, 0x00, 0x22} },
+{ 0x0e40,      2,      {0xd3, 0x22} },
+{ 0x0e42,      2,      {0xd3, 0x22} },
+{ 0x0e44,      2,      {0xd3, 0x22} },
+{ 0x0e46,      2,      {0xd3, 0x22} },
+{ 0x0e48,      2,      {0xd3, 0x22} },
+{ 0x0e4a,      2,      {0xd3, 0x22} },
+{ 0x0e4c,      1,      {0x32} },
+{ 0x0e4d,      1,      {0x32} },
+{ 0x0e4e,      1,      {0x32} },
+{ 0x0e4f,      1,      {0x32} },
+{ 0x0e50,      1,      {0x32} },
+{ 0x0e51,      1,      {0x32} },
+{ 0x0e52,      1,      {0x32} },
+{ 0x0e53,      1,      {0x32} },
+{ 0x0e54,      1,      {0x32} },
+{ 0x0e55,      1,      {0x32} },
+{ 0x0e56,      1,      {0x32} },
+{ 0x0e57,      1,      {0x32} },
+{ 0x0e58,      1,      {0x32} },
+{ 0x0e59,      1,      {0x32} },
+{ 0x0e5a,      1,      {0x32} },
+{ 0x0e5b,      1,      {0x32} },
+{ 0x1100,      16,     {0x12, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x40, 0x47, 0x05, 0x10, 0x27, 0x01, 0x00, 0x01, 0x02} },
+{ 0x1110,      16,     {0x00, 0x01, 0x09, 0x02, 0x20, 0x00, 0x01, 0x01, 0x03, 0xa0, 0x00, 0x09, 0x04, 0x00, 0x00, 0x02} },
+{ 0x1120,      16,     {0xff, 0x00, 0x00, 0x04, 0x07, 0x05, 0x82, 0x02, 0x40, 0x00, 0x00, 0x07, 0x05, 0x02, 0x02, 0x40} },
+{ 0x1130,      16,     {0x00, 0x00, 0x04, 0x03, 0x09, 0x04, 0x26, 0x03, 0x41, 0x00, 0x6e, 0x00, 0x63, 0x00, 0x68, 0x00} },
+{ 0x1140,      16,     {0x6f, 0x00, 0x72, 0x00, 0x20, 0x00, 0x43, 0x00, 0x68, 0x00, 0x69, 0x00, 0x70, 0x00, 0x73, 0x00} },
+{ 0x1150,      16,     {0x2c, 0x00, 0x20, 0x00, 0x49, 0x00, 0x6e, 0x00, 0x63, 0x00, 0x2e, 0x00, 0x28, 0x03, 0x46, 0x00} },
+{ 0x1160,      16,     {0x69, 0x00, 0x72, 0x00, 0x6d, 0x00, 0x77, 0x00, 0x61, 0x00, 0x72, 0x00, 0x65, 0x00, 0x20, 0x00} },
+{ 0x1170,      16,     {0x46, 0x00, 0x72, 0x00, 0x61, 0x00, 0x6d, 0x00, 0x65, 0x00, 0x57, 0x00, 0x6f, 0x00, 0x72, 0x00} },
+{ 0x1180,      16,     {0x6b, 0x00, 0x73, 0x00, 0x2a, 0x03, 0x43, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x66, 0x00, 0x69, 0x00} },
+{ 0x1190,      16,     {0x67, 0x00, 0x75, 0x00, 0x72, 0x00, 0x61, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6f, 0x00, 0x6e, 0x00} },
+{ 0x11a0,      16,     {0x20, 0x00, 0x53, 0x00, 0x74, 0x00, 0x72, 0x00, 0x69, 0x00, 0x6e, 0x00, 0x67, 0x00, 0x22, 0x03} },
+{ 0x11b0,      16,     {0x49, 0x00, 0x6e, 0x00, 0x74, 0x00, 0x65, 0x00, 0x72, 0x00, 0x66, 0x00, 0x61, 0x00, 0x63, 0x00} },
+{ 0x11c0,      16,     {0x65, 0x00, 0x20, 0x00, 0x53, 0x00, 0x74, 0x00, 0x72, 0x00, 0x69, 0x00, 0x6e, 0x00, 0x67, 0x00} },
+{ 0x11d0,      2,      {0x00, 0x00} },
+{ 0xffff,      0,      {0x00} }
+};
+#endif
index 0af34b2b6ed2d941924c12793431420131101da0..2fa4e30b6c1e3764d5f86c9cb37bfd28e9eb9f1f 100644 (file)
@@ -56,11 +56,11 @@ static kmem_cache_t *uhci_up_cachep;        /* urb_priv */
 
 static LIST_HEAD(uhci_list);
 
-static int rh_submit_urb(urb_t *urb);
-static int rh_unlink_urb(urb_t *urb);
+static int rh_submit_urb(struct urb *urb);
+static int rh_unlink_urb(struct urb *urb);
 static int uhci_get_current_frame_number(struct usb_device *dev);
-static int uhci_unlink_generic(urb_t *urb);
-static int uhci_unlink_urb(urb_t *urb);
+static int uhci_unlink_generic(struct urb *urb);
+static int uhci_unlink_urb(struct urb *urb);
 
 #define min(a,b) (((a)<(b))?(a):(b))
 
@@ -77,9 +77,8 @@ static int uhci_alloc_dev(struct usb_device *dev)
 
 static int uhci_free_dev(struct usb_device *dev)
 {
-       urb_t *u;
        struct uhci *uhci = (struct uhci *)dev->bus->hcpriv;
-       struct list_head *tmp, *next, *head = &uhci->urb_list;
+       struct list_head *tmp, *head = &uhci->urb_list;
        unsigned long flags;
 
        /* Walk through the entire URB list and forcefully remove any */
@@ -87,14 +86,12 @@ static int uhci_free_dev(struct usb_device *dev)
        nested_lock(&uhci->urblist_lock, flags);
        tmp = head->next;
        while (tmp != head) {
-               u = list_entry(tmp, urb_t, urb_list);
+               struct urb *u = list_entry(tmp, struct urb, urb_list);
 
-               next = tmp->next;
+               tmp = tmp->next;
 
                if (u->dev == dev)
                        uhci_unlink_urb(u);
-
-               tmp = next;
        }
        nested_unlock(&uhci->urblist_lock, flags);
 
@@ -115,13 +112,31 @@ static void uhci_remove_urb_list(struct uhci *uhci, struct urb *urb)
        unsigned long flags;
 
        nested_lock(&uhci->urblist_lock, flags);
-       if (urb->urb_list.next != &urb->urb_list) {
+       if (!list_empty(&urb->urb_list)) {
                list_del(&urb->urb_list);
                INIT_LIST_HEAD(&urb->urb_list);
        }
        nested_unlock(&uhci->urblist_lock, flags);
 }
 
+void uhci_set_next_interrupt(struct uhci *uhci)
+{
+       unsigned long flags;
+
+       spin_lock_irqsave(&uhci->framelist_lock, flags);
+       uhci->skel_term_td.status |= TD_CTRL_IOC;
+       spin_unlock_irqrestore(&uhci->framelist_lock, flags);
+}
+
+void uhci_clear_next_interrupt(struct uhci *uhci)
+{
+       unsigned long flags;
+
+       spin_lock_irqsave(&uhci->framelist_lock, flags);
+       uhci->skel_term_td.status &= ~TD_CTRL_IOC;
+       spin_unlock_irqrestore(&uhci->framelist_lock, flags);
+}
+
 static struct uhci_td *uhci_alloc_td(struct usb_device *dev)
 {
        struct uhci_td *td;
@@ -135,8 +150,8 @@ static struct uhci_td *uhci_alloc_td(struct usb_device *dev)
 
        td->frameptr = NULL;
        td->nexttd = td->prevtd = NULL;
-       td->list.next = td->list.prev = NULL;
        td->dev = dev;
+       INIT_LIST_HEAD(&td->list);
 
        usb_inc_dev_use(dev);
 
@@ -235,23 +250,32 @@ static void uhci_remove_td(struct uhci *uhci, struct uhci_td *td)
  */
 static void uhci_insert_tds_in_qh(struct uhci_qh *qh, struct urb *urb, int breadth)
 {
+       struct list_head *tmp, *head;
        struct urb_priv *urbp = (struct urb_priv *)urb->hcpriv;
        struct uhci_td *td, *prevtd;
 
        if (!urbp)
                return;
 
-       td = urbp->list.begin;
-       if (!td)
+       head = &urbp->list;
+       tmp = head->next;
+       if (head == tmp)
                return;
 
+       td = list_entry(tmp, struct uhci_td, list);
+
        /* Add the first TD to the QH element pointer */
        qh->element = virt_to_bus(td) | (breadth ? 0 : UHCI_PTR_DEPTH);
 
        prevtd = td;
 
        /* Then link the rest of the TD's */
-       for (td = td->list.next; td; td = td->list.next) {
+       tmp = tmp->next;
+       while (tmp != head) {
+               td = list_entry(tmp, struct uhci_td, list);
+
+               tmp = tmp->next;
+
                prevtd->link = virt_to_bus(td) | (breadth ? 0 : UHCI_PTR_DEPTH);
 
                prevtd = td;
@@ -260,9 +284,45 @@ static void uhci_insert_tds_in_qh(struct uhci_qh *qh, struct urb *urb, int bread
        prevtd->link = UHCI_PTR_TERM;
 }
 
+/* This function will append one URB's QH to another URB's QH. This is for */
+/*  USB_QUEUE_BULK support */
+static void uhci_append_urb_qh(struct uhci *uhci, struct urb *eurb, struct urb *urb)
+{
+       struct urb *nurb;
+       struct urb_priv *eurbp, *urbp, *nurbp;
+       struct list_head *tmp;
+       struct uhci_td *td, *ntd;
+       unsigned long flags;
+
+       eurbp = eurb->hcpriv;
+       urbp = urb->hcpriv;
+
+       spin_lock_irqsave(&eurb->lock, flags);
+
+       /* Grab the last URB in the queue */
+       tmp = eurbp->urb_queue_list.prev;
+
+       /* Add this one to the end */
+       list_add_tail(&urbp->urb_queue_list, &eurbp->urb_queue_list);
+
+       spin_unlock_irqrestore(&eurb->lock, flags);
+
+       nurbp = list_entry(tmp, struct urb_priv, urb_queue_list);
+       nurb = nurbp->urb;
+
+       tmp = nurbp->list.prev;
+       td = list_entry(tmp, struct uhci_td, list);
+
+       tmp = urbp->list.next;
+       ntd = list_entry(tmp, struct uhci_td, list);
+
+       /* No breadth since this will only be called for bulk transfers */
+       td->link = virt_to_bus(ntd);
+}
+
 static void uhci_free_td(struct uhci_td *td)
 {
-       if (td->list.next || td->list.prev)
+       if (!list_empty(&td->list))
                dbg("td is still in URB list!");
 
        kmem_cache_free(uhci_td_cachep, td);
@@ -322,6 +382,10 @@ static void uhci_insert_qh(struct uhci *uhci, struct uhci_qh *skelqh, struct uhc
 static void uhci_remove_qh(struct uhci *uhci, struct uhci_qh *qh)
 {
        unsigned long flags;
+       int delayed;
+
+       /* If the QH isn't queued, then we don't need to delay unlink it */
+       delayed = (qh->prevqh || qh->nextqh);
 
        spin_lock_irqsave(&uhci->framelist_lock, flags);
        if (qh->prevqh) {
@@ -333,9 +397,20 @@ static void uhci_remove_qh(struct uhci *uhci, struct uhci_qh *qh)
        qh->prevqh = qh->nextqh = NULL;
        spin_unlock_irqrestore(&uhci->framelist_lock, flags);
 
-       spin_lock_irqsave(&uhci->qh_remove_lock, flags);
-       list_add(&qh->remove_list, &uhci->qh_remove_list);
-       spin_unlock_irqrestore(&uhci->qh_remove_lock, flags);
+       if (delayed) {
+               spin_lock_irqsave(&uhci->qh_remove_lock, flags);
+
+               /* Check to see if the remove list is empty */
+               /* Set the IOC bit to force an interrupt so we can remove the QH */
+               if (list_empty(&uhci->qh_remove_list))
+                       uhci_set_next_interrupt(uhci);
+
+               /* Add it */
+               list_add(&qh->remove_list, &uhci->qh_remove_list);
+
+               spin_unlock_irqrestore(&uhci->qh_remove_lock, flags);
+       } else
+               uhci_free_qh(qh);
 }
 
 struct urb_priv *uhci_alloc_urb_priv(struct urb *urb)
@@ -348,91 +423,86 @@ struct urb_priv *uhci_alloc_urb_priv(struct urb *urb)
 
        memset((void *)urbp, 0, sizeof(*urbp));
 
-       urbp->list.begin = urbp->list.end = NULL;
+       urbp->inserttime = jiffies;
+       urbp->urb = urb;
+       
+       INIT_LIST_HEAD(&urbp->list);
+       INIT_LIST_HEAD(&urbp->urb_queue_list);
 
        urb->hcpriv = urbp;
 
-       urbp->inserttime = jiffies;
-
        usb_inc_dev_use(urb->dev);
 
        return urbp;
 }
 
-static void uhci_add_td_to_urb(urb_t *urb, struct uhci_td *td)
+static void uhci_add_td_to_urb(struct urb *urb, struct uhci_td *td)
 {
        struct urb_priv *urbp = (struct urb_priv *)urb->hcpriv;
 
        td->urb = urb;
 
-       if (!urbp->list.begin)
-               urbp->list.begin = td;
-
-       if (urbp->list.end) {
-               urbp->list.end->list.next = td;
-               td->list.prev = urbp->list.end;
-       }
-       urbp->list.end = td;
+       list_add_tail(&td->list, &urbp->list);
 }
 
-static void uhci_remove_td_from_urb(urb_t *urb, struct uhci_td *td)
+static void uhci_remove_td_from_urb(struct urb *urb, struct uhci_td *td)
 {
-       struct urb_priv *urbp = (struct urb_priv *)urb->hcpriv;
+       urb = NULL;     /* No warnings */
 
-       if (!urbp->list.begin && !urbp->list.end)
+       if (list_empty(&td->list))
                return;
 
-       if (td->list.prev)
-               td->list.prev->list.next = td->list.next;
-       else
-               urbp->list.begin = td->list.next;
+       list_del(&td->list);
+       INIT_LIST_HEAD(&td->list);
 
-       if (td->list.next)
-               td->list.next->list.prev = td->list.prev;
-       else
-               urbp->list.end = td->list.prev;
-
-       td->list.next = td->list.prev = NULL;
        td->urb = NULL;
 }
 
-static void uhci_destroy_urb_priv(urb_t *urb)
+static void uhci_destroy_urb_priv(struct urb *urb)
 {
+       struct list_head *tmp, *head;
        struct urb_priv *urbp;
        struct uhci *uhci;
-       struct uhci_td *td, *nexttd;
+       struct uhci_td *td;
        unsigned long flags;
 
        spin_lock_irqsave(&urb->lock, flags);
 
        urbp = (struct urb_priv *)urb->hcpriv;
        if (!urbp)
-               return;
+               goto unlock;
 
        if (!urb->dev || !urb->dev->bus || !urb->dev->bus->hcpriv)
-               return;
+               goto unlock;
 
        uhci = urb->dev->bus->hcpriv;
 
-       td = urbp->list.begin;
-       while (td) {
-               nexttd = td->list.next;
+       head = &urbp->list;
+       tmp = head->next;
+       while (tmp != head) {
+               td = list_entry(tmp, struct uhci_td, list);
+
+               tmp = tmp->next;
 
                uhci_remove_td_from_urb(urb, td);
 
                uhci_remove_td(uhci, td);
 
                uhci_free_td(td);
-               
-               td = nexttd;
+       }
+
+       if (!list_empty(&urbp->urb_queue_list)) {
+               list_del(&urbp->urb_queue_list);
+               INIT_LIST_HEAD(&urbp->urb_queue_list);
        }
 
        urb->hcpriv = NULL;
        kmem_cache_free(uhci_up_cachep, urbp);
 
-       spin_unlock_irqrestore(&urb->lock, flags);
-
        usb_dec_dev_use(urb->dev);
+
+unlock:
+       spin_unlock_irqrestore(&urb->lock, flags);
 }
 
 static void uhci_inc_fsbr(struct uhci *uhci, struct urb *urb)
@@ -508,7 +578,7 @@ static int uhci_map_status(int status, int dir_out)
 /*
  * Control transfers
  */
-static int uhci_submit_control(urb_t *urb)
+static int uhci_submit_control(struct urb *urb)
 {
        struct urb_priv *urbp = (struct urb_priv *)urb->hcpriv;
        struct uhci *uhci = (struct uhci *)urb->dev->bus->hcpriv;
@@ -602,10 +672,12 @@ static int uhci_submit_control(urb_t *urb)
        if (urb->pipe & TD_CTRL_LS) {
                uhci_insert_tds_in_qh(qh, urb, 0);
                uhci_insert_qh(uhci, &uhci->skel_ls_control_qh, qh);
+               urbp->queued = 0;
        } else {
                uhci_insert_tds_in_qh(qh, urb, 1);
                uhci_insert_qh(uhci, &uhci->skel_hs_control_qh, qh);
                uhci_inc_fsbr(uhci, urb);
+               urbp->queued = 0;
        }
 
        urbp->qh = qh;
@@ -617,10 +689,11 @@ static int uhci_submit_control(urb_t *urb)
        return -EINPROGRESS;
 }
 
-static int usb_control_retrigger_status(urb_t *urb);
+static int usb_control_retrigger_status(struct urb *urb);
 
-static int uhci_result_control(urb_t *urb)
+static int uhci_result_control(struct urb *urb)
 {
+       struct list_head *tmp, *head;
        struct urb_priv *urbp = urb->hcpriv;
        struct uhci_td *td;
        unsigned int status;
@@ -628,13 +701,16 @@ static int uhci_result_control(urb_t *urb)
        if (!urbp)
                return -EINVAL;
 
-       td = urbp->list.begin;
-       if (!td)
+       head = &urbp->list;
+       tmp = head->next;
+       if (head == tmp)
                return -EINVAL;
 
        if (urbp->short_control_packet)
                goto status_phase;
 
+       td = list_entry(tmp, struct uhci_td, list);
+
        /* The first TD is the SETUP phase, check the status, but skip */
        /*  the count */
        status = uhci_status_bits(td->status);
@@ -646,10 +722,13 @@ static int uhci_result_control(urb_t *urb)
 
        urb->actual_length = 0;
 
-       td = td->list.next;
-
        /* The rest of the TD's (but the last) are data */
-       while (td && td->list.next) {
+       tmp = tmp->next;
+       while (tmp != head && tmp->next != head) {
+               td = list_entry(tmp, struct uhci_td, list);
+
+               tmp = tmp->next;
+
                status = uhci_status_bits(td->status);
                if (status & TD_CTRL_ACTIVE)
                        return -EINPROGRESS;
@@ -664,18 +743,18 @@ static int uhci_result_control(urb_t *urb)
 
                if (status)
                        goto td_error;
-
-               td = td->list.next;
        }
 
 status_phase:
+       td = list_entry(tmp, struct uhci_td, list);
+
        /* Control status phase */
        status = uhci_status_bits(td->status);
 
        /* APC BackUPS Pro kludge */
        /* It tries to send all of the descriptor instead of the amount */
        /*  we requested */
-       if (td->status & TD_CTRL_IOC &&
+       if (td->status & TD_CTRL_IOC && /* IOC is masked out by uhci_status_bits */
            status & TD_CTRL_ACTIVE &&
            status & TD_CTRL_NAK)
                return 0;
@@ -704,34 +783,37 @@ td_error:
        return uhci_map_status(status, uhci_packetout(td->info));
 }
 
-static int usb_control_retrigger_status(urb_t *urb)
+static int usb_control_retrigger_status(struct urb *urb)
 {
+       struct list_head *tmp, *head;
        struct urb_priv *urbp = (struct urb_priv *)urb->hcpriv;
        struct uhci *uhci = urb->dev->bus->hcpriv;
-       struct uhci_td *td, *nexttd;
 
        urbp->short_control_packet = 1;
 
        /* Create a new QH to avoid pointer overwriting problems */
        uhci_remove_qh(uhci, urbp->qh);
 
-       urbp->qh = uhci_alloc_qh(urb->dev);
        /* Delete all of the TD's except for the status TD at the end */
-       td = urbp->list.begin;
-       while (td && td->list.next) {
-               nexttd = td->list.next;
+       head = &urbp->list;
+       tmp = head->next;
+       while (tmp != head && tmp->next != head) {
+               struct uhci_td *td = list_entry(tmp, struct uhci_td, list);
+
+               tmp = tmp->next;
 
                uhci_remove_td_from_urb(urb, td);
 
                uhci_remove_td(uhci, td);
 
                uhci_free_td(td);
-               
-               td = nexttd;
        }
 
-       if (!urbp->qh)
+       urbp->qh = uhci_alloc_qh(urb->dev);
+       if (!urbp->qh) {
+               err("unable to allocate new QH for control retrigger");
                return -ENOMEM;
+       }
 
        /* One TD, who cares about Breadth first? */
        uhci_insert_tds_in_qh(urbp->qh, urb, 0);
@@ -741,6 +823,7 @@ static int usb_control_retrigger_status(urb_t *urb)
                uhci_insert_qh(uhci, &uhci->skel_ls_control_qh, urbp->qh);
        else
                uhci_insert_qh(uhci, &uhci->skel_hs_control_qh, urbp->qh);
+       urbp->queued = 0;
 
        return -EINPROGRESS;
 }
@@ -748,7 +831,7 @@ static int usb_control_retrigger_status(urb_t *urb)
 /*
  * Interrupt transfers
  */
-static int uhci_submit_interrupt(urb_t *urb)
+static int uhci_submit_interrupt(struct urb *urb)
 {
        struct uhci_td *td;
        unsigned long destination, status;
@@ -782,18 +865,25 @@ static int uhci_submit_interrupt(urb_t *urb)
        return -EINPROGRESS;
 }
 
-static int uhci_result_interrupt(urb_t *urb)
+static int uhci_result_interrupt(struct urb *urb)
 {
+       struct list_head *tmp, *head;
        struct urb_priv *urbp = urb->hcpriv;
-       struct uhci_td *td;
        unsigned int status;
+       struct uhci_td *td;
 
        if (!urbp)
                return -EINVAL;
 
        urb->actual_length = 0;
 
-       for (td = urbp->list.begin; td; td = td->list.next) {
+       head = &urbp->list;
+       tmp = head->next;
+       while (tmp != head) {
+               td = list_entry(tmp, struct uhci_td, list);
+
+               tmp = tmp->next;
+
                status = uhci_status_bits(td->status);
                if (status & TD_CTRL_ACTIVE)
                        return -EINPROGRESS;
@@ -836,15 +926,17 @@ td_error:
        return uhci_map_status(status, uhci_packetout(td->info));
 }
 
-static void uhci_reset_interrupt(urb_t *urb)
+static void uhci_reset_interrupt(struct urb *urb)
 {
+       struct list_head *tmp;
        struct urb_priv *urbp = (struct urb_priv *)urb->hcpriv;
        struct uhci_td *td;
 
        if (!urbp)
                return;
 
-       td = urbp->list.begin;
+       tmp = urbp->list.next;
+       td = list_entry(tmp, struct uhci_td, list);
        if (!td)
                return;
 
@@ -859,7 +951,7 @@ static void uhci_reset_interrupt(urb_t *urb)
 /*
  * Bulk transfers
  */
-static int uhci_submit_bulk(urb_t *urb)
+static int uhci_submit_bulk(struct urb *urb, struct urb *eurb)
 {
        struct uhci_td *td;
        struct uhci_qh *qh;
@@ -881,14 +973,14 @@ static int uhci_submit_bulk(urb_t *urb)
        destination = (urb->pipe & PIPE_DEVEP_MASK) | usb_packetid(urb->pipe);
 
        /* 3 errors */
-       status = TD_CTRL_ACTIVE | (3 << 27);
+       status = TD_CTRL_ACTIVE | (3 << TD_CTRL_C_ERR_SHIFT);
        if (!(urb->transfer_flags & USB_DISABLE_SPD))
                status |= TD_CTRL_SPD;
 
        /*
         * Build the DATA TD's
         */
-       while (len > 0) {
+       do {    /* Allow zero length packets */
                int pktsze = len;
 
                if (pktsze > maxsze)
@@ -912,16 +1004,24 @@ static int uhci_submit_bulk(urb_t *urb)
 
                usb_dotoggle(urb->dev, usb_pipeendpoint(urb->pipe),
                        usb_pipeout(urb->pipe));
-       }
+       } while (len > 0);
 
        qh = uhci_alloc_qh(urb->dev);
        if (!qh)
                return -ENOMEM;
 
+       urbp->qh = qh;
+
+       /* Always assume depth first */
        uhci_insert_tds_in_qh(qh, urb, 1);
 
-       uhci_insert_qh(uhci, &uhci->skel_bulk_qh, qh);
-       urbp->qh = qh;
+       if (urb->transfer_flags & USB_QUEUE_BULK && eurb) {
+               uhci_append_urb_qh(uhci, eurb, urb);
+               urbp->queued = 1;
+       } else {
+               uhci_insert_qh(uhci, &uhci->skel_bulk_qh, qh);
+               urbp->queued = 0;
+       }
 
        uhci_add_urb_list(uhci, urb);
 
@@ -936,9 +1036,9 @@ static int uhci_submit_bulk(urb_t *urb)
 /*
  * Isochronous transfers
  */
-static int isochronous_find_limits(urb_t *urb, unsigned int *start, unsigned int *end)
+static int isochronous_find_limits(struct urb *urb, unsigned int *start, unsigned int *end)
 {
-       urb_t *u, *last_urb = NULL;
+       struct urb *last_urb = NULL;
        struct uhci *uhci = (struct uhci *)urb->dev->bus->hcpriv;
        struct list_head *tmp, *head = &uhci->urb_list;
        int ret = 0;
@@ -947,7 +1047,7 @@ static int isochronous_find_limits(urb_t *urb, unsigned int *start, unsigned int
        nested_lock(&uhci->urblist_lock, flags);
        tmp = head->next;
        while (tmp != head) {
-               u = list_entry(tmp, urb_t, urb_list);
+               struct urb *u = list_entry(tmp, struct urb, urb_list);
 
                /* look for pending URB's with identical pipe handle */
                if ((urb->pipe == u->pipe) && (urb->dev == u->dev) &&
@@ -970,7 +1070,7 @@ static int isochronous_find_limits(urb_t *urb, unsigned int *start, unsigned int
        return ret;
 }
 
-static int isochronous_find_start(urb_t *urb)
+static int isochronous_find_start(struct urb *urb)
 {
        int limits;
        unsigned int start = 0, end = 0;
@@ -996,7 +1096,7 @@ static int isochronous_find_start(urb_t *urb)
        return 0;
 }
 
-static int uhci_submit_isochronous(urb_t *urb)
+static int uhci_submit_isochronous(struct urb *urb)
 {
        struct uhci_td *td;
        struct uhci *uhci = (struct uhci *)urb->dev->bus->hcpriv;
@@ -1034,10 +1134,10 @@ static int uhci_submit_isochronous(urb_t *urb)
        return -EINPROGRESS;
 }
 
-static int uhci_result_isochronous(urb_t *urb)
+static int uhci_result_isochronous(struct urb *urb)
 {
+       struct list_head *tmp, *head;
        struct urb_priv *urbp = (struct urb_priv *)urb->hcpriv;
-       struct uhci_td *td;
        int status;
        int i, ret = 0;
 
@@ -1046,9 +1146,15 @@ static int uhci_result_isochronous(urb_t *urb)
 
        urb->actual_length = 0;
 
-       for (i = 0, td = urbp->list.begin; td; i++, td = td->list.next) {
+       i = 0;
+       head = &urbp->list;
+       tmp = head->next;
+       while (tmp != head) {
+               struct uhci_td *td = list_entry(tmp, struct uhci_td, list);
                int actlength;
 
+               tmp = tmp->next;
+
                if (td->status & TD_CTRL_ACTIVE)
                        return -EINPROGRESS;
 
@@ -1062,16 +1168,47 @@ static int uhci_result_isochronous(urb_t *urb)
                        urb->error_count++;
                        ret = status;
                }
+
+               i++;
        }
 
        return ret;
 }
 
-static int uhci_submit_urb(urb_t *urb)
+static struct urb *uhci_find_urb_ep(struct uhci *uhci, struct urb *urb)
+{
+       struct list_head *tmp, *head = &uhci->urb_list;
+       unsigned long flags;
+       struct urb *u = NULL;
+
+       if (usb_pipeisoc(urb->pipe))
+               return NULL;
+
+       nested_lock(&uhci->urblist_lock, flags);
+       tmp = head->next;
+       while (tmp != head) {
+               u = list_entry(tmp, struct urb, urb_list);
+
+               tmp = tmp->next;
+
+               if (u->dev == urb->dev &&
+                   u->pipe == urb->pipe)
+                       goto found;
+       }
+       u = NULL;
+
+found:
+       nested_unlock(&uhci->urblist_lock, flags);
+
+       return u;
+}
+
+static int uhci_submit_urb(struct urb *urb)
 {
        int ret = -EINVAL;
        struct uhci *uhci;
        unsigned long flags;
+       struct urb *u;
 
        if (!urb)
                return -EINVAL;
@@ -1085,6 +1222,10 @@ static int uhci_submit_urb(urb_t *urb)
        if (usb_pipedevice(urb->pipe) == uhci->rh.devnum)
                return rh_submit_urb(urb);
 
+       u = uhci_find_urb_ep(uhci, urb);
+       if (u && !(urb->transfer_flags & USB_QUEUE_BULK))
+               return -ENXIO;
+
        spin_lock_irqsave(&urb->lock, flags);
 
        if (!uhci_alloc_urb_priv(urb)) {
@@ -1100,7 +1241,7 @@ static int uhci_submit_urb(urb_t *urb)
                ret = uhci_submit_interrupt(urb);
                break;
        case PIPE_BULK:
-               ret = uhci_submit_bulk(urb);
+               ret = uhci_submit_bulk(urb, u);
                break;
        case PIPE_ISOCHRONOUS:
                ret = uhci_submit_isochronous(urb);
@@ -1124,9 +1265,9 @@ static int uhci_submit_urb(urb_t *urb)
  *
  * Must be called with urblist_lock acquired
  */
-static void uhci_transfer_result(urb_t *urb)
+static void uhci_transfer_result(struct urb *urb)
 {
-       urb_t *turb;
+       struct urb *turb;
        int proceed = 0, is_ring = 0;
        int ret = -EINVAL;
        unsigned long flags;
@@ -1206,7 +1347,7 @@ static void uhci_transfer_result(urb_t *urb)
        }
 }
 
-static int uhci_unlink_generic(urb_t *urb)
+static int uhci_unlink_generic(struct urb *urb)
 {
        struct urb_priv *urbp = urb->hcpriv;
        struct uhci *uhci = (struct uhci *)urb->dev->bus->hcpriv;
@@ -1222,12 +1363,21 @@ static int uhci_unlink_generic(urb_t *urb)
                /* The interrupt loop will reclaim the QH's */
                uhci_remove_qh(uhci, urbp->qh);
 
+       if (!list_empty(&urbp->urb_queue_list)) {
+               struct list_head *tmp = urbp->urb_queue_list.next;
+               struct urb_priv *nurbp = list_entry(tmp, struct urb_priv, urb_queue_list);
+               if (nurbp->queued) {
+                       uhci_insert_qh(uhci, &uhci->skel_bulk_qh, nurbp->qh);
+                       nurbp->queued = 0;
+               }
+       }
+
        uhci_destroy_urb_priv(urb);
 
        return 0;
 }
 
-static int uhci_unlink_urb(urb_t *urb)
+static int uhci_unlink_urb(struct urb *urb)
 {
        struct uhci *uhci;
        int ret = 0;
@@ -1252,7 +1402,13 @@ static int uhci_unlink_urb(urb_t *urb)
                        urb->status = -ECONNABORTED;
 
                        spin_lock_irqsave(&uhci->urb_remove_lock, flags);
+
+                       /* Check to see if the remove list is empty */
+                       if (list_empty(&uhci->urb_remove_list))
+                               uhci_set_next_interrupt(uhci);
+                       
                        list_add(&urb->urb_list, &uhci->urb_remove_list);
+
                        spin_unlock_irqrestore(&uhci->urb_remove_lock, flags);
                } else {
                        urb->status = -ENOENT;
@@ -1372,7 +1528,7 @@ static __u8 root_hub_hub_des[] =
 
 /*-------------------------------------------------------------------------*/
 /* prepare Interrupt pipe transaction data; HUB INTERRUPT ENDPOINT */
-static int rh_send_irq(urb_t *urb)
+static int rh_send_irq(struct urb *urb)
 {
        int i, len = 1;
        struct uhci *uhci = (struct uhci *)urb->dev->bus->hcpriv;
@@ -1399,7 +1555,7 @@ static int rh_send_irq(urb_t *urb)
 
 /*-------------------------------------------------------------------------*/
 /* Virtual Root Hub INTs are polled by this timer every "interval" ms */
-static int rh_init_int_timer(urb_t *urb);
+static int rh_init_int_timer(struct urb *urb);
 
 static void rh_int_timer_do(unsigned long ptr)
 {
@@ -1434,7 +1590,7 @@ static void rh_int_timer_do(unsigned long ptr)
 
                        /* Check if the URB timed out */
                        if (u->timeout && time_after(u->timeout, jiffies)) {
-                               u->transfer_flags |= USB_ASYNC_UNLINK;
+                               u->transfer_flags |= USB_ASYNC_UNLINK | USB_TIMEOUT_KILLED;
                                uhci_unlink_urb(u);
                        }
                }
@@ -1446,7 +1602,7 @@ static void rh_int_timer_do(unsigned long ptr)
 
 /*-------------------------------------------------------------------------*/
 /* Root Hub INTs are polled by this timer */
-static int rh_init_int_timer(urb_t *urb)
+static int rh_init_int_timer(struct urb *urb)
 {
        struct uhci *uhci = (struct uhci *)urb->dev->bus->hcpriv;
 
@@ -1479,7 +1635,7 @@ static int rh_init_int_timer(urb_t *urb)
  ** Root Hub Control Pipe
  *************************/
 
-static int rh_submit_urb(urb_t *urb)
+static int rh_submit_urb(struct urb *urb)
 {
        struct uhci *uhci = (struct uhci *)urb->dev->bus->hcpriv;
        unsigned int pipe = urb->pipe;
@@ -1595,7 +1751,7 @@ static int rh_submit_urb(urb_t *urb)
                        OK(0);
                case RH_PORT_RESET:
                        SET_RH_PORTSTAT(USBPORTSC_PR);
-                       wait_ms(10);
+                       wait_ms(50);    /* USB v1.1 7.1.7.3 */
                        uhci->rh.c_p_r[wIndex - 1] = 1;
                        CLR_RH_PORTSTAT(USBPORTSC_PR);
                        udelay(10);
@@ -1643,6 +1799,11 @@ static int rh_submit_urb(urb_t *urb)
                OK(1);
        case RH_SET_CONFIGURATION:
                OK(0);
+       case RH_GET_INTERFACE | RH_INTERFACE:
+               *(__u8 *)data = 0x00;
+               OK(1);
+       case RH_SET_INTERFACE | RH_INTERFACE:
+               OK(0);
        default:
                stat = -EPIPE;
        }
@@ -1656,7 +1817,7 @@ static int rh_submit_urb(urb_t *urb)
 }
 /*-------------------------------------------------------------------------*/
 
-static int rh_unlink_urb(urb_t *urb)
+static int rh_unlink_urb(struct urb *urb)
 {
        struct uhci *uhci = (struct uhci *)urb->dev->bus->hcpriv;
 
@@ -1735,6 +1896,8 @@ static void uhci_interrupt(int irq, void *__uhci, struct pt_regs *regs)
        }
        spin_unlock(&uhci->urb_remove_lock);
 
+       uhci_clear_next_interrupt(uhci);
+
        /* Walk the list of pending TD's to see which ones completed */
        nested_lock(&uhci->urblist_lock, flags);
        head = &uhci->urb_list;
@@ -2144,7 +2307,7 @@ int uhci_init(void)
 
        /* We only want to return an error code if ther was an error */
        /*  and we didn't find a UHCI controller */
-       if (retval && uhci_list.next == &uhci_list)
+       if (retval && list_empty(&uhci_list))
                goto init_failed;
 
        return 0;
index 9f4c45e9633574832731e0976efaa0b37626ac68..83992bb6a7521dd1c605aa6521e4d487a3f0b7d4 100644 (file)
@@ -97,6 +97,10 @@ struct s_nested_lock {
 #define UHCI_MAX_SOF_NUMBER    2047    /* in an SOF packet */
 #define CAN_SCHEDULE_FRAMES    1000    /* how far future frames can be scheduled */
 
+struct uhci_framelist {
+       __u32 frame[UHCI_NUMFRAMES];
+} __attribute__((aligned(4096)));
+
 struct uhci_td;
 
 struct uhci_qh {
@@ -106,22 +110,19 @@ struct uhci_qh {
 
        /* Software fields */
        /* Can't use list_head since we want a specific order */
-       struct uhci_qh *prevqh, *nextqh;
-
        struct usb_device *dev;                 /* The owning device */
 
+       struct uhci_qh *prevqh, *nextqh;
+
        struct list_head remove_list;
 } __attribute__((aligned(16)));
 
-struct uhci_framelist {
-       __u32 frame[UHCI_NUMFRAMES];
-} __attribute__((aligned(4096)));
-
 /*
  * for TD <status>:
  */
 #define TD_CTRL_SPD            (1 << 29)       /* Short Packet Detect */
 #define TD_CTRL_C_ERR_MASK     (3 << 27)       /* Error Counter bits */
+#define TD_CTRL_C_ERR_SHIFT    27
 #define TD_CTRL_LS             (1 << 26)       /* Low Speed Device */
 #define TD_CTRL_IOS            (1 << 25)       /* Isochronous Select */
 #define TD_CTRL_IOC            (1 << 24)       /* Interrupt on Complete */
@@ -184,10 +185,8 @@ struct uhci_td {
 
        struct usb_device *dev;
        struct urb *urb;                /* URB this TD belongs to */
-       /* We can't use list_head since we need a specific order */
-       struct ut_list {
-               struct uhci_td *prev, *next;
-       } list;
+
+       struct list_head list;
 } __attribute__((aligned(16)));
 
 /*
@@ -336,9 +335,12 @@ struct uhci {
 };
 
 struct urb_priv {
+       struct urb *urb;
+
        struct uhci_qh *qh;             /* QH for this URB */
 
-       int fsbr;                       /* Did this URB turn on FSBR? */
+       int fsbr : 1;                   /* Did this URB turn on FSBR? */
+       int queued : 1;                 /* 0 if QH was linked in */
 
        char short_control_packet;      /* If we get a short packet during */
                                        /*  a control transfer, retrigger */
@@ -346,15 +348,16 @@ struct urb_priv {
 
        unsigned long inserttime;       /* In jiffies */
 
-       struct up_list {
-               struct uhci_td *begin, *end;
-       } list;
+       struct list_head list;
+
+       struct list_head urb_queue_list;        /* URB's linked together */
 };
 
 /* -------------------------------------------------------------------------
    Virtual Root HUB
    ------------------------------------------------------------------------- */
 /* destination of request */
+#define RH_DEVICE              0x00
 #define RH_INTERFACE           0x01
 #define RH_ENDPOINT            0x02
 #define RH_OTHER               0x03
index a8bcbc9fbadd7b993fc7d51cea449cf5b0f91327..7c4a72c6ddbc27458baa5d330ffae57f9a383484 100644 (file)
@@ -1647,10 +1647,10 @@ static int hc_reset (ohci_t * ohci)
        int timeout = 30;
        int smm_timeout = 50; /* 0,5 sec */
                
-       if (readl (&ohci->regs->control) & OHCI_CTRL_RWC) { /* SMM owns the HC */
+       if (readl (&ohci->regs->control) & OHCI_CTRL_IR) { /* SMM owns the HC */
                writel (OHCI_OCR, &ohci->regs->cmdstatus); /* request ownership */
                dbg("USB HC TakeOver from SMM");
-               while (readl (&ohci->regs->control) & OHCI_CTRL_RWC) {
+               while (readl (&ohci->regs->control) & OHCI_CTRL_IR) {
                        wait_ms (10);
                        if (--smm_timeout == 0) {
                                err("USB HC TakeOver failed!");
index 4dd0663b5778cd839321f2c4871a521dde4b4358..8f962b485bad360bbc8248f8cb161f9c3378feab 100644 (file)
@@ -1084,7 +1084,7 @@ int usb_parse_configuration(struct usb_device *dev, struct usb_config_descriptor
        int size;
        struct usb_descriptor_header *header;
 
-       memcpy(config, buffer, USB_DT_INTERFACE_SIZE);
+       memcpy(config, buffer, USB_DT_CONFIG_SIZE);
        le16_to_cpus(&config->wTotalLength);
        size = config->wTotalLength;
 
@@ -1512,6 +1512,8 @@ int usb_set_interface(struct usb_device *dev, int interface, int alternate)
                return ret;
 
        iface->act_altsetting = alternate;
+       dev->toggle[0] = 0;     /* 9.1.1.5 says to do this */
+       dev->toggle[1] = 0;
        usb_set_maxpacket(dev);
        return 0;
 }
@@ -1876,6 +1878,7 @@ EXPORT_SYMBOL(usb_driver_release_interface);
 EXPORT_SYMBOL(usb_init_root_hub);
 EXPORT_SYMBOL(usb_root_hub_string);
 EXPORT_SYMBOL(usb_new_device);
+EXPORT_SYMBOL(usb_reset_device);
 EXPORT_SYMBOL(usb_connect);
 EXPORT_SYMBOL(usb_disconnect);
 EXPORT_SYMBOL(usb_release_bandwidth);
diff --git a/drivers/usb/usbdevice_fs.h b/drivers/usb/usbdevice_fs.h
deleted file mode 100644 (file)
index 95eaa93..0000000
+++ /dev/null
@@ -1,170 +0,0 @@
-/*****************************************************************************/
-
-/*
- *     usbdevice_fs.h  --  USB device file system.
- *
- *     Copyright (C) 2000
- *          Thomas Sailer (sailer@ife.ee.ethz.ch)
- *
- *     This program is free software; you can redistribute it and/or modify
- *     it under the terms of the GNU General Public License as published by
- *     the Free Software Foundation; either version 2 of the License, or
- *     (at your option) any later version.
- *
- *     This program is distributed in the hope that it will be useful,
- *     but WITHOUT ANY WARRANTY; without even the implied warranty of
- *     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *     GNU General Public License for more details.
- *
- *     You should have received a copy of the GNU General Public License
- *     along with this program; if not, write to the Free Software
- *     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- *
- *  History:
- *   0.1  04.01.2000  Created
- *
- *  $Id: usbdevice_fs.h,v 1.1 2000/01/06 18:40:41 tom Exp $
- */
-
-/*****************************************************************************/
-
-#ifndef _LINUX_USBDEVICE_FS_H
-#define _LINUX_USBDEVICE_FS_H
-
-/* --------------------------------------------------------------------- */
-
-#define USBDEVICE_SUPER_MAGIC 0x9fa2
-
-/* usbdevfs ioctl codes */
-
-struct usbdevfs_ctrltransfer {
-       __u8 requesttype;
-       __u8 request;
-       __u16 value;
-       __u16 index;
-       __u16 length;
-       __u32 timeout;  /* in milliseconds */
-       void *data;
-};
-
-struct usbdevfs_bulktransfer {
-       unsigned int ep;
-       unsigned int len;
-       unsigned int timeout; /* in milliseconds */
-       void *data;
-};
-
-struct usbdevfs_setinterface {
-       unsigned int interface;
-       unsigned int altsetting;
-};
-
-struct usbdevfs_disconnectsignal {
-       unsigned int signr;
-       void *context;
-};
-
-#define USBDEVFS_URB_DISABLE_SPD           1
-#define USBDEVFS_URB_ISO_ASAP              2
-
-#define USBDEVFS_URB_TYPE_ISO             0
-#define USBDEVFS_URB_TYPE_INTERRUPT       1
-#define USBDEVFS_URB_TYPE_CONTROL         2
-#define USBDEVFS_URB_TYPE_BULK            3
-
-struct usbdevfs_iso_packet_desc {
-       unsigned int length;
-       unsigned int actual_length;
-       unsigned int status;
-};
-
-struct usbdevfs_urb {
-       unsigned char type;
-       unsigned char endpoint;
-       int status;
-       unsigned int flags;
-       void *buffer;
-       int buffer_length;
-       int actual_length;
-       int start_frame;
-       int number_of_packets;
-       int error_count;
-       unsigned int signr;  /* signal to be sent on error, -1 if none should be sent */
-       void *usercontext;
-       struct usbdevfs_iso_packet_desc iso_frame_desc[0];
-};
-
-#define USBDEVFS_CONTROL           _IOWR('U', 0, struct usbdevfs_ctrltransfer)
-#define USBDEVFS_BULK              _IOWR('U', 2, struct usbdevfs_bulktransfer)
-#define USBDEVFS_RESETEP           _IOR('U', 3, unsigned int)
-#define USBDEVFS_SETINTERFACE      _IOR('U', 4, struct usbdevfs_setinterface)
-#define USBDEVFS_SETCONFIGURATION  _IOR('U', 5, unsigned int)
-#define USBDEVFS_SUBMITURB         _IOR('U', 10, struct usbdevfs_urb)
-#define USBDEVFS_DISCARDURB        _IO('U', 11)
-#define USBDEVFS_REAPURB           _IOW('U', 12, void *)
-#define USBDEVFS_REAPURBNDELAY     _IOW('U', 13, void *)
-#define USBDEVFS_DISCSIGNAL        _IOR('U', 14, struct usbdevfs_disconnectsignal)
-#define USBDEVFS_CLAIMINTERFACE    _IOR('U', 15, unsigned int)
-#define USBDEVFS_RELEASEINTERFACE  _IOR('U', 16, unsigned int)
-
-/* --------------------------------------------------------------------- */
-
-#ifdef __KERNEL__
-
-#include <linux/list.h>
-#include <asm/semaphore.h>
-
-/*
- * inode number macros
- */
-#define ITYPE(x)   ((x)&(0xf<<28))
-#define ISPECIAL   (0<<28)
-#define IBUS       (1<<28)
-#define IDEVICE    (2<<28)
-#define IBUSNR(x)  (((x)>>8)&0xff)
-#define IDEVNR(x)  ((x)&0xff)
-
-#define IROOT      1
-
-/*
- * sigh. rwsemaphores do not (yet) work from modules
- */
-
-#define rw_semaphore semaphore
-#define init_rwsem init_MUTEX
-#define down_read down
-#define down_write down
-#define up_read up
-#define up_write up
-
-
-struct dev_state {
-       struct list_head list;      /* state list */
-       struct rw_semaphore devsem; /* protects modifications to dev (dev == NULL indicating disconnect) */ 
-       struct usb_device *dev;
-       struct file *file;
-       spinlock_t lock;            /* protects the async urb lists */
-       struct list_head async_pending;
-       struct list_head async_completed;
-       wait_queue_head_t wait;     /* wake up if a request completed */
-       unsigned int discsignr;
-       struct task_struct *disctask;
-       void *disccontext;
-       unsigned long ifclaimed;
-};
-
-/* internal methods & data */
-extern struct usb_driver usbdevfs_driver;
-extern struct file_operations usbdevfs_drivers_fops;
-extern struct file_operations usbdevfs_devices_fops;
-extern struct file_operations usbdevfs_device_file_operations;
-extern struct inode_operations usbdevfs_device_inode_operations;
-extern struct inode_operations usbdevfs_bus_inode_operations;
-extern struct file_operations usbdevfs_bus_file_operations;
-extern void usbdevfs_conn_disc_event(void);
-
-
-#endif /* __KERNEL__ */
-
-/* --------------------------------------------------------------------- */
-#endif /* _LINUX_USBDEVICE_FS_H */
index 51dba3629fa104e1e7ae0ac42df5aa7bb8a40814..2cebdad61c3e7c635513255a086fa3c88d3ff1a4 100644 (file)
@@ -46,7 +46,8 @@ obj-$(CONFIG_FONT_6x11)           += font_6x11.o
 obj-$(CONFIG_FONT_PEARL_8x8)      += font_pearl_8x8.o
 obj-$(CONFIG_FONT_ACORN_8x8)      += font_acorn_8x8.o
 
-obj-$(CONFIG_FB)                  += fbmem.o fbcmap.o modedb.o fbcon.o fonts.o fbmon.o 
+# Add fbmon.o back into obj-$(CONFIG_FB) in 2.5.x
+obj-$(CONFIG_FB)                  += fbmem.o fbcmap.o modedb.o fbcon.o fonts.o
 obj-$(CONFIG_FB_COMPAT_XPMAC)     += macmodes.o
 
 obj-$(CONFIG_FB_ACORN)            += acornfb.o
index a0518c0096728f9bc7e0000ec64c16586855324b..727815e0c12720191a4a9deeeda88ae6ea422cd6 100644 (file)
@@ -2415,11 +2415,13 @@ static int ami_decode_var(struct fb_var_screeninfo *var,
        par->crsr.spot_x = par->crsr.spot_y = 0;
        par->crsr.height = par->crsr.width = 0;
 
+#if 0  /* fbmon not done.  uncomment for 2.5.x -brad */
        if (!fbmon_valid_timings(pixclock[clk_shift], htotal, vtotal,
                                 &fb_info)) {
                DPRINTK("mode doesn't fit for monitor\n");
                return -EINVAL;
        }
+#endif
 
        return 0;
 }
index b2efe721f823b4e1650c6cad24da94f4580b0b5a..cdacf23a4963e8ddb917b25535c7ce3b382d9fb0 100644 (file)
@@ -2539,7 +2539,7 @@ static int atyfb_decode_var(const struct fb_var_screeninfo *var,
     else
        par->accel_flags = 0;
 
-#if 0
+#if 0 /* fbmon is not done. uncomment for 2.5.x -brad */
     if (!fbmon_valid_timings(var->pixclock, htotal, vtotal, info))
        return -EINVAL;
 #endif
index c44401939d5682dcb4db0e46d634bba44dc6e220..fcb6443ed66a6d5a21c4570e64365a5146374605 100644 (file)
@@ -362,7 +362,7 @@ static int tgafb_decode_var(const struct fb_var_screeninfo *var, void *fb_par,
        var->yres_virtual != var->yres ||
        var->nonstd || (1000000000/var->pixclock) > TGA_PLL_MAX_FREQ ||
        (var->vmode & FB_VMODE_MASK) != FB_VMODE_NONINTERLACED
-#if 0  
+#if 0  /* fbmon not done.  uncomment for 2.5.x -brad */
        || !fbmon_valid_timings(var->pixclock, var->htotal, var->vtotal, info))
 #else
        )
index b641786bdfa4aecd7b4c5346d0fcf71223fcd649..53029b7d35ee8e318c52ae780f2ae29db5866bc4 100644 (file)
@@ -26,6 +26,7 @@ dep_tristate '  VFAT (Windows-95) fs support' CONFIG_VFAT_FS $CONFIG_FAT_FS
 dep_tristate 'EFS file system support (read only) (EXPERIMENTAL)' CONFIG_EFS_FS $CONFIG_EXPERIMENTAL
 
 tristate 'Compressed ROM file system support' CONFIG_CRAMFS
+tristate 'Simple RAM-based file system support' CONFIG_RAMFS
 
 tristate 'ISO 9660 CDROM file system support' CONFIG_ISO9660_FS
 dep_mbool '  Microsoft Joliet CDROM extensions' CONFIG_JOLIET $CONFIG_ISO9660_FS
@@ -75,7 +76,7 @@ if [ "$CONFIG_NET" = "y" ]; then
    dep_bool '  Root file system on NFS' CONFIG_ROOT_NFS $CONFIG_NFS_FS $CONFIG_IP_PNP
 
    dep_tristate 'NFS server support' CONFIG_NFSD $CONFIG_INET
-   dep_mbool '  Provide NFSv3 server support (EXPERIMENTAL)' CONFIG_NFSD_V3 $CONFIG_NFSD
+   dep_mbool '  Provide NFSv3 server support' CONFIG_NFSD_V3 $CONFIG_NFSD
 
    if [ "$CONFIG_NFS_FS" = "y" -o "$CONFIG_NFSD" = "y" ]; then
       define_tristate CONFIG_SUNRPC y
index 74fc394ed23336fd1c73d01fa425264122b66575..9219a138f6ead212bb3ddbf6f5edf14823bdfc55 100644 (file)
@@ -19,7 +19,7 @@ MOD_LIST_NAME := FS_MODULES
 ALL_SUB_DIRS = coda minix ext2 fat msdos vfat proc isofs nfs umsdos ntfs \
                hpfs sysv smbfs ncpfs ufs efs affs romfs autofs hfs lockd \
                nfsd nls devpts devfs adfs partitions qnx4 udf bfs cramfs \
-               openpromfs autofs4
+               openpromfs autofs4 ramfs
 
 SUB_DIRS := partitions
 
@@ -45,6 +45,14 @@ else
   endif
 endif
 
+ifeq ($(CONFIG_RAMFS),y)
+SUB_DIRS += ramfs
+else
+  ifeq ($(CONFIG_RAMFS),m)
+  MOD_SUB_DIRS += ramfs
+  endif
+endif
+
 ifeq ($(CONFIG_CODA_FS),y)
 SUB_DIRS += coda
 else
index a5cb508ac94be2d7655c5542f80b2c5ae15c684c..7ffa0a433104b1d243ceafba48a1d729c5dcb5b8 100644 (file)
@@ -84,36 +84,24 @@ static u32 *
 nlm4_decode_fh(u32 *p, struct nfs_fh *f)
 {
        memset(f->data, 0, sizeof(f->data));
-#ifdef NFS_MAXFHSIZE
        f->size = ntohl(*p++);
        if (f->size > NFS_MAXFHSIZE) {
                printk(KERN_NOTICE
-                       "lockd: bad fhandle size %x (should be %d)\n",
+                       "lockd: bad fhandle size %d (should be <=%d)\n",
                        f->size, NFS_MAXFHSIZE);
                return NULL;
        }
        memcpy(f->data, p, f->size);
        return p + XDR_QUADLEN(f->size);
-#else
-       if (ntohl(*p++) != NFS_FHSIZE)
-               return NULL; /* for now, all filehandles are 32 bytes */
-       memcpy(f->data, p, NFS_FHSIZE);
-       return p + XDR_QUADLEN(NFS_FHSIZE);
-#endif
 }
 
 static u32 *
 nlm4_encode_fh(u32 *p, struct nfs_fh *f)
 {
-#ifdef NFS_MAXFHSIZE
        *p++ = htonl(f->size);
+       if (f->size) p[XDR_QUADLEN(f->size)-1] = 0; /* don't leak anything */
        memcpy(p, f->data, f->size);
        return p + XDR_QUADLEN(f->size);
-#else
-       *p++ = htonl(NFS_FHSIZE);
-       memcpy(p, f->data, NFS_FHSIZE);
-       return p + XDR_QUADLEN(NFS_FHSIZE);
-#endif
 }
 
 /*
index 11cde1b4dd19ef713ef42f02d1785105f09ee6b4..58f7a590a3f71bd90d8cb59fb4f06794f48e2821 100644 (file)
@@ -521,16 +521,15 @@ static int __emul_lookup_dentry(const char *name, int lookup_flags,
 static inline int
 walk_init_root(const char *name, unsigned flags, struct nameidata *nd)
 {
-       if (current->personality) {
+       if (current->personality != PER_LINUX)
                if (__emul_lookup_dentry(name,flags,nd));
                        return 0;
-       }
        nd->mnt = mntget(current->fs->rootmnt);
        nd->dentry = dget(current->fs->root);
        return 1;
 }
 
-int walk_init(const char *name,unsigned flags,struct nameidata *nd)
+int walk_init(const char *name,unsigned int flags,struct nameidata *nd)
 {
        nd->last.len = 0;
        if (*name=='/')
index 6e1c8e7b22ff33a26c90ec9dd841ce656b582a3d..b632cf17543745b56cb06e185b36127c2ef1b55d 100644 (file)
@@ -66,6 +66,7 @@
  *                             is NOT for the length of the hostname.
  */
 
+#include <linux/config.h>
 #include <linux/types.h>
 #include <linux/string.h>
 #include <linux/kernel.h>
index 0110c2f4d7cc877cd250af0c90da702afd05565b..651251548e2603c4c927b9dcbee5dba3071ca345 100644 (file)
@@ -278,7 +278,7 @@ static int
 region_locked(struct inode *inode, struct nfs_page *req)
 {
        struct file_lock        *fl;
-       unsigned long           rqstart, rqend;
+       loff_t                  rqstart, rqend;
 
        /* Don't optimize writes if we don't use NLM */
        if (NFS_SERVER(inode)->flags & NFS_MOUNT_NONLM)
@@ -1321,7 +1321,7 @@ nfs_commit_rpcsetup(struct list_head *head, struct nfs_write_data *data)
        struct nfs_page         *req;
        struct dentry           *dentry;
        struct inode            *inode;
-       unsigned long           start, end, len;
+       loff_t                  start, end, len;
 
        /* Set up the RPC argument and reply structs
         * NB: take care not to mess about with data->commit et al. */
@@ -1335,7 +1335,7 @@ nfs_commit_rpcsetup(struct list_head *head, struct nfs_write_data *data)
        inode = dentry->d_inode;
        while (!list_empty(head)) {
                struct nfs_page *req;
-               unsigned long   rqstart, rqend;
+               loff_t  rqstart, rqend;
                req = nfs_list_entry(head->next);
                nfs_list_remove_request(req);
                nfs_list_add_request(req, &data->pages);
@@ -1349,6 +1349,7 @@ nfs_commit_rpcsetup(struct list_head *head, struct nfs_write_data *data)
        data->args.fh     = NFS_FH(dentry);
        data->args.offset = start;
        len = end - start;
+       /* If 'len' is not a 32-bit quantity, pass '0' in the COMMIT call */
        if (end >= inode->i_size || len > (~((u32)0) >> 1))
                len = 0;
        data->res.count   = data->args.count = (u32)len;
index f38e2552b8183abfb9ae3c6ffa3805f4651360f1..e15483e4348eb568fca4523c8f8412b5548222f1 100644 (file)
@@ -28,7 +28,7 @@ nlm_fopen(struct svc_rqst *rqstp, struct nfs_fh *f, struct file *filp)
        /* must initialize before using! but maxsize doesn't matter */
        fh_init(&fh,0);
        fh.fh_handle.fh_size = f->size;
-       memcpy((char*)&fh.fh_handle.fh_base, f->data, NFS_FHSIZE);
+       memcpy((char*)&fh.fh_handle.fh_base, f->data, f->size);
        fh.fh_export = NULL;
 
        nfserr = nfsd_open(rqstp, &fh, S_IFREG, MAY_LOCK, filp);
index 969ff54a9421c252491cf07a32441753b01d1e9f..61ee94a3eaa0a9ea54cc3ab5e0d7e03a967e2347 100644 (file)
@@ -74,22 +74,11 @@ decode_fh(u32 *p, struct svc_fh *fhp)
 static inline u32 *
 encode_fh(u32 *p, struct svc_fh *fhp)
 {
-#if 0
        int size = fhp->fh_handle.fh_size;
        *p++ = htonl(size);
        if (size) p[XDR_QUADLEN(size)-1]=0;
        memcpy(p, &fhp->fh_handle.fh_base, size);
        return p + XDR_QUADLEN(size);
-#else
-       /* until locked knows about var-length file handles,
-        * we always return NFS_FHSIZE handles
-        */
-       int size = fhp->fh_handle.fh_size;
-       *p++ = htonl(NFS_FHSIZE);
-       memset(p, 0, NFS_FHSIZE);
-       memcpy(p, &fhp->fh_handle.fh_base, size);
-       return p + XDR_QUADLEN(NFS_FHSIZE);
-#endif
 }
 
 /*
index 97b46f0c73165c5eb707d78d41360035f2b3a713..65c70164a67103fd19690afc4cb243593c7d11a4 100644 (file)
@@ -130,7 +130,6 @@ nfsctl_getfs(struct nfsctl_fsparm *data, struct knfsd_fh *res)
        else
                err = exp_rootfh(clp, 0, 0, data->gd_path, res, data->gd_maxlen);
        exp_unlock();
-       /*HACK*/ res->fh_size = NFS_FHSIZE; /* HACK until lockd handles var-length handles */
        return err;
 }
 
index f06e122aaeee8eb34b0e2386a0b87b61ccb00630..6ec49bfd701a26c719012456c772733895176367 100644 (file)
@@ -3,7 +3,7 @@
 O_TARGET := ntfs.o
 O_OBJS   := fs.o sysctl.o support.o util.o inode.o dir.o super.o attr.o
 M_OBJS   := $(O_TARGET)
-EXTRA_CFLAGS = -DNTFS_IN_LINUX_KERNEL -DNTFS_VERSION=\"990411\"
+EXTRA_CFLAGS = -DNTFS_IN_LINUX_KERNEL -DNTFS_VERSION=\"000410\"
 
 include $(TOPDIR)/Rules.make
 
index e6abd178ead5c90ce91bfae26938d7c380077b64..058e3a6f446813e744537c8bb22fd04a010b3486 100644 (file)
@@ -1,7 +1,8 @@
 /*
  *  fs.c
- *  NTFS driver for Linux 2.1
+ *  NTFS driver for Linux 2.3.x
  *
+ *  Copyright (C) 2000, Anton Altaparmakov
  *  Copyright (C) 1995-1997, 1999 Martin von Löwis
  *  Copyright (C) 1996 Richard Russon
  *  Copyright (C) 1996-1997 Régis Duchesne
@@ -53,7 +54,6 @@ static void ntfs_getuser_update_vm (void *dest, ntfs_io *src, ntfs_size_t len)
 {
        struct ntfs_getuser_update_vm_s *p = src->param;
        copy_from_user (dest, p->user, len);
-       update_vm_cache (p->ino, p->off, dest, len);
        p->user += len;
        p->off += len;
 }
diff --git a/fs/ramfs/Makefile b/fs/ramfs/Makefile
new file mode 100644 (file)
index 0000000..f57d596
--- /dev/null
@@ -0,0 +1,11 @@
+#
+# Makefile for the linux ramfs routines.
+#
+
+O_TARGET := ramfs.o
+
+O_OBJS := inode.o
+
+M_OBJS := $(O_TARGET)
+
+include $(TOPDIR)/Rules.make
diff --git a/fs/ramfs/inode.c b/fs/ramfs/inode.c
new file mode 100644 (file)
index 0000000..e218051
--- /dev/null
@@ -0,0 +1,393 @@
+/*
+ * Resizable simple ram filesystem for Linux.
+ *
+ * Copyright (C) 2000 Linus Torvalds.
+ *               2000 Transmeta Corp.
+ *
+ * This file is released under the GPL.
+ */
+
+/*
+ * NOTE! This filesystem is probably most useful
+ * not as a real filesystem, but as an example of
+ * how virtual filesystems can be written.
+ *
+ * It doesn't get much simpler than this. Consider
+ * that this file implements the full semantics of
+ * a POSIX-compliant read-write filesystem.
+ *
+ * Note in particular how the filesystem does not
+ * need to implement any data structures of its own
+ * to keep track of the virtual data: using the VFS
+ * caches is sufficient.
+ */
+
+#include <linux/module.h>
+#include <linux/fs.h>
+#include <linux/pagemap.h>
+#include <linux/init.h>
+#include <linux/string.h>
+#include <linux/locks.h>
+
+#include <asm/uaccess.h>
+
+/* some random number */
+#define RAMFS_MAGIC    0x858458f6
+
+static struct super_operations ramfs_ops;
+static struct address_space_operations ramfs_aops;
+static struct file_operations ramfs_dir_operations;
+static struct file_operations ramfs_file_operations;
+static struct inode_operations ramfs_dir_inode_operations;
+
+static int ramfs_statfs(struct super_block *sb, struct statfs *buf)
+{
+       buf->f_type = RAMFS_MAGIC;
+       buf->f_bsize = PAGE_CACHE_SIZE;
+       buf->f_namelen = 255;
+       return 0;
+}
+
+/*
+ * Lookup the data. This is trivial - if the dentry didn't already
+ * exist, we know it is negative.
+ */
+static struct dentry * ramfs_lookup(struct inode *dir, struct dentry *dentry)
+{
+       d_add(dentry, NULL);
+       return NULL;
+}
+
+/*
+ * Read a page. Again trivial. If it didn't already exist
+ * in the page cache, it is zero-filled.
+ */
+static int ramfs_readpage(struct dentry *dentry, struct page * page)
+{
+       if (!Page_Uptodate(page)) {
+               memset((void *) page_address(page), 0, PAGE_CACHE_SIZE);
+               SetPageUptodate(page);
+       }
+       UnlockPage(page);
+       return 0;
+}
+
+/*
+ * Writing: just make sure the page gets marked dirty, so that
+ * the page stealer won't grab it.
+ */
+static int ramfs_writepage(struct dentry * dentry, struct page *page)
+{
+       SetPageDirty(page);
+       return 0;
+}
+
+static int ramfs_prepare_write(struct file *file, struct page *page, unsigned offset, unsigned to)
+{
+       void *addr;
+
+       addr = (void *) kmap(page);
+       if (!Page_Uptodate(page)) {
+               memset(addr, 0, PAGE_CACHE_SIZE);
+               SetPageUptodate(page);
+       }
+       SetPageDirty(page);
+       return 0;
+}
+
+static int ramfs_commit_write(struct file *file, struct page *page, unsigned offset, unsigned to)
+{
+       struct inode *inode = (struct inode*)page->mapping->host;
+       loff_t pos = ((loff_t)page->index << PAGE_CACHE_SHIFT) + to;
+
+       kunmap(page);
+       if (pos > inode->i_size)
+               inode->i_size = pos;
+       return 0;
+}
+
+struct inode *ramfs_get_inode(struct super_block *sb, int mode, int dev)
+{
+       struct inode * inode = get_empty_inode();
+
+       if (inode) {
+               inode->i_sb = sb;
+               inode->i_dev = sb->s_dev;
+               inode->i_mode = mode;
+               inode->i_uid = current->fsuid;
+               inode->i_gid = current->fsgid;
+               inode->i_size = 0;
+               inode->i_blksize = PAGE_CACHE_SIZE;
+               inode->i_blocks = 0;
+               inode->i_rdev = dev;
+               inode->i_nlink = 1;
+               inode->i_op = NULL;
+               inode->i_fop = NULL;
+               inode->i_mapping->a_ops = &ramfs_aops;
+               inode->i_atime = inode->i_mtime = inode->i_ctime = CURRENT_TIME;
+               switch (mode & S_IFMT) {
+               default:
+                       init_special_inode(inode, mode, dev);
+                       break;
+               case S_IFREG:
+                       inode->i_fop = &ramfs_file_operations;
+                       break;
+               case S_IFDIR:
+                       inode->i_op = &ramfs_dir_inode_operations;
+                       inode->i_fop = &ramfs_dir_operations;
+                       break;
+               case S_IFLNK:
+                       inode->i_op = &page_symlink_inode_operations;
+                       break;
+               }
+       }
+       return inode;
+}
+
+/*
+ * File creation. Allocate an inode, and we're done..
+ */
+static int ramfs_mknod(struct inode *dir, struct dentry *dentry, int mode, int dev)
+{
+       struct inode * inode = ramfs_get_inode(dir->i_sb, mode, dev);
+       int error = -ENOSPC;
+
+       if (inode) {
+               d_instantiate(dentry, inode);
+               dget(dentry);           /* Extra count - pin the dentry in core */
+               error = 0;
+       }
+       return error;
+}
+
+static int ramfs_mkdir(struct inode * dir, struct dentry * dentry, int mode)
+{
+       return ramfs_mknod(dir, dentry, mode | S_IFDIR, 0);
+}
+
+static int ramfs_create(struct inode *dir, struct dentry *dentry, int mode)
+{
+       return ramfs_mknod(dir, dentry, mode | S_IFREG, 0);
+}
+
+/*
+ * Link a file..
+ */
+static int ramfs_link(struct dentry *old_dentry, struct inode * dir, struct dentry * dentry)
+{
+       struct inode *inode = old_dentry->d_inode;
+
+       if (S_ISDIR(inode->i_mode))
+               return -EPERM;
+
+       inode->i_nlink++;
+       inode->i_count++;       /* New dentry reference */
+       dget(dentry);           /* Extra pinning count for the created dentry */
+       d_instantiate(dentry, inode);
+       return 0;
+}
+
+static inline int ramfs_positive(struct dentry *dentry)
+{
+       return dentry->d_inode && !d_unhashed(dentry);
+}
+
+/*
+ * Check that a directory is empty (this works
+ * for regular files too, they'll just always be
+ * considered empty..).
+ *
+ * Note that an empty directory can still have
+ * children, they just all have to be negative..
+ */
+static int ramfs_empty(struct dentry *dentry)
+{
+       struct list_head *list = dentry->d_subdirs.next;
+
+       while (list != &dentry->d_subdirs) {
+               struct dentry *de = list_entry(list, struct dentry, d_child);
+
+               if (ramfs_positive(de))
+                       return 0;
+               list = list->next;
+       }
+       return 1;
+}
+
+/*
+ * This works for both directories and regular files.
+ * (non-directories will always have empty subdirs)
+ */
+static int ramfs_unlink(struct inode * dir, struct dentry *dentry)
+{
+       int retval = -ENOTEMPTY;
+
+       if (ramfs_empty(dentry)) {
+               struct inode *inode = dentry->d_inode;
+
+               inode->i_nlink--;
+               dput(dentry);                   /* Undo the count from "create" - this does all the work */
+               d_delete(dentry);
+               retval = 0;
+       }
+       return retval;
+}
+
+#define ramfs_rmdir ramfs_unlink
+
+/*
+ * The VFS layer already does all the dentry stuff for rename,
+ * we just have to decrement the usage count for the target if
+ * it exists so that the VFS layer correctly free's it when it
+ * gets overwritten.
+ */
+static int ramfs_rename(struct inode * old_dir, struct dentry *old_dentry, struct inode * new_dir,struct dentry *new_dentry)
+{
+       int error = -ENOTEMPTY;
+
+       if (ramfs_empty(new_dentry)) {
+               struct inode *inode = new_dentry->d_inode;
+               if (inode) {
+                       inode->i_nlink--;
+                       dput(new_dentry);
+               }
+               error = 0;
+       }
+       return error;
+}
+
+static int ramfs_symlink(struct inode * dir, struct dentry *dentry, const char * symname)
+{
+       int error;
+
+       error = ramfs_mknod(dir, dentry, S_IFLNK | S_IRWXUGO, 0);
+       if (!error) {
+               int l = strlen(symname)+1;
+               struct inode *inode = dentry->d_inode;
+               error = block_symlink(inode, symname, l);
+       }
+       return error;
+}
+
+/*
+ * This really should be the same as the proc filldir,
+ * once proc does the "one dentry tree" thing..
+ */
+static int ramfs_readdir(struct file * filp, void * dirent, filldir_t filldir)
+{
+       int i;
+       struct dentry *dentry = filp->f_dentry;
+
+       i = filp->f_pos;
+       switch (i) {
+               case 0:
+                       if (filldir(dirent, ".", 1, i, dentry->d_inode->i_ino) < 0)
+                               break;
+                       i++;
+                       filp->f_pos++;
+                       /* fallthrough */
+               case 1:
+                       if (filldir(dirent, "..", 2, i, dentry->d_parent->d_inode->i_ino) < 0)
+                               break;
+                       i++;
+                       filp->f_pos++;
+                       /* fallthrough */
+               default: {
+                       struct list_head *list = dentry->d_subdirs.next;
+
+                       int j = i-2;
+                       for (;;) {
+                               if (list == &dentry->d_subdirs)
+                                       return 0;
+                               if (!j)
+                                       break;
+                               j--;
+                               list = list->next;
+                       }
+
+                       do {
+                               struct dentry *de = list_entry(list, struct dentry, d_child);
+
+                               if (ramfs_positive(de)) {
+                                       if (filldir(dirent, de->d_name.name, de->d_name.len, filp->f_pos, de->d_inode->i_ino) < 0)
+                                               break;
+                               }
+                               filp->f_pos++;
+                               list = list->next;
+                       } while (list != &dentry->d_subdirs);
+               }
+       }
+       return 0;
+}
+
+static struct address_space_operations ramfs_aops = {
+       readpage:       ramfs_readpage,
+       writepage:      ramfs_writepage,
+       prepare_write:  ramfs_prepare_write,
+       commit_write:   ramfs_commit_write
+};
+
+static struct file_operations ramfs_file_operations = {
+       read:           generic_file_read,
+       write:          generic_file_write,
+       mmap:           generic_file_mmap
+};
+
+static struct file_operations ramfs_dir_operations = {
+       read:           generic_read_dir,
+       readdir:        ramfs_readdir,
+};
+
+static struct inode_operations ramfs_dir_inode_operations = {
+       create:         ramfs_create,
+       lookup:         ramfs_lookup,
+       link:           ramfs_link,
+       unlink:         ramfs_unlink,
+       symlink:        ramfs_symlink,
+       mkdir:          ramfs_mkdir,
+       rmdir:          ramfs_rmdir,
+       mknod:          ramfs_mknod,
+       rename:         ramfs_rename,
+};
+
+
+static struct super_operations ramfs_ops = {
+       statfs:  ramfs_statfs,
+};
+
+static struct super_block *ramfs_read_super(struct super_block * sb, void * data, int silent)
+{
+       struct inode * inode;
+       struct dentry * root;
+
+       sb->s_blocksize = PAGE_CACHE_SIZE;
+       sb->s_blocksize_bits = PAGE_CACHE_SHIFT;
+       sb->s_magic = RAMFS_MAGIC;
+       sb->s_op = &ramfs_ops;
+       inode = ramfs_get_inode(sb, S_IFDIR | 0755, 0);
+       if (!inode)
+               return NULL;
+
+       root = d_alloc_root(inode);
+       if (!root) {
+               iput(inode);
+               return NULL;
+       }
+       sb->s_root = root;
+       return sb;
+}
+
+static DECLARE_FSTYPE(ramfs_fs_type, "ramfs", ramfs_read_super, 0);
+
+static int __init init_ramfs_fs(void)
+{
+       return register_filesystem(&ramfs_fs_type);
+}
+
+static void __exit exit_ramfs_fs(void)
+{
+       unregister_filesystem(&ramfs_fs_type);
+}
+
+module_init(init_ramfs_fs)
+module_exit(exit_ramfs_fs)
index 96297521b8b007ee7626b9334d7c1c06d34f12e3..cbaf77929b04d43821a091628460c181054d50c0 100644 (file)
@@ -315,7 +315,7 @@ static int udf_release_file(struct inode * inode, struct file * filp)
  */
 static int udf_open_file(struct inode * inode, struct file * filp)
 {
-       if ((inode->i_size & 0xFFFFFFFF00000000UL) && !(filp->f_flags & O_LARGEFILE))
+       if ((inode->i_size & 0xFFFFFFFF00000000ULL) && !(filp->f_flags & O_LARGEFILE))
                return -EFBIG;
        return 0;
 }
index ed1507fa7ea0320f04bf039e56d1686a839633d2..b0a9c42c004681c6d2dd131feca6214e0142d7c1 100644 (file)
@@ -78,7 +78,9 @@ void udf_put_inode(struct inode * inode)
        {
                lock_kernel();
                udf_discard_prealloc(inode);
-               write_inode_now(inode);
+               /* write the root inode on put, if dirty */
+               if (!inode->i_sb->s_root && inode->i_state & I_DIRTY)
+                       udf_update_inode(inode, IS_SYNC(inode));
                unlock_kernel();
        }
 }
@@ -111,7 +113,7 @@ void udf_delete_inode(struct inode * inode)
 
        inode->i_size = 0;
        udf_truncate(inode);
-       write_inode_now(inode);
+       udf_update_inode(inode, IS_SYNC(inode));
        udf_free_inode(inode);
 out:
        unlock_kernel();
@@ -1005,10 +1007,6 @@ static void udf_fill_inode(struct inode *inode, struct buffer_head *bh)
                inode->i_nlink = 1;
        
        inode->i_size = le64_to_cpu(fe->informationLength);
-#if BITS_PER_LONG < 64
-       if (le64_to_cpu(fe->informationLength) & 0xFFFFFFFF00000000ULL)
-               inode->i_size = (Uint32)-1;
-#endif
 
        inode->i_mode = udf_convert_permissions(fe);
        inode->i_mode &= ~UDF_SB(inode->i_sb)->s_umask;
index 75d9fb54018b863c14127e7f775c16991d46aed4..359905839d69ff24d20837b8d97139b36c898d75 100644 (file)
@@ -14,6 +14,7 @@
  */
 
 extern unsigned long max_low_pfn;
+extern unsigned long min_low_pfn;
 
 /*
  * node_bootmem_map is a map pointer - the bits represent all physical 
index 25c0c3f9cce38ea14df273f33de9dbc6c5be9fa4..17f6c046f8dcd98274c8e00690cc81a7079337a1 100644 (file)
@@ -68,9 +68,12 @@ struct input_id {
 
 #define EVIOCGVERSION          _IOR('E', 0x01, __u32)                  /* get driver version */
 #define EVIOCGID               _IOR('E', 0x02, struct input_id)        /* get device ID */
+#define EVIOCGREP              _IOR('E', 0x03, int[2])                 /* get repeat settings */
+#define EVIOCSREP              _IOW('E', 0x03, int[2])                 /* get repeat settings */
 #define EVIOCGNAME(len)                _IOC(_IOC_READ, 'E', 0x03, len)         /* get device name */
 #define EVIOCGBIT(ev,len)      _IOC(_IOC_READ, 'E', 0x20 + ev, len)    /* get event bits */
-#define EVIOCGABSLIM(num)      _IOR('E', 0x40 + num, 4 * sizeof(int))  /* get abs event limits */ 
+#define EVIOCGABSLIM(num)      _IOR('E', 0x40 + num, int[4])           /* get abs event limits */ 
+#define EVIOCGABS(num)         _IOR('E', 0x80 + num, int)              /* get abs value */
 
 /*
  * Event types
@@ -299,11 +302,12 @@ struct input_id {
 #define BTN_THUMB2             0x122
 #define BTN_TOP                        0x123
 #define BTN_TOP2               0x124
-#define BTN_BASE               0x125
-#define BTN_BASE2              0x126
-#define BTN_BASE3              0x127
-#define BTN_BASE4              0x128
-#define BTN_BASE5              0x129
+#define BTN_PINKIE             0x125
+#define BTN_BASE               0x126
+#define BTN_BASE2              0x127
+#define BTN_BASE3              0x128
+#define BTN_BASE4              0x129
+#define BTN_BASE5              0x12a
 
 #define BTN_GAMEPAD            0x130
 #define BTN_A                  0x130
@@ -459,7 +463,7 @@ struct input_handler {
        void *private;
 
        void (*event)(struct input_handle *handle, unsigned int type, unsigned int code, int value);
-       int (*connect)(struct input_handler *handler, struct input_dev *dev);
+       struct input_handle* (*connect)(struct input_handler *handler, struct input_dev *dev);
        void (*disconnect)(struct input_handle *handle);
 
        struct file_operations *fops;
@@ -472,6 +476,8 @@ struct input_handler {
 struct input_handle {
 
        void *private;
+
+       int open;
        
        struct input_dev *dev;
        struct input_handler *handler;
@@ -486,7 +492,7 @@ void input_unregister_device(struct input_dev *);
 void input_register_handler(struct input_handler *);
 void input_unregister_handler(struct input_handler *);
 
-void input_open_device(struct input_handle *);
+int input_open_device(struct input_handle *);
 void input_close_device(struct input_handle *);
 
 devfs_handle_t input_register_minor(char *name, int minor, int minor_base);
index cdd77e9325ee251227ca474cb74acbcfc569e81c..c981a6911edd90ab10eb6d0cdbd421764209fbbe 100644 (file)
@@ -15,6 +15,7 @@
 #define NBD_CLEAR_QUE  _IO( 0xab, 5 )
 #define NBD_PRINT_DEBUG        _IO( 0xab, 6 )
 #define NBD_SET_SIZE_BLOCKS    _IO( 0xab, 7 )
+#define NBD_DISCONNECT  _IO( 0xab, 8 )
 
 #ifdef MAJOR_NR
 
index 07802f38847e60ae308784453412b51b19aa047c..fc39f2658c81f83ef898ebb8d813f21f909598ed 100644 (file)
@@ -21,6 +21,7 @@
 
 #include <linux/list.h>
 #include <linux/skbuff.h>
+#include <linux/poll.h>
 
 struct ppp_channel;
 
index 9478513f903c71ff5cdc06a9e7e74bd3a2dc0371..6ba4ebbcd466c41773126131a9753beb6c082a29 100644 (file)
 
 /* ioctls */
 
+/* compat */
+#define REGISTER_DEV           _IO (MD_MAJOR, 1)
+#define START_MD               _IO (MD_MAJOR, 2)
+#define STOP_MD                _IO (MD_MAJOR, 3)
+
+
 /* status */
 #define RAID_VERSION           _IOR (MD_MAJOR, 0x10, mdu_version_t)
 #define GET_ARRAY_INFO         _IOR (MD_MAJOR, 0x11, mdu_array_info_t)
index 47980eaaf7ef08b10fce537d4927301c036f8e92..c1a255da9a934e2cfaef12660c0fe9ca744d9b14 100644 (file)
 #define udf_info(f, a...) \
                printk (KERN_INFO "UDF-fs INFO " ## f, ## a);
 
-#ifdef __KERNEL__
-/*
- * Function prototypes (all other prototypes included in udfdecl.h)
- */
-extern int init_udf_fs(void);
-
-#endif /* __KERNEL__ */
-
 #endif /* !defined(_LINUX_UDF_FS_H) */
index 4e0666ee08bb5b12dfe9c22a6e6c5c33e5cc58bb..772264c529d311b6d902f4b8492bec5fd9cb1bed 100644 (file)
@@ -710,6 +710,7 @@ static inline unsigned int __default_pipe(struct usb_device *dev)
  * Send and receive control messages..
  */
 int usb_new_device(struct usb_device *dev);
+int usb_reset_device(struct usb_device *dev);
 int usb_set_address(struct usb_device *dev);
 int usb_get_descriptor(struct usb_device *dev, unsigned char desctype,
        unsigned char descindex, void *buf, int size);
diff --git a/include/linux/usbdevice_fs.h b/include/linux/usbdevice_fs.h
new file mode 100644 (file)
index 0000000..95eaa93
--- /dev/null
@@ -0,0 +1,170 @@
+/*****************************************************************************/
+
+/*
+ *     usbdevice_fs.h  --  USB device file system.
+ *
+ *     Copyright (C) 2000
+ *          Thomas Sailer (sailer@ife.ee.ethz.ch)
+ *
+ *     This program is free software; you can redistribute it and/or modify
+ *     it under the terms of the GNU General Public License as published by
+ *     the Free Software Foundation; either version 2 of the License, or
+ *     (at your option) any later version.
+ *
+ *     This program is distributed in the hope that it will be useful,
+ *     but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *     GNU General Public License for more details.
+ *
+ *     You should have received a copy of the GNU General Public License
+ *     along with this program; if not, write to the Free Software
+ *     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ *  History:
+ *   0.1  04.01.2000  Created
+ *
+ *  $Id: usbdevice_fs.h,v 1.1 2000/01/06 18:40:41 tom Exp $
+ */
+
+/*****************************************************************************/
+
+#ifndef _LINUX_USBDEVICE_FS_H
+#define _LINUX_USBDEVICE_FS_H
+
+/* --------------------------------------------------------------------- */
+
+#define USBDEVICE_SUPER_MAGIC 0x9fa2
+
+/* usbdevfs ioctl codes */
+
+struct usbdevfs_ctrltransfer {
+       __u8 requesttype;
+       __u8 request;
+       __u16 value;
+       __u16 index;
+       __u16 length;
+       __u32 timeout;  /* in milliseconds */
+       void *data;
+};
+
+struct usbdevfs_bulktransfer {
+       unsigned int ep;
+       unsigned int len;
+       unsigned int timeout; /* in milliseconds */
+       void *data;
+};
+
+struct usbdevfs_setinterface {
+       unsigned int interface;
+       unsigned int altsetting;
+};
+
+struct usbdevfs_disconnectsignal {
+       unsigned int signr;
+       void *context;
+};
+
+#define USBDEVFS_URB_DISABLE_SPD           1
+#define USBDEVFS_URB_ISO_ASAP              2
+
+#define USBDEVFS_URB_TYPE_ISO             0
+#define USBDEVFS_URB_TYPE_INTERRUPT       1
+#define USBDEVFS_URB_TYPE_CONTROL         2
+#define USBDEVFS_URB_TYPE_BULK            3
+
+struct usbdevfs_iso_packet_desc {
+       unsigned int length;
+       unsigned int actual_length;
+       unsigned int status;
+};
+
+struct usbdevfs_urb {
+       unsigned char type;
+       unsigned char endpoint;
+       int status;
+       unsigned int flags;
+       void *buffer;
+       int buffer_length;
+       int actual_length;
+       int start_frame;
+       int number_of_packets;
+       int error_count;
+       unsigned int signr;  /* signal to be sent on error, -1 if none should be sent */
+       void *usercontext;
+       struct usbdevfs_iso_packet_desc iso_frame_desc[0];
+};
+
+#define USBDEVFS_CONTROL           _IOWR('U', 0, struct usbdevfs_ctrltransfer)
+#define USBDEVFS_BULK              _IOWR('U', 2, struct usbdevfs_bulktransfer)
+#define USBDEVFS_RESETEP           _IOR('U', 3, unsigned int)
+#define USBDEVFS_SETINTERFACE      _IOR('U', 4, struct usbdevfs_setinterface)
+#define USBDEVFS_SETCONFIGURATION  _IOR('U', 5, unsigned int)
+#define USBDEVFS_SUBMITURB         _IOR('U', 10, struct usbdevfs_urb)
+#define USBDEVFS_DISCARDURB        _IO('U', 11)
+#define USBDEVFS_REAPURB           _IOW('U', 12, void *)
+#define USBDEVFS_REAPURBNDELAY     _IOW('U', 13, void *)
+#define USBDEVFS_DISCSIGNAL        _IOR('U', 14, struct usbdevfs_disconnectsignal)
+#define USBDEVFS_CLAIMINTERFACE    _IOR('U', 15, unsigned int)
+#define USBDEVFS_RELEASEINTERFACE  _IOR('U', 16, unsigned int)
+
+/* --------------------------------------------------------------------- */
+
+#ifdef __KERNEL__
+
+#include <linux/list.h>
+#include <asm/semaphore.h>
+
+/*
+ * inode number macros
+ */
+#define ITYPE(x)   ((x)&(0xf<<28))
+#define ISPECIAL   (0<<28)
+#define IBUS       (1<<28)
+#define IDEVICE    (2<<28)
+#define IBUSNR(x)  (((x)>>8)&0xff)
+#define IDEVNR(x)  ((x)&0xff)
+
+#define IROOT      1
+
+/*
+ * sigh. rwsemaphores do not (yet) work from modules
+ */
+
+#define rw_semaphore semaphore
+#define init_rwsem init_MUTEX
+#define down_read down
+#define down_write down
+#define up_read up
+#define up_write up
+
+
+struct dev_state {
+       struct list_head list;      /* state list */
+       struct rw_semaphore devsem; /* protects modifications to dev (dev == NULL indicating disconnect) */ 
+       struct usb_device *dev;
+       struct file *file;
+       spinlock_t lock;            /* protects the async urb lists */
+       struct list_head async_pending;
+       struct list_head async_completed;
+       wait_queue_head_t wait;     /* wake up if a request completed */
+       unsigned int discsignr;
+       struct task_struct *disctask;
+       void *disccontext;
+       unsigned long ifclaimed;
+};
+
+/* internal methods & data */
+extern struct usb_driver usbdevfs_driver;
+extern struct file_operations usbdevfs_drivers_fops;
+extern struct file_operations usbdevfs_devices_fops;
+extern struct file_operations usbdevfs_device_file_operations;
+extern struct inode_operations usbdevfs_device_inode_operations;
+extern struct inode_operations usbdevfs_bus_inode_operations;
+extern struct file_operations usbdevfs_bus_file_operations;
+extern void usbdevfs_conn_disc_event(void);
+
+
+#endif /* __KERNEL__ */
+
+/* --------------------------------------------------------------------- */
+#endif /* _LINUX_USBDEVICE_FS_H */
index c4abcacbbb7a1a527b192898f95ec159109a9349..0a40b06235bb1f5ef0008f08274fc3f5dbad5141 100644 (file)
@@ -510,16 +510,14 @@ asmlinkage void __init start_kernel(void)
        kmem_cache_init();
        sti();
        calibrate_delay();
-#if 0000
 #ifdef CONFIG_BLK_DEV_INITRD
-       // FIXME, use the bootmem.h interface.
-       if (initrd_start && !initrd_below_start_ok && initrd_start < memory_start) {
+       if (initrd_start && !initrd_below_start_ok &&
+                       initrd_start < min_low_pfn << PAGE_SHIFT) {
                printk(KERN_CRIT "initrd overwritten (0x%08lx < 0x%08lx) - "
-                   "disabling it.\n",initrd_start,memory_start);
+                   "disabling it.\n",initrd_start,min_low_pfn << PAGE_SHIFT);
                initrd_start = 0;
        }
 #endif
-#endif /* 0000 */
        mem_init();
        kmem_cache_sizes_init();
 #ifdef CONFIG_PROC_FS
@@ -572,14 +570,6 @@ static int do_linuxrc(void * shell)
        return execve(shell, argv, envp_init);
 }
 
-static int __init no_initrd(char *s)
-{
-       mount_initrd = 0;
-       return 1;
-}
-
-__setup("noinitrd", no_initrd);
-
 #endif
 
 struct task_struct *child_reaper = &init_task;
index ffdcf2fff1fd310a88604046906a54b273684dcf..b60a3d9b273d2578c71207bd6b03f36e8a08fb4b 100644 (file)
--- a/ipc/shm.c
+++ b/ipc/shm.c
@@ -68,6 +68,13 @@ static int         shm_readdir  (struct file *, void *, filldir_t);
 #define SHM_FMT ".IPC_%08x"
 #define SHM_FMT_LEN 13
 
+/* shm_mode upper byte flags */
+/* SHM_DEST and SHM_LOCKED are used in ipcs(8) */
+#define PRV_DEST       0010000 /* segment will be destroyed on last detach */
+#define PRV_LOCKED     0020000 /* segment will not be swapped */
+#define SHM_UNLK       0040000 /* filename is unlinked */
+#define SHM_SYSV       0100000 /* It is a SYSV shm segment */
+
 struct shmid_kernel /* private to the kernel */
 {      
        struct kern_ipc_perm    shm_perm;
@@ -83,7 +90,6 @@ struct shmid_kernel /* private to the kernel */
                        time_t                  ctime;
                        pid_t                   cpid;
                        pid_t                   lpid;
-                       int                     unlinked;
                        int                     nlen;
                        char                    nm[0];
                } shmem;
@@ -101,7 +107,7 @@ struct shmid_kernel /* private to the kernel */
 #define shm_lprid      permap.shmem.lpid
 #define shm_namelen    permap.shmem.nlen
 #define shm_name       permap.shmem.nm
-#define shm_unlinked   permap.shmem.unlinked
+#define shm_flags      shm_perm.mode
 #define zsem           permap.zero.sema
 #define zero_list      permap.zero.list
 
@@ -112,8 +118,6 @@ static struct ipc_ids shm_ids;
 #define shm_lockall()  ipc_lockall(&shm_ids)
 #define shm_unlockall()        ipc_unlockall(&shm_ids)
 #define shm_get(id)    ((struct shmid_kernel*)ipc_get(&shm_ids,id))
-#define shm_checkid(s, id)     \
-       ipc_checkid(&shm_ids,&s->shm_perm,id)
 #define shm_buildid(id, seq) \
        ipc_buildid(&shm_ids, id, seq)
 
@@ -317,6 +321,15 @@ static int shm_remount_fs (struct super_block *sb, int *flags, char *data)
        return 0;
 }
 
+static inline int shm_checkid(struct shmid_kernel *s, int id)
+{
+       if (!(s->shm_flags & SHM_SYSV))
+               return -EINVAL;
+       if (ipc_checkid(&shm_ids,&s->shm_perm,id))
+               return -EIDRM;
+       return 0;
+}
+
 static inline struct shmid_kernel *shm_rmid(int id)
 {
        return (struct shmid_kernel *)ipc_rmid(&shm_ids,id);
@@ -384,7 +397,7 @@ static void shm_read_inode(struct inode * inode)
        if (id < SEQ_MULTIPLIER) {
                if (!(shp = shm_lock (id)))
                        return;
-               inode->i_mode = shp->shm_perm.mode | S_IFREG;
+               inode->i_mode = (shp->shm_flags & S_IALLUGO) | S_IFREG;
                inode->i_uid  = shp->shm_perm.uid;
                inode->i_gid  = shp->shm_perm.gid;
                inode->i_size = shp->shm_segsz;
@@ -456,7 +469,7 @@ static int shm_readdir (struct file *filp, void *dirent, filldir_t filldir)
                                continue;
                        if (!(shp = shm_get (nr-2))) 
                                continue;
-                       if (shp->shm_unlinked)
+                       if (shp->shm_flags & SHM_UNLK)
                                continue;
                        if (filldir(dirent, shp->shm_name, shp->shm_namelen, nr, nr) < 0 )
                                break;;
@@ -485,7 +498,7 @@ static struct dentry *shm_lookup (struct inode *dir, struct dentry *dent)
                        continue;
                if (!(shp = shm_lock(i)))
                        continue;
-               if (!(shp->shm_unlinked) &&
+               if (!(shp->shm_flags & SHM_UNLK) &&
                    dent->d_name.len == shp->shm_namelen &&
                    strncmp(dent->d_name.name, shp->shm_name, shp->shm_namelen) == 0)
                        goto found;
@@ -523,8 +536,7 @@ static int shm_unlink (struct inode *dir, struct dentry *dent)
        down (&shm_ids.sem);
        if (!(shp = shm_lock (inode->i_ino)))
                BUG();
-       shp->shm_unlinked = 1;
-       shp->shm_perm.mode |= SHM_DEST;
+       shp->shm_flags |= SHM_UNLK | PRV_DEST;
        shp->shm_perm.key = IPC_PRIVATE; /* Do not find it any more */
        shm_unlock (inode->i_ino);
        up (&shm_ids.sem);
@@ -743,18 +755,18 @@ static int newseg (key_t key, const char *name, int namelen,
                return -ENOSPC;
        }
        shp->shm_perm.key = key;
-       shp->shm_perm.mode = (shmflg & S_IRWXUGO);
+       shp->shm_flags = (shmflg & S_IRWXUGO);
        shp->shm_segsz = size;
        shp->shm_cprid = current->pid;
        shp->shm_lprid = 0;
        shp->shm_atim = shp->shm_dtim = 0;
        shp->shm_ctim = CURRENT_TIME;
        shp->id = shm_buildid(id,shp->shm_perm.seq);
-       shp->shm_unlinked = 0;
        if (namelen != 0) {
                shp->shm_namelen = namelen;
                memcpy (shp->shm_name, name, namelen);            
        } else {
+               shp->shm_flags |= SHM_SYSV;
                shp->shm_namelen = sprintf (shp->shm_name, SHM_FMT, shp->id);
        }
        shm_unlock(id);
@@ -863,7 +875,7 @@ static inline unsigned long copy_shmid_from_user(struct shm_setbuf *out, void *b
 
                out->uid        = tbuf.shm_perm.uid;
                out->gid        = tbuf.shm_perm.gid;
-               out->mode       = tbuf.shm_perm.mode;
+               out->mode       = tbuf.shm_flags;
 
                return 0;
            }
@@ -876,7 +888,7 @@ static inline unsigned long copy_shmid_from_user(struct shm_setbuf *out, void *b
 
                out->uid        = tbuf_old.shm_perm.uid;
                out->gid        = tbuf_old.shm_perm.gid;
-               out->mode       = tbuf_old.shm_perm.mode;
+               out->mode       = tbuf_old.shm_flags;
 
                return 0;
            }
@@ -980,12 +992,13 @@ asmlinkage long sys_shmctl (int shmid, int cmd, struct shmid_ds *buf)
                        return -EINVAL;
                if(cmd==SHM_STAT) {
                        err = -EINVAL;
-                       if (shmid > shm_ids.max_id)
+                       if (!(shp->shm_flags & SHM_SYSV) ||
+                           shmid > shm_ids.max_id)
                                goto out_unlock;
                        result = shm_buildid(shmid, shp->shm_perm.seq);
                } else {
-                       err = -EIDRM;
-                       if(shm_checkid(shp,shmid))
+                       err = shm_checkid(shp,shmid);
+                       if(err)
                                goto out_unlock;
                        result = 0;
                }
@@ -993,6 +1006,13 @@ asmlinkage long sys_shmctl (int shmid, int cmd, struct shmid_ds *buf)
                if (ipcperms (&shp->shm_perm, S_IRUGO))
                        goto out_unlock;
                kernel_to_ipc64_perm(&shp->shm_perm, &tbuf.shm_perm);
+               /* ugly hack to keep binary compatibility for ipcs */
+               tbuf.shm_flags &= PRV_DEST | PRV_LOCKED | S_IRWXUGO;
+               if (tbuf.shm_flags & PRV_DEST)
+                       tbuf.shm_flags |= SHM_DEST;
+               if (tbuf.shm_flags & PRV_LOCKED)
+                       tbuf.shm_flags |= SHM_LOCKED;
+               tbuf.shm_flags &= SHM_DEST | SHM_LOCKED | S_IRWXUGO;
                tbuf.shm_segsz  = shp->shm_segsz;
                tbuf.shm_atime  = shp->shm_atim;
                tbuf.shm_dtime  = shp->shm_dtim;
@@ -1011,7 +1031,6 @@ asmlinkage long sys_shmctl (int shmid, int cmd, struct shmid_ds *buf)
 /* Allow superuser to lock segment in memory */
 /* Should the pages be faulted in here or leave it to user? */
 /* need to determine interaction with current->swappable */
-               struct kern_ipc_perm *ipcp;
                if ((shmid % SEQ_MULTIPLIER)== zero_id)
                        return -EINVAL;
                if (!capable(CAP_IPC_LOCK))
@@ -1020,21 +1039,13 @@ asmlinkage long sys_shmctl (int shmid, int cmd, struct shmid_ds *buf)
                shp = shm_lock(shmid);
                if(shp==NULL)
                        return -EINVAL;
-               err=-EIDRM;
-               if(shm_checkid(shp,shmid))
+               err = shm_checkid(shp,shmid);
+               if(err)
                        goto out_unlock;
-               ipcp = &shp->shm_perm;
-               if(cmd==SHM_LOCK) {
-                       if (!(ipcp->mode & SHM_LOCKED)) {
-                               ipcp->mode |= SHM_LOCKED;
-                               err = 0;
-                       }
-               } else {
-                       if (ipcp->mode & SHM_LOCKED) {
-                               ipcp->mode &= ~SHM_LOCKED;
-                               err = 0;
-                       }
-               }
+               if(cmd==SHM_LOCK)
+                       shp->shm_flags |= PRV_LOCKED;
+               else
+                       shp->shm_flags &= ~PRV_LOCKED;
                shm_unlock(shmid);
                return err;
        }
@@ -1058,9 +1069,10 @@ asmlinkage long sys_shmctl (int shmid, int cmd, struct shmid_ds *buf)
                        up(&shm_ids.sem);
                        return -EINVAL;
                }
-               err = -EIDRM;
-               if (shm_checkid(shp, shmid) == 0) {
-                       if (shp->shm_nattch == 0) {
+               err = shm_checkid(shp, shmid);
+               if (err == 0) {
+                       if (shp->shm_nattch == 0 && 
+                           !(shp->shm_flags & SHM_UNLK)) {
                                int id=shp->id;
                                shm_unlock(shmid);
                                up(&shm_ids.sem);
@@ -1071,10 +1083,9 @@ asmlinkage long sys_shmctl (int shmid, int cmd, struct shmid_ds *buf)
                                 */
                                return shm_remove_name(id);
                        }
-                       /* Do not find me any more */
-                       shp->shm_perm.mode |= SHM_DEST;
-                       shp->shm_perm.key = IPC_PRIVATE; /* Do not find it any more */
-                       err = 0;
+                       shp->shm_flags |= PRV_DEST;
+                       /* Do not find it any more */
+                       shp->shm_perm.key = IPC_PRIVATE;
                }
                /* Unlock */
                shm_unlock(shmid);
@@ -1094,8 +1105,8 @@ asmlinkage long sys_shmctl (int shmid, int cmd, struct shmid_ds *buf)
                err=-EINVAL;
                if(shp==NULL)
                        goto out_up;
-               err=-EIDRM;
-               if(shm_checkid(shp,shmid))
+               err = shm_checkid(shp,shmid);
+               if(err)
                        goto out_unlock_up;
                err=-EPERM;
                if (current->euid != shp->shm_perm.uid &&
@@ -1106,7 +1117,7 @@ asmlinkage long sys_shmctl (int shmid, int cmd, struct shmid_ds *buf)
 
                shp->shm_perm.uid = setbuf.uid;
                shp->shm_perm.gid = setbuf.gid;
-               shp->shm_perm.mode = (shp->shm_perm.mode & ~S_IRWXUGO)
+               shp->shm_flags = (shp->shm_flags & ~S_IRWXUGO)
                        | (setbuf.mode & S_IRWXUGO);
                shp->shm_ctim = CURRENT_TIME;
                break;
@@ -1248,7 +1259,16 @@ static int shm_remove_name(int id)
        dentry = lookup_one(name, dget(dir));
        error = PTR_ERR(dentry);
        if (!IS_ERR(dentry)) {
-               error = vfs_unlink(dir->d_inode, dentry);
+               /*
+                * We have to do our own unlink to prevent the vfs
+                * permission check. The SYSV IPC layer has already
+                * checked the permissions which do not comply to the
+                * vfs rules.
+                */
+               struct inode *inode = dir->d_inode;
+               down(&inode->i_zombie);
+               error = shm_unlink(inode, dentry);
+               up(&inode->i_zombie);
                dput(dentry);
        }
        unlock_dir(dir);
@@ -1273,7 +1293,9 @@ static void shm_close (struct vm_area_struct *shmd)
        shp->shm_lprid = current->pid;
        shp->shm_dtim = CURRENT_TIME;
        shp->shm_nattch--;
-       if(shp->shm_nattch == 0 && shp->shm_perm.mode & SHM_DEST) {
+       if(shp->shm_nattch == 0 && 
+          shp->shm_flags & PRV_DEST &&
+          !(shp->shm_flags & SHM_UNLK)) {
                int pid=shp->id;
                int err;
                shm_unlock(id);
@@ -1487,7 +1509,7 @@ int shm_swap (int prio, int gfp_mask, zone_t *zone)
        shm_lockall();
 check_id:
        shp = shm_get(swap_id);
-       if(shp==NULL || shp->shm_perm.mode & SHM_LOCKED) {
+       if(shp==NULL || shp->shm_flags & SHM_LOCKED) {
 next_id:
                swap_idx = 0;
                if (++swap_id > shm_ids.max_id) {
@@ -1605,7 +1627,7 @@ static int sysvipc_shm_read_proc(char *buffer, char **start, off_t offset, int l
                        len += sprintf(buffer + len, format,
                                shp->shm_perm.key,
                                shm_buildid(i, shp->shm_perm.seq),
-                               shp->shm_perm.mode,
+                               shp->shm_flags,
                                shp->shm_segsz,
                                shp->shm_cprid,
                                shp->shm_lprid,
@@ -1619,7 +1641,7 @@ static int sysvipc_shm_read_proc(char *buffer, char **start, off_t offset, int l
                                shp->shm_ctim,
                                shp->shm_namelen,
                                shp->shm_name,
-                               shp->shm_unlinked ? " (deleted)" : "");
+                               shp->shm_flags & SHM_UNLK ? " (deleted)" : "");
                        shm_unlock(i);
 
                        pos += len;
index 491eae26f357492c40c744a00c930a8f321a0f08..920e4a1a76b09ba301638f2d819d1bad81867e94 100644 (file)
@@ -8,6 +8,7 @@
  * This function is used through-out the kernel (including mm and fs)
  * to indicate a major problem.
  */
+#include <linux/config.h>
 #include <linux/sched.h>
 #include <linux/delay.h>
 #include <linux/reboot.h>
index 7a6d9db098896c7eec19c339d699ccd5cda5fe79..0e11fe9ed716f651d9b475fc6d6a0011be0cb9b9 100644 (file)
@@ -24,6 +24,7 @@
  * true for the boot process anyway)
  */
 unsigned long max_low_pfn;
+unsigned long min_low_pfn;
 
 /* return the number of _pages_ that will be allocated for the boot bitmap */
 unsigned long __init bootmem_bootmap_pages (unsigned long pages)
@@ -282,6 +283,7 @@ unsigned long __init free_all_bootmem_node (int nid)
 unsigned long __init init_bootmem (unsigned long start, unsigned long pages)
 {
        max_low_pfn = pages;
+       min_low_pfn = start;
        return(init_bootmem_core(NODE_DATA(0)->bdata, start, 0, pages));
 }
 
index 6dcc67815a00d975466f0e39731782d7af901dbf..56fc577675e61b70be9dfd1f3808d4d189ce15f1 100644 (file)
--- a/mm/slab.c
+++ b/mm/slab.c
@@ -1019,6 +1019,16 @@ static int __kmem_cache_shrink(kmem_cache_t *cachep)
                slabp = cachep->c_lastp;
                if (slabp->s_inuse || slabp == kmem_slab_end(cachep))
                        break;
+               /*
+                * If this slab is the first slab with free objects
+                * (c_freep), and as we are walking the slab chain
+                * backwards, it is also the last slab with free
+                * objects.  After unlinking it, there will be no
+                * slabs with free objects, so point c_freep into the
+                * cache structure.
+                */
+               if (cachep->c_freep == slabp)
+                       cachep->c_freep = kmem_slab_end(cachep);
                kmem_slab_unlink(slabp);
                spin_unlock_irq(&cachep->c_spinlock);
                kmem_slab_destroy(cachep, slabp);