]> git.saurik.com Git - apple/boot.git/commitdiff
boot-80.1.tar.gz mac-os-x-100 mac-os-x-1004 v80.1
authorApple <opensource@apple.com>
Tue, 23 Jan 2001 08:15:39 +0000 (08:15 +0000)
committerApple <opensource@apple.com>
Tue, 23 Jan 2001 08:15:39 +0000 (08:15 +0000)
291 files changed:
APPLE_LICENSE [new file with mode: 0644]
Makefile [new file with mode: 0644]
dpkg/control [new file with mode: 0644]
gen/MakeInc.dir [new file with mode: 0644]
gen/MakePaths.dir [new file with mode: 0644]
gen/Makefile [new file with mode: 0644]
gen/libsa/Makefile [new file with mode: 0644]
gen/libsa/bsearch.c [new file with mode: 0644]
gen/libsa/ctype.h [new file with mode: 0644]
gen/libsa/error.c [new file with mode: 0644]
gen/libsa/fontio.h [new file with mode: 0644]
gen/libsa/getsegbyname.c [new file with mode: 0644]
gen/libsa/io_inline.h [new file with mode: 0644]
gen/libsa/kernBootStruct.h [new file with mode: 0644]
gen/libsa/keys.h [new file with mode: 0644]
gen/libsa/libsa.h [new file with mode: 0644]
gen/libsa/mach.c [new file with mode: 0644]
gen/libsa/malloc.c.00 [new file with mode: 0644]
gen/libsa/memcpy.c [new file with mode: 0644]
gen/libsa/memory.h [new file with mode: 0644]
gen/libsa/memset.c [new file with mode: 0644]
gen/libsa/prf.c [new file with mode: 0644]
gen/libsa/setjmp.s [new file with mode: 0644]
gen/libsa/sprintf.c [new file with mode: 0644]
gen/libsa/string1.c [new file with mode: 0644]
gen/libsa/string2.c [new file with mode: 0644]
gen/libsa/strtol.c [new file with mode: 0644]
gen/libsa/zalloc.c [new file with mode: 0644]
gen/libsa/zalloc.h [new file with mode: 0644]
gen/libsaio/cache.c [new file with mode: 0644]
gen/libsaio/cache.h [new file with mode: 0644]
gen/libsaio/disk.c [new file with mode: 0644]
gen/libsaio/errorV.c [new file with mode: 0644]
gen/libsaio/gets.c [new file with mode: 0644]
gen/libsaio/localPrintf.c [new file with mode: 0644]
gen/libsaio/localVPrintf.c [new file with mode: 0644]
gen/libsaio/printf.c [new file with mode: 0644]
gen/libsaio/reallyPrint.c [new file with mode: 0644]
gen/libsaio/stringTable.c [new file with mode: 0644]
gen/libsaio/sys.c [new file with mode: 0644]
gen/libsaio/table.c [new file with mode: 0644]
gen/libsaio/ufs_byteorder.c [new file with mode: 0644]
gen/libsaio/ufs_byteorder.h [new file with mode: 0644]
gen/libsaio/unpackbits.c [new file with mode: 0644]
gen/rcz/Makefile [new file with mode: 0644]
gen/rcz/README [new file with mode: 0644]
gen/rcz/rcz.c [new file with mode: 0644]
gen/rcz/rcz_common.c [new file with mode: 0644]
gen/rcz/rcz_common.h [new file with mode: 0644]
gen/rcz/rcz_compress_mem.c [new file with mode: 0644]
gen/rcz/rcz_compress_mem.h [new file with mode: 0644]
gen/rcz/rcz_decompress_file.c [new file with mode: 0644]
gen/rcz/rcz_decompress_file.h [new file with mode: 0644]
gen/rcz/rcz_decompress_mem.c [new file with mode: 0644]
gen/rcz/rcz_decompress_mem.h [new file with mode: 0644]
gen/util/Makefile [new file with mode: 0644]
gen/util/machOconv.c [new file with mode: 0644]
i386/MakeInc.dir [new file with mode: 0644]
i386/MakePaths.dir [new file with mode: 0644]
i386/Makefile [new file with mode: 0644]
i386/boot0/Makefile [new file with mode: 0644]
i386/boot0/boot0.s [new file with mode: 0644]
i386/boot1/Makefile [new file with mode: 0644]
i386/boot1/boot1 [new file with mode: 0755]
i386/boot1/boot1.asm [new file with mode: 0644]
i386/boot1/boot1.s [new file with mode: 0644]
i386/boot1/boot1f [new file with mode: 0755]
i386/boot1/gonext.c [new file with mode: 0644]
i386/boot1/gonext.com [new file with mode: 0644]
i386/boot1/makefile.dos [new file with mode: 0644]
i386/boot1/mkboot.bat [new file with mode: 0755]
i386/boot1/nullboot1 [new file with mode: 0755]
i386/boot1/nullboot1.asm [new file with mode: 0644]
i386/boot1/nullboot1.s [new file with mode: 0644]
i386/boot1/replace.c [new file with mode: 0644]
i386/boot2/Makefile [new file with mode: 0644]
i386/boot2/boot.c [new file with mode: 0644]
i386/boot2/boot.h [new file with mode: 0644]
i386/boot2/boot2.s [new file with mode: 0644]
i386/boot2/graphics.c [new file with mode: 0644]
i386/boot2/old/Language.table [new file with mode: 0644]
i386/boot2/old/browser.c [new file with mode: 0644]
i386/boot2/old/browser.h [new file with mode: 0644]
i386/boot2/old/button.c [new file with mode: 0644]
i386/boot2/old/button.h [new file with mode: 0644]
i386/boot2/old/questionbox.c [new file with mode: 0644]
i386/boot2/old/scanmemory.c [new file with mode: 0644]
i386/boot2/old/scanmemory.sed [new file with mode: 0644]
i386/boot2/old/scrollbar.c [new file with mode: 0644]
i386/boot2/old/scrollbar.h [new file with mode: 0644]
i386/boot2/old/sizememory.c [new file with mode: 0644]
i386/boot2/old/start.s [new file with mode: 0644]
i386/boot2/old/test [new file with mode: 0755]
i386/boot2/old/test.c [new file with mode: 0644]
i386/boot2/prompt.c [new file with mode: 0644]
i386/doc/Limits [new file with mode: 0644]
i386/doc/README [new file with mode: 0644]
i386/libsa/Makefile [new file with mode: 0644]
i386/libsa/error.c [new file with mode: 0644]
i386/libsa/kernBootStruct.h [new file with mode: 0644]
i386/libsa/libsa.h [new file with mode: 0644]
i386/libsa/memory.h [new file with mode: 0644]
i386/libsa/prf.c [new file with mode: 0644]
i386/libsa/printf.c [new file with mode: 0644]
i386/libsa/qsort.c [new file with mode: 0644]
i386/libsa/setjmp.s [new file with mode: 0644]
i386/libsa/string.c [new file with mode: 0644]
i386/libsa/strtol.c [new file with mode: 0644]
i386/libsa/zalloc.c [new file with mode: 0644]
i386/libsaio/Makefile [new file with mode: 0644]
i386/libsaio/appleClut8.h [new file with mode: 0644]
i386/libsaio/asm.s [new file with mode: 0644]
i386/libsaio/bios.h [new file with mode: 0644]
i386/libsaio/bios.s [new file with mode: 0644]
i386/libsaio/biosfn.c [new file with mode: 0644]
i386/libsaio/bootstruct.c [new file with mode: 0644]
i386/libsaio/cache.c [new file with mode: 0644]
i386/libsaio/cache.h [new file with mode: 0644]
i386/libsaio/console.c [new file with mode: 0644]
i386/libsaio/disk.c [new file with mode: 0644]
i386/libsaio/drivers.h [new file with mode: 0644]
i386/libsaio/gets.c [new file with mode: 0644]
i386/libsaio/io_inline.h [new file with mode: 0644]
i386/libsaio/legacy/PCI.h [new file with mode: 0644]
i386/libsaio/legacy/asm.h [new file with mode: 0644]
i386/libsaio/legacy/configTablePrivate.h [new file with mode: 0644]
i386/libsaio/legacy/disk.h [new file with mode: 0644]
i386/libsaio/legacy/fdisk.h [new file with mode: 0644]
i386/libsaio/libsaio.h [new file with mode: 0644]
i386/libsaio/load.c [new file with mode: 0644]
i386/libsaio/misc.c [new file with mode: 0644]
i386/libsaio/nbp.c [new file with mode: 0644]
i386/libsaio/nbp.h [new file with mode: 0644]
i386/libsaio/nbp_cmd.h [new file with mode: 0644]
i386/libsaio/old/bios_old.s [new file with mode: 0644]
i386/libsaio/old/shmalloc.c [new file with mode: 0644]
i386/libsaio/old/stringTable.h.00 [new file with mode: 0644]
i386/libsaio/old/stringTableNew.c [new file with mode: 0644]
i386/libsaio/pci.c [new file with mode: 0644]
i386/libsaio/pci.h [new file with mode: 0644]
i386/libsaio/saio.h [new file with mode: 0644]
i386/libsaio/saio_internal.h [new file with mode: 0644]
i386/libsaio/saio_types.h [new file with mode: 0644]
i386/libsaio/stringConstants.h [new file with mode: 0644]
i386/libsaio/stringTable.c [new file with mode: 0644]
i386/libsaio/sys.c [new file with mode: 0644]
i386/libsaio/table.c [new file with mode: 0644]
i386/libsaio/ufs_byteorder.c [new file with mode: 0644]
i386/libsaio/ufs_byteorder.h [new file with mode: 0644]
i386/libsaio/vbe.c [new file with mode: 0644]
i386/libsaio/vbe.h [new file with mode: 0644]
i386/libsaio/vga.c [new file with mode: 0644]
i386/libsaio/vga.h [new file with mode: 0644]
i386/nasm/Makefile [new file with mode: 0644]
i386/nasm/assemble.c [new file with mode: 0644]
i386/nasm/assemble.h [new file with mode: 0644]
i386/nasm/disasm.c [new file with mode: 0644]
i386/nasm/disasm.h [new file with mode: 0644]
i386/nasm/doc/Licence [new file with mode: 0644]
i386/nasm/doc/nasmdoc.txt [new file with mode: 0644]
i386/nasm/eval.c [new file with mode: 0644]
i386/nasm/eval.h [new file with mode: 0644]
i386/nasm/float.c [new file with mode: 0644]
i386/nasm/float.h [new file with mode: 0644]
i386/nasm/insns.dat [new file with mode: 0644]
i386/nasm/insns.h [new file with mode: 0644]
i386/nasm/insns.pl [new file with mode: 0755]
i386/nasm/insnsa.c [new file with mode: 0644]
i386/nasm/insnsd.c [new file with mode: 0644]
i386/nasm/labels.c [new file with mode: 0644]
i386/nasm/labels.h [new file with mode: 0644]
i386/nasm/listing.c [new file with mode: 0644]
i386/nasm/listing.h [new file with mode: 0644]
i386/nasm/macros.c [new file with mode: 0644]
i386/nasm/macros.pl [new file with mode: 0755]
i386/nasm/names.c [new file with mode: 0644]
i386/nasm/nasm.1 [new file with mode: 0644]
i386/nasm/nasm.c [new file with mode: 0644]
i386/nasm/nasm.h [new file with mode: 0644]
i386/nasm/nasmlib.c [new file with mode: 0644]
i386/nasm/nasmlib.h [new file with mode: 0644]
i386/nasm/ndisasm.1 [new file with mode: 0644]
i386/nasm/ndisasm.c [new file with mode: 0644]
i386/nasm/outaout.c [new file with mode: 0644]
i386/nasm/outas86.c [new file with mode: 0644]
i386/nasm/outbin.c [new file with mode: 0644]
i386/nasm/outcoff.c [new file with mode: 0644]
i386/nasm/outdbg.c [new file with mode: 0644]
i386/nasm/outelf.c [new file with mode: 0644]
i386/nasm/outform.c [new file with mode: 0644]
i386/nasm/outform.h [new file with mode: 0644]
i386/nasm/outobj.c [new file with mode: 0644]
i386/nasm/outrdf.c [new file with mode: 0644]
i386/nasm/parser.c [new file with mode: 0644]
i386/nasm/parser.h [new file with mode: 0644]
i386/nasm/preproc.c [new file with mode: 0644]
i386/nasm/preproc.h [new file with mode: 0644]
i386/nasm/standard.mac [new file with mode: 0644]
i386/nasm/sync.c [new file with mode: 0644]
i386/nasm/sync.h [new file with mode: 0644]
i386/rcz/Makefile [new file with mode: 0644]
i386/rcz/rcz_common.c [new file with mode: 0644]
i386/rcz/rcz_common.h [new file with mode: 0644]
i386/rcz/rcz_compress_file.c [new file with mode: 0644]
i386/rcz/rcz_compress_file.h [new file with mode: 0644]
i386/rcz/rcz_compress_mem.c [new file with mode: 0644]
i386/rcz/rcz_compress_mem.h [new file with mode: 0644]
i386/rcz/rcz_decompress_file.c [new file with mode: 0644]
i386/rcz/rcz_decompress_file.h [new file with mode: 0644]
i386/rcz/rcz_decompress_mem.c [new file with mode: 0644]
i386/rcz/rcz_decompress_mem.h [new file with mode: 0644]
i386/sarld/Makefile [new file with mode: 0644]
i386/strings/BootHelp.txt [new file with mode: 0644]
i386/strings/English.lproj/Localizable.strings [new file with mode: 0644]
i386/strings/English.lproj/NetInstall.strings [new file with mode: 0644]
i386/strings/French.lproj/Localizable.strings [new file with mode: 0644]
i386/strings/French.lproj/NetInstall.strings [new file with mode: 0644]
i386/strings/German.lproj/Localizable.strings [new file with mode: 0644]
i386/strings/German.lproj/NetInstall.strings [new file with mode: 0644]
i386/strings/Italian.lproj/Localizable.strings [new file with mode: 0644]
i386/strings/Italian.lproj/NetInstall.strings [new file with mode: 0644]
i386/strings/Language.table [new file with mode: 0644]
i386/strings/Makefile [new file with mode: 0644]
i386/strings/Spanish.lproj/Localizable.strings [new file with mode: 0644]
i386/strings/Spanish.lproj/NetInstall.strings [new file with mode: 0644]
i386/strings/Swedish.lproj/Localizable.strings [new file with mode: 0644]
i386/strings/Swedish.lproj/NetInstall.strings [new file with mode: 0644]
i386/testmodule/Makefile [new file with mode: 0644]
i386/testmodule/install.def [new file with mode: 0644]
i386/testmodule/install/Makefile [new file with mode: 0644]
i386/testmodule/install/install.def [new file with mode: 0644]
i386/testmodule/install/install.h [new file with mode: 0644]
i386/testmodule/install/install.module [new file with mode: 0755]
i386/testmodule/install/mode.c [new file with mode: 0644]
i386/testmodule/test.c [new file with mode: 0644]
i386/testmodule/test.def [new file with mode: 0644]
i386/testmodule/test.h [new file with mode: 0644]
i386/testmodule/test.module [new file with mode: 0755]
i386/tests/Makefile [new file with mode: 0644]
i386/tests/bootHelper.c [new file with mode: 0644]
i386/tests/rldtest.c [new file with mode: 0644]
i386/tests/satest.c [new file with mode: 0644]
i386/tests/sizeof [new file with mode: 0755]
i386/tests/sizeof.c [new file with mode: 0644]
i386/util/12.Charcoal [new file with mode: 0644]
i386/util/BooterBitmap.h [new file with mode: 0644]
i386/util/BooterBitmap.m [new file with mode: 0644]
i386/util/Default.font [new file with mode: 0644]
i386/util/FontBitmap.h [new file with mode: 0644]
i386/util/Makefile [new file with mode: 0644]
i386/util/Newpanel.image [new file with mode: 0644]
i386/util/Panel.image [new file with mode: 0644]
i386/util/Wait1.image [new file with mode: 0644]
i386/util/Wait2.image [new file with mode: 0644]
i386/util/Wait3.image [new file with mode: 0644]
i386/util/bitmap.h [new file with mode: 0644]
i386/util/cursor.h [new file with mode: 0644]
i386/util/dot.h [new file with mode: 0644]
i386/util/dot.tiff [new file with mode: 0644]
i386/util/dot_bitmap.h [new file with mode: 0644]
i386/util/dumptiff [new file with mode: 0755]
i386/util/dumptiff.m [new file with mode: 0644]
i386/util/font.h [new file with mode: 0644]
i386/util/hdot.h [new file with mode: 0644]
i386/util/hdot_bitmap.h [new file with mode: 0644]
i386/util/images.h [new file with mode: 0644]
i386/util/machOconv.c [new file with mode: 0644]
i386/util/mkfont.c [new file with mode: 0644]
i386/util/ns_box.h [new file with mode: 0644]
i386/util/ns_box.tiff [new file with mode: 0644]
i386/util/ns_box_bitmap.h [new file with mode: 0644]
i386/util/ns_logo.h [new file with mode: 0644]
i386/util/ns_logo.tiff [new file with mode: 0644]
i386/util/ns_logo_bitmap.h [new file with mode: 0644]
i386/util/ns_wait1.h [new file with mode: 0644]
i386/util/ns_wait1.image [new file with mode: 0644]
i386/util/ns_wait1_bitmap.h [new file with mode: 0644]
i386/util/ns_wait2.h [new file with mode: 0644]
i386/util/ns_wait2.image [new file with mode: 0644]
i386/util/ns_wait2_bitmap.h [new file with mode: 0644]
i386/util/ns_wait3.h [new file with mode: 0644]
i386/util/ns_wait3.image [new file with mode: 0644]
i386/util/ns_wait3_bitmap.h [new file with mode: 0644]
i386/util/return.h [new file with mode: 0644]
i386/util/return.tiff [new file with mode: 0644]
i386/util/return_bitmap.h [new file with mode: 0644]
i386/util/sig.c [new file with mode: 0644]
i386/util/spin_cursor.h [new file with mode: 0644]
i386/util/test.c [new file with mode: 0644]
i386/util/test.def [new file with mode: 0644]
i386/util/tif_packbits.c [new file with mode: 0644]

diff --git a/APPLE_LICENSE b/APPLE_LICENSE
new file mode 100644 (file)
index 0000000..84687a4
--- /dev/null
@@ -0,0 +1,372 @@
+APPLE PUBLIC SOURCE LICENSE
+Version 1.1 - April 19,1999
+
+Please read this License carefully before downloading this software.
+By downloading and using this software, you are agreeing to be bound
+by the terms of this License.  If you do not or cannot agree to the
+terms of this License, please do not download or use the software.
+
+1. General; Definitions.  This License applies to any program or other
+work which Apple Computer, Inc. ("Apple") publicly announces as
+subject to this Apple Public Source License and which contains a
+notice placed by Apple identifying such program or work as "Original
+Code" and stating that it is subject to the terms of this Apple Public
+Source License version 1.1 (or subsequent version thereof), as it may
+be revised from time to time by Apple ("License").  As used in this
+License:
+
+1.1 "Affected Original Code" means only those specific portions of
+Original Code that allegedly infringe upon any party's intellectual
+property rights or are otherwise the subject of a claim of
+infringement.
+
+1.2 "Applicable Patent Rights" mean: (a) in the case where Apple is
+the grantor of rights, (i) claims of patents that are now or hereafter
+acquired, owned by or assigned to Apple and (ii) that cover subject
+matter contained in the Original Code, but only to the extent
+necessary to use, reproduce and/or distribute the Original Code
+without infringement; and (b) in the case where You are the grantor of
+rights, (i) claims of patents that are now or hereafter acquired,
+owned by or assigned to You and (ii) that cover subject matter in Your
+Modifications, taken alone or in combination with Original Code.
+
+1.3 "Covered Code" means the Original Code, Modifications, the
+combination of Original Code and any Modifications, and/or any
+respective portions thereof.
+
+1.4 "Deploy" means to use, sublicense or distribute Covered Code other
+than for Your internal research and development (R&D), and includes
+without limitation, any and all internal use or distribution of
+Covered Code within Your business or organization except for R&D use,
+as well as direct or indirect sublicensing or distribution of Covered
+Code by You to any third party in any form or manner.
+
+1.5 "Larger Work" means a work which combines Covered Code or portions
+thereof with code not governed by the terms of this License.
+
+1.6 "Modifications" mean any addition to, deletion from, and/or change
+to, the substance and/or structure of Covered Code.  When code is
+released as a series of files, a Modification is: (a) any addition to
+or deletion from the contents of a file containing Covered Code;
+and/or (b) any new file or other representation of computer program
+statements that contains any part of Covered Code.
+
+1.7 "Original Code" means (a) the Source Code of a program or other
+work as originally made available by Apple under this License,
+including the Source Code of any updates or upgrades to such programs
+or works made available by Apple under this License, and that has been
+expressly identified by Apple as such in the header file(s) of such
+work; and (b) the object code compiled from such Source Code and
+originally made available by Apple under this License.
+
+1.8 "Source Code" means the human readable form of a program or other
+work that is suitable for making modifications to it, including all
+modules it contains, plus any associated interface definition files,
+scripts used to control compilation and installation of an executable
+(object code).
+
+1.9 "You" or "Your" means an individual or a legal entity exercising
+rights under this License.  For legal entities, "You" or "Your"
+includes any entity which controls, is controlled by, or is under
+common control with, You, where "control" means (a) the power, direct
+or indirect, to cause the direction or management of such entity,
+whether by contract or otherwise, or (b) ownership of fifty percent
+(50%) or more of the outstanding shares or beneficial ownership of
+such entity.
+
+2. Permitted Uses; Conditions & Restrictions.  Subject to the terms
+and conditions of this License, Apple hereby grants You, effective on
+the date You accept this License and download the Original Code, a
+world-wide, royalty-free, non- exclusive license, to the extent of
+Apple's Applicable Patent Rights and copyrights covering the Original
+Code, to do the following:
+
+2.1 You may use, copy, modify and distribute Original Code, with or
+without Modifications, solely for Your internal research and
+development, provided that You must in each instance:
+
+(a) retain and reproduce in all copies of Original Code the copyright
+and other proprietary notices and disclaimers of Apple as they appear
+in the Original Code, and keep intact all notices in the Original Code
+that refer to this License;
+
+(b) include a copy of this License with every copy of Source Code of
+Covered Code and documentation You distribute, and You may not offer
+or impose any terms on such Source Code that alter or restrict this
+License or the recipients' rights hereunder, except as permitted under
+Section 6; and
+
+(c) completely and accurately document all Modifications that you have
+made and the date of each such Modification, designate the version of
+the Original Code you used, prominently include a file carrying such
+information with the Modifications, and duplicate the notice in
+Exhibit A in each file of the Source Code of all such Modifications.
+
+2.2 You may Deploy Covered Code, provided that You must in each
+  instance:
+
+(a) satisfy all the conditions of Section 2.1 with respect to the
+Source Code of the Covered Code;
+
+(b) make all Your Deployed Modifications publicly available in Source
+Code form via electronic distribution (e.g. download from a web site)
+under the terms of this License and subject to the license grants set
+forth in Section 3 below, and any additional terms You may choose to
+offer under Section 6.  You must continue to make the Source Code of
+Your Deployed Modifications available for as long as you Deploy the
+Covered Code or twelve (12) months from the date of initial
+Deployment, whichever is longer;
+
+(c) if You Deploy Covered Code containing Modifications made by You,
+inform others of how to obtain those Modifications by filling out and
+submitting the information found at
+http://www.apple.com/publicsource/modifications.html, if available;
+and
+
+(d) if You Deploy Covered Code in object code, executable form only,
+include a prominent notice, in the code itself as well as in related
+documentation, stating that Source Code of the Covered Code is
+available under the terms of this License with information on how and
+where to obtain such Source Code.
+
+3. Your Grants.  In consideration of, and as a condition to, the
+licenses granted to You under this License:
+
+(a) You hereby grant to Apple and all third parties a non-exclusive,
+royalty-free license, under Your Applicable Patent Rights and other
+intellectual property rights owned or controlled by You, to use,
+reproduce, modify, distribute and Deploy Your Modifications of the
+same scope and extent as Apple's licenses under Sections 2.1 and 2.2;
+and
+
+(b) You hereby grant to Apple and its subsidiaries a non-exclusive,
+worldwide, royalty-free, perpetual and irrevocable license, under Your
+Applicable Patent Rights and other intellectual property rights owned
+or controlled by You, to use, reproduce, execute, compile, display,
+perform, modify or have modified (for Apple and/or its subsidiaries),
+sublicense and distribute Your Modifications, in any form, through
+multiple tiers of distribution.
+
+4. Larger Works.  You may create a Larger Work by combining Covered
+Code with other code not governed by the terms of this License and
+distribute the Larger Work as a single product.  In each such
+instance, You must make sure the requirements of this License are
+fulfilled for the Covered Code or any portion thereof.
+
+5. Limitations on Patent License.  Except as expressly stated in
+Section 2, no other patent rights, express or implied, are granted by
+Apple herein.  Modifications and/or Larger Works may require
+additional patent licenses from Apple which Apple may grant in its
+sole discretion.
+
+6. Additional Terms.  You may choose to offer, and to charge a fee
+for, warranty, support, indemnity or liability obligations and/or
+other rights consistent with the scope of the license granted herein
+("Additional Terms") to one or more recipients of Covered
+Code. However, You may do so only on Your own behalf and as Your sole
+responsibility, and not on behalf of Apple. You must obtain the
+recipient's agreement that any such Additional Terms are offered by
+You alone, and You hereby agree to indemnify, defend and hold Apple
+harmless for any liability incurred by or claims asserted against
+Apple by reason of any such Additional Terms.
+
+7. Versions of the License.  Apple may publish revised and/or new
+versions of this License from time to time.  Each version will be
+given a distinguishing version number.  Once Original Code has been
+published under a particular version of this License, You may continue
+to use it under the terms of that version. You may also choose to use
+such Original Code under the terms of any subsequent version of this
+License published by Apple.  No one other than Apple has the right to
+modify the terms applicable to Covered Code created under this
+License.
+
+8. NO WARRANTY OR SUPPORT.  The Original Code may contain in whole or
+in part pre-release, untested, or not fully tested works.  The
+Original Code may contain errors that could cause failures or loss of
+data, and may be incomplete or contain inaccuracies.  You expressly
+acknowledge and agree that use of the Original Code, or any portion
+thereof, is at Your sole and entire risk.  THE ORIGINAL CODE IS
+PROVIDED "AS IS" AND WITHOUT WARRANTY, UPGRADES OR SUPPORT OF ANY KIND
+AND APPLE AND APPLE'S LICENSOR(S) (FOR THE PURPOSES OF SECTIONS 8 AND
+9, APPLE AND APPLE'S LICENSOR(S) ARE COLLECTIVELY REFERRED TO AS
+"APPLE") EXPRESSLY DISCLAIM ALL WARRANTIES AND/OR CONDITIONS, EXPRESS
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+AND/OR CONDITIONS OF MERCHANTABILITY OR SATISFACTORY QUALITY AND
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY
+RIGHTS.  APPLE DOES NOT WARRANT THAT THE FUNCTIONS CONTAINED IN THE
+ORIGINAL CODE WILL MEET YOUR REQUIREMENTS, OR THAT THE OPERATION OF
+THE ORIGINAL CODE WILL BE UNINTERRUPTED OR ERROR- FREE, OR THAT
+DEFECTS IN THE ORIGINAL CODE WILL BE CORRECTED.  NO ORAL OR WRITTEN
+INFORMATION OR ADVICE GIVEN BY APPLE OR AN APPLE AUTHORIZED
+REPRESENTATIVE SHALL CREATE A WARRANTY OR IN ANY WAY INCREASE THE
+SCOPE OF THIS WARRANTY.  You acknowledge that the Original Code is not
+intended for use in the operation of nuclear facilities, aircraft
+navigation, communication systems, or air traffic control machines in
+which case the failure of the Original Code could lead to death,
+personal injury, or severe physical or environmental damage.
+
+9. Liability.
+
+9.1 Infringement.  If any portion of, or functionality implemented by,
+the Original Code becomes the subject of a claim of infringement,
+Apple may, at its option: (a) attempt to procure the rights necessary
+for Apple and You to continue using the Affected Original Code; (b)
+modify the Affected Original Code so that it is no longer infringing;
+or (c) suspend Your rights to use, reproduce, modify, sublicense and
+distribute the Affected Original Code until a final determination of
+the claim is made by a court or governmental administrative agency of
+competent jurisdiction and Apple lifts the suspension as set forth
+below.  Such suspension of rights will be effective immediately upon
+Apple's posting of a notice to such effect on the Apple web site that
+is used for implementation of this License.  Upon such final
+determination being made, if Apple is legally able, without the
+payment of a fee or royalty, to resume use, reproduction,
+modification, sublicensing and distribution of the Affected Original
+Code, Apple will lift the suspension of rights to the Affected
+Original Code by posting a notice to such effect on the Apple web site
+that is used for implementation of this License.  If Apple suspends
+Your rights to Affected Original Code, nothing in this License shall
+be construed to restrict You, at Your option and subject to applicable
+law, from replacing the Affected Original Code with non-infringing
+code or independently negotiating for necessary rights from such third
+party.
+
+9.2 LIMITATION OF LIABILITY.  UNDER NO CIRCUMSTANCES SHALL APPLE BE
+LIABLE FOR ANY INCIDENTAL, SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES
+ARISING OUT OF OR RELATING TO THIS LICENSE OR YOUR USE OR INABILITY TO
+USE THE ORIGINAL CODE, OR ANY PORTION THEREOF, WHETHER UNDER A THEORY
+OF CONTRACT, WARRANTY, TORT (INCLUDING NEGLIGENCE), PRODUCTS LIABILITY
+OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES AND NOTWITHSTANDING THE FAILURE OF ESSENTIAL PURPOSE OF
+ANY REMEDY.  In no event shall Apple's total liability to You for all
+damages under this License exceed the amount of fifty dollars
+($50.00).
+
+10. Trademarks.  This License does not grant any rights to use the
+trademarks or trade names "Apple", "Apple Computer", "Mac OS X", "Mac
+OS X Server" or any other trademarks or trade names belonging to Apple
+(collectively "Apple Marks") and no Apple Marks may be used to endorse
+or promote products derived from the Original Code other than as
+permitted by and in strict compliance at all times with Apple's third
+party trademark usage guidelines which are posted at
+http://www.apple.com/legal/guidelinesfor3rdparties.html.
+
+11. Ownership.  Apple retains all rights, title and interest in and to
+the Original Code and any Modifications made by or on behalf of Apple
+("Apple Modifications"), and such Apple Modifications will not be
+automatically subject to this License.  Apple may, at its sole
+discretion, choose to license such Apple Modifications under this
+License, or on different terms from those contained in this License or
+may choose not to license them at all.  Apple's development, use,
+reproduction, modification, sublicensing and distribution of Covered
+Code will not be subject to this License.
+
+12. Termination.
+
+12.1 Termination.  This License and the rights granted hereunder will
+   terminate:
+
+(a) automatically without notice from Apple if You fail to comply with
+any term(s) of this License and fail to cure such breach within 30
+days of becoming aware of such breach; (b) immediately in the event of
+the circumstances described in Section 13.5(b); or (c) automatically
+without notice from Apple if You, at any time during the term of this
+License, commence an action for patent infringement against Apple.
+
+12.2 Effect of Termination.  Upon termination, You agree to
+immediately stop any further use, reproduction, modification,
+sublicensing and distribution of the Covered Code and to destroy all
+copies of the Covered Code that are in your possession or control.
+All sublicenses to the Covered Code which have been properly granted
+prior to termination shall survive any termination of this License.
+Provisions which, by their nature, should remain in effect beyond the
+termination of this License shall survive, including but not limited
+to Sections 3, 5, 8, 9, 10, 11, 12.2 and 13.  Neither party will be
+liable to the other for compensation, indemnity or damages of any sort
+solely as a result of terminating this License in accordance with its
+terms, and termination of this License will be without prejudice to
+any other right or remedy of either party.
+
+13.  Miscellaneous.
+
+13.1 Government End Users.  The Covered Code is a "commercial item" as
+defined in FAR 2.101.  Government software and technical data rights
+in the Covered Code include only those rights customarily provided to
+the public as defined in this License. This customary commercial
+license in technical data and software is provided in accordance with
+FAR 12.211 (Technical Data) and 12.212 (Computer Software) and, for
+Department of Defense purchases, DFAR 252.227-7015 (Technical Data --
+Commercial Items) and 227.7202-3 (Rights in Commercial Computer
+Software or Computer Software Documentation).  Accordingly, all U.S.
+Government End Users acquire Covered Code with only those rights set
+forth herein.
+
+13.2 Relationship of Parties.  This License will not be construed as
+creating an agency, partnership, joint venture or any other form of
+legal association between You and Apple, and You will not represent to
+the contrary, whether expressly, by implication, appearance or
+otherwise.
+
+13.3 Independent Development.  Nothing in this License will impair
+Apple's right to acquire, license, develop, have others develop for
+it, market and/or distribute technology or products that perform the
+same or similar functions as, or otherwise compete with,
+Modifications, Larger Works, technology or products that You may
+develop, produce, market or distribute.
+
+13.4 Waiver; Construction.  Failure by Apple to enforce any provision
+of this License will not be deemed a waiver of future enforcement of
+that or any other provision.  Any law or regulation which provides
+that the language of a contract shall be construed against the drafter
+will not apply to this License.
+
+13.5 Severability.  (a) If for any reason a court of competent
+jurisdiction finds any provision of this License, or portion thereof,
+to be unenforceable, that provision of the License will be enforced to
+the maximum extent permissible so as to effect the economic benefits
+and intent of the parties, and the remainder of this License will
+continue in full force and effect.  (b) Notwithstanding the foregoing,
+if applicable law prohibits or restricts You from fully and/or
+specifically complying with Sections 2 and/or 3 or prevents the
+enforceability of either of those Sections, this License will
+immediately terminate and You must immediately discontinue any use of
+the Covered Code and destroy all copies of it that are in your
+possession or control.
+
+13.6 Dispute Resolution.  Any litigation or other dispute resolution
+between You and Apple relating to this License shall take place in the
+Northern District of California, and You and Apple hereby consent to
+the personal jurisdiction of, and venue in, the state and federal
+courts within that District with respect to this License. The
+application of the United Nations Convention on Contracts for the
+International Sale of Goods is expressly excluded.
+
+13.7 Entire Agreement; Governing Law.  This License constitutes the
+entire agreement between the parties with respect to the subject
+matter hereof.  This License shall be governed by the laws of the
+United States and the State of California, except that body of
+California law concerning conflicts of law.
+
+Where You are located in the province of Quebec, Canada, the following
+clause applies: The parties hereby confirm that they have requested
+that this License and all related documents be drafted in English. Les
+parties ont exige que le present contrat et tous les documents
+connexes soient rediges en anglais.
+
+EXHIBIT A.
+
+"Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
+Reserved.  This file contains Original Code and/or Modifications of
+Original Code as defined in and that are subject to the Apple Public
+Source License Version 1.1 (the "License").  You may not use this file
+except in compliance with the License.  Please obtain a copy of the
+License at http://www.apple.com/publicsource and read it before using
+this file.
+
+The Original Code and all software distributed under the License are
+distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
+License for the specific language governing rights and limitations
+under the License."
diff --git a/Makefile b/Makefile
new file mode 100644 (file)
index 0000000..8dd7149
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,66 @@
+export USE_APPLE_PB_SUPPORT = all
+
+#      Makefile for kernel booter
+
+# CFLAGS       = -O $(MORECPP) -arch i386 -g -munaligned-text
+DEFINES=
+CONFIG = hd
+LIBDIR = libsa
+INC = -I. -I$(LIBDIR)
+ifneq "" "$(wildcard /bin/mkdirs)"
+  MKDIRS = /bin/mkdirs
+else
+  MKDIRS = /bin/mkdir -p
+endif
+AS = as
+LD = ld
+PAX = /bin/pax
+
+OBJROOT = `pwd`/obj
+SYMROOT = `pwd`/sym
+DSTROOT = `pwd`/dst
+SRCROOT = /tmp
+ARCHLESS_RC_CFLAGS=`echo $(RC_CFLAGS) | sed 's/-arch [a-z0-9]*//g'`
+
+VPATH = $(OBJROOT):$(SYMROOT)
+
+GENERIC_SUBDIRS = gen
+
+#
+# Currently builds for i386
+#
+
+all tags clean debug install installhdrs: $(SYMROOT) $(OBJROOT)
+       @if [ -z "$(RC_ARCHS)" ]; then                                    \
+               RC_ARCHS="i386";                                          \
+       fi;                                                               \
+       SUBDIRS="$(GENERIC_SUBDIRS) $$RC_ARCHS";                          \
+       for i in $$SUBDIRS;                                               \
+       do \
+           if [ -d $$i ]; then                                           \
+               echo ================= make $@ for $$i =================; \
+               ( OBJROOT=$(OBJROOT)/$${i};                               \
+                 SYMROOT=$(SYMROOT)/$${i};                               \
+                 DSTROOT=$(DSTROOT);                                     \
+                 echo "$$OBJROOT $$SYMROOT $$DSTROOT"; \
+                   cd $$i; ${MAKE}                                       \
+                       "OBJROOT=$$OBJROOT"                               \
+                       "SYMROOT=$$SYMROOT"                               \
+                       "DSTROOT=$$DSTROOT"                               \
+                       "SRCROOT=$$SRCROOT"                               \
+                       "RC_ARCHS=$$RC_ARCHS"                             \
+                       "TARGET=$$i"                                      \
+                       "RC_KANJI=$(RC_KANJI)"                            \
+                       "JAPANESE=$(JAPANESE)"                            \
+                       "RC_CFLAGS=$(ARCHLESS_RC_CFLAGS)" $@                      \
+               ) || exit $?;                                             \
+           else                                                          \
+               echo "========= nothing to build for $$i =========";      \
+           fi;                                                           \
+       done
+
+installsrc:
+       gnutar cf - . | (cd ${SRCROOT}; gnutar xpf -)
+
+$(SYMROOT) $(OBJROOT) $(DSTROOT):
+       @$(MKDIRS) $@
diff --git a/dpkg/control b/dpkg/control
new file mode 100644 (file)
index 0000000..96192b0
--- /dev/null
@@ -0,0 +1,4 @@
+Package: boot
+Maintainer: Darwin Developers <darwin-development@public.lists.apple.com>
+Description: Kernel booter
+Build-Depends: build-base, adv-cmds, libc-hdrs, objc4-hdrs
diff --git a/gen/MakeInc.dir b/gen/MakeInc.dir
new file mode 100644 (file)
index 0000000..474c4ae
--- /dev/null
@@ -0,0 +1,43 @@
+#
+# Common makefile targets.
+#
+# Define these variables (if desired) in directory makefiles:
+#      DIRS_NEEDED
+#      INSTALLDIR
+#      SRCROOT
+#
+ifneq "" "$(wildcard /bin/mkdirs)"
+  MKDIRS = /bin/mkdirs
+else
+  MKDIRS = /bin/mkdir -p
+endif
+
+installsrc:: $(SRCROOT)
+       cp $(ALLSRC) $(SRCROOT)
+       cd $(SRCROOT); chmod a-w $(ALLSRC)
+
+install:: installhdrs all
+
+install_i386:: all
+
+installhdrs::
+
+clean::
+       /bin/rm -rf $(OBJROOT) *~
+
+.SUFFIXES: .s .i .c .o
+
+.c.o .m.o:
+       $(CC) $(CFLAGS) $(DEFINES) -c $(INC) $< -o $(OBJROOT)/$*.o \
+           -MD -dependency-file $(OBJROOT)/$*.d
+       md -u $(OBJROOT)/Makedep -f -d $(OBJROOT)/$*.d
+
+#.s.o:
+#      cc $(INC) -E $< > $(OBJROOT)/$*.o2
+#      $(AS) -o $(OBJROOT)/$@ $(OBJROOT)/$*.o2
+
+.s.o:
+       cc -c $(INC) -arch i386 -o $(OBJROOT)/$@ $<
+       
+$(DIRS_NEEDED) $(INSTALLDIR) $(SRCROOT):
+       $(MKDIRS) $@
diff --git a/gen/MakePaths.dir b/gen/MakePaths.dir
new file mode 100644 (file)
index 0000000..4eb6750
--- /dev/null
@@ -0,0 +1,9 @@
+#
+# Default paths for subdirectories.
+#
+
+OBJROOT=../../obj/gen/$(DIR)
+SYMROOT=../../sym/gen
+DSTROOT=../../dst
+SRCROOT=/tmp
+
diff --git a/gen/Makefile b/gen/Makefile
new file mode 100644 (file)
index 0000000..b9ce995
--- /dev/null
@@ -0,0 +1,49 @@
+
+#
+#  Machine-independent code
+#
+
+#CFLAGS        = -O $(MORECPP) -arch i386 -g -munaligned-text
+DEFINES=
+CONFIG = hd
+LIBDIR = libsa
+INC = -I. -I$(LIBDIR)
+ifneq "" "$(wildcard /bin/mkdirs)"
+  MKDIRS = /bin/mkdirs
+else
+  MKDIRS = /bin/mkdir -p
+endif
+AS = as
+LD = ld
+# LIBS= -lc_static
+
+#
+# these paths are only valid in subdirectories of this directory
+#
+OBJROOT=`pwd`/../../obj/gen
+SYMROOT=`pwd`/../../sym
+DSTROOT=`pwd`/../../dst
+SRCROOT=/tmp
+
+VPATH = $(OBJROOT):$(SYMROOT)
+
+SUBDIRS = rcz
+
+all tags clean debug install installhdrs:
+       @for i in ${SUBDIRS}; \
+       do \
+               echo ================= make $@ for $$i =================; \
+               ( cd $$i; ${MAKE}                                         \
+                       "OBJROOT=$(OBJROOT)/$$i"                          \
+                       "SYMROOT=$(SYMROOT)"                              \
+                       "DSTROOT=$(DSTROOT)"                              \
+                       "SRCROOT=$(SRCROOT)"                              \
+                       "RC_ARCHS=$(RC_ARCHS)"                            \
+                       "RC_KANJI=$(RC_KANJI)"                            \
+                       "JAPANESE=$(JAPANESE)"                            \
+                       "RC_CFLAGS=$(RC_CFLAGS)" $@                       \
+               ) || exit $?;                                             \
+       done
+
+installsrc:
+       tar cf - . | (cd ${SRCROOT}; tar xfBp -)
diff --git a/gen/libsa/Makefile b/gen/libsa/Makefile
new file mode 100644 (file)
index 0000000..20c0a10
--- /dev/null
@@ -0,0 +1,42 @@
+
+DIR = libsa
+include ../MakePaths.dir
+
+UTILDIR = ../util
+INSTALL_MI_DIR = $(DSTROOT)/System/Library/Frameworks/System.framework/Versions/B/PrivateHeaders/machdep/machine
+
+DEBUG = -O
+CFLAGS = $(DEBUG) $(MORECPP) -arch i386 -g -Wmost -Wno-precomp -munaligned-text
+DEFINES=
+CONFIG = hd
+INC = -I. -I$(SYMROOT) -I$(UTILDIR)
+ifneq "" "$(wildcard /bin/mkdirs)"
+  MKDIRS = /bin/mkdirs
+else
+  MKDIRS = /bin/mkdir -p
+endif
+AS = as
+LD = ld
+# LIBS= -lc_static
+LIBS=
+
+VPATH = $(OBJROOT):$(SYMROOT)
+
+INSTALLED_MI_HFILES = kernBootStruct.h
+
+clean::
+       @echo "Nothing to clean (yet)"
+
+all:
+       @echo "Nothing to build (yet)"
+
+$(INSTALL_MI_DIR):
+       $(MKDIRS) $@
+
+installhdrs:: $(INSTALL_MI_DIR)
+       cp $(INSTALLED_MI_HFILES) $(INSTALL_MI_DIR)
+
+include ../MakeInc.dir
+
+# dependencies
+-include $(OBJROOT)/Makedep
diff --git a/gen/libsa/bsearch.c b/gen/libsa/bsearch.c
new file mode 100644 (file)
index 0000000..48070a8
--- /dev/null
@@ -0,0 +1,48 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
+ * Reserved.  This file contains Original Code and/or Modifications of
+ * Original Code as defined in and that are subject to the Apple Public
+ * Source License Version 1.1 (the "License").  You may not use this file
+ * except in compliance with the License.  Please obtain a copy of the
+ * License at http://www.apple.com/publicsource and read it before using
+ * this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/* bsearch  -- from libc */
+#include "libsa.h"
+
+#undef bsearch
+void *
+bsearch(const void *key, const void *base, size_t nmemb, size_t size, int (*compar)(const void *, const void *)) {
+    int l = 0;
+    int u = nmemb - 1;
+    int m;
+    void *mp;
+    int r;
+
+    while (l <= u) {
+       m = (l + u) / 2;
+       mp = (void *)(((char *)base) + (m * size));
+       if ((r = (*compar) (key, mp)) == 0) {
+           return mp;
+       } else if (r < 0) {
+           u = m - 1;
+       } else {
+           l = m + 1;
+       }
+    }
+    return NULL;
+}
diff --git a/gen/libsa/ctype.h b/gen/libsa/ctype.h
new file mode 100644 (file)
index 0000000..9a56c58
--- /dev/null
@@ -0,0 +1,33 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
+ * Reserved.  This file contains Original Code and/or Modifications of
+ * Original Code as defined in and that are subject to the Apple Public
+ * Source License Version 1.1 (the "License").  You may not use this file
+ * except in compliance with the License.  Please obtain a copy of the
+ * License at http://www.apple.com/publicsource and read it before using
+ * this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/* standalone ctype.h */
+
+#define isdigit(c) ((c) >= '0' && (c) <= '9')
+#define isspace(c) ((c) == ' ' || (c) == '\t' || (c) == '\n' || \
+                    (c) == '\r' || (c) == '\v' || (c) == '\f')
+#define isupper(c) ((c) >= 'A' && (c) <= 'Z')
+#define islower(c) ((c) >= 'a' && (c) <= 'z')
+#define isdigit(c) ((c) >= '0' && (c) <= '9')
+#define isalpha(c) (islower(c) || isupper(c))
+#define isalnum(c) (isalpha(c) || isdigit(c))
\ No newline at end of file
diff --git a/gen/libsa/error.c b/gen/libsa/error.c
new file mode 100644 (file)
index 0000000..0dafad8
--- /dev/null
@@ -0,0 +1,35 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
+ * Reserved.  This file contains Original Code and/or Modifications of
+ * Original Code as defined in and that are subject to the Apple Public
+ * Source License Version 1.1 (the "License").  You may not use this file
+ * except in compliance with the License.  Please obtain a copy of the
+ * License at http://www.apple.com/publicsource and read it before using
+ * this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/* error handling */
+
+#import "libsa.h"
+
+int errno;
+
+char *strerror(int errnum)
+{
+    static char error_string[32];
+    sprintf(error_string,"Error %d",errnum);
+    return error_string;
+}
diff --git a/gen/libsa/fontio.h b/gen/libsa/fontio.h
new file mode 100644 (file)
index 0000000..08b8e3d
--- /dev/null
@@ -0,0 +1,51 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
+ * Reserved.  This file contains Original Code and/or Modifications of
+ * Original Code as defined in and that are subject to the Apple Public
+ * Source License Version 1.1 (the "License").  You may not use this file
+ * except in compliance with the License.  Please obtain a copy of the
+ * License at http://www.apple.com/publicsource and read it before using
+ * this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/* Font I/O functions */
+
+extern int strwidth(
+    register const char *str
+);
+
+extern int strheight(
+    const char *str
+);
+
+#define CENTER_H       1
+#define CENTER_V       2    
+
+extern int blit_string(
+    const char *str,
+    int xpos,
+    int ypos,
+    int color,
+    int center
+);
+
+extern void blit_clear(
+    int maxwidth,
+    int xpos,
+    int ypos,
+    int center,
+    int color
+);
diff --git a/gen/libsa/getsegbyname.c b/gen/libsa/getsegbyname.c
new file mode 100644 (file)
index 0000000..125cf7f
--- /dev/null
@@ -0,0 +1,54 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
+ * Reserved.  This file contains Original Code and/or Modifications of
+ * Original Code as defined in and that are subject to the Apple Public
+ * Source License Version 1.1 (the "License").  You may not use this file
+ * except in compliance with the License.  Please obtain a copy of the
+ * License at http://www.apple.com/publicsource and read it before using
+ * this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright 1993 NeXT, Inc.
+ * All rights reserved.
+ */
+
+#import "libsa.h"
+
+/*
+ * This routine returns the segment_command structure for the named segment if
+ * it exist in the mach executible it is linked into.  Otherwise it returns
+ * zero.  It uses the specified mach_header pointer and just looks through the
+ * load commands.
+ */
+struct segment_command *
+getsegbynamefromheader(
+struct mach_header *mhp,
+char *segname)
+{
+       struct segment_command *sgp;
+       long i;
+
+       sgp = (struct segment_command *)
+             ((char *)mhp + sizeof(struct mach_header));
+       for(i = 0; i < mhp->ncmds; i++){
+           if(sgp->cmd == LC_SEGMENT)
+               if(strncmp(sgp->segname, segname, sizeof(sgp->segname)) == 0)
+                   return(sgp);
+           sgp = (struct segment_command *)((char *)sgp + sgp->cmdsize);
+       }
+       return((struct segment_command *)0);
+}
diff --git a/gen/libsa/io_inline.h b/gen/libsa/io_inline.h
new file mode 100644 (file)
index 0000000..3bfa75d
--- /dev/null
@@ -0,0 +1,116 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
+ * Reserved.  This file contains Original Code and/or Modifications of
+ * Original Code as defined in and that are subject to the Apple Public
+ * Source License Version 1.1 (the "License").  You may not use this file
+ * except in compliance with the License.  Please obtain a copy of the
+ * License at http://www.apple.com/publicsource and read it before using
+ * this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1992 NeXT Computer, Inc.
+ *
+ * Inlines for io space access.
+ *
+ * HISTORY
+ *
+ * 20 May 1992 ? at NeXT
+ *     Created.
+ */
+#import <architecture/i386/io.h>
+
+#if    !defined(DEFINE_INLINE_FUNCTIONS)
+static
+#endif
+inline
+unsigned char
+inb(
+    io_addr_t          port
+)
+{
+    unsigned char      data;
+    
+    asm volatile(
+       "inb %1,%0"
+       
+       : "=a" (data)
+       : "d" (port));
+       
+    return (data);
+}
+#if    !defined(DEFINE_INLINE_FUNCTIONS)
+static
+#endif
+inline
+unsigned short
+inw(
+    io_addr_t          port
+)
+{
+    unsigned short     data;
+    
+    asm volatile(
+       "inw %1,%0"
+       
+       : "=a" (data)
+       : "d" (port));
+       
+    return (data);
+}
+
+#if    !defined(DEFINE_INLINE_FUNCTIONS)
+static
+#endif
+inline
+void
+outb(
+    io_addr_t          port,
+    unsigned char      data
+)
+{
+    static int         xxx;
+
+    asm volatile(
+       "outb %2,%1; lock; incl %0"
+       
+       : "=m" (xxx)
+       : "d" (port), "a" (data), "0" (xxx)
+       : "cc");
+}
+
+#if    !defined(DEFINE_INLINE_FUNCTIONS)
+static
+#endif
+inline
+void
+outw(
+    io_addr_t          port,
+    unsigned short     data
+)
+{
+    static int         xxx;
+
+    asm volatile(
+       "outw %2,%1; lock; incl %0"
+       
+       : "=m" (xxx)
+       : "d" (port), "a" (data), "0" (xxx)
+       : "cc");
+}
+
diff --git a/gen/libsa/kernBootStruct.h b/gen/libsa/kernBootStruct.h
new file mode 100644 (file)
index 0000000..a685321
--- /dev/null
@@ -0,0 +1,32 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
+ * Reserved.  This file contains Original Code and/or Modifications of
+ * Original Code as defined in and that are subject to the Apple Public
+ * Source License Version 1.1 (the "License").  You may not use this file
+ * except in compliance with the License.  Please obtain a copy of the
+ * License at http://www.apple.com/publicsource and read it before using
+ * this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * kernBootStruct.h
+ * What the booter leaves behind for the kernel.
+ */
+
+#import <architecture/ARCH_INCLUDE.h>
+
+#import ARCH_INCLUDE(, kernBootStruct.h)
+
diff --git a/gen/libsa/keys.h b/gen/libsa/keys.h
new file mode 100644 (file)
index 0000000..1275551
--- /dev/null
@@ -0,0 +1,27 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
+ * Reserved.  This file contains Original Code and/or Modifications of
+ * Original Code as defined in and that are subject to the Apple Public
+ * Source License Version 1.1 (the "License").  You may not use this file
+ * except in compliance with the License.  Please obtain a copy of the
+ * License at http://www.apple.com/publicsource and read it before using
+ * this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/* key codes for some keys */
+
+#define K_UP   0x4800
+#define K_DOWN 0x5000
\ No newline at end of file
diff --git a/gen/libsa/libsa.h b/gen/libsa/libsa.h
new file mode 100644 (file)
index 0000000..1346fc4
--- /dev/null
@@ -0,0 +1,115 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
+ * Reserved.  This file contains Original Code and/or Modifications of
+ * Original Code as defined in and that are subject to the Apple Public
+ * Source License Version 1.1 (the "License").  You may not use this file
+ * except in compliance with the License.  Please obtain a copy of the
+ * License at http://www.apple.com/publicsource and read it before using
+ * this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/* Exported API for standalone library */
+#import <mach-o/loader.h>
+#import <mach/mach.h>
+#import <stdarg.h>
+#import <stddef.h>
+
+#ifndef bcopy
+extern char *bcopy(char *src, char *dst, int n);
+#endif
+extern void *bsearch(const void *key, const void *base, size_t nmemb, size_t size, int (*compar)(const void *, const void *));
+#ifndef bzero
+extern int bzero(char *b, int length);
+#endif
+extern void *memset(void *s, int c, size_t n);
+
+/*
+ * These are defined internally by GCC
+ *
+ * extern void *memcpy(void *dst, const void *src, size_t len);
+ * extern size_t strlen(const char *s);
+ */
+
+extern int errno;
+extern struct segment_command *
+  getsegbynamefromheader(struct mach_header *mhp, char *segname);
+extern int ptol(char *str);
+
+/* setjmp/longjmp:
+ * #include <setjmp.h>
+ *
+ * extern int setjmp(jmp_buf env);
+ * extern void longjmp( jmp_buf env, int val);
+ */
+
+extern int slvprintf(char *buffer, int len, const char *fmt, va_list arg);
+extern int sprintf(char *s, const char *format, ...);
+
+extern char *strcat(char *s1, const char *s2);
+extern int strcmp(const char *s1, const char *s2);
+extern char *strcpy(char *s1, const char *s2);
+char *strerror(int errnum);
+extern int strncmp(const char *s1, const char *s2, size_t n);
+extern char *strncpy(char *s1, const char *s2, size_t n);
+extern long strtol(
+    const char *nptr,
+    char **endptr,
+    register int base
+);
+extern unsigned long strtoul(
+    const char *nptr,
+    char **endptr,
+    register int base
+);
+extern int atoi(const char *str);
+
+/* Mach */
+extern port_t task_self_;
+extern kern_return_t vm_allocate(
+    vm_task_t target_task,
+    vm_address_t *address,
+    vm_size_t size,
+    boolean_t anywhere
+);
+extern kern_return_t vm_deallocate(
+    vm_task_t target_task,
+    vm_address_t address,
+    vm_size_t size
+);
+extern kern_return_t host_info(
+    host_t host,
+    int flavor,
+    host_info_t host_info,
+    unsigned int *host_info_count
+);
+extern vm_size_t vm_page_size;
+extern host_t host_self(void);
+extern int getpagesize(void);
+extern char *mach_error_string(int errnum);
+
+/* Malloc */
+extern void malloc_init(char *start, int size, int nodes);
+extern void *malloc(size_t size);
+extern void free(void *start);
+extern void *realloc(void *ptr, size_t size);
+
+extern void prf(
+       const char *fmt,
+       va_list ap,
+       void (*putfn_p)(),
+       void *putfn_arg
+);
+extern int strncasecmp(const char *s1, const char *s2, size_t n);
diff --git a/gen/libsa/mach.c b/gen/libsa/mach.c
new file mode 100644 (file)
index 0000000..53ef503
--- /dev/null
@@ -0,0 +1,100 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
+ * Reserved.  This file contains Original Code and/or Modifications of
+ * Original Code as defined in and that are subject to the Apple Public
+ * Source License Version 1.1 (the "License").  You may not use this file
+ * except in compliance with the License.  Please obtain a copy of the
+ * License at http://www.apple.com/publicsource and read it before using
+ * this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/* mach simulation */
+
+#import "libsa.h"
+
+port_t task_self_;
+
+char *mach_error_string(int errnum)
+{
+    extern char *strerror(int errnum);
+    
+    return strerror(errnum);
+}
+
+kern_return_t vm_allocate(
+    vm_task_t target_task,
+    vm_address_t *address,
+    vm_size_t size,
+    boolean_t anywhere
+)
+{
+    *address = (vm_address_t)malloc(size);
+    if (*address == 0)
+       return KERN_FAILURE;
+    else {
+       bzero(*address, size);
+       return KERN_SUCCESS;
+    }
+}
+
+kern_return_t vm_deallocate(
+    vm_task_t target_task,
+    vm_address_t address,
+    vm_size_t size
+)
+{
+    free((void *)address);
+    return KERN_SUCCESS;
+}
+
+vm_size_t vm_page_size = 8192;
+
+kern_return_t host_info(
+    host_t host,
+    int flavor,
+    host_info_t host_info,
+    unsigned int *host_info_count
+)
+{
+    host_basic_info_t hi = (host_basic_info_t) host_info;
+    
+    switch(flavor) {
+    case HOST_BASIC_INFO:
+       hi->max_cpus = 1;
+       hi->avail_cpus = 1;
+//     hi->memory_size = 
+//         (kernBootStruct->convmem +  kernBootStruct->extmem) * 1024;
+       hi->memory_size = 0;
+       hi->cpu_type = CPU_TYPE_I386;
+       hi->cpu_subtype = CPU_SUBTYPE_486;
+       break;
+    case HOST_PROCESSOR_SLOTS:
+       break;    
+    case HOST_SCHED_INFO:
+       break;
+    }
+    return KERN_SUCCESS;
+}
+
+host_t host_self(void)
+{
+    return 0;
+}
+
+int getpagesize(void)
+{
+    return vm_page_size;
+}
diff --git a/gen/libsa/malloc.c.00 b/gen/libsa/malloc.c.00
new file mode 100644 (file)
index 0000000..72e5ec3
--- /dev/null
@@ -0,0 +1,37 @@
+/*
+ * Copyright 1993 NeXT, Inc.
+ * All rights reserved.
+ *
+ * Malloc interface to zalloc.
+ */
+#import "libsa.h"
+
+int
+malloc_init(
+    char *start,
+    int size,
+    int nodes
+)
+{
+    return zinit(start,size,nodes);
+}
+
+void *malloc(size_t size)
+{
+    return zalloc(size);
+}
+
+/* This is the simplest way possible.  Should fix this. */
+void *realloc(void *start, size_t newsize)
+{
+    void *newstart = zalloc(newsize);
+    bcopy(start, newstart, newsize);
+    zfree(start);
+    return newstart;
+}
+
+void free(void *start)
+{
+    (void) zfree(start);
+}
diff --git a/gen/libsa/memcpy.c b/gen/libsa/memcpy.c
new file mode 100644 (file)
index 0000000..6bb9347
--- /dev/null
@@ -0,0 +1,74 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
+ * Reserved.  This file contains Original Code and/or Modifications of
+ * Original Code as defined in and that are subject to the Apple Public
+ * Source License Version 1.1 (the "License").  You may not use this file
+ * except in compliance with the License.  Please obtain a copy of the
+ * License at http://www.apple.com/publicsource and read it before using
+ * this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * more string operations
+ *
+ */
+#import "libsa.h"
+
+#if defined(NX_CURRENT_COMPILER_RELEASE) && (NX_CURRENT_COMPILER_RELEASE < 320)
+#define SIREG "e"
+#else
+#define SIREG "S"
+#endif
+
+#if i386 && !defined(DONT_USE_ASM)
+/* Simple forward character copy */
+void *memcpy(void *dst, const void *src, size_t len)
+{
+    asm("rep; movsb"
+       : /* no outputs */
+       : "&c" (len), "D" (dst), SIREG (src)
+       : "ecx", "esi", "edi");
+    return (void *)src;
+}
+#else
+void *memcpy(
+    void *dst,
+    const void *src,
+    size_t len
+)
+{
+       register char *src_c, *dst_c;
+       
+       src_c = (char *)src;
+       dst_c = (char *)dst;
+       
+       while (len-- > 0)
+               *dst_c++ = *src_c++;
+       return src;
+}
+#endif
+
+/*
+ * copy n bytes from src to dst. Both src and dst are virtual addresses.
+ */
+char *bcopy(char *src, char *dst, int n)
+{
+       memcpy(dst, src, n);
+       return 0;
+}
+
+
diff --git a/gen/libsa/memory.h b/gen/libsa/memory.h
new file mode 100644 (file)
index 0000000..d753fc8
--- /dev/null
@@ -0,0 +1,69 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
+ * Reserved.  This file contains Original Code and/or Modifications of
+ * Original Code as defined in and that are subject to the Apple Public
+ * Source License Version 1.1 (the "License").  You may not use this file
+ * except in compliance with the License.  Please obtain a copy of the
+ * License at http://www.apple.com/publicsource and read it before using
+ * this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/* memory addresses used by booter and friends */
+
+/* these are all "virtual" addresses...
+ * which are physical addresses plus MEMBASE.
+ */
+#define MEMBASE                0x0
+#define BASE_SEG       0x0
+
+/* these are virtual addresses */
+
+#define BIOS_ADDR              0x00C00         // BIOS buffer
+#define BIOS_LEN               0x02400         // 9k
+#define BOOTER_LOAD_ADDR       0x03000         // loaded here for compat.
+#define BOOTER_ADDR            0x03000         // start of booter code
+#define BOOTER_LEN             0x08000         // max of 32k
+#define STACK_ADDR             0x0FFF0
+#define BOOTSTRUCT_ADDR                0x11000
+#define BOOTSTRUCT_LEN         0x0F000         // it's slightly smaller
+#define EISA_CONFIG_ADDR       0x20000
+#define EISA_CONFIG_LEN                0x10000
+#define RLD_ADDR               0x30000
+#define RLD_LEN                        0x24000         // 140k
+#define ZALLOC_ADDR            0x54000
+#define ZALLOC_LEN             0x12000         // 72k
+#define MODULE_ADDR            0x66000
+#define RLD_MEM_ADDR           0x680000
+#define RLD_MEM_LEN            0x100000        // 1Mb
+#define KSYM_ADDR              0x780000
+#define KSYM_LEN               0x080000        // 512k
+
+/* these are physical values */
+
+//#define CONVENTIONAL_LEN     0xA0000         // 640k
+#define EXTENDED_ADDR          0x100000        // 1024k
+#define        KERNEL_BOOT_ADDR        0x100000        /* load at 1Mb */
+
+#define KERNEL_SYMBOL_OFFSET   0x100000        /* load at top - 1Mb */
+
+#define SAIO_TABLE_POINTER     (BOOTER_ADDR + SAIO_TABLE_PTR_OFFSET)
+#define SAIO_TABLE_PTR_OFFSET  0x30
+
+#define ptov(paddr)    ((paddr) - MEMBASE)
+#define vtop(vaddr)    ((vaddr) + MEMBASE)
+
+#define MIN_EXT_MEM_KB (7 * 1024)      /* 8 Mb minimum total */
diff --git a/gen/libsa/memset.c b/gen/libsa/memset.c
new file mode 100644 (file)
index 0000000..2abd6cf
--- /dev/null
@@ -0,0 +1,151 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
+ * Reserved.  This file contains Original Code and/or Modifications of
+ * Original Code as defined in and that are subject to the Apple Public
+ * Source License Version 1.1 (the "License").  You may not use this file
+ * except in compliance with the License.  Please obtain a copy of the
+ * License at http://www.apple.com/publicsource and read it before using
+ * this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/* Copyright (c) 1991 NeXT Computer, Inc.  All rights reserved.
+ *
+ *      File:   libc/i386/ansi/memset.c
+ *      Author: Bruce Martin, NeXT Computer, Inc.
+ *
+ *      This file contains machine dependent code for block compares
+ *      on NeXT i386-based products.  Currently tuned for the i486.
+ *
+ *     This code is loosely based on some work done by Mike DeMoney
+ *     for the m88k.
+ *
+ * HISTORY
+ * 14-Dec-93  Curtis Galloway
+ *     Modified for the booter; simplified simple_char_set.
+ *
+ * 14-Aug-92  Bruce Martin (Bruce_Martin@NeXT.COM)
+ *     Created.
+ */
+
+#define MIN_TO_ALIGN   32
+
+/*
+ * Convert a void * into a unsigned int so arithmetic can be done
+ * (Technically, the gnu C compiler is tolerant of arithmetic
+ * on void *, but ansi isn't; so we do this.)
+ */
+#define UNS(voidp)      ((unsigned int)(voidp))
+
+/*
+ * Number of bytes addr is past an object of 'align' size.
+ */
+#define BYTES_PAST_ALIGNMENT(voidp, align) \
+       (UNS(voidp) & (align - 1))
+
+/*
+ * Bytes moved by an unrolled loop
+ */
+#define LOOP_STRIDE(type, unroll)      ((unroll) * sizeof(type))
+
+
+/*
+ * Len modulo LOOP_STRIDE
+ */
+#define MODULO_LOOP_UNROLL(len, type, unroll)  \
+       ((len) & (LOOP_STRIDE(type, unroll) - 1) & ~(sizeof(type) - 1))
+
+
+/*
+ * Convert a void * + offset into char, short, int, or long long reference
+ * based at that address
+ */
+#define CHAR(voidp, offset)    (*(char *)(UNS(voidp) + (offset)))
+#define SHORT(voidp, offset)   (*(short *)(UNS(voidp) + (offset)))
+#define INT(voidp, offset)     (*(int *)(UNS(voidp) + (offset)))
+
+
+
+static inline void
+simple_char_set(char *dst, int val, int len)
+{
+    asm("rep; stosb"
+       : /* no outputs */
+       : "&c" (len), "D" (dst), "a" (val)
+       : "ecx", "edi", "eax");
+}
+
+
+
+void *memset(void *, int, unsigned long);
+
+int bzero(void *dst, unsigned long ulen)
+{
+    (void) memset(dst, 0, ulen);
+    return 0;
+}
+
+
+void *memset(void *dst, int val, unsigned long ulen)
+{
+    int len = ulen;
+    void *orig_dst = dst;
+    int need_to_set;
+    int alignment;
+
+    val |= (val << 8);
+    val |= (val << 16);
+
+    /* Always do a forward copy */
+
+    if (len < MIN_TO_ALIGN) {
+       simple_char_set(dst, val, len);
+       return orig_dst;
+    }
+
+    if (need_to_set = BYTES_PAST_ALIGNMENT(dst, 2 * sizeof(int))) {
+       need_to_set = (2 * sizeof(int)) - need_to_set;
+       simple_char_set(dst, val, need_to_set);
+       len -= need_to_set;
+       UNS(dst) += need_to_set;
+    }
+
+    alignment = MODULO_LOOP_UNROLL(len, int, 8);
+    UNS(dst) += alignment - LOOP_STRIDE(int, 8);
+    switch (alignment) {
+           do {
+                       INT(dst, 0) = val;
+        case 28:       INT(dst, 4) = val;
+        case 24:       INT(dst, 8) = val;
+        case 20:       INT(dst, 12) = val;
+        case 16:       INT(dst, 16) = val;
+        case 12:       INT(dst, 20) = val;
+        case 8:                INT(dst, 24) = val;
+        case 4:         INT(dst, 28) = val;
+        case 0:
+                       UNS(dst) += LOOP_STRIDE(int, 8);
+                       len -= LOOP_STRIDE(int, 8);
+           } while (len >= 0);
+       len &= sizeof(int) - 1;
+    }
+       
+    switch (len) {
+       case 3: CHAR(dst, 2) = val;
+       case 2: CHAR(dst, 1) = val;
+       case 1: CHAR(dst, 0) = val;
+    }
+
+    return orig_dst;
+}
diff --git a/gen/libsa/prf.c b/gen/libsa/prf.c
new file mode 100644 (file)
index 0000000..a9a74e5
--- /dev/null
@@ -0,0 +1,161 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
+ * Reserved.  This file contains Original Code and/or Modifications of
+ * Original Code as defined in and that are subject to the Apple Public
+ * Source License Version 1.1 (the "License").  You may not use this file
+ * except in compliance with the License.  Please obtain a copy of the
+ * License at http://www.apple.com/publicsource and read it before using
+ * this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/* 
+ * Mach Operating System
+ * Copyright (c) 1990 Carnegie-Mellon University
+ * Copyright (c) 1989 Carnegie-Mellon University
+ * Copyright (c) 1988 Carnegie-Mellon University
+ * Copyright (c) 1987 Carnegie-Mellon University
+ * All rights reserved.  The CMU software License Agreement specifies
+ * the terms and conditions for use and redistribution.
+ */
+/*
+ * Copyright (c) 1982, 1986 Regents of the University of California.
+ * All rights reserved.  The Berkeley software License Agreement
+ * specifies the terms and conditions for redistribution.
+ *
+ *     @(#)prf.c       7.1 (Berkeley) 6/5/86
+ */
+
+#include <sys/param.h>
+
+#define SPACE  1
+#define ZERO   2
+
+/*
+ * Scaled down version of C Library printf.
+ * Used to print diagnostic information directly on console tty.
+ * Since it is not interrupt driven, all system activities are
+ * suspended.
+ *
+ */
+
+/*
+ * Printn prints a number n in base b.
+ * We don't use recursion to avoid deep kernel stacks.
+ */
+static void
+printn(n, b, flag, minwidth, putfn_p, putfn_arg)
+       u_long n;
+       int b, flag, minwidth;
+       void (*putfn_p)();
+       void *putfn_arg;
+{
+       char prbuf[11];
+       register char *cp;
+       int width = 0, neg = 0;
+
+       if (b == 10 && (int)n < 0) {
+               neg = 1;
+               n = (unsigned)(-(int)n);
+       }
+       cp = prbuf;
+       do {
+               *cp++ = "0123456789abcdef"[n%b];
+               n /= b;
+               width++;
+       } while (n);
+       
+       if (neg) {
+               (*putfn_p)('-', putfn_arg);
+               width++;
+       }
+       while (width++ < minwidth)
+               (*putfn_p)( (flag & ZERO) ? '0' : ' ', putfn_arg);
+               
+       do
+               (*putfn_p)(*--cp, putfn_arg);
+       while (cp > prbuf);
+}
+
+void prf(
+       char *fmt,
+       unsigned int *adx,
+       void (*putfn_p)(),
+       void *putfn_arg
+)
+{
+       int b, c;
+       char *s;
+       int flag = 0, minwidth = 0, width = 0;
+
+loop:
+       while ((c = *fmt++) != '%') {
+               if(c == '\0')
+                       return;
+               (*putfn_p)(c, putfn_arg);
+       }
+again:
+       c = *fmt++;
+       switch (c) {
+       case 'l':
+               goto again;
+       case ' ':
+               flag |= SPACE;
+               goto again;
+       case '0':
+               if (minwidth == 0) {
+                   /* this is a flag */
+                   flag |= ZERO;
+                   goto again;
+               } /* fall through */
+       case '1':
+       case '2':
+       case '3':
+       case '4':
+       case '5':
+       case '6':
+       case '7':
+       case '8':
+       case '9':
+               minwidth *= 10;
+               minwidth += c - '0';
+               goto again;
+       case 'x': case 'X':
+               b = 16;
+               goto number;
+       case 'd':
+               b = 10;
+               goto number;
+       case 'o': case 'O':
+               b = 8;
+number:
+               printn((u_long)*adx, b, flag, minwidth, putfn_p, putfn_arg);
+               break;
+       case 's':
+               s = (char *)*adx;
+               while (c = *s++) {
+                       (*putfn_p)(c, putfn_arg);
+                       width++;
+               }
+               while (width++ < minwidth)
+                   (*putfn_p)(' ', putfn_arg);
+               break;
+       case 'c':
+               (*putfn_p)((char)*adx, putfn_arg);
+               break;
+       }
+       adx++;
+       goto loop;
+}
diff --git a/gen/libsa/setjmp.s b/gen/libsa/setjmp.s
new file mode 100644 (file)
index 0000000..90c1ae1
--- /dev/null
@@ -0,0 +1,57 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
+ * Reserved.  This file contains Original Code and/or Modifications of
+ * Original Code as defined in and that are subject to the Apple Public
+ * Source License Version 1.1 (the "License").  You may not use this file
+ * except in compliance with the License.  Please obtain a copy of the
+ * License at http://www.apple.com/publicsource and read it before using
+ * this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+#include <architecture/i386/asm_help.h>
+
+#define        O_EDI   0
+#define        O_ESI   4
+#define        O_EBX   8
+#define        O_EBP   12
+#define        O_ESP   16
+#define O_EIP  20
+
+LEAF(_setjmp, 0)
+X_LEAF(_set_label, _setjmp)
+       movl    4(%esp), %edx           // address of save area
+       movl    %edi, O_EDI(%edx)
+       movl    %esi, O_ESI(%edx)
+       movl    %ebx, O_EBX(%edx)
+       movl    %ebp, O_EBP(%edx)
+       movl    %esp, O_ESP(%edx)
+       movl    (%esp), %ecx            // %eip (return address)
+       movl    %ecx, O_EIP(%edx)
+       subl    %eax, %eax              // retval <- 0
+       ret
+
+LEAF(_longjmp, 0)
+X_LEAF(_jump_label, _longjmp)
+       movl    4(%esp), %edx           // address of save area
+       movl    O_EDI(%edx), %edi
+       movl    O_ESI(%edx), %esi
+       movl    O_EBX(%edx), %ebx
+       movl    O_EBP(%edx), %ebp
+       movl    O_ESP(%edx), %esp
+       movl    O_EIP(%edx), %eax       // %eip (return address)
+       movl    %eax, 0(%esp)
+       popl    %eax                    // ret addr != 0
+       jmp     *%eax                   // indirect
diff --git a/gen/libsa/sprintf.c b/gen/libsa/sprintf.c
new file mode 100644 (file)
index 0000000..6850ace
--- /dev/null
@@ -0,0 +1,74 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
+ * Reserved.  This file contains Original Code and/or Modifications of
+ * Original Code as defined in and that are subject to the Apple Public
+ * Source License Version 1.1 (the "License").  You may not use this file
+ * except in compliance with the License.  Please obtain a copy of the
+ * License at http://www.apple.com/publicsource and read it before using
+ * this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright 1993 NeXT, Inc.
+ * All rights reserved.
+ */
+
+#import "libsa.h"
+
+struct putc_info {
+    char *str;
+    char *last_str;
+};
+
+static void
+sputc(
+    int c,
+    struct putc_info *pi
+)
+{
+    if (pi->last_str)
+       if (pi->str == pi->last_str) {
+           *(pi->str) = '\0';
+           return;
+       }
+    *(pi->str)++ = c;
+}
+
+/*VARARGS1*/
+int sprintf(char *str, const char *fmt, ...)
+{
+    va_list ap;
+    struct putc_info pi;
+    
+    va_start(ap, fmt); 
+    pi.str = str;
+    pi.last_str = 0;
+    prf(fmt, ap, sputc, &pi);
+    *pi.str = '\0';
+    va_end(ap);
+    return 0;
+}
+
+/*VARARGS1*/
+int slvprintf(char *str, int len, const char *fmt, va_list ap )
+{
+    struct putc_info pi;
+    pi.str = str;
+    pi.last_str = str + len - 1;
+    prf(fmt, ap, sputc, &pi);
+    *pi.str = '\0';
+    return (pi.str - str);
+}
\ No newline at end of file
diff --git a/gen/libsa/string1.c b/gen/libsa/string1.c
new file mode 100644 (file)
index 0000000..6291112
--- /dev/null
@@ -0,0 +1,134 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
+ * Reserved.  This file contains Original Code and/or Modifications of
+ * Original Code as defined in and that are subject to the Apple Public
+ * Source License Version 1.1 (the "License").  You may not use this file
+ * except in compliance with the License.  Please obtain a copy of the
+ * License at http://www.apple.com/publicsource and read it before using
+ * this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/* string operations */
+#import "libsa.h"
+
+/*#if DONT_USE_GCC_BUILT_IN_STRLEN*/
+
+#define tolower(c)     ((int)((c) & ~0x20))
+#define toupper(c)     ((int)((c) | 0x20))
+
+int strlen(const char *s)
+{
+       int n;
+
+       n = 0;
+       while (*s++) n++;
+       return(n);
+}
+
+/*#endif*/
+
+int
+strcmp(const char *s1, const char *s2)
+{
+       while (*s1 && (*s1 == *s2)) {
+               s1++;
+               s2++;
+       }
+       return (*s1 - *s2);
+}
+
+int strncmp(const char *s1, const char *s2, size_t len)
+{
+       register int n = len;
+       while (--n >= 0 && *s1 == *s2++)
+               if (*s1++ == '\0')
+                       return(0);
+       return(n<0 ? 0 : *s1 - *--s2);
+}
+
+char *
+strcpy(char *s1, const char *s2)
+{
+       register char *ret = s1;
+       while (*s1++ = *s2++)
+               continue;
+       return ret;
+}
+
+char *
+strncpy(char *s1, const char *s2, size_t n)
+{
+       register char *ret = s1;
+       while (n && (*s1++ = *s2++))
+               n--;
+       if (!n) *s1=0;
+       return ret;
+}
+
+int
+ptol(char *str)
+{
+       register int c = *str;
+
+       if (c <= '7' && c >= '0')
+               c -= '0';
+       else if (c <= 'h' && c >= 'a')
+               c -= 'a';
+       else c = 0;
+       return c;
+}
+
+int
+atoi(const char *str)
+{
+       register int sum = 0;
+       while (*str == ' ' || *str == '\t')
+               str++;
+       while (*str >= '0' && *str <= '9') {
+               sum *= 10;
+               sum += *str++ - '0';
+       }
+       return sum;
+}
+
+
+char *strncat(char *s1, const char *s2, size_t n)
+{
+       register char *ret = s1;
+       while (*s1)
+               s1++;
+       while (n-- && *s2)
+               *s1++ = *s2++;
+       *s1 = '\0';
+       return ret;
+}
+
+char *strcat(char *s1, const char *s2)
+{
+       return(strncat(s1, s2, strlen(s2)));
+}
+
+#if STRNCASECMP
+int strncasecmp(const char *s1, const char *s2, size_t len)
+{
+       register int n = len;
+       while (--n >= 0 && tolower(*s1) == tolower(*s2++))
+               if (*s1++ == '\0')
+                       return(0);
+       return(n<0 ? 0 : tolower(*s1) - tolower(*--s2));
+}
+#endif
+
diff --git a/gen/libsa/string2.c b/gen/libsa/string2.c
new file mode 100644 (file)
index 0000000..ba525c7
--- /dev/null
@@ -0,0 +1,74 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
+ * Reserved.  This file contains Original Code and/or Modifications of
+ * Original Code as defined in and that are subject to the Apple Public
+ * Source License Version 1.1 (the "License").  You may not use this file
+ * except in compliance with the License.  Please obtain a copy of the
+ * License at http://www.apple.com/publicsource and read it before using
+ * this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * more string operations
+ *
+ */
+#import "libsa.h"
+
+
+#if i386 && !defined(DONT_USE_ASM)
+void *memset(void *dst, int val, size_t len)
+{
+    asm("rep; stosb"
+       : /* no outputs */
+       : "&c" (len), "D" (dst), "a" (val)
+       : "ecx", "esi", "eax");
+    return dst;
+}
+/* Simple forward character copy */
+void *memcpy(void *dst, const void *src, size_t len)
+{
+    asm("rep; movsb"
+       : /* no outputs */
+       : "&c" (len), "D" (dst), "e" (src)
+       : "ecx", "esi", "edi");
+    return src;
+}
+#else
+void *memset(void *p, int val, size_t len)
+{
+       register char *ptr = (char *)p;
+       while (len-- > 0) *ptr++ = val;
+       return p;
+}
+
+void *memcpy(
+    void *dst,
+    const void *src,
+    size_t len
+)
+{
+       register char *src_c, *dst_c;
+       
+       src_c = (char *)src;
+       dst_c = (char *)dst;
+       
+       while (len-- > 0)
+               *dst_c++ = *src_c++;
+       return src;
+}
+#endif
+
diff --git a/gen/libsa/strtol.c b/gen/libsa/strtol.c
new file mode 100644 (file)
index 0000000..2cf2b23
--- /dev/null
@@ -0,0 +1,257 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
+ * Reserved.  This file contains Original Code and/or Modifications of
+ * Original Code as defined in and that are subject to the Apple Public
+ * Source License Version 1.1 (the "License").  You may not use this file
+ * except in compliance with the License.  Please obtain a copy of the
+ * License at http://www.apple.com/publicsource and read it before using
+ * this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*-
+ * Copyright (c) 1990 The Regents of the University of California.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+/* Modified by Curtis Galloway at NeXT June 1993,
+ * for use in the standalone library.
+ */
+#if defined(LIBC_SCCS) && !defined(lint)
+static char sccsid[] = "@(#)strtol.c   5.4 (Berkeley) 2/23/91";
+#endif /* LIBC_SCCS and not lint */
+
+#include <limits.h>
+#include <errno.h>
+//#include <stdlib.h>
+#import "libsa.h"
+
+#import "ctype.h"
+
+
+/* Fudge here -- to save space, make strtol and strtoul do the same
+ * conversion.  If you really need that extra range on strtoul, too bad.
+ */
+
+#define SIGNED                 1
+#define UNSIGNED       0 
+
+
+/*
+ * Convert a string to a long integer.
+ *
+ * Ignores `locale' stuff.  Assumes that the upper and lower case
+ * alphabets and digits are each contiguous.
+ */
+static long
+actual_strtol(
+    const char *nptr,
+    char **endptr,
+    register int base,
+    int is_signed
+)
+{
+       register const char *s = nptr;
+       register unsigned long acc;
+       register int c;
+       register unsigned long cutoff;
+       register int neg = 0, any, cutlim;
+
+       /*
+        * Skip white space and pick up leading +/- sign if any.
+        * If base is 0, allow 0x for hex and 0 for octal, else
+        * assume decimal; if base is already 16, allow 0x.
+        */
+       do {
+               c = *s++;
+       } while (isspace(c));
+       if (is_signed && c == '-') {
+               neg = 1;
+               c = *s++;
+       } else if (c == '+')
+               c = *s++;
+       if ((base == 0 || base == 16) &&
+           c == '0' && (*s == 'x' || *s == 'X')) {
+               c = s[1];
+               s += 2;
+               base = 16;
+       }
+       if (base == 0)
+               base = c == '0' ? 8 : 10;
+
+       /*
+        * Compute the cutoff value between legal numbers and illegal
+        * numbers.  That is the largest legal value, divided by the
+        * base.  An input number that is greater than this value, if
+        * followed by a legal input character, is too big.  One that
+        * is equal to this value may be valid or not; the limit
+        * between valid and invalid numbers is then based on the last
+        * digit.  For instance, if the range for longs is
+        * [-2147483648..2147483647] and the input base is 10,
+        * cutoff will be set to 214748364 and cutlim to either
+        * 7 (neg==0) or 8 (neg==1), meaning that if we have accumulated
+        * a value > 214748364, or equal but the next digit is > 7 (or 8),
+        * the number is too big, and we will return a range error.
+        *
+        * Set any if any `digits' consumed; make it negative to indicate
+        * overflow.
+        */
+       cutoff = neg ? -(unsigned long)LONG_MIN : LONG_MAX;
+       cutlim = cutoff % (unsigned long)base;
+       cutoff /= (unsigned long)base;
+       for (acc = 0, any = 0;; c = *s++) {
+               if (isdigit(c))
+                       c -= '0';
+               else if (isalpha(c))
+                       c -= isupper(c) ? 'A' - 10 : 'a' - 10;
+               else
+                       break;
+               if (c >= base)
+                       break;
+               if (any < 0 || acc > cutoff || acc == cutoff && c > cutlim)
+                       any = -1;
+               else {
+                       any = 1;
+                       acc *= base;
+                       acc += c;
+               }
+       }
+       if (any < 0) {
+               acc = neg ? LONG_MIN : LONG_MAX;
+               errno = ERANGE;
+       } else if (neg)
+               acc = -acc;
+       if (endptr != 0)
+               *endptr = any ? s - 1 : (char *)nptr;
+       return (acc);
+}
+
+long
+strtol(
+    const char *nptr,
+    char **endptr,
+    register int base
+)
+{
+    return actual_strtol(nptr, endptr, base, SIGNED);
+}
+
+unsigned long
+strtoul(
+    const char *nptr,
+    char **endptr,
+    register int base
+)
+{
+    return actual_strtol(nptr, endptr, base, UNSIGNED);
+}
+
+#if notdef
+/*
+ * Convert a string to an unsigned long integer.
+ *
+ * Ignores `locale' stuff.  Assumes that the upper and lower case
+ * alphabets and digits are each contiguous.
+ */
+unsigned long
+strtoul(nptr, endptr, base)
+       const char *nptr;
+       char **endptr;
+       register int base;
+{
+       register const char *s = nptr;
+       register unsigned long acc;
+       register int c;
+       register unsigned long cutoff;
+       register int neg = 0, any, cutlim;
+
+       /*
+        * See strtol for comments as to the logic used.
+        */
+       do {
+               c = *s++;
+       } while (isspace(c));
+       if (c == '-') {
+               neg = 1;
+               c = *s++;
+       } else if (c == '+')
+               c = *s++;
+       if ((base == 0 || base == 16) &&
+           c == '0' && (*s == 'x' || *s == 'X')) {
+               c = s[1];
+               s += 2;
+               base = 16;
+       }
+       if (base == 0)
+               base = c == '0' ? 8 : 10;
+       cutoff = (unsigned long)ULONG_MAX / (unsigned long)base;
+       cutlim = (unsigned long)ULONG_MAX % (unsigned long)base;
+       for (acc = 0, any = 0;; c = *s++) {
+               if (isdigit(c))
+                       c -= '0';
+               else if (isalpha(c))
+                       c -= isupper(c) ? 'A' - 10 : 'a' - 10;
+               else
+                       break;
+               if (c >= base)
+                       break;
+               if (any < 0 || acc > cutoff || acc == cutoff && c > cutlim)
+                       any = -1;
+               else {
+                       any = 1;
+                       acc *= base;
+                       acc += c;
+               }
+       }
+       if (any < 0) {
+               acc = ULONG_MAX;
+               errno = ERANGE;
+       } else if (neg)
+               acc = -acc;
+       if (endptr != 0)
+               *endptr = any ? s - 1 : (char *)nptr;
+       return (acc);
+}
+
+#endif notdef
diff --git a/gen/libsa/zalloc.c b/gen/libsa/zalloc.c
new file mode 100644 (file)
index 0000000..d0dce72
--- /dev/null
@@ -0,0 +1,246 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
+ * Reserved.  This file contains Original Code and/or Modifications of
+ * Original Code as defined in and that are subject to the Apple Public
+ * Source License Version 1.1 (the "License").  You may not use this file
+ * except in compliance with the License.  Please obtain a copy of the
+ * License at http://www.apple.com/publicsource and read it before using
+ * this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright 1993 NeXT Computer, Inc.
+ * All rights reserved.
+ *
+ * Sam's simple memory allocator.
+ *
+ */
+
+#import "libsa.h"
+#import "memory.h"
+#import "zalloc.h"
+
+#define ZDEBUG 0
+
+#if ZDEBUG
+int zout;
+#endif
+
+typedef struct {
+       char *start;
+       int size;
+} zmem;
+
+static zmem *zalloced;
+static zmem *zavailable;
+static short availableNodes, allocedNodes, totalNodes;
+static char *zalloc_base;
+
+static void zallocate(char *start,int size);
+static void zinsert(zmem *zp, int ndx);
+static void zdelete(zmem *zp, int ndx);
+static void zcoalesce(void);
+
+
+// define the block of memory that the allocator will use
+void malloc_init(char *start, int size, int nodes)
+{
+       zalloc_base = start;
+       totalNodes = nodes;
+       zalloced = (zmem *)zalloc_base;
+       start += sizeof(zmem) * nodes;
+       zavailable = (zmem *)start;
+       start += sizeof(zmem) * nodes;
+       zavailable[0].start = start;
+       zavailable[0].size = size;
+       availableNodes = 1;
+       allocedNodes = 0;
+}
+
+void * malloc(size_t size)
+{
+       int i;
+       char *ret = 0;
+#if 0
+       extern char     _DATA__end;
+#endif
+       if (!zalloc_base)
+       {
+               // this used to follow the bss but some bios' corrupted it...
+               malloc_init((char *)ZALLOC_ADDR, ZALLOC_LEN, ZALLOC_NODES);
+       }
+
+       size = ((size + 0xf) & ~0xf);
+       for (i=0; i<availableNodes; i++)
+       {
+               // uses first possible node, doesn't try to find best fit
+               if (zavailable[i].size == size)
+               {
+                       zallocate(ret = zavailable[i].start, size);
+                       zdelete(zavailable, i); availableNodes--;
+                       goto done;
+               }
+               else if (zavailable[i].size > size)
+               {
+                       zallocate(ret = zavailable[i].start, size);
+                       zavailable[i].start += size;
+                       zavailable[i].size -= size;
+                       goto done;
+               }
+       }
+
+done:
+#if 0
+/*     if (ret + size >= (char*)_sp()) _stop("stack clobbered"); */
+       if (ret + size >= (char *)(ZALLOC_ADDR + ZALLOC_LEN))
+               _stop("Out of memory");
+#endif
+       if (ret != 0)
+               bzero(ret, size);
+       return (void *)ret;
+}
+
+void
+free(void *pointer)
+{
+       int i, tsize, found = 0;
+       char *start = pointer;
+
+       if (!start) return;
+
+       for (i=0; i<allocedNodes; i++)
+       {
+               if (zalloced[i].start == start)
+               {
+                       tsize = zalloced[i].size;
+#if ZDEBUG
+                       zout -= tsize;
+                       printf("    zz out %d\n",zout);
+#endif
+                       zdelete(zalloced, i); allocedNodes--;
+                       found = 1;
+                       break;
+               }
+       }
+       if (!found) return;
+
+       for (i=0; i<availableNodes; i++)
+       {
+               if ((start+tsize) == zavailable[i].start)  // merge it in
+               {
+                       zavailable[i].start = start;
+                       zavailable[i].size += tsize;
+                       zcoalesce();
+                       return;
+               }
+
+               if (i>0 && (zavailable[i-1].start + zavailable[i-1].size == 
+                                                                   start))
+               {
+                       zavailable[i-1].size += tsize;
+                       zcoalesce();
+                       return;
+               }
+
+               if ((start+tsize) < zavailable[i].start)
+               {
+                       zinsert(zavailable, i); availableNodes++;
+                       zavailable[i].start = start;
+                       zavailable[i].size = tsize;
+                       return;
+               }
+       }
+
+       zavailable[i].start = start;
+       zavailable[i].size = tsize;
+       availableNodes++;
+       zcoalesce();
+       return;
+}
+
+
+static void
+zallocate(char *start,int size)
+{
+#if ZDEBUG
+       zout += size;
+       printf("    alloc %d, total 0x%x\n",size,zout);
+#endif
+       zalloced[allocedNodes].start = start;
+       zalloced[allocedNodes].size = size;
+       allocedNodes++;
+}
+
+static void
+zinsert(zmem *zp, int ndx)
+{
+       int i;
+       zmem *z1, *z2;
+
+       i=totalNodes-2;
+       z1 = zp + i;
+       z2 = z1+1;
+
+       for (; i>= ndx; i--, z1--, z2--)
+       {
+               z2->start = z1->start;
+               z2->size = z1->size;
+       }
+}
+
+static void
+zdelete(zmem *zp, int ndx)
+{
+       int i;
+       zmem *z1, *z2;
+
+       z1 = zp + ndx;
+       z2 = z1+1;
+
+       for (i=ndx; i<totalNodes-1; i++, z1++, z2++)
+       {
+               z1->start = z2->start;
+               z1->size = z2->size;
+       }
+}
+
+static void
+zcoalesce(void)
+{
+       int i;
+       for (i=0; i<availableNodes-1; i++)
+       {
+               if (zavailable[i].start + zavailable[i].size == 
+                                               zavailable[i+1].start)
+               {
+                       zavailable[i].size += zavailable[i+1].size;
+                       zdelete(zavailable, i+1); availableNodes--;
+                       return;
+               }
+       }       
+}
+
+/* This is the simplest way possible.  Should fix this. */
+void *realloc(void *start, size_t newsize)
+{
+    void *newstart = malloc(newsize);
+    bcopy(start, newstart, newsize);
+    free(start);
+    return newstart;
+}
+
+
diff --git a/gen/libsa/zalloc.h b/gen/libsa/zalloc.h
new file mode 100644 (file)
index 0000000..b4dd0a9
--- /dev/null
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
+ * Reserved.  This file contains Original Code and/or Modifications of
+ * Original Code as defined in and that are subject to the Apple Public
+ * Source License Version 1.1 (the "License").  You may not use this file
+ * except in compliance with the License.  Please obtain a copy of the
+ * License at http://www.apple.com/publicsource and read it before using
+ * this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/* The default number of nodes that the allocater will use */
+
+#define ZALLOC_NODES   128
\ No newline at end of file
diff --git a/gen/libsaio/cache.c b/gen/libsaio/cache.c
new file mode 100644 (file)
index 0000000..0f978cc
--- /dev/null
@@ -0,0 +1,94 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
+ * Reserved.  This file contains Original Code and/or Modifications of
+ * Original Code as defined in and that are subject to the Apple Public
+ * Source License Version 1.1 (the "License").  You may not use this file
+ * except in compliance with the License.  Please obtain a copy of the
+ * License at http://www.apple.com/publicsource and read it before using
+ * this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/* cache */
+
+#import "cache.h"
+#import "libsa.h"
+
+cache_t *cacheInit(
+    int nitems,
+    int item_size
+)
+{
+    cache_t *cp;
+    item_size += sizeof(item_t);
+    cp = (cache_t *)malloc(sizeof(cache_t) + nitems * item_size);
+    cp->nitems = nitems;
+    cp->item_size = item_size;
+    return cp;
+}
+
+/*
+ * Either find an item in the cache, or find where it should go.
+ * Returns 1 if found, 0 if not found.
+ * This function assumes that if you find an empty slot, you will use it;
+ * therefore, empty slots returned are marked valid.
+ */
+int cacheFind(
+    cache_t *cp,
+    int key1,
+    int key2,
+    char **ip
+)
+{
+    item_t *iip, *min_p;
+    int i,j;
+    
+    for(i=j=0, iip = min_p = (item_t *)cp->storage; i < cp->nitems; i++) {
+       if (iip->referenced && (iip->key1 == key1) && (iip->key2 == key2)) {
+           *ip = iip->storage;
+           if (iip->referenced < 65535)
+               iip->referenced++;
+           return 1;
+       }
+       if (iip->referenced < min_p->referenced) {
+           min_p = iip;
+           j = i;
+       }
+       iip = (item_t *)((char *)iip + cp->item_size);
+    }
+    *ip = min_p->storage;
+    min_p->referenced = 1;
+    min_p->key1 = key1;
+    min_p->key2 = key2;
+    return 0;
+}
+
+/*
+ * Flush the cache.
+ */
+void cacheFlush(
+    cache_t *cp
+)
+{
+    int i;
+    item_t *ip;
+    
+    if (cp == 0)
+       return;
+    for(i=0, ip = (item_t *)cp->storage; i < cp->nitems; i++) {
+       ip->referenced = 0;
+       ip = (item_t *)((char *)ip + cp->item_size);
+    }
+}
diff --git a/gen/libsaio/cache.h b/gen/libsaio/cache.h
new file mode 100644 (file)
index 0000000..193974f
--- /dev/null
@@ -0,0 +1,51 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
+ * Reserved.  This file contains Original Code and/or Modifications of
+ * Original Code as defined in and that are subject to the Apple Public
+ * Source License Version 1.1 (the "License").  You may not use this file
+ * except in compliance with the License.  Please obtain a copy of the
+ * License at http://www.apple.com/publicsource and read it before using
+ * this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+
+typedef struct cache_item {
+    unsigned int       referenced;
+    int                        key1, key2;
+    char               storage[0];
+} item_t;
+
+typedef struct cache {
+    int                        nitems;
+    int                        item_size;
+    char               storage[0];
+} cache_t;
+
+extern cache_t *cacheInit(
+    int nitems,
+    int item_size
+);
+
+extern int cacheFind(
+    cache_t *cp,
+    int key1,
+    int key2,
+    char **ip
+);
+
+extern void cacheFlush(
+    cache_t *cp
+);
diff --git a/gen/libsaio/disk.c b/gen/libsaio/disk.c
new file mode 100644 (file)
index 0000000..77bbba0
--- /dev/null
@@ -0,0 +1,300 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
+ * Reserved.  This file contains Original Code and/or Modifications of
+ * Original Code as defined in and that are subject to the Apple Public
+ * Source License Version 1.1 (the "License").  You may not use this file
+ * except in compliance with the License.  Please obtain a copy of the
+ * License at http://www.apple.com/publicsource and read it before using
+ * this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/* 
+ * Mach Operating System
+ * Copyright (c) 1990 Carnegie-Mellon University
+ * Copyright (c) 1989 Carnegie-Mellon University
+ * All rights reserved.  The CMU software License Agreement specifies
+ * the terms and conditions for use and redistribution.
+ */
+
+/*
+ *                     INTEL CORPORATION PROPRIETARY INFORMATION
+ *
+ *     This software is supplied under the terms of a license  agreement or 
+ *     nondisclosure agreement with Intel Corporation and may not be copied 
+ *     nor disclosed except in accordance with the terms of that agreement.
+ *
+ *     Copyright 1988, 1989 Intel Corporation
+ */
+
+/*
+ * Copyright 1993 NeXT Computer, Inc.
+ * All rights reserved.
+ */
+
+#define DRIVER_PRIVATE
+
+#import "sys/types.h"
+#import <bsd/dev/disk.h>
+#import <bsd/dev/i386/disk.h>
+#import "libsaio.h"
+#import "memory.h"
+
+static Biosread(int biosdev, int secno);
+static read_label(char *name, int biosdev, daddr_t *boff, int partition);
+void diskActivityHook(void);
+extern void spinActivityIndicator(void);
+
+/* diskinfo unpacking */
+#define        SPT(di)         ((di)&0xff)
+#define        HEADS(di)       ((((di)>>8)&0xff)+1)
+#define        SPC(di)         (SPT(di)*HEADS(di))
+#define BPS            512     /* sector size of the device */
+#define N_CACHE_SECS   (BIOS_LEN / BPS)
+
+#define        DOS_BSIZE       512
+#define DISKLABEL      15      /* sector num of disk label */
+
+char *devsw[] = {
+       "sd",
+       "hd",
+       "fd",
+       NULL
+};
+
+struct diskinfo {
+       int     spt;                    /* sectors per track */
+       int     spc;                    /* sectors per cylinder */
+} diskinfo;
+
+char   *b[NBUFS];
+daddr_t        blknos[NBUFS];
+struct iob iob[NFILES];
+int label_secsize;
+static int label_cached;
+
+// intbuf is the whole buffer, biosbuf is the current cached sector
+static char * const intbuf = (char *)ptov(BIOS_ADDR);
+char *biosbuf;
+
+void
+devopen(name, io)
+       char            * name;
+       struct iob      * io;
+{
+       long    di;
+
+       di = get_diskinfo(io->biosdev);
+
+       /* initialize disk parameters -- spt and spc */
+       io->i_error = 0;
+       io->dirbuf_blkno = -1;
+
+       diskinfo.spt = SPT(di);
+       diskinfo.spc = diskinfo.spt * HEADS(di);
+       if (read_label(name, io->biosdev, &io->i_boff, io->partition) < 0)
+       {
+               io->i_error = EIO;
+       }
+}
+
+void devflush()
+{
+       Biosread(0,-1);
+}
+
+
+int devread(io)
+       struct iob *io;
+{
+       long sector;
+       int offset;
+       int dev;
+
+       io->i_flgs |= F_RDDATA;
+
+       /* assume the best */
+       io->i_error = 0;
+
+       dev = io->i_ino.i_dev;
+
+       sector = io->i_bn * (label_secsize/DOS_BSIZE);
+
+       for (offset = 0; offset < io->i_cc; offset += BPS) {
+
+               io->i_error = Biosread(io->biosdev, sector);
+               if (io->i_error) {
+                       return(-1);
+               }
+
+               /* copy 1 sector from the internal buffer biosbuf into buf */
+               bcopy(biosbuf, &io->i_ma[offset], BPS);
+
+               sector++;
+       }
+
+       io->i_flgs &= ~F_TYPEMASK;
+       return (io->i_cc);
+}
+
+/* A haque: Biosread(0,-1) means flush the sector cache.
+ */
+static int
+Biosread(int biosdev, int secno)
+{
+       static int xbiosdev, xcyl=-1, xhead, xsec, xnsecs;
+
+       int     rc;
+       int     cyl, head, sec;
+       int     spt, spc;
+       int tries = 0;
+
+       if (biosdev == 0 && secno == -1) {
+           xcyl = -1;
+           label_cached = 0;
+           return 0;
+       }
+       spt = diskinfo.spt;
+       spc = diskinfo.spc;
+
+       cyl = secno / spc;
+       head = (secno % spc) / spt;
+       sec = secno % spt;
+
+       if (biosdev == xbiosdev && cyl == xcyl && head == xhead &&
+               sec >= xsec && sec < (xsec + xnsecs))
+       {       // this sector is in intbuf cache
+               biosbuf = intbuf + (BPS * (sec-xsec));
+               return 0;
+       }
+
+       xcyl = cyl;
+       label_cached = 1;
+       xhead = head;
+       xsec = sec;
+       xbiosdev = biosdev;
+       xnsecs = ((sec + N_CACHE_SECS) > spt) ? (spt - sec) : N_CACHE_SECS;
+       biosbuf = intbuf;
+
+       while ((rc = biosread(biosdev,cyl,head,sec, xnsecs)) && (++tries < 5))
+       {
+#ifndef        SMALL
+               error("    biosread error 0x%x @ %d, C:%d H:%d S:%d\n",
+                       rc, secno, cyl, head, sec);
+#endif
+               sleep(1);       // on disk errors, bleh!
+       }
+       diskActivityHook();
+       return rc;
+}
+
+// extern char name[];
+
+#ifndef        SMALL
+static int
+read_label(
+       char            *name,
+       int             biosdev, 
+       daddr_t         *boff,
+       int             partition
+)
+{
+       struct disk_label       *dlp;
+       struct fdisk_part       *fd;
+       struct disk_blk0        *blk0;
+       char                    *cp;
+       int                     n, rc;
+       int                     part_offset = 0;
+       static int              cached_boff;
+
+       if (label_cached) {
+               *boff = cached_boff;
+               return 0;
+       }
+
+       // read sector 0 into the internal buffer "biosbuf"
+       if ( rc = Biosread(biosdev, 0) )
+               return -1;
+
+       // Check for a valid boot block.
+       blk0 = (struct disk_blk0 *)biosbuf;
+       if (blk0->signature == DISK_SIGNATURE) {
+           // Check to see if the disk has been partitioned with FDISK
+           // to allow DOS and ufs filesystems to exist on the same spindle.
+           fd = (struct fdisk_part *)blk0->parts;    
+           for (       n = 0; n < FDISK_NPART; n++, fd++)
+                   if (fd->systid == FDISK_NEXTNAME)
+                   {
+                           part_offset = fd->relsect;
+                           break;
+                   }
+       }
+       /* It's not an error if there is not a valid boot block. */
+
+       /* Read the NeXT disk label.
+        * Since we can't count on it fitting in the sector cache,
+        * we'll put it elsewhere.
+        */
+       dlp = (struct disk_label *)malloc(sizeof(*dlp) + BPS);
+       for(n = 0, cp = (char *)dlp;
+               n < ((sizeof(*dlp) + BPS - 1) / BPS);
+               n++, cp += BPS) {
+           if (rc = Biosread(biosdev, DISKLABEL + part_offset + n))
+               goto error;
+           bcopy(biosbuf, cp, BPS);
+       }
+       
+       byte_swap_disklabel_in(dlp);
+       
+       /* Check label */
+       
+       if (dlp->dl_version != DL_V3) {
+               error("bad disk label magic\n");
+               goto error;
+       }
+           
+       label_secsize = dlp->dl_secsize;
+       
+       if ((dlp->dl_part[partition].p_base) < 0) {
+               error("no such partition\n");
+               goto error;
+       }
+
+       *boff = cached_boff = dlp->dl_front + dlp->dl_part[partition].p_base;
+
+       if (!strcmp(name,"$LBL")) strcpy(name, dlp->dl_bootfile);
+
+       free((char *)dlp);
+       return 0;
+error:
+       free((char *)dlp);
+       return -1;
+}
+
+#endif SMALL
+
+
+/* replace this function if you want to change
+ * the way disk activity is indicated to the user.
+ */
+void
+diskActivityHook(void)
+{
+    spinActivityIndicator();
+}
+
+
+
diff --git a/gen/libsaio/errorV.c b/gen/libsaio/errorV.c
new file mode 100644 (file)
index 0000000..231c7ec
--- /dev/null
@@ -0,0 +1,45 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
+ * Reserved.  This file contains Original Code and/or Modifications of
+ * Original Code as defined in and that are subject to the Apple Public
+ * Source License Version 1.1 (the "License").  You may not use this file
+ * except in compliance with the License.  Please obtain a copy of the
+ * License at http://www.apple.com/publicsource and read it before using
+ * this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright 1993 NeXT, Inc.
+ * All rights reserved.
+ */
+
+#import "libsa.h"
+#import "saio_types.h"
+#import "saio.h"
+#import "libsaio.h"
+#import "language.h"
+
+BOOL errors;
+
+int errorV(const char *format, va_list ap)
+{
+    char *val;
+    
+    val = 0;
+    errors = 1;
+    prf(format, ap, putchar, 0);
+    return 0;
+}
diff --git a/gen/libsaio/gets.c b/gen/libsaio/gets.c
new file mode 100644 (file)
index 0000000..5fdc758
--- /dev/null
@@ -0,0 +1,120 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
+ * Reserved.  This file contains Original Code and/or Modifications of
+ * Original Code as defined in and that are subject to the Apple Public
+ * Source License Version 1.1 (the "License").  You may not use this file
+ * except in compliance with the License.  Please obtain a copy of the
+ * License at http://www.apple.com/publicsource and read it before using
+ * this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright 1993, NeXT Computer Inc.
+ * All rights reserved.
+ */
+
+#import "libsaio.h"
+
+int gets(char *buf);
+
+/*
+ * return a string in buf iff typing is begun within timeout units
+ */
+int 
+Gets(
+    char *buf,
+    int timeout,
+    char *prompt,
+    char *message
+)
+{
+       int     ch = 0;
+       int     next_second;
+
+       printf("%s",prompt);
+       if (message)
+           printf("%s",message);
+       if (timeout) {
+#if 0
+           printf("[");
+           for (i = 0; i < timeout; i++)
+               putchar('-');
+           printf("]\b\b");
+#endif
+               
+           for(next_second = time18() + 18; timeout; ) {
+               if (ch = readKeyboardStatus()) {
+                   break;
+               }
+               if (time18() >= next_second) {
+                   next_second += 18;
+                   timeout--;
+#if 0
+                   printf(" \b\b");
+#endif
+               }
+           }
+#if 0
+           putchar('\r');
+           printf("%s",prompt);
+           for (i = 0; i < strlen(message) + orig_timeout + 4; i++)
+               putchar(' ');
+           putchar('\r');
+           printf("%s",prompt);
+#endif
+    
+           if (ch == 0) {
+               printf("\n");
+               return 0;
+           }
+       }
+       return(gets(buf));
+}
+
+int
+gets(
+    char *buf
+)
+{
+       char *lp;
+       int c;
+
+       lp = buf;
+       for (;;) {
+               c = getchar() & 0x7f;
+               if (c < ' ' && c != '\n' && c != '\b') c = 0;
+               if (c == 0x7f) c = '\b';
+
+               switch(c) {
+               case '\0':
+                       continue;
+               case '\n':
+                       *lp++ = '\0';
+                       putchar('\n');
+                       return 1;
+               case '\b':
+                       if (lp > buf) {
+                               lp--;
+                               putchar('\b');
+                               putchar(' ');
+                               putchar('\b');
+                       }
+                       continue;
+               default:
+                       *lp++ = c;
+               }
+       }
+}
diff --git a/gen/libsaio/localPrintf.c b/gen/libsaio/localPrintf.c
new file mode 100644 (file)
index 0000000..b9b6ad8
--- /dev/null
@@ -0,0 +1,57 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
+ * Reserved.  This file contains Original Code and/or Modifications of
+ * Original Code as defined in and that are subject to the Apple Public
+ * Source License Version 1.1 (the "License").  You may not use this file
+ * except in compliance with the License.  Please obtain a copy of the
+ * License at http://www.apple.com/publicsource and read it before using
+ * this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright 1993 NeXT Computer, Inc.
+ * All rights reserved.
+ */
+
+#ifdef SAIO_INTERNAL_USER
+#undef SAIO_INTERNAL_USER
+#endif
+#import "libsa.h"
+#import "saio_types.h"
+#import "saio.h"
+#import "libsaio.h"
+
+
+int localPrintf(const char *format, ...)
+{
+    va_list ap;
+    char *val;
+    
+    val = 0;
+    va_start(ap, format);
+    localVPrintf(format, ap);
+    va_end(ap);
+    return 0;
+}
+
+int error(const char *format, ...)
+{
+    va_list ap;
+    va_start(ap, format);
+    errorV(format, ap);
+    va_end(ap);
+    return(0);
+}
diff --git a/gen/libsaio/localVPrintf.c b/gen/libsaio/localVPrintf.c
new file mode 100644 (file)
index 0000000..e6ce692
--- /dev/null
@@ -0,0 +1,52 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
+ * Reserved.  This file contains Original Code and/or Modifications of
+ * Original Code as defined in and that are subject to the Apple Public
+ * Source License Version 1.1 (the "License").  You may not use this file
+ * except in compliance with the License.  Please obtain a copy of the
+ * License at http://www.apple.com/publicsource and read it before using
+ * this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright 1993 NeXT Computer, Inc.
+ * All rights reserved.
+ */
+
+#import "libsa.h"
+#import "saio_types.h"
+#import "saio.h"
+#import "libsaio.h"
+#import "language.h"
+
+
+int localVPrintf(const char *format, va_list ap)
+{
+    char *val;
+    
+    val = 0;
+    if (LanguageConfig) {
+       if (val = (char *)newStringForStringTableKey(LanguageConfig,
+                                                    (char *)format)) {
+           format = val;
+       }
+    }
+    prf(format, ap, putchar, 0);
+    if (val) {
+       free(val);
+    }
+    return 0;
+}
diff --git a/gen/libsaio/printf.c b/gen/libsaio/printf.c
new file mode 100644 (file)
index 0000000..f282f6e
--- /dev/null
@@ -0,0 +1,39 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
+ * Reserved.  This file contains Original Code and/or Modifications of
+ * Original Code as defined in and that are subject to the Apple Public
+ * Source License Version 1.1 (the "License").  You may not use this file
+ * except in compliance with the License.  Please obtain a copy of the
+ * License at http://www.apple.com/publicsource and read it before using
+ * this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/* Standalone I/O stubs. */
+
+#import "libsa.h"
+#import "saio_types.h"
+#import "saio.h"
+#import "libsaio.h"
+
+int printf(const char *format, ...)
+{
+    va_list ap;
+    va_start(ap, format);
+    prf(format, ap, putchar, 0);
+    va_end(ap);
+    return 0;
+}
+
diff --git a/gen/libsaio/reallyPrint.c b/gen/libsaio/reallyPrint.c
new file mode 100644 (file)
index 0000000..b47ad07
--- /dev/null
@@ -0,0 +1,46 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
+ * Reserved.  This file contains Original Code and/or Modifications of
+ * Original Code as defined in and that are subject to the Apple Public
+ * Source License Version 1.1 (the "License").  You may not use this file
+ * except in compliance with the License.  Please obtain a copy of the
+ * License at http://www.apple.com/publicsource and read it before using
+ * this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright 1993 NeXT, Inc.
+ * All rights reserved.
+ */
+
+#import "libsaio.h"
+#import "console.h"
+
+int
+reallyPrint(const char *fmt, ...)
+{
+    va_list ap;
+    int tShow = showText;
+
+    va_start(ap, fmt);
+    showText = 1;
+    prf(fmt, ap, putchar, 0);
+    va_end(ap);
+    showText = tShow;
+    return 0;
+}
+
+
diff --git a/gen/libsaio/stringTable.c b/gen/libsaio/stringTable.c
new file mode 100644 (file)
index 0000000..66f10e9
--- /dev/null
@@ -0,0 +1,570 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
+ * Reserved.  This file contains Original Code and/or Modifications of
+ * Original Code as defined in and that are subject to the Apple Public
+ * Source License Version 1.1 (the "License").  You may not use this file
+ * except in compliance with the License.  Please obtain a copy of the
+ * License at http://www.apple.com/publicsource and read it before using
+ * this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright 1993 NeXT, Inc.
+ * All rights reserved.
+ */
+
+#import "libsaio.h"
+#import "kernBootStruct.h"
+#import <driverkit/configTablePrivate.h>
+
+extern KERNBOOTSTRUCT *kernBootStruct;
+extern char *Language;
+extern char *LoadableFamilies;
+
+static void eatThru(char val, char **table_p);
+
+static inline int isspace(char c)
+{
+    return (c == ' ' || c == '\t');
+}
+
+/*
+ * Compare a string to a key with quoted characters
+ */
+static inline int
+keyncmp(char *str, char *key, int n)
+{
+    int c;
+    while (n--) {
+       c = *key++;
+       if (c == '\\') {
+           switch(c = *key++) {
+           case 'n':
+               c = '\n';
+               break;
+           case 'r':
+               c = '\r';
+               break;
+           case 't':
+               c = '\t';
+               break;
+           default:
+               break;
+           }
+       } else if (c == '\"') {
+           /* Premature end of key */
+           return 1;
+       }
+       if (c != *str++) {
+           return 1;
+       }
+    }
+    return 0;
+}
+
+static void eatThru(char val, char **table_p)
+{
+       register char *table = *table_p;
+       register BOOL found = NO;
+
+       while (*table && !found)
+       {
+               if (*table == '\\') table += 2;
+               else
+               {
+                       if (*table == val) found = YES;
+                       table++;
+               }
+       }
+       *table_p = table;
+}
+
+char *
+newStringFromList(
+    char **list,
+    int *size
+)
+{
+    char *begin = *list, *end;
+    char *newstr;
+    int newsize = *size;
+    
+    while (*begin && newsize && isspace(*begin)) {
+       begin++;
+       newsize--;
+    }
+    end = begin;
+    while (*end && newsize && !isspace(*end)) {
+       end++;
+       newsize--;
+    }
+    if (begin == end)
+       return 0;
+    newstr = malloc(end - begin + 1);
+    strncpy(newstr, begin, end - begin);
+    *list = end;
+    *size = newsize;
+    return newstr;
+}
+
+/* 
+ * compress == compress escaped characters to one character
+ */
+int stringLength(char *table, int compress)
+{
+       int ret = 0;
+
+       while (*table)
+       {
+               if (*table == '\\')
+               {
+                       table += 2;
+                       ret += 1 + (compress ? 0 : 1);
+               }
+               else
+               {
+                       if (*table == '\"') return ret;
+                       ret++;
+                       table++;
+               }
+       }
+       return ret;
+}
+
+
+// looks in table for strings of format << "key" = "value"; >>
+// or << "key"; >>
+BOOL getValueForStringTableKey(char *table, char *key, char **val, int *size)
+{
+       int keyLength;
+       char *tableKey;
+
+       do
+       {
+               eatThru('\"',&table);
+               tableKey = table;
+               keyLength = strlen(key);
+               if (keyLength &&
+                   (stringLength(table,1) == keyLength) &&
+                   (keyncmp(key, table, keyLength) == 0))
+               {
+                       int c;
+                       
+                       /* found the key; now look for either
+                        * '=' or ';'
+                        */
+                       while (c = *table) {
+                           ++table;
+                           if (c == '\\') {
+                               ++table;
+                               continue;
+                           } else if (c == '=' || c == ';') {
+                               break;
+                           }
+                       }
+                       if (c == ';') {
+                           table = tableKey;
+                       } else {
+                           eatThru('\"',&table);
+                       }
+                       *val = table;
+                       *size = stringLength(table,0);
+                       return YES;
+               }
+
+               eatThru(';',&table);
+
+       } while (*table);
+
+       return NO;
+}
+
+
+/*
+ * Returns a new malloc'ed string if one is found
+ * in the string table matching 'key'.  Also translates
+ * \n escapes in the string.
+ */
+char *newStringForStringTableKey(
+       char *table,
+       char *key
+)
+{
+    char *val, *newstr, *p;
+    int size;
+    
+    if (getValueForStringTableKey(table, key, &val, &size)) {
+       newstr = malloc(size+1);
+       for (p = newstr; size; size--, p++, val++) {
+           if ((*p = *val) == '\\') {
+               switch (*++val) {
+               case 'r':
+                   *p = '\r';
+                   break;
+               case 'n':
+                   *p = '\n';
+                   break;
+               case 't':
+                   *p = '\t';
+                   break;
+               default:
+                   *p = *val;
+                   break;
+               }
+               size--;
+           }
+       }
+       *p = '\0';
+       return newstr;
+    } else {
+       return 0;
+    }
+}
+
+char *
+newStringForKey(char *key)
+{
+    char *val, *newstr;
+    int size;
+    
+    if (getValueForKey(key, &val, &size) && size) {
+       newstr = malloc(size + 1);
+       strncpy(newstr, val, size);
+       return newstr;
+    } else {
+       return 0;
+    }
+}
+
+/* parse a command line
+ * in the form: [<argument> ...]  [<option>=<value> ...]
+ * both <option> and <value> must be either composed of
+ * non-whitespace characters, or enclosed in quotes.
+ */
+
+static char *getToken(char *line, char **begin, int *len)
+{
+    if (*line == '\"') {
+       *begin = ++line;
+       while (*line && *line != '\"')
+           line++;
+       *len = line++ - *begin;
+    } else {
+       *begin = line;
+       while (*line && !isspace(*line) && *line != '=')
+           line++;
+       *len = line - *begin;
+    }
+    return line;
+}
+
+BOOL getValueForBootKey(char *line, char *match, char **matchval, int *len)
+{
+    char *key, *value;
+    int key_len, value_len;
+    
+    while (*line) {
+       /* look for keyword or argument */
+       while (isspace(*line)) line++;
+
+       /* now look for '=' or whitespace */
+       line = getToken(line, &key, &key_len);
+       /* line now points to '=' or space */
+       if (!isspace(*line++)) {
+           line = getToken(line, &value, &value_len);
+           if ((strlen(match) == key_len)
+               && strncmp(match, key, key_len) == 0) {
+               *matchval = value;
+               *len = value_len;
+               return YES;
+           }
+       }
+    }
+    return NO;
+}
+
+BOOL getBoolForKey(
+    char *key
+)
+{
+    char *val;
+    int size;
+    
+    if (getValueForKey(key, &val, &size) && (size >= 1) &&
+       val[0] == 'Y' || val[0] == 'y')
+           return YES;
+    return NO;
+}
+
+BOOL getValueForKey(
+    char *key,
+    char **val,
+    int *size
+)
+{
+    if (getValueForBootKey(kernBootStruct->bootString, key, val, size))
+       return YES;
+    else if (getValueForStringTableKey(kernBootStruct->config, key, val, size))
+       return YES;
+
+    return NO;
+}
+
+#define LOCALIZABLE \
+    "/usr/Devices/%s.config/%s.lproj/Localizable.strings"
+
+char *
+loadLocalizableStrings(
+    char *name
+)
+{
+    char buf[256], *config;
+    register int count, fd;
+    
+    sprintf(buf, LOCALIZABLE, name, Language);
+    if ((fd = open(buf,0)) < 0) {
+       sprintf(buf, LOCALIZABLE, name, "English");
+       if ((fd = open(buf,0)) < 0)
+           return 0;
+    }
+    count = file_size(fd);
+    config = malloc(count);
+    count = read(fd, config, count);
+    close(fd);
+    if (count <= 0) {
+       free(config);
+       return 0;
+    }
+    return config;
+}
+
+char *
+bundleLongName(
+    char *bundleName
+)
+{
+    char *table, *name, *val;
+    int size;
+    
+    if ((table = loadLocalizableStrings(bundleName)) != 0 &&
+        getValueForStringTableKey(table,"Long Name", &val, &size) == YES) {
+       name = malloc(size+1);
+       strncpy(name, val, size);
+       free(table);
+    } else {
+       name = newString(bundleName);
+    }
+    return name;
+}
+
+int sysConfigValid;
+
+
+/*
+ * Returns 0 if file loaded OK,
+ *        -1 if file was not loaded
+ * Does not print error messages.
+ * Returns pointer to table in memory in *table.
+ */
+int
+loadConfigFile( char *configFile, char **table, int allocTable)
+{
+    char *configPtr = kernBootStruct->configEnd;
+    int fd, count;
+    
+    /* Read config file into memory */
+    if ((fd = open(configFile, 0)) >= 0)
+    {
+       if (allocTable) {
+           configPtr = malloc(file_size(fd)+2);
+       } else {
+           if ((configPtr - kernBootStruct->config) > CONFIG_SIZE) {
+               error("No room in memory for config file %s\n",configFile);
+               close(fd);
+               return -1;
+           }
+           localPrintf("Reading config: %s\n",configFile);         
+       }
+       if (table) *table = configPtr;
+       count = read(fd, configPtr, IO_CONFIG_DATA_SIZE);
+       close(fd);
+
+       configPtr += count;
+       *configPtr++ = 0;
+       *configPtr = 0;
+       if (!allocTable)
+           kernBootStruct->configEnd = configPtr;
+
+       return 0;
+    } else {
+       return -1;
+    }
+}
+
+/* Returns 0 if requested config files were loaded,
+ *         1 if default files were loaded,
+ *        -1 if no files were loaded.
+ * Prints error message if files cannot be loaded.
+ */
+int
+loadConfigDir(
+    char *bundleName,  // bundle directory name (e.g. "System.config")
+    int useDefault,    // use Default.table instead of instance tables
+    char **table,      // returns pointer to config table
+    int allocTable     // malloc the table and return in *table
+)
+{
+    char *buf;
+    int i, ret;
+    
+    buf = malloc(256);
+    ret = 0;
+    
+    // load up to 99 instance tables
+    for (i=0; i < 99; i++) {
+       sprintf(buf, "%s%s.config/Instance%d.table", IO_CONFIG_DIR,
+               bundleName, i);
+       if (useDefault || (loadConfigFile(buf, table, allocTable) != 0)) {
+           if (i == 0) {
+               // couldn't load first instance table;
+               // try the default table
+               sprintf(buf, "%s%s.config/%s", IO_CONFIG_DIR, bundleName,
+                       IO_DEFAULT_TABLE_FILENAME);
+               if (loadConfigFile(buf, table, allocTable) == 0) {
+                   ret = 1;
+               } else {
+                   if (!allocTable)
+                       error("Config file \"%s\" not found\n", buf);
+                   ret = -1;
+               }
+           }
+           // we must be done.
+           break;
+       }
+    }
+    free(buf);
+    return ret;
+}
+
+
+#define SYSTEM_DEFAULT_FILE \
+       IO_SYSTEM_CONFIG_DIR IO_DEFAULT_TABLE_FILENAME
+#define SYSTEM_CONFIG "System"
+#define LP '('
+#define RP ')'
+
+/* Returns 0 if requested config files were loaded,
+ *         1 if default files were loaded,
+ *        -1 if no files were loaded.
+ * Prints error message if files cannot be loaded.
+ */
+int
+loadSystemConfig(
+    char *which,
+    int size
+)
+{
+    char *buf, *bp, *cp;
+    int ret, len, doDefault=0;
+
+    buf = bp = malloc(256);
+    if (which && size)
+    {
+       for(cp = which, len = size; len && *cp && *cp != LP; cp++, len--) ;
+       if (*cp == LP) {
+           while (len-- && *cp && *cp++ != RP) ;
+           /* cp now points past device */
+           strncpy(buf,which,cp - which);
+           bp += cp - which;
+       } else {
+           cp = which;
+           len = size;
+       }
+       if (*cp != '/') {
+           strcpy(bp, IO_SYSTEM_CONFIG_DIR);
+           strncat(bp, cp, len);
+           if (strncmp(cp + len - strlen(IO_TABLE_EXTENSION),
+                      IO_TABLE_EXTENSION, strlen(IO_TABLE_EXTENSION)) != 0)
+               strcat(bp, IO_TABLE_EXTENSION);
+       } else {
+           strncpy(bp, cp, len);
+           bp[size] = '\0';
+       }
+       if (strcmp(bp, SYSTEM_DEFAULT_FILE) == 0)
+           doDefault = 1;
+       ret = loadConfigFile(bp = buf, 0, 0);
+    } else {
+       ret = loadConfigDir((bp = SYSTEM_CONFIG), 0, 0, 0);
+    }
+    if (ret < 0) {
+       error("System config file '%s' not found\n", bp);
+    } else
+       sysConfigValid = 1;
+    free(buf);
+    return (ret < 0 ? ret : doDefault);
+}
+
+
+int
+loadOtherConfigs(
+    int useDefault
+)
+{
+    char *val, *table;
+    int count;
+    char *string;
+    int fd, ret;
+
+    if (getValueForKey( "Boot Drivers", &val, &count))
+    {
+       while (string = newStringFromList(&val, &count)) {
+           ret = loadConfigDir(string, useDefault, &table, 0);
+           if (ret >= 0) {
+               if ((fd = openDriverReloc(string)) >= 0) {
+                   localPrintf("Loading binary for %s\n",string);
+                   if (loadDriver(string, fd) < 0)
+                       error("Error loading driver %s\n",string);
+                   close(fd);
+               }
+               driverWasLoaded(string, table);
+               free(string);
+           } else {
+               driverIsMissing(string);
+           }
+           if (ret == 1)
+               useDefault = 1; // use defaults from now on
+       }
+    } else {
+       error("Warning: No active drivers specified in system config\n");
+    }
+
+    kernBootStruct->first_addr0 =
+           (int)kernBootStruct->configEnd + 1024;
+    return 0;
+}
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/gen/libsaio/sys.c b/gen/libsaio/sys.c
new file mode 100644 (file)
index 0000000..27c8244
--- /dev/null
@@ -0,0 +1,861 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
+ * Reserved.  This file contains Original Code and/or Modifications of
+ * Original Code as defined in and that are subject to the Apple Public
+ * Source License Version 1.1 (the "License").  You may not use this file
+ * except in compliance with the License.  Please obtain a copy of the
+ * License at http://www.apple.com/publicsource and read it before using
+ * this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/* 
+ * Mach Operating System
+ * Copyright (c) 1990 Carnegie-Mellon University
+ * Copyright (c) 1989 Carnegie-Mellon University
+ * Copyright (c) 1988 Carnegie-Mellon University
+ * Copyright (c) 1987 Carnegie-Mellon University
+ * All rights reserved.  The CMU software License Agreement specifies
+ * the terms and conditions for use and redistribution.
+ *
+ */
+/*
+ * HISTORY
+ * Revision 2.3  88/08/08  13:47:07  rvb
+ * Allocate buffers dynamically vs statically.
+ * Now b[i] and i_fs and i_buf, are allocated dynamically.
+ * boot_calloc(size) allocates and zeros a  buffer rounded to a NPG
+ * boundary.
+ * Generalize boot spec to allow, xx()/mach, xx(n,[a..h])/mach,
+ * xx([a..h])/mach, ...
+ * Also default "xx" if unspecified and alloc just "/mach",
+ * where everything is defaulted
+ * Add routine, ptol(), to parse partition letters.
+ *
+ */
+/*
+ * Copyright (c) 1982, 1986 Regents of the University of California.
+ * All rights reserved.  The Berkeley software License Agreement
+ * specifies the terms and conditions for redistribution.
+ *
+ *     @(#)sys.c       7.1 (Berkeley) 6/5/86
+ */
+
+#import <sys/param.h>
+#import <ufs/fs.h>
+#import <ufs/fsdir.h>
+#import <sys/reboot.h>
+#import <architecture/byte_order.h>
+#import "libsaio.h"
+#import "cache.h"
+#import "kernBootStruct.h"
+
+char *gFilename;
+
+static ino_t dlook(char *s, struct iob *io);
+static char * xx(char *str, struct iob *file);
+volatile void stop(char *s);
+static int ffs(register long mask);
+
+extern int label_secsize;
+
+#define DCACHE         1
+#define ICACHE         1
+#define SYS_MESSAGES   1
+#define CHECK_CAREFULLY        0
+
+#if ICACHE
+#define ICACHE_SIZE    8
+static cache_t *icache;
+#endif ICACHE
+
+#define        DEV_BSIZE       label_secsize
+
+static struct iob *iob_from_fdesc(int fdesc)
+{
+    register struct iob *file;
+    
+    if (fdesc < 0 || fdesc >= NFILES ||
+       ((file = &iob[fdesc])->i_flgs & F_ALLOC) == 0)
+           return NULL;
+    else
+           return file;
+}
+static int
+openi(int n, struct iob *io)
+{
+       struct dinode *dp;
+       int cc;
+#if ICACHE
+       struct icommon *ip;
+       
+       if (icache == 0) {
+           icache = cacheInit(ICACHE_SIZE, sizeof(struct icommon));
+       }
+#endif ICACHE
+       io->i_offset = 0;
+       io->i_bn = fsbtodb(io->i_fs, itod(io->i_fs, n)) + io->i_boff;
+       io->i_cc = io->i_fs->fs_bsize;
+       io->i_ma = io->i_buf;
+
+#if ICACHE
+       if (cacheFind(icache, n, 0, (char **)&ip) == 1) {
+               io->i_ino.i_ic = *ip;
+               cc = 0;
+       } else {
+#endif ICACHE
+           cc = devread(io);
+           dp = (struct dinode *)io->i_buf;
+#if    BIG_ENDIAN_FS
+           byte_swap_inode_in(&dp[itoo(io->i_fs, n)].di_ic, &io->i_ino.i_ic);
+#else
+           io->i_ino.i_ic = dp[itoo(io->i_fs, n)].di_ic;
+#endif BIG_ENDIAN_FS
+#if ICACHE
+           *ip = io->i_ino.i_ic;
+       }
+#endif ICACHE
+       io->i_ino.i_number = n;
+       return (cc);
+}
+
+static int
+find(char *path, struct iob *file)
+{
+       char *q;
+       char c;
+       int n = 0;
+
+#if    CHECK_CAREFULLY
+       if (path==NULL || *path=='\0') {
+               printf("null path\n");
+               return (0);
+       }
+#endif CHECK_CAREFULLY
+       if (openi((ino_t) ROOTINO, file) < 0)
+       {
+#if    SYS_MESSAGES
+               error("bad root inode\n");
+#endif
+               return (0);
+       }
+       while (*path)
+       {
+               while (*path == '/')
+                       path++;
+               q = path;
+               while(*q != '/' && *q != '\0')
+                       q++;
+               c = *q;
+               *q = '\0';
+               if (q == path) path = "." ;     /* "/" means "/." */
+
+               if ((n = dlook(path, file)) != 0)
+               {
+                       if (c == '\0')
+                               break;
+                       if (openi(n, file) < 0)
+                       {
+                               *q = c;
+                               return (0);
+                       }
+                       *q = c;
+                       path = q;
+                       continue;
+               }
+               else
+               {
+                       *q = c;
+                       return (0);
+               }
+       }
+       return (n);
+}
+
+static daddr_t
+sbmap(struct iob *io, daddr_t bn)
+{
+       register struct inode *ip;
+       int i, j, sh;
+       daddr_t nb, *bap;
+
+       ip = &io->i_ino;
+
+       if (ip->i_icflags & IC_FASTLINK)
+       {
+               error("fast symlinks unimplemented\n");
+               return ((daddr_t)0);
+       }
+
+       if (bn < 0) {
+#if    SYS_MESSAGES
+               error("bn negative\n");
+#endif
+               return ((daddr_t)0);
+       }
+
+       /*
+        * blocks 0..NDADDR are direct blocks
+        */
+       if(bn < NDADDR)
+       {
+               nb = ip->i_db[bn];
+               return (nb);
+       }
+
+       /*
+        * addresses NIADDR have single and double indirect blocks.
+        * the first step is to determine how many levels of indirection.
+        */
+       sh = 1;
+       bn -= NDADDR;
+       for (j = NIADDR; j > 0; j--) {
+               sh *= NINDIR(io->i_fs);
+               if (bn < sh)
+                       break;
+               bn -= sh;
+       }
+       if (j == 0) {
+#if    SYS_MESSAGES
+               error("bn ovf %d\n", bn);
+#endif
+               return ((daddr_t)0);
+       }
+
+       /*
+        * fetch the first indirect block address from the inode
+        */
+       nb = ip->i_ib[NIADDR - j];
+       if (nb == 0) {
+#if    SYS_MESSAGES
+               error("bn void %d\n",bn);
+#endif
+               return ((daddr_t)0);
+       }
+
+       /*
+        * fetch through the indirect blocks
+        */
+       for (; j <= NIADDR; j++) {
+               if (blknos[j] != nb) {
+                       io->i_bn = fsbtodb(io->i_fs, nb) + io->i_boff;
+                       if (b[j] == (char *)0)
+                               b[j] = malloc(MAXBSIZE);
+                       io->i_ma = b[j];
+                       io->i_cc = io->i_fs->fs_bsize;
+                       if (devread(io) != io->i_fs->fs_bsize) {
+#if    SYS_MESSAGES
+                               error("bn %d: read error\n", io->i_bn);
+#endif
+                               return ((daddr_t)0);
+                       }
+                       blknos[j] = nb;
+               }
+               bap = (daddr_t *)b[j];
+               sh /= NINDIR(io->i_fs);
+               i = (bn / sh) % NINDIR(io->i_fs);
+#if    BIG_ENDIAN_FS
+#if 1
+               // for now it is little endian FS for intel
+               nb = bap[i];
+#else
+               nb = NXSwapBigLongToHost(bap[i]);
+#endif 1
+#else  BIG_ENDIAN_FS
+               nb = bap[i];
+#endif BIG_ENDIAN_FS
+               if(nb == 0) {
+#if    SYS_MESSAGES
+                       error("bn void %d\n",bn);
+#endif
+                       return ((daddr_t)0);
+               }
+       }
+
+       return (nb);
+}
+
+static ino_t
+dlook(
+       char *s,
+       struct iob *io
+)
+{
+       struct direct *dp;
+       register struct inode *ip;
+       struct dirstuff dirp;
+       int len;
+
+       if (s == NULL || *s == '\0')
+               return (0);
+       ip = &io->i_ino;
+       if ((ip->i_mode & IFMT) != IFDIR) {
+#if    SYS_MESSAGES
+               error(". before %s not a dir\n", s);
+#endif
+               return (0);
+       }
+       if (ip->i_size == 0) {
+#if    SYS_MESSAGES
+               error("%s: 0 length dir\n", s);
+#endif
+               return (0);
+       }
+       len = strlen(s);
+       dirp.loc = 0;
+       dirp.io = io;
+       io->dirbuf_blkno = -1;
+
+       for (dp = readdir(&dirp); dp != NULL; dp = readdir(&dirp)) {
+#if    DEBUG1
+               printf("checking name %s\n", dp->d_name);
+#endif DEBUG1
+               if(dp->d_ino == 0)
+                       continue;
+               if (dp->d_namlen == len && !strcmp(s, dp->d_name))
+                       return (dp->d_ino);
+       }
+       return (0);
+}
+
+struct dirstuff *
+opendir(char *path)
+{
+    register struct dirstuff *dirp;
+    register int fd;
+    
+    dirp = (struct dirstuff *)malloc(sizeof(struct dirstuff));
+    if (dirp == (struct dirstuff *)-1)
+       return 0;
+    fd = open(path,0);
+    if (fd == -1) {
+       free((void *)dirp);
+       return 0;
+    }
+    dirp->io = &iob[fd];
+    dirp->loc = 0;
+    iob[fd].dirbuf_blkno = -1;
+    return dirp;
+}
+
+int
+closedir(struct dirstuff *dirp)
+{
+    close(iob - dirp->io);
+    free((void *)dirp);
+    return 0;
+}
+
+#if DCACHE
+static cache_t *dcache;
+#define DCACHE_SIZE 6
+#endif
+
+/*
+ * get next entry in a directory.
+ */
+struct direct *
+readdir(struct dirstuff *dirp)
+{
+       struct direct *dp;
+       register struct iob *io;
+       daddr_t lbn, d;
+       int off;
+#if DCACHE
+       char *bp;
+       int dirblkno;
+
+       if (dcache == 0)
+               dcache = cacheInit(DCACHE_SIZE, DIRBLKSIZ);
+#endif DCACHE
+       io = dirp->io;
+       for(;;)
+       {
+               if (dirp->loc >= io->i_ino.i_size)
+                       return (NULL);
+               off = blkoff(io->i_fs, dirp->loc);
+               lbn = lblkno(io->i_fs, dirp->loc);
+
+#if DCACHE
+               dirblkno = dirp->loc / DIRBLKSIZ;
+               if (cacheFind(dcache, io->i_ino.i_number, dirblkno, &bp)) {
+                   dp = (struct direct *)(bp + (dirp->loc % DIRBLKSIZ));
+               } else
+#else DCACHE
+               if (io->dirbuf_blkno != lbn)
+#endif DCACHE
+               {
+                   if((d = sbmap(io, lbn)) == 0)
+                           return NULL;
+                   io->i_bn = fsbtodb(io->i_fs, d) + io->i_boff;
+                   io->i_ma = io->i_buf;
+                   io->i_cc = blksize(io->i_fs, &io->i_ino, lbn);
+               
+                   if (devread(io) < 0)
+                   {
+#if    SYS_MESSAGES
+                           error("bn %d: directory read error\n",
+                                   io->i_bn);
+#endif
+                           return (NULL);
+                   }
+#if    BIG_ENDIAN_FS
+                   byte_swap_dir_block_in(io->i_buf, io->i_cc);
+#endif BIG_ENDIAN_FS
+#if DCACHE
+                   bcopy(io->i_buf + dirblkno * DIRBLKSIZ, bp, DIRBLKSIZ);
+                   dp = (struct direct *)(io->i_buf + off);
+#endif
+               }
+#if !DCACHE
+               dp = (struct direct *)(io->i_buf + off);
+#endif
+               dirp->loc += dp->d_reclen;
+
+               if (dp->d_ino != 0) return (dp);
+       }
+}
+
+int
+b_lseek(int fdesc, unsigned int addr, int ptr)
+{
+       register struct iob *io;
+
+#if    CHECK_CAREFULLY
+       if (ptr != 0) {
+               error("Seek not from beginning of file\n");
+               return (-1);
+       }
+#endif CHECK_CAREFULLY
+       if ((io = iob_from_fdesc(fdesc)) == 0) {
+               return (-1);
+       }
+       io->i_offset = addr;
+       io->i_bn = addr / DEV_BSIZE;
+       io->i_cc = 0;
+       return (0);
+}
+
+int
+tell(int fdesc)
+{
+       return iob[fdesc].i_offset;
+}
+
+static int getch(int fdesc)
+{
+       register struct iob *io;
+       struct fs *fs;
+       char *p;
+       int c, lbn, off, size, diff;
+
+       if ((io = iob_from_fdesc(fdesc)) == 0) {
+               return (-1);
+       }
+       p = io->i_ma;
+       if (io->i_cc <= 0) {
+               if ((io->i_flgs & F_FILE) != 0) {
+                       diff = io->i_ino.i_size - io->i_offset;
+                       if (diff <= 0)
+                               return (-1);
+                       fs = io->i_fs;
+                       lbn = lblkno(fs, io->i_offset);
+                       io->i_bn = fsbtodb(fs, sbmap(io, lbn)) + io->i_boff;
+                       off = blkoff(fs, io->i_offset);
+                       size = blksize(fs, &io->i_ino, lbn);
+               } else {
+                       diff = 0;
+#ifndef        SMALL
+                       io->i_bn = io->i_offset / DEV_BSIZE;
+                       off = 0;
+                       size = DEV_BSIZE;
+#endif SMALL
+               }
+               io->i_ma = io->i_buf;
+               io->i_cc = size;
+               if (devread(io) < 0) {
+                       return (-1);
+               }
+               if ((io->i_flgs & F_FILE) != 0) {
+                       if (io->i_offset - off + size >= io->i_ino.i_size)
+                               io->i_cc = diff + off;
+                       io->i_cc -= off;
+               }
+               p = &io->i_buf[off];
+       }
+       io->i_cc--;
+       io->i_offset++;
+       c = (unsigned)*p++;
+       io->i_ma = p;
+       return (c);
+}
+
+int
+read(int fdesc, char *buf, int count)
+{
+       int i, size;
+       register struct iob *file;
+       struct fs *fs;
+       int lbn, off;
+
+       if ((file = iob_from_fdesc(fdesc)) == 0) {
+               return (-1);
+       }
+       if ((file->i_flgs&F_READ) == 0) {
+               return (-1);
+       }
+#ifndef        SMALL
+       if ((file->i_flgs & F_FILE) == 0) {
+               file->i_cc = count;
+               file->i_ma = buf;
+               file->i_bn = file->i_boff + (file->i_offset / DEV_BSIZE);
+               i = devread(file);
+               file->i_offset += count;
+               return (i);
+       }
+#endif SMALL
+       if (file->i_offset+count > file->i_ino.i_size)
+               count = file->i_ino.i_size - file->i_offset;
+       if ((i = count) <= 0)
+               return (0);
+       /*
+        * While reading full blocks, do I/O into user buffer.
+        * Anything else uses getc().
+        */
+       fs = file->i_fs;
+       while (i) {
+               off = blkoff(fs, file->i_offset);
+               lbn = lblkno(fs, file->i_offset);
+               size = blksize(fs, &file->i_ino, lbn);
+               if (off == 0 && size <= i) {
+                       file->i_bn = fsbtodb(fs, sbmap(file, lbn)) +
+                           file->i_boff;
+                       file->i_cc = size;
+                       file->i_ma = buf;
+                       if (devread(file) < 0) {
+                               return (-1);
+                       }
+                       file->i_offset += size;
+                       file->i_cc = 0;
+                       buf += size;
+                       i -= size;
+               } else {
+                       size -= off;
+                       if (size > i)
+                               size = i;
+                       i -= size;
+                       do {
+                               *buf++ = getch(fdesc);
+                       } while (--size);
+               }
+       }
+       return (count);
+}
+
+#if CHECK_CAREFULLY
+static int             open_init;
+#endif CHECK_CAREFULLY
+static struct fs       *fs_block;
+static int             fs_block_valid;
+
+#define SUPERBLOCK_ERROR       "Bad superblock: error %d\n"
+
+int
+open(char *str, int how)
+{
+       register char *cp;
+       register struct iob *file;
+       int i, fdesc;
+
+#if CHECK_CAREFULLY    /* iob[] is in BSS, so it is guaranteed to be zero. */
+       if (open_init == 0) {
+               for (i = 0; i < NFILES; i++)
+                       iob[i].i_flgs = 0;
+               open_init = 1;
+       }
+#endif
+
+       for (fdesc = 0; fdesc < NFILES; fdesc++)
+               if (iob[fdesc].i_flgs == 0)
+                       goto gotfile;
+       stop("Out of file descriptor slots");
+
+gotfile:
+       (file = &iob[fdesc])->i_flgs |= F_ALLOC;
+
+       if ((cp = xx(str, file)) == (char *) -1)
+       {
+               close(fdesc);
+               return -1;
+       }
+
+       if (*cp == '\0') {
+               file->i_flgs |= how+1;
+               file->i_cc = 0;
+               file->i_offset = 0;
+               return (fdesc);
+       }
+       file->i_cc = SBSIZE;
+       file->i_bn = (SBLOCK / DEV_BSIZE) + file->i_boff;
+       file->i_offset = 0;
+
+       if (file->i_fs == 0) {
+               if (fs_block == 0) {
+                   fs_block = (struct fs *)malloc(SBSIZE);
+               }
+               if (fs_block_valid == 0) {
+                   file->i_ma = (char *)fs_block;
+                   if (devread(file) < 0) {
+#ifndef SMALL
+                           error(SUPERBLOCK_ERROR, 1);
+#endif
+                           close(fdesc);
+                           return (-1);
+                   }
+                   byte_swap_superblock(fs_block);
+                   fs_block_valid = 1;
+               }
+               file->i_fs = fs_block;
+               file->i_buf = malloc(MAXBSIZE);
+       }
+#if    BIG_ENDIAN_FS
+
+       if (file->i_fs->fs_magic != FS_MAGIC) {
+               error(SUPERBLOCK_ERROR, 2);
+               close(fdesc);
+               return (-1);
+       }
+       /*
+        *  The following is a gross hack to boot disks that have an actual
+        *  blocksize of 512 bytes but were written with a theoretical 1024
+        *  byte blocksize (fsbtodb == 0).
+        *
+        *  We can make this assumption because we can only boot disks with
+        *  a 512 byte sector size.
+        */
+       if (file->i_fs->fs_fsize == 0) {
+               error(SUPERBLOCK_ERROR,3);
+               close(fdesc);
+               return (-1);
+       }
+       file->i_fs->fs_fsbtodb = ffs(file->i_fs->fs_fsize / DEV_BSIZE) - 1;
+#endif BIG_ENDIAN_FS
+
+       if ((i = find(cp, file)) == 0) {
+               close(fdesc);
+               return (-1);
+       }
+#if    CHECK_CAREFULLY
+       if (how != 0) {
+               error("Can't write files\n");
+               close(fdesc);
+               return (-1);
+       }
+#endif CHECK_CAREFULLY
+
+       if (openi(i, file) < 0) {
+               close(fdesc);
+               return (-1);
+       }
+       file->i_offset = 0;
+       file->i_cc = 0;
+       file->i_flgs |= F_FILE | (how+1);
+
+       return (fdesc);
+}
+
+#define LP '('
+#define RP ')'
+
+static char * xx(char *str, struct iob *file)
+{
+       register char *cp = str, *xp;
+       char **dp;
+       int old_dev = kernBootStruct->kernDev;
+       int dev = (kernBootStruct->kernDev >> B_TYPESHIFT) & B_TYPEMASK;
+       int unit = (kernBootStruct->kernDev >> B_UNITSHIFT) & B_UNITMASK;
+       int part = (kernBootStruct->kernDev >> B_PARTITIONSHIFT) &
+                                                       B_PARTITIONMASK;
+       int i;
+       int no_dev;
+       int biosOffset;
+
+       biosOffset = unit;              // set the device
+
+       for (; *cp && *cp != LP; cp++) ;
+       if (no_dev = !*cp) {  // no paren found
+               cp = str;
+               xp = devsw[dev];
+       } else if (cp == str) { // paren but no device
+               cp++;
+               xp = devsw[dev];
+       } else {
+               xp = str;
+               cp++;
+       }
+
+       for (dp = devsw; *dp; dp++)
+       {
+               if ((xp[0] == *dp[0]) && (xp[1] == *(dp[0] + 1)))
+                       goto gotdev;
+       }
+
+       error("Unknown device '%c%c'\n",xp[0],xp[1]);
+       return ((char *)-1);
+
+gotdev:
+       if (no_dev)
+               goto none;
+       i = 0;
+       while (*cp >= '0' && *cp <= '9')
+       {
+               i = i * 10 + *cp++ - '0';
+               unit = i;
+       }
+
+       biosOffset = unit;              // set the device
+
+       if (*cp == RP || no_dev)
+               /* do nothing since ptol(")") returns 0 */ ;
+       else if (*cp == ',' )
+               part = ptol(++cp);
+       else if (cp[-1] == LP) 
+               part = ptol(cp);
+       else {
+badoff:
+               error("Missing offset specification\n");
+               return ((char *)-1);
+       }
+
+       for ( ;!no_dev ;) {
+               if (*cp == RP)
+                       break;
+               if (*cp++)
+                       continue;
+               goto badoff;
+       }
+
+none:
+       file->i_ino.i_dev = dev = dp-devsw;
+       file->partition = part;
+       file->biosdev = (BIOSDEV(dev)) + biosOffset;
+       if (dev == DEV_SD) {
+               file->biosdev += kernBootStruct->numIDEs;
+       } else if (dev == DEV_HD && kernBootStruct->numIDEs == 0) {
+               error("No IDE drives detected\n");
+               return ((char *)-1);
+       }
+
+       kernBootStruct->kernDev = (dev << B_TYPESHIFT) | 
+               (unit << B_UNITSHIFT) |
+               (part << B_PARTITIONSHIFT);
+               
+       if (kernBootStruct->kernDev != old_dev)
+           flushdev();
+
+       devopen(str, file);
+
+       if (file->i_error) 
+               return (char *)-1;
+       if (!no_dev && *cp) cp++;
+
+       gFilename = cp;
+
+       return cp;
+}
+
+int
+close(int fdesc)
+{
+       register struct iob *file;
+       register int i;
+
+       if ((file = iob_from_fdesc(fdesc)) == 0) {
+               return (-1);
+       }
+//     free((char *)file->i_fs);
+       file->i_fs = NULL;
+       free(file->i_buf); file->i_buf = NULL;
+       for (i=0;i<NBUFS;i++)
+       {
+               if (b[i])
+               {       free(b[i]); 
+                       b[i] = NULL;
+               }
+               blknos[i] = 0;
+       }
+
+       file->i_flgs = 0;
+       return (0);
+}
+
+volatile void stop(char *s)
+{
+#if    CHECK_CAREFULLY
+       register int i;
+       
+       for (i = 0; i < NFILES; i++)
+               if (iob[i].i_flgs != 0)
+                       close(i);
+#endif CHECK_CAREFULLY
+/*     textMode();*/           // can't call this function from here
+       printf("\n%s\n", s);
+       sleep(4);               // about to halt
+       halt();
+}
+
+static int ffs(register long mask)
+{
+       register int cnt;
+
+       if (mask == 0) return(0);
+       for (cnt = 1; !(mask & 1); cnt++)
+               mask >>= 1;
+       return(cnt);
+}
+
+int file_size(int fdesc)
+{
+       register struct iob *io;
+    
+       if ((io = iob_from_fdesc(fdesc)) == 0) {
+               return (-1);
+       }
+       return io->i_ino.i_size;
+}
+
+/* ensure that all device caches are flushed,
+ * because we are about to change the device media
+ */
+void flushdev(void)
+{
+    register int i;
+    
+    devflush();
+    for (i = 0; i < NFILES; i++)
+       if (iob[i].i_flgs & (F_READ | F_WRITE))
+           printf("flushdev: fd %d is open\n",i);
+    fs_block_valid = 0;
+#if ICACHE
+    cacheFlush(icache);
+#endif
+#if DCACHE
+    cacheFlush(dcache);
+#endif
+}
+
diff --git a/gen/libsaio/table.c b/gen/libsaio/table.c
new file mode 100644 (file)
index 0000000..2c15021
--- /dev/null
@@ -0,0 +1,86 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
+ * Reserved.  This file contains Original Code and/or Modifications of
+ * Original Code as defined in and that are subject to the Apple Public
+ * Source License Version 1.1 (the "License").  You may not use this file
+ * except in compliance with the License.  Please obtain a copy of the
+ * License at http://www.apple.com/publicsource and read it before using
+ * this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/* 
+ * Mach Operating System
+ * Copyright (c) 1990 Carnegie-Mellon University
+ * Copyright (c) 1989 Carnegie-Mellon University
+ * All rights reserved.  The CMU software License Agreement specifies
+ * the terms and conditions for use and redistribution.
+ */
+
+/*
+ *                     INTEL CORPORATION PROPRIETARY INFORMATION
+ *
+ *     This software is supplied under the terms of a license  agreement or 
+ *     nondisclosure agreement with Intel Corporation and may not be copied 
+ *     nor disclosed except in accordance with the terms of that agreement.
+ *
+ *     Copyright 1988, 1989 Intel Corporation
+ */
+
+/*
+ * Copyright 1993 NeXT, Inc.
+ * All rights reserved.
+ */
+#include "memory.h"
+
+#define NGDTENT                6
+#define GDTLIMIT       48      /* NGDTENT * 8 */
+
+/*  Segment Descriptor
+ *
+ * 31          24         19   16                 7           0
+ * ------------------------------------------------------------
+ * |             | |B| |A|       | |   |1|0|E|W|A|            |
+ * | BASE 31..24 |G|/|0|V| LIMIT |P|DPL|  TYPE   | BASE 23:16 |
+ * |             | |D| |L| 19..16| |   |1|1|C|R|A|            |
+ * ------------------------------------------------------------
+ * |                             |                            |
+ * |        BASE 15..0           |       LIMIT 15..0          |
+ * |                             |                            |
+ * ------------------------------------------------------------
+ */
+
+struct seg_desc {
+       unsigned short  limit_15_0;
+       unsigned short  base_15_0;
+       unsigned char   base_23_16;
+       unsigned char   bit_15_8;
+       unsigned char   bit_23_16;
+       unsigned char   base_31_24;
+       };
+
+
+struct seg_desc        Gdt[NGDTENT] = {
+    {0x0,    0x0,     0x0, 0x0,  0x0,  0x0},   /* 0x0 : null */
+    // byte granularity, 1Mb limit, MEMBASE offset
+    {0xFFFF, MEMBASE, 0x0, 0x9E, 0x4F, 0x0},   /* 0x8 : boot code */
+    // dword granularity, 2Gb limit, MEMBASE offset
+    {0xFFFF, MEMBASE, 0x0, 0x92, 0xCF, 0x0},   /* 0x10 : boot data */
+    {0xFFFF, MEMBASE, 0x0, 0x9E, 0xF,  0x0},   /* 0x18 : boot code, 16 bits */
+    {0xFFFF, 0x0,     0x0, 0x92, 0xCF, 0x0},   /* 0x20 : init data */
+    {0xFFFF, 0x0,     0x0, 0x9E, 0xCF, 0x0}    /* 0x28 : init code */
+};
+
diff --git a/gen/libsaio/ufs_byteorder.c b/gen/libsaio/ufs_byteorder.c
new file mode 100644 (file)
index 0000000..45640aa
--- /dev/null
@@ -0,0 +1,242 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
+ * Reserved.  This file contains Original Code and/or Modifications of
+ * Original Code as defined in and that are subject to the Apple Public
+ * Source License Version 1.1 (the "License").  You may not use this file
+ * except in compliance with the License.  Please obtain a copy of the
+ * License at http://www.apple.com/publicsource and read it before using
+ * this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright 1993 NeXT, Inc.
+ * All rights reserved.
+ */
+
+#import <bsd/sys/types.h>
+#import <bsd/sys/param.h>
+#import <bsd/sys/vnode.h>
+#import <bsd/ufs/fsdir.h>
+#import <architecture/byte_order.h>
+#import "ufs_byteorder.h"
+#import "libsaio.h"
+
+#define        swapBigLongToHost(thing) ((thing) = NXSwapBigLongToHost(thing))
+#define        swapBigShortToHost(thing) ((thing) = NXSwapBigShortToHost(thing))
+
+void
+swapBigIntsToHost(int *array, int count)
+{
+       register int    i;
+
+       for (i = 0;  i < count;  i++)
+               swapBigLongToHost(array[i]);
+}
+
+
+void
+swapBigShortToHosts(short *array, int count)
+{
+       register int    i;
+
+       for (i = 0;  i < count;  i++)
+               swapBigShortToHost(array[i]);
+}
+
+
+void
+byte_swap_superblock(struct fs *sb)
+{
+       swapBigIntsToHost(((int *) sb) + 2, 50);
+       
+       swapBigLongToHost(sb->fs_cgrotor);
+       swapBigLongToHost(sb->fs_cpc);
+
+       swapBigShortToHosts((short *) sb->fs_postbl, MAXCPG * NRPOS); 
+
+       swapBigLongToHost(sb->fs_magic);
+}
+
+
+static inline void
+byte_swap_disklabel_common(disk_label_t *dl)
+{
+       swapBigLongToHost(dl->dl_version);      /* ditto */
+       swapBigLongToHost(dl->dl_label_blkno);
+       swapBigLongToHost(dl->dl_size);
+       swapBigLongToHost(dl->dl_flags);
+       swapBigLongToHost(dl->dl_tag);
+//     swapBigShortToHost(dl->dl_checksum);
+//     if (dl->dl_version >= DL_V3)
+//             swapBigShortToHost(dl->dl_un.DL_v3_checksum);
+//     else
+//             swapBigIntsToHost(dl->dl_un.DL_bad, NBAD);
+}
+
+
+void
+byte_swap_disklabel_in(disk_label_t *dl)
+{
+       byte_swap_disklabel_common(dl);
+       byte_swap_disktab_in(&dl->dl_dt);
+}
+
+
+static inline void
+byte_swap_disktab_common(struct disktab *dt)
+{
+       register unsigned int   i;
+
+       swapBigLongToHost(dt->d_secsize);
+       swapBigLongToHost(dt->d_ntracks);
+       swapBigLongToHost(dt->d_nsectors);
+       swapBigLongToHost(dt->d_ncylinders);
+//     swapBigLongToHost(dt->d_rpm);
+       swapBigShortToHost(dt->d_front);
+       swapBigShortToHost(dt->d_back);
+//     swapBigShortToHost(dt->d_ngroups);
+//     swapBigShortToHost(dt->d_ag_size);
+//     swapBigShortToHost(dt->d_ag_alts);
+//     swapBigShortToHost(dt->d_ag_off);
+//     swapBigIntsToHost(dt->d_boot0_blkno, NBOOTS);
+
+       for (i=0; i < NPART; i++)
+               byte_swap_partition(&dt->d_partitions[i]);
+}
+
+/*
+ *  This is particularly grody.  The beginning of the partition array is two
+ *  bytes low on the 68 wrt natural alignment rules.  Furthermore, each
+ *  element of the partition table is two bytes smaller on 68k due to padding
+ *  at the end of the struct.
+ */
+void
+byte_swap_disktab_in(struct disktab *dt)
+{
+       struct partition        *pp;
+       int                     i;
+
+       /*
+        *  Shift each struct partition up in memory by 2 + 2 * offset bytes.
+        *  Do it backwards so we don't overwrite anything.
+        */
+       for (i=NPART - 1; i >=0; i--) {
+               struct partition temp;
+               pp = &dt->d_partitions[i];
+               /* beware: compiler doesn't do overlapping struct assignment */
+               temp = *(struct partition *)(((char *) pp) - 2 * (i + 1));
+               *pp = temp;
+       }
+
+       byte_swap_disktab_common(dt);
+}
+
+
+void
+byte_swap_partition(struct partition *part)
+{
+       swapBigLongToHost(part->p_base);
+       swapBigLongToHost(part->p_size);
+       swapBigShortToHost(part->p_bsize);
+       swapBigShortToHost(part->p_fsize);
+       swapBigShortToHost(part->p_cpg);
+       swapBigShortToHost(part->p_density);
+}
+
+#if NOTUSED
+void
+byte_swap_csum(struct csum *cs)
+{
+       swapBigIntsToHost((int *) cs, sizeof(struct csum) / sizeof(int));
+}
+
+
+void
+byte_swap_cylgroup(struct cg *cg)
+{
+       swapBigLongToHost(cg->cg_time);
+       swapBigLongToHost(cg->cg_cgx);
+       swapBigShortToHost(cg->cg_ncyl);
+       swapBigShortToHost(cg->cg_niblk);
+       swapBigLongToHost(cg->cg_ndblk);
+       byte_swap_csum(&cg->cg_cs);
+       swapBigLongToHost(cg->cg_rotor);
+       swapBigLongToHost(cg->cg_frotor);
+       swapBigLongToHost(cg->cg_irotor);
+       swapBigIntsToHost(cg->cg_frsum, MAXFRAG);
+       swapBigIntsToHost(cg->cg_btot, MAXCPG);
+       swapBigShortToHosts((short *) cg->cg_b, MAXCPG * NRPOS);
+       swapBigLongToHost(cg->cg_magic);
+}
+#endif
+
+
+void
+byte_swap_inode_in(struct icommon *dc, struct icommon *ic)
+{
+       register int            i;
+
+       ic->ic_mode = NXSwapBigShortToHost(dc->ic_mode);
+       ic->ic_nlink = NXSwapBigShortToHost(dc->ic_nlink);
+//     ic->ic_uid = NXSwapBigShortToHost(dc->ic_uid);
+//     ic->ic_gid = NXSwapBigShortToHost(dc->ic_gid);
+
+       ic->ic_size.val[0] = NXSwapBigLongToHost(dc->ic_size.val[1]);
+       ic->ic_size.val[1] = NXSwapBigLongToHost(dc->ic_size.val[0]);
+
+//     ic->ic_atime = NXSwapBigLongToHost(dc->ic_atime);
+//     ic->ic_mtime = NXSwapBigLongToHost(dc->ic_mtime);
+//     ic->ic_ctime = NXSwapBigLongToHost(dc->ic_ctime);
+//     ic->ic_atspare = NXSwapBigLongToHost(dc->ic_atspare);
+//     ic->ic_mtspare = NXSwapBigLongToHost(dc->ic_mtspare);
+//     ic->ic_ctspare = NXSwapBigLongToHost(dc->ic_ctspare);
+
+       ic->ic_flags = NXSwapBigLongToHost(dc->ic_flags);
+
+       if ((ic->ic_flags & IC_FASTLINK) == 0) { /* not a fast symlink */
+
+               for (i=0; i < NDADDR; i++)      /* direct blocks */
+                       ic->ic_db[i] = NXSwapBigLongToHost(dc->ic_db[i]);
+       
+               for (i=0; i < NIADDR; i++)      /* indirect blocks */
+                       ic->ic_ib[i] = NXSwapBigLongToHost(dc->ic_ib[i]);
+       }
+       else
+               bcopy(dc->ic_symlink, ic->ic_symlink, sizeof(dc->ic_symlink));
+
+       ic->ic_blocks = NXSwapBigLongToHost(dc->ic_blocks);
+       ic->ic_gen = NXSwapBigLongToHost(dc->ic_gen);
+       for (i=0; i < sizeof(ic->ic_spare) / sizeof(int); i++)
+               ic->ic_spare[i] = NXSwapBigLongToHost(dc->ic_spare[i]);
+}
+
+
+void
+byte_swap_dir_block_in(char *addr, int count)
+{
+       register struct direct  *ep = (struct direct *) addr;
+       register int            entryoffsetinblk = 0;
+
+       while (entryoffsetinblk < count) {
+               ep = (struct direct *) (entryoffsetinblk + addr);
+               swapBigLongToHost(ep->d_ino);
+               swapBigShortToHost(ep->d_reclen);
+               swapBigShortToHost(ep->d_namlen);
+               entryoffsetinblk += ep->d_reclen;
+               if (ep->d_reclen < 12)          /* handle garbage in dirs */
+                       break;
+       }
+}
diff --git a/gen/libsaio/ufs_byteorder.h b/gen/libsaio/ufs_byteorder.h
new file mode 100644 (file)
index 0000000..7ee6dcf
--- /dev/null
@@ -0,0 +1,49 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
+ * Reserved.  This file contains Original Code and/or Modifications of
+ * Original Code as defined in and that are subject to the Apple Public
+ * Source License Version 1.1 (the "License").  You may not use this file
+ * except in compliance with the License.  Please obtain a copy of the
+ * License at http://www.apple.com/publicsource and read it before using
+ * this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1992 NeXT Computer, Inc.
+ *
+ * UFS byte swapping routines to make a big endian file system useful on a
+ * little endian machine.
+ *
+ * HISTORY
+ *
+ * 8 Jul 1992 Brian Pinkerton at NeXT
+ *      Created.
+ */
+#import <bsd/sys/disktab.h>
+#import <bsd/sys/vnode.h>
+#import <bsd/sys/buf.h>
+#import <bsd/dev/disk.h>
+#import <bsd/ufs/fs.h>
+#import <bsd/ufs/inode.h>
+
+void byte_swap_ints(int *array, int count);
+void byte_swap_shorts(short *array, int count);
+
+void byte_swap_disklabel_in(disk_label_t *dl);
+void byte_swap_disktab_in(struct disktab *dt);
+void byte_swap_partition(struct partition *part);
+void byte_swap_inode_in(struct icommon *dc, struct icommon *ic);
+void byte_swap_dir_block_in(char *addr, int count);
diff --git a/gen/libsaio/unpackbits.c b/gen/libsaio/unpackbits.c
new file mode 100644 (file)
index 0000000..46ae370
--- /dev/null
@@ -0,0 +1,104 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
+ * Reserved.  This file contains Original Code and/or Modifications of
+ * Original Code as defined in and that are subject to the Apple Public
+ * Source License Version 1.1 (the "License").  You may not use this file
+ * except in compliance with the License.  Please obtain a copy of the
+ * License at http://www.apple.com/publicsource and read it before using
+ * this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1988, 1989, 1990, 1991 Sam Leffler
+ * Copyright (c) 1991 Silicon Graphics, Inc.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and 
+ * its documentation for any purpose is hereby granted without fee, provided
+ * that (i) the above copyright notices and this permission notice appear in
+ * all copies of the software and related documentation, and (ii) the names of
+ * Sam Leffler and Silicon Graphics may not be used in any advertising or
+ * publicity relating to the software without the specific, prior written
+ * permission of Sam Leffler and Silicon Graphics.
+ * 
+ * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, 
+ * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY 
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.  
+ * 
+ * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
+ * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
+ * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+ * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF 
+ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE 
+ * OF THIS SOFTWARE.
+ */
+
+/*
+ * TIFF Library.
+ *
+ * PackBits Compression Algorithm Support
+ */
+#import "bitmap.h"
+#import "libsa.h"
+
+typedef unsigned int u_int;
+typedef unsigned char u_char;
+
+int
+PackBitsDecode(tif, op, occ, s)
+       TIFF *tif;
+       register u_char *op;
+       register int occ;
+       u_int s;
+{
+       register char *bp;
+       register int n, b;
+       register int cc;
+
+       bp = tif->tif_rawcp; cc = tif->tif_rawcc;
+       while (cc > 0 && occ > 0) {
+               n = (int) *bp++; cc--;
+               /*
+                * Watch out for compilers that
+                * don't sign extend chars...
+                */
+               if (n >= 128)
+                       n -= 256;
+               if (n < 0) {            /* replicate next byte -n+1 times */
+                       cc--;
+                       if (n == -128)  /* nop */
+                               continue;
+                       n = -n + 1;
+                       occ -= n;
+                       for (b = *bp++; n-- > 0;)
+                               *op++ = b;
+               } else {                /* copy next n+1 bytes literally */
+                       bcopy(bp, op, ++n);
+                       op += n; occ -= n;
+                       bp += n; cc -= n;
+               }
+       }
+       tif->tif_rawcp = bp;
+       tif->tif_rawcc = cc;
+       if (occ > 0) {
+//             TIFFError(tif->tif_name,
+//                 "PackBitsDecode: Not enough data for scanline %d",
+//                 tif->tif_row);
+//             reallyPrint("Not enough data\n");
+               return (0);
+       }
+       /* check for buffer overruns? */
+       return (1);
+}
diff --git a/gen/rcz/Makefile b/gen/rcz/Makefile
new file mode 100644 (file)
index 0000000..077094e
--- /dev/null
@@ -0,0 +1,51 @@
+
+DIR = rcz
+include ../MakePaths.dir
+
+UTILDIR = ../util
+LIBSADIR = ../libsa
+USRBIN = $(DSTROOT)/usr/bin
+INSTALLDIR = $(DSTROOT)/System/Library/Frameworks/System.framework/Versions/B/PrivateHeaders/standalone
+
+DEBUG = -O
+CFLAGS = $(DEBUG) $(MORECPP) $(RC_CFLAGS) -g -Wmost -Wno-precomp -traditional-cpp
+DEFINES=
+CONFIG = hd
+INC = -I. -I$(SYMROOT) -I$(UTILDIR) -I$(LIBSADIR)
+ifneq "" "$(wildcard /bin/mkdirs)"
+  MKDIRS = /bin/mkdirs
+else
+  MKDIRS = /bin/mkdir -p
+endif
+AS = as
+LD = ld
+# LIBS= -lc_static
+LIBS=
+
+VPATH = $(OBJROOT):$(SYMROOT)
+
+SFILES =
+CFILES = 
+HFILES = 
+EXPORTED_HFILES =
+INSTALLED_HFILES =
+OTHERFILES = Makefile
+ALLSRC =  $(SFILES) $(CFILES) \
+       $(HFILES) $(OTHERFILES)
+DIRS_NEEDED = $(OBJROOT) $(SYMROOT) $(USRBIN)
+
+RCZ_OBJS = rcz.o rcz_compress_mem.o rcz_decompress_mem.o
+
+all: $(DIRS_NEEDED) rcz
+
+rcz: $(USRBIN) $(RCZ_OBJS)
+       $(CC) $(CFLAGS) $(LDFLAGS) $(DEFINES) -o $(USRBIN)/$@ $(RCZ_OBJS)
+       strip -x -u $(USRBIN)/$@
+
+clean::
+       rm -rf $(USRBIN)/rcz
+
+include ../MakeInc.dir
+
+# dependencies
+-include $(OBJROOT)/Makedep
diff --git a/gen/rcz/README b/gen/rcz/README
new file mode 100644 (file)
index 0000000..cd03d83
--- /dev/null
@@ -0,0 +1,11 @@
+
+
+NOTE:
+
+The code in this directory is a duplicate copy of the code
+in the i386 subdirectory.  When the generic parts of all the machine
+directories are merged, then the rcz code can be merged too.
+
+For now, don't forget to keep this code in sync with the code in the
+i386 directory.
+
diff --git a/gen/rcz/rcz.c b/gen/rcz/rcz.c
new file mode 100644 (file)
index 0000000..e3c15a1
--- /dev/null
@@ -0,0 +1,178 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
+ * Reserved.  This file contains Original Code and/or Modifications of
+ * Original Code as defined in and that are subject to the Apple Public
+ * Source License Version 1.1 (the "License").  You may not use this file
+ * except in compliance with the License.  Please obtain a copy of the
+ * License at http://www.apple.com/publicsource and read it before using
+ * this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+#import <stdio.h>
+#import <mach/mach.h>
+#import <mach/mach_error.h>
+#import <mach/mach_traps.h>
+
+#import "rcz_compress_mem.h"
+#import "rcz_decompress_mem.h"
+
+void
+usage(void)
+{
+    fprintf(stderr, "usage: rcz [-v] [-c | -d] [-o <ofile>] infile\n");
+    fprintf(stderr, "  -v: verbose mode\n");
+    fprintf(stderr, "  -c: compress\n");
+    fprintf(stderr, "  -d: decompress\n");
+    fprintf(stderr, "  use the special file name '-' to refer to stdin\n");
+    exit(1);
+}
+
+main(int argc, char *argv[])
+{
+    char *infile = NULL, *outfile = NULL;
+    int compress = 0;
+    int verbose = 0;
+    FILE *inf, *outf;
+    unsigned char *inbuf, *outbuf;
+    unsigned long length, total;
+    kern_return_t ret;
+
+    while ((++argv)[0] != NULL) {
+       if (*argv[0] == '-') {
+           switch(*(argv[0]+1)) {
+           case 'c':
+               compress = 1;
+               break;
+           case 'd':
+               compress = 0;
+               break;
+           case 'o':
+               if (argv[1]) {
+                   outfile = argv[1];
+                   argv++;
+               } else {
+                   usage();
+               }
+               break;
+           case 'v':
+               verbose = 1;
+               break;
+           case '\0':
+               if (infile)
+                   usage();
+               infile = "-";
+               break;
+           default:
+               usage();
+               break;
+           }
+       } else {
+           if (infile) {
+               usage();
+           } else {
+               infile = argv[0];
+           }
+       }
+    }
+    if (infile == NULL)
+       usage();
+        
+    if (compress) {
+       if (strcmp(infile, "-") == 0) {
+           inf = stdin;
+       } else {
+           inf = fopen(infile, "r");
+           if (inf == NULL) {
+               perror("open");
+               exit(1);
+           }
+       }
+       if (*outfile) {
+               if (strcmp(outfile, "-") == 0) {
+               outf = stdout;
+               } else {
+               outf = fopen(outfile, "w+");
+               if (outf == NULL) {
+                               perror("open outfile");
+                               exit(1);
+               }
+               }
+       }
+
+       fseek(inf,0,2); length = ftell(inf); rewind(inf);
+       if ((ret = map_fd(fileno(inf), 0, &inbuf, TRUE, length)) != KERN_SUCCESS) {
+           mach_error("map_fd", ret);  
+           exit(1);
+       }
+       outbuf = (unsigned char *)malloc(length + (length + 15)/16);
+       total = rcz_compress_memory(inbuf, length, outbuf);
+       fwrite(outbuf, 1, total, outf);
+       if (verbose)
+           fprintf(stderr, "%ld %ld\nCompression ratio: %f\n", length, total, total/(1.0*length));
+       fclose(inf);
+       vm_deallocate(mach_task_self(), inbuf, length);
+       fclose(outf);
+    } else {
+       unsigned char *ptr;
+       
+       if (strcmp(infile, "-") == 0) {
+           inf = stdin;
+       } else {
+           inf = fopen(infile, "r");
+           if (inf == NULL) {
+               perror("open");
+               exit(1);
+           }
+       }
+       if (*outfile) {
+               if (strcmp(outfile, "-") == 0) {
+               outf = stdout;
+               } else {
+               outf = fopen(outfile, "w+");
+               if (outf == NULL) {
+                       perror("open outfile");
+                       exit(1);
+               }
+               }
+       }
+       fseek(inf,0,2); length = ftell(inf); rewind(inf);
+       if ((ret = map_fd(fileno(inf), 0, &inbuf, TRUE, length)) != KERN_SUCCESS) {
+           mach_error("map_fd", ret);  
+           exit(1);
+       }
+       ptr = inbuf;
+       ptr += 4;  /* Skip over version number, which is checked
+                           later in ex_decompress(). */
+       /* Next, figure out malloc size using the next four bytes of the
+       compressed stream.
+       */    
+       total = *ptr++;
+       total = (total<<8) | (*ptr++);
+       total = (total<<8) | (*ptr++);
+       total = (total<<8) | (*ptr++);
+       ptr -= 8;
+    /* Now total is the exact byte count of the final, decompressed stream. */
+       outbuf = (unsigned char *)malloc(total);
+       total = rcz_decompress_memory(ptr, outbuf);
+       fwrite(outbuf, 1, total, outf);
+       if (verbose)
+           fprintf(stderr, "%ld %ld\nCompression ratio: %f\n", length, total, total/(1.0*length));
+       fclose(inf);
+       vm_deallocate(mach_task_self(), inbuf, length);
+       fclose(outf);
+    }
+    exit(0);
+}
diff --git a/gen/rcz/rcz_common.c b/gen/rcz/rcz_common.c
new file mode 100644 (file)
index 0000000..264dafd
--- /dev/null
@@ -0,0 +1,31 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
+ * Reserved.  This file contains Original Code and/or Modifications of
+ * Original Code as defined in and that are subject to the Apple Public
+ * Source License Version 1.1 (the "License").  You may not use this file
+ * except in compliance with the License.  Please obtain a copy of the
+ * License at http://www.apple.com/publicsource and read it before using
+ * this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/* Copyright 1995 NeXT Computer, Inc.  All rights reserved. */
+
+/* Common storage for compression functions. */
+
+#import "rcz_common.h"
+
+unsigned short que[QLEN];
+
diff --git a/gen/rcz/rcz_common.h b/gen/rcz/rcz_common.h
new file mode 100644 (file)
index 0000000..9c691ac
--- /dev/null
@@ -0,0 +1,37 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
+ * Reserved.  This file contains Original Code and/or Modifications of
+ * Original Code as defined in and that are subject to the Apple Public
+ * Source License Version 1.1 (the "License").  You may not use this file
+ * except in compliance with the License.  Please obtain a copy of the
+ * License at http://www.apple.com/publicsource and read it before using
+ * this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/* Copyright 1995 NeXT Computer, Inc.  All rights reserved. */
+
+/* Common storage for compression functions. */
+
+#define QLEN 255
+#define F1 12
+#define F2 12
+#define ABOVE ((F2 * QLEN) >> 4)
+#define METHOD_17_JUL_95 666
+
+
+#define RCZ_EXTENSION  ".rcz"
+
+
diff --git a/gen/rcz/rcz_compress_mem.c b/gen/rcz/rcz_compress_mem.c
new file mode 100644 (file)
index 0000000..af44704
--- /dev/null
@@ -0,0 +1,130 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
+ * Reserved.  This file contains Original Code and/or Modifications of
+ * Original Code as defined in and that are subject to the Apple Public
+ * Source License Version 1.1 (the "License").  You may not use this file
+ * except in compliance with the License.  Please obtain a copy of the
+ * License at http://www.apple.com/publicsource and read it before using
+ * this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/* 
+   Library: compressor for executable files.
+
+   R. E. Crandall, July 1995
+   
+   Copyright 1995 NeXT Computer, Inc.
+   All rights reserved.
+   
+ */
+#import "rcz_common.h"
+static unsigned short que[QLEN];
+
+
+unsigned int
+rcz_compress_memory(
+    unsigned char *in,
+    unsigned int inbytes,
+    unsigned char *out
+) 
+/* Returns actual number of bytes emitted as compressed stream 'out.' */
+{
+    unsigned int c, ct, j, jmatch, jabove, match;
+    unsigned int data[32], version;
+    unsigned int word, token, tokenct, total;
+    unsigned char *outorigin = out;
+
+/* First, put version number into stream. */
+    *out++ = (METHOD_17_JUL_95>>24) & 0xff;
+    *out++ = (METHOD_17_JUL_95>>16) & 0xff;
+    *out++ = (METHOD_17_JUL_95>>8) & 0xff;
+    *out++ = (METHOD_17_JUL_95) & 0xff;
+/* Next, put the initial size into stream. */
+    *out++ = (inbytes>>24) & 0xff;
+    *out++ = (inbytes>>16) & 0xff;
+    *out++ = (inbytes>>8) & 0xff;
+    *out++ = (inbytes) & 0xff;
+    
+    for(ct=0; ct < QLEN; ct++) que[ct] = ct;
+    word = token = tokenct = 0;
+    for(ct = 0; ct < inbytes; ct++) {
+       /* Next, update bucket-brigade register. */
+         word = (word << 8) | (*in++);  
+         if(ct % 2 == 1) {
+               word &= 0xffff;
+               match = 0;
+               for(j=0; j < QLEN; j++) {
+                       if(que[j] == word) {
+                               match = 1;
+                               jmatch = j;
+                               break;
+                       }
+               }
+               token = (token<<1) | match;
+               if(match) { /* 16-bit symbol is in queue. */
+                       c = que[jmatch];
+                       jabove = (F1 * jmatch) >> 4;
+                       for(j = jmatch; j > jabove; j--) {
+                            que[j] = que[j-1];
+                       }
+                       que[jabove] = c;
+                       data[tokenct++] = jmatch;
+               } else {   /* 16-bit symbol is not in queue. */
+                   for(j=QLEN-1; j > ABOVE; j--) {
+                       que[j] = que[j-1];
+                   } 
+                   que[ABOVE] = word;
+                   data[tokenct++] = word;
+               }
+               if(tokenct == 32) {  /* Unload tokens and data. */
+                   *out++ = (token>>24) & 0xff;
+                   *out++ = (token>>16) & 0xff;
+                   *out++ = (token>>8) & 0xff;
+                   *out++ = (token) & 0xff;
+                   c = (1<<31);
+                   for(j = 0; j < tokenct; j++) {
+                       if(token & c) *out++ = data[j] & 0xff;
+                          else {
+                              *out++ = (data[j] >> 8) & 0xff;
+                              *out++ = (data[j]) & 0xff;
+                          }
+                       c >>= 1;
+                   } 
+                   token = tokenct = 0;
+               }
+         }
+    }
+    if(tokenct > 0) { /* Flush final token and data. */
+        token <<= (32-tokenct);
+       *out++ = (token>>24) & 0xff;
+       *out++ = (token>>16) & 0xff;
+       *out++ = (token>>8) & 0xff;
+       *out++ = (token) & 0xff;
+       c = (1<<31);
+       for(j = 0; j < tokenct; j++) {
+               if(token & c) *out++ = data[j] & 0xff;
+                  else {
+                      *out++ = (data[j] >> 8) & 0xff;
+                      *out++ = (data[j]) & 0xff;
+                  }
+               c >>= 1;
+       } 
+    }
+    if(ct % 2 == 1) *out++ = (word) & 0xff;
+    return((int)(out-outorigin));
+}
diff --git a/gen/rcz/rcz_compress_mem.h b/gen/rcz/rcz_compress_mem.h
new file mode 100644 (file)
index 0000000..bf3e8b1
--- /dev/null
@@ -0,0 +1,34 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
+ * Reserved.  This file contains Original Code and/or Modifications of
+ * Original Code as defined in and that are subject to the Apple Public
+ * Source License Version 1.1 (the "License").  You may not use this file
+ * except in compliance with the License.  Please obtain a copy of the
+ * License at http://www.apple.com/publicsource and read it before using
+ * this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/* Copyright 1995 NeXT Computer, Inc.  All rights reserved. */
+/* Compression functions. */
+
+unsigned int
+rcz_compress_memory(
+    unsigned char *in,
+    unsigned int inbytes,
+    unsigned char *out
+);
+/* Returns actual number of bytes emitted as compressed stream 'out.' */
+
diff --git a/gen/rcz/rcz_decompress_file.c b/gen/rcz/rcz_decompress_file.c
new file mode 100644 (file)
index 0000000..0d947b0
--- /dev/null
@@ -0,0 +1,163 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
+ * Reserved.  This file contains Original Code and/or Modifications of
+ * Original Code as defined in and that are subject to the Apple Public
+ * Source License Version 1.1 (the "License").  You may not use this file
+ * except in compliance with the License.  Please obtain a copy of the
+ * License at http://www.apple.com/publicsource and read it before using
+ * this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/* 
+   Library: compressor for executable files.
+
+   R. E. Crandall, July 1995
+   
+   Copyright 1995 NeXT Computer, Inc.
+   All rights reserved.
+   
+ */
+
+#import "rcz_common.h"
+
+static unsigned short que[QLEN];
+#define REWIND -1
+
+extern int read(int fd, char *buf, int len);
+
+static unsigned char *buf;
+static int buf_count;
+
+#define BUF_SIZE 8192
+
+static void
+alloc_buf(int fd)
+{
+    buf = (unsigned char *)malloc(BUF_SIZE);
+    buf_count = 0;
+}
+
+static unsigned char
+get_byte(int fd)
+{
+    static unsigned char *ptr;
+
+    if (buf_count == 0) {
+       buf_count = read(fd, buf, BUF_SIZE);
+       ptr = buf;
+       if (buf_count <= 0)
+           return 0xFF;
+    }
+    buf_count--;
+    return *ptr++;
+}
+
+static void
+free_buf(void)
+{
+    buf_count = 0;
+    free(buf);
+}
+
+
+int
+rcz_file_size(
+    int in_fd
+)
+{
+    unsigned int version, length;
+    
+    alloc_buf(in_fd);
+    b_lseek(in_fd, 0, 0);
+    version = get_byte(in_fd);
+    version = (version<<8) | (get_byte(in_fd));
+    version = (version<<8) | (get_byte(in_fd));
+    version = (version<<8) | (get_byte(in_fd));
+    if(version != METHOD_17_JUL_95) {
+       return (-1);
+//     fprintf(stderr, "Incompatible version.\n");
+//     return(0);
+    }
+       
+    length = get_byte(in_fd);
+    length = (length<<8) | (get_byte(in_fd));
+    length = (length<<8) | (get_byte(in_fd));
+    length = (length<<8) | (get_byte(in_fd));
+    free_buf();
+    return length;
+}
+
+int
+rcz_decompress_file(
+    int in_fd,
+    unsigned char *out
+)
+/* Returns actual number of bytes emitted as decompressed stream 'out.'
+   Note that the 'in' stream contains this byte count already.
+   
+   Returns -1 if the input stream was not in compressed format.
+ */
+{
+    unsigned int c, j, k, jmatch, jabove;
+    int length;
+    unsigned int even_length, word, token, version;
+    unsigned char *outorigin = out;
+
+    length = rcz_file_size(in_fd);
+    if (length < 0)
+       return length;
+
+    alloc_buf(in_fd);
+    b_lseek(in_fd, 8, 0);
+    for(c=0; c < QLEN; c++) que[c] = c;
+    even_length = 2*(length/2);
+    while((int)(out-outorigin) < even_length) {
+       token = get_byte(in_fd);
+        token = (token<<8) | (get_byte(in_fd));
+        token = (token<<8) | (get_byte(in_fd));
+        token = (token<<8) | (get_byte(in_fd));
+       c = 1<<31;      
+       for(k = 0; k<32; k++) {
+               if(c & token) {
+                     jmatch = get_byte(in_fd);
+                     word = que[jmatch];
+                 /* Next, dynamically process the queue for match. */
+                     jabove = (F1*jmatch) >> 4;
+                     for(j = jmatch; j > jabove; j--) {
+                            que[j] = que[j-1];
+                     }
+                     que[jabove] = word;
+               } else {
+                 /* Next, dynamically process the queue for unmatch. */
+                   word = get_byte(in_fd);
+                   word = (word << 8) | (get_byte(in_fd));
+                   for(j=QLEN-1; j > ABOVE; j--) {
+                       que[j] = que[j-1];
+                   } 
+                   que[ABOVE] = word;
+               }
+               *out++ = (word >> 8) & 0xff;
+               *out++ = (word) & 0xff;
+               if((int)(out-outorigin) >= even_length) break;
+               c >>= 1;
+       }       
+    }          
+    if(even_length != length) *out++ = get_byte(in_fd);
+    free_buf();
+    return(length);
+}
diff --git a/gen/rcz/rcz_decompress_file.h b/gen/rcz/rcz_decompress_file.h
new file mode 100644 (file)
index 0000000..f962a12
--- /dev/null
@@ -0,0 +1,38 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
+ * Reserved.  This file contains Original Code and/or Modifications of
+ * Original Code as defined in and that are subject to the Apple Public
+ * Source License Version 1.1 (the "License").  You may not use this file
+ * except in compliance with the License.  Please obtain a copy of the
+ * License at http://www.apple.com/publicsource and read it before using
+ * this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/* Copyright 1995 NeXT Computer, Inc.  All rights reserved. */
+/* Compression functions. */
+
+extern int
+rcz_file_size(
+    int in_fd
+);
+
+extern int
+rcz_decompress_file(
+    int in_fd,
+    unsigned char *out
+);
+
+
diff --git a/gen/rcz/rcz_decompress_mem.c b/gen/rcz/rcz_decompress_mem.c
new file mode 100644 (file)
index 0000000..b5a3f86
--- /dev/null
@@ -0,0 +1,102 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
+ * Reserved.  This file contains Original Code and/or Modifications of
+ * Original Code as defined in and that are subject to the Apple Public
+ * Source License Version 1.1 (the "License").  You may not use this file
+ * except in compliance with the License.  Please obtain a copy of the
+ * License at http://www.apple.com/publicsource and read it before using
+ * this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/* 
+   Library: compressor for executable files.
+
+   R. E. Crandall, July 1995
+   
+   Copyright 1995 NeXT Computer, Inc.
+   All rights reserved.
+   
+ */
+
+#import "rcz_common.h"
+static unsigned short que[QLEN];
+
+unsigned int
+rcz_decompress_memory(unsigned char *in, unsigned char *out) 
+/* Returns actual number of bytes emitted as decompressed stream 'out.'
+   Note that the 'in' stream contains this byte count already.
+   
+   Returns -1 if the input stream was not in compressed format.
+ */
+{
+    unsigned int c, j, k, jmatch, jabove;
+    unsigned int length, even_length, word, token, version;
+    unsigned char *outorigin = out;
+    int *a, *b;
+
+    version = *in++;
+    version = (version<<8) | (*in++);
+    version = (version<<8) | (*in++);
+    version = (version<<8) | (*in++);
+    if(version != METHOD_17_JUL_95) {
+       return (-1);
+//     fprintf(stderr, "Incompatible version.\n");
+//     return(0);
+    }
+       
+    length = *in++;
+    length = (length<<8) | (*in++);
+    length = (length<<8) | (*in++);
+    length = (length<<8) | (*in++);
+
+    for(c=0; c < QLEN; c++) que[c] = c;
+    even_length = 2*(length/2);
+    while((int)(out-outorigin) < even_length) {
+       token = *in++;
+        token = (token<<8) | (*in++);
+        token = (token<<8) | (*in++);
+        token = (token<<8) | (*in++);
+       c = 1<<31;      
+       for(k = 0; k<32; k++) {
+               if(c & token) {
+                     jmatch = *in++;
+                     word = que[jmatch];
+                 /* Next, dynamically process the queue for match. */
+                     jabove = (F1*jmatch) >> 4;
+                     for(j = jmatch; j > jabove; j--) {
+                            que[j] = que[j-1];
+                     }
+                     que[jabove] = word;
+               } else {
+                 /* Next, dynamically process the queue for unmatch. */
+                   word = *in++;
+                   word = (word << 8) | (*in++);
+                   for(j=QLEN-1; j > ABOVE; j--) {
+                       que[j] = que[j-1];
+                   } 
+                   que[ABOVE] = word;
+               }
+               *out++ = (word >> 8) & 0xff;
+               *out++ = (word) & 0xff;
+               if((int)(out-outorigin) >= even_length) break;
+               c >>= 1;
+       }       
+    }          
+    if(even_length != length) *out++ = *in++;
+    return(length);
+}
diff --git a/gen/rcz/rcz_decompress_mem.h b/gen/rcz/rcz_decompress_mem.h
new file mode 100644 (file)
index 0000000..bae443f
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
+ * Reserved.  This file contains Original Code and/or Modifications of
+ * Original Code as defined in and that are subject to the Apple Public
+ * Source License Version 1.1 (the "License").  You may not use this file
+ * except in compliance with the License.  Please obtain a copy of the
+ * License at http://www.apple.com/publicsource and read it before using
+ * this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/* Copyright 1995 NeXT Computer, Inc.  All rights reserved. */
+
+extern unsigned int
+rcz_decompress_memory(unsigned char *in, unsigned char *out);
+
diff --git a/gen/util/Makefile b/gen/util/Makefile
new file mode 100644 (file)
index 0000000..49afe99
--- /dev/null
@@ -0,0 +1,94 @@
+#
+# Until I can remove the dependency on the appkit,
+# we'll just keep the generated files in this directory
+# and install them directly, rather than generating them again.
+#
+
+DIR = util
+include ../MakePaths.dir
+
+VPATH = $(OBJROOT):$(SYMROOT)
+
+INSTALLDIR = $(DSTROOT)/usr/standalone/i386
+LANGDIR = $(INSTALLDIR)/English.lproj
+
+CFLAGS = -Wmost -Wno-precomp -g
+
+CFILES = machOconv.c mkfont.c tif_packbits.c
+MFILES = dumptiff.m
+HFILES = cursor.h
+EXPORT_HFILES = bitmap.h font.h
+ALLSRC = $(CFILES) $(MFILES) $(HFILES) $(EXPORT_HFILES)
+
+TIFFILES = return.tiff ns_box.tiff ns_text.tiff ns_logo.tiff dot.tiff
+TIFF_HFILES = $(TIFFILES:.tiff=.h)
+TIFF_BFILES = $(TIFFILES:.tiff=_bitmap.h)
+
+CURSOR_HFILES = ns_wait1.h ns_wait1_bitmap.h \
+               ns_wait2.h ns_wait2_bitmap.h \
+               ns_wait3.h ns_wait3_bitmap.h
+OTHER_HFILES = hdot.h hdot_bitmap.h
+
+FONTFILES = 14.TimesIta
+FONT_HFILES = FontBitmap.h
+
+#PROGRAMS = machOconv mkfont dumptiff sig
+PROGRAMS = machOconv
+
+OUTFILES = $(PROGRAMS) $(TIFF_HFILES) $(TIFF_BFILES) $(CURSOR_HFILES) \
+               $(FONT_HFILES) $(OTHER_HFILES)
+DUMPTIFF = $(SYMROOT)/dumptiff
+DUMPTIFF_OBJS = tif_packbits.o dumptiff.o BooterBitmap.o
+SIG = $(SYMROOT)/sig
+SIG_OBJS = sig.o
+
+DIRS_NEEDED = $(OBJROOT) $(SYMROOT) $(LANGDIR)
+
+#BITMAPS = Panel.image Wait1.image Wait2.image Wait3.image
+BITMAPS = Panel.image
+FONTS = Default.font
+
+.SUFFIXES: .tiff
+.tiff.h:
+       $(DUMPTIFF) -o $(SYMROOT)/$* $<
+
+#all: $(DIRS_NEEDED) $(PROGRAMS) $(OUTFILES)
+all: $(DIRS_NEEDED) $(PROGRAMS) $(BITMAPS)
+
+#clean::
+#      cd $(SYMROOT); rm -f $(OUTFILES)
+clean::
+       cd $(SYMROOT); rm -f $(PROGRAMS)
+
+install_i386:: $(INSTALLDIR) $(LANGDIR)
+       cp $(BITMAPS) $(INSTALLDIR)
+       cp $(FONTS) $(INSTALLDIR)/English.lproj
+
+$(TIFF_HFILES): $(DUMPTIFF)
+$(TIFF_BFILES): $(TIFF_HFILES)
+$(CURSOR_HFILES): CURSOR_HFILES
+CURSOR_HFILES: $(DUMPTIFF)
+       $(DUMPTIFF) -c -o $(SYMROOT)/ns_wait
+$(FONT_HFILES): mkfont $(FONTFILES)
+       mkfont $(FONTFILES) -c $(SYMROOT)/$@
+       
+hdot.h hdot_bitmap.h: dot.tiff $(DUMPTIFF)
+       $(DUMPTIFF) -b 3 -o $(SYMROOT)/hdot dot.tiff
+
+sig: $(SIG_OBJS)
+       $(CC) $(CFLAGS) $(LDFLAGS) $(DEFINES) -o $(SYMROOT)/$@ $(SIG_OBJS)
+
+dumptiff: $(DUMPTIFF_OBJS)
+       $(CC) $(CFLAGS) $(LDFLAGS) $(DEFINES) -o $(SYMROOT)/$@ $(DUMPTIFF_OBJS) -lNeXT_s
+       
+mkfont: mkfont.o
+       $(CC) $(CFLAGS) $(LDFLAGS) $(DEFINES) -o $(SYMROOT)/$@ mkfont.o
+       
+machOconv: machOconv.o
+       $(CC) $(CFLAGS) $(LDFLAGS) $(DEFINES) -o $(SYMROOT)/$@ machOconv.o
+
+include ../MakeInc.dir
+
+#dependencies
+-include $(OBJROOT)/Makedep
+
diff --git a/gen/util/machOconv.c b/gen/util/machOconv.c
new file mode 100644 (file)
index 0000000..1e37f00
--- /dev/null
@@ -0,0 +1,156 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
+ * Reserved.  This file contains Original Code and/or Modifications of
+ * Original Code as defined in and that are subject to the Apple Public
+ * Source License Version 1.1 (the "License").  You may not use this file
+ * except in compliance with the License.  Please obtain a copy of the
+ * License at http://www.apple.com/publicsource and read it before using
+ * this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+#include <stdio.h>
+
+#include <mach/mach.h>
+#include <sys/file.h>
+#include <mach-o/loader.h>
+#include <architecture/byte_order.h>
+
+int    infile, outfile;
+
+struct mach_header     mh;
+unsigned               cmds;
+
+boolean_t              swap_ends;
+
+static unsigned long swap(
+    unsigned long x
+)
+{
+    if (swap_ends)
+       return NXSwapLong(x);
+    else
+       return x;
+}
+
+main(argc, argv)
+int    argc;
+char   *argv[];
+{
+    kern_return_t      result;
+    vm_address_t       data;
+    int                        nc, ncmds;
+    unsigned           cp;
+    
+    if (argc == 2) {
+       infile = open(argv[1], O_RDONLY);
+       if (infile < 0)
+           goto usage;
+       outfile = fileno(stdout);
+    }
+    else if (argc == 3) {
+       infile = open(argv[1], O_RDONLY);
+       if (infile < 0)
+           goto usage;
+       outfile = open(argv[2], O_WRONLY|O_CREAT|O_TRUNC, 0644);
+       if (outfile < 0)
+           goto usage;
+    }
+    else {
+usage:
+       fprintf(stderr, "usage: machOconv inputfile [outputfile]\n");
+       exit(1);
+    }
+    
+    nc = read(infile, &mh, sizeof (mh));
+    if (nc < 0) {
+       perror("read mach header");
+       exit(1);
+    }
+    if (nc < sizeof (mh)) {
+       fprintf(stderr, "read mach header: premature EOF %d\n", nc);
+       exit(1);
+    }
+    if (mh.magic == MH_MAGIC)
+       swap_ends = FALSE;
+    else if (mh.magic == MH_CIGAM)
+       swap_ends = TRUE;
+    else {
+       fprintf(stderr, "bad magic number %x\n", mh.magic);
+       exit(1);
+    }
+
+    cmds = calloc(swap(mh.sizeofcmds), sizeof (char));
+    if (cmds == 0) {
+       fprintf(stderr, "alloc load commands: no memory\n");
+       exit(1);
+    }
+    nc = read(infile, cmds, swap(mh.sizeofcmds));
+    if (nc < 0) {
+       perror("read load commands");
+       exit(1);
+    }
+    if (nc < swap(mh.sizeofcmds)) {
+       fprintf(stderr, "read load commands: premature EOF %d\n", nc);
+       exit(1);
+    }
+
+    for (      ncmds = swap(mh.ncmds), cp = cmds;
+               ncmds > 0; ncmds--) {
+           boolean_t   isDATA;
+           unsigned    vmsize;
+
+#define lcp    ((struct load_command *)cp)    
+       switch(swap(lcp->cmd)) {
+
+       case LC_SEGMENT:
+#define scp    ((struct segment_command *)cp)
+           isDATA = (strcmp(scp->segname, "__DATA") == 0);
+           if (isDATA)
+               vmsize = swap(scp->filesize);
+           else
+               vmsize = swap(scp->vmsize);
+           result = vm_allocate(mach_task_self(), &data, vmsize, TRUE);
+           if (result != KERN_SUCCESS) {
+               mach_error("vm_allocate segment data", result);
+               exit(1);
+           }
+
+           b_lseek(infile, swap(scp->fileoff), L_SET);
+           nc = read(infile, data, swap(scp->filesize));
+           if (nc < 0) {
+               perror("read segment data");
+               exit(1);
+           }
+           if (nc < swap(scp->filesize)) {
+               fprintf(stderr, "read segment data: premature EOF %d\n", nc);
+               exit(1);
+           }
+
+           nc = write(outfile, data, vmsize);
+           if (nc < vmsize) {
+               perror("write segment data");
+               exit(1);
+           }
+           
+           vm_deallocate(mach_task_self(), data, vmsize);
+           break;
+       }
+
+       cp += swap(lcp->cmdsize);
+    }
+       
+    exit(0);
+}
diff --git a/i386/MakeInc.dir b/i386/MakeInc.dir
new file mode 100644 (file)
index 0000000..ae3d2d8
--- /dev/null
@@ -0,0 +1,50 @@
+#
+# Common makefile targets.
+#
+# Define these variables (if desired) in directory makefiles:
+#      DIRS_NEEDED
+#      INSTALLDIR
+#      SRCROOT
+#
+ifneq "" "$(wildcard /bin/mkdirs)"
+  MKDIRS = /bin/mkdirs
+else
+  MKDIRS = /bin/mkdir -p
+endif
+
+installsrc:: $(SRCROOT)
+       cp $(ALLSRC) $(SRCROOT)
+       cd $(SRCROOT); chmod a-w $(ALLSRC)
+
+install:: installhdrs
+       @if [ -z "$(RC_ARCHS)" -o -n "$(RC_i386)" ]; then       \
+               $(MAKE) install_i386 OBJROOT=${OBJROOT}         \
+                       SYMROOT=${SYMROOT} DSTROOT=${DSTROOT}   \
+                       SRCROOT=${SRCROOT};                     \
+       else                                                    \
+               echo i386 not selected - null build.;           \
+       fi
+
+install_i386:: all
+
+installhdrs::
+
+clean::
+       /bin/rm -rf $(OBJROOT) *~
+
+.SUFFIXES: .s .i .c .o
+
+.c.o .m.o:
+       $(CC) $(CFLAGS) $(DEFINES) -c $(INC) $< -o $(OBJROOT)/$*.o \
+           -MD -dependency-file $(OBJROOT)/$*.d
+       md -u $(OBJROOT)/Makedep -f -d $(OBJROOT)/$*.d
+
+#.s.o:
+#      cc $(INC) -E $< > $(OBJROOT)/$*.o2
+#      $(AS) -o $(OBJROOT)/$@ $(OBJROOT)/$*.o2
+
+.s.o:
+       cc -c $(INC) -arch i386 -o $(OBJROOT)/$(@F) $<
+       
+$(DIRS_NEEDED) $(INSTALLDIR) $(SRCROOT):
+       $(MKDIRS) $@
diff --git a/i386/MakePaths.dir b/i386/MakePaths.dir
new file mode 100644 (file)
index 0000000..978ddf4
--- /dev/null
@@ -0,0 +1,9 @@
+#
+# Default paths for subdirectories.
+#
+
+OBJROOT=../../obj/i386/$(DIR)
+SYMROOT=../../sym/i386
+DSTROOT=../../dst/i386
+SRCROOT=/tmp
+
diff --git a/i386/Makefile b/i386/Makefile
new file mode 100644 (file)
index 0000000..a05daf6
--- /dev/null
@@ -0,0 +1,49 @@
+
+#      Makefile for i386 boot program
+#      define FLOPPY and SMALL using DEFINES macro as necessary
+
+CFLAGS = -O $(MORECPP) -arch i386 -g -mi386:unaligned-text -static
+DEFINES=
+CONFIG = hd
+LIBDIR = libsa
+INC = -I. -I$(LIBDIR)
+ifneq "" "$(wildcard /bin/mkdirs)"
+  MKDIRS = /bin/mkdirs
+else
+  MKDIRS = /bin/mkdir -p
+endif
+AS = as
+LD = ld
+# LIBS= -lc_static
+
+#
+# these paths are only valid in subdirectories of this directory
+#
+OBJROOT=`pwd`/../../obj/i386
+SYMROOT=`pwd`/../../sym/i386
+DSTROOT=`pwd`/../../dst/i386
+SRCROOT=/tmp
+
+VPATH = $(OBJROOT):$(SYMROOT)
+
+# SUBDIRS = rcz util libsa libsaio sarld nasm boot2 boot1 boot0 strings
+SUBDIRS = rcz util libsa libsaio nasm boot2 boot1 boot0 strings
+
+all tags clean debug install installhdrs:
+       @for i in ${SUBDIRS}; \
+       do \
+               echo ================= make $@ for $$i =================; \
+               ( cd $$i; ${MAKE}                                         \
+                       "OBJROOT=$(OBJROOT)/$$i"                          \
+                       "SYMROOT=$(SYMROOT)"                              \
+                       "DSTROOT=$(DSTROOT)"                              \
+                       "SRCROOT=$(SRCROOT)"                              \
+                       "RC_ARCHS=$(RC_ARCHS)"                            \
+                       "RC_KANJI=$(RC_KANJI)"                            \
+                       "JAPANESE=$(JAPANESE)"                            \
+                       "RC_CFLAGS=$(RC_CFLAGS)" $@                       \
+               ) || exit $?;                                             \
+       done
+
+installsrc:
+       tar cf - . | (cd ${SRCROOT}; tar xfBp -)
diff --git a/i386/boot0/Makefile b/i386/boot0/Makefile
new file mode 100644 (file)
index 0000000..38eff11
--- /dev/null
@@ -0,0 +1,21 @@
+
+DIR = boot0
+include ../MakePaths.dir
+
+NASM = $(SYMROOT)/nasm
+INSTALLDIR = $(DSTROOT)/usr/standalone/i386
+DIRS_NEEDED = $(SYMROOT)
+
+all: $(DIRS_NEEDED) boot0
+
+boot0: boot0.s Makefile $(NASM)
+       $(NASM) boot0.s -o $(SYMROOT)/$@
+
+install_i386:: all $(INSTALLDIR)
+       cp $(SYMROOT)/boot0 $(INSTALLDIR)
+       cd $(INSTALLDIR); chmod u+w boot0
+
+include ../MakeInc.dir
+
+#dependencies
+
diff --git a/i386/boot0/boot0.s b/i386/boot0/boot0.s
new file mode 100644 (file)
index 0000000..dcf9c84
--- /dev/null
@@ -0,0 +1,567 @@
+; Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+;
+; @APPLE_LICENSE_HEADER_START@
+; 
+; Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
+; Reserved.  This file contains Original Code and/or Modifications of
+; Original Code as defined in and that are subject to the Apple Public
+; Source License Version 1.1 (the "License").  You may not use this file
+; except in compliance with the License.  Please obtain a copy of the
+; License at http://www.apple.com/publicsource and read it before using
+; this file.
+; 
+; The Original Code and all software distributed under the License are
+; distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+; EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+; INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+; FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
+; License for the specific language governing rights and limitations
+; under the License.
+; 
+; @APPLE_LICENSE_HEADER_END@
+;
+; Boot Loader: boot0
+;
+; A small boot sector program written in x86 assembly whose only
+; responsibility is to locate the booter partition, load the
+; booter into memory, and jump to the booter's entry point.
+; The booter partition can be a primary or a logical partition.
+; But the booter partition must reside within the 8GB limit
+; imposed by CHS addressing + translation.
+; 
+; This boot loader can be placed at any of the following places:
+; * Master Boot Record (MBR)
+; * Boot sector of an extended partition
+; * Boot sector of a primary partition
+; * Boot sector of a logical partition
+;
+; In order to coexist with a fdisk partition table (64 bytes), and
+; leave room for a two byte signature (0xAA55) in the end, boot0 is
+; restricted to 446 bytes (512 - 64 - 2). If boot0 did not have to
+; live in the MBR, then we would have 510 bytes to play with.
+;
+; boot0 is always loaded by the BIOS or another first level booter
+; to 0:7C00h.
+;
+; This code is written for the NASM assembler.
+;   nasm boot0.s -o boot0
+
+;--------------------------------------------------------------------------
+; Constants.
+
+DEBUG           EQU  0                  ; enable debugging output
+
+BOOTSEG         EQU  0x0                ; our sole segment
+BOOTSP          EQU  0xFFF0             ; stack pointer
+BOOTLOAD        EQU  0x7C00             ; booter load address
+BOOTRELOC       EQU  0xE000             ; booter is relocated here
+BOOTSIG         EQU  0xAA55             ; booter signature
+
+BOOT2_SIZE      EQU  88                 ; load this many blocks for boot2
+BOOT2_ADDR      EQU  0x3000             ; where to load boot2
+
+DRIVE_NUM       EQU  0x80               ; "C" drive
+SECTOR_BYTES    EQU  512                ; sector size in bytes
+
+BUF_MBR         EQU  0x1000             ; memory buffer for MBR
+BUF_EXT         EQU  0x1200             ; memory buffer for extended partition
+
+TABLE_MAIN      EQU  BUF_MBR + 0x1be    ; location of main partition table
+TABLE_EXT       EQU  BUF_EXT + 0x1be    ; location of ext partition table
+ENTRY_SIZE      EQU  16                 ; size of each fdisk partition entry
+TYPE_BOOT       EQU  0xab               ; partition type we are looking for
+TYPE_EXT        EQU  0x05               ; extended partition type
+TYPE_EXT_1      EQU  0x0f               ; Windows extended partition
+TYPE_EXT_2      EQU  0x85               ; Linux extended partition
+EXT_LEVELS_MAX  EQU  128                ; max extended partition levels
+
+; Disk parameters gathered through INT13/F8 call.
+;
+max_sectors     db   0                  ; number of sectors per track
+max_heads       db   0                  ; number of heads
+
+; Parameters to our load function.
+;
+chs_cx          dw   0                  ; cx register for INT13/F2 call
+chs_dx          dw   0                  ; dx register for INT13/F2 call
+
+
+;--------------------------------------------------------------------------
+; Start of text segment.
+
+    SEGMENT .text
+
+    ORG     0xE000              ; must match BOOTRELOC
+
+;--------------------------------------------------------------------------
+; Loaded at 0:7c00h.
+;
+start
+    ; Set up the stack to grow down from BOOTSEG:BOOTSP.
+    ; Interrupts should be off while the stack is being manipulated.
+    ;
+    cli                         ; interrupts off
+    mov     ax, BOOTSEG         ;
+    mov     ss, ax              ; ss <- BOOTSEG
+    mov     sp, BOOTSP          ; sp <- BOOTSP
+    sti                         ; reenable interrupts
+
+    ; Relocate the booter code from DS:SI to ES:DI,
+    ; or from 0:7C00h to BOOTSEG:BOOTRELOC.
+    ;
+    mov     es, ax              ; es <- BOOTSEG
+    xor     ax, ax
+    mov     ds, ax              ; ds <- 0
+    mov     si, BOOTLOAD        ; si <- BOOTLOAD (source)
+    mov     di, BOOTRELOC       ; di <- BOOTRELOC (destination)
+    ;
+    cld                         ; auto-increment SI and/or DI registers
+    mov     cx, 256             ; copy 256 words (512 bytes)
+    repnz   movsw               ; repeat string move (word) operation
+
+    ; Code relocated, jump to start_reloc in relocated location.
+    ;
+    jmp     BOOTSEG:start_reloc
+
+;--------------------------------------------------------------------------
+; Start execution from the relocated location.
+;
+start_reloc
+    mov     ax, BOOTSEG
+    mov     ds, ax              ; ds <- BOOTSEG
+
+    mov     al, '='             ; indicate execution start
+    call    putchar
+
+    ; Get disk parameters (CHS) using INT13/F8 call.
+    ;
+    mov     dl, DRIVE_NUM       ; boot drive is drive C
+    mov     ah, 8               ; Read Disk Driver Parameter function
+    int     0x13
+    and     cl, 0x3f            ; sectors/track
+    mov     [max_sectors], cl
+    mov     [max_heads], dh
+    jc      error
+
+    mov     al, '>'             ; indicate INT13/F8 success
+    call    putchar
+
+    ; Since this code may not always reside in the MBR, we will always
+    ; start by loading the MBR to BUF_MBR.
+    ;
+    mov     WORD [chs_cx], 0x0001       ; cyl = 0, sect = 1
+    mov     BYTE [chs_dx + 1], 0        ; head = 0
+    xor     cx, cx                      ; skip 0 sectors
+    mov     ax, 1                       ; read 1 sector
+    mov     bx, BUF_MBR                 ; load buffer
+    call    load
+    jc      error
+
+    mov     di, TABLE_MAIN              ; argument for find_booter
+    cmp     WORD [di + 64], BOOTSIG     ; correct signature found?
+    jne     error                       ; Oops! no signature!
+    mov     bl, TYPE_BOOT               ; look for this partition type
+    mov     bh, 0                       ; initial nesting level is 0
+    call    find_booter
+
+error
+    mov     si, load_error
+    call    message
+hang_1
+    jmp     hang_1
+
+;--------------------------------------------------------------------------
+; Locate the booter partition and load the booter.
+;
+; Arguments:
+;   di - pointer to fdisk partition table.
+;   bl - partition type to look for.
+;
+; The following registers are modified:
+;   ax, bh
+;
+find_booter
+    push    cx
+    push    si
+
+    mov     si, di              ; si <- pointer to partition table
+    mov     cx, 4               ; 4 partition entries per table
+
+find_booter_pri
+    ;
+    ; Hunt for a fdisk partition type that matches the value in bl.
+    ;
+%IF DEBUG
+    mov     al, bh              ; log partition type seen
+    call    putspace
+    mov     al, [si + 4]
+    call    display_byte
+%ENDIF
+
+    cmp     BYTE [si + 4], bl   ; Is this the booter partition?
+    je      load_booter         ; yes, load the booter
+
+    add     si, ENTRY_SIZE      ; si <- next partition entry
+    loop    find_booter_pri     ; loop while cx is not zero
+
+    ; No primary (or perhaps logical) booter partition found in the
+    ; current partition table. Restart and look for extended partitions.
+    ;
+    mov     si, di              ; si <- pointer to partition table
+    mov     cx, 4               ; 4 partition entries per table
+
+find_booter_ext
+    ;
+    ; Look for extended partition entries in the partition table.
+    ;
+%IF DEBUG
+    mov     al, bh              ; log partition type seen
+    call    putspace
+    mov     al, 'E'
+    call    putchar
+    mov     al, [si + 4]
+    call    display_byte
+%ENDIF
+
+    cmp     BYTE [si + 4], TYPE_EXT     ; Is this an extended partition?
+    je      find_booter_ext_2           ; yes, load its partition table
+
+    cmp     BYTE [si + 4], TYPE_EXT_1   ; Is this an extended partition?
+    je      find_booter_ext_2           ; yes, load its partition table
+       
+    cmp     BYTE [si + 4], TYPE_EXT_2   ; Is this an extended partition?
+    je      find_booter_ext_2           ; yes, load its partition table
+
+find_booter_ext_1
+    ;
+    ; si is not pointing to an extended partition entry,
+    ; try the next entry in the partition table.
+    ;
+    add     si, ENTRY_SIZE      ; si <- next partition entry
+    loop    find_booter_ext     ; loop while cx is not zero
+
+    jmp     find_booter_end     ; give up
+
+find_booter_ext_2
+    cmp     bh, EXT_LEVELS_MAX
+    ja      find_booter_end     ; in too deep!
+
+    inc     bh                  ; increment nesting level counter
+
+    ; Prepare the arguments for the load function call to
+    ; load the extended partition table into memory.
+    ; Note that si points to the extended partition entry.
+    ;
+    mov     ax, [si]            ; DH/DL
+    mov     [chs_dx], ax
+    mov     ax, [si + 2]        ; CH/CL
+    mov     [chs_cx], ax
+    pusha
+    xor     cx, cx              ; skip 0 sectors
+    mov     ax, 1               ; read 1 sector
+    mov     bx, BUF_EXT         ; load to BUF_EXT
+    call    load
+    popa
+
+    jc      find_booter_ext_3   ; bail out if load failed
+
+    mov     di, TABLE_EXT       ; di <- pointer to new partition table
+    cmp     WORD [di + 64], BOOTSIG
+    jne     find_booter_ext_3   ; OhOh! no signature!
+
+    call    find_booter         ; recursion...
+
+find_booter_ext_3
+    dec     bh                  ; decrement nesting level counter
+
+    ; If we got here, then we know there isn't a booter
+    ; partition linked from this partition entry.
+
+    test    bh, bh              ; if we are at level 0, then
+    jz      find_booter_ext_1   ; look for next extended partition entry
+
+find_booter_end
+    pop     si
+    pop     cx
+    ret
+
+;--------------------------------------------------------------------------
+; Yeah! Found the booter partition. The first sector in this partition
+; is reserved for the boot sector code (us). So load the booter
+; starting from the second sector in the partition, then jump to the
+; start of the booter.
+;
+load_booter
+    mov     ax, [si]            ; DH/DL
+    mov     [chs_dx], ax
+    mov     ax, [si + 2]        ; CH/CL
+    mov     [chs_cx], ax
+
+    mov     cx, 1               ; skip the initial boot sector
+    mov     ax, BOOT2_SIZE      ; read BOOT2_SIZE sectors
+    mov     bx, BOOT2_ADDR      ; where to place boot2 code
+    call    load                ; load it...
+
+    xor     edx, edx            ; argument for boot2 (hard drive boot)
+    jmp     BOOTSEG:BOOT2_ADDR  ; there is no going back now!
+
+;--------------------------------------------------------------------------
+; Load sectors from disk using INT13/F2 call. The sectors are loaded
+; one sector at a time to avoid any BIOS bugs, and eliminate
+; complexities with crossing track boundaries, and other gotchas.
+;
+; Arguments:
+;   cx - number of sectors to skip
+;   ax - number of sectors to read
+;   bx - pointer to the memory buffer (must not cross a segment boundary)
+;   [chs_cx][chs_dx] - CHS starting position
+;
+; Returns:
+;   CF = 0  success
+;   CF = 1  error
+;
+; The caller must save any registers it needs.
+;
+load
+    jcxz    load_sectors
+    call    next_sector         ; [chs_cx][chs_dx] <- next sector
+    loop    load
+
+load_sectors
+    mov     cx, ax              ; cx <- number of sectors to read
+
+load_loop
+    call    read_sector         ; load a single sector
+    jc      load_exit           ; abort if carry flag is set
+    add     bx, SECTOR_BYTES    ; increment buffer pointer
+    call    next_sector         ; [chs_cx][chs_dx] <- next sector
+    loop    load_loop
+    clc                         ; successful exit
+load_exit
+    ret
+
+;--------------------------------------------------------------------------
+; Read a single sector from the hard disk.
+;
+; Arguments:
+;   [chs_cx][chs_dx] - CHS starting position
+;   bx - pointer to the sector memory buffer
+;        (must not cross a segment boundary)
+;
+; Returns:
+;   CF = 0  success
+;   CF = 1  error
+;
+; Caller's cx register is preserved.
+;
+read_sector
+    push    cx
+    mov     cx, 5               ; try 5 times to read the sector
+
+read_sector_1
+    mov     bp, cx              ; save cx
+
+    mov     cx, [chs_cx]
+    mov     dx, [chs_dx]
+    mov     dl, DRIVE_NUM       ; drive number
+    mov     ax, 0x0201          ; Func 2, read 1 sector
+    int     0x13                ; read sector
+    jnc     read_sector_ok      ; CF = 0 indicates success
+
+    mov     al, '*'             ; sector read error indicator
+    call    putchar
+
+    xor     ax, ax              ; Reset the drive and retry the read
+    int     0x13
+
+    mov     cx, bp
+    loop    read_sector_1       ; retry while cx is not zero
+
+    stc                         ; set carry flag to indicate error
+    pop     cx
+    ret
+
+read_sector_ok
+    mov     al, '.'             ; successful sector read indicator
+    call    putchar
+    clc                         ; success, clear carry flag
+    pop     cx
+    ret
+
+;--------------------------------------------------------------------------
+; Given the current CHS position stored in [chs_cx][chs_dx], update
+; it so that the value in [chs_cx][chs_dx] points to the following
+; sector.
+;
+; Arguments:
+;   [chs_cx][chs_dx] - CHS position
+;
+;   [max_sectors] and [max_heads] must be valid.
+;
+; Caller's ax and bx registers are preserved.
+;
+next_sector
+    push    ax
+    push    bx
+
+    ; Extract the CHS values from the packed register values in memory.
+    ;
+    mov     al, [chs_cx]
+    and     al, 0x3f            ; al <- sector number (1-63)
+
+    mov     bx, [chs_cx]
+    rol     bl, 2
+    ror     bx, 8
+    and     bx, 0x03ff          ; bx <- cylinder number
+
+    mov     ah, [chs_dx + 1]    ; ah <- head number
+
+    inc     al                  ; Increment CHS by one sector.
+    cmp     al, [max_sectors]
+    jbe     next_sector_done
+
+    inc     ah
+    cmp     ah, [max_heads]
+    jbe     next_sector_new_head
+
+    inc     bx
+
+next_sector_new_cyl
+    xor     ah, ah              ; head number starts at 0
+
+next_sector_new_head
+    mov     al, 1               ; sector number starts at 1
+
+next_sector_done
+    ; Reassemble the CHS values back into the packed representation
+    ; in memory.
+    ;
+    mov     [chs_cx + 1], bl    ; lower 8-bits of the 10-bit cylinder
+    ror     bh, 2
+    or      bh, al
+    mov     [chs_cx], bh        ; cylinder & sector number
+    mov     [chs_dx + 1], ah    ; head number
+
+    pop     bx
+    pop     ax
+    ret
+
+;--------------------------------------------------------------------------
+; Write a string to the console.
+;
+; Arguments:
+;   ds:si   pointer to a NULL terminated string.
+;
+; The following registers are modified:
+;   ax, bx, si
+;
+message
+    mov     bx, 1               ; bh=0, bl=1 (blue)
+    cld                         ; increment SI after each lodsb call
+message_loop
+    lodsb                       ; load a byte from DS:SI into al
+    cmp     al, 0               ; Is it a NULL?
+    je      message_done        ; yes, all done
+    mov     ah, 0xE             ; bios INT10 Func 0xE
+    int     0x10                ; bios display a byte in tty mode
+    jmp     short message_loop
+message_done
+    ret
+
+;--------------------------------------------------------------------------
+; Write a ASCII character to the console.
+;
+; Arguments:
+;   al   contains the ASCII character printed.
+;
+putchar
+    push    bx
+    mov     bx, 1               ; bh=0, bl=1 (blue)
+    mov     ah, 0x0e            ; bios int 10, function 0xe
+    int     0x10                ; bios display a byte in tty mode
+    pop     bx
+    ret
+
+%IF DEBUG
+;==========================================================================
+; DEBUG FUNCTION START
+;
+; If DEBUG is set to 1, this booter will become too large for the MBR,
+; but it will still be less than 510 bytes, which is fine for a partition's
+; boot sector.
+;==========================================================================
+
+;--------------------------------------------------------------------------
+; Write a variable number of spaces to the console.
+;
+; Arguments:
+;   al   number to spaces to display
+;
+putspace
+    push    cx
+    xor     cx, cx
+    mov     cl, al              ; use cx as the loop counter
+    mov     al, ' '             ; character to print
+putspace_loop
+    jcxz    putspace_done
+    call    putchar
+    loop    putspace_loop
+putspace_done
+    pop     cx
+    ret
+
+;--------------------------------------------------------------------------
+; Write the hex byte value to the console.
+;
+; Arguments:
+;   al   contains the byte to be displayed. e.g. if al is 0x3f, then 3F
+;        will be displayed on screen.
+;
+display_byte
+    push    ax
+    ror     al, 4
+    call    display_nibble      ; display upper nibble
+    pop     ax
+    call    display_nibble      ; display lower nibble
+    ;
+    mov     ax, 10              ; display carriage return
+    call    putchar
+    mov     ax, 13
+    call    putchar
+    ret
+
+display_nibble
+    and     al, 0x0f
+    add     al, '0'
+    cmp     al, '9'
+    jna     display_nibble_1
+    add     al, 'A' - '9' - 1
+display_nibble_1
+    call    putchar
+    ret
+
+;==========================================================================
+; DEBUG FUNCTION END
+;==========================================================================
+%ENDIF
+
+;--------------------------------------------------------------------------
+; NULL terminated strings.
+;
+load_error   db  10, 13, 'Load Error', 0
+
+;--------------------------------------------------------------------------
+; Pad the rest of the 512 byte sized booter with zeroes. The last
+; two bytes is the mandatory boot sector signature.
+;
+; If the booter code becomes too large, then nasm will complain
+; that the 'times' argument is negative.
+
+pad_boot
+       times 446-($-$$) db 0
+
+pad_table_and_sig
+    times 510-($-$$) db 0
+    dw BOOTSIG
+
+    END
diff --git a/i386/boot1/Makefile b/i386/boot1/Makefile
new file mode 100644 (file)
index 0000000..0cd0a9f
--- /dev/null
@@ -0,0 +1,31 @@
+
+DIR = boot1
+include ../MakePaths.dir
+
+INSTALLDIR = $(DSTROOT)/usr/standalone/i386
+DIRS_NEEDED = $(OBJROOT) $(SYMROOT)
+
+FOREIGNNEXT = boot1f
+
+NASM = $(SYMROOT)/nasm
+
+VERSIONED_FILES = boot1f
+
+VERS = `vers_string -f 5.0 | tr - .`
+NEW_VERS = Rhapsody boot1 v$(VERS)
+ifneq "" "$(wildcard /bin/mkdirs)"
+  MKDIRS = /bin/mkdirs
+else
+  MKDIRS = /bin/mkdir -p
+endif
+
+all: $(DIRS_NEEDED) $(VERSIONED_FILES)
+
+boot1f: boot1.s Makefile
+       $(NASM) -dBOOTDEV=FLOPPY -dVERS="'$(NEW_VERS)'" boot1.s -o $(SYMROOT)/$@
+
+install_i386:: all $(INSTALLDIR)
+       cp $(SYMROOT)/boot1f $(INSTALLDIR)/
+       cd $(INSTALLDIR); chmod u+w $(FOREIGNNEXT)
+
+include ../MakeInc.dir
diff --git a/i386/boot1/boot1 b/i386/boot1/boot1
new file mode 100755 (executable)
index 0000000..e61e42f
Binary files /dev/null and b/i386/boot1/boot1 differ
diff --git a/i386/boot1/boot1.asm b/i386/boot1/boot1.asm
new file mode 100644 (file)
index 0000000..d1ec4f8
--- /dev/null
@@ -0,0 +1,386 @@
+; boot1.asm - boot1 written for turbo assembler, since gas only\r
+; generates 32 bit code and this must run in real mode.
+; To compile as hard disk boot1:
+;      tasm /m3 /dBOOTDEV=HDISK boot1
+;      tlink boot1
+;      exe2bin boot1
+;      ren boot1.bin boot1
+; To compile as floppy boot1f:
+;      tasm /m3 /dBOOTDEV=FLOPPY boot1 ,boot1f
+;      tlink boot1f
+;      exe2bin boot1f
+;      ren boot1f.bin boot1f
+\r
+;***********************************************************************\r
+;      This is the code for the NeXT boot1 bootsector.
+;***********************************************************************\r
+\r
+       P486                    ;enable i386 instructions\r
+       IDEAL\r
+       SEGMENT CSEG\r
+       ASSUME CS:CSEG,DS:CSEG\r
+\r
+       SDEBUG = 0\r
+\r
+;BOOTSEG               =       100h    ; boot will be loaded at 4k\r
+;BOOTOFF               =       0000h
+BOOTSEG                =       00h
+BOOTOFF                =       1000h
+BUFSZ          =       2000h   ; 8K disk transfer buffer\r
+\r
+; FDISK partition table in sector 0\r
+PARTSTART      =       1beh    ; starting address of partition table\r
+NUMPART                =       4       ; number of partitions in partition table\r
+PARTSZ         =       16      ; each partition table entry is 16 bytes\r
+BOOT_IND       =       0       ; offset of boot indicator in partition table\r
+BEG_HEAD       =       1       ; offset of beginning head\r
+BEG_SEC                =       2       ; offset of beginning sector\r
+BEG_CYL                =       3       ; offset of beginning cylinder\r
+NAME_OFFSET    =       4       ; offset of partition name\r
+PARTSEC                =       8       ; offset of partition sector specifier\r
+NEXTNAME       =       0A7h    ; value of boot_ind, means bootable partition\r
+\r
+LOADSZ         =       88      ; maxiumum possible size of unix boot\r- 44k
+\r
+FLOPPY         =       0
+HDISK          =       80h
+
+;BOOTDEV       =       ?       ; set to 00h for floppy, 80h for hard disk
+                               ; (use a command line switch to set)
+
+; NeXT disk label\r
+DISKLABEL      =       15      ; sector num of 2nd disk label, 1st is trashed by bootsec\r
+DL_DISKTAB     =       44\r
+\r
+; We support disk label version 3 "3Vld" in our little endian world\r
+DL_V3          =       33566c64h\r
+\r
+; NeXT disktab\r
+DT_SECSIZE     =       48\r
+DT_BOOT0_BLKNO =       80\r
+\r\r
+; This code is a replacement for boot1.  It is loaded at 0x0:0x7c00\r
+\r
+start:\r
+       mov     ax,BOOTSEG
+       cli                     ; interrupts off\r
+       mov     ss,ax           ; set up stack seg\r
+       mov     sp,0fff0h\r
+       sti                     ; reenable interrupts\r
+
+       xor     ax,ax
+       mov     es,ax
+       mov     ds,ax
+       mov     si,7C00h
+       cld                     ; so pointers will get updated\r
+       mov     di,0E000h       ; relocate boot program to 0xE000\r
+       mov     cx,100h         ; copy 256x2 bytes\r
+       repnz   movsw           ; move it\r
+       off1    =  0E000h + (a1 - start)\r
+       jmp     FAR 0000:off1   ; jump to a1 in relocated place\r
+
+a1:\r
+       mov     ax,0E00h\r
+       mov     ds,ax\r
+       mov     ax,BOOTSEG\r
+       mov     es,ax\r
+\r
+       ; load the boot loader (boot2) into BOOTSEG:BUFSZ\r
+       call    loadboot\r
+\r
+       ; ljmp to the second stage boot loader (boot2).\r
+       ; After ljmp, cs is BOOTSEG and boot1 (BUFSZ bytes) will be used\r
+       ; as an internal buffer "intbuf".\r
+\r
+       xor     edx,edx         ; bootdev = 0 for hard disk\r
+IF     ( BOOTDEV EQ FLOPPY )
+       inc     edx             ; bootdev = 1 for floppy disk
+ENDIF
+
+       ;boot2 immediately follows disk buffer;  4K + BUFSZ\r
+       jmp     FAR  BOOTSEG:(BOOTOFF + BUFSZ)  
+                               ; jump to boot2 in loaded location\r
+\r
+\r
+\r
+loadboot:\r
+       mov     si, OFFSET intro\r
+       call    message         ; display intro message\r
+\r
+       ; load second stage boot from fixed disk\r
+       ; get boot drive parameters\r
+       ; Note: I believe that the bootsector read may not be necessary;\r
+       ; at least some blk0 bootsectors leave a pointer to the active\r
+       ; partition entry in si (assuming there was another blk0 bootsec)\r
+\r
+       call    getinfo\r
+\r      
+IF     ( BOOTDEV EQ HDISK )
+       
+       ; read sector 0 into BOOTSEG:0 by using BIOS call (INT 13H 02H)\r
+       ; this gets info on the disk's actual partition table\r
+       ; However, in the case of multiple partitions, this may not\r
+       ; be the same as the sector with the code here.\r
+\r
+       mov     di,5            ; try 5 times to read bootsector\r
+\r
+retry_disk:\r
+               xor     bx, bx          ; buffer is BOOTSEG:0\r
+               mov     ax,201h\r
+               mov     cx,bx\r
+               mov     dx,bx\r
+               mov     bx,BOOTOFF      ; actually, it's 0:BOOTOFF
+               inc     cx              ; cyl 0, sector 1\r
+               mov     dl,BOOTDEV      ; target 0, head 0\r
+\r
+               push    di\r
+               int     13h             ; read the bootsector\r
+               pop     di\r
+\r
+               jnb     read_success1\r
+\r
+               ; woops, bios failed to read sector\r
+               xor     ax,ax\r
+               int     13h             ; reset disk\r
+               dec     di\r
+               jne     retry_disk\r
+\r
+               jmp     read_error      ; disk failed\r
+\r
+\r
+read_success1:         ; find the NeXT partition\r
+       mov     bx,PARTSTART\r
+       mov     cx,NUMPART\r
+\r
+again:\r
+       mov     al, [es:(bx+BOOTOFF)+NAME_OFFSET]
+                                       ; get partition name\r
+       cmp     al, NEXTNAME            ; is it NeXT partition?\r
+       jne     cont                    ; nope, keep looking\r
+\r
+foundNextPart:                         ; found it, get label location\r
+\r
+       mov     eax, [es:(bx+BOOTOFF)+PARTSEC]
+                                       ; offset to NeXT partition\r
+       add     eax, DISKLABEL          ; add offset to the label\r
+       jmp     getLabl                 ; fetch that label\r
+\r
+cont:\r
+       add     bx, PARTSZ\r
+       loop    again                   ; if more part table entries,
+                                       ; keep looking\r
+\r
+       ; fall through, didn't find NeXT disk partition entry\r
+\r
+no_fdisk:\r
+ENDIF
+       ; Read NeXT disk label\r
+       mov     eax, DISKLABEL          ; Get block number of label\r
+getLabl:\r
+       mov     bx,BOOTOFF              ; read into load area
+       mov     cx,1
+       call    readSectors\r
+\r
+       ; we used to think about testing the disk label version here...\r
+
+       mov     bx,BOOTOFF              ; point to beginning of label
+\r
+       ; Use values from label to read entire boot program\r
+       ; Get block number of boot\r
+       ; Get dl_secsize and dl_boot0_blkno[0]\r
+       mov     edx, [es:(bx + DL_DISKTAB+DT_SECSIZE)]\r
+       bswap   edx                     ; edx -> sector size\r
+\r
+       mov     eax, [es:(bx + DL_DISKTAB+DT_BOOT0_BLKNO)]\r
+       bswap   eax                     ; eax -> block #\r
+
+       ; Compute dl_secsize * dt_boot0_blkno[0] / 512\r
+       shr     edx, 9                  ; divide dl_secsize by 512\r
+       mul     edx                     ; multiply boot block loc
+                                       ; by dl_secsize/512\r
+                                       ; eax has secno\r
+       mov     bx, (BUFSZ + BOOTOFF)   ; read boot2 into BOOTSEG:BUFSZ\r
+       mov     edi, LOADSZ             ; read this many sectors\r
+nexsec:\r
+               push    eax             ; push sector #\r
+               push    bx              ; push buffer address\r
+               mov     ecx, edi        ; max number of sectors to read
+               
+               call    readSectors\r
+               pop     bx\r
+               pop     eax\r
+               add     eax, ecx        ; add number of sectors read
+               sub     di, cx
+               shl     cx, 9           ; multiply by 512 bytes per sector
+               add     bx, cx
+
+       cmp di, 0
+       jne     nexsec\r
+
+       ret\r
+\r
+spt:   DW      0                       ; sectors;track (one-based)\r
+spc:   DW      0                       ; tracks;cylinder (zero-based)\r
+nsec:  DW      0                       ; number of sectors to read
+\r
+readSectors:   ; eax has starting block #, bx has offset from BOOTSEG\r
+               ; cx has maximum number of sectors to read
+               ; Trashes ax, bx, cx, dx\r
+\r
+       ; BIOS call "INT 0x13 Function 0x2" to read sectors\r
+       ;       ah = 0x2        al = number of sectors\r
+       ;       ch = cylinder   cl = sector\r
+       ;       dh = head       dl = drive (0x80=hard disk, 0=floppy disk)\r
+       ;       es:bx = segment:offset of buffer\r
+
+IF     ( BOOTDEV EQ FLOPPY )
+               push    eax\r
+               mov     al,'.'\r
+               call    putchr\r
+               pop     eax\r
+ENDIF\r
+\r
+       push    bx                      ; save offset\r
+       mov [WORD nsec], cx
+\r
+       mov     ebx, eax                ; bx -> block #\r
+       xor     ecx, ecx\r
+       mov     cx, [WORD spc]          ; cx -> sectors/cyl\r
+\r
+       xor     edx,edx                 ; prepare for division\r
+       div     ecx                     ; eax = cyl, edx=remainder\r
+       push    ax                      ; save cylinder #, sec/spc\r
+\r
+       mov     eax, edx\r
+       mov     cx,  [WORD spt]         ; ecx -> sectors/track\r
+       xor     edx,edx                 ; prepare for division\r
+       div     ecx                     ; eax = head\r
+       push    ax                      ; save head, (secspc)/spt\r
+\r
+       mov     eax, ebx                ; reload block #\r
+       xor     edx, edx                ; prepare for division\r
+       div     ecx                     ; edx has sector #\r
+\r
+       sub     cx, dx                  ;cx now has number of sectors to read
+       cmp     cx, [WORD nsec]
+       jge     last                    ; use the minimum of bx and cx
+       mov     [WORD nsec], cx
+last:
+
+       mov     cx, dx                  ; cl -> sector\r
+       inc     cl                      ; starts @ 1\r
+       pop     ax                      ; get head\r
+       mov     dh, al                  ; dh -> head\r
+\r
+       pop     ax                      ; get cyl\r
+       mov     ch, al                  ; ch -> cyl\r
+       mov     dl, BOOTDEV             ; floppy disk\r
+\r
+       xor     al,al\r
+       shr     ax,2\r
+       or      cl,al                   ; retain pesky big cyl bits\r
+
+;      mov     al, 1                   ; get # of sectors\r
+;pop ax ; number of sectors to read
+mov ax, [WORD nsec]
+       pop     bx                      ; get buffer\r
+       mov     ah, 2                   ; bios read function\r
+       \r
+       int     13h\r
+\r
+       jb      read_error\r
+mov cx, [WORD nsec] ; return number of sectors read
+       ret\r
+\r
+\r
+getinfo:       ; get some drive parameters\r
+       mov     dl, BOOTDEV             ; boot drive is drive C\r
+       mov     ah, 8h\r
+       push    es
+       int     13h\r
+       pop     es
+\r
+       mov     al, dh                  ; max head #\r
+       inc     al                      ; al -> tracks/cyl\r
+       and     cx, 3fh                 ; cl -> secs/track\r
+       mul     cl                      ; ax -> secs/cyl\r
+       mov     [WORD spc], ax\r
+       mov     [WORD spt], cx\r
+\r
+       ret\r
+\r
+\r
+message:                               ; write the error message in ds:esi
+                                       ; to console\r
+       push    es\r
+       mov     ax,ds\r
+       mov     es,ax\r
+\r
+       mov     bx, 1                   ; bh=0, bl=1 (blue)\r
+       cld\r
+\r
+nextb:\r
+       lodsb                           ; load a byte into al\r
+       cmp     al, 0\r
+       je      done\r
+       mov     ah, 0eh                 ; bios int 10, function 0xe\r
+       int     10h                     ; bios display a byte in tty mode\r
+       jmp     nextb\r
+done:  pop     es\r
+       ret\r
+\r
+putchr:\r
+       push    bx\r
+       mov     bx, 1                   ; bh=0, bl=1 (blue)\r
+       mov     ah, 0eh                 ; bios int 10, function 0xe\r
+       int     10h                     ; bios display a byte in tty mode\r
+       pop     bx\r
+       ret\r
+
+IF     SDEBUG\r
+hexout:\r                               ; print ebx as hex number
+       push    cx\r
+       push    ax\r
+       mov     cx,8                    ;output 8 nibbles\r
+\r
+htop:\r
+               rol     ebx,4\r
+               mov     al,bl\r
+               and     al,0fh\r
+               cmp     al,0ah\r
+               jb      o_digit\r
+               add     al,'A'-10\r
+               jmp     o_print\r
+o_digit:       add     al,'0'\r
+o_print:       call    putchr\r
+               dec     cx\r
+               jne     htop\r
+;      mov     al,10\r
+;      call    putchr\r
+;      mov     al,13\r
+;      call    putchr\r
+       mov     al,' '
+       call    putchr
+       pop     ax\r
+       pop     cx\r
+       ret\r
+ENDIF\r
+\r
+\r
+read_error:\r
+       mov     si, OFFSET eread\r
+boot_exit:                             ; boot_exit: write error message and halt\r
+       call    message                 ; display error message\r
+halt:  jmp     halt\r
+\r
+\r
+intro: db      10,'NEXTSTEP boot1 vXX.XX.XX.XX.XX',10,13,0\r
+eread: db      'Read error',10,13,0\r
+
+; the last 2 bytes in the sector contain the signature\r
+d1:\r
+       a2 = 510 - (d1 - start)\r
+       DB a2 dup (0)\r
+       DW 0AA55h\r
+       ENDS\r
+       END\r
diff --git a/i386/boot1/boot1.s b/i386/boot1/boot1.s
new file mode 100644 (file)
index 0000000..6e0cbbb
--- /dev/null
@@ -0,0 +1,600 @@
+; Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+;
+; @APPLE_LICENSE_HEADER_START@
+; 
+; Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
+; Reserved.  This file contains Original Code and/or Modifications of
+; Original Code as defined in and that are subject to the Apple Public
+; Source License Version 1.1 (the "License").  You may not use this file
+; except in compliance with the License.  Please obtain a copy of the
+; License at http://www.apple.com/publicsource and read it before using
+; this file.
+; 
+; The Original Code and all software distributed under the License are
+; distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+; EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+; INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+; FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
+; License for the specific language governing rights and limitations
+; under the License.
+; 
+; @APPLE_LICENSE_HEADER_END@
+;
+; Boot Loader: boot0
+;
+; A small boot sector program written in x86 assembly whose only
+; responsibility is to locate the booter partition, load the
+; booter into memory, and jump to the booter's entry point.
+; The booter partition can be a primary or a logical partition.
+; But the booter partition must reside within the 8GB limit
+; imposed by CHS addressing + translation.
+; 
+; This boot loader can be placed at any of the following places:
+; * Master Boot Record (MBR)
+; * Boot sector of an extended partition
+; * Boot sector of a primary partition
+; * Boot sector of a logical partition
+;
+; In order to coexist with a fdisk partition table (64 bytes), and
+; leave room for a two byte signature (0xAA55) in the end, boot0 is
+; restricted to 446 bytes (512 - 64 - 2). If boot0 did not have to
+; live in the MBR, then we would have 510 bytes to play with.
+;
+; boot0 is always loaded by the BIOS or another first level booter
+; to 0:7C00h.
+;
+; This code is written for the NASM assembler.
+;   nasm boot0.s -o boot0
+
+;--------------------------------------------------------------------------
+; Constants.
+
+FLOPPY          EQU  0x00               ; floppy dev number
+HDISK           EQU  0x80               ; hard drive dev number
+DEBUG           EQU  0                  ; enable debugging output
+
+BOOTSEG         EQU  0x0                ; our sole segment
+BOOTSP          EQU  0xFFF0             ; stack pointer
+BOOTLOAD        EQU  0x7C00             ; booter load address
+BOOTRELOC       EQU  0xE000             ; booter is relocated here
+BOOTSIG         EQU  0xAA55             ; booter signature
+
+BOOT2_SIZE      EQU  88                 ; load this many blocks for boot2
+BOOT2_ADDR      EQU  0x3000             ; where to load boot2
+
+%IF BOOTDEV = FLOPPY
+DRIVE_NUM       EQU  FLOPPY               ; floppy drive
+%ELSE
+DRIVE_NUM       EQU  HDISK                ; "C" drive
+%ENDIF
+SECTOR_BYTES    EQU  512                ; sector size in bytes
+
+BUF_MBR         EQU  0x1000             ; memory buffer for MBR
+BUF_EXT         EQU  0x1200             ; memory buffer for extended partition
+
+TABLE_MAIN      EQU  BUF_MBR + 0x1be    ; location of main partition table
+TABLE_EXT       EQU  BUF_EXT + 0x1be    ; location of ext partition table
+ENTRY_SIZE      EQU  16                 ; size of each fdisk partition entry
+TYPE_BOOT       EQU  0xab               ; partition type we are looking for
+TYPE_EXT        EQU  0x05               ; extended partition type
+TYPE_EXT_1      EQU  0x0f               ; Windows extended partition
+TYPE_EXT_2      EQU  0x85               ; Linux extended partition
+EXT_LEVELS_MAX  EQU  128                ; max extended partition levels
+
+
+;--------------------------------------------------------------------------
+; Start of text segment.
+
+    SEGMENT .text
+
+    ORG     0xE000              ; must match BOOTRELOC
+
+;--------------------------------------------------------------------------
+; Loaded at 0:7c00h.
+;
+start
+    ; Set up the stack to grow down from BOOTSEG:BOOTSP.
+    ; Interrupts should be off while the stack is being manipulated.
+    ;
+    cli                         ; interrupts off
+    mov     ax, BOOTSEG         ;
+    mov     ss, ax              ; ss <- BOOTSEG
+    mov     sp, BOOTSP          ; sp <- BOOTSP
+    sti                         ; reenable interrupts
+
+    ; Relocate the booter code from DS:SI to ES:DI,
+    ; or from 0:7C00h to BOOTSEG:BOOTRELOC.
+    ;
+    mov     es, ax              ; es <- BOOTSEG
+    xor     ax, ax
+    mov     ds, ax              ; ds <- 0
+    mov     si, BOOTLOAD        ; si <- BOOTLOAD (source)
+    mov     di, BOOTRELOC       ; di <- BOOTRELOC (destination)
+    ;
+    cld                         ; auto-increment SI and/or DI registers
+    mov     cx, 256             ; copy 256 words (512 bytes)
+    repnz   movsw               ; repeat string move (word) operation
+
+    ; Code relocated, jump to start_reloc in relocated location.
+    ;
+    jmp     BOOTSEG:start_reloc
+
+;--------------------------------------------------------------------------
+; Start execution from the relocated location.
+;
+start_reloc
+    mov     ax, BOOTSEG
+    mov     ds, ax              ; ds <- BOOTSEG
+
+    mov     al, '='             ; indicate execution start
+    call    putchar
+
+    ; Get disk parameters (CHS) using INT13/F8 call.
+    ;
+    mov     dl, DRIVE_NUM       ; boot drive is drive C
+    mov     ah, 8               ; Read Disk Driver Parameter function
+    int     0x13
+    and     cl, 0x3f            ; sectors/track
+    mov     [max_sectors], cl
+    mov     [max_heads], dh
+    jc      error
+
+    mov     al, '>'             ; indicate INT13/F8 success
+    call    putchar
+
+    mov     ax, BOOTSEG                         ; es <- BOOTSEG        
+    mov     es, ax 
+
+    ; Since this code may not always reside in the MBR, we will always
+    ; start by loading the MBR to BUF_MBR.
+    ;
+    mov     WORD [chs_cx], 0x0001       ; cyl = 0, sect = 1
+    mov     BYTE [chs_dx + 1], 0        ; head = 0
+    xor     cx, cx                      ; skip 0 sectors
+    mov     ax, 1                       ; read 1 sector
+    mov     bx, BUF_MBR                 ; load buffer
+    call    load
+    jc      error
+
+    mov     di, TABLE_MAIN              ; argument for find_booter
+    cmp     WORD [di + 64], BOOTSIG     ; correct signature found?
+    jne     error                       ; Oops! no signature!
+    mov     bl, TYPE_BOOT               ; look for this partition type
+    mov     bh, 0                       ; initial nesting level is 0
+    call    find_booter
+
+error
+    mov     si, load_error
+    call    message
+hang_1
+    jmp     hang_1
+
+;--------------------------------------------------------------------------
+; Locate the booter partition and load the booter.
+;
+; Arguments:
+;   di - pointer to fdisk partition table.
+;   bl - partition type to look for.
+;
+; The following registers are modified:
+;   ax, bh
+;
+find_booter
+    push    cx
+    push    si
+
+    mov     si, di              ; si <- pointer to partition table
+    mov     cx, 4               ; 4 partition entries per table
+
+find_booter_pri
+    ;
+    ; Hunt for a fdisk partition type that matches the value in bl.
+    ;
+%IF DEBUG
+    mov     al, bh              ; log partition type seen
+    call    putspace
+    mov     al, [si + 4]
+    call    display_byte
+%ENDIF
+
+    cmp     BYTE [si + 4], bl   ; Is this the booter partition?
+    je      load_booter         ; yes, load the booter
+
+    add     si, ENTRY_SIZE      ; si <- next partition entry
+    loop    find_booter_pri     ; loop while cx is not zero
+
+    ; No primary (or perhaps logical) booter partition found in the
+    ; current partition table. Restart and look for extended partitions.
+    ;
+    mov     si, di              ; si <- pointer to partition table
+    mov     cx, 4               ; 4 partition entries per table
+
+find_booter_ext
+    ;
+    ; Look for extended partition entries in the partition table.
+    ;
+%IF DEBUG
+    mov     al, bh              ; log partition type seen
+    call    putspace
+    mov     al, 'E'
+    call    putchar
+    mov     al, [si + 4]
+    call    display_byte
+%ENDIF
+
+    cmp     BYTE [si + 4], TYPE_EXT     ; Is this an extended partition?
+    je      find_booter_ext_2           ; yes, load its partition table
+
+    cmp     BYTE [si + 4], TYPE_EXT_1   ; Is this an extended partition?
+    je      find_booter_ext_2           ; yes, load its partition table
+       
+    cmp     BYTE [si + 4], TYPE_EXT_2   ; Is this an extended partition?
+    je      find_booter_ext_2           ; yes, load its partition table
+
+find_booter_ext_1
+    ;
+    ; si is not pointing to an extended partition entry,
+    ; try the next entry in the partition table.
+    ;
+    add     si, ENTRY_SIZE      ; si <- next partition entry
+    loop    find_booter_ext     ; loop while cx is not zero
+
+    jmp     find_booter_end     ; give up
+
+find_booter_ext_2
+    cmp     bh, EXT_LEVELS_MAX
+    ja      find_booter_end     ; in too deep!
+
+    inc     bh                  ; increment nesting level counter
+
+    ; Prepare the arguments for the load function call to
+    ; load the extended partition table into memory.
+    ; Note that si points to the extended partition entry.
+    ;
+    mov     ax, [si]            ; DH/DL
+    mov     [chs_dx], ax
+    mov     ax, [si + 2]        ; CH/CL
+    mov     [chs_cx], ax
+    pusha
+    xor     cx, cx              ; skip 0 sectors
+    mov     ax, 1               ; read 1 sector
+    mov     bx, BUF_EXT         ; load to BUF_EXT
+    call    load
+    popa
+
+    jc      find_booter_ext_3   ; bail out if load failed
+
+    mov     di, TABLE_EXT       ; di <- pointer to new partition table
+    cmp     WORD [di + 64], BOOTSIG
+    jne     find_booter_ext_3   ; OhOh! no signature!
+
+    call    find_booter         ; recursion...
+
+find_booter_ext_3
+    dec     bh                  ; decrement nesting level counter
+
+    ; If we got here, then we know there isn't a booter
+    ; partition linked from this partition entry.
+
+    test    bh, bh              ; if we are at level 0, then
+    jz      find_booter_ext_1   ; look for next extended partition entry
+
+find_booter_end
+    pop     si
+    pop     cx
+    ret
+
+;--------------------------------------------------------------------------
+; Yeah! Found the booter partition. The first sector in this partition
+; is reserved for the boot sector code (us). So load the booter
+; starting from the second sector in the partition, then jump to the
+; start of the booter.
+;
+load_booter
+    mov     ax, [si]            ; DH/DL
+    mov     [chs_dx], ax
+    mov     ax, [si + 2]        ; CH/CL
+    mov     [chs_cx], ax
+
+    mov     cx, 1               ; skip the initial boot sector
+    mov     ax, BOOT2_SIZE      ; read BOOT2_SIZE sectors
+    mov     bx, BOOT2_ADDR      ; where to place boot2 code
+    call    load                ; load it...
+
+    xor     edx, edx            ; argument for boot2 (hard drive boot)
+%IF BOOTDEV = FLOPPY
+    inc     edx                 ; floppy is dev 1
+%ENDIF
+    jmp     BOOTSEG:BOOT2_ADDR  ; there is no going back now!
+
+;--------------------------------------------------------------------------
+; Load sectors from disk using INT13/F2 call. The sectors are loaded
+; one sector at a time to avoid any BIOS bugs, and eliminate
+; complexities with crossing track boundaries, and other gotchas.
+;
+; Arguments:
+;   cx - number of sectors to skip
+;   ax - number of sectors to read
+;   bx - pointer to the memory buffer (must not cross a segment boundary)
+;   [chs_cx][chs_dx] - CHS starting position
+;
+; Returns:
+;   CF = 0  success
+;   CF = 1  error
+;
+; The caller must save any registers it needs.
+;
+load
+    jcxz    load_sectors
+    call    next_sector         ; [chs_cx][chs_dx] <- next sector
+    loop    load
+
+load_sectors
+    mov     cx, ax              ; cx <- number of sectors to read
+
+load_loop
+    call    read_sector         ; load a single sector
+    jc      load_exit           ; abort if carry flag is set
+    add     bx, SECTOR_BYTES    ; increment buffer pointer
+    call    next_sector         ; [chs_cx][chs_dx] <- next sector
+    loop    load_loop
+    clc                         ; successful exit
+load_exit
+    ret
+
+;--------------------------------------------------------------------------
+; Read a single sector from the hard disk.
+;
+; Arguments:
+;   [chs_cx][chs_dx] - CHS starting position
+;   bx - pointer to the sector memory buffer
+;        (must not cross a segment boundary)
+;
+; Returns:
+;   CF = 0  success
+;   CF = 1  error
+;
+; Caller's cx register is preserved.
+;
+read_sector
+    push    cx
+    mov     cx, 5               ; try 5 times to read the sector
+
+read_sector_1
+    mov     bp, cx              ; save cx
+
+    mov     cx, [chs_cx]
+    mov     dx, [chs_dx]
+    mov     dl, DRIVE_NUM       ; drive number
+    mov     ax, 0x0201          ; Func 2, read 1 sector
+    int     0x13                ; read sector
+    jnc     read_sector_ok      ; CF = 0 indicates success
+
+    mov     al, '*'             ; sector read error indicator
+    call    putchar
+
+    xor     ax, ax              ; Reset the drive and retry the read
+    int     0x13
+
+    mov     cx, bp
+    loop    read_sector_1       ; retry while cx is not zero
+
+    stc                         ; set carry flag to indicate error
+    pop     cx
+    ret
+
+read_sector_ok
+    mov     al, '.'             ; successful sector read indicator
+    call    putchar
+    clc                         ; success, clear carry flag
+    pop     cx
+    ret
+
+;--------------------------------------------------------------------------
+; Given the current CHS position stored in [chs_cx][chs_dx], update
+; it so that the value in [chs_cx][chs_dx] points to the following
+; sector.
+;
+; Arguments:
+;   [chs_cx][chs_dx] - CHS position
+;
+;   [max_sectors] and [max_heads] must be valid.
+;
+; Caller's ax and bx registers are preserved.
+;
+next_sector
+    push    ax
+    push    bx
+
+    ; Extract the CHS values from the packed register values in memory.
+    ;
+    mov     al, [chs_cx]
+    and     al, 0x3f            ; al <- sector number (1-63)
+
+    mov     bx, [chs_cx]
+    rol     bl, 2
+    ror     bx, 8
+    and     bx, 0x03ff          ; bx <- cylinder number
+
+    mov     ah, [chs_dx + 1]    ; ah <- head number
+
+    inc     al                  ; Increment CHS by one sector.
+    cmp     al, [max_sectors]
+    jbe     next_sector_done
+
+    inc     ah
+    cmp     ah, [max_heads]
+    jbe     next_sector_new_head
+
+    inc     bx
+
+next_sector_new_cyl
+    xor     ah, ah              ; head number starts at 0
+
+next_sector_new_head
+    mov     al, 1               ; sector number starts at 1
+
+next_sector_done
+    ; Reassemble the CHS values back into the packed representation
+    ; in memory.
+    ;
+    mov     [chs_cx + 1], bl    ; lower 8-bits of the 10-bit cylinder
+    ror     bh, 2
+    or      bh, al
+    mov     [chs_cx], bh        ; cylinder & sector number
+    mov     [chs_dx + 1], ah    ; head number
+
+    pop     bx
+    pop     ax
+    ret
+
+;--------------------------------------------------------------------------
+; Write a string to the console.
+;
+; Arguments:
+;   ds:si   pointer to a NULL terminated string.
+;
+; The following registers are modified:
+;   ax, bx, si
+;
+message
+    mov     bx, 1               ; bh=0, bl=1 (blue)
+    cld                         ; increment SI after each lodsb call
+message_loop
+    lodsb                       ; load a byte from DS:SI into al
+    cmp     al, 0               ; Is it a NULL?
+    je      message_done        ; yes, all done
+    mov     ah, 0xE             ; bios INT10 Func 0xE
+    int     0x10                ; bios display a byte in tty mode
+    jmp     short message_loop
+message_done
+    ret
+
+;--------------------------------------------------------------------------
+; Write a ASCII character to the console.
+;
+; Arguments:
+;   al   contains the ASCII character printed.
+;
+putchar
+    push    bx
+    mov     bx, 1               ; bh=0, bl=1 (blue)
+    mov     ah, 0x0e            ; bios int 10, function 0xe
+    int     0x10                ; bios display a byte in tty mode
+    pop     bx
+    ret
+
+%IF DEBUG
+;==========================================================================
+; DEBUG FUNCTION START
+;
+; If DEBUG is set to 1, this booter will become too large for the MBR,
+; but it will still be less than 510 bytes, which is fine for a partition's
+; boot sector.
+;==========================================================================
+
+;--------------------------------------------------------------------------
+; Write a variable number of spaces to the console.
+;
+; Arguments:
+;   al   number to spaces to display
+;
+putspace
+    push    cx
+    xor     cx, cx
+    mov     cl, al              ; use cx as the loop counter
+    mov     al, ' '             ; character to print
+putspace_loop
+    jcxz    putspace_done
+    call    putchar
+    loop    putspace_loop
+putspace_done
+    pop     cx
+    ret
+
+;--------------------------------------------------------------------------
+; Write the hex byte value to the console.
+;
+; Arguments:
+;   al   contains the byte to be displayed. e.g. if al is 0x3f, then 3F
+;        will be displayed on screen.
+;
+display_byte
+    push    ax
+    ror     al, 4
+    call    display_nibble      ; display upper nibble
+    pop     ax
+    call    display_nibble      ; display lower nibble
+    ;
+    mov     ax, 10              ; display carriage return
+    call    putchar
+    mov     ax, 13
+    call    putchar
+    ret
+
+display_nibble
+    and     al, 0x0f
+    add     al, '0'
+    cmp     al, '9'
+    jna     display_nibble_1
+    add     al, 'A' - '9' - 1
+display_nibble_1
+    call    putchar
+    ret
+
+;==========================================================================
+; DEBUG FUNCTION END
+;==========================================================================
+%ENDIF
+
+; Disk parameters gathered through INT13/F8 call.
+;
+max_sectors     db   0                  ; number of sectors per track
+max_heads       db   0                  ; number of heads
+
+; Parameters to our load function.
+;
+chs_cx          dw   0x0001                  ; cx register for INT13/F2 call
+chs_dx          dw   0x0000                  ; dx register for INT13/F2 call
+
+;--------------------------------------------------------------------------
+; NULL terminated strings.
+;
+load_error   db  10, 13, 'Load Error', 0
+
+;--------------------------------------------------------------------------
+; Pad the rest of the 512 byte sized booter with zeroes. The last
+; two bytes is the mandatory boot sector signature.
+;
+; If the booter code becomes too large, then nasm will complain
+; that the 'times' argument is negative.
+
+pad_boot
+       times 446-($-$$) db 0
+
+%IF BOOTDEV = FLOPPY
+;--------------------------------------------------------------------------
+; Put fake partition entries for the bootable floppy image
+;
+part1bootid    db            0x80      ; first partition active
+part1head      db            0x00      ; head #
+part1sect      db            0x02      ; sector # (low 6 bits)
+part1cyl       db            0x00      ; cylinder # (+ high 2 bits of above)
+part1systid    db            0xab      ; Apple boot partition
+times  3       db            0x00      ; ignore head/cyl/sect #'s
+part1relsect   dd      0x00000001      ; start at sector 1
+part1numsect   dd      0x00000058      ; 44K for booter
+part2bootid    db            0x00      ; not active
+times  3       db            0x00      ; ignore head/cyl/sect #'s
+part2systid    db            0xa8      ; Apple UFS partition
+times  3       db            0x00      ; ignore head/cyl/sect #'s
+part2relsect   dd      0x0000005a      ; start after booter
+; part2numsect dd      0x00000ae6      ; 1.44MB - 45K
+part2numsect   dd      0x00001626      ; 2.88MB - 45K
+%ENDIF
+
+pad_table_and_sig
+    times 510-($-$$) db 0
+    dw BOOTSIG
+
+    END
diff --git a/i386/boot1/boot1f b/i386/boot1/boot1f
new file mode 100755 (executable)
index 0000000..3b76232
Binary files /dev/null and b/i386/boot1/boot1f differ
diff --git a/i386/boot1/gonext.c b/i386/boot1/gonext.c
new file mode 100644 (file)
index 0000000..0fb0d8b
--- /dev/null
@@ -0,0 +1,113 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
+ * Reserved.  This file contains Original Code and/or Modifications of
+ * Original Code as defined in and that are subject to the Apple Public
+ * Source License Version 1.1 (the "License").  You may not use this file
+ * except in compliance with the License.  Please obtain a copy of the
+ * License at http://www.apple.com/publicsource and read it before using
+ * this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+#include <bios.h>\r
+#include <dos.h>\r
+#include <stdio.h>\r
+\r
+char bufold[512];\r
+\r
+int main(int argc, char *argv[])\r
+{\r
+       void far (*reset)();\r
+       #define CMD 2\r
+       #define DRIVE 0x80\r
+       #define HEAD 0\r
+       #define TRACK 0\r
+       #define SECT 1\r
+       #define NSECT 1\r
+       int result, i;\r
+       int found;\r
+       unsigned char *p1, *p2, key;\r
+       int softReboot=0;\r
+       int dontAsk=0;\r
+\r
+       for (i=1; i<argc; i++)\r
+       {\r
+               if (!strcmp(argv[i],"-dontask")) dontAsk=1;\r
+               else if (!strcmp(argv[i],"-soft")) softReboot=1;\r
+       }\r
+\r
+       if (!dontAsk)\r
+       {\r
+               printf("Do you want to reboot into NEXTSTEP?\n");\r
+               printf("    (This will immediately terminate all processes!)\n");\r
+               key = bioskey(0);\r
+               if (!(key=='y' || key=='Y'))\r
+               {\r
+                       printf("Cancelled\n");\r
+                       exit(0);\r
+               }\r
+       }\r
+\r
+       result = biosdisk(CMD,DRIVE,HEAD,TRACK,SECT,NSECT,bufold);\r
+       if (result != 0)\r
+       {       printf("Couldn't read bootsectorread\n");\r
+               exit(0);\r
+       }\r
+\r
+       p1 = bufold + 445;\r
+\r
+       if (*p1 != 0xa7)\r
+       {\r
+               printf("GONEXT can only work if NeXT's BOOT0 bootsector"\r
+                       " is installed.\n");\r
+               exit(0);\r
+       }\r
+\r
+       found = 0;\r
+       p1=bufold + 446;\r
+       for (i=0; i<4; i++)\r
+       {       p2 = p1 + (i*16) + 4;\r
+               if (*p2 == 0xa7)\r
+               {       found=1;\r
+                       break;\r
+               }\r
+       }\r
+\r
+       if (!found)\r
+       {       printf("No NEXTSTEP partition installed\n");\r
+               exit(0);\r
+       }\r
+\r
+       /* now do the proper CMOS write! */\r
+\r
+\r
+       outportb(0x70,6);       /* select */\r
+       key = inportb(0x71);\r
+       key |= 0x10;\r
+       outportb(0x70,6);       /* select */\r
+       outportb(0x71,key);\r
+\r
+       if (softReboot) geninterrupt(0x19);\r
+       else\r
+       {\r
+               printf("'Scuse me while I kiss the sky!\n");\r
+               reset = MK_FP(0xf000,0xfff0);\r
+               reset();\r
+               geninterrupt(0x19);     /* try again - shouldn't get here */\r
+       }\r
+\r
+       printf("Reboot failed\n");\r
+       return -1;      /* you never get here */\r
+}
\ No newline at end of file
diff --git a/i386/boot1/gonext.com b/i386/boot1/gonext.com
new file mode 100644 (file)
index 0000000..e00ae00
Binary files /dev/null and b/i386/boot1/gonext.com differ
diff --git a/i386/boot1/makefile.dos b/i386/boot1/makefile.dos
new file mode 100644 (file)
index 0000000..0d7e098
--- /dev/null
@@ -0,0 +1,25 @@
+# makefile for use under DOS
+# to use this file: "make -fmakefile.dos"
+
+all: boot1 boot1f
+
+boot1: boot1.asm
+       tasm /m3 /dBOOTDEV=HDISK boot1\r
+       tlink boot1\r
+       exe2bin boot1\r
+       del boot1 \r
+       del boot1.obj \r
+       del boot1.map\r
+       del boot1.exe
+       ren boot1.bin boot1\r
+
+boot1f: boot1.asm
+       tasm /m3 /dBOOTDEV=FLOPPY boot1 ,boot1f\r
+       tlink boot1f\r
+       exe2bin boot1f\r
+       del boot1f \r
+       del boot1f.obj \r
+       del boot1f.map\r
+       del boot1f.exe
+       ren boot1f.bin boot1f\r
+\r
\ No newline at end of file
diff --git a/i386/boot1/mkboot.bat b/i386/boot1/mkboot.bat
new file mode 100755 (executable)
index 0000000..045c3b0
--- /dev/null
@@ -0,0 +1,17 @@
+tasm /m3 /dBOOTDEV=FLOPPY boot1 ,boot1f\r
+tlink boot1f\r
+exe2bin boot1f\r
+del boot1f \r
+del boot1f.obj \r
+del boot1f.map\r
+del boot1f.exe\r
+ren boot1f.bin boot1f\r
+\r
+tasm /m3 /dBOOTDEV=HDISK boot1\r
+tlink boot1\r
+exe2bin boot1\r
+del boot1 \r
+del boot1.obj \r
+del boot1.map\r
+del boot1.exe\r
+ren boot1.bin boot1\r
diff --git a/i386/boot1/nullboot1 b/i386/boot1/nullboot1
new file mode 100755 (executable)
index 0000000..8ef547b
Binary files /dev/null and b/i386/boot1/nullboot1 differ
diff --git a/i386/boot1/nullboot1.asm b/i386/boot1/nullboot1.asm
new file mode 100644 (file)
index 0000000..a111e45
--- /dev/null
@@ -0,0 +1,108 @@
+; bootnot.asm - boot1 written for turbo assembler, since gas only\r
+; generates 32 bit code and this must run in real mode.
+; To compile as floppy boot1f.not:
+;      tasm /m3 /dBOOTDEV=FLOPPY boot1 ,boot1f
+;      tlink boot1f
+;      exe2bin boot1f
+;      ren boot1f.bin boot1f.not
+\r
+;***********************************************************************\r
+;      This is the code for the NeXT boot1 bootsector.
+;***********************************************************************\r
+\r
+       P486                    ;enable i386 instructions\r
+       IDEAL\r
+       SEGMENT CSEG\r
+       ASSUME CS:CSEG,DS:CSEG\r
+\r
+       SDEBUG = 0\r
+\r
+;BOOTSEG               =       100h    ; boot will be loaded at 4k\r
+;BOOTOFF               =       0000h
+BOOTSEG                =       00h
+BOOTOFF                =       1000h
+BUFSZ          =       2000h   ; 8K disk transfer buffer\r
+\r\r
+; This code is a replacement for boot1.  It is loaded at 0x0:0x7c00\r
+\r
+start:\r
+       mov     ax,BOOTSEG
+       cli                     ; interrupts off\r
+       mov     ss,ax           ; set up stack seg\r
+       mov     sp,0fff0h\r
+       sti                     ; reenable interrupts\r
+
+       xor     ax,ax
+       mov     es,ax
+       mov     ds,ax
+       mov     si,7C00h
+       cld                     ; so pointers will get updated\r
+       mov     di,0E000h       ; relocate boot program to 0xE000\r
+       mov     cx,100h         ; copy 256x2 bytes\r
+       repnz   movsw           ; move it\r
+       off1    =  0E000h + (a1 - start)\r
+       jmp     FAR 0000:off1   ; jump to a1 in relocated place\r
+
+a1:\r
+       mov     ax,0E00h\r
+       mov     ds,ax\r
+       mov     ax,BOOTSEG\r
+       mov     es,ax\r
+
+       mov     si, OFFSET not_boot\r
+       call    message         ; display intro message\r
+
+halt:
+       mov     ah, 00h
+       int     16h
+       jmp     halt            ; get key and loop forever
+\r
+message:                               ; write the error message in ds:esi
+                                       ; to console\r
+       push    es\r
+       mov     ax,ds\r
+       mov     es,ax\r
+\r
+       mov     bx, 1                   ; bh=0, bl=1 (blue)\r
+       cld\r
+\r
+nextb:\r
+       lodsb                           ; load a byte into al\r
+       cmp     al, 0\r
+       je      done\r
+       mov     ah, 0eh                 ; bios int 10, function 0xe\r
+       int     10h                     ; bios display a byte in tty mode\r
+       jmp     nextb\r
+done:  pop     es\r
+       ret\r
+\r
+putchr:\r
+       push    bx\r
+       mov     bx, 1                   ; bh=0, bl=1 (blue)\r
+       mov     ah, 0eh                 ; bios int 10, function 0xe\r
+       int     10h                     ; bios display a byte in tty mode\r
+       pop     bx\r
+       ret\r
+\r\r
+\r
+not_boot:
+       db      10,13
+       db     'The disk in the floppy disk drive isn''t a startup disk:'
+       db      10,13
+       db      'It doesn''t contain '
+       db      'the system files required to start up the computer.'
+       db      10,13
+       db      'Please eject this disk and restart the computer'
+       db      ' with a floppy disk,'
+       db      10,13
+       db      'hard disk, or CD-ROM that is a startup disk.'
+       db      10,13
+       db      0
+
+; the last 2 bytes in the sector contain the signature\r
+d1:\r
+       a2 = 510 - (d1 - start)\r
+       DB a2 dup (0)\r
+       DW 0AA55h\r
+       ENDS\r
+       END\r
diff --git a/i386/boot1/nullboot1.s b/i386/boot1/nullboot1.s
new file mode 100644 (file)
index 0000000..7ec00d4
--- /dev/null
@@ -0,0 +1,121 @@
+; Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+;
+; @APPLE_LICENSE_HEADER_START@
+; 
+; Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
+; Reserved.  This file contains Original Code and/or Modifications of
+; Original Code as defined in and that are subject to the Apple Public
+; Source License Version 1.1 (the "License").  You may not use this file
+; except in compliance with the License.  Please obtain a copy of the
+; License at http://www.apple.com/publicsource and read it before using
+; this file.
+; 
+; The Original Code and all software distributed under the License are
+; distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+; EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+; INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+; FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
+; License for the specific language governing rights and limitations
+; under the License.
+; 
+; @APPLE_LICENSE_HEADER_END@
+;
+; nullboot.s - boot1 written for nasm assembler, since gas only
+; generates 32 bit code and this must run in real mode.
+; To compile as floppy boot1f.not:
+;      nasm -dBOOTDEV=FLOPPY nullboot1.s -o nullboot1
+
+;***********************************************************************
+;      This is the code for the NeXT boot1 bootsector.
+;***********************************************************************
+
+       SEGMENT .text
+
+       SDEBUG EQU 0
+
+BOOTSEG                EQU     00h
+BOOTOFF                EQU     1000h
+BUFSZ          EQU     2000h   ; 8K disk transfer buffer
+
+; This code is a replacement for boot1.  It is loaded at 0x0:0x7c00
+
+start:
+       mov     ax,BOOTSEG
+       cli                     ; interrupts off
+       mov     ss,ax           ; set up stack seg
+       mov     sp,0fff0h
+       sti                     ; reenable interrupts
+
+       xor     ax,ax
+       mov     es,ax
+       mov     ds,ax
+       mov     si,7C00h
+       cld                     ; so pointers will get updated
+       mov     di,0E000h       ; relocate boot program to 0xE000
+       mov     cx,100h         ; copy 256x2 bytes
+       repnz   movsw           ; move it
+       jmp     0000:0E000h + (a1 - start)      ; jump to a1 in relocated place
+
+a1:
+       mov     ax,0E00h
+       mov     ds,ax
+       mov     ax,BOOTSEG
+       mov     es,ax
+
+       mov     si, not_boot
+       call    message         ; display intro message
+
+halt:
+       mov     ah, 00h
+       int     16h
+       jmp     short halt              ; get key and loop forever
+
+message:                               ; write the error message in ds:esi
+                                       ; to console
+       push    es
+       mov     ax,ds
+       mov     es,ax
+
+       mov     bx, 1                   ; bh=0, bl=1 (blue)
+       cld
+
+nextb:
+       lodsb                           ; load a byte into al
+       cmp     al, 0
+       je      done
+       mov     ah, 0eh                 ; bios int 10, function 0xe
+       int     10h                     ; bios display a byte in tty mode
+       jmp     short nextb
+done:  pop     es
+       ret
+
+putchr:
+       push    bx
+       mov     bx, 1                   ; bh=0, bl=1 (blue)
+       mov     ah, 0eh                 ; bios int 10, function 0xe
+       int     10h                     ; bios display a byte in tty mode
+       pop     bx
+       ret
+
+
+not_boot:
+       db      10,13
+       db     'The disk in the floppy disk drive isn',39,'t a startup disk:'
+       db      10,13
+       db      'It doesn',39,'t contain '      ; 39 = a ' char
+       db      'the system files required to start up the computer.'
+       db      10,13
+       db      'Please eject this disk and restart the computer'
+       db      ' with a floppy disk,'
+       db      10,13
+       db      'hard disk, or CD-ROM that is a startup disk.'
+       db      10,13
+       db      0
+
+; the last 2 bytes in the sector contain the signature
+d1:
+       a2 equ 510 - (d1 - start)
+  times a2 db 0                                ; fill the rest with zeros
+       dw 0AA55h
+       ENDS
+       END
diff --git a/i386/boot1/replace.c b/i386/boot1/replace.c
new file mode 100644 (file)
index 0000000..2d483fd
--- /dev/null
@@ -0,0 +1,151 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
+ * Reserved.  This file contains Original Code and/or Modifications of
+ * Original Code as defined in and that are subject to the Apple Public
+ * Source License Version 1.1 (the "License").  You may not use this file
+ * except in compliance with the License.  Please obtain a copy of the
+ * License at http://www.apple.com/publicsource and read it before using
+ * this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/* Copyright 1993 NeXT, Inc.  All rights reserved. */
+
+/* Replace characters in a file. */
+
+#import <stdio.h>
+#import <mach/mach.h>
+#import <sys/types.h>
+#import <sys/stat.h>
+#import <sys/file.h>
+
+void usage(void)
+{
+    fprintf(stderr,"Usage: yuck <infile> <outfile> <oldstring> <newstring>\n");
+    exit(1);
+}
+
+char *strnstr(char *s1, char *s2, int len)
+{
+      register char c1;
+      register const char c2 = *s2;
+
+      while (len--) {
+            c1 = *s1++;
+            if (c1 == c2) {
+                   register const char *p1, *p2;
+
+                   p1 = s1;
+                   p2 = &s2[1];
+                   while (*p1++ == (c1 = *p2++) && c1)
+                       continue;
+                   if (c1 == '\0') return ((char *)s1) - 1;
+            }
+      }
+      return NULL;
+}
+
+char *
+strFromQuotedStr(char *oldstr)
+{
+    char newstr[1024], *p;
+    char c;
+    
+    p = newstr;
+    while (*oldstr) {
+       switch (c = *oldstr++) {
+       case '\\':
+               switch(c = *oldstr++) {
+               case 'r':
+                       *p++ = '\r';
+                       break;
+               case 'n':
+                       *p++ = '\n';
+                       break;
+               case 't':
+                       *p++ = '\t';
+                       break;
+               default:
+                       *p++ = c;
+                       break;
+               }
+               break;
+       default:
+               *p++ = c;
+               break;
+       }
+    }
+    *p = '\0';
+    p = (char *)malloc(strlen(newstr) + 1);
+    strcpy(p, newstr);
+    return p;
+}
+
+main(int argc, char **argv)
+{
+    int c, fd, ofd, filesize;
+    kern_return_t r;
+    char *infile, *outfile, *memfile, *oldstring, *os, *newstring;
+    struct stat statbuf;
+    
+    if (argc != 5)
+       usage();
+    
+    infile = argv[1];
+    outfile = argv[2];
+    fd = open(infile, O_RDONLY);
+    if (fd < 0) {
+       perror("open infile");
+       exit(1);
+    }
+    if (fstat(fd, &statbuf) < 0) {
+       perror("stat infile");
+       exit(1);
+    }
+    ofd = open(outfile, O_TRUNC|O_RDWR|O_CREAT, 0644);
+    if (ofd < 0) {
+       perror("open outfile");
+       exit(1);
+    }
+    filesize = statbuf.st_size;
+    oldstring = strFromQuotedStr(argv[3]);
+    newstring = strFromQuotedStr(argv[4]);
+    if (strlen(newstring) > strlen(oldstring)) {
+       fprintf(stderr, "Warning: new string is bigger than old string.\n");
+    }
+    r = map_fd(fd, (vm_offset_t)0, (vm_offset_t *)&memfile, TRUE,
+          (vm_size_t)filesize);
+    
+    if (r != KERN_SUCCESS) {
+       mach_error("Error calling map_fd()", r);
+       exit(1);
+    } else {
+       os = (char *)strnstr(memfile, oldstring, filesize);
+       if (os == NULL) {
+           fprintf(stderr, "String not found\n");
+           exit(1);
+       }
+       while (*newstring)
+           *os++ = *newstring++;
+       *os++ = *newstring++;
+       lseek(fd, 0, 0);
+       c = write(ofd, memfile, filesize);
+       if (c < filesize) {
+           perror("write outfile");
+           exit(2);
+       }
+       exit(0);
+    }
+}
diff --git a/i386/boot2/Makefile b/i386/boot2/Makefile
new file mode 100644 (file)
index 0000000..f794d90
--- /dev/null
@@ -0,0 +1,80 @@
+
+#      Makefile for i386 boot program
+#      define FLOPPY and SMALL using DEFINES macro as necessary
+
+DIR = boot2
+include ../MakePaths.dir
+
+OPTIM = -Os
+CFLAGS = $(RC_CFLAGS) $(OPTIM) $(MORECPP) -arch i386 -g -Wmost -Wno-precomp \
+    -munaligned-text -DSAIO_INTERNAL_USER -static -traditional-cpp
+DEFINES=
+CONFIG = hd
+SYMDIR = $(SYMROOT)
+LIBSADIR = ../libsa
+LIBSAIODIR = ../libsaio
+UTILDIR = ../util
+INC = -I. -I.. -I$(SYMDIR) -I$(LIBSADIR) -I$(LIBSAIODIR) -I$(UTILDIR)
+ifneq "" "$(wildcard /bin/mkdirs)"
+  MKDIRS = /bin/mkdirs
+else
+  MKDIRS = /bin/mkdir -p
+endif
+AS = as
+LD = ld
+# LIBS= -lc_static
+LIBS= -L$(SYMDIR) -lsaio -lsa -lrcz 
+
+OTHER_FILES =
+
+INSTALLDIR = $(DSTROOT)/usr/standalone/i386
+VPATH = $(OBJROOT):$(SYMROOT)
+
+# The ordering is important;
+# boot2.o must be first.
+OBJS = boot2.o boot.o graphics.o prompt.o
+# button.o browser.o scrollbar.o == NOTYET     
+
+UTILDIR = ../util
+SFILES = boot2.s
+CFILES = boot.c graphics.c prompt.c
+HFILES = boot.h
+OTHERFILES = Makefile
+ALLSRC = $(FOREIGNSRC) $(FOREIGNBIN) $(SFILES) $(CFILES) \
+       $(HFILES) $(OTHERFILES)
+DIRS_NEEDED = $(OBJROOT) $(SYMROOT)
+BOOT2ADDR = 3000
+MAXBOOTSIZE = 45056
+
+all: $(DIRS_NEEDED) boot
+
+boot: machOconv $(OBJS)
+       $(LD) -static -preload -segaddr __TEXT $(BOOT2ADDR) -segalign 20 \
+               -o $(SYMROOT)/boot.sys $(OBJS) $(LIBS) -lcc_kext
+       machOconv $(SYMROOT)/boot.sys $(SYMROOT)/boot
+       size $(SYMROOT)/boot.sys
+       ls -l $(SYMROOT)/boot
+       @( size=`ls -l $(SYMROOT)/boot | awk '{ print $$5}'` ; \
+         if expr "$$size" ">" "$(MAXBOOTSIZE)" > /dev/null ;\
+         then \
+           echo "Booter executable larger than $(MAXBOOTSIZE) bytes" ;\
+           rm $(SYMROOT)/boot ;\
+           exit 1;\
+         fi)
+
+prompt.o: vers.h
+vers.h:
+       echo "#define I386BOOT_VERSION \"`vers_string -f 5.0`\"" | \
+         tr - . > $(SYMROOT)/vers.h
+
+install_i386:: all $(INSTALLDIR)
+       cp $(SYMROOT)/boot $(OTHER_FILES) $(INSTALLDIR)
+       cd $(INSTALLDIR); chmod u+w boot $(OTHER_FILES)
+
+clean::
+       rm -f $(SYMROOT)/boot.sys $(SYMROOT)/boot
+
+include ../MakeInc.dir
+
+#dependencies
+-include $(OBJROOT)/Makedep
diff --git a/i386/boot2/boot.c b/i386/boot2/boot.c
new file mode 100644 (file)
index 0000000..94aa760
--- /dev/null
@@ -0,0 +1,586 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
+ * Reserved.  This file contains Original Code and/or Modifications of
+ * Original Code as defined in and that are subject to the Apple Public
+ * Source License Version 1.1 (the "License").  You may not use this file
+ * except in compliance with the License.  Please obtain a copy of the
+ * License at http://www.apple.com/publicsource and read it before using
+ * this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/* 
+ * Mach Operating System
+ * Copyright (c) 1990 Carnegie-Mellon University
+ * Copyright (c) 1989 Carnegie-Mellon University
+ * All rights reserved.  The CMU software License Agreement specifies
+ * the terms and conditions for use and redistribution.
+ */
+
+/*
+ *          INTEL CORPORATION PROPRIETARY INFORMATION
+ *
+ *  This software is supplied under the terms of a license  agreement or 
+ *  nondisclosure agreement with Intel Corporation and may not be copied 
+ *  nor disclosed except in accordance with the terms of that agreement.
+ *
+ *  Copyright 1988, 1989 by Intel Corporation
+ */
+
+/*
+ * Copyright 1993 NeXT Computer, Inc.
+ * All rights reserved.
+ */
+/*
+ * Completely reworked by Sam Streeper (sam_s@NeXT.com)
+ * Reworked again by Curtis Galloway (galloway@NeXT.com)
+ */
+#include "libsa.h"
+#include "memory.h"
+#include "saio.h"
+#include "libsaio.h"
+#include "kernBootStruct.h"
+#include "boot.h"
+#include "drivers.h"
+#include "nbp.h"
+
+/*
+ * True if using default.table
+ */
+static BOOL useDefaultConfig;
+
+/*
+ * Name of the kernel image file to load.
+ * This is specified in the config file, or may be
+ * overridden by the user at the boot prompt.
+ */
+static char gKernelName[BOOT_STRING_LEN];
+
+/*
+ * The user asked for boot graphics.
+ */
+static BOOL gWantBootGraphics = NO;
+
+/*
+ * The device that the booter was loaded from.
+ */
+int gBootDev;
+
+extern char * gFilename;
+extern BOOL   sysConfigValid;
+extern char   bootPrompt[];    // In prompt.c
+extern BOOL   errors;
+extern BOOL   verbose_mode;
+extern BOOL   gSilentBoot;
+
+#if MULTIPLE_DEFAULTS
+char * default_names[] = {
+    "$LBL",
+};
+#define NUM_DEFAULT_NAMES   (sizeof(default_names)/sizeof(char *))
+int current_default = 0;
+#else
+#define DEFAULT_NAME    "$LBL"
+#endif
+
+/*
+ * Prototypes.
+ */
+static void getBootString();
+
+/*
+ * Message/Error logging macros.
+ */
+#define PRINT(x)        { printf x }
+
+#ifdef  DEBUG
+#define DPRINT(x)       { printf x; }
+#define DSPRINT(x)      { printf x; sleep(2); }
+#else
+#define DPRINT(x)
+#define DSPRINT(x)
+#endif
+
+//==========================================================================
+// Zero the BSS.
+
+static void
+zeroBSS()
+{
+    extern char _DATA__bss__begin, _DATA__bss__end;
+    extern char _DATA__common__begin, _DATA__common__end;
+
+    bzero( &_DATA__bss__begin,
+           (&_DATA__bss__end - &_DATA__bss__begin) );
+    
+    bzero( &_DATA__common__begin, 
+           (&_DATA__common__end - &_DATA__common__begin) );
+}
+
+//==========================================================================
+// execKernel - Load the kernel image file and jump to its entry point.
+
+static int
+execKernel(int fd, int installMode)
+{
+    register KERNBOOTSTRUCT * kbp = kernBootStruct;
+    register char *           src = gFilename;
+    register char *           dst = kbp->boot_file;
+    char *                    val;
+    static struct mach_header head;
+    entry_t                   kernelEntry;
+    int                       ret, size;
+#ifdef DISABLED
+    char *                    linkerPath;
+    int                       loadDrivers;
+#endif
+
+    /* Copy the space/tab delimited word pointed by src (gFilename) to
+     * kbp->boot_file.
+     */ 
+    while (*src && (*src != ' ' && *src != '\t'))
+        *dst++ = *src++;
+    *dst = 0;
+
+    verbose("Loading %s\n", kbp->boot_file);
+
+    /* perform the actual load */
+    kbp->kaddr = kbp->ksize = 0;
+    ret = loadprog(kbp->kernDev,
+                   fd,
+                   &head,
+                   &kernelEntry,
+                   (char **) &kbp->kaddr,
+                   &kbp->ksize);
+    close(fd);
+
+    if ( ret != 0 )
+        return ret;
+
+    /* Clear memory that might be used for loaded drivers
+     * because the standalone linker doesn't zero
+     * memory that is used later for BSS in the drivers.
+     */
+    {
+        long addr = kbp->kaddr + kbp->ksize;
+        bzero((char *)addr, RLD_MEM_ADDR - addr);
+    }
+
+    clearActivityIndicator();
+    printf("\n");
+
+    if ((getValueForKey("Kernel Flags", &val, &size)) && size) {
+        int oldlen, len1;
+        char * cp = kbp->bootString;
+        oldlen = len1 = strlen(cp);
+
+        // move out the user string
+        for(; len1 >= 0; len1--)
+            cp[size + len1] = cp[len1 - 1];
+        strncpy(cp,val,size);
+        if (oldlen) cp[strlen(cp)] = ' ';
+    }
+
+    if (errors) {
+        printf("Errors encountered while starting up the computer.\n");
+        printf("Pausing %d seconds...\n", BOOT_TIMEOUT);
+        sleep(BOOT_TIMEOUT);
+    }
+
+    message("Starting Darwin Intel", 0);
+    
+    if (kbp->eisaConfigFunctions)
+        kbp->first_addr0 = EISA_CONFIG_ADDR +
+            (kbp->eisaConfigFunctions * sizeof(EISA_func_info_t));
+
+    clearActivityIndicator();
+
+    turnOffFloppy();
+
+    if ( getBoolForKey("APM") )
+    {
+        if ( APMPresent() ) APMConnect32();
+    }
+
+       // Cleanup the PXE base code.
+
+       if ( gBootDev == kBootDevNetwork )
+    {
+               if ( (ret = nbpUnloadBaseCode()) != nbpStatusSuccess )
+        {
+               printf("nbpUnloadBaseCode error %d\n", (int) ret); sleep(2);
+        }
+    }
+
+    // Switch to graphics mode just before starting the kernel.
+
+    if ( gWantBootGraphics )
+    {
+        setMode(GRAPHICS_MODE);
+    }
+
+    // Jump to kernel's entry point. There's no going back now.
+
+    startprog(kernelEntry);
+
+    // Not reached
+
+    return 0;
+}
+
+//==========================================================================
+// Scan and record the system's PCI bus information.
+//
+
+static void scanHardware()
+{
+extern int  ReadPCIBusInfo(PCI_bus_info_t *pp);
+extern void PCI_Bus_Init(PCI_bus_info_t *);
+    
+    KERNBOOTSTRUCT * kbp = KERNSTRUCT_ADDR;
+
+    ReadPCIBusInfo( &kbp->pciInfo );
+    PCI_Bus_Init( &kbp->pciInfo );
+}
+
+//==========================================================================
+// The 'main' function for the booter. This function is called by the
+// assembly routine init(), which is in turn called by boot1 or by
+// NBP.
+//
+// arguments:
+//   bootdev - Value passed from boot1/NBP to specify the device
+//             that the booter was loaded from. See boot.h for the list
+//             of allowable values.
+//
+// If bootdev is kBootDevNetwork, then this function will return if
+// booting was unsuccessful. This allows the PXE firmware to try the
+// next bootable device on its list. If bootdev is not kBootDevNetwork,
+// this function will not return control back to the caller.
+
+void
+boot(int bootdev)
+{
+    register KERNBOOTSTRUCT * kbp = kernBootStruct;
+    int      fd, size;
+    char *   val;
+    int      installMode = 0;
+
+    zeroBSS();
+
+    // Enable A20 gate to be able to access memory above 1 MB.
+
+    enableA20();
+
+    // Remember the device that the booter was loaded from.
+
+    gBootDev = bootdev;
+
+    // Initialize boot info structure.
+
+    initKernBootStruct();
+
+    // Setup VGA text mode.
+
+    setMode(TEXT_MODE);
+
+    // Initialize the malloc area to the top of conventional memory.
+
+    malloc_init( (char *) ZALLOC_ADDR,
+                 (kbp->convmem * 1024) - ZALLOC_ADDR,
+                 ZALLOC_NODES );
+
+    // Scan hardware configuration.
+
+    scanHardware();
+
+    // Display initial banner.
+
+    printf( bootPrompt, kbp->convmem, kbp->extmem );
+    printf( "Darwin Intel will start up in %d seconds, or you can:\n"
+            "  Type -v and press Return to start up Darwin Intel with "
+              "diagnostic messages\n"
+            "  Type ? and press Return to learn about advanced startup "
+              "options\n"
+            "  Type any other character to stop Darwin Intel from "
+              "starting up automatically\n",
+            BOOT_TIMEOUT );
+
+    // Parse args, load and start kernel.
+
+    while (1)
+    {
+        // Initialize globals.
+
+        sysConfigValid   = 0;
+        useDefaultConfig = 0;
+        errors           = 0;
+
+        // Make sure we are in VGA text mode.
+
+        setMode(TEXT_MODE);
+
+        // Set up kbp->kernDev to reflect the boot device.
+
+        if ( bootdev == kBootDevHardDisk )
+        {
+            if (kbp->numIDEs > 0)
+            {
+                kbp->kernDev = DEV_HD;
+            }
+            else
+            {
+                kbp->kernDev = DEV_SD;
+            }
+        }
+        else if ( bootdev == kBootDevFloppyDisk )
+        {
+            kbp->kernDev = DEV_FLOPPY;
+        }
+        else
+        {
+            kbp->kernDev = DEV_EN;
+        }
+        flushdev();
+
+#if 0   // XXX - $LBL
+#if MULTIPLE_DEFAULTS
+        strcpy(gKernelName, default_names[current_default]);
+        if (++current_default == NUM_DEFAULT_NAMES)
+            current_default = 0;
+#else
+        strcpy(gKernelName, DEFAULT_NAME);
+#endif
+#endif
+
+        // Display boot prompt and get user supplied boot string.
+
+        getBootString();
+
+        if ( bootdev != kBootDevNetwork )
+        {
+            // To force loading config file off same device as kernel,
+            // open kernel file to force device change if necessary.
+
+            fd = open(gKernelName, 0);
+            if (fd >= 0)
+                close(fd);
+        }
+
+        if ( sysConfigValid == 0 )
+        {
+            val = 0;
+            getValueForBootKey(kbp->bootString, 
+                               "config", &val, &size);
+
+            DSPRINT(("sys config was not valid trying alt\n"));
+            useDefaultConfig = loadSystemConfig(val, size);
+            
+            if ( sysConfigValid == 0 )
+            {
+                DSPRINT(("sys config is not valid\n"));
+                if (kbp->kernDev == DEV_EN)
+                    break;      // return control back to PXE
+                else
+                    continue;   // keep looping
+            }
+        }
+
+        // Found and loaded a config file. Proceed with boot.
+
+        gWantBootGraphics = getBoolForKey("Boot Graphics");
+        gSilentBoot       = getBoolForKey("Silent Boot");
+
+        message("Loading Darwin Intel", 0);
+
+        if ( (fd = openfile(gKernelName, 0)) >= 0 )
+        {
+            DSPRINT(("calling exec kernel\n"));
+            execKernel(fd, installMode);
+
+            // If execKernel() returns, kernel load failed.
+        }
+        else
+        {
+            error("Can't find %s\n", gKernelName);
+
+            if ( bootdev == kBootDevFloppyDisk )
+            {
+                // floppy in drive, but failed to load kernel.
+                bootdev = kBootDevHardDisk;
+                message("Couldn't start up the computer using this "
+                        "floppy disk.", 0);
+            }
+            else if ( bootdev == kBootDevNetwork )
+            {
+                break;   // Return control back to PXE.
+            }
+        }
+    } /* while(1) */
+}
+
+//==========================================================================
+// Skip spaces/tabs characters.
+
+static inline void
+skipblanks(char ** cp) 
+{
+    while ( **(cp) == ' ' || **(cp) == '\t' )
+        ++(*cp);
+}
+
+//==========================================================================
+// Load the help file and display the file contents on the screen.
+
+static void showHelp()
+{
+    int    fd;
+    char * help = makeFilePath("BootHelp.txt");
+
+    if ( (fd = open(help, 0)) >= 0 )
+    {
+        char * buffer = malloc( file_size(fd) );
+        read(fd, buffer, file_size(fd) - 1);
+        close(fd);
+        printf("%s", buffer);
+        free(buffer);
+    }
+}
+
+//==========================================================================
+// Returns 1 if the string pointed by 'cp' contains an user-specified
+// kernel image file name. Used by getBootString() function.
+
+static inline int
+containsKernelName(char * cp)
+{
+    register char c;
+    
+    skipblanks(&cp);
+
+    // Convert everything to lower case.
+
+    c = *cp | 0x20;
+
+    // Must start with a letter or a '/'.
+
+    if ( (c < 'a' || c > 'z') && ( c != '/' ) )
+        return 0;
+
+    // Keep consuming characters until we hit a separator.
+
+    while ( *cp && (*cp != '=') && (*cp != ' ') && (*cp != '\t') )
+        cp++;
+
+    // Only SPACE or TAB separator is accepted.
+    // Reject everything else.
+
+    if (*cp == '=')
+        return 0;
+
+    return 1;
+}
+
+//==========================================================================
+// Display the "boot:" prompt and copies the user supplied string to
+// kernBootStruct->bootString. The kernel image file name is written
+// to the gKernelName buffer.
+
+static void
+getBootString()
+{
+    char         line[BOOT_STRING_LEN];
+    char *       cp;
+    char *       val;
+    int          count;
+    static int   timeout = BOOT_TIMEOUT;
+
+top:
+    line[0] = '\0';
+    cp      = &line[0];
+
+    /* If there have been problems, don't go on. */
+    if ( errors ) timeout = 0;
+    errors = 0;
+
+    // Print the boot prompt and wait a few seconds for user input.
+
+    printf("\n");
+    count = Gets(line, sizeof(line), timeout, "boot: ", "");
+    flushdev();
+
+    // If something was typed, don't use automatic boot again.
+    // The boot: prompt will not timeout and go away until
+    // the user hits the return key.
+
+    if ( count ) timeout = 0;
+
+    skipblanks(&cp);
+
+    // If user typed '?', then display the usage message.
+
+    if ( *cp == '?' )
+    {
+        showHelp();
+        goto top;
+    }
+
+    // Did the user specify a kernel file name at the boot prompt?
+
+    if ( containsKernelName(cp) == 0 )
+    {
+        // User did not type a kernel image file name on the boot prompt.
+        // This is fine, read the default kernel file name from the
+        // config table.
+
+        printf("\n");
+
+        val = 0;
+        getValueForBootKey(cp, "config", &val, &count);
+
+        useDefaultConfig = loadSystemConfig(val, count);
+
+        if ( !sysConfigValid )
+            goto top;
+
+        // Get the kernel name from the config table file.
+
+        if ( getValueForKey( "Kernel", &val, &count) )
+        {
+            strncpy(gKernelName, val, count);
+        }
+    }
+    else
+    {
+        // Get the kernel name from the user-supplied boot string,
+        // and copy the name to the buffer provided.
+
+        char * namep = gKernelName;
+
+        while ( *cp && !(*cp == ' ' || *cp == '\t') )
+            *namep++ = *cp++;
+
+        *namep = '\0';
+    }
+
+    // Verbose flag specified.
+
+    verbose_mode = getValueForBootKey(cp, "-v", &val, &count);
+
+    // Save the boot string in kernBootStruct.
+
+    strcpy(kernBootStruct->bootString, cp);
+}
diff --git a/i386/boot2/boot.h b/i386/boot2/boot.h
new file mode 100644 (file)
index 0000000..795cd85
--- /dev/null
@@ -0,0 +1,83 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
+ * Reserved.  This file contains Original Code and/or Modifications of
+ * Original Code as defined in and that are subject to the Apple Public
+ * Source License Version 1.1 (the "License").  You may not use this file
+ * except in compliance with the License.  Please obtain a copy of the
+ * License at http://www.apple.com/publicsource and read it before using
+ * this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright 1994 NeXT Computer, Inc.
+ * All rights reserved.
+ */
+
+#ifndef __BOOT2_BOOT_H
+#define __BOOT2_BOOT_H
+
+/*
+ * How long to wait (in seconds) to load the
+ * kernel after displaying the "boot:" prompt.
+ */
+#define BOOT_TIMEOUT     10      /* 10 second timeout */
+
+/*
+ * Keys used in system Default.table / Instance0.table
+ */
+#define PROMPT_KEY       "Prompt For Driver Disk"
+#define NUM_PROMPTS_KEY  "Driver Disk Prompts"
+#define ASK_KEY          "Ask For Drivers"
+#define INSTALL_KEY      "Install Mode"
+#define G_MODE_KEY       "Graphics Mode"
+
+/*
+ * Possible values for the bootdev argument passed to boot().
+ */
+enum {
+       kBootDevHardDisk   = 0,
+       kBootDevFloppyDisk = 1,
+       kBootDevNetwork    = 2,
+};
+
+/*
+ * The directory that contains the booter support files.
+ */
+#define BOOT_DIR_DISK       "/usr/standalone/i386/"
+#define BOOT_DIR_NET        ""
+
+/*
+ * A global set by boot() to record the device that the booter
+ * was loaded from.
+ */
+extern int gBootDev;
+
+/*
+ * Create the complete path to a booter support file.
+ */
+#define makeFilePath(x) \
+    (gBootDev == kBootDevNetwork) ? BOOT_DIR_NET x : BOOT_DIR_DISK x
+
+/*
+ * Functions defined in graphics.c.
+ */
+extern void message(char * str, int centered);
+extern void setMode(int mode);
+extern int  currentMode();
+extern void spinActivityIndicator();
+extern void clearActivityIndicator();
+
+#endif /* !__BOOT2_BOOT_H */
diff --git a/i386/boot2/boot2.s b/i386/boot2/boot2.s
new file mode 100644 (file)
index 0000000..ec16572
--- /dev/null
@@ -0,0 +1,98 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
+ * Reserved.  This file contains Original Code and/or Modifications of
+ * Original Code as defined in and that are subject to the Apple Public
+ * Source License Version 1.1 (the "License").  You may not use this file
+ * except in compliance with the License.  Please obtain a copy of the
+ * License at http://www.apple.com/publicsource and read it before using
+ * this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/* 
+ * Mach Operating System
+ * Copyright (c) 1990 Carnegie-Mellon University
+ * Copyright (c) 1989 Carnegie-Mellon University
+ * All rights reserved.  The CMU software License Agreement specifies
+ * the terms and conditions for use and redistribution.
+ */
+
+/*
+ * boot2() -- second stage boot.
+ *
+ * This function must be located at 0:BOOTER_ADDR and will be called
+ * by boot1 or by NBP.
+ */
+
+#include <architecture/i386/asm_help.h>
+#include "memory.h"
+
+#define data32  .byte 0x66
+#define retf    .byte 0xcb
+
+
+    .file "boot2.s"
+
+.text
+
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+# Booter entry point. Called by boot1 or by the NBP.
+# This routine must be the first in the TEXT segment.
+#
+# Arguments:
+#   DX    = Boot device
+#
+# Returns:
+#
+LABEL(boot2)
+    pushl   %ecx                # Save general purpose registers
+    pushl   %ebx
+    pushl   %ebp
+    pushl   %esi
+    pushl   %edi
+    push    %ds                 # Save DS, ES
+    push    %es
+
+    mov     %cs, %ax            # Update segment registers.
+    mov     %ax, %ds            # Set DS and ES to match CS
+    mov     %ax, %es
+
+    data32
+    call    __switch_stack      # Switch to new stack
+
+    data32
+    call    __real_to_prot      # Enter protected mode.
+
+    # We are now in 32-bit protected mode.
+    # Transfer execution to C by calling boot().
+
+    pushl   %edx                # bootdev
+    call    _boot
+
+    call    __prot_to_real      # Back to real mode.
+
+    data32
+    call    __switch_stack      # Restore original stack
+    
+    pop     %es                 # Restore original ES and DS
+    pop     %ds
+    popl    %edi                # Restore all general purpose registers
+    popl    %esi                # except EAX.
+    popl    %ebp
+    popl    %ebx
+    popl    %ecx
+
+    retf                        # Hardcode a far return
+
diff --git a/i386/boot2/graphics.c b/i386/boot2/graphics.c
new file mode 100644 (file)
index 0000000..4a2de7f
--- /dev/null
@@ -0,0 +1,221 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
+ * Reserved.  This file contains Original Code and/or Modifications of
+ * Original Code as defined in and that are subject to the Apple Public
+ * Source License Version 1.1 (the "License").  You may not use this file
+ * except in compliance with the License.  Please obtain a copy of the
+ * License at http://www.apple.com/publicsource and read it before using
+ * this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright 1993 NeXT, Inc.
+ * All rights reserved.
+ */
+
+#include "libsaio.h"
+#include "boot.h"
+#include "vbe.h"
+#include "kernBootStruct.h"
+
+#define CHAR_W         8
+#define CHAR_W_SHIFT   3
+#define CHAR_H         16
+#define CHAR_H_SHIFT   4
+#define BYTE_SHIFT     3
+#define NCOLS          (screen_width / CHAR_W)
+#define NROWS          (screen_height / CHAR_H)
+#define SCREEN_W       (screen_width)
+#define SCREEN_H       (screen_height)
+
+/*
+ * Forward declarations.
+ */
+static int convert_vbe_mode(char * mode_name, int * mode);
+BOOL gSilentBoot;
+
+//==========================================================================
+// Display a (optionally centered) text message.
+
+void
+message(char * str, int centered)
+{
+       register int x;
+
+       x = (NCOLS - strlen(str)) >> 1;
+
+       if ( currentMode() == TEXT_MODE )
+    {
+           if (centered)
+        {
+            while(x--) printf(" ");
+        }
+           printf("%s\n", str);
+       }
+}
+
+/*
+ * for spinning disk
+ */
+static int currentIndicator = 0;
+
+//==========================================================================
+// Set the screen mode: TEXT_MODE or GRAPHICS_MODE
+
+void
+setMode(int mode)
+{
+       unsigned int vmode;
+       char *       vmode_name;
+    int          err = errSuccess;
+
+    if ( currentMode() == mode ) return;
+
+    if ( mode == GRAPHICS_MODE &&
+        (vmode_name = newStringForKey(G_MODE_KEY)) != 0)
+    {
+        // Set to the graphics mode specified in the config table file,
+        // enable linear frame buffer mode, and update kernBootStruct.
+
+        if ( convert_vbe_mode(vmode_name, &vmode) == 0 )
+            vmode = mode1024x768x256;   /* default mode */
+
+        err = set_linear_video_mode(vmode);
+
+        if ( err == errSuccess )
+        {
+            kernBootStruct->graphicsMode     = GRAPHICS_MODE;
+            kernBootStruct->video.v_display  = gSilentBoot;
+            kernBootStruct->video.v_baseAddr = (unsigned long) frame_buffer;
+            kernBootStruct->video.v_width    = SCREEN_W;
+            kernBootStruct->video.v_height   = SCREEN_H;
+            kernBootStruct->video.v_depth    = bits_per_pixel;
+            kernBootStruct->video.v_rowBytes = (screen_rowbytes == 0) ? 
+                (SCREEN_W * bits_per_pixel) >> BYTE_SHIFT : screen_rowbytes;
+        }
+
+        free(vmode_name);
+    }
+    
+    if ( (mode == TEXT_MODE) || (err != errSuccess) )
+    {
+        video_mode(2);  // 80x25 text mode
+
+        kernBootStruct->graphicsMode     = TEXT_MODE;
+        kernBootStruct->video.v_display  = 0;
+        kernBootStruct->video.v_baseAddr = (unsigned long) 0xb8000;
+        kernBootStruct->video.v_width    = 80;
+        kernBootStruct->video.v_height   = 25;
+        kernBootStruct->video.v_depth    = 8;
+        kernBootStruct->video.v_rowBytes = 0x8000;
+    }
+
+       currentIndicator = 0;
+}
+
+//==========================================================================
+// Return the current screen mode, TEXT_MODE or GRAPHICS_MODE.
+
+int currentMode(void)
+{
+    return kernBootStruct->graphicsMode;
+}
+
+//==========================================================================
+// Convert from a string describing a graphics mode, to a VGA mode number.
+
+typedef struct {
+    char mode_name[15];
+    int  mode_val;
+} mode_table_t;
+
+mode_table_t mode_table[] = {
+    { "640x400x256",   mode640x400x256   },
+    { "640x480x256",   mode640x480x256   },
+    { "800x600x16",    mode800x600x16    },
+    { "800x600x256",   mode800x600x256   },
+    { "1024x768x16",   mode1024x768x16   },
+    { "1024x768x256",  mode1024x768x256  },
+    { "1280x1024x16",  mode1280x1024x16  },
+    { "1280x1024x256", mode1280x1024x256 },
+    { "640x480x555",   mode640x480x555   },
+    { "640x480x888",   mode640x480x888   },
+    { "800x600x555",   mode800x600x555   },
+    { "800x600x888",   mode800x600x888   },
+    { "1024x768x555",  mode1024x768x555  },
+    { "1024x768x888",  mode1024x768x888  },
+    { "1280x1024x555", mode1280x1024x555 },
+    { "1280x1024x888", mode1280x1024x888 },
+    { "", 0 }
+};
+
+int convert_vbe_mode(char * mode_name, int * mode)
+{
+    mode_table_t * mtp = mode_table;
+
+    if (mode_name == 0 || *mode_name == 0)
+        return 0;
+
+    while ( *mtp->mode_name )
+    {
+        if (strcmp(mtp->mode_name, mode_name) == 0)
+        {
+               *mode =  mtp->mode_val;
+               return 1;
+        }
+        mtp++;
+    }
+    return 0;
+}
+
+//==========================================================================
+// Display and clear the activity indicator.
+
+static char indicator[] = {'-', '\\', '|', '/', '-', '\\', '|', '/', '\0'};
+
+// To prevent a ridiculously fast-spinning indicator,
+// ensure a minimum of 1/9 sec between animation frames.
+#define MIN_TICKS 2
+
+void
+spinActivityIndicator( void )
+{
+    static unsigned long lastTickTime = 0;
+    unsigned long        currentTickTime = time18();
+    static char          string[3] = {'\0', '\b', '\0'};
+    
+    if (currentTickTime < lastTickTime + MIN_TICKS)
+        return;
+    else
+        lastTickTime = currentTickTime;
+       
+    if ( currentMode() == TEXT_MODE )
+    {
+        string[0] = indicator[currentIndicator];
+        printf(string);
+        if (indicator[++currentIndicator] == 0)
+            currentIndicator = 0;
+    }
+}
+
+void
+clearActivityIndicator( void )
+{
+    if ( currentMode() == TEXT_MODE )
+    {
+        printf(" \b");
+    }
+}
diff --git a/i386/boot2/old/Language.table b/i386/boot2/old/Language.table
new file mode 100644 (file)
index 0000000..7fd4c33
--- /dev/null
@@ -0,0 +1,8 @@
+"Languages" = "English French German Italian Spanish Swedish";
+"English" = "Type 1 to use the English language and USA keyboard while installing Rhapsody.";
+"French" = "Tapez 2 pour installer Rhapsody avec un clavier et des messages francais.";
+"German" = "Eingabe 3 fur Rhapsody-Installation mit deutscher Sprache und Tastatur.";
+"Italian" = "Premi 4 per installare Rhapsody usando lingua italiana e tastiera italiana.";
+"Spanish" = "Pulse 5 para usar el idioma y el teclado espanol en la instalacion de Rhapsody.";
+"Swedish" = "Skriv 6 for att anvanda svenska/svenskt tangentbord vid installation av Rhapsody";
+
diff --git a/i386/boot2/old/browser.c b/i386/boot2/old/browser.c
new file mode 100644 (file)
index 0000000..f41716e
--- /dev/null
@@ -0,0 +1,388 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
+ * Reserved.  This file contains Original Code and/or Modifications of
+ * Original Code as defined in and that are subject to the Apple Public
+ * Source License Version 1.1 (the "License").  You may not use this file
+ * except in compliance with the License.  Please obtain a copy of the
+ * License at http://www.apple.com/publicsource and read it before using
+ * this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright 1993 NeXT, Inc.
+ * All rights reserved.
+ */
+#import "libsa.h"
+#import "console.h"
+#import "fontio.h"
+#import "graphics.h"
+#import "button.h"
+#import "browser.h"
+#import "scrollbar.h"
+#import "ns_logo.h"
+#import "dot.h"
+#import "hdot.h"
+#import "keys.h"
+
+#define max(a,b) ((a) > (b) ? (a) : (b))
+#define min(a,b) ((a) < (b) ? (a) : (b))
+
+browser_t *
+createBrowser(
+    char **items,
+    int nitems,
+    char *top_message,
+    char *bottom_message,
+    char *button_string,
+    int type
+)
+{
+    browser_t *bp;
+    register int i;
+    
+    bp = (browser_t *)zalloc(sizeof(browser_t));
+    bp->items = items;
+    bp->nitems = nitems;
+    bp->bot_visible = min( MAX_ITEMS_VISIBLE - 1, nitems - 1 );
+    /* bp->top_visible = 0; */
+    
+    bp->top_message = top_message;
+    bp->top_h = max (strheight(bp->top_message), ns_logo_bitmap_HEIGHT);
+    bp->top_w = strwidth(bp->top_message) + ns_logo_bitmap_WIDTH +
+           BROWSER_XMARGIN;
+    bp->bottom_message = bottom_message;
+    bp->bottom_h = bottom_message ?
+           strheight(bottom_message) :
+           -BROWSER_YMARGIN;
+    bp->bottom_w = strwidth(bottom_message);
+    if (nitems) {
+       bp->selected = (char *)zalloc(nitems);
+       if (type == BROWSER_CURRENT_IS_SELECTED)
+           bp->selected[0] = 1;
+       bp->item_h = strheight(items[0]);
+       for(i=0; i < nitems; i++)
+           bp->item_w = max(bp->item_w, strwidth(items[i]));
+       bp->item_w += 2 * BROWSER_XMARGIN + dot_bitmap_WIDTH;
+       bp->item_box_w = bp->item_w + 2 * BROWSER_XMARGIN;
+       bp->item_box_h = bp->item_h * (bp->bot_visible - bp->top_visible + 1)
+               + 2 * BROWSER_YMARGIN;
+       initScrollbar(&bp->scrollbar, 0, 0, SB_WIDTH,
+               bp->item_box_h - 2 * POPUP_FRAME_MARGIN,
+               0, (bp->bot_visible - bp->top_visible + 1) * 100 / bp->nitems);
+       bp->item_box_w += SB_WIDTH + POPUP_FRAME_MARGIN;
+    } else {
+       bp->item_box_h = -BROWSER_YMARGIN;
+    }
+    initButton(&bp->button, 0, 0, button_string, BUTTON_DRAW_RETURN);
+    bp->h = bp->top_h + bp->item_box_h + bp->bottom_h +
+           bp->button.loc.h + 5 * BROWSER_YMARGIN;
+    bp->w = max(bp->top_w, bp->bottom_w);
+    bp->w = max(bp->w, bp->item_box_w) + 2 * BROWSER_XMARGIN;
+    bp->x = (SCREEN_W - bp->w) / 2;
+    bp->y = (SCREEN_H - bp->h) / 2;
+    if (nitems) {
+       bp->item_box_x = bp->x + (bp->w - bp->item_box_w) / 2;
+       bp->scrollbar.loc.x = bp->item_box_x + POPUP_FRAME_MARGIN;
+       bp->item_box_y = bp->y + 2 * BROWSER_YMARGIN + bp->top_h;
+       bp->scrollbar.loc.y = bp->item_box_y + POPUP_FRAME_MARGIN;
+    }
+    bp->bottom_y = bp->y + 3 * BROWSER_YMARGIN + bp->top_h + bp->item_box_h;
+    bp->button.loc.x = bp->x + bp->w - bp->button.loc.w - BROWSER_XMARGIN;
+    bp->button.loc.y = bp->y + bp->h - bp->button.loc.h - BROWSER_YMARGIN;
+    
+    bp->type = type;
+
+    return bp;
+}
+
+inline void
+destroyBrowser(
+    browser_t *bp
+)
+{
+/*    destroyButton(bp->button); */
+/*    destroyScrollbar(bp->scrollbar); */
+    zfree((char *)bp);
+}
+
+static int item_y(
+    browser_t *bp,
+    int item_num
+)
+{
+    return ((bp)->item_box_y + BROWSER_YMARGIN +
+       (item_num - bp->top_visible) * (bp)->item_h + (bp)->item_h / 2);
+}
+
+setItemHighlight(browser_t *bp, int item, int highlight)
+{
+    register int xpos = bp->item_box_x + POPUP_FRAME_MARGIN +
+       SB_WIDTH + BROWSER_XMARGIN;
+    if (currentMode() != GRAPHICS_MODE ||
+       item < bp->top_visible ||
+       item > bp->bot_visible)
+       return;
+    blit_clear(bp->item_w, xpos, item_y(bp, item),
+       CENTER_V, highlight ? COLOR_WHITE : TEXT_BG);
+    if (bp->selected[item])
+       copyImage( highlight ? &hdot_bitmap : &dot_bitmap,
+           xpos,
+           item_y(bp, item) - dot_bitmap_HEIGHT/2);
+    xpos += BROWSER_XMARGIN + dot_bitmap_WIDTH;
+    blit_string(bp->items[item], xpos, item_y(bp, item),
+       TEXT_FG, CENTER_V);
+}
+
+static void drawItembox(browser_t *bp)
+{
+    register int i;
+    bp->scrollbar.position = bp->top_visible * 100 / bp->nitems;
+    drawScrollbar(&bp->scrollbar);
+    for(i = bp->top_visible; i <= bp->bot_visible; i++)
+       setItemHighlight(bp, i, i == bp->current);
+}
+
+static char *Separator = "----------------------------------------\n";
+
+void drawBrowser(browser_t *bp)
+{
+    short item_y;
+    register int i;
+    
+    clearActivityIndicator();
+    if (currentMode() == TEXT_MODE) {
+       printf("%s", Separator);
+       if (bp->top_message) {
+           printf("%s\n%s",bp->top_message, Separator);
+       }
+       if (bp->nitems) {
+           for (i = bp->top_visible; i <= bp->bot_visible; i++) {
+               printf("% 2d. %c %s\n",i+1,
+                   bp->selected[i] ? '*' : ' ',
+                   bp->items[i]);
+           }
+           if (bp->bot_visible != bp->nitems - 1)
+               printf("......<More>\n");
+           printf(Separator);
+       }
+       if (bp->bottom_message) {
+           printf("%s\n",bp->bottom_message);
+       }
+       printf(">> ");
+    } else { /* GRAPHICS_MODE */
+       popupBox(bp->x, bp->y, bp->w, bp->h, TEXT_BG, POPUP_OUT);
+       copyImage(&ns_logo_bitmap, bp->x + BROWSER_XMARGIN,
+           bp->y + BROWSER_YMARGIN + (bp->top_h - ns_logo_bitmap_HEIGHT)/2 );
+       blit_string(bp->top_message,
+           bp->x + ns_logo_bitmap_WIDTH + 2 * BROWSER_XMARGIN,
+           bp->y + (bp->top_h / 2) + BROWSER_YMARGIN,
+           TEXT_FG, CENTER_V);
+       if (bp->bottom_message)
+           blit_string(bp->bottom_message,
+               bp->x + bp->w / 2, bp->bottom_y + bp->bottom_h / 2,
+               TEXT_FG, CENTER_H | CENTER_V);
+       drawButton(&bp->button);
+       /* draw all items and highlight item 0 */
+       if (bp->nitems) {
+           popupBox(bp->item_box_x, bp->item_box_y,
+                   bp->item_box_w, bp->item_box_h,
+                   TEXT_BG, POPUP_IN);
+           drawItembox(bp);
+       }
+    }
+}
+
+clearBrowser(browser_t *bp)
+{
+    if (currentMode() == GRAPHICS_MODE)
+       clearBox(bp->x, bp->y, bp->w, bp->h);
+}
+
+
+selectItem(browser_t *bp, int item)
+{
+    int i;
+    if (bp->selected[item] == 0 &&
+       (bp->type == BROWSER_CURRENT_IS_SELECTED)) {
+       for (i=0; i < bp->nitems; i++)
+           if (bp->selected[i]) {
+               bp->selected[i] = 0;
+               setItemHighlight(bp, i, i == bp->current);
+           }
+    }
+    bp->selected[item] = !bp->selected[item];
+    setItemHighlight(bp, item, item == bp->current);
+}
+
+runBrowser(browser_t *bp)
+{
+    int c, i;
+    char *s;
+    
+    if (bp->nitems == 0) {
+       while ((c = getc() != '\r'));
+       putc('\n');
+       return;
+    }
+    
+    if (currentMode() == TEXT_MODE) {
+       s = zalloc(128);
+       for(;;) {
+           gets(s, 128);
+           if ((*s == 'f') || (*s == 'F')) {
+               if (currentMode() == TEXT_MODE)
+                   if (bp->bot_visible != bp->nitems - 1) {
+                       bp->top_visible += MAX_ITEMS_VISIBLE;
+                       bp->bot_visible += MAX_ITEMS_VISIBLE;
+                       bp->bot_visible = min(bp->nitems - 1, bp->bot_visible);
+                       drawBrowser(bp);
+                       continue;
+                   }
+           } else if ((*s == 'b') || (*s == 'B')) {
+               if (currentMode() == TEXT_MODE)
+                   if (bp->top_visible >= MAX_ITEMS_VISIBLE) {
+                       bp->top_visible -= MAX_ITEMS_VISIBLE;
+                       bp->bot_visible = bp->top_visible +
+                                       MAX_ITEMS_VISIBLE - 1;
+                       drawBrowser(bp);
+                       continue;
+                   }
+           }
+           if (*s == '\0')
+               return;
+           i = atoi(s);
+           if (i < 1 || i > bp->nitems) {
+               printf("Please enter a number between 1 and %d.\n"
+                       "Press <Return>:", 
+                       bp->nitems);
+               while ((c = getc()) != '\r');
+           } else {
+               selectItem(bp, i-1);
+           }
+           drawBrowser(bp);
+       }
+       zfree(s);
+       return;
+    }
+    
+    for(;;) {
+       switch((c = getc())) {
+       case 'j':
+       case K_DOWN:
+           if (bp->current == bp->bot_visible &&
+               bp->bot_visible != bp->nitems - 1) {
+               bp->top_visible++;
+               bp->bot_visible++;
+               bp->current++;
+               if (bp->type == BROWSER_CURRENT_IS_SELECTED)
+                   selectItem(bp, bp->current);
+               drawItembox(bp);
+           } else if (bp->current < bp->nitems - 1) {
+               setItemHighlight(bp, bp->current, 0);
+               bp->current++;
+               if (bp->type == BROWSER_CURRENT_IS_SELECTED)
+                   selectItem(bp, bp->current);
+               else
+                   setItemHighlight(bp, bp->current, 1);
+           }
+           break;
+       case 'k':
+       case K_UP:
+           if (bp->current == bp->top_visible &&
+               bp->top_visible != 0) {
+               bp->top_visible--;
+               bp->bot_visible--;
+               bp->current--;
+               if (bp->type == BROWSER_CURRENT_IS_SELECTED)
+                   selectItem(bp, bp->current);
+               drawItembox(bp);
+           } else if (bp->current > 0) {
+               setItemHighlight(bp, bp->current, 0);
+               bp->current--;
+               if (bp->type == BROWSER_CURRENT_IS_SELECTED)
+                   selectItem(bp, bp->current);
+               else
+                   setItemHighlight(bp, bp->current, 1);
+           }
+           break;
+       case ' ':
+           if (!(bp->type == BROWSER_CURRENT_IS_SELECTED))
+               selectItem(bp, bp->current);
+           break;
+       case '\r':
+       case '\n':
+           return;
+       }
+    }
+}
+
+static browser_t *_doBrowser(
+    char **items,
+    int nitems,
+    char *top_message,
+    char *bottom_message,
+    char *button_string,
+    int type
+)
+{
+    browser_t *bp;
+    
+    bp = createBrowser(items, nitems,
+       top_message, bottom_message, button_string, type);
+    drawBrowser(bp);
+    runBrowser(bp);
+    clearBrowser(bp);
+    return bp;
+}
+
+/*
+ * returns an array of characters, one per item,
+ * that are set to 0 if the item was not selected,
+ * 1 if the item was selected.
+ */
+char * popupBrowser(
+    char **items,
+    int nitems,
+    char *top_message,
+    char *bottom_message,
+    char *button_string,
+    int type
+)
+{
+    browser_t *bp;
+    register char *selected;
+    
+    bp = _doBrowser(items, nitems,
+       top_message, bottom_message, button_string, type);
+    selected = bp->selected;
+    destroyBrowser(bp);
+    return selected;
+}
+
+void popupPanel(
+    char *message
+)
+{
+    browser_t *bp;
+    
+    bp = _doBrowser(0, 0,
+       message, 0, "Continue", 0);
+    zfree(bp->selected);
+    destroyBrowser(bp);
+}
+
+
diff --git a/i386/boot2/old/browser.h b/i386/boot2/old/browser.h
new file mode 100644 (file)
index 0000000..6dbd816
--- /dev/null
@@ -0,0 +1,68 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
+ * Reserved.  This file contains Original Code and/or Modifications of
+ * Original Code as defined in and that are subject to the Apple Public
+ * Source License Version 1.1 (the "License").  You may not use this file
+ * except in compliance with the License.  Please obtain a copy of the
+ * License at http://www.apple.com/publicsource and read it before using
+ * this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+#import "graphics.h"
+#import "button.h"
+#import "scrollbar.h"
+
+typedef struct browser {
+    rect_t loc;
+    short x,y,w,h;
+    char **items;
+    char *selected;
+    char *top_message;
+    char *bottom_message;
+    short nitems;
+    short current;
+    short top_visible;
+    short bot_visible;
+    short type;
+    short item_box_x, item_box_y; /* item box location */
+    short item_box_w, item_box_h;
+    short item_h, item_w; /* individual item metrics */
+    short top_h, top_w;        /* size of top text area */
+    button_t button;
+    scroll_t scrollbar;
+    short bottom_y;
+    short bottom_h, bottom_w; /* size of bottom text area */
+} browser_t;
+
+#define BROWSER_XMARGIN 8
+#define BROWSER_YMARGIN 8
+
+#define MAX_ITEMS_VISIBLE      8
+
+#define BROWSER_SELECT_MULTIPLE                0
+#define BROWSER_CURRENT_IS_SELECTED    1
+
+#define BROWSER_NO_MESSAGE     ((char *)0)
+#define BROWSER_INSTRUCTIONS   ((char *)1)
+
+extern char * popupBrowser(
+    char **items,
+    int nitems,
+    char *top_message,
+    char *bottom_message,
+    char *button_string,
+    int type
+);
diff --git a/i386/boot2/old/button.c b/i386/boot2/old/button.c
new file mode 100644 (file)
index 0000000..fc3a725
--- /dev/null
@@ -0,0 +1,88 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
+ * Reserved.  This file contains Original Code and/or Modifications of
+ * Original Code as defined in and that are subject to the Apple Public
+ * Source License Version 1.1 (the "License").  You may not use this file
+ * except in compliance with the License.  Please obtain a copy of the
+ * License at http://www.apple.com/publicsource and read it before using
+ * this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright 1993 NeXT, Inc.
+ * All rights reserved.
+ */
+#import "libsa.h"
+#import "console.h"
+#import "fontio.h"
+#import "graphics.h"
+#import "button.h"
+#import "return.h"
+
+button_t *initButton(
+    button_t *bp,
+    int x,
+    int y,
+    char *message,
+    int drawReturnSign
+)
+{
+    bp->loc.x = x;
+    bp->loc.y = y;
+    bp->loc.h = strheight(message) + 2 * BUTTON_YMARGIN;
+    bp->loc.w = strwidth(message) + 2 * BUTTON_XMARGIN;
+    if (drawReturnSign)
+       bp->loc.w += return_bitmap_WIDTH + BUTTON_XMARGIN;
+    bp->message = message;
+    bp->flags = drawReturnSign ? BUTTON_DRAW_RETURN : 0;
+    return bp;
+}
+
+#if 0
+void destroyButton(
+    button_t *bp
+)
+{
+    zfree((char *)bp);
+}
+#endif
+
+void drawButton(
+    button_t *bp
+)
+{
+    popupBox(bp->loc.x, bp->loc.y, bp->loc.w, bp->loc.h, TEXT_BG, POPUP_OUT);
+    blit_string(bp->message,
+           bp->loc.x + BUTTON_XMARGIN, bp->loc.y + bp->loc.h / 2,
+           TEXT_FG, CENTER_V);
+    if (bp->flags & BUTTON_DRAW_RETURN) {
+       copyImage(&return_bitmap,
+           bp->loc.x + bp->loc.w - BUTTON_XMARGIN - return_bitmap_WIDTH,
+           bp->loc.y + (bp->loc.h - return_bitmap_HEIGHT) / 2);
+    }
+}
+
+#if 0
+void
+clearButton(
+    button_t *bp,
+    int color
+)
+{
+    clearRect(bp->loc.x,bp->loc.y, bp->loc.w, bp->loc.h, color);
+}
+#endif
diff --git a/i386/boot2/old/button.h b/i386/boot2/old/button.h
new file mode 100644 (file)
index 0000000..ab0a8f1
--- /dev/null
@@ -0,0 +1,50 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
+ * Reserved.  This file contains Original Code and/or Modifications of
+ * Original Code as defined in and that are subject to the Apple Public
+ * Source License Version 1.1 (the "License").  You may not use this file
+ * except in compliance with the License.  Please obtain a copy of the
+ * License at http://www.apple.com/publicsource and read it before using
+ * this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+#import "graphics.h"
+
+typedef struct button {
+    rect_t     loc;
+    int                flags;
+    char       *message;
+} button_t;
+
+#define BUTTON_DRAW_RETURN     1
+#define BUTTON_XMARGIN 6
+#define BUTTON_YMARGIN 6
+
+extern button_t *initButton(
+    button_t *bp,
+    int x,
+    int y,
+    char *message,
+    int drawReturnSign
+);
+
+extern void destroyButton(
+    button_t *bp
+);
+
+extern void drawButton(
+    button_t *bp
+);
\ No newline at end of file
diff --git a/i386/boot2/old/questionbox.c b/i386/boot2/old/questionbox.c
new file mode 100644 (file)
index 0000000..9ef62c7
--- /dev/null
@@ -0,0 +1,120 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
+ * Reserved.  This file contains Original Code and/or Modifications of
+ * Original Code as defined in and that are subject to the Apple Public
+ * Source License Version 1.1 (the "License").  You may not use this file
+ * except in compliance with the License.  Please obtain a copy of the
+ * License at http://www.apple.com/publicsource and read it before using
+ * this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright 1993 NeXT, Inc.
+ * All rights reserved.
+ */
+
+#import "libsaio.h"
+#import "io_inline.h"
+#import "kernBootStruct.h"
+#import "font.h"
+#import "bitmap.h"
+#import "console.h"
+#import "graphics.h"
+#import "ns_box.h"
+#import "ns_logo.h"
+
+int
+popupQuestionBox(char *string)
+{
+    int ch, answer=0;
+    int popup_x, popup_y, popup_w, popup_top_h, popup_h;
+    int popup_t_x, popup_t_y, popup_t_w;
+    int xpos;
+    int blink = 0;
+    int time, endtime;
+    char buf[64];   
+
+    clearActivityIndicator();
+    if (kernBootStruct->graphicsMode == GRAPHICS_MODE) {
+       popup_w = strwidth(string) + ns_logo_bitmap_WIDTH +
+           3 * POPUP_XMARGIN;
+       popup_x = (SCREEN_W - popup_w) / 2;
+       popup_t_x = (popup_x + (popup_w - POPUP_T_W) / 2);
+       popup_top_h = max(strheight(string), ns_logo_bitmap.height)
+               + 2 * POPUP_YMARGIN;
+       popup_h = popup_top_h + POPUP_YMARGIN + POPUP_T_H;
+       popup_y = (SCREEN_H - popup_h) / 2;
+       popup_t_y = popup_y + popup_h - (POPUP_T_H + POPUP_YMARGIN);
+       popupBox(popup_x, popup_y, popup_w, popup_h, TEXT_BG, POPUP_OUT);
+
+       copyImage(&ns_logo_bitmap, popup_x + POPUP_XMARGIN,
+               popup_y + (popup_top_h - ns_logo_bitmap_HEIGHT) / 2);
+       popupBox(popup_t_x, popup_t_y,
+               POPUP_T_W, POPUP_T_H, COLOR_WHITE, POPUP_IN);
+       blit_string(string, popup_x + ns_logo_bitmap_WIDTH + 2 * POPUP_XMARGIN,
+               popup_y + (popup_top_h - strheight(string)) / 2
+               + fontp->bbx.height + fontp->bbx.yoff,
+               TEXT_FG, 0);
+       xpos = popup_t_x + POPUP_T_XMARGIN - fontp->bbx.xoff;
+    
+       for (;;) {
+           time = time18();
+           endtime = time + 12;
+    
+           blink = ! blink;
+           clearRect(xpos, popup_t_y + POPUP_T_YMARGIN, 1,
+                   POPUP_T_H - 2 * POPUP_T_YMARGIN, 
+                   blink ? COLOR_BLACK : COLOR_WHITE);
+           while (time18() < endtime)
+                   if (ch = readKeyboardStatus())
+                       break;
+           if (ch) {
+               ch = getc();
+               switch (ch) {
+               case '\n':
+               case '\r':
+                   /* erase popup box */
+                   clearBox(popup_x, popup_y, popup_w, popup_h);
+                   return answer;
+               case '\b':
+                   clearRect(popup_t_x+3, popup_t_y+3,
+                           POPUP_T_W-6, POPUP_T_H-6, COLOR_WHITE);
+                   blink = answer = 0;
+                   xpos = popup_t_x + POPUP_T_XMARGIN - fontp->bbx.xoff;
+                   break;
+               default:
+                   if (answer)
+                       break;
+                   buf[0] = answer = ch;
+                   buf[1] = '\0';
+                   clearRect(xpos, popup_t_y + POPUP_T_YMARGIN, 1,
+                               POPUP_T_H - 2 * POPUP_T_YMARGIN, COLOR_WHITE);
+                   blink = 0;
+                   xpos += blit_string(buf, xpos,
+                       popup_t_y + POPUP_T_YMARGIN + fontp->bbx.height
+                               + fontp->bbx.yoff,
+                       COLOR_BLACK, 0);
+                   break;
+               }
+           }
+       }
+    } else {
+       printf(string);
+       printf("\n>> ");
+       gets(buf,sizeof(buf));
+       return buf[0];
+    }
+}
diff --git a/i386/boot2/old/scanmemory.c b/i386/boot2/old/scanmemory.c
new file mode 100644 (file)
index 0000000..152040b
--- /dev/null
@@ -0,0 +1,395 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
+ * Reserved.  This file contains Original Code and/or Modifications of
+ * Original Code as defined in and that are subject to the Apple Public
+ * Source License Version 1.1 (the "License").  You may not use this file
+ * except in compliance with the License.  Please obtain a copy of the
+ * License at http://www.apple.com/publicsource and read it before using
+ * this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+#import <mach/boolean.h>
+
+#import <mach/i386/vm_types.h>
+#import <architecture/i386/cpu.h>
+
+/*
+ * Primatives for manipulating the
+ * cpu cache(s).
+ */
+
+static __inline__
+void
+enable_cache(void)
+{
+    cr0_t      cr0;
+    
+    asm volatile(
+       "mov %%cr0,%0"
+           : "=r" (cr0));
+    
+    cr0.cd = cr0.nw = 0;
+
+    asm volatile(
+       "wbinvd; mov %0,%%cr0"
+           :
+           : "r" (cr0));
+}
+
+static __inline__
+void
+flush_cache(void)
+{
+    asm volatile("wbinvd");
+}
+
+/*
+ * Memory sizing code.
+ *
+ * Tunable Parameters:
+ *     SCAN_INCR       Size of memory scanning segment.
+ *     SCAN_LEN        Length to actually test, per segment,
+ *                     starting at the front of the segment.
+ *     SCAN_LIM        Highest address to test for existence of memory.
+ *
+ * Assumptions:
+ *     Primary assumption is that SCAN_INCR and SCAN_LEN are chosen
+ *     and the stack is positioned in its segment such that the tested
+ *     portion of the segment does not overlap with any portion of the
+ *     stack's location in that segment.  The best way to acomplish this
+ *     is to position the stack at the high end of a segment, and to make
+ *     the segment size large enough to prevent it from overlapping the
+ *     test area.  The stack needs to be large enough to contain the low 
+ *     memory save area as well as the code for the scan function.
+ */
+#define KB(x)          (1024*(x))
+#define MB(x)          (1024*KB(x))
+
+#define SCAN_PAT0      0x76543210
+#define SCAN_PAT1      0x89abcdef
+
+struct test_datum {
+    unsigned int       word0;
+    unsigned int       word1;
+};
+
+vm_offset_t
+scan_memory(
+    vm_offset_t                        end_of_memory,
+    vm_offset_t                        end_of_cnvmem,
+    unsigned int               SCAN_INCR,
+    unsigned int               SCAN_LEN,
+    unsigned int               SCAN_LIM
+)
+{
+    struct test_datum          zero_pat = { 0, 0 };
+    vm_offset_t                        memory;
+    
+    /*
+     * Make sure that the cache(s) are flushed
+     * and enabled.
+     */
+    enable_cache();
+
+    /*
+     * Round the starting address to the next
+     * segment boundary.  This is where we will
+     * begin testing.
+     */
+    end_of_memory = (end_of_memory + (SCAN_INCR - 1) & ~(SCAN_INCR - 1));
+
+    /*
+     * Zero out the test area of each segent
+     * which is located in extended memory.
+     */
+    memory = KB(1024);
+    
+    while (memory < end_of_memory) {
+       struct test_datum       *memory_ptr;
+       
+       (vm_offset_t)memory_ptr = memory;
+       
+       while ((vm_offset_t)memory_ptr < memory + SCAN_LEN)
+           *memory_ptr++ = zero_pat;
+           
+       memory += SCAN_INCR;
+    }
+
+    {
+       /*
+        * Code for segment scanning function.
+        */
+       extern unsigned int     Scan_segment_code[],
+                               Scan_segment_code_end[];
+       /*
+        * Location on the stack to where this
+        * function is copied and then executed
+        * from!!  N.B. This code must be position
+        * independent. (duh)
+        */
+       unsigned int    scan_func[
+                               Scan_segment_code_end -
+                                           Scan_segment_code];
+
+       /*
+        * Copy the scan function onto the stack.
+        */
+       memcpy(scan_func, Scan_segment_code, sizeof (scan_func));
+
+       while (end_of_memory < SCAN_LIM) {
+           display_kbytes(end_of_memory);
+           if (!((vm_offset_t (*)())scan_func)(
+                                           end_of_memory,
+                                           end_of_cnvmem,
+                                           SCAN_INCR,
+                                           SCAN_LEN))
+               break;
+           
+           end_of_memory += SCAN_INCR;
+       }
+    }
+    
+    display_kbytes(end_of_memory);
+
+    return (end_of_memory);
+}
+
+static
+void
+display_kbytes(
+    vm_offset_t                address
+)
+{
+    unsigned int       quant, dig, done = 0, mag = 1000000000;
+    int                        places = 1;
+
+    quant = address / 1024;
+    
+    while (mag > 0) {
+       done *= 10;
+       dig = (quant / mag) - done;
+       done += dig;
+       if (done > 0 || mag == 1) {
+           putc(dig + '0');
+           places++;
+       }
+       mag /= 10;
+    }
+    
+    putc('K');
+    
+    while (places-- > 0)
+       putc('\b');
+}
+
+/*
+ * Memory scan function, which tests one segment of memory.
+ * This code is copied onto the stack and executed there to
+ * avoid problems when memory aliasing occurs.  If it detects
+ * problems due to aliasing to low memory, it restores the
+ * low memory segments before returning.
+ *
+ * Parameters:
+ *     end_of_memory           Address to start testing at,
+ *                             this is rounded to the start of
+ *                             the next segment internally.
+ *     end_of_cnvmem           Address where conventional
+ *                             memory ends.
+ *     SCAN_INCR               Size of each segment.
+ *     SCAN_LEN                Size of per segment test area,
+ *                             located at the front of the segment.
+ *     SCAN_LIM                Address next segment after highest
+ *                             to test. 
+ */
+static
+boolean_t
+scan_segment(
+    vm_offset_t                        start_of_segment,
+    vm_offset_t                        end_of_cnvmem,
+    unsigned int               SCAN_INCR,
+    unsigned int               SCAN_LEN
+)
+{
+    /*
+     * Location on the stack where the test
+     * area of each segment of low memory is
+     * saved, appended together.  The copy is
+     * used to detect memory aliasing and to
+     * restore memory on that occasion.
+     */
+    unsigned int       copy_area[
+                                   ((KB(640) / SCAN_INCR) * SCAN_LEN)
+                                           / sizeof (unsigned int)];
+    struct test_datum  *test_ptr,
+                       test_pat = { SCAN_PAT0, SCAN_PAT1 },
+                       zero_pat = { 0, 0 };
+    vm_offset_t                memory, copy;
+
+    /*
+     * Copy the test area of each low memory
+     * segment to the save area.  Low memory
+     * begins at zero, and runs to the end of
+     * conventional memory.
+     */
+    copy = (vm_offset_t)copy_area;
+    memory = 0;
+
+    while (memory < KB(640)) {
+       unsigned int    *memory_ptr, *copy_ptr;
+
+       if (memory <= (end_of_cnvmem - SCAN_LEN)) {
+           (vm_offset_t)memory_ptr = memory;
+           (vm_offset_t)copy_ptr = copy;
+
+           while ((vm_offset_t)memory_ptr < memory + SCAN_LEN)
+               *copy_ptr++ = *memory_ptr++;
+       }
+       
+       memory += SCAN_INCR; copy += SCAN_LEN;
+    }
+
+    /*
+     * Write the test pattern in the test
+     * area of the current segment.
+     */
+    (vm_offset_t)test_ptr = start_of_segment;
+
+    while ((vm_offset_t)test_ptr < start_of_segment + SCAN_LEN)
+       *test_ptr++ = test_pat;
+
+    /*
+     * Flush the data cache to insure that the
+     * data actually gets written to main memory.
+     * This will provoke aliasing to occur if
+     * it is in fact present.
+     */
+    flush_cache();
+
+    /*
+     * Compare low memory against the save
+     * area, breaking out immediately if
+     * an inconsistency is observed.
+     */
+    copy = (vm_offset_t)copy_area;
+    memory = 0;
+
+    while (memory < KB(640)) {
+       struct test_datum       *memory_ptr, *copy_ptr;
+       
+       if (memory <= (end_of_cnvmem - SCAN_LEN)) {
+           (vm_offset_t)memory_ptr = memory;
+           (vm_offset_t)copy_ptr = copy;
+
+           while ((vm_offset_t)memory_ptr < memory + SCAN_LEN) {
+               if (    memory_ptr->word0 != copy_ptr->word0    ||
+                       memory_ptr->word1 != copy_ptr->word1    )
+                   break;
+                   
+               memory_ptr++; copy_ptr++;
+           }
+
+           if ((vm_offset_t)memory_ptr < memory + SCAN_LEN)
+               break;
+       }
+
+       memory += SCAN_INCR; copy += SCAN_LEN;
+    }
+
+    /*
+     * If an inconsistency was found in low
+     * memory, restore the entire region from
+     * the save area and return a failure.
+     */
+    if (memory < KB(640)) {
+       copy = (vm_offset_t)copy_area;
+       memory = 0;
+       
+       while (memory < KB(640)) {
+           unsigned int        *memory_ptr, *copy_ptr;
+       
+           if (memory <= (end_of_cnvmem - SCAN_LEN)) {
+               (vm_offset_t)memory_ptr = memory;
+               (vm_offset_t)copy_ptr = copy;
+               
+               while ((vm_offset_t)memory_ptr < memory + SCAN_LEN)
+                   *memory_ptr++ = *copy_ptr++;
+           }
+
+           memory += SCAN_INCR; copy += SCAN_LEN;
+       }
+       
+       return (FALSE);
+    }
+
+    /*
+     * Check the memory we have already scanned
+     * to see whether aliasing occurred there.
+     * The test area of each segment should contain
+     * zeros.
+     */
+    memory = KB(1024);
+    
+    while (memory < start_of_segment) {
+       struct test_datum       *memory_ptr;
+       
+       (vm_offset_t)memory_ptr = memory;
+       
+       while ((vm_offset_t)memory_ptr < memory + SCAN_LEN) {
+           if (        memory_ptr->word0 != zero_pat.word0     ||
+                       memory_ptr->word1 != zero_pat.word1     )
+               break;
+
+           memory_ptr++;
+       }
+       
+       if ((vm_offset_t)memory_ptr < memory + SCAN_LEN)
+           break;
+           
+       memory += SCAN_INCR;
+    }
+
+    if (memory < start_of_segment)
+       return (FALSE);
+
+    /*
+     * Now check the current segment to see
+     * whether the test patten was correctly
+     * written out.
+     */
+    (vm_offset_t)test_ptr = start_of_segment;
+    
+    while ((vm_offset_t)test_ptr < start_of_segment + SCAN_LEN) {
+       if (    test_ptr->word0 != test_pat.word0       ||
+               test_ptr->word1 != test_pat.word1       )
+           break;
+
+       test_ptr++;
+    }
+    
+    if ((vm_offset_t)test_ptr < start_of_segment + SCAN_LEN)
+       return (FALSE);
+
+    /*
+     * Zero the current segment, which has now
+     * passed the test!!
+     */
+    (vm_offset_t)test_ptr = start_of_segment;
+
+    while ((vm_offset_t)test_ptr < start_of_segment + SCAN_LEN)
+       *test_ptr++ = zero_pat;
+       
+    return (TRUE);
+}
diff --git a/i386/boot2/old/scanmemory.sed b/i386/boot2/old/scanmemory.sed
new file mode 100644 (file)
index 0000000..71a5dd6
--- /dev/null
@@ -0,0 +1,6 @@
+s/_scan_segment/.globl _Scan_segment_code\
+_Scan_segment_code/
+$a\
+.align 2,0x90\
+.globl _Scan_segment_code_end\
+_Scan_segment_code_end:
diff --git a/i386/boot2/old/scrollbar.c b/i386/boot2/old/scrollbar.c
new file mode 100644 (file)
index 0000000..31d659e
--- /dev/null
@@ -0,0 +1,89 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
+ * Reserved.  This file contains Original Code and/or Modifications of
+ * Original Code as defined in and that are subject to the Apple Public
+ * Source License Version 1.1 (the "License").  You may not use this file
+ * except in compliance with the License.  Please obtain a copy of the
+ * License at http://www.apple.com/publicsource and read it before using
+ * this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright 1993 NeXT, Inc.
+ * All rights reserved.
+ */
+#import "libsa.h"
+#import "console.h"
+#import "fontio.h"
+#import "graphics.h"
+#import "scrollbar.h"
+
+
+scroll_t *initScrollbar(
+    scroll_t *sp,
+    int x,
+    int y,
+    int w,
+    int h,
+    int position,              /* 0 - 100 */
+    int percent                        /* 0 - 100 */
+)
+{
+    sp->loc.x = x;
+    sp->loc.y = y;
+    sp->loc.w = w;
+    sp->loc.h = h;
+    sp->position = position;
+    sp->percent = percent;
+    return sp;
+}
+
+#if 0
+void destroyScrollbar(
+    scroll_t *sp
+)
+{
+    (void)zfree((char *)sp);
+}
+#endif
+
+void drawScrollbar(
+    scroll_t *sp
+)
+{
+    clearRect(sp->loc.x, sp->loc.y, sp->loc.w, sp->loc.h, SB_BG);
+//    clearRect(sp->loc.x, sp->loc.y, sp->loc.w, 1, COLOR_BLACK);
+//    clearRect(sp->loc.x, sp->loc.y + sp->loc.h - 1, sp->loc.w, 1, COLOR_BLACK);
+//    clearRect(sp->loc.x, sp->loc.y, 1, sp->loc.h, COLOR_BLACK);
+    clearRect(sp->loc.x + sp->loc.w - 1, sp->loc.y, 1, sp->loc.h, COLOR_BLACK);
+    if (sp->percent < 100)
+       popupBox(sp->loc.x + SB_MARGIN,
+           sp->loc.y + (sp->position * (sp->loc.h - 2 * SB_MARGIN)) / 100,
+           sp->loc.w - 3 * SB_MARGIN,
+           (sp->loc.h - 2 * SB_MARGIN) * sp->percent / 100,
+           TEXT_BG, POPUP_OUT);
+}
+
+#if 0
+void clearScrollbar(
+    scroll_t *sp,
+    int color
+)
+{
+    clearRect(sp->loc.x, sp->loc.y, sp->loc.w, sp->loc.h, color);
+}
+#endif
diff --git a/i386/boot2/old/scrollbar.h b/i386/boot2/old/scrollbar.h
new file mode 100644 (file)
index 0000000..96607e5
--- /dev/null
@@ -0,0 +1,36 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
+ * Reserved.  This file contains Original Code and/or Modifications of
+ * Original Code as defined in and that are subject to the Apple Public
+ * Source License Version 1.1 (the "License").  You may not use this file
+ * except in compliance with the License.  Please obtain a copy of the
+ * License at http://www.apple.com/publicsource and read it before using
+ * this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/* scroll bar */
+#import <graphics.h>
+
+typedef struct scrollbar {
+    rect_t loc;
+    unsigned char position;    /* 0 - 100 */
+    unsigned char percent;     /* 0 - 100 */
+} scroll_t;
+
+#define SB_MARGIN      1
+#define SB_BG          COLOR_DK_GREY
+
+#define SB_WIDTH       16      
\ No newline at end of file
diff --git a/i386/boot2/old/sizememory.c b/i386/boot2/old/sizememory.c
new file mode 100644 (file)
index 0000000..ed4e3b7
--- /dev/null
@@ -0,0 +1,73 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
+ * Reserved.  This file contains Original Code and/or Modifications of
+ * Original Code as defined in and that are subject to the Apple Public
+ * Source License Version 1.1 (the "License").  You may not use this file
+ * except in compliance with the License.  Please obtain a copy of the
+ * License at http://www.apple.com/publicsource and read it before using
+ * this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+#import <mach/i386/vm_types.h>
+
+#define KB(x)          (1024*(x))
+#define MB(x)          (1024*KB(x))
+
+unsigned int
+sizememory(
+    unsigned int       cnvmem
+)
+{
+    vm_offset_t                end_of_memory;
+#define        SCAN_INCR       KB(64)
+#define        SCAN_LEN        8
+#define SCAN_LIM       MB(512)
+
+    printf("\nSizing memory... ");
+    
+    if (readKeyboardShiftFlags() & 0x2) { /* left SHIFT key depressed */
+       printf("[aborted]");
+       end_of_memory = KB(memsize(1)) + MB(1);
+    }
+    else {
+       /*
+        * First scan beginning at start of
+        * extended memory using a reasonably
+        * large segment size.
+        */
+       end_of_memory = scan_memory(
+                                       KB(1024),
+                                       KB(cnvmem),
+                                       SCAN_INCR,
+                                       SCAN_LEN,
+                                       SCAN_LIM);
+
+       /*
+        * Now scan the top segment a page at
+        * a time to find the actual end of
+        * extended memory.
+        */
+       if (end_of_memory > KB(1024))
+           end_of_memory = scan_memory(
+                                           end_of_memory - SCAN_INCR,
+                                           KB(cnvmem),
+                                           KB(4),
+                                           SCAN_LEN,
+                                           end_of_memory);
+    }
+   
+    return (end_of_memory /  1024);
+}
diff --git a/i386/boot2/old/start.s b/i386/boot2/old/start.s
new file mode 100644 (file)
index 0000000..4ef9a99
--- /dev/null
@@ -0,0 +1,31 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
+ * Reserved.  This file contains Original Code and/or Modifications of
+ * Original Code as defined in and that are subject to the Apple Public
+ * Source License Version 1.1 (the "License").  You may not use this file
+ * except in compliance with the License.  Please obtain a copy of the
+ * License at http://www.apple.com/publicsource and read it before using
+ * this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+
+#include <architecture/i386/asm_help.h>
+
+       .file   "start.s"
+TEXT
+LABEL(boot_start)
+       jmp _boot
+       . = boot_start + 0x1000
diff --git a/i386/boot2/old/test b/i386/boot2/old/test
new file mode 100755 (executable)
index 0000000..aab3b98
Binary files /dev/null and b/i386/boot2/old/test differ
diff --git a/i386/boot2/old/test.c b/i386/boot2/old/test.c
new file mode 100644 (file)
index 0000000..0895d76
--- /dev/null
@@ -0,0 +1,35 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
+ * Reserved.  This file contains Original Code and/or Modifications of
+ * Original Code as defined in and that are subject to the Apple Public
+ * Source License Version 1.1 (the "License").  You may not use this file
+ * except in compliance with the License.  Please obtain a copy of the
+ * License at http://www.apple.com/publicsource and read it before using
+ * this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+#import <stddef.h>
+#import "kernBootStruct.h"
+
+main()
+{
+    KERNBOOTSTRUCT kb;
+    printf("EISA info size: %d bytes\n",sizeof(EISA_slot_info_t));
+    printf("reserved size: %d bytes\n",sizeof(kb._reserved));
+    printf("offset of APM: %d\n",offsetof(KERNBOOTSTRUCT, apm_config));
+    printf("offset of config: %d\n",offsetof(KERNBOOTSTRUCT, config));
+    printf("space left at end: %d\n",65536 - (offsetof(KERNBOOTSTRUCT, config) + sizeof(kb.config)));
+}
diff --git a/i386/boot2/prompt.c b/i386/boot2/prompt.c
new file mode 100644 (file)
index 0000000..083f9c8
--- /dev/null
@@ -0,0 +1,32 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
+ * Reserved.  This file contains Original Code and/or Modifications of
+ * Original Code as defined in and that are subject to the Apple Public
+ * Source License Version 1.1 (the "License").  You may not use this file
+ * except in compliance with the License.  Please obtain a copy of the
+ * License at http://www.apple.com/publicsource and read it before using
+ * this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright 1993 NeXT, Inc.
+ * All rights reserved.
+ */
+
+#include "vers.h"
+
+char bootPrompt[] = "\n\nDarwin Intel boot v" I386BOOT_VERSION "\n"
+            "%dK conventional / %dK total memory\n\n";
diff --git a/i386/doc/Limits b/i386/doc/Limits
new file mode 100644 (file)
index 0000000..71162c0
--- /dev/null
@@ -0,0 +1,11 @@
+Limits on various things
+
+Sarld can only be 128k long (when loaded).
+Drivers relocatable files can't be bigger than 320K.
+Kernel symbols can't be bigger than 512k.
+Sarld can't use more than 1024k of malloc memory.
+Kernel symbols can't be more than 512k bytes long.
+Kernel + drivers can't be more than 5.5Mb.
+
+The memory map and sizes of various things are in libsa/memory.h.
+
diff --git a/i386/doc/README b/i386/doc/README
new file mode 100644 (file)
index 0000000..a413bc8
--- /dev/null
@@ -0,0 +1,173 @@
+/* 
+ * Mach Operating System
+ * Copyright (c) 1990 Carnegie-Mellon University
+ * Copyright (c) 1989 Carnegie-Mellon University
+ * All rights reserved.  The CMU software License Agreement specifies
+ * the terms and conditions for use and redistribution.
+ */
+
+               AT386 Protected Mode Bootstrap Loader
+               =====================================
+
+1. Overview of Startup
+   -------------------
+
+       After the system is rebooted, the BIOS bootstrap routine reads Sector
+       1, Track 0 into memory at location 0000:7C00H.  If location 0000:7DFEH
+       (last two bytes of that sector) contains the value AA55H, the BIOS
+       bootstrap routine will transfer control to 0000:7C00H.  Otherwise, the
+       boot code in that sector is bad and the boot routine stops.
+       
+       For DOS compatibility reason, one extra stage of boot is required if
+       the boot device is a hard disk.  The first sector of the hard disk will
+       contain the MOS-DOS boot code and a boot record partition table.
+       When this sector is loaded into 0000:7C00H, it will relocate itself
+       to somewhere else and then load the first sector of the active
+       partition into 0000:7C00H.  Both UNIX and DOS use the command "fdisk"
+       to install this first sector into the hard disk and to manipulate
+       the hard disk partitions.
+
+       
+
+2. The First Stage Bootstrap Loader
+   --------------------------------
+
+       After startup, the first stage boot is loaded at 0000:7C00H.  This
+       first stage boot will load itself and the second stage boot into
+       memory at location 0000:1000H.  For floppy disks, the first cylinder
+       is reserved as the boot cylinder, and the boot code (first and second)
+       will be loaded from there.  Currently, only double sided, high density
+       (15 sectors per track) floppies are supported.  For hard disks, the
+       first 29 sectors of the active partition is reserved for boot code
+       which will be loaded by the first stage boot.  All the disk types
+       recognized by BIOS are supported by this bootstrap loader. 
+
+
+
+3. The Second Stage Bootstrap Loader
+   --------------------------------
+
+       After the boot code is loaded, the control is passed to the second
+       stage bootstrap loader "boot2()".  In order to be able to load the
+       big kernel image (bigger than 512K or 640K, depends on the memory
+       configuration), the second stage boot loader will run on the protected
+       mode.  This bootstarp loader does not have any stand alone device
+       drivers, all the I/O's are through the BIOS calls.  Since the first
+       stage boot code will no longer be used at this moment, the memory
+       location of the first stage boot code (0000:1000H to 0000:1200H) will
+       be used as an internal buffer for BIOS calls.  Immediately after this 
+       internal buffer is the GDT table for the second stage boot loader. 
+       Since this boot loader needs to switch back and forth between protected
+       and real mode in order to use BIOS calls, the limit of the boot code
+       and boot data segments must not be greater than 64K.
+       
+       The boot loader loads the kernel image at memory location above 1 MB
+       to skip the memory hole between 521K/640K and 1MB.  After the kernel
+       is loaded, the boot loader stores the information in the stack and
+       then passes control to kernel.  Currently, the three information passed
+       fromm the boot loader to the kernel are type of the boot device, size
+       of the base memory and size of the extended memory.
+
+
+4. The UNIX Startup
+   ----------------
+
+       Since the boot loader loads the kernel image at memory location above
+       1MB, the kernel has to start as protected mode.  In addition, the
+       link editor description file (vuifile) has to indicate that
+       the text and data segments start above 1MB.  Also, the boot loader
+       passes the infomation to the kernel through the stack.
+
+
+5. Disk Layout and Bad Block Handling
+   ---------------------------------
+       
+    The System V/386 Release 3.2 (AT) disk layout will be used as the disk
+    layout for the MACH System on the AT platform.
+
+    This disk layout is as follows:
+
+       * Reserve the first sector of cylinder 0 for the DOS boot record which
+         contains the master boot code (446 bytes) and the partition table.
+         (Refer to DOS Technical Reference Manual page 9-6 to 9-10).
+
+       * Reserve the first 29 sectors of the UNIX partition for the first
+         and the second stage bootstrap.
+
+       * Reserve the 30th sector of the UNIX partition for the pdinfo and
+         the vtoc tables.
+
+       * Reserve the 31st to the 34th sectors of the UNIX partition for the
+         bad track and the bad block mapping tables.
+
+       * Reserve up to 253 consecutive tracks when required, beginning with
+         the 35th sector of the UNIX partition, for alternate tracks.
+
+       * Reserve up to 253 consecutive blocks, beginning with the first
+         sector after the alternate tracks area, for alternate blocks.
+
+        SEC
+         1
+       ----------------------------------------------------
+       | X |                                              | CYL 0, TRK 0
+       ----------------  ..........    --------------------
+       |                 ..........                       |
+       ----------------  ..........    --------------------
+       |                 ..........                       |
+   ===============================================================
+    ^   |               BOOTSTRAP                          | CYL N, TRK M
+    |   ----------------------------------------------------
+    |   |                              |30 |31 |32 |33 |34 |
+       ----------------------------------------------------  ---
+    U   |                 ..........                       |   ^
+    N   ----------------  ..........   ---------------------   |
+    I   |                 ..........                       | Alternate Tracks
+    X   ----------------  ..........   ---------------------   |
+        |                 ..........                       |   V
+    P   ----------------------------------------------------  --- 
+    A   |                 ..........                       |   ^
+    R   ----------------  ..........   ---------------------   |
+    T   |                 ..........                       | Alternate Blocks
+    I   ----------------  ..........   --------------------    |
+    T   |                 ..........                       |   V
+    I   ----------------------------------------------------  ---
+    O   |  Unix root partition starts from here            |
+    N   ----------------                   -----------------
+       |                                                  |
+        ----------------------------------------------------
+        |                                                  |
+       ----------------------------------------------------
+       |                                                  |
+    |   ---------------------------------------------------
+    |   |                                                  |
+    |   ----------------------------------------------------
+    V   |                                                  |
+   ===============================================================
+       |                   ........                       |
+       ---------------     ........          --------------
+       |                   ........                       |
+       ----------------------------------------------------
+
+
+       The bad block handling mechanism is as follows:
+
+       * Use the alternate track in the alternate tracks area if the
+         track containing the target sector is bad.
+
+       * Use the alternate block in the alternate blocks area if the
+         target sector is bad.
+
+
+
+
+6. How to make:
+   -----------
+
+       Since the kernel image is loaded above 1 MB, the kernel must start
+       as protected mode.  This means that this bootstrap loader will work
+       only when the corresponding changes on the kernel startup code are done.
+
+       The make command to generate this bootstrap loader is:
+
+       make -f boot.mk fdboot      (floppy boot loader)
+       make -f boot.mk hdboot      (wini boot loader)
diff --git a/i386/libsa/Makefile b/i386/libsa/Makefile
new file mode 100644 (file)
index 0000000..eaad0d0
--- /dev/null
@@ -0,0 +1,63 @@
+
+DIR = libsa
+include ../MakePaths.dir
+
+UTILDIR = ../util
+INSTALL_SA_DIR = $(DSTROOT)/System/Library/Frameworks/System.framework/Versions/B/PrivateHeaders/standalone
+INSTALL_MD_DIR = $(DSTROOT)/System/Library/Frameworks/System.framework/Versions/B/PrivateHeaders/machdep/i386
+
+OPTIM = -Os
+CFLAGS = $(RC_CFLAGS) $(OPTIM) $(MORECPP) -arch i386 -g -Wmost -Wno-precomp \
+       -munaligned-text -static -traditional-cpp
+
+INC = -I. -I$(SYMROOT) -I$(UTILDIR)
+ifneq "" "$(wildcard /bin/mkdirs)"
+  MKDIRS = /bin/mkdirs
+else
+  MKDIRS = /bin/mkdir -p
+endif
+AS = as
+LD = ld
+# LIBS= -lc_static
+LIBS=
+
+VPATH = $(OBJROOT):$(SYMROOT)
+
+SA_OBJS = prf.o printf.o zalloc.o \
+       string.o strtol.o error.o \
+       setjmp.o qsort.o
+
+SFILES = setjmp.s
+CFILES = prf.c printf.c zalloc.c \
+       string.c strtol.c error.c \
+       qsort.c
+HFILES = memory.h
+EXPORTED_HFILES = libsa.h kernBootStruct.h memory.h
+INSTALLED_SA_HFILES = libsa.h
+INSTALLED_MD_HFILES = kernBootStruct.h
+OTHERFILES = Makefile
+ALLSRC =  $(SFILES) $(CFILES) $(HFILES) $(OTHERFILES)
+LIBS = libsa.a
+DIRS_NEEDED = $(OBJROOT) $(SYMROOT)
+
+all: $(DIRS_NEEDED) $(LIBS)
+
+libsa.a: $(SA_OBJS)
+       rm -f $(SYMROOT)/libsa.a
+       ar q $(SYMROOT)/libsa.a $(SA_OBJS)
+       ranlib $(SYMROOT)/libsa.a
+
+clean::
+       rm -rf $(SYMROOT)/libsa.a $(SYMROOT)/libsaio.a
+
+$(INSTALL_SA_DIR) $(INSTALL_MD_DIR):
+       $(MKDIRS) $@
+
+installhdrs:: $(INSTALL_SA_DIR) $(INSTALL_MD_DIR)
+       cp $(INSTALLED_SA_HFILES) $(INSTALL_SA_DIR)
+       cp $(INSTALLED_MD_HFILES) $(INSTALL_MD_DIR)
+
+include ../MakeInc.dir
+
+# dependencies
+-include $(OBJROOT)/Makedep
diff --git a/i386/libsa/error.c b/i386/libsa/error.c
new file mode 100644 (file)
index 0000000..d536dd4
--- /dev/null
@@ -0,0 +1,35 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
+ * Reserved.  This file contains Original Code and/or Modifications of
+ * Original Code as defined in and that are subject to the Apple Public
+ * Source License Version 1.1 (the "License").  You may not use this file
+ * except in compliance with the License.  Please obtain a copy of the
+ * License at http://www.apple.com/publicsource and read it before using
+ * this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/* error handling */
+
+#include "libsa.h"
+
+int errno;
+
+char * strerror(int errnum)
+{
+    static char error_string[16];
+    sprintf(error_string,"Error %d", errnum);
+    return error_string;
+}
diff --git a/i386/libsa/kernBootStruct.h b/i386/libsa/kernBootStruct.h
new file mode 100644 (file)
index 0000000..e4c2403
--- /dev/null
@@ -0,0 +1,191 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
+ * Reserved.  This file contains Original Code and/or Modifications of
+ * Original Code as defined in and that are subject to the Apple Public
+ * Source License Version 1.1 (the "License").  You may not use this file
+ * except in compliance with the License.  Please obtain a copy of the
+ * License at http://www.apple.com/publicsource and read it before using
+ * this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * kernBootStruct.h
+ * What the booter leaves behind for the kernel.
+ */
+
+#ifndef __BOOT_KERNBOOTSTRUCT_H
+#define __BOOT_KERNBOOTSTRUCT_H
+
+/* The config table has room for 13 drivers if their config files
+ * are the maximum size allowed.
+ */
+#define CONFIG_SIZE   (13 * 4096)
+
+/* Maximum number of boot drivers supported, assuming their
+ * config files fit in the bootstruct.
+ */
+#define NDRIVERS      64
+
+typedef struct {
+    char *  address;    // address where driver was loaded
+    int            size;       // entry point for driver
+} driver_config_t;
+
+typedef struct {
+    unsigned short     major_vers;     // == 0 if not present
+    unsigned short     minor_vers;
+    unsigned long      cs32_base;
+    unsigned long      cs16_base;
+    unsigned long      ds_base;
+    unsigned long      cs_length;
+    unsigned long      ds_length;
+    unsigned long      entry_offset;
+    union {
+        struct {
+            unsigned long      mode_16          :1;
+            unsigned long      mode_32          :1;
+            unsigned long      idle_slows_cpu   :1;
+            unsigned long      reserved         :29;
+        } f;
+        unsigned long data;
+    } flags;
+    unsigned long      connected;
+} APM_config_t;
+
+typedef struct _EISA_slot_info_t {
+    union {
+        struct {
+            unsigned char      duplicateID      :4;
+            unsigned char      slotType         :1;
+            unsigned char      prodIDPresent    :1;
+            unsigned char      dupIDPresent     :1;
+        } s;
+        unsigned char d;
+    } u_ID;
+    unsigned char      configMajor;
+    unsigned char      configMinor;
+    unsigned short     checksum;
+    unsigned char      numFunctions;
+    union {
+        struct {
+            unsigned char      fnTypesPresent   :1;
+            unsigned char      memoryPresent    :1;
+            unsigned char      irqPresent       :1;
+            unsigned char      dmaPresent       :1;
+            unsigned char      portRangePresent :1;
+            unsigned char      portInitPresent  :1;
+            unsigned char      freeFormPresent  :1;
+            unsigned char      reserved         :1;
+        } s;
+        unsigned char d;
+    } u_resources;
+    unsigned char      id[8];
+} EISA_slot_info_t;
+
+typedef struct _EISA_func_info_t {
+    unsigned char      slot;
+    unsigned char      function;
+    unsigned char      reserved[2];
+    unsigned char      data[320];
+} EISA_func_info_t;
+
+#define NUM_EISA_SLOTS 64
+
+typedef struct _PCI_bus_info_t {
+    union {
+        struct {
+            unsigned char configMethod1 :1;
+            unsigned char configMethod2 :1;
+            unsigned char               :2;
+            unsigned char specialCycle1 :1;
+            unsigned char specialCycle2 :1;
+        } s;
+        unsigned char d;
+    } u_bus;
+    unsigned char maxBusNum;
+    unsigned char majorVersion;
+    unsigned char minorVersion;
+    unsigned char BIOSPresent;
+} PCI_bus_info_t;
+
+/*
+ * Video information..
+ */
+struct boot_video {
+        unsigned long   v_baseAddr;     /* Base address of video memory */
+        unsigned long   v_display;      /* Display Code (if Applicable */
+        unsigned long   v_rowBytes;     /* Number of bytes per pixel row */
+        unsigned long   v_width;        /* Width */
+        unsigned long   v_height;       /* Height */
+        unsigned long   v_depth;        /* Pixel Depth */
+};
+
+typedef struct boot_video   boot_video;
+
+#define BOOT_STRING_LEN                160
+
+typedef struct {
+    short   version;
+    char    bootString[BOOT_STRING_LEN];  // string we booted with
+    int            magicCookie;                  // KERNBOOTMAGIC if struct valid
+    int            numIDEs;                      // how many IDE drives
+    int            rootdev;                      // booters guess as to rootdev
+    int            convmem;                      // conventional memory
+    int            extmem;                       // extended memory
+    char    boot_file[128];               // name of the kernel we booted
+    int            first_addr0;                  // first address for kern convmem
+    int            diskInfo[4];                  // bios info for bios dev 80-83
+    int            graphicsMode;                 // did we boot in graphics mode?
+    int            kernDev;                      // device kernel was fetched from
+    int     numBootDrivers;               // number of drivers loaded by booter    
+    char *  configEnd;                    // pointer to end of config files
+    int            kaddr;                        // kernel load address
+    int     ksize;                        // size of kernel
+    void *  rld_entry;                    // entry point for standalone rld
+
+    driver_config_t   driverConfig[NDRIVERS];
+    APM_config_t      apm_config;
+    
+    char              _reserved[7500];
+
+    boot_video        video;
+
+    PCI_bus_info_t    pciInfo;
+    
+    int               eisaConfigFunctions;
+    EISA_slot_info_t  eisaSlotInfo[NUM_EISA_SLOTS];
+
+    char   config[CONFIG_SIZE];                      // the config file contents
+} KERNBOOTSTRUCT;
+
+#define GRAPHICS_MODE     1
+#define TEXT_MODE         0
+
+#define KERNSTRUCT_ADDR   ((KERNBOOTSTRUCT *) 0x11000)
+#define KERNBOOTMAGIC     0xa7a7a7a7
+
+#if 0
+#ifndef EISA_CONFIG_ADDR
+#define EISA_CONFIG_ADDR        0x20000
+#define EISA_CONFIG_LEN         0x10000
+#endif
+#endif
+
+#ifndef KERNEL
+extern KERNBOOTSTRUCT *   kernBootStruct;
+#endif
+
+#endif /* !__BOOT_KERNBOOTSTRUCT_H */
diff --git a/i386/libsa/libsa.h b/i386/libsa/libsa.h
new file mode 100644 (file)
index 0000000..ac42141
--- /dev/null
@@ -0,0 +1,110 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
+ * Reserved.  This file contains Original Code and/or Modifications of
+ * Original Code as defined in and that are subject to the Apple Public
+ * Source License Version 1.1 (the "License").  You may not use this file
+ * except in compliance with the License.  Please obtain a copy of the
+ * License at http://www.apple.com/publicsource and read it before using
+ * this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+
+#ifndef __BOOT_LIBSA_H
+#define __BOOT_LIBSA_H
+
+/* Exported API for standalone library */
+
+#include <mach-o/loader.h>
+#include <stdarg.h>
+#include <stddef.h>
+
+/*
+ * string.c
+ */
+#ifndef bcopy
+extern void   bcopy(const void * src, void * dst, int len);
+#endif
+
+#ifndef bzero
+extern void   bzero(void * dst, int len);
+#endif
+
+extern void * memset(void * dst, int c, size_t n);
+extern void * memcpy(void * dst, const void * src, size_t len);
+extern int    strcmp(const char * s1, const char * s2);
+extern int    strncmp(const char * s1, const char * s2, size_t n);
+extern char * strcpy(char * s1, const char * s2);
+extern char * strncpy(char * s1, const char * s2, size_t n);
+extern int    atoi(const char * str);
+extern int    ptol(char * str);
+extern char * strcat(char * s1, const char * s2);
+extern char * strncat(char * s1, const char * s2, size_t n);
+
+#if STRNCASECMP
+extern int    strncasecmp(const char * s1, const char * s2, size_t n);
+#endif
+
+/*
+ * error.c
+ */
+extern int    errno;
+extern char * strerror(int errnum);
+
+/*
+ * strtol.c
+ */
+extern long strtol(const char * nptr,
+                   char **      endptr,
+                   int          base);
+
+extern unsigned long strtoul(const char * nptr,
+                             char **      endptr,
+                             int          base);
+
+/*
+ * prf.c
+ */
+extern void prf(const char * fmt,
+                va_list      ap,
+                void         (*putfn_p)(),
+                void *       putfn_arg);
+
+/*
+ * printf.c
+ */
+extern int sprintf(char *s, const char * format, ...);
+extern int slvprintf(char *       buffer,
+                     int          len,
+                     const char * fmt,
+                     va_list      arg);
+
+/*
+ * zalloc.c
+ */
+#define ZALLOC_NODES    384
+
+extern void   malloc_init(char * start, int size, int nodes);
+extern void * malloc(size_t size);
+extern void   free(void * start);
+extern void * realloc(void * ptr, size_t size);
+
+/*
+ * getsegbyname.c
+ */
+extern struct segment_command *
+       getsegbynamefromheader(struct mach_header * mhp, char * segname);
+
+#endif /* !__BOOT_LIBSA_H */
diff --git a/i386/libsa/memory.h b/i386/libsa/memory.h
new file mode 100644 (file)
index 0000000..2ed3db6
--- /dev/null
@@ -0,0 +1,83 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
+ * Reserved.  This file contains Original Code and/or Modifications of
+ * Original Code as defined in and that are subject to the Apple Public
+ * Source License Version 1.1 (the "License").  You may not use this file
+ * except in compliance with the License.  Please obtain a copy of the
+ * License at http://www.apple.com/publicsource and read it before using
+ * this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+
+#ifndef __BOOT_MEMORY_H
+#define __BOOT_MEMORY_H
+
+/* Memory addresses used by booter and friends */
+
+/* These are all "virtual" addresses...
+ * which are physical addresses plus MEMBASE.
+ */
+#define MEMBASE             0x0
+#define BASE_SEG            0x0
+
+#define BIOS_ADDR           0x000C00    // BIOS buffer
+#define BIOS_LEN            0x002400    // 9k
+#define BOOTER_LOAD_ADDR    0x003000    // loaded here for compat.
+#define BOOTER_ADDR         0x003000    // start of booter code
+#define BOOTER_LEN          0x00B000
+#define STACK_ADDR          0x00FFF0
+#define BOOTSTRUCT_ADDR     0x011000
+#define BOOTSTRUCT_LEN      0x00F000    // it's slightly smaller
+#define EISA_CONFIG_ADDR    0x020000
+#define EISA_CONFIG_LEN     0x010000
+#define RLD_ADDR            0x030000
+#define RLD_LEN             0x070000
+#define VIDEO_ADDR          0x0A0000    // unusable space
+#define VIDEO_LEN           0x060000
+#define KERNEL_ADDR         0x100000
+#define KERNEL_LEN          0x400000
+#define RLD_MEM_ADDR        0x500000
+#define RLD_MEM_LEN         0x100000
+#define ZALLOC_ADDR         0x600000
+#define ZALLOC_LEN          0x100000
+#define MODULE_ADDR         0x700000    // to be used for compression..
+#define MODULE_LEN          0x080000
+#define KSYM_ADDR           0x780000
+#define KSYM_LEN            0x080000    // 512k
+#define TFTP_ADDR           0x800000    // 8MB
+#define TFTP_LEN            0x400000    // 4MB buffer size
+
+/* these are physical values */
+
+#define CONVENTIONAL_LEN    0x0A0000    // 640k
+#define EXTENDED_ADDR       0x100000    // 1024k
+#define KERNEL_BOOT_ADDR    KERNEL_ADDR /* load at 1Mb */
+
+#define SAIO_TABLE_POINTER      (BOOTER_ADDR + SAIO_TABLE_PTR_OFFSET)
+#define SAIO_TABLE_PTR_OFFSET   0x30
+
+#define ptov(paddr) ((paddr) - MEMBASE)
+#define vtop(vaddr) ((vaddr) + MEMBASE)
+
+/*
+ * Limits to the size of various things...
+ */
+
+/* We need a minimum of 12Mb of system memory. */
+#define MIN_SYS_MEM_KB  (12 * 1024)
+
+#endif /* !__BOOT_MEMORY_H */
diff --git a/i386/libsa/prf.c b/i386/libsa/prf.c
new file mode 100644 (file)
index 0000000..a9a74e5
--- /dev/null
@@ -0,0 +1,161 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
+ * Reserved.  This file contains Original Code and/or Modifications of
+ * Original Code as defined in and that are subject to the Apple Public
+ * Source License Version 1.1 (the "License").  You may not use this file
+ * except in compliance with the License.  Please obtain a copy of the
+ * License at http://www.apple.com/publicsource and read it before using
+ * this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/* 
+ * Mach Operating System
+ * Copyright (c) 1990 Carnegie-Mellon University
+ * Copyright (c) 1989 Carnegie-Mellon University
+ * Copyright (c) 1988 Carnegie-Mellon University
+ * Copyright (c) 1987 Carnegie-Mellon University
+ * All rights reserved.  The CMU software License Agreement specifies
+ * the terms and conditions for use and redistribution.
+ */
+/*
+ * Copyright (c) 1982, 1986 Regents of the University of California.
+ * All rights reserved.  The Berkeley software License Agreement
+ * specifies the terms and conditions for redistribution.
+ *
+ *     @(#)prf.c       7.1 (Berkeley) 6/5/86
+ */
+
+#include <sys/param.h>
+
+#define SPACE  1
+#define ZERO   2
+
+/*
+ * Scaled down version of C Library printf.
+ * Used to print diagnostic information directly on console tty.
+ * Since it is not interrupt driven, all system activities are
+ * suspended.
+ *
+ */
+
+/*
+ * Printn prints a number n in base b.
+ * We don't use recursion to avoid deep kernel stacks.
+ */
+static void
+printn(n, b, flag, minwidth, putfn_p, putfn_arg)
+       u_long n;
+       int b, flag, minwidth;
+       void (*putfn_p)();
+       void *putfn_arg;
+{
+       char prbuf[11];
+       register char *cp;
+       int width = 0, neg = 0;
+
+       if (b == 10 && (int)n < 0) {
+               neg = 1;
+               n = (unsigned)(-(int)n);
+       }
+       cp = prbuf;
+       do {
+               *cp++ = "0123456789abcdef"[n%b];
+               n /= b;
+               width++;
+       } while (n);
+       
+       if (neg) {
+               (*putfn_p)('-', putfn_arg);
+               width++;
+       }
+       while (width++ < minwidth)
+               (*putfn_p)( (flag & ZERO) ? '0' : ' ', putfn_arg);
+               
+       do
+               (*putfn_p)(*--cp, putfn_arg);
+       while (cp > prbuf);
+}
+
+void prf(
+       char *fmt,
+       unsigned int *adx,
+       void (*putfn_p)(),
+       void *putfn_arg
+)
+{
+       int b, c;
+       char *s;
+       int flag = 0, minwidth = 0, width = 0;
+
+loop:
+       while ((c = *fmt++) != '%') {
+               if(c == '\0')
+                       return;
+               (*putfn_p)(c, putfn_arg);
+       }
+again:
+       c = *fmt++;
+       switch (c) {
+       case 'l':
+               goto again;
+       case ' ':
+               flag |= SPACE;
+               goto again;
+       case '0':
+               if (minwidth == 0) {
+                   /* this is a flag */
+                   flag |= ZERO;
+                   goto again;
+               } /* fall through */
+       case '1':
+       case '2':
+       case '3':
+       case '4':
+       case '5':
+       case '6':
+       case '7':
+       case '8':
+       case '9':
+               minwidth *= 10;
+               minwidth += c - '0';
+               goto again;
+       case 'x': case 'X':
+               b = 16;
+               goto number;
+       case 'd':
+               b = 10;
+               goto number;
+       case 'o': case 'O':
+               b = 8;
+number:
+               printn((u_long)*adx, b, flag, minwidth, putfn_p, putfn_arg);
+               break;
+       case 's':
+               s = (char *)*adx;
+               while (c = *s++) {
+                       (*putfn_p)(c, putfn_arg);
+                       width++;
+               }
+               while (width++ < minwidth)
+                   (*putfn_p)(' ', putfn_arg);
+               break;
+       case 'c':
+               (*putfn_p)((char)*adx, putfn_arg);
+               break;
+       }
+       adx++;
+       goto loop;
+}
diff --git a/i386/libsa/printf.c b/i386/libsa/printf.c
new file mode 100644 (file)
index 0000000..5013b2a
--- /dev/null
@@ -0,0 +1,72 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
+ * Reserved.  This file contains Original Code and/or Modifications of
+ * Original Code as defined in and that are subject to the Apple Public
+ * Source License Version 1.1 (the "License").  You may not use this file
+ * except in compliance with the License.  Please obtain a copy of the
+ * License at http://www.apple.com/publicsource and read it before using
+ * this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright 1993 NeXT, Inc.
+ * All rights reserved.
+ */
+
+#include "libsa.h"
+
+struct putc_info {
+    char * str;
+    char * last_str;
+};
+
+static void
+sputc(int c, struct putc_info * pi)
+{
+    if (pi->last_str)
+        if (pi->str == pi->last_str) {
+            *(pi->str) = '\0';
+            return;
+        }
+    *(pi->str)++ = c;
+}
+
+/*VARARGS1*/
+int sprintf(char * str, const char * fmt, ...)
+{
+    va_list ap;
+    struct putc_info pi;
+
+    va_start(ap, fmt);
+    pi.str = str;
+    pi.last_str = 0;
+    prf(fmt, ap, sputc, &pi);
+    *pi.str = '\0';
+    va_end(ap);
+    return 0;
+}
+
+/*VARARGS1*/
+int slvprintf(char * str, int len, const char * fmt, va_list ap)
+{
+    struct putc_info pi;
+    pi.str = str;
+    pi.last_str = str + len - 1;
+    prf(fmt, ap, sputc, &pi);
+    *pi.str = '\0';
+    return (pi.str - str);
+}
+
diff --git a/i386/libsa/qsort.c b/i386/libsa/qsort.c
new file mode 100644 (file)
index 0000000..652e2f3
--- /dev/null
@@ -0,0 +1,194 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
+ * Reserved.  This file contains Original Code and/or Modifications of
+ * Original Code as defined in and that are subject to the Apple Public
+ * Source License Version 1.1 (the "License").  You may not use this file
+ * except in compliance with the License.  Please obtain a copy of the
+ * License at http://www.apple.com/publicsource and read it before using
+ * this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1992, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <sys/types.h>
+#include <stdlib.h>
+
+static inline char     *med3 __P((char *, char *, char *, int (*)()));
+static inline void      swapfunc __P((char *, char *, int, int));
+
+#define min(a, b)      (a) < (b) ? a : b
+
+/*
+ * Qsort routine from Bentley & McIlroy's "Engineering a Sort Function".
+ */
+#define swapcode(TYPE, parmi, parmj, n) {              \
+       long i = (n) / sizeof (TYPE);                   \
+       register TYPE *pi = (TYPE *) (parmi);           \
+       register TYPE *pj = (TYPE *) (parmj);           \
+       do {                                            \
+               register TYPE   t = *pi;                \
+               *pi++ = *pj;                            \
+               *pj++ = t;                              \
+        } while (--i > 0);                             \
+}
+
+#define SWAPINIT(a, es) swaptype = ((char *)a - (char *)0) % sizeof(long) || \
+       es % sizeof(long) ? 2 : es == sizeof(long)? 0 : 1;
+
+static inline void
+swapfunc(a, b, n, swaptype)
+       char *a, *b;
+       int n, swaptype;
+{
+       if(swaptype <= 1) 
+               swapcode(long, a, b, n)
+       else
+               swapcode(char, a, b, n)
+}
+
+#define swap(a, b)                                     \
+       if (swaptype == 0) {                            \
+               long t = *(long *)(a);                  \
+               *(long *)(a) = *(long *)(b);            \
+               *(long *)(b) = t;                       \
+       } else                                          \
+               swapfunc(a, b, es, swaptype)
+
+#define vecswap(a, b, n)       if ((n) > 0) swapfunc(a, b, n, swaptype)
+
+static inline char *
+med3(a, b, c, cmp)
+       char *a, *b, *c;
+       int (*cmp)();
+{
+       return cmp(a, b) < 0 ?
+              (cmp(b, c) < 0 ? b : (cmp(a, c) < 0 ? c : a ))
+              :(cmp(b, c) > 0 ? b : (cmp(a, c) < 0 ? a : c ));
+}
+
+void
+qsort(a, n, es, cmp)
+       void *a;
+       size_t n, es;
+       int (*cmp)();
+{
+       char *pa, *pb, *pc, *pd, *pl, *pm, *pn;
+       int d, r, swaptype, swap_cnt;
+
+loop:  SWAPINIT(a, es);
+       swap_cnt = 0;
+       if (n < 7) {
+               for (pm = a + es; pm < (char *) a + n * es; pm += es)
+                       for (pl = pm; pl > (char *) a && cmp(pl - es, pl) > 0;
+                            pl -= es)
+                               swap(pl, pl - es);
+               return;
+       }
+       pm = a + (n / 2) * es;
+       if (n > 7) {
+               pl = a;
+               pn = a + (n - 1) * es;
+               if (n > 40) {
+                       d = (n / 8) * es;
+                       pl = med3(pl, pl + d, pl + 2 * d, cmp);
+                       pm = med3(pm - d, pm, pm + d, cmp);
+                       pn = med3(pn - 2 * d, pn - d, pn, cmp);
+               }
+               pm = med3(pl, pm, pn, cmp);
+       }
+       swap(a, pm);
+       pa = pb = a + es;
+
+       pc = pd = a + (n - 1) * es;
+       for (;;) {
+               while (pb <= pc && (r = cmp(pb, a)) <= 0) {
+                       if (r == 0) {
+                               swap_cnt = 1;
+                               swap(pa, pb);
+                               pa += es;
+                       }
+                       pb += es;
+               }
+               while (pb <= pc && (r = cmp(pc, a)) >= 0) {
+                       if (r == 0) {
+                               swap_cnt = 1;
+                               swap(pc, pd);
+                               pd -= es;
+                       }
+                       pc -= es;
+               }
+               if (pb > pc)
+                       break;
+               swap(pb, pc);
+               swap_cnt = 1;
+               pb += es;
+               pc -= es;
+       }
+       if (swap_cnt == 0) {  /* Switch to insertion sort */
+               for (pm = a + es; pm < (char *) a + n * es; pm += es)
+                       for (pl = pm; pl > (char *) a && cmp(pl - es, pl) > 0; 
+                            pl -= es)
+                               swap(pl, pl - es);
+               return;
+       }
+
+       pn = a + n * es;
+       r = min(pa - (char *)a, pb - pa);
+       vecswap(a, pb - r, r);
+       r = min(pd - pc, pn - pd - es);
+       vecswap(pb, pn - r, r);
+       if ((r = pb - pa) > es)
+               qsort(a, r / es, es, cmp);
+       if ((r = pd - pc) > es) { 
+               /* Iterate rather than recurse to save stack space */
+               a = pn - r;
+               n = r / es;
+               goto loop;
+       }
+/*             qsort(pn - r, r / es, es, cmp);*/
+}
diff --git a/i386/libsa/setjmp.s b/i386/libsa/setjmp.s
new file mode 100644 (file)
index 0000000..6082ea0
--- /dev/null
@@ -0,0 +1,58 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
+ * Reserved.  This file contains Original Code and/or Modifications of
+ * Original Code as defined in and that are subject to the Apple Public
+ * Source License Version 1.1 (the "License").  You may not use this file
+ * except in compliance with the License.  Please obtain a copy of the
+ * License at http://www.apple.com/publicsource and read it before using
+ * this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+
+#include <architecture/i386/asm_help.h>
+
+#define        O_EDI   0
+#define        O_ESI   4
+#define        O_EBX   8
+#define        O_EBP   12
+#define        O_ESP   16
+#define O_EIP  20
+
+LEAF(_setjmp, 0)
+X_LEAF(_set_label, _setjmp)
+       movl    4(%esp), %edx       // address of save area
+       movl    %edi, O_EDI(%edx)
+       movl    %esi, O_ESI(%edx)
+       movl    %ebx, O_EBX(%edx)
+       movl    %ebp, O_EBP(%edx)
+       movl    %esp, O_ESP(%edx)
+       movl    (%esp), %ecx        // %eip (return address)
+       movl    %ecx, O_EIP(%edx)
+       subl    %eax, %eax          // retval <- 0
+       ret
+
+LEAF(_longjmp, 0)
+X_LEAF(_jump_label, _longjmp)
+       movl    4(%esp), %edx       // address of save area
+       movl    O_EDI(%edx), %edi
+       movl    O_ESI(%edx), %esi
+       movl    O_EBX(%edx), %ebx
+       movl    O_EBP(%edx), %ebp
+       movl    O_ESP(%edx), %esp
+       movl    O_EIP(%edx), %eax   // %eip (return address)
+       movl    %eax, 0(%esp)
+       popl    %eax                // ret addr != 0
+       jmp         *%eax               // indirect
diff --git a/i386/libsa/string.c b/i386/libsa/string.c
new file mode 100644 (file)
index 0000000..b423aca
--- /dev/null
@@ -0,0 +1,161 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
+ * Reserved.  This file contains Original Code and/or Modifications of
+ * Original Code as defined in and that are subject to the Apple Public
+ * Source License Version 1.1 (the "License").  You may not use this file
+ * except in compliance with the License.  Please obtain a copy of the
+ * License at http://www.apple.com/publicsource and read it before using
+ * this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/* string operations */
+
+#include "libsa.h"
+
+void * memset(void * dst, int val, size_t len)
+{
+    asm( "rep; stosb"
+       : "=c" (len), "=D" (dst)
+       : "0" (len), "1" (dst), "a" (val)
+       : "memory" );
+
+    return dst;
+}
+
+void * memcpy(void * dst, const void * src, size_t len)
+{
+    asm( "rep; movsb"
+       : "=c" (len), "=D" (dst), "=S" (src)
+       : "0" (len), "1" (dst), "2" (src)
+       : "memory" );
+
+    return dst;
+}
+
+void bcopy(const void * src, void * dst, int len)
+{
+       memcpy(dst, src, len);
+}
+
+void bzero(void * dst, int len)
+{
+    memset(dst, 0, len);
+}
+
+/* #if DONT_USE_GCC_BUILT_IN_STRLEN */
+
+#define tolower(c)     ((int)((c) & ~0x20))
+#define toupper(c)     ((int)((c) | 0x20))
+
+int strlen(const char * s)
+{
+       int n = 0;
+       while (*s++) n++;
+       return(n);
+}
+
+/*#endif*/
+
+int
+strcmp(const char * s1, const char * s2)
+{
+       while (*s1 && (*s1 == *s2)) {
+               s1++;
+               s2++;
+       }
+       return (*s1 - *s2);
+}
+
+int strncmp(const char * s1, const char * s2, size_t len)
+{
+       register int n = len;
+       while (--n >= 0 && *s1 == *s2++)
+               if (*s1++ == '\0')
+                       return(0);
+       return(n<0 ? 0 : *s1 - *--s2);
+}
+
+char *
+strcpy(char * s1, const char * s2)
+{
+       register char *ret = s1;
+       while (*s1++ = *s2++)
+               continue;
+       return ret;
+}
+
+char *
+strncpy(char * s1, const char * s2, size_t n)
+{
+       register char *ret = s1;
+       while (n && (*s1++ = *s2++))
+               n--;
+       if (!n) *s1=0;
+       return ret;
+}
+
+int
+ptol(char *str)
+{
+       register int c = *str;
+
+       if (c <= '7' && c >= '0')
+               c -= '0';
+       else if (c <= 'h' && c >= 'a')
+               c -= 'a';
+       else c = 0;
+       return c;
+}
+
+int
+atoi(const char *str)
+{
+       register int sum = 0;
+       while (*str == ' ' || *str == '\t')
+               str++;
+       while (*str >= '0' && *str <= '9') {
+               sum *= 10;
+               sum += *str++ - '0';
+       }
+       return sum;
+}
+
+char *strncat(char *s1, const char *s2, size_t n)
+{
+       register char *ret = s1;
+       while (*s1)
+               s1++;
+       while (n-- && *s2)
+               *s1++ = *s2++;
+       *s1 = '\0';
+       return ret;
+}
+
+char *strcat(char *s1, const char *s2)
+{
+       return(strncat(s1, s2, strlen(s2)));
+}
+
+#if STRNCASECMP
+int strncasecmp(const char *s1, const char *s2, size_t len)
+{
+       register int n = len;
+       while (--n >= 0 && tolower(*s1) == tolower(*s2++))
+               if (*s1++ == '\0')
+                       return(0);
+       return(n<0 ? 0 : tolower(*s1) - tolower(*--s2));
+}
+#endif
diff --git a/i386/libsa/strtol.c b/i386/libsa/strtol.c
new file mode 100644 (file)
index 0000000..afad201
--- /dev/null
@@ -0,0 +1,270 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
+ * Reserved.  This file contains Original Code and/or Modifications of
+ * Original Code as defined in and that are subject to the Apple Public
+ * Source License Version 1.1 (the "License").  You may not use this file
+ * except in compliance with the License.  Please obtain a copy of the
+ * License at http://www.apple.com/publicsource and read it before using
+ * this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*-
+ * Copyright (c) 1990, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+/*      Copyright (c) 1995 NeXT Computer, Inc.  All rights reserved.
+ *
+ * HISTORY
+ *     Modified by Curtis Galloway at NeXT June 1993,
+ *     for use in the standalone library.
+ *
+ * 30-Nov-1995    Dean Reece at NeXT
+ *      Created based on BSD4.4's strtol.c & strtoul.c.
+ *      Removed dependency on _ctype_ by static versions of isupper()...
+ *      Added support for "0b101..." binary constants.
+ *      Commented out references to errno.
+ */
+#if defined(LIBC_SCCS) && !defined(lint)
+static char sccsid[] = "@(#)strtol.c   5.4 (Berkeley) 2/23/91";
+#endif /* LIBC_SCCS and not lint */
+
+#include "libsa.h"
+#include <limits.h>
+
+static inline int
+isupper(char c)
+{
+    return (c >= 'A' && c <= 'Z');
+}
+
+static inline int
+islower(char c)
+{
+    return (c >= 'a' && c <= 'z');
+}
+
+static inline int
+isalpha(char c)
+{
+    return ((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z'));
+}
+
+static inline int
+isspace(char c)
+{
+    return (c == ' ' || c == '\t' || c == '\n' || c == '\12');
+}
+
+static inline int
+isdigit(char c)
+{
+    return (c >= '0' && c <= '9');
+}
+
+
+/*
+ * Convert a string to a long integer.
+ *
+ * Ignores `locale' stuff.  Assumes that the upper and lower case
+ * alphabets and digits are each contiguous.
+ */
+long
+strtol(nptr, endptr, base)
+       const char *nptr;
+       char **endptr;
+       register int base;
+{
+       register const char *s = nptr;
+       register unsigned long acc;
+       register int c;
+       register unsigned long cutoff;
+       register int neg = 0, any, cutlim;
+
+       /*
+        * Skip white space and pick up leading +/- sign if any.
+        * If base is 0, allow 0x for hex and 0 for octal, else
+        * assume decimal; if base is already 16, allow 0x.
+        */
+       do {
+               c = *s++;
+       } while (isspace(c));
+       if (c == '-') {
+               neg = 1;
+               c = *s++;
+       } else if (c == '+')
+               c = *s++;
+       if ((base == 0 || base == 16) &&
+           c == '0' && (*s == 'x' || *s == 'X')) {
+               c = s[1];
+               s += 2;
+               base = 16;
+       } else if ((base == 0 || base == 2) &&
+           c == '0' && (*s == 'b' || *s == 'B')) {
+               c = s[1];
+               s += 2;
+               base = 2;
+       }
+       if (base == 0)
+               base = c == '0' ? 8 : 10;
+
+       /*
+        * Compute the cutoff value between legal numbers and illegal
+        * numbers.  That is the largest legal value, divided by the
+        * base.  An input number that is greater than this value, if
+        * followed by a legal input character, is too big.  One that
+        * is equal to this value may be valid or not; the limit
+        * between valid and invalid numbers is then based on the last
+        * digit.  For instance, if the range for longs is
+        * [-2147483648..2147483647] and the input base is 10,
+        * cutoff will be set to 214748364 and cutlim to either
+        * 7 (neg==0) or 8 (neg==1), meaning that if we have accumulated
+        * a value > 214748364, or equal but the next digit is > 7 (or 8),
+        * the number is too big, and we will return a range error.
+        *
+        * Set any if any `digits' consumed; make it negative to indicate
+        * overflow.
+        */
+       cutoff = neg ? -(unsigned long)LONG_MIN : LONG_MAX;
+       cutlim = cutoff % (unsigned long)base;
+       cutoff /= (unsigned long)base;
+       for (acc = 0, any = 0;; c = *s++) {
+               if (isdigit(c))
+                       c -= '0';
+               else if (isalpha(c))
+                       c -= isupper(c) ? 'A' - 10 : 'a' - 10;
+               else
+                       break;
+               if (c >= base)
+                       break;
+               if (any < 0 || acc > cutoff || acc == cutoff && c > cutlim)
+                       any = -1;
+               else {
+                       any = 1;
+                       acc *= base;
+                       acc += c;
+               }
+       }
+       if (any < 0) {
+               acc = neg ? LONG_MIN : LONG_MAX;
+//             errno = ERANGE;
+       } else if (neg)
+               acc = -acc;
+       if (endptr != 0)
+               *endptr = (char *)(any ? s - 1 : nptr);
+       return (acc);
+}
+
+
+/*
+ * Convert a string to an unsigned long integer.
+ *
+ * Ignores `locale' stuff.  Assumes that the upper and lower case
+ * alphabets and digits are each contiguous.
+ */
+unsigned long
+strtoul(nptr, endptr, base)
+       const char *nptr;
+       char **endptr;
+       register int base;
+{
+       register const char *s = nptr;
+       register unsigned long acc;
+       register int c;
+       register unsigned long cutoff;
+       register int neg = 0, any, cutlim;
+
+       /*
+        * See strtol for comments as to the logic used.
+        */
+       do {
+               c = *s++;
+       } while (isspace(c));
+       if (c == '-') {
+               neg = 1;
+               c = *s++;
+       } else if (c == '+')
+               c = *s++;
+       if ((base == 0 || base == 16) &&
+           c == '0' && (*s == 'x' || *s == 'X')) {
+               c = s[1];
+               s += 2;
+               base = 16;
+       } else if ((base == 0 || base == 2) &&
+           c == '0' && (*s == 'b' || *s == 'B')) {
+               c = s[1];
+               s += 2;
+               base = 2;
+       }
+       if (base == 0)
+               base = c == '0' ? 8 : 10;
+       cutoff = (unsigned long)ULONG_MAX / (unsigned long)base;
+       cutlim = (unsigned long)ULONG_MAX % (unsigned long)base;
+       for (acc = 0, any = 0;; c = *s++) {
+               if (isdigit(c))
+                       c -= '0';
+               else if (isalpha(c))
+                       c -= isupper(c) ? 'A' - 10 : 'a' - 10;
+               else
+                       break;
+               if (c >= base)
+                       break;
+               if (any < 0 || acc > cutoff || acc == cutoff && c > cutlim)
+                       any = -1;
+               else {
+                       any = 1;
+                       acc *= base;
+                       acc += c;
+               }
+       }
+       if (any < 0) {
+               acc = ULONG_MAX;
+//             errno = ERANGE;
+       } else if (neg)
+               acc = -acc;
+       if (endptr != 0)
+               *endptr = (char *)(any ? s - 1 : nptr);
+       return (acc);
+}
diff --git a/i386/libsa/zalloc.c b/i386/libsa/zalloc.c
new file mode 100644 (file)
index 0000000..be4b162
--- /dev/null
@@ -0,0 +1,249 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
+ * Reserved.  This file contains Original Code and/or Modifications of
+ * Original Code as defined in and that are subject to the Apple Public
+ * Source License Version 1.1 (the "License").  You may not use this file
+ * except in compliance with the License.  Please obtain a copy of the
+ * License at http://www.apple.com/publicsource and read it before using
+ * this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright 1993 NeXT Computer, Inc.
+ * All rights reserved.
+ *
+ * Sam's simple memory allocator.
+ *
+ */
+
+#include "libsa.h"
+#include "memory.h"
+
+#define ZDEBUG 0
+
+#if ZDEBUG
+int zout;
+#endif
+
+typedef struct {
+       char * start;
+       int    size;
+} zmem;
+
+static zmem * zalloced;
+static zmem * zavailable;
+static short  availableNodes, allocedNodes, totalNodes;
+static char * zalloc_base;
+static void   (*zerror)();
+
+static void   zallocate(char * start,int size);
+static void   zinsert(zmem * zp, int ndx);
+static void   zdelete(zmem * zp, int ndx);
+static void   zcoalesce(void);
+
+#define ZALLOC_NODES   384
+
+static void malloc_error()
+{
+    // printf("Out of memory\n");
+}
+
+// define the block of memory that the allocator will use
+void malloc_init(char * start, int size, int nodes)
+{
+       zalloc_base         = start;
+       totalNodes          = nodes;
+       zalloced            = (zmem *) zalloc_base;
+       start              += sizeof(zmem) * nodes;
+       zavailable          = (zmem *) start;
+       start              += sizeof(zmem) * nodes;
+       zavailable[0].start = start;
+       zavailable[0].size  = size;
+       availableNodes      = 1;
+       allocedNodes        = 0;
+    zerror              = malloc_error;
+}
+
+void * malloc(size_t size)
+{
+       int    i;
+       char * ret = 0;
+
+       if ( !zalloc_base )
+       {
+               // this used to follow the bss but some bios' corrupted it...
+               malloc_init((char *)ZALLOC_ADDR, ZALLOC_LEN, ZALLOC_NODES);
+       }
+
+       size = ((size + 0xf) & ~0xf);
+       for (i = 0; i < availableNodes; i++)
+       {
+               // uses first possible node, doesn't try to find best fit
+               if ( zavailable[i].size == size )
+               {
+                       zallocate(ret = zavailable[i].start, size);
+                       zdelete(zavailable, i); availableNodes--;
+                       goto done;
+               }
+               else if ( zavailable[i].size > size )
+               {
+                       zallocate(ret = zavailable[i].start, size);
+                       zavailable[i].start += size;
+                       zavailable[i].size  -= size;
+                       goto done;
+               }
+       }
+
+done:
+       if ((ret == 0) || (ret + size >= (char *)(ZALLOC_ADDR + ZALLOC_LEN)))
+    {
+               if (zerror) (*zerror)(ret);
+    }
+       if (ret != 0)
+    {
+               bzero(ret, size);
+    }
+       return (void *) ret;
+}
+
+void free(void * pointer)
+{
+       int i, tsize = 0, found = 0;
+       char * start = pointer;
+
+       if ( !start ) return;
+
+       for (i = 0; i < allocedNodes; i++)
+       {
+               if ( zalloced[i].start == start )
+               {
+                       tsize = zalloced[i].size;
+#if ZDEBUG
+                       zout -= tsize;
+                       printf("    zz out %d\n",zout);
+#endif
+                       zdelete(zalloced, i); allocedNodes--;
+                       found = 1;
+                       break;
+               }
+       }
+       if ( !found ) return;
+
+       for (i = 0; i < availableNodes; i++)
+       {
+               if ((start + tsize) == zavailable[i].start)  // merge it in
+               {
+                       zavailable[i].start = start;
+                       zavailable[i].size += tsize;
+                       zcoalesce();
+                       return;
+               }
+
+               if ((i > 0) &&
+            (zavailable[i-1].start + zavailable[i-1].size == start))
+               {
+                       zavailable[i-1].size += tsize;
+                       zcoalesce();
+                       return;
+               }
+
+               if ((start + tsize) < zavailable[i].start)
+               {
+                       zinsert(zavailable, i); availableNodes++;
+                       zavailable[i].start = start;
+                       zavailable[i].size = tsize;
+                       return;
+               }
+       }
+
+       zavailable[i].start = start;
+       zavailable[i].size  = tsize;
+       availableNodes++;
+       zcoalesce();
+       return;
+}
+
+static void
+zallocate(char * start,int size)
+{
+#if ZDEBUG
+       zout += size;
+       printf("    alloc %d, total 0x%x\n",size,zout);
+#endif
+       zalloced[allocedNodes].start = start;
+       zalloced[allocedNodes].size  = size;
+       allocedNodes++;
+}
+
+static void
+zinsert(zmem * zp, int ndx)
+{
+       int i;
+       zmem *z1, *z2;
+
+       i  = totalNodes-2;
+       z1 = zp + i;
+       z2 = z1 + 1;
+
+       for (; i >= ndx; i--, z1--, z2--)
+       {
+               z2->start = z1->start;
+               z2->size  = z1->size;
+       }
+}
+
+static void
+zdelete(zmem * zp, int ndx)
+{
+       int i;
+       zmem *z1, *z2;
+
+       z1 = zp + ndx;
+       z2 = z1 + 1;
+
+       for (i = ndx; i < totalNodes-1; i++, z1++, z2++)
+       {
+               z1->start = z2->start;
+               z1->size  = z2->size;
+       }
+}
+
+static void
+zcoalesce(void)
+{
+       int i;
+
+       for (i = 0; i < availableNodes-1; i++)
+       {
+               if ( zavailable[i].start + zavailable[i].size == 
+             zavailable[i+1].start )
+               {
+                       zavailable[i].size += zavailable[i+1].size;
+                       zdelete(zavailable, i+1); availableNodes--;
+                       return;
+               }
+       }       
+}
+
+/* This is the simplest way possible.  Should fix this. */
+void * realloc(void * start, size_t newsize)
+{
+    void * newstart = malloc(newsize);
+    bcopy(start, newstart, newsize);
+    free(start);
+    return newstart;
+}
diff --git a/i386/libsaio/Makefile b/i386/libsaio/Makefile
new file mode 100644 (file)
index 0000000..550acbf
--- /dev/null
@@ -0,0 +1,81 @@
+
+DIR = libsaio
+include ../MakePaths.dir
+
+UTILDIR = ../util
+LIBSADIR = ../libsa
+INSTALLDIR = $(DSTROOT)/System/Library/Frameworks/System.framework/Versions/B/PrivateHeaders/standalone
+SYMROOT=
+
+OPTIM = -Os
+CFLAGS = $(RC_CFLAGS) $(OPTIM) $(MORECPP) -arch i386 -g -Wmost -Wno-precomp \
+    -D__ARCHITECTURE__=\"i386\" -DSAIO_INTERNAL_USER -munaligned-text -static \
+       -traditional-cpp -DRCZ_COMPRESSED_FILE_SUPPORT
+DEFINES=
+CONFIG = hd
+INC = -I../rcz -I. -I$(SYMROOT) -I$(UTILDIR) -I$(LIBSADIR) -I/System/Library/Frameworks/System.framework/PrivateHeaders
+ifneq "" "$(wildcard /bin/mkdirs)"
+  MKDIRS = /bin/mkdirs
+else
+  MKDIRS = /bin/mkdir -p
+endif
+AS = as
+LD = ld
+# LIBS= -lc_static
+LIBS=
+
+VPATH = $(OBJROOT):$(SYMROOT)
+
+SAIO_OBJS = table.o asm.o biosfn.o misc.o gets.o \
+       vga.o disk.o sys.o cache.o \
+       ufs_byteorder.o bootstruct.o \
+       stringTable.o load.o \
+       bios.o pci.o vbe.o nbp.o
+
+SAIO_EXTERN_OBJS = console.o
+
+SFILES =
+CFILES = 
+HFILES = 
+EXPORTED_HFILES =
+INSTALLED_HFILES =
+OTHERFILES = Makefile
+ALLSRC =  $(SFILES) $(CFILES) \
+       $(HFILES) $(OTHERFILES)
+LIBS = libsaio.a
+DIRS_NEEDED = $(OBJROOT) $(SYMROOT)
+#GENFILES = $(SYMROOT)/saio_internal.h \
+#      $(SYMROOT)/saio_external.h \
+#      $(SYMROOT)/saio_defs.h \
+#      $(SYMROOT)/saio_table.c
+
+#SIG = $(SYMROOT)/sig
+
+all: $(DIRS_NEEDED) libsaio.h $(LIBS)
+
+#libsaio_static.a: $(SAIO_OBJS)
+#      rm -f $(SYMROOT)/$@
+#      ar q $(SYMROOT)/$@ $(SAIO_OBJS)
+#      ranlib $(SYMROOT)/$@
+
+libsaio.a: $(SAIO_EXTERN_OBJS) $(SAIO_OBJS)
+       rm -f $(SYMROOT)/$(@F)
+       ar q $(SYMROOT)/$(@F) $(SAIO_EXTERN_OBJS) $(SAIO_OBJS)
+       ranlib $(SYMROOT)/$(@F)
+
+#saio_internal.h: saio_external.h
+#saio_table.c: saio_external.h
+#saio_defs.h: saio_external.h
+#saio_external.h: saio.def
+#      $(SIG) -d $(SYMROOT) -n saio saio.def
+
+clean::
+       rm -rf $(SYMROOT)/libsaio.a
+
+#installhdrs:: $(INSTALLDIR)
+#      cp $(INSTALLED_HFILES) $(INSTALLDIR)
+
+include ../MakeInc.dir
+
+# dependencies
+-include $(OBJROOT)/Makedep
diff --git a/i386/libsaio/appleClut8.h b/i386/libsaio/appleClut8.h
new file mode 100644 (file)
index 0000000..e608d18
--- /dev/null
@@ -0,0 +1,102 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
+ * Reserved.  This file contains Original Code and/or Modifications of
+ * Original Code as defined in and that are subject to the Apple Public
+ * Source License Version 1.1 (the "License").  You may not use this file
+ * except in compliance with the License.  Please obtain a copy of the
+ * License at http://www.apple.com/publicsource and read it before using
+ * this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+
+#ifndef __LIBSAIO_APPLECLUT8_H
+#define __LIBSAIO_APPLECLUT8_H
+
+static const unsigned char appleClut8[ 256 * 3 ] = {
+
+       0x00,0x00,0x00, 0xFF,0xFF,0xCC, 0xFF,0xFF,0x99, 0xFF,0xFF,0x66,
+       0xFF,0xFF,0x33, 0xFF,0xFF,0x00, 0xFF,0xCC,0xFF, 0xFF,0xCC,0xCC,
+       0xFF,0xCC,0x99, 0xFF,0xCC,0x66, 0xFF,0xCC,0x33, 0xFF,0xCC,0x00,
+       0xFF,0x99,0xFF, 0xFF,0x99,0xCC, 0xFF,0x99,0x99, 0xFF,0x99,0x66,
+       0xFF,0x99,0x33, 0xFF,0x99,0x00, 0xFF,0x66,0xFF, 0xFF,0x66,0xCC,
+       0xFF,0x66,0x99, 0xFF,0x66,0x66, 0xFF,0x66,0x33, 0xFF,0x66,0x00,
+       0xFF,0x33,0xFF, 0xFF,0x33,0xCC, 0xFF,0x33,0x99, 0xFF,0x33,0x66,
+       0xFF,0x33,0x33, 0xFF,0x33,0x00, 0xFF,0x00,0xFF, 0xFF,0x00,0xCC,
+       0xFF,0x00,0x99, 0xFF,0x00,0x66, 0xFF,0x00,0x33, 0xFF,0x00,0x00,
+       0xCC,0xFF,0xFF, 0xCC,0xFF,0xCC, 0xCC,0xFF,0x99, 0xCC,0xFF,0x66,
+       0xCC,0xFF,0x33, 0xCC,0xFF,0x00, 0xCC,0xCC,0xFF, 0xCC,0xCC,0xCC,
+       0xCC,0xCC,0x99, 0xCC,0xCC,0x66, 0xCC,0xCC,0x33, 0xCC,0xCC,0x00,
+       0xCC,0x99,0xFF, 0xCC,0x99,0xCC, 0xCC,0x99,0x99, 0xCC,0x99,0x66,
+       0xCC,0x99,0x33, 0xCC,0x99,0x00, 0xCC,0x66,0xFF, 0xCC,0x66,0xCC,
+       0xCC,0x66,0x99, 0xCC,0x66,0x66, 0xCC,0x66,0x33, 0xCC,0x66,0x00,
+       0xCC,0x33,0xFF, 0xCC,0x33,0xCC, 0xCC,0x33,0x99, 0xCC,0x33,0x66,
+
+
+       0xCC,0x33,0x33, 0xCC,0x33,0x00, 0xCC,0x00,0xFF, 0xCC,0x00,0xCC,
+       0xCC,0x00,0x99, 0xCC,0x00,0x66, 0xCC,0x00,0x33, 0xCC,0x00,0x00,
+       0x99,0xFF,0xFF, 0x99,0xFF,0xCC, 0x99,0xFF,0x99, 0x99,0xFF,0x66,
+       0x99,0xFF,0x33, 0x99,0xFF,0x00, 0x99,0xCC,0xFF, 0x99,0xCC,0xCC,
+       0x99,0xCC,0x99, 0x99,0xCC,0x66, 0x99,0xCC,0x33, 0x99,0xCC,0x00,
+       0x99,0x99,0xFF, 0x99,0x99,0xCC, 0x99,0x99,0x99, 0x99,0x99,0x66,
+       0x99,0x99,0x33, 0x99,0x99,0x00, 0x99,0x66,0xFF, 0x99,0x66,0xCC,
+       0x99,0x66,0x99, 0x99,0x66,0x66, 0x99,0x66,0x33, 0x99,0x66,0x00,
+       0x99,0x33,0xFF, 0x99,0x33,0xCC, 0x99,0x33,0x99, 0x99,0x33,0x66,
+       0x99,0x33,0x33, 0x99,0x33,0x00, 0x99,0x00,0xFF, 0x99,0x00,0xCC,
+       0x99,0x00,0x99, 0x99,0x00,0x66, 0x99,0x00,0x33, 0x99,0x00,0x00,
+       0x66,0xFF,0xFF, 0x66,0xFF,0xCC, 0x66,0xFF,0x99, 0x66,0xFF,0x66,
+       0x66,0xFF,0x33, 0x66,0xFF,0x00, 0x66,0xCC,0xFF, 0x66,0xCC,0xCC,
+       0x66,0xCC,0x99, 0x66,0xCC,0x66, 0x66,0xCC,0x33, 0x66,0xCC,0x00,
+       0x66,0x99,0xFF, 0x66,0x99,0xCC, 0x66,0x99,0x99, 0x66,0x99,0x66,
+       0x66,0x99,0x33, 0x66,0x99,0x00, 0x66,0x66,0xFF, 0x66,0x66,0xCC,
+       0x66,0x66,0x99, 0x66,0x66,0x66, 0x66,0x66,0x33, 0x66,0x66,0x00,
+
+
+       0x66,0x33,0xFF, 0x66,0x33,0xCC, 0x66,0x33,0x99, 0x66,0x33,0x66,
+       0x66,0x33,0x33, 0x66,0x33,0x00, 0x66,0x00,0xFF, 0x66,0x00,0xCC,
+       0x66,0x00,0x99, 0x66,0x00,0x66, 0x66,0x00,0x33, 0x66,0x00,0x00,
+       0x33,0xFF,0xFF, 0x33,0xFF,0xCC, 0x33,0xFF,0x99, 0x33,0xFF,0x66,
+       0x33,0xFF,0x33, 0x33,0xFF,0x00, 0x33,0xCC,0xFF, 0x33,0xCC,0xCC,
+       0x33,0xCC,0x99, 0x33,0xCC,0x66, 0x33,0xCC,0x33, 0x33,0xCC,0x00,
+       0x33,0x99,0xFF, 0x33,0x99,0xCC, 0x33,0x99,0x99, 0x33,0x99,0x66,
+       0x33,0x99,0x33, 0x33,0x99,0x00, 0x33,0x66,0xFF, 0x33,0x66,0xCC,
+       0x33,0x66,0x99, 0x33,0x66,0x66, 0x33,0x66,0x33, 0x33,0x66,0x00,
+       0x33,0x33,0xFF, 0x33,0x33,0xCC, 0x33,0x33,0x99, 0x33,0x33,0x66,
+       0x33,0x33,0x33, 0x33,0x33,0x00, 0x33,0x00,0xFF, 0x33,0x00,0xCC,
+       0x33,0x00,0x99, 0x33,0x00,0x66, 0x33,0x00,0x33, 0x33,0x00,0x00,
+       0x00,0xFF,0xFF, 0x00,0xFF,0xCC, 0x00,0xFF,0x99, 0x00,0xFF,0x66,
+       0x00,0xFF,0x33, 0x00,0xFF,0x00, 0x00,0xCC,0xFF, 0x00,0xCC,0xCC,
+       0x00,0xCC,0x99, 0x00,0xCC,0x66, 0x00,0xCC,0x33, 0x00,0xCC,0x00,
+       0x00,0x99,0xFF, 0x00,0x99,0xCC, 0x00,0x99,0x99, 0x00,0x99,0x66,
+
+
+       0x00,0x99,0x33, 0x00,0x99,0x00, 0x00,0x66,0xFF, 0x00,0x66,0xCC,
+       0x00,0x66,0x99, 0x00,0x66,0x66, 0x00,0x66,0x33, 0x00,0x66,0x00,
+       0x00,0x33,0xFF, 0x00,0x33,0xCC, 0x00,0x33,0x99, 0x00,0x33,0x66,
+       0x00,0x33,0x33, 0x00,0x33,0x00, 0x00,0x00,0xFF, 0x00,0x00,0xCC,
+       0x00,0x00,0x99, 0x00,0x00,0x66, 0x00,0x00,0x33, 0xEE,0x00,0x00,
+       0xDD,0x00,0x00, 0xBB,0x00,0x00, 0xAA,0x00,0x00, 0x88,0x00,0x00,
+       0x77,0x00,0x00, 0x55,0x00,0x00, 0x44,0x00,0x00, 0x22,0x00,0x00,
+       0x11,0x00,0x00, 0x00,0xEE,0x00, 0x00,0xDD,0x00, 0x00,0xBB,0x00,
+       0x00,0xAA,0x00, 0x00,0x88,0x00, 0x00,0x77,0x00, 0x00,0x55,0x00,
+       0x00,0x44,0x00, 0x00,0x22,0x00, 0x00,0x11,0x00, 0x00,0x00,0xEE,
+       0x00,0x00,0xDD, 0x00,0x00,0xBB, 0x00,0x00,0xAA, 0x00,0x00,0x88,
+       0x00,0x00,0x77, 0x00,0x00,0x55, 0x00,0x00,0x44, 0x00,0x00,0x22,
+       0x00,0x00,0x11, 0xEE,0xEE,0xEE, 0xDD,0xDD,0xDD, 0xBB,0xBB,0xBB,
+       0xAA,0xAA,0xAA, 0x88,0x88,0x88, 0x77,0x77,0x77, 0x55,0x55,0x55,
+       0x44,0x44,0x44, 0x22,0x22,0x22, 0x11,0x11,0x11, 0xFF,0xFF,0xFF
+};
+
+#endif /* !__LIBSAIO_APPLECLUT8_H */
diff --git a/i386/libsaio/asm.s b/i386/libsaio/asm.s
new file mode 100644 (file)
index 0000000..ede3dfa
--- /dev/null
@@ -0,0 +1,376 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
+ * Reserved.  This file contains Original Code and/or Modifications of
+ * Original Code as defined in and that are subject to the Apple Public
+ * Source License Version 1.1 (the "License").  You may not use this file
+ * except in compliance with the License.  Please obtain a copy of the
+ * License at http://www.apple.com/publicsource and read it before using
+ * this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/* 
+ * Mach Operating System
+ * Copyright (c) 1990 Carnegie-Mellon University
+ * Copyright (c) 1989 Carnegie-Mellon University
+ * All rights reserved.  The CMU software License Agreement specifies
+ * the terms and conditions for use and redistribution.
+ */
+/*
+ * HISTORY
+ * $Log: asm.s,v $
+ * Revision 1.2  2000/05/23 23:01:11  lindak
+ * Merged PR-2309530 into Kodiak (liu i386 booter: does not support label-less
+ * ufs partitions)
+ *
+ * Revision 1.1.1.2.4.1  2000/05/13 17:07:39  jliu
+ * New boot0 (boot1 has been deprecated). Booter must now reside in its own partition, no disk label required.
+ *
+ * Revision 1.1.1.2  1999/08/04 21:16:57  wsanchez
+ * Impoort of boot-66
+ *
+ * Revision 1.3  1999/08/04 21:12:12  wsanchez
+ * Update APSL
+ *
+ * Revision 1.2  1999/03/25 05:48:30  wsanchez
+ * Add APL.
+ * Remove unused gzip code.
+ * Remove unused Adobe fonts.
+ *
+ * Revision 1.1.1.1.66.2  1999/03/16 16:08:54  wsanchez
+ * Substitute License
+ *
+ * Revision 1.1.1.1.66.1  1999/03/16 07:33:21  wsanchez
+ * Add APL
+ *
+ * Revision 1.1.1.1  1997/12/05 21:57:57  wsanchez
+ * Import of boot-25 (~mwatson)
+ *
+ * Revision 2.1.1.2  90//03//22  17:59:50  rvb
+ *     Added _sp() => where is the stack at. [kupfer]
+ * 
+ * Revision 2.1.1.1  90//02//09  17:25:04  rvb
+ *     Add Intel copyright
+ *     [90//02//09            rvb]
+ * 
+ */
+
+
+//          INTEL CORPORATION PROPRIETARY INFORMATION
+//
+//  This software is supplied under the terms of a license  agreement or 
+//  nondisclosure agreement with Intel Corporation and may not be copied 
+//  nor disclosed except in accordance with the terms of that agreement.
+//
+//  Copyright 1988 Intel Corporation
+//  Copyright 1988, 1989 by Intel Corporation
+//
+
+#include <architecture/i386/asm_help.h>
+#include "memory.h"
+
+#define data32  .byte 0x66
+#define addr32  .byte 0x67
+
+    .file "asm.s"
+
+BOOTSEG     =   BASE_SEG
+
+CR0_PE_ON   =   0x1
+CR0_PE_OFF  =   0xfffffffe
+
+.globl _Gdtr
+    .data
+    .align 2,0x90
+_Gdtr:
+    .word 0x2F
+//  .long _Gdt+4096
+    .long vtop(_Gdt)
+
+// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+// Data area for __switch_stack.
+//
+save_sp: .long  STACK_ADDR
+save_ss: .long  0
+
+
+    .text
+
+// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+// real_to_prot()
+//  transfer from real mode to protected mode.
+//  preserves all registers except eax
+//
+LABEL(__real_to_prot)
+    // guarantee that interrupt is disabled when in prot mode
+    cli
+
+    addr32                    // load the gdtr
+    data32
+    lgdt    _Gdtr
+
+    // set the PE bit of CR0 to go to protected mode
+
+    mov     %cr0, %eax
+    data32
+    or      $CR0_PE_ON, %eax
+    mov     %eax, %cr0 
+
+    // make intrasegment jump to flush the processor pipeline and
+    // reload CS register
+
+    data32
+    ljmp    $0x08, $xprot
+
+xprot:
+    // we are in USE32 mode now
+    // set up the protected mode segment registers : DS, SS, ES
+
+    mov     $0x10, %eax
+    movw    %ax, %ds
+    movw    %ax, %ss
+    movw    %ax, %es
+
+    xorl    %eax, %eax        // clear garbage from upper word of esp
+    movw    %sp, %ax
+    movl    %eax, %esp
+
+    ret
+
+// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+// prot_to_real()
+//  transfer from protected mode to real mode
+//  preserves all registers except eax
+// 
+LABEL(__prot_to_real)
+
+    ljmp    $0x18, $x16       // change to USE16 mode
+
+x16:
+    mov     %cr0, %eax        // clear the PE bit of CR0
+    data32
+    and     $CR0_PE_OFF, %eax
+    mov     %eax, %cr0
+
+    // make intersegment jmp to flush the processor pipeline
+    // and reload CS register
+
+    data32
+    ljmp    $BOOTSEG, $xreal
+
+xreal:
+    // we are in real mode now
+    // set up the real mode segment registers : DS, SS, ES
+
+    movw    %cs, %ax
+    movw    %ax, %ds
+    movw    %ax, %ss
+    movw    %ax, %es
+
+    data32
+    ret
+
+#if defined(DEFINE_INLINE_FUNCTIONS)
+
+// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+// outb(port, byte)
+//
+LABEL(_outb)
+    push    %ebp
+    mov     %esp, %ebp
+    push    %edx
+
+    movw    8(%ebp), %dx
+    movb    12(%ebp), %al
+    outb    %al, %dx
+
+    pop     %edx
+    pop     %ebp
+    ret
+
+// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+// inb(port)
+//
+LABEL(_inb)
+    push    %ebp
+    mov     %esp, %ebp
+    push    %edx
+
+    movw    8(%ebp), %dx
+    subw    %ax, %ax
+    inb     %dx, %al
+
+    pop     %edx
+    pop     %ebp
+    ret
+
+#endif /* DEFINE_INLINE_FUNCTIONS */
+
+// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+// halt()
+//
+LABEL(_halt)
+//  call    _getchar
+    hlt
+    jmp     _halt
+
+// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+// startprog(phyaddr)
+// Start the program on protected mode where phyaddr is the entry point
+//
+LABEL(_startprog)
+    push    %ebp
+    mov     %esp, %ebp
+
+    mov     0x8(%ebp), %ecx     // entry offset 
+    mov     $0x28, %ebx     // segment
+    push    %ebx
+    push    %ecx
+
+    // set up %ds and %es
+
+    mov     $0x20, %ebx
+    movw    %bx, %ds
+    movw    %bx, %es
+
+    lret
+
+// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+// Returns the current stack pointer.
+//
+LABEL(__sp)
+    mov %esp, %eax
+    ret
+
+// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+// Returns the current stack pointer.
+//
+LABEL(__bp)
+    mov %ebp, %eax
+    ret
+
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+# Switch stack.
+# Switches between registers SS:SP and memory save_ss:save_sp.
+# Call this function from real mode only!!!
+#
+# AX, DI, and SI are modified.
+#
+LABEL(__switch_stack)
+       popl    %eax                            # save return address
+       popl    %edi                            # discard upper 16-bit
+       
+       data32
+       addr32
+       movl    save_ss, %esi           # copy new SS to ESI
+
+       data32
+       addr32
+       movl    save_sp, %edi           # copy new SP to EDI
+       
+       addr32
+       mov             %ss, save_ss            # save current SS
+       
+       data32
+       addr32
+       movl    %esp, save_sp           # Save current SP
+       
+       cli
+       mov             %si, %ss                        # Perform stack switch
+       mov             %di, %sp
+       sti
+       
+       pushl   %eax                            # push IP of caller onto the new stack
+       
+       xorl    %eax, %eax
+       xorl    %esi, %esi
+       xorl    %edi, %edi
+
+       ret
+
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+# Issue a request to the network loader.
+#
+LABEL(_loader)
+       enter   $0, $0  
+       pushal
+
+       #
+       # Pass a far pointer to the command structure
+       # to the INT call through DI:CX.
+       #
+       # The command code is in BX.
+       #
+
+       movw    8(%ebp), %bx            # 8[EBP]  = command code
+       movw    12(%ebp), %cx           # 12[EBP] = command structure offset
+       movw    14(%ebp), %di           # 14[EBP] = command structure segment
+
+       call    __prot_to_real          # Revert to real mode
+
+       ###### Real Mode Begin ######
+
+       data32
+       call    __switch_stack          # Switch to NBP stack
+
+       int             $0x2b                           # Call NBP
+
+       data32
+       call    __switch_stack          # Restore stack
+
+       data32
+       call    __real_to_prot          # Back to protected mode        
+       
+       ###### Real Mode End ######
+       
+       popal
+       leave
+       ret
+
+#if 0
+// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+// pcpy(src, dst, cnt)
+//  where src is a virtual address and dst is a physical address
+//
+LABEL(_pcpy)
+    push    %ebp
+    mov     %esp, %ebp
+    push    %es
+    push    %esi
+    push    %edi
+    push    %ecx
+
+    cld
+
+    // set %es to point at the flat segment
+
+    mov     $0x20, %eax
+    movw    %ax , %es
+
+    mov     0x8(%ebp), %esi     // source
+    mov     0xc(%ebp), %edi     // destination
+    mov     0x10(%ebp), %ecx    // count
+
+    rep
+    movsb
+
+    pop     %ecx
+    pop     %edi
+    pop     %esi
+    pop     %es
+    pop     %ebp
+
+    ret
+#endif
diff --git a/i386/libsaio/bios.h b/i386/libsaio/bios.h
new file mode 100644 (file)
index 0000000..3878b87
--- /dev/null
@@ -0,0 +1,73 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
+ * Reserved.  This file contains Original Code and/or Modifications of
+ * Original Code as defined in and that are subject to the Apple Public
+ * Source License Version 1.1 (the "License").  You may not use this file
+ * except in compliance with the License.  Please obtain a copy of the
+ * License at http://www.apple.com/publicsource and read it before using
+ * this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright 1994 NeXT Computer, Inc.
+ * All rights reserved.
+ */
+
+#ifndef __LIBSAIO_BIOS_H
+#define __LIBSAIO_BIOS_H
+
+typedef union {
+    unsigned int      rx;
+    unsigned short    rr;
+    struct {
+        unsigned char l;
+        unsigned char h;
+    } r;
+} machineRegister_t;
+
+typedef struct {
+    unsigned short cf  :1;
+    unsigned short     :1;
+    unsigned short pf  :1;
+    unsigned short     :1;
+    unsigned short af  :1;
+    unsigned short     :1;
+    unsigned short zf  :1;
+    unsigned short sf  :1;
+    unsigned short tf  :1;
+    unsigned short _if :1;
+    unsigned short df  :1;
+    unsigned short of  :1;
+    unsigned short iopl:2;
+    unsigned short nt  :1;
+} machineFlags_t;
+
+typedef struct {
+    unsigned int      intno;
+    machineRegister_t eax;
+    machineRegister_t ebx;
+    machineRegister_t ecx;
+    machineRegister_t edx;
+    machineRegister_t edi;
+    machineRegister_t esi;
+    machineRegister_t ebp;
+    unsigned short    cs;
+    unsigned short    ds;
+    unsigned short    es;
+    machineFlags_t    flags;
+} biosBuf_t;
+
+#endif /* !__LIBSAIO_BIOS_H */
diff --git a/i386/libsaio/bios.s b/i386/libsaio/bios.s
new file mode 100644 (file)
index 0000000..4be6b70
--- /dev/null
@@ -0,0 +1,251 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
+ * Reserved.  This file contains Original Code and/or Modifications of
+ * Original Code as defined in and that are subject to the Apple Public
+ * Source License Version 1.1 (the "License").  You may not use this file
+ * except in compliance with the License.  Please obtain a copy of the
+ * License at http://www.apple.com/publicsource and read it before using
+ * this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright 1993 NeXT Computer, Inc.
+ * All rights reserved.
+ *
+ * Harness for calling real-mode BIOS functions.
+ */
+
+#include "legacy/asm.h"
+
+#define data32 .byte 0x66
+#define addr32 .byte 0x67
+
+#define O_INT  0
+#define O_EAX  4
+#define O_EBX  8
+#define O_ECX  12
+#define O_EDX  16
+#define O_EDI  20
+#define O_ESI  24
+#define O_EBP  28
+#define O_CS   32
+#define O_DS   34
+#define O_ES   36
+#define O_FLG  38
+
+.data
+       .lcomm save_eax,  4,2
+       .lcomm save_edx,  4,2
+       .lcomm save_es,   2,1
+       .lcomm save_flag, 2,1
+       .lcomm new_eax,   4,2
+       .lcomm new_edx,   4,2
+       .lcomm new_es,    2,1
+
+.text
+
+/*============================================================================
+ * Call real-mode BIOS INT functions.
+ *
+ */
+ENTRY(bios)
+       enter   $0,$0
+       pushal
+       
+       movl    8(%ebp), %edx           // address of save area
+       movb    O_INT(%edx), %al        // save int number
+       movb    %al, do_int+1
+       
+       movl    O_EBX(%edx), %ebx
+       movl    O_ECX(%edx), %ecx
+       movl    O_EDI(%edx), %edi
+       movl    O_ESI(%edx), %esi
+       movl    O_EBP(%edx), %ebp
+       movl    %edx, save_edx
+       movl    O_EAX(%edx), %eax
+       movl    %eax, new_eax
+       movl    O_EDX(%edx), %eax
+       movl    %eax, new_edx
+       movw    O_ES(%edx),  %ax
+       movl    %ax, new_es
+
+       call    EXT(_prot_to_real)
+       
+       data32
+       addr32
+       mov     new_eax, %eax
+       data32
+       addr32
+       mov     new_edx, %edx
+       data32
+       addr32
+       mov     new_es, %es
+
+do_int:
+       int     $0x00
+       pushf
+       data32
+       addr32
+       movl    %eax, save_eax
+       popl    %eax                        // actually pop %ax
+       addr32
+       movl    %eax, save_flag         // actually movw
+       mov     %es, %ax
+       addr32
+       movl    %eax, save_es           // actually movw
+       data32
+       call    EXT(_real_to_prot)
+       
+       movl    %edx, new_edx           // save new edx before clobbering
+       movl    save_edx, %edx
+       movl    new_edx, %eax           // now move it into buffer
+       movl    %eax, O_EDX(%edx)
+       movl    save_eax, %eax
+       movl    %eax, O_EAX(%edx)
+       movw    save_es, %ax
+       movw    %ax, O_ES(%edx)
+       movw    save_flag, %ax
+       movw    %ax, O_FLG(%edx)
+       movl    %ebx, O_EBX(%edx)
+       movl    %ecx, O_ECX(%edx)
+       movl    %edi, O_EDI(%edx)
+       movl    %esi, O_ESI(%edx)
+       movl    %ebp, O_EBP(%edx)
+       
+       popal
+       leave
+       
+       ret
+       
+/*============================================================================
+ * Determines the total system memory size using various BIOS Int 15 calls.
+ *
+ */
+ENTRY(get_memsize)
+       enter   $0, $0                          # create frame pointer (32 bit operand/stack)
+       pushal                                          # save all registers
+
+       movl    8(%ebp), %ebx           # push input structure pointer to stack
+       pushl   %ebx
+
+       call    EXT(_prot_to_real)      # switch to real mode
+
+       ##################################################################
+       # In real mode.
+       # Do not forget the opcode overrides, since the assembler
+       # does not know we have made a transition to 16-bit operation.
+       ##################################################################
+
+       data32
+       movl    $0xE801, %eax           # Get memory size
+       clc
+       int             $0x15
+       data32
+       jnc             getmsz_e801
+
+       data32
+       movl    $0xDA88, %eax           # Get memory size
+       clc
+       int             $0x15
+       data32
+       jnc             getmsz_da88
+
+       movb    $0x8A, %ah                      # Get memory size
+       clc
+       int             $0x15
+       data32
+       jnc             getmsz_8a
+
+       movb    $0x88, %ah                      # Get memory size
+       clc
+       int             $0x15
+       data32
+       jnc             getmsz_88
+
+       xorl    %edx, %edx                      # Error, cannot get memory size
+       xorl    %eax, %eax
+
+getmsz_done:
+       data32
+       addr32
+       pushl   %eax                            # Push EAX to 32-bit stack
+
+       data32
+       call    EXT(_real_to_prot)  # Back to protected mode. EAX is modified.
+
+       ##################################################################
+       # Back to protected mode.
+       ##################################################################
+
+       popl    %eax                            # Pop EAX from stack
+       popl    %ebx                            # Pop pointer to register structure
+
+       # Copy the result to the input structure pointed to by a pointer
+       # which is on top of the stack. Write register EAX and EDX to the
+       # structure.
+
+       movl    %eax, O_EAX(%ebx)
+       movl    %edx, O_EDX(%ebx)
+
+       popal                                           # restore all registers
+       leave                                           # undo enter operator
+       ret
+
+getmsz_88:
+       orl             %eax, %eax
+       data32
+       jz              getmsz_64m
+       xorl    %edx, %edx
+
+getmsz_8a:
+       data32
+       movl    $1024, %ebx                     # Add in 1M
+       addl    %ebx, %eax
+       adcl    $0, %edx
+       data32
+       jmp             getmsz_done
+
+getmsz_64m:
+       data32
+       movl    $1, %edx
+       xorl    %eax, %eax
+       data32
+       jmp             getmsz_done
+
+getmsz_da88:
+       xor             %dh, %dh
+       movb    %cl, %dl
+       movl    %ebx, %eax
+       data32
+       jmp             getmsz_8a
+
+getmsz_e801:
+       xorl    %edx, %edx
+       orl             %ebx, %ebx
+       data32
+       jz              getmsz_88
+
+       data32
+       movl    $64, %eax
+       mul             %ebx
+
+       data32
+       movl    $16384, %ebx
+       addl    %ebx, %eax
+       adcl    $0, %edx
+
+       data32
+       jmp             getmsz_done
diff --git a/i386/libsaio/biosfn.c b/i386/libsaio/biosfn.c
new file mode 100644 (file)
index 0000000..41b11d7
--- /dev/null
@@ -0,0 +1,445 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
+ * Reserved.  This file contains Original Code and/or Modifications of
+ * Original Code as defined in and that are subject to the Apple Public
+ * Source License Version 1.1 (the "License").  You may not use this file
+ * except in compliance with the License.  Please obtain a copy of the
+ * License at http://www.apple.com/publicsource and read it before using
+ * this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright 1993 NeXT Computer, Inc.
+ * All rights reserved.
+ */
+
+#include "libsaio.h"
+#include "memory.h"
+#include "kernBootStruct.h"
+
+static biosBuf_t bb;
+unsigned char uses_ebios[8] = {0, 0, 0, 0, 0, 0, 0, 0};
+
+int bgetc(void)
+{
+    bb.intno = 0x16;
+    bb.eax.r.h = 0x00;
+    bios(&bb);
+    return bb.eax.rr;
+}
+
+int readKeyboardStatus(void)
+{
+    bb.intno = 0x16;
+    bb.eax.r.h = 0x01;
+    bios(&bb);
+    if (bb.flags.zf) {
+       return 0;
+    } else {
+       return bb.eax.rr;
+    }
+}
+
+int readKeyboardShiftFlags(void)
+{
+    bb.intno = 0x16;
+    bb.eax.r.h = 0x02;
+    bios(&bb);
+    return bb.eax.r.l;
+}
+
+unsigned int time18(void)
+{
+    union {
+       struct {
+           unsigned int low:16;
+           unsigned int high:16;
+       } s;
+       unsigned int i;
+    } time;
+    
+    bb.intno = 0x1a;
+    bb.eax.r.h = 0x00;
+    bios(&bb);
+    time.s.low = bb.edx.rr;
+    time.s.high = bb.ecx.rr;
+    return time.i;
+}
+
+int memsize(int which)
+{
+    if (which) {
+        get_memsize(&bb);              
+               return (bb.edx.rr << 16) | bb.eax.rr;
+    }
+    else {
+        /* conventional memory */
+        bb.intno = 0x12;
+        bios(&bb);
+        return bb.eax.rr;
+    }
+}
+
+void video_mode(int mode)
+{
+    bb.intno = 0x10;
+    bb.eax.r.h = 0x00;
+    bb.eax.r.l = mode;
+    bios(&bb);
+}
+
+int biosread(int dev, int cyl, int head, int sec, int num)
+{
+    int i;
+
+    bb.intno = 0x13;
+    sec += 1;                  /* sector numbers start at 1 */
+    
+    for (i=0;;) {
+       bb.ecx.r.h = cyl;
+       bb.ecx.r.l = ((cyl & 0x300) >> 2) | (sec & 0x3F);
+       bb.edx.r.h = head;
+       bb.edx.r.l = dev;
+       bb.eax.r.l = num;
+       bb.ebx.rr = ptov(BIOS_ADDR);
+       bb.es = ((unsigned long)&i & 0xffff0000) >> 4;
+    
+       bb.eax.r.h = 0x02;
+       bios(&bb);
+
+       if ((bb.eax.r.h == 0x00) || (i++ >= 5))
+           break;
+
+       /* reset disk subsystem and try again */
+       bb.eax.r.h = 0x00;
+       bios(&bb);
+    }
+    return bb.eax.r.h;
+}
+
+int ebiosread(int dev, long sec, int count)
+{
+    int i;
+    struct {
+        unsigned char size;
+        unsigned char reserved;
+        unsigned char numblocks;
+        unsigned char reserved2;
+        unsigned int buffer;
+        unsigned long long startblock;
+    } addrpacket = {0};
+    addrpacket.size = sizeof(addrpacket);
+
+    for (i=0;;) {
+        bb.intno = 0x13;
+        bb.eax.r.h = 0x42;
+        bb.edx.r.l = dev;
+        bb.esi.rr = ((unsigned)&addrpacket & 0xffff);
+        addrpacket.numblocks = count;
+        addrpacket.buffer = ptov(BIOS_ADDR);
+        addrpacket.startblock = sec;
+        bios(&bb);
+        if ((bb.eax.r.h == 0x00) || (i++ >= 5))
+            break;
+
+        /* reset disk subsystem and try again */
+        bb.eax.r.h = 0x00;
+        bios(&bb);
+    }
+    return bb.eax.r.h;
+}
+
+void putc(int ch)
+{
+    bb.intno = 0x10;
+    bb.ebx.r.h = 0x00;         /* background black */
+    bb.ebx.r.l = 0x0F;         /* foreground white */
+    bb.eax.r.h = 0x0e;
+    bb.eax.r.l = ch;
+    bios(&bb);
+}
+
+unsigned int get_diskinfo(int drive)
+{
+    struct {
+        unsigned short size;
+        unsigned short flags;
+        unsigned long cylinders;
+        unsigned long heads;
+        unsigned long sectors;
+        unsigned long long total_sectors;
+        unsigned short bps;
+        unsigned long params_p;
+    } ebios = {0};
+    unsigned char useEbios = 0;
+
+    union {
+       compact_diskinfo_t di;
+       unsigned int ui;
+    } ret;
+    static int maxhd = 0;
+
+    ret.ui = 0;
+    if (maxhd == 0) {
+       bb.intno = 0x13;
+       bb.eax.r.h = 0x08;
+       bb.edx.r.l = 0x80;
+       bios(&bb);
+       if (bb.flags.cf == 0)
+           maxhd = 0x7f + bb.edx.r.l;
+    };
+
+    if (drive > maxhd)
+       return 0;
+
+    /* Check drive for EBIOS support. */
+    bb.intno = 0x13;
+    bb.eax.r.h = 0x41;
+    bb.edx.r.l = drive;
+    bb.ebx.rr = 0x55aa;
+    bios(&bb);
+    if(bb.ebx.rr == 0xaa55 && bb.flags.cf == 0) {
+
+        /* Get EBIOS drive info. */
+        ebios.size = 26;
+        bb.intno = 0x13;
+        bb.eax.r.h = 0x48;
+        bb.edx.r.l = drive;
+        bb.esi.rr = ((unsigned)&ebios & 0xffff);
+        bios(&bb);
+        if(bb.flags.cf == 0 && ebios.cylinders != 0) {
+            useEbios = 1;
+        }
+    }
+
+    bb.intno = 0x13;
+    bb.eax.r.h = 0x08;
+    bb.edx.r.l = drive;
+    bios(&bb);
+    if (bb.flags.cf == 0 && bb.eax.r.h == 0) {
+        unsigned long cyl;
+        unsigned long sec;
+        unsigned long hds;
+
+        hds = bb.edx.r.h;
+        sec = bb.ecx.r.l & 0x3F;
+        if(useEbios) {
+            cyl = (ebios.total_sectors / ((hds + 1) * sec)) - 1;
+        }
+        else {
+            cyl = bb.ecx.r.h | ((bb.ecx.r.l & 0xC0) << 2);
+        }
+        ret.di.heads = hds;
+        ret.di.sectors = sec;
+        ret.di.cylinders = cyl;
+    }
+    if(drive >= 0x80) uses_ebios[drive - 0x80] = useEbios;
+    return ret.ui;
+}
+
+void setCursorPosition(int x, int y)
+{
+    bb.intno = 0x10;
+    bb.eax.r.h = 0x02;
+    bb.ebx.r.h = 0x00;         /* page 0 for graphics */
+    bb.edx.r.l = x;
+    bb.edx.r.h = y;
+    bios(&bb);
+}
+
+#if DEBUG
+
+int readDriveParameters(int drive, struct driveParameters *dp)
+{
+    bb.intno = 0x13;
+    bb.edx.r.l = drive;
+    bb.eax.r.h = 0x08;
+    bios(&bb);
+    if (bb.eax.r.h == 0) {
+       dp->heads = bb.edx.r.h;
+       dp->sectors = bb.ecx.r.l & 0x3F;
+       dp->cylinders = bb.ecx.r.h | ((bb.ecx.r.l & 0xC0) << 2);
+       dp->totalDrives = bb.edx.r.l;
+    } else {
+       bzero(dp, sizeof(*dp));
+    }
+    return bb.eax.r.h;
+
+}
+#endif
+
+#define APM_INTNO      0x15
+#define APM_INTCODE    0x53
+
+int
+APMPresent(void)
+{
+    KERNBOOTSTRUCT *kbp = kernBootStruct;
+    
+    bb.intno = APM_INTNO;
+    bb.eax.r.h = APM_INTCODE;
+    bb.eax.r.l = 0x00;
+    bb.ebx.rr = 0x0000;
+    bios(&bb);
+    if ((bb.flags.cf == 0) &&
+       (bb.ebx.r.h == 'P') &&
+       (bb.ebx.r.l == 'M')) {
+           /* Success */
+           kbp->apm_config.major_vers = bb.eax.r.h;
+           kbp->apm_config.minor_vers = bb.eax.r.l;
+           kbp->apm_config.flags.data = bb.ecx.rr;
+           return 1;
+    }
+    return 0;
+}
+
+int
+APMConnect32(void)
+{
+    KERNBOOTSTRUCT *kbp = kernBootStruct;
+
+    bb.intno = APM_INTNO;
+    bb.eax.r.h = APM_INTCODE;
+    bb.eax.r.l = 0x03;
+    bb.ebx.rr = 0x0000;
+    bios(&bb);
+    if (bb.flags.cf == 0) {
+       /* Success */
+       kbp->apm_config.cs32_base = (bb.eax.rr) << 4;
+       kbp->apm_config.entry_offset = bb.ebx.rx;
+       kbp->apm_config.cs16_base = (bb.ecx.rr) << 4;
+       kbp->apm_config.ds_base = (bb.edx.rr) << 4;
+       if (kbp->apm_config.major_vers >= 1 &&
+           kbp->apm_config.minor_vers >= 1) {
+               kbp->apm_config.cs_length = bb.esi.rr;
+               kbp->apm_config.ds_length = bb.edi.rr;
+       } else {
+               kbp->apm_config.cs_length = 
+                   kbp->apm_config.ds_length = 64 * 1024;
+       }
+       kbp->apm_config.connected = 1;
+       return 1;
+    }
+    return 0;
+}
+
+#ifdef EISA_SUPPORT  // turn off for now since there isn't enough room
+BOOL
+eisa_present(
+    void
+)
+{
+    static BOOL        checked;
+    static BOOL        isEISA;
+
+    if (!checked) {
+       if (strncmp((char *)0xfffd9, "EISA", 4) == 0)
+           isEISA = TRUE;
+           
+       checked = TRUE;
+    }
+    
+    return (isEISA);
+}
+
+int
+ReadEISASlotInfo(EISA_slot_info_t *ep, int slot)
+{
+    union {
+       struct {
+           unsigned char       char2h  :2;
+           unsigned char       char1   :5;
+           unsigned char       char3   :5;
+           unsigned char       char2l  :3;
+           unsigned char       d2      :4;
+           unsigned char       d1      :4;
+           unsigned char       d4      :4;
+           unsigned char       d3      :4;
+       } s;
+       unsigned char data[4];
+    } u;
+    static char hex[0x10] = "0123456789ABCDEF";
+       
+    
+    bb.intno = 0x15;
+    bb.eax.r.h = 0xd8;
+    bb.eax.r.l = 0x00;
+    bb.ecx.r.l = slot;
+    bios(&bb);
+    if (bb.flags.cf)
+       return bb.eax.r.h;
+    ep->u_ID.d = bb.eax.r.l;
+    ep->configMajor = bb.ebx.r.h;
+    ep->configMinor = bb.ebx.r.l;
+    ep->checksum = bb.ecx.rr;
+    ep->numFunctions = bb.edx.r.h;
+    ep->u_resources.d = bb.edx.r.l;
+    u.data[0] = bb.edi.r.l;
+    u.data[1] = bb.edi.r.h;
+    u.data[2] = bb.esi.r.l;
+    u.data[3] = bb.esi.r.h;
+    ep->id[0] = u.s.char1 + ('A' - 1);
+    ep->id[1] = (u.s.char2l | (u.s.char2h << 3)) + ('A' - 1);
+    ep->id[2] = u.s.char3 + ('A' - 1);
+    ep->id[3] = hex[u.s.d1];
+    ep->id[4] = hex[u.s.d2];
+    ep->id[5] = hex[u.s.d3];
+    ep->id[6] = hex[u.s.d4];
+    ep->id[7] = 0;
+    return 0;
+}
+
+/*
+ * Note: ep must point to an address below 64k.
+ */
+
+int
+ReadEISAFuncInfo(EISA_func_info_t *ep, int slot, int function)
+{
+    bb.intno = 0x15;
+    bb.eax.r.h = 0xd8;
+    bb.eax.r.l = 0x01;
+    bb.ecx.r.l = slot;
+    bb.ecx.r.h = function;
+    bb.esi.rr = (unsigned int)ep->data;
+    bios(&bb);
+    if (bb.eax.r.h == 0) {
+       ep->slot = slot;
+       ep->function = function;
+    }
+    return bb.eax.r.h;
+}
+#endif
+
+#define PCI_SIGNATURE 0x20494350  /* "PCI " */
+
+int
+ReadPCIBusInfo(PCI_bus_info_t *pp)
+{
+    bb.intno = 0x1a;
+    bb.eax.r.h = 0xb1;
+    bb.eax.r.l = 0x01;
+    bios(&bb);
+    if ((bb.eax.r.h == 0) && (bb.edx.rx == PCI_SIGNATURE)) {
+       pp->BIOSPresent = 1;
+       pp->u_bus.d = bb.eax.r.l;
+       pp->majorVersion = bb.ebx.r.h;
+       pp->minorVersion = bb.ebx.r.l;
+       pp->maxBusNum = bb.ecx.r.l;
+       return 0;
+    }
+    return -1;
+}
diff --git a/i386/libsaio/bootstruct.c b/i386/libsaio/bootstruct.c
new file mode 100644 (file)
index 0000000..c4e545b
--- /dev/null
@@ -0,0 +1,116 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
+ * Reserved.  This file contains Original Code and/or Modifications of
+ * Original Code as defined in and that are subject to the Apple Public
+ * Source License Version 1.1 (the "License").  You may not use this file
+ * except in compliance with the License.  Please obtain a copy of the
+ * License at http://www.apple.com/publicsource and read it before using
+ * this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright 1993 NeXT, Inc.
+ * All rights reserved.
+ */
+
+#include "io_inline.h"
+#include "libsaio.h"
+#include "kernBootStruct.h"
+
+// CMOS access ports in I/O space.
+//
+#define CMOSADDR    0x70
+#define CMOSDATA    0x71
+#define HDTYPE      0x12
+
+/*==========================================================================
+ * Returns the number of active ATA drives since these will increment the
+ * bios device numbers of SCSI drives.
+ */
+static int
+countIDEDisks()
+{
+    int            count = 0;
+    unsigned short hdtype;
+
+#if DEBUG
+    struct driveParameters param;
+
+    printf("Reading drive parameters...\n");
+    readDriveParameters(0x80, &param);
+    printf("%d fixed disk drive(s) installed\n", param.totalDrives);
+    for (count = 0; count < 256; count++)
+    {
+        if (readDriveParameters(count + 0x80, &param))
+            break;
+        else
+        {
+            printf("Drive %d: %d cyls, %d heads, %d sectors\n",
+                   count, param.cylinders, param.heads, param.sectors);
+        }
+    }
+    outb(CMOSADDR, 0x11);
+    printf("CMOS addr 0x11 = %x\n",inb(CMOSDATA));
+    outb(CMOSADDR, 0x12);
+    printf("CMOS addr 0x12 = %x\n",inb(CMOSDATA));
+    return count;
+#endif
+
+    outb( CMOSADDR, HDTYPE );
+    hdtype = (unsigned short) inb( CMOSDATA );
+
+    if (hdtype & 0xF0) count++;
+    if (hdtype & 0x0F) count++;
+    return count;
+}
+
+/*==========================================================================
+ * Initialize the 'kernBootStruct'. A structure of parameters passed to
+ * the kernel by the booter.
+ */
+
+KERNBOOTSTRUCT * kernBootStruct = (KERNBOOTSTRUCT *) KERNSTRUCT_ADDR;
+
+void
+initKernBootStruct()
+{
+    unsigned char i;
+
+    bzero( (char *) kernBootStruct, sizeof(*kernBootStruct) );    
+    
+    // Get size of conventional memory.
+
+    kernBootStruct->convmem = memsize(0);
+
+    // Get size of extended memory.
+
+    kernBootStruct->extmem  = memsize(1);    
+
+    // Get number of ATA devices.
+
+    kernBootStruct->numIDEs = countIDEDisks();
+
+    // Get disk info from BIOS.
+
+    for ( i = 0; i < 4; i++ )
+    {
+        kernBootStruct->diskInfo[i] = get_diskinfo(0x80 + i);
+    }
+
+    kernBootStruct->magicCookie  = KERNBOOTMAGIC;
+    kernBootStruct->configEnd    = kernBootStruct->config;
+    kernBootStruct->graphicsMode = GRAPHICS_MODE;
+}
diff --git a/i386/libsaio/cache.c b/i386/libsaio/cache.c
new file mode 100644 (file)
index 0000000..6ead4d6
--- /dev/null
@@ -0,0 +1,94 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
+ * Reserved.  This file contains Original Code and/or Modifications of
+ * Original Code as defined in and that are subject to the Apple Public
+ * Source License Version 1.1 (the "License").  You may not use this file
+ * except in compliance with the License.  Please obtain a copy of the
+ * License at http://www.apple.com/publicsource and read it before using
+ * this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/* cache */
+
+#include "cache.h"
+#include "libsa.h"
+
+cache_t *cacheInit(
+    int nitems,
+    int item_size
+)
+{
+    cache_t *cp;
+    item_size += sizeof(item_t);
+    cp = (cache_t *)malloc(sizeof(cache_t) + nitems * item_size);
+    cp->nitems = nitems;
+    cp->item_size = item_size;
+    return cp;
+}
+
+/*
+ * Either find an item in the cache, or find where it should go.
+ * Returns 1 if found, 0 if not found.
+ * This function assumes that if you find an empty slot, you will use it;
+ * therefore, empty slots returned are marked valid.
+ */
+int cacheFind(
+    cache_t *cp,
+    int key1,
+    int key2,
+    char **ip
+)
+{
+    item_t *iip, *min_p;
+    int i,j;
+    
+    for(i=j=0, iip = min_p = (item_t *)cp->storage; i < cp->nitems; i++) {
+       if (iip->referenced && (iip->key1 == key1) && (iip->key2 == key2)) {
+           *ip = iip->storage;
+           if (iip->referenced < 65535)
+               iip->referenced++;
+           return 1;
+       }
+       if (iip->referenced < min_p->referenced) {
+           min_p = iip;
+           j = i;
+       }
+       iip = (item_t *)((char *)iip + cp->item_size);
+    }
+    *ip = min_p->storage;
+    min_p->referenced = 1;
+    min_p->key1 = key1;
+    min_p->key2 = key2;
+    return 0;
+}
+
+/*
+ * Flush the cache.
+ */
+void cacheFlush(
+    cache_t *cp
+)
+{
+    int i;
+    item_t *ip;
+    
+    if (cp == 0)
+       return;
+    for(i=0, ip = (item_t *)cp->storage; i < cp->nitems; i++) {
+       ip->referenced = 0;
+       ip = (item_t *)((char *)ip + cp->item_size);
+    }
+}
diff --git a/i386/libsaio/cache.h b/i386/libsaio/cache.h
new file mode 100644 (file)
index 0000000..01b51d9
--- /dev/null
@@ -0,0 +1,56 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
+ * Reserved.  This file contains Original Code and/or Modifications of
+ * Original Code as defined in and that are subject to the Apple Public
+ * Source License Version 1.1 (the "License").  You may not use this file
+ * except in compliance with the License.  Please obtain a copy of the
+ * License at http://www.apple.com/publicsource and read it before using
+ * this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+
+#ifndef __LIBSAIO_CACHE_H
+#define __LIBSAIO_CACHE_H
+
+typedef struct cache_item {
+    unsigned int       referenced;
+    int                        key1, key2;
+    char               storage[0];
+} item_t;
+
+typedef struct cache {
+    int                        nitems;
+    int                        item_size;
+    char               storage[0];
+} cache_t;
+
+extern cache_t *cacheInit(
+    int nitems,
+    int item_size
+);
+
+extern int cacheFind(
+    cache_t *cp,
+    int key1,
+    int key2,
+    char **ip
+);
+
+extern void cacheFlush(
+    cache_t *cp
+);
+
+#endif /* !__LIBSAIO_CACHE_H */
diff --git a/i386/libsaio/console.c b/i386/libsaio/console.c
new file mode 100644 (file)
index 0000000..1b1103c
--- /dev/null
@@ -0,0 +1,125 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
+ * Reserved.  This file contains Original Code and/or Modifications of
+ * Original Code as defined in and that are subject to the Apple Public
+ * Source License Version 1.1 (the "License").  You may not use this file
+ * except in compliance with the License.  Please obtain a copy of the
+ * License at http://www.apple.com/publicsource and read it before using
+ * this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/* 
+ * Mach Operating System
+ * Copyright (c) 1990 Carnegie-Mellon University
+ * Copyright (c) 1989 Carnegie-Mellon University
+ * All rights reserved.  The CMU software License Agreement specifies
+ * the terms and conditions for use and redistribution.
+ */
+
+/*
+ *                     INTEL CORPORATION PROPRIETARY INFORMATION
+ *
+ *     This software is supplied under the terms of a license  agreement or 
+ *     nondisclosure agreement with Intel Corporation and may not be copied 
+ *     nor disclosed except in accordance with the terms of that agreement.
+ *
+ *     Copyright 1988, 1989 Intel Corporation
+ */
+
+/*
+ * Copyright 1993 NeXT, Inc.
+ * All rights reserved.
+ */
+
+#include "libsaio.h"
+
+BOOL verbose_mode;
+BOOL errors;
+
+/*
+ * write one character to console
+ */
+void putchar(int c)
+{
+       if ( c == '\t' )
+       {
+               for (c = 0; c < 8; c++) putc(' ');
+               return;
+       }
+
+       if ( c == '\n' )
+    {
+               putc('\r');
+    }
+
+       putc(c);
+}
+
+int getc()
+{
+    int c = bgetc();
+
+    if ((c & 0xff) == 0)
+        return c;
+    else
+        return (c & 0xff);
+}
+
+// Read and echo a character from console.  This doesn't echo backspace
+// since that screws up higher level handling
+
+int getchar()
+{
+       register int c = getc();
+
+       if ( c == '\r' ) c = '\n';
+
+       if ( c >= ' ' && c < 0x7f) putchar(c);
+       
+       return (c);
+}
+
+int printf(const char * fmt, ...)
+{
+    va_list ap;
+    va_start(ap, fmt);
+    prf(fmt, ap, putchar, 0);
+    va_end(ap);
+    return 0;
+}
+
+int verbose(const char * fmt, ...)
+{
+    va_list ap;
+    
+    if (verbose_mode)
+    {
+        va_start(ap, fmt);
+        prf(fmt, ap, putchar, 0);
+        va_end(ap);
+    }
+    return(0);
+}
+
+int error(const char * fmt, ...)
+{
+    va_list ap;
+    errors = YES;
+    va_start(ap, fmt);
+    prf(fmt, ap, putchar, 0);
+    va_end(ap);
+    return(0);
+}
diff --git a/i386/libsaio/disk.c b/i386/libsaio/disk.c
new file mode 100644 (file)
index 0000000..b08678d
--- /dev/null
@@ -0,0 +1,498 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
+ * Reserved.  This file contains Original Code and/or Modifications of
+ * Original Code as defined in and that are subject to the Apple Public
+ * Source License Version 1.1 (the "License").  You may not use this file
+ * except in compliance with the License.  Please obtain a copy of the
+ * License at http://www.apple.com/publicsource and read it before using
+ * this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/* 
+ * Mach Operating System
+ * Copyright (c) 1990 Carnegie-Mellon University
+ * Copyright (c) 1989 Carnegie-Mellon University
+ * All rights reserved.  The CMU software License Agreement specifies
+ * the terms and conditions for use and redistribution.
+ */
+
+/*
+ *          INTEL CORPORATION PROPRIETARY INFORMATION
+ *
+ *  This software is supplied under the terms of a license  agreement or 
+ *  nondisclosure agreement with Intel Corporation and may not be copied 
+ *  nor disclosed except in accordance with the terms of that agreement.
+ *
+ *  Copyright 1988, 1989 Intel Corporation
+ */
+
+/*
+ * Copyright 1993 NeXT Computer, Inc.
+ * All rights reserved.
+ */
+
+#define DRIVER_PRIVATE
+
+#include "sys/types.h"
+#include "legacy/disk.h"
+#include "legacy/fdisk.h"
+#include "libsaio.h"
+#include "memory.h"
+
+/*
+ * Type and constant definitions.
+ */
+typedef struct disk_blk0   boot_sector;
+#define BOOT_SIGNATURE     DISK_SIGNATURE
+#define PART_TYPE_EXT      0x05
+#define PART_TYPE_APPLE    0xa8
+#define UFS_FRONT_PORCH    0
+
+#if            DEBUG
+#define DPRINT(x)       { printf x; }
+#define DSPRINT(x)      { printf x; sleep(1); }
+#else
+#define DPRINT(x)
+#define DSPRINT(x)
+#endif
+
+/*
+ * Function prototypes.
+ */
+extern void   spinActivityIndicator();
+static void   diskActivityHook();
+static int    Biosread(int biosdev, int secno);
+static struct fdisk_part * find_partition(u_int8_t type,
+                                          u_int8_t biosdev,
+                                          BOOL     mba);
+
+/*
+ * diskinfo unpacking.
+ */
+#define SPT(di)         ((di) & 0xff)
+#define HEADS(di)       ((((di)>>8) & 0xff) + 1)
+#define SPC(di)         (SPT(di) * HEADS(di))
+#define BPS             512     /* sector size of the device */
+#define N_CACHE_SECS    (BIOS_LEN / BPS)
+
+/*
+ * Stores the geometry of the disk in order to
+ * perform LBA to CHS translation for non EBIOS calls.
+ */
+static struct diskinfo {
+    int spt;            /* sectors per track */
+    int spc;            /* sectors per cylinder */
+} diskinfo;
+
+/*
+ * Globals variables.
+ */
+int     label_secsize = BPS;
+char *  b[NBUFS];
+daddr_t blknos[NBUFS];
+struct  iob iob[NFILES];
+
+/*
+ * intbuf points to the start of the sector cache. BIOS calls will
+ * store the sectors read into this memory area. If cache_valid
+ * is TRUE, then intbuf contents are valid. Otherwise, ignore the
+ * cache and read from disk.
+ *
+ * biosbuf points to a sector within the sector cache.
+ */
+static char * const intbuf = (char *)ptov(BIOS_ADDR);
+static BOOL   cache_valid  = FALSE;
+static char * biosbuf;
+
+/*==========================================================================
+ * 
+ */
+void
+devopen(char * name, struct iob * io)
+{
+    static int          last_biosdev = -1;
+    static daddr_t      last_offset  = 0;
+
+    struct fdisk_part * part;
+    long                di;
+
+    io->i_error = 0;
+    io->dirbuf_blkno = -1;
+
+    // Use cached values if possible.
+    //
+    if (io->biosdev == last_biosdev) {
+        io->i_boff = last_offset;
+        return;
+    }
+
+    // initialize disk parameters -- spt and spc
+    // must do this before doing reads from the device.
+
+    di = get_diskinfo(io->biosdev);
+    if (di == 0) {
+        io->i_error = ENXIO;
+        return;
+    }
+
+    diskinfo.spt = SPT(di);
+    diskinfo.spc = diskinfo.spt * HEADS(di);
+
+    // FIXME - io->partition is ignored. Doesn't make sense anymore.
+    //         we also don't overwrite the 'name' argument.
+    //         Whats special about "$LBL" ?
+
+    part = find_partition(PART_TYPE_APPLE, io->biosdev, FALSE);
+    if (part == NULL) {
+        io->i_error = EIO;
+        DSPRINT(("Unable to find partition: IO error\n"));
+    } else {
+        last_offset  = io->i_boff = part->relsect + UFS_FRONT_PORCH/BPS;
+        last_biosdev = io->biosdev;
+        DSPRINT(("partition offset: %x\n", io->i_boff));
+    }
+}
+
+/*==========================================================================
+ * 
+ */
+void devflush()
+{
+    cache_valid = FALSE;   // invalidate the sector cache (intbuf)
+}
+
+/*==========================================================================
+ * 
+ */
+int devread(struct iob * io)
+{
+    long      sector;
+    int       offset;
+//  int       dev;
+
+    io->i_flgs |= F_RDDATA;
+
+    io->i_error = 0;        // assume the best
+
+//  dev = io->i_ino.i_dev;
+
+    sector = io->i_bn * (label_secsize/BPS);
+
+    for (offset = 0; offset < io->i_cc; offset += BPS) {
+
+        io->i_error = Biosread(io->biosdev, sector);
+        if (io->i_error)
+            return (-1);
+
+        /* copy 1 sector from the internal buffer biosbuf into buf */
+        bcopy(biosbuf, &io->i_ma[offset], BPS);
+
+        sector++;
+    }
+
+    io->i_flgs &= ~F_TYPEMASK;
+
+    return (io->i_cc);
+}
+
+/*==========================================================================
+ * Maps (E)BIOS return codes to message strings.
+ */
+struct bios_error_info {
+    int          errno;
+    const char * string;
+};
+
+#define ECC_CORRECTED_ERR 0x11
+
+static struct bios_error_info bios_errors[] = {
+    {0x10, "Media error"},
+    {0x11, "Corrected ECC error"},
+    {0x20, "Controller or device error"},
+    {0x40, "Seek failed"},
+    {0x80, "Device timeout"},
+    {0xAA, "Drive not ready"},
+    {0x00, 0}
+};
+
+static const char *
+bios_error(int errno)
+{
+    struct bios_error_info * bp;
+    
+    for (bp = bios_errors; bp->errno; bp++) {
+        if (bp->errno == errno)
+            return bp->string;
+    }
+    return "Error 0x%02x";   // No string, print error code only
+}
+
+/*==========================================================================
+ * Use BIOS INT13 calls to read the sector specified. This function will
+ * also perform read-ahead to cache a few subsequent sector to the sector
+ * cache.
+ *
+ * The fields in diskinfo structure must be filled in before calling this
+ * function.
+ *
+ * Return:
+ *   Return code from INT13/F2 or INT13/F42 call. If operation was
+ *   successful, 0 is returned.
+ *
+ */
+static int
+Biosread(int biosdev, int secno)
+{
+    static int xbiosdev, xcyl, xhead, xsec, xnsecs;
+    
+    extern unsigned char uses_ebios[];
+
+    int  rc;
+    int  cyl, head, sec;
+    int  spt, spc;
+    int  tries = 0;
+
+    DSPRINT(("Biosread %d \n", secno));
+
+    // To read the disk sectors, use EBIOS if we can. Otherwise,
+    // revert to the standard BIOS calls.
+    //
+    if ((biosdev >= BIOS_DEV_HD) && uses_ebios[biosdev - BIOS_DEV_HD]) {
+        if (cache_valid &&
+            (biosdev == xbiosdev) &&
+            (secno >= xsec) &&
+            (secno < (xsec + xnsecs)))
+        {
+            biosbuf = intbuf + (BPS * (secno - xsec));
+            return 0;
+        }
+
+        xnsecs = N_CACHE_SECS;
+        xsec   = secno;
+
+        while ((rc = ebiosread(biosdev, secno, xnsecs)) && (++tries < 5))
+        {
+            if (rc == ECC_CORRECTED_ERR) {
+                /* Ignore corrected ECC errors */
+                break;
+            }
+            error("  EBIOS read error: %s\n", bios_error(rc), rc);
+            error("    Block %d Sectors %d\n", secno, xnsecs);
+            sleep(1);
+        }
+    }
+    else {
+        spt = diskinfo.spt;    // From previous INT13/F8 call.
+        spc = diskinfo.spc;
+
+        cyl  = secno / spc;
+        head = (secno % spc) / spt;
+        sec  = secno % spt;
+
+        if (cache_valid &&
+            (biosdev == xbiosdev) &&
+            (cyl == xcyl) &&
+            (head == xhead) &&
+            (sec >= xsec) &&
+            (sec < (xsec + xnsecs)))
+        {
+            // this sector is in intbuf cache
+            biosbuf = intbuf + (BPS * (sec - xsec));
+            return 0;
+        }
+
+        // Cache up to a track worth of sectors, but do not cross a
+        // track boundary.
+        //
+        xcyl   = cyl;
+        xhead  = head;
+        xsec   = sec;
+        xnsecs = ((sec + N_CACHE_SECS) > spt) ? (spt - sec) : N_CACHE_SECS;
+
+        while ((rc = biosread(biosdev, cyl, head, sec, xnsecs)) &&
+               (++tries < 5))
+        {
+            if (rc == ECC_CORRECTED_ERR) {
+                /* Ignore corrected ECC errors */
+                break;
+            }
+            error("  BIOS read error: %s\n", bios_error(rc), rc);
+            error("    Block %d, Cyl %d Head %d Sector %d\n",
+                  secno, cyl, head, sec);
+            sleep(1);
+        }
+    }
+
+    // If the BIOS reported success, mark the sector cache as valid.
+    //
+    if (rc == 0) {
+        cache_valid = TRUE;
+    }
+    biosbuf  = intbuf;
+    xbiosdev = biosdev;
+    
+    diskActivityHook();
+
+    return rc;
+}
+
+/*==========================================================================
+ * Replace this function if you want to change
+ * the way disk activity is indicated to the user.
+ */
+void
+diskActivityHook(void)
+{
+    spinActivityIndicator();
+}
+
+/*==========================================================================
+ * Returns YES if the partition type specified is an extended fdisk
+ * partition.
+ */
+static BOOL
+isExtendedPartition(u_int8_t type)
+{
+       int i;
+
+       u_int8_t extended_partitions[] = {
+               0x05,   /* Extended */
+               0x0f,   /* Win95 extended */
+               0x85,   /* Linux extended */
+       };
+
+       for (i = 0;
+                i < sizeof(extended_partitions)/sizeof(extended_partitions[0]);
+                i++)
+       {
+               if (extended_partitions[i] == type)
+                       return YES;
+       }
+       return NO;
+}
+
+/*==========================================================================
+ * Traverse the fdisk partition tables on disk until a partition is found
+ * that matches the specified type.
+ *
+ * Arguments:
+ *   type    - Partition type to search for (e.g. 0xa7 for NeXTSTEP).
+ *   biosdev - BIOS device unit. 0x80 and up for hard-drive.
+ *   mba     - If true, the partition found must be marked active.
+ *
+ * Return:
+ *   A pointer to the matching partition entry in biosbuf memory.
+ *   Note that the starting LBA field in the partition entry is
+ *   modified to contain the absolute sector address, rather than
+ *   the relative address.
+ *   A NULL is returned if a match is not found.
+ *
+ * There are certain fdisk rules that allows us to simplify the search.
+ *
+ * - There can be 0-1 extended partition entry in any partition table.
+ * - In the MBR, there can be 0-4 primary partitions entries.
+ * - In the extended partition, there can be 0-1 logical partition entry.
+ *
+ */
+struct fdisk_part *
+find_partition(u_int8_t type, u_int8_t biosdev, BOOL mba)
+{
+#define MAX_ITERATIONS  128
+
+    static u_int32_t    iter = 0;
+    static u_int32_t    offset_root;
+    static u_int32_t    offset;
+
+    int                 n;
+    int                 rc;
+    boot_sector *       bootsect;
+    struct fdisk_part * match = 0;
+    struct fdisk_part * parts;
+
+    if (iter == 0) {
+        if (rc = Biosread(biosdev, 0))  // Read MBR at sector zero.
+            return 0;
+        offset = 0;
+    }
+
+    bootsect = (boot_sector *) biosbuf;
+    if (bootsect->signature != BOOT_SIGNATURE)
+        return 0;
+
+    // Find a primary or a logical partition that matches the partition
+    // type specified.
+    //
+    for (n = 0, parts = (struct fdisk_part *) bootsect->parts;
+         n < 4;
+         n++, parts++)
+    {
+        DSPRINT(("fdisk: [%d] %02x\n", iter, parts->systid));
+
+        if (mba && ((parts->bootid & 0x80) == 0))
+            continue;
+
+        if (parts->systid == type) {
+            //
+            // Found it!!!
+            // Make the relsect field (LBA starting sector) absolute by
+            // adding in the offset.
+            //
+            parts->relsect += offset;
+
+                       DSPRINT(("Found: %x (%d)\n", parts->relsect, parts->numsect));
+
+            return parts;
+        }
+    }
+
+    // Find if there is an extended partition entry that points to
+    // an extended partition table. Note that we only allow up to
+    // one extended partition per partition table.
+    //
+    for (n = 0, parts = (struct fdisk_part *) bootsect->parts;
+         n < 4;
+         n++, parts++)
+    {
+        DSPRINT(("fdisk: [E%d] %02x\n", iter, parts->systid));
+
+        if (isExtendedPartition(parts->systid))
+        {
+            if (iter > MAX_ITERATIONS)  // limit recursion depth
+                return 0;
+
+            if (iter == 0)
+                offset = offset_root = parts->relsect;
+            else
+                offset = parts->relsect + offset_root;
+
+            iter++;
+
+            // Load extended partition table.
+            //
+            if (((rc = Biosread(biosdev, offset)) == 0) &&
+                (bootsect->signature == BOOT_SIGNATURE))
+            {
+                match = find_partition(type, biosdev, mba);
+            }
+            
+            iter--;
+
+            break;
+        }
+    }
+    
+    return match;
+}
diff --git a/i386/libsaio/drivers.h b/i386/libsaio/drivers.h
new file mode 100644 (file)
index 0000000..0c3c204
--- /dev/null
@@ -0,0 +1,51 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
+ * Reserved.  This file contains Original Code and/or Modifications of
+ * Original Code as defined in and that are subject to the Apple Public
+ * Source License Version 1.1 (the "License").  You may not use this file
+ * except in compliance with the License.  Please obtain a copy of the
+ * License at http://www.apple.com/publicsource and read it before using
+ * this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright 1994 NeXT Computer, Inc.
+ * All rights reserved.
+ */
+
+#ifndef __LIBSAIO_DRIVERS_H
+#define __LIBSAIO_DRIVERS_H
+
+struct driver_info {
+    char       *name;
+    char       *bundle;
+    char       *version;
+    char       *configTable;
+    char       *tableName;
+    char       *locationTag;
+    int                flags;
+};
+
+#define        DRIVER_FLAG_NONE                        0x00
+#define        DRIVER_FLAG_INTERESTING         0x01
+#define DRIVER_FLAG_CONFIG_ADDED       0x02
+
+#define DRIVER_NOT_FOUND                       0x0
+#define DRIVER_VERSION_MISMATCH                0x1
+
+extern int driverMissing;
+
+#endif /* !__LIBSAIO_DRIVERS_H */
diff --git a/i386/libsaio/gets.c b/i386/libsaio/gets.c
new file mode 100644 (file)
index 0000000..a47c70f
--- /dev/null
@@ -0,0 +1,115 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
+ * Reserved.  This file contains Original Code and/or Modifications of
+ * Original Code as defined in and that are subject to the Apple Public
+ * Source License Version 1.1 (the "License").  You may not use this file
+ * except in compliance with the License.  Please obtain a copy of the
+ * License at http://www.apple.com/publicsource and read it before using
+ * this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright 1993, NeXT Computer Inc.
+ * All rights reserved.
+ */
+
+#include "libsaio.h"
+
+int gets( char * buf, int len )
+{
+       char *lp = buf, *end = buf + len - 1;
+       int c;
+
+       flushdev();             // XXX
+
+       for (;;) {
+               c = getchar() & 0x7f;
+               if (c < ' ' && c != '\n' && c != '\b') c = 0;
+               if (c == 0x7f) c = '\b';
+
+               switch(c)
+        {
+            case '\0':
+                continue;
+            case '\n':
+                *lp++ = '\0';
+                putchar('\n');
+                return 1;
+            case '\b':
+                if (lp > buf) {
+                    lp--;
+                    putchar('\b');
+                    putchar(' ');
+                    putchar('\b');
+                }
+                continue;
+            default:
+                if (lp < end)
+                    *lp++ = c;
+                else
+                {
+                    putchar('\b');
+                    putchar(' ');
+                    putchar('\b');
+                    putchar('\007');
+                }
+        }
+       }
+}
+
+/*
+ * Return a string in buf if typing has begun within timeout units.
+ */
+int 
+Gets( char * buf,
+      int    len,
+      int    timeout,
+      char * prompt,
+      char * message )
+{
+       int     ch = 0;
+       int     next_second;
+
+       flushdev();  // XXX
+
+       printf("%s", prompt);
+
+       if (message)
+           printf("%s", message);
+
+       if (timeout)
+    {          
+           for ( next_second = time18() + 18; timeout; )
+        {
+            if (ch = readKeyboardStatus())
+            {
+                break;
+            }
+            if ( time18() >= next_second )
+            {
+                next_second += 18;
+                timeout--;
+            }
+        }
+    
+        if (ch == 0)
+        {
+            printf("\n");
+            return 0;
+        }
+       }
+       return ( gets(buf, len) );
+}
diff --git a/i386/libsaio/io_inline.h b/i386/libsaio/io_inline.h
new file mode 100644 (file)
index 0000000..2a813a2
--- /dev/null
@@ -0,0 +1,82 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
+ * Reserved.  This file contains Original Code and/or Modifications of
+ * Original Code as defined in and that are subject to the Apple Public
+ * Source License Version 1.1 (the "License").  You may not use this file
+ * except in compliance with the License.  Please obtain a copy of the
+ * License at http://www.apple.com/publicsource and read it before using
+ * this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1992 NeXT Computer, Inc.
+ *
+ * Inlines for io space access.
+ *
+ * HISTORY
+ *
+ * 20 May 1992 ? at NeXT
+ *     Created.
+ */
+
+#ifndef __LIBSAIO_IO_INLINE_H
+#define __LIBSAIO_IO_INLINE_H
+
+/*
+ *############################################################################
+ *
+ * x86 IN/OUT I/O inline functions.
+ *
+ * IN :  inb, inw, inl
+ *       IN(port)
+ *
+ * OUT:  outb, outw, outl
+ *       OUT(port, data)
+ *
+ *############################################################################
+ */
+
+#define __IN(s, u)                            \
+static inline unsigned u                      \
+in##s(unsigned short port)                    \
+{                                             \
+    unsigned u data;                          \
+    asm volatile (                            \
+       "in" #s " %1,%0"                      \
+               : "=a" (data)                         \
+               : "d" (port));                        \
+    return (data);                            \
+}
+
+#define __OUT(s, u)                           \
+static inline void                            \
+out##s(unsigned short port, unsigned u data)  \
+{                                             \
+    asm volatile (                            \
+       "out" #s " %1,%0"                     \
+               :                                     \
+               : "d" (port), "a" (data));            \
+}
+
+__IN(b, char)    /* inb() */
+__IN(w, short)   /* inw() */
+__IN(l, long)    /* inl() */
+
+__OUT(b, char)   /* outb() */
+__OUT(w, short)  /* outw() */
+__OUT(l, long)   /* outl() */
+
+#endif /* !__LIBSAIO_IO_INLINE_H */
diff --git a/i386/libsaio/legacy/PCI.h b/i386/libsaio/legacy/PCI.h
new file mode 100644 (file)
index 0000000..70f711d
--- /dev/null
@@ -0,0 +1,54 @@
+/* Copyright (c) 1994-1996 NeXT Software, Inc.  All rights reserved. 
+ *
+ * PCI Configuration space structure and associated defines.
+ *
+ * HISTORY
+ *
+ * 13 May 1994 Dean Reece at NeXT
+ *     Created.
+ *
+ */
+
+/* The IOPCIConfigSpace structure can be used to decode the 256 byte
+ * configuration space presented by each PCI device.  This structure
+ * is based on the PCI LOCAL BUS SPECIFICATION, rev 2.1, section 6.1
+ */
+
+typedef struct _IOPCIConfigSpace {
+       unsigned short  VendorID;
+       unsigned short  DeviceID;
+       unsigned short  Command;
+       unsigned short  Status;
+       unsigned long   RevisionID:8;
+       unsigned long   ClassCode:24;
+       unsigned char   CacheLineSize;
+       unsigned char   LatencyTimer;
+       unsigned char   HeaderType;
+       unsigned char   BuiltInSelfTest;
+       unsigned long   BaseAddress[6];
+       unsigned long   CardbusCISpointer;
+       unsigned short  SubVendorID;
+       unsigned short  SubDeviceID;
+       unsigned long   ROMBaseAddress;
+       unsigned long   reserved3;
+       unsigned long   reserved4;
+       unsigned char   InterruptLine;
+       unsigned char   InterruptPin;
+       unsigned char   MinGrant;
+       unsigned char   MaxLatency;
+       unsigned long   VendorUnique[48];
+} IOPCIConfigSpace;
+
+
+/* PCI_DEFAULT_DATA is the value resulting from a read to a non-existent
+ * PCI device's configuration space.
+ */
+
+#define PCI_DEFAULT_DATA       0xffffffff
+
+
+/* PCI_INVALID_VENDOR_ID is a Vendor ID reserved by the PCI/SIG and is
+ * guaranteed not to be assigned to any vendor.
+ */
+
+#define        PCI_INVALID_VENDOR_ID   0xffff
diff --git a/i386/libsaio/legacy/asm.h b/i386/libsaio/legacy/asm.h
new file mode 100644 (file)
index 0000000..b7e9016
--- /dev/null
@@ -0,0 +1,101 @@
+/* 
+ * Mach Operating System
+ * Copyright (c) 1989 Carnegie-Mellon University
+ * All rights reserved.  The CMU software License Agreement specifies
+ * the terms and conditions for use and redistribution.
+ */
+/* 
+ * HISTORY
+ * $Log: asm.h,v $
+ * Revision 1.2  2000/03/07 06:10:59  wsanchez
+ * Make main branch like boot-3, which builds.
+ *
+ * Revision 1.1.2.1  2000/02/29 00:04:34  jliu
+ * Added legacy header files.
+ *
+ * Revision 1.1.1.1  1997/09/30 02:45:05  wsanchez
+ * Import of kernel from umeshv/kernel
+ *
+ * Revision 2.1.1.6  90/03/29  20:45:08  rvb
+ *     Typo on ENTRY if gprof
+ *     [90/03/29            rvb]
+ * 
+ * Revision 2.1.1.5  90/02/28  15:47:31  rvb
+ *     fix SVC for "ifdef wheeze" [kupfer]
+ * 
+ * Revision 2.1.1.4  90/02/27  08:47:30  rvb
+ *     Fix the GPROF definitions.
+ *      ENTRY(x) gets profiled iffdef GPROF.
+ *      Entry(x) (and DATA(x)) is NEVER profiled.
+ *      MCOUNT can be used by asm that intends to build a frame,
+ *      after the frame is built.
+ *     [90/02/26            rvb]
+ * 
+ * Revision 2.1.1.3  90/02/09  17:23:23  rvb
+ *     Add #define addr16 .byte 0x67
+ *     [90/02/09            rvb]
+ * 
+ * Revision 2.1.1.2  89/11/10  09:51:33  rvb
+ *     Added LBi, SVC and ENTRY
+ * 
+ * Revision 2.1.1.1  89/10/22  11:29:38  rvb
+ *     New a.out and coff compatible .s files.
+ *     [89/10/16            rvb]
+ * 
+ */
+
+
+#define S_ARG0  4(%esp)
+#define S_ARG1  8(%esp)
+#define S_ARG2 12(%esp)
+#define S_ARG3 16(%esp)
+
+#define FRAME  pushl %ebp; movl %esp, %ebp
+#define EMARF  leave
+
+#define B_ARG0  8(%ebp)
+#define B_ARG1 12(%ebp)
+#define B_ARG2 16(%ebp)
+#define B_ARG3 20(%ebp)
+
+#define EXT(x)         _##x
+#define LBb(x,n)       n##b
+#define LBf(x,n)       n##f
+
+#define ALIGN 2
+#define        LCL(x)  x
+
+#define LB(x,n) n
+
+#define SVC .byte 0x9a; .long 0; .word 0x7
+#define String .ascii
+#define Value  .word
+
+#define Times(a,b) (a*b)
+#define Divide(a,b) (a/b)
+
+#define INB    inb     %dx, %al
+#define OUTB   outb    %al, %dx
+#define INL    inl     %dx, %eax
+#define OUTL   outl    %eax, %dx
+
+#define data16 .byte 0x66
+#define addr16 .byte 0x67
+
+
+
+#ifdef GPROF
+#define MCOUNT         .data; LB(x, 9): .long 0; .text; lea LBb(x, 9),%edx; call mcount
+#define        ENTRY(x)        .globl EXT(x); .align ALIGN; EXT(x): ; \
+                       pushl %ebp; movl %esp, %ebp; MCOUNT; popl %ebp;
+#define        ASENTRY(x)      .globl x; .align ALIGN; x: ; \
+                       pushl %ebp; movl %esp, %ebp; MCOUNT; popl %ebp;
+#else  /* GPROF */
+#define MCOUNT
+#define        ENTRY(x)        .globl EXT(x); .align ALIGN; EXT(x):
+#define        ASENTRY(x)      .globl x; .align ALIGN; x:
+#endif /* GPROF */
+
+#define        Entry(x)        .globl EXT(x); .align ALIGN; EXT(x):
+#define        DATA(x)         .globl EXT(x); .align ALIGN; EXT(x):
+
diff --git a/i386/libsaio/legacy/configTablePrivate.h b/i386/libsaio/legacy/configTablePrivate.h
new file mode 100644 (file)
index 0000000..db26728
--- /dev/null
@@ -0,0 +1,30 @@
+/*     Copyright (c) 1993 NeXT Computer, Inc.  All rights reserved. 
+ *
+ * configTablePrivate.h - private defintions for configTable mechanism.
+ *
+ * HISTORY
+ * 28-Jan-93    Doug Mitchell at NeXT
+ *      Created.
+ */
+
+/*
+ * Max size fo config data array, in bytes.
+ */
+#define IO_CONFIG_DATA_SIZE            4096
+
+/*
+ * Location of driver and system config table bundles.
+ */ 
+#define IO_CONFIG_DIR  "/usr/Devices/"
+
+/*
+ * File names and extensions.
+ */
+#define IO_BUNDLE_EXTENSION            ".config"
+#define IO_TABLE_EXTENSION             ".table"
+#define IO_DEFAULT_TABLE_FILENAME      "Default.table"
+#define IO_INSPECTOR_FILENAME          "Inspector.nib"
+#define IO_SYSTEM_CONFIG_FILE  "/usr/Devices/System.config/Instance0.table"
+#define IO_SYSTEM_CONFIG_DIR   "/usr/Devices/System.config/"
+#define IO_BINARY_EXTENSION            "_reloc"
+
diff --git a/i386/libsaio/legacy/disk.h b/i386/libsaio/legacy/disk.h
new file mode 100644 (file)
index 0000000..02ee90e
--- /dev/null
@@ -0,0 +1,137 @@
+/*     @(#)disk.h      1.0     08/29/87        (c) 1987 NeXT   */
+
+/* 
+ * HISTORY
+ * 28-Mar-92  Doug Mitchell
+ *     Moved disk_label struct to <bsd/dev/disk_label.h>.
+ *
+ * 22-May-91  Gregg Kellogg (gk) at NeXT
+ *     Split out public interface.
+ *
+ * 20-Jul-90  Doug Mitchell
+ *     Added DKIOCSFORMAT, DKIOCGFORMAT
+ *
+ * 16-Apr-90  Doug Mitchell at NeXT
+ *     Added DKIOCPANELPRT.
+ *
+ * 25-Mar-90  John Seamons (jks) at NeXT
+ *     Removed obsolete DKIOCNOTIFY and DKIOCINSERT.
+ *
+ * 23-Mar-90  Doug Mitchell
+ *     Added DKIOCEJECT.
+ * 
+ * 14-Feb-90  Doug Mitchell at NeXT
+ *     Added DKIOCMNOTIFY.
+ *
+ * 16-Mar-88  John Seamons (jks) at NeXT
+ *     Cleaned up to support standard disk label definitions.
+ *
+ * 24-Feb-88  Mike DeMoney (mike) at NeXT
+ *     Added defines for dl_bootfile and dl_boot0_blkno.
+ *     Reduced NBAD to allow for these entries in disktab.
+ *
+ * 29-Aug-87  John Seamons (jks) at NeXT
+ *     Created.
+ *
+ */
+
+#ifndef        _BSD_DEV_DISK_
+#define        _BSD_DEV_DISK_
+
+#include <mach/machine/vm_types.h>
+#include <mach/machine/boolean.h>
+#include <sys/types.h>
+#include <sys/ioctl.h>
+#include <sys/time.h>
+#include <bsd/dev/disk_label.h>
+
+#define        DR_CMDSIZE      32
+#define        DR_ERRSIZE      32
+
+struct disk_req {
+       int     dr_bcount;              /* byte count for data transfers */
+       caddr_t dr_addr;                /* memory addr for data transfers */
+       struct  timeval dr_exec_time;   /* execution time of operation */
+
+       /* 
+        * interpretation of cmdblk and errblk is driver specific.
+        */
+       char    dr_cmdblk[DR_CMDSIZE];
+       char    dr_errblk[DR_ERRSIZE];
+};
+
+struct sdc_wire {
+       vm_offset_t     start, end;
+       boolean_t       new_pageable;
+};
+
+
+#define        BAD_BLK_OFF     4               /* offset of bad blk tbl from label */
+#define        NBAD_BLK        (12 * 1024 / sizeof (int))
+
+struct bad_block {                     /* bad block table, sized to be 12KB */
+       int     bad_blk[NBAD_BLK];
+};
+
+/* 
+ * sector bitmap states (2 bits per sector) 
+ */
+#define        SB_UNTESTED     0               /* must be zero */
+#define        SB_BAD          1
+#define        SB_WRITTEN      2
+#define        SB_ERASED       3
+
+struct drive_info {                    /* info about drive hardware */
+       char    di_name[MAXDNMLEN];     /* drive type name */
+       int     di_label_blkno[NLABELS];/* label loc'ns in DEVICE SECTORS */
+       int     di_devblklen;           /* device sector size */
+       int     di_maxbcount;           /* max bytes per transfer request */
+};
+
+#define        DS_STATSIZE     32
+
+struct disk_stats {
+       int     s_ecccnt;       /* avg ECC corrections per sector */
+       int     s_maxecc;       /* max ECC corrections observed */
+
+       /* 
+        * interpretation of s_stats is driver specific 
+        */
+       char    s_stats[DS_STATSIZE];
+};
+
+struct drive_location {
+       char    location[ 128 ];
+};
+
+#define        DKIOCGLABEL     _IOR('d', 0,struct disk_label)                  // read label
+#define        DKIOCSLABEL     _IOW('d', 1,struct disk_label)                  // write label
+#define        DKIOCGBITMAP    _IO('d', 2)                     // read bitmap
+#define        DKIOCSBITMAP    _IO('d', 3)                     // write bitmap
+#define        DKIOCREQ        _IOWR('d', 4, struct disk_req)  // cmd request
+#define        DKIOCINFO       _IOR('d', 5, struct drive_info) // get drive info
+#define        DKIOCZSTATS     _IO('d',7)                      // zero statistics
+#define        DKIOCGSTATS     _IO('d', 8)                     // get statistics
+#define        DKIOCRESET      _IO('d', 9)                     // reset disk
+#define        DKIOCGFLAGS     _IOR('d', 11, int)              // get driver flags
+#define        DKIOCSFLAGS     _IOW('d', 12, int)              // set driver flags
+#define        DKIOCSDCWIRE    _IOW('d', 14, struct sdc_wire)  // sdc wire memory
+#define        DKIOCSDCLOCK    _IO('d', 15)                    // sdc lock
+#define        DKIOCSDCUNLOCK  _IO('d', 16)                    // sdc unlock
+#define        DKIOCGFREEVOL   _IOR('d', 17, int)              // get free volume #
+#define        DKIOCGBBT       _IO('d', 18)                    // read bad blk tbl
+#define        DKIOCSBBT       _IO('d', 19)                    // write bad blk tbl
+#define        DKIOCMNOTIFY    _IOW('d', 20, int)              // message on insert
+#define        DKIOCEJECT      _IO('d', 21)                    // eject disk
+#define        DKIOCPANELPRT   _IOW('d', 22, int)              // register Panel
+                                                       // Request port
+#define DKIOCSFORMAT   _IOW('d', 23, int)              // set 'Formatted' flag 
+#define DKIOCGFORMAT   _IOR('d', 23, int)              // get 'Formatted' flag 
+#define DKIOCBLKSIZE   _IOR('d', 24, int)              // device sector size
+#define        DKIOCNUMBLKS    _IOR('d', 25, int)              // number of sectors
+#define DKIOCCHECKINSERT _IO('d',26)           // manually poll removable 
+                                               // media drive
+#define DKIOCCANCELAUTOMOUNT _IOW('d',27, dev_t)       // cancel automount request
+#define DKIOCGLOCATION _IOR('d',28, struct drive_location)     // arch dependent location descrip
+#endif /* _BSD_DEV_DISK_ */
+
diff --git a/i386/libsaio/legacy/fdisk.h b/i386/libsaio/legacy/fdisk.h
new file mode 100644 (file)
index 0000000..176ab85
--- /dev/null
@@ -0,0 +1,51 @@
+/*
+ * Copyright (c) 1992 NeXT Computer, Inc.
+ *
+ * IBM PC disk partitioning data structures.
+ *
+ * HISTORY
+ *
+ * 8 July 1992 David E. Bohman at NeXT
+ *     Created.
+ */
+#ifdef DRIVER_PRIVATE
+
+#define DISK_BLK0      0               /* blkno of boot block */
+#define DISK_BLK0SZ    512             /* size of boot block */
+#define DISK_BOOTSZ    446             /* size of boot code in boot block */
+#define        DISK_SIGNATURE  0xAA55          /* signature of the boot record */
+#define FDISK_NPART    4               /* number of entries in fdisk table */
+#define FDISK_ACTIVE   0x80            /* indicator of active partition */
+#define FDISK_NEXTNAME 0xA7            /* indicator of NeXT partition */
+#define FDISK_DOS12    0x01            /* 12-bit fat < 10MB dos partition */
+#define FDISK_DOS16S   0x04            /* 16-bit fat < 32MB dos partition */
+#define FDISK_DOSEXT   0x05            /* extended dos partition */
+#define FDISK_DOS16B   0x06            /* 16-bit fat >= 32MB dos partition */
+
+/*
+ * Format of fdisk partion entry (if present).
+ */
+struct fdisk_part {
+    unsigned char      bootid;         /* bootable or not */
+    unsigned char      beghead;        /* begining head, sector, cylinder */
+    unsigned char      begsect;        /* begcyl is a 10-bit number */
+    unsigned char      begcyl;         /* High 2 bits are in begsect */
+    unsigned char      systid;         /* OS type */
+    unsigned char      endhead;        /* ending head, sector, cylinder */
+    unsigned char      endsect;        /* endcyl is a 10-bit number */
+    unsigned char      endcyl;         /* High 2 bits are in endsect */
+    unsigned long      relsect;        /* partion physical offset on disk */
+    unsigned long      numsect;        /* number of sectors in partition */
+};
+
+/*
+ * Format of boot block.
+ */
+struct disk_blk0 {
+    unsigned char      bootcode[DISK_BOOTSZ];
+    unsigned char      parts[FDISK_NPART][sizeof (struct fdisk_part)];
+    unsigned short     signature;
+};
+
+#endif /* DRIVER_PRIVATE */
diff --git a/i386/libsaio/libsaio.h b/i386/libsaio/libsaio.h
new file mode 100644 (file)
index 0000000..d56e70b
--- /dev/null
@@ -0,0 +1,34 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
+ * Reserved.  This file contains Original Code and/or Modifications of
+ * Original Code as defined in and that are subject to the Apple Public
+ * Source License Version 1.1 (the "License").  You may not use this file
+ * except in compliance with the License.  Please obtain a copy of the
+ * License at http://www.apple.com/publicsource and read it before using
+ * this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/* libsaio.h */
+
+#ifndef __LIBSAIO_LIBSAIO_H
+#define __LIBSAIO_LIBSAIO_H
+
+#include "libsa.h"
+#include "saio.h"
+#include "saio_types.h"
+#include "saio_internal.h"
+
+#endif /* !__LIBSAIO_LIBSAIO_H */
\ No newline at end of file
diff --git a/i386/libsaio/load.c b/i386/libsaio/load.c
new file mode 100644 (file)
index 0000000..f12f7f8
--- /dev/null
@@ -0,0 +1,319 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
+ * Reserved.  This file contains Original Code and/or Modifications of
+ * Original Code as defined in and that are subject to the Apple Public
+ * Source License Version 1.1 (the "License").  You may not use this file
+ * except in compliance with the License.  Please obtain a copy of the
+ * License at http://www.apple.com/publicsource and read it before using
+ * this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright 1993 NeXT Computer, Inc.
+ * All rights reserved.
+ */
+
+#include "libsaio.h"
+#include "memory.h"
+#include "kernBootStruct.h"
+#include "rcz_common.h"
+#include <ufs/ufs/dir.h>
+#include <mach-o/fat.h>
+
+static int devMajor[3] = { 6, 3, 1 };          // sd, hd, fd major dev #'s
+
+//==========================================================================
+// Open a file for reading.  If the file doesn't exist,
+// try opening the compressed version.
+
+#ifdef RCZ_COMPRESSED_FILE_SUPPORT
+int
+openfile(char *filename, int ignored)
+{
+    unsigned char *buf;
+    int fd, size, ret;
+    unsigned char *addr;
+       
+    if ((fd = open(filename, 0)) < 0) {
+       buf = malloc(256);
+       sprintf(buf, "%s%s", filename, RCZ_EXTENSION);
+       if ((fd = open(buf, 0)) >= 0) {
+           size = rcz_file_size(fd);
+           addr = (unsigned char *)((KERNEL_ADDR + KERNEL_LEN) - size);
+           ret = rcz_decompress_file(fd, addr);
+           close(fd);
+           if (ret < 0)
+               fd = -1;
+           else
+               fd = openmem(addr, size);
+       }
+       free(buf);
+    }
+    return fd;
+}
+#else
+int
+openfile(char *filename, int ignored)
+{
+    return open(filename, 0);
+}
+#endif
+
+//==========================================================================
+// loadprog
+
+int
+loadprog( int                  dev,
+          int                  fd,
+          struct mach_header * headOut,
+          entry_t *            entry,       /* entry point */
+          char **              addr,        /* load address */
+          int *                size )       /* size of loaded program */
+{
+    struct mach_header head;
+    int file_offset = 0;
+
+read_again:
+
+    /* get file header */
+    read(fd, (char *) &head, sizeof(head));
+
+    if ( headOut )
+        bcopy((char *) &head, (char *) headOut, sizeof(head));
+
+    if ( head.magic == MH_MAGIC )
+    {
+#if    0
+               printf("oneway fat binary found\n"); sleep(1);
+#endif 1
+        return loadmacho(&head, dev, fd, entry, addr, size, file_offset);
+    }
+    else if ( file_offset == 0 && 
+              ((head.magic == FAT_CIGAM) || (head.magic == FAT_MAGIC)) )
+    {
+               int swap = (head.magic == FAT_CIGAM) ? 1 : 0;
+               struct fat_header * fhp = (struct fat_header *) &head;
+               struct fat_arch *   fap;
+               int i, narch = swap ? NXSwapLong(fhp->nfat_arch) : fhp->nfat_arch;
+               int cpu, size;
+               char * buf;
+
+               size = sizeof(struct fat_arch) * narch;
+               buf = malloc(size);
+        b_lseek(fd, 0, 0);
+        read(fd, buf, size);
+       
+        for ( i = 0, fap = (struct fat_arch *)(buf+sizeof(struct fat_header));
+              i < narch;
+              i++, fap++ )
+        {
+            cpu = swap ? NXSwapLong(fap->cputype) : fap->cputype;
+            if (cpu == CPU_TYPE_I386)
+            {
+                /* that's specific enough */
+                free(buf);
+                file_offset = swap ? NXSwapLong(fap->offset) : fap->offset;
+                b_lseek(fd, file_offset, 0);
+                goto read_again;
+            }
+        }
+        free(buf);
+        error("Fat binary file doesn't contain i386 code\n");
+        return -1;
+    }
+    error("Unrecognized binary format: %08x\n", head.magic);
+    return -1;
+}
+
+//==========================================================================
+// xread
+//
+// Read from file descriptor. addr is a physical address.
+
+int xread( int    fd,
+           char * addr,
+           int    size )
+{
+       char *      orgaddr = addr;
+       long            offset;
+       unsigned        count;
+       long            max;
+#define BUFSIZ 8192
+       char *      buf;
+       int         bufsize = BUFSIZ;
+
+#if 0
+    printf("xread: addr=%x, size=%x\n", addr, size);
+    sleep(1);
+#endif
+
+       buf = malloc(BUFSIZ);
+       
+       // align your read to increase speed
+       offset = tell(fd) & 4095;
+       if ( offset != 0 )
+               max = 4096 - offset;
+       else
+               max = bufsize;
+
+       while ( size > 0 )
+       {
+               if ( size > max ) count = max;
+               else count = size;
+#if 0
+               printf("xread: loop size=%x, count=%x\n", size, count);
+               sleep(1);
+#endif
+
+               if ( read(fd, buf, count) != count) break;
+
+               bcopy(buf, ptov(addr), count);
+               size -= count;
+               addr += count;
+
+               max = bufsize;
+
+#if 0
+               tick += count;
+               if ( tick > (50*1024) )
+               {
+                       putchar('+');
+                       tick = 0;
+               }
+#endif
+       }
+
+       free(buf);
+       return addr-orgaddr;
+}
+
+//==========================================================================
+// loadmacho
+
+int
+loadmacho(
+    struct mach_header * head,
+    int                  dev,
+    int                  io,
+    entry_t *            rentry,
+    char **              raddr,
+    int *                rsize,
+    int                  file_offset
+)
+{
+       int ncmds;
+       unsigned  cmds, cp;
+       struct xxx_thread_command {
+               unsigned long   cmd;
+               unsigned long   cmdsize;
+               unsigned long   flavor;
+               unsigned long   count;
+               i386_thread_state_t state;
+       } *th;
+       unsigned int entry  = 0;
+       int          vmsize = 0;
+       unsigned int vmaddr = ~0;
+
+       // XXX should check cputype
+       cmds = (unsigned int) malloc(head->sizeofcmds);
+       b_lseek(io, sizeof (struct mach_header) + file_offset, 0);
+
+       if ( read(io, (char *) cmds, head->sizeofcmds) != head->sizeofcmds )
+    {
+           error("loadmacho: error reading commands\n");
+           goto shread;
+       }
+
+       for ( ncmds = head->ncmds, cp = cmds; ncmds > 0; ncmds-- )
+       {
+               unsigned int addr;
+
+#define lcp    ((struct load_command *) cp)
+#define scp    ((struct segment_command *) cp)
+
+               switch ( lcp->cmd )
+               {
+            case LC_SEGMENT:
+                addr = (scp->vmaddr & 0x3fffffff) + (int)*raddr;
+                if ( scp->filesize )
+                {
+                    // Is this an OK assumption?
+                    // if the filesize is zero, it doesn't
+                    // take up any virtual space...
+                    // (Hopefully this only excludes PAGEZERO.)
+                    // Also, ignore linkedit segment when
+                    // computing size, because we will erase
+                    // the linkedit segment later.
+
+                    if ( strncmp(scp->segname, SEG_LINKEDIT,
+                         sizeof(scp->segname)) != 0)
+                        vmsize += scp->vmsize;
+
+                    vmaddr = min(vmaddr, addr);
+                    
+                    // Zero any space at the end of the segment.
+                    bzero((char *)(addr + scp->filesize),
+                    scp->vmsize - scp->filesize);
+                    
+                    // FIXME:  check to see if we overflow
+                    // the available space (should be passed in
+                    // as the size argument).
+                           
+#if 0
+                    printf("LC_SEGMENT\n");
+                    printf("LS;file_off %x; fos %x; fsize %x ; addr %x \n",
+                           scp->fileoff, file_offset,scp->filesize, addr);
+                    sleep(1);
+#endif
+
+                    b_lseek(io, scp->fileoff + file_offset, 0);
+                    if ( xread(io, (char *)addr, scp->filesize)
+                         != scp->filesize)
+                    {
+                        error("loadmacho: error loading section\n");
+                        goto shread;
+                    }
+                }
+                break;
+
+            case LC_THREAD:
+            case LC_UNIXTHREAD:
+                th = (struct xxx_thread_command *) cp;
+                entry = th->state.eip;
+                break;
+               }
+               cp += lcp->cmdsize;
+       }
+
+       kernBootStruct->rootdev = (dev & 0xffffff00) | devMajor[Dev(dev)];
+
+       free((char *) cmds);
+       *rentry = (entry_t)( (int) entry & 0x3fffffff );
+       *rsize = vmsize;
+       *raddr = (char *)vmaddr;
+
+#if 0
+    printf("suceesful load;vmaddr=%x; vmsize=%x;entry=%x\n", vmaddr, vmsize,entry);
+    sleep(5);
+#endif
+
+       return 0;
+
+shread:
+       free((char *) cmds);
+       error("loadmacho: read error\n");
+       return -1;
+}
diff --git a/i386/libsaio/misc.c b/i386/libsaio/misc.c
new file mode 100644 (file)
index 0000000..ed9703f
--- /dev/null
@@ -0,0 +1,121 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
+ * Reserved.  This file contains Original Code and/or Modifications of
+ * Original Code as defined in and that are subject to the Apple Public
+ * Source License Version 1.1 (the "License").  You may not use this file
+ * except in compliance with the License.  Please obtain a copy of the
+ * License at http://www.apple.com/publicsource and read it before using
+ * this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/* 
+ * Mach Operating System
+ * Copyright (c) 1990 Carnegie-Mellon University
+ * Copyright (c) 1989 Carnegie-Mellon University
+ * All rights reserved.  The CMU software License Agreement specifies
+ * the terms and conditions for use and redistribution.
+ */
+
+/*
+ *                     INTEL CORPORATION PROPRIETARY INFORMATION
+ *
+ *     This software is supplied under the terms of a license  agreement or 
+ *     nondisclosure agreement with Intel Corporation and may not be copied 
+ *     nor disclosed except in accordance with the terms of that agreement.
+ *
+ *     Copyright 1988, 1989 Intel Corporation
+ */
+
+/*
+ * Copyright 1993 NeXT, Inc.
+ * All rights reserved.
+ */
+
+#include "io_inline.h"
+#include "libsaio.h"
+
+/*
+ * keyboard controller (8042) I/O port addresses
+ */
+#define PORT_A      0x60    /* port A */
+#define PORT_B      0x64    /* port B */
+
+/*
+ * keyboard controller command
+ */
+#define CMD_WOUT    0xd1    /* write controller's output port */
+
+/*
+ * keyboard controller status flags
+ */
+#define KB_INFULL   0x2     /* input buffer full */
+#define KB_OUTFULL  0x1     /* output buffer full */
+
+#define KB_A20      0x9f    /* enable A20,
+                               enable output buffer full interrupt
+                               enable data line
+                               disable clock line */
+
+//==========================================================================
+// Enable A20 gate to be able to access memory above 1MB
+
+void enableA20()
+{
+       /* make sure that the input buffer is empty */
+       while (inb(PORT_B) & KB_INFULL);
+
+       /* make sure that the output buffer is empty */
+       if (inb(PORT_B) & KB_OUTFULL)
+               (void)inb(PORT_A);
+
+       /* make sure that the input buffer is empty */
+       while (inb(PORT_B) & KB_INFULL);
+
+       /* write output port */
+       outb(PORT_B, CMD_WOUT);
+
+       /* wait until command is accepted */
+       while (inb(PORT_B) & KB_INFULL);
+
+       outb(PORT_A, KB_A20);
+
+       while (inb(PORT_B) & KB_INFULL);        /* wait until done */
+}
+
+void sleep(int n)
+{
+       int     endtime = (time18() + 18*n);
+       while (time18() < endtime);
+}
+
+void turnOffFloppy(void)
+{
+       /*
+        * Disable floppy:
+        * Hold controller in reset,
+        * disable DMA and IRQ,
+        * turn off floppy motors.
+        */
+       outb(0x3F2, 0x00);
+}
+
+char * newString(char * oldString)
+{
+    if ( oldString )
+        return strcpy(malloc(strlen(oldString)+1), oldString);
+    else
+        return NULL;
+}
diff --git a/i386/libsaio/nbp.c b/i386/libsaio/nbp.c
new file mode 100644 (file)
index 0000000..3cfe1a2
--- /dev/null
@@ -0,0 +1,78 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
+ * Reserved.  This file contains Original Code and/or Modifications of
+ * Original Code as defined in and that are subject to the Apple Public
+ * Source License Version 1.1 (the "License").  You may not use this file
+ * except in compliance with the License.  Please obtain a copy of the
+ * License at http://www.apple.com/publicsource and read it before using
+ * this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+
+#include "libsaio.h"
+#include "nbp.h"
+
+/*==========================================================================
+ * Issue a command to the network loader.
+ *
+ * The 'cmd' command structure should be allocated on the stack to
+ * ensure that it resides within the addressable range for the
+ * network loader, which runs in real mode.
+ */
+UInt32
+nbp(nbpCommandCode_t code, nbpCommand_u * cmd)
+{
+       loader(code, GET_FP((UInt32) cmd));
+
+       // Must re-enable the A20 address line, the PXE firmware will
+       // disable the A20 line control.
+       //
+       enableA20();
+
+       return cmd->header.status;
+}
+
+/*==========================================================================
+ * Execute a TFTP Read File command.
+ *
+ */
+UInt32 nbpTFTPReadFile(UInt8 *  filename,   // name of the file
+                       UInt32 * bufferSize, // [IN] size limit, [OUT} real size
+                       UInt32   bufferAddr) // physical address
+{
+    nbpCommandTFTPReadFile_s  cmd;
+       UInt32                    ret;
+
+       strcpy(cmd.filename, filename);
+       cmd.status     = nbpStatusFailed;
+       cmd.bufferSize = *bufferSize;
+       cmd.buffer     = bufferAddr;
+
+       ret = nbp(nbpCommandTFTPReadFile, (nbpCommand_u *) &cmd);
+
+       *bufferSize = cmd.bufferSize;  // bytes transferred
+
+    return ret;
+}
+
+/*==========================================================================
+ * Execute an Unload Base Code Stack command.
+ *
+ */
+UInt32 nbpUnloadBaseCode()
+{
+    return nbp(nbpCommandUnloadBaseCode, (nbpCommand_u *) 0);
+}
diff --git a/i386/libsaio/nbp.h b/i386/libsaio/nbp.h
new file mode 100644 (file)
index 0000000..63ad268
--- /dev/null
@@ -0,0 +1,59 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
+ * Reserved.  This file contains Original Code and/or Modifications of
+ * Original Code as defined in and that are subject to the Apple Public
+ * Source License Version 1.1 (the "License").  You may not use this file
+ * except in compliance with the License.  Please obtain a copy of the
+ * License at http://www.apple.com/publicsource and read it before using
+ * this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+
+#ifndef __LIBSAIO_NBP_H
+#define __LIBSAIO_NBP_H
+
+#include "nbp_cmd.h"
+
+/*==========================================================================
+ * Call the network loader's exported entry point.
+ * Function is in asm.s.
+ */
+extern void loader(UInt32 code, UInt32 cmdptr);
+
+/*==========================================================================
+ * Convert zero-based linear address to far pointer.
+ */
+#define GET_FP(x)         ( (((x) & 0xffff0000) << (16 - 4)) | \
+                             ((x) & 0xffff) )
+
+/*==========================================================================
+ * Issue a command to the network loader.
+ */
+extern UInt32 nbp(nbpCommandCode_t code, nbpCommand_u * cmd);
+
+/*==========================================================================
+ * Execute a TFTP Read File command.
+ */
+extern UInt32 nbpTFTPReadFile(UInt8 *  filename,
+                              UInt32 * bufferSize,
+                              UInt32   bufferAddr);
+
+/*==========================================================================
+ * Execute an Unload Base Code Stack command.
+ */
+extern UInt32 nbpUnloadBaseCode();
+
+#endif /* !__LIBSAIO_NBP_H */
diff --git a/i386/libsaio/nbp_cmd.h b/i386/libsaio/nbp_cmd.h
new file mode 100644 (file)
index 0000000..539b580
--- /dev/null
@@ -0,0 +1,86 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
+ * Reserved.  This file contains Original Code and/or Modifications of
+ * Original Code as defined in and that are subject to the Apple Public
+ * Source License Version 1.1 (the "License").  You may not use this file
+ * except in compliance with the License.  Please obtain a copy of the
+ * License at http://www.apple.com/publicsource and read it before using
+ * this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+
+#ifndef __LIBSAIO_NBP_CMD_H
+#define __LIBSAIO_NBP_CMD_H
+
+typedef unsigned long   UInt32;
+typedef unsigned char  UInt8;
+
+/*==========================================================================
+ * NBP return status codes.
+ */
+typedef enum {
+    nbpStatusSuccess          = 0,
+    nbpStatusFailed,
+       nbpStatusInvalid,
+} nbpStatus_t;
+
+/*==========================================================================
+ * NBP commands codes.
+ */
+typedef enum {
+    nbpCommandTFTPReadFile    = 1,
+    nbpCommandTFTPGetFileSize,
+    nbpCommandUnloadBaseCode,
+} nbpCommandCode_t;
+
+/*==========================================================================
+ * NBP commands.
+ */
+typedef struct {
+    UInt32    status;         /* return code from NBP */
+} nbpCommandHeader_s;
+
+typedef struct {
+    UInt32   status;         /* return code from NBP */
+    UInt8    filename[128];  /* name of file to be downloaded */
+    UInt32   bufferSize;     /* size of the download buffer */
+    UInt32   buffer;         /* physical address of the download buffer */
+} nbpCommandTFTPReadFile_s;
+
+typedef struct {
+    UInt32   status;         /* return code from NBP */
+    UInt8    filename[128];  /* name of file to be downloaded */
+    UInt32   filesize;       /* size of the file specified */
+} nbpCommandTFTPGetFileSize_s;
+
+typedef struct {
+    UInt32   status;         /* return code from NBP */
+    UInt8    sname[64];      /* server name */
+    UInt32   CIP;            /* client IP address */
+    UInt32   SIP;            /* server IP address */
+    UInt32   GIP;            /* gateway IP address */
+} nbpCommandGetNetworkInfo_s;
+
+/*==========================================================================
+ * An union of all NBP command structures.
+ */
+typedef union {
+       nbpCommandHeader_s           header;
+       nbpCommandTFTPReadFile_s     tftpReadFile;
+       nbpCommandTFTPGetFileSize_s  tftpFileSize;
+} nbpCommand_u;
+
+#endif /* !__LIBSAIO_NBP_CMD_H */
diff --git a/i386/libsaio/old/bios_old.s b/i386/libsaio/old/bios_old.s
new file mode 100644 (file)
index 0000000..52af82e
--- /dev/null
@@ -0,0 +1,610 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
+ * Reserved.  This file contains Original Code and/or Modifications of
+ * Original Code as defined in and that are subject to the Apple Public
+ * Source License Version 1.1 (the "License").  You may not use this file
+ * except in compliance with the License.  Please obtain a copy of the
+ * License at http://www.apple.com/publicsource and read it before using
+ * this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/* 
+ * Mach Operating System
+ * Copyright (c) 1990 Carnegie-Mellon University
+ * Copyright (c) 1989 Carnegie-Mellon University
+ * All rights reserved.  The CMU software License Agreement specifies
+ * the terms and conditions for use and redistribution.
+ */
+
+//                     INTEL CORPORATION PROPRIETARY INFORMATION
+//
+//     This software is supplied under the terms of a license  agreement or 
+//     nondisclosure agreement with Intel Corporation and may not be copied 
+//     nor disclosed except in accordance with the terms of that agreement.
+//
+//     Copyright 1988 Intel Corporation
+// Copyright 1988, 1989 by Intel Corporation
+//
+
+       .file   "bios.s"
+
+#include <machdep/i386/asm.h>
+#include "memory.h"
+
+       .text
+
+#if 0
+// biosread(dev, cyl, head, sec, num)
+//     Read num sectors from disk into the internal buffer "intbuf" which
+//     is the first 4K bytes of the boot loader.
+// BIOS call "INT 0x13 Function 0x2" to read sectors from disk into memory
+//     Call with       %ah = 0x2
+//                     %al = number of sectors
+//                     %ch = cylinder
+//                     %cl = sector
+//                     %dh = head
+//                     %dl = drive (0x80 for hard disk, 0x0 for floppy disk)
+//                     %es:%bx = segment:offset of buffer
+//     Return:         
+//                     %al = 0x0 on success; err code on failure
+
+ENTRY(_biosread)
+       push    %ebp
+       mov     %esp, %ebp
+
+       push    %ebx
+       push    %ecx
+       push    %edx
+       push    %esi
+       push    %edi
+       push    %ds
+       push    %es
+//     push    %fs
+//     push    %gs
+
+       movb    0x10(%ebp), %dh         // head
+
+       movw    0x0c(%ebp), %cx
+       xchgb   %ch, %cl                // cylinder; %cl=the high 2 bits of cyl
+       rorb    $2, %cl
+       movb    0x14(%ebp), %al
+       orb     %al, %cl
+       incb    %cl                     // sector; sec starts from 1, not 0
+
+       movb    0x8(%ebp), %dl          // device
+       movb    0x18(%ebp),%bl          // number of sectors
+       movb    $2,%bh                  // bios read function
+
+       call    EXT(_prot_to_real)      // enter real mode, set %es to BOOTSEG
+
+       data16
+       mov     $5,%edi                 // retry up to 5 times
+
+retry_disc:
+               mov     %ebx,%eax       // get function and amount
+//             xor     %ebx, %ebx      // offset = 0
+               data16
+               mov     $(ptov(BIOS_ADDR)), %ebx
+
+               push %eax               // save amount
+               push %ecx
+               push %edx
+               push %edi
+               int     $0x13
+               pop %edi
+               pop %edx
+               pop %ecx
+               pop %ebx                // pop amount into bx (safe place)
+
+//             test $0, %ah
+               data16
+               jnb     read_succes
+
+               // woops, bios failed to read sector
+               push %eax               // save error
+               xor %eax,%eax
+               int     $0x13           // reset disk
+               pop %eax                // restore error code
+               dec %edi
+               data16
+               jne retry_disc
+
+read_succes:
+       mov     %eax, %ebx              // save return value
+
+       data16
+       call    EXT(_real_to_prot) // back to protected mode
+
+       xor     %ax, %ax
+       movb    %bh, %al                // return value in %ax
+
+//     pop     %gs
+//     pop     %fs
+       pop     %es
+       pop     %ds
+       pop     %edi
+       pop     %esi
+       pop     %edx
+       pop     %ecx
+       pop     %ebx
+
+       pop     %ebp
+
+       ret
+
+// putc(ch)
+// BIOS call "INT 10H Function 0Eh" to write character to console
+//     Call with       %ah = 0x0e
+//                     %al = character
+//                     %bh = page
+//                     %bl = foreground color ( graphics modes)
+
+
+ENTRY(_putc)
+       push    %ebp
+       mov     %esp, %ebp
+
+       push    %ebx
+       push    %ecx
+       push    %edx
+       push    %esi
+       push    %edi
+       push    %ds
+       push    %es
+
+       movb    0x8(%ebp), %cl
+
+       call    EXT(_prot_to_real)
+
+//     data16
+//     mov     $0x13, %ebx     // colors in 2 bit palette, grey and white
+//     mov     $0x1, %ebx      // %bh=0, %bl=1 (blue)
+//
+//     movb    $1,%bh          // background gray
+       movb    $0,%bh          // background gray
+       movb    $3,%bl          // foreground white in 2 bit palette
+
+       movb    $0xe, %ah
+       movb    %cl, %al
+
+       int     $0x10           // display a byte
+
+       data16
+       call    EXT(_real_to_prot)
+
+       pop     %es
+       pop     %ds
+       pop     %edi
+       pop     %esi
+       pop     %edx
+       pop     %ecx
+       pop     %ebx
+
+       pop     %ebp
+       ret
+
+ENTRY(cputc)
+       push    %ebp
+       mov     %esp, %ebp
+
+       push    %ebx
+       push    %ecx
+       push    %edx
+       push    %esi
+       push    %edi
+       push    %ds
+       push    %es
+
+       movb    0x8(%ebp), %cl
+       movb    0x12(%ebp), %bl
+       
+       call    EXT(_prot_to_real)
+
+       movb    $0,%bh          // page 0
+
+       movb    %cl, %al
+       movb    $0x9, %ah
+       movb    $1, %cx
+       
+       int     $0x10           // display a byte
+
+       data16
+       call    EXT(_real_to_prot)
+
+       pop     %es
+       pop     %ds
+       pop     %edi
+       pop     %esi
+       pop     %edx
+       pop     %ecx
+       pop     %ebx
+
+       pop     %ebp
+       ret
+
+// bgetc()
+// BIOS call "INT 16H Function 00H" to read character from keyboard
+//     Call with       %ah = 0x0
+//     Return:         %ah = keyboard scan code
+//                     %al = ASCII character
+
+ENTRY(bgetc)
+       push    %ebp
+       mov     %esp, %ebp
+
+       push    %ebx
+       push    %ecx
+       push    %edx
+       push    %esi
+       push    %edi
+       push    %ds
+       push    %es
+
+       call    EXT(_prot_to_real)
+
+       movb    $0, %ah
+       
+       int     $0x16
+
+       mov     %eax, %ebx      // _real_to_prot uses %eax
+
+       data16
+       call    EXT(_real_to_prot)
+
+       xor     %eax, %eax
+       mov     %bx, %ax
+
+       pop     %es
+       pop     %ds
+       pop     %edi
+       pop     %esi
+       pop     %edx
+       pop     %ecx
+       pop     %ebx
+
+       pop     %ebp
+       ret
+
+// readKeyboardStatus()
+//       if there is a character pending, return it; otherwise return 0
+// BIOS call "INT 16H Function 01H" to check whether a character is pending
+//     Call with       %ah = 0x1
+//     Return:
+//             If key waiting to be input:
+//                     %ah = keyboard scan code
+//                     %al = ASCII character
+//                     Zero flag = clear
+//             else
+//                     Zero flag = set
+
+ENTRY(_readKeyboardStatus)
+       push    %ebp
+       mov     %esp, %ebp
+
+       push    %ebx
+       push    %ecx
+       push    %edx
+       push    %esi
+       push    %edi
+       push    %ds
+       push    %es
+
+       call    EXT(_prot_to_real)              // enter real mode
+
+       xor     %ebx, %ebx
+       movb    $0x1, %ah
+       int     $0x16
+
+       data16
+       jz      nochar
+
+       movw    %ax, %bx
+
+nochar:
+       data16
+       call    EXT(_real_to_prot)
+
+       xor     %eax, %eax
+       movw    %bx, %ax
+
+       pop     %es
+       pop     %ds
+       pop     %edi
+       pop     %esi
+       pop     %edx
+       pop     %ecx
+       pop     %ebx
+
+       pop     %ebp
+       ret
+
+
+// time in 18ths of a second
+ENTRY(_time18)
+       push    %ebp
+       mov     %esp, %ebp
+
+       push    %ebx
+       push    %ecx
+       push    %edx
+       push    %esi
+       push    %edi
+       push    %ds
+       push    %es
+
+       call    EXT(_prot_to_real)              // enter real mode
+
+       xor     %bx, %bx
+       xor     %eax, %eax
+       int     $0x1a
+
+       mov     %edx,%ebx
+       shl     $16,%cx                         // shifts ecx
+       or      %cx,%bx                         // %ebx has 32 bit time
+
+       data16
+       call    EXT(_real_to_prot)
+
+       mov     %ebx,%eax
+
+       pop     %es
+       pop     %ds
+       pop     %edi
+       pop     %esi
+       pop     %edx
+       pop     %ecx
+       pop     %ebx
+
+       pop     %ebp
+       ret
+
+//
+// get_diskinfo():  return a word that represents the
+//     max number of sectors and  heads and drives for this device
+//
+
+ENTRY(_get_diskinfo)
+       push    %ebp
+       mov     %esp, %ebp
+
+       push    %ebx
+       push    %ecx
+       push    %edx
+       push    %esi
+       push    %edi
+       push    %ds
+       push    %es
+
+       movb    0x8(%ebp), %dl          // diskinfo(drive #)
+       call    EXT(_prot_to_real)      // enter real mode
+
+       movb    $0x8, %ah               // ask for disk info
+       int     $0x13
+
+       data16
+       call    EXT(_real_to_prot)      // back to protected mode
+
+//     form a longword representing all this gunk
+       mov     %ecx, %eax
+       shrb    $6, %al
+       andb    $0x03, %al
+       xchgb   %ah, %al                // ax has max cyl
+       shl     $16, %eax
+       
+       movb    %dh, %ah                // # heads
+       andb    $0x3f, %cl              // mask of cylinder gunk
+       movb    %cl, %al                // # sectors
+
+       pop     %es
+       pop     %ds
+       pop     %edi
+       pop     %esi
+       pop     %edx
+       pop     %ecx
+       pop     %ebx
+
+       pop     %ebp
+       ret
+#endif
+#if 0
+//
+// getEisaInfo(<slot>):  return an int that represents the
+//     vendor id for the specified slot (0 < slot < 64)
+//     returns 0 for any error
+//     returns bytes in the order [0 1 2 3] in %eax;
+
+ENTRY(getEisaInfo)
+       push    %ebp
+       mov     %esp, %ebp
+
+       push    %ebx
+       push    %ecx
+       push    %edx
+       push    %esi
+       push    %edi
+       push    %ds
+       push    %es
+
+       movb    0x8(%ebp), %cl          // slot #
+       call    EXT(_prot_to_real)      // enter real mode
+
+       movb    $0,%al
+       movb    $0xd8, %ah              // eisa slot info
+       int     $0x15
+
+       data16
+       call    EXT(_real_to_prot)      // back to protected mode
+
+       movb    %ah,%bl
+       xor     %eax,%eax
+
+       test    $0,%bl
+       jne     eisaerr
+
+//     form a longword representing all this gunk
+       mov     %esi, %eax
+       shl     $16, %eax
+       mov     %di,%ax
+       bswap   %eax
+
+eisaerr:       
+       pop     %es
+       pop     %ds
+       pop     %edi
+       pop     %esi
+       pop     %edx
+       pop     %ecx
+       pop     %ebx
+
+       pop     %ebp
+       ret
+#endif
+
+#if 0
+//
+// memsize(i) :  return the memory size in KB. i == 0 for conventional memory,
+//             i == 1 for extended memory
+//     BIOS call "INT 12H" to get conventional memory size
+//     BIOS call "INT 15H, AH=88H" to get extended memory size
+//             Both have the return value in AX.
+//
+
+ENTRY(_memsize)
+       push    %ebp
+       mov     %esp, %ebp
+
+       push    %ebx
+       push    %ecx
+       push    %edx
+       push    %esi
+       push    %edi
+       push    %ds
+       push    %es
+
+       mov     8(%ebp), %ebx
+       call    EXT(_prot_to_real)              // enter real mode
+       cmpb    $0x1, %bl
+       data16
+       je      xext
+       int     $0x12
+       data16
+       jmp     xdone
+xext:
+       movb    $0x88, %ah
+       int     $0x15
+xdone:
+       mov     %eax, %ebx
+       data16
+       call    EXT(_real_to_prot)
+       xor     %eax, %eax
+       mov     %ebx, %eax
+
+       pop     %es
+       pop     %ds
+       pop     %edi
+       pop     %esi
+       pop     %edx
+       pop     %ecx
+       pop     %ebx
+
+       pop     %ebp
+       ret
+
+
+// video_mode(mode)
+// BIOS call "INT 10H Function 0h" to set vga graphics mode
+
+
+ENTRY(_video_mode)
+       push    %ebp
+       mov     %esp, %ebp
+
+       push    %ebx
+       push    %ecx
+       push    %edx
+       push    %esi
+       push    %edi
+       push    %ds
+       push    %es
+
+       movb    0x8(%ebp), %cl
+
+       call    EXT(_prot_to_real)
+
+       movb    $0, %ah
+       movb    %cl, %al
+
+       int     $0x10           // display a byte
+
+       data16
+       call    EXT(_real_to_prot)
+
+       pop     %es
+       pop     %ds
+       pop     %edi
+       pop     %esi
+       pop     %edx
+       pop     %ecx
+       pop     %ebx
+
+       pop     %ebp
+       ret
+
+
+
+// setCursorPosition(x,y)
+// BIOS call "INT 10H Function 2" to set cursor position
+
+
+ENTRY(_setCursorPosition)
+       push    %ebp
+       mov     %esp, %ebp
+
+       push    %ebx
+       push    %ecx
+       push    %edx
+       push    %esi
+       push    %edi
+       push    %ds
+       push    %es
+
+       movb    0x8(%ebp), %cl
+       movb    0xc(%ebp), %ch
+
+       call    EXT(_prot_to_real)
+
+       movb    $2, %ah         // setcursor function
+       movb    $0, %bh         // page num 0 for graphics
+       movb    %cl, %dl        // column, x
+       movb    %ch, %dh        // row, y
+
+       int     $0x10           // set cursor
+
+       data16
+       call    EXT(_real_to_prot)
+
+       pop     %es
+       pop     %ds
+       pop     %edi
+       pop     %esi
+       pop     %edx
+       pop     %ecx
+       pop     %ebx
+
+       pop     %ebp
+       ret
+#endif
+
diff --git a/i386/libsaio/old/shmalloc.c b/i386/libsaio/old/shmalloc.c
new file mode 100644 (file)
index 0000000..09b136b
--- /dev/null
@@ -0,0 +1,29 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
+ * Reserved.  This file contains Original Code and/or Modifications of
+ * Original Code as defined in and that are subject to the Apple Public
+ * Source License Version 1.1 (the "License").  You may not use this file
+ * except in compliance with the License.  Please obtain a copy of the
+ * License at http://www.apple.com/publicsource and read it before using
+ * this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+#import "libsa.h"
+#import "libsaio.h"
+
+void *sh_malloc(size_t size) {return malloc(size);}
+void sh_free(void *start) { free(start); }
+void *sh_realloc(void *ptr, size_t size) {return realloc(ptr,size);}
diff --git a/i386/libsaio/old/stringTable.h.00 b/i386/libsaio/old/stringTable.h.00
new file mode 100644 (file)
index 0000000..bdb7441
--- /dev/null
@@ -0,0 +1,52 @@
+/*
+ * string table functions.
+ */
+
+#import "saio_types.h"
+
+extern char *
+newStringFromList(
+    char **list,
+    int *size
+);
+extern int stringLength(char *table, int compress);
+extern BOOL getValueForStringTableKey(char *table, char *key, char **val, int *size);
+extern char *newStringForStringTableKey(
+       char *table,
+       char *key
+);
+extern BOOL getValueForBootKey(char *line, char *match, char **matchval, int *len);
+extern BOOL getValueForKey(
+    char *key,
+    char **val,
+    int *size
+);
+extern char *
+loadLocalizableStrings(
+    char *name
+);
+extern char *
+bundleLongName(
+    char *bundleName
+);
+extern loadConfigFile( char *configFile, char **table, int allocTable);
+extern int
+loadConfigDir(
+    char *bundleName,  // bundle directory name (e.g. "System.config")
+    int useDefault,    // use Default.table instead of instance tables
+    char **table,      // returns pointer to config table
+    int allocTable     // zalloc the table and return in *table
+);
+extern loadSystemConfig(
+    char *which,
+    int size
+);
+extern int
+loadOtherConfigs(
+    int useDefault
+);
+
+
+
+
+
diff --git a/i386/libsaio/old/stringTableNew.c b/i386/libsaio/old/stringTableNew.c
new file mode 100644 (file)
index 0000000..cd2664a
--- /dev/null
@@ -0,0 +1,564 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
+ * Reserved.  This file contains Original Code and/or Modifications of
+ * Original Code as defined in and that are subject to the Apple Public
+ * Source License Version 1.1 (the "License").  You may not use this file
+ * except in compliance with the License.  Please obtain a copy of the
+ * License at http://www.apple.com/publicsource and read it before using
+ * this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright 1993 NeXT, Inc.
+ * All rights reserved.
+ */
+
+#import "libsaio.h"
+#import "kernBootStruct.h"
+#import "stringConstants.h"
+#import <driverkit/configTablePrivate.h>
+
+extern KERNBOOTSTRUCT *kernBootStruct;
+extern char *Language;
+extern char *LoadableFamilies;
+
+
+static char_ret
+getachar(
+    char       **string_p
+)
+{
+    register char *str = *string_p;
+    register int c;
+    char_ret   r;
+    
+    c = *str++;
+    if (c == '\\') {
+       r.quoted = YES;
+       c = *str++;
+       switch(c) {
+       case 'n':
+           c = '\n';
+           break;
+       case 'r':
+           c = '\r';
+           break;
+       case 't':
+           c = '\t';
+           break;
+       default:
+           break;
+       }
+    } else {
+       r.quoted = NO;
+    }
+    *string_p = str;
+    r.c = c;
+    return r;
+}
+
+/*
+ * A token is:
+ * <non_space_non_semicolon>*
+ * "<non_quote>*"
+ * <semicolon>
+ */
+char *
+get_token(
+    char       **string_p
+)
+{
+    char *begin;
+    char *newstr;
+    char_ret r;
+    int len;
+    
+    do {
+       r = getachar(string_p);
+    } while (r.c && isspace(r.c));
+
+    if (!r.quoted && r.c == '\"') {
+       begin = *string_p;
+       do {
+           r = getachar(string_p);
+       } while (r.c && !r.quoted && r.c != '\"');
+    } else {
+       begin = *string_p - 1;
+       do {
+           r = getachar(string_p);
+       } while (r.c && !r.quoted && r.c != ';' && !isspace(r.c));
+    }
+    len = *string_p - begin - 1;
+    newstr = (char *)malloc(len + 1);
+    strncpy(newstr, begin, len);
+    newstr[len] = '\0';
+    return newstr;
+}
+
+
+char *
+stringFromList(
+    char **list,
+    int *size
+)
+{
+    char *begin = *list, *end;
+    char *newstr;
+    int newsize = *size;
+    
+    while (*begin && newsize && isspace(*begin)) {
+       begin++;
+       newsize--;
+    }
+    end = begin;
+    while (*end && newsize && !isspace(*end)) {
+       end++;
+       newsize--;
+    }
+    if (begin == end)
+       return 0;
+    newstr = malloc(end - begin + 1);
+    strncpy(newstr, begin, end - begin);
+    *list = end;
+    *size = newsize;
+    return newstr;
+}
+
+char *
+valueForStringTableKey(
+    char *table,
+    char *key
+)
+{
+    char *token;
+    enum {
+       KEY,
+       EQUALS,
+       VALUE,
+       SEMICOLON,
+       BEGINCOMMENT,
+       ENDCOMMENT
+    } state;
+    BOOL foundKey;
+    int len;
+    
+    state = KEY;
+    foundKey = NO;
+    while (*table) {
+       token = get_token(&table);
+       switch(state) {
+       case KEY:
+           if (strcmp(token, key) == 0)
+               foundKey = YES;
+           if (strncmp(token, "/*", 2) == 0)
+               state = ENDCOMMENT;
+           else
+               state = EQUALS;
+           break;
+       case EQUALS:
+           if (strcmp(token, "=") == 0) {
+               state = VALUE;
+           }
+           break;
+       case VALUE:
+           if (foundKey) {
+               return token;
+           }
+           state = SEMICOLON;
+           break;
+       case SEMICOLON:
+           if (strcmp(token, ";") == 0) {
+               state = KEY;
+           }
+           break;
+       case ENDCOMMENT:
+           len = strlen(token);
+           if (len >= 2 && strncmp(token + len - 2, "*/", 2) == 0)
+               state = KEY;
+           break;
+       }
+       free(token);
+    }
+    return 0;
+}
+
+char *
+valueForBootKey(
+    char *line,
+    char *match
+)
+{
+    char *token;
+    enum {
+       KEY,
+       EQUALS,
+       VALUE,
+       WHITESPACE
+    } state;
+    BOOL foundKey;
+    int len;
+
+    state = KEY;
+    while (*line) {
+       token = get_token(&line);
+    }
+}
+
+BOOL
+boolForKey(
+    char *key
+)
+{
+    char *str = valueForKey(key);
+    BOOL ret;
+    
+    if (str && (str[0] == 'Y' || str[1] == 'y'))
+       ret = YES;
+    else
+       ret = NO;
+    free(str);
+    return ret;
+}
+
+BOOL
+getIntForKey(
+    char *key,
+    int *value
+)
+{
+    char *str = valueForKey(key), *ptr = str;
+    int sum;
+    BOOL ret;
+    
+    if (str) {
+       for (sum = 0; size > 0; size--) {
+           sum = (sum * 10) + (*ptr++ - '0');
+       }
+       *value = sum;
+       ret = YES;
+    } else {
+       ret = NO;
+    }
+    free(str);
+    return ret;
+}
+
+char *
+valueForKey(
+    char *key
+)
+{
+    char *str = valueForBootKey(kernBootStruct->bootString, key);;
+    
+    if (str)
+       return str;
+    else
+       return valueForStringTableKey(kernBootStruct->config, key);
+}
+
+#define        LOCALIZABLE_PATH \
+       "%s/%s.config/%s.lproj/%s.strings"
+char *
+loadLocalizableStrings(
+    char *name,
+    char *tableName
+)
+{
+    char buf[256], *config;
+    register int i, count, fd = -1;
+    char * paths[] = {
+       ARCH_DEVICES,
+       USR_DEVICES,
+       "/",
+       NULL
+    }, **path;
+    
+    for (i=0; i<2; i++) {
+       for (path = paths; *path; path++) {
+           sprintf(buf, LOCALIZABLE_PATH, *path, name,
+                  (i == 0) ? Language : "English", tableName);
+           if ((fd = open(buf, 0)) >= 0) {
+               i = 2;
+               break;
+           }
+       }
+    }
+    if (fd < 0)
+       return 0;
+    count = file_size(fd);
+    config = malloc(count);
+    count = read(fd, config, count);
+    close(fd);
+    if (count <= 0) {
+       free(config);
+       return 0;
+    }
+    return config;
+}
+
+char *
+bundleLongName(
+    char *bundleName,
+    char *tableName
+)
+{
+    char *table, *name, *val;
+    int size;
+    
+    table = loadLocalizableStrings(bundleName,
+       tableName ? tableName : "Localizable");
+    if ( table != 0 &&
+        getValueForStringTableKey(table,"Long Name", &val, &size) == YES) {
+       name = malloc(size+1);
+       strncpy(name, val, size);
+       free(table);
+    } else {
+       name = newString(bundleName);
+    }
+    return name;
+}
+
+int sysConfigValid;
+
+void
+addConfig(
+    char *config
+)
+{
+    char *configPtr = kernBootStruct->configEnd;
+    int len = strlen(config);
+    
+    if ((configPtr - kernBootStruct->config) > CONFIG_SIZE) {
+       error("No room in memory for config files\n");
+       return;
+    }
+    strcpy(configPtr, config);
+    configPtr += (len + 1);
+    *configPtr = 0;
+    kernBootStruct->configEnd = configPtr;
+}
+
+/*
+ * Returns 0 if file loaded OK,
+ *        -1 if file was not loaded
+ * Does not print error messages.
+ * Returns pointer to table in memory in *table.
+ */
+int
+loadConfigFile( char *configFile, char **table, BOOL allocTable)
+{
+    char *configPtr = kernBootStruct->configEnd;
+    int fd, count;
+    
+    /* Read config file into memory */
+    if ((fd = open(configFile, 0)) >= 0)
+    {
+       if (allocTable) {
+           configPtr = malloc(file_size(fd)+2);
+       } else {
+           if ((configPtr - kernBootStruct->config) > CONFIG_SIZE) {
+               error("No room in memory for config files\n");
+               close(fd);
+               return -1;
+           }
+           verbose("Reading configuration file '%s'.\n",configFile);       
+       }
+       if (table) *table = configPtr;
+       count = read(fd, configPtr, IO_CONFIG_DATA_SIZE);
+       close(fd);
+
+       configPtr += count;
+       *configPtr++ = 0;
+       *configPtr = 0;
+       if (!allocTable)
+           kernBootStruct->configEnd = configPtr;
+
+       return 0;
+    } else {
+       return -1;
+    }
+}
+
+/* Returns 0 if requested config files were loaded,
+ *         1 if default files were loaded,
+ *        -1 if no files were loaded.
+ * Prints error message if files cannot be loaded.
+ */
+int
+loadConfigDir(
+    char *bundleName,  // bundle directory name (e.g. "System")
+    BOOL useDefault,   // use Default.table instead of instance tables
+    char **table,      // returns pointer to config table
+    BOOL allocTable    // malloc the table and return in *table
+)
+{
+    char *buf;
+    int i, ret;
+    BOOL archConfig = dirExists(ARCH_DEVICES);
+    
+    buf = malloc(256);
+    ret = 0;
+    
+    // load up to 99 instance tables
+    for (i=0; i < 99; i++) {
+       sprintf(buf, "%s/%s.config/Instance%d.table",
+               archConfig ? ARCH_DEVICES : USR_DEVICES,
+               bundleName, i);
+       if (useDefault || (loadConfigFile(buf, table, allocTable) != 0)) {
+           if (i == 0) {
+               // couldn't load first instance table;
+               // try the default table
+               sprintf(buf, "%s/%s.config/%s",
+                       archConfig ? ARCH_DEVICES : USR_DEVICES,
+                       bundleName,
+                       IO_DEFAULT_TABLE_FILENAME);
+               if (loadConfigFile(buf, table, allocTable) == 0) {
+                   ret = 1;
+               } else {
+                   if (!allocTable)
+                       error("Config file \"%s\" not found\n", buf);
+                   ret = -1;
+               }
+           }
+           // we must be done.
+           break;
+       }
+    }
+    free(buf);
+    return ret;
+}
+
+
+#define USR_SYSTEM_CONFIG \
+       USR_DEVICES "/System.config"
+#define USR_SYSTEM_DEFAULT_FILE \
+       USR_SYSTEM_CONFIG "/Default.table"
+#define ARCH_SYSTEM_CONFIG \
+       ARCH_DEVICES "/System.config"
+#define ARCH_SYSTEM_DEFAULT_FILE \
+       ARCH_SYSTEM_CONFIG "/Default.table"
+#define SYSTEM_CONFIG "System"
+#define LP '('
+#define RP ')'
+
+/* Returns 0 if requested config files were loaded,
+ *         1 if default files were loaded,
+ *        -1 if no files were loaded.
+ * Prints error message if files cannot be loaded.
+ */
+int
+loadSystemConfig(
+    char *which,
+    int size
+)
+{
+    char *buf, *bp, *cp;
+    int ret, len, doDefault=0;
+    BOOL archConfig = dirExists(ARCH_DEVICES);
+
+    buf = bp = malloc(256);
+    if (which && size)
+    {
+       for(cp = which, len = size; len && *cp && *cp != LP; cp++, len--) ;
+       if (*cp == LP) {
+           while (len-- && *cp && *cp++ != RP) ;
+           /* cp now points past device */
+           strncpy(buf,which,cp - which);
+           bp += cp - which;
+       } else {
+           cp = which;
+           len = size;
+       }
+       if (*cp != '/') {
+           strcpy(bp, archConfig ?
+               ARCH_SYSTEM_CONFIG : USR_SYSTEM_CONFIG);
+           strcat(bp, "/");
+           strncat(bp, cp, len);
+           if (strncmp(cp + len - strlen(IO_TABLE_EXTENSION),
+                      IO_TABLE_EXTENSION, strlen(IO_TABLE_EXTENSION)) != 0)
+               strcat(bp, IO_TABLE_EXTENSION);
+       } else {
+           strncpy(bp, cp, len);
+           bp[size] = '\0';
+       }
+       if ((strcmp(bp, USR_SYSTEM_DEFAULT_FILE) == 0) ||
+           (strcmp(bp, ARCH_SYSTEM_DEFAULT_FILE) == 0))
+           doDefault = 1;
+       ret = loadConfigFile(bp = buf, 0, 0);
+    } else {
+       ret = loadConfigDir((bp = SYSTEM_CONFIG), 0, 0, 0);
+    }
+    if (ret < 0) {
+       error("System config file '%s' not found\n", bp);
+    } else
+       sysConfigValid = 1;
+    free(buf);
+    return (ret < 0 ? ret : doDefault);
+}
+
+
+int
+loadOtherConfigs(
+    int useDefault
+)
+{
+    char *val, *table;
+    int count;
+    char *string;
+    int fd, ret;
+
+    if (getValueForKey( "Boot Drivers", &val, &count))
+    {
+       while (string = stringFromList(&val, &count)) {
+           ret = loadConfigDir(string, useDefault, &table, 0);
+           if (ret >= 0) {
+               if ((fd = openDriverReloc(string)) >= 0) {
+                   verbose("Loading binary for %s device driver.\n",string);
+                   if (loadDriver(string, fd) < 0)
+                       error("Error loading %s device driver.\n",string);
+                   close(fd);
+               }
+               driverWasLoaded(string, table, NULL);
+               free(string);
+           } else {
+               driverIsMissing(string);
+           }
+       }
+    } else {
+       error("Warning: No active drivers specified in system config.\n");
+    }
+
+    kernBootStruct->first_addr0 =
+           (int)kernBootStruct->configEnd + 1024;
+    return 0;
+}
+
+static BOOL
+dirExists(char *path)
+{
+    int fd;
+    
+    if ((fd = open(path, 0)) < 0) {
+       return NO;
+    } else {
+       close(fd);
+       return YES;
+    }
+}
+
+
+
diff --git a/i386/libsaio/pci.c b/i386/libsaio/pci.c
new file mode 100644 (file)
index 0000000..7fd0542
--- /dev/null
@@ -0,0 +1,291 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
+ * Reserved.  This file contains Original Code and/or Modifications of
+ * Original Code as defined in and that are subject to the Apple Public
+ * Source License Version 1.1 (the "License").  You may not use this file
+ * except in compliance with the License.  Please obtain a copy of the
+ * License at http://www.apple.com/publicsource and read it before using
+ * this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1994 NeXT Computer, Inc.
+ *
+ * PCI bus probing.
+ *
+ * HISTORY
+ *
+ * 03 May 1994 Dean Reece at NeXT
+ *     Created
+ */
+
+#include <mach/mach_types.h>
+// #include "legacy/KernDevice.h"
+#include "legacy/PCI.h"
+
+#include "kernBootStruct.h"
+#include "libsaio.h"
+#include "io_inline.h"
+#include "pci.h"
+
+static BOOL testMethod1(void);
+static BOOL testMethod2(void);
+typedef unsigned long (*_pci_bus_method_t)(
+    unsigned char addr,
+    unsigned char dev,
+    unsigned char func,
+    unsigned char bus
+);
+static unsigned long getMethod1(
+    unsigned char addr,
+    unsigned char dev,
+    unsigned char func,
+    unsigned char bus
+);
+static unsigned long getMethod2(
+    unsigned char addr,
+    unsigned char dev,
+    unsigned char func,
+    unsigned char bus
+);
+static unsigned
+scanBus(
+    unsigned maxBusNum,
+    unsigned maxDevNum,
+    _pci_bus_method_t method,
+    _pci_slot_info_t *slot_array
+);
+
+_pci_slot_info_t *PCISlotInfo;
+
+_pci_slot_info_t *
+PCI_Bus_Init(
+    PCI_bus_info_t *info       /* pass in the PCI boot info struct */
+)
+{
+
+    unsigned int maxBusNum = 0, maxDevNum = 0, useMethod = 0;
+    _pci_bus_method_t method = NULL;
+    _pci_slot_info_t *slot_array;
+    unsigned nslots;
+
+    maxBusNum = info->maxBusNum;
+    if (info->BIOSPresent) {
+       if (info->u_bus.s.configMethod1) {
+           useMethod=1;
+           maxDevNum=31;
+       }
+       else if (info->u_bus.s.configMethod2) {
+           useMethod=2;
+           maxDevNum=15;
+       }
+    }
+    else {
+       if (testMethod1()) {
+           useMethod=1;
+           maxDevNum=31;
+       }
+       else if (testMethod2()) {
+           useMethod=2;
+           maxDevNum=15;
+       }
+    }
+
+
+    if (useMethod == 1)
+       method = getMethod1;
+    else if (useMethod == 2)
+       method = getMethod2;
+    else
+       return NULL;
+       
+    nslots = scanBus(maxBusNum, maxDevNum, method, NULL);
+    slot_array = (_pci_slot_info_t *)
+       malloc(sizeof(_pci_slot_info_t) * nslots +1);
+    (void)scanBus(maxBusNum, maxDevNum, method, slot_array);
+    slot_array[nslots].pid = 0x00;
+    slot_array[nslots].sid = 0x00;
+    PCISlotInfo = slot_array;
+    return slot_array;
+}
+
+static unsigned
+scanBus(
+    unsigned maxBusNum,
+    unsigned maxDevNum,
+    _pci_bus_method_t method,
+    _pci_slot_info_t *slot_array
+)
+{
+    unsigned int bus, dev, func;
+    unsigned int pid=0, sid=0;
+    unsigned count = 0;
+
+    for (bus=0; bus<=maxBusNum; bus++) {
+       for (dev=0; dev<=maxDevNum; dev++) {
+           for (func=0; func<8; func++) {
+               pid = (*method)(0x00, dev, func, bus);
+               if ( ((pid&0xffff) != 0xffff) &&
+                       ((pid&0xffff) != 0x0000) ) {
+    
+                   /* device found, do whatever here */
+                   count++;
+                   if (slot_array) {
+                       sid = (*method)(0x2c, dev, func, bus);
+                       slot_array->pid = pid;
+                       slot_array->sid = sid;
+                       slot_array->dev = dev;
+                       slot_array->func = func;
+                       slot_array->bus = bus;
+                       slot_array++;
+#if DEBUG
+printf ("{\"0x%08x:%08x\" = {\"Location\" = \"Dev:%d Func:%d Bus:%d\"; }\n",
+pid, sid, dev, func, bus);
+#endif
+                   }
+    
+                   /* skip 1..7 if not multi-func device */
+                   pid = (*method)(12, dev, func, bus);
+                   if ((pid & 0x00800000)==0) break;
+               }
+           }
+       }
+    }
+    return count;
+}
+
+/* defines for Configuration Method #1 (PCI 2.0 Spec, sec 3.6.4.1.1) */
+#define PCI_CONFIG_ADDRESS      0x0cf8
+#define PCI_CONFIG_DATA         0x0cfc
+
+static BOOL
+testMethod1(void)
+{
+    unsigned long address, data;
+
+    for (address = 0x80000000; address < 0x80010000; address += 0x800) {
+       outl (PCI_CONFIG_ADDRESS, address);
+       if (inl (PCI_CONFIG_ADDRESS) != address) {
+           return NO;
+       }
+       data = inl(PCI_CONFIG_DATA);
+       if ((data != PCI_DEFAULT_DATA) && (data != 0x00)) {
+           outl (PCI_CONFIG_ADDRESS, 0);
+           return YES;
+       }
+    }
+
+    outl (PCI_CONFIG_ADDRESS, 0);
+    return NO;
+}
+
+static unsigned long
+getMethod1(
+    unsigned char addr,
+    unsigned char dev,
+    unsigned char func,
+    unsigned char bus
+)
+{
+    unsigned long ret=PCI_DEFAULT_DATA;
+
+    union {
+       unsigned long d;
+       struct {
+           unsigned long       addr:8;
+           unsigned long       func:3;
+           unsigned long       dev:5;
+           unsigned long       bus:8;
+           unsigned long       key:8;
+       } s;
+    } address;
+
+    address.d = 0x00000000;
+    address.s.key=0x80;
+    address.s.addr=addr;
+    address.s.dev=dev;
+    address.s.func=func;
+    address.s.bus=bus;
+    outl (PCI_CONFIG_ADDRESS, address.d);
+
+    if (inl (PCI_CONFIG_ADDRESS) == address.d)
+       ret = inl(PCI_CONFIG_DATA);
+
+    outl (PCI_CONFIG_ADDRESS, 0);
+    return ret;
+}
+
+
+/* defines for Configuration Method #2 (PCI 2.0 Spec, sec 3.6.4.1.3) */
+#define PCI_CSE_REGISTER       0x0cf8
+#define PCI_BUS_FORWARD                0x0cfa
+
+static BOOL
+testMethod2(void)
+{
+    unsigned long address, data;
+
+    /*  Enable configuration space at I/O ports Cxxx.  */
+
+    outb (PCI_CSE_REGISTER, 0xF0);
+    if (inb (PCI_CSE_REGISTER) != 0xF0) {
+       return NO;
+    }
+
+    outb (PCI_BUS_FORWARD, 0x00);
+    if (inb (PCI_BUS_FORWARD) != 0x00) {
+       return NO;
+    }
+    /*  Search all devices on the bus.  */
+    for (address = 0xc000; address <= 0xcfff; address += 0x100) {
+       data = inl(address);
+       if ((data != PCI_DEFAULT_DATA) && (data != 0x00)) {
+           outb (PCI_CSE_REGISTER, 0);
+           return YES;
+       }
+    }
+
+    outb (PCI_CSE_REGISTER, 0);
+    return NO;
+}
+
+static unsigned long
+getMethod2(
+    unsigned char addr,
+    unsigned char dev,
+    unsigned char func,
+    unsigned char bus
+)
+{
+    unsigned long ret=PCI_DEFAULT_DATA;
+    unsigned short address;
+    unsigned char cse;
+
+    cse = 0xf0 | (func<<1);
+    outb(PCI_CSE_REGISTER, cse);
+    if (inb(PCI_CSE_REGISTER) == cse) {
+       outb(PCI_BUS_FORWARD, bus);
+           if (inb(PCI_BUS_FORWARD) == bus) {
+           address = 0xc000 | (addr&0xfc) | ((dev&0x0f)<<8);
+           ret = inl(address);
+       }
+       outb(PCI_BUS_FORWARD, 0x00);
+    }
+    outb(PCI_CSE_REGISTER, 0x00);
+
+    return ret;
+}
+
diff --git a/i386/libsaio/pci.h b/i386/libsaio/pci.h
new file mode 100644 (file)
index 0000000..5a334bf
--- /dev/null
@@ -0,0 +1,41 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
+ * Reserved.  This file contains Original Code and/or Modifications of
+ * Original Code as defined in and that are subject to the Apple Public
+ * Source License Version 1.1 (the "License").  You may not use this file
+ * except in compliance with the License.  Please obtain a copy of the
+ * License at http://www.apple.com/publicsource and read it before using
+ * this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright 1994 NeXT Computer, Inc.
+ * All rights reserved.
+ */
+
+#ifndef __LIBSAIO_PCI_H
+#define __LIBSAIO_PCI_H
+
+typedef struct _pci_slot_info {
+    unsigned long int pid, sid;
+    unsigned dev;
+    unsigned func;
+    unsigned bus;
+} _pci_slot_info_t;
+
+extern _pci_slot_info_t *PCISlotInfo;
+
+#endif /* !__LIBSAIO_PCI_H */
diff --git a/i386/libsaio/saio.h b/i386/libsaio/saio.h
new file mode 100644 (file)
index 0000000..4b70b70
--- /dev/null
@@ -0,0 +1,142 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
+ * Reserved.  This file contains Original Code and/or Modifications of
+ * Original Code as defined in and that are subject to the Apple Public
+ * Source License Version 1.1 (the "License").  You may not use this file
+ * except in compliance with the License.  Please obtain a copy of the
+ * License at http://www.apple.com/publicsource and read it before using
+ * this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/* 
+ * Mach Operating System
+ * Copyright (c) 1990 Carnegie-Mellon University
+ * Copyright (c) 1989 Carnegie-Mellon University
+ * Copyright (c) 1988 Carnegie-Mellon University
+ * All rights reserved.  The CMU software License Agreement specifies
+ * the terms and conditions for use and redistribution.
+ *
+ */
+/*
+ * Copyright (c) 1982, 1986 Regents of the University of California.
+ * All rights reserved.  The Berkeley software License Agreement
+ * specifies the terms and conditions for redistribution.
+ *
+ *  @(#)saio.h  7.1 (Berkeley) 6/5/86
+ */
+
+#ifndef __LIBSAIO_SAIO_H
+#define __LIBSAIO_SAIO_H
+#include <sys/types.h>
+#include <sys/param.h>
+#include <sys/vnode.h>
+#include <ufs/ufs/quota.h>
+#include <ufs/ufs/inode.h>
+
+/*
+ * Io block: includes an inode, cells for the use of seek, etc,
+ * and a buffer.
+ */
+struct  iob {
+    int             i_flgs;        /* see F_ below */
+    struct inode    i_ino;         /* inode, if file */
+    daddr_t         i_boff;        /* block offset on device */
+    unsigned int    i_offset;      /* seek offset in file */
+    daddr_t         i_bn;          /* 1st block # of next read */
+    char *          i_ma;          /* memory address of i/o buffer */
+    int             i_cc;          /* character count of transfer */
+    int             i_error;       /* error # return */
+    char *          i_buf;         /* i/o buffer */
+    struct fs *     i_ffs;         /* file system super block info */
+    int             biosdev;       /* bios device for file, i_ino inadequate */
+    daddr_t         dirbuf_blkno;  /* blk of currently buffered dir */
+    int             partition;     /* which partition */
+};
+
+struct dirstuff {
+    int          loc;
+    struct iob * io;
+};
+
+#define F_READ      0x1            /* file opened for reading */
+#define F_WRITE     0x2            /* file opened for writing */
+#define F_ALLOC     0x4            /* buffer allocated */
+#define F_FILE      0x8            /* file instead of device */
+#define F_NBSF      0x10           /* no bad sector forwarding */
+#define F_SSI       0x40           /* set skip sector inhibit */
+#define F_MEM       0x80           /* memory instead of file or device */
+
+/* IO types */
+#define F_RDDATA    0x0100         /* read data */
+#define F_WRDATA    0x0200         /* write data */
+#define F_HDR       0x0400         /* include header on next i/o */
+
+#define F_TYPEMASK  0xff00
+
+extern char * devsw[];
+
+/*
+ * Request codes. Must be the same a F_XXX above
+ */
+#define READ    1
+#define WRITE   2
+
+#define NBUFS   4
+extern char *   b[NBUFS];
+extern daddr_t  blknos[NBUFS];
+
+#define NFILES  6
+extern struct   iob iob[NFILES];
+
+/* Error codes */
+#define EBADF   1   /* bad file descriptor */
+#define EOFFSET 2   /* relative seek not supported */
+#define EDEV    3   /* improper device specification on open */
+#define ENXIO   4   /* unknown device specified */
+#define ESRCH   6   /* directory search for file failed */
+#define EIO     7   /* generic error */
+#define ECMD    10  /* undefined driver command */
+#define EBSE    11  /* bad sector error */
+#define EWCK    12  /* write check error */
+#define EECC    13  /* uncorrectable ecc error */
+#define EHER    14  /* hard error */
+
+#define BIOS_DEV_FLOPPY  0x0
+#define BIOS_DEV_HD      0x80
+#define BIOS_DEV_WIN     BIOS_DEV_HD
+#define BIOS_DEV_EN      0xff  /* not really a BIOS device number */
+
+#define DEV_SD      0
+#define DEV_HD      1
+#define DEV_FLOPPY  2
+#define DEV_EN      3
+
+#define BIOSDEV(dev)    ((dev) == DEV_FLOPPY ? BIOS_DEV_FLOPPY : BIOS_DEV_WIN)
+
+#define NSECS   16  /* number of buffered 512 byte sectors */
+
+#define        Dev(x)          (((x)>>B_TYPESHIFT)&B_TYPEMASK)
+
+#ifndef max
+#define max(a,b) ((a) > (b) ? (a) : (b))
+#endif
+
+#ifndef min
+#define min(a,b) ((a) < (b) ? (a) : (b))
+#endif
+
+#endif /* !__LIBSAIO_SAIO_H */
diff --git a/i386/libsaio/saio_internal.h b/i386/libsaio/saio_internal.h
new file mode 100644 (file)
index 0000000..bf9acbe
--- /dev/null
@@ -0,0 +1,165 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
+ * Reserved.  This file contains Original Code and/or Modifications of
+ * Original Code as defined in and that are subject to the Apple Public
+ * Source License Version 1.1 (the "License").  You may not use this file
+ * except in compliance with the License.  Please obtain a copy of the
+ * License at http://www.apple.com/publicsource and read it before using
+ * this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+
+#ifndef __LIBSAIO_SAIO_INTERNAL_H
+#define __LIBSAIO_SAIO_INTERNAL_H
+
+#include "saio_types.h"
+
+/* asm.s */
+extern void  real_to_prot(void);
+extern void  prot_to_real(void);
+extern void  halt(void);
+extern void  startprog(unsigned int address);
+
+/* bios.s */
+extern void  bios(biosBuf_t *bb);
+extern void  get_memsize(biosBuf_t *bb);
+
+/* biosfn.c */
+#ifdef EISA_SUPPORT
+extern BOOL eisa_present(void);
+#endif
+extern int  bgetc(void);
+extern int  biosread(int dev, int cyl, int head, int sec, int num);
+extern int  ebiosread(int dev, long sec, int count);
+extern void putc(int ch);
+extern int  getc(void);
+extern int  readKeyboardStatus(void);
+extern unsigned int  time18(void);
+extern unsigned int  get_diskinfo(int dev);
+extern int  APMPresent(void);
+extern int  APMConnect32(void);
+extern int  memsize(int i);
+extern void video_mode(int mode);
+extern void setCursorPosition(int x, int y);
+
+/* bootstruct.c */
+extern void initKernBootStruct(void);
+
+/* console.c */
+extern BOOL verbose_mode;
+extern void putchar(int ch);
+extern int  getchar(void);
+extern int  printf(const char *format, ...);
+extern int  error(const char *format, ...);
+extern int  verbose(const char *format, ...);
+
+/* disk.c */
+extern void devopen(char *name, struct iob *io);
+extern int devread(struct iob *io);
+extern void devflush(void);
+
+/* gets.c */
+extern int  gets(char *buf, int len);
+extern int  Gets(
+    char *buf,
+    int len,
+    int timeout,
+    char *prompt,
+    char *message
+);
+
+/* load.c */
+extern int openfile(char *filename, int ignored);
+
+extern int  loadmacho(
+    struct mach_header *head,
+    int dev,
+    int io,
+    entry_t *entry,
+    char **addr,
+    int *size,
+    int file_offset
+);
+extern int  loadprog(
+    int dev,
+    int fd,
+    struct mach_header *headOut,
+    entry_t *entry,
+    char **addr,
+    int *size
+);
+
+/* misc.c */
+extern void  sleep(int n);
+extern void  enableA20(void);
+extern void  turnOffFloppy(void);
+extern char *newString(char *oldString);
+
+/* stringTable.c */
+extern char * newStringFromList(char **list, int *size);
+extern int    stringLength(char *table, int compress);
+extern BOOL   getValueForStringTableKey(char *table, char *key, char **val, int *size);
+extern BOOL   removeKeyFromTable(const char *key, char *table);
+extern char * newStringForStringTableKey(char *table, char *key);
+extern char * newStringForKey(char *key);
+extern BOOL   getValueForBootKey(char *line, char *match, char **matchval, int *len);
+extern BOOL   getValueForKey(char *key, char **val, int *size);
+extern BOOL   getBoolForKey(char *key);
+extern BOOL   getIntForKey(char *key, int *val);
+#if 0
+extern char * loadLocalizableStrings(char *name, char *tableName);
+extern char * bundleLongName(char *bundleName, char *tableName);
+extern int    loadOtherConfigs(int useDefault);
+#endif
+extern int    loadConfigFile( char *configFile, char **table, BOOL allocTable);
+extern int    loadConfigDir(char *bundleName, BOOL useDefault, char **table,
+                            BOOL allocTable);
+extern int    loadSystemConfig(char *which, int size);
+extern void   addConfig(char *config);
+
+/* sys.c */
+extern void stop(char *message);
+extern int  openmem(char * buf, int len);
+extern int  open(char *str, int how);
+extern int  close(int fdesc);
+extern int  file_size(int fdesc);
+extern int  read(int fdesc, char *buf, int count);
+extern int  b_lseek(int fdesc, unsigned int addr, int ptr);
+extern int  tell(int fdesc);
+extern void  flushdev(void);
+extern char *usrDevices(void);
+extern struct dirstuff * opendir(char *path);
+extern int  closedir(struct dirstuff *dirp);
+extern struct direct * readdir(struct dirstuff *dirp);
+extern int  currentdev(void);
+extern int  switchdev(int dev);
+
+/* ufs_byteorder.c */
+extern void byte_swap_superblock(struct fs *sb);
+extern void byte_swap_inode_in(struct dinode *dc, struct dinode *ic);
+extern void byte_swap_dir_block_in(char *addr, int count);
+
+/*
+ * vbe.c
+ */
+extern int  set_linear_video_mode(unsigned short mode);
+
+/*
+ * vga.c
+ */
+extern void set_video_mode(unsigned int mode);
+
+#endif /* !__LIBSAIO_SAIO_INTERNAL_H */
diff --git a/i386/libsaio/saio_types.h b/i386/libsaio/saio_types.h
new file mode 100644 (file)
index 0000000..b98d4ea
--- /dev/null
@@ -0,0 +1,58 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
+ * Reserved.  This file contains Original Code and/or Modifications of
+ * Original Code as defined in and that are subject to the Apple Public
+ * Source License Version 1.1 (the "License").  You may not use this file
+ * except in compliance with the License.  Please obtain a copy of the
+ * License at http://www.apple.com/publicsource and read it before using
+ * this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/* Useful types. */
+
+#ifndef __LIBSAIO_SAIO_TYPES_H
+#define __LIBSAIO_SAIO_TYPES_H
+
+typedef char BOOL;
+#define NO  0
+#define YES 1
+
+#include <mach-o/loader.h>
+#undef i386_THREAD_STATE
+#undef i386_THREAD_STATE_COUNT
+#include <mach/i386/thread_status.h>
+#include <sys/reboot.h>
+
+typedef unsigned long  entry_t;
+
+#include <stdarg.h>
+#include "bios.h"
+#include "saio.h"
+
+typedef struct {
+    unsigned int sectors:8;
+    unsigned int heads:8;
+    unsigned int cylinders:16;
+} compact_diskinfo_t;
+
+struct driveParameters {
+    int cylinders;
+    int sectors;
+    int heads;
+    int totalDrives;
+};
+
+#endif /* !__LIBSAIO_SAIO_TYPES_H */
diff --git a/i386/libsaio/stringConstants.h b/i386/libsaio/stringConstants.h
new file mode 100644 (file)
index 0000000..5b961cc
--- /dev/null
@@ -0,0 +1,38 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
+ * Reserved.  This file contains Original Code and/or Modifications of
+ * Original Code as defined in and that are subject to the Apple Public
+ * Source License Version 1.1 (the "License").  You may not use this file
+ * except in compliance with the License.  Please obtain a copy of the
+ * License at http://www.apple.com/publicsource and read it before using
+ * this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright 1994 NeXT, Inc.
+ * All rights reserved.
+ */
+
+#ifndef __LIBSAIO_STRINGCONSTANTS_H
+#define __LIBSAIO_STRINGCONSTANTS_H
+
+#define USR_DEVICES            "/usr/Devices"
+#define PRIVATE_DEVICES        "/private/Devices"
+#define PRIVATE_DRIVERS                "/private/Drivers"
+#define ARCH_DEVICES           "/private/Drivers/i386"
+#define INSTALL_HINTS          "InstallHints"
+
+#endif /* !__LIBSAIO_STRINGCONSTANTS_H */
diff --git a/i386/libsaio/stringTable.c b/i386/libsaio/stringTable.c
new file mode 100644 (file)
index 0000000..322832c
--- /dev/null
@@ -0,0 +1,759 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
+ * Reserved.  This file contains Original Code and/or Modifications of
+ * Original Code as defined in and that are subject to the Apple Public
+ * Source License Version 1.1 (the "License").  You may not use this file
+ * except in compliance with the License.  Please obtain a copy of the
+ * License at http://www.apple.com/publicsource and read it before using
+ * this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright 1993 NeXT, Inc.
+ * All rights reserved.
+ */
+
+#include "libsaio.h"
+#include "kernBootStruct.h"
+#include "stringConstants.h"
+#include "drivers.h"
+#include "legacy/configTablePrivate.h"
+
+extern KERNBOOTSTRUCT *kernBootStruct;
+extern char *Language;
+extern char *LoadableFamilies;
+
+static void eatThru(char val, char **table_p);
+
+static inline int isspace(char c)
+{
+    return (c == ' ' || c == '\t');
+}
+
+/*
+ * Compare a string to a key with quoted characters
+ */
+static inline int
+keyncmp(char *str, char *key, int n)
+{
+    int c;
+    while (n--) {
+       c = *key++;
+       if (c == '\\') {
+           switch(c = *key++) {
+           case 'n':
+               c = '\n';
+               break;
+           case 'r':
+               c = '\r';
+               break;
+           case 't':
+               c = '\t';
+               break;
+           default:
+               break;
+           }
+       } else if (c == '\"') {
+           /* Premature end of key */
+           return 1;
+       }
+       if (c != *str++) {
+           return 1;
+       }
+    }
+    return 0;
+}
+
+static void eatThru(char val, char **table_p)
+{
+       register char *table = *table_p;
+       register BOOL found = NO;
+
+       while (*table && !found)
+       {
+               if (*table == '\\') table += 2;
+               else
+               {
+                       if (*table == val) found = YES;
+                       table++;
+               }
+       }
+       *table_p = table;
+}
+
+/* Remove key and its associated value from the table. */
+
+BOOL
+removeKeyFromTable(const char *key, char *table)
+{
+    register int len;
+    register char *tab;
+    char *buf;
+
+    len = strlen(key);
+    tab = (char *)table;
+    buf = (char *)malloc(len + 3);
+
+    sprintf(buf, "\"%s\"", key);
+    len = strlen(buf);
+
+    while(*tab) {
+        if(strncmp(buf, tab, len) == 0) {
+            char c;
+
+            while((c = *(tab + len)) != ';') {
+                if(c == 0) {
+                    len = -1;
+                    goto out;
+                }
+                len++;
+            }
+            len++;
+            if(*(tab + len) == '\n') len++;
+            goto out;
+        }
+        tab++;
+    }
+    len = -1;
+out:
+    free(buf);
+
+    if(len == -1) return NO;
+
+    while((*tab = *(tab + len))) {
+        tab++;
+    }
+
+    return YES;
+}
+
+char *
+newStringFromList(
+    char **list,
+    int *size
+)
+{
+    char *begin = *list, *end;
+    char *newstr;
+    int newsize = *size;
+    
+    while (*begin && newsize && isspace(*begin)) {
+       begin++;
+       newsize--;
+    }
+    end = begin;
+    while (*end && newsize && !isspace(*end)) {
+       end++;
+       newsize--;
+    }
+    if (begin == end)
+       return 0;
+    newstr = malloc(end - begin + 1);
+    strncpy(newstr, begin, end - begin);
+    *list = end;
+    *size = newsize;
+    return newstr;
+}
+
+/* 
+ * compress == compress escaped characters to one character
+ */
+int stringLength(char *table, int compress)
+{
+       int ret = 0;
+
+       while (*table)
+       {
+               if (*table == '\\')
+               {
+                       table += 2;
+                       ret += 1 + (compress ? 0 : 1);
+               }
+               else
+               {
+                       if (*table == '\"') return ret;
+                       ret++;
+                       table++;
+               }
+       }
+       return ret;
+}
+
+// looks in table for strings of format << "key" = "value"; >>
+// or << "key"; >>
+BOOL getValueForStringTableKey(char *table, char *key, char **val, int *size)
+{
+       int keyLength;
+       char *tableKey;
+
+       do
+       {
+               eatThru('\"',&table);
+               tableKey = table;
+               keyLength = strlen(key);
+               if (keyLength &&
+                   (stringLength(table,1) == keyLength) &&
+                   (keyncmp(key, table, keyLength) == 0))
+               {
+                       int c;
+                       
+                       /* found the key; now look for either
+                        * '=' or ';'
+                        */
+                       while (c = *table) {
+                           ++table;
+                           if (c == '\\') {
+                               ++table;
+                               continue;
+                           } else if (c == '=' || c == ';') {
+                               break;
+                           }
+                       }
+                       if (c == ';') {
+                           table = tableKey;
+                       } else {
+                           eatThru('\"',&table);
+                       }
+                       *val = table;
+                       *size = stringLength(table,0);
+                       return YES;
+               }
+
+               eatThru(';',&table);
+
+       } while (*table);
+
+       return NO;
+}
+
+
+/*
+ * Returns a new malloc'ed string if one is found
+ * in the string table matching 'key'.  Also translates
+ * \n escapes in the string.
+ */
+char *newStringForStringTableKey(
+       char *table,
+       char *key
+)
+{
+    char *val, *newstr, *p;
+    int size;
+    
+    if (getValueForStringTableKey(table, key, &val, &size)) {
+       newstr = malloc(size+1);
+       for (p = newstr; size; size--, p++, val++) {
+           if ((*p = *val) == '\\') {
+               switch (*++val) {
+               case 'r':
+                   *p = '\r';
+                   break;
+               case 'n':
+                   *p = '\n';
+                   break;
+               case 't':
+                   *p = '\t';
+                   break;
+               default:
+                   *p = *val;
+                   break;
+               }
+               size--;
+           }
+       }
+       *p = '\0';
+       return newstr;
+    } else {
+       return 0;
+    }
+}
+
+char *
+newStringForKey(char *key)
+{
+    char *val, *newstr;
+    int size;
+    
+    if (getValueForKey(key, &val, &size) && size) {
+       newstr = malloc(size + 1);
+       strncpy(newstr, val, size);
+       return newstr;
+    } else {
+       return 0;
+    }
+}
+
+/* parse a command line
+ * in the form: [<argument> ...]  [<option>=<value> ...]
+ * both <option> and <value> must be either composed of
+ * non-whitespace characters, or enclosed in quotes.
+ */
+
+static char *getToken(char *line, char **begin, int *len)
+{
+    if (*line == '\"') {
+       *begin = ++line;
+       while (*line && *line != '\"')
+           line++;
+       *len = line++ - *begin;
+    } else {
+       *begin = line;
+       while (*line && !isspace(*line) && *line != '=')
+           line++;
+       *len = line - *begin;
+    }
+    return line;
+}
+
+BOOL getValueForBootKey(char *line, char *match, char **matchval, int *len)
+{
+    char *key, *value;
+    int key_len, value_len;
+    
+    while (*line) {
+       /* look for keyword or argument */
+       while (isspace(*line)) line++;
+
+       /* now look for '=' or whitespace */
+       line = getToken(line, &key, &key_len);
+       /* line now points to '=' or space */
+       if (*line && !isspace(*line)) {
+           line = getToken(++line, &value, &value_len);
+       } else {
+           value = line;
+           value_len = 0;
+       }
+       if ((strlen(match) == key_len)
+           && strncmp(match, key, key_len) == 0) {
+           *matchval = value;
+           *len = value_len;
+           return YES;
+       }
+    }
+    return NO;
+}
+
+BOOL getBoolForKey(
+    char *key
+)
+{
+    char *val;
+    int size;
+    
+    if (getValueForKey(key, &val, &size) && (size >= 1) &&
+       val[0] == 'Y' || val[0] == 'y')
+           return YES;
+    return NO;
+}
+
+BOOL getIntForKey(
+    char *key,
+    int *value
+)
+{
+    char *val;
+    int size, sum;
+    
+    if (getValueForKey(key, &val, &size)) {
+       for (sum = 0; size > 0; size--) {
+           sum = (sum * 10) + (*val++ - '0');
+       }
+       *value = sum;
+       return YES;
+    }
+    return NO;
+}
+
+BOOL getValueForKey(
+    char *key,
+    char **val,
+    int *size
+)
+{
+    if (getValueForBootKey(kernBootStruct->bootString, key, val, size))
+       return YES;
+    else if (getValueForStringTableKey(kernBootStruct->config, key, val, size))
+       return YES;
+
+    return NO;
+}
+
+#if 0
+#define        LOCALIZABLE_PATH \
+       "%s/%s.config/%s.lproj/%s.strings"
+char *
+loadLocalizableStrings(
+    char *name,
+    char *tableName
+)
+{
+    char buf[256], *config;
+    register int count, fd = -1;
+    char *device_dir = usrDevices();
+    
+    sprintf(buf, LOCALIZABLE_PATH, device_dir, name,
+           Language, tableName);
+    if ((fd = open(buf, 0)) < 0) {
+       sprintf(buf, LOCALIZABLE_PATH, device_dir, name,
+                "English", tableName);
+       if ((fd = open(buf,0)) < 0) {
+           return 0;
+       }
+    }
+    count = file_size(fd);
+    config = malloc(count);
+    count = read(fd, config, count);
+    close(fd);
+    if (count <= 0) {
+       free(config);
+       return 0;
+    }
+    return config;
+}
+#endif
+
+#if 0 // XXX
+char *
+bundleLongName(
+    char *bundleName,
+    char *tableName
+)
+{
+    char *table, *name, *version, *newName;
+    char *path = malloc(256);
+    
+#define LONG_NAME_FORMAT "%s (v%s)"
+    sprintf(path, "%s/%s.config/%s.table",
+       usrDevices(), bundleName, tableName ? tableName : "Default");
+    if (loadConfigFile(path, &table, YES) == 0) {
+       version = newStringForStringTableKey(table, "Version");
+       free(table);
+    } else {
+       version = newString("0.0");
+    }
+    table = loadLocalizableStrings(bundleName,
+       tableName ? tableName : "Localizable");
+    if (table) {
+       name = newStringForStringTableKey(table, "Long Name");
+       free(table);
+    } else {
+       name = newString(bundleName);
+    }
+    newName = malloc(strlen(name)+strlen(version)+strlen(LONG_NAME_FORMAT));
+    sprintf(newName, LONG_NAME_FORMAT, name, version);
+    free(name); free(version);
+    return newName;
+}
+#endif
+
+int sysConfigValid;
+
+void
+addConfig(
+    char *config
+)
+{
+    char *configPtr = kernBootStruct->configEnd;
+    int len = strlen(config);
+    
+    if ((configPtr - kernBootStruct->config) > CONFIG_SIZE) {
+       error("No room in memory for config files\n");
+       return;
+    }
+    strcpy(configPtr, config);
+    configPtr += (len + 1);
+    *configPtr = 0;
+    kernBootStruct->configEnd = configPtr;
+}
+
+#define TABLE_EXPAND_SIZE      192
+
+/*
+ * Returns 0 if file loaded OK,
+ *        -1 if file was not loaded
+ * Does not print error messages.
+ * Returns pointer to table in memory in *table.
+ * Allocates an extra number of bytes for table expansion.
+ */
+int
+loadConfigFile( char *configFile, char **table, BOOL allocTable)
+{
+    char *configPtr = kernBootStruct->configEnd;
+    int fd, count;
+    
+    /* Read config file into memory */
+    if ((fd = open(configFile, 0)) >= 0)
+    {
+       if (allocTable) {
+           configPtr = malloc(file_size(fd)+2+TABLE_EXPAND_SIZE);
+       } else {
+           if ((configPtr - kernBootStruct->config) > CONFIG_SIZE) {
+               error("No room in memory for config files\n");
+               close(fd);
+               return -1;
+           }
+           verbose("Reading configuration file '%s'.\n",configFile);       
+       }
+       if (table) *table = configPtr;
+       count = read(fd, configPtr, IO_CONFIG_DATA_SIZE);
+       close(fd);
+
+       configPtr += count;
+       *configPtr++ = 0;
+       *configPtr = 0;
+       if (!allocTable)
+           kernBootStruct->configEnd = configPtr;
+
+       return 0;
+    } else {
+       return -1;
+    }
+}
+
+/* Returns 0 if requested config files were loaded,
+ *         1 if default files were loaded,
+ *        -1 if no files were loaded.
+ * Prints error message if files cannot be loaded.
+ */
+int
+loadConfigDir(
+    char *bundleName,  // bundle directory name (e.g. "System")
+    BOOL useDefault,   // use Default.table instead of instance tables
+    char **table,      // returns pointer to config table
+    BOOL allocTable    // malloc the table and return in *table
+)
+{
+    char *buf;
+    int i, max, ret;
+    char *device_dir = usrDevices();
+    
+    buf = malloc(256);
+    ret = 0;
+    
+    // load up to 99 instance tables
+    if (allocTable)
+       max = 1;
+    else
+       max = 99;
+    for (i=0; i < max; i++) {
+       sprintf(buf, "%s/%s.config/Instance%d.table",
+               device_dir,
+               bundleName, i);
+       if (useDefault || (loadConfigFile(buf, table, allocTable) != 0)) {
+           if (i == 0) {
+               // couldn't load first instance table;
+               // try the default table
+               sprintf(buf, "%s/%s.config/%s",
+                       device_dir,
+                       bundleName,
+                       IO_DEFAULT_TABLE_FILENAME);
+               if (loadConfigFile(buf, table, allocTable) == 0) {
+                   ret = 1;
+               } else {
+                   if (!allocTable)
+                       error("Config file \"%s\" not found\n", buf);
+                   ret = -1;
+               }
+           }
+           // we must be done.
+           break;
+       }
+    }
+    free(buf);
+    return ret;
+}
+
+
+#define USR_SYSTEM_CONFIG \
+       USR_DEVICES "/System.config"
+#define USR_SYSTEM_DEFAULT_FILE \
+       USR_SYSTEM_CONFIG "/Default.table"
+#define ARCH_SYSTEM_CONFIG \
+       ARCH_DEVICES "/System.config"
+#define ARCH_SYSTEM_DEFAULT_FILE \
+       ARCH_SYSTEM_CONFIG "/Default.table"
+#define SYSTEM_CONFIG "System"
+#define LP '('
+#define RP ')'
+
+static int sysconfig_dev;
+
+/* Returns 0 if requested config files were loaded,
+ *         1 if default files were loaded,
+ *        -1 if no files were loaded.
+ * Prints error message if files cannot be loaded.
+ */
+int
+loadSystemConfig(
+    char *which,
+    int size
+)
+{
+    char *buf, *bp, *cp;
+    int ret, len, doDefault=0;
+    char *device_dir = usrDevices();
+
+#if 0
+               printf("In Load system config which=%d ; size=%d\n", which, size);
+               //sleep(1);
+#endif 1
+    buf = bp = malloc(256);
+    if (which && size)
+    {
+#if 0
+               printf("In Load system config alt\n");
+               //sleep(1);
+#endif 1
+       for(cp = which, len = size; len && *cp && *cp != LP; cp++, len--) ;
+       if (*cp == LP) {
+           while (len-- && *cp && *cp++ != RP) ;
+           /* cp now points past device */
+           strncpy(buf,which,cp - which);
+           bp += cp - which;
+       } else {
+           cp = which;
+           len = size;
+       }
+       if (*cp != '/') {
+           strcpy(bp, device_dir);
+           strcat(bp, "/System.config/");
+           strncat(bp, cp, len);
+           if (strncmp(cp + len - strlen(IO_TABLE_EXTENSION),
+                      IO_TABLE_EXTENSION, strlen(IO_TABLE_EXTENSION)) != 0)
+               strcat(bp, IO_TABLE_EXTENSION);
+       } else {
+           strncpy(bp, cp, len);
+           bp[size] = '\0';
+       }
+       if ((strcmp(bp, USR_SYSTEM_DEFAULT_FILE) == 0) ||
+           (strcmp(bp, ARCH_SYSTEM_DEFAULT_FILE) == 0))
+           doDefault = 1;
+       ret = loadConfigFile(bp = buf, 0, 0);
+    } else {
+#if 0
+               printf("In default SYSTEM_CONFIG LOAD\n");
+               //sleep(1);
+#endif 1
+       ret = loadConfigDir((bp = SYSTEM_CONFIG), 0, 0, 0);
+#if 0
+               printf("come back from SYSTEM_CONFIG loadConfigDir\n");
+               //sleep(1);
+#endif 1
+   }
+    sysconfig_dev = currentdev();
+    if (ret < 0) {
+       error("System config file '%s' not found\n", bp);
+    } else
+       sysConfigValid = 1;
+    free(buf);
+    return (ret < 0 ? ret : doDefault);
+}
+
+#ifdef DISABLED
+int
+loadOtherConfigs(
+    int useDefault
+)
+{
+    char *val, *table;
+    char *path = malloc(256);
+    char *hintTable;
+    char *installVersion = NULL, *thisVersion;
+    char *longName, *tableName;
+    int count;
+    char *string;
+    int  ret;
+    int old_dev = currentdev();
+
+    if (sysconfig_dev)
+       switchdev(sysconfig_dev);
+    if (getValueForKey( "Boot Drivers", &val, &count))
+    {
+#if 0
+       printf("Loading Boot Drivers\n");
+       sleep(1);
+#endif 1
+       while (string = newStringFromList(&val, &count)) {
+           /* Check installation hints... */
+           sprintf(path, "%s/System.config/" INSTALL_HINTS
+                         "/%s.table", usrDevices(), string);
+
+           if (getBoolForKey("Ignore Hints") == NO &&
+                   loadConfigFile(path, &hintTable, YES) == 0) {
+               installVersion = newStringForStringTableKey(
+                   hintTable, "Version");
+               longName = newStringForStringTableKey(
+                   hintTable, "Long Name");
+               tableName = newStringForStringTableKey(
+                   hintTable, "Default Table");
+               free(hintTable);
+           } else {
+               installVersion = longName = tableName = NULL;
+           }
+
+           ret = loadConfigDir(string, useDefault, &table, YES);
+           if (ret >= 0) {
+               thisVersion = newStringForStringTableKey(
+                   table, "Version");
+               if (installVersion && thisVersion &&
+                   (strcmp(thisVersion, installVersion) != 0)) {
+                   /* Versions do not match */
+                   driverIsMissing(string, installVersion, longName, 
+                        tableName, DRIVER_VERSION_MISMATCH);
+               } else {
+                   struct driver_load_data dl;
+                   
+                   dl.name = string;
+                   if ((openDriverReloc(&dl)) >= 0) {
+                       verbose("Loading binary for %s device driver.\n",string);
+                       if (loadDriver(&dl) < 0) /// need to stop if error
+                           error("Error loading %s device driver.\n",string);
+#if 0
+               printf("Calling link driver for %s\n", string);
+#endif 1
+                       if (linkDriver(&dl) < 0)
+                           error("Error linking %s device Driver.\n",string);
+                   }
+                   loadConfigDir(string, useDefault, NULL, NO);
+                   driverWasLoaded(string, table, NULL);
+                   free(table);
+                   free(string);
+                   free(installVersion); free(longName);
+                   free(tableName);
+               }
+               free(thisVersion);
+           } else {
+                /* driver not found */
+               driverIsMissing(string, installVersion, longName, 
+                    tableName, DRIVER_NOT_FOUND);
+           }
+#if 0
+           if (ret == 1)
+               useDefault = 1; // use defaults from now on
+#endif
+       }
+    } else {
+       error("Warning: No Boot drivers specified in system config.\n");
+    }
+
+    kernBootStruct->first_addr0 =
+           (int)kernBootStruct->configEnd + 1024;
+    free(path);
+    switchdev(old_dev);
+    return 0;
+}
+#endif /* DISABLED */
diff --git a/i386/libsaio/sys.c b/i386/libsaio/sys.c
new file mode 100644 (file)
index 0000000..dbfe96b
--- /dev/null
@@ -0,0 +1,1376 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
+ * Reserved.  This file contains Original Code and/or Modifications of
+ * Original Code as defined in and that are subject to the Apple Public
+ * Source License Version 1.1 (the "License").  You may not use this file
+ * except in compliance with the License.  Please obtain a copy of the
+ * License at http://www.apple.com/publicsource and read it before using
+ * this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/* 
+ * Mach Operating System
+ * Copyright (c) 1990 Carnegie-Mellon University
+ * Copyright (c) 1989 Carnegie-Mellon University
+ * Copyright (c) 1988 Carnegie-Mellon University
+ * Copyright (c) 1987 Carnegie-Mellon University
+ * All rights reserved.  The CMU software License Agreement specifies
+ * the terms and conditions for use and redistribution.
+ *
+ */
+/*
+ * HISTORY
+ * Revision 2.3  88/08/08  13:47:07  rvb
+ * Allocate buffers dynamically vs statically.
+ * Now b[i] and i_fs and i_buf, are allocated dynamically.
+ * boot_calloc(size) allocates and zeros a  buffer rounded to a NPG
+ * boundary.
+ * Generalize boot spec to allow, xx()/mach, xx(n,[a..h])/mach,
+ * xx([a..h])/mach, ...
+ * Also default "xx" if unspecified and alloc just "/mach",
+ * where everything is defaulted
+ * Add routine, ptol(), to parse partition letters.
+ *
+ */
+/*
+ * Copyright (c) 1982, 1986 Regents of the University of California.
+ * All rights reserved.  The Berkeley software License Agreement
+ * specifies the terms and conditions for redistribution.
+ *
+ *     @(#)sys.c       7.1 (Berkeley) 6/5/86
+ */
+
+#include <sys/param.h>
+#include <ufs/ufs/dir.h>
+#include <sys/reboot.h>
+#include <architecture/byte_order.h>
+#include "ufs_byteorder.h"
+#include "libsaio.h"
+#include "cache.h"
+#include "kernBootStruct.h"
+#include "stringConstants.h"
+#include <ufs/ffs/fs.h>
+#include "nbp.h"
+#include "memory.h"
+
+char * gFilename;
+
+#ifdef DISABLED
+static char * deviceDirectory;
+#endif
+
+extern int ram_debug_sarld;            // in load.c
+
+#define DCACHE            1
+#define ICACHE            1
+#define SYS_MESSAGES      1
+#define CHECK_CAREFULLY   0
+#define COMPRESSION       1
+
+// #define DEBUG 1
+
+#ifdef DEBUG
+#define DPRINT(x)       { printf x; }
+#define DSPRINT(x)      { printf x; sleep(2); }
+#define RDPRINT(x)      { if (ram_debug_sarld) printf x; }
+#define RDSPRINT(x)     { if (ram_debug_sarld) printf x; sleep(2); }
+#else
+#define DPRINT(x)
+#define DSPRINT(x)
+#define RDPRINT(x)
+#define RDSPRINT(x)
+#endif
+
+char * devsw[] = {
+    "sd",
+    "hd",
+    "fd",
+    "en",
+    NULL
+};
+
+//#############################################################################
+//#
+//# Disk filesystem functions.
+//#
+//#############################################################################
+
+static ino_t dlook(char *s, struct iob *io);
+static char * xx(char *str, struct iob *file);
+static int ffs(register long mask);
+
+extern int label_secsize;
+
+#define BIG_ENDIAN_INTEL_FS __LITTLE_ENDIAN__
+
+#if ICACHE
+#define ICACHE_SIZE       256
+#define ICACHE_READAHEAD  8    // read behind and read ahead
+static cache_t * icache;
+#endif ICACHE
+
+#if DCACHE
+#define DCACHE_SIZE       16   // 1k (DIRBLKSIZ) blocks
+static cache_t * dcache;
+#endif
+
+#define        DEV_BSIZE         label_secsize
+
+#if CHECK_CAREFULLY
+static int open_init;
+#endif
+
+static struct fs * fs_block;
+static int         fs_block_valid;
+
+#define SUPERBLOCK_ERROR  "Bad superblock: error %d\n"
+
+/*==========================================================================
+ *
+ *
+ */
+static struct iob * iob_from_fdesc(int fdesc)
+{
+    register struct iob * file;
+    
+    if (fdesc < 0 || fdesc >= NFILES ||
+        ((file = &iob[fdesc])->i_flgs & F_ALLOC) == 0)
+           return NULL;
+    else
+           return file;
+}
+
+
+/***************************************************************************
+ *
+ * Disk functions.
+ *
+ ***************************************************************************/
+
+/*==========================================================================
+ *
+ *
+ */
+static int
+openi(int n, struct iob * io)
+{
+       struct dinode * dp;
+       int    cc, i, j, n_round;
+
+#if ICACHE
+       struct dinode *ip;
+       
+       if (icache == 0) {
+           icache = cacheInit(ICACHE_SIZE, sizeof(struct dinode));
+       }
+#endif /* ICACHE */
+
+       io->i_offset = 0;
+       io->i_bn = fsbtodb(io->i_ffs, ino_to_fsba(io->i_ffs, n)) + io->i_boff;
+       io->i_cc = io->i_ffs->fs_bsize;
+       io->i_ma = io->i_buf;
+
+#if ICACHE
+       if (cacheFind(icache, n, 0, (char **)&ip) == 1) {
+               io->i_ino.i_din = *ip;
+               cc = 0;
+       } else {
+#endif ICACHE
+        cc = devread(io);
+           dp = (struct dinode *)io->i_buf;
+           n_round = (n / INOPB(io->i_ffs)) * INOPB(io->i_ffs);
+#if ICACHE
+           /* Read multiple inodes into cache */
+        for (i = max(ino_to_fsbo(io->i_ffs, n) - ICACHE_READAHEAD, 0),
+             j = min(i+2*ICACHE_READAHEAD, INOPB(io->i_ffs)); i < j; i++) {
+            cacheFind(icache, n_round + i, 0, (char **)&ip);
+
+#if    BIG_ENDIAN_INTEL_FS
+#warning Building with Big Endian changes
+            byte_swap_dinode_in(&dp[i]);
+#endif /* BIG_ENDIAN_INTEL_FS */
+
+            *ip = dp[i];
+            if (i == ino_to_fsbo(io->i_ffs, n)) {
+                io->i_ino.i_din = *ip;
+            }
+           }
+       }
+#else ICACHE
+
+#if     BIG_ENDIAN_INTEL_FS
+    byte_swap_dinode_in(&dp[ino_to_fsbo(io->i_ffs, n)]);
+#endif  /* BIG_ENDIAN_INTEL_FS */
+
+    io->i_ino.i_din = dp[ino_to_fsbo(io->i_ffs, n)];
+#endif ICACHE
+       
+    io->i_ino.i_number = n;
+       return (cc);
+}
+
+/*==========================================================================
+ *
+ *
+ */
+static int
+readlink(struct iob * io, char * buf, int len)
+{
+       register struct inode * ip;
+       
+       ip = &io->i_ino;
+#if 1
+    /* read contents */
+    io->i_offset = 0;
+    io->i_cc = 0;
+    io->i_flgs |= F_FILE;
+    if (read(io - iob, buf, len) < 0)
+        return -1;
+#else    
+       if (ip->i_icflags & IC_FASTLINK) {
+          if (ip->i_size > len)
+           return -1;
+           bcopy(ip->i_symlink, buf, ip->i_size);
+       } else {
+           /* read contents */
+           io->i_offset = 0;
+           io->i_cc = 0;
+           io->i_flgs |= F_FILE;
+           if (read(io - iob, buf, len) < 0)
+               return -1;
+       }
+#endif
+       return 0;
+}
+
+/*==========================================================================
+ *
+ *
+ */
+static int
+find(char * path, struct iob * file)
+{
+       char * q;
+       char   c;
+       int    n, parent;
+       char * lbuf = malloc(MAXPATHLEN + 1);
+       int    ret;
+
+#if    CHECK_CAREFULLY
+       if (path==NULL || *path=='\0') {
+               error("null path\n");
+               ret = 0; goto out;
+       }
+#endif CHECK_CAREFULLY
+
+    DSPRINT(("in find: path=%s\n", path));
+
+root:
+       n = ROOTINO;
+       if (openi(n, file) < 0)
+       {
+        DPRINT(("openi failed\n"));
+
+#if    SYS_MESSAGES
+               error("bad root inode\n");
+#endif
+
+               ret = 0; goto out;
+       }
+    DPRINT(("openi ok\n"));
+
+       while (*path)
+       {
+               while (*path == '/')
+                       path++;
+               q = path;
+               while(*q != '/' && *q != '\0')
+                       q++;
+               c = *q;
+               *q = '\0';
+               if (q == path) path = "." ;     /* "/" means "/." */
+
+               parent = n;
+               if ((n = dlook(path, file)) != 0)
+               {
+                       if (c == '\0')
+                               break;
+                       if (openi(n, file) < 0)
+                       {
+                               *q = c;
+                               ret = 0; goto out;
+                       }
+                       *q = c;
+                       path = q;
+
+                       /* Check for symlinks */
+                       if (file->i_ino.i_mode & IFLNK) {
+                           char *buf = malloc(MAXPATHLEN + 1);
+                           if (readlink(file, buf, MAXPATHLEN + 1) < 0)
+                               return -1;
+                           strcat(buf, q);
+                           strcpy(lbuf, buf);
+                           free(buf);
+                           path = lbuf;
+                           if (*path == '/')
+                               goto root;
+                           if (openi(parent, file) < 0) {
+                               ret = 0; goto out;
+                           }
+                       }
+                       continue;
+               }
+               else
+               {
+                       *q = c;
+                       ret = 0; goto out;
+               }
+       }
+       ret = n;
+out:
+       free(lbuf);
+       return (ret);
+}
+
+/*==========================================================================
+ *
+ *
+ */
+static daddr_t
+sbmap(struct iob * io, daddr_t bn)
+{
+       register struct inode * ip;
+       int     i, j, sh;
+       daddr_t nb, * bap;
+
+       ip = &io->i_ino;
+
+       if (bn < 0) {
+#if    SYS_MESSAGES
+               error("bn negative\n");
+#endif
+               return ((daddr_t)0);
+       }
+
+       /*
+        * blocks 0..NDADDR are direct blocks
+        */
+       if (bn < NDADDR)
+       {
+               nb = ip->i_db[bn];
+               return (nb);
+       }
+
+       /*
+        * addresses NIADDR have single and double indirect blocks.
+        * the first step is to determine how many levels of indirection.
+        */
+    RDPRINT(("In NINADDR\n"));
+
+       sh = 1;
+       bn -= NDADDR;
+       for (j = NIADDR; j > 0; j--) {
+               sh *= NINDIR(io->i_ffs);
+               if (bn < sh)
+                       break;
+               bn -= sh;
+       }
+
+       if (j == 0) {
+#if    SYS_MESSAGES
+               error("bn ovf %d\n", bn);
+#endif
+               return ((daddr_t)0);
+       }
+
+       /*
+        * fetch the first indirect block address from the inode
+        */
+       nb = ip->i_ib[NIADDR - j];
+       if (nb == 0) {
+#if    SYS_MESSAGES
+               error("bn void %d\n",bn);
+#endif
+               return ((daddr_t)0);
+       }
+
+       /*
+        * fetch through the indirect blocks
+        */
+       for (; j <= NIADDR; j++) {
+               if (blknos[j] != nb) {
+                       io->i_bn = fsbtodb(io->i_ffs, nb) + io->i_boff;
+                       if (b[j] == (char *)0)
+                               b[j] = malloc(MAXBSIZE);
+                       io->i_ma = b[j];
+                       io->i_cc = io->i_ffs->fs_bsize;
+
+            RDPRINT(("Indir block read\n"));
+
+                       if (devread(io) != io->i_ffs->fs_bsize) {
+#if    SYS_MESSAGES
+                               error("bn %d: read error\n", io->i_bn);
+#endif
+                               return ((daddr_t)0);
+                       }
+                       blknos[j] = nb;
+               }
+               bap = (daddr_t *)b[j];
+               sh /= NINDIR(io->i_ffs);
+               i = (bn / sh) % NINDIR(io->i_ffs);
+#if    BIG_ENDIAN_INTEL_FS
+               nb = NXSwapBigLongToHost(bap[i]);
+#else  /* BIG_ENDIAN_INTEL_FS */
+               nb = bap[i];
+#endif /* BIG_ENDIAN_INTEL_FS */
+               if (nb == 0) {
+#if    SYS_MESSAGES
+                       error("bn void %d\n",bn);
+#endif
+                       return ((daddr_t)0);
+               }
+       }
+
+       return (nb);
+}
+
+#ifdef DISABLED
+/*==========================================================================
+ *
+ *
+ */
+static struct dirstuff *
+disk_opendir(char * path)
+{
+    register struct dirstuff * dirp;
+    register int fd;
+    
+    dirp = (struct dirstuff *)malloc(sizeof(struct dirstuff));
+    if (dirp == (struct dirstuff *)-1)
+        return 0;
+
+    DPRINT(("Calling open in opendir\n"));
+    fd = open(path,0);
+    if (fd == -1) {
+        DPRINT(("open failed \n"));
+        free((void *)dirp);
+        return 0;
+    }
+
+    DPRINT(("open ok fd is %d \n", fd));
+    dirp->io = &iob[fd];
+    dirp->loc = 0;
+    iob[fd].dirbuf_blkno = -1;
+
+    return dirp;
+}
+
+/*==========================================================================
+ *
+ *
+ */
+static int
+disk_closedir(struct dirstuff * dirp)
+{
+    close(dirp->io - iob);
+    free((void *)dirp);
+    return 0;
+}
+#endif /* DISABLED */
+
+/*==========================================================================
+ * get next entry in a directory.
+ */
+static struct direct *
+disk_readdir(struct dirstuff * dirp)
+{
+       struct direct *       dp;
+       register struct iob * io;
+       daddr_t               lbn, d;
+       int                   off;
+#if DCACHE
+       char *                bp;
+       int                   dirblkno;
+
+       if (dcache == 0)
+               dcache = cacheInit(DCACHE_SIZE, DIRBLKSIZ);
+#endif DCACHE
+
+       io = dirp->io;
+       for(;;)
+       {
+               if (dirp->loc >= io->i_ino.i_size)
+                       return (NULL);
+               off = blkoff(io->i_ffs, dirp->loc);
+               lbn = lblkno(io->i_ffs, dirp->loc);
+
+#if DCACHE
+               dirblkno = dirp->loc / DIRBLKSIZ;
+               if (cacheFind(dcache, io->i_ino.i_number, dirblkno, &bp)) {
+                   dp = (struct direct *)(bp + (dirp->loc % DIRBLKSIZ));
+               } else
+#else DCACHE
+               if (io->dirbuf_blkno != lbn)
+#endif DCACHE
+               {
+                   if((d = sbmap(io, lbn)) == 0)
+                           return NULL;
+                   io->i_bn = fsbtodb(io->i_ffs, d) + io->i_boff;
+                   io->i_ma = io->i_buf;
+                   io->i_cc = blksize(io->i_ffs, &io->i_ino, lbn);
+               
+                   if (devread(io) < 0)
+                   {
+#if    SYS_MESSAGES
+                           error("bn %d: directory read error\n", io->i_bn);
+#endif
+                           return (NULL);
+                   }
+#if    BIG_ENDIAN_INTEL_FS
+                   byte_swap_dir_block_in(io->i_buf, io->i_cc);
+#endif /* BIG_ENDIAN_INTEL_FS */
+
+#if DCACHE
+                   bcopy(io->i_buf + dirblkno * DIRBLKSIZ, bp, DIRBLKSIZ);
+                   dp = (struct direct *)(io->i_buf + off);
+#endif
+               }
+#if !DCACHE
+               dp = (struct direct *)(io->i_buf + off);
+#endif
+               dirp->loc += dp->d_reclen;
+
+               if (dp->d_ino != 0) return (dp);
+       }
+}
+
+/*==========================================================================
+ *
+ *
+ */
+static ino_t
+dlook(
+       char *       s,
+       struct iob * io
+)
+{
+       struct direct *         dp;
+       register struct inode * ip;
+       struct dirstuff         dirp;
+       int                     len;
+
+       if (s == NULL || *s == '\0')
+               return (0);
+       ip = &io->i_ino;
+       if ((ip->i_mode & IFMT) != IFDIR) {
+#if    SYS_MESSAGES
+               error(". before %s not a dir\n", s);
+#endif
+               return (0);
+       }
+       if (ip->i_size == 0) {
+#if    SYS_MESSAGES
+               error("%s: 0 length dir\n", s);
+#endif
+               return (0);
+       }
+       len = strlen(s);
+       dirp.loc = 0;
+       dirp.io = io;
+       io->dirbuf_blkno = -1;
+
+       for (dp = disk_readdir(&dirp); dp != NULL; dp = disk_readdir(&dirp)) {
+        DPRINT(("checking name %s\n", dp->d_name));
+               if(dp->d_ino == 0)
+                       continue;
+               if (dp->d_namlen == len && !strcmp(s, dp->d_name))
+                       return (dp->d_ino);
+       }
+       return (0);
+}
+
+/*==========================================================================
+ *
+ *
+ */
+static int
+getch(int fdesc)
+{
+       register struct iob * io;
+       struct fs *           fs;
+       char *                p;
+       int                   c, lbn, off, size, diff;
+
+       if ((io = iob_from_fdesc(fdesc)) == 0) {
+               return (-1);
+       }
+
+    RDPRINT(("In getch\n"));
+
+    p = io->i_ma;
+       if (io->i_cc <= 0) {
+               if ((io->i_flgs & F_FILE) != 0) {
+                       diff = io->i_ino.i_size - io->i_offset;
+                       if (diff <= 0)
+                               return (-1);
+                       fs = io->i_ffs;
+                       lbn = lblkno(fs, io->i_offset);
+#if 1
+                       io->i_bn = fsbtodb(fs, sbmap(io, lbn)) + io->i_boff;
+#else
+                       io->i_bn = fsbtodb(fs, sbmap(io, lbn)) + io->i_boff;
+#endif
+                       off = blkoff(fs, io->i_offset);
+                       size = blksize(fs, &io->i_ino, lbn);
+               } else {
+                       diff = 0;
+#ifndef        SMALL
+                       io->i_bn = io->i_offset / DEV_BSIZE;
+                       off = 0;
+                       size = DEV_BSIZE;
+#endif SMALL
+               }
+
+        RDPRINT(("gc: bn=%x; off=%x\n",io->i_bn, io->i_offset));
+       
+        io->i_ma = io->i_buf;
+               io->i_cc = size;
+               if (devread(io) < 0) {
+                       return (-1);
+               }
+               if ((io->i_flgs & F_FILE) != 0) {
+                       if (io->i_offset - off + size >= io->i_ino.i_size)
+                               io->i_cc = diff + off;
+                       io->i_cc -= off;
+               }
+               p = &io->i_buf[off];
+       }
+       io->i_cc--;
+       io->i_offset++;
+       c = (unsigned)*p++;
+       io->i_ma = p;
+       return (c);
+}
+
+/*==========================================================================
+ *
+ */
+static int
+disk_read(int fdesc, char * buf, int count)
+{
+       int                   i, size;
+       register struct iob * file;
+       struct fs *           fs;
+       int                   lbn, off;
+
+    RDSPRINT(("IN READ\n"));
+
+       if ((file = iob_from_fdesc(fdesc)) == 0) {
+               return (-1);
+       }
+#if CHECK_CAREFULLY
+       if ((file->i_flgs&F_READ) == 0) {
+               return (-1);
+       }
+#endif
+       if ((file->i_flgs & F_MEM) != 0) {
+
+        RDSPRINT(("In read FMEM\n"));
+
+           if (file->i_offset < file->i_boff) {
+            if (count > (file->i_boff - file->i_offset))
+                count = file->i_boff - file->i_offset;
+            bcopy(file->i_buf + file->i_offset, buf, count);
+            file->i_offset += count;
+           } else {
+            count = 0;
+           }
+           return count;
+       }
+       
+#ifndef        SMALL
+       if ((file->i_flgs & F_FILE) == 0) {
+               file->i_cc = count;
+               file->i_ma = buf;
+               file->i_bn = file->i_boff + (file->i_offset / DEV_BSIZE);
+
+        RDPRINT(("In read nsmall fbn=%x; offset=%x;", file->i_bn,
+                 file->i_offset));
+        RDSPRINT(("boff=%x\n", file->i_boff));
+
+               i = devread(file);
+               file->i_offset += count;
+               return (i);
+       }
+#endif /* SMALL */
+
+       if (file->i_offset+count > file->i_ino.i_size)
+               count = file->i_ino.i_size - file->i_offset;
+
+    RDSPRINT(("In read nsmall count=%x;", count));
+
+    if ((i = count) <= 0)
+        return (0);
+
+       /*
+        * While reading full blocks, do I/O into user buffer.
+        * Anything else uses getc().
+        */
+       fs = file->i_ffs;
+       while (i) {
+        RDSPRINT(("In lread while\n"));
+               off = blkoff(fs, file->i_offset);
+               lbn = lblkno(fs, file->i_offset);
+               size = blksize(fs, &file->i_ino, lbn);
+               if (off == 0 && size <= i) {
+                       file->i_bn = fsbtodb(fs, sbmap(file, lbn)) +
+                           file->i_boff;
+                       file->i_cc = size;
+                       file->i_ma = buf;
+
+            RDPRINT(("In read->devread\n"));
+            RDPRINT(("In read fbn=%x; offset=%x;", file->i_bn,
+                     file->i_offset));
+            RDSPRINT((" boff=%x\n", file->i_boff));
+
+            if (devread(file) < 0) {
+                return (-1);
+            }
+            file->i_offset += size;
+            file->i_cc = 0;
+            buf += size;
+            i -= size;
+               }
+        else {
+            RDSPRINT(("IN while nonread\n"));
+                       size -= off;
+                       if (size > i)
+                               size = i;
+                       i -= size;
+                       do {
+                               *buf++ = getch(fdesc);
+                       } while (--size);
+               }
+       }
+
+       return (count);
+}
+
+/*==========================================================================
+ * Disk (block device) functions.
+ */
+static BOOL
+disk_open(char * name, struct iob * file, int how)
+{
+       int    i;
+
+       file->i_cc = SBSIZE;
+//     file->i_bn = (SBLOCK / DEV_BSIZE) + file->i_boff;
+       file->i_bn = (SBOFF/label_secsize) + file->i_boff;
+       file->i_offset = 0;
+
+       if (file->i_ffs == 0) {
+               if (fs_block == 0) {
+            DPRINT(("No super block; reading one \n"));
+                   fs_block = (struct fs *) malloc(SBSIZE);
+               }
+               if (fs_block_valid == 0) {
+                   file->i_ma = (char *)fs_block;
+                   if (devread(file) < 0) {
+#ifndef SMALL
+                           error(SUPERBLOCK_ERROR, 1);
+#endif
+                           return NO;
+                   }
+#if    BIG_ENDIAN_INTEL_FS
+                   byte_swap_superblock(fs_block);
+#endif /* BIG_ENDIAN_INTEL_FS */
+            DPRINT(("Read SB \n"));
+                   fs_block_valid = 1;
+               }
+               file->i_ffs = fs_block;
+               file->i_buf = malloc(MAXBSIZE);
+       }
+#if    BIG_ENDIAN_INTEL_FS
+    DPRINT(("IN BE_FS code \n"));
+
+       if (file->i_ffs->fs_magic != FS_MAGIC) {
+        DPRINT(("Bad magic in FS %d ; got %d\n", FS_MAGIC,
+                file->i_ffs->fs_magic));
+               error(SUPERBLOCK_ERROR, 2);
+               return NO;
+       }
+       /*
+        *  The following is a gross hack to boot disks that have an actual
+        *  blocksize of 512 bytes but were written with a theoretical 1024
+        *  byte blocksize (fsbtodb == 0).
+        *
+        *  We can make this assumption because we can only boot disks with
+        *  a 512 byte sector size.
+        */
+    DPRINT(("SB  magic ok \n"));
+       if (file->i_ffs->fs_fsize == 0) {
+               error(SUPERBLOCK_ERROR,3);
+               return NO;
+       }
+       file->i_ffs->fs_fsbtodb = ffs(file->i_ffs->fs_fsize / DEV_BSIZE) - 1;
+#endif /* BIG_ENDIAN_INTEL_FS */
+
+       if ((i = find(name, file)) == 0) {
+        DPRINT(("find() failed\n"));
+               return NO;
+       }
+
+#if    CHECK_CAREFULLY
+       if (how != 0) {
+               error("Can't write files\n");
+               return NO;
+       }
+#endif CHECK_CAREFULLY
+
+    DPRINT(("calling openi \n"));
+       if (openi(i, file) < 0) {
+        DPRINT(("openi failed \n"));
+               return NO;
+       }
+
+    DPRINT(("openi ok \n"));
+
+       file->i_offset = 0;
+       file->i_cc = 0;
+       file->i_flgs |= F_FILE | (how+1);
+
+       return YES;
+}
+
+/*==========================================================================
+ *
+ *
+ */
+static int
+ffs(register long mask)
+{
+       register int cnt;
+
+       if (mask == 0) return(0);
+
+       for (cnt = 1; !(mask & 1); cnt++)
+               mask >>= 1;
+       return(cnt);
+}
+
+/*==========================================================================
+ *
+ *
+ */
+static void
+disk_flushdev()
+{
+    register int i;
+    
+    devflush();
+    for (i = 0; i < NFILES; i++)
+        if (iob[i].i_flgs & (F_READ | F_WRITE))
+            error("flushdev: fd %d is open\n",i);
+
+    fs_block_valid = 0;
+#if ICACHE
+    cacheFlush(icache);
+#endif
+#if DCACHE
+    cacheFlush(dcache);
+#endif
+
+#ifdef DISABLED
+    deviceDirectory = NULL;
+#endif /* DISABLED */
+}
+
+
+/***************************************************************************
+ *
+ * Network functions.
+ *
+ ***************************************************************************/
+
+static int
+en_read(int fdesc, char * buf, int count)
+{
+       struct iob * file;
+
+       if ((file = iob_from_fdesc(fdesc)) == 0)
+               return (-1);
+       
+       DSPRINT(("read[%d]: %x %x %d\n",
+               fdesc, TFTP_ADDR + file->i_offset, (unsigned) buf, count)); 
+
+       bcopy((char *)(TFTP_ADDR + file->i_offset), buf, count);
+       file->i_offset += count;
+
+       return count;
+}
+static BOOL
+en_open(char * name, struct iob * file, int how)
+{
+       unsigned long  txferSize = TFTP_LEN;
+       
+       if (nbpTFTPReadFile(name, &txferSize, TFTP_ADDR) != nbpStatusSuccess)
+               return NO;
+
+       file->i_buf        = NULL;
+       file->i_offset     = 0;
+       file->i_ino.i_size = txferSize;         // update the real size
+
+       return YES;
+}
+
+static void
+en_devopen(char * name, struct iob * io)
+{
+       io->i_error = 0;
+}
+
+
+/***************************************************************************
+ *
+ * Dispatch functions.
+ *
+ ***************************************************************************/
+
+/*==========================================================================
+ *
+ */
+static int
+gen_read(int fdesc, char * buf, int count)
+{
+       struct iob * file;
+       
+       if ((file = iob_from_fdesc(fdesc)) == 0)
+               return (-1);
+       
+       return (file->i_ino.i_dev == DEV_EN) ?
+               en_read(fdesc, buf, count) :
+               disk_read(fdesc, buf, count);
+}
+
+/*==========================================================================
+ *
+ */
+static int
+gen_open(char * name, struct iob * file, int how)
+{
+       return (file->i_ino.i_dev == DEV_EN) ?
+               en_open(name, file, how) : disk_open(name, file, how);
+}
+
+/*==========================================================================
+ *
+ */
+static void
+gen_devopen(char * name, struct iob * io)
+{
+       return (io->i_ino.i_dev == DEV_EN) ?
+               en_devopen(name, io) : devopen(name, io);
+}
+
+/*==========================================================================
+ *
+ */
+static void
+gen_flushdev()
+{
+       return disk_flushdev();
+}
+
+/*==========================================================================
+ *
+ */
+static char *
+gen_usrDevices()
+{
+#define NET_ARCH_DEVICES ""
+
+       return (((currentdev() >> B_TYPESHIFT) & B_TYPEMASK) == DEV_EN) ?
+               NET_ARCH_DEVICES : ARCH_DEVICES;
+}
+
+/***************************************************************************
+ *
+ * External functions.
+ *
+ ***************************************************************************/
+
+/*==========================================================================
+ *
+ */
+struct dirstuff *
+opendir(char * path)
+{
+       error("Unsupported function: opendir\n");
+       return 0;
+}
+
+/*==========================================================================
+ *
+ */
+int
+closedir(struct dirstuff * dirp)
+{
+       error("Unsupported function: closedir\n");
+       return 0;
+}
+
+/*==========================================================================
+ * get next entry in a directory.
+ */
+struct direct *
+readdir(struct dirstuff * dirp)
+{
+       error("Unsupported function: readdir\n");
+       return NULL;
+}
+
+/*==========================================================================
+ *
+ */
+int
+b_lseek(int fdesc, unsigned int addr, int ptr)
+{
+       register struct iob * io;
+
+    RDPRINT(("In lseek addr= %x\n", addr));
+
+#if    CHECK_CAREFULLY
+       if (ptr != 0) {
+               error("Seek not from beginning of file\n");
+               return (-1);
+       }
+#endif /* CHECK_CAREFULLY */
+
+       if ((io = iob_from_fdesc(fdesc)) == 0) {
+               return (-1);
+       }
+       io->i_offset = addr;
+       io->i_bn = addr / DEV_BSIZE;
+       io->i_cc = 0;
+
+    RDPRINT(("In end of lseek offset %x; bn %x\n", io->i_offset,io->i_bn));
+
+       return (0);
+}
+
+/*==========================================================================
+ *
+ */
+int
+tell(int fdesc)
+{
+       return iob[fdesc].i_offset;
+}
+
+/*==========================================================================
+ *
+ */
+int
+read(int fdesc, char * buf, int count)
+{
+       return gen_read(fdesc, buf, count);
+}
+
+/*==========================================================================
+ *
+ */
+int
+openmem(char * buf, int len)
+{
+       register struct iob * file;
+       int                   fdesc;
+
+       for (fdesc = 0; fdesc < NFILES; fdesc++)
+               if (iob[fdesc].i_flgs == 0)
+                       goto gotfile;
+       stop("Out of file descriptor slots");
+
+gotfile:
+       (file = &iob[fdesc])->i_flgs |= F_ALLOC;
+       file->i_buf = buf;
+       file->i_boff = len;
+       file->i_offset = 0;
+       file->i_flgs |= F_MEM;
+       return fdesc;
+}
+
+/*==========================================================================
+ * Generic open call.
+ */
+int
+open(char * str, int how)
+{
+       register char *       cp;
+       register struct iob * file;
+       int                   fdesc;
+
+    DSPRINT(("In open %s\n", str));
+
+#if CHECK_CAREFULLY    /* iob[] is in BSS, so it is guaranteed to be zero. */
+       if (open_init == 0) {
+               for (i = 0; i < NFILES; i++)
+                       iob[i].i_flgs = 0;
+               open_init = 1;
+       }
+#endif
+
+       for (fdesc = 0; fdesc < NFILES; fdesc++)
+               if (iob[fdesc].i_flgs == 0)
+                       goto gotfile;
+       stop("Out of file descriptor slots");
+
+gotfile:
+       (file = &iob[fdesc])->i_flgs |= F_ALLOC;
+
+       if ((cp = xx(str, file)) == (char *) -1)
+       {
+               close(fdesc);
+               return -1;
+       }
+
+       if (*cp == '\0') {
+               file->i_flgs |= how+1;
+               file->i_cc = 0;
+               file->i_offset = 0;
+               return (fdesc);
+       }
+       
+       if (gen_open(cp, file, how) == NO) {
+               close(fdesc);
+               return -1;
+       }
+       return (fdesc);
+}
+
+/*==========================================================================
+ *
+ */
+#define LP '('
+#define RP ')'
+
+static char * xx(char *str, struct iob *file)
+{
+       register char *cp = str, *xp;
+       char ** dp;
+       int old_dev = kernBootStruct->kernDev;
+       int dev  = (kernBootStruct->kernDev >> B_TYPESHIFT) & B_TYPEMASK;
+       int unit = (kernBootStruct->kernDev >> B_UNITSHIFT) & B_UNITMASK;
+       int part = (kernBootStruct->kernDev >> B_PARTITIONSHIFT) & B_PARTITIONMASK;
+       int i;
+       int no_dev;
+       int biosOffset;
+
+       biosOffset = unit;              // set the device
+
+       for (; *cp && *cp != LP; cp++) ;
+       if (no_dev = !*cp) {    // no left paren found
+               cp = str;
+               xp = devsw[dev];
+       } else if (cp == str) { // paren but no device
+               cp++;
+               xp = devsw[dev];
+       } else {
+               xp = str;
+               cp++;
+       }
+
+       for (dp = devsw; *dp; dp++)
+       {
+               if ((xp[0] == *dp[0]) && (xp[1] == *(dp[0] + 1)))
+                       goto gotdev;
+       }
+
+       error("Unknown device '%c%c'\n",xp[0],xp[1]);
+       return ((char *)-1);
+
+gotdev:
+       if (no_dev)
+               goto none;
+       i = 0;
+       while (*cp >= '0' && *cp <= '9')
+       {
+               i = i * 10 + *cp++ - '0';
+        unit = i;           // get the specified unit number
+       }
+
+       biosOffset = unit;              // set the device
+
+       if (*cp == RP || no_dev)
+               /* do nothing since ptol(")") returns 0 */ ;
+       else if (*cp == ',')
+        part = ptol(++cp);  // get the specified partition number
+       else if (cp[-1] == LP) 
+               part = ptol(cp);
+       else {
+badoff:
+               error("Missing offset specification\n");
+               return ((char *)-1);
+       }
+
+       for ( ;!no_dev ;) {     // skip after the right paren
+               if (*cp == RP)
+                       break;
+               if (*cp++)
+                       continue;
+               goto badoff;
+       }
+
+none:
+       file->i_ino.i_dev = dev = dp - devsw;
+       file->partition   = part;
+       file->biosdev     = (BIOSDEV(dev)) + biosOffset;
+
+       if (dev == DEV_SD) {
+               file->biosdev += kernBootStruct->numIDEs;
+       }
+    else if (dev == DEV_EN) {
+        file->biosdev = BIOS_DEV_EN;
+    }
+    else if (dev == DEV_HD && kernBootStruct->numIDEs == 0) {
+               error("No IDE drives detected\n");
+               return ((char *)-1);
+       }
+
+       kernBootStruct->kernDev = (dev << B_TYPESHIFT) | 
+                              (unit << B_UNITSHIFT) |
+                              (part << B_PARTITIONSHIFT);
+
+       if (kernBootStruct->kernDev != old_dev)
+           flushdev();
+
+       gen_devopen(str, file);
+
+       if (file->i_error) 
+               return (char *)-1;
+       if (!no_dev && *cp) cp++;
+
+       gFilename = cp;
+
+       return cp;
+}
+
+/*==========================================================================
+ *
+ */
+int
+close(int fdesc)
+{
+       register struct iob * file;
+       register int          i;
+
+       if ((file = iob_from_fdesc(fdesc)) == 0)
+               return (-1);
+
+       if ((file->i_flgs & F_MEM) == 0) {
+//             free((char *)file->i_ffs);
+           file->i_ffs = NULL;
+           if (file->i_buf) {
+                       free(file->i_buf);
+                       file->i_buf = NULL;
+               }
+           for (i=0;i<NBUFS;i++)
+           {
+                   if (b[i])
+                   {   free(b[i]); 
+                           b[i] = NULL;
+                   }
+                   blknos[i] = 0;
+           }
+       }
+
+       file->i_flgs = 0;
+       return (0);
+}
+
+/*==========================================================================
+ *
+ */
+int
+file_size(int fdesc)
+{
+       register struct iob * io;
+    
+       if ((io = iob_from_fdesc(fdesc)) == 0)
+               return (-1);
+
+       return io->i_ino.i_size;
+}
+
+/*==========================================================================
+ * ensure that all device caches are flushed,
+ * because we are about to change the device media
+ */
+void
+flushdev()
+{
+       gen_flushdev();
+}
+
+/*==========================================================================
+ *
+ */
+void
+stop(char * s)
+{
+#if    CHECK_CAREFULLY
+       register int i;
+       
+       for (i = 0; i < NFILES; i++)
+               if (iob[i].i_flgs != 0)
+                       close(i);
+#endif CHECK_CAREFULLY
+
+    /* textMode(); */    // can't call this function from here
+       error("\n%s\n", s);
+       sleep(4);            // about to halt
+       halt();
+}
+
+/*==========================================================================
+ *
+ */
+int currentdev()
+{
+    return kernBootStruct->kernDev;
+}
+
+/*==========================================================================
+ *
+ */
+int
+switchdev(int dev)
+{
+    flushdev();
+    kernBootStruct->kernDev = dev;
+    return dev;
+}
+
+/*==========================================================================
+ *
+ */
+char *
+usrDevices()
+{
+       return gen_usrDevices();
+}
diff --git a/i386/libsaio/table.c b/i386/libsaio/table.c
new file mode 100644 (file)
index 0000000..aa5c40e
--- /dev/null
@@ -0,0 +1,86 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
+ * Reserved.  This file contains Original Code and/or Modifications of
+ * Original Code as defined in and that are subject to the Apple Public
+ * Source License Version 1.1 (the "License").  You may not use this file
+ * except in compliance with the License.  Please obtain a copy of the
+ * License at http://www.apple.com/publicsource and read it before using
+ * this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/* 
+ * Mach Operating System
+ * Copyright (c) 1990 Carnegie-Mellon University
+ * Copyright (c) 1989 Carnegie-Mellon University
+ * All rights reserved.  The CMU software License Agreement specifies
+ * the terms and conditions for use and redistribution.
+ */
+
+/*
+ *                     INTEL CORPORATION PROPRIETARY INFORMATION
+ *
+ *     This software is supplied under the terms of a license  agreement or 
+ *     nondisclosure agreement with Intel Corporation and may not be copied 
+ *     nor disclosed except in accordance with the terms of that agreement.
+ *
+ *     Copyright 1988, 1989 Intel Corporation
+ */
+
+/*
+ * Copyright 1993 NeXT, Inc.
+ * All rights reserved.
+ */
+#include "memory.h"
+
+#define NGDTENT                6
+#define GDTLIMIT       48      /* NGDTENT * 8 */
+
+/*  Segment Descriptor
+ *
+ * 31          24         19   16                 7           0
+ * ------------------------------------------------------------
+ * |             | |B| |A|       | |   |1|0|E|W|A|            |
+ * | BASE 31..24 |G|/|0|V| LIMIT |P|DPL|  TYPE   | BASE 23:16 |
+ * |             | |D| |L| 19..16| |   |1|1|C|R|A|            |
+ * ------------------------------------------------------------
+ * |                             |                            |
+ * |        BASE 15..0           |       LIMIT 15..0          |
+ * |                             |                            |
+ * ------------------------------------------------------------
+ */
+
+struct seg_desc {
+       unsigned short  limit_15_0;
+       unsigned short  base_15_0;
+       unsigned char   base_23_16;
+       unsigned char   bit_15_8;
+       unsigned char   bit_23_16;
+       unsigned char   base_31_24;
+       };
+
+
+struct seg_desc        Gdt[NGDTENT] = {
+    {0x0,    0x0,     0x0, 0x0,  0x0,  0x0},    /*  0x0 : null */
+    // byte granularity, 1Mb limit, MEMBASE offset
+    {0xFFFF, MEMBASE, 0x0, 0x9E, 0x4F, 0x0},    /*  0x8 : boot code */
+    // dword granularity, 2Gb limit, MEMBASE offset
+    {0xFFFF, MEMBASE, 0x0, 0x92, 0xCF, 0x0},    /* 0x10 : boot data */
+    {0xFFFF, MEMBASE, 0x0, 0x9E, 0xF,  0x0},    /* 0x18 : boot code, 16 bits */
+    {0xFFFF, 0x0,     0x0, 0x92, 0xCF, 0x0},    /* 0x20 : init data */
+    {0xFFFF, 0x0,     0x0, 0x9E, 0xCF, 0x0}     /* 0x28 : init code */
+};
+
diff --git a/i386/libsaio/ufs_byteorder.c b/i386/libsaio/ufs_byteorder.c
new file mode 100644 (file)
index 0000000..a49b56f
--- /dev/null
@@ -0,0 +1,247 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
+ * Reserved.  This file contains Original Code and/or Modifications of
+ * Original Code as defined in and that are subject to the Apple Public
+ * Source License Version 1.1 (the "License").  You may not use this file
+ * except in compliance with the License.  Please obtain a copy of the
+ * License at http://www.apple.com/publicsource and read it before using
+ * this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright 1993 NeXT, Inc.
+ * All rights reserved.
+ */
+
+#include <bsd/sys/types.h>
+#include <bsd/sys/param.h>
+#include <bsd/sys/vnode.h>
+#include <ufs/ufs/dir.h>
+#include <architecture/byte_order.h>
+#include "ufs_byteorder.h"
+#include "libsaio.h"
+
+#define        swapBigLongToHost(thing) ((thing) = NXSwapBigLongToHost(thing))
+#define        swapBigShortToHost(thing) ((thing) = NXSwapBigShortToHost(thing))
+#define        byte_swap_longlong(thing) ((thing) = NXSwapBigLongLongToHost(thing))
+#define        byte_swap_int(thing) ((thing) = NXSwapBigLongToHost(thing))
+#define        byte_swap_short(thing) ((thing) = NXSwapBigShortToHost(thing))
+
+void
+byte_swap_longlongs(unsigned long long *array, int count)
+{
+       register unsigned long long     i;
+
+       for (i = 0;  i < count;  i++)
+               byte_swap_longlong(array[i]);
+}
+
+void
+byte_swap_ints(int *array, int count)
+{
+       register int    i;
+
+       for (i = 0;  i < count;  i++)
+               byte_swap_int(array[i]);
+}
+
+void
+byte_swap_shorts(short *array, int count)
+{
+       register int    i;
+
+       for (i = 0;  i < count;  i++)
+               byte_swap_short(array[i]);
+}
+
+void
+swapBigIntsToHost(int *array, int count)
+{
+       register int    i;
+
+       for (i = 0;  i < count;  i++)
+               swapBigLongToHost(array[i]);
+}
+
+
+void
+swapBigShortToHosts(short *array, int count)
+{
+       register int    i;
+
+       for (i = 0;  i < count;  i++)
+               swapBigShortToHost(array[i]);
+}
+
+void
+byte_swap_superblock(struct fs *sb)
+{
+       u_int16_t *   usptr;
+       unsigned long size;
+
+       byte_swap_ints(((int32_t *)&sb->fs_firstfield), 52);
+       byte_swap_int(sb->fs_cgrotor);
+       byte_swap_int(sb->fs_cpc);
+       byte_swap_shorts((int16_t *)sb->fs_opostbl, 16 * 8); 
+       byte_swap_ints((int32_t *)sb->fs_sparecon, 50);
+       byte_swap_ints((int32_t *)&sb->fs_contigsumsize, 3);
+       byte_swap_longlongs((u_int64_t *)&sb->fs_maxfilesize,3);
+       byte_swap_ints((int32_t *)&sb->fs_state, 6);
+
+       /* Got these magic numbers from mkfs.c in newfs */
+       if (sb->fs_nrpos != 8 || sb->fs_cpc > 16) {
+               usptr = (u_int16_t *)((u_int8_t *)(sb) + (sb)->fs_postbloff);
+               size = sb->fs_cpc * sb->fs_nrpos;
+               byte_swap_shorts(usptr,size);   /* fs_postbloff */
+       }
+}
+
+static inline void
+byte_swap_disklabel_common(disk_label_t *dl)
+{
+       swapBigLongToHost(dl->dl_version);      /* ditto */
+       swapBigLongToHost(dl->dl_label_blkno);
+       swapBigLongToHost(dl->dl_size);
+       swapBigLongToHost(dl->dl_flags);
+       swapBigLongToHost(dl->dl_tag);
+//     swapBigShortToHost(dl->dl_checksum);
+//     if (dl->dl_version >= DL_V3)
+//             swapBigShortToHost(dl->dl_un.DL_v3_checksum);
+//     else
+//             swapBigIntsToHost(dl->dl_un.DL_bad, NBAD);
+}
+
+void
+byte_swap_disklabel_in(disk_label_t *dl)
+{
+       byte_swap_disklabel_common(dl);
+       byte_swap_disktab_in(&dl->dl_dt);
+}
+
+static inline void
+byte_swap_disktab_common(struct disktab *dt)
+{
+       register unsigned int   i;
+
+       swapBigLongToHost(dt->d_secsize);
+       swapBigLongToHost(dt->d_ntracks);
+       swapBigLongToHost(dt->d_nsectors);
+       swapBigLongToHost(dt->d_ncylinders);
+//     swapBigLongToHost(dt->d_rpm);
+       swapBigShortToHost(dt->d_front);
+       swapBigShortToHost(dt->d_back);
+//     swapBigShortToHost(dt->d_ngroups);
+//     swapBigShortToHost(dt->d_ag_size);
+//     swapBigShortToHost(dt->d_ag_alts);
+//     swapBigShortToHost(dt->d_ag_off);
+//     swapBigIntsToHost(dt->d_boot0_blkno, NBOOTS);
+
+       for (i=0; i < NPART; i++)
+               byte_swap_partition(&dt->d_partitions[i]);
+}
+
+/*
+ *  This is particularly grody.  The beginning of the partition array is two
+ *  bytes low on the 68 wrt natural alignment rules.  Furthermore, each
+ *  element of the partition table is two bytes smaller on 68k due to padding
+ *  at the end of the struct.
+ */
+void
+byte_swap_disktab_in(struct disktab *dt)
+{
+       struct partition * pp;
+       int                i;
+
+       /*
+        *  Shift each struct partition up in memory by 2 + 2 * offset bytes.
+        *  Do it backwards so we don't overwrite anything.
+        */
+       for (i=NPART - 1; i >=0; i--) {
+               struct partition temp;
+               pp = &dt->d_partitions[i];
+               /* beware: compiler doesn't do overlapping struct assignment */
+               temp = *(struct partition *)(((char *) pp) - 2 * (i + 1));
+               *pp = temp;
+       }
+
+       byte_swap_disktab_common(dt);
+}
+
+void
+byte_swap_partition(struct partition *part)
+{
+       swapBigLongToHost(part->p_base);
+       swapBigLongToHost(part->p_size);
+       swapBigShortToHost(part->p_bsize);
+       swapBigShortToHost(part->p_fsize);
+       swapBigShortToHost(part->p_cpg);
+       swapBigShortToHost(part->p_density);
+}
+
+/* This value should correspond to the value set in the ffs_mounts */
+
+#define RESYMLNKLEN 60
+
+void
+byte_swap_dinode_in(struct dinode *di)
+{
+       int i;
+
+       di->di_mode = NXSwapShort(di->di_mode);
+       di->di_nlink = NXSwapShort(di->di_nlink);
+#ifdef LFS
+       di->di_u.inumber = NXSwapLong(di->di_u.inumber);
+#else
+       di->di_u.oldids[0] = NXSwapShort(di->di_u.oldids[0]);
+       di->di_u.oldids[1] = NXSwapShort(di->di_u.oldids[1]);
+#endif
+       di->di_size = NXSwapLongLong(di->di_size);
+       di->di_atime = NXSwapLong(di->di_atime);
+       di->di_atimensec = NXSwapLong(di->di_atimensec);
+       di->di_mtime = NXSwapLong(di->di_mtime);
+       di->di_mtimensec = NXSwapLong(di->di_mtimensec);
+       di->di_ctime = NXSwapLong(di->di_ctime);
+       di->di_ctimensec = NXSwapLong(di->di_ctimensec);
+       if (((di->di_mode & IFMT) != IFLNK ) || (di->di_size > RESYMLNKLEN)) {
+               for (i=0; i < NDADDR; i++)      /* direct blocks */
+                       di->di_db[i] = NXSwapLong(di->di_db[i]);
+               for (i=0; i < NIADDR; i++)      /* indirect blocks */
+                       di->di_ib[i] = NXSwapLong(di->di_ib[i]);
+       }
+       di->di_flags = NXSwapLong(di->di_flags);
+       di->di_blocks = NXSwapLong(di->di_blocks);
+       di->di_gen = NXSwapLong(di->di_gen);
+       di->di_uid = NXSwapLong(di->di_uid);
+       di->di_gid = NXSwapLong(di->di_gid);
+       di->di_spare[0] = NXSwapLong(di->di_spare[0]);
+       di->di_spare[1] = NXSwapLong(di->di_spare[1]);
+}
+
+void
+byte_swap_dir_block_in(char *addr, int count)
+{
+       register struct direct * ep = (struct direct *) addr;
+       register int                 entryoffsetinblk = 0;
+
+       while (entryoffsetinblk < count) {
+               ep = (struct direct *) (entryoffsetinblk + addr);
+               swapBigLongToHost(ep->d_ino);
+               swapBigShortToHost(ep->d_reclen);
+               entryoffsetinblk += ep->d_reclen;
+               if (ep->d_reclen < 12)          /* handle garbage in dirs */
+                       break;
+       }
+}
diff --git a/i386/libsaio/ufs_byteorder.h b/i386/libsaio/ufs_byteorder.h
new file mode 100644 (file)
index 0000000..ad4f2f9
--- /dev/null
@@ -0,0 +1,58 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
+ * Reserved.  This file contains Original Code and/or Modifications of
+ * Original Code as defined in and that are subject to the Apple Public
+ * Source License Version 1.1 (the "License").  You may not use this file
+ * except in compliance with the License.  Please obtain a copy of the
+ * License at http://www.apple.com/publicsource and read it before using
+ * this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1992 NeXT Computer, Inc.
+ *
+ * UFS byte swapping routines to make a big endian file system useful on a
+ * little endian machine.
+ *
+ * HISTORY
+ *
+ * 8 Jul 1992 Brian Pinkerton at NeXT
+ *      Created.
+ */
+
+#ifndef __LIBSAIO_UFS_BYTEORDER_H
+#define __LIBSAIO_UFS_BYTEORDER_H
+
+#include <bsd/sys/disktab.h>
+#include <bsd/sys/vnode.h>
+#include <bsd/sys/buf.h>
+#include <bsd/dev/disk.h>
+#include <bsd/ufs/ufs/quota.h>
+#include <bsd/ufs/ufs/inode.h>
+#include <bsd/ufs/ffs/fs.h>
+
+void byte_swap_ints(int *array, int count);
+void byte_swap_shorts(short *array, int count);
+void byte_swap_longlongs(unsigned long long *array, int count);
+
+void byte_swap_superblock(struct fs *sb);
+void byte_swap_disklabel_in(disk_label_t *dl);
+void byte_swap_disktab_in(struct disktab *dt);
+void byte_swap_partition(struct partition *part);
+void byte_swap_dinode_in(struct dinode *di);
+void byte_swap_dir_block_in(char *addr, int count);
+
+#endif /* !__LIBSAIO_UFS_BYTEORDER_H */
diff --git a/i386/libsaio/vbe.c b/i386/libsaio/vbe.c
new file mode 100644 (file)
index 0000000..36c11f8
--- /dev/null
@@ -0,0 +1,296 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
+ * Reserved.  This file contains Original Code and/or Modifications of
+ * Original Code as defined in and that are subject to the Apple Public
+ * Source License Version 1.1 (the "License").  You may not use this file
+ * except in compliance with the License.  Please obtain a copy of the
+ * License at http://www.apple.com/publicsource and read it before using
+ * this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright 1993 NeXT, Inc.
+ * All rights reserved.
+ */
+#include "io_inline.h"
+#include "libsaio.h"
+#include "vga.h"
+#include "vbe.h"
+#include "kernBootStruct.h"
+#include "appleClut8.h"
+
+/*
+ * Graphics mode settings.
+ */
+BOOL            in_linear_mode;
+unsigned char * frame_buffer;
+unsigned short  screen_width;
+unsigned short  screen_height;
+unsigned char   bits_per_pixel;
+unsigned short  screen_rowbytes;
+
+/* 
+ * Various inline routines for video I/O
+ */
+static inline void
+outi (int port, int index, int val)
+{
+    outw (port, (val << 8) | index);
+}
+
+static inline void
+outib (int port, int index, int val)
+{
+    outb (port, index);
+    outb (port + 1, val);
+}
+
+static inline int
+ini (int port, int index)
+{
+    outb (port, index);
+    return inb (port + 1);
+}
+
+static inline void
+rmwi (int port, int index, int clear, int set)
+{
+    outb (port, index);
+    outb (port + 1, (inb (port + 1) & ~clear) | set);
+}
+
+/*
+ * Local Prototypes
+ */
+void setupPalette(VBEPalette * p, const unsigned char * g);
+
+/*
+ * Globals
+ */
+static biosBuf_t bb;
+
+#if 0
+static char *models[] = { "Text", 
+                         "CGA", 
+                         "Hercules", 
+                         "Planar", 
+                         "Packed Pixel", 
+                         "Non-Chain 4", 
+                         "Direct Color", 
+                         "YUV" };
+#endif
+
+int
+set_linear_video_mode(unsigned short mode)
+{
+    VBEInfoBlock        vinfo;
+    VBEModeInfoBlock    minfo;
+    int                 err;
+    VBEPalette          palette;
+
+    do {
+        /*
+         * See if VESA is around.
+         */
+        err = getVBEInfo(&vinfo);
+        if (err != errSuccess)
+        {
+            printf("VESA not available.\n");
+            break;
+        }
+
+#if 0
+        /*
+         * See if this mode is supported.
+         */
+        err = getVBEModeInfo(mode, &minfo);
+        if ( !((err == errSuccess) && 
+            (minfo.ModeAttributes & maModeIsSupportedBit) &&
+            (minfo.ModeAttributes & maGraphicsModeBit) /* &&
+            (minfo.ModeAttributes & maLinearFrameBufferAvailBit)*/) )
+        {
+            printf("Mode %d is not supported.\n", mode);
+            err = errFuncNotSupported;
+            break;
+        }
+#endif
+
+        /*
+         * Set the mode.
+         */
+        err = setVBEMode(mode | kLinearFrameBufferBit );
+        if ( err != errSuccess )
+        {
+            if (vinfo.VESAVersion < MIN_VESA_VERSION)
+            {
+                printf("Video Card is VESA %d.%d. It must be at least VESA %d.%d\n",
+                    vinfo.VESAVersion >> 8,
+                    vinfo.VESAVersion & 0xff,
+                    MIN_VESA_VERSION >> 8,
+                    MIN_VESA_VERSION & 0xff);
+            }
+            else
+            {
+                printf("Error #%d in set video mode.\n", err);
+            }
+            break;
+        }
+
+        /*
+         * Get mode info.
+         */
+        err = getVBEModeInfo(mode, &minfo);
+        if ( err != errSuccess )
+        {
+            printf("Error #%d in get mode info.\n", err);
+            break;
+        }
+
+        /*
+         * Set the palette.
+         */
+        if (( vinfo.VESAVersion >= MIN_VESA_VERSION ) &&
+            ( minfo.BitsPerPixel == 8 ))
+        {
+            setupPalette(&palette, appleClut8);
+            if ((err = setVBEPalette(palette)) != errSuccess)
+            {
+                printf("Error #%d in setting palette.\n", err);
+                break;
+            }
+        }
+
+        err             = errSuccess;
+        in_linear_mode  = YES;
+        screen_width    = minfo.XResolution;
+        screen_height   = minfo.YResolution;
+        bits_per_pixel  = minfo.BitsPerPixel;
+        screen_rowbytes = minfo.BytesPerScanline;
+
+        /* The S3 video card reports 15 bits... the video console driver
+         * Can't deal.. set it to 16.
+         */
+        if (bits_per_pixel > 8 && bits_per_pixel < 16)
+            bits_per_pixel = 16;
+
+        frame_buffer = (unsigned char *) ADDRESS(minfo.PhysBasePtr_low, 
+                                                 minfo.PhysBasePtr_1, 
+                                                 minfo.PhysBasePtr_2, 
+                                                 minfo.PhysBasePtr_high);
+    }
+    while ( 0 );
+    
+    return err;
+}
+
+void setupPalette(VBEPalette * p, const unsigned char * g)
+{
+    int             i;
+    unsigned char * source = (unsigned char *) g;
+
+    for (i = 0; i < 256; i++)
+    {
+        (*p)[i] = 0;
+        (*p)[i] |= ((unsigned long)((*source++) >> 2)) << 16;   // Red
+        (*p)[i] |= ((unsigned long)((*source++) >> 2)) << 8;    // Green
+        (*p)[i] |= ((unsigned long)((*source++) >> 2));         // Blue
+    }
+}
+
+int getVBEInfo(void *vinfo_p)
+{
+    bb.intno = 0x10;
+    bb.eax.rr = funcGetControllerInfo;
+    bb.es = SEG(vinfo_p);
+    bb.edi.rr = OFF(vinfo_p);
+    bios(&bb);
+    return(bb.eax.r.h);
+}
+
+int getVBEModeInfo(int mode, void *minfo_p)
+{
+    bb.intno = 0x10;
+    bb.eax.rr = funcGetModeInfo;
+    bb.ecx.rr = mode;
+    bb.es = SEG(minfo_p);
+    bb.edi.rr = OFF(minfo_p);
+    bios(&bb);
+    return(bb.eax.r.h);
+}
+
+int getVBEDACFormat(unsigned char *format)
+{
+    bb.intno = 0x10;
+    bb.eax.rr = funcGetSetPaletteFormat;
+    bb.ebx.r.l = subfuncGet;
+    bios(&bb);
+    *format = bb.ebx.r.h;
+    return(bb.eax.r.h);
+}
+
+int setVBEDACFormat(unsigned char format)
+{
+    bb.intno = 0x10;
+    bb.eax.rr = funcGetSetPaletteFormat;
+    bb.ebx.r.l = subfuncSet;
+    bb.ebx.r.h = format;
+    bios(&bb);
+    return(bb.eax.r.h);
+}
+
+int setVBEMode(unsigned short mode)
+{
+    bb.intno = 0x10;
+    bb.eax.rr = funcSetMode;
+    bb.ebx.rr = mode;
+    bios(&bb);
+    return(bb.eax.r.h);
+}
+
+int setVBEPalette(void *palette)
+{
+    bb.intno = 0x10;
+    bb.eax.rr = funcGetSetPaletteData;
+    bb.ebx.r.l = subfuncSet;
+    bb.ecx.rr = 256;
+    bb.edx.rr = 0;
+    bb.es = SEG(palette);
+    bb.edi.rr = OFF(palette);
+    bios(&bb);
+    return(bb.eax.r.h);
+}
+
+int getVBEPalette(void *palette)
+{
+    bb.intno = 0x10;
+    bb.eax.rr = funcGetSetPaletteData;
+    bb.ebx.r.l = subfuncGet;
+    bb.ecx.rr = 256;
+    bb.edx.rr = 0;
+    bb.es = SEG(palette);
+    bb.edi.rr = OFF(palette);
+    bios(&bb);
+    return(bb.eax.r.h);
+}
+
+int getVBECurrentMode(unsigned short *mode)
+{
+    bb.intno = 0x10;
+    bb.eax.rr = funcGetCurrentMode;
+    bios(&bb);
+    *mode = bb.ebx.rr;
+    return(bb.eax.r.h);
+}
diff --git a/i386/libsaio/vbe.h b/i386/libsaio/vbe.h
new file mode 100644 (file)
index 0000000..62e5c04
--- /dev/null
@@ -0,0 +1,241 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
+ * Reserved.  This file contains Original Code and/or Modifications of
+ * Original Code as defined in and that are subject to the Apple Public
+ * Source License Version 1.1 (the "License").  You may not use this file
+ * except in compliance with the License.  Please obtain a copy of the
+ * License at http://www.apple.com/publicsource and read it before using
+ * this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+// Copyright 1997 by Apple Computer, Inc., all rights reserved.
+/* Copyright 1996-1997 NeXT Software, Inc.
+ *
+ * vesa.h - mode info obtained via int10
+ *
+ * Revision History
+ * ----------------
+ * 30 Jul 1996  Doug Mitchell at NeXT
+ *  Created.
+ */
+
+#ifndef __LIBSAIO_VBE_H
+#define __LIBSAIO_VBE_H
+
+/*
+ * Graphics mode settings.
+ */
+extern BOOL            in_linear_mode;
+extern unsigned char * frame_buffer;
+extern unsigned short  screen_width;
+extern unsigned short  screen_height;
+extern unsigned char   bits_per_pixel;
+extern unsigned short  screen_rowbytes;
+
+#define MIN_VESA_VERSION    0x200
+
+#define SEG(address) \
+        ((unsigned short)(((unsigned long)address & 0xffff0000) >> 4))
+#define OFF(address) ((unsigned short)((unsigned long)address & 0x0000ffff))
+#define RTOV(low, one, two, high) \
+        (((unsigned long)high << 12) | ((unsigned long)one << 8) | \
+         (unsigned long)low)
+#define ADDRESS(low, one, two, high) \
+        (((unsigned long)high << 24) | ((unsigned long)two << 16) | \
+         ((unsigned long)one << 8) | (unsigned long)low)
+
+/*
+ *  Functions
+ */
+enum {
+    funcGetControllerInfo    = 0x4F00,
+    funcGetModeInfo          = 0x4F01,
+    funcSetMode              = 0x4F02,
+    funcGetCurrentMode       = 0x4F03,
+    funcSaveRestoreState     = 0x4F04,
+    funcWindowControl        = 0x4F05,
+    funcGetSetScanLineLength = 0x4F06,
+    funcGetSetDisplayStart   = 0x4F07,
+    funcGetSetPaletteFormat  = 0x4F08,
+    funcGetSetPaletteData    = 0x4F09,
+    funcGetProtModeInterdace = 0x4F0A
+};
+
+enum {
+    subfuncSet          = 0x00,
+    subfuncGet          = 0x01,
+    subfuncSetSecondary = 0x02,
+    subfuncGetSecondary = 0x03
+};
+
+/*
+ * errors.
+ */
+enum {
+    errSuccess          = 0,
+    errFuncFailed       = 1,
+    errFuncNotSupported = 2,
+    errFuncInvalid      = 3
+};
+
+/*
+ * Per-controller info, returned in function 4f00.
+ */
+typedef struct {
+    unsigned char   VESASignature[4];
+    unsigned short  VESAVersion;
+    /*
+     * Avoid packing problem...
+     */
+    unsigned char   OEMStringPtr_low;
+    unsigned char   OEMStringPtr_1;
+    unsigned char   OEMStringPtr_2;
+    unsigned char   OEMStringPtr_high;
+    unsigned char   Capabilities_low;
+    unsigned char   Capabilities_1;
+    unsigned char   Capabilities_2;
+    unsigned char   Capabilities_high;
+    unsigned char   VideoModePtr_low;
+    unsigned char   VideoModePtr_1;
+    unsigned char   VideoModePtr_2;
+    unsigned char   VideoModePtr_high;
+    unsigned short  TotalMemory;
+    unsigned char   Reserved[242];
+} VBEInfoBlock;
+
+/*
+ * Capabilites
+ */
+enum {
+    capDACWidthIsSwitchableBit          = (1 << 0), /* 1 = yes; 0 = no */
+    capControllerIsNotVGACompatableBit  = (1 << 1), /* 1 = no; 0 = yes */
+    capOldRAMDAC                        = (1 << 2)  /* 1 = yes; 0 = no */
+};
+
+/*
+ * Per-mode info, returned in function 4f02.
+ */
+typedef struct {
+    unsigned short  ModeAttributes;
+    unsigned char   WinAAttributes;
+    unsigned char   WinBAttributes;
+    unsigned short  WinGranularity;
+    unsigned short  WinSize;
+    unsigned short  WinASegment;
+    unsigned short  WinABegment;
+    void *          WinFuncPtr;
+    unsigned short  BytesPerScanline;
+    unsigned short  XResolution;
+    unsigned short  YResolution;
+    unsigned char   XCharSize;
+    unsigned char   YCharSize;
+    unsigned char   NumberOfPlanes;
+    unsigned char   BitsPerPixel;
+    unsigned char   NumberOfBanks;
+    unsigned char   MemoryModel;
+    unsigned char   BankSize;
+    unsigned char   NumberOfImagePages;
+    unsigned char   Reserved;
+    unsigned char   RedMaskSize;
+    unsigned char   RedFieldPosition;
+    unsigned char   GreenMaskSize;
+    unsigned char   GreenFieldPosition;
+    unsigned char   BlueMaskSize;
+    unsigned char   BlueFieldPosition;
+    unsigned char   RsvdMaskSize;
+    unsigned char   RsvdFieldPosition;
+    unsigned char   DirectColorModeInfo;
+    unsigned char   PhysBasePtr_low;
+    unsigned char   PhysBasePtr_1;
+    unsigned char   PhysBasePtr_2;
+    unsigned char   PhysBasePtr_high;
+    void *          OffScreenMemOffset;
+    unsigned short  OffScreenMemSize;
+    unsigned char   Reserved1[206];
+} VBEModeInfoBlock;
+
+/* 
+ * ModeAttributes bits
+ */
+enum {
+    maModeIsSupportedBit        = (1 << 0), /* mode is supported */
+    maExtendedInfoAvailableBit  = (1 << 1), /* extended info available */
+    maOutputFuncSupportedBit    = (1 << 2), /* output functions supported */
+    maColorModeBit              = (1 << 3), /* 1 = color; 0 = mono */
+    maGraphicsModeBit           = (1 << 4), /* 1 = graphics; 0 = text */
+    maModeIsNotVGACompatableBit = (1 << 5), /* 1 = not compat; 0 = compat */
+    maVGAMemoryModeNotAvailBit  = (1 << 6), /* 1 = not avail; 0 = avail */
+    maLinearFrameBufferAvailBit = (1 << 7)  /* 1 = avail; 0 = not avail */
+};
+
+/*
+ *  Modes
+ */
+enum {
+    mode640x400x256   = 0x100,
+    mode640x480x256   = 0x101,
+    mode800x600x16    = 0x102,
+    mode800x600x256   = 0x103,
+    mode1024x768x16   = 0x104,
+    mode1024x768x256  = 0x105,
+    mode1280x1024x16  = 0x106,
+    mode1280x1024x256 = 0x107,
+    mode80Cx60R       = 0x108,
+    mode132Cx25R      = 0x109,
+    mode132Cx43R      = 0x10A,
+    mode132Cx50R      = 0x10B,
+    mode132Cx60R      = 0x10C,
+    mode320x200x555   = 0x10D,
+    mode320x200x565   = 0x10E,
+    mode320x200x888   = 0x10F,
+    mode640x480x555   = 0x110,
+    mode640x480x565   = 0x111,
+    mode640x480x888   = 0x112,
+    mode800x600x555   = 0x113,
+    mode800x600x565   = 0x114,
+    mode800x600x888   = 0x115,
+    mode1024x768x555  = 0x116,
+    mode1024x768x565  = 0x117,
+    mode1024x768x888  = 0x118,
+    mode1280x1024x555 = 0x119,
+    mode1280x1024x565 = 0x11A,
+    mode1280x1024x888 = 0x11B,
+    modeSpecial       = 0x81FF
+};
+
+/*
+ *  Get/Set VBE Mode parameters
+ */
+enum {
+    kLinearFrameBufferBit  =  (1 << 14),
+    kPreserveMemoryBit     =  (1 << 15)
+};
+
+/*
+ * Palette
+ */
+typedef unsigned long VBEPalette[256];
+
+extern int getVBEInfo(void *vinfo_p);
+extern int getVBEModeInfo(int mode, void *minfo_p);
+extern int getVBEDACFormat(unsigned char *format);
+extern int setVBEDACFormat(unsigned char format);
+extern int setVBEPalette(void *palette);
+extern int getVBEPalette(void *palette);
+extern int setVBEMode(unsigned short mode);
+extern int getVBECurrentMode(unsigned short *mode);
+
+#endif /* !__LIBSAIO_VBE_H */
diff --git a/i386/libsaio/vga.c b/i386/libsaio/vga.c
new file mode 100644 (file)
index 0000000..c1dd659
--- /dev/null
@@ -0,0 +1,289 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
+ * Reserved.  This file contains Original Code and/or Modifications of
+ * Original Code as defined in and that are subject to the Apple Public
+ * Source License Version 1.1 (the "License").  You may not use this file
+ * except in compliance with the License.  Please obtain a copy of the
+ * License at http://www.apple.com/publicsource and read it before using
+ * this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright 1993 NeXT, Inc.
+ * All rights reserved.
+ */
+#include "io_inline.h"
+#include "libsaio.h"
+#include "vga.h"
+
+#define        VGA_SEQ_CNT     5
+#define        VGA_CRT_CNT     25
+#define        VGA_ATR_CNT     21
+#define        VGA_GFX_CNT     9
+
+typedef struct VGAState {
+    /* Miscellaneous output register. */
+    unsigned char miscOutput;
+    /* Sequencer registers. */
+    unsigned char sequencerData[VGA_SEQ_CNT];
+    /* CRT Controller registers. */
+    unsigned char crtcData[VGA_CRT_CNT];
+    /* Graphics controller registers. */
+    unsigned char graphicsData[VGA_GFX_CNT];
+    /* Attribute controller registers. */
+    unsigned char attrData[VGA_ATR_CNT];
+} VGAState;
+
+#if 0
+/* VGA Mode 0x03. */
+
+static const VGAState VGAMode3 = {
+    /* Miscellaneous output register. */
+    0x67,
+    /* Sequencer registers. */
+    { 0x01, 0x00, 0x03, 0x00, 0x02 },
+    /* CRT controller registers. */
+    {
+       0x5f, 0x4f, 0x50, 0x82, 0x55, 0x81, 0xbf, 0x1f, 0x00, 0x4f,
+       0x0d, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x9c, 0x8e, 0x8f, 0x28,
+       0x1f, 0x96, 0xb9, 0xa3, 0xff,
+    },
+    /* Graphics controller registers. */
+    { 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x0e, 0x00, 0xff },
+    /* Attribute controller registers. */
+    {
+       0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x14, 0x07, 0x38, 0x39,
+       0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x0c, 0x00, 0x0f, 0x08,
+       0x00,
+    },
+};
+#endif
+
+/* VGA Mode 0x12. */
+
+static const VGAState VGAMode12 = {
+    /* Miscellaneous output register. */
+    0xe3,
+    /* Sequencer registers. */
+    {0x03, 0x21, 0x0f, 0x00, 0x06},
+    /* CRT controller registers. */
+    {
+       0x5f, 0x4f, 0x50, 0x82, 0x54, 0x80, 0x0b, 0x3e, 0x00,
+       0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x59, 0xea, 0x8c,
+       0xdf, 0x28, 0x00, 0xe7, 0x04, 0xe3, 0xff,
+    },
+    /* Graphics controller registers. */
+    { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x0f, 0xff },
+    /* Attribute controller registers. */
+    {
+       0x00, 0x01, 0x02, 0x03, 0x00, 0x01, 0x02, 0x03,
+       0x00, 0x01, 0x02, 0x03, 0x00, 0x01, 0x02, 0x03,
+       0x01, 0x00,
+       0x03, 0x00,
+       0x00,
+    },
+};
+
+#define palette_entry(r,g,b) (((r) << 4)|((g) << 2)|(b))
+
+static const unsigned char colorData[4] = {
+    0x00, 0x15, 0x2a, 0x3f,
+};
+
+#ifdef NOTYET
+static const unsigned char mode_03_palette[] = {
+    palette_entry(0, 0, 0),
+    palette_entry(0, 0, 2),
+    palette_entry(0, 2, 0),
+    palette_entry(0, 2, 2),
+    palette_entry(2, 0, 0),
+    palette_entry(2, 0, 2),
+    palette_entry(2, 2, 0),
+    palette_entry(2, 2, 2),
+    palette_entry(0, 0, 1),
+    palette_entry(0, 0, 3),
+    palette_entry(0, 2, 1),
+    palette_entry(0, 2, 3),
+    palette_entry(2, 0, 1),
+    palette_entry(2, 0, 3),
+    palette_entry(2, 2, 1),
+    palette_entry(2, 2, 3),
+    palette_entry(0, 1, 0),
+    palette_entry(0, 1, 2),
+    palette_entry(0, 3, 0),
+    palette_entry(0, 3, 2),
+    palette_entry(2, 1, 0),
+    palette_entry(2, 1, 2),
+    palette_entry(2, 3, 0),
+    palette_entry(2, 3, 2),
+    palette_entry(0, 1, 1),
+    palette_entry(0, 1, 3),
+    palette_entry(0, 3, 1),
+    palette_entry(0, 3, 3),
+    palette_entry(2, 1, 1),
+    palette_entry(2, 1, 3),
+    palette_entry(2, 3, 1),
+    palette_entry(2, 3, 3),
+    palette_entry(1, 0, 0),
+    palette_entry(1, 0, 2),
+    palette_entry(1, 2, 0),
+    palette_entry(1, 2, 2),
+    palette_entry(3, 0, 0),
+    palette_entry(3, 0, 2),
+    palette_entry(3, 2, 0),
+    palette_entry(3, 2, 2),
+    palette_entry(1, 0, 1),
+    palette_entry(1, 0, 3),
+    palette_entry(1, 2, 1),
+    palette_entry(1, 2, 3),
+    palette_entry(3, 0, 1),
+    palette_entry(3, 0, 3),
+    palette_entry(3, 2, 1),
+    palette_entry(3, 2, 3),
+    palette_entry(1, 1, 0),
+    palette_entry(1, 1, 2),
+    palette_entry(1, 3, 0),
+    palette_entry(1, 3, 2),
+    palette_entry(3, 1, 0),
+    palette_entry(3, 1, 2),
+    palette_entry(3, 3, 0),
+    palette_entry(3, 3, 2),
+    palette_entry(1, 1, 1),
+    palette_entry(1, 1, 3),
+    palette_entry(1, 3, 1),
+    palette_entry(1, 3, 3),
+    palette_entry(3, 1, 1),
+    palette_entry(3, 1, 3),
+    palette_entry(3, 3, 1),
+    palette_entry(3, 3, 3),
+};
+#endif NOTYET
+
+static void
+spin(volatile int count)
+{
+    while (count--)
+       count = count;
+}
+
+void
+set_video_mode(unsigned int mode)
+{
+    register unsigned int j, k;
+    const VGAState *      state;
+    extern unsigned short screen_width;
+    extern unsigned short screen_height;
+
+    screen_width  = 640;
+    screen_height = 480;
+
+    switch (mode) {
+        case 0x02:
+        case 0x03:
+            video_mode(mode);
+            return;
+            /*
+            state = &VGAMode3;
+            break;
+            */
+        case 0x12:
+            state = &VGAMode12;
+            break;
+        default:
+            return;
+    }
+
+    /* Turn the video off while we are doing this.... */
+    outb(VGA_SEQ_INDEX, 1);
+    outb(VGA_SEQ_DATA, state->sequencerData[1]);
+
+    /* Set the attribute flip-flop to "index" */
+    inb(VGA_INPUT_STATUS_1);
+
+    /* Give palette to CPU, turns off video */
+    outb(VGA_WRITE_ATTR_INDEX, 0x00);
+
+    /* Set the general registers */
+    outb(VGA_WRITE_MISC_PORT, state->miscOutput);
+    outb(VGA_WRITE_FEATURE_PORT, 0x00);
+
+    /* Load the sequencer registers */
+    for (k = 0; k < VGA_SEQ_CNT; k++) {
+        outb(VGA_SEQ_INDEX, k);
+        outb(VGA_SEQ_DATA, state->sequencerData[k]);
+    }
+    outb(VGA_SEQ_INDEX, 0x00);
+    outb(VGA_SEQ_DATA, 0x03);  /* Low order two bits are reset bits */
+    
+    /* Load the CRTC registers.
+     * CRTC registers 0-7 are locked by a bit in register 0x11. We need
+     * to unlock these registers before we can start setting them.
+     */
+    outb(VGA_CRTC_INDEX, 0x11);
+    outb(VGA_CRTC_DATA, 0x00);         /* Unlocks registers 0-7 */
+    for (k = 0; k < VGA_CRT_CNT; k++) {
+        outb(VGA_CRTC_INDEX, k);
+        outb(VGA_CRTC_DATA, state->crtcData[k]);
+    }
+
+    /* Load the attribute registers */
+    inb(VGA_INPUT_STATUS_1);  /* Set the attribute flip-flop to "index" */
+    for (k = 0; k < VGA_ATR_CNT; k++) {
+        outb(VGA_WRITE_ATTR_INDEX, k);
+        outb(VGA_WRITE_ATTR_DATA, state->attrData[k]);
+    }
+    
+    /* Load graphics registers */
+    for (k = 0; k < VGA_GFX_CNT; k++) {
+        outb(VGA_GFX_INDEX, k);
+        outb(VGA_GFX_DATA, state->graphicsData[k]);
+    }    
+
+    /* Set up the palette. */
+
+    outb(VGA_PALETTE_WRITE, 0);
+    for (k = 0; k < 256; k++) {
+#ifdef NOTYET
+        if (mode == 0x12) {
+#endif NOTYET
+            j = colorData[k % 4];
+            outb(VGA_PALETTE_DATA, j); spin(1000);
+            outb(VGA_PALETTE_DATA, j); spin(1000);
+            outb(VGA_PALETTE_DATA, j); spin(1000);
+#ifdef NOTYET
+        } else {
+            j = mode_03_palette[(k - 64) % 64];
+            outb(VGA_PALETTE_DATA, colorData[(j >> 4) & 3]);
+            outb(VGA_PALETTE_DATA, colorData[(j >> 2) & 3]);
+            outb(VGA_PALETTE_DATA, colorData[j & 3]);
+        }
+#endif NOTYET
+    }
+
+    /* Re-enable video */
+    /* First, clear memory to zeros */
+    bzero((void *) VGA_BUF_ADDR, VGA_BUF_LENGTH);
+
+    /* Set the attribute flip-flop to "index" */
+    inb(VGA_INPUT_STATUS_1);
+
+    /* Give the palette back to the VGA */
+    outb(VGA_WRITE_ATTR_INDEX, 0x20);
+
+    // Really re-enable video.
+    outb(VGA_SEQ_INDEX, 1);
+    outb(VGA_SEQ_DATA, (state->sequencerData[1] & ~0x20));
+}
diff --git a/i386/libsaio/vga.h b/i386/libsaio/vga.h
new file mode 100644 (file)
index 0000000..ee7ad5b
--- /dev/null
@@ -0,0 +1,67 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
+ * Reserved.  This file contains Original Code and/or Modifications of
+ * Original Code as defined in and that are subject to the Apple Public
+ * Source License Version 1.1 (the "License").  You may not use this file
+ * except in compliance with the License.  Please obtain a copy of the
+ * License at http://www.apple.com/publicsource and read it before using
+ * this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * VGA Graphics Controller Port
+ */
+
+#ifndef __LIBSAIO_VGA_H
+#define __LIBSAIO_VGA_H
+
+#define VGA_BUF_ADDR               0xA0000
+#define        VGA_BUF_LENGTH              0x10000
+
+#define VGA_GFX_INDEX           0x3CE
+#define VGA_GFX_DATA            0x3CF
+#define        VGA_GFX_RD_MAP_SEL          0x4
+#define        VGA_GFX_BIT_MASK        0x8
+#define VGA_NUM_GFX_REGS        6   // number of graphics controller
+                                    // registers to preserve
+#define VGA_SEQ_INDEX           0x3C4
+#define VGA_SEQ_DATA               0x3C5
+#define        VGA_SEQ_MAP_MASK            0x2
+#define VGA_NUM_SEQ_REGS           5   // number of sequencer
+                                    // registers to preserve
+#define VGA_AC_ADDR             0x3C0
+#define VGA_NUM_AC_REGS         0x14
+
+#define VGA_CRTC_INDEX          0x3D4
+#define VGA_CRTC_DATA              0x3D5
+
+#define        VGA_READ_ATTR_INDEX         0x3C1
+#define VGA_READ_ATTR_DATA         0x3C1
+#define VGA_WRITE_ATTR_INDEX    0x3C0
+#define VGA_WRITE_ATTR_DATA        0x3C0
+
+#define VGA_PALETTE_WRITE          0x3C8
+#define VGA_PALETTE_READ           0x3C7
+#define VGA_PALETTE_DATA           0x3C9
+
+#define        VGA_INPUT_STATUS_1          0x3DA
+#define        VGA_READ_MISC_PORT          0x3CC
+#define        VGA_WRITE_MISC_PORT         0x3C2
+
+#define        VGA_READ_FEATURE_PORT   0x3CA
+#define        VGA_WRITE_FEATURE_PORT  0x3DA
+
+#endif /* !__LIBSAIO_VGA_H */
diff --git a/i386/nasm/Makefile b/i386/nasm/Makefile
new file mode 100644 (file)
index 0000000..4622a50
--- /dev/null
@@ -0,0 +1,83 @@
+
+DIR = nasm
+include ../MakePaths.dir
+
+# Don't install in the usual place.  Currently it's only 
+# needed for building boot0, boot1, boot1f, and nullboot1.
+#MANINSTALLDIR = $(DSTROOT)/usr/share/man/man1
+#INSTALLDIR = $(DSTROOT)/usr/local/bin
+MANINSTALLDIR = $(SYMROOT)
+INSTALLDIR = $(SYMROOT)
+
+OPTIM = -O2
+CFLAGS = $(OPTIM) -g  -Wall -traditional-cpp
+DEFINES=
+INC = -I.
+ifneq "" "$(wildcard /bin/mkdirs)"
+  MKDIRS = /bin/mkdirs
+else
+  MKDIRS = /bin/mkdir -p
+endif
+
+VPATH = $(OBJROOT):$(SYMROOT)
+
+NASM = nasm.o nasmlib.o float.o insnsa.o assemble.o labels.o \
+       parser.o outform.o outbin.o outaout.o outcoff.o outelf.o \
+       outobj.o outas86.o outrdf.o outdbg.o preproc.o listing.o \
+       eval.o
+
+NDISASM = ndisasm.o disasm.o sync.o nasmlib.o insnsd.o
+
+CFILES = nasm.c nasmlib.c float.c insnsa.c assemble.c labels.c \
+       parser.c outform.c outbin.c outaout.c outcoff.c outelf.c \
+       outobj.c outas86.c outrdf.c outdbg.c preproc.c listing.c \
+       eval.c ndisasm.c disasm.c sync.c insnsd.c
+
+HFILES = nasm.h nasmlib.h preproc.h parser.h assemble.h labels.h \
+       outform.h listing.h eval.h insns.h sync.h disasm.h float.h
+
+OTHERFILES = Makefile
+
+ALLSRC =  $(CFILES) $(HFILES) $(OTHERFILES)
+
+DIRS_NEEDED = $(OBJROOT) $(SYMROOT)
+
+all: $(DIRS_NEEDED) nasm ndisasm installman
+
+nasm: $(NASM)
+       $(CC) -o $(INSTALLDIR)/nasm $(NASM)
+
+ndisasm: $(NDISASM)
+       $(CC) -o $(INSTALLDIR)/ndisasm $(NDISASM)
+
+installman: nasm.1 ndisasm.1
+       cp nasm.1 $(MANINSTALLDIR)
+       cp ndisasm.1 $(MANINSTALLDIR)
+
+# These two source files are automagically generated from a single
+# instruction-table file by a Perl script. They're distributed,
+# though, so it isn't necessary to have Perl just to recompile NASM
+# from the distribution.
+
+insnsa.c insnsd.c: insns.dat insns.pl
+       perl insns.pl insns.dat
+
+# This source file is generated from the standard macros file
+# `standard.mac' by another Perl script. Again, it's part of the
+# standard distribution.
+
+macros.c: standard.mac macros.pl
+       perl macros.pl standard.mac
+
+clean::
+       rm -rf $(SYMROOT)/nasm $(SYMROOT)/ndisasm
+
+$(INSTALLDIR) $(MANINSTALLDIR):
+       $(MKDIRS) $@
+
+installhdrs:: $(INSTALLDIR) $(MANINSTALLDIR)
+
+include ../MakeInc.dir
+
+# dependencies
+-include $(OBJROOT)/Makedep
diff --git a/i386/nasm/assemble.c b/i386/nasm/assemble.c
new file mode 100644 (file)
index 0000000..2f17c72
--- /dev/null
@@ -0,0 +1,1196 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
+ * Reserved.  This file contains Original Code and/or Modifications of
+ * Original Code as defined in and that are subject to the Apple Public
+ * Source License Version 1.1 (the "License").  You may not use this file
+ * except in compliance with the License.  Please obtain a copy of the
+ * License at http://www.apple.com/publicsource and read it before using
+ * this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/* assemble.c   code generation for the Netwide Assembler
+ *
+ * The Netwide Assembler is copyright (C) 1996 Simon Tatham and
+ * Julian Hall. All rights reserved. The software is
+ * redistributable under the licence given in the file "Licence"
+ * distributed in the NASM archive.
+ *
+ * the actual codes (C syntax, i.e. octal):
+ * \0            - terminates the code. (Unless it's a literal of course.)
+ * \1, \2, \3    - that many literal bytes follow in the code stream
+ * \4, \6        - the POP/PUSH (respectively) codes for CS, DS, ES, SS
+ *                 (POP is never used for CS) depending on operand 0
+ * \5, \7        - the second byte of POP/PUSH codes for FS, GS, depending
+ *                 on operand 0
+ * \10, \11, \12 - a literal byte follows in the code stream, to be added
+ *                 to the register value of operand 0, 1 or 2
+ * \17           - encodes the literal byte 0. (Some compilers don't take
+ *                 kindly to a zero byte in the _middle_ of a compile time
+ *                 string constant, so I had to put this hack in.)
+ * \14, \15, \16 - a signed byte immediate operand, from operand 0, 1 or 2
+ * \20, \21, \22 - a byte immediate operand, from operand 0, 1 or 2
+ * \24, \25, \26 - an unsigned byte immediate operand, from operand 0, 1 or 2
+ * \30, \31, \32 - a word immediate operand, from operand 0, 1 or 2
+ * \34, \35, \36 - select between \3[012] and \4[012] depending on 16/32 bit
+ *                 assembly mode or the address-size override on the operand
+ * \37           - a word constant, from the _segment_ part of operand 0
+ * \40, \41, \42 - a long immediate operand, from operand 0, 1 or 2
+ * \50, \51, \52 - a byte relative operand, from operand 0, 1 or 2
+ * \60, \61, \62 - a word relative operand, from operand 0, 1 or 2
+ * \64, \65, \66 - select between \6[012] and \7[012] depending on 16/32 bit
+ *                 assembly mode or the address-size override on the operand
+ * \70, \71, \72 - a long relative operand, from operand 0, 1 or 2
+ * \1ab          - a ModRM, calculated on EA in operand a, with the spare
+ *                 field the register value of operand b.
+ * \2ab          - a ModRM, calculated on EA in operand a, with the spare
+ *                 field equal to digit b.
+ * \30x          - might be an 0x67 byte, depending on the address size of
+ *                 the memory reference in operand x.
+ * \310          - indicates fixed 16-bit address size, i.e. optional 0x67.
+ * \311          - indicates fixed 32-bit address size, i.e. optional 0x67.
+ * \320          - indicates fixed 16-bit operand size, i.e. optional 0x66.
+ * \321          - indicates fixed 32-bit operand size, i.e. optional 0x66.
+ * \322          - indicates that this instruction is only valid when the
+ *                 operand size is the default (instruction to disassembler,
+ *                 generates no code in the assembler)
+ * \330          - a literal byte follows in the code stream, to be added
+ *                 to the condition code value of the instruction.
+ * \340          - reserve <operand 0> bytes of uninitialised storage.
+ *                 Operand 0 had better be a segmentless constant.
+ */
+
+#include <stdio.h>
+#include <string.h>
+
+#include "nasm.h"
+#include "nasmlib.h"
+#include "assemble.h"
+#include "insns.h"
+
+extern struct itemplate *nasm_instructions[];
+
+typedef struct {
+    int sib_present;                  /* is a SIB byte necessary? */
+    int bytes;                        /* # of bytes of offset needed */
+    int size;                         /* lazy - this is sib+bytes+1 */
+    unsigned char modrm, sib;         /* the bytes themselves */
+} ea;
+
+static efunc errfunc;
+static struct ofmt *outfmt;
+static ListGen *list;
+
+static long calcsize (long, long, int, insn *, char *);
+static void gencode (long, long, int, insn *, char *, long);
+static int regval (operand *o);
+static int matches (struct itemplate *, insn *);
+static ea *process_ea (operand *, ea *, int, int, int);
+static int chsize (operand *, int);
+
+/*
+ * This routine wrappers the real output format's output routine,
+ * in order to pass a copy of the data off to the listing file
+ * generator at the same time.
+ */
+static void out (long offset, long segto, void *data, unsigned long type,
+                long segment, long wrt) {
+    if ((type & OUT_TYPMASK) == OUT_ADDRESS) {
+       if (segment != NO_SEG || wrt != NO_SEG) {
+           /*
+            * This address is relocated. We must write it as
+            * OUT_ADDRESS, so there's no work to be done here.
+            */
+           list->output (offset, data, type);
+       } else {
+           unsigned char p[4], *q = p;
+           /*
+            * This is a non-relocated address, and we're going to
+            * convert it into RAWDATA format.
+            */
+           if ((type & OUT_SIZMASK) == 4) {
+               WRITELONG (q, * (long *) data);
+               list->output (offset, p, OUT_RAWDATA+4);
+           } else {
+               WRITESHORT (q, * (long *) data);
+               list->output (offset, p, OUT_RAWDATA+2);
+           }
+       }
+    } else if ((type & OUT_TYPMASK) == OUT_RAWDATA) {
+       list->output (offset, data, type);
+    } else if ((type & OUT_TYPMASK) == OUT_RESERVE) {
+       list->output (offset, NULL, type);
+    } else if ((type & OUT_TYPMASK) == OUT_REL2ADR ||
+              (type & OUT_TYPMASK) == OUT_REL4ADR) {
+       list->output (offset, data, type);
+    }
+
+    outfmt->output (segto, data, type, segment, wrt);
+}
+
+long assemble (long segment, long offset, int bits,
+              insn *instruction, struct ofmt *output, efunc error,
+              ListGen *listgen) {
+    int j, size_prob;
+    long insn_end, itimes;
+    long start = offset;
+    struct itemplate *temp;
+
+    errfunc = error;                  /* to pass to other functions */
+    outfmt = output;                  /* likewise */
+    list = listgen;                   /* and again */
+
+    if (instruction->opcode == -1)
+       return 0;
+
+    if (instruction->opcode == I_DB ||
+       instruction->opcode == I_DW ||
+       instruction->opcode == I_DD ||
+       instruction->opcode == I_DQ ||
+       instruction->opcode == I_DT) {
+       extop *e;
+       long wsize = 0;                /* placate gcc */
+       long t = instruction->times;
+
+       switch (instruction->opcode) {
+         case I_DB: wsize = 1; break;
+         case I_DW: wsize = 2; break;
+         case I_DD: wsize = 4; break;
+         case I_DQ: wsize = 8; break;
+         case I_DT: wsize = 10; break;
+       }
+
+       while (t--) {
+           for (e = instruction->eops; e; e = e->next) {
+               if (e->type == EOT_DB_NUMBER) {
+                   if (wsize == 1) {
+                       if (e->segment != NO_SEG)
+                           errfunc (ERR_NONFATAL,
+                                    "one-byte relocation attempted");
+                       else {
+                           unsigned char c = e->offset;
+                           out (offset, segment, &c, OUT_RAWDATA+1,
+                                NO_SEG, NO_SEG);
+                       }
+                   } else if (wsize > 5) {
+                       errfunc (ERR_NONFATAL, "integer supplied to a D%c"
+                                " instruction", wsize==8 ? 'Q' : 'T');
+                   } else
+                       out (offset, segment, &e->offset,
+                            OUT_ADDRESS+wsize, e->segment,
+                            e->wrt);
+                   offset += wsize;
+               } else if (e->type == EOT_DB_STRING) {
+                   int align;
+
+                   align = (-e->stringlen) % wsize;
+                   if (align < 0)
+                       align += wsize;
+                   out (offset, segment, e->stringval,
+                        OUT_RAWDATA+e->stringlen, NO_SEG, NO_SEG);
+                   if (align)
+                       out (offset, segment, "\0\0\0\0",
+                            OUT_RAWDATA+align, NO_SEG, NO_SEG);
+                   offset += e->stringlen + align;
+               }
+           }
+           if (t > 0 && t == instruction->times-1) {
+               /*
+                * Dummy call to list->output to give the offset to the
+                * listing module.
+                */
+               list->output (offset, NULL, OUT_RAWDATA);
+               list->uplevel (LIST_TIMES);
+           }
+       }
+       if (instruction->times > 1)
+           list->downlevel (LIST_TIMES);
+       return offset - start;
+    }
+
+    if (instruction->opcode == I_INCBIN) {
+       static char fname[FILENAME_MAX];
+       FILE *fp;
+       long len;
+
+       len = FILENAME_MAX-1;
+       if (len > instruction->eops->stringlen)
+           len = instruction->eops->stringlen;
+       strncpy (fname, instruction->eops->stringval, len);
+       fname[len] = '\0';
+       if (!(fp = fopen(fname, "rb")))
+           error (ERR_NONFATAL, "`incbin': unable to open file `%s'", fname);
+       else if (fseek(fp, 0L, SEEK_END) < 0)
+           error (ERR_NONFATAL, "`incbin': unable to seek on file `%s'",
+                  fname);
+       else {
+           static char buf[2048];
+           long t = instruction->times;
+           long l;
+
+           len = ftell (fp);
+           if (instruction->eops->next) {
+               len -= instruction->eops->next->offset;
+               if (instruction->eops->next->next &&
+                   len > instruction->eops->next->next->offset)
+                   len = instruction->eops->next->next->offset;
+           }
+           /*
+            * Dummy call to list->output to give the offset to the
+            * listing module.
+            */
+           list->output (offset, NULL, OUT_RAWDATA);
+           list->uplevel(LIST_INCBIN);
+           while (t--) {
+               fseek (fp, 
+                      (instruction->eops->next ?
+                       instruction->eops->next->offset : 0),
+                      SEEK_SET);               
+               l = len;
+               while (l > 0) {
+                   long m = fread (buf, 1, (l>sizeof(buf)?sizeof(buf):l),
+                                   fp);
+                   if (!m) {
+                       /*
+                        * This shouldn't happen unless the file
+                        * actually changes while we are reading
+                        * it.
+                        */
+                       error (ERR_NONFATAL, "`incbin': unexpected EOF while"
+                              " reading file `%s'", fname);
+                       return 0;      /* it doesn't much matter... */
+                   }
+                   out (offset, segment, buf, OUT_RAWDATA+m,
+                        NO_SEG, NO_SEG);
+                   l -= m;
+               }
+           }
+           list->downlevel(LIST_INCBIN);
+           if (instruction->times > 1) {
+               /*
+                * Dummy call to list->output to give the offset to the
+                * listing module.
+                */
+               list->output (offset, NULL, OUT_RAWDATA);
+               list->uplevel(LIST_TIMES);
+               list->downlevel(LIST_TIMES);
+           }
+           fclose (fp);
+           return instruction->times * len;
+       }
+       return 0;                      /* if we're here, there's an error */
+    }
+
+    size_prob = FALSE;
+    temp = nasm_instructions[instruction->opcode];
+    while (temp->opcode != -1) {
+       int m = matches (temp, instruction);
+       if (m == 100) {                /* matches! */
+           char *codes = temp->code;
+           long insn_size = calcsize(segment, offset, bits,
+                                     instruction, codes);
+           itimes = instruction->times;
+           if (insn_size < 0)         /* shouldn't be, on pass two */
+               error (ERR_PANIC, "errors made it through from pass one");
+           else while (itimes--) {
+               insn_end = offset + insn_size;
+               for (j=0; j<instruction->nprefix; j++) {
+                   unsigned char c;
+                   switch (instruction->prefixes[j]) {
+                     case P_LOCK:
+                       c = 0xF0; break;
+                     case P_REPNE: case P_REPNZ:
+                       c = 0xF2; break;
+                     case P_REPE: case P_REPZ: case P_REP:
+                       c = 0xF3; break;
+                     case R_CS: c = 0x2E; break;
+                     case R_DS: c = 0x3E; break;
+                     case R_ES: c = 0x26; break;
+                     case R_FS: c = 0x64; break;
+                     case R_GS: c = 0x65; break;
+                     case R_SS: c = 0x36; break;
+                     case P_A16:
+                       if (bits == 16)
+                           c = 0;     /* no prefix */
+                       else
+                           c = 0x67;
+                       break;
+                     case P_A32:
+                       if (bits == 32)
+                           c = 0;     /* no prefix */
+                       else
+                           c = 0x67;
+                       break;
+                     case P_O16:
+                       if (bits == 16)
+                           c = 0;     /* no prefix */
+                       else
+                           c = 0x66;
+                       break;
+                     case P_O32:
+                       if (bits == 32)
+                           c = 0;     /* no prefix */
+                       else
+                           c = 0x66;
+                       break;
+                     default:
+                       error (ERR_PANIC,
+                              "invalid instruction prefix");
+                   }
+                   if (c != 0)
+                       out (offset, segment, &c, OUT_RAWDATA+1,
+                            NO_SEG, NO_SEG);
+                   offset++;
+               }
+               gencode (segment, offset, bits, instruction, codes, insn_end);
+               offset += insn_size;
+               if (itimes > 0 && itimes == instruction->times-1) {
+                   /*
+                    * Dummy call to list->output to give the offset to the
+                    * listing module.
+                    */
+                   list->output (offset, NULL, OUT_RAWDATA);
+                   list->uplevel (LIST_TIMES);
+               }
+           }
+           if (instruction->times > 1)
+               list->downlevel (LIST_TIMES);
+           return offset - start;
+       } else if (m > 0) {
+           size_prob = m;
+       }
+       temp++;
+    }
+    if (temp->opcode == -1) {         /* didn't match any instruction */
+       if (size_prob == 1)            /* would have matched, but for size */
+           error (ERR_NONFATAL, "operation size not specified");
+       else if (size_prob == 2)
+           error (ERR_NONFATAL, "mismatch in operand sizes");
+       else
+           error (ERR_NONFATAL,
+                  "invalid combination of opcode and operands");
+    }
+    return 0;
+}
+
+long insn_size (long segment, long offset, int bits,
+               insn *instruction, efunc error) {
+    struct itemplate *temp;
+
+    errfunc = error;                  /* to pass to other functions */
+
+    if (instruction->opcode == -1)
+       return 0;
+
+    if (instruction->opcode == I_DB ||
+       instruction->opcode == I_DW ||
+       instruction->opcode == I_DD ||
+       instruction->opcode == I_DQ ||
+       instruction->opcode == I_DT) {
+       extop *e;
+       long isize, osize, wsize = 0;  /* placate gcc */
+
+       isize = 0;
+       switch (instruction->opcode) {
+         case I_DB: wsize = 1; break;
+         case I_DW: wsize = 2; break;
+         case I_DD: wsize = 4; break;
+         case I_DQ: wsize = 8; break;
+         case I_DT: wsize = 10; break;
+       }
+
+       for (e = instruction->eops; e; e = e->next) {
+           long align;
+
+           osize = 0;
+           if (e->type == EOT_DB_NUMBER)
+               osize = 1;
+           else if (e->type == EOT_DB_STRING)
+               osize = e->stringlen;
+
+           align = (-osize) % wsize;
+           if (align < 0)
+               align += wsize;
+           isize += osize + align;
+       }
+       return isize * instruction->times;
+    }
+
+    if (instruction->opcode == I_INCBIN) {
+       char fname[FILENAME_MAX];
+       FILE *fp;
+       long len;
+
+       len = FILENAME_MAX-1;
+       if (len > instruction->eops->stringlen)
+           len = instruction->eops->stringlen;
+       strncpy (fname, instruction->eops->stringval, len);
+       fname[len] = '\0';
+       if (!(fp = fopen(fname, "rb")))
+           error (ERR_NONFATAL, "`incbin': unable to open file `%s'", fname);
+       else if (fseek(fp, 0L, SEEK_END) < 0)
+           error (ERR_NONFATAL, "`incbin': unable to seek on file `%s'",
+                  fname);
+       else {
+           len = ftell (fp);
+           fclose (fp);
+           if (instruction->eops->next) {
+               len -= instruction->eops->next->offset;
+               if (instruction->eops->next->next &&
+                   len > instruction->eops->next->next->offset)
+                   len = instruction->eops->next->next->offset;
+           }
+           return instruction->times * len;
+       }
+       return 0;                      /* if we're here, there's an error */
+    }
+
+    temp = nasm_instructions[instruction->opcode];
+    while (temp->opcode != -1) {
+       if (matches(temp, instruction) == 100) {
+           /* we've matched an instruction. */
+           long isize;
+           char *codes = temp->code;
+           int j;
+
+           isize = calcsize(segment, offset, bits, instruction, codes);
+           if (isize < 0)
+               return -1;
+           for (j = 0; j < instruction->nprefix; j++) {
+               if ((instruction->prefixes[j] != P_A16 &&
+                    instruction->prefixes[j] != P_O16 && bits==16) ||
+                   (instruction->prefixes[j] != P_A32 &&
+                    instruction->prefixes[j] != P_O32 && bits==32))
+                   isize++;
+           }
+           return isize * instruction->times;
+       }
+       temp++;
+    }
+    return -1;                        /* didn't match any instruction */
+}
+
+static long calcsize (long segment, long offset, int bits,
+                     insn *ins, char *codes) {
+    long length = 0;
+    unsigned char c;
+
+    while (*codes) switch (c = *codes++) {
+      case 01: case 02: case 03:
+       codes += c, length += c; break;
+      case 04: case 05: case 06: case 07:
+       length++; break;
+      case 010: case 011: case 012:
+       codes++, length++; break;
+      case 017:
+       length++; break;
+      case 014: case 015: case 016:
+       length++; break;
+      case 020: case 021: case 022:
+       length++; break;
+      case 024: case 025: case 026:
+       length++; break;
+      case 030: case 031: case 032:
+       length += 2; break;
+      case 034: case 035: case 036:
+       length += ((ins->oprs[c-034].addr_size ?
+                   ins->oprs[c-034].addr_size : bits) == 16 ? 2 : 4); break;
+      case 037:
+       length += 2; break;
+      case 040: case 041: case 042:
+       length += 4; break;
+      case 050: case 051: case 052:
+       length++; break;
+      case 060: case 061: case 062:
+       length += 2; break;
+      case 064: case 065: case 066:
+       length += ((ins->oprs[c-064].addr_size ?
+                   ins->oprs[c-064].addr_size : bits) == 16 ? 2 : 4); break;
+      case 070: case 071: case 072:
+       length += 4; break;
+      case 0300: case 0301: case 0302:
+       length += chsize (&ins->oprs[c-0300], bits);
+       break;
+      case 0310:
+       length += (bits==32);
+       break;
+      case 0311:
+       length += (bits==16);
+       break;
+      case 0312:
+       break;
+      case 0320:
+       length += (bits==32);
+       break;
+      case 0321:
+       length += (bits==16);
+       break;
+      case 0322:
+       break;
+      case 0330:
+       codes++, length++; break;
+      case 0340: case 0341: case 0342:
+       if (ins->oprs[0].segment != NO_SEG)
+           errfunc (ERR_NONFATAL, "attempt to reserve non-constant"
+                    " quantity of BSS space");
+       else
+           length += ins->oprs[0].offset << (c-0340);
+       break;
+      default:                        /* can't do it by 'case' statements */
+       if (c>=0100 && c<=0277) {      /* it's an EA */
+           ea ea_data;
+           if (!process_ea (&ins->oprs[(c>>3)&7], &ea_data, bits, 0,
+                            ins->forw_ref)) {
+               errfunc (ERR_NONFATAL, "invalid effective address");
+               return -1;
+           } else
+               length += ea_data.size;
+       } else
+           errfunc (ERR_PANIC, "internal instruction table corrupt"
+                    ": instruction code 0x%02X given", c);
+    }
+    return length;
+}
+
+static void gencode (long segment, long offset, int bits,
+                    insn *ins, char *codes, long insn_end) {
+    static char condval[] = { /* conditional opcodes */
+       0x7, 0x3, 0x2, 0x6, 0x2, 0x4, 0xF, 0xD, 0xC, 0xE, 0x6, 0x2,
+       0x3, 0x7, 0x3, 0x5, 0xE, 0xC, 0xD, 0xF, 0x1, 0xB, 0x9, 0x5,
+       0x0, 0xA, 0xA, 0xB, 0x8, 0x4
+    };
+    unsigned char c, bytes[4];
+    long data, size;
+
+    while (*codes) switch (c = *codes++) {
+      case 01: case 02: case 03:
+       out (offset, segment, codes, OUT_RAWDATA+c, NO_SEG, NO_SEG);
+       codes += c;
+       offset += c;
+       break;
+      case 04: case 06:
+       switch (ins->oprs[0].basereg) {
+         case R_CS: bytes[0] = 0x0E + (c == 0x04 ? 1 : 0); break;
+         case R_DS: bytes[0] = 0x1E + (c == 0x04 ? 1 : 0); break;
+         case R_ES: bytes[0] = 0x06 + (c == 0x04 ? 1 : 0); break;
+         case R_SS: bytes[0] = 0x16 + (c == 0x04 ? 1 : 0); break;
+         default:
+           errfunc (ERR_PANIC, "bizarre 8086 segment register received");
+       }
+       out (offset, segment, bytes, OUT_RAWDATA+1, NO_SEG, NO_SEG);
+       offset++;
+       break;
+      case 05: case 07:
+       switch (ins->oprs[0].basereg) {
+         case R_FS: bytes[0] = 0xA0 + (c == 0x05 ? 1 : 0); break;
+         case R_GS: bytes[0] = 0xA8 + (c == 0x05 ? 1 : 0); break;
+         default:
+           errfunc (ERR_PANIC, "bizarre 386 segment register received");
+       }
+       out (offset, segment, bytes, OUT_RAWDATA+1, NO_SEG, NO_SEG);
+       offset++;
+       break;
+      case 010: case 011: case 012:
+       bytes[0] = *codes++ + regval(&ins->oprs[c-010]);
+       out (offset, segment, bytes, OUT_RAWDATA+1, NO_SEG, NO_SEG);
+       offset += 1;
+       break;
+      case 017:
+       bytes[0] = 0;
+       out (offset, segment, bytes, OUT_RAWDATA+1, NO_SEG, NO_SEG);
+       offset += 1;
+       break;
+      case 014: case 015: case 016:
+       if (ins->oprs[c-014].offset < -128 || ins->oprs[c-014].offset > 127)
+           errfunc (ERR_WARNING, "signed byte value exceeds bounds");
+       if (ins->oprs[c-014].segment != NO_SEG) {
+           data = ins->oprs[c-014].offset;
+           out (offset, segment, &data, OUT_ADDRESS+1,
+                ins->oprs[c-014].segment, ins->oprs[c-014].wrt);
+       } else {
+           bytes[0] = ins->oprs[c-014].offset;
+           out (offset, segment, bytes, OUT_RAWDATA+1, NO_SEG, NO_SEG);
+       }
+       offset += 1;
+       break;
+      case 020: case 021: case 022:
+       if (ins->oprs[c-020].offset < -256 || ins->oprs[c-020].offset > 255)
+           errfunc (ERR_WARNING, "byte value exceeds bounds");
+       if (ins->oprs[c-020].segment != NO_SEG) {
+           data = ins->oprs[c-020].offset;
+           out (offset, segment, &data, OUT_ADDRESS+1,
+                ins->oprs[c-020].segment, ins->oprs[c-020].wrt);
+       } else {
+           bytes[0] = ins->oprs[c-020].offset;
+           out (offset, segment, bytes, OUT_RAWDATA+1, NO_SEG, NO_SEG);
+       }
+       offset += 1;
+       break;
+      case 024: case 025: case 026:
+       if (ins->oprs[c-024].offset < 0 || ins->oprs[c-024].offset > 255)
+           errfunc (ERR_WARNING, "unsigned byte value exceeds bounds");
+       if (ins->oprs[c-024].segment != NO_SEG) {
+           data = ins->oprs[c-024].offset;
+           out (offset, segment, &data, OUT_ADDRESS+1,
+                ins->oprs[c-024].segment, ins->oprs[c-024].wrt);
+       } else {
+           bytes[0] = ins->oprs[c-024].offset;
+           out (offset, segment, bytes, OUT_RAWDATA+1, NO_SEG, NO_SEG);
+       }
+       offset += 1;
+       break;
+      case 030: case 031: case 032:
+       if (ins->oprs[c-030].segment == NO_SEG &&
+           ins->oprs[c-030].wrt == NO_SEG &&
+           (ins->oprs[c-030].offset < -65536L ||
+           ins->oprs[c-030].offset > 65535L))
+           errfunc (ERR_WARNING, "word value exceeds bounds");
+       data = ins->oprs[c-030].offset;
+       out (offset, segment, &data, OUT_ADDRESS+2,
+                       ins->oprs[c-030].segment, ins->oprs[c-030].wrt);
+       offset += 2;
+       break;
+      case 034: case 035: case 036:
+       data = ins->oprs[c-034].offset;
+       size = ((ins->oprs[c-034].addr_size ?
+                ins->oprs[c-034].addr_size : bits) == 16 ? 2 : 4);
+       if (size==16 && (data < -65536L || data > 65535L))
+           errfunc (ERR_WARNING, "word value exceeds bounds");
+       out (offset, segment, &data, OUT_ADDRESS+size,
+            ins->oprs[c-034].segment, ins->oprs[c-034].wrt);
+       offset += size;
+       break;
+      case 037:
+       if (ins->oprs[0].segment == NO_SEG)
+           errfunc (ERR_NONFATAL, "value referenced by FAR is not"
+                    " relocatable");
+       data = 0L;
+       out (offset, segment, &data, OUT_ADDRESS+2,
+            outfmt->segbase(1+ins->oprs[0].segment),
+                       ins->oprs[0].wrt);
+       offset += 2;
+       break;
+      case 040: case 041: case 042:
+       data = ins->oprs[c-040].offset;
+       out (offset, segment, &data, OUT_ADDRESS+4,
+            ins->oprs[c-040].segment, ins->oprs[c-040].wrt);
+       offset += 4;
+       break;
+      case 050: case 051: case 052:
+       if (ins->oprs[c-050].segment != segment)
+           errfunc (ERR_NONFATAL, "short relative jump outside segment");
+       data = ins->oprs[c-050].offset - insn_end;
+       if (data > 127 || data < -128)
+           errfunc (ERR_NONFATAL, "short jump is out of range");
+       bytes[0] = data;
+       out (offset, segment, bytes, OUT_RAWDATA+1, NO_SEG, NO_SEG);
+       offset += 1;
+       break;
+      case 060: case 061: case 062:
+       if (ins->oprs[c-060].segment != segment) {
+           data = ins->oprs[c-060].offset;
+           out (offset, segment, &data, OUT_REL2ADR+insn_end-offset,
+                ins->oprs[c-060].segment, ins->oprs[c-060].wrt);
+       } else {
+           data = ins->oprs[c-060].offset - insn_end;
+           out (offset, segment, &data,
+                OUT_ADDRESS+2, NO_SEG, NO_SEG);
+       }
+       offset += 2;
+       break;
+      case 064: case 065: case 066:
+       size = ((ins->oprs[c-064].addr_size ?
+                ins->oprs[c-064].addr_size : bits) == 16 ? 2 : 4);
+       if (ins->oprs[c-064].segment != segment) {
+           data = ins->oprs[c-064].offset;
+           size = (bits == 16 ? OUT_REL2ADR : OUT_REL4ADR);
+           out (offset, segment, &data, size+insn_end-offset,
+                ins->oprs[c-064].segment, ins->oprs[c-064].wrt);
+           size = (bits == 16 ? 2 : 4);
+       } else {
+           data = ins->oprs[c-064].offset - insn_end;
+           out (offset, segment, &data,
+                OUT_ADDRESS+size, NO_SEG, NO_SEG);
+       }
+       offset += size;
+       break;
+      case 070: case 071: case 072:
+       if (ins->oprs[c-070].segment != segment) {
+           data = ins->oprs[c-070].offset;
+           out (offset, segment, &data, OUT_REL4ADR+insn_end-offset,
+                ins->oprs[c-070].segment, ins->oprs[c-070].wrt);
+       } else {
+           data = ins->oprs[c-070].offset - insn_end;
+           out (offset, segment, &data,
+                OUT_ADDRESS+4, NO_SEG, NO_SEG);
+       }
+       offset += 4;
+       break;
+      case 0300: case 0301: case 0302:
+       if (chsize (&ins->oprs[c-0300], bits)) {
+           *bytes = 0x67;
+           out (offset, segment, bytes,
+                OUT_RAWDATA+1, NO_SEG, NO_SEG);
+           offset += 1;
+       } else
+           offset += 0;
+       break;
+      case 0310:
+       if (bits==32) {
+           *bytes = 0x67;
+           out (offset, segment, bytes,
+                OUT_RAWDATA+1, NO_SEG, NO_SEG);
+           offset += 1;
+       } else
+           offset += 0;
+       break;
+      case 0311:
+       if (bits==16) {
+           *bytes = 0x67;
+           out (offset, segment, bytes,
+                OUT_RAWDATA+1, NO_SEG, NO_SEG);
+           offset += 1;
+       } else
+           offset += 0;
+       break;
+      case 0312:
+       break;
+      case 0320:
+       if (bits==32) {
+           *bytes = 0x66;
+           out (offset, segment, bytes,
+                OUT_RAWDATA+1, NO_SEG, NO_SEG);
+           offset += 1;
+       } else
+           offset += 0;
+       break;
+      case 0321:
+       if (bits==16) {
+           *bytes = 0x66;
+           out (offset, segment, bytes,
+                OUT_RAWDATA+1, NO_SEG, NO_SEG);
+           offset += 1;
+       } else
+           offset += 0;
+       break;
+      case 0322:
+       break;
+      case 0330:
+       *bytes = *codes++ + condval[ins->condition];
+       out (offset, segment, bytes,
+            OUT_RAWDATA+1, NO_SEG, NO_SEG);
+       offset += 1;
+       break;
+      case 0340: case 0341: case 0342:
+       if (ins->oprs[0].segment != NO_SEG)
+           errfunc (ERR_PANIC, "non-constant BSS size in pass two");
+       else {
+           long size = ins->oprs[0].offset << (c-0340);
+           if (size > 0)
+               out (offset, segment, NULL,
+                    OUT_RESERVE+size, NO_SEG, NO_SEG);
+           offset += size;
+       }
+       break;
+      default:                        /* can't do it by 'case' statements */
+       if (c>=0100 && c<=0277) {      /* it's an EA */
+           ea ea_data;
+           int rfield;
+           unsigned char *p;
+           long s;
+
+           if (c<=0177)               /* pick rfield from operand b */
+               rfield = regval (&ins->oprs[c&7]);
+           else                       /* rfield is constant */
+               rfield = c & 7;
+           if (!process_ea (&ins->oprs[(c>>3)&7], &ea_data, bits, rfield,
+                            ins->forw_ref))
+               errfunc (ERR_NONFATAL, "invalid effective address");
+
+           p = bytes;
+           *p++ = ea_data.modrm;
+           if (ea_data.sib_present)
+               *p++ = ea_data.sib;
+           /*
+            * the cast in the next line is to placate MS C...
+            */
+           out (offset, segment, bytes, OUT_RAWDATA+(long)(p-bytes),
+                NO_SEG, NO_SEG);
+           s = p-bytes;
+
+           switch (ea_data.bytes) {
+             case 0:
+               break;
+             case 1:
+               if (ins->oprs[(c>>3)&7].segment != NO_SEG) {
+                   data = ins->oprs[(c>>3)&7].offset;
+                   out (offset, segment, &data, OUT_ADDRESS+1,
+                        ins->oprs[(c>>3)&7].segment,
+                        ins->oprs[(c>>3)&7].wrt);
+               } else {
+                   *bytes = ins->oprs[(c>>3)&7].offset;
+                   out (offset, segment, bytes, OUT_RAWDATA+1,
+                        NO_SEG, NO_SEG);
+               }
+               s++;
+               break;
+             case 2:
+             case 4:
+               data = ins->oprs[(c>>3)&7].offset;
+               out (offset, segment, &data,
+                    OUT_ADDRESS+ea_data.bytes,
+                    ins->oprs[(c>>3)&7].segment, ins->oprs[(c>>3)&7].wrt);
+               s += ea_data.bytes;
+               break;
+           }
+           offset += s;
+       } else
+           errfunc (ERR_PANIC, "internal instruction table corrupt"
+                    ": instruction code 0x%02X given", c);
+    }
+}
+
+static int regval (operand *o) {
+    switch (o->basereg) {
+      case R_EAX: case R_AX: case R_AL: case R_ES: case R_CR0: case R_DR0:
+      case R_ST0: case R_MM0:
+       return 0;
+      case R_ECX: case R_CX: case R_CL: case R_CS: case R_DR1: case R_ST1:
+      case R_MM1:
+       return 1;
+      case R_EDX: case R_DX: case R_DL: case R_SS: case R_CR2: case R_DR2:
+      case R_ST2: case R_MM2:
+       return 2;
+      case R_EBX: case R_BX: case R_BL: case R_DS: case R_CR3: case R_DR3:
+      case R_TR3: case R_ST3: case R_MM3:
+       return 3;
+      case R_ESP: case R_SP: case R_AH: case R_FS: case R_CR4: case R_TR4:
+      case R_ST4: case R_MM4:
+       return 4;
+      case R_EBP: case R_BP: case R_CH: case R_GS: case R_TR5: case R_ST5:
+      case R_MM5:
+       return 5;
+      case R_ESI: case R_SI: case R_DH: case R_DR6: case R_TR6: case R_ST6:
+      case R_MM6:
+       return 6;
+      case R_EDI: case R_DI: case R_BH: case R_DR7: case R_TR7: case R_ST7:
+      case R_MM7:
+       return 7;
+      default:                        /* panic */
+       errfunc (ERR_PANIC, "invalid register operand given to regval()");
+       return 0;
+    }
+}
+
+static int matches (struct itemplate *itemp, insn *instruction) {
+    int i, size, oprs, ret;
+
+    ret = 100;
+
+    /*
+     * Check the opcode
+     */
+    if (itemp->opcode != instruction->opcode) return 0;
+
+    /*
+     * Count the operands
+     */
+    if (itemp->operands != instruction->operands) return 0;
+
+    /*
+     * Check that no spurious colons or TOs are present
+     */
+    for (i=0; i<itemp->operands; i++)
+       if (instruction->oprs[i].type & ~itemp->opd[i] & (COLON|TO))
+           return 0;
+
+    /*
+     * Check that the operand flags all match up
+     */
+    for (i=0; i<itemp->operands; i++)
+       if (itemp->opd[i] & ~instruction->oprs[i].type ||
+           ((itemp->opd[i] & SIZE_MASK) &&
+            ((itemp->opd[i] ^ instruction->oprs[i].type) & SIZE_MASK))) {
+           if ((itemp->opd[i] & ~instruction->oprs[i].type & NON_SIZE) ||
+               (instruction->oprs[i].type & SIZE_MASK))
+               return 0;
+           else
+               ret = 1;
+       }
+
+    /*
+     * Check operand sizes
+     */
+    if (itemp->flags & IF_SB) {
+       size = BITS8;
+       oprs = itemp->operands;
+    } else if (itemp->flags & IF_SW) {
+       size = BITS16;
+       oprs = itemp->operands;
+    } else if (itemp->flags & IF_SD) {
+       size = BITS32;
+       oprs = itemp->operands;
+    } else if (itemp->flags & (IF_SM | IF_SM2)) {
+       oprs = (itemp->flags & IF_SM2 ? 2 : itemp->operands);
+       size = 0;                      /* placate gcc */
+       for (i=0; i<oprs; i++)
+           if ( (size = itemp->opd[i] & SIZE_MASK) != 0)
+               break;
+    } else {
+       size = 0;
+       oprs = itemp->operands;
+    }
+
+    for (i=0; i<itemp->operands; i++)
+       if (!(itemp->opd[i] & SIZE_MASK) &&
+           (instruction->oprs[i].type & SIZE_MASK & ~size))
+           ret = 2;
+
+    return ret;
+}
+
+static ea *process_ea (operand *input, ea *output, int addrbits, int rfield,
+                      int forw_ref) {
+    if (!(REGISTER & ~input->type)) {  /* it's a single register */
+       static int regs[] = {
+           R_MM0, R_EAX, R_AX, R_AL, R_MM1, R_ECX, R_CX, R_CL,
+           R_MM2, R_EDX, R_DX, R_DL, R_MM3, R_EBX, R_BX, R_BL,
+           R_MM4, R_ESP, R_SP, R_AH, R_MM5, R_EBP, R_BP, R_CH,
+           R_MM6, R_ESI, R_SI, R_DH, R_MM7, R_EDI, R_DI, R_BH
+       };
+       int i;
+
+       for (i=0; i<elements(regs); i++)
+           if (input->basereg == regs[i]) break;
+       if (i<elements(regs)) {
+           output->sib_present = FALSE;/* no SIB necessary */
+           output->bytes = 0;         /* no offset necessary either */
+           output->modrm = 0xC0 | (rfield << 3) | (i/4);
+       } else
+           return NULL;
+    } else {                          /* it's a memory reference */
+       if (input->basereg==-1 && (input->indexreg==-1 || input->scale==0)) {
+           /* it's a pure offset */
+           if (input->addr_size)
+               addrbits = input->addr_size;
+           output->sib_present = FALSE;
+           output->bytes = (addrbits==32 ? 4 : 2);
+           output->modrm = (addrbits==32 ? 5 : 6) | (rfield << 3);
+       } else {                       /* it's an indirection */
+           int i=input->indexreg, b=input->basereg, s=input->scale;
+           long o=input->offset, seg=input->segment;
+           int hb=input->hintbase, ht=input->hinttype;
+           int t;
+
+           if (s==0) i = -1;          /* make this easy, at least */
+
+           if (i==R_EAX || i==R_EBX || i==R_ECX || i==R_EDX
+               || i==R_EBP || i==R_ESP || i==R_ESI || i==R_EDI
+               || b==R_EAX || b==R_EBX || b==R_ECX || b==R_EDX
+               || b==R_EBP || b==R_ESP || b==R_ESI || b==R_EDI) {
+               /* it must be a 32-bit memory reference. Firstly we have
+                * to check that all registers involved are type Exx. */
+               if (i!=-1 && i!=R_EAX && i!=R_EBX && i!=R_ECX && i!=R_EDX
+                   && i!=R_EBP && i!=R_ESP && i!=R_ESI && i!=R_EDI)
+                   return NULL;
+               if (b!=-1 && b!=R_EAX && b!=R_EBX && b!=R_ECX && b!=R_EDX
+                   && b!=R_EBP && b!=R_ESP && b!=R_ESI && b!=R_EDI)
+                   return NULL;
+
+               /* While we're here, ensure the user didn't specify WORD. */
+               if (input->addr_size == 16)
+                   return NULL;
+
+               /* now reorganise base/index */
+               if (s == 1 && b != i && b != -1 && i != -1 &&
+                   ((hb==b&&ht==EAH_NOTBASE) || (hb==i&&ht==EAH_MAKEBASE)))
+                   t = b, b = i, i = t;   /* swap if hints say so */
+               if (b==i)              /* convert EAX+2*EAX to 3*EAX */
+                   b = -1, s++;
+               if (b==-1 && s==1 && !(hb == i && ht == EAH_NOTBASE))
+                   b = i, i = -1;     /* make single reg base, unless hint */
+               if (((s==2 && i!=R_ESP && !(input->eaflags & EAF_TIMESTWO)) ||
+                    s==3 || s==5 || s==9) && b==-1)
+                   b = i, s--;       /* convert 3*EAX to EAX+2*EAX */
+               if (s==1 && i==R_ESP)  /* swap ESP into base if scale is 1 */
+                   i = b, b = R_ESP;
+               if (i==R_ESP || (s!=1 && s!=2 && s!=4 && s!=8 && i!=-1))
+                   return NULL;      /* wrong, for various reasons */
+
+               if (i==-1 && b!=R_ESP) {/* no SIB needed */
+                   int mod, rm;
+                   switch(b) {
+                     case R_EAX: rm = 0; break;
+                     case R_ECX: rm = 1; break;
+                     case R_EDX: rm = 2; break;
+                     case R_EBX: rm = 3; break;
+                     case R_EBP: rm = 5; break;
+                     case R_ESI: rm = 6; break;
+                     case R_EDI: rm = 7; break;
+                     case -1: rm = 5; break;
+                     default:         /* should never happen */
+                       return NULL;
+                   }
+                   if (b==-1 || (b!=R_EBP && o==0 &&
+                                 seg==NO_SEG && !forw_ref &&
+                                 !(input->eaflags &
+                                   (EAF_BYTEOFFS|EAF_WORDOFFS))))
+                       mod = 0;
+                   else if (input->eaflags & EAF_BYTEOFFS ||
+                            (o>=-128 && o<=127 && seg==NO_SEG && !forw_ref &&
+                             !(input->eaflags & EAF_WORDOFFS))) {
+                       mod = 1;
+                   } else
+                       mod = 2;
+
+                   output->sib_present = FALSE;
+                   output->bytes = (b==-1 || mod==2 ? 4 : mod);
+                   output->modrm = (mod<<6) | (rfield<<3) | rm;
+               } else {               /* we need a SIB */
+                   int mod, scale, index, base;
+
+                   switch (b) {
+                     case R_EAX: base = 0; break;
+                     case R_ECX: base = 1; break;
+                     case R_EDX: base = 2; break;
+                     case R_EBX: base = 3; break;
+                     case R_ESP: base = 4; break;
+                     case R_EBP: case -1: base = 5; break;
+                     case R_ESI: base = 6; break;
+                     case R_EDI: base = 7; break;
+                     default:         /* then what the smeg is it? */
+                       return NULL;  /* panic */
+                   }
+
+                   switch (i) {
+                     case R_EAX: index = 0; break;
+                     case R_ECX: index = 1; break;
+                     case R_EDX: index = 2; break;
+                     case R_EBX: index = 3; break;
+                     case -1: index = 4; break;
+                     case R_EBP: index = 5; break;
+                     case R_ESI: index = 6; break;
+                     case R_EDI: index = 7; break;
+                     default:         /* then what the smeg is it? */
+                       return NULL;  /* panic */
+                   }
+
+                   if (i==-1) s = 1;
+                   switch (s) {
+                     case 1: scale = 0; break;
+                     case 2: scale = 1; break;
+                     case 4: scale = 2; break;
+                     case 8: scale = 3; break;
+                     default:         /* then what the smeg is it? */
+                       return NULL;  /* panic */
+                   }
+
+                   if (b==-1 || (b!=R_EBP && o==0 &&
+                                 seg==NO_SEG && !forw_ref &&
+                                 !(input->eaflags &
+                                   (EAF_BYTEOFFS|EAF_WORDOFFS))))
+                       mod = 0;
+                   else if (input->eaflags & EAF_BYTEOFFS ||
+                            (o>=-128 && o<=127 && seg==NO_SEG && !forw_ref &&
+                             !(input->eaflags & EAF_WORDOFFS)))
+                       mod = 1;
+                   else
+                       mod = 2;
+
+                   output->sib_present = TRUE;
+                   output->bytes = (b==-1 || mod==2 ? 4 : mod);
+                   output->modrm = (mod<<6) | (rfield<<3) | 4;
+                   output->sib = (scale<<6) | (index<<3) | base;
+               }
+           } else {                   /* it's 16-bit */
+               int mod, rm;
+
+               /* check all registers are BX, BP, SI or DI */
+               if ((b!=-1 && b!=R_BP && b!=R_BX && b!=R_SI && b!=R_DI) ||
+                   (i!=-1 && i!=R_BP && i!=R_BX && i!=R_SI && i!=R_DI))
+                   return NULL;
+
+               /* ensure the user didn't specify DWORD */
+               if (input->addr_size == 32)
+                   return NULL;
+
+               if (s!=1 && i!=-1) return NULL;/* no can do, in 16-bit EA */
+               if (b==-1 && i!=-1) b ^= i ^= b ^= i;   /* swap them round */
+               if ((b==R_SI || b==R_DI) && i!=-1)
+                   b ^= i ^= b ^= i; /* have BX/BP as base, SI/DI index */
+               if (b==i) return NULL;/* shouldn't ever happen, in theory */
+               if (i!=-1 && b!=-1 &&
+                   (i==R_BP || i==R_BX || b==R_SI || b==R_DI))
+                   return NULL;      /* invalid combinations */
+               if (b==-1)             /* pure offset: handled above */
+                   return NULL;      /* so if it gets to here, panic! */
+
+               rm = -1;
+               if (i!=-1)
+                   switch (i*256 + b) {
+                     case R_SI*256+R_BX: rm=0; break;
+                     case R_DI*256+R_BX: rm=1; break;
+                     case R_SI*256+R_BP: rm=2; break;
+                     case R_DI*256+R_BP: rm=3; break;
+                   }
+               else
+                   switch (b) {
+                     case R_SI: rm=4; break;
+                     case R_DI: rm=5; break;
+                     case R_BP: rm=6; break;
+                     case R_BX: rm=7; break;
+                   }
+               if (rm==-1)            /* can't happen, in theory */
+                   return NULL;      /* so panic if it does */
+
+               if (o==0 && seg==NO_SEG && !forw_ref && rm!=6 &&
+                   !(input->eaflags & (EAF_BYTEOFFS|EAF_WORDOFFS)))
+                   mod = 0;
+               else if (input->eaflags & EAF_BYTEOFFS ||
+                        (o>=-128 && o<=127 && seg==NO_SEG && !forw_ref &&
+                         !(input->eaflags & EAF_WORDOFFS)))
+                   mod = 1;
+               else
+                   mod = 2;
+
+               output->sib_present = FALSE;  /* no SIB - it's 16-bit */
+               output->bytes = mod;  /* bytes of offset needed */
+               output->modrm = (mod<<6) | (rfield<<3) | rm;
+           }
+       }
+    }
+    output->size = 1 + output->sib_present + output->bytes;
+    return output;
+}
+
+static int chsize (operand *input, int addrbits) {
+    if (!(MEMORY & ~input->type)) {
+       int i=input->indexreg, b=input->basereg;
+
+       if (input->scale==0) i = -1;
+
+       if (i == -1 && b == -1) /* pure offset */
+           return (input->addr_size != 0 && input->addr_size != addrbits);
+
+       if (i==R_EAX || i==R_EBX || i==R_ECX || i==R_EDX
+           || i==R_EBP || i==R_ESP || i==R_ESI || i==R_EDI
+           || b==R_EAX || b==R_EBX || b==R_ECX || b==R_EDX
+           || b==R_EBP || b==R_ESP || b==R_ESI || b==R_EDI)
+           return (addrbits==16);
+       else
+           return (addrbits==32);
+    } else
+       return 0;
+}
diff --git a/i386/nasm/assemble.h b/i386/nasm/assemble.h
new file mode 100644 (file)
index 0000000..aa22f7b
--- /dev/null
@@ -0,0 +1,41 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
+ * Reserved.  This file contains Original Code and/or Modifications of
+ * Original Code as defined in and that are subject to the Apple Public
+ * Source License Version 1.1 (the "License").  You may not use this file
+ * except in compliance with the License.  Please obtain a copy of the
+ * License at http://www.apple.com/publicsource and read it before using
+ * this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/* assemble.h  header file for assemble.c
+ *
+ * The Netwide Assembler is copyright (C) 1996 Simon Tatham and
+ * Julian Hall. All rights reserved. The software is
+ * redistributable under the licence given in the file "Licence"
+ * distributed in the NASM archive.
+ */
+
+#ifndef NASM_ASSEMBLE_H
+#define NASM_ASSEMBLE_H
+
+long insn_size (long segment, long offset, int bits,
+               insn *instruction, efunc error);
+long assemble (long segment, long offset, int bits,
+              insn *instruction, struct ofmt *output, efunc error,
+              ListGen *listgen);
+
+#endif
diff --git a/i386/nasm/disasm.c b/i386/nasm/disasm.c
new file mode 100644 (file)
index 0000000..739a55d
--- /dev/null
@@ -0,0 +1,709 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
+ * Reserved.  This file contains Original Code and/or Modifications of
+ * Original Code as defined in and that are subject to the Apple Public
+ * Source License Version 1.1 (the "License").  You may not use this file
+ * except in compliance with the License.  Please obtain a copy of the
+ * License at http://www.apple.com/publicsource and read it before using
+ * this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/* disasm.c   where all the _work_ gets done in the Netwide Disassembler
+ *
+ * The Netwide Assembler is copyright (C) 1996 Simon Tatham and
+ * Julian Hall. All rights reserved. The software is
+ * redistributable under the licence given in the file "Licence"
+ * distributed in the NASM archive.
+ *
+ * initial version 27/iii/95 by Simon Tatham
+ */
+
+#include <stdio.h>
+#include <string.h>
+
+#include "nasm.h"
+#include "disasm.h"
+#include "sync.h"
+#include "insns.h"
+
+#include "names.c"
+
+extern struct itemplate **itable[];
+
+/*
+ * Flags that go into the `segment' field of `insn' structures
+ * during disassembly.
+ */
+#define SEG_RELATIVE 1
+#define SEG_32BIT 2
+#define SEG_RMREG 4
+#define SEG_DISP8 8
+#define SEG_DISP16 16
+#define SEG_DISP32 32
+#define SEG_NODISP 64
+#define SEG_SIGNED 128
+
+static int whichreg(long regflags, int regval) {
+    static int reg32[] = {
+       R_EAX, R_ECX, R_EDX, R_EBX, R_ESP, R_EBP, R_ESI, R_EDI };
+    static int reg16[] = {
+       R_AX, R_CX, R_DX, R_BX, R_SP, R_BP, R_SI, R_DI };
+    static int reg8[] = {
+       R_AL, R_CL, R_DL, R_BL, R_AH, R_CH, R_DH, R_BH };
+    static int sreg[] = {
+       R_ES, R_CS, R_SS, R_DS, R_FS, R_GS, 0, 0 };
+    static int creg[] = {
+       R_CR0, 0, R_CR2, R_CR3, R_CR4, 0, 0, 0 };
+    static int dreg[] = {
+       R_DR0, R_DR1, R_DR2, R_DR3, 0, 0, R_DR6, R_DR7 };
+    static int treg[] = {
+       0, 0, 0, R_TR3, R_TR4, R_TR5, R_TR6, R_TR7 };
+    static int fpureg[] = {
+       R_ST0, R_ST1, R_ST2, R_ST3, R_ST4, R_ST5, R_ST6, R_ST7 };
+    static int mmxreg[] = {
+       R_MM0, R_MM1, R_MM2, R_MM3, R_MM4, R_MM5, R_MM6, R_MM7 };
+
+    if (!(REG_AL & ~regflags))
+       return R_AL;
+    if (!(REG_AX & ~regflags))
+       return R_AX;
+    if (!(REG_EAX & ~regflags))
+       return R_EAX;
+    if (!(REG_DX & ~regflags))
+       return R_DX;
+    if (!(REG_CL & ~regflags))
+       return R_CL;
+    if (!(REG_CX & ~regflags))
+       return R_CX;
+    if (!(REG_ECX & ~regflags))
+       return R_ECX;
+    if (!(REG_CR4 & ~regflags))
+       return R_CR4;
+    if (!(FPU0 & ~regflags))
+       return R_ST0;
+    if (!(REG_CS & ~regflags))
+       return R_CS;
+    if (!(REG_DESS & ~regflags))
+       return (regval == 0 || regval == 2 || regval == 3 ? sreg[regval] : 0);
+    if (!(REG_FSGS & ~regflags))
+       return (regval == 4 || regval == 5 ? sreg[regval] : 0);
+    if (!((REGMEM|BITS8) & ~regflags))
+       return reg8[regval];
+    if (!((REGMEM|BITS16) & ~regflags))
+       return reg16[regval];
+    if (!((REGMEM|BITS32) & ~regflags))
+       return reg32[regval];
+    if (!(REG_SREG & ~regflags))
+       return sreg[regval];
+    if (!(REG_CREG & ~regflags))
+       return creg[regval];
+    if (!(REG_DREG & ~regflags))
+       return dreg[regval];
+    if (!(REG_TREG & ~regflags))
+       return treg[regval];
+    if (!(FPUREG & ~regflags))
+       return fpureg[regval];
+    if (!(MMXREG & ~regflags))
+       return mmxreg[regval];
+    return 0;
+}
+
+static char *whichcond(int condval) {
+    static int conds[] = {
+       C_O, C_NO, C_C, C_NC, C_Z, C_NZ, C_NA, C_A,
+       C_S, C_NS, C_PE, C_PO, C_L, C_NL, C_NG, C_G
+    };
+    return conditions[conds[condval]];
+}
+
+/*
+ * Process an effective address (ModRM) specification.
+ */
+static unsigned char *do_ea (unsigned char *data, int modrm, int asize,
+                            int segsize, operand *op) {
+    int mod, rm, scale, index, base;
+
+    mod = (modrm >> 6) & 03;
+    rm = modrm & 07;
+
+    if (mod == 3) {                   /* pure register version */
+       op->basereg = rm;
+       op->segment |= SEG_RMREG;
+       return data;
+    }
+
+    op->addr_size = 0;
+
+    if (asize == 16) {
+       /*
+        * <mod> specifies the displacement size (none, byte or
+        * word), and <rm> specifies the register combination.
+        * Exception: mod=0,rm=6 does not specify [BP] as one might
+        * expect, but instead specifies [disp16].
+        */
+       op->indexreg = op->basereg = -1;
+       op->scale = 1;                 /* always, in 16 bits */
+       switch (rm) {
+         case 0: op->basereg = R_BX; op->indexreg = R_SI; break;
+         case 1: op->basereg = R_BX; op->indexreg = R_DI; break;
+         case 2: op->basereg = R_BP; op->indexreg = R_SI; break;
+         case 3: op->basereg = R_BP; op->indexreg = R_DI; break;
+         case 4: op->basereg = R_SI; break;
+         case 5: op->basereg = R_DI; break;
+         case 6: op->basereg = R_BP; break;
+         case 7: op->basereg = R_BX; break;
+       }
+       if (rm == 6 && mod == 0) {     /* special case */
+           op->basereg = -1;
+           if (segsize != 16)
+               op->addr_size = 16;
+           mod = 2;                   /* fake disp16 */
+       }
+       switch (mod) {
+         case 0:
+           op->segment |= SEG_NODISP;
+           break;
+         case 1:
+           op->segment |= SEG_DISP8;
+           op->offset = (signed char) *data++;
+           break;
+         case 2:
+           op->segment |= SEG_DISP16;
+           op->offset = *data++;
+           op->offset |= (*data++) << 8;
+           break;
+       }
+       return data;
+    } else {
+       /*
+        * Once again, <mod> specifies displacement size (this time
+        * none, byte or *dword*), while <rm> specifies the base
+        * register. Again, [EBP] is missing, replaced by a pure
+        * disp32 (this time that's mod=0,rm=*5*). However, rm=4
+        * indicates not a single base register, but instead the
+        * presence of a SIB byte...
+        */
+       op->indexreg = -1;
+       switch (rm) {
+         case 0: op->basereg = R_EAX; break;
+         case 1: op->basereg = R_ECX; break;
+         case 2: op->basereg = R_EDX; break;
+         case 3: op->basereg = R_EBX; break;
+         case 5: op->basereg = R_EBP; break;
+         case 6: op->basereg = R_ESI; break;
+         case 7: op->basereg = R_EDI; break;
+       }
+       if (rm == 5 && mod == 0) {
+           op->basereg = -1;
+           if (segsize != 32)
+               op->addr_size = 32;
+           mod = 2;                   /* fake disp32 */
+       }
+       if (rm == 4) {                 /* process SIB */
+           scale = (*data >> 6) & 03;
+           index = (*data >> 3) & 07;
+           base = *data & 07;
+           data++;
+
+           op->scale = 1 << scale;
+           switch (index) {
+             case 0: op->indexreg = R_EAX; break;
+             case 1: op->indexreg = R_ECX; break;
+             case 2: op->indexreg = R_EDX; break;
+             case 3: op->indexreg = R_EBX; break;
+             case 4: op->indexreg = -1; break;
+             case 5: op->indexreg = R_EBP; break;
+             case 6: op->indexreg = R_ESI; break;
+             case 7: op->indexreg = R_EDI; break;
+           }
+
+           switch (base) {
+             case 0: op->basereg = R_EAX; break;
+             case 1: op->basereg = R_ECX; break;
+             case 2: op->basereg = R_EDX; break;
+             case 3: op->basereg = R_EBX; break;
+             case 4: op->basereg = R_ESP; break;
+             case 6: op->basereg = R_ESI; break;
+             case 7: op->basereg = R_EDI; break;
+             case 5:
+               if (mod == 0) {
+                   mod = 2;
+                   op->basereg = -1;
+               } else
+                   op->basereg = R_EBP;
+               break;
+           }
+       }
+       switch (mod) {
+         case 0:
+           op->segment |= SEG_NODISP;
+           break;
+         case 1:
+           op->segment |= SEG_DISP8;
+           op->offset = (signed char) *data++;
+           break;
+         case 2:
+           op->segment |= SEG_DISP32;
+           op->offset = *data++;
+           op->offset |= (*data++) << 8;
+           op->offset |= ((long) *data++) << 16;
+           op->offset |= ((long) *data++) << 24;
+           break;
+       }
+       return data;
+    }
+}
+
+/*
+ * Determine whether the code string in r corresponds to the data
+ * stream in data. Return the number of bytes matched if so.
+ */
+static int matches (unsigned char *r, unsigned char *data, int asize,
+                   int osize, int segsize, insn *ins) {
+    unsigned char *origdata = data;
+    int a_used = FALSE, o_used = FALSE;
+
+    while (*r) {
+       int c = *r++;
+       if (c >= 01 && c <= 03) {
+           while (c--)
+               if (*r++ != *data++)
+                   return FALSE;
+       }
+       if (c == 04) {
+           switch (*data++) {
+             case 0x07: ins->oprs[0].basereg = 0; break;
+             case 0x17: ins->oprs[0].basereg = 2; break;
+             case 0x1F: ins->oprs[0].basereg = 3; break;
+             default: return FALSE;
+           }
+       }
+       if (c == 05) {
+           switch (*data++) {
+             case 0xA1: ins->oprs[0].basereg = 4; break;
+             case 0xA9: ins->oprs[0].basereg = 5; break;
+             default: return FALSE;
+           }
+       }
+       if (c == 06) {
+           switch (*data++) {
+             case 0x06: ins->oprs[0].basereg = 0; break;
+             case 0x0E: ins->oprs[0].basereg = 1; break;
+             case 0x16: ins->oprs[0].basereg = 2; break;
+             case 0x1E: ins->oprs[0].basereg = 3; break;
+             default: return FALSE;
+           }
+       }
+       if (c == 07) {
+           switch (*data++) {
+             case 0xA0: ins->oprs[0].basereg = 4; break;
+             case 0xA8: ins->oprs[0].basereg = 5; break;
+             default: return FALSE;
+           }
+       }
+       if (c >= 010 && c <= 012) {
+           int t = *r++, d = *data++;
+           if (d < t || d > t+7)
+               return FALSE;
+           else {
+               ins->oprs[c-010].basereg = d-t;
+               ins->oprs[c-010].segment |= SEG_RMREG;
+           }
+       }
+       if (c == 017)
+           if (*data++)
+               return FALSE;
+       if (c >= 014 && c <= 016) {
+           ins->oprs[c-014].offset = (signed char) *data++;
+           ins->oprs[c-014].segment |= SEG_SIGNED;
+       }
+       if (c >= 020 && c <= 022)
+           ins->oprs[c-020].offset = *data++;
+       if (c >= 024 && c <= 026)
+           ins->oprs[c-024].offset = *data++;
+       if (c >= 030 && c <= 032) {
+           ins->oprs[c-030].offset = *data++;
+           ins->oprs[c-030].offset |= (*data++ << 8);
+       }
+       if (c >= 034 && c <= 036) {
+           ins->oprs[c-034].offset = *data++;
+           ins->oprs[c-034].offset |= (*data++ << 8);
+           if (asize == 32) {
+               ins->oprs[c-034].offset |= (((long) *data++) << 16);
+               ins->oprs[c-034].offset |= (((long) *data++) << 24);
+           }
+           if (segsize != asize)
+               ins->oprs[c-034].addr_size = asize;
+       }
+       if (c >= 040 && c <= 042) {
+           ins->oprs[c-040].offset = *data++;
+           ins->oprs[c-040].offset |= (*data++ << 8);
+           ins->oprs[c-040].offset |= (((long) *data++) << 16);
+           ins->oprs[c-040].offset |= (((long) *data++) << 24);
+       }
+       if (c >= 050 && c <= 052) {
+           ins->oprs[c-050].offset = (signed char) *data++;
+           ins->oprs[c-050].segment |= SEG_RELATIVE;
+       }
+       if (c >= 060 && c <= 062) {
+           ins->oprs[c-060].offset = *data++;
+           ins->oprs[c-060].offset |= (*data++ << 8);
+           ins->oprs[c-060].segment |= SEG_RELATIVE;
+           ins->oprs[c-060].segment &= ~SEG_32BIT;
+       }
+       if (c >= 064 && c <= 066) {
+           ins->oprs[c-064].offset = *data++;
+           ins->oprs[c-064].offset |= (*data++ << 8);
+           if (asize == 32) {
+               ins->oprs[c-064].offset |= (((long) *data++) << 16);
+               ins->oprs[c-064].offset |= (((long) *data++) << 24);
+               ins->oprs[c-064].segment |= SEG_32BIT;
+           } else
+               ins->oprs[c-064].segment &= ~SEG_32BIT;
+           ins->oprs[c-064].segment |= SEG_RELATIVE;
+           if (segsize != asize)
+               ins->oprs[c-064].addr_size = asize;
+       }
+       if (c >= 070 && c <= 072) {
+           ins->oprs[c-070].offset = *data++;
+           ins->oprs[c-070].offset |= (*data++ << 8);
+           ins->oprs[c-070].offset |= (((long) *data++) << 16);
+           ins->oprs[c-070].offset |= (((long) *data++) << 24);
+           ins->oprs[c-070].segment |= SEG_32BIT | SEG_RELATIVE;
+       }
+       if (c >= 0100 && c <= 0177) {
+           int modrm = *data++;
+           ins->oprs[c & 07].basereg = (modrm >> 3) & 07;
+           ins->oprs[c & 07].segment |= SEG_RMREG;
+           data = do_ea (data, modrm, asize, segsize,
+                         &ins->oprs[(c >> 3) & 07]);
+       }
+       if (c >= 0200 && c <= 0277) {
+           int modrm = *data++;
+           if (((modrm >> 3) & 07) != (c & 07))
+               return FALSE;          /* spare field doesn't match up */
+           data = do_ea (data, modrm, asize, segsize,
+                         &ins->oprs[(c >> 3) & 07]);
+       }
+       if (c >= 0300 && c <= 0302) {
+           if (asize)
+               ins->oprs[c-0300].segment |= SEG_32BIT;
+           else
+               ins->oprs[c-0300].segment &= ~SEG_32BIT;
+           a_used = TRUE;
+       }
+       if (c == 0310) {
+           if (asize == 32)
+               return FALSE;
+           else
+               a_used = TRUE;
+       }
+       if (c == 0311) {
+           if (asize == 16)
+               return FALSE;
+           else
+               a_used = TRUE;
+       }
+       if (c == 0312) {
+           if (asize != segsize)
+               return FALSE;
+           else
+               a_used = TRUE;
+       }
+       if (c == 0320) {
+           if (osize == 32)
+               return FALSE;
+           else
+               o_used = TRUE;
+       }
+       if (c == 0321) {
+           if (osize == 16)
+               return FALSE;
+           else
+               o_used = TRUE;
+       }
+       if (c == 0322) {
+           if (osize != segsize)
+               return FALSE;
+           else
+               o_used = TRUE;
+       }
+       if (c == 0330) {
+           int t = *r++, d = *data++;
+           if (d < t || d > t+15)
+               return FALSE;
+           else
+               ins->condition = d - t;
+       }
+    }
+
+    /*
+     * Check for unused a/o prefixes.
+     */
+    ins->nprefix = 0;
+    if (!a_used && asize != segsize)
+       ins->prefixes[ins->nprefix++] = (asize == 16 ? P_A16 : P_A32);
+    if (!o_used && osize != segsize)
+       ins->prefixes[ins->nprefix++] = (osize == 16 ? P_O16 : P_O32);
+
+    return data - origdata;
+}
+
+long disasm (unsigned char *data, char *output, int segsize, long offset,
+            int autosync) {
+    struct itemplate **p;
+    int length = 0;
+    char *segover;
+    int rep, lock, asize, osize, i, slen, colon;
+    unsigned char *origdata;
+    int works;
+    insn ins;
+
+    /*
+     * Scan for prefixes.
+     */
+    asize = osize = segsize;
+    segover = NULL;
+    rep = lock = 0;
+    origdata = data;
+    for (;;) {
+       if (*data == 0xF3 || *data == 0xF2)
+           rep = *data++;
+       else if (*data == 0xF0)
+           lock = *data++;
+       else if (*data == 0x2E || *data == 0x36 || *data == 0x3E ||
+                *data == 0x26 || *data == 0x64 || *data == 0x65) {
+           switch (*data++) {
+             case 0x2E: segover = "cs"; break;
+             case 0x36: segover = "ss"; break;
+             case 0x3E: segover = "ds"; break;
+             case 0x26: segover = "es"; break;
+             case 0x64: segover = "fs"; break;
+             case 0x65: segover = "gs"; break;
+           }
+       } else if (*data == 0x66)
+           osize = 48 - segsize, data++;
+       else if (*data == 0x67)
+           asize = 48 - segsize, data++;
+       else
+           break;
+    }
+
+    ins.oprs[0].segment = ins.oprs[1].segment = ins.oprs[2].segment =
+    ins.oprs[0].addr_size = ins.oprs[1].addr_size = ins.oprs[2].addr_size =
+       (segsize == 16 ? 0 : SEG_32BIT);
+    ins.condition = -1;
+    works = TRUE;
+    for (p = itable[*data]; *p; p++)
+       if ( (length = matches((unsigned char *)((*p)->code), data,
+                              asize, osize, segsize, &ins)) ) {
+           works = TRUE;
+           /*
+            * Final check to make sure the types of r/m match up.
+            */
+           for (i = 0; i < (*p)->operands; i++)
+               if (
+                   
+                   /* If it's a mem-only EA but we have a register, die. */
+                   ((ins.oprs[i].segment & SEG_RMREG) &&
+                    !(MEMORY & ~(*p)->opd[i])) ||
+                   
+                   /* If it's a reg-only EA but we have a memory ref, die. */
+                   (!(ins.oprs[i].segment & SEG_RMREG) &&
+                    !(REGNORM & ~(*p)->opd[i]) &&
+                    !((*p)->opd[i] & REG_SMASK)) ||
+
+                   /* Register type mismatch (eg FS vs REG_DESS): die. */
+                   ((((*p)->opd[i] & (REGISTER | FPUREG)) ||
+                     (ins.oprs[i].segment & SEG_RMREG)) &&
+                    !whichreg ((*p)->opd[i], ins.oprs[i].basereg)))
+
+                   works = FALSE;
+           if (works)
+               break;
+       }
+    if (!length || !works)
+       return 0;                      /* no instruction was matched */
+
+    slen = 0;
+
+    if (rep) {
+       slen += sprintf(output+slen, "rep%s ",
+                       (rep == 0xF2 ? "ne" :
+                        (*p)->opcode == I_CMPSB ||
+                        (*p)->opcode == I_CMPSW ||
+                        (*p)->opcode == I_CMPSD ||
+                        (*p)->opcode == I_SCASB ||
+                        (*p)->opcode == I_SCASW ||
+                        (*p)->opcode == I_SCASD ? "e" : ""));
+    }
+    if (lock)
+       slen += sprintf(output+slen, "lock ");
+    for (i = 0; i < ins.nprefix; i++)
+       switch (ins.prefixes[i]) {
+         case P_A16: slen += sprintf(output+slen, "a16 "); break;
+         case P_A32: slen += sprintf(output+slen, "a32 "); break;
+         case P_O16: slen += sprintf(output+slen, "o16 "); break;
+         case P_O32: slen += sprintf(output+slen, "o32 "); break;
+       }
+
+    for (i = 0; i < elements(ico); i++)
+       if ((*p)->opcode == ico[i]) {
+           slen += sprintf(output+slen, "%s%s", icn[i],
+                           whichcond(ins.condition));
+           break;
+       }
+    if (i >= elements(ico))
+       slen += sprintf(output+slen, "%s", insn_names[(*p)->opcode]);
+    colon = FALSE;
+    length += data - origdata;        /* fix up for prefixes */
+    for (i=0; i<(*p)->operands; i++) {
+       output[slen++] = (colon ? ':' : i==0 ? ' ' : ',');
+
+       if (ins.oprs[i].segment & SEG_RELATIVE) {
+           ins.oprs[i].offset += offset + length;
+           /*
+            * sort out wraparound
+            */
+           if (!(ins.oprs[i].segment & SEG_32BIT))
+               ins.oprs[i].offset &= 0xFFFF;
+           /*
+            * add sync marker, if autosync is on
+            */
+           if (autosync)
+               add_sync (ins.oprs[i].offset, 0L);
+       }
+
+       if ((*p)->opd[i] & COLON)
+           colon = TRUE;
+       else
+           colon = FALSE;
+
+       if (((*p)->opd[i] & (REGISTER | FPUREG)) ||
+           (ins.oprs[i].segment & SEG_RMREG)) {
+           ins.oprs[i].basereg = whichreg ((*p)->opd[i],
+                                           ins.oprs[i].basereg);
+           slen += sprintf(output+slen, "%s",
+                           reg_names[ins.oprs[i].basereg-EXPR_REG_START]);
+       } else if (!(UNITY & ~(*p)->opd[i])) {
+           output[slen++] = '1';
+       } else if ( (*p)->opd[i] & IMMEDIATE ) {
+           if ( (*p)->opd[i] & BITS8 ) {
+               slen += sprintf(output+slen, "byte ");
+               if (ins.oprs[i].segment & SEG_SIGNED) {
+                   if (ins.oprs[i].offset < 0) {
+                       ins.oprs[i].offset *= -1;
+                       output[slen++] = '-';
+                   } else
+                       output[slen++] = '+';
+               }
+           } else if ( (*p)->opd[i] & BITS16 ) {
+               slen += sprintf(output+slen, "word ");
+           } else if ( (*p)->opd[i] & BITS32 ) {
+               slen += sprintf(output+slen, "dword ");
+           } else if ( (*p)->opd[i] & NEAR ) {
+               slen += sprintf(output+slen, "near ");
+           } else if ( (*p)->opd[i] & SHORT ) {
+               slen += sprintf(output+slen, "short ");
+           }
+           slen += sprintf(output+slen, "0x%lx", ins.oprs[i].offset);
+       } else if ( !(MEM_OFFS & ~(*p)->opd[i]) ) {
+           slen += sprintf(output+slen, "[%s%s%s0x%lx]",
+                           (segover ? segover : ""),
+                           (segover ? ":" : ""),
+                           (ins.oprs[i].addr_size == 32 ? "dword " :
+                            ins.oprs[i].addr_size == 16 ? "word " : ""),
+                           ins.oprs[i].offset);
+           segover = NULL;
+       } else if ( !(REGMEM & ~(*p)->opd[i]) ) {
+           int started = FALSE;
+           if ( (*p)->opd[i] & BITS8 )
+               slen += sprintf(output+slen, "byte ");
+           if ( (*p)->opd[i] & BITS16 )
+               slen += sprintf(output+slen, "word ");
+           if ( (*p)->opd[i] & BITS32 )
+               slen += sprintf(output+slen, "dword ");
+           if ( (*p)->opd[i] & BITS64 )
+               slen += sprintf(output+slen, "qword ");
+           if ( (*p)->opd[i] & BITS80 )
+               slen += sprintf(output+slen, "tword ");
+           if ( (*p)->opd[i] & FAR )
+               slen += sprintf(output+slen, "far ");
+           if ( (*p)->opd[i] & NEAR )
+               slen += sprintf(output+slen, "near ");
+           output[slen++] = '[';
+           if (ins.oprs[i].addr_size)
+               slen += sprintf(output+slen, "%s",
+                               (ins.oprs[i].addr_size == 32 ? "dword " :
+                                ins.oprs[i].addr_size == 16 ? "word " : ""));
+           if (segover) {
+               slen += sprintf(output+slen, "%s:", segover);
+               segover = NULL;
+           }
+           if (ins.oprs[i].basereg != -1) {
+               slen += sprintf(output+slen, "%s",
+                               reg_names[(ins.oprs[i].basereg -
+                                          EXPR_REG_START)]);
+               started = TRUE;
+           }
+           if (ins.oprs[i].indexreg != -1) {
+               if (started)
+                   output[slen++] = '+';
+               slen += sprintf(output+slen, "%s",
+                               reg_names[(ins.oprs[i].indexreg -
+                                          EXPR_REG_START)]);
+               if (ins.oprs[i].scale > 1)
+                   slen += sprintf(output+slen, "*%d", ins.oprs[i].scale);
+               started = TRUE;
+           }
+           if (ins.oprs[i].segment & SEG_DISP8) {
+               int sign = '+';
+               if (ins.oprs[i].offset & 0x80) {
+                   ins.oprs[i].offset = - (signed char) ins.oprs[i].offset;
+                   sign = '-';
+               }
+               slen += sprintf(output+slen, "%c0x%lx", sign,
+                               ins.oprs[i].offset);
+           } else if (ins.oprs[i].segment & SEG_DISP16) {
+               if (started)
+                   output[slen++] = '+';
+               slen += sprintf(output+slen, "0x%lx", ins.oprs[i].offset);
+           } else if (ins.oprs[i].segment & SEG_DISP32) {
+               if (started)
+                   output[slen++] = '+';
+               slen += sprintf(output+slen, "0x%lx", ins.oprs[i].offset);
+           }
+           output[slen++] = ']';
+       } else {
+           slen += sprintf(output+slen, "<operand%d>", i);
+       }
+    }
+    output[slen] = '\0';
+    if (segover) {                    /* unused segment override */
+       char *p = output;
+       int count = slen+1;
+       while (count--)
+           p[count+3] = p[count];
+       strncpy (output, segover, 2);
+       output[2] = ' ';
+    }
+    return length;
+}
+
+long eatbyte (unsigned char *data, char *output) {
+    sprintf(output, "db 0x%02X", *data);
+    return 1;
+}
diff --git a/i386/nasm/disasm.h b/i386/nasm/disasm.h
new file mode 100644 (file)
index 0000000..26499fc
--- /dev/null
@@ -0,0 +1,41 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
+ * Reserved.  This file contains Original Code and/or Modifications of
+ * Original Code as defined in and that are subject to the Apple Public
+ * Source License Version 1.1 (the "License").  You may not use this file
+ * except in compliance with the License.  Please obtain a copy of the
+ * License at http://www.apple.com/publicsource and read it before using
+ * this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/* disasm.h   header file for disasm.c
+ *
+ * The Netwide Assembler is copyright (C) 1996 Simon Tatham and
+ * Julian Hall. All rights reserved. The software is
+ * redistributable under the licence given in the file "Licence"
+ * distributed in the NASM archive.
+ */
+
+#ifndef NASM_DISASM_H
+#define NASM_DISASM_H
+
+#define INSN_MAX 32    /* one instruction can't be longer than this */
+
+long disasm (unsigned char *data, char *output, int segsize, long offset,
+            int autosync);
+long eatbyte (unsigned char *data, char *output);
+
+#endif
diff --git a/i386/nasm/doc/Licence b/i386/nasm/doc/Licence
new file mode 100644 (file)
index 0000000..5856d40
--- /dev/null
@@ -0,0 +1,98 @@
+Terms and Conditions for the use of the Netwide Assembler
+=========================================================
+
+Can I have the gist without reading the legalese?
+-------------------------------------------------
+
+Basically, NASM is free. You can't charge for it. You can copy it as
+much as you like. You can incorporate it, or bits of it, into other
+free programs if you want. (But we want to know about it if you do,
+and we want to be mentioned in the credits.) We may well allow you
+to incorporate it into commercial software too, but we'll probably
+demand some money for it, and we'll certainly demand to be given
+credit. And in extreme cases (although I can't immediately think of
+a reason we might actually want to do this) we may refuse to let you
+do it at all.
+
+NASM LICENCE AGREEMENT
+======================
+
+By "the Software" this licence refers to the complete contents of
+the NASM archive, excluding this licence document itself, and
+excluding the contents of the `test' directory. The Netwide
+Disassembler, NDISASM, is specifically included under this licence.
+
+I. The Software is freely redistributable; anyone may copy the
+Software, or parts of the Software, and give away as many copies as
+they like to anyone, as long as this licence document is kept with
+the Software. Charging a fee for the Software is prohibited,
+although a fee may be charged for the act of transferring a copy,
+and you can offer warranty protection and charge a fee for that.
+
+II. The Software, or parts thereof, may be incorporated into other
+freely redistributable software (by which we mean software that may
+be obtained free of charge) without requiring permission from the
+authors, as long as due credit is given to the authors of the
+Software in the resulting work, as long as the authors are informed
+of this action if possible, and as long as those parts of the
+Software that are used remain under this licence.
+
+III. Modified forms of the Software may be created and distributed
+as long as the authors are informed of this action if possible, as
+long as the resulting work remains under this licence, as long as
+the modified form of the Software is distributed with documentation
+which still gives credit to the original authors of the Software,
+and as long as the modified form of the Software is distributed with
+a clear statement that it is not the original form of the Software
+in the form that it was distributed by the authors.
+
+IV. The Software, or parts thereof, may be incorporated into other
+software which is not freely redistributable (i.e. software for
+which a fee is charged), as long as permission is granted from the
+authors of the Software. The authors reserve the right to grant this
+permission only for a fee, which may at our option take the form of
+royalty payments. The authors also reserve the right to refuse to
+grant permission if they deem it necessary.
+
+V. The Software may be incorporated, in its original archive form,
+into software collections or archives which are not freely
+redistributable, as long as it is clearly stated that the Software
+itself remains freely redistributable and remains under this licence
+and no other. Such collections are deemed not to fall under article
+IV of this licence.
+
+VI. Object files or programs generated by the Software as output do
+not fall under this licence at all, and may be placed under any
+licence the author wishes. The authors explicitly lay no claim to,
+and assert no rights over, any programs written by other people and
+assembled into object form by the Software.
+
+VII. You may not copy, modify or distribute the Software except
+under the terms given in this licence document. You may not
+sublicense the Software or in any way place it under any other
+licence than this one. Since you have not signed this licence, you
+are not of course required to accept it; however, no other licence
+applies to the Software, and nothing else grants you any permission
+to copy, modify, sublicense or distribute the Software in any way.
+These actions are therefore prohibited if you do not accept this
+licence.
+
+VIII. There is no warranty for the Software, to the extent permitted
+by applicable law. The authors provide the Software "as is" without
+warranty of any kind, either expressed or implied, including but not
+limited to the implied warranties of merchantability and fitness for
+a particular purpose. The entire risk as to the quality and
+performance of the Software is with you. Should the Software prove
+defective, you assume the cost of all necessary servicing, repair or
+correction.
+
+IX. In no event, unless required by applicable law or agreed to in
+writing, will any of the authors be liable to you for damages,
+including any general, special, incidental or consequential damages,
+arising out of the use or the inability to use the Software,
+including but not limited to loss of data or data being rendered
+inaccurate or a failure of the Software to operate with any other
+programs, even if you have been advised of the possibility of such
+damages.
+
+END OF LICENCE AGREEMENT
diff --git a/i386/nasm/doc/nasmdoc.txt b/i386/nasm/doc/nasmdoc.txt
new file mode 100644 (file)
index 0000000..62660ab
--- /dev/null
@@ -0,0 +1,8241 @@
+                        The Netwide Assembler: NASM
+                        ===========================
+
+Chapter 1: Introduction
+-----------------------
+
+   1.1 What Is NASM?
+
+       The Netwide Assembler, NASM, is an 80x86 assembler designed for
+       portability and modularity. It supports a range of object file
+       formats, including Linux `a.out' and ELF, NetBSD/FreeBSD, COFF,
+       Microsoft 16-bit OBJ and Win32. It will also output plain binary
+       files. Its syntax is designed to be simple and easy to understand,
+       similar to Intel's but less complex. It supports Pentium, P6 and MMX
+       opcodes, and has macro capability.
+
+ 1.1.1 Why Yet Another Assembler?
+
+       The Netwide Assembler grew out of an idea on `comp.lang.asm.x86' (or
+       possibly `alt.lang.asm' - I forget which), which was essentially
+       that there didn't seem to be a good free x86-series assembler
+       around, and that maybe someone ought to write one.
+
+       (*) `a86' is good, but not free, and in particular you don't get any
+           32-bit capability until you pay. It's DOS only, too.
+
+       (*) `gas' is free, and ports over DOS and Unix, but it's not very
+           good, since it's designed to be a back end to `gcc', which
+           always feeds it correct code. So its error checking is minimal.
+           Also, its syntax is horrible, from the point of view of anyone
+           trying to actually _write_ anything in it. Plus you can't write
+           16-bit code in it (properly).
+
+       (*) `as86' is Linux-specific, and (my version at least) doesn't seem
+           to have much (or any) documentation.
+
+       (*) MASM isn't very good, and it's expensive, and it runs only under
+           DOS.
+
+       (*) TASM is better, but still strives for MASM compatibility, which
+           means millions of directives and tons of red tape. And its
+           syntax is essentially MASM's, with the contradictions and quirks
+           that entails (although it sorts out some of those by means of
+           Ideal mode). It's expensive too. And it's DOS-only.
+
+       So here, for your coding pleasure, is NASM. At present it's still in
+       prototype stage - we don't promise that it can outperform any of
+       these assemblers. But please, _please_ send us bug reports, fixes,
+       helpful information, and anything else you can get your hands on
+       (and thanks to the many people who've done this already! You all
+       know who you are), and we'll improve it out of all recognition.
+       Again.
+
+ 1.1.2 Licence Conditions
+
+       Please see the file `Licence', supplied as part of any NASM
+       distribution archive, for the licence conditions under which you may
+       use NASM.
+
+   1.2 Contact Information
+
+       NASM has a WWW page at `http://www.cryogen.com/Nasm'. The authors
+       are e-mailable as `jules@earthcorp.com' and `anakin@pobox.com'. If
+       you want to report a bug to us, please read section 10.2 first.
+
+       New releases of NASM are uploaded to `sunsite.unc.edu',
+       `ftp.simtel.net' and `ftp.coast.net'. Announcements are posted to
+       `comp.lang.asm.x86', `alt.lang.asm', `comp.os.linux.announce' and
+       `comp.archives.msdos.announce' (the last one is done automagically
+       by uploading to `ftp.simtel.net').
+
+       If you don't have Usenet access, or would rather be informed by
+       e-mail when new releases come out, e-mail `anakin@pobox.com' and
+       ask.
+
+   1.3 Installation
+
+ 1.3.1 Installing NASM under MS-DOS or Windows
+
+       Once you've obtained the DOS archive for NASM, `nasmXXX.zip' (where
+       `XXX' denotes the version number of NASM contained in the archive),
+       unpack it into its own directory (for example `c:\nasm').
+
+       The archive will contain four executable files: the NASM executable
+       files `nasm.exe' and `nasmw.exe', and the NDISASM executable files
+       `ndisasm.exe' and `ndisasmw.exe'. In each case, the file whose name
+       ends in `w' is a Win32 executable, designed to run under Windows 95
+       or Windows NT Intel, and the other one is a 16-bit DOS executable.
+
+       The only file NASM needs to run is its own executable, so copy (at
+       least) one of `nasm.exe' and `nasmw.exe' to a directory on your
+       PATH, or alternatively edit `autoexec.bat' to add the `nasm'
+       directory to your `PATH'. (If you're only installing the Win32
+       version, you may wish to rename it to `nasm.exe'.)
+
+       That's it - NASM is installed. You don't need the `nasm' directory
+       to be present to run NASM (unless you've added it to your `PATH'),
+       so you can delete it if you need to save space; however, you may
+       want to keep the documentation or test programs.
+
+       If you've downloaded the DOS source archive, `nasmXXXs.zip', the
+       `nasm' directory will also contain the full NASM source code, and a
+       selection of Makefiles you can (hopefully) use to rebuild your copy
+       of NASM from scratch. The file `Readme' lists the various Makefiles
+       and which compilers they work with. Note that the source files
+       `insnsa.c' and `insnsd.c' are automatically generated from the
+       master instruction table `insns.dat' by a Perl script; a QBasic
+       version of the program is provided, but it is recommended that you
+       use the Perl version. A DOS port of Perl is available from
+       www.perl.org.
+
+ 1.3.2 Installing NASM under Unix
+
+       Once you've obtained the Unix source archive for NASM,
+       `nasm-X.XX.tar.gz' (where `X.XX' denotes the version number of NASM
+       contained in the archive), unpack it into a directory such as
+       `/usr/local/src'. The archive, when unpacked, will create its own
+       subdirectory `nasm-X.XX'.
+
+       NASM is an auto-configuring package: once you've unpacked it, `cd'
+       to the directory it's been unpacked into and type `./configure'.
+       This shell script will find the best C compiler to use for building
+       NASM and set up Makefiles accordingly.
+
+       Once NASM has auto-configured, you can type `make' to build the
+       `nasm' and `ndisasm' binaries, and then `make install' to install
+       them in `/usr/local/bin' and install the man pages `nasm.1' and
+       `ndisasm.1' in `/usr/local/man/man1'. Alternatively, you can give
+       options such as `--prefix' to the `configure' script (see the file
+       `INSTALL' for more details), or install the programs yourself.
+
+       NASM also comes with a set of utilities for handling the RDOFF
+       custom object-file format, which are in the `rdoff' subdirectory of
+       the NASM archive. You can build these with `make rdf' and install
+       them with `make rdf_install', if you want them.
+
+       If NASM fails to auto-configure, you may still be able to make it
+       compile by using the fall-back Unix makefile `Makefile.unx'. Copy or
+       rename that file to `Makefile' and try typing `make'. There is also
+       a `Makefile.unx' file in the `rdoff' subdirectory.
+
+Chapter 2: Running NASM
+-----------------------
+
+   2.1 NASM Command-Line Syntax
+
+       To assemble a file, you issue a command of the form
+
+       nasm -f <format> <filename> [-o <output>]
+
+       For example,
+
+       nasm -f elf myfile.asm
+
+       will assemble `myfile.asm' into an ELF object file `myfile.o'. And
+
+       nasm -f bin myfile.asm -o myfile.com
+
+       will assemble `myfile.asm' into a raw binary file `myfile.com'.
+
+       To produce a listing file, with the hex codes output from NASM
+       displayed on the left of the original sources, use the `-l' option
+       to give a listing file name, for example:
+
+       nasm -f coff myfile.asm -l myfile.lst
+
+       To get further usage instructions from NASM, try typing
+
+       nasm -h
+
+       This will also list the available output file formats, and what they
+       are.
+
+       If you use Linux but aren't sure whether your system is `a.out' or
+       ELF, type
+
+       file nasm
+
+       (in the directory in which you put the NASM binary when you
+       installed it). If it says something like
+
+       nasm: ELF 32-bit LSB executable i386 (386 and up) Version 1
+
+       then your system is ELF, and you should use the option `-f elf' when
+       you want NASM to produce Linux object files. If it says
+
+       nasm: Linux/i386 demand-paged executable (QMAGIC)
+
+       or something similar, your system is `a.out', and you should use
+       `-f aout' instead.
+
+       Like Unix compilers and assemblers, NASM is silent unless it goes
+       wrong: you won't see any output at all, unless it gives error
+       messages.
+
+ 2.1.1 The `-o' Option: Specifying the Output File Name
+
+       NASM will normally choose the name of your output file for you;
+       precisely how it does this is dependent on the object file format.
+       For Microsoft object file formats (`obj' and `win32'), it will
+       remove the `.asm' extension (or whatever extension you like to use -
+       NASM doesn't care) from your source file name and substitute `.obj'.
+       For Unix object file formats (`aout', `coff', `elf' and `as86') it
+       will substitute `.o'. For `rdf', it will use `.rdf', and for the
+       `bin' format it will simply remove the extension, so that
+       `myfile.asm' produces the output file `myfile'.
+
+       If the output file already exists, NASM will overwrite it, unless it
+       has the same name as the input file, in which case it will give a
+       warning and use `nasm.out' as the output file name instead.
+
+       For situations in which this behaviour is unacceptable, NASM
+       provides the `-o' command-line option, which allows you to specify
+       your desired output file name. You invoke `-o' by following it with
+       the name you wish for the output file, either with or without an
+       intervening space. For example:
+
+       nasm -f bin program.asm -o program.com 
+       nasm -f bin driver.asm -odriver.sys
+
+ 2.1.2 The `-f' Option: Specifying the Output File Format
+
+       If you do not supply the `-f' option to NASM, it will choose an
+       output file format for you itself. In the distribution versions of
+       NASM, the default is always `bin'; if you've compiled your own copy
+       of NASM, you can redefine `OF_DEFAULT' at compile time and choose
+       what you want the default to be.
+
+       Like `-o', the intervening space between `-f' and the output file
+       format is optional; so `-f elf' and `-felf' are both valid.
+
+       A complete list of the available output file formats can be given by
+       issuing the command `nasm -h'.
+
+ 2.1.3 The `-l' Option: Generating a Listing File
+
+       If you supply the `-l' option to NASM, followed (with the usual
+       optional space) by a file name, NASM will generate a source-listing
+       file for you, in which addresses and generated code are listed on
+       the left, and the actual source code, with expansions of multi-line
+       macros (except those which specifically request no expansion in
+       source listings: see section 4.2.9) on the right. For example:
+
+       nasm -f elf myfile.asm -l myfile.lst
+
+ 2.1.4 The `-s' Option: Send Errors to `stdout'
+
+       Under MS-DOS it can be difficult (though there are ways) to redirect
+       the standard-error output of a program to a file. Since NASM usually
+       produces its warning and error messages on `stderr', this can make
+       it hard to capture the errors if (for example) you want to load them
+       into an editor.
+
+       NASM therefore provides the `-s' option, requiring no argument,
+       which causes errors to be sent to standard output rather than
+       standard error. Therefore you can redirect the errors into a file by
+       typing
+
+       nasm -s -f obj myfile.asm > myfile.err
+
+ 2.1.5 The `-i' Option: Include File Search Directories
+
+       When NASM sees the `%include' directive in a source file (see
+       section 4.5), it will search for the given file not only in the
+       current directory, but also in any directories specified on the
+       command line by the use of the `-i' option. Therefore you can
+       include files from a macro library, for example, by typing
+
+       nasm -ic:\macrolib\ -f obj myfile.asm
+
+       (As usual, a space between `-i' and the path name is allowed, and
+       optional).
+
+       NASM, in the interests of complete source-code portability, does not
+       understand the file naming conventions of the OS it is running on;
+       the string you provide as an argument to the `-i' option will be
+       prepended exactly as written to the name of the include file.
+       Therefore the trailing backslash in the above example is necessary.
+       Under Unix, a trailing forward slash is similarly necessary.
+
+       (You can use this to your advantage, if you're really perverse, by
+       noting that the option `-ifoo' will cause `%include "bar.i"' to
+       search for the file `foobar.i'...)
+
+       If you want to define a _standard_ include search path, similar to
+       `/usr/include' on Unix systems, you should place one or more `-i'
+       directives in the `NASM' environment variable (see section 2.1.11).
+
+ 2.1.6 The `-p' Option: Pre-Include a File
+
+       NASM allows you to specify files to be _pre-included_ into your
+       source file, by the use of the `-p' option. So running
+
+       nasm myfile.asm -p myinc.inc
+
+       is equivalent to running `nasm myfile.asm' and placing the directive
+       `%include "myinc.inc"' at the start of the file.
+
+ 2.1.7 The `-d' Option:  Pre-Define a Macro
+
+       Just as the `-p' option gives an alternative to placing `%include'
+       directives at the start of a source file, the `-d' option gives an
+       alternative to placing a `%define' directive. You could code
+
+       nasm myfile.asm -dFOO=100
+
+       as an alternative to placing the directive
+
+       %define FOO 100
+
+       at the start of the file. You can miss off the macro value, as well:
+       the option `-dFOO' is equivalent to coding `%define FOO'. This form
+       of the directive may be useful for selecting assembly-time options
+       which are then tested using `%ifdef', for example `-dDEBUG'.
+
+ 2.1.8 The `-e' Option: Preprocess Only
+
+       NASM allows the preprocessor to be run on its own, up to a point.
+       Using the `-e' option (which requires no arguments) will cause NASM
+       to preprocess its input file, expand all the macro references,
+       remove all the comments and preprocessor directives, and print the
+       resulting file on standard output (or save it to a file, if the `-o'
+       option is also used).
+
+       This option cannot be applied to programs which require the
+       preprocessor to evaluate expressions which depend on the values of
+       symbols: so code such as
+
+       %assign tablesize ($-tablestart)
+
+       will cause an error in preprocess-only mode.
+
+ 2.1.9 The `-a' Option: Don't Preprocess At All
+
+       If NASM is being used as the back end to a compiler, it might be
+       desirable to suppress preprocessing completely and assume the
+       compiler has already done it, to save time and increase compilation
+       speeds. The `-a' option, requiring no argument, instructs NASM to
+       replace its powerful preprocessor with a stub preprocessor which
+       does nothing.
+
+2.1.10 The `-w' Option: Enable or Disable Assembly Warnings
+
+       NASM can observe many conditions during the course of assembly which
+       are worth mentioning to the user, but not a sufficiently severe
+       error to justify NASM refusing to generate an output file. These
+       conditions are reported like errors, but come up with the word
+       `warning' before the message. Warnings do not prevent NASM from
+       generating an output file and returning a success status to the
+       operating system.
+
+       Some conditions are even less severe than that: they are only
+       sometimes worth mentioning to the user. Therefore NASM supports the
+       `-w' command-line option, which enables or disables certain classes
+       of assembly warning. Such warning classes are described by a name,
+       for example `orphan-labels'; you can enable warnings of this class
+       by the command-line option `-w+orphan-labels' and disable it by
+       `-w-orphan-labels'.
+
+       The suppressible warning classes are:
+
+       (*) `macro-params' covers warnings about multi-line macros being
+           invoked with the wrong number of parameters. This warning class
+           is enabled by default; see section 4.2.1 for an example of why
+           you might want to disable it.
+
+       (*) `orphan-labels' covers warnings about source lines which contain
+           no instruction but define a label without a trailing colon. NASM
+           does not warn about this somewhat obscure condition by default;
+           see section 3.1 for an example of why you might want it to.
+
+       (*) `number-overflow' covers warnings about numeric constants which
+           don't fit in 32 bits (for example, it's easy to type one too
+           many Fs and produce `0x7ffffffff' by mistake). This warning
+           class is enabled by default.
+
+2.1.11 The `NASM' Environment Variable
+
+       If you define an environment variable called `NASM', the program
+       will interpret it as a list of extra command-line options, which are
+       processed before the real command line. You can use this to define
+       standard search directories for include files, by putting `-i'
+       options in the `NASM' variable.
+
+       The value of the variable is split up at white space, so that the
+       value `-s -ic:\nasmlib' will be treated as two separate options.
+       However, that means that the value `-dNAME="my name"' won't do what
+       you might want, because it will be split at the space and the NASM
+       command-line processing will get confused by the two nonsensical
+       words `-dNAME="my' and `name"'.
+
+       To get round this, NASM provides a feature whereby, if you begin the
+       `NASM' environment variable with some character that isn't a minus
+       sign, then NASM will treat this character as the separator character
+       for options. So setting the `NASM' variable to the value
+       `!-s!-ic:\nasmlib' is equivalent to setting it to `-s -ic:\nasmlib',
+       but `!-dNAME="my name"' will work.
+
+   2.2 Quick Start for MASM Users
+
+       If you're used to writing programs with MASM, or with TASM in MASM-
+       compatible (non-Ideal) mode, or with `a86', this section attempts to
+       outline the major differences between MASM's syntax and NASM's. If
+       you're not already used to MASM, it's probably worth skipping this
+       section.
+
+ 2.2.1 NASM Is Case-Sensitive
+
+       One simple difference is that NASM is case-sensitive. It makes a
+       difference whether you call your label `foo', `Foo' or `FOO'. If
+       you're assembling to DOS or OS/2 `.OBJ' files, you can invoke the
+       `UPPERCASE' directive (documented in section 6.2) to ensure that all
+       symbols exported to other code modules are forced to be upper case;
+       but even then, _within_ a single module, NASM will distinguish
+       between labels differing only in case.
+
+ 2.2.2 NASM Requires Square Brackets For Memory References
+
+       NASM was designed with simplicity of syntax in mind. One of the
+       design goals of NASM is that it should be possible, as far as is
+       practical, for the user to look at a single line of NASM code and
+       tell what opcode is generated by it. You can't do this in MASM: if
+       you declare, for example,
+
+       foo       equ 1 
+       bar       dw 2
+
+       then the two lines of code
+
+                 mov ax,foo 
+                 mov ax,bar
+
+       generate completely different opcodes, despite having identical-
+       looking syntaxes.
+
+       NASM avoids this undesirable situation by having a much simpler
+       syntax for memory references. The rule is simply that any access to
+       the _contents_ of a memory location requires square brackets around
+       the address, and any access to the _address_ of a variable doesn't.
+       So an instruction of the form `mov ax,foo' will _always_ refer to a
+       compile-time constant, whether it's an `EQU' or the address of a
+       variable; and to access the _contents_ of the variable `bar', you
+       must code `mov ax,[bar]'.
+
+       This also means that NASM has no need for MASM's `OFFSET' keyword,
+       since the MASM code `mov ax,offset bar' means exactly the same thing
+       as NASM's `mov ax,bar'. If you're trying to get large amounts of
+       MASM code to assemble sensibly under NASM, you can always code
+       `%idefine offset' to make the preprocessor treat the `OFFSET'
+       keyword as a no-op.
+
+       This issue is even more confusing in `a86', where declaring a label
+       with a trailing colon defines it to be a `label' as opposed to a
+       `variable' and causes `a86' to adopt NASM-style semantics; so in
+       `a86', `mov ax,var' has different behaviour depending on whether
+       `var' was declared as `var: dw 0' (a label) or `var dw 0' (a word-
+       size variable). NASM is very simple by comparison: _everything_ is a
+       label.
+
+       NASM, in the interests of simplicity, also does not support the
+       hybrid syntaxes supported by MASM and its clones, such as
+       `mov ax,table[bx]', where a memory reference is denoted by one
+       portion outside square brackets and another portion inside. The
+       correct syntax for the above is `mov ax,[table+bx]'. Likewise,
+       `mov ax,es:[di]' is wrong and `mov ax,[es:di]' is right.
+
+ 2.2.3 NASM Doesn't Store Variable Types
+
+       NASM, by design, chooses not to remember the types of variables you
+       declare. Whereas MASM will remember, on seeing `var dw 0', that you
+       declared `var' as a word-size variable, and will then be able to
+       fill in the ambiguity in the size of the instruction `mov var,2',
+       NASM will deliberately remember nothing about the symbol `var'
+       except where it begins, and so you must explicitly code
+       `mov word [var],2'.
+
+       For this reason, NASM doesn't support the `LODS', `MOVS', `STOS',
+       `SCAS', `CMPS', `INS', or `OUTS' instructions, but only supports the
+       forms such as `LODSB', `MOVSW', and `SCASD', which explicitly
+       specify the size of the components of the strings being manipulated.
+
+ 2.2.4 NASM Doesn't `ASSUME'
+
+       As part of NASM's drive for simplicity, it also does not support the
+       `ASSUME' directive. NASM will not keep track of what values you
+       choose to put in your segment registers, and will never
+       _automatically_ generate a segment override prefix.
+
+ 2.2.5 NASM Doesn't Support Memory Models
+
+       NASM also does not have any directives to support different 16-bit
+       memory models. The programmer has to keep track of which functions
+       are supposed to be called with a far call and which with a near
+       call, and is responsible for putting the correct form of `RET'
+       instruction (`RETN' or `RETF'; NASM accepts `RET' itself as an
+       alternate form for `RETN'); in addition, the programmer is
+       responsible for coding CALL FAR instructions where necessary when
+       calling _external_ functions, and must also keep track of which
+       external variable definitions are far and which are near.
+
+ 2.2.6 Floating-Point Differences
+
+       NASM uses different names to refer to floating-point registers from
+       MASM: where MASM would call them `ST(0)', `ST(1)' and so on, and
+       `a86' would call them simply `0', `1' and so on, NASM chooses to
+       call them `st0', `st1' etc.
+
+       As of version 0.96, NASM now treats the instructions with `nowait'
+       forms in the same way as MASM-compatible assemblers. The
+       idiosyncratic treatment employed by 0.95 and earlier was based on a
+       misunderstanding by the authors.
+
+ 2.2.7 Other Differences
+
+       For historical reasons, NASM uses the keyword `TWORD' where MASM and
+       compatible assemblers use `TBYTE'.
+
+       NASM does not declare uninitialised storage in the same way as MASM:
+       where a MASM programmer might use `stack db 64 dup (?)', NASM
+       requires `stack resb 64', intended to be read as `reserve 64 bytes'.
+       For a limited amount of compatibility, since NASM treats `?' as a
+       valid character in symbol names, you can code `? equ 0' and then
+       writing `dw ?' will at least do something vaguely useful. `DUP' is
+       still not a supported syntax, however.
+
+       In addition to all of this, macros and directives work completely
+       differently to MASM. See chapter 4 and chapter 5 for further
+       details.
+
+Chapter 3: The NASM Language
+----------------------------
+
+   3.1 Layout of a NASM Source Line
+
+       Like most assemblers, each NASM source line contains (unless it is a
+       macro, a preprocessor directive or an assembler directive: see
+       chapter 4 and chapter 5) some combination of the four fields
+
+       label:    instruction operands        ; comment
+
+       As usual, most of these fields are optional; the presence or absence
+       of any combination of a label, an instruction and a comment is
+       allowed. Of course, the operand field is either required or
+       forbidden by the presence and nature of the instruction field.
+
+       NASM places no restrictions on white space within a line: labels may
+       have white space before them, or instructions may have no space
+       before them, or anything. The colon after a label is also optional.
+       (Note that this means that if you intend to code `lodsb' alone on a
+       line, and type `lodab' by accident, then that's still a valid source
+       line which does nothing but define a label. Running NASM with the
+       command-line option `-w+orphan-labels' will cause it to warn you if
+       you define a label alone on a line without a trailing colon.)
+
+       Valid characters in labels are letters, numbers, `_', `$', `#', `@',
+       `~', `.', and `?'. The only characters which may be used as the
+       _first_ character of an identifier are letters, `.' (with special
+       meaning: see section 3.8), `_' and `?'. An identifier may also be
+       prefixed with a `$' to indicate that it is intended to be read as an
+       identifier and not a reserved word; thus, if some other module you
+       are linking with defines a symbol called `eax', you can refer to
+       `$eax' in NASM code to distinguish the symbol from the register.
+
+       The instruction field may contain any machine instruction: Pentium
+       and P6 instructions, FPU instructions, MMX instructions and even
+       undocumented instructions are all supported. The instruction may be
+       prefixed by `LOCK', `REP', `REPE'/`REPZ' or `REPNE'/`REPNZ', in the
+       usual way. Explicit address-size and operand-size prefixes `A16',
+       `A32', `O16' and `O32' are provided - one example of their use is
+       given in chapter 9. You can also use the name of a segment register
+       as an instruction prefix: coding `es mov [bx],ax' is equivalent to
+       coding `mov [es:bx],ax'. We recommend the latter syntax, since it is
+       consistent with other syntactic features of the language, but for
+       instructions such as `LODSB', which has no operands and yet can
+       require a segment override, there is no clean syntactic way to
+       proceed apart from `es lodsb'.
+
+       An instruction is not required to use a prefix: prefixes such as
+       `CS', `A32', `LOCK' or `REPE' can appear on a line by themselves,
+       and NASM will just generate the prefix bytes.
+
+       In addition to actual machine instructions, NASM also supports a
+       number of pseudo-instructions, described in section 3.2.
+
+       Instruction operands may take a number of forms: they can be
+       registers, described simply by the register name (e.g. `ax', `bp',
+       `ebx', `cr0': NASM does not use the `gas'-style syntax in which
+       register names must be prefixed by a `%' sign), or they can be
+       effective addresses (see section 3.3), constants (section 3.4) or
+       expressions (section 3.5).
+
+       For floating-point instructions, NASM accepts a wide range of
+       syntaxes: you can use two-operand forms like MASM supports, or you
+       can use NASM's native single-operand forms in most cases. Details of
+       all forms of each supported instruction are given in appendix A. For
+       example, you can code:
+
+                 fadd st1               ; this sets st0 := st0 + st1 
+                 fadd st0,st1           ; so does this 
+       
+                 fadd st1,st0           ; this sets st1 := st1 + st0 
+                 fadd to st1            ; so does this
+
+       Almost any floating-point instruction that references memory must
+       use one of the prefixes `DWORD', `QWORD' or `TWORD' to indicate what
+       size of memory operand it refers to.
+
+   3.2 Pseudo-Instructions
+
+       Pseudo-instructions are things which, though not real x86 machine
+       instructions, are used in the instruction field anyway because
+       that's the most convenient place to put them. The current pseudo-
+       instructions are `DB', `DW', `DD', `DQ' and `DT', their
+       uninitialised counterparts `RESB', `RESW', `RESD', `RESQ' and
+       `REST', the `INCBIN' command, the `EQU' command, and the `TIMES'
+       prefix.
+
+ 3.2.1 `DB' and friends: Declaring Initialised Data
+
+       `DB', `DW', `DD', `DQ' and `DT' are used, much as in MASM, to
+       declare initialised data in the output file. They can be invoked in
+       a wide range of ways:
+
+                 db 0x55                ; just the byte 0x55 
+                 db 0x55,0x56,0x57      ; three bytes in succession 
+                 db 'a',0x55            ; character constants are OK 
+                 db 'hello',13,10,'$'   ; so are string constants 
+                 dw 0x1234              ; 0x34 0x12 
+                 dw 'a'                 ; 0x41 0x00 (it's just a number) 
+                 dw 'ab'                ; 0x41 0x42 (character constant) 
+                 dw 'abc'               ; 0x41 0x42 0x43 0x00 (string) 
+                 dd 0x12345678          ; 0x78 0x56 0x34 0x12 
+                 dd 1.234567e20         ; floating-point constant 
+                 dq 1.234567e20         ; double-precision float 
+                 dt 1.234567e20         ; extended-precision float
+
+       `DQ' and `DT' do not accept numeric constants or string constants as
+       operands.
+
+ 3.2.2 `RESB' and friends: Declaring Uninitialised Data
+
+       `RESB', `RESW', `RESD', `RESQ' and `REST' are designed to be used in
+       the BSS section of a module: they declare _uninitialised_ storage
+       space. Each takes a single operand, which is the number of bytes,
+       words, doublewords or whatever to reserve. As stated in section
+       2.2.7, NASM does not support the MASM/TASM syntax of reserving
+       uninitialised space by writing `DW ?' or similar things: this is
+       what it does instead. The operand to a `RESB'-type pseudo-
+       instruction is a _critical expression_: see section 3.7.
+
+       For example:
+
+       buffer:   resb 64                ; reserve 64 bytes 
+       wordvar:  resw 1                 ; reserve a word 
+       realarray resq 10                ; array of ten reals
+
+ 3.2.3 `INCBIN': Including External Binary Files
+
+       `INCBIN' is borrowed from the old Amiga assembler DevPac: it
+       includes a binary file verbatim into the output file. This can be
+       handy for (for example) including graphics and sound data directly
+       into a game executable file. It can be called in one of these three
+       ways:
+
+                 incbin "file.dat"      ; include the whole file 
+                 incbin "file.dat",1024 ; skip the first 1024 bytes 
+                 incbin "file.dat",1024,512 ; skip the first 1024, and 
+                                        ; actually include at most 512
+
+ 3.2.4 `EQU': Defining Constants
+
+       `EQU' defines a symbol to a given constant value: when `EQU' is
+       used, the source line must contain a label. The action of `EQU' is
+       to define the given label name to the value of its (only) operand.
+       This definition is absolute, and cannot change later. So, for
+       example,
+
+       message   db 'hello, world' 
+       msglen    equ $-message
+
+       defines `msglen' to be the constant 12. `msglen' may not then be
+       redefined later. This is not a preprocessor definition either: the
+       value of `msglen' is evaluated _once_, using the value of `$' (see
+       section 3.5 for an explanation of `$') at the point of definition,
+       rather than being evaluated wherever it is referenced and using the
+       value of `$' at the point of reference. Note that the operand to an
+       `EQU' is also a critical expression (section 3.7).
+
+ 3.2.5 `TIMES': Repeating Instructions or Data
+
+       The `TIMES' prefix causes the instruction to be assembled multiple
+       times. This is partly present as NASM's equivalent of the `DUP'
+       syntax supported by MASM-compatible assemblers, in that you can code
+
+       zerobuf:  times 64 db 0
+
+       or similar things; but `TIMES' is more versatile than that. The
+       argument to `TIMES' is not just a numeric constant, but a numeric
+       _expression_, so you can do things like
+
+       buffer:   db 'hello, world' 
+                 times 64-$+buffer db ' '
+
+       which will store exactly enough spaces to make the total length of
+       `buffer' up to 64. Finally, `TIMES' can be applied to ordinary
+       instructions, so you can code trivial unrolled loops in it:
+
+                 times 100 movsb
+
+       Note that there is no effective difference between
+       `times 100 resb 1' and `resb 100', except that the latter will be
+       assembled about 100 times faster due to the internal structure of
+       the assembler.
+
+       The operand to `TIMES', like that of `EQU' and those of `RESB' and
+       friends, is a critical expression (section 3.7).
+
+       Note also that `TIMES' can't be applied to macros: the reason for
+       this is that `TIMES' is processed after the macro phase, which
+       allows the argument to `TIMES' to contain expressions such as
+       `64-$+buffer' as above. To repeat more than one line of code, or a
+       complex macro, use the preprocessor `%rep' directive.
+
+   3.3 Effective Addresses
+
+       An effective address is any operand to an instruction which
+       references memory. Effective addresses, in NASM, have a very simple
+       syntax: they consist of an expression evaluating to the desired
+       address, enclosed in square brackets. For example:
+
+       wordvar   dw 123 
+                 mov ax,[wordvar] 
+                 mov ax,[wordvar+1] 
+                 mov ax,[es:wordvar+bx]
+
+       Anything not conforming to this simple system is not a valid memory
+       reference in NASM, for example `es:wordvar[bx]'.
+
+       More complicated effective addresses, such as those involving more
+       than one register, work in exactly the same way:
+
+                 mov eax,[ebx*2+ecx+offset] 
+                 mov ax,[bp+di+8]
+
+       NASM is capable of doing algebra on these effective addresses, so
+       that things which don't necessarily _look_ legal are perfectly all
+       right:
+
+                 mov eax,[ebx*5]        ; assembles as [ebx*4+ebx] 
+                 mov eax,[label1*2-label2] ; ie [label1+(label1-label2)]
+
+       Some forms of effective address have more than one assembled form;
+       in most such cases NASM will generate the smallest form it can. For
+       example, there are distinct assembled forms for the 32-bit effective
+       addresses `[eax*2+0]' and `[eax+eax]', and NASM will generally
+       generate the latter on the grounds that the former requires four
+       bytes to store a zero offset.
+
+       NASM has a hinting mechanism which will cause `[eax+ebx]' and
+       `[ebx+eax]' to generate different opcodes; this is occasionally
+       useful because `[esi+ebp]' and `[ebp+esi]' have different default
+       segment registers.
+
+       However, you can force NASM to generate an effective address in a
+       particular form by the use of the keywords `BYTE', `WORD', `DWORD'
+       and `NOSPLIT'. If you need `[eax+3]' to be assembled using a double-
+       word offset field instead of the one byte NASM will normally
+       generate, you can code `[dword eax+3]'. Similarly, you can force
+       NASM to use a byte offset for a small value which it hasn't seen on
+       the first pass (see section 3.7 for an example of such a code
+       fragment) by using `[byte eax+offset]'. As special cases,
+       `[byte eax]' will code `[eax+0]' with a byte offset of zero, and
+       `[dword eax]' will code it with a double-word offset of zero. The
+       normal form, `[eax]', will be coded with no offset field.
+
+       Similarly, NASM will split `[eax*2]' into `[eax+eax]' because that
+       allows the offset field to be absent and space to be saved; in fact,
+       it will also split `[eax*2+offset]' into `[eax+eax+offset]'. You can
+       combat this behaviour by the use of the `NOSPLIT' keyword:
+       `[nosplit eax*2]' will force `[eax*2+0]' to be generated literally.
+
+   3.4 Constants
+
+       NASM understands four different types of constant: numeric,
+       character, string and floating-point.
+
+ 3.4.1 Numeric Constants
+
+       A numeric constant is simply a number. NASM allows you to specify
+       numbers in a variety of number bases, in a variety of ways: you can
+       suffix `H', `Q' and `B' for hex, octal and binary, or you can prefix
+       `0x' for hex in the style of C, or you can prefix `$' for hex in the
+       style of Borland Pascal. Note, though, that the `$' prefix does
+       double duty as a prefix on identifiers (see section 3.1), so a hex
+       number prefixed with a `$' sign must have a digit after the `$'
+       rather than a letter.
+
+       Some examples:
+
+                 mov ax,100             ; decimal 
+                 mov ax,0a2h            ; hex 
+                 mov ax,$0a2            ; hex again: the 0 is required 
+                 mov ax,0xa2            ; hex yet again 
+                 mov ax,777q            ; octal 
+                 mov ax,10010011b       ; binary
+
+ 3.4.2 Character Constants
+
+       A character constant consists of up to four characters enclosed in
+       either single or double quotes. The type of quote makes no
+       difference to NASM, except of course that surrounding the constant
+       with single quotes allows double quotes to appear within it and vice
+       versa.
+
+       A character constant with more than one character will be arranged
+       with little-endian order in mind: if you code
+
+                 mov eax,'abcd'
+
+       then the constant generated is not `0x61626364', but `0x64636261',
+       so that if you were then to store the value into memory, it would
+       read `abcd' rather than `dcba'. This is also the sense of character
+       constants understood by the Pentium's `CPUID' instruction (see
+       section A.22).
+
+ 3.4.3 String Constants
+
+       String constants are only acceptable to some pseudo-instructions,
+       namely the `DB' family and `INCBIN'.
+
+       A string constant looks like a character constant, only longer. It
+       is treated as a concatenation of maximum-size character constants
+       for the conditions. So the following are equivalent:
+
+                 db 'hello'             ; string constant 
+                 db 'h','e','l','l','o' ; equivalent character constants
+
+       And the following are also equivalent:
+
+                 dd 'ninechars'         ; doubleword string constant 
+                 dd 'nine','char','s'   ; becomes three doublewords 
+                 db 'ninechars',0,0,0   ; and really looks like this
+
+       Note that when used as an operand to `db', a constant like `'ab'' is
+       treated as a string constant despite being short enough to be a
+       character constant, because otherwise `db 'ab'' would have the same
+       effect as `db 'a'', which would be silly. Similarly, three-character
+       or four-character constants are treated as strings when they are
+       operands to `dw'.
+
+ 3.4.4 Floating-Point Constants
+
+       Floating-point constants are acceptable only as arguments to `DD',
+       `DQ' and `DT'. They are expressed in the traditional form: digits,
+       then a period, then optionally more digits, then optionally an `E'
+       followed by an exponent. The period is mandatory, so that NASM can
+       distinguish between `dd 1', which declares an integer constant, and
+       `dd 1.0' which declares a floating-point constant.
+
+       Some examples:
+
+                 dd 1.2                 ; an easy one 
+                 dq 1.e10               ; 10,000,000,000 
+                 dq 1.e+10              ; synonymous with 1.e10 
+                 dq 1.e-10              ; 0.000 000 000 1 
+                 dt 3.141592653589793238462 ; pi
+
+       NASM cannot do compile-time arithmetic on floating-point constants.
+       This is because NASM is designed to be portable - although it always
+       generates code to run on x86 processors, the assembler itself can
+       run on any system with an ANSI C compiler. Therefore, the assembler
+       cannot guarantee the presence of a floating-point unit capable of
+       handling the Intel number formats, and so for NASM to be able to do
+       floating arithmetic it would have to include its own complete set of
+       floating-point routines, which would significantly increase the size
+       of the assembler for very little benefit.
+
+   3.5 Expressions
+
+       Expressions in NASM are similar in syntax to those in C.
+
+       NASM does not guarantee the size of the integers used to evaluate
+       expressions at compile time: since NASM can compile and run on 64-
+       bit systems quite happily, don't assume that expressions are
+       evaluated in 32-bit registers and so try to make deliberate use of
+       integer overflow. It might not always work. The only thing NASM will
+       guarantee is what's guaranteed by ANSI C: you always have _at least_
+       32 bits to work in.
+
+       NASM supports two special tokens in expressions, allowing
+       calculations to involve the current assembly position: the `$' and
+       `$$' tokens. `$' evaluates to the assembly position at the beginning
+       of the line containing the expression; so you can code an infinite
+       loop using `JMP $'. `$$' evaluates to the beginning of the current
+       section; so you can tell how far into the section you are by using
+       `($-$$)'.
+
+       The arithmetic operators provided by NASM are listed here, in
+       increasing order of precedence.
+
+ 3.5.1 `|': Bitwise OR Operator
+
+       The `|' operator gives a bitwise OR, exactly as performed by the
+       `OR' machine instruction. Bitwise OR is the lowest-priority
+       arithmetic operator supported by NASM.
+
+ 3.5.2 `^': Bitwise XOR Operator
+
+       `^' provides the bitwise XOR operation.
+
+ 3.5.3 `&': Bitwise AND Operator
+
+       `&' provides the bitwise AND operation.
+
+ 3.5.4 `<<' and `>>': Bit Shift Operators
+
+       `<<' gives a bit-shift to the left, just as it does in C. So `5<<3'
+       evaluates to 5 times 8, or 40. `>>' gives a bit-shift to the right;
+       in NASM, such a shift is _always_ unsigned, so that the bits shifted
+       in from the left-hand end are filled with zero rather than a sign-
+       extension of the previous highest bit.
+
+ 3.5.5 `+' and `-': Addition and Subtraction Operators
+
+       The `+' and `-' operators do perfectly ordinary addition and
+       subtraction.
+
+ 3.5.6 `*', `/', `//', `%' and `%%': Multiplication and Division
+
+       `*' is the multiplication operator. `/' and `//' are both division
+       operators: `/' is unsigned division and `//' is signed division.
+       Similarly, `%' and `%%' provide unsigned and signed modulo operators
+       respectively.
+
+       NASM, like ANSI C, provides no guarantees about the sensible
+       operation of the signed modulo operator.
+
+       Since the `%' character is used extensively by the macro
+       preprocessor, you should ensure that both the signed and unsigned
+       modulo operators are followed by white space wherever they appear.
+
+ 3.5.7 Unary Operators: `+', `-', `~' and `SEG'
+
+       The highest-priority operators in NASM's expression grammar are
+       those which only apply to one argument. `-' negates its operand, `+'
+       does nothing (it's provided for symmetry with `-'), `~' computes the
+       one's complement of its operand, and `SEG' provides the segment
+       address of its operand (explained in more detail in section 3.6).
+
+   3.6 `SEG' and `WRT'
+
+       When writing large 16-bit programs, which must be split into
+       multiple segments, it is often necessary to be able to refer to the
+       segment part of the address of a symbol. NASM supports the `SEG'
+       operator to perform this function.
+
+       The `SEG' operator returns the _preferred_ segment base of a symbol,
+       defined as the segment base relative to which the offset of the
+       symbol makes sense. So the code
+
+                 mov ax,seg symbol 
+                 mov es,ax 
+                 mov bx,symbol
+
+       will load `ES:BX' with a valid pointer to the symbol `symbol'.
+
+       Things can be more complex than this: since 16-bit segments and
+       groups may overlap, you might occasionally want to refer to some
+       symbol using a different segment base from the preferred one. NASM
+       lets you do this, by the use of the `WRT' (With Reference To)
+       keyword. So you can do things like
+
+                 mov ax,weird_seg       ; weird_seg is a segment base 
+                 mov es,ax 
+                 mov bx,symbol wrt weird_seg
+
+       to load `ES:BX' with a different, but functionally equivalent,
+       pointer to the symbol `symbol'.
+
+       NASM supports far (inter-segment) calls and jumps by means of the
+       syntax `call segment:offset', where `segment' and `offset' both
+       represent immediate values. So to call a far procedure, you could
+       code either of
+
+                 call (seg procedure):procedure 
+                 call weird_seg:(procedure wrt weird_seg)
+
+       (The parentheses are included for clarity, to show the intended
+       parsing of the above instructions. They are not necessary in
+       practice.)
+
+       NASM supports the syntax `call far procedure' as a synonym for the
+       first of the above usages. `JMP' works identically to `CALL' in
+       these examples.
+
+       To declare a far pointer to a data item in a data segment, you must
+       code
+
+                 dw symbol, seg symbol
+
+       NASM supports no convenient synonym for this, though you can always
+       invent one using the macro processor.
+
+   3.7 Critical Expressions
+
+       A limitation of NASM is that it is a two-pass assembler; unlike TASM
+       and others, it will always do exactly two assembly passes. Therefore
+       it is unable to cope with source files that are complex enough to
+       require three or more passes.
+
+       The first pass is used to determine the size of all the assembled
+       code and data, so that the second pass, when generating all the
+       code, knows all the symbol addresses the code refers to. So one
+       thing NASM can't handle is code whose size depends on the value of a
+       symbol declared after the code in question. For example,
+
+                 times (label-$) db 0 
+       label:    db 'Where am I?'
+
+       The argument to `TIMES' in this case could equally legally evaluate
+       to anything at all; NASM will reject this example because it cannot
+       tell the size of the `TIMES' line when it first sees it. It will
+       just as firmly reject the slightly paradoxical code
+
+                 times (label-$+1) db 0 
+       label:    db 'NOW where am I?'
+
+       in which _any_ value for the `TIMES' argument is by definition
+       wrong!
+
+       NASM rejects these examples by means of a concept called a _critical
+       expression_, which is defined to be an expression whose value is
+       required to be computable in the first pass, and which must
+       therefore depend only on symbols defined before it. The argument to
+       the `TIMES' prefix is a critical expression; for the same reason,
+       the arguments to the `RESB' family of pseudo-instructions are also
+       critical expressions.
+
+       Critical expressions can crop up in other contexts as well: consider
+       the following code.
+
+                 mov ax,symbol1 
+       symbol1   equ symbol2 
+       symbol2:
+
+       On the first pass, NASM cannot determine the value of `symbol1',
+       because `symbol1' is defined to be equal to `symbol2' which NASM
+       hasn't seen yet. On the second pass, therefore, when it encounters
+       the line `mov ax,symbol1', it is unable to generate the code for it
+       because it still doesn't know the value of `symbol1'. On the next
+       line, it would see the `EQU' again and be able to determine the
+       value of `symbol1', but by then it would be too late.
+
+       NASM avoids this problem by defining the right-hand side of an `EQU'
+       statement to be a critical expression, so the definition of
+       `symbol1' would be rejected in the first pass.
+
+       There is a related issue involving forward references: consider this
+       code fragment.
+
+                 mov eax,[ebx+offset] 
+       offset    equ 10
+
+       NASM, on pass one, must calculate the size of the instruction
+       `mov eax,[ebx+offset]' without knowing the value of `offset'. It has
+       no way of knowing that `offset' is small enough to fit into a one-
+       byte offset field and that it could therefore get away with
+       generating a shorter form of the effective-address encoding; for all
+       it knows, in pass one, `offset' could be a symbol in the code
+       segment, and it might need the full four-byte form. So it is forced
+       to compute the size of the instruction to accommodate a four-byte
+       address part. In pass two, having made this decision, it is now
+       forced to honour it and keep the instruction large, so the code
+       generated in this case is not as small as it could have been. This
+       problem can be solved by defining `offset' before using it, or by
+       forcing byte size in the effective address by coding
+       `[byte ebx+offset]'.
+
+   3.8 Local Labels
+
+       NASM gives special treatment to symbols beginning with a period. A
+       label beginning with a single period is treated as a _local_ label,
+       which means that it is associated with the previous non-local label.
+       So, for example:
+
+       label1    ; some code 
+       .loop     ; some more code 
+                 jne .loop 
+                 ret 
+       label2    ; some code 
+       .loop     ; some more code 
+                 jne .loop 
+                 ret
+
+       In the above code fragment, each `JNE' instruction jumps to the line
+       immediately before it, because the two definitions of `.loop' are
+       kept separate by virtue of each being associated with the previous
+       non-local label.
+
+       This form of local label handling is borrowed from the old Amiga
+       assembler DevPac; however, NASM goes one step further, in allowing
+       access to local labels from other parts of the code. This is
+       achieved by means of _defining_ a local label in terms of the
+       previous non-local label: the first definition of `.loop' above is
+       really defining a symbol called `label1.loop', and the second
+       defines a symbol called `label2.loop'. So, if you really needed to,
+       you could write
+
+       label3    ; some more code 
+                 ; and some more 
+                 jmp label1.loop
+
+       Sometimes it is useful - in a macro, for instance - to be able to
+       define a label which can be referenced from anywhere but which
+       doesn't interfere with the normal local-label mechanism. Such a
+       label can't be non-local because it would interfere with subsequent
+       definitions of, and references to, local labels; and it can't be
+       local because the macro that defined it wouldn't know the label's
+       full name. NASM therefore introduces a third type of label, which is
+       probably only useful in macro definitions: if a label begins with
+       the special prefix `..@', then it does nothing to the local label
+       mechanism. So you could code
+
+       label1:   ; a non-local label 
+       .local:   ; this is really label1.local 
+       ..@foo:   ; this is a special symbol 
+       label2:   ; another non-local label 
+       .local:   ; this is really label2.local 
+                 jmp ..@foo             ; this will jump three lines up
+
+       NASM has the capacity to define other special symbols beginning with
+       a double period: for example, `..start' is used to specify the entry
+       point in the `obj' output format (see section 6.2.6).
+
+Chapter 4: The NASM Preprocessor
+--------------------------------
+
+       NASM contains a powerful macro processor, which supports conditional
+       assembly, multi-level file inclusion, two forms of macro (single-
+       line and multi-line), and a `context stack' mechanism for extra
+       macro power. Preprocessor directives all begin with a `%' sign.
+
+   4.1 Single-Line Macros
+
+ 4.1.1 The Normal Way: `%define'
+
+       Single-line macros are defined using the `%define' preprocessor
+       directive. The definitions work in a similar way to C; so you can do
+       things like
+
+       %define ctrl 0x1F & 
+       %define param(a,b) ((a)+(a)*(b)) 
+                 mov byte [param(2,ebx)], ctrl 'D'
+
+       which will expand to
+
+                 mov byte [(2)+(2)*(ebx)], 0x1F & 'D'
+
+       When the expansion of a single-line macro contains tokens which
+       invoke another macro, the expansion is performed at invocation time,
+       not at definition time. Thus the code
+
+       %define a(x) 1+b(x) 
+       %define b(x) 2*x 
+                 mov ax,a(8)
+
+       will evaluate in the expected way to `mov ax,1+2*8', even though the
+       macro `b' wasn't defined at the time of definition of `a'.
+
+       Macros defined with `%define' are case sensitive: after
+       `%define foo bar', only `foo' will expand to `bar': `Foo' or `FOO'
+       will not. By using `%idefine' instead of `%define' (the `i' stands
+       for `insensitive') you can define all the case variants of a macro
+       at once, so that `%idefine foo bar' would cause `foo', `Foo', `FOO',
+       `fOO' and so on all to expand to `bar'.
+
+       There is a mechanism which detects when a macro call has occurred as
+       a result of a previous expansion of the same macro, to guard against
+       circular references and infinite loops. If this happens, the
+       preprocessor will only expand the first occurrence of the macro.
+       Hence, if you code
+
+       %define a(x) 1+a(x) 
+                 mov ax,a(3)
+
+       the macro `a(3)' will expand once, becoming `1+a(3)', and will then
+       expand no further. This behaviour can be useful: see section 8.1 for
+       an example of its use.
+
+       You can overload single-line macros: if you write
+
+       %define foo(x) 1+x 
+       %define foo(x,y) 1+x*y
+
+       the preprocessor will be able to handle both types of macro call, by
+       counting the parameters you pass; so `foo(3)' will become `1+3'
+       whereas `foo(ebx,2)' will become `1+ebx*2'. However, if you define
+
+       %define foo bar
+
+       then no other definition of `foo' will be accepted: a macro with no
+       parameters prohibits the definition of the same name as a macro
+       _with_ parameters, and vice versa.
+
+       This doesn't prevent single-line macros being _redefined_: you can
+       perfectly well define a macro with
+
+       %define foo bar
+
+       and then re-define it later in the same source file with
+
+       %define foo baz
+
+       Then everywhere the macro `foo' is invoked, it will be expanded
+       according to the most recent definition. This is particularly useful
+       when defining single-line macros with `%assign' (see section 4.1.2).
+
+       You can pre-define single-line macros using the `-d' option on the
+       NASM command line: see section 2.1.7.
+
+ 4.1.2 Preprocessor Variables: `%assign'
+
+       An alternative way to define single-line macros is by means of the
+       `%assign' command (and its case sensitivecase-insensitive
+       counterpart `%iassign', which differs from `%assign' in exactly the
+       same way that `%idefine' differs from `%define').
+
+       `%assign' is used to define single-line macros which take no
+       parameters and have a numeric value. This value can be specified in
+       the form of an expression, and it will be evaluated once, when the
+       `%assign' directive is processed.
+
+       Like `%define', macros defined using `%assign' can be re-defined
+       later, so you can do things like
+
+       %assign i i+1
+
+       to increment the numeric value of a macro.
+
+       `%assign' is useful for controlling the termination of `%rep'
+       preprocessor loops: see section 4.4 for an example of this. Another
+       use for `%assign' is given in section 7.4 and section 8.1.
+
+       The expression passed to `%assign' is a critical expression (see
+       section 3.7), and must also evaluate to a pure number (rather than a
+       relocatable reference such as a code or data address, or anything
+       involving a register).
+
+   4.2 Multi-Line Macros: `%macro'
+
+       Multi-line macros are much more like the type of macro seen in MASM
+       and TASM: a multi-line macro definition in NASM looks something like
+       this.
+
+       %macro prologue 1 
+                 push ebp 
+                 mov ebp,esp 
+                 sub esp,%1 
+       %endmacro
+
+       This defines a C-like function prologue as a macro: so you would
+       invoke the macro with a call such as
+
+       myfunc:   prologue 12
+
+       which would expand to the three lines of code
+
+       myfunc:   push ebp 
+                 mov ebp,esp 
+                 sub esp,12
+
+       The number `1' after the macro name in the `%macro' line defines the
+       number of parameters the macro `prologue' expects to receive. The
+       use of `%1' inside the macro definition refers to the first
+       parameter to the macro call. With a macro taking more than one
+       parameter, subsequent parameters would be referred to as `%2', `%3'
+       and so on.
+
+       Multi-line macros, like single-line macros, are case-sensitive,
+       unless you define them using the alternative directive `%imacro'.
+
+       If you need to pass a comma as _part_ of a parameter to a multi-line
+       macro, you can do that by enclosing the entire parameter in braces.
+       So you could code things like
+
+       %macro silly 2 
+       %2:       db %1 
+       %endmacro 
+                 silly 'a', letter_a    ; letter_a:  db 'a' 
+                 silly 'ab', string_ab  ; string_ab: db 'ab' 
+                 silly {13,10}, crlf    ; crlf:      db 13,10
+
+ 4.2.1 Overloading Multi-Line Macros
+
+       As with single-line macros, multi-line macros can be overloaded by
+       defining the same macro name several times with different numbers of
+       parameters. This time, no exception is made for macros with no
+       parameters at all. So you could define
+
+       %macro prologue 0 
+                 push ebp 
+                 mov ebp,esp 
+       %endmacro
+
+       to define an alternative form of the function prologue which
+       allocates no local stack space.
+
+       Sometimes, however, you might want to `overload' a machine
+       instruction; for example, you might want to define
+
+       %macro push 2 
+                 push %1 
+                 push %2 
+       %endmacro
+
+       so that you could code
+
+                 push ebx               ; this line is not a macro call 
+                 push eax,ecx           ; but this one is
+
+       Ordinarily, NASM will give a warning for the first of the above two
+       lines, since `push' is now defined to be a macro, and is being
+       invoked with a number of parameters for which no definition has been
+       given. The correct code will still be generated, but the assembler
+       will give a warning. This warning can be disabled by the use of the
+       `-w-macro-params' command-line option (see section 2.1.10).
+
+ 4.2.2 Macro-Local Labels
+
+       NASM allows you to define labels within a multi-line macro
+       definition in such a way as to make them local to the macro call: so
+       calling the same macro multiple times will use a different label
+       each time. You do this by prefixing `%%' to the label name. So you
+       can invent an instruction which executes a `RET' if the `Z' flag is
+       set by doing this:
+
+       %macro retz 0 
+                 jnz %%skip 
+                 ret 
+       %%skip: 
+       %endmacro
+
+       You can call this macro as many times as you want, and every time
+       you call it NASM will make up a different `real' name to substitute
+       for the label `%%skip'. The names NASM invents are of the form
+       `..@2345.skip', where the number 2345 changes with every macro call.
+       The `..@' prefix prevents macro-local labels from interfering with
+       the local label mechanism, as described in section 3.8. You should
+       avoid defining your own labels in this form (the `..@' prefix, then
+       a number, then another period) in case they interfere with macro-
+       local labels.
+
+ 4.2.3 Greedy Macro Parameters
+
+       Occasionally it is useful to define a macro which lumps its entire
+       command line into one parameter definition, possibly after
+       extracting one or two smaller parameters from the front. An example
+       might be a macro to write a text string to a file in MS-DOS, where
+       you might want to be able to write
+
+                 writefile [filehandle],"hello, world",13,10
+
+       NASM allows you to define the last parameter of a macro to be
+       _greedy_, meaning that if you invoke the macro with more parameters
+       than it expects, all the spare parameters get lumped into the last
+       defined one along with the separating commas. So if you code:
+
+       %macro writefile 2+ 
+                 jmp %%endstr 
+       %%str:    db %2 
+       %%endstr: mov dx,%%str 
+                 mov cx,%%endstr-%%str 
+                 mov bx,%1 
+                 mov ah,0x40 
+                 int 0x21 
+       %endmacro
+
+       then the example call to `writefile' above will work as expected:
+       the text before the first comma, `[filehandle]', is used as the
+       first macro parameter and expanded when `%1' is referred to, and all
+       the subsequent text is lumped into `%2' and placed after the `db'.
+
+       The greedy nature of the macro is indicated to NASM by the use of
+       the `+' sign after the parameter count on the `%macro' line.
+
+       If you define a greedy macro, you are effectively telling NASM how
+       it should expand the macro given _any_ number of parameters from the
+       actual number specified up to infinity; in this case, for example,
+       NASM now knows what to do when it sees a call to `writefile' with 2,
+       3, 4 or more parameters. NASM will take this into account when
+       overloading macros, and will not allow you to define another form of
+       `writefile' taking 4 parameters (for example).
+
+       Of course, the above macro could have been implemented as a non-
+       greedy macro, in which case the call to it would have had to look
+       like
+
+                 writefile [filehandle], {"hello, world",13,10}
+
+       NASM provides both mechanisms for putting commas in macro
+       parameters, and you choose which one you prefer for each macro
+       definition.
+
+       See section 5.2.1 for a better way to write the above macro.
+
+ 4.2.4 Default Macro Parameters
+
+       NASM also allows you to define a multi-line macro with a _range_ of
+       allowable parameter counts. If you do this, you can specify defaults
+       for omitted parameters. So, for example:
+
+       %macro die 0-1 "Painful program death has occurred." 
+                 writefile 2,%1 
+                 mov ax,0x4c01 
+                 int 0x21 
+       %endmacro
+
+       This macro (which makes use of the `writefile' macro defined in
+       section 4.2.3) can be called with an explicit error message, which
+       it will display on the error output stream before exiting, or it can
+       be called with no parameters, in which case it will use the default
+       error message supplied in the macro definition.
+
+       In general, you supply a minimum and maximum number of parameters
+       for a macro of this type; the minimum number of parameters are then
+       required in the macro call, and then you provide defaults for the
+       optional ones. So if a macro definition began with the line
+
+       %macro foobar 1-3 eax,[ebx+2]
+
+       then it could be called with between one and three parameters, and
+       `%1' would always be taken from the macro call. `%2', if not
+       specified by the macro call, would default to `eax', and `%3' if not
+       specified would default to `[ebx+2]'.
+
+       You may omit parameter defaults from the macro definition, in which
+       case the parameter default is taken to be blank. This can be useful
+       for macros which can take a variable number of parameters, since the
+       `%0' token (see section 4.2.5) allows you to determine how many
+       parameters were really passed to the macro call.
+
+       This defaulting mechanism can be combined with the greedy-parameter
+       mechanism; so the `die' macro above could be made more powerful, and
+       more useful, by changing the first line of the definition to
+
+       %macro die 0-1+ "Painful program death has occurred.",13,10
+
+       The maximum parameter count can be infinite, denoted by `*'. In this
+       case, of course, it is impossible to provide a _full_ set of default
+       parameters. Examples of this usage are shown in section 4.2.6.
+
+ 4.2.5 `%0': Macro Parameter Counter
+
+       For a macro which can take a variable number of parameters, the
+       parameter reference `%0' will return a numeric constant giving the
+       number of parameters passed to the macro. This can be used as an
+       argument to `%rep' (see section 4.4) in order to iterate through all
+       the parameters of a macro. Examples are given in section 4.2.6.
+
+ 4.2.6 `%rotate': Rotating Macro Parameters
+
+       Unix shell programmers will be familiar with the `shift' shell
+       command, which allows the arguments passed to a shell script
+       (referenced as `$1', `$2' and so on) to be moved left by one place,
+       so that the argument previously referenced as `$2' becomes available
+       as `$1', and the argument previously referenced as `$1' is no longer
+       available at all.
+
+       NASM provides a similar mechanism, in the form of `%rotate'. As its
+       name suggests, it differs from the Unix `shift' in that no
+       parameters are lost: parameters rotated off the left end of the
+       argument list reappear on the right, and vice versa.
+
+       `%rotate' is invoked with a single numeric argument (which may be an
+       expression). The macro parameters are rotated to the left by that
+       many places. If the argument to `%rotate' is negative, the macro
+       parameters are rotated to the right.
+
+       So a pair of macros to save and restore a set of registers might
+       work as follows:
+
+       %macro multipush 1-* 
+       %rep %0 
+                 push %1 
+       %rotate 1 
+       %endrep 
+       %endmacro
+
+       This macro invokes the `PUSH' instruction on each of its arguments
+       in turn, from left to right. It begins by pushing its first
+       argument, `%1', then invokes `%rotate' to move all the arguments one
+       place to the left, so that the original second argument is now
+       available as `%1'. Repeating this procedure as many times as there
+       were arguments (achieved by supplying `%0' as the argument to
+       `%rep') causes each argument in turn to be pushed.
+
+       Note also the use of `*' as the maximum parameter count, indicating
+       that there is no upper limit on the number of parameters you may
+       supply to the `multipush' macro.
+
+       It would be convenient, when using this macro, to have a `POP'
+       equivalent, which _didn't_ require the arguments to be given in
+       reverse order. Ideally, you would write the `multipush' macro call,
+       then cut-and-paste the line to where the pop needed to be done, and
+       change the name of the called macro to `multipop', and the macro
+       would take care of popping the registers in the opposite order from
+       the one in which they were pushed.
+
+       This can be done by the following definition:
+
+       %macro multipop 1-* 
+       %rep %0 
+       %rotate -1 
+                 pop %1 
+       %endrep 
+       %endmacro
+
+       This macro begins by rotating its arguments one place to the
+       _right_, so that the original _last_ argument appears as `%1'. This
+       is then popped, and the arguments are rotated right again, so the
+       second-to-last argument becomes `%1'. Thus the arguments are
+       iterated through in reverse order.
+
+ 4.2.7 Concatenating Macro Parameters
+
+       NASM can concatenate macro parameters on to other text surrounding
+       them. This allows you to declare a family of symbols, for example,
+       in a macro definition. If, for example, you wanted to generate a
+       table of key codes along with offsets into the table, you could code
+       something like
+
+       %macro keytab_entry 2 
+       keypos%1 equ $-keytab 
+                 db %2 
+       %endmacro 
+       keytab: 
+                 keytab_entry F1,128+1 
+                 keytab_entry F2,128+2 
+                 keytab_entry Return,13
+
+       which would expand to
+
+       keytab: 
+       keyposF1 equ $-keytab 
+                 db 128+1 
+       keyposF2 equ $-keytab 
+                 db 128+2 
+       keyposReturn equ $-keytab 
+                 db 13
+
+       You can just as easily concatenate text on to the other end of a
+       macro parameter, by writing `%1foo'.
+
+       If you need to append a _digit_ to a macro parameter, for example
+       defining labels `foo1' and `foo2' when passed the parameter `foo',
+       you can't code `%11' because that would be taken as the eleventh
+       macro parameter. Instead, you must code `%{1}1', which will separate
+       the first `1' (giving the number of the macro parameter) from the
+       second (literal text to be concatenated to the parameter).
+
+       This concatenation can also be applied to other preprocessor in-line
+       objects, such as macro-local labels (section 4.2.2) and context-
+       local labels (section 4.6.2). In all cases, ambiguities in syntax
+       can be resolved by enclosing everything after the `%' sign and
+       before the literal text in braces: so `%{%foo}bar' concatenates the
+       text `bar' to the end of the real name of the macro-local label
+       `%%foo'. (This is unnecessary, since the form NASM uses for the real
+       names of macro-local labels means that the two usages `%{%foo}bar'
+       and `%%foobar' would both expand to the same thing anyway;
+       nevertheless, the capability is there.)
+
+ 4.2.8 Condition Codes as Macro Parameters
+
+       NASM can give special treatment to a macro parameter which contains
+       a condition code. For a start, you can refer to the macro parameter
+       `%1' by means of the alternative syntax `%+1', which informs NASM
+       that this macro parameter is supposed to contain a condition code,
+       and will cause the preprocessor to report an error message if the
+       macro is called with a parameter which is _not_ a valid condition
+       code.
+
+       Far more usefully, though, you can refer to the macro parameter by
+       means of `%-1', which NASM will expand as the _inverse_ condition
+       code. So the `retz' macro defined in section 4.2.2 can be replaced
+       by a general conditional-return macro like this:
+
+       %macro retc 1 
+                 j%-1 %%skip 
+                 ret 
+       %%skip: 
+       %endmacro
+
+       This macro can now be invoked using calls like `retc ne', which will
+       cause the conditional-jump instruction in the macro expansion to
+       come out as `JE', or `retc po' which will make the jump a `JPE'.
+
+       The `%+1' macro-parameter reference is quite happy to interpret the
+       arguments `CXZ' and `ECXZ' as valid condition codes; however, `%-1'
+       will report an error if passed either of these, because no inverse
+       condition code exists.
+
+ 4.2.9 Disabling Listing Expansion
+
+       When NASM is generating a listing file from your program, it will
+       generally expand multi-line macros by means of writing the macro
+       call and then listing each line of the expansion. This allows you to
+       see which instructions in the macro expansion are generating what
+       code; however, for some macros this clutters the listing up
+       unnecessarily.
+
+       NASM therefore provides the `.nolist' qualifier, which you can
+       include in a macro definition to inhibit the expansion of the macro
+       in the listing file. The `.nolist' qualifier comes directly after
+       the number of parameters, like this:
+
+       %macro foo 1.nolist
+
+       Or like this:
+
+       %macro bar 1-5+.nolist a,b,c,d,e,f,g,h
+
+   4.3 Conditional Assembly
+
+       Similarly to the C preprocessor, NASM allows sections of a source
+       file to be assembled only if certain conditions are met. The general
+       syntax of this feature looks like this:
+
+       %if<condition> 
+       ; some code which only appears if <condition> is met 
+       %elif<condition2> 
+       ; only appears if <condition> is not met but <condition2> is 
+       %else 
+       ; this appears if neither <condition> nor <condition2> was met 
+       %endif
+
+       The `%else' clause is optional, as is the `%elif' clause. You can
+       have more than one `%elif' clause as well.
+
+ 4.3.1 `%ifdef': Testing Single-Line Macro Existence
+
+       Beginning a conditional-assembly block with the line `%ifdef MACRO'
+       will assemble the subsequent code if, and only if, a single-line
+       macro called `MACRO' is defined. If not, then the `%elif' and
+       `%else' blocks (if any) will be processed instead.
+
+       For example, when debugging a program, you might want to write code
+       such as
+
+                 ; perform some function 
+       %ifdef DEBUG 
+                 writefile 2,"Function performed successfully",13,10 
+       %endif 
+                 ; go and do something else
+
+       Then you could use the command-line option `-dDEBUG' to create a
+       version of the program which produced debugging messages, and remove
+       the option to generate the final release version of the program.
+
+       You can test for a macro _not_ being defined by using `%ifndef'
+       instead of `%ifdef'. You can also test for macro definitions in
+       `%elif' blocks by using `%elifdef' and `%elifndef'.
+
+ 4.3.2 `%ifctx': Testing the Context Stack
+
+       The conditional-assembly construct `%ifctx ctxname' will cause the
+       subsequent code to be assembled if and only if the top context on
+       the preprocessor's context stack has the name `ctxname'. As with
+       `%ifdef', the inverse and `%elif' forms `%ifnctx', `%elifctx' and
+       `%elifnctx' are also supported.
+
+       For more details of the context stack, see section 4.6. For a sample
+       use of `%ifctx', see section 4.6.5.
+
+ 4.3.3 `%if': Testing Arbitrary Numeric Expressions
+
+       The conditional-assembly construct `%if expr' will cause the
+       subsequent code to be assembled if and only if the value of the
+       numeric expression `expr' is non-zero. An example of the use of this
+       feature is in deciding when to break out of a `%rep' preprocessor
+       loop: see section 4.4 for a detailed example.
+
+       The expression given to `%if', and its counterpart `%elif', is a
+       critical expression (see section 3.7).
+
+       `%if' extends the normal NASM expression syntax, by providing a set
+       of relational operators which are not normally available in
+       expressions. The operators `=', `<', `>', `<=', `>=' and `<>' test
+       equality, less-than, greater-than, less-or-equal, greater-or-equal
+       and not-equal respectively. The C-like forms `==' and `!=' are
+       supported as alternative forms of `=' and `<>'. In addition, low-
+       priority logical operators `&&', `^^' and `||' are provided,
+       supplying logical AND, logical XOR and logical OR. These work like
+       the C logical operators (although C has no logical XOR), in that
+       they always return either 0 or 1, and treat any non-zero input as 1
+       (so that `^^', for example, returns 1 if exactly one of its inputs
+       is zero, and 0 otherwise). The relational operators also return 1
+       for true and 0 for false.
+
+ 4.3.4 `%ifidn' and `%ifidni': Testing Exact Text Identity
+
+       The construct `%ifidn text1,text2' will cause the subsequent code to
+       be assembled if and only if `text1' and `text2', after expanding
+       single-line macros, are identical pieces of text. Differences in
+       white space are not counted.
+
+       `%ifidni' is similar to `%ifidn', but is case-insensitive.
+
+       For example, the following macro pushes a register or number on the
+       stack, and allows you to treat `IP' as a real register:
+
+       %macro pushparam 1 
+       %ifidni %1,ip 
+                 call %%label 
+       %%label: 
+       %else 
+                 push %1 
+       %endif 
+       %endmacro
+
+       Like most other `%if' constructs, `%ifidn' has a counterpart
+       `%elifidn', and negative forms `%ifnidn' and `%elifnidn'. Similarly,
+       `%ifidni' has counterparts `%elifidni', `%ifnidni' and `%elifnidni'.
+
+ 4.3.5 `%ifid', `%ifnum', `%ifstr': Testing Token Types
+
+       Some macros will want to perform different tasks depending on
+       whether they are passed a number, a string, or an identifier. For
+       example, a string output macro might want to be able to cope with
+       being passed either a string constant or a pointer to an existing
+       string.
+
+       The conditional assembly construct `%ifid', taking one parameter
+       (which may be blank), assembles the subsequent code if and only if
+       the first token in the parameter exists and is an identifier.
+       `%ifnum' works similarly, but tests for the token being a numeric
+       constant; `%ifstr' tests for it being a string.
+
+       For example, the `writefile' macro defined in section 4.2.3 can be
+       extended to take advantage of `%ifstr' in the following fashion:
+
+       %macro writefile 2-3+ 
+       %ifstr %2 
+                 jmp %%endstr 
+       %if %0 = 3 
+       %%str:    db %2,%3 
+       %else 
+       %%str:    db %2 
+       %endif 
+       %%endstr: mov dx,%%str 
+                 mov cx,%%endstr-%%str 
+       %else 
+                 mov dx,%2 
+                 mov cx,%3 
+       %endif 
+                 mov bx,%1 
+                 mov ah,0x40 
+                 int 0x21 
+       %endmacro
+
+       Then the `writefile' macro can cope with being called in either of
+       the following two ways:
+
+                 writefile [file], strpointer, length 
+                 writefile [file], "hello", 13, 10
+
+       In the first, `strpointer' is used as the address of an already-
+       declared string, and `length' is used as its length; in the second,
+       a string is given to the macro, which therefore declares it itself
+       and works out the address and length for itself.
+
+       Note the use of `%if' inside the `%ifstr': this is to detect whether
+       the macro was passed two arguments (so the string would be a single
+       string constant, and `db %2' would be adequate) or more (in which
+       case, all but the first two would be lumped together into `%3', and
+       `db %2,%3' would be required).
+
+        The usual `%elifXXX', `%ifnXXX' and `%elifnXXX' versions exist for
+       each of `%ifid', `%ifnum' and `%ifstr'.
+
+ 4.3.6 `%error': Reporting User-Defined Errors
+
+       The preprocessor directive `%error' will cause NASM to report an
+       error if it occurs in assembled code. So if other users are going to
+       try to assemble your source files, you can ensure that they define
+       the right macros by means of code like this:
+
+       %ifdef SOME_MACRO 
+       ; do some setup 
+       %elifdef SOME_OTHER_MACRO 
+       ; do some different setup 
+       %else 
+       %error Neither SOME_MACRO nor SOME_OTHER_MACRO was defined. 
+       %endif
+
+       Then any user who fails to understand the way your code is supposed
+       to be assembled will be quickly warned of their mistake, rather than
+       having to wait until the program crashes on being run and then not
+       knowing what went wrong.
+
+   4.4 Preprocessor Loops: `%rep'
+
+       NASM's `TIMES' prefix, though useful, cannot be used to invoke a
+       multi-line macro multiple times, because it is processed by NASM
+       after macros have already been expanded. Therefore NASM provides
+       another form of loop, this time at the preprocessor level: `%rep'.
+
+       The directives `%rep' and `%endrep' (`%rep' takes a numeric
+       argument, which can be an expression; `%endrep' takes no arguments)
+       can be used to enclose a chunk of code, which is then replicated as
+       many times as specified by the preprocessor:
+
+       %assign i 0 
+       %rep 64 
+                 inc word [table+2*i] 
+       %assign i i+1 
+       %endrep
+
+       This will generate a sequence of 64 `INC' instructions, incrementing
+       every word of memory from `[table]' to `[table+126]'.
+
+       For more complex termination conditions, or to break out of a repeat
+       loop part way along, you can use the `%exitrep' directive to
+       terminate the loop, like this:
+
+       fibonacci: 
+       %assign i 0 
+       %assign j 1 
+       %rep 100 
+       %if j > 65535 
+       %exitrep 
+       %endif 
+                 dw j 
+       %assign k j+i 
+       %assign i j 
+       %assign j k 
+       %endrep 
+       fib_number equ ($-fibonacci)/2
+
+       This produces a list of all the Fibonacci numbers that will fit in
+       16 bits. Note that a maximum repeat count must still be given to
+       `%rep'. This is to prevent the possibility of NASM getting into an
+       infinite loop in the preprocessor, which (on multitasking or multi-
+       user systems) would typically cause all the system memory to be
+       gradually used up and other applications to start crashing.
+
+   4.5 Including Other Files
+
+       Using, once again, a very similar syntax to the C preprocessor,
+       NASM's preprocessor lets you include other source files into your
+       code. This is done by the use of the `%include' directive:
+
+       %include "macros.mac"
+
+       will include the contents of the file `macros.mac' into the source
+       file containing the `%include' directive.
+
+       Include files are searched for in the current directory (the
+       directory you're in when you run NASM, as opposed to the location of
+       the NASM executable or the location of the source file), plus any
+       directories specified on the NASM command line using the `-i'
+       option.
+
+       The standard C idiom for preventing a file being included more than
+       once is just as applicable in NASM: if the file `macros.mac' has the
+       form
+
+       %ifndef MACROS_MAC 
+       %define MACROS_MAC 
+       ; now define some macros 
+       %endif
+
+       then including the file more than once will not cause errors,
+       because the second time the file is included nothing will happen
+       because the macro `MACROS_MAC' will already be defined.
+
+       You can force a file to be included even if there is no `%include'
+       directive that explicitly includes it, by using the `-p' option on
+       the NASM command line (see section 2.1.6).
+
+   4.6 The Context Stack
+
+       Having labels that are local to a macro definition is sometimes not
+       quite powerful enough: sometimes you want to be able to share labels
+       between several macro calls. An example might be a `REPEAT' ...
+       `UNTIL' loop, in which the expansion of the `REPEAT' macro would
+       need to be able to refer to a label which the `UNTIL' macro had
+       defined. However, for such a macro you would also want to be able to
+       nest these loops.
+
+       NASM provides this level of power by means of a _context stack_. The
+       preprocessor maintains a stack of _contexts_, each of which is
+       characterised by a name. You add a new context to the stack using
+       the `%push' directive, and remove one using `%pop'. You can define
+       labels that are local to a particular context on the stack.
+
+ 4.6.1 `%push' and `%pop': Creating and Removing Contexts
+
+       The `%push' directive is used to create a new context and place it
+       on the top of the context stack. `%push' requires one argument,
+       which is the name of the context. For example:
+
+       %push foobar
+
+       This pushes a new context called `foobar' on the stack. You can have
+       several contexts on the stack with the same name: they can still be
+       distinguished.
+
+       The directive `%pop', requiring no arguments, removes the top
+       context from the context stack and destroys it, along with any
+       labels associated with it.
+
+ 4.6.2 Context-Local Labels
+
+       Just as the usage `%%foo' defines a label which is local to the
+       particular macro call in which it is used, the usage `%$foo' is used
+       to define a label which is local to the context on the top of the
+       context stack. So the `REPEAT' and `UNTIL' example given above could
+       be implemented by means of:
+
+       %macro repeat 0 
+       %push repeat 
+       %$begin: 
+       %endmacro
+
+       %macro until 1 
+                 j%-1 %$begin 
+       %pop 
+       %endmacro
+
+       and invoked by means of, for example,
+
+                 mov cx,string 
+                 repeat 
+                 add cx,3 
+                 scasb 
+                 until e
+
+       which would scan every fourth byte of a string in search of the byte
+       in `AL'.
+
+       If you need to define, or access, labels local to the context
+       _below_ the top one on the stack, you can use `%$$foo', or `%$$$foo'
+       for the context below that, and so on.
+
+ 4.6.3 Context-Local Single-Line Macros
+
+       NASM also allows you to define single-line macros which are local to
+       a particular context, in just the same way:
+
+       %define %$localmac 3
+
+       will define the single-line macro `%$localmac' to be local to the
+       top context on the stack. Of course, after a subsequent `%push', it
+       can then still be accessed by the name `%$$localmac'.
+
+ 4.6.4 `%repl': Renaming a Context
+
+       If you need to change the name of the top context on the stack (in
+       order, for example, to have it respond differently to `%ifctx'), you
+       can execute a `%pop' followed by a `%push'; but this will have the
+       side effect of destroying all context-local labels and macros
+       associated with the context that was just popped.
+
+       NASM provides the directive `%repl', which _replaces_ a context with
+       a different name, without touching the associated macros and labels.
+       So you could replace the destructive code
+
+       %pop 
+       %push newname
+
+       with the non-destructive version `%repl newname'.
+
+ 4.6.5 Example Use of the Context Stack: Block IFs
+
+       This example makes use of almost all the context-stack features,
+       including the conditional-assembly construct `%ifctx', to implement
+       a block IF statement as a set of macros.
+
+       %macro if 1 
+           %push if 
+           j%-1 %$ifnot 
+       %endmacro
+
+       %macro else 0 
+           %ifctx if 
+               %repl else 
+               jmp %$ifend 
+               %$ifnot: 
+           %else 
+               %error "expected `if' before `else'" 
+           %endif 
+       %endmacro
+
+       %macro endif 0 
+           %ifctx if 
+               %$ifnot: 
+               %pop 
+           %elifctx else 
+               %$ifend: 
+               %pop 
+           %else 
+               %error "expected `if' or `else' before `endif'" 
+           %endif 
+       %endmacro
+
+       This code is more robust than the `REPEAT' and `UNTIL' macros given
+       in section 4.6.2, because it uses conditional assembly to check that
+       the macros are issued in the right order (for example, not calling
+       `endif' before `if') and issues a `%error' if they're not.
+
+       In addition, the `endif' macro has to be able to cope with the two
+       distinct cases of either directly following an `if', or following an
+       `else'. It achieves this, again, by using conditional assembly to do
+       different things depending on whether the context on top of the
+       stack is `if' or `else'.
+
+       The `else' macro has to preserve the context on the stack, in order
+       to have the `%$ifnot' referred to by the `if' macro be the same as
+       the one defined by the `endif' macro, but has to change the
+       context's name so that `endif' will know there was an intervening
+       `else'. It does this by the use of `%repl'.
+
+       A sample usage of these macros might look like:
+
+                 cmp ax,bx 
+                 if ae 
+                   cmp bx,cx 
+                   if ae 
+                     mov ax,cx 
+                   else 
+                     mov ax,bx 
+                   endif 
+                 else 
+                   cmp ax,cx 
+                   if ae 
+                     mov ax,cx 
+                   endif 
+                 endif
+
+       The block-`IF' macros handle nesting quite happily, by means of
+       pushing another context, describing the inner `if', on top of the
+       one describing the outer `if'; thus `else' and `endif' always refer
+       to the last unmatched `if' or `else'.
+
+   4.7 Standard Macros
+
+       NASM defines a set of standard macros, which are already defined
+       when it starts to process any source file. If you really need a
+       program to be assembled with no pre-defined macros, you can use the
+       `%clear' directive to empty the preprocessor of everything.
+
+       Most user-level assembler directives (see chapter 5) are implemented
+       as macros which invoke primitive directives; these are described in
+       chapter 5. The rest of the standard macro set is described here.
+
+ 4.7.1 `__NASM_MAJOR__' and `__NASM_MINOR__': NASM Version
+
+       The single-line macros `__NASM_MAJOR__' and `__NASM_MINOR__' expand
+       to the major and minor parts of the version number of NASM being
+       used. So, under NASM 0.96 for example, `__NASM_MAJOR__' would be
+       defined to be 0 and `__NASM_MINOR__' would be defined as 96.
+
+ 4.7.2 `__FILE__' and `__LINE__': File Name and Line Number
+
+       Like the C preprocessor, NASM allows the user to find out the file
+       name and line number containing the current instruction. The macro
+       `__FILE__' expands to a string constant giving the name of the
+       current input file (which may change through the course of assembly
+       if `%include' directives are used), and `__LINE__' expands to a
+       numeric constant giving the current line number in the input file.
+
+       These macros could be used, for example, to communicate debugging
+       information to a macro, since invoking `__LINE__' inside a macro
+       definition (either single-line or multi-line) will return the line
+       number of the macro _call_, rather than _definition_. So to
+       determine where in a piece of code a crash is occurring, for
+       example, one could write a routine `stillhere', which is passed a
+       line number in `EAX' and outputs something like `line 155: still
+       here'. You could then write a macro
+
+       %macro notdeadyet 0 
+                 push eax 
+                 mov eax,__LINE__ 
+                 call stillhere 
+                 pop eax 
+       %endmacro
+
+       and then pepper your code with calls to `notdeadyet' until you find
+       the crash point.
+
+ 4.7.3 `STRUC' and `ENDSTRUC': Declaring Structure Data Types
+
+       The core of NASM contains no intrinsic means of defining data
+       structures; instead, the preprocessor is sufficiently powerful that
+       data structures can be implemented as a set of macros. The macros
+       `STRUC' and `ENDSTRUC' are used to define a structure data type.
+
+       `STRUC' takes one parameter, which is the name of the data type.
+       This name is defined as a symbol with the value zero, and also has
+       the suffix `_size' appended to it and is then defined as an `EQU'
+       giving the size of the structure. Once `STRUC' has been issued, you
+       are defining the structure, and should define fields using the
+       `RESB' family of pseudo-instructions, and then invoke `ENDSTRUC' to
+       finish the definition.
+
+       For example, to define a structure called `mytype' containing a
+       longword, a word, a byte and a string of bytes, you might code
+
+                 struc mytype 
+       mt_long:  resd 1 
+       mt_word:  resw 1 
+       mt_byte:  resb 1 
+       mt_str:   resb 32 
+                 endstruc
+
+       The above code defines six symbols: `mt_long' as 0 (the offset from
+       the beginning of a `mytype' structure to the longword field),
+       `mt_word' as 4, `mt_byte' as 6, `mt_str' as 7, `mytype_size' as 39,
+       and `mytype' itself as zero.
+
+       The reason why the structure type name is defined at zero is a side
+       effect of allowing structures to work with the local label
+       mechanism: if your structure members tend to have the same names in
+       more than one structure, you can define the above structure like
+       this:
+
+                 struc mytype 
+       .long:    resd 1 
+       .word:    resw 1 
+       .byte:    resb 1 
+       .str:     resb 32 
+                 endstruc
+
+       This defines the offsets to the structure fields as `mytype.long',
+       `mytype.word', `mytype.byte' and `mytype.str'.
+
+       NASM, since it has no _intrinsic_ structure support, does not
+       support any form of period notation to refer to the elements of a
+       structure once you have one (except the above local-label notation),
+       so code such as `mov ax,[mystruc.mt_word]' is not valid. `mt_word'
+       is a constant just like any other constant, so the correct syntax is
+       `mov ax,[mystruc+mt_word]' or `mov ax,[mystruc+mytype.word]'.
+
+ 4.7.4 `ISTRUC', `AT' and `IEND': Declaring Instances of Structures
+
+       Having defined a structure type, the next thing you typically want
+       to do is to declare instances of that structure in your data
+       segment. NASM provides an easy way to do this in the `ISTRUC'
+       mechanism. To declare a structure of type `mytype' in a program, you
+       code something like this:
+
+       mystruc:  istruc mytype 
+                 at mt_long, dd 123456 
+                 at mt_word, dw 1024 
+                 at mt_byte, db 'x' 
+                 at mt_str, db 'hello, world', 13, 10, 0 
+                 iend
+
+       The function of the `AT' macro is to make use of the `TIMES' prefix
+       to advance the assembly position to the correct point for the
+       specified structure field, and then to declare the specified data.
+       Therefore the structure fields must be declared in the same order as
+       they were specified in the structure definition.
+
+       If the data to go in a structure field requires more than one source
+       line to specify, the remaining source lines can easily come after
+       the `AT' line. For example:
+
+                 at mt_str, db 123,134,145,156,167,178,189 
+                 db 190,100,0
+
+       Depending on personal taste, you can also omit the code part of the
+       `AT' line completely, and start the structure field on the next
+       line:
+
+                 at mt_str 
+                 db 'hello, world' 
+                 db 13,10,0
+
+ 4.7.5 `ALIGN' and `ALIGNB': Data Alignment
+
+       The `ALIGN' and `ALIGNB' macros provides a convenient way to align
+       code or data on a word, longword, paragraph or other boundary. (Some
+       assemblers call this directive `EVEN'.) The syntax of the `ALIGN'
+       and `ALIGNB' macros is
+
+                 align 4                ; align on 4-byte boundary 
+                 align 16               ; align on 16-byte boundary 
+                 align 8,db 0           ; pad with 0s rather than NOPs 
+                 align 4,resb 1         ; align to 4 in the BSS 
+                 alignb 4               ; equivalent to previous line
+
+       Both macros require their first argument to be a power of two; they
+       both compute the number of additional bytes required to bring the
+       length of the current section up to a multiple of that power of two,
+       and then apply the `TIMES' prefix to their second argument to
+       perform the alignment.
+
+       If the second argument is not specified, the default for `ALIGN' is
+       `NOP', and the default for `ALIGNB' is `RESB 1'. So if the second
+       argument is specified, the two macros are equivalent. Normally, you
+       can just use `ALIGN' in code and data sections and `ALIGNB' in BSS
+       sections, and never need the second argument except for special
+       purposes.
+
+       `ALIGN' and `ALIGNB', being simple macros, perform no error
+       checking: they cannot warn you if their first argument fails to be a
+       power of two, or if their second argument generates more than one
+       byte of code. In each of these cases they will silently do the wrong
+       thing.
+
+       `ALIGNB' (or `ALIGN' with a second argument of `RESB 1') can be used
+       within structure definitions:
+
+                 struc mytype2 
+       mt_byte:  resb 1 
+                 alignb 2 
+       mt_word:  resw 1 
+                 alignb 4 
+       mt_long:  resd 1 
+       mt_str:   resb 32 
+                 endstruc
+
+       This will ensure that the structure members are sensibly aligned
+       relative to the base of the structure.
+
+       A final caveat: `ALIGN' and `ALIGNB' work relative to the beginning
+       of the _section_, not the beginning of the address space in the
+       final executable. Aligning to a 16-byte boundary when the section
+       you're in is only guaranteed to be aligned to a 4-byte boundary, for
+       example, is a waste of effort. Again, NASM does not check that the
+       section's alignment characteristics are sensible for the use of
+       `ALIGN' or `ALIGNB'.
+
+Chapter 5: Assembler Directives
+-------------------------------
+
+       NASM, though it attempts to avoid the bureaucracy of assemblers like
+       MASM and TASM, is nevertheless forced to support a _few_ directives.
+       These are described in this chapter.
+
+       NASM's directives come in two types: user-level
+       directives_user-level_ directives and primitive
+       directives_primitive_ directives. Typically, each directive has a
+       user-level form and a primitive form. In almost all cases, we
+       recommend that users use the user-level forms of the directives,
+       which are implemented as macros which call the primitive forms.
+
+       Primitive directives are enclosed in square brackets; user-level
+       directives are not.
+
+       In addition to the universal directives described in this chapter,
+       each object file format can optionally supply extra directives in
+       order to control particular features of that file format. These
+       format-specific directives_format-specific_ directives are
+       documented along with the formats that implement them, in chapter 6.
+
+   5.1 `BITS': Specifying Target Processor Mode
+
+       The `BITS' directive specifies whether NASM should generate code
+       designed to run on a processor operating in 16-bit mode, or code
+       designed to run on a processor operating in 32-bit mode. The syntax
+       is `BITS 16' or `BITS 32'.
+
+       In most cases, you should not need to use `BITS' explicitly. The
+       `aout', `coff', `elf' and `win32' object formats, which are designed
+       for use in 32-bit operating systems, all cause NASM to select 32-bit
+       mode by default. The `obj' object format allows you to specify each
+       segment you define as either `USE16' or `USE32', and NASM will set
+       its operating mode accordingly, so the use of the `BITS' directive
+       is once again unnecessary.
+
+       The most likely reason for using the `BITS' directive is to write
+       32-bit code in a flat binary file; this is because the `bin' output
+       format defaults to 16-bit mode in anticipation of it being used most
+       frequently to write DOS `.COM' programs, DOS `.SYS' device drivers
+       and boot loader software.
+
+       You do _not_ need to specify `BITS 32' merely in order to use 32-bit
+       instructions in a 16-bit DOS program; if you do, the assembler will
+       generate incorrect code because it will be writing code targeted at
+       a 32-bit platform, to be run on a 16-bit one.
+
+       When NASM is in `BITS 16' state, instructions which use 32-bit data
+       are prefixed with an 0x66 byte, and those referring to 32-bit
+       addresses have an 0x67 prefix. In `BITS 32' state, the reverse is
+       true: 32-bit instructions require no prefixes, whereas instructions
+       using 16-bit data need an 0x66 and those working in 16-bit addresses
+       need an 0x67.
+
+       The `BITS' directive has an exactly equivalent primitive form,
+       `[BITS 16]' and `[BITS 32]'. The user-level form is a macro which
+       has no function other than to call the primitive form.
+
+   5.2 `SECTION' or `SEGMENT': Changing and Defining Sections
+
+       The `SECTION' directive (`SEGMENT' is an exactly equivalent synonym)
+       changes which section of the output file the code you write will be
+       assembled into. In some object file formats, the number and names of
+       sections are fixed; in others, the user may make up as many as they
+       wish. Hence `SECTION' may sometimes give an error message, or may
+       define a new section, if you try to switch to a section that does
+       not (yet) exist.
+
+       The Unix object formats, and the `bin' object format, all support
+       the standardised section names `.text', `.data' and `.bss' for the
+       code, data and uninitialised-data sections. The `obj' format, by
+       contrast, does not recognise these section names as being special,
+       and indeed will strip off the leading period of any section name
+       that has one.
+
+ 5.2.1 The `__SECT__' Macro
+
+       The `SECTION' directive is unusual in that its user-level form
+       functions differently from its primitive form. The primitive form,
+       `[SECTION xyz]', simply switches the current target section to the
+       one given. The user-level form, `SECTION xyz', however, first
+       defines the single-line macro `__SECT__' to be the primitive
+       `[SECTION]' directive which it is about to issue, and then issues
+       it. So the user-level directive
+
+                 SECTION .text
+
+       expands to the two lines
+
+       %define __SECT__ [SECTION .text] 
+                 [SECTION .text]
+
+       Users may find it useful to make use of this in their own macros.
+       For example, the `writefile' macro defined in section 4.2.3 can be
+       usefully rewritten in the following more sophisticated form:
+
+       %macro writefile 2+ 
+                 [section .data] 
+       %%str:    db %2 
+       %%endstr: 
+                 __SECT__ 
+                 mov dx,%%str 
+                 mov cx,%%endstr-%%str 
+                 mov bx,%1 
+                 mov ah,0x40 
+                 int 0x21 
+       %endmacro
+
+       This form of the macro, once passed a string to output, first
+       switches temporarily to the data section of the file, using the
+       primitive form of the `SECTION' directive so as not to modify
+       `__SECT__'. It then declares its string in the data section, and
+       then invokes `__SECT__' to switch back to _whichever_ section the
+       user was previously working in. It thus avoids the need, in the
+       previous version of the macro, to include a `JMP' instruction to
+       jump over the data, and also does not fail if, in a complicated
+       `OBJ' format module, the user could potentially be assembling the
+       code in any of several separate code sections.
+
+   5.3 `ABSOLUTE': Defining Absolute Labels
+
+       The `ABSOLUTE' directive can be thought of as an alternative form of
+       `SECTION': it causes the subsequent code to be directed at no
+       physical section, but at the hypothetical section starting at the
+       given absolute address. The only instructions you can use in this
+       mode are the `RESB' family.
+
+       `ABSOLUTE' is used as follows:
+
+                 absolute 0x1A 
+       kbuf_chr  resw 1 
+       kbuf_free resw 1 
+       kbuf      resw 16
+
+       This example describes a section of the PC BIOS data area, at
+       segment address 0x40: the above code defines `kbuf_chr' to be 0x1A,
+       `kbuf_free' to be 0x1C, and `kbuf' to be 0x1E.
+
+       The user-level form of `ABSOLUTE', like that of `SECTION', redefines
+       the `__SECT__' macro when it is invoked.
+
+       `STRUC' and `ENDSTRUC' are defined as macros which use `ABSOLUTE'
+       (and also `__SECT__').
+
+       `ABSOLUTE' doesn't have to take an absolute constant as an argument:
+       it can take an expression (actually, a critical expression: see
+       section 3.7) and it can be a value in a segment. For example, a TSR
+       can re-use its setup code as run-time BSS like this:
+
+                 org 100h               ; it's a .COM program 
+                 jmp setup              ; setup code comes last 
+                 ; the resident part of the TSR goes here 
+       setup:    ; now write the code that installs the TSR here 
+                 absolute setup 
+       runtimevar1 resw 1 
+       runtimevar2 resd 20 
+       tsr_end:
+
+       This defines some variables `on top of' the setup code, so that
+       after the setup has finished running, the space it took up can be
+       re-used as data storage for the running TSR. The symbol `tsr_end'
+       can be used to calculate the total size of the part of the TSR that
+       needs to be made resident.
+
+   5.4 `EXTERN': Importing Symbols from Other Modules
+
+       `EXTERN' is similar to the MASM directive `EXTRN' and the C keyword
+       `extern': it is used to declare a symbol which is not defined
+       anywhere in the module being assembled, but is assumed to be defined
+       in some other module and needs to be referred to by this one. Not
+       every object-file format can support external variables: the `bin'
+       format cannot.
+
+       The `EXTERN' directive takes as many arguments as you like. Each
+       argument is the name of a symbol:
+
+                 extern _printf 
+                 extern _sscanf,_fscanf
+
+       Some object-file formats provide extra features to the `EXTERN'
+       directive. In all cases, the extra features are used by suffixing a
+       colon to the symbol name followed by object-format specific text.
+       For example, the `obj' format allows you to declare that the default
+       segment base of an external should be the group `dgroup' by means of
+       the directive
+
+                 extern _variable:wrt dgroup
+
+       The primitive form of `EXTERN' differs from the user-level form only
+       in that it can take only one argument at a time: the support for
+       multiple arguments is implemented at the preprocessor level.
+
+       You can declare the same variable as `EXTERN' more than once: NASM
+       will quietly ignore the second and later redeclarations. You can't
+       declare a variable as `EXTERN' as well as something else, though.
+
+   5.5 `GLOBAL': Exporting Symbols to Other Modules
+
+       `GLOBAL' is the other end of `EXTERN': if one module declares a
+       symbol as `EXTERN' and refers to it, then in order to prevent linker
+       errors, some other module must actually _define_ the symbol and
+       declare it as `GLOBAL'. Some assemblers use the name `PUBLIC' for
+       this purpose.
+
+       The `GLOBAL' directive applying to a symbol must appear _before_ the
+       definition of the symbol.
+
+       `GLOBAL' uses the same syntax as `EXTERN', except that it must refer
+       to symbols which _are_ defined in the same module as the `GLOBAL'
+       directive. For example:
+
+                 global _main 
+       _main:    ; some code
+
+       `GLOBAL', like `EXTERN', allows object formats to define private
+       extensions by means of a colon. The `elf' object format, for
+       example, lets you specify whether global data items are functions or
+       data:
+
+                 global hashlookup:function, hashtable:data
+
+       Like `EXTERN', the primitive form of `GLOBAL' differs from the user-
+       level form only in that it can take only one argument at a time.
+
+   5.6 `COMMON': Defining Common Data Areas
+
+       The `COMMON' directive is used to declare _common variables_. A
+       common variable is much like a global variable declared in the
+       uninitialised data section, so that
+
+                 common intvar 4
+
+       is similar in function to
+
+                 global intvar 
+                 section .bss 
+       intvar    resd 1
+
+       The difference is that if more than one module defines the same
+       common variable, then at link time those variables will be _merged_,
+       and references to `intvar' in all modules will point at the same
+       piece of memory.
+
+       Like `GLOBAL' and `EXTERN', `COMMON' supports object-format specific
+       extensions. For example, the `obj' format allows common variables to
+       be NEAR or FAR, and the `elf' format allows you to specify the
+       alignment requirements of a common variable:
+
+                 common commvar 4:near  ; works in OBJ 
+                 common intarray 100:4  ; works in ELF: 4 byte aligned
+
+       Once again, like `EXTERN' and `GLOBAL', the primitive form of
+       `COMMON' differs from the user-level form only in that it can take
+       only one argument at a time.
+
+Chapter 6: Output Formats
+-------------------------
+
+       NASM is a portable assembler, designed to be able to compile on any
+       ANSI C-supporting platform and produce output to run on a variety of
+       Intel x86 operating systems. For this reason, it has a large number
+       of available output formats, selected using the `-f' option on the
+       NASM command line. Each of these formats, along with its extensions
+       to the base NASM syntax, is detailed in this chapter.
+
+       As stated in section 2.1.1, NASM chooses a default name for your
+       output file based on the input file name and the chosen output
+       format. This will be generated by removing the extension (`.asm',
+       `.s', or whatever you like to use) from the input file name, and
+       substituting an extension defined by the output format. The
+       extensions are given with each format below.
+
+   6.1 `bin': Flat-Form Binary Output
+
+       The `bin' format does not produce object files: it generates nothing
+       in the output file except the code you wrote. Such `pure binary'
+       files are used by MS-DOS: `.COM' executables and `.SYS' device
+       drivers are pure binary files. Pure binary output is also useful for
+       operating-system and boot loader development.
+
+       `bin' supports the three standardised section names `.text', `.data'
+       and `.bss' only. The file NASM outputs will contain the contents of
+       the `.text' section first, followed by the contents of the `.data'
+       section, aligned on a four-byte boundary. The `.bss' section is not
+       stored in the output file at all, but is assumed to appear directly
+       after the end of the `.data' section, again aligned on a four-byte
+       boundary.
+
+       If you specify no explicit `SECTION' directive, the code you write
+       will be directed by default into the `.text' section.
+
+       Using the `bin' format puts NASM by default into 16-bit mode (see
+       section 5.1). In order to use `bin' to write 32-bit code such as an
+       OS kernel, you need to explicitly issue the `BITS 32' directive.
+
+       `bin' has no default output file name extension: instead, it leaves
+       your file name as it is once the original extension has been
+       removed. Thus, the default is for NASM to assemble `binprog.asm'
+       into a binary file called `binprog'.
+
+ 6.1.1 `ORG': Binary File Program Origin
+
+       The `bin' format provides an additional directive to the list given
+       in chapter 5: `ORG'. The function of the `ORG' directive is to
+       specify the origin address which NASM will assume the program begins
+       at when it is loaded into memory.
+
+       For example, the following code will generate the longword
+       `0x00000104':
+
+                 org 0x100 
+                 dd label 
+       label:
+
+       Unlike the `ORG' directive provided by MASM-compatible assemblers,
+       which allows you to jump around in the object file and overwrite
+       code you have already generated, NASM's `ORG' does exactly what the
+       directive says: _origin_. Its sole function is to specify one offset
+       which is added to all internal address references within the file;
+       it does not permit any of the trickery that MASM's version does. See
+       section 10.1.3 for further comments.
+
+ 6.1.2 `bin' Extensions to the `SECTION' Directive
+
+       The `bin' output format extends the `SECTION' (or `SEGMENT')
+       directive to allow you to specify the alignment requirements of
+       segments. This is done by appending the `ALIGN' qualifier to the end
+       of the section-definition line. For example,
+
+                 section .data align=16
+
+       switches to the section `.data' and also specifies that it must be
+       aligned on a 16-byte boundary.
+
+       The parameter to `ALIGN' specifies how many low bits of the section
+       start address must be forced to zero. The alignment value given may
+       be any power of two.
+
+   6.2 `obj': Microsoft OMF Object Files
+
+       The `obj' file format (NASM calls it `obj' rather than `omf' for
+       historical reasons) is the one produced by MASM and TASM, which is
+       typically fed to 16-bit DOS linkers to produce `.EXE' files. It is
+       also the format used by OS/2.
+
+       `obj' provides a default output file-name extension of `.obj'.
+
+       `obj' is not exclusively a 16-bit format, though: NASM has full
+       support for the 32-bit extensions to the format. In particular, 32-
+       bit `obj' format files are used by Borland's Win32 compilers,
+       instead of using Microsoft's newer `win32' object file format.
+
+       The `obj' format does not define any special segment names: you can
+       call your segments anything you like. Typical names for segments in
+       `obj' format files are `CODE', `DATA' and `BSS'.
+
+       If your source file contains code before specifying an explicit
+       `SEGMENT' directive, then NASM will invent its own segment called
+       `__NASMDEFSEG' for you.
+
+       When you define a segment in an `obj' file, NASM defines the segment
+       name as a symbol as well, so that you can access the segment address
+       of the segment. So, for example:
+
+                 segment data 
+       dvar:     dw 1234 
+                 segment code 
+       function: mov ax,data            ; get segment address of data 
+                 mov ds,ax              ; and move it into DS 
+                 inc word [dvar]        ; now this reference will work 
+                 ret
+
+       The `obj' format also enables the use of the `SEG' and `WRT'
+       operators, so that you can write code which does things like
+
+                 extern foo 
+                 mov ax,seg foo         ; get preferred segment of foo 
+                 mov ds,ax 
+                 mov ax,data            ; a different segment 
+                 mov es,ax 
+                 mov ax,[ds:foo]        ; this accesses `foo' 
+                 mov [es:foo wrt data],bx  ; so does this
+
+ 6.2.1 `obj' Extensions to the `SEGMENT' Directive
+
+       The `obj' output format extends the `SEGMENT' (or `SECTION')
+       directive to allow you to specify various properties of the segment
+       you are defining. This is done by appending extra qualifiers to the
+       end of the segment-definition line. For example,
+
+                 segment code private align=16
+
+       defines the segment `code', but also declares it to be a private
+       segment, and requires that the portion of it described in this code
+       module must be aligned on a 16-byte boundary.
+
+       The available qualifiers are:
+
+       (*) `PRIVATE', `PUBLIC', `COMMON' and `STACK' specify the
+           combination characteristics of the segment. `PRIVATE' segments
+           do not get combined with any others by the linker; `PUBLIC' and
+           `STACK' segments get concatenated together at link time; and
+           `COMMON' segments all get overlaid on top of each other rather
+           than stuck end-to-end.
+
+       (*) `ALIGN' is used, as shown above, to specify how many low bits of
+           the segment start address must be forced to zero. The alignment
+           value given may be any power of two from 1 to 4096; in reality,
+           the only values supported are 1, 2, 4, 16, 256 and 4096, so if 8
+           is specified it will be rounded up to 16, and 32, 64 and 128
+           will all be rounded up to 256, and so on. Note that alignment to
+           4096-byte boundaries is a PharLap extension to the format and
+           may not be supported by all linkers.
+
+       (*) `CLASS' can be used to specify the segment class; this feature
+           indicates to the linker that segments of the same class should
+           be placed near each other in the output file. The class name can
+           be any word, e.g. `CLASS=CODE'.
+
+       (*) `OVERLAY', like `CLASS', is specified with an arbitrary word as
+           an argument, and provides overlay information to an overlay-
+           capable linker.
+
+       (*) Segments can be declared as `USE16' or `USE32', which has the
+           effect of recording the choice in the object file and also
+           ensuring that NASM's default assembly mode when assembling in
+           that segment is 16-bit or 32-bit respectively.
+
+       (*) When writing OS/2 object files, you should declare 32-bit
+           segments as `FLAT', which causes the default segment base for
+           anything in the segment to be the special group `FLAT', and also
+           defines the group if it is not already defined.
+
+       (*) The `obj' file format also allows segments to be declared as
+           having a pre-defined absolute segment address, although no
+           linkers are currently known to make sensible use of this
+           feature; nevertheless, NASM allows you to declare a segment such
+           as `SEGMENT SCREEN ABSOLUTE=0xB800' if you need to. The
+           `ABSOLUTE' and `ALIGN' keywords are mutually exclusive.
+
+       NASM's default segment attributes are `PUBLIC', `ALIGN=1', no class,
+       no overlay, and `USE16'.
+
+ 6.2.2 `GROUP': Defining Groups of Segments
+
+       The `obj' format also allows segments to be grouped, so that a
+       single segment register can be used to refer to all the segments in
+       a group. NASM therefore supplies the `GROUP' directive, whereby you
+       can code
+
+                 segment data 
+                 ; some data 
+                 segment bss 
+                 ; some uninitialised data 
+                 group dgroup data bss
+
+       which will define a group called `dgroup' to contain the segments
+       `data' and `bss'. Like `SEGMENT', `GROUP' causes the group name to
+       be defined as a symbol, so that you can refer to a variable `var' in
+       the `data' segment as `var wrt data' or as `var wrt dgroup',
+       depending on which segment value is currently in your segment
+       register.
+
+       If you just refer to `var', however, and `var' is declared in a
+       segment which is part of a group, then NASM will default to giving
+       you the offset of `var' from the beginning of the _group_, not the
+       _segment_. Therefore `SEG var', also, will return the group base
+       rather than the segment base.
+
+       NASM will allow a segment to be part of more than one group, but
+       will generate a warning if you do this. Variables declared in a
+       segment which is part of more than one group will default to being
+       relative to the first group that was defined to contain the segment.
+
+       A group does not have to contain any segments; you can still make
+       `WRT' references to a group which does not contain the variable you
+       are referring to. OS/2, for example, defines the special group
+       `FLAT' with no segments in it.
+
+ 6.2.3 `UPPERCASE': Disabling Case Sensitivity in Output
+
+       Although NASM itself is case sensitive, some OMF linkers are not;
+       therefore it can be useful for NASM to output single-case object
+       files. The `UPPERCASE' format-specific directive causes all segment,
+       group and symbol names that are written to the object file to be
+       forced to upper case just before being written. Within a source
+       file, NASM is still case-sensitive; but the object file can be
+       written entirely in upper case if desired.
+
+       `UPPERCASE' is used alone on a line; it requires no parameters.
+
+ 6.2.4 `IMPORT': Importing DLL Symbols
+
+       The `IMPORT' format-specific directive defines a symbol to be
+       imported from a DLL, for use if you are writing a DLL's import
+       library in NASM. You still need to declare the symbol as `EXTERN' as
+       well as using the `IMPORT' directive.
+
+       The `IMPORT' directive takes two required parameters, separated by
+       white space, which are (respectively) the name of the symbol you
+       wish to import and the name of the library you wish to import it
+       from. For example:
+
+                 import WSAStartup wsock32.dll
+
+       A third optional parameter gives the name by which the symbol is
+       known in the library you are importing it from, in case this is not
+       the same as the name you wish the symbol to be known by to your code
+       once you have imported it. For example:
+
+                 import asyncsel wsock32.dll WSAAsyncSelect
+
+ 6.2.5 `EXPORT': Exporting DLL Symbols
+
+       The `EXPORT' format-specific directive defines a global symbol to be
+       exported as a DLL symbol, for use if you are writing a DLL in NASM.
+       You still need to declare the symbol as `GLOBAL' as well as using
+       the `EXPORT' directive.
+
+       `EXPORT' takes one required parameter, which is the name of the
+       symbol you wish to export, as it was defined in your source file. An
+       optional second parameter (separated by white space from the first)
+       gives the _external_ name of the symbol: the name by which you wish
+       the symbol to be known to programs using the DLL. If this name is
+       the same as the internal name, you may leave the second parameter
+       off.
+
+       Further parameters can be given to define attributes of the exported
+       symbol. These parameters, like the second, are separated by white
+       space. If further parameters are given, the external name must also
+       be specified, even if it is the same as the internal name. The
+       available attributes are:
+
+       (*) `resident' indicates that the exported name is to be kept
+           resident by the system loader. This is an optimisation for
+           frequently used symbols imported by name.
+
+       (*) `nodata' indicates that the exported symbol is a function which
+           does not make use of any initialised data.
+
+       (*) `parm=NNN', where `NNN' is an integer, sets the number of
+           parameter words for the case in which the symbol is a call gate
+           between 32-bit and 16-bit segments.
+
+       (*) An attribute which is just a number indicates that the symbol
+           should be exported with an identifying number (ordinal), and
+           gives the desired number.
+
+       For example:
+
+                 export myfunc 
+                 export myfunc TheRealMoreFormalLookingFunctionName 
+                 export myfunc myfunc 1234  ; export by ordinal 
+                 export myfunc myfunc resident parm=23 nodata
+
+ 6.2.6 `..start': Defining the Program Entry Point
+
+       OMF linkers require exactly one of the object files being linked to
+       define the program entry point, where execution will begin when the
+       program is run. If the object file that defines the entry point is
+       assembled using NASM, you specify the entry point by declaring the
+       special symbol `..start' at the point where you wish execution to
+       begin.
+
+ 6.2.7 `obj' Extensions to the `EXTERN' Directive
+
+       If you declare an external symbol with the directive
+
+                 extern foo
+
+       then references such as `mov ax,foo' will give you the offset of
+       `foo' from its preferred segment base (as specified in whichever
+       module `foo' is actually defined in). So to access the contents of
+       `foo' you will usually need to do something like
+
+                 mov ax,seg foo         ; get preferred segment base 
+                 mov es,ax              ; move it into ES 
+                 mov ax,[es:foo]        ; and use offset `foo' from it
+
+       This is a little unwieldy, particularly if you know that an external
+       is going to be accessible from a given segment or group, say
+       `dgroup'. So if `DS' already contained `dgroup', you could simply
+       code
+
+                 mov ax,[foo wrt dgroup]
+
+       However, having to type this every time you want to access `foo' can
+       be a pain; so NASM allows you to declare `foo' in the alternative
+       form
+
+                 extern foo:wrt dgroup
+
+       This form causes NASM to pretend that the preferred segment base of
+       `foo' is in fact `dgroup'; so the expression `seg foo' will now
+       return `dgroup', and the expression `foo' is equivalent to
+       `foo wrt dgroup'.
+
+       This default-`WRT' mechanism can be used to make externals appear to
+       be relative to any group or segment in your program. It can also be
+       applied to common variables: see section 6.2.8.
+
+ 6.2.8 `obj' Extensions to the `COMMON' Directive
+
+       The `obj' format allows common variables to be either near or far;
+       NASM allows you to specify which your variables should be by the use
+       of the syntax
+
+                 common nearvar 2:near  ; `nearvar' is a near common 
+                 common farvar 10:far   ; and `farvar' is far
+
+       Far common variables may be greater in size than 64Kb, and so the
+       OMF specification says that they are declared as a number of
+       _elements_ of a given size. So a 10-byte far common variable could
+       be declared as ten one-byte elements, five two-byte elements, two
+       five-byte elements or one ten-byte element.
+
+       Some OMF linkers require the element size, as well as the variable
+       size, to match when resolving common variables declared in more than
+       one module. Therefore NASM must allow you to specify the element
+       size on your far common variables. This is done by the following
+       syntax:
+
+                 common c_5by2 10:far 5 ; two five-byte elements 
+                 common c_2by5 10:far 2 ; five two-byte elements
+
+       If no element size is specified, the default is 1. Also, the `FAR'
+       keyword is not required when an element size is specified, since
+       only far commons may have element sizes at all. So the above
+       declarations could equivalently be
+
+                 common c_5by2 10:5     ; two five-byte elements 
+                 common c_2by5 10:2     ; five two-byte elements
+
+       In addition to these extensions, the `COMMON' directive in `obj'
+       also supports default-`WRT' specification like `EXTERN' does
+       (explained in section 6.2.7). So you can also declare things like
+
+                 common foo 10:wrt dgroup 
+                 common bar 16:far 2:wrt data 
+                 common baz 24:wrt data:6
+
+   6.3 `win32': Microsoft Win32 Object Files
+
+       The `win32' output format generates Microsoft Win32 object files,
+       suitable for passing to Microsoft linkers such as Visual C++. Note
+       that Borland Win32 compilers do not use this format, but use `obj'
+       instead (see section 6.2).
+
+       `win32' provides a default output file-name extension of `.obj'.
+
+       Note that although Microsoft say that Win32 object files follow the
+       COFF (Common Object File Format) standard, the object files produced
+       by Microsoft Win32 compilers are not compatible with COFF linkers
+       such as DJGPP's, and vice versa. This is due to a difference of
+       opinion over the precise semantics of PC-relative relocations. To
+       produce COFF files suitable for DJGPP, use NASM's `coff' output
+       format; conversely, the `coff' format does not produce object files
+       that Win32 linkers can generate correct output from.
+
+ 6.3.1 `win32' Extensions to the `SECTION' Directive
+
+       Like the `obj' format, `win32' allows you to specify additional
+       information on the `SECTION' directive line, to control the type and
+       properties of sections you declare. Section types and properties are
+       generated automatically by NASM for the standard section names
+       `.text', `.data' and `.bss', but may still be overridden by these
+       qualifiers.
+
+       The available qualifiers are:
+
+       (*) `code', or equivalently `text', defines the section to be a code
+           section. This marks the section as readable and executable, but
+           not writable, and also indicates to the linker that the type of
+           the section is code.
+
+       (*) `data' and `bss' define the section to be a data section,
+           analogously to `code'. Data sections are marked as readable and
+           writable, but not executable. `data' declares an initialised
+           data section, whereas `bss' declares an uninitialised data
+           section.
+
+       (*) `info' defines the section to be an informational section, which
+           is not included in the executable file by the linker, but may
+           (for example) pass information _to_ the linker. For example,
+           declaring an `info'-type section called `.drectve' causes the
+           linker to interpret the contents of the section as command-line
+           options.
+
+       (*) `align=', used with a trailing number as in `obj', gives the
+           alignment requirements of the section. The maximum you may
+           specify is 64: the Win32 object file format contains no means to
+           request a greater section alignment than this. If alignment is
+           not explicitly specified, the defaults are 16-byte alignment for
+           code sections, and 4-byte alignment for data (and BSS) sections.
+           Informational sections get a default alignment of 1 byte (no
+           alignment), though the value does not matter.
+
+       The defaults assumed by NASM if you do not specify the above
+       qualifiers are:
+
+                 section .text code align=16 
+                 section .data data align=4 
+                 section .bss bss align=4
+
+       Any other section name is treated by default like `.text'.
+
+   6.4 `coff': Common Object File Format
+
+       The `coff' output type produces COFF object files suitable for
+       linking with the DJGPP linker.
+
+       `coff' provides a default output file-name extension of `.o'.
+
+       The `coff' format supports the same extensions to the `SECTION'
+       directive as `win32' does, except that the `align' qualifier and the
+       `info' section type are not supported.
+
+   6.5 `elf': Linux ELFObject Files
+
+       The `elf' output format generates ELF32 (Executable and Linkable
+       Format) object files, as used by Linux. `elf' provides a default
+       output file-name extension of `.o'.
+
+ 6.5.1 `elf' Extensions to the `SECTION' Directive
+
+       Like the `obj' format, `elf' allows you to specify additional
+       information on the `SECTION' directive line, to control the type and
+       properties of sections you declare. Section types and properties are
+       generated automatically by NASM for the standard section names
+       `.text', `.data' and `.bss', but may still be overridden by these
+       qualifiers.
+
+       The available qualifiers are:
+
+       (*) `alloc' defines the section to be one which is loaded into
+           memory when the program is run. `noalloc' defines it to be one
+           which is not, such as an informational or comment section.
+
+       (*) `exec' defines the section to be one which should have execute
+           permission when the program is run. `noexec' defines it as one
+           which should not.
+
+       (*) `write' defines the section to be one which should be writable
+           when the program is run. `nowrite' defines it as one which
+           should not.
+
+       (*) `progbits' defines the section to be one with explicit contents
+           stored in the object file: an ordinary code or data section, for
+           example, `nobits' defines the section to be one with no explicit
+           contents given, such as a BSS section.
+
+       (*) `align=', used with a trailing number as in `obj', gives the
+           alignment requirements of the section.
+
+       The defaults assumed by NASM if you do not specify the above
+       qualifiers are:
+
+                 section .text progbits alloc   exec nowrite align=16 
+                 section .data progbits alloc noexec   write align=4 
+                 section .bss    nobits alloc noexec   write align=4 
+                 section other progbits alloc noexec nowrite align=1
+
+       (Any section name other than `.text', `.data' and `.bss' is treated
+       by default like `other' in the above code.)
+
+ 6.5.2 Position-Independent Code: `elf' Special Symbols and `WRT'
+
+       The ELF specification contains enough features to allow position-
+       independent code (PIC) to be written, which makes ELF shared
+       libraries very flexible. However, it also means NASM has to be able
+       to generate a variety of strange relocation types in ELF object
+       files, if it is to be an assembler which can write PIC.
+
+       Since ELF does not support segment-base references, the `WRT'
+       operator is not used for its normal purpose; therefore NASM's `elf'
+       output format makes use of `WRT' for a different purpose, namely the
+       PIC-specific relocation types.
+
+       `elf' defines five special symbols which you can use as the right-
+       hand side of the `WRT' operator to obtain PIC relocation types. They
+       are `..gotpc', `..gotoff', `..got', `..plt' and `..sym'. Their
+       functions are summarised here:
+
+       (*) Referring to the symbol marking the global offset table base
+           using `wrt ..gotpc' will end up giving the distance from the
+           beginning of the current section to the global offset table.
+           (`_GLOBAL_OFFSET_TABLE_' is the standard symbol name used to
+           refer to the GOT.) So you would then need to add `$$' to the
+           result to get the real address of the GOT.
+
+       (*) Referring to a location in one of your own sections using
+           `wrt ..gotoff' will give the distance from the beginning of the
+           GOT to the specified location, so that adding on the address of
+           the GOT would give the real address of the location you wanted.
+
+       (*) Referring to an external or global symbol using `wrt ..got'
+           causes the linker to build an entry _in_ the GOT containing the
+           address of the symbol, and the reference gives the distance from
+           the beginning of the GOT to the entry; so you can add on the
+           address of the GOT, load from the resulting address, and end up
+           with the address of the symbol.
+
+       (*) Referring to a procedure name using `wrt ..plt' causes the
+           linker to build a procedure linkage table entry for the symbol,
+           and the reference gives the address of the PLT entry. You can
+           only use this in contexts which would generate a PC-relative
+           relocation normally (i.e. as the destination for `CALL' or
+           `JMP'), since ELF contains no relocation type to refer to PLT
+           entries absolutely.
+
+       (*) Referring to a symbol name using `wrt ..sym' causes NASM to
+           write an ordinary relocation, but instead of making the
+           relocation relative to the start of the section and then adding
+           on the offset to the symbol, it will write a relocation record
+           aimed directly at the symbol in question. The distinction is a
+           necessary one due to a peculiarity of the dynamic linker.
+
+       A fuller explanation of how to use these relocation types to write
+       shared libraries entirely in NASM is given in section 8.2.
+
+ 6.5.3 `elf' Extensions to the `GLOBAL' Directive
+
+       ELF object files can contain more information about a global symbol
+       than just its address: they can contain the size of the symbol and
+       its type as well. These are not merely debugger conveniences, but
+       are actually necessary when the program being written is a shared
+       library. NASM therefore supports some extensions to the `GLOBAL'
+       directive, allowing you to specify these features.
+
+       You can specify whether a global variable is a function or a data
+       object by suffixing the name with a colon and the word `function' or
+       `data'. (`object' is a synonym for `data'.) For example:
+
+                 global hashlookup:function, hashtable:data
+
+       exports the global symbol `hashlookup' as a function and `hashtable'
+       as a data object.
+
+       You can also specify the size of the data associated with the
+       symbol, as a numeric expression (which may involve labels, and even
+       forward references) after the type specifier. Like this:
+
+                 global hashtable:data (hashtable.end - hashtable) 
+       hashtable: 
+                 db this,that,theother  ; some data here 
+       .end:
+
+       This makes NASM automatically calculate the length of the table and
+       place that information into the ELF symbol table.
+
+       Declaring the type and size of global symbols is necessary when
+       writing shared library code. For more information, see section
+       8.2.4.
+
+ 6.5.4 `elf' Extensions to the `COMMON' Directive
+
+       ELF also allows you to specify alignment requirements on common
+       variables. This is done by putting a number (which must be a power
+       of two) after the name and size of the common variable, separated
+       (as usual) by a colon. For example, an array of doublewords would
+       benefit from 4-byte alignment:
+
+                 common dwordarray 128:4
+
+       This declares the total size of the array to be 128 bytes, and
+       requires that it be aligned on a 4-byte boundary.
+
+   6.6 `aout': Linux `a.out' Object Files
+
+       The `aout' format generates `a.out' object files, in the form used
+       by early Linux systems. (These differ from other `a.out' object
+       files in that the magic number in the first four bytes of the file
+       is different. Also, some implementations of `a.out', for example
+       NetBSD's, support position-independent code, which Linux's
+       implementation doesn't.)
+
+       `a.out' provides a default output file-name extension of `.o'.
+
+       `a.out' is a very simple object format. It supports no special
+       directives, no special symbols, no use of `SEG' or `WRT', and no
+       extensions to any standard directives. It supports only the three
+       standard section names `.text', `.data' and `.bss'.
+
+   6.7 `aoutb': NetBSD/FreeBSD/OpenBSD `a.out' Object Files
+
+       The `aoutb' format generates `a.out' object files, in the form used
+       by the various free BSD Unix clones, NetBSD, FreeBSD and OpenBSD.
+       For simple object files, this object format is exactly the same as
+       `aout' except for the magic number in the first four bytes of the
+       file. However, the `aoutb' format supports position-independent code
+       in the same way as the `elf' format, so you can use it to write BSD
+       shared libraries.
+
+       `aoutb' provides a default output file-name extension of `.o'.
+
+       `aoutb' supports no special directives, no special symbols, and only
+       the three standard section names `.text', `.data' and `.bss'.
+       However, it also supports the same use of `WRT' as `elf' does, to
+       provide position-independent code relocation types. See section
+       6.5.2 for full documentation of this feature.
+
+       `aoutb' also supports the same extensions to the `GLOBAL' directive
+       as `elf' does: see section 6.5.3 for documentation of this.
+
+   6.8 `as86': Linux `as86' Object Files
+
+       The Linux 16-bit assembler `as86' has its own non-standard object
+       file format. Although its companion linker `ld86' produces something
+       close to ordinary `a.out' binaries as output, the object file format
+       used to communicate between `as86' and `ld86' is not itself `a.out'.
+
+       NASM supports this format, just in case it is useful, as `as86'.
+       `as86' provides a default output file-name extension of `.o'.
+
+       `as86' is a very simple object format (from the NASM user's point of
+       view). It supports no special directives, no special symbols, no use
+       of `SEG' or `WRT', and no extensions to any standard directives. It
+       supports only the three standard section names `.text', `.data' and
+       `.bss'.
+
+   6.9 `rdf': Relocatable Dynamic Object File Format
+
+       The `rdf' output format produces RDOFF object files. RDOFF
+       (Relocatable Dynamic Object File Format) is a home-grown object-file
+       format, designed alongside NASM itself and reflecting in its file
+       format the internal structure of the assembler.
+
+       RDOFF is not used by any well-known operating systems. Those writing
+       their own systems, however, may well wish to use RDOFF as their
+       object format, on the grounds that it is designed primarily for
+       simplicity and contains very little file-header bureaucracy.
+
+       The Unix NASM archive, and the DOS archive which includes sources,
+       both contain an `rdoff' subdirectory holding a set of RDOFF
+       utilities: an RDF linker, an RDF static-library manager, an RDF file
+       dump utility, and a program which will load and execute an RDF
+       executable under Linux.
+
+       `rdf' supports only the standard section names `.text', `.data' and
+       `.bss'.
+
+ 6.9.1 Requiring a Library: The `LIBRARY' Directive
+
+       RDOFF contains a mechanism for an object file to demand a given
+       library to be linked to the module, either at load time or run time.
+       This is done by the `LIBRARY' directive, which takes one argument
+       which is the name of the module:
+
+                 library mylib.rdl
+
+  6.10 `dbg': Debugging Format
+
+       The `dbg' output format is not built into NASM in the default
+       configuration. If you are building your own NASM executable from the
+       sources, you can define `OF_DBG' in `outform.h' or on the compiler
+       command line, and obtain the `dbg' output format.
+
+       The `dbg' format does not output an object file as such; instead, it
+       outputs a text file which contains a complete list of all the
+       transactions between the main body of NASM and the output-format
+       back end module. It is primarily intended to aid people who want to
+       write their own output drivers, so that they can get a clearer idea
+       of the various requests the main program makes of the output driver,
+       and in what order they happen.
+
+       For simple files, one can easily use the `dbg' format like this:
+
+       nasm -f dbg filename.asm
+
+       which will generate a diagnostic file called `filename.dbg'.
+       However, this will not work well on files which were designed for a
+       different object format, because each object format defines its own
+       macros (usually user-level forms of directives), and those macros
+       will not be defined in the `dbg' format. Therefore it can be useful
+       to run NASM twice, in order to do the preprocessing with the native
+       object format selected:
+
+       nasm -e -f rdf -o rdfprog.i rdfprog.asm 
+       nasm -a -f dbg rdfprog.i
+
+       This preprocesses `rdfprog.asm' into `rdfprog.i', keeping the `rdf'
+       object format selected in order to make sure RDF special directives
+       are converted into primitive form correctly. Then the preprocessed
+       source is fed through the `dbg' format to generate the final
+       diagnostic output.
+
+       This workaround will still typically not work for programs intended
+       for `obj' format, because the `obj' `SEGMENT' and `GROUP' directives
+       have side effects of defining the segment and group names as
+       symbols; `dbg' will not do this, so the program will not assemble.
+       You will have to work around that by defining the symbols yourself
+       (using `EXTERN', for example) if you really need to get a `dbg'
+       trace of an `obj'-specific source file.
+
+       `dbg' accepts any section name and any directives at all, and logs
+       them all to its output file.
+
+Chapter 7: Writing 16-bit Code (DOS, Windows 3/3.1)
+---------------------------------------------------
+
+       This chapter attempts to cover some of the common issues encountered
+       when writing 16-bit code to run under MS-DOS or Windows 3.x. It
+       covers how to link programs to produce `.EXE' or `.COM' files, how
+       to write `.SYS' device drivers, and how to interface assembly
+       language code with 16-bit C compilers and with Borland Pascal.
+
+   7.1 Producing `.EXE' Files
+
+       Any large program written under DOS needs to be built as a `.EXE'
+       file: only `.EXE' files have the necessary internal structure
+       required to span more than one 64K segment. Windows programs, also,
+       have to be built as `.EXE' files, since Windows does not support the
+       `.COM' format.
+
+       In general, you generate `.EXE' files by using the `obj' output
+       format to produce one or more `.OBJ' files, and then linking them
+       together using a linker. However, NASM also supports the direct
+       generation of simple DOS `.EXE' files using the `bin' output format
+       (by using `DB' and `DW' to construct the `.EXE' file header), and a
+       macro package is supplied to do this. Thanks to Yann Guidon for
+       contributing the code for this.
+
+       NASM may also support `.EXE' natively as another output format in
+       future releases.
+
+ 7.1.1 Using the `obj' Format To Generate `.EXE' Files
+
+       This section describes the usual method of generating `.EXE' files
+       by linking `.OBJ' files together.
+
+       Most 16-bit programming language packages come with a suitable
+       linker; if you have none of these, there is a free linker called
+       VAL, available in `LZH' archive format from `x2ftp.oulu.fi'. An LZH
+       archiver can be found at `ftp.simtel.net'. There is another `free'
+       linker (though this one doesn't come with sources) called FREELINK,
+       available from `www.pcorner.com'. A third, `djlink', written by DJ
+       Delorie, is available at `www.delorie.com'.
+
+       When linking several `.OBJ' files into a `.EXE' file, you should
+       ensure that exactly one of them has a start point defined (using the
+       `..start' special symbol defined by the `obj' format: see section
+       6.2.6). If no module defines a start point, the linker will not know
+       what value to give the entry-point field in the output file header;
+       if more than one defines a start point, the linker will not know
+       _which_ value to use.
+
+       An example of a NASM source file which can be assembled to a `.OBJ'
+       file and linked on its own to a `.EXE' is given here. It
+       demonstrates the basic principles of defining a stack, initialising
+       the segment registers, and declaring a start point. This file is
+       also provided in the `test' subdirectory of the NASM archives, under
+       the name `objexe.asm'.
+
+                 segment code 
+        
+       ..start:  mov ax,data 
+                 mov ds,ax 
+                 mov ax,stack 
+                 mov ss,ax 
+                 mov sp,stacktop
+
+       This initial piece of code sets up `DS' to point to the data
+       segment, and initialises `SS' and `SP' to point to the top of the
+       provided stack. Notice that interrupts are implicitly disabled for
+       one instruction after a move into `SS', precisely for this
+       situation, so that there's no chance of an interrupt occurring
+       between the loads of `SS' and `SP' and not having a stack to execute
+       on.
+
+       Note also that the special symbol `..start' is defined at the
+       beginning of this code, which means that will be the entry point
+       into the resulting executable file.
+
+                 mov dx,hello 
+                 mov ah,9 
+                 int 0x21
+
+       The above is the main program: load `DS:DX' with a pointer to the
+       greeting message (`hello' is implicitly relative to the segment
+       `data', which was loaded into `DS' in the setup code, so the full
+       pointer is valid), and call the DOS print-string function.
+
+                 mov ax,0x4c00 
+                 int 0x21
+
+       This terminates the program using another DOS system call.
+
+                 segment data 
+       hello:    db 'hello, world', 13, 10, '$'
+
+       The data segment contains the string we want to display.
+
+                 segment stack stack 
+                 resb 64 
+       stacktop:
+
+       The above code declares a stack segment containing 64 bytes of
+       uninitialised stack space, and points `stacktop' at the top of it.
+       The directive `segment stack stack' defines a segment _called_
+       `stack', and also of _type_ `STACK'. The latter is not necessary to
+       the correct running of the program, but linkers are likely to issue
+       warnings or errors if your program has no segment of type `STACK'.
+
+       The above file, when assembled into a `.OBJ' file, will link on its
+       own to a valid `.EXE' file, which when run will print `hello, world'
+       and then exit.
+
+ 7.1.2 Using the `bin' Format To Generate `.EXE' Files
+
+       The `.EXE' file format is simple enough that it's possible to build
+       a `.EXE' file by writing a pure-binary program and sticking a 32-
+       byte header on the front. This header is simple enough that it can
+       be generated using `DB' and `DW' commands by NASM itself, so that
+       you can use the `bin' output format to directly generate `.EXE'
+       files.
+
+       Included in the NASM archives, in the `misc' subdirectory, is a file
+       `exebin.mac' of macros. It defines three macros: `EXE_begin',
+       `EXE_stack' and `EXE_end'.
+
+       To produce a `.EXE' file using this method, you should start by
+       using `%include' to load the `exebin.mac' macro package into your
+       source file. You should then issue the `EXE_begin' macro call (which
+       takes no arguments) to generate the file header data. Then write
+       code as normal for the `bin' format - you can use all three standard
+       sections `.text', `.data' and `.bss'. At the end of the file you
+       should call the `EXE_end' macro (again, no arguments), which defines
+       some symbols to mark section sizes, and these symbols are referred
+       to in the header code generated by `EXE_begin'.
+
+       In this model, the code you end up writing starts at `0x100', just
+       like a `.COM' file - in fact, if you strip off the 32-byte header
+       from the resulting `.EXE' file, you will have a valid `.COM'
+       program. All the segment bases are the same, so you are limited to a
+       64K program, again just like a `.COM' file. Note that an `ORG'
+       directive is issued by the `EXE_begin' macro, so you should not
+       explicitly issue one of your own.
+
+       You can't directly refer to your segment base value, unfortunately,
+       since this would require a relocation in the header, and things
+       would get a lot more complicated. So you should get your segment
+       base by copying it out of `CS' instead.
+
+       On entry to your `.EXE' file, `SS:SP' are already set up to point to
+       the top of a 2Kb stack. You can adjust the default stack size of 2Kb
+       by calling the `EXE_stack' macro. For example, to change the stack
+       size of your program to 64 bytes, you would call `EXE_stack 64'.
+
+       A sample program which generates a `.EXE' file in this way is given
+       in the `test' subdirectory of the NASM archive, as `binexe.asm'.
+
+   7.2 Producing `.COM' Files
+
+       While large DOS programs must be written as `.EXE' files, small ones
+       are often better written as `.COM' files. `.COM' files are pure
+       binary, and therefore most easily produced using the `bin' output
+       format.
+
+ 7.2.1 Using the `bin' Format To Generate `.COM' Files
+
+       `.COM' files expect to be loaded at offset `100h' into their segment
+       (though the segment may change). Execution then begins at `100h',
+       i.e. right at the start of the program. So to write a `.COM'
+       program, you would create a source file looking like
+
+                 org 100h 
+                 section .text 
+       start:    ; put your code here 
+                 section .data 
+                 ; put data items here 
+                 section .bss 
+                 ; put uninitialised data here
+
+       The `bin' format puts the `.text' section first in the file, so you
+       can declare data or BSS items before beginning to write code if you
+       want to and the code will still end up at the front of the file
+       where it belongs.
+
+       The BSS (uninitialised data) section does not take up space in the
+       `.COM' file itself: instead, addresses of BSS items are resolved to
+       point at space beyond the end of the file, on the grounds that this
+       will be free memory when the program is run. Therefore you should
+       not rely on your BSS being initialised to all zeros when you run.
+
+       To assemble the above program, you should use a command line like
+
+       nasm myprog.asm -fbin -o myprog.com
+
+       The `bin' format would produce a file called `myprog' if no explicit
+       output file name were specified, so you have to override it and give
+       the desired file name.
+
+ 7.2.2 Using the `obj' Format To Generate `.COM' Files
+
+       If you are writing a `.COM' program as more than one module, you may
+       wish to assemble several `.OBJ' files and link them together into a
+       `.COM' program. You can do this, provided you have a linker capable
+       of outputting `.COM' files directly (TLINK does this), or
+       alternatively a converter program such as `EXE2BIN' to transform the
+       `.EXE' file output from the linker into a `.COM' file.
+
+       If you do this, you need to take care of several things:
+
+       (*) The first object file containing code should start its code
+           segment with a line like `RESB 100h'. This is to ensure that the
+           code begins at offset `100h' relative to the beginning of the
+           code segment, so that the linker or converter program does not
+           have to adjust address references within the file when
+           generating the `.COM' file. Other assemblers use an `ORG'
+           directive for this purpose, but `ORG' in NASM is a format-
+           specific directive to the `bin' output format, and does not mean
+           the same thing as it does in MASM-compatible assemblers.
+
+       (*) You don't need to define a stack segment.
+
+       (*) All your segments should be in the same group, so that every
+           time your code or data references a symbol offset, all offsets
+           are relative to the same segment base. This is because, when a
+           `.COM' file is loaded, all the segment registers contain the
+           same value.
+
+   7.3 Producing `.SYS' Files
+
+       MS-DOS device drivers - `.SYS' files - are pure binary files,
+       similar to `.COM' files, except that they start at origin zero
+       rather than `100h'. Therefore, if you are writing a device driver
+       using the `bin' format, you do not need the `ORG' directive, since
+       the default origin for `bin' is zero. Similarly, if you are using
+       `obj', you do not need the `RESB 100h' at the start of your code
+       segment.
+
+       `.SYS' files start with a header structure, containing pointers to
+       the various routines inside the driver which do the work. This
+       structure should be defined at the start of the code segment, even
+       though it is not actually code.
+
+       For more information on the format of `.SYS' files, and the data
+       which has to go in the header structure, a list of books is given in
+       the Frequently Asked Questions list for the newsgroup
+       `comp.os.msdos.programmer'.
+
+   7.4 Interfacing to 16-bit C Programs
+
+       This section covers the basics of writing assembly routines that
+       call, or are called from, C programs. To do this, you would
+       typically write an assembly module as a `.OBJ' file, and link it
+       with your C modules to produce a mixed-language program.
+
+ 7.4.1 External Symbol Names
+
+       C compilers have the convention that the names of all global symbols
+       (functions or data) they define are formed by prefixing an
+       underscore to the name as it appears in the C program. So, for
+       example, the function a C programmer thinks of as `printf' appears
+       to an assembly language programmer as `_printf'. This means that in
+       your assembly programs, you can define symbols without a leading
+       underscore, and not have to worry about name clashes with C symbols.
+
+       If you find the underscores inconvenient, you can define macros to
+       replace the `GLOBAL' and `EXTERN' directives as follows:
+
+       %macro cglobal 1 
+                 global _%1 
+       %define %1 _%1 
+       %endmacro
+
+       %macro cextern 1 
+                 extern _%1 
+       %define %1 _%1 
+       %endmacro
+
+       (These forms of the macros only take one argument at a time; a
+       `%rep' construct could solve this.)
+
+       If you then declare an external like this:
+
+                 cextern printf
+
+       then the macro will expand it as
+
+                 extern _printf 
+       %define printf _printf
+
+       Thereafter, you can reference `printf' as if it was a symbol, and
+       the preprocessor will put the leading underscore on where necessary.
+
+       The `cglobal' macro works similarly. You must use `cglobal' before
+       defining the symbol in question, but you would have had to do that
+       anyway if you used `GLOBAL'.
+
+ 7.4.2 Memory Models
+
+       NASM contains no mechanism to support the various C memory models
+       directly; you have to keep track yourself of which one you are
+       writing for. This means you have to keep track of the following
+       things:
+
+       (*) In models using a single code segment (tiny, small and compact),
+           functions are near. This means that function pointers, when
+           stored in data segments or pushed on the stack as function
+           arguments, are 16 bits long and contain only an offset field
+           (the `CS' register never changes its value, and always gives the
+           segment part of the full function address), and that functions
+           are called using ordinary near `CALL' instructions and return
+           using `RETN' (which, in NASM, is synonymous with `RET' anyway).
+           This means both that you should write your own routines to
+           return with `RETN', and that you should call external C routines
+           with near `CALL' instructions.
+
+       (*) In models using more than one code segment (medium, large and
+           huge), functions are far. This means that function pointers are
+           32 bits long (consisting of a 16-bit offset followed by a 16-bit
+           segment), and that functions are called using `CALL FAR' (or
+           `CALL seg:offset') and return using `RETF'. Again, you should
+           therefore write your own routines to return with `RETF' and use
+           `CALL FAR' to call external routines.
+
+       (*) In models using a single data segment (tiny, small and medium),
+           data pointers are 16 bits long, containing only an offset field
+           (the `DS' register doesn't change its value, and always gives
+           the segment part of the full data item address).
+
+       (*) In models using more than one data segment (compact, large and
+           huge), data pointers are 32 bits long, consisting of a 16-bit
+           offset followed by a 16-bit segment. You should still be careful
+           not to modify `DS' in your routines without restoring it
+           afterwards, but `ES' is free for you to use to access the
+           contents of 32-bit data pointers you are passed.
+
+       (*) The huge memory model allows single data items to exceed 64K in
+           size. In all other memory models, you can access the whole of a
+           data item just by doing arithmetic on the offset field of the
+           pointer you are given, whether a segment field is present or
+           not; in huge model, you have to be more careful of your pointer
+           arithmetic.
+
+       (*) In most memory models, there is a _default_ data segment, whose
+           segment address is kept in `DS' throughout the program. This
+           data segment is typically the same segment as the stack, kept in
+           `SS', so that functions' local variables (which are stored on
+           the stack) and global data items can both be accessed easily
+           without changing `DS'. Particularly large data items are
+           typically stored in other segments. However, some memory models
+           (though not the standard ones, usually) allow the assumption
+           that `SS' and `DS' hold the same value to be removed. Be careful
+           about functions' local variables in this latter case.
+
+       In models with a single code segment, the segment is called `_TEXT',
+       so your code segment must also go by this name in order to be linked
+       into the same place as the main code segment. In models with a
+       single data segment, or with a default data segment, it is called
+       `_DATA'.
+
+ 7.4.3 Function Definitions and Function Calls
+
+       The C calling convention in 16-bit programs is as follows. In the
+       following description, the words _caller_ and _callee_ are used to
+       denote the function doing the calling and the function which gets
+       called.
+
+       (*) The caller pushes the function's parameters on the stack, one
+           after another, in reverse order (right to left, so that the
+           first argument specified to the function is pushed last).
+
+       (*) The caller then executes a `CALL' instruction to pass control to
+           the callee. This `CALL' is either near or far depending on the
+           memory model.
+
+       (*) The callee receives control, and typically (although this is not
+           actually necessary, in functions which do not need to access
+           their parameters) starts by saving the value of `SP' in `BP' so
+           as to be able to use `BP' as a base pointer to find its
+           parameters on the stack. However, the caller was probably doing
+           this too, so part of the calling convention states that `BP'
+           must be preserved by any C function. Hence the callee, if it is
+           going to set up `BP' as a _frame pointer_, must push the
+           previous value first.
+
+       (*) The callee may then access its parameters relative to `BP'. The
+           word at `[BP]' holds the previous value of `BP' as it was
+           pushed; the next word, at `[BP+2]', holds the offset part of the
+           return address, pushed implicitly by `CALL'. In a small-model
+           (near) function, the parameters start after that, at `[BP+4]';
+           in a large-model (far) function, the segment part of the return
+           address lives at `[BP+4]', and the parameters begin at `[BP+6]'.
+           The leftmost parameter of the function, since it was pushed
+           last, is accessible at this offset from `BP'; the others follow,
+           at successively greater offsets. Thus, in a function such as
+           `printf' which takes a variable number of parameters, the
+           pushing of the parameters in reverse order means that the
+           function knows where to find its first parameter, which tells it
+           the number and type of the remaining ones.
+
+       (*) The callee may also wish to decrease `SP' further, so as to
+           allocate space on the stack for local variables, which will then
+           be accessible at negative offsets from `BP'.
+
+       (*) The callee, if it wishes to return a value to the caller, should
+           leave the value in `AL', `AX' or `DX:AX' depending on the size
+           of the value. Floating-point results are sometimes (depending on
+           the compiler) returned in `ST0'.
+
+       (*) Once the callee has finished processing, it restores `SP' from
+           `BP' if it had allocated local stack space, then pops the
+           previous value of `BP', and returns via `RETN' or `RETF'
+           depending on memory model.
+
+       (*) When the caller regains control from the callee, the function
+           parameters are still on the stack, so it typically adds an
+           immediate constant to `SP' to remove them (instead of executing
+           a number of slow `POP' instructions). Thus, if a function is
+           accidentally called with the wrong number of parameters due to a
+           prototype mismatch, the stack will still be returned to a
+           sensible state since the caller, which _knows_ how many
+           parameters it pushed, does the removing.
+
+       It is instructive to compare this calling convention with that for
+       Pascal programs (described in section 7.5.1). Pascal has a simpler
+       convention, since no functions have variable numbers of parameters.
+       Therefore the callee knows how many parameters it should have been
+       passed, and is able to deallocate them from the stack itself by
+       passing an immediate argument to the `RET' or `RETF' instruction, so
+       the caller does not have to do it. Also, the parameters are pushed
+       in left-to-right order, not right-to-left, which means that a
+       compiler can give better guarantees about sequence points without
+       performance suffering.
+
+       Thus, you would define a function in C style in the following way.
+       The following example is for small model:
+
+                 global _myfunc 
+       _myfunc:  push bp 
+                 mov bp,sp 
+                 sub sp,0x40            ; 64 bytes of local stack space 
+                 mov bx,[bp+4]          ; first parameter to function 
+                 ; some more code 
+                 mov sp,bp              ; undo "sub sp,0x40" above 
+                 pop bp 
+                 ret
+
+       For a large-model function, you would replace `RET' by `RETF', and
+       look for the first parameter at `[BP+6]' instead of `[BP+4]'. Of
+       course, if one of the parameters is a pointer, then the offsets of
+       _subsequent_ parameters will change depending on the memory model as
+       well: far pointers take up four bytes on the stack when passed as a
+       parameter, whereas near pointers take up two.
+
+       At the other end of the process, to call a C function from your
+       assembly code, you would do something like this:
+
+                 extern _printf 
+                 ; and then, further down... 
+                 push word [myint]      ; one of my integer variables 
+                 push word mystring     ; pointer into my data segment 
+                 call _printf 
+                 add sp,byte 4          ; `byte' saves space 
+                 ; then those data items... 
+                 segment _DATA 
+       myint     dw 1234 
+       mystring  db 'This number -> %d <- should be 1234',10,0
+
+       This piece of code is the small-model assembly equivalent of the C
+       code
+
+           int myint = 1234; 
+           printf("This number -> %d <- should be 1234\n", myint);
+
+       In large model, the function-call code might look more like this. In
+       this example, it is assumed that `DS' already holds the segment base
+       of the segment `_DATA'. If not, you would have to initialise it
+       first.
+
+                 push word [myint] 
+                 push word seg mystring ; Now push the segment, and... 
+                 push word mystring     ; ... offset of "mystring" 
+                 call far _printf 
+                 add sp,byte 6
+
+       The integer value still takes up one word on the stack, since large
+       model does not affect the size of the `int' data type. The first
+       argument (pushed last) to `printf', however, is a data pointer, and
+       therefore has to contain a segment and offset part. The segment
+       should be stored second in memory, and therefore must be pushed
+       first. (Of course, `PUSH DS' would have been a shorter instruction
+       than `PUSH WORD SEG mystring', if `DS' was set up as the above
+       example assumed.) Then the actual call becomes a far call, since
+       functions expect far calls in large model; and `SP' has to be
+       increased by 6 rather than 4 afterwards to make up for the extra
+       word of parameters.
+
+ 7.4.4 Accessing Data Items
+
+       To get at the contents of C variables, or to declare variables which
+       C can access, you need only declare the names as `GLOBAL' or
+       `EXTERN'. (Again, the names require leading underscores, as stated
+       in section 7.4.1.) Thus, a C variable declared as `int i' can be
+       accessed from assembler as
+
+                 extern _i 
+                 mov ax,[_i]
+
+       And to declare your own integer variable which C programs can access
+       as `extern int j', you do this (making sure you are assembling in
+       the `_DATA' segment, if necessary):
+
+                 global _j 
+       _j        dw 0
+
+       To access a C array, you need to know the size of the components of
+       the array. For example, `int' variables are two bytes long, so if a
+       C program declares an array as `int a[10]', you can access `a[3]' by
+       coding `mov ax,[_a+6]'. (The byte offset 6 is obtained by
+       multiplying the desired array index, 3, by the size of the array
+       element, 2.) The sizes of the C base types in 16-bit compilers are:
+       1 for `char', 2 for `short' and `int', 4 for `long' and `float', and
+       8 for `double'.
+
+       To access a C data structure, you need to know the offset from the
+       base of the structure to the field you are interested in. You can
+       either do this by converting the C structure definition into a NASM
+       structure definition (using `STRUC'), or by calculating the one
+       offset and using just that.
+
+       To do either of these, you should read your C compiler's manual to
+       find out how it organises data structures. NASM gives no special
+       alignment to structure members in its own `STRUC' macro, so you have
+       to specify alignment yourself if the C compiler generates it.
+       Typically, you might find that a structure like
+
+       struct { 
+           char c; 
+           int i; 
+       } foo;
+
+       might be four bytes long rather than three, since the `int' field
+       would be aligned to a two-byte boundary. However, this sort of
+       feature tends to be a configurable option in the C compiler, either
+       using command-line options or `#pragma' lines, so you have to find
+       out how your own compiler does it.
+
+ 7.4.5 `c16.mac': Helper Macros for the 16-bit C Interface
+
+       Included in the NASM archives, in the `misc' directory, is a file
+       `c16.mac' of macros. It defines three macros: `proc', `arg' and
+       `endproc'. These are intended to be used for C-style procedure
+       definitions, and they automate a lot of the work involved in keeping
+       track of the calling convention.
+
+       An example of an assembly function using the macro set is given
+       here:
+
+                 proc _nearproc 
+       %$i       arg 
+       %$j       arg 
+                 mov ax,[bp + %$i] 
+                 mov bx,[bp + %$j] 
+                 add ax,[bx] 
+                 endproc
+
+       This defines `_nearproc' to be a procedure taking two arguments, the
+       first (`i') an integer and the second (`j') a pointer to an integer.
+       It returns `i + *j'.
+
+       Note that the `arg' macro has an `EQU' as the first line of its
+       expansion, and since the label before the macro call gets prepended
+       to the first line of the expanded macro, the `EQU' works, defining
+       `%$i' to be an offset from `BP'. A context-local variable is used,
+       local to the context pushed by the `proc' macro and popped by the
+       `endproc' macro, so that the same argument name can be used in later
+       procedures. Of course, you don't _have_ to do that.
+
+       The macro set produces code for near functions (tiny, small and
+       compact-model code) by default. You can have it generate far
+       functions (medium, large and huge-model code) by means of coding
+       `%define FARCODE'. This changes the kind of return instruction
+       generated by `endproc', and also changes the starting point for the
+       argument offsets. The macro set contains no intrinsic dependency on
+       whether data pointers are far or not.
+
+       `arg' can take an optional parameter, giving the size of the
+       argument. If no size is given, 2 is assumed, since it is likely that
+       many function parameters will be of type `int'.
+
+       The large-model equivalent of the above function would look like
+       this:
+
+       %define FARCODE 
+                 proc _farproc 
+       %$i       arg 
+       %$j       arg 4 
+                 mov ax,[bp + %$i] 
+                 mov bx,[bp + %$j] 
+                 mov es,[bp + %$j + 2] 
+                 add ax,[bx] 
+                 endproc
+
+       This makes use of the argument to the `arg' macro to define a
+       parameter of size 4, because `j' is now a far pointer. When we load
+       from `j', we must load a segment and an offset.
+
+   7.5 Interfacing to Borland Pascal Programs
+
+       Interfacing to Borland Pascal programs is similar in concept to
+       interfacing to 16-bit C programs. The differences are:
+
+       (*) The leading underscore required for interfacing to C programs is
+           not required for Pascal.
+
+       (*) The memory model is always large: functions are far, data
+           pointers are far, and no data item can be more than 64K long.
+           (Actually, some functions are near, but only those functions
+           that are local to a Pascal unit and never called from outside
+           it. All assembly functions that Pascal calls, and all Pascal
+           functions that assembly routines are able to call, are far.)
+           However, all static data declared in a Pascal program goes into
+           the default data segment, which is the one whose segment address
+           will be in `DS' when control is passed to your assembly code.
+           The only things that do not live in the default data segment are
+           local variables (they live in the stack segment) and dynamically
+           allocated variables. All data _pointers_, however, are far.
+
+       (*) The function calling convention is different - described below.
+
+       (*) Some data types, such as strings, are stored differently.
+
+       (*) There are restrictions on the segment names you are allowed to
+           use - Borland Pascal will ignore code or data declared in a
+           segment it doesn't like the name of. The restrictions are
+           described below.
+
+ 7.5.1 The Pascal Calling Convention
+
+       The 16-bit Pascal calling convention is as follows. In the following
+       description, the words _caller_ and _callee_ are used to denote the
+       function doing the calling and the function which gets called.
+
+       (*) The caller pushes the function's parameters on the stack, one
+           after another, in normal order (left to right, so that the first
+           argument specified to the function is pushed first).
+
+       (*) The caller then executes a far `CALL' instruction to pass
+           control to the callee.
+
+       (*) The callee receives control, and typically (although this is not
+           actually necessary, in functions which do not need to access
+           their parameters) starts by saving the value of `SP' in `BP' so
+           as to be able to use `BP' as a base pointer to find its
+           parameters on the stack. However, the caller was probably doing
+           this too, so part of the calling convention states that `BP'
+           must be preserved by any function. Hence the callee, if it is
+           going to set up `BP' as a frame pointer, must push the previous
+           value first.
+
+       (*) The callee may then access its parameters relative to `BP'. The
+           word at `[BP]' holds the previous value of `BP' as it was
+           pushed. The next word, at `[BP+2]', holds the offset part of the
+           return address, and the next one at `[BP+4]' the segment part.
+           The parameters begin at `[BP+6]'. The rightmost parameter of the
+           function, since it was pushed last, is accessible at this offset
+           from `BP'; the others follow, at successively greater offsets.
+
+       (*) The callee may also wish to decrease `SP' further, so as to
+           allocate space on the stack for local variables, which will then
+           be accessible at negative offsets from `BP'.
+
+       (*) The callee, if it wishes to return a value to the caller, should
+           leave the value in `AL', `AX' or `DX:AX' depending on the size
+           of the value. Floating-point results are returned in `ST0'.
+           Results of type `Real' (Borland's own custom floating-point data
+           type, not handled directly by the FPU) are returned in
+           `DX:BX:AX'. To return a result of type `String', the caller
+           pushes a pointer to a temporary string before pushing the
+           parameters, and the callee places the returned string value at
+           that location. The pointer is not a parameter, and should not be
+           removed from the stack by the `RETF' instruction.
+
+       (*) Once the callee has finished processing, it restores `SP' from
+           `BP' if it had allocated local stack space, then pops the
+           previous value of `BP', and returns via `RETF'. It uses the form
+           of `RETF' with an immediate parameter, giving the number of
+           bytes taken up by the parameters on the stack. This causes the
+           parameters to be removed from the stack as a side effect of the
+           return instruction.
+
+       (*) When the caller regains control from the callee, the function
+           parameters have already been removed from the stack, so it needs
+           to do nothing further.
+
+       Thus, you would define a function in Pascal style, taking two
+       `Integer'-type parameters, in the following way:
+
+                 global myfunc 
+       myfunc:   push bp 
+                 mov bp,sp 
+                 sub sp,0x40            ; 64 bytes of local stack space 
+                 mov bx,[bp+8]          ; first parameter to function 
+                 mov bx,[bp+6]          ; second parameter to function 
+                 ; some more code 
+                 mov sp,bp              ; undo "sub sp,0x40" above 
+                 pop bp 
+                 retf 4                 ; total size of params is 4
+
+       At the other end of the process, to call a Pascal function from your
+       assembly code, you would do something like this:
+
+                 extern SomeFunc 
+                 ; and then, further down... 
+                 push word seg mystring ; Now push the segment, and... 
+                 push word mystring     ; ... offset of "mystring" 
+                 push word [myint]      ; one of my variables 
+                 call far SomeFunc
+
+       This is equivalent to the Pascal code
+
+       procedure SomeFunc(String: PChar; Int: Integer); 
+           SomeFunc(@mystring, myint);
+
+ 7.5.2 Borland Pascal Segment Name Restrictions
+
+       Since Borland Pascal's internal unit file format is completely
+       different from `OBJ', it only makes a very sketchy job of actually
+       reading and understanding the various information contained in a
+       real `OBJ' file when it links that in. Therefore an object file
+       intended to be linked to a Pascal program must obey a number of
+       restrictions:
+
+       (*) Procedures and functions must be in a segment whose name is
+           either `CODE', `CSEG', or something ending in `_TEXT'.
+
+       (*) Initialised data must be in a segment whose name is either
+           `CONST' or something ending in `_DATA'.
+
+       (*) Uninitialised data must be in a segment whose name is either
+           `DATA', `DSEG', or something ending in `_BSS'.
+
+       (*) Any other segments in the object file are completely ignored.
+           `GROUP' directives and segment attributes are also ignored.
+
+ 7.5.3 Using `c16.mac' With Pascal Programs
+
+       The `c16.mac' macro package, described in section 7.4.5, can also be
+       used to simplify writing functions to be called from Pascal
+       programs, if you code `%define PASCAL'. This definition ensures that
+       functions are far (it implies `FARCODE'), and also causes procedure
+       return instructions to be generated with an operand.
+
+       Defining `PASCAL' does not change the code which calculates the
+       argument offsets; you must declare your function's arguments in
+       reverse order. For example:
+
+       %define PASCAL 
+                 proc _pascalproc 
+       %$j       arg 4 
+       %$i       arg 
+                 mov ax,[bp + %$i] 
+                 mov bx,[bp + %$j] 
+                 mov es,[bp + %$j + 2] 
+                 add ax,[bx] 
+                 endproc
+
+       This defines the same routine, conceptually, as the example in
+       section 7.4.5: it defines a function taking two arguments, an
+       integer and a pointer to an integer, which returns the sum of the
+       integer and the contents of the pointer. The only difference between
+       this code and the large-model C version is that `PASCAL' is defined
+       instead of `FARCODE', and that the arguments are declared in reverse
+       order.
+
+Chapter 8: Writing 32-bit Code (Unix, Win32, DJGPP)
+---------------------------------------------------
+
+       This chapter attempts to cover some of the common issues involved
+       when writing 32-bit code, to run under Win32 or Unix, or to be
+       linked with C code generated by a Unix-style C compiler such as
+       DJGPP. It covers how to write assembly code to interface with 32-bit
+       C routines, and how to write position-independent code for shared
+       libraries.
+
+       Almost all 32-bit code, and in particular all code running under
+       Win32, DJGPP or any of the PC Unix variants, runs in _flat_ memory
+       model. This means that the segment registers and paging have already
+       been set up to give you the same 32-bit 4Gb address space no matter
+       what segment you work relative to, and that you should ignore all
+       segment registers completely. When writing flat-model application
+       code, you never need to use a segment override or modify any segment
+       register, and the code-section addresses you pass to `CALL' and
+       `JMP' live in the same address space as the data-section addresses
+       you access your variables by and the stack-section addresses you
+       access local variables and procedure parameters by. Every address is
+       32 bits long and contains only an offset part.
+
+   8.1 Interfacing to 32-bit C Programs
+
+       A lot of the discussion in section 7.4, about interfacing to 16-bit
+       C programs, still applies when working in 32 bits. The absence of
+       memory models or segmentation worries simplifies things a lot.
+
+ 8.1.1 External Symbol Names
+
+       Most 32-bit C compilers share the convention used by 16-bit
+       compilers, that the names of all global symbols (functions or data)
+       they define are formed by prefixing an underscore to the name as it
+       appears in the C program. However, not all of them do: the ELF
+       specification states that C symbols do _not_ have a leading
+       underscore on their assembly-language names.
+
+       The older Linux `a.out' C compiler, all Win32 compilers, DJGPP, and
+       NetBSD and FreeBSD, all use the leading underscore; for these
+       compilers, the macros `cextern' and `cglobal', as given in section
+       7.4.1, will still work. For ELF, though, the leading underscore
+       should not be used.
+
+ 8.1.2 Function Definitions and Function Calls
+
+       The C calling conventionThe C calling convention in 32-bit programs
+       is as follows. In the following description, the words _caller_ and
+       _callee_ are used to denote the function doing the calling and the
+       function which gets called.
+
+       (*) The caller pushes the function's parameters on the stack, one
+           after another, in reverse order (right to left, so that the
+           first argument specified to the function is pushed last).
+
+       (*) The caller then executes a near `CALL' instruction to pass
+           control to the callee.
+
+       (*) The callee receives control, and typically (although this is not
+           actually necessary, in functions which do not need to access
+           their parameters) starts by saving the value of `ESP' in `EBP'
+           so as to be able to use `EBP' as a base pointer to find its
+           parameters on the stack. However, the caller was probably doing
+           this too, so part of the calling convention states that `EBP'
+           must be preserved by any C function. Hence the callee, if it is
+           going to set up `EBP' as a frame pointer, must push the previous
+           value first.
+
+       (*) The callee may then access its parameters relative to `EBP'. The
+           doubleword at `[EBP]' holds the previous value of `EBP' as it
+           was pushed; the next doubleword, at `[EBP+4]', holds the return
+           address, pushed implicitly by `CALL'. The parameters start after
+           that, at `[EBP+8]'. The leftmost parameter of the function,
+           since it was pushed last, is accessible at this offset from
+           `EBP'; the others follow, at successively greater offsets. Thus,
+           in a function such as `printf' which takes a variable number of
+           parameters, the pushing of the parameters in reverse order means
+           that the function knows where to find its first parameter, which
+           tells it the number and type of the remaining ones.
+
+       (*) The callee may also wish to decrease `ESP' further, so as to
+           allocate space on the stack for local variables, which will then
+           be accessible at negative offsets from `EBP'.
+
+       (*) The callee, if it wishes to return a value to the caller, should
+           leave the value in `AL', `AX' or `EAX' depending on the size of
+           the value. Floating-point results are typically returned in
+           `ST0'.
+
+       (*) Once the callee has finished processing, it restores `ESP' from
+           `EBP' if it had allocated local stack space, then pops the
+           previous value of `EBP', and returns via `RET' (equivalently,
+           `RETN').
+
+       (*) When the caller regains control from the callee, the function
+           parameters are still on the stack, so it typically adds an
+           immediate constant to `ESP' to remove them (instead of executing
+           a number of slow `POP' instructions). Thus, if a function is
+           accidentally called with the wrong number of parameters due to a
+           prototype mismatch, the stack will still be returned to a
+           sensible state since the caller, which _knows_ how many
+           parameters it pushed, does the removing.
+
+       There is an alternative calling convention used by Win32 programs
+       for Windows API calls, and also for functions called _by_ the
+       Windows API such as window procedures: they follow what Microsoft
+       calls the `__stdcall' convention. This is slightly closer to the
+       Pascal convention, in that the callee clears the stack by passing a
+       parameter to the `RET' instruction. However, the parameters are
+       still pushed in right-to-left order.
+
+       Thus, you would define a function in C style in the following way:
+
+                 global _myfunc 
+       _myfunc:  push ebp 
+                 mov ebp,esp 
+                 sub esp,0x40           ; 64 bytes of local stack space 
+                 mov ebx,[ebp+8]        ; first parameter to function 
+                 ; some more code 
+                 leave                  ; mov esp,ebp / pop ebp 
+                 ret
+
+       At the other end of the process, to call a C function from your
+       assembly code, you would do something like this:
+
+                 extern _printf 
+                 ; and then, further down... 
+                 push dword [myint]     ; one of my integer variables 
+                 push dword mystring    ; pointer into my data segment 
+                 call _printf 
+                 add esp,byte 8         ; `byte' saves space 
+                 ; then those data items... 
+                 segment _DATA 
+       myint     dd 1234 
+       mystring  db 'This number -> %d <- should be 1234',10,0
+
+       This piece of code is the assembly equivalent of the C code
+
+           int myint = 1234; 
+           printf("This number -> %d <- should be 1234\n", myint);
+
+ 8.1.3 Accessing Data Items
+
+       To get at the contents of C variables, or to declare variables which
+       C can access, you need only declare the names as `GLOBAL' or
+       `EXTERN'. (Again, the names require leading underscores, as stated
+       in section 8.1.1.) Thus, a C variable declared as `int i' can be
+       accessed from assembler as
+
+                 extern _i 
+                 mov eax,[_i]
+
+       And to declare your own integer variable which C programs can access
+       as `extern int j', you do this (making sure you are assembling in
+       the `_DATA' segment, if necessary):
+
+                 global _j 
+       _j        dd 0
+
+       To access a C array, you need to know the size of the components of
+       the array. For example, `int' variables are four bytes long, so if a
+       C program declares an array as `int a[10]', you can access `a[3]' by
+       coding `mov ax,[_a+12]'. (The byte offset 12 is obtained by
+       multiplying the desired array index, 3, by the size of the array
+       element, 4.) The sizes of the C base types in 32-bit compilers are:
+       1 for `char', 2 for `short', 4 for `int', `long' and `float', and 8
+       for `double'. Pointers, being 32-bit addresses, are also 4 bytes
+       long.
+
+       To access a C data structure, you need to know the offset from the
+       base of the structure to the field you are interested in. You can
+       either do this by converting the C structure definition into a NASM
+       structure definition (using `STRUC'), or by calculating the one
+       offset and using just that.
+
+       To do either of these, you should read your C compiler's manual to
+       find out how it organises data structures. NASM gives no special
+       alignment to structure members in its own `STRUC' macro, so you have
+       to specify alignment yourself if the C compiler generates it.
+       Typically, you might find that a structure like
+
+       struct { 
+           char c; 
+           int i; 
+       } foo;
+
+       might be eight bytes long rather than five, since the `int' field
+       would be aligned to a four-byte boundary. However, this sort of
+       feature is sometimes a configurable option in the C compiler, either
+       using command-line options or `#pragma' lines, so you have to find
+       out how your own compiler does it.
+
+ 8.1.4 `c32.mac': Helper Macros for the 32-bit C Interface
+
+       Included in the NASM archives, in the `misc' directory, is a file
+       `c32.mac' of macros. It defines three macros: `proc', `arg' and
+       `endproc'. These are intended to be used for C-style procedure
+       definitions, and they automate a lot of the work involved in keeping
+       track of the calling convention.
+
+       An example of an assembly function using the macro set is given
+       here:
+
+                 proc _proc32 
+       %$i       arg 
+       %$j       arg 
+                 mov eax,[ebp + %$i] 
+                 mov ebx,[ebp + %$j] 
+                 add eax,[ebx] 
+                 endproc
+
+       This defines `_proc32' to be a procedure taking two arguments, the
+       first (`i') an integer and the second (`j') a pointer to an integer.
+       It returns `i + *j'.
+
+       Note that the `arg' macro has an `EQU' as the first line of its
+       expansion, and since the label before the macro call gets prepended
+       to the first line of the expanded macro, the `EQU' works, defining
+       `%$i' to be an offset from `BP'. A context-local variable is used,
+       local to the context pushed by the `proc' macro and popped by the
+       `endproc' macro, so that the same argument name can be used in later
+       procedures. Of course, you don't _have_ to do that.
+
+       `arg' can take an optional parameter, giving the size of the
+       argument. If no size is given, 4 is assumed, since it is likely that
+       many function parameters will be of type `int' or pointers.
+
+   8.2 Writing NetBSD/FreeBSD/OpenBSD and Linux/ELF Shared Libraries
+
+       ELF replaced the older `a.out' object file format under Linux
+       because it contains support for position-independent code (PIC),
+       which makes writing shared libraries much easier. NASM supports the
+       ELF position-independent code features, so you can write Linux ELF
+       shared libraries in NASM.
+
+       NetBSD, and its close cousins FreeBSD and OpenBSD, take a different
+       approach by hacking PIC support into the `a.out' format. NASM
+       supports this as the `aoutb' output format, so you can write BSD
+       shared libraries in NASM too.
+
+       The operating system loads a PIC shared library by memory-mapping
+       the library file at an arbitrarily chosen point in the address space
+       of the running process. The contents of the library's code section
+       must therefore not depend on where it is loaded in memory.
+
+       Therefore, you cannot get at your variables by writing code like
+       this:
+
+                 mov eax,[myvar]        ; WRONG
+
+       Instead, the linker provides an area of memory called the _global
+       offset table_, or GOT; the GOT is situated at a constant distance
+       from your library's code, so if you can find out where your library
+       is loaded (which is typically done using a `CALL' and `POP'
+       combination), you can obtain the address of the GOT, and you can
+       then load the addresses of your variables out of linker-generated
+       entries in the GOT.
+
+       The _data_ section of a PIC shared library does not have these
+       restrictions: since the data section is writable, it has to be
+       copied into memory anyway rather than just paged in from the library
+       file, so as long as it's being copied it can be relocated too. So
+       you can put ordinary types of relocation in the data section without
+       too much worry (but see section 8.2.4 for a caveat).
+
+ 8.2.1 Obtaining the Address of the GOT
+
+       Each code module in your shared library should define the GOT as an
+       external symbol:
+
+                 extern _GLOBAL_OFFSET_TABLE_   ; in ELF 
+                 extern __GLOBAL_OFFSET_TABLE_  ; in BSD a.out
+
+       At the beginning of any function in your shared library which plans
+       to access your data or BSS sections, you must first calculate the
+       address of the GOT. This is typically done by writing the function
+       in this form:
+
+       func:     push ebp 
+                 mov ebp,esp 
+                 push ebx 
+                 call .get_GOT 
+       .get_GOT: pop ebx 
+                 add ebx,_GLOBAL_OFFSET_TABLE_+$$-.get_GOT wrt ..gotpc 
+                 ; the function body comes here 
+                 mov ebx,[ebp-4] 
+                 mov esp,ebp 
+                 pop ebp 
+                 ret
+
+       (For BSD, again, the symbol `_GLOBAL_OFFSET_TABLE' requires a second
+       leading underscore.)
+
+       The first two lines of this function are simply the standard C
+       prologue to set up a stack frame, and the last three lines are
+       standard C function epilogue. The third line, and the fourth to last
+       line, save and restore the `EBX' register, because PIC shared
+       libraries use this register to store the address of the GOT.
+
+       The interesting bit is the `CALL' instruction and the following two
+       lines. The `CALL' and `POP' combination obtains the address of the
+       label `.get_GOT', without having to know in advance where the
+       program was loaded (since the `CALL' instruction is encoded relative
+       to the current position). The `ADD' instruction makes use of one of
+       the special PIC relocation types: GOTPC relocation. With the
+       `WRT ..gotpc' qualifier specified, the symbol referenced (here
+       `_GLOBAL_OFFSET_TABLE_', the special symbol assigned to the GOT) is
+       given as an offset from the beginning of the section. (Actually, ELF
+       encodes it as the offset from the operand field of the `ADD'
+       instruction, but NASM simplifies this deliberately, so you do things
+       the same way for both ELF and BSD.) So the instruction then _adds_
+       the beginning of the section, to get the real address of the GOT,
+       and subtracts the value of `.get_GOT' which it knows is in `EBX'.
+       Therefore, by the time that instruction has finished, `EBX' contains
+       the address of the GOT.
+
+       If you didn't follow that, don't worry: it's never necessary to
+       obtain the address of the GOT by any other means, so you can put
+       those three instructions into a macro and safely ignore them:
+
+       %macro get_GOT 0 
+                 call %%getgot 
+       %%getgot: pop ebx 
+                 add ebx,_GLOBAL_OFFSET_TABLE_+$$-%%getgot wrt ..gotpc 
+       %endmacro
+
+ 8.2.2 Finding Your Local Data Items
+
+       Having got the GOT, you can then use it to obtain the addresses of
+       your data items. Most variables will reside in the sections you have
+       declared; they can be accessed using the `..gotoff' special `WRT'
+       type. The way this works is like this:
+
+                 lea eax,[ebx+myvar wrt ..gotoff]
+
+       The expression `myvar wrt ..gotoff' is calculated, when the shared
+       library is linked, to be the offset to the local variable `myvar'
+       from the beginning of the GOT. Therefore, adding it to `EBX' as
+       above will place the real address of `myvar' in `EAX'.
+
+       If you declare variables as `GLOBAL' without specifying a size for
+       them, they are shared between code modules in the library, but do
+       not get exported from the library to the program that loaded it.
+       They will still be in your ordinary data and BSS sections, so you
+       can access them in the same way as local variables, using the above
+       `..gotoff' mechanism.
+
+       Note that due to a peculiarity of the way BSD `a.out' format handles
+       this relocation type, there must be at least one non-local symbol in
+       the same section as the address you're trying to access.
+
+ 8.2.3 Finding External and Common Data Items
+
+       If your library needs to get at an external variable (external to
+       the _library_, not just to one of the modules within it), you must
+       use the `..got' type to get at it. The `..got' type, instead of
+       giving you the offset from the GOT base to the variable, gives you
+       the offset from the GOT base to a GOT _entry_ containing the address
+       of the variable. The linker will set up this GOT entry when it
+       builds the library, and the dynamic linker will place the correct
+       address in it at load time. So to obtain the address of an external
+       variable `extvar' in `EAX', you would code
+
+                 mov eax,[ebx+extvar wrt ..got]
+
+       This loads the address of `extvar' out of an entry in the GOT. The
+       linker, when it builds the shared library, collects together every
+       relocation of type `..got', and builds the GOT so as to ensure it
+       has every necessary entry present.
+
+       Common variables must also be accessed in this way.
+
+ 8.2.4 Exporting Symbols to the Library User
+
+       If you want to export symbols to the user of the library, you have
+       to declare whether they are functions or data, and if they are data,
+       you have to give the size of the data item. This is because the
+       dynamic linker has to build procedure linkage table entries for any
+       exported functions, and also moves exported data items away from the
+       library's data section in which they were declared.
+
+       So to export a function to users of the library, you must use
+
+                 global func:function   ; declare it as a function 
+       func:     push ebp 
+                 ; etc.
+
+       And to export a data item such as an array, you would have to code
+
+                 global array:data array.end-array ; give the size too 
+       array:    resd 128 
+       .end:
+
+       Be careful: If you export a variable to the library user, by
+       declaring it as `GLOBAL' and supplying a size, the variable will end
+       up living in the data section of the main program, rather than in
+       your library's data section, where you declared it. So you will have
+       to access your own global variable with the `..got' mechanism rather
+       than `..gotoff', as if it were external (which, effectively, it has
+       become).
+
+       Equally, if you need to store the address of an exported global in
+       one of your data sections, you can't do it by means of the standard
+       sort of code:
+
+       dataptr:  dd global_data_item    ; WRONG
+
+       NASM will interpret this code as an ordinary relocation, in which
+       `global_data_item' is merely an offset from the beginning of the
+       `.data' section (or whatever); so this reference will end up
+       pointing at your data section instead of at the exported global
+       which resides elsewhere.
+
+       Instead of the above code, then, you must write
+
+       dataptr:  dd global_data_item wrt ..sym
+
+       which makes use of the special `WRT' type `..sym' to instruct NASM
+       to search the symbol table for a particular symbol at that address,
+       rather than just relocating by section base.
+
+       Either method will work for functions: referring to one of your
+       functions by means of
+
+       funcptr:  dd my_function
+
+       will give the user the address of the code you wrote, whereas
+
+       funcptr:  dd my_function wrt ..sym
+
+       will give the address of the procedure linkage table for the
+       function, which is where the calling program will _believe_ the
+       function lives. Either address is a valid way to call the function.
+
+ 8.2.5 Calling Procedures Outside the Library
+
+       Calling procedures outside your shared library has to be done by
+       means of a _procedure linkage table_, or PLT. The PLT is placed at a
+       known offset from where the library is loaded, so the library code
+       can make calls to the PLT in a position-independent way. Within the
+       PLT there is code to jump to offsets contained in the GOT, so
+       function calls to other shared libraries or to routines in the main
+       program can be transparently passed off to their real destinations.
+
+       To call an external routine, you must use another special PIC
+       relocation type, `WRT ..plt'. This is much easier than the GOT-based
+       ones: you simply replace calls such as `CALL printf' with the PLT-
+       relative version `CALL printf WRT ..plt'.
+
+ 8.2.6 Generating the Library File
+
+       Having written some code modules and assembled them to `.o' files,
+       you then generate your shared library with a command such as
+
+       ld -shared -o library.so module1.o module2.o       # for ELF 
+       ld -Bshareable -o library.so module1.o module2.o   # for BSD
+
+       For ELF, if your shared library is going to reside in system
+       directories such as `/usr/lib' or `/lib', it is usually worth using
+       the `-soname' flag to the linker, to store the final library file
+       name, with a version number, into the library:
+
+       ld -shared -soname library.so.1 -o library.so.1.2 *.o
+
+       You would then copy `library.so.1.2' into the library directory, and
+       create `library.so.1' as a symbolic link to it.
+
+Chapter 9: Mixing 16 and 32 Bit Code
+------------------------------------
+
+       This chapter tries to cover some of the issues, largely related to
+       unusual forms of addressing and jump instructions, encountered when
+       writing operating system code such as protected-mode initialisation
+       routines, which require code that operates in mixed segment sizes,
+       such as code in a 16-bit segment trying to modify data in a 32-bit
+       one, or jumps between different-size segments.
+
+   9.1 Mixed-Size Jumps
+
+       The most common form of mixed-size instruction is the one used when
+       writing a 32-bit OS: having done your setup in 16-bit mode, such as
+       loading the kernel, you then have to boot it by switching into
+       protected mode and jumping to the 32-bit kernel start address. In a
+       fully 32-bit OS, this tends to be the _only_ mixed-size instruction
+       you need, since everything before it can be done in pure 16-bit
+       code, and everything after it can be pure 32-bit.
+
+       This jump must specify a 48-bit far address, since the target
+       segment is a 32-bit one. However, it must be assembled in a 16-bit
+       segment, so just coding, for example,
+
+                 jmp 0x1234:0x56789ABC  ; wrong!
+
+       will not work, since the offset part of the address will be
+       truncated to `0x9ABC' and the jump will be an ordinary 16-bit far
+       one.
+
+       The Linux kernel setup code gets round the inability of `as86' to
+       generate the required instruction by coding it manually, using `DB'
+       instructions. NASM can go one better than that, by actually
+       generating the right instruction itself. Here's how to do it right:
+
+                 jmp dword 0x1234:0x56789ABC  ; right
+
+       The `DWORD' prefix (strictly speaking, it should come _after_ the
+       colon, since it is declaring the _offset_ field to be a doubleword;
+       but NASM will accept either form, since both are unambiguous) forces
+       the offset part to be treated as far, in the assumption that you are
+       deliberately writing a jump from a 16-bit segment to a 32-bit one.
+
+       You can do the reverse operation, jumping from a 32-bit segment to a
+       16-bit one, by means of the `WORD' prefix:
+
+                 jmp word 0x8765:0x4321 ; 32 to 16 bit
+
+       If the `WORD' prefix is specified in 16-bit mode, or the `DWORD'
+       prefix in 32-bit mode, they will be ignored, since each is
+       explicitly forcing NASM into a mode it was in anyway.
+
+   9.2 Addressing Between Different-Size Segments
+
+       If your OS is mixed 16 and 32-bit, or if you are writing a DOS
+       extender, you are likely to have to deal with some 16-bit segments
+       and some 32-bit ones. At some point, you will probably end up
+       writing code in a 16-bit segment which has to access data in a 32-
+       bit segment, or vice versa.
+
+       If the data you are trying to access in a 32-bit segment lies within
+       the first 64K of the segment, you may be able to get away with using
+       an ordinary 16-bit addressing operation for the purpose; but sooner
+       or later, you will want to do 32-bit addressing from 16-bit mode.
+
+       The easiest way to do this is to make sure you use a register for
+       the address, since any effective address containing a 32-bit
+       register is forced to be a 32-bit address. So you can do
+
+                 mov eax,offset_into_32_bit_segment_specified_by_fs 
+                 mov dword [fs:eax],0x11223344
+
+       This is fine, but slightly cumbersome (since it wastes an
+       instruction and a register) if you already know the precise offset
+       you are aiming at. The x86 architecture does allow 32-bit effective
+       addresses to specify nothing but a 4-byte offset, so why shouldn't
+       NASM be able to generate the best instruction for the purpose?
+
+       It can. As in section 9.1, you need only prefix the address with the
+       `DWORD' keyword, and it will be forced to be a 32-bit address:
+
+                 mov dword [fs:dword my_offset],0x11223344
+
+       Also as in section 9.1, NASM is not fussy about whether the `DWORD'
+       prefix comes before or after the segment override, so arguably a
+       nicer-looking way to code the above instruction is
+
+                 mov dword [dword fs:my_offset],0x11223344
+
+       Don't confuse the `DWORD' prefix _outside_ the square brackets,
+       which controls the size of the data stored at the address, with the
+       one `inside' the square brackets which controls the length of the
+       address itself. The two can quite easily be different:
+
+                 mov word [dword 0x12345678],0x9ABC
+
+       This moves 16 bits of data to an address specified by a 32-bit
+       offset.
+
+       You can also specify `WORD' or `DWORD' prefixes along with the `FAR'
+       prefix to indirect far jumps or calls. For example:
+
+                 call dword far [fs:word 0x4321]
+
+       This instruction contains an address specified by a 16-bit offset;
+       it loads a 48-bit far pointer from that (16-bit segment and 32-bit
+       offset), and calls that address.
+
+   9.3 Other Mixed-Size Instructions
+
+       The other way you might want to access data might be using the
+       string instructions (`LODSx', `STOSx' and so on) or the `XLATB'
+       instruction. These instructions, since they take no parameters,
+       might seem to have no easy way to make them perform 32-bit
+       addressing when assembled in a 16-bit segment.
+
+       This is the purpose of NASM's `a16' and `a32' prefixes. If you are
+       coding `LODSB' in a 16-bit segment but it is supposed to be
+       accessing a string in a 32-bit segment, you should load the desired
+       address into `ESI' and then code
+
+                 a32 lodsb
+
+       The prefix forces the addressing size to 32 bits, meaning that
+       `LODSB' loads from `[DS:ESI]' instead of `[DS:SI]'. To access a
+       string in a 16-bit segment when coding in a 32-bit one, the
+       corresponding `a16' prefix can be used.
+
+       The `a16' and `a32' prefixes can be applied to any instruction in
+       NASM's instruction table, but most of them can generate all the
+       useful forms without them. The prefixes are necessary only for
+       instructions with implicit addressing: `CMPSx' (section A.19),
+       `SCASx' (section A.149), `LODSx' (section A.98), `STOSx' (section
+       A.157), `MOVSx' (section A.105), `INSx' (section A.80), `OUTSx'
+       (section A.112), and `XLATB' (section A.169). Also, the various push
+       and pop instructions (`PUSHA' and `POPF' as well as the more usual
+       `PUSH' and `POP') can accept `a16' or `a32' prefixes to force a
+       particular one of `SP' or `ESP' to be used as a stack pointer, in
+       case the stack segment in use is a different size from the code
+       segment.
+
+       `PUSH' and `POP', when applied to segment registers in 32-bit mode,
+       also have the slightly odd behaviour that they push and pop 4 bytes
+       at a time, of which the top two are ignored and the bottom two give
+       the value of the segment register being manipulated. To force the
+       16-bit behaviour of segment-register push and pop instructions, you
+       can use the operand-size prefix `o16':
+
+                 o16 push ss 
+                 o16 push ds
+
+       This code saves a doubleword of stack space by fitting two segment
+       registers into the space which would normally be consumed by pushing
+       one.
+
+       (You can also use the `o32' prefix to force the 32-bit behaviour
+       when in 16-bit mode, but this seems less useful.)
+
+Chapter 10: Troubleshooting
+---------------------------
+
+       This chapter describes some of the common problems that users have
+       been known to encounter with NASM, and answers them. It also gives
+       instructions for reporting bugs in NASM if you find a difficulty
+       that isn't listed here.
+
+  10.1 Common Problems
+
+10.1.1 NASM Generates Inefficient Code
+
+       I get a lot of `bug' reports about NASM generating inefficient, or
+       even `wrong', code on instructions such as `ADD ESP,8'. This is a
+       deliberate design feature, connected to predictability of output:
+       NASM, on seeing `ADD ESP,8', will generate the form of the
+       instruction which leaves room for a 32-bit offset. You need to code
+       `ADD ESP,BYTE 8' if you want the space-efficient form of the
+       instruction. This isn't a bug: at worst it's a misfeature, and
+       that's a matter of opinion only.
+
+10.1.2 My Jumps are Out of Range
+
+       Similarly, people complain that when they issue conditional jumps
+       (which are `SHORT' by default) that try to jump too far, NASM
+       reports `short jump out of range' instead of making the jumps
+       longer.
+
+       This, again, is partly a predictability issue, but in fact has a
+       more practical reason as well. NASM has no means of being told what
+       type of processor the code it is generating will be run on; so it
+       cannot decide for itself that it should generate `Jcc NEAR' type
+       instructions, because it doesn't know that it's working for a 386 or
+       above. Alternatively, it could replace the out-of-range short `JNE'
+       instruction with a very short `JE' instruction that jumps over a
+       `JMP NEAR'; this is a sensible solution for processors below a 386,
+       but hardly efficient on processors which have good branch prediction
+       _and_ could have used `JNE NEAR' instead. So, once again, it's up to
+       the user, not the assembler, to decide what instructions should be
+       generated.
+
+10.1.3 `ORG' Doesn't Work
+
+       People writing boot sector programs in the `bin' format often
+       complain that `ORG' doesn't work the way they'd like: in order to
+       place the `0xAA55' signature word at the end of a 512-byte boot
+       sector, people who are used to MASM tend to code
+
+                 ORG 0 
+                 ; some boot sector code 
+                 ORG 510 
+                 DW 0xAA55
+
+       This is not the intended use of the `ORG' directive in NASM, and
+       will not work. The correct way to solve this problem in NASM is to
+       use the `TIMES' directive, like this:
+
+                 ORG 0 
+                 ; some boot sector code 
+                 TIMES 510-($-$$) DB 0 
+                 DW 0xAA55
+
+       The `TIMES' directive will insert exactly enough zero bytes into the
+       output to move the assembly point up to 510. This method also has
+       the advantage that if you accidentally fill your boot sector too
+       full, NASM will catch the problem at assembly time and report it, so
+       you won't end up with a boot sector that you have to disassemble to
+       find out what's wrong with it.
+
+10.1.4 `TIMES' Doesn't Work
+
+       The other common problem with the above code is people who write the
+       `TIMES' line as
+
+                 TIMES 510-$ DB 0
+
+       by reasoning that `$' should be a pure number, just like 510, so the
+       difference between them is also a pure number and can happily be fed
+       to `TIMES'.
+
+       NASM is a _modular_ assembler: the various component parts are
+       designed to be easily separable for re-use, so they don't exchange
+       information unnecessarily. In consequence, the `bin' output format,
+       even though it has been told by the `ORG' directive that the `.text'
+       section should start at 0, does not pass that information back to
+       the expression evaluator. So from the evaluator's point of view, `$'
+       isn't a pure number: it's an offset from a section base. Therefore
+       the difference between `$' and 510 is also not a pure number, but
+       involves a section base. Values involving section bases cannot be
+       passed as arguments to `TIMES'.
+
+       The solution, as in the previous section, is to code the `TIMES'
+       line in the form
+
+                 TIMES 510-($-$$) DB 0
+
+       in which `$' and `$$' are offsets from the same section base, and so
+       their difference is a pure number. This will solve the problem and
+       generate sensible code.
+
+  10.2 Bugs
+
+       We have never yet released a version of NASM with any _known_ bugs.
+       That doesn't usually stop there being plenty we didn't know about,
+       though. Any that you find should be reported to `anakin@pobox.com'.
+
+       Please read section 2.2 first, and don't report the bug if it's
+       listed in there as a deliberate feature. (If you think the feature
+       is badly thought out, feel free to send us reasons why you think it
+       should be changed, but don't just send us mail saying `This is a
+       bug' if the documentation says we did it on purpose.) Then read
+       section 10.1, and don't bother reporting the bug if it's listed
+       there.
+
+       If you do report a bug, _please_ give us all of the following
+       information:
+
+       (*) What operating system you're running NASM under. DOS, Linux,
+           NetBSD, Win16, Win32, VMS (I'd be impressed), whatever.
+
+       (*) If you're running NASM under DOS or Win32, tell us whether
+           you've compiled your own executable from the DOS source archive,
+           or whether you were using the standard distribution binaries out
+           of the archive. If you were using a locally built executable,
+           try to reproduce the problem using one of the standard binaries,
+           as this will make it easier for us to reproduce your problem
+           prior to fixing it.
+
+       (*) Which version of NASM you're using, and exactly how you invoked
+           it. Give us the precise command line, and the contents of the
+           `NASM' environment variable if any.
+
+       (*) Which versions of any supplementary programs you're using, and
+           how you invoked them. If the problem only becomes visible at
+           link time, tell us what linker you're using, what version of it
+           you've got, and the exact linker command line. If the problem
+           involves linking against object files generated by a compiler,
+           tell us what compiler, what version, and what command line or
+           options you used. (If you're compiling in an IDE, please try to
+           reproduce the problem with the command-line version of the
+           compiler.)
+
+       (*) If at all possible, send us a NASM source file which exhibits
+           the problem. If this causes copyright problems (e.g. you can
+           only reproduce the bug in restricted-distribution code) then
+           bear in mind the following two points: firstly, we guarantee
+           that any source code sent to us for the purposes of debugging
+           NASM will be used _only_ for the purposes of debugging NASM, and
+           that we will delete all our copies of it as soon as we have
+           found and fixed the bug or bugs in question; and secondly, we
+           would prefer _not_ to be mailed large chunks of code anyway. The
+           smaller the file, the better. A three-line sample file that does
+           nothing useful _except_ demonstrate the problem is much easier
+           to work with than a fully fledged ten-thousand-line program. (Of
+           course, some errors _do_ only crop up in large files, so this
+           may not be possible.)
+
+       (*) A description of what the problem actually _is_. `It doesn't
+           work' is _not_ a helpful description! Please describe exactly
+           what is happening that shouldn't be, or what isn't happening
+           that should. Examples might be: `NASM generates an error message
+           saying Line 3 for an error that's actually on Line 5'; `NASM
+           generates an error message that I believe it shouldn't be
+           generating at all'; `NASM fails to generate an error message
+           that I believe it _should_ be generating'; `the object file
+           produced from this source code crashes my linker'; `the ninth
+           byte of the output file is 66 and I think it should be 77
+           instead'.
+
+       (*) If you believe the output file from NASM to be faulty, send it
+           to us. That allows us to determine whether our own copy of NASM
+           generates the same file, or whether the problem is related to
+           portability issues between our development platforms and yours.
+           We can handle binary files mailed to us as MIME attachments,
+           uuencoded, and even BinHex. Alternatively, we may be able to
+           provide an FTP site you can upload the suspect files to; but
+           mailing them is easier for us.
+
+       (*) Any other information or data files that might be helpful. If,
+           for example, the problem involves NASM failing to generate an
+           object file while TASM can generate an equivalent file without
+           trouble, then send us _both_ object files, so we can see what
+           TASM is doing differently from us.
+
+Appendix A: Intel x86 Instruction Reference
+-------------------------------------------
+
+       This appendix provides a complete list of the machine instructions
+       which NASM will assemble, and a short description of the function of
+       each one.
+
+       It is not intended to be exhaustive documentation on the fine
+       details of the instructions' function, such as which exceptions they
+       can trigger: for such documentation, you should go to Intel's Web
+       site, `http://www.intel.com'.
+
+       Instead, this appendix is intended primarily to provide
+       documentation on the way the instructions may be used within NASM.
+       For example, looking up `LOOP' will tell you that NASM allows `CX'
+       or `ECX' to be specified as an optional second argument to the
+       `LOOP' instruction, to enforce which of the two possible counter
+       registers should be used if the default is not the one desired.
+
+       The instructions are not quite listed in alphabetical order, since
+       groups of instructions with similar functions are lumped together in
+       the same entry. Most of them don't move very far from their
+       alphabetic position because of this.
+
+   A.1 Key to Operand Specifications
+
+       The instruction descriptions in this appendix specify their operands
+       using the following notation:
+
+       (*) Registers: `reg8' denotes an 8-bit general purpose register,
+           `reg16' denotes a 16-bit general purpose register, and `reg32' a
+           32-bit one. `fpureg' denotes one of the eight FPU stack
+           registers, `mmxreg' denotes one of the eight 64-bit MMX
+           registers, and `segreg' denotes a segment register. In addition,
+           some registers (such as `AL', `DX' or `ECX') may be specified
+           explicitly.
+
+       (*) Immediate operands: `imm' denotes a generic immediate operand.
+           `imm8', `imm16' and `imm32' are used when the operand is
+           intended to be a specific size. For some of these instructions,
+           NASM needs an explicit specifier: for example, `ADD ESP,16'
+           could be interpreted as either `ADD r/m32,imm32' or
+           `ADD r/m32,imm8'. NASM chooses the former by default, and so you
+           must specify `ADD ESP,BYTE 16' for the latter.
+
+       (*) Memory references: `mem' denotes a generic memory reference;
+           `mem8', `mem16', `mem32', `mem64' and `mem80' are used when the
+           operand needs to be a specific size. Again, a specifier is
+           needed in some cases: `DEC [address]' is ambiguous and will be
+           rejected by NASM. You must specify `DEC BYTE [address]',
+           `DEC WORD [address]' or `DEC DWORD [address]' instead.
+
+       (*) Restricted memory references: one form of the `MOV' instruction
+           allows a memory address to be specified _without_ allowing the
+           normal range of register combinations and effective address
+           processing. This is denoted by `memoffs8', `memoffs16' and
+           `memoffs32'.
+
+       (*) Register or memory choices: many instructions can accept either
+           a register _or_ a memory reference as an operand. `r/m8' is a
+           shorthand for `reg8/mem8'; similarly `r/m16' and `r/m32'.
+           `r/m64' is MMX-related, and is a shorthand for `mmxreg/mem64'.
+
+   A.2 Key to Opcode Descriptions
+
+       This appendix also provides the opcodes which NASM will generate for
+       each form of each instruction. The opcodes are listed in the
+       following way:
+
+       (*) A hex number, such as `3F', indicates a fixed byte containing
+           that number.
+
+       (*) A hex number followed by `+r', such as `C8+r', indicates that
+           one of the operands to the instruction is a register, and the
+           `register value' of that register should be added to the hex
+           number to produce the generated byte. For example, EDX has
+           register value 2, so the code `C8+r', when the register operand
+           is EDX, generates the hex byte `CA'. Register values for
+           specific registers are given in section A.2.1.
+
+       (*) A hex number followed by `+cc', such as `40+cc', indicates that
+           the instruction name has a condition code suffix, and the
+           numeric representation of the condition code should be added to
+           the hex number to produce the generated byte. For example, the
+           code `40+cc', when the instruction contains the `NE' condition,
+           generates the hex byte `45'. Condition codes and their numeric
+           representations are given in section A.2.2.
+
+       (*) A slash followed by a digit, such as `/2', indicates that one of
+           the operands to the instruction is a memory address or register
+           (denoted `mem' or `r/m', with an optional size). This is to be
+           encoded as an effective address, with a ModR/M byte, an optional
+           SIB byte, and an optional displacement, and the spare (register)
+           field of the ModR/M byte should be the digit given (which will
+           be from 0 to 7, so it fits in three bits). The encoding of
+           effective addresses is given in section A.2.3.
+
+       (*) The code `/r' combines the above two: it indicates that one of
+           the operands is a memory address or `r/m', and another is a
+           register, and that an effective address should be generated with
+           the spare (register) field in the ModR/M byte being equal to the
+           `register value' of the register operand. The encoding of
+           effective addresses is given in section A.2.3; register values
+           are given in section A.2.1.
+
+       (*) The codes `ib', `iw' and `id' indicate that one of the operands
+           to the instruction is an immediate value, and that this is to be
+           encoded as a byte, little-endian word or little-endian
+           doubleword respectively.
+
+       (*) The codes `rb', `rw' and `rd' indicate that one of the operands
+           to the instruction is an immediate value, and that the
+           _difference_ between this value and the address of the end of
+           the instruction is to be encoded as a byte, word or doubleword
+           respectively. Where the form `rw/rd' appears, it indicates that
+           either `rw' or `rd' should be used according to whether assembly
+           is being performed in `BITS 16' or `BITS 32' state respectively.
+
+       (*) The codes `ow' and `od' indicate that one of the operands to the
+           instruction is a reference to the contents of a memory address
+           specified as an immediate value: this encoding is used in some
+           forms of the `MOV' instruction in place of the standard
+           effective-address mechanism. The displacement is encoded as a
+           word or doubleword. Again, `ow/od' denotes that `ow' or `od'
+           should be chosen according to the `BITS' setting.
+
+       (*) The codes `o16' and `o32' indicate that the given form of the
+           instruction should be assembled with operand size 16 or 32 bits.
+           In other words, `o16' indicates a `66' prefix in `BITS 32'
+           state, but generates no code in `BITS 16' state; and `o32'
+           indicates a `66' prefix in `BITS 16' state but generates nothing
+           in `BITS 32'.
+
+       (*) The codes `a16' and `a32', similarly to `o16' and `o32',
+           indicate the address size of the given form of the instruction.
+           Where this does not match the `BITS' setting, a `67' prefix is
+           required.
+
+ A.2.1 Register Values
+
+       Where an instruction requires a register value, it is already
+       implicit in the encoding of the rest of the instruction what type of
+       register is intended: an 8-bit general-purpose register, a segment
+       register, a debug register, an MMX register, or whatever. Therefore
+       there is no problem with registers of different types sharing an
+       encoding value.
+
+       The encodings for the various classes of register are:
+
+       (*) 8-bit general registers: `AL' is 0, `CL' is 1, `DL' is 2, `BL'
+           is 3, `AH' is 4, `CH' is 5, `DH' is 6, and `BH' is 7.
+
+       (*) 16-bit general registers: `AX' is 0, `CX' is 1, `DX' is 2, `BX'
+           is 3, `SP' is 4, `BP' is 5, `SI' is 6, and `DI' is 7.
+
+       (*) 32-bit general registers: `EAX' is 0, `ECX' is 1, `EDX' is 2,
+           `EBX' is 3, `ESP' is 4, `EBP' is 5, `ESI' is 6, and `EDI' is 7.
+
+       (*) Segment registers: `ES' is 0, `CS' is 1, `SS' is 2, `DS' is 3,
+           `FS' is 4, and `GS' is 5.
+
+       (*) {Floating-point registers}: `ST0' is 0, `ST1' is 1, `ST2' is 2,
+           `ST3' is 3, `ST4' is 4, `ST5' is 5, `ST6' is 6, and `ST7' is 7.
+
+       (*) 64-bit MMX registers: `MM0' is 0, `MM1' is 1, `MM2' is 2, `MM3'
+           is 3, `MM4' is 4, `MM5' is 5, `MM6' is 6, and `MM7' is 7.
+
+       (*) Control registers: `CR0' is 0, `CR2' is 2, `CR3' is 3, and `CR4'
+           is 4.
+
+       (*) Debug registers: `DR0' is 0, `DR1' is 1, `DR2' is 2, `DR3' is 3,
+           `DR6' is 6, and `DR7' is 7.
+
+       (*) Test registers: `TR3' is 3, `TR4' is 4, `TR5' is 5, `TR6' is 6,
+           and `TR7' is 7.
+
+       (Note that wherever a register name contains a number, that number
+       is also the register value for that register.)
+
+ A.2.2 Condition Codes
+
+       The available condition codes are given here, along with their
+       numeric representations as part of opcodes. Many of these condition
+       codes have synonyms, so several will be listed at a time.
+
+       In the following descriptions, the word `either', when applied to
+       two possible trigger conditions, is used to mean `either or both'.
+       If `either but not both' is meant, the phrase `exactly one of' is
+       used.
+
+       (*) `O' is 0 (trigger if the overflow flag is set); `NO' is 1.
+
+       (*) `B', `C' and `NAE' are 2 (trigger if the carry flag is set);
+           `AE', `NB' and `NC' are 3.
+
+       (*) `E' and `Z' are 4 (trigger if the zero flag is set); `NE' and
+           `NZ' are 5.
+
+       (*) `BE' and `NA' are 6 (trigger if either of the carry or zero
+           flags is set); `A' and `NBE' are 7.
+
+       (*) `S' is 8 (trigger if the sign flag is set); `NS' is 9.
+
+       (*) `P' and `PE' are 10 (trigger if the parity flag is set); `NP'
+           and `PO' are 11.
+
+       (*) `L' and `NGE' are 12 (trigger if exactly one of the sign and
+           overflow flags is set); `GE' and `NL' are 13.
+
+       (*) `LE' and `NG' are 14 (trigger if either the zero flag is set, or
+           exactly one of the sign and overflow flags is set); `G' and
+           `NLE' are 15.
+
+       Note that in all cases, the sense of a condition code may be
+       reversed by changing the low bit of the numeric representation.
+
+ A.2.3 Effective Address Encoding: ModR/M and SIB
+
+       An effective address is encoded in up to three parts: a ModR/M byte,
+       an optional SIB byte, and an optional byte, word or doubleword
+       displacement field.
+
+       The ModR/M byte consists of three fields: the `mod' field, ranging
+       from 0 to 3, in the upper two bits of the byte, the `r/m' field,
+       ranging from 0 to 7, in the lower three bits, and the spare
+       (register) field in the middle (bit 3 to bit 5). The spare field is
+       not relevant to the effective address being encoded, and either
+       contains an extension to the instruction opcode or the register
+       value of another operand.
+
+       The ModR/M system can be used to encode a direct register reference
+       rather than a memory access. This is always done by setting the
+       `mod' field to 3 and the `r/m' field to the register value of the
+       register in question (it must be a general-purpose register, and the
+       size of the register must already be implicit in the encoding of the
+       rest of the instruction). In this case, the SIB byte and
+       displacement field are both absent.
+
+       In 16-bit addressing mode (either `BITS 16' with no `67' prefix, or
+       `BITS 32' with a `67' prefix), the SIB byte is never used. The
+       general rules for `mod' and `r/m' (there is an exception, given
+       below) are:
+
+       (*) The `mod' field gives the length of the displacement field: 0
+           means no displacement, 1 means one byte, and 2 means two bytes.
+
+       (*) The `r/m' field encodes the combination of registers to be added
+           to the displacement to give the accessed address: 0 means
+           `BX+SI', 1 means `BX+DI', 2 means `BP+SI', 3 means `BP+DI', 4
+           means `SI' only, 5 means `DI' only, 6 means `BP' only, and 7
+           means `BX' only.
+
+       However, there is a special case:
+
+       (*) If `mod' is 0 and `r/m' is 6, the effective address encoded is
+           not `[BP]' as the above rules would suggest, but instead
+           `[disp16]': the displacement field is present and is two bytes
+           long, and no registers are added to the displacement.
+
+       Therefore the effective address `[BP]' cannot be encoded as
+       efficiently as `[BX]'; so if you code `[BP]' in a program, NASM adds
+       a notional 8-bit zero displacement, and sets `mod' to 1, `r/m' to 6,
+       and the one-byte displacement field to 0.
+
+       In 32-bit addressing mode (either `BITS 16' with a `67' prefix, or
+       `BITS 32' with no `67' prefix) the general rules (again, there are
+       exceptions) for `mod' and `r/m' are:
+
+       (*) The `mod' field gives the length of the displacement field: 0
+           means no displacement, 1 means one byte, and 2 means four bytes.
+
+       (*) If only one register is to be added to the displacement, and it
+           is not `ESP', the `r/m' field gives its register value, and the
+           SIB byte is absent. If the `r/m' field is 4 (which would encode
+           `ESP'), the SIB byte is present and gives the combination and
+           scaling of registers to be added to the displacement.
+
+       If the SIB byte is present, it describes the combination of
+       registers (an optional base register, and an optional index register
+       scaled by multiplication by 1, 2, 4 or 8) to be added to the
+       displacement. The SIB byte is divided into the `scale' field, in the
+       top two bits, the `index' field in the next three, and the `base'
+       field in the bottom three. The general rules are:
+
+       (*) The `base' field encodes the register value of the base
+           register.
+
+       (*) The `index' field encodes the register value of the index
+           register, unless it is 4, in which case no index register is
+           used (so `ESP' cannot be used as an index register).
+
+       (*) The `scale' field encodes the multiplier by which the index
+           register is scaled before adding it to the base and
+           displacement: 0 encodes a multiplier of 1, 1 encodes 2, 2
+           encodes 4 and 3 encodes 8.
+
+       The exceptions to the 32-bit encoding rules are:
+
+       (*) If `mod' is 0 and `r/m' is 5, the effective address encoded is
+           not `[EBP]' as the above rules would suggest, but instead
+           `[disp32]': the displacement field is present and is four bytes
+           long, and no registers are added to the displacement.
+
+       (*) If `mod' is 0, `r/m' is 4 (meaning the SIB byte is present) and
+           `base' is 4, the effective address encoded is not `[EBP+index]'
+           as the above rules would suggest, but instead `[disp32+index]':
+           the displacement field is present and is four bytes long, and
+           there is no base register (but the index register is still
+           processed in the normal way).
+
+   A.3 Key to Instruction Flags
+
+       Given along with each instruction in this appendix is a set of
+       flags, denoting the type of the instruction. The types are as
+       follows:
+
+       (*) `8086', `186', `286', `386', `486', `PENT' and `P6' denote the
+           lowest processor type that supports the instruction. Most
+           instructions run on all processors above the given type; those
+           that do not are documented. The Pentium II contains no
+           additional instructions beyond the P6 (Pentium Pro); from the
+           point of view of its instruction set, it can be thought of as a
+           P6 with MMX capability.
+
+       (*) `CYRIX' indicates that the instruction is specific to Cyrix
+           processors, for example the extra MMX instructions in the Cyrix
+           extended MMX instruction set.
+
+       (*) `FPU' indicates that the instruction is a floating-point one,
+           and will only run on machines with a coprocessor (automatically
+           including 486DX, Pentium and above).
+
+       (*) `MMX' indicates that the instruction is an MMX one, and will run
+           on MMX-capable Pentium processors and the Pentium II.
+
+       (*) `PRIV' indicates that the instruction is a protected-mode
+           management instruction. Many of these may only be used in
+           protected mode, or only at privilege level zero.
+
+       (*) `UNDOC' indicates that the instruction is an undocumented one,
+           and not part of the official Intel Architecture; it may or may
+           not be supported on any given machine.
+
+   A.4 `AAA', `AAS', `AAM', `AAD': ASCII Adjustments
+
+       AAA                           ; 37                   [8086]
+
+       AAS                           ; 3F                   [8086]
+
+       AAD                           ; D5 0A                [8086] 
+       AAD imm                       ; D5 ib                [8086]
+
+       AAM                           ; D4 0A                [8086] 
+       AAM imm                       ; D4 ib                [8086]
+
+       These instructions are used in conjunction with the add, subtract,
+       multiply and divide instructions to perform binary-coded decimal
+       arithmetic in _unpacked_ (one BCD digit per byte - easy to translate
+       to and from ASCII, hence the instruction names) form. There are also
+       packed BCD instructions `DAA' and `DAS': see section A.23.
+
+       `AAA' should be used after a one-byte `ADD' instruction whose
+       destination was the `AL' register: by means of examining the value
+       in the low nibble of `AL' and also the auxiliary carry flag `AF', it
+       determines whether the addition has overflowed, and adjusts it (and
+       sets the carry flag) if so. You can add long BCD strings together by
+       doing `ADD'/`AAA' on the low digits, then doing `ADC'/`AAA' on each
+       subsequent digit.
+
+       `AAS' works similarly to `AAA', but is for use after `SUB'
+       instructions rather than `ADD'.
+
+       `AAM' is for use after you have multiplied two decimal digits
+       together and left the result in `AL': it divides `AL' by ten and
+       stores the quotient in `AH', leaving the remainder in `AL'. The
+       divisor 10 can be changed by specifying an operand to the
+       instruction: a particularly handy use of this is `AAM 16', causing
+       the two nibbles in `AL' to be separated into `AH' and `AL'.
+
+       `AAD' performs the inverse operation to `AAM': it multiplies `AH' by
+       ten, adds it to `AL', and sets `AH' to zero. Again, the multiplier
+       10 can be changed.
+
+   A.5 `ADC': Add with Carry
+
+       ADC r/m8,reg8                 ; 10 /r                [8086] 
+       ADC r/m16,reg16               ; o16 11 /r            [8086] 
+       ADC r/m32,reg32               ; o32 11 /r            [386]
+
+       ADC reg8,r/m8                 ; 12 /r                [8086] 
+       ADC reg16,r/m16               ; o16 13 /r            [8086] 
+       ADC reg32,r/m32               ; o32 13 /r            [386]
+
+       ADC r/m8,imm8                 ; 80 /2 ib             [8086] 
+       ADC r/m16,imm16               ; o16 81 /2 iw         [8086] 
+       ADC r/m32,imm32               ; o32 81 /2 id         [386]
+
+       ADC r/m16,imm8                ; o16 83 /2 ib         [8086] 
+       ADC r/m32,imm8                ; o32 83 /2 ib         [386]
+
+       ADC AL,imm8                   ; 14 ib                [8086] 
+       ADC AX,imm16                  ; o16 15 iw            [8086] 
+       ADC EAX,imm32                 ; o32 15 id            [386]
+
+       `ADC' performs integer addition: it adds its two operands together,
+       plus the value of the carry flag, and leaves the result in its
+       destination (first) operand. The flags are set according to the
+       result of the operation: in particular, the carry flag is affected
+       and can be used by a subsequent `ADC' instruction.
+
+       In the forms with an 8-bit immediate second operand and a longer
+       first operand, the second operand is considered to be signed, and is
+       sign-extended to the length of the first operand. In these cases,
+       the `BYTE' qualifier is necessary to force NASM to generate this
+       form of the instruction.
+
+       To add two numbers without also adding the contents of the carry
+       flag, use `ADD' (section A.6).
+
+   A.6 `ADD': Add Integers
+
+       ADD r/m8,reg8                 ; 00 /r                [8086] 
+       ADD r/m16,reg16               ; o16 01 /r            [8086] 
+       ADD r/m32,reg32               ; o32 01 /r            [386]
+
+       ADD reg8,r/m8                 ; 02 /r                [8086] 
+       ADD reg16,r/m16               ; o16 03 /r            [8086] 
+       ADD reg32,r/m32               ; o32 03 /r            [386]
+
+       ADD r/m8,imm8                 ; 80 /0 ib             [8086] 
+       ADD r/m16,imm16               ; o16 81 /0 iw         [8086] 
+       ADD r/m32,imm32               ; o32 81 /0 id         [386]
+
+       ADD r/m16,imm8                ; o16 83 /0 ib         [8086] 
+       ADD r/m32,imm8                ; o32 83 /0 ib         [386]
+
+       ADD AL,imm8                   ; 04 ib                [8086] 
+       ADD AX,imm16                  ; o16 05 iw            [8086] 
+       ADD EAX,imm32                 ; o32 05 id            [386]
+
+       `ADD' performs integer addition: it adds its two operands together,
+       and leaves the result in its destination (first) operand. The flags
+       are set according to the result of the operation: in particular, the
+       carry flag is affected and can be used by a subsequent `ADC'
+       instruction (section A.5).
+
+       In the forms with an 8-bit immediate second operand and a longer
+       first operand, the second operand is considered to be signed, and is
+       sign-extended to the length of the first operand. In these cases,
+       the `BYTE' qualifier is necessary to force NASM to generate this
+       form of the instruction.
+
+   A.7 `AND': Bitwise AND
+
+       AND r/m8,reg8                 ; 20 /r                [8086] 
+       AND r/m16,reg16               ; o16 21 /r            [8086] 
+       AND r/m32,reg32               ; o32 21 /r            [386]
+
+       AND reg8,r/m8                 ; 22 /r                [8086] 
+       AND reg16,r/m16               ; o16 23 /r            [8086] 
+       AND reg32,r/m32               ; o32 23 /r            [386]
+
+       AND r/m8,imm8                 ; 80 /4 ib             [8086] 
+       AND r/m16,imm16               ; o16 81 /4 iw         [8086] 
+       AND r/m32,imm32               ; o32 81 /4 id         [386]
+
+       AND r/m16,imm8                ; o16 83 /4 ib         [8086] 
+       AND r/m32,imm8                ; o32 83 /4 ib         [386]
+
+       AND AL,imm8                   ; 24 ib                [8086] 
+       AND AX,imm16                  ; o16 25 iw            [8086] 
+       AND EAX,imm32                 ; o32 25 id            [386]
+
+       `AND' performs a bitwise AND operation between its two operands
+       (i.e. each bit of the result is 1 if and only if the corresponding
+       bits of the two inputs were both 1), and stores the result in the
+       destination (first) operand.
+
+       In the forms with an 8-bit immediate second operand and a longer
+       first operand, the second operand is considered to be signed, and is
+       sign-extended to the length of the first operand. In these cases,
+       the `BYTE' qualifier is necessary to force NASM to generate this
+       form of the instruction.
+
+       The MMX instruction `PAND' (see section A.116) performs the same
+       operation on the 64-bit MMX registers.
+
+   A.8 `ARPL': Adjust RPL Field of Selector
+
+       ARPL r/m16,reg16              ; 63 /r                [286,PRIV]
+
+       `ARPL' expects its two word operands to be segment selectors. It
+       adjusts the RPL (requested privilege level - stored in the bottom
+       two bits of the selector) field of the destination (first) operand
+       to ensure that it is no less (i.e. no more privileged than) the RPL
+       field of the source operand. The zero flag is set if and only if a
+       change had to be made.
+
+   A.9 `BOUND': Check Array Index against Bounds
+
+       BOUND reg16,mem               ; o16 62 /r            [186] 
+       BOUND reg32,mem               ; o32 62 /r            [386]
+
+       `BOUND' expects its second operand to point to an area of memory
+       containing two signed values of the same size as its first operand
+       (i.e. two words for the 16-bit form; two doublewords for the 32-bit
+       form). It performs two signed comparisons: if the value in the
+       register passed as its first operand is less than the first of the
+       in-memory values, or is greater than or equal to the second, it
+       throws a BR exception. Otherwise, it does nothing.
+
+  A.10 `BSF', `BSR': Bit Scan
+
+       BSF reg16,r/m16               ; o16 0F BC /r         [386] 
+       BSF reg32,r/m32               ; o32 0F BC /r         [386]
+
+       BSR reg16,r/m16               ; o16 0F BD /r         [386] 
+       BSR reg32,r/m32               ; o32 0F BD /r         [386]
+
+       `BSF' searches for a set bit in its source (second) operand,
+       starting from the bottom, and if it finds one, stores the index in
+       its destination (first) operand. If no set bit is found, the
+       contents of the destination operand are undefined.
+
+       `BSR' performs the same function, but searches from the top instead,
+       so it finds the most significant set bit.
+
+       Bit indices are from 0 (least significant) to 15 or 31 (most
+       significant).
+
+  A.11 `BSWAP': Byte Swap
+
+       BSWAP reg32                   ; o32 0F C8+r          [486]
+
+       `BSWAP' swaps the order of the four bytes of a 32-bit register: bits
+       0-7 exchange places with bits 24-31, and bits 8-15 swap with bits
+       16-23. There is no explicit 16-bit equivalent: to byte-swap `AX',
+       `BX', `CX' or `DX', `XCHG' can be used.
+
+  A.12 `BT', `BTC', `BTR', `BTS': Bit Test
+
+       BT r/m16,reg16                ; o16 0F A3 /r         [386] 
+       BT r/m32,reg32                ; o32 0F A3 /r         [386] 
+       BT r/m16,imm8                 ; o16 0F BA /4 ib      [386] 
+       BT r/m32,imm8                 ; o32 0F BA /4 ib      [386]
+
+       BTC r/m16,reg16               ; o16 0F BB /r         [386] 
+       BTC r/m32,reg32               ; o32 0F BB /r         [386] 
+       BTC r/m16,imm8                ; o16 0F BA /7 ib      [386] 
+       BTC r/m32,imm8                ; o32 0F BA /7 ib      [386]
+
+       BTR r/m16,reg16               ; o16 0F B3 /r         [386] 
+       BTR r/m32,reg32               ; o32 0F B3 /r         [386] 
+       BTR r/m16,imm8                ; o16 0F BA /6 ib      [386] 
+       BTR r/m32,imm8                ; o32 0F BA /6 ib      [386]
+
+       BTS r/m16,reg16               ; o16 0F AB /r         [386] 
+       BTS r/m32,reg32               ; o32 0F AB /r         [386] 
+       BTS r/m16,imm                 ; o16 0F BA /5 ib      [386] 
+       BTS r/m32,imm                 ; o32 0F BA /5 ib      [386]
+
+       These instructions all test one bit of their first operand, whose
+       index is given by the second operand, and store the value of that
+       bit into the carry flag. Bit indices are from 0 (least significant)
+       to 15 or 31 (most significant).
+
+       In addition to storing the original value of the bit into the carry
+       flag, `BTR' also resets (clears) the bit in the operand itself.
+       `BTS' sets the bit, and `BTC' complements the bit. `BT' does not
+       modify its operands.
+
+       The bit offset should be no greater than the size of the operand.
+
+  A.13 `CALL': Call Subroutine
+
+       CALL imm                      ; E8 rw/rd             [8086] 
+       CALL imm:imm16                ; o16 9A iw iw         [8086] 
+       CALL imm:imm32                ; o32 9A id iw         [386] 
+       CALL FAR mem16                ; o16 FF /3            [8086] 
+       CALL FAR mem32                ; o32 FF /3            [386] 
+       CALL r/m16                    ; o16 FF /2            [8086] 
+       CALL r/m32                    ; o32 FF /2            [386]
+
+       `CALL' calls a subroutine, by means of pushing the current
+       instruction pointer (`IP') and optionally `CS' as well on the stack,
+       and then jumping to a given address.
+
+       `CS' is pushed as well as `IP' if and only if the call is a far
+       call, i.e. a destination segment address is specified in the
+       instruction. The forms involving two colon-separated arguments are
+       far calls; so are the `CALL FAR mem' forms.
+
+       You can choose between the two immediate far call forms
+       (`CALL imm:imm') by the use of the `WORD' and `DWORD' keywords:
+       `CALL WORD 0x1234:0x5678') or `CALL DWORD 0x1234:0x56789abc'.
+
+       The `CALL FAR mem' forms execute a far call by loading the
+       destination address out of memory. The address loaded consists of 16
+       or 32 bits of offset (depending on the operand size), and 16 bits of
+       segment. The operand size may be overridden using
+       `CALL WORD FAR mem' or `CALL DWORD FAR mem'.
+
+       The `CALL r/m' forms execute a near call (within the same segment),
+       loading the destination address out of memory or out of a register.
+       The keyword `NEAR' may be specified, for clarity, in these forms,
+       but is not necessary. Again, operand size can be overridden using
+       `CALL WORD mem' or `CALL DWORD mem'.
+
+       As a convenience, NASM does not require you to call a far procedure
+       symbol by coding the cumbersome `CALL SEG routine:routine', but
+       instead allows the easier synonym `CALL FAR routine'.
+
+       The `CALL r/m' forms given above are near calls; NASM will accept
+       the `NEAR' keyword (e.g. `CALL NEAR [address]'), even though it is
+       not strictly necessary.
+
+  A.14 `CBW', `CWD', `CDQ', `CWDE': Sign Extensions
+
+       CBW                           ; o16 98               [8086] 
+       CWD                           ; o16 99               [8086] 
+       CDQ                           ; o32 99               [386] 
+       CWDE                          ; o32 98               [386]
+
+       All these instructions sign-extend a short value into a longer one,
+       by replicating the top bit of the original value to fill the
+       extended one.
+
+       `CBW' extends `AL' into `AX' by repeating the top bit of `AL' in
+       every bit of `AH'. `CWD' extends `AX' into `DX:AX' by repeating the
+       top bit of `AX' throughout `DX'. `CWDE' extends `AX' into `EAX', and
+       `CDQ' extends `EAX' into `EDX:EAX'.
+
+  A.15 `CLC', `CLD', `CLI', `CLTS': Clear Flags
+
+       CLC                           ; F8                   [8086] 
+       CLD                           ; FC                   [8086] 
+       CLI                           ; FA                   [8086] 
+       CLTS                          ; 0F 06                [286,PRIV]
+
+       These instructions clear various flags. `CLC' clears the carry flag;
+       `CLD' clears the direction flag; `CLI' clears the interrupt flag
+       (thus disabling interrupts); and `CLTS' clears the task-switched
+       (`TS') flag in `CR0'.
+
+       To set the carry, direction, or interrupt flags, use the `STC',
+       `STD' and `STI' instructions (section A.156). To invert the carry
+       flag, use `CMC' (section A.16).
+
+  A.16 `CMC': Complement Carry Flag
+
+       CMC                           ; F5                   [8086]
+
+       `CMC' changes the value of the carry flag: if it was 0, it sets it
+       to 1, and vice versa.
+
+  A.17 `CMOVcc': Conditional Move
+
+       CMOVcc reg16,r/m16            ; o16 0F 40+cc /r      [P6] 
+       CMOVcc reg32,r/m32            ; o32 0F 40+cc /r      [P6]
+
+       `CMOV' moves its source (second) operand into its destination
+       (first) operand if the given condition code is satisfied; otherwise
+       it does nothing.
+
+       For a list of condition codes, see section A.2.2.
+
+       Although the `CMOV' instructions are flagged `P6' above, they may
+       not be supported by all Pentium Pro processors; the `CPUID'
+       instruction (section A.22) will return a bit which indicates whether
+       conditional moves are supported.
+
+  A.18 `CMP': Compare Integers
+
+       CMP r/m8,reg8                 ; 38 /r                [8086] 
+       CMP r/m16,reg16               ; o16 39 /r            [8086] 
+       CMP r/m32,reg32               ; o32 39 /r            [386]
+
+       CMP reg8,r/m8                 ; 3A /r                [8086] 
+       CMP reg16,r/m16               ; o16 3B /r            [8086] 
+       CMP reg32,r/m32               ; o32 3B /r            [386]
+
+       CMP r/m8,imm8                 ; 80 /0 ib             [8086] 
+       CMP r/m16,imm16               ; o16 81 /0 iw         [8086] 
+       CMP r/m32,imm32               ; o32 81 /0 id         [386]
+
+       CMP r/m16,imm8                ; o16 83 /0 ib         [8086] 
+       CMP r/m32,imm8                ; o32 83 /0 ib         [386]
+
+       CMP AL,imm8                   ; 3C ib                [8086] 
+       CMP AX,imm16                  ; o16 3D iw            [8086] 
+       CMP EAX,imm32                 ; o32 3D id            [386]
+
+       `CMP' performs a `mental' subtraction of its second operand from its
+       first operand, and affects the flags as if the subtraction had taken
+       place, but does not store the result of the subtraction anywhere.
+
+       In the forms with an 8-bit immediate second operand and a longer
+       first operand, the second operand is considered to be signed, and is
+       sign-extended to the length of the first operand. In these cases,
+       the `BYTE' qualifier is necessary to force NASM to generate this
+       form of the instruction.
+
+  A.19 `CMPSB', `CMPSW', `CMPSD': Compare Strings
+
+       CMPSB                         ; A6                   [8086] 
+       CMPSW                         ; o16 A7               [8086] 
+       CMPSD                         ; o32 A7               [386]
+
+       `CMPSB' compares the byte at `[DS:SI]' or `[DS:ESI]' with the byte
+       at `[ES:DI]' or `[ES:EDI]', and sets the flags accordingly. It then
+       increments or decrements (depending on the direction flag:
+       increments if the flag is clear, decrements if it is set) `SI' and
+       `DI' (or `ESI' and `EDI').
+
+       The registers used are `SI' and `DI' if the address size is 16 bits,
+       and `ESI' and `EDI' if it is 32 bits. If you need to use an address
+       size not equal to the current `BITS' setting, you can use an
+       explicit `a16' or `a32' prefix.
+
+       The segment register used to load from `[SI]' or `[ESI]' can be
+       overridden by using a segment register name as a prefix (for
+       example, `es cmpsb'). The use of `ES' for the load from `[DI]' or
+       `[EDI]' cannot be overridden.
+
+       `CMPSW' and `CMPSD' work in the same way, but they compare a word or
+       a doubleword instead of a byte, and increment or decrement the
+       addressing registers by 2 or 4 instead of 1.
+
+       The `REPE' and `REPNE' prefixes (equivalently, `REPZ' and `REPNZ')
+       may be used to repeat the instruction up to `CX' (or `ECX' - again,
+       the address size chooses which) times until the first unequal or
+       equal byte is found.
+
+  A.20 `CMPXCHG', `CMPXCHG486': Compare and Exchange
+
+       CMPXCHG r/m8,reg8             ; 0F B0 /r             [PENT] 
+       CMPXCHG r/m16,reg16           ; o16 0F B1 /r         [PENT] 
+       CMPXCHG r/m32,reg32           ; o32 0F B1 /r         [PENT]
+
+       CMPXCHG486 r/m8,reg8          ; 0F A6 /r             [486,UNDOC] 
+       CMPXCHG486 r/m16,reg16        ; o16 0F A7 /r         [486,UNDOC] 
+       CMPXCHG486 r/m32,reg32        ; o32 0F A7 /r         [486,UNDOC]
+
+       These two instructions perform exactly the same operation; however,
+       apparently some (not all) 486 processors support it under a non-
+       standard opcode, so NASM provides the undocumented `CMPXCHG486' form
+       to generate the non-standard opcode.
+
+       `CMPXCHG' compares its destination (first) operand to the value in
+       `AL', `AX' or `EAX' (depending on the size of the instruction). If
+       they are equal, it copies its source (second) operand into the
+       destination and sets the zero flag. Otherwise, it clears the zero
+       flag and leaves the destination alone.
+
+       `CMPXCHG' is intended to be used for atomic operations in
+       multitasking or multiprocessor environments. To safely update a
+       value in shared memory, for example, you might load the value into
+       `EAX', load the updated value into `EBX', and then execute the
+       instruction `lock cmpxchg [value],ebx'. If `value' has not changed
+       since being loaded, it is updated with your desired new value, and
+       the zero flag is set to let you know it has worked. (The `LOCK'
+       prefix prevents another processor doing anything in the middle of
+       this operation: it guarantees atomicity.) However, if another
+       processor has modified the value in between your load and your
+       attempted store, the store does not happen, and you are notified of
+       the failure by a cleared zero flag, so you can go round and try
+       again.
+
+  A.21 `CMPXCHG8B': Compare and Exchange Eight Bytes
+
+       CMPXCHG8B mem                 ; 0F C7 /1             [PENT]
+
+       This is a larger and more unwieldy version of `CMPXCHG': it compares
+       the 64-bit (eight-byte) value stored at `[mem]' with the value in
+       `EDX:EAX'. If they are equal, it sets the zero flag and stores
+       `ECX:EBX' into the memory area. If they are unequal, it clears the
+       zero flag and leaves the memory area untouched.
+
+  A.22 `CPUID': Get CPU Identification Code
+
+       CPUID                         ; 0F A2                [PENT]
+
+       `CPUID' returns various information about the processor it is being
+       executed on. It fills the four registers `EAX', `EBX', `ECX' and
+       `EDX' with information, which varies depending on the input contents
+       of `EAX'.
+
+       `CPUID' also acts as a barrier to serialise instruction execution:
+       executing the `CPUID' instruction guarantees that all the effects
+       (memory modification, flag modification, register modification) of
+       previous instructions have been completed before the next
+       instruction gets fetched.
+
+       The information returned is as follows:
+
+       (*) If `EAX' is zero on input, `EAX' on output holds the maximum
+           acceptable input value of `EAX', and `EBX:EDX:ECX' contain the
+           string `"GenuineIntel"' (or not, if you have a clone processor).
+           That is to say, `EBX' contains `"Genu"' (in NASM's own sense of
+           character constants, described in section 3.4.2), `EDX' contains
+           `"ineI"' and `ECX' contains `"ntel"'.
+
+       (*) If `EAX' is one on input, `EAX' on output contains version
+           information about the processor, and `EDX' contains a set of
+           feature flags, showing the presence and absence of various
+           features. For example, bit 8 is set if the `CMPXCHG8B'
+           instruction (section A.21) is supported, bit 15 is set if the
+           conditional move instructions (section A.17 and section A.34)
+           are supported, and bit 23 is set if MMX instructions are
+           supported.
+
+       (*) If `EAX' is two on input, `EAX', `EBX', `ECX' and `EDX' all
+           contain information about caches and TLBs (Translation Lookahead
+           Buffers).
+
+       For more information on the data returned from `CPUID', see the
+       documentation on Intel's web site.
+
+  A.23 `DAA', `DAS': Decimal Adjustments
+
+       DAA                           ; 27                   [8086] 
+       DAS                           ; 2F                   [8086]
+
+       These instructions are used in conjunction with the add and subtract
+       instructions to perform binary-coded decimal arithmetic in _packed_
+       (one BCD digit per nibble) form. For the unpacked equivalents, see
+       section A.4.
+
+       `DAA' should be used after a one-byte `ADD' instruction whose
+       destination was the `AL' register: by means of examining the value
+       in the `AL' and also the auxiliary carry flag `AF', it determines
+       whether either digit of the addition has overflowed, and adjusts it
+       (and sets the carry and auxiliary-carry flags) if so. You can add
+       long BCD strings together by doing `ADD'/`DAA' on the low two
+       digits, then doing `ADC'/`DAA' on each subsequent pair of digits.
+
+       `DAS' works similarly to `DAA', but is for use after `SUB'
+       instructions rather than `ADD'.
+
+  A.24 `DEC': Decrement Integer
+
+       DEC reg16                     ; o16 48+r             [8086] 
+       DEC reg32                     ; o32 48+r             [386] 
+       DEC r/m8                      ; FE /1                [8086] 
+       DEC r/m16                     ; o16 FF /1            [8086] 
+       DEC r/m32                     ; o32 FF /1            [386]
+
+       `DEC' subtracts 1 from its operand. It does _not_ affect the carry
+       flag: to affect the carry flag, use `SUB something,1' (see section
+       A.159). See also `INC' (section A.79).
+
+  A.25 `DIV': Unsigned Integer Divide
+
+       DIV r/m8                      ; F6 /6                [8086] 
+       DIV r/m16                     ; o16 F7 /6            [8086] 
+       DIV r/m32                     ; o32 F7 /6            [386]
+
+       `DIV' performs unsigned integer division. The explicit operand
+       provided is the divisor; the dividend and destination operands are
+       implicit, in the following way:
+
+       (*) For `DIV r/m8', `AX' is divided by the given operand; the
+           quotient is stored in `AL' and the remainder in `AH'.
+
+       (*) For `DIV r/m16', `DX:AX' is divided by the given operand; the
+           quotient is stored in `AX' and the remainder in `DX'.
+
+       (*) For `DIV r/m32', `EDX:EAX' is divided by the given operand; the
+           quotient is stored in `EAX' and the remainder in `EDX'.
+
+       Signed integer division is performed by the `IDIV' instruction: see
+       section A.76.
+
+  A.26 `EMMS': Empty MMX State
+
+       EMMS                          ; 0F 77                [PENT,MMX]
+
+       `EMMS' sets the FPU tag word (marking which floating-point registers
+       are available) to all ones, meaning all registers are available for
+       the FPU to use. It should be used after executing MMX instructions
+       and before executing any subsequent floating-point operations.
+
+  A.27 `ENTER': Create Stack Frame
+
+       ENTER imm,imm                 ; C8 iw ib             [186]
+
+       `ENTER' constructs a stack frame for a high-level language procedure
+       call. The first operand (the `iw' in the opcode definition above
+       refers to the first operand) gives the amount of stack space to
+       allocate for local variables; the second (the `ib' above) gives the
+       nesting level of the procedure (for languages like Pascal, with
+       nested procedures).
+
+       The function of `ENTER', with a nesting level of zero, is equivalent
+       to
+
+                 PUSH EBP            ; or PUSH BP         in 16 bits 
+                 MOV EBP,ESP         ; or MOV BP,SP       in 16 bits 
+                 SUB ESP,operand1    ; or SUB SP,operand1 in 16 bits
+
+       This creates a stack frame with the procedure parameters accessible
+       upwards from `EBP', and local variables accessible downwards from
+       `EBP'.
+
+       With a nesting level of one, the stack frame created is 4 (or 2)
+       bytes bigger, and the value of the final frame pointer `EBP' is
+       accessible in memory at `[EBP-4]'.
+
+       This allows `ENTER', when called with a nesting level of two, to
+       look at the stack frame described by the _previous_ value of `EBP',
+       find the frame pointer at offset -4 from that, and push it along
+       with its new frame pointer, so that when a level-two procedure is
+       called from within a level-one procedure, `[EBP-4]' holds the frame
+       pointer of the most recent level-one procedure call and `[EBP-8]'
+       holds that of the most recent level-two call. And so on, for nesting
+       levels up to 31.
+
+       Stack frames created by `ENTER' can be destroyed by the `LEAVE'
+       instruction: see section A.94.
+
+  A.28 `F2XM1': Calculate 2**X-1
+
+       F2XM1                         ; D9 F0                [8086,FPU]
+
+       `F2XM1' raises 2 to the power of `ST0', subtracts one, and stores
+       the result back into `ST0'. The initial contents of `ST0' must be a
+       number in the range -1 to +1.
+
+  A.29 `FABS': Floating-Point Absolute Value
+
+       FABS                          ; D9 E1                [8086,FPU]
+
+       `FABS' computes the absolute value of `ST0', storing the result back
+       in `ST0'.
+
+  A.30 `FADD', `FADDP': Floating-Point Addition
+
+       FADD mem32                    ; D8 /0                [8086,FPU] 
+       FADD mem64                    ; DC /0                [8086,FPU]
+
+       FADD fpureg                   ; D8 C0+r              [8086,FPU] 
+       FADD ST0,fpureg               ; D8 C0+r              [8086,FPU]
+
+       FADD TO fpureg                ; DC C0+r              [8086,FPU] 
+       FADD fpureg,ST0               ; DC C0+r              [8086,FPU]
+
+       FADDP fpureg                  ; DE C0+r              [8086,FPU] 
+       FADDP fpureg,ST0              ; DE C0+r              [8086,FPU]
+
+       `FADD', given one operand, adds the operand to `ST0' and stores the
+       result back in `ST0'. If the operand has the `TO' modifier, the
+       result is stored in the register given rather than in `ST0'.
+
+       `FADDP' performs the same function as `FADD TO', but pops the
+       register stack after storing the result.
+
+       The given two-operand forms are synonyms for the one-operand forms.
+
+  A.31 `FBLD', `FBSTP': BCD Floating-Point Load and Store
+
+       FBLD mem80                    ; DF /4                [8086,FPU] 
+       FBSTP mem80                   ; DF /6                [8086,FPU]
+
+       `FBLD' loads an 80-bit (ten-byte) packed binary-coded decimal number
+       from the given memory address, converts it to a real, and pushes it
+       on the register stack. `FBSTP' stores the value of `ST0', in packed
+       BCD, at the given address and then pops the register stack.
+
+  A.32 `FCHS': Floating-Point Change Sign
+
+       FCHS                          ; D9 E0                [8086,FPU]
+
+       `FCHS' negates the number in `ST0': negative numbers become
+       positive, and vice versa.
+
+  A.33 `FCLEX', {FNCLEX}: Clear Floating-Point Exceptions
+
+       FCLEX                         ; 9B DB E2             [8086,FPU] 
+       FNCLEX                        ; DB E2                [8086,FPU]
+
+       `FCLEX' clears any floating-point exceptions which may be pending.
+       `FNCLEX' does the same thing but doesn't wait for previous floating-
+       point operations (including the _handling_ of pending exceptions) to
+       finish first.
+
+  A.34 `FCMOVcc': Floating-Point Conditional Move
+
+       FCMOVB fpureg                 ; DA C0+r              [P6,FPU] 
+       FCMOVB ST0,fpureg             ; DA C0+r              [P6,FPU]
+
+       FCMOVBE fpureg                ; DA D0+r              [P6,FPU] 
+       FCMOVBE ST0,fpureg            ; DA D0+r              [P6,FPU]
+
+       FCMOVE fpureg                 ; DA C8+r              [P6,FPU] 
+       FCMOVE ST0,fpureg             ; DA C8+r              [P6,FPU]
+
+       FCMOVNB fpureg                ; DB C0+r              [P6,FPU] 
+       FCMOVNB ST0,fpureg            ; DB C0+r              [P6,FPU]
+
+       FCMOVNBE fpureg               ; DB D0+r              [P6,FPU] 
+       FCMOVNBE ST0,fpureg           ; DB D0+r              [P6,FPU]
+
+       FCMOVNE fpureg                ; DB C8+r              [P6,FPU] 
+       FCMOVNE ST0,fpureg            ; DB C8+r              [P6,FPU]
+
+       FCMOVNU fpureg                ; DB D8+r              [P6,FPU] 
+       FCMOVNU ST0,fpureg            ; DB D8+r              [P6,FPU]
+
+       FCMOVU fpureg                 ; DA D8+r              [P6,FPU] 
+       FCMOVU ST0,fpureg             ; DA D8+r              [P6,FPU]
+
+       The `FCMOV' instructions perform conditional move operations: each
+       of them moves the contents of the given register into `ST0' if its
+       condition is satisfied, and does nothing if not.
+
+       The conditions are not the same as the standard condition codes used
+       with conditional jump instructions. The conditions `B', `BE', `NB',
+       `NBE', `E' and `NE' are exactly as normal, but none of the other
+       standard ones are supported. Instead, the condition `U' and its
+       counterpart `NU' are provided; the `U' condition is satisfied if the
+       last two floating-point numbers compared were _unordered_, i.e. they
+       were not equal but neither one could be said to be greater than the
+       other, for example if they were NaNs. (The flag state which signals
+       this is the setting of the parity flag: so the `U' condition is
+       notionally equivalent to `PE', and `NU' is equivalent to `PO'.)
+
+       The `FCMOV' conditions test the main processor's status flags, not
+       the FPU status flags, so using `FCMOV' directly after `FCOM' will
+       not work. Instead, you should either use `FCOMI' which writes
+       directly to the main CPU flags word, or use `FSTSW' to extract the
+       FPU flags.
+
+       Although the `FCMOV' instructions are flagged `P6' above, they may
+       not be supported by all Pentium Pro processors; the `CPUID'
+       instruction (section A.22) will return a bit which indicates whether
+       conditional moves are supported.
+
+  A.35 `FCOM', `FCOMP', `FCOMPP', `FCOMI', `FCOMIP': Floating-Point Compare
+
+       FCOM mem32                    ; D8 /2                [8086,FPU] 
+       FCOM mem64                    ; DC /2                [8086,FPU] 
+       FCOM fpureg                   ; D8 D0+r              [8086,FPU] 
+       FCOM ST0,fpureg               ; D8 D0+r              [8086,FPU]
+
+       FCOMP mem32                   ; D8 /3                [8086,FPU] 
+       FCOMP mem64                   ; DC /3                [8086,FPU] 
+       FCOMP fpureg                  ; D8 D8+r              [8086,FPU] 
+       FCOMP ST0,fpureg              ; D8 D8+r              [8086,FPU]
+
+       FCOMPP                        ; DE D9                [8086,FPU]
+
+       FCOMI fpureg                  ; DB F0+r              [P6,FPU] 
+       FCOMI ST0,fpureg              ; DB F0+r              [P6,FPU]
+
+       FCOMIP fpureg                 ; DF F0+r              [P6,FPU] 
+       FCOMIP ST0,fpureg             ; DF F0+r              [P6,FPU]
+
+       `FCOM' compares `ST0' with the given operand, and sets the FPU flags
+       accordingly. `ST0' is treated as the left-hand side of the
+       comparison, so that the carry flag is set (for a `less-than' result)
+       if `ST0' is less than the given operand.
+
+       `FCOMP' does the same as `FCOM', but pops the register stack
+       afterwards. `FCOMPP' compares `ST0' with `ST1' and then pops the
+       register stack twice.
+
+       `FCOMI' and `FCOMIP' work like the corresponding forms of `FCOM' and
+       `FCOMP', but write their results directly to the CPU flags register
+       rather than the FPU status word, so they can be immediately followed
+       by conditional jump or conditional move instructions.
+
+       The `FCOM' instructions differ from the `FUCOM' instructions
+       (section A.69) only in the way they handle quiet NaNs: `FUCOM' will
+       handle them silently and set the condition code flags to an
+       `unordered' result, whereas `FCOM' will generate an exception.
+
+  A.36 `FCOS': Cosine
+
+       FCOS                          ; D9 FF                [386,FPU]
+
+       `FCOS' computes the cosine of `ST0' (in radians), and stores the
+       result in `ST0'. See also `FSINCOS' (section A.61).
+
+  A.37 `FDECSTP': Decrement Floating-Point Stack Pointer
+
+       FDECSTP                       ; D9 F6                [8086,FPU]
+
+       `FDECSTP' decrements the `top' field in the floating-point status
+       word. This has the effect of rotating the FPU register stack by one,
+       as if the contents of `ST7' had been pushed on the stack. See also
+       `FINCSTP' (section A.46).
+
+  A.38 `FxDISI', `FxENI': Disable and Enable Floating-Point Interrupts
+
+       FDISI                         ; 9B DB E1             [8086,FPU] 
+       FNDISI                        ; DB E1                [8086,FPU]
+
+       FENI                          ; 9B DB E0             [8086,FPU] 
+       FNENI                         ; DB E0                [8086,FPU]
+
+       `FDISI' and `FENI' disable and enable floating-point interrupts.
+       These instructions are only meaningful on original 8087 processors:
+       the 287 and above treat them as no-operation instructions.
+
+       `FNDISI' and `FNENI' do the same thing as `FDISI' and `FENI'
+       respectively, but without waiting for the floating-point processor
+       to finish what it was doing first.
+
+  A.39 `FDIV', `FDIVP', `FDIVR', `FDIVRP': Floating-Point Division
+
+       FDIV mem32                    ; D8 /6                [8086,FPU] 
+       FDIV mem64                    ; DC /6                [8086,FPU]
+
+       FDIV fpureg                   ; D8 F0+r              [8086,FPU] 
+       FDIV ST0,fpureg               ; D8 F0+r              [8086,FPU]
+
+       FDIV TO fpureg                ; DC F8+r              [8086,FPU] 
+       FDIV fpureg,ST0               ; DC F8+r              [8086,FPU]
+
+       FDIVR mem32                   ; D8 /0                [8086,FPU] 
+       FDIVR mem64                   ; DC /0                [8086,FPU]
+
+       FDIVR fpureg                  ; D8 F8+r              [8086,FPU] 
+       FDIVR ST0,fpureg              ; D8 F8+r              [8086,FPU]
+
+       FDIVR TO fpureg               ; DC F0+r              [8086,FPU] 
+       FDIVR fpureg,ST0              ; DC F0+r              [8086,FPU]
+
+       FDIVP fpureg                  ; DE F8+r              [8086,FPU] 
+       FDIVP fpureg,ST0              ; DE F8+r              [8086,FPU]
+
+       FDIVRP fpureg                 ; DE F0+r              [8086,FPU] 
+       FDIVRP fpureg,ST0             ; DE F0+r              [8086,FPU]
+
+       `FDIV' divides `ST0' by the given operand and stores the result back
+       in `ST0', unless the `TO' qualifier is given, in which case it
+       divides the given operand by `ST0' and stores the result in the
+       operand.
+
+       `FDIVR' does the same thing, but does the division the other way up:
+       so if `TO' is not given, it divides the given operand by `ST0' and
+       stores the result in `ST0', whereas if `TO' is given it divides
+       `ST0' by its operand and stores the result in the operand.
+
+       `FDIVP' operates like `FDIV TO', but pops the register stack once it
+       has finished. `FDIVRP' operates like `FDIVR TO', but pops the
+       register stack once it has finished.
+
+  A.40 `FFREE': Flag Floating-Point Register as Unused
+
+       FFREE fpureg                  ; DD C0+r              [8086,FPU]
+
+       `FFREE' marks the given register as being empty.
+
+  A.41 `FIADD': Floating-Point/Integer Addition
+
+       FIADD mem16                   ; DE /0                [8086,FPU] 
+       FIADD mem32                   ; DA /0                [8086,FPU]
+
+       `FIADD' adds the 16-bit or 32-bit integer stored in the given memory
+       location to `ST0', storing the result in `ST0'.
+
+  A.42 `FICOM', `FICOMP': Floating-Point/Integer Compare
+
+       FICOM mem16                   ; DE /2                [8086,FPU] 
+       FICOM mem32                   ; DA /2                [8086,FPU]
+
+       FICOMP mem16                  ; DE /3                [8086,FPU] 
+       FICOMP mem32                  ; DA /3                [8086,FPU]
+
+       `FICOM' compares `ST0' with the 16-bit or 32-bit integer stored in
+       the given memory location, and sets the FPU flags accordingly.
+       `FICOMP' does the same, but pops the register stack afterwards.
+
+  A.43 `FIDIV', `FIDIVR': Floating-Point/Integer Division
+
+       FIDIV mem16                   ; DE /6                [8086,FPU] 
+       FIDIV mem32                   ; DA /6                [8086,FPU]
+
+       FIDIVR mem16                  ; DE /0                [8086,FPU] 
+       FIDIVR mem32                  ; DA /0                [8086,FPU]
+
+       `FIDIV' divides `ST0' by the 16-bit or 32-bit integer stored in the
+       given memory location, and stores the result in `ST0'. `FIDIVR' does
+       the division the other way up: it divides the integer by `ST0', but
+       still stores the result in `ST0'.
+
+  A.44 `FILD', `FIST', `FISTP': Floating-Point/Integer Conversion
+
+       FILD mem16                    ; DF /0                [8086,FPU] 
+       FILD mem32                    ; DB /0                [8086,FPU] 
+       FILD mem64                    ; DF /5                [8086,FPU]
+
+       FIST mem16                    ; DF /2                [8086,FPU] 
+       FIST mem32                    ; DB /2                [8086,FPU]
+
+       FISTP mem16                   ; DF /3                [8086,FPU] 
+       FISTP mem32                   ; DB /3                [8086,FPU] 
+       FISTP mem64                   ; DF /0                [8086,FPU]
+
+       `FILD' loads an integer out of a memory location, converts it to a
+       real, and pushes it on the FPU register stack. `FIST' converts `ST0'
+       to an integer and stores that in memory; `FISTP' does the same as
+       `FIST', but pops the register stack afterwards.
+
+  A.45 `FIMUL': Floating-Point/Integer Multiplication
+
+       FIMUL mem16                   ; DE /1                [8086,FPU] 
+       FIMUL mem32                   ; DA /1                [8086,FPU]
+
+       `FIMUL' multiplies `ST0' by the 16-bit or 32-bit integer stored in
+       the given memory location, and stores the result in `ST0'.
+
+  A.46 `FINCSTP': Increment Floating-Point Stack Pointer
+
+       FINCSTP                       ; D9 F7                [8086,FPU]
+
+       `FINCSTP' increments the `top' field in the floating-point status
+       word. This has the effect of rotating the FPU register stack by one,
+       as if the register stack had been popped; however, unlike the
+       popping of the stack performed by many FPU instructions, it does not
+       flag the new `ST7' (previously `ST0') as empty. See also `FDECSTP'
+       (section A.37).
+
+  A.47 `FINIT', `FNINIT': Initialise Floating-Point Unit
+
+       FINIT                         ; 9B DB E3             [8086,FPU] 
+       FNINIT                        ; DB E3                [8086,FPU]
+
+       `FINIT' initialises the FPU to its default state. It flags all
+       registers as empty, though it does not actually change their values.
+       `FNINIT' does the same, without first waiting for pending exceptions
+       to clear.
+
+  A.48 `FISUB': Floating-Point/Integer Subtraction
+
+       FISUB mem16                   ; DE /4                [8086,FPU] 
+       FISUB mem32                   ; DA /4                [8086,FPU]
+
+       FISUBR mem16                  ; DE /5                [8086,FPU] 
+       FISUBR mem32                  ; DA /5                [8086,FPU]
+
+       `FISUB' subtracts the 16-bit or 32-bit integer stored in the given
+       memory location from `ST0', and stores the result in `ST0'. `FISUBR'
+       does the subtraction the other way round, i.e. it subtracts `ST0'
+       from the given integer, but still stores the result in `ST0'.
+
+  A.49 `FLD': Floating-Point Load
+
+       FLD mem32                     ; D9 /0                [8086,FPU] 
+       FLD mem64                     ; DD /0                [8086,FPU] 
+       FLD mem80                     ; DB /5                [8086,FPU] 
+       FLD fpureg                    ; D9 C0+r              [8086,FPU]
+
+       `FLD' loads a floating-point value out of the given register or
+       memory location, and pushes it on the FPU register stack.
+
+  A.50 `FLDxx': Floating-Point Load Constants
+
+       FLD1                          ; D9 E8                [8086,FPU] 
+       FLDL2E                        ; D9 EA                [8086,FPU] 
+       FLDL2T                        ; D9 E9                [8086,FPU] 
+       FLDLG2                        ; D9 EC                [8086,FPU] 
+       FLDLN2                        ; D9 ED                [8086,FPU] 
+       FLDPI                         ; D9 EB                [8086,FPU] 
+       FLDZ                          ; D9 EE                [8086,FPU]
+
+       These instructions push specific standard constants on the FPU
+       register stack. `FLD1' pushes the value 1; `FLDL2E' pushes the base-
+       2 logarithm of e; `FLDL2T' pushes the base-2 log of 10; `FLDLG2'
+       pushes the base-10 log of 2; `FLDLN2' pushes the base-e log of 2;
+       `FLDPI' pushes pi; and `FLDZ' pushes zero.
+
+  A.51 `FLDCW': Load Floating-Point Control Word
+
+       FLDCW mem16                   ; D9 /5                [8086,FPU]
+
+       `FLDCW' loads a 16-bit value out of memory and stores it into the
+       FPU control word (governing things like the rounding mode, the
+       precision, and the exception masks). See also `FSTCW' (section
+       A.64).
+
+  A.52 `FLDENV': Load Floating-Point Environment
+
+       FLDENV mem                    ; D9 /4                [8086,FPU]
+
+       `FLDENV' loads the FPU operating environment (control word, status
+       word, tag word, instruction pointer, data pointer and last opcode)
+       from memory. The memory area is 14 or 28 bytes long, depending on
+       the CPU mode at the time. See also `FSTENV' (section A.65).
+
+  A.53 `FMUL', `FMULP': Floating-Point Multiply
+
+       FMUL mem32                    ; D8 /1                [8086,FPU] 
+       FMUL mem64                    ; DC /1                [8086,FPU]
+
+       FMUL fpureg                   ; D8 C8+r              [8086,FPU] 
+       FMUL ST0,fpureg               ; D8 C8+r              [8086,FPU]
+
+       FMUL TO fpureg                ; DC C8+r              [8086,FPU] 
+       FMUL fpureg,ST0               ; DC C8+r              [8086,FPU]
+
+       FMULP fpureg                  ; DE C8+r              [8086,FPU] 
+       FMULP fpureg,ST0              ; DE C8+r              [8086,FPU]
+
+       `FMUL' multiplies `ST0' by the given operand, and stores the result
+       in `ST0', unless the `TO' qualifier is used in which case it stores
+       the result in the operand. `FMULP' performs the same operation as
+       `FMUL TO', and then pops the register stack.
+
+  A.54 `FNOP': Floating-Point No Operation
+
+       FNOP                          ; D9 D0                [8086,FPU]
+
+       `FNOP' does nothing.
+
+  A.55 `FPATAN', `FPTAN': Arctangent and Tangent
+
+       FPATAN                        ; D9 F3                [8086,FPU] 
+       FPTAN                         ; D9 F2                [8086,FPU]
+
+       `FPATAN' computes the arctangent, in radians, of the result of
+       dividing `ST1' by `ST0', stores the result in `ST1', and pops the
+       register stack. It works like the C `atan2' function, in that
+       changing the sign of both `ST0' and `ST1' changes the output value
+       by pi (so it performs true rectangular-to-polar coordinate
+       conversion, with `ST1' being the Y coordinate and `ST0' being the X
+       coordinate, not merely an arctangent).
+
+       `FPTAN' computes the tangent of the value in `ST0' (in radians), and
+       stores the result back into `ST0'.
+
+  A.56 `FPREM', `FPREM1': Floating-Point Partial Remainder
+
+       FPREM                         ; D9 F8                [8086,FPU] 
+       FPREM1                        ; D9 F5                [386,FPU]
+
+       These instructions both produce the remainder obtained by dividing
+       `ST0' by `ST1'. This is calculated, notionally, by dividing `ST0' by
+       `ST1', rounding the result to an integer, multiplying by `ST1'
+       again, and computing the value which would need to be added back on
+       to the result to get back to the original value in `ST0'.
+
+       The two instructions differ in the way the notional round-to-integer
+       operation is performed. `FPREM' does it by rounding towards zero, so
+       that the remainder it returns always has the same sign as the
+       original value in `ST0'; `FPREM1' does it by rounding to the nearest
+       integer, so that the remainder always has at most half the magnitude
+       of `ST1'.
+
+       Both instructions calculate _partial_ remainders, meaning that they
+       may not manage to provide the final result, but might leave
+       intermediate results in `ST0' instead. If this happens, they will
+       set the C2 flag in the FPU status word; therefore, to calculate a
+       remainder, you should repeatedly execute `FPREM' or `FPREM1' until
+       C2 becomes clear.
+
+  A.57 `FRNDINT': Floating-Point Round to Integer
+
+       FRNDINT                       ; D9 FC                [8086,FPU]
+
+       `FRNDINT' rounds the contents of `ST0' to an integer, according to
+       the current rounding mode set in the FPU control word, and stores
+       the result back in `ST0'.
+
+  A.58 `FSAVE', `FRSTOR': Save/Restore Floating-Point State
+
+       FSAVE mem                     ; 9B DD /6             [8086,FPU] 
+       FNSAVE mem                    ; DD /6                [8086,FPU]
+
+       FRSTOR mem                    ; DD /4                [8086,FPU]
+
+       `FSAVE' saves the entire floating-point unit state, including all
+       the information saved by `FSTENV' (section A.65) plus the contents
+       of all the registers, to a 94 or 108 byte area of memory (depending
+       on the CPU mode). `FRSTOR' restores the floating-point state from
+       the same area of memory.
+
+       `FNSAVE' does the same as `FSAVE', without first waiting for pending
+       floating-point exceptions to clear.
+
+  A.59 `FSCALE': Scale Floating-Point Value by Power of Two
+
+       FSCALE                        ; D9 FD                [8086,FPU]
+
+       `FSCALE' scales a number by a power of two: it rounds `ST1' towards
+       zero to obtain an integer, then multiplies `ST0' by two to the power
+       of that integer, and stores the result in `ST0'.
+
+  A.60 `FSETPM': Set Protected Mode
+
+       FSETPM                        ; DB E4                [286,FPU]
+
+       This instruction initalises protected mode on the 287 floating-point
+       coprocessor. It is only meaningful on that processor: the 387 and
+       above treat the instruction as a no-operation.
+
+  A.61 `FSIN', `FSINCOS': Sine and Cosine
+
+       FSIN                          ; D9 FE                [386,FPU] 
+       FSINCOS                       ; D9 FB                [386,FPU]
+
+       `FSIN' calculates the sine of `ST0' (in radians) and stores the
+       result in `ST0'. `FSINCOS' does the same, but then pushes the cosine
+       of the same value on the register stack, so that the sine ends up in
+       `ST1' and the cosine in `ST0'. `FSINCOS' is faster than executing
+       `FSIN' and `FCOS' (see section A.36) in succession.
+
+  A.62 `FSQRT': Floating-Point Square Root
+
+       FSQRT                         ; D9 FA                [8086,FPU]
+
+       `FSQRT' calculates the square root of `ST0' and stores the result in
+       `ST0'.
+
+  A.63 `FST', `FSTP': Floating-Point Store
+
+       FST mem32                     ; D9 /2                [8086,FPU] 
+       FST mem64                     ; DD /2                [8086,FPU] 
+       FST fpureg                    ; DD D0+r              [8086,FPU]
+
+       FSTP mem32                    ; D9 /3                [8086,FPU] 
+       FSTP mem64                    ; DD /3                [8086,FPU] 
+       FSTP mem80                    ; DB /0                [8086,FPU] 
+       FSTP fpureg                   ; DD D8+r              [8086,FPU]
+
+       `FST' stores the value in `ST0' into the given memory location or
+       other FPU register. `FSTP' does the same, but then pops the register
+       stack.
+
+  A.64 `FSTCW': Store Floating-Point Control Word
+
+       FSTCW mem16                   ; 9B D9 /0             [8086,FPU] 
+       FNSTCW mem16                  ; D9 /0                [8086,FPU]
+
+       `FSTCW' stores the FPU control word (governing things like the
+       rounding mode, the precision, and the exception masks) into a 2-byte
+       memory area. See also `FLDCW' (section A.51).
+
+       `FNSTCW' does the same thing as `FSTCW', without first waiting for
+       pending floating-point exceptions to clear.
+
+  A.65 `FSTENV': Store Floating-Point Environment
+
+       FSTENV mem                    ; 9B D9 /6             [8086,FPU] 
+       FNSTENV mem                   ; D9 /6                [8086,FPU]
+
+       `FSTENV' stores the FPU operating environment (control word, status
+       word, tag word, instruction pointer, data pointer and last opcode)
+       into memory. The memory area is 14 or 28 bytes long, depending on
+       the CPU mode at the time. See also `FLDENV' (section A.52).
+
+       `FNSTENV' does the same thing as `FSTENV', without first waiting for
+       pending floating-point exceptions to clear.
+
+  A.66 `FSTSW': Store Floating-Point Status Word
+
+       FSTSW mem16                   ; 9B DD /0             [8086,FPU] 
+       FSTSW AX                      ; 9B DF E0             [286,FPU]
+
+       FNSTSW mem16                  ; DD /0                [8086,FPU] 
+       FNSTSW AX                     ; DF E0                [286,FPU]
+
+       `FSTSW' stores the FPU status word into `AX' or into a 2-byte memory
+       area.
+
+       `FNSTSW' does the same thing as `FSTSW', without first waiting for
+       pending floating-point exceptions to clear.
+
+  A.67 `FSUB', `FSUBP', `FSUBR', `FSUBRP': Floating-Point Subtract
+
+       FSUB mem32                    ; D8 /4                [8086,FPU] 
+       FSUB mem64                    ; DC /4                [8086,FPU]
+
+       FSUB fpureg                   ; D8 E0+r              [8086,FPU] 
+       FSUB ST0,fpureg               ; D8 E0+r              [8086,FPU]
+
+       FSUB TO fpureg                ; DC E8+r              [8086,FPU] 
+       FSUB fpureg,ST0               ; DC E8+r              [8086,FPU]
+
+       FSUBR mem32                   ; D8 /5                [8086,FPU] 
+       FSUBR mem64                   ; DC /5                [8086,FPU]
+
+       FSUBR fpureg                  ; D8 E8+r              [8086,FPU] 
+       FSUBR ST0,fpureg              ; D8 E8+r              [8086,FPU]
+
+       FSUBR TO fpureg               ; DC E0+r              [8086,FPU] 
+       FSUBR fpureg,ST0              ; DC E0+r              [8086,FPU]
+
+       FSUBP fpureg                  ; DE E8+r              [8086,FPU] 
+       FSUBP fpureg,ST0              ; DE E8+r              [8086,FPU]
+
+       FSUBRP fpureg                 ; DE E0+r              [8086,FPU] 
+       FSUBRP fpureg,ST0             ; DE E0+r              [8086,FPU]
+
+       `FSUB' subtracts the given operand from `ST0' and stores the result
+       back in `ST0', unless the `TO' qualifier is given, in which case it
+       subtracts `ST0' from the given operand and stores the result in the
+       operand.
+
+       `FSUBR' does the same thing, but does the subtraction the other way
+       up: so if `TO' is not given, it subtracts `ST0' from the given
+       operand and stores the result in `ST0', whereas if `TO' is given it
+       subtracts its operand from `ST0' and stores the result in the
+       operand.
+
+       `FSUBP' operates like `FSUB TO', but pops the register stack once it
+       has finished. `FSUBRP' operates like `FSUBR TO', but pops the
+       register stack once it has finished.
+
+  A.68 `FTST': Test `ST0' Against Zero
+
+       FTST                          ; D9 E4                [8086,FPU]
+
+       `FTST' compares `ST0' with zero and sets the FPU flags accordingly.
+       `ST0' is treated as the left-hand side of the comparison, so that a
+       `less-than' result is generated if `ST0' is negative.
+
+  A.69 `FUCOMxx': Floating-Point Unordered Compare
+
+       FUCOM fpureg                  ; DD E0+r              [386,FPU] 
+       FUCOM ST0,fpureg              ; DD E0+r              [386,FPU]
+
+       FUCOMP fpureg                 ; DD E8+r              [386,FPU] 
+       FUCOMP ST0,fpureg             ; DD E8+r              [386,FPU]
+
+       FUCOMPP                       ; DA E9                [386,FPU]
+
+       FUCOMI fpureg                 ; DB E8+r              [P6,FPU] 
+       FUCOMI ST0,fpureg             ; DB E8+r              [P6,FPU]
+
+       FUCOMIP fpureg                ; DF E8+r              [P6,FPU] 
+       FUCOMIP ST0,fpureg            ; DF E8+r              [P6,FPU]
+
+       `FUCOM' compares `ST0' with the given operand, and sets the FPU
+       flags accordingly. `ST0' is treated as the left-hand side of the
+       comparison, so that the carry flag is set (for a `less-than' result)
+       if `ST0' is less than the given operand.
+
+       `FUCOMP' does the same as `FUCOM', but pops the register stack
+       afterwards. `FUCOMPP' compares `ST0' with `ST1' and then pops the
+       register stack twice.
+
+       `FUCOMI' and `FUCOMIP' work like the corresponding forms of `FUCOM'
+       and `FUCOMP', but write their results directly to the CPU flags
+       register rather than the FPU status word, so they can be immediately
+       followed by conditional jump or conditional move instructions.
+
+       The `FUCOM' instructions differ from the `FCOM' instructions
+       (section A.35) only in the way they handle quiet NaNs: `FUCOM' will
+       handle them silently and set the condition code flags to an
+       `unordered' result, whereas `FCOM' will generate an exception.
+
+  A.70 `FXAM': Examine Class of Value in `ST0'
+
+       FXAM                          ; D9 E5                [8086,FPU]
+
+       `FXAM' sets the FPU flags C3, C2 and C0 depending on the type of
+       value stored in `ST0': 000 (respectively) for an unsupported format,
+       001 for a NaN, 010 for a normal finite number, 011 for an infinity,
+       100 for a zero, 101 for an empty register, and 110 for a denormal.
+       It also sets the C1 flag to the sign of the number.
+
+  A.71 `FXCH': Floating-Point Exchange
+
+       FXCH                          ; D9 C9                [8086,FPU] 
+       FXCH fpureg                   ; D9 C8+r              [8086,FPU] 
+       FXCH fpureg,ST0               ; D9 C8+r              [8086,FPU] 
+       FXCH ST0,fpureg               ; D9 C8+r              [8086,FPU]
+
+       `FXCH' exchanges `ST0' with a given FPU register. The no-operand
+       form exchanges `ST0' with `ST1'.
+
+  A.72 `FXTRACT': Extract Exponent and Significand
+
+       FXTRACT                       ; D9 F4                [8086,FPU]
+
+       `FXTRACT' separates the number in `ST0' into its exponent and
+       significand (mantissa), stores the exponent back into `ST0', and
+       then pushes the significand on the register stack (so that the
+       significand ends up in `ST0', and the exponent in `ST1').
+
+  A.73 `FYL2X', `FYL2XP1': Compute Y times Log2(X) or Log2(X+1)
+
+       FYL2X                         ; D9 F1                [8086,FPU] 
+       FYL2XP1                       ; D9 F9                [8086,FPU]
+
+       `FYL2X' multiplies `ST1' by the base-2 logarithm of `ST0', stores
+       the result in `ST1', and pops the register stack (so that the result
+       ends up in `ST0'). `ST0' must be non-zero and positive.
+
+       `FYL2XP1' works the same way, but replacing the base-2 log of `ST0'
+       with that of `ST0' plus one. This time, `ST0' must have magnitude no
+       greater than 1 minus half the square root of two.
+
+  A.74 `HLT': Halt Processor
+
+       HLT                           ; F4                   [8086]
+
+       `HLT' puts the processor into a halted state, where it will perform
+       no more operations until restarted by an interrupt or a reset.
+
+  A.75 `IBTS': Insert Bit String
+
+       IBTS r/m16,reg16              ; o16 0F A7 /r         [386,UNDOC] 
+       IBTS r/m32,reg32              ; o32 0F A7 /r         [386,UNDOC]
+
+       No clear documentation seems to be available for this instruction:
+       the best I've been able to find reads `Takes a string of bits from
+       the second operand and puts them in the first operand'. It is
+       present only in early 386 processors, and conflicts with the opcodes
+       for `CMPXCHG486'. NASM supports it only for completeness. Its
+       counterpart is `XBTS' (see section A.167).
+
+  A.76 `IDIV': Signed Integer Divide
+
+       IDIV r/m8                     ; F6 /7                [8086] 
+       IDIV r/m16                    ; o16 F7 /7            [8086] 
+       IDIV r/m32                    ; o32 F7 /7            [386]
+
+       `IDIV' performs signed integer division. The explicit operand
+       provided is the divisor; the dividend and destination operands are
+       implicit, in the following way:
+
+       (*) For `IDIV r/m8', `AX' is divided by the given operand; the
+           quotient is stored in `AL' and the remainder in `AH'.
+
+       (*) For `IDIV r/m16', `DX:AX' is divided by the given operand; the
+           quotient is stored in `AX' and the remainder in `DX'.
+
+       (*) For `IDIV r/m32', `EDX:EAX' is divided by the given operand; the
+           quotient is stored in `EAX' and the remainder in `EDX'.
+
+       Unsigned integer division is performed by the `DIV' instruction: see
+       section A.25.
+
+  A.77 `IMUL': Signed Integer Multiply
+
+       IMUL r/m8                     ; F6 /5                [8086] 
+       IMUL r/m16                    ; o16 F7 /5            [8086] 
+       IMUL r/m32                    ; o32 F7 /5            [386]
+
+       IMUL reg16,r/m16              ; o16 0F AF /r         [386] 
+       IMUL reg32,r/m32              ; o32 0F AF /r         [386]
+
+       IMUL reg16,imm8               ; o16 6B /r ib         [286] 
+       IMUL reg16,imm16              ; o16 69 /r iw         [286] 
+       IMUL reg32,imm8               ; o32 6B /r ib         [386] 
+       IMUL reg32,imm32              ; o32 69 /r id         [386]
+
+       IMUL reg16,r/m16,imm8         ; o16 6B /r ib         [286] 
+       IMUL reg16,r/m16,imm16        ; o16 69 /r iw         [286] 
+       IMUL reg32,r/m32,imm8         ; o32 6B /r ib         [386] 
+       IMUL reg32,r/m32,imm32        ; o32 69 /r id         [386]
+
+       `IMUL' performs signed integer multiplication. For the single-
+       operand form, the other operand and destination are implicit, in the
+       following way:
+
+       (*) For `IMUL r/m8', `AL' is multiplied by the given operand; the
+           product is stored in `AX'.
+
+       (*) For `IMUL r/m16', `AX' is multiplied by the given operand; the
+           product is stored in `DX:AX'.
+
+       (*) For `IMUL r/m32', `EAX' is multiplied by the given operand; the
+           product is stored in `EDX:EAX'.
+
+       The two-operand form multiplies its two operands and stores the
+       result in the destination (first) operand. The three-operand form
+       multiplies its last two operands and stores the result in the first
+       operand.
+
+       The two-operand form is in fact a shorthand for the three-operand
+       form, as can be seen by examining the opcode descriptions: in the
+       two-operand form, the code `/r' takes both its register and `r/m'
+       parts from the same operand (the first one).
+
+       In the forms with an 8-bit immediate operand and another longer
+       source operand, the immediate operand is considered to be signed,
+       and is sign-extended to the length of the other source operand. In
+       these cases, the `BYTE' qualifier is necessary to force NASM to
+       generate this form of the instruction.
+
+       Unsigned integer multiplication is performed by the `MUL'
+       instruction: see section A.107.
+
+  A.78 `IN': Input from I/O Port
+
+       IN AL,imm8                    ; E4 ib                [8086] 
+       IN AX,imm8                    ; o16 E5 ib            [8086] 
+       IN EAX,imm8                   ; o32 E5 ib            [386] 
+       IN AL,DX                      ; EC                   [8086] 
+       IN AX,DX                      ; o16 ED               [8086] 
+       IN EAX,DX                     ; o32 ED               [386]
+
+       `IN' reads a byte, word or doubleword from the specified I/O port,
+       and stores it in the given destination register. The port number may
+       be specified as an immediate value if it is between 0 and 255, and
+       otherwise must be stored in `DX'. See also `OUT' (section A.111).
+
+  A.79 `INC': Increment Integer
+
+       INC reg16                     ; o16 40+r             [8086] 
+       INC reg32                     ; o32 40+r             [386] 
+       INC r/m8                      ; FE /0                [8086] 
+       INC r/m16                     ; o16 FF /0            [8086] 
+       INC r/m32                     ; o32 FF /0            [386]
+
+       `INC' adds 1 to its operand. It does _not_ affect the carry flag: to
+       affect the carry flag, use `ADD something,1' (see section A.6). See
+       also `DEC' (section A.24).
+
+  A.80 `INSB', `INSW', `INSD': Input String from I/O Port
+
+       INSB                          ; 6C                   [186] 
+       INSW                          ; o16 6D               [186] 
+       INSD                          ; o32 6D               [386]
+
+       `INSB' inputs a byte from the I/O port specified in `DX' and stores
+       it at `[ES:DI]' or `[ES:EDI]'. It then increments or decrements
+       (depending on the direction flag: increments if the flag is clear,
+       decrements if it is set) `DI' or `EDI'.
+
+       The register used is `DI' if the address size is 16 bits, and `EDI'
+       if it is 32 bits. If you need to use an address size not equal to
+       the current `BITS' setting, you can use an explicit `a16' or `a32'
+       prefix.
+
+       Segment override prefixes have no effect for this instruction: the
+       use of `ES' for the load from `[DI]' or `[EDI]' cannot be
+       overridden.
+
+       `INSW' and `INSD' work in the same way, but they input a word or a
+       doubleword instead of a byte, and increment or decrement the
+       addressing register by 2 or 4 instead of 1.
+
+       The `REP' prefix may be used to repeat the instruction `CX' (or
+       `ECX' - again, the address size chooses which) times.
+
+       See also `OUTSB', `OUTSW' and `OUTSD' (section A.112).
+
+  A.81 `INT': Software Interrupt
+
+       INT imm8                      ; CD ib                [8086]
+
+       `INT' causes a software interrupt through a specified vector number
+       from 0 to 255.
+
+       The code generated by the `INT' instruction is always two bytes
+       long: although there are short forms for some `INT' instructions,
+       NASM does not generate them when it sees the `INT' mnemonic. In
+       order to generate single-byte breakpoint instructions, use the
+       `INT3' or `INT1' instructions (see section A.82) instead.
+
+  A.82 `INT3', `INT1', `ICEBP', `INT01': Breakpoints
+
+       INT1                          ; F1                   [P6] 
+       ICEBP                         ; F1                   [P6] 
+       INT01                         ; F1                   [P6]
+
+       INT3                          ; CC                   [8086]
+
+       `INT1' and `INT3' are short one-byte forms of the instructions
+       `INT 1' and `INT 3' (see section A.81). They perform a similar
+       function to their longer counterparts, but take up less code space.
+       They are used as breakpoints by debuggers.
+
+       `INT1', and its alternative synonyms `INT01' and `ICEBP', is an
+       instruction used by in-circuit emulators (ICEs). It is present,
+       though not documented, on some processors down to the 286, but is
+       only documented for the Pentium Pro. `INT3' is the instruction
+       normally used as a breakpoint by debuggers.
+
+       `INT3' is not precisely equivalent to `INT 3': the short form, since
+       it is designed to be used as a breakpoint, bypasses the normal IOPL
+       checks in virtual-8086 mode, and also does not go through interrupt
+       redirection.
+
+  A.83 `INTO': Interrupt if Overflow
+
+       INTO                          ; CE                   [8086]
+
+       `INTO' performs an `INT 4' software interrupt (see section A.81) if
+       and only if the overflow flag is set.
+
+  A.84 `INVD': Invalidate Internal Caches
+
+       INVD                          ; 0F 08                [486]
+
+       `INVD' invalidates and empties the processor's internal caches, and
+       causes the processor to instruct external caches to do the same. It
+       does not write the contents of the caches back to memory first: any
+       modified data held in the caches will be lost. To write the data
+       back first, use `WBINVD' (section A.164).
+
+  A.85 `INVLPG': Invalidate TLB Entry
+
+       INVLPG mem                    ; 0F 01 /0             [486]
+
+       `INVLPG' invalidates the translation lookahead buffer (TLB) entry
+       associated with the supplied memory address.
+
+  A.86 `IRET', `IRETW', `IRETD': Return from Interrupt
+
+       IRET                          ; CF                   [8086] 
+       IRETW                         ; o16 CF               [8086] 
+       IRETD                         ; o32 CF               [386]
+
+       `IRET' returns from an interrupt (hardware or software) by means of
+       popping `IP' (or `EIP'), `CS' and the flags off the stack and then
+       continuing execution from the new `CS:IP'.
+
+       `IRETW' pops `IP', `CS' and the flags as 2 bytes each, taking 6
+       bytes off the stack in total. `IRETD' pops `EIP' as 4 bytes, pops a
+       further 4 bytes of which the top two are discarded and the bottom
+       two go into `CS', and pops the flags as 4 bytes as well, taking 12
+       bytes off the stack.
+
+       `IRET' is a shorthand for either `IRETW' or `IRETD', depending on
+       the default `BITS' setting at the time.
+
+  A.87 `JCXZ', `JECXZ': Jump if CX/ECX Zero
+
+       JCXZ imm                      ; o16 E3 rb            [8086] 
+       JECXZ imm                     ; o32 E3 rb            [386]
+
+       `JCXZ' performs a short jump (with maximum range 128 bytes) if and
+       only if the contents of the `CX' register is 0. `JECXZ' does the
+       same thing, but with `ECX'.
+
+  A.88 `JMP': Jump
+
+       JMP imm                       ; E9 rw/rd             [8086] 
+       JMP SHORT imm                 ; EB rb                [8086] 
+       JMP imm:imm16                 ; o16 EA iw iw         [8086] 
+       JMP imm:imm32                 ; o32 EA id iw         [386] 
+       JMP FAR mem                   ; o16 FF /5            [8086] 
+       JMP FAR mem                   ; o32 FF /5            [386] 
+       JMP r/m16                     ; o16 FF /4            [8086] 
+       JMP r/m32                     ; o32 FF /4            [386]
+
+       `JMP' jumps to a given address. The address may be specified as an
+       absolute segment and offset, or as a relative jump within the
+       current segment.
+
+       `JMP SHORT imm' has a maximum range of 128 bytes, since the
+       displacement is specified as only 8 bits, but takes up less code
+       space. NASM does not choose when to generate `JMP SHORT' for you:
+       you must explicitly code `SHORT' every time you want a short jump.
+
+       You can choose between the two immediate far jump forms
+       (`JMP imm:imm') by the use of the `WORD' and `DWORD' keywords:
+       `JMP WORD 0x1234:0x5678') or `JMP DWORD 0x1234:0x56789abc'.
+
+       The `JMP FAR mem' forms execute a far jump by loading the
+       destination address out of memory. The address loaded consists of 16
+       or 32 bits of offset (depending on the operand size), and 16 bits of
+       segment. The operand size may be overridden using `JMP WORD FAR mem'
+       or `JMP DWORD FAR mem'.
+
+       The `JMP r/m' forms execute a near jump (within the same segment),
+       loading the destination address out of memory or out of a register.
+       The keyword `NEAR' may be specified, for clarity, in these forms,
+       but is not necessary. Again, operand size can be overridden using
+       `JMP WORD mem' or `JMP DWORD mem'.
+
+       As a convenience, NASM does not require you to jump to a far symbol
+       by coding the cumbersome `JMP SEG routine:routine', but instead
+       allows the easier synonym `JMP FAR routine'.
+
+       The `CALL r/m' forms given above are near calls; NASM will accept
+       the `NEAR' keyword (e.g. `CALL NEAR [address]'), even though it is
+       not strictly necessary.
+
+  A.89 `Jcc': Conditional Branch
+
+       Jcc imm                       ; 70+cc rb             [8086] 
+       Jcc NEAR imm                  ; 0F 80+cc rw/rd       [386]
+
+       The conditional jump instructions execute a near (same segment) jump
+       if and only if their conditions are satisfied. For example, `JNZ'
+       jumps only if the zero flag is not set.
+
+       The ordinary form of the instructions has only a 128-byte range; the
+       `NEAR' form is a 386 extension to the instruction set, and can span
+       the full size of a segment. NASM will not override your choice of
+       jump instruction: if you want `Jcc NEAR', you have to use the `NEAR'
+       keyword.
+
+       The `SHORT' keyword is allowed on the first form of the instruction,
+       for clarity, but is not necessary.
+
+  A.90 `LAHF': Load AH from Flags
+
+       LAHF                          ; 9F                   [8086]
+
+       `LAHF' sets the `AH' register according to the contents of the low
+       byte of the flags word. See also `SAHF' (section A.145).
+
+  A.91 `LAR': Load Access Rights
+
+       LAR reg16,r/m16               ; o16 0F 02 /r         [286,PRIV] 
+       LAR reg32,r/m32               ; o32 0F 02 /r         [286,PRIV]
+
+       `LAR' takes the segment selector specified by its source (second)
+       operand, finds the corresponding segment descriptor in the GDT or
+       LDT, and loads the access-rights byte of the descriptor into its
+       destination (first) operand.
+
+  A.92 `LDS', `LES', `LFS', `LGS', `LSS': Load Far Pointer
+
+       LDS reg16,mem                 ; o16 C5 /r            [8086] 
+       LDS reg32,mem                 ; o32 C5 /r            [8086]
+
+       LES reg16,mem                 ; o16 C4 /r            [8086] 
+       LES reg32,mem                 ; o32 C4 /r            [8086]
+
+       LFS reg16,mem                 ; o16 0F B4 /r         [386] 
+       LFS reg32,mem                 ; o32 0F B4 /r         [386]
+
+       LGS reg16,mem                 ; o16 0F B5 /r         [386] 
+       LGS reg32,mem                 ; o32 0F B5 /r         [386]
+
+       LSS reg16,mem                 ; o16 0F B2 /r         [386] 
+       LSS reg32,mem                 ; o32 0F B2 /r         [386]
+
+       These instructions load an entire far pointer (16 or 32 bits of
+       offset, plus 16 bits of segment) out of memory in one go. `LDS', for
+       example, loads 16 or 32 bits from the given memory address into the
+       given register (depending on the size of the register), then loads
+       the _next_ 16 bits from memory into `DS'. `LES', `LFS', `LGS' and
+       `LSS' work in the same way but use the other segment registers.
+
+  A.93 `LEA': Load Effective Address
+
+       LEA reg16,mem                 ; o16 8D /r            [8086] 
+       LEA reg32,mem                 ; o32 8D /r            [8086]
+
+       `LEA', despite its syntax, does not access memory. It calculates the
+       effective address specified by its second operand as if it were
+       going to load or store data from it, but instead it stores the
+       calculated address into the register specified by its first operand.
+       This can be used to perform quite complex calculations (e.g.
+       `LEA EAX,[EBX+ECX*4+100]') in one instruction.
+
+       `LEA', despite being a purely arithmetic instruction which accesses
+       no memory, still requires square brackets around its second operand,
+       as if it were a memory reference.
+
+  A.94 `LEAVE': Destroy Stack Frame
+
+       LEAVE                         ; C9                   [186]
+
+       `LEAVE' destroys a stack frame of the form created by the `ENTER'
+       instruction (see section A.27). It is functionally equivalent to
+       `MOV ESP,EBP' followed by `POP EBP' (or `MOV SP,BP' followed by
+       `POP BP' in 16-bit mode).
+
+  A.95 `LGDT', `LIDT', `LLDT': Load Descriptor Tables
+
+       LGDT mem                      ; 0F 01 /2             [286,PRIV] 
+       LIDT mem                      ; 0F 01 /3             [286,PRIV] 
+       LLDT r/m16                    ; 0F 00 /2             [286,PRIV]
+
+       `LGDT' and `LIDT' both take a 6-byte memory area as an operand: they
+       load a 32-bit linear address and a 16-bit size limit from that area
+       (in the opposite order) into the GDTR (global descriptor table
+       register) or IDTR (interrupt descriptor table register). These are
+       the only instructions which directly use _linear_ addresses, rather
+       than segment/offset pairs.
+
+       `LLDT' takes a segment selector as an operand. The processor looks
+       up that selector in the GDT and stores the limit and base address
+       given there into the LDTR (local descriptor table register).
+
+       See also `SGDT', `SIDT' and `SLDT' (section A.151).
+
+  A.96 `LMSW': Load/Store Machine Status Word
+
+       LMSW r/m16                    ; 0F 01 /6             [286,PRIV]
+
+       `LMSW' loads the bottom four bits of the source operand into the
+       bottom four bits of the `CR0' control register (or the Machine
+       Status Word, on 286 processors). See also `SMSW' (section A.155).
+
+  A.97 `LOADALL', `LOADALL286': Load Processor State
+
+       LOADALL                       ; 0F 07                [386,UNDOC] 
+       LOADALL286                    ; 0F 05                [286,UNDOC]
+
+       This instruction, in its two different-opcode forms, is apparently
+       supported on most 286 processors, some 386 and possibly some 486.
+       The opcode differs between the 286 and the 386.
+
+       The function of the instruction is to load all information relating
+       to the state of the processor out of a block of memory: on the 286,
+       this block is located implicitly at absolute address `0x800', and on
+       the 386 and 486 it is at `[ES:EDI]'.
+
+  A.98 `LODSB', `LODSW', `LODSD': Load from String
+
+       LODSB                         ; AC                   [8086] 
+       LODSW                         ; o16 AD               [8086] 
+       LODSD                         ; o32 AD               [386]
+
+       `LODSB' loads a byte from `[DS:SI]' or `[DS:ESI]' into `AL'. It then
+       increments or decrements (depending on the direction flag:
+       increments if the flag is clear, decrements if it is set) `SI' or
+       `ESI'.
+
+       The register used is `SI' if the address size is 16 bits, and `ESI'
+       if it is 32 bits. If you need to use an address size not equal to
+       the current `BITS' setting, you can use an explicit `a16' or `a32'
+       prefix.
+
+       The segment register used to load from `[SI]' or `[ESI]' can be
+       overridden by using a segment register name as a prefix (for
+       example, `es lodsb').
+
+       `LODSW' and `LODSD' work in the same way, but they load a word or a
+       doubleword instead of a byte, and increment or decrement the
+       addressing registers by 2 or 4 instead of 1.
+
+  A.99 `LOOP', `LOOPE', `LOOPZ', `LOOPNE', `LOOPNZ': Loop with Counter
+
+       LOOP imm                      ; E2 rb                [8086] 
+       LOOP imm,CX                   ; a16 E2 rb            [8086] 
+       LOOP imm,ECX                  ; a32 E2 rb            [386]
+
+       LOOPE imm                     ; E1 rb                [8086] 
+       LOOPE imm,CX                  ; a16 E1 rb            [8086] 
+       LOOPE imm,ECX                 ; a32 E1 rb            [386] 
+       LOOPZ imm                     ; E1 rb                [8086] 
+       LOOPZ imm,CX                  ; a16 E1 rb            [8086] 
+       LOOPZ imm,ECX                 ; a32 E1 rb            [386]
+
+       LOOPNE imm                    ; E0 rb                [8086] 
+       LOOPNE imm,CX                 ; a16 E0 rb            [8086] 
+       LOOPNE imm,ECX                ; a32 E0 rb            [386] 
+       LOOPNZ imm                    ; E0 rb                [8086] 
+       LOOPNZ imm,CX                 ; a16 E0 rb            [8086] 
+       LOOPNZ imm,ECX                ; a32 E0 rb            [386]
+
+       `LOOP' decrements its counter register (either `CX' or `ECX' - if
+       one is not specified explicitly, the `BITS' setting dictates which
+       is used) by one, and if the counter does not become zero as a result
+       of this operation, it jumps to the given label. The jump has a range
+       of 128 bytes.
+
+       `LOOPE' (or its synonym `LOOPZ') adds the additional condition that
+       it only jumps if the counter is nonzero _and_ the zero flag is set.
+       Similarly, `LOOPNE' (and `LOOPNZ') jumps only if the counter is
+       nonzero and the zero flag is clear.
+
+ A.100 `LSL': Load Segment Limit
+
+       LSL reg16,r/m16               ; o16 0F 03 /r         [286,PRIV] 
+       LSL reg32,r/m32               ; o32 0F 03 /r         [286,PRIV]
+
+       `LSL' is given a segment selector in its source (second) operand; it
+       computes the segment limit value by loading the segment limit field
+       from the associated segment descriptor in the GDT or LDT. (This
+       involves shifting left by 12 bits if the segment limit is page-
+       granular, and not if it is byte-granular; so you end up with a byte
+       limit in either case.) The segment limit obtained is then loaded
+       into the destination (first) operand.
+
+ A.101 `LTR': Load Task Register
+
+       LTR r/m16                     ; 0F 00 /3             [286,PRIV]
+
+       `LTR' looks up the segment base and limit in the GDT or LDT
+       descriptor specified by the segment selector given as its operand,
+       and loads them into the Task Register.
+
+ A.102 `MOV': Move Data
+
+       MOV r/m8,reg8                 ; 88 /r                [8086] 
+       MOV r/m16,reg16               ; o16 89 /r            [8086] 
+       MOV r/m32,reg32               ; o32 89 /r            [386] 
+       MOV reg8,r/m8                 ; 8A /r                [8086] 
+       MOV reg16,r/m16               ; o16 8B /r            [8086] 
+       MOV reg32,r/m32               ; o32 8B /r            [386]
+
+       MOV reg8,imm8                 ; B0+r ib              [8086] 
+       MOV reg16,imm16               ; o16 B8+r iw          [8086] 
+       MOV reg32,imm32               ; o32 B8+r id          [386] 
+       MOV r/m8,imm8                 ; C6 /0 ib             [8086] 
+       MOV r/m16,imm16               ; o16 C7 /0 iw         [8086] 
+       MOV r/m32,imm32               ; o32 C7 /0 id         [386]
+
+       MOV AL,memoffs8               ; A0 ow/od             [8086] 
+       MOV AX,memoffs16              ; o16 A1 ow/od         [8086] 
+       MOV EAX,memoffs32             ; o32 A1 ow/od         [386] 
+       MOV memoffs8,AL               ; A2 ow/od             [8086] 
+       MOV memoffs16,AX              ; o16 A3 ow/od         [8086] 
+       MOV memoffs32,EAX             ; o32 A3 ow/od         [386]
+
+       MOV r/m16,segreg              ; o16 8C /r            [8086] 
+       MOV r/m32,segreg              ; o32 8C /r            [386] 
+       MOV segreg,r/m16              ; o16 8E /r            [8086] 
+       MOV segreg,r/m32              ; o32 8E /r            [386]
+
+       MOV reg32,CR0/2/3/4           ; 0F 20 /r             [386] 
+       MOV reg32,DR0/1/2/3/6/7       ; 0F 21 /r             [386] 
+       MOV reg32,TR3/4/5/6/7         ; 0F 24 /r             [386] 
+       MOV CR0/2/3/4,reg32           ; 0F 22 /r             [386] 
+       MOV DR0/1/2/3/6/7,reg32       ; 0F 23 /r             [386] 
+       MOV TR3/4/5/6/7,reg32         ; 0F 26 /r             [386]
+
+       `MOV' copies the contents of its source (second) operand into its
+       destination (first) operand.
+
+       In all forms of the `MOV' instruction, the two operands are the same
+       size, except for moving between a segment register and an `r/m32'
+       operand. These instructions are treated exactly like the
+       corresponding 16-bit equivalent (so that, for example, `MOV DS,EAX'
+       functions identically to `MOV DS,AX' but saves a prefix when in 32-
+       bit mode), except that when a segment register is moved into a 32-
+       bit destination, the top two bytes of the result are undefined.
+
+       `MOV' may not use `CS' as a destination.
+
+       `CR4' is only a supported register on the Pentium and above.
+
+ A.103 `MOVD': Move Doubleword to/from MMX Register
+
+       MOVD mmxreg,r/m32             ; 0F 6E /r             [PENT,MMX] 
+       MOVD r/m32,mmxreg             ; 0F 7E /r             [PENT,MMX]
+
+       `MOVD' copies 32 bits from its source (second) operand into its
+       destination (first) operand. When the destination is a 64-bit MMX
+       register, the top 32 bits are set to zero.
+
+ A.104 `MOVQ': Move Quadword to/from MMX Register
+
+       MOVQ mmxreg,r/m64             ; 0F 6F /r             [PENT,MMX] 
+       MOVQ r/m64,mmxreg             ; 0F 7F /r             [PENT,MMX]
+
+       `MOVQ' copies 64 bits from its source (second) operand into its
+       destination (first) operand.
+
+ A.105 `MOVSB', `MOVSW', `MOVSD': Move String
+
+       MOVSB                         ; A4                   [8086] 
+       MOVSW                         ; o16 A5               [8086] 
+       MOVSD                         ; o32 A5               [386]
+
+       `MOVSB' copies the byte at `[ES:DI]' or `[ES:EDI]' to `[DS:SI]' or
+       `[DS:ESI]'. It then increments or decrements (depending on the
+       direction flag: increments if the flag is clear, decrements if it is
+       set) `SI' and `DI' (or `ESI' and `EDI').
+
+       The registers used are `SI' and `DI' if the address size is 16 bits,
+       and `ESI' and `EDI' if it is 32 bits. If you need to use an address
+       size not equal to the current `BITS' setting, you can use an
+       explicit `a16' or `a32' prefix.
+
+       The segment register used to load from `[SI]' or `[ESI]' can be
+       overridden by using a segment register name as a prefix (for
+       example, `es movsb'). The use of `ES' for the store to `[DI]' or
+       `[EDI]' cannot be overridden.
+
+       `MOVSW' and `MOVSD' work in the same way, but they copy a word or a
+       doubleword instead of a byte, and increment or decrement the
+       addressing registers by 2 or 4 instead of 1.
+
+       The `REP' prefix may be used to repeat the instruction `CX' (or
+       `ECX' - again, the address size chooses which) times.
+
+ A.106 `MOVSX', `MOVZX': Move Data with Sign or Zero Extend
+
+       MOVSX reg16,r/m8              ; o16 0F BE /r         [386] 
+       MOVSX reg32,r/m8              ; o32 0F BE /r         [386] 
+       MOVSX reg32,r/m16             ; o32 0F BF /r         [386]
+
+       MOVZX reg16,r/m8              ; o16 0F B6 /r         [386] 
+       MOVZX reg32,r/m8              ; o32 0F B6 /r         [386] 
+       MOVZX reg32,r/m16             ; o32 0F B7 /r         [386]
+
+       `MOVSX' sign-extends its source (second) operand to the length of
+       its destination (first) operand, and copies the result into the
+       destination operand. `MOVZX' does the same, but zero-extends rather
+       than sign-extending.
+
+ A.107 `MUL': Unsigned Integer Multiply
+
+       MUL r/m8                      ; F6 /4                [8086] 
+       MUL r/m16                     ; o16 F7 /4            [8086] 
+       MUL r/m32                     ; o32 F7 /4            [386]
+
+       `MUL' performs unsigned integer multiplication. The other operand to
+       the multiplication, and the destination operand, are implicit, in
+       the following way:
+
+       (*) For `MUL r/m8', `AL' is multiplied by the given operand; the
+           product is stored in `AX'.
+
+       (*) For `MUL r/m16', `AX' is multiplied by the given operand; the
+           product is stored in `DX:AX'.
+
+       (*) For `MUL r/m32', `EAX' is multiplied by the given operand; the
+           product is stored in `EDX:EAX'.
+
+       Signed integer multiplication is performed by the `IMUL'
+       instruction: see section A.77.
+
+ A.108 `NEG', `NOT': Two's and One's Complement
+
+       NEG r/m8                      ; F6 /3                [8086] 
+       NEG r/m16                     ; o16 F7 /3            [8086] 
+       NEG r/m32                     ; o32 F7 /3            [386]
+
+       NOT r/m8                      ; F6 /2                [8086] 
+       NOT r/m16                     ; o16 F7 /2            [8086] 
+       NOT r/m32                     ; o32 F7 /2            [386]
+
+       `NEG' replaces the contents of its operand by the two's complement
+       negation (invert all the bits and then add one) of the original
+       value. `NOT', similarly, performs one's complement (inverts all the
+       bits).
+
+ A.109 `NOP': No Operation
+
+       NOP                           ; 90                   [8086]
+
+       `NOP' performs no operation. Its opcode is the same as that
+       generated by `XCHG AX,AX' or `XCHG EAX,EAX' (depending on the
+       processor mode; see section A.168).
+
+ A.110 `OR': Bitwise OR
+
+       OR r/m8,reg8                  ; 08 /r                [8086] 
+       OR r/m16,reg16                ; o16 09 /r            [8086] 
+       OR r/m32,reg32                ; o32 09 /r            [386]
+
+       OR reg8,r/m8                  ; 0A /r                [8086] 
+       OR reg16,r/m16                ; o16 0B /r            [8086] 
+       OR reg32,r/m32                ; o32 0B /r            [386]
+
+       OR r/m8,imm8                  ; 80 /1 ib             [8086] 
+       OR r/m16,imm16                ; o16 81 /1 iw         [8086] 
+       OR r/m32,imm32                ; o32 81 /1 id         [386]
+
+       OR r/m16,imm8                 ; o16 83 /1 ib         [8086] 
+       OR r/m32,imm8                 ; o32 83 /1 ib         [386]
+
+       OR AL,imm8                    ; 0C ib                [8086] 
+       OR AX,imm16                   ; o16 0D iw            [8086] 
+       OR EAX,imm32                  ; o32 0D id            [386]
+
+       `OR' performs a bitwise OR operation between its two operands (i.e.
+       each bit of the result is 1 if and only if at least one of the
+       corresponding bits of the two inputs was 1), and stores the result
+       in the destination (first) operand.
+
+       In the forms with an 8-bit immediate second operand and a longer
+       first operand, the second operand is considered to be signed, and is
+       sign-extended to the length of the first operand. In these cases,
+       the `BYTE' qualifier is necessary to force NASM to generate this
+       form of the instruction.
+
+       The MMX instruction `POR' (see section A.129) performs the same
+       operation on the 64-bit MMX registers.
+
+ A.111 `OUT': Output Data to I/O Port
+
+       OUT imm8,AL                   ; E6 ib                [8086] 
+       OUT imm8,AX                   ; o16 E7 ib            [8086] 
+       OUT imm8,EAX                  ; o32 E7 ib            [386] 
+       OUT DX,AL                     ; EE                   [8086] 
+       OUT DX,AX                     ; o16 EF               [8086] 
+       OUT DX,EAX                    ; o32 EF               [386]
+
+       `IN' writes the contents of the given source register to the
+       specified I/O port. The port number may be specified as an immediate
+       value if it is between 0 and 255, and otherwise must be stored in
+       `DX'. See also `IN' (section A.78).
+
+ A.112 `OUTSB', `OUTSW', `OUTSD': Output String to I/O Port
+
+       OUTSB                         ; 6E                   [186]
+
+       OUTSW                         ; o16 6F               [186]
+
+       OUTSD                         ; o32 6F               [386]
+
+       `OUTSB' loads a byte from `[DS:SI]' or `[DS:ESI]' and writes it to
+       the I/O port specified in `DX'. It then increments or decrements
+       (depending on the direction flag: increments if the flag is clear,
+       decrements if it is set) `SI' or `ESI'.
+
+       The register used is `SI' if the address size is 16 bits, and `ESI'
+       if it is 32 bits. If you need to use an address size not equal to
+       the current `BITS' setting, you can use an explicit `a16' or `a32'
+       prefix.
+
+       The segment register used to load from `[SI]' or `[ESI]' can be
+       overridden by using a segment register name as a prefix (for
+       example, `es outsb').
+
+       `OUTSW' and `OUTSD' work in the same way, but they output a word or
+       a doubleword instead of a byte, and increment or decrement the
+       addressing registers by 2 or 4 instead of 1.
+
+       The `REP' prefix may be used to repeat the instruction `CX' (or
+       `ECX' - again, the address size chooses which) times.
+
+ A.113 `PACKSSDW', `PACKSSWB', `PACKUSWB': Pack Data
+
+       PACKSSDW mmxreg,r/m64         ; 0F 6B /r             [PENT,MMX] 
+       PACKSSWB mmxreg,r/m64         ; 0F 63 /r             [PENT,MMX] 
+       PACKUSWB mmxreg,r/m64         ; 0F 67 /r             [PENT,MMX]
+
+       All these instructions start by forming a notional 128-bit word by
+       placing the source (second) operand on the left of the destination
+       (first) operand. `PACKSSDW' then splits this 128-bit word into four
+       doublewords, converts each to a word, and loads them side by side
+       into the destination register; `PACKSSWB' and `PACKUSWB' both split
+       the 128-bit word into eight words, converts each to a byte, and
+       loads _those_ side by side into the destination register.
+
+       `PACKSSDW' and `PACKSSWB' perform signed saturation when reducing
+       the length of numbers: if the number is too large to fit into the
+       reduced space, they replace it by the largest signed number (`7FFFh'
+       or `7Fh') that _will_ fit, and if it is too small then they replace
+       it by the smallest signed number (`8000h' or `80h') that will fit.
+       `PACKUSWB' performs unsigned saturation: it treats its input as
+       unsigned, and replaces it by the largest unsigned number that will
+       fit.
+
+ A.114 `PADDxx': MMX Packed Addition
+
+       PADDB mmxreg,r/m64            ; 0F FC /r             [PENT,MMX] 
+       PADDW mmxreg,r/m64            ; 0F FD /r             [PENT,MMX] 
+       PADDD mmxreg,r/m64            ; 0F FE /r             [PENT,MMX]
+
+       PADDSB mmxreg,r/m64           ; 0F EC /r             [PENT,MMX] 
+       PADDSW mmxreg,r/m64           ; 0F ED /r             [PENT,MMX]
+
+       PADDUSB mmxreg,r/m64          ; 0F DC /r             [PENT,MMX] 
+       PADDUSW mmxreg,r/m64          ; 0F DD /r             [PENT,MMX]
+
+       `PADDxx' all perform packed addition between their two 64-bit
+       operands, storing the result in the destination (first) operand. The
+       `PADDxB' forms treat the 64-bit operands as vectors of eight bytes,
+       and add each byte individually; `PADDxW' treat the operands as
+       vectors of four words; and `PADDD' treats its operands as vectors of
+       two doublewords.
+
+       `PADDSB' and `PADDSW' perform signed saturation on the sum of each
+       pair of bytes or words: if the result of an addition is too large or
+       too small to fit into a signed byte or word result, it is clipped
+       (saturated) to the largest or smallest value which _will_ fit.
+       `PADDUSB' and `PADDUSW' similarly perform unsigned saturation,
+       clipping to `0FFh' or `0FFFFh' if the result is larger than that.
+
+ A.115 `PADDSIW': MMX Packed Addition to Implicit Destination
+
+       PADDSIW mmxreg,r/m64          ; 0F 51 /r             [CYRIX,MMX]
+
+       `PADDSIW', specific to the Cyrix extensions to the MMX instruction
+       set, performs the same function as `PADDSW', except that the result
+       is not placed in the register specified by the first operand, but
+       instead in the register whose number differs from the first operand
+       only in the last bit. So `PADDSIW MM0,MM2' would put the result in
+       `MM1', but `PADDSIW MM1,MM2' would put the result in `MM0'.
+
+ A.116 `PAND', `PANDN': MMX Bitwise AND and AND-NOT
+
+       PAND mmxreg,r/m64             ; 0F DB /r             [PENT,MMX] 
+       PANDN mmxreg,r/m64            ; 0F DF /r             [PENT,MMX]
+
+       `PAND' performs a bitwise AND operation between its two operands
+       (i.e. each bit of the result is 1 if and only if the corresponding
+       bits of the two inputs were both 1), and stores the result in the
+       destination (first) operand.
+
+       `PANDN' performs the same operation, but performs a one's complement
+       operation on the destination (first) operand first.
+
+ A.117 `PAVEB': MMX Packed Average
+
+       PAVEB mmxreg,r/m64            ; 0F 50 /r             [CYRIX,MMX]
+
+       `PAVEB', specific to the Cyrix MMX extensions, treats its two
+       operands as vectors of eight unsigned bytes, and calculates the
+       average of the corresponding bytes in the operands. The resulting
+       vector of eight averages is stored in the first operand.
+
+ A.118 `PCMPxx': MMX Packed Comparison
+
+       PCMPEQB mmxreg,r/m64          ; 0F 74 /r             [PENT,MMX] 
+       PCMPEQW mmxreg,r/m64          ; 0F 75 /r             [PENT,MMX] 
+       PCMPEQD mmxreg,r/m64          ; 0F 76 /r             [PENT,MMX]
+
+       PCMPGTB mmxreg,r/m64          ; 0F 64 /r             [PENT,MMX] 
+       PCMPGTW mmxreg,r/m64          ; 0F 65 /r             [PENT,MMX] 
+       PCMPGTD mmxreg,r/m64          ; 0F 66 /r             [PENT,MMX]
+
+       The `PCMPxx' instructions all treat their operands as vectors of
+       bytes, words, or doublewords; corresponding elements of the source
+       and destination are compared, and the corresponding element of the
+       destination (first) operand is set to all zeros or all ones
+       depending on the result of the comparison.
+
+       `PCMPxxB' treats the operands as vectors of eight bytes, `PCMPxxW'
+       treats them as vectors of four words, and `PCMPxxD' as two
+       doublewords.
+
+       `PCMPEQx' sets the corresponding element of the destination operand
+       to all ones if the two elements compared are equal; `PCMPGTx' sets
+       the destination element to all ones if the element of the first
+       (destination) operand is greater (treated as a signed integer) than
+       that of the second (source) operand.
+
+ A.119 `PDISTIB': MMX Packed Distance and Accumulate with Implied Register
+
+       PDISTIB mmxreg,mem64          ; 0F 54 /r             [CYRIX,MMX]
+
+       `PDISTIB', specific to the Cyrix MMX extensions, treats its two
+       input operands as vectors of eight unsigned bytes. For each byte
+       position, it finds the absolute difference between the bytes in that
+       position in the two input operands, and adds that value to the byte
+       in the same position in the implied output register. The addition is
+       saturated to an unsigned byte in the same way as `PADDUSB'.
+
+       The implied output register is found in the same way as `PADDSIW'
+       (section A.115).
+
+       Note that `PDISTIB' cannot take a register as its second source
+       operand.
+
+ A.120 `PMACHRIW': MMX Packed Multiply and Accumulate with Rounding
+
+       PMACHRIW mmxreg,mem64         ; 0F 5E /r             [CYRIX,MMX]
+
+       `PMACHRIW' acts almost identically to `PMULHRIW' (section A.123),
+       but instead of _storing_ its result in the implied destination
+       register, it _adds_ its result, as four packed words, to the implied
+       destination register. No saturation is done: the addition can wrap
+       around.
+
+       Note that `PMACHRIW' cannot take a register as its second source
+       operand.
+
+ A.121 `PMADDWD': MMX Packed Multiply and Add
+
+       PMADDWD mmxreg,r/m64          ; 0F F5 /r             [PENT,MMX]
+
+       `PMADDWD' treats its two inputs as vectors of four signed words. It
+       multiplies corresponding elements of the two operands, giving four
+       signed doubleword results. The top two of these are added and placed
+       in the top 32 bits of the destination (first) operand; the bottom
+       two are added and placed in the bottom 32 bits.
+
+ A.122 `PMAGW': MMX Packed Magnitude
+
+       PMAGW mmxreg,r/m64            ; 0F 52 /r             [CYRIX,MMX]
+
+       `PMAGW', specific to the Cyrix MMX extensions, treats both its
+       operands as vectors of four signed words. It compares the absolute
+       values of the words in corresponding positions, and sets each word
+       of the destination (first) operand to whichever of the two words in
+       that position had the larger absolute value.
+
+ A.123 `PMULHRW', `PMULHRIW': MMX Packed Multiply High with Rounding
+
+       PMULHRW mmxreg,r/m64          ; 0F 59 /r             [CYRIX,MMX] 
+       PMULHRIW mmxreg,r/m64         ; 0F 5D /r             [CYRIX,MMX]
+
+       These instructions, specific to the Cyrix MMX extensions, treat
+       their operands as vectors of four signed words. Words in
+       corresponding positions are multiplied, to give a 32-bit value in
+       which bits 30 and 31 are guaranteed equal. Bits 30 to 15 of this
+       value (bit mask `0x7FFF8000') are taken and stored in the
+       corresponding position of the destination operand, after first
+       rounding the low bit (equivalent to adding `0x4000' before
+       extracting bits 30 to 15).
+
+       For `PMULHRW', the destination operand is the first operand; for
+       `PMULHRIW' the destination operand is implied by the first operand
+       in the manner of `PADDSIW' (section A.115).
+
+ A.124 `PMULHW', `PMULLW': MMX Packed Multiply
+
+       PMULHW mmxreg,r/m64           ; 0F E5 /r             [PENT,MMX] 
+       PMULLW mmxreg,r/m64           ; 0F D5 /r             [PENT,MMX]
+
+       `PMULxW' treats its two inputs as vectors of four signed words. It
+       multiplies corresponding elements of the two operands, giving four
+       signed doubleword results.
+
+       `PMULHW' then stores the top 16 bits of each doubleword in the
+       destination (first) operand; `PMULLW' stores the bottom 16 bits of
+       each doubleword in the destination operand.
+
+ A.125 `PMVccZB': MMX Packed Conditional Move
+
+       PMVZB mmxreg,mem64            ; 0F 58 /r             [CYRIX,MMX] 
+       PMVNZB mmxreg,mem64           ; 0F 5A /r             [CYRIX,MMX] 
+       PMVLZB mmxreg,mem64           ; 0F 5B /r             [CYRIX,MMX] 
+       PMVGEZB mmxreg,mem64          ; 0F 5C /r             [CYRIX,MMX]
+
+       These instructions, specific to the Cyrix MMX extensions, perform
+       parallel conditional moves. The two input operands are treated as
+       vectors of eight bytes. Each byte of the destination (first) operand
+       is either written from the corresponding byte of the source (second)
+       operand, or left alone, depending on the value of the byte in the
+       _implied_ operand (specified in the same way as `PADDSIW', in
+       section A.115).
+
+       `PMVZB' performs each move if the corresponding byte in the implied
+       operand is zero. `PMVNZB' moves if the byte is non-zero. `PMVLZB'
+       moves if the byte is less than zero, and `PMVGEZB' moves if the byte
+       is greater than or equal to zero.
+
+       Note that these instructions cannot take a register as their second
+       source operand.
+
+ A.126 `POP': Pop Data from Stack
+
+       POP reg16                     ; o16 58+r             [8086] 
+       POP reg32                     ; o32 58+r             [386]
+
+       POP r/m16                     ; o16 8F /0            [8086] 
+       POP r/m32                     ; o32 8F /0            [386]
+
+       POP CS                        ; 0F                   [8086,UNDOC] 
+       POP DS                        ; 1F                   [8086] 
+       POP ES                        ; 07                   [8086] 
+       POP SS                        ; 17                   [8086] 
+       POP FS                        ; 0F A1                [386] 
+       POP GS                        ; 0F A9                [386]
+
+       `POP' loads a value from the stack (from `[SS:SP]' or `[SS:ESP]')
+       and then increments the stack pointer.
+
+       The address-size attribute of the instruction determines whether
+       `SP' or `ESP' is used as the stack pointer: to deliberately override
+       the default given by the `BITS' setting, you can use an `a16' or
+       `a32' prefix.
+
+       The operand-size attribute of the instruction determines whether the
+       stack pointer is incremented by 2 or 4: this means that segment
+       register pops in `BITS 32' mode will pop 4 bytes off the stack and
+       discard the upper two of them. If you need to override that, you can
+       use an `o16' or `o32' prefix.
+
+       The above opcode listings give two forms for general-purpose
+       register pop instructions: for example, `POP BX' has the two forms
+       `5B' and `8F C3'. NASM will always generate the shorter form when
+       given `POP BX'. NDISASM will disassemble both.
+
+       `POP CS' is not a documented instruction, and is not supported on
+       any processor above the 8086 (since they use `0Fh' as an opcode
+       prefix for instruction set extensions). However, at least some 8086
+       processors do support it, and so NASM generates it for completeness.
+
+ A.127 `POPAx': Pop All General-Purpose Registers
+
+       POPA                          ; 61                   [186] 
+       POPAW                         ; o16 61               [186] 
+       POPAD                         ; o32 61               [386]
+
+       `POPAW' pops a word from the stack into each of, successively, `DI',
+       `SI', `BP', nothing (it discards a word from the stack which was a
+       placeholder for `SP'), `BX', `DX', `CX' and `AX'. It is intended to
+       reverse the operation of `PUSHAW' (see section A.135), but it
+       ignores the value for `SP' that was pushed on the stack by `PUSHAW'.
+
+       `POPAD' pops twice as much data, and places the results in `EDI',
+       `ESI', `EBP', nothing (placeholder for `ESP'), `EBX', `EDX', `ECX'
+       and `EAX'. It reverses the operation of `PUSHAD'.
+
+       `POPA' is an alias mnemonic for either `POPAW' or `POPAD', depending
+       on the current `BITS' setting.
+
+       Note that the registers are popped in reverse order of their numeric
+       values in opcodes (see section A.2.1).
+
+ A.128 `POPFx': Pop Flags Register
+
+       POPF                          ; 9D                   [186] 
+       POPFW                         ; o16 9D               [186] 
+       POPFD                         ; o32 9D               [386]
+
+       `POPFW' pops a word from the stack and stores it in the bottom 16
+       bits of the flags register (or the whole flags register, on
+       processors below a 386). `POPFD' pops a doubleword and stores it in
+       the entire flags register.
+
+       `POPF' is an alias mnemonic for either `POPFW' or `POPFD', depending
+       on the current `BITS' setting.
+
+       See also `PUSHF' (section A.136).
+
+ A.129 `POR': MMX Bitwise OR
+
+       POR mmxreg,r/m64              ; 0F EB /r             [PENT,MMX]
+
+       `POR' performs a bitwise OR operation between its two operands (i.e.
+       each bit of the result is 1 if and only if at least one of the
+       corresponding bits of the two inputs was 1), and stores the result
+       in the destination (first) operand.
+
+ A.130 `PSLLx', `PSRLx', `PSRAx': MMX Bit Shifts
+
+       PSLLW mmxreg,r/m64            ; 0F F1 /r             [PENT,MMX] 
+       PSLLW mmxreg,imm8             ; 0F 71 /6 ib          [PENT,MMX]
+
+       PSLLD mmxreg,r/m64            ; 0F F2 /r             [PENT,MMX] 
+       PSLLD mmxreg,imm8             ; 0F 72 /6 ib          [PENT,MMX]
+
+       PSLLQ mmxreg,r/m64            ; 0F F3 /r             [PENT,MMX] 
+       PSLLQ mmxreg,imm8             ; 0F 73 /6 ib          [PENT,MMX]
+
+       PSRAW mmxreg,r/m64            ; 0F E1 /r             [PENT,MMX] 
+       PSRAW mmxreg,imm8             ; 0F 71 /4 ib          [PENT,MMX]
+
+       PSRAD mmxreg,r/m64            ; 0F E2 /r             [PENT,MMX] 
+       PSRAD mmxreg,imm8             ; 0F 72 /4 ib          [PENT,MMX]
+
+       PSRLW mmxreg,r/m64            ; 0F D1 /r             [PENT,MMX] 
+       PSRLW mmxreg,imm8             ; 0F 71 /2 ib          [PENT,MMX]
+
+       PSRLD mmxreg,r/m64            ; 0F D2 /r             [PENT,MMX] 
+       PSRLD mmxreg,imm8             ; 0F 72 /2 ib          [PENT,MMX]
+
+       PSRLQ mmxreg,r/m64            ; 0F D3 /r             [PENT,MMX] 
+       PSRLQ mmxreg,imm8             ; 0F 73 /2 ib          [PENT,MMX]
+
+       `PSxxQ' perform simple bit shifts on the 64-bit MMX registers: the
+       destination (first) operand is shifted left or right by the number
+       of bits given in the source (second) operand, and the vacated bits
+       are filled in with zeros (for a logical shift) or copies of the
+       original sign bit (for an arithmetic right shift).
+
+       `PSxxW' and `PSxxD' perform packed bit shifts: the destination
+       operand is treated as a vector of four words or two doublewords, and
+       each element is shifted individually, so bits shifted out of one
+       element do not interfere with empty bits coming into the next.
+
+       `PSLLx' and `PSRLx' perform logical shifts: the vacated bits at one
+       end of the shifted number are filled with zeros. `PSRAx' performs an
+       arithmetic right shift: the vacated bits at the top of the shifted
+       number are filled with copies of the original top (sign) bit.
+
+ A.131 `PSUBxx': MMX Packed Subtraction
+
+       PSUBB mmxreg,r/m64            ; 0F F8 /r             [PENT,MMX] 
+       PSUBW mmxreg,r/m64            ; 0F F9 /r             [PENT,MMX] 
+       PSUBD mmxreg,r/m64            ; 0F FA /r             [PENT,MMX]
+
+       PSUBSB mmxreg,r/m64           ; 0F E8 /r             [PENT,MMX] 
+       PSUBSW mmxreg,r/m64           ; 0F E9 /r             [PENT,MMX]
+
+       PSUBUSB mmxreg,r/m64          ; 0F D8 /r             [PENT,MMX] 
+       PSUBUSW mmxreg,r/m64          ; 0F D9 /r             [PENT,MMX]
+
+       `PSUBxx' all perform packed subtraction between their two 64-bit
+       operands, storing the result in the destination (first) operand. The
+       `PSUBxB' forms treat the 64-bit operands as vectors of eight bytes,
+       and subtract each byte individually; `PSUBxW' treat the operands as
+       vectors of four words; and `PSUBD' treats its operands as vectors of
+       two doublewords.
+
+       In all cases, the elements of the operand on the right are
+       subtracted from the corresponding elements of the operand on the
+       left, not the other way round.
+
+       `PSUBSB' and `PSUBSW' perform signed saturation on the sum of each
+       pair of bytes or words: if the result of a subtraction is too large
+       or too small to fit into a signed byte or word result, it is clipped
+       (saturated) to the largest or smallest value which _will_ fit.
+       `PSUBUSB' and `PSUBUSW' similarly perform unsigned saturation,
+       clipping to `0FFh' or `0FFFFh' if the result is larger than that.
+
+ A.132 `PSUBSIW': MMX Packed Subtract with Saturation to Implied Destination
+
+       PSUBSIW mmxreg,r/m64          ; 0F 55 /r             [CYRIX,MMX]
+
+       `PSUBSIW', specific to the Cyrix extensions to the MMX instruction
+       set, performs the same function as `PSUBSW', except that the result
+       is not placed in the register specified by the first operand, but
+       instead in the implied destination register, specified as for
+       `PADDSIW' (section A.115).
+
+ A.133 `PUNPCKxxx': Unpack Data
+
+       PUNPCKHBW mmxreg,r/m64        ; 0F 68 /r             [PENT,MMX] 
+       PUNPCKHWD mmxreg,r/m64        ; 0F 69 /r             [PENT,MMX] 
+       PUNPCKHDQ mmxreg,r/m64        ; 0F 6A /r             [PENT,MMX]
+
+       PUNPCKLBW mmxreg,r/m64        ; 0F 60 /r             [PENT,MMX] 
+       PUNPCKLWD mmxreg,r/m64        ; 0F 61 /r             [PENT,MMX] 
+       PUNPCKLDQ mmxreg,r/m64        ; 0F 62 /r             [PENT,MMX]
+
+       `PUNPCKxx' all treat their operands as vectors, and produce a new
+       vector generated by interleaving elements from the two inputs. The
+       `PUNPCKHxx' instructions start by throwing away the bottom half of
+       each input operand, and the `PUNPCKLxx' instructions throw away the
+       top half.
+
+       The remaining elements, totalling 64 bits, are then interleaved into
+       the destination, alternating elements from the second (source)
+       operand and the first (destination) operand: so the leftmost element
+       in the result always comes from the second operand, and the
+       rightmost from the destination.
+
+       `PUNPCKxBW' works a byte at a time, `PUNPCKxWD' a word at a time,
+       and `PUNPCKxDQ' a doubleword at a time.
+
+       So, for example, if the first operand held `0x7A6A5A4A3A2A1A0A' and
+       the second held `0x7B6B5B4B3B2B1B0B', then:
+
+       (*) `PUNPCKHBW' would return `0x7B7A6B6A5B5A4B4A'.
+
+       (*) `PUNPCKHWD' would return `0x7B6B7A6A5B4B5A4A'.
+
+       (*) `PUNPCKHDQ' would return `0x7B6B5B4B7A6A5A4A'.
+
+       (*) `PUNPCKLBW' would return `0x3B3A2B2A1B1A0B0A'.
+
+       (*) `PUNPCKLWD' would return `0x3B2B3A2A1B0B1A0A'.
+
+       (*) `PUNPCKLDQ' would return `0x3B2B1B0B3A2A1A0A'.
+
+ A.134 `PUSH': Push Data on Stack
+
+       PUSH reg16                    ; o16 50+r             [8086] 
+       PUSH reg32                    ; o32 50+r             [386]
+
+       PUSH r/m16                    ; o16 FF /6            [8086] 
+       PUSH r/m32                    ; o32 FF /6            [386]
+
+       PUSH CS                       ; 0E                   [8086] 
+       PUSH DS                       ; 1E                   [8086] 
+       PUSH ES                       ; 06                   [8086] 
+       PUSH SS                       ; 16                   [8086] 
+       PUSH FS                       ; 0F A0                [386] 
+       PUSH GS                       ; 0F A8                [386]
+
+       PUSH imm8                     ; 6A ib                [286] 
+       PUSH imm16                    ; o16 68 iw            [286] 
+       PUSH imm32                    ; o32 68 id            [386]
+
+       `PUSH' decrements the stack pointer (`SP' or `ESP') by 2 or 4, and
+       then stores the given value at `[SS:SP]' or `[SS:ESP]'.
+
+       The address-size attribute of the instruction determines whether
+       `SP' or `ESP' is used as the stack pointer: to deliberately override
+       the default given by the `BITS' setting, you can use an `a16' or
+       `a32' prefix.
+
+       The operand-size attribute of the instruction determines whether the
+       stack pointer is decremented by 2 or 4: this means that segment
+       register pushes in `BITS 32' mode will push 4 bytes on the stack, of
+       which the upper two are undefined. If you need to override that, you
+       can use an `o16' or `o32' prefix.
+
+       The above opcode listings give two forms for general-purpose
+       register push instructions: for example, `PUSH BX' has the two forms
+       `53' and `FF F3'. NASM will always generate the shorter form when
+       given `PUSH BX'. NDISASM will disassemble both.
+
+       Unlike the undocumented and barely supported `POP CS', `PUSH CS' is
+       a perfectly valid and sensible instruction, supported on all
+       processors.
+
+       The instruction `PUSH SP' may be used to distinguish an 8086 from
+       later processors: on an 8086, the value of `SP' stored is the value
+       it has _after_ the push instruction, whereas on later processors it
+       is the value _before_ the push instruction.
+
+ A.135 `PUSHAx': Push All General-Purpose Registers
+
+       PUSHA                         ; 60                   [186] 
+       PUSHAD                        ; o32 60               [386] 
+       PUSHAW                        ; o16 60               [186]
+
+       `PUSHAW' pushes, in succession, `AX', `CX', `DX', `BX', `SP', `BP',
+       `SI' and `DI' on the stack, decrementing the stack pointer by a
+       total of 16.
+
+       `PUSHAD' pushes, in succession, `EAX', `ECX', `EDX', `EBX', `ESP',
+       `EBP', `ESI' and `EDI' on the stack, decrementing the stack pointer
+       by a total of 32.
+
+       In both cases, the value of `SP' or `ESP' pushed is its _original_
+       value, as it had before the instruction was executed.
+
+       `PUSHA' is an alias mnemonic for either `PUSHAW' or `PUSHAD',
+       depending on the current `BITS' setting.
+
+       Note that the registers are pushed in order of their numeric values
+       in opcodes (see section A.2.1).
+
+       See also `POPA' (section A.127).
+
+ A.136 `PUSHFx': Push Flags Register
+
+       PUSHF                         ; 9C                   [186] 
+       PUSHFD                        ; o32 9C               [386] 
+       PUSHFW                        ; o16 9C               [186]
+
+       `PUSHFW' pops a word from the stack and stores it in the bottom 16
+       bits of the flags register (or the whole flags register, on
+       processors below a 386). `PUSHFD' pops a doubleword and stores it in
+       the entire flags register.
+
+       `PUSHF' is an alias mnemonic for either `PUSHFW' or `PUSHFD',
+       depending on the current `BITS' setting.
+
+       See also `POPF' (section A.128).
+
+ A.137 `PXOR': MMX Bitwise XOR
+
+       PXOR mmxreg,r/m64             ; 0F EF /r             [PENT,MMX]
+
+       `PXOR' performs a bitwise XOR operation between its two operands
+       (i.e. each bit of the result is 1 if and only if exactly one of the
+       corresponding bits of the two inputs was 1), and stores the result
+       in the destination (first) operand.
+
+ A.138 `RCL', `RCR': Bitwise Rotate through Carry Bit
+
+       RCL r/m8,1                    ; D0 /2                [8086] 
+       RCL r/m8,CL                   ; D2 /2                [8086] 
+       RCL r/m8,imm8                 ; C0 /2 ib             [286] 
+       RCL r/m16,1                   ; o16 D1 /2            [8086] 
+       RCL r/m16,CL                  ; o16 D3 /2            [8086] 
+       RCL r/m16,imm8                ; o16 C1 /2 ib         [286] 
+       RCL r/m32,1                   ; o32 D1 /2            [386] 
+       RCL r/m32,CL                  ; o32 D3 /2            [386] 
+       RCL r/m32,imm8                ; o32 C1 /2 ib         [386]
+
+       RCR r/m8,1                    ; D0 /3                [8086] 
+       RCR r/m8,CL                   ; D2 /3                [8086] 
+       RCR r/m8,imm8                 ; C0 /3 ib             [286] 
+       RCR r/m16,1                   ; o16 D1 /3            [8086] 
+       RCR r/m16,CL                  ; o16 D3 /3            [8086] 
+       RCR r/m16,imm8                ; o16 C1 /3 ib         [286] 
+       RCR r/m32,1                   ; o32 D1 /3            [386] 
+       RCR r/m32,CL                  ; o32 D3 /3            [386] 
+       RCR r/m32,imm8                ; o32 C1 /3 ib         [386]
+
+       `RCL' and `RCR' perform a 9-bit, 17-bit or 33-bit bitwise rotation
+       operation, involving the given source/destination (first) operand
+       and the carry bit. Thus, for example, in the operation `RCR AL,1', a
+       9-bit rotation is performed in which `AL' is shifted left by 1, the
+       top bit of `AL' moves into the carry flag, and the original value of
+       the carry flag is placed in the low bit of `AL'.
+
+       The number of bits to rotate by is given by the second operand. Only
+       the bottom five bits of the rotation count are considered by
+       processors above the 8086.
+
+       You can force the longer (286 and upwards, beginning with a `C1'
+       byte) form of `RCL foo,1' by using a `BYTE' prefix:
+       `RCL foo,BYTE 1'. Similarly with `RCR'.
+
+ A.139 `RDMSR': Read Model-Specific Registers
+
+       RDMSR                         ; 0F 32                [PENT]
+
+       `RDMSR' reads the processor Model-Specific Register (MSR) whose
+       index is stored in `ECX', and stores the result in `EDX:EAX'. See
+       also `WRMSR' (section A.165).
+
+ A.140 `RDPMC': Read Performance-Monitoring Counters
+
+       RDPMC                         ; 0F 33                [P6]
+
+       `RDPMC' reads the processor performance-monitoring counter whose
+       index is stored in `ECX', and stores the result in `EDX:EAX'.
+
+ A.141 `RDTSC': Read Time-Stamp Counter
+
+       RDTSC                         ; 0F 31                [PENT]
+
+       `RDTSC' reads the processor's time-stamp counter into `EDX:EAX'.
+
+ A.142 `RET', `RETF', `RETN': Return from Procedure Call
+
+       RET                           ; C3                   [8086] 
+       RET imm16                     ; C2 iw                [8086]
+
+       RETF                          ; CB                   [8086] 
+       RETF imm16                    ; CA iw                [8086]
+
+       RETN                          ; C3                   [8086] 
+       RETN imm16                    ; C2 iw                [8086]
+
+       `RET', and its exact synonym `RETN', pop `IP' or `EIP' from the
+       stack and transfer control to the new address. Optionally, if a
+       numeric second operand is provided, they increment the stack pointer
+       by a further `imm16' bytes after popping the return address.
+
+       `RETF' executes a far return: after popping `IP'/`EIP', it then pops
+       `CS', and _then_ increments the stack pointer by the optional
+       argument if present.
+
+ A.143 `ROL', `ROR': Bitwise Rotate
+
+       ROL r/m8,1                    ; D0 /0                [8086] 
+       ROL r/m8,CL                   ; D2 /0                [8086] 
+       ROL r/m8,imm8                 ; C0 /0 ib             [286] 
+       ROL r/m16,1                   ; o16 D1 /0            [8086] 
+       ROL r/m16,CL                  ; o16 D3 /0            [8086] 
+       ROL r/m16,imm8                ; o16 C1 /0 ib         [286] 
+       ROL r/m32,1                   ; o32 D1 /0            [386] 
+       ROL r/m32,CL                  ; o32 D3 /0            [386] 
+       ROL r/m32,imm8                ; o32 C1 /0 ib         [386]
+
+       ROR r/m8,1                    ; D0 /1                [8086] 
+       ROR r/m8,CL                   ; D2 /1                [8086] 
+       ROR r/m8,imm8                 ; C0 /1 ib             [286] 
+       ROR r/m16,1                   ; o16 D1 /1            [8086] 
+       ROR r/m16,CL                  ; o16 D3 /1            [8086] 
+       ROR r/m16,imm8                ; o16 C1 /1 ib         [286] 
+       ROR r/m32,1                   ; o32 D1 /1            [386] 
+       ROR r/m32,CL                  ; o32 D3 /1            [386] 
+       ROR r/m32,imm8                ; o32 C1 /1 ib         [386]
+
+       `ROL' and `ROR' perform a bitwise rotation operation on the given
+       source/destination (first) operand. Thus, for example, in the
+       operation `ROR AL,1', an 8-bit rotation is performed in which `AL'
+       is shifted left by 1 and the original top bit of `AL' moves round
+       into the low bit.
+
+       The number of bits to rotate by is given by the second operand. Only
+       the bottom 3, 4 or 5 bits (depending on the source operand size) of
+       the rotation count are considered by processors above the 8086.
+
+       You can force the longer (286 and upwards, beginning with a `C1'
+       byte) form of `ROL foo,1' by using a `BYTE' prefix:
+       `ROL foo,BYTE 1'. Similarly with `ROR'.
+
+ A.144 `RSM': Resume from System-Management Mode
+
+       RSM                           ; 0F AA                [PENT]
+
+       `RSM' returns the processor to its normal operating mode when it was
+       in System-Management Mode.
+
+ A.145 `SAHF': Store AH to Flags
+
+       SAHF                          ; 9E                   [8086]
+
+       `SAHF' sets the low byte of the flags word according to the contents
+       of the `AH' register. See also `LAHF' (section A.90).
+
+ A.146 `SAL', `SAR': Bitwise Arithmetic Shifts
+
+       SAL r/m8,1                    ; D0 /4                [8086] 
+       SAL r/m8,CL                   ; D2 /4                [8086] 
+       SAL r/m8,imm8                 ; C0 /4 ib             [286] 
+       SAL r/m16,1                   ; o16 D1 /4            [8086] 
+       SAL r/m16,CL                  ; o16 D3 /4            [8086] 
+       SAL r/m16,imm8                ; o16 C1 /4 ib         [286] 
+       SAL r/m32,1                   ; o32 D1 /4            [386] 
+       SAL r/m32,CL                  ; o32 D3 /4            [386] 
+       SAL r/m32,imm8                ; o32 C1 /4 ib         [386]
+
+       SAR r/m8,1                    ; D0 /0                [8086] 
+       SAR r/m8,CL                   ; D2 /0                [8086] 
+       SAR r/m8,imm8                 ; C0 /0 ib             [286] 
+       SAR r/m16,1                   ; o16 D1 /0            [8086] 
+       SAR r/m16,CL                  ; o16 D3 /0            [8086] 
+       SAR r/m16,imm8                ; o16 C1 /0 ib         [286] 
+       SAR r/m32,1                   ; o32 D1 /0            [386] 
+       SAR r/m32,CL                  ; o32 D3 /0            [386] 
+       SAR r/m32,imm8                ; o32 C1 /0 ib         [386]
+
+       `SAL' and `SAR' perform an arithmetic shift operation on the given
+       source/destination (first) operand. The vacated bits are filled with
+       zero for `SAL', and with copies of the original high bit of the
+       source operand for `SAR'.
+
+       `SAL' is a synonym for `SHL' (see section A.152). NASM will assemble
+       either one to the same code, but NDISASM will always disassemble
+       that code as `SHL'.
+
+       The number of bits to shift by is given by the second operand. Only
+       the bottom 3, 4 or 5 bits (depending on the source operand size) of
+       the shift count are considered by processors above the 8086.
+
+       You can force the longer (286 and upwards, beginning with a `C1'
+       byte) form of `SAL foo,1' by using a `BYTE' prefix:
+       `SAL foo,BYTE 1'. Similarly with `SAR'.
+
+ A.147 `SALC': Set AL from Carry Flag
+
+       SALC                          ; D6                   [8086,UNDOC]
+
+       `SALC' is an early undocumented instruction similar in concept to
+       `SETcc' (section A.150). Its function is to set `AL' to zero if the
+       carry flag is clear, or to `0xFF' if it is set.
+
+ A.148 `SBB': Subtract with Borrow
+
+       SBB r/m8,reg8                 ; 18 /r                [8086] 
+       SBB r/m16,reg16               ; o16 19 /r            [8086] 
+       SBB r/m32,reg32               ; o32 19 /r            [386]
+
+       SBB reg8,r/m8                 ; 1A /r                [8086] 
+       SBB reg16,r/m16               ; o16 1B /r            [8086] 
+       SBB reg32,r/m32               ; o32 1B /r            [386]
+
+       SBB r/m8,imm8                 ; 80 /3 ib             [8086] 
+       SBB r/m16,imm16               ; o16 81 /3 iw         [8086] 
+       SBB r/m32,imm32               ; o32 81 /3 id         [386]
+
+       SBB r/m16,imm8                ; o16 83 /3 ib         [8086] 
+       SBB r/m32,imm8                ; o32 83 /3 ib         [8086]
+
+       SBB AL,imm8                   ; 1C ib                [8086] 
+       SBB AX,imm16                  ; o16 1D iw            [8086] 
+       SBB EAX,imm32                 ; o32 1D id            [386]
+
+       `SBB' performs integer subtraction: it subtracts its second operand,
+       plus the value of the carry flag, from its first, and leaves the
+       result in its destination (first) operand. The flags are set
+       according to the result of the operation: in particular, the carry
+       flag is affected and can be used by a subsequent `SBB' instruction.
+
+       In the forms with an 8-bit immediate second operand and a longer
+       first operand, the second operand is considered to be signed, and is
+       sign-extended to the length of the first operand. In these cases,
+       the `BYTE' qualifier is necessary to force NASM to generate this
+       form of the instruction.
+
+       To subtract one number from another without also subtracting the
+       contents of the carry flag, use `SUB' (section A.159).
+
+ A.149 `SCASB', `SCASW', `SCASD': Scan String
+
+       SCASB                         ; AE                   [8086] 
+       SCASW                         ; o16 AF               [8086] 
+       SCASD                         ; o32 AF               [386]
+
+       `SCASB' compares the byte in `AL' with the byte at `[ES:DI]' or
+       `[ES:EDI]', and sets the flags accordingly. It then increments or
+       decrements (depending on the direction flag: increments if the flag
+       is clear, decrements if it is set) `DI' (or `EDI').
+
+       The register used is `DI' if the address size is 16 bits, and `EDI'
+       if it is 32 bits. If you need to use an address size not equal to
+       the current `BITS' setting, you can use an explicit `a16' or `a32'
+       prefix.
+
+       Segment override prefixes have no effect for this instruction: the
+       use of `ES' for the load from `[DI]' or `[EDI]' cannot be
+       overridden.
+
+       `SCASW' and `SCASD' work in the same way, but they compare a word to
+       `AX' or a doubleword to `EAX' instead of a byte to `AL', and
+       increment or decrement the addressing registers by 2 or 4 instead of
+       1.
+
+       The `REPE' and `REPNE' prefixes (equivalently, `REPZ' and `REPNZ')
+       may be used to repeat the instruction up to `CX' (or `ECX' - again,
+       the address size chooses which) times until the first unequal or
+       equal byte is found.
+
+ A.150 `SETcc': Set Register from Condition
+
+       SETcc r/m8                    ; 0F 90+cc /2          [386]
+
+       `SETcc' sets the given 8-bit operand to zero if its condition is not
+       satisfied, and to 1 if it is.
+
+ A.151 `SGDT', `SIDT', `SLDT': Store Descriptor Table Pointers
+
+       SGDT mem                      ; 0F 01 /0             [286,PRIV] 
+       SIDT mem                      ; 0F 01 /1             [286,PRIV] 
+       SLDT r/m16                    ; 0F 00 /0             [286,PRIV]
+
+       `SGDT' and `SIDT' both take a 6-byte memory area as an operand: they
+       store the contents of the GDTR (global descriptor table register) or
+       IDTR (interrupt descriptor table register) into that area as a 32-
+       bit linear address and a 16-bit size limit from that area (in that
+       order). These are the only instructions which directly use _linear_
+       addresses, rather than segment/offset pairs.
+
+       `SLDT' stores the segment selector corresponding to the LDT (local
+       descriptor table) into the given operand.
+
+       See also `LGDT', `LIDT' and `LLDT' (section A.95).
+
+ A.152 `SHL', `SHR': Bitwise Logical Shifts
+
+       SHL r/m8,1                    ; D0 /4                [8086] 
+       SHL r/m8,CL                   ; D2 /4                [8086] 
+       SHL r/m8,imm8                 ; C0 /4 ib             [286] 
+       SHL r/m16,1                   ; o16 D1 /4            [8086] 
+       SHL r/m16,CL                  ; o16 D3 /4            [8086] 
+       SHL r/m16,imm8                ; o16 C1 /4 ib         [286] 
+       SHL r/m32,1                   ; o32 D1 /4            [386] 
+       SHL r/m32,CL                  ; o32 D3 /4            [386] 
+       SHL r/m32,imm8                ; o32 C1 /4 ib         [386]
+
+       SHR r/m8,1                    ; D0 /5                [8086] 
+       SHR r/m8,CL                   ; D2 /5                [8086] 
+       SHR r/m8,imm8                 ; C0 /5 ib             [286] 
+       SHR r/m16,1                   ; o16 D1 /5            [8086] 
+       SHR r/m16,CL                  ; o16 D3 /5            [8086] 
+       SHR r/m16,imm8                ; o16 C1 /5 ib         [286] 
+       SHR r/m32,1                   ; o32 D1 /5            [386] 
+       SHR r/m32,CL                  ; o32 D3 /5            [386] 
+       SHR r/m32,imm8                ; o32 C1 /5 ib         [386]
+
+       `SHL' and `SHR' perform a logical shift operation on the given
+       source/destination (first) operand. The vacated bits are filled with
+       zero.
+
+       A synonym for `SHL' is `SAL' (see section A.146). NASM will assemble
+       either one to the same code, but NDISASM will always disassemble
+       that code as `SHL'.
+
+       The number of bits to shift by is given by the second operand. Only
+       the bottom 3, 4 or 5 bits (depending on the source operand size) of
+       the shift count are considered by processors above the 8086.
+
+       You can force the longer (286 and upwards, beginning with a `C1'
+       byte) form of `SHL foo,1' by using a `BYTE' prefix:
+       `SHL foo,BYTE 1'. Similarly with `SHR'.
+
+ A.153 `SHLD', `SHRD': Bitwise Double-Precision Shifts
+
+       SHLD r/m16,reg16,imm8         ; o16 0F A4 /r ib      [386] 
+       SHLD r/m16,reg32,imm8         ; o32 0F A4 /r ib      [386] 
+       SHLD r/m16,reg16,CL           ; o16 0F A5 /r         [386] 
+       SHLD r/m16,reg32,CL           ; o32 0F A5 /r         [386]
+
+       SHRD r/m16,reg16,imm8         ; o16 0F AC /r ib      [386] 
+       SHRD r/m32,reg32,imm8         ; o32 0F AC /r ib      [386] 
+       SHRD r/m16,reg16,CL           ; o16 0F AD /r         [386] 
+       SHRD r/m32,reg32,CL           ; o32 0F AD /r         [386]
+
+       `SHLD' performs a double-precision left shift. It notionally places
+       its second operand to the right of its first, then shifts the entire
+       bit string thus generated to the left by a number of bits specified
+       in the third operand. It then updates only the _first_ operand
+       according to the result of this. The second operand is not modified.
+
+       `SHRD' performs the corresponding right shift: it notionally places
+       the second operand to the _left_ of the first, shifts the whole bit
+       string right, and updates only the first operand.
+
+       For example, if `EAX' holds `0x01234567' and `EBX' holds
+       `0x89ABCDEF', then the instruction `SHLD EAX,EBX,4' would update
+       `EAX' to hold `0x12345678'. Under the same conditions,
+       `SHRD EAX,EBX,4' would update `EAX' to hold `0xF0123456'.
+
+       The number of bits to shift by is given by the third operand. Only
+       the bottom 5 bits of the shift count are considered.
+
+ A.154 `SMI': System Management Interrupt
+
+       SMI                           ; F1                   [386,UNDOC]
+
+       This is an opcode apparently supported by some AMD processors (which
+       is why it can generate the same opcode as `INT1'), and places the
+       machine into system-management mode, a special debugging mode.
+
+ A.155 `SMSW': Store Machine Status Word
+
+       SMSW r/m16                    ; 0F 01 /4             [286,PRIV]
+
+       `SMSW' stores the bottom half of the `CR0' control register (or the
+       Machine Status Word, on 286 processors) into the destination
+       operand. See also `LMSW' (section A.96).
+
+ A.156 `STC', `STD', `STI': Set Flags
+
+       STC                           ; F9                   [8086] 
+       STD                           ; FD                   [8086] 
+       STI                           ; FB                   [8086]
+
+       These instructions set various flags. `STC' sets the carry flag;
+       `STD' sets the direction flag; and `STI' sets the interrupt flag
+       (thus enabling interrupts).
+
+       To clear the carry, direction, or interrupt flags, use the `CLC',
+       `CLD' and `CLI' instructions (section A.15). To invert the carry
+       flag, use `CMC' (section A.16).
+
+ A.157 `STOSB', `STOSW', `STOSD': Store Byte to String
+
+       STOSB                         ; AA                   [8086] 
+       STOSW                         ; o16 AB               [8086] 
+       STOSD                         ; o32 AB               [386]
+
+       `STOSB' stores the byte in `AL' at `[ES:DI]' or `[ES:EDI]', and sets
+       the flags accordingly. It then increments or decrements (depending
+       on the direction flag: increments if the flag is clear, decrements
+       if it is set) `DI' (or `EDI').
+
+       The register used is `DI' if the address size is 16 bits, and `EDI'
+       if it is 32 bits. If you need to use an address size not equal to
+       the current `BITS' setting, you can use an explicit `a16' or `a32'
+       prefix.
+
+       Segment override prefixes have no effect for this instruction: the
+       use of `ES' for the store to `[DI]' or `[EDI]' cannot be overridden.
+
+       `STOSW' and `STOSD' work in the same way, but they store the word in
+       `AX' or the doubleword in `EAX' instead of the byte in `AL', and
+       increment or decrement the addressing registers by 2 or 4 instead of
+       1.
+
+       The `REP' prefix may be used to repeat the instruction `CX' (or
+       `ECX' - again, the address size chooses which) times.
+
+ A.158 `STR': Store Task Register
+
+       STR r/m16                     ; 0F 00 /1             [286,PRIV]
+
+       `STR' stores the segment selector corresponding to the contents of
+       the Task Register into its operand.
+
+ A.159 `SUB': Subtract Integers
+
+       SUB r/m8,reg8                 ; 28 /r                [8086] 
+       SUB r/m16,reg16               ; o16 29 /r            [8086] 
+       SUB r/m32,reg32               ; o32 29 /r            [386]
+
+       SUB reg8,r/m8                 ; 2A /r                [8086] 
+       SUB reg16,r/m16               ; o16 2B /r            [8086] 
+       SUB reg32,r/m32               ; o32 2B /r            [386]
+
+       SUB r/m8,imm8                 ; 80 /5 ib             [8086] 
+       SUB r/m16,imm16               ; o16 81 /5 iw         [8086] 
+       SUB r/m32,imm32               ; o32 81 /5 id         [386]
+
+       SUB r/m16,imm8                ; o16 83 /5 ib         [8086] 
+       SUB r/m32,imm8                ; o32 83 /5 ib         [386]
+
+       SUB AL,imm8                   ; 2C ib                [8086] 
+       SUB AX,imm16                  ; o16 2D iw            [8086] 
+       SUB EAX,imm32                 ; o32 2D id            [386]
+
+       `SUB' performs integer subtraction: it subtracts its second operand
+       from its first, and leaves the result in its destination (first)
+       operand. The flags are set according to the result of the operation:
+       in particular, the carry flag is affected and can be used by a
+       subsequent `SBB' instruction (section A.148).
+
+       In the forms with an 8-bit immediate second operand and a longer
+       first operand, the second operand is considered to be signed, and is
+       sign-extended to the length of the first operand. In these cases,
+       the `BYTE' qualifier is necessary to force NASM to generate this
+       form of the instruction.
+
+ A.160 `TEST': Test Bits (notional bitwise AND)
+
+       TEST r/m8,reg8                ; 84 /r                [8086] 
+       TEST r/m16,reg16              ; o16 85 /r            [8086] 
+       TEST r/m32,reg32              ; o32 85 /r            [386]
+
+       TEST r/m8,imm8                ; F6 /7 ib             [8086] 
+       TEST r/m16,imm16              ; o16 F7 /7 iw         [8086] 
+       TEST r/m32,imm32              ; o32 F7 /7 id         [386]
+
+       TEST AL,imm8                  ; A8 ib                [8086] 
+       TEST AX,imm16                 ; o16 A9 iw            [8086] 
+       TEST EAX,imm32                ; o32 A9 id            [386]
+
+       `TEST' performs a `mental' bitwise AND of its two operands, and
+       affects the flags as if the operation had taken place, but does not
+       store the result of the operation anywhere.
+
+ A.161 `UMOV': User Move Data
+
+       UMOV r/m8,reg8                ; 0F 10 /r             [386,UNDOC] 
+       UMOV r/m16,reg16              ; o16 0F 11 /r         [386,UNDOC] 
+       UMOV r/m32,reg32              ; o32 0F 11 /r         [386,UNDOC]
+
+       UMOV reg8,r/m8                ; 0F 12 /r             [386,UNDOC] 
+       UMOV reg16,r/m16              ; o16 0F 13 /r         [386,UNDOC] 
+       UMOV reg32,r/m32              ; o32 0F 13 /r         [386,UNDOC]
+
+       This undocumented instruction is used by in-circuit emulators to
+       access user memory (as opposed to host memory). It is used just like
+       an ordinary memory/register or register/register `MOV' instruction,
+       but accesses user space.
+
+ A.162 `VERR', `VERW': Verify Segment Readability/Writability
+
+       VERR r/m16                    ; 0F 00 /4             [286,PRIV]
+
+       VERW r/m16                    ; 0F 00 /5             [286,PRIV]
+
+       `VERR' sets the zero flag if the segment specified by the selector
+       in its operand can be read from at the current privilege level.
+       `VERW' sets the zero flag if the segment can be written.
+
+ A.163 `WAIT': Wait for Floating-Point Processor
+
+       WAIT                          ; 9B                   [8086]
+
+       `WAIT', on 8086 systems with a separate 8087 FPU, waits for the FPU
+       to have finished any operation it is engaged in before continuing
+       main processor operations, so that (for example) an FPU store to
+       main memory can be guaranteed to have completed before the CPU tries
+       to read the result back out.
+
+       On higher processors, `WAIT' is unnecessary for this purpose, and it
+       has the alternative purpose of ensuring that any pending unmasked
+       FPU exceptions have happened before execution continues.
+
+ A.164 `WBINVD': Write Back and Invalidate Cache
+
+       WBINVD                        ; 0F 09                [486]
+
+       `WBINVD' invalidates and empties the processor's internal caches,
+       and causes the processor to instruct external caches to do the same.
+       It writes the contents of the caches back to memory first, so no
+       data is lost. To flush the caches quickly without bothering to write
+       the data back first, use `INVD' (section A.84).
+
+ A.165 `WRMSR': Write Model-Specific Registers
+
+       WRMSR                         ; 0F 30                [PENT]
+
+       `WRMSR' writes the value in `EDX:EAX' to the processor Model-
+       Specific Register (MSR) whose index is stored in `ECX'. See also
+       `RDMSR' (section A.139).
+
+ A.166 `XADD': Exchange and Add
+
+       XADD r/m8,reg8                ; 0F C0 /r             [486] 
+       XADD r/m16,reg16              ; o16 0F C1 /r         [486] 
+       XADD r/m32,reg32              ; o32 0F C1 /r         [486]
+
+       `XADD' exchanges the values in its two operands, and then adds them
+       together and writes the result into the destination (first) operand.
+       This instruction can be used with a `LOCK' prefix for multi-
+       processor synchronisation purposes.
+
+ A.167 `XBTS': Extract Bit String
+
+       XBTS reg16,r/m16              ; o16 0F A6 /r         [386,UNDOC] 
+       XBTS reg32,r/m32              ; o32 0F A6 /r         [386,UNDOC]
+
+       No clear documentation seems to be available for this instruction:
+       the best I've been able to find reads `Takes a string of bits from
+       the first operand and puts them in the second operand'. It is
+       present only in early 386 processors, and conflicts with the opcodes
+       for `CMPXCHG486'. NASM supports it only for completeness. Its
+       counterpart is `IBTS' (see section A.75).
+
+ A.168 `XCHG': Exchange
+
+       XCHG reg8,r/m8                ; 86 /r                [8086] 
+       XCHG reg16,r/m8               ; o16 87 /r            [8086] 
+       XCHG reg32,r/m32              ; o32 87 /r            [386]
+
+       XCHG r/m8,reg8                ; 86 /r                [8086] 
+       XCHG r/m16,reg16              ; o16 87 /r            [8086] 
+       XCHG r/m32,reg32              ; o32 87 /r            [386]
+
+       XCHG AX,reg16                 ; o16 90+r             [8086] 
+       XCHG EAX,reg32                ; o32 90+r             [386] 
+       XCHG reg16,AX                 ; o16 90+r             [8086] 
+       XCHG reg32,EAX                ; o32 90+r             [386]
+
+       `XCHG' exchanges the values in its two operands. It can be used with
+       a `LOCK' prefix for purposes of multi-processor synchronisation.
+
+       `XCHG AX,AX' or `XCHG EAX,EAX' (depending on the `BITS' setting)
+       generates the opcode `90h', and so is a synonym for `NOP' (section
+       A.109).
+
+ A.169 `XLATB': Translate Byte in Lookup Table
+
+       XLATB                         ; D7                   [8086]
+
+       `XLATB' adds the value in `AL', treated as an unsigned byte, to `BX'
+       or `EBX', and loads the byte from the resulting address (in the
+       segment specified by `DS') back into `AL'.
+
+       The base register used is `BX' if the address size is 16 bits, and
+       `EBX' if it is 32 bits. If you need to use an address size not equal
+       to the current `BITS' setting, you can use an explicit `a16' or
+       `a32' prefix.
+
+       The segment register used to load from `[BX+AL]' or `[EBX+AL]' can
+       be overridden by using a segment register name as a prefix (for
+       example, `es xlatb').
+
+ A.170 `XOR': Bitwise Exclusive OR
+
+       XOR r/m8,reg8                 ; 30 /r                [8086] 
+       XOR r/m16,reg16               ; o16 31 /r            [8086] 
+       XOR r/m32,reg32               ; o32 31 /r            [386]
+
+       XOR reg8,r/m8                 ; 32 /r                [8086] 
+       XOR reg16,r/m16               ; o16 33 /r            [8086] 
+       XOR reg32,r/m32               ; o32 33 /r            [386]
+
+       XOR r/m8,imm8                 ; 80 /6 ib             [8086] 
+       XOR r/m16,imm16               ; o16 81 /6 iw         [8086] 
+       XOR r/m32,imm32               ; o32 81 /6 id         [386]
+
+       XOR r/m16,imm8                ; o16 83 /6 ib         [8086] 
+       XOR r/m32,imm8                ; o32 83 /6 ib         [386]
+
+       XOR AL,imm8                   ; 34 ib                [8086] 
+       XOR AX,imm16                  ; o16 35 iw            [8086] 
+       XOR EAX,imm32                 ; o32 35 id            [386]
+
+       `XOR' performs a bitwise XOR operation between its two operands
+       (i.e. each bit of the result is 1 if and only if exactly one of the
+       corresponding bits of the two inputs was 1), and stores the result
+       in the destination (first) operand.
+
+       In the forms with an 8-bit immediate second operand and a longer
+       first operand, the second operand is considered to be signed, and is
+       sign-extended to the length of the first operand. In these cases,
+       the `BYTE' qualifier is necessary to force NASM to generate this
+       form of the instruction.
+
+       The MMX instruction `PXOR' (see section A.137) performs the same
+       operation on the 64-bit MMX registers.
diff --git a/i386/nasm/eval.c b/i386/nasm/eval.c
new file mode 100644 (file)
index 0000000..f6020af
--- /dev/null
@@ -0,0 +1,784 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
+ * Reserved.  This file contains Original Code and/or Modifications of
+ * Original Code as defined in and that are subject to the Apple Public
+ * Source License Version 1.1 (the "License").  You may not use this file
+ * except in compliance with the License.  Please obtain a copy of the
+ * License at http://www.apple.com/publicsource and read it before using
+ * this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/* eval.c    expression evaluator for the Netwide Assembler
+ *
+ * The Netwide Assembler is copyright (C) 1996 Simon Tatham and
+ * Julian Hall. All rights reserved. The software is
+ * redistributable under the licence given in the file "Licence"
+ * distributed in the NASM archive.
+ *
+ * initial version 27/iii/95 by Simon Tatham
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <stddef.h>
+#include <string.h>
+#include <ctype.h>
+
+#include "nasm.h"
+#include "nasmlib.h"
+#include "eval.h"
+
+static expr **tempexprs = NULL;
+static int ntempexprs, tempexprs_size = 0;
+#define TEMPEXPRS_DELTA 128
+
+static expr *tempexpr;
+static int ntempexpr, tempexpr_size;
+#define TEMPEXPR_DELTA 8
+
+static scanner scan;
+static void *scpriv;
+static struct tokenval *tokval;
+static efunc error;
+static int i;
+static int seg, ofs;
+static char *label = NULL, special_empty_string[] = "";
+static lfunc labelfunc;
+static struct ofmt *outfmt;
+static int *forward;
+
+static struct eval_hints *hint;
+
+/*
+ * Construct a temporary expression.
+ */
+static void begintemp(void) {
+    tempexpr = NULL;
+    tempexpr_size = ntempexpr = 0;
+}
+
+static void addtotemp(long type, long value) {
+    while (ntempexpr >= tempexpr_size) {
+       tempexpr_size += TEMPEXPR_DELTA;
+       tempexpr = nasm_realloc(tempexpr,
+                                tempexpr_size*sizeof(*tempexpr));
+    }
+    tempexpr[ntempexpr].type = type;
+    tempexpr[ntempexpr++].value = value;
+}
+
+static expr *finishtemp(void) {
+    addtotemp (0L, 0L);                       /* terminate */
+    while (ntempexprs >= tempexprs_size) {
+       tempexprs_size += TEMPEXPRS_DELTA;
+       tempexprs = nasm_realloc(tempexprs,
+                                tempexprs_size*sizeof(*tempexprs));
+    }
+    return tempexprs[ntempexprs++] = tempexpr;
+}
+
+/*
+ * Add two vector datatypes. We have some bizarre behaviour on far-
+ * absolute segment types: we preserve them during addition _only_
+ * if one of the segments is a truly pure scalar.
+ */
+static expr *add_vectors(expr *p, expr *q) {
+    int preserve;
+
+    preserve = is_really_simple(p) || is_really_simple(q);
+
+    begintemp();
+
+    while (p->type && q->type &&
+          p->type < EXPR_SEGBASE+SEG_ABS &&
+          q->type < EXPR_SEGBASE+SEG_ABS) {
+       int lasttype;
+
+       if (p->type > q->type) {
+           addtotemp(q->type, q->value);
+           lasttype = q++->type;
+       } else if (p->type < q->type) {
+           addtotemp(p->type, p->value);
+           lasttype = p++->type;
+       } else {                       /* *p and *q have same type */
+           addtotemp(p->type, p->value + q->value);
+           lasttype = p->type;
+           p++, q++;
+       }
+       if (lasttype == EXPR_UNKNOWN) {
+           return finishtemp();
+       }
+    }
+    while (p->type &&
+          (preserve || p->type < EXPR_SEGBASE+SEG_ABS)) {
+       addtotemp(p->type, p->value);
+       p++;
+    }
+    while (q->type &&
+          (preserve || q->type < EXPR_SEGBASE+SEG_ABS)) {
+       addtotemp(q->type, q->value);
+       q++;
+    }
+
+    return finishtemp();
+}
+
+/*
+ * Multiply a vector by a scalar. Strip far-absolute segment part
+ * if present.
+ *
+ * Explicit treatment of UNKNOWN is not required in this routine,
+ * since it will silently do the Right Thing anyway.
+ *
+ * If `affect_hints' is set, we also change the hint type to
+ * NOTBASE if a MAKEBASE hint points at a register being
+ * multiplied. This allows [eax*1+ebx] to hint EBX rather than EAX
+ * as the base register.
+ */
+static expr *scalar_mult(expr *vect, long scalar, int affect_hints) {
+    expr *p = vect;
+
+    while (p->type && p->type < EXPR_SEGBASE+SEG_ABS) {
+       p->value = scalar * (p->value);
+       if (hint && hint->type == EAH_MAKEBASE &&
+           p->type == hint->base && affect_hints)
+           hint->type = EAH_NOTBASE;
+       p++;
+    }
+    p->type = 0;
+
+    return vect;
+}
+
+static expr *scalarvect (long scalar) {
+    begintemp();
+    addtotemp(EXPR_SIMPLE, scalar);
+    return finishtemp();
+}
+
+static expr *unknown_expr (void) {
+    begintemp();
+    addtotemp(EXPR_UNKNOWN, 1L);
+    return finishtemp();
+}
+
+/*
+ * The SEG operator: calculate the segment part of a relocatable
+ * value. Return NULL, as usual, if an error occurs. Report the
+ * error too.
+ */
+static expr *segment_part (expr *e) {
+    long seg;
+
+    if (is_unknown(e))
+       return unknown_expr();
+
+    if (!is_reloc(e)) {
+       error(ERR_NONFATAL, "cannot apply SEG to a non-relocatable value");
+       return NULL;
+    }
+
+    seg = reloc_seg(e);
+    if (seg == NO_SEG) {
+       error(ERR_NONFATAL, "cannot apply SEG to a non-relocatable value");
+       return NULL;
+    } else if (seg & SEG_ABS) {
+       return scalarvect(seg & ~SEG_ABS);
+    } else if (seg & 1) {
+       error(ERR_NONFATAL, "SEG applied to something which"
+             " is already a segment base");
+       return NULL;
+    }
+    else {
+       long base = outfmt->segbase(seg+1);
+
+       begintemp();
+       addtotemp((base == NO_SEG ? EXPR_UNKNOWN : EXPR_SEGBASE+base), 1L);
+       return finishtemp();
+    }
+}
+
+/*
+ * Recursive-descent parser. Called with a single boolean operand,
+ * which is TRUE if the evaluation is critical (i.e. unresolved
+ * symbols are an error condition). Must update the global `i' to
+ * reflect the token after the parsed string. May return NULL.
+ *
+ * evaluate() should report its own errors: on return it is assumed
+ * that if NULL has been returned, the error has already been
+ * reported.
+ */
+
+/*
+ * Grammar parsed is:
+ *
+ * expr  : bexpr [ WRT expr6 ]
+ * bexpr : rexp0 or expr0 depending on relative-mode setting
+ * rexp0 : rexp1 [ {||} rexp1...]
+ * rexp1 : rexp2 [ {^^} rexp2...]
+ * rexp2 : rexp3 [ {&&} rexp3...]
+ * rexp3 : expr0 [ {=,==,<>,!=,<,>,<=,>=} expr0 ]
+ * expr0 : expr1 [ {|} expr1...]
+ * expr1 : expr2 [ {^} expr2...]
+ * expr2 : expr3 [ {&} expr3...]
+ * expr3 : expr4 [ {<<,>>} expr4...]
+ * expr4 : expr5 [ {+,-} expr5...]
+ * expr5 : expr6 [ {*,/,%,//,%%} expr6...]
+ * expr6 : { ~,+,-,SEG } expr6
+ *       | (bexpr)
+ *       | symbol
+ *       | $
+ *       | number
+ */
+
+static expr *rexp0(int), *rexp1(int), *rexp2(int), *rexp3(int);
+
+static expr *expr0(int), *expr1(int), *expr2(int), *expr3(int);
+static expr *expr4(int), *expr5(int), *expr6(int);
+
+static expr *(*bexpr)(int);
+
+static expr *rexp0(int critical) {
+    expr *e, *f;
+
+    e = rexp1(critical);
+    if (!e)
+       return NULL;
+    while (i == TOKEN_DBL_OR) {
+       i = scan(scpriv, tokval);
+       f = rexp1(critical);
+       if (!f)
+           return NULL;
+       if (!(is_simple(e) || is_just_unknown(e)) ||
+           !(is_simple(f) || is_just_unknown(f))) {
+               error(ERR_NONFATAL, "`|' operator may only be applied to"
+                     " scalar values");
+           }
+       if (is_just_unknown(e) || is_just_unknown(f))
+           e = unknown_expr();
+       else
+           e = scalarvect ((long) (reloc_value(e) || reloc_value(f)));
+    }
+    return e;
+}
+
+static expr *rexp1(int critical) {
+    expr *e, *f;
+
+    e = rexp2(critical);
+    if (!e)
+       return NULL;
+    while (i == TOKEN_DBL_XOR) {
+       i = scan(scpriv, tokval);
+       f = rexp2(critical);
+       if (!f)
+           return NULL;
+       if (!(is_simple(e) || is_just_unknown(e)) ||
+           !(is_simple(f) || is_just_unknown(f))) {
+           error(ERR_NONFATAL, "`^' operator may only be applied to"
+                 " scalar values");
+       }
+       if (is_just_unknown(e) || is_just_unknown(f))
+           e = unknown_expr();
+       else
+           e = scalarvect ((long) (!reloc_value(e) ^ !reloc_value(f)));
+    }
+    return e;
+}
+
+static expr *rexp2(int critical) {
+    expr *e, *f;
+
+    e = rexp3(critical);
+    if (!e)
+       return NULL;
+    while (i == TOKEN_DBL_AND) {
+       i = scan(scpriv, tokval);
+       f = rexp3(critical);
+       if (!f)
+           return NULL;
+       if (!(is_simple(e) || is_just_unknown(e)) ||
+           !(is_simple(f) || is_just_unknown(f))) {
+           error(ERR_NONFATAL, "`&' operator may only be applied to"
+                 " scalar values");
+       }
+       if (is_just_unknown(e) || is_just_unknown(f))
+           e = unknown_expr();
+       else
+           e = scalarvect ((long) (reloc_value(e) && reloc_value(f)));
+    }
+    return e;
+}
+
+static expr *rexp3(int critical) {
+    expr *e, *f;
+    long v;
+
+    e = expr0(critical);
+    if (!e)
+       return NULL;
+    while (i == TOKEN_EQ || i == TOKEN_LT || i == TOKEN_GT ||
+          i == TOKEN_NE || i == TOKEN_LE || i == TOKEN_GE) {
+       int j = i;
+       i = scan(scpriv, tokval);
+       f = expr0(critical);
+       if (!f)
+           return NULL;
+       e = add_vectors (e, scalar_mult(f, -1L, FALSE));
+       switch (j) {
+         case TOKEN_EQ: case TOKEN_NE:
+           if (is_unknown(e))
+               v = -1;                /* means unknown */
+           else if (!is_really_simple(e) || reloc_value(e) != 0)
+               v = (j == TOKEN_NE);   /* unequal, so return TRUE if NE */
+           else
+               v = (j == TOKEN_EQ);   /* equal, so return TRUE if EQ */
+           break;
+         default:
+           if (is_unknown(e))
+               v = -1;                /* means unknown */
+           else if (!is_really_simple(e)) {
+               error(ERR_NONFATAL, "`%s': operands differ by a non-scalar",
+                     (j == TOKEN_LE ? "<=" : j == TOKEN_LT ? "<" :
+                      j == TOKEN_GE ? ">=" : ">"));
+               v = 0;                 /* must set it to _something_ */
+           } else {
+               int vv = reloc_value(e);
+               if (vv == 0)
+                   v = (j == TOKEN_LE || j == TOKEN_GE);
+               else if (vv > 0)
+                   v = (j == TOKEN_GE || j == TOKEN_GT);
+               else /* vv < 0 */
+                   v = (j == TOKEN_LE || j == TOKEN_LT);
+           }
+           break;
+       }
+       if (v == -1)
+           e = unknown_expr();
+       else
+           e = scalarvect(v);
+    }
+    return e;
+}
+
+static expr *expr0(int critical) {
+    expr *e, *f;
+
+    e = expr1(critical);
+    if (!e)
+       return NULL;
+    while (i == '|') {
+       i = scan(scpriv, tokval);
+       f = expr1(critical);
+       if (!f)
+           return NULL;
+       if (!(is_simple(e) || is_just_unknown(e)) ||
+           !(is_simple(f) || is_just_unknown(f))) {
+               error(ERR_NONFATAL, "`|' operator may only be applied to"
+                     " scalar values");
+           }
+       if (is_just_unknown(e) || is_just_unknown(f))
+           e = unknown_expr();
+       else
+           e = scalarvect (reloc_value(e) | reloc_value(f));
+    }
+    return e;
+}
+
+static expr *expr1(int critical) {
+    expr *e, *f;
+
+    e = expr2(critical);
+    if (!e)
+       return NULL;
+    while (i == '^') {
+       i = scan(scpriv, tokval);
+       f = expr2(critical);
+       if (!f)
+           return NULL;
+       if (!(is_simple(e) || is_just_unknown(e)) ||
+           !(is_simple(f) || is_just_unknown(f))) {
+           error(ERR_NONFATAL, "`^' operator may only be applied to"
+                 " scalar values");
+       }
+       if (is_just_unknown(e) || is_just_unknown(f))
+           e = unknown_expr();
+       else
+           e = scalarvect (reloc_value(e) ^ reloc_value(f));
+    }
+    return e;
+}
+
+static expr *expr2(int critical) {
+    expr *e, *f;
+
+    e = expr3(critical);
+    if (!e)
+       return NULL;
+    while (i == '&') {
+       i = scan(scpriv, tokval);
+       f = expr3(critical);
+       if (!f)
+           return NULL;
+       if (!(is_simple(e) || is_just_unknown(e)) ||
+           !(is_simple(f) || is_just_unknown(f))) {
+           error(ERR_NONFATAL, "`&' operator may only be applied to"
+                 " scalar values");
+       }
+       if (is_just_unknown(e) || is_just_unknown(f))
+           e = unknown_expr();
+       else
+           e = scalarvect (reloc_value(e) & reloc_value(f));
+    }
+    return e;
+}
+
+static expr *expr3(int critical) {
+    expr *e, *f;
+
+    e = expr4(critical);
+    if (!e)
+       return NULL;
+    while (i == TOKEN_SHL || i == TOKEN_SHR) {
+       int j = i;
+       i = scan(scpriv, tokval);
+       f = expr4(critical);
+       if (!f)
+           return NULL;
+       if (!(is_simple(e) || is_just_unknown(e)) ||
+           !(is_simple(f) || is_just_unknown(f))) {
+           error(ERR_NONFATAL, "shift operator may only be applied to"
+                 " scalar values");
+       } else if (is_just_unknown(e) || is_just_unknown(f)) {
+           e = unknown_expr();
+       } else switch (j) {
+         case TOKEN_SHL:
+           e = scalarvect (reloc_value(e) << reloc_value(f));
+           break;
+         case TOKEN_SHR:
+           e = scalarvect (((unsigned long)reloc_value(e)) >>
+                           reloc_value(f));
+           break;
+       }
+    }
+    return e;
+}
+
+static expr *expr4(int critical) {
+    expr *e, *f;
+
+    e = expr5(critical);
+    if (!e)
+       return NULL;
+    while (i == '+' || i == '-') {
+       int j = i;
+       i = scan(scpriv, tokval);
+       f = expr5(critical);
+       if (!f)
+           return NULL;
+       switch (j) {
+         case '+':
+           e = add_vectors (e, f);
+           break;
+         case '-':
+           e = add_vectors (e, scalar_mult(f, -1L, FALSE));
+           break;
+       }
+    }
+    return e;
+}
+
+static expr *expr5(int critical) {
+    expr *e, *f;
+
+    e = expr6(critical);
+    if (!e)
+       return NULL;
+    while (i == '*' || i == '/' || i == '%' ||
+          i == TOKEN_SDIV || i == TOKEN_SMOD) {
+       int j = i;
+       i = scan(scpriv, tokval);
+       f = expr6(critical);
+       if (!f)
+           return NULL;
+       if (j != '*' && (!(is_simple(e) || is_just_unknown(e)) ||
+                        !(is_simple(f) || is_just_unknown(f)))) {
+           error(ERR_NONFATAL, "division operator may only be applied to"
+                 " scalar values");
+           return NULL;
+       }
+       if (j != '*' && !is_unknown(f) && reloc_value(f) == 0) {
+           error(ERR_NONFATAL, "division by zero");
+           return NULL;
+       }
+       switch (j) {
+         case '*':
+           if (is_simple(e))
+               e = scalar_mult (f, reloc_value(e), TRUE);
+           else if (is_simple(f))
+               e = scalar_mult (e, reloc_value(f), TRUE);
+           else if (is_just_unknown(e) && is_just_unknown(f))
+               e = unknown_expr();
+           else {
+               error(ERR_NONFATAL, "unable to multiply two "
+                     "non-scalar objects");
+               return NULL;
+           }
+           break;
+         case '/':
+           if (is_just_unknown(e) || is_just_unknown(f))
+               e = unknown_expr();
+           else
+               e = scalarvect (((unsigned long)reloc_value(e)) /
+                               ((unsigned long)reloc_value(f)));
+           break;
+         case '%':
+           if (is_just_unknown(e) || is_just_unknown(f))
+               e = unknown_expr();
+           else
+               e = scalarvect (((unsigned long)reloc_value(e)) %
+                               ((unsigned long)reloc_value(f)));
+           break;
+         case TOKEN_SDIV:
+           if (is_just_unknown(e) || is_just_unknown(f))
+               e = unknown_expr();
+           else
+               e = scalarvect (((signed long)reloc_value(e)) /
+                               ((signed long)reloc_value(f)));
+           break;
+         case TOKEN_SMOD:
+           if (is_just_unknown(e) || is_just_unknown(f))
+               e = unknown_expr();
+           else
+               e = scalarvect (((signed long)reloc_value(e)) %
+                               ((signed long)reloc_value(f)));
+           break;
+       }
+    }
+    return e;
+}
+
+static expr *expr6(int critical) {
+    long type;
+    expr *e;
+    long label_seg, label_ofs;
+
+    if (i == '-') {
+       i = scan(scpriv, tokval);
+       e = expr6(critical);
+       if (!e)
+           return NULL;
+       return scalar_mult (e, -1L, FALSE);
+    } else if (i == '+') {
+       i = scan(scpriv, tokval);
+       return expr6(critical);
+    } else if (i == '~') {
+       i = scan(scpriv, tokval);
+       e = expr6(critical);
+       if (!e)
+           return NULL;
+       if (is_just_unknown(e))
+           return unknown_expr();
+       else if (!is_simple(e)) {
+           error(ERR_NONFATAL, "`~' operator may only be applied to"
+                 " scalar values");
+           return NULL;
+       }
+       return scalarvect(~reloc_value(e));
+    } else if (i == TOKEN_SEG) {
+       i = scan(scpriv, tokval);
+       e = expr6(critical);
+       if (!e)
+           return NULL;
+       e = segment_part(e);
+       if (is_unknown(e) && critical) {
+           error(ERR_NONFATAL, "unable to determine segment base");
+           return NULL;
+       }
+       return e;
+    } else if (i == '(') {
+       i = scan(scpriv, tokval);
+       e = bexpr(critical);
+       if (!e)
+           return NULL;
+       if (i != ')') {
+           error(ERR_NONFATAL, "expecting `)'");
+           return NULL;
+       }
+       i = scan(scpriv, tokval);
+       return e;
+    } else if (i == TOKEN_NUM || i == TOKEN_REG || i == TOKEN_ID ||
+              i == TOKEN_HERE || i == TOKEN_BASE) {
+       begintemp();
+       switch (i) {
+         case TOKEN_NUM:
+           addtotemp(EXPR_SIMPLE, tokval->t_integer);
+           break;
+         case TOKEN_REG:
+           addtotemp(tokval->t_integer, 1L);
+           if (hint && hint->type == EAH_NOHINT)
+               hint->base = tokval->t_integer, hint->type = EAH_MAKEBASE;
+           break;
+         case TOKEN_ID:
+         case TOKEN_HERE:
+         case TOKEN_BASE:
+           /*
+            * If "label" begins with "%", this indicates that no
+            * symbol, Here or Base references are valid because we
+            * are in preprocess-only mode.
+            */
+           if (*label == '%') {
+               error(ERR_NONFATAL,
+                     "%s not supported in preprocess-only mode",
+                     (i == TOKEN_ID ? "symbol references" :
+                      i == TOKEN_HERE ? "`$'" : "`$$'"));
+               addtotemp(EXPR_UNKNOWN, 1L);
+               break;
+           }
+
+           /*
+            * Since the whole line is parsed before the label it
+            * defines is given to the label manager, we have
+            * problems with lines such as
+            *
+            *   end: TIMES 512-(end-start) DB 0
+            *
+            * where `end' is not known on pass one, despite not
+            * really being a forward reference, and due to
+            * criticality it is _needed_. Hence we check our label
+            * against the currently defined one, and do our own
+            * resolution of it if we have to.
+            */
+           type = EXPR_SIMPLE;        /* might get overridden by UNKNOWN */
+           if (i == TOKEN_BASE) {
+               label_seg = seg;
+               label_ofs = 0;
+           } else if (i == TOKEN_HERE || !strcmp(tokval->t_charptr, label)) {
+               label_seg = seg;
+               label_ofs = ofs;
+           } else if (!labelfunc(tokval->t_charptr,&label_seg,&label_ofs)) {
+               if (critical == 2) {
+                   error (ERR_NONFATAL, "symbol `%s' undefined",
+                          tokval->t_charptr);
+                   return NULL;
+               } else if (critical == 1) {
+                   error (ERR_NONFATAL, "symbol `%s' not defined before use",
+                          tokval->t_charptr);
+                   return NULL;
+               } else {
+                   if (forward)
+                       *forward = TRUE;
+                   type = EXPR_UNKNOWN;
+                   label_seg = NO_SEG;
+                   label_ofs = 1;
+               }
+           }
+           addtotemp(type, label_ofs);
+           if (label_seg!=NO_SEG)
+               addtotemp(EXPR_SEGBASE + label_seg, 1L);
+           break;
+       }
+       i = scan(scpriv, tokval);
+       return finishtemp();
+    } else {
+       error(ERR_NONFATAL, "expression syntax error");
+       return NULL;
+    }
+}
+
+void eval_global_info (struct ofmt *output, lfunc lookup_label) {
+    outfmt = output;
+    labelfunc = lookup_label;
+}
+
+void eval_info (char *labelname, long segment, long offset) {
+    if (label != special_empty_string)
+       nasm_free (label);
+    if (labelname)
+       label = nasm_strdup(labelname);
+    else {
+       label = special_empty_string;
+       seg = segment;
+       ofs = offset;
+    }
+}
+
+expr *evaluate (scanner sc, void *scprivate, struct tokenval *tv,
+               int *fwref, int critical, efunc report_error,
+               struct eval_hints *hints) {
+    expr *e;
+    expr *f = NULL;
+
+    hint = hints;
+    if (hint)
+       hint->type = EAH_NOHINT;
+
+    if (critical & 0x10) {
+       critical &= ~0x10;
+       bexpr = rexp0;
+    } else
+       bexpr = expr0;
+
+    scan = sc;
+    scpriv = scprivate;
+    tokval = tv;
+    error = report_error;
+    forward = fwref;
+
+    if (tokval->t_type == TOKEN_INVALID)
+       i = scan(scpriv, tokval);
+    else
+       i = tokval->t_type;
+
+    while (ntempexprs)                /* initialise temporary storage */
+       nasm_free (tempexprs[--ntempexprs]);
+
+    e = bexpr (critical);
+    if (!e)
+       return NULL;
+
+    if (i == TOKEN_WRT) {
+       i = scan(scpriv, tokval);      /* eat the WRT */
+       f = expr6 (critical);
+       if (!f)
+           return NULL;
+    }
+    e = scalar_mult (e, 1L, FALSE);    /* strip far-absolute segment part */
+    if (f) {
+       expr *g;
+       if (is_just_unknown(f))
+           g = unknown_expr();
+       else {
+           long value;
+           begintemp();
+           if (!is_reloc(f)) {
+               error(ERR_NONFATAL, "invalid right-hand operand to WRT");
+               return NULL;
+           }
+           value = reloc_seg(f);
+           if (value == NO_SEG)
+               value = reloc_value(f) | SEG_ABS;
+           else if (!(value & SEG_ABS) && !(value % 2) && critical) {
+               error(ERR_NONFATAL, "invalid right-hand operand to WRT");
+               return NULL;
+           }
+           addtotemp(EXPR_WRT, value);
+           g = finishtemp();
+       }
+       e = add_vectors (e, g);
+    }
+    return e;
+}
diff --git a/i386/nasm/eval.h b/i386/nasm/eval.h
new file mode 100644 (file)
index 0000000..141276f
--- /dev/null
@@ -0,0 +1,57 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
+ * Reserved.  This file contains Original Code and/or Modifications of
+ * Original Code as defined in and that are subject to the Apple Public
+ * Source License Version 1.1 (the "License").  You may not use this file
+ * except in compliance with the License.  Please obtain a copy of the
+ * License at http://www.apple.com/publicsource and read it before using
+ * this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/* eval.h   header file for eval.c
+ *
+ * The Netwide Assembler is copyright (C) 1996 Simon Tatham and
+ * Julian Hall. All rights reserved. The software is
+ * redistributable under the licence given in the file "Licence"
+ * distributed in the NASM archive.
+ */
+
+#ifndef NASM_EVAL_H
+#define NASM_EVAL_H
+
+/*
+ * Called once to tell the evaluator what output format is
+ * providing segment-base details, and what function can be used to
+ * look labels up.
+ */
+void eval_global_info (struct ofmt *output, lfunc lookup_label);
+
+/*
+ * Called to set the information the evaluator needs: the value of
+ * $ is set from `segment' and `offset' if `labelname' is NULL, and
+ * otherwise the name of the current line's label is set from
+ * `labelname' instead.
+ */
+void eval_info (char *labelname, long segment, long offset);
+
+/*
+ * The evaluator itself.
+ */
+expr *evaluate (scanner sc, void *scprivate, struct tokenval *tv,
+               int *fwref, int critical, efunc report_error,
+               struct eval_hints *hints);
+
+#endif
diff --git a/i386/nasm/float.c b/i386/nasm/float.c
new file mode 100644 (file)
index 0000000..c7e6680
--- /dev/null
@@ -0,0 +1,416 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
+ * Reserved.  This file contains Original Code and/or Modifications of
+ * Original Code as defined in and that are subject to the Apple Public
+ * Source License Version 1.1 (the "License").  You may not use this file
+ * except in compliance with the License.  Please obtain a copy of the
+ * License at http://www.apple.com/publicsource and read it before using
+ * this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/* float.c     floating-point constant support for the Netwide Assembler
+ *
+ * The Netwide Assembler is copyright (C) 1996 Simon Tatham and
+ * Julian Hall. All rights reserved. The software is
+ * redistributable under the licence given in the file "Licence"
+ * distributed in the NASM archive.
+ *
+ * initial version 13/ix/96 by Simon Tatham
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "nasm.h"
+
+#define TRUE 1
+#define FALSE 0
+
+#define MANT_WORDS 6                  /* 64 bits + 32 for accuracy == 96 */
+#define MANT_DIGITS 28                /* 29 digits don't fit in 96 bits */
+
+/*
+ * guaranteed top bit of from is set
+ * => we only have to worry about _one_ bit shift to the left
+ */
+
+static int multiply(unsigned short *to, unsigned short *from) {
+    unsigned long temp[MANT_WORDS*2];
+    int i, j;
+
+    for (i=0; i<MANT_WORDS*2; i++)
+       temp[i] = 0;
+
+    for (i=0; i<MANT_WORDS; i++)
+       for (j=0; j<MANT_WORDS; j++) {
+           unsigned long n;
+           n = (unsigned long)to[i] * (unsigned long)from[j];
+           temp[i+j] += n >> 16;
+           temp[i+j+1] += n & 0xFFFF;
+       }
+
+    for (i=MANT_WORDS*2; --i ;) {
+       temp[i-1] += temp[i] >> 16;
+       temp[i] &= 0xFFFF;
+    }
+    if (temp[0] & 0x8000) {
+       for (i=0; i<MANT_WORDS; i++)
+           to[i] = temp[i] & 0xFFFF;
+       return 0;
+    } else {
+       for (i=0; i<MANT_WORDS; i++)
+           to[i] = (temp[i] << 1) + !!(temp[i+1] & 0x8000);
+       return -1;
+    }
+}
+
+static void flconvert(char *string, unsigned short *mant, long *exponent,
+                     efunc error) {
+    char digits[MANT_DIGITS], *p, *q, *r;
+    unsigned short mult[MANT_WORDS], *m, bit;
+    long tenpwr, twopwr;
+    int extratwos, started, seendot;
+
+    p = digits;
+    tenpwr = 0;
+    started = seendot = FALSE;
+    while (*string && *string != 'E' && *string != 'e') {
+       if (*string == '.') {
+           if (!seendot)
+               seendot = TRUE;
+           else {
+               error (ERR_NONFATAL,
+                      "too many periods in floating-point constant");
+               return;
+           }
+       } else if (*string >= '0' && *string <= '9') {
+           if (*string == '0' && !started) {
+               if (seendot)
+                   tenpwr--;
+           } else {
+               started = TRUE;
+               if (p < digits+sizeof(digits))
+                   *p++ = *string - '0';
+               if (!seendot)
+                   tenpwr++;
+           }
+       } else {
+           error (ERR_NONFATAL,
+                  "floating-point constant: `%c' is invalid character",
+                  *string);
+           return;
+       }
+       string++;
+    }
+    if (*string) {
+       string++;                      /* eat the E */
+       tenpwr += atoi(string);
+    }
+
+    /*
+     * At this point, the memory interval [digits,p) contains a
+     * series of decimal digits zzzzzzz such that our number X
+     * satisfies
+     *
+     * X = 0.zzzzzzz * 10^tenpwr
+     */
+
+    bit = 0x8000;
+    for (m=mant; m<mant+MANT_WORDS; m++)
+       *m = 0;
+    m = mant;
+    q = digits;
+    started = FALSE;
+    twopwr = 0;
+    while (m < mant+MANT_WORDS) {
+       unsigned short carry = 0;
+       while (p > q && !p[-1])
+           p--;
+       if (p <= q)
+           break;
+       for (r = p; r-- > q ;) {
+           int i;
+
+           i = 2 * *r + carry;
+           if (i >= 10)
+               carry = 1, i -= 10;
+           else
+               carry = 0;
+           *r = i;
+       }
+       if (carry)
+           *m |= bit, started = TRUE;
+       if (started) {
+           if (bit == 1)
+               bit = 0x8000, m++;
+           else
+               bit >>= 1;
+       } else
+           twopwr--;
+    }
+    twopwr += tenpwr;
+
+    /*
+     * At this point the `mant' array contains the first six
+     * fractional places of a base-2^16 real number, which when
+     * multiplied by 2^twopwr and 5^tenpwr gives X. So now we
+     * really do multiply by 5^tenpwr.
+     */
+
+    if (tenpwr < 0) {
+       for (m=mult; m<mult+MANT_WORDS; m++)
+           *m = 0xCCCC;
+       extratwos = -2;
+       tenpwr = -tenpwr;
+    } else if (tenpwr > 0) {
+       mult[0] = 0xA000;
+       for (m=mult+1; m<mult+MANT_WORDS; m++)
+           *m = 0;
+       extratwos = 3;
+    } else
+       extratwos = 0;
+    while (tenpwr) {
+       if (tenpwr & 1)
+           twopwr += extratwos + multiply (mant, mult);
+       extratwos = extratwos * 2 + multiply (mult, mult);
+       tenpwr >>= 1;
+    }
+
+    /*
+     * Conversion is done. The elements of `mant' contain the first
+     * fractional places of a base-2^16 real number in [0.5,1)
+     * which we can multiply by 2^twopwr to get X. Or, of course,
+     * it contains zero.
+     */
+    *exponent = twopwr;
+}
+
+/*
+ * Shift a mantissa to the right by i (i < 16) bits.
+ */
+static void shr(unsigned short *mant, int i) {
+    unsigned short n = 0, m;
+    int j;
+
+    for (j=0; j<MANT_WORDS; j++) {
+       m = (mant[j] << (16-i)) & 0xFFFF;
+       mant[j] = (mant[j] >> i) | n;
+       n = m;
+    }
+}
+
+/*
+ * Round a mantissa off after i words.
+ */
+static int round(unsigned short *mant, int i) {
+    if (mant[i] & 0x8000) {
+       do {
+           ++mant[--i];
+           mant[i] &= 0xFFFF;
+       } while (i > 0 && !mant[i]);
+       return !i && !mant[i];
+    }
+    return 0;
+}
+
+#define put(a,b) ( (*(a)=(b)), ((a)[1]=(b)>>8) )
+
+static int to_double(char *str, long sign, unsigned char *result,
+                    efunc error) {
+    unsigned short mant[MANT_WORDS];
+    long exponent;
+
+    sign = (sign < 0 ? 0x8000L : 0L);
+
+    flconvert (str, mant, &exponent, error);
+    if (mant[0] & 0x8000) {
+       /*
+        * Non-zero.
+        */
+       exponent--;
+       if (exponent >= -1022 && exponent <= 1024) {
+           /*
+            * Normalised.
+            */
+           exponent += 1023;
+           shr(mant, 11);
+           round(mant, 4);
+           if (mant[0] & 0x20)        /* did we scale up by one? */
+               shr(mant, 1), exponent++;
+           mant[0] &= 0xF;            /* remove leading one */
+           put(result+6,(exponent << 4) | mant[0] | sign);
+           put(result+4,mant[1]);
+           put(result+2,mant[2]);
+           put(result+0,mant[3]);
+       } else if (exponent < -1022 && exponent >= -1074) {
+           /*
+            * Denormal.
+            */
+           int shift = -(exponent+1011);
+           int sh = shift % 16, wds = shift / 16;
+           shr(mant, sh);
+           if (round(mant, 4-wds) || (sh>0 && (mant[0]&(0x8000>>(sh-1))))) {
+               shr(mant, 1);
+               if (sh==0)
+                   mant[0] |= 0x8000;
+               exponent++;
+           }
+           put(result+6,(wds == 0 ? mant[0] : 0) | sign);
+           put(result+4,(wds <= 1 ? mant[1-wds] : 0));
+           put(result+2,(wds <= 2 ? mant[2-wds] : 0));
+           put(result+0,(wds <= 3 ? mant[3-wds] : 0));
+       } else {
+           if (exponent > 0) {
+               error(ERR_NONFATAL, "overflow in floating-point constant");
+               return 0;
+           } else
+               memset (result, 0, 8);
+       }
+    } else {
+       /*
+        * Zero.
+        */
+       memset (result, 0, 8);
+    }
+    return 1;                         /* success */
+}
+
+static int to_float(char *str, long sign, unsigned char *result,
+                   efunc error) {
+    unsigned short mant[MANT_WORDS];
+    long exponent;
+
+    sign = (sign < 0 ? 0x8000L : 0L);
+
+    flconvert (str, mant, &exponent, error);
+    if (mant[0] & 0x8000) {
+       /*
+        * Non-zero.
+        */
+       exponent--;
+       if (exponent >= -126 && exponent <= 128) {
+           /*
+            * Normalised.
+            */
+           exponent += 127;
+           shr(mant, 8);
+           round(mant, 2);
+           if (mant[0] & 0x100)       /* did we scale up by one? */
+               shr(mant, 1), exponent++;
+           mant[0] &= 0x7F;           /* remove leading one */
+           put(result+2,(exponent << 7) | mant[0] | sign);
+           put(result+0,mant[1]);
+       } else if (exponent < -126 && exponent >= -149) {
+           /*
+            * Denormal.
+            */
+           int shift = -(exponent+118);
+           int sh = shift % 16, wds = shift / 16;
+           shr(mant, sh);
+           if (round(mant, 2-wds) || (sh>0 && (mant[0]&(0x8000>>(sh-1))))) {
+               shr(mant, 1);
+               if (sh==0)
+                   mant[0] |= 0x8000;
+               exponent++;
+           }
+           put(result+2,(wds == 0 ? mant[0] : 0) | sign);
+           put(result+0,(wds <= 1 ? mant[1-wds] : 0));
+       } else {
+           if (exponent > 0) {
+               error(ERR_NONFATAL, "overflow in floating-point constant");
+               return 0;
+           } else
+               memset (result, 0, 4);
+       }
+    } else {
+       memset (result, 0, 4);
+    }
+    return 1;
+}
+
+static int to_ldoub(char *str, long sign, unsigned char *result,
+                   efunc error) {
+    unsigned short mant[MANT_WORDS];
+    long exponent;
+
+    sign = (sign < 0 ? 0x8000L : 0L);
+
+    flconvert (str, mant, &exponent, error);
+    if (mant[0] & 0x8000) {
+       /*
+        * Non-zero.
+        */
+       exponent--;
+       if (exponent >= -16383 && exponent <= 16384) {
+           /*
+            * Normalised.
+            */
+           exponent += 16383;
+           if (round(mant, 4))        /* did we scale up by one? */
+               shr(mant, 1), mant[0] |= 0x8000, exponent++;
+           put(result+8,exponent | sign);
+           put(result+6,mant[0]);
+           put(result+4,mant[1]);
+           put(result+2,mant[2]);
+           put(result+0,mant[3]);
+       } else if (exponent < -16383 && exponent >= -16446) {
+           /*
+            * Denormal.
+            */
+           int shift = -(exponent+16383);
+           int sh = shift % 16, wds = shift / 16;
+           shr(mant, sh);
+           if (round(mant, 4-wds) || (sh>0 && (mant[0]&(0x8000>>(sh-1))))) {
+               shr(mant, 1);
+               if (sh==0)
+                   mant[0] |= 0x8000;
+               exponent++;
+           }
+           put(result+8,sign);
+           put(result+6,(wds == 0 ? mant[0] : 0));
+           put(result+4,(wds <= 1 ? mant[1-wds] : 0));
+           put(result+2,(wds <= 2 ? mant[2-wds] : 0));
+           put(result+0,(wds <= 3 ? mant[3-wds] : 0));
+       } else {
+           if (exponent > 0) {
+               error(ERR_NONFATAL, "overflow in floating-point constant");
+               return 0;
+           } else
+               memset (result, 0, 10);
+       }
+    } else {
+       /*
+        * Zero.
+        */
+       memset (result, 0, 10);
+    }
+    return 1;
+}
+
+int float_const (char *number, long sign, unsigned char *result, int bytes,
+                efunc error) {
+    if (bytes == 4)
+       return to_float (number, sign, result, error);
+    else if (bytes == 8)
+       return to_double (number, sign, result, error);
+    else if (bytes == 10)
+       return to_ldoub (number, sign, result, error);
+    else {
+       error(ERR_PANIC, "strange value %d passed to float_const", bytes);
+       return 0;
+    }
+}
diff --git a/i386/nasm/float.h b/i386/nasm/float.h
new file mode 100644 (file)
index 0000000..e95b262
--- /dev/null
@@ -0,0 +1,39 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
+ * Reserved.  This file contains Original Code and/or Modifications of
+ * Original Code as defined in and that are subject to the Apple Public
+ * Source License Version 1.1 (the "License").  You may not use this file
+ * except in compliance with the License.  Please obtain a copy of the
+ * License at http://www.apple.com/publicsource and read it before using
+ * this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/* float.h   header file for the floating-point constant module of
+ *          the Netwide Assembler
+ *
+ * The Netwide Assembler is copyright (C) 1996 Simon Tatham and
+ * Julian Hall. All rights reserved. The software is
+ * redistributable under the licence given in the file "Licence"
+ * distributed in the NASM archive.
+ */
+
+#ifndef NASM_FLOAT_H
+#define NASM_FLOAT_H
+
+int float_const (char *number, long sign, unsigned char *result, int bytes,
+                efunc error);
+
+#endif
diff --git a/i386/nasm/insns.dat b/i386/nasm/insns.dat
new file mode 100644 (file)
index 0000000..27436f1
--- /dev/null
@@ -0,0 +1,1039 @@
+; insns.dat    table of instructions for the Netwide Assembler
+;
+; The Netwide Assembler is copyright (C) 1996 Simon Tatham and
+; Julian Hall. All rights reserved. The software is
+; redistributable under the licence given in the file "Licence"
+; distributed in the NASM archive.
+;
+; Format of file: all four fields must be present on every functional
+; line. Hence `void' for no-operand instructions, and `\0' for such
+; as EQU. If the last three fields are all `ignore', no action is
+; taken except to register the opcode as being present. _ALL_ opcodes
+; listed in the `enum' in nasm.h must be present in here, in the
+; same order. This is to build the main instruction table for NASM.
+
+AAA       void                \1\x37                        8086
+AAD       void                \2\xD5\x0A                    8086
+AAD       imm                 \1\xD5\24                     8086
+AAM       void                \2\xD4\x0A                    8086
+AAM       imm                 \1\xD4\24                     8086
+AAS       void                \1\x3F                        8086
+ADC       mem,reg8            \300\1\x10\101                8086,SM
+ADC       reg8,reg8           \300\1\x10\101                8086
+ADC       mem,reg16           \320\300\1\x11\101            8086,SM
+ADC       reg16,reg16         \320\300\1\x11\101            8086
+ADC       mem,reg32           \321\300\1\x11\101            386,SM
+ADC       reg32,reg32         \321\300\1\x11\101            386
+ADC       reg8,mem            \301\1\x12\110                8086,SM
+ADC       reg8,reg8           \301\1\x12\110                8086
+ADC       reg16,mem           \320\301\1\x13\110            8086,SM
+ADC       reg16,reg16         \320\301\1\x13\110            8086
+ADC       reg32,mem           \321\301\1\x13\110            386,SM
+ADC       reg32,reg32         \321\301\1\x13\110            386
+ADC       rm16,imm8           \320\300\1\x83\202\15         8086
+ADC       rm32,imm8           \321\300\1\x83\202\15         386
+ADC       reg_al,imm          \1\x14\21                     8086,SM
+ADC       reg_ax,imm          \320\1\x15\31                 8086,SM
+ADC       reg_eax,imm         \321\1\x15\41                 386,SM
+ADC       rm8,imm             \300\1\x80\202\21             8086,SM
+ADC       rm16,imm            \320\300\1\x81\202\31         8086,SM
+ADC       rm32,imm            \321\300\1\x81\202\41         386,SM
+ADC       mem,imm8            \300\1\x80\202\21             8086,SM
+ADC       mem,imm16           \320\300\1\x81\202\31         8086,SM
+ADC       mem,imm32           \321\300\1\x81\202\41         386,SM
+ADD       mem,reg8            \300\17\101                   8086,SM
+ADD       reg8,reg8           \300\17\101                   8086
+ADD       mem,reg16           \320\300\1\x01\101            8086,SM
+ADD       reg16,reg16         \320\300\1\x01\101            8086
+ADD       mem,reg32           \321\300\1\x01\101            386,SM
+ADD       reg32,reg32         \321\300\1\x01\101            386
+ADD       reg8,mem            \301\1\x02\110                8086,SM
+ADD       reg8,reg8           \301\1\x02\110                8086
+ADD       reg16,mem           \320\301\1\x03\110            8086,SM
+ADD       reg16,reg16         \320\301\1\x03\110            8086
+ADD       reg32,mem           \321\301\1\x03\110            386,SM
+ADD       reg32,reg32         \321\301\1\x03\110            386
+ADD       rm16,imm8           \320\300\1\x83\200\15         8086
+ADD       rm32,imm8           \321\300\1\x83\200\15         386
+ADD       reg_al,imm          \1\x04\21                     8086,SM
+ADD       reg_ax,imm          \320\1\x05\31                 8086,SM
+ADD       reg_eax,imm         \321\1\x05\41                 386,SM
+ADD       rm8,imm             \300\1\x80\200\21             8086,SM
+ADD       rm16,imm            \320\300\1\x81\200\31         8086,SM
+ADD       rm32,imm            \321\300\1\x81\200\41         386,SM
+ADD       mem,imm8            \300\1\x80\200\21             8086,SM
+ADD       mem,imm16           \320\300\1\x81\200\31         8086,SM
+ADD       mem,imm32           \321\300\1\x81\200\41         386,SM
+AND       mem,reg8            \300\1\x20\101                8086,SM
+AND       reg8,reg8           \300\1\x20\101                8086
+AND       mem,reg16           \320\300\1\x21\101            8086,SM
+AND       reg16,reg16         \320\300\1\x21\101            8086
+AND       mem,reg32           \321\300\1\x21\101            386,SM
+AND       reg32,reg32         \321\300\1\x21\101            386
+AND       reg8,mem            \301\1\x22\110                8086,SM
+AND       reg8,reg8           \301\1\x22\110                8086
+AND       reg16,mem           \320\301\1\x23\110            8086,SM
+AND       reg16,reg16         \320\301\1\x23\110            8086
+AND       reg32,mem           \321\301\1\x23\110            386,SM
+AND       reg32,reg32         \321\301\1\x23\110            386
+AND       rm16,imm8           \320\300\1\x83\204\15         8086
+AND       rm32,imm8           \321\300\1\x83\204\15         386
+AND       reg_al,imm          \1\x24\21                     8086,SM
+AND       reg_ax,imm          \320\1\x25\31                 8086,SM
+AND       reg_eax,imm         \321\1\x25\41                 386,SM
+AND       rm8,imm             \300\1\x80\204\21             8086,SM
+AND       rm16,imm            \320\300\1\x81\204\31         8086,SM
+AND       rm32,imm            \321\300\1\x81\204\41         386,SM
+AND       mem,imm8            \300\1\x80\204\21             8086,SM
+AND       mem,imm16           \320\300\1\x81\204\31         8086,SM
+AND       mem,imm32           \321\300\1\x81\204\41         386,SM
+ARPL      mem,reg16           \300\1\x63\101                286,PRIV,SM
+ARPL      reg16,reg16         \300\1\x63\101                286,PRIV
+BOUND     reg16,mem           \320\301\1\x62\110            186
+BOUND     reg32,mem           \321\301\1\x62\110            386
+BSF       reg16,mem           \320\301\2\x0F\xBC\110        386,SM
+BSF       reg16,reg16         \320\301\2\x0F\xBC\110        386
+BSF       reg32,mem           \321\301\2\x0F\xBC\110        386,SM
+BSF       reg32,reg32         \321\301\2\x0F\xBC\110        386
+BSR       reg16,mem           \320\301\2\x0F\xBD\110        386,SM
+BSR       reg16,reg16         \320\301\2\x0F\xBD\110        386
+BSR       reg32,mem           \321\301\2\x0F\xBD\110        386,SM
+BSR       reg32,reg32         \321\301\2\x0F\xBD\110        386
+BSWAP     reg32               \321\1\x0F\10\xC8             486
+BT        mem,reg16           \320\300\2\x0F\xA3\101        386,SM
+BT        reg16,reg16         \320\300\2\x0F\xA3\101        386
+BT        mem,reg32           \321\300\2\x0F\xA3\101        386,SM
+BT        reg32,reg32         \321\300\2\x0F\xA3\101        386
+BT        rm16,imm            \320\300\2\x0F\xBA\204\25     386
+BT        rm32,imm            \321\300\2\x0F\xBA\204\25     386
+BTC       mem,reg16           \320\300\2\x0F\xBB\101        386,SM
+BTC       reg16,reg16         \320\300\2\x0F\xBB\101        386
+BTC       mem,reg32           \321\300\2\x0F\xBB\101        386,SM
+BTC       reg32,reg32         \321\300\2\x0F\xBB\101        386
+BTC       rm16,imm            \320\300\2\x0F\xBA\207\25     386
+BTC       rm32,imm            \321\300\2\x0F\xBA\207\25     386
+BTR       mem,reg16           \320\300\2\x0F\xB3\101        386,SM
+BTR       reg16,reg16         \320\300\2\x0F\xB3\101        386
+BTR       mem,reg32           \321\300\2\x0F\xB3\101        386,SM
+BTR       reg32,reg32         \321\300\2\x0F\xB3\101        386
+BTR       rm16,imm            \320\300\2\x0F\xBA\206\25     386
+BTR       rm32,imm            \321\300\2\x0F\xBA\206\25     386
+BTS       mem,reg16           \320\300\2\x0F\xAB\101        386,SM
+BTS       reg16,reg16         \320\300\2\x0F\xAB\101        386
+BTS       mem,reg32           \321\300\2\x0F\xAB\101        386,SM
+BTS       reg32,reg32         \321\300\2\x0F\xAB\101        386
+BTS       rm16,imm            \320\300\2\x0F\xBA\205\25     386
+BTS       rm32,imm            \321\300\2\x0F\xBA\205\25     386
+CALL      imm                 \322\1\xE8\64                 8086
+CALL      imm|far             \322\1\x9A\34\37              8086,ND
+CALL      imm:imm             \322\1\x9A\35\30              8086
+CALL      imm16:imm           \320\1\x9A\31\30              8086
+CALL      imm:imm16           \320\1\x9A\31\30              8086
+CALL      imm32:imm           \321\1\x9A\41\30              386
+CALL      imm:imm32           \321\1\x9A\41\30              386
+CALL      mem|far             \322\300\1\xFF\203            8086
+CALL      mem16|far           \320\300\1\xFF\203            8086
+CALL      mem32|far           \321\300\1\xFF\203            386
+CALL      mem|near            \322\300\1\xFF\202            8086
+CALL      mem16|near          \320\300\1\xFF\202            8086
+CALL      mem32|near          \321\300\1\xFF\202            386
+CALL      reg16               \320\300\1\xFF\202            8086
+CALL      reg32               \321\300\1\xFF\202            386
+CALL      mem                 \322\300\1\xFF\202            8086
+CALL      mem16               \320\300\1\xFF\202            8086
+CALL      mem32               \321\300\1\xFF\202            386
+CBW       void                \320\1\x98                    8086
+CDQ       void                \321\1\x99                    386
+CLC       void                \1\xF8                        8086
+CLD       void                \1\xFC                        8086
+CLI       void                \1\xFA                        8086
+CLTS      void                \2\x0F\x06                    286,PRIV
+CMC       void                \1\xF5                        8086
+CMP       mem,reg8            \300\1\x38\101                8086,SM
+CMP       reg8,reg8           \300\1\x38\101                8086
+CMP       mem,reg16           \320\300\1\x39\101            8086,SM
+CMP       reg16,reg16         \320\300\1\x39\101            8086
+CMP       mem,reg32           \321\300\1\x39\101            386,SM
+CMP       reg32,reg32         \321\300\1\x39\101            386
+CMP       reg8,mem            \301\1\x3A\110                8086,SM
+CMP       reg8,reg8           \301\1\x3A\110                8086
+CMP       reg16,mem           \320\301\1\x3B\110            8086,SM
+CMP       reg16,reg16         \320\301\1\x3B\110            8086
+CMP       reg32,mem           \321\301\1\x3B\110            386,SM
+CMP       reg32,reg32         \321\301\1\x3B\110            386
+CMP       rm16,imm8           \320\300\1\x83\207\15         8086
+CMP       rm32,imm8           \321\300\1\x83\207\15         386
+CMP       reg_al,imm          \1\x3C\21                     8086,SM
+CMP       reg_ax,imm          \320\1\x3D\31                 8086,SM
+CMP       reg_eax,imm         \321\1\x3D\41                 386,SM
+CMP       rm8,imm             \300\1\x80\207\21             8086,SM
+CMP       rm16,imm            \320\300\1\x81\207\31         8086,SM
+CMP       rm32,imm            \321\300\1\x81\207\41         386,SM
+CMP       mem,imm8            \300\1\x80\207\21             8086,SM
+CMP       mem,imm16           \320\300\1\x81\207\31         8086,SM
+CMP       mem,imm32           \321\300\1\x81\207\41         386,SM
+CMPSB     void                \1\xA6                        8086
+CMPSD     void                \321\1\xA7                    386
+CMPSW     void                \320\1\xA7                    8086
+CMPXCHG   mem,reg8            \300\2\x0F\xB0\101            PENT,SM
+CMPXCHG   reg8,reg8           \300\2\x0F\xB0\101            PENT
+CMPXCHG   mem,reg16           \320\300\2\x0F\xB1\101        PENT,SM
+CMPXCHG   reg16,reg16         \320\300\2\x0F\xB1\101        PENT
+CMPXCHG   mem,reg32           \321\300\2\x0F\xB1\101        PENT,SM
+CMPXCHG   reg32,reg32         \321\300\2\x0F\xB1\101        PENT
+CMPXCHG486 mem,reg8           \300\2\x0F\xA6\101            486,SM,UNDOC
+CMPXCHG486 reg8,reg8          \300\2\x0F\xA6\101            486,UNDOC
+CMPXCHG486 mem,reg16          \320\300\2\x0F\xA7\101        486,SM,UNDOC
+CMPXCHG486 reg16,reg16        \320\300\2\x0F\xA7\101        486,UNDOC
+CMPXCHG486 mem,reg32          \321\300\2\x0F\xA7\101        486,SM,UNDOC
+CMPXCHG486 reg32,reg32        \321\300\2\x0F\xA7\101        486,UNDOC
+CMPXCHG8B mem                 \300\2\x0F\xC7\201            PENT
+CPUID     void                \2\x0F\xA2                    PENT
+CWD       void                \320\1\x99                    8086
+CWDE      void                \321\1\x98                    386
+DAA       void                \1\x27                        8086
+DAS       void                \1\x2F                        8086
+DB        ignore              ignore                        ignore
+DD        ignore              ignore                        ignore
+DEC       reg16               \320\10\x48                   8086
+DEC       reg32               \321\10\x48                   386
+DEC       rm8                 \300\1\xFE\201                8086
+DEC       rm16                \320\300\1\xFF\201            8086
+DEC       rm32                \321\300\1\xFF\201            386
+DIV       rm8                 \300\1\xF6\206                8086
+DIV       rm16                \320\300\1\xF7\206            8086
+DIV       rm32                \321\300\1\xF7\206            386
+DQ        ignore              ignore                        ignore
+DT        ignore              ignore                        ignore
+DW        ignore              ignore                        ignore
+EMMS      void                \2\x0F\x77                    PENT,MMX
+ENTER     imm,imm             \1\xC8\30\25                  186
+EQU       imm                 \0                            8086
+EQU       imm:imm             \0                            8086
+F2XM1     void                \2\xD9\xF0                    8086,FPU
+FABS      void                \2\xD9\xE1                    8086,FPU
+FADD      mem32               \300\1\xD8\200                8086,FPU
+FADD      mem64               \300\1\xDC\200                8086,FPU
+FADD      fpureg|to           \1\xDC\10\xC0                 8086,FPU
+FADD      fpureg              \1\xD8\10\xC0                 8086,FPU
+FADD      fpureg,fpu0         \1\xDC\10\xC0                 8086,FPU
+FADD      fpu0,fpureg         \1\xD8\11\xC0                 8086,FPU
+FADDP     fpureg              \1\xDE\10\xC0                 8086,FPU
+FADDP     fpureg,fpu0         \1\xDE\10\xC0                 8086,FPU
+FBLD      mem80               \300\1\xDF\204                8086,FPU
+FBLD      mem                 \300\1\xDF\204                8086,FPU
+FBSTP     mem80               \300\1\xDF\206                8086,FPU
+FBSTP     mem                 \300\1\xDF\206                8086,FPU
+FCHS      void                \2\xD9\xE0                    8086,FPU
+FCLEX     void                \3\x9B\xDB\xE2                8086,FPU
+FCMOVB    fpureg              \1\xDA\10\xC0                 P6,FPU
+FCMOVB    fpu0,fpureg         \1\xDA\11\xC0                 P6,FPU
+FCMOVBE   fpureg              \1\xDA\10\xD0                 P6,FPU
+FCMOVBE   fpu0,fpureg         \1\xDA\11\xD0                 P6,FPU
+FCMOVE    fpureg              \1\xDA\10\xC8                 P6,FPU
+FCMOVE    fpu0,fpureg         \1\xDA\11\xC8                 P6,FPU
+FCMOVNB   fpureg              \1\xDB\10\xC0                 P6,FPU
+FCMOVNB   fpu0,fpureg         \1\xDB\11\xC0                 P6,FPU
+FCMOVNBE  fpureg              \1\xDB\10\xD0                 P6,FPU
+FCMOVNBE  fpu0,fpureg         \1\xDB\11\xD0                 P6,FPU
+FCMOVNE   fpureg              \1\xDB\10\xC8                 P6,FPU
+FCMOVNE   fpu0,fpureg         \1\xDB\11\xC8                 P6,FPU
+FCMOVNU   fpureg              \1\xDB\10\xD8                 P6,FPU
+FCMOVNU   fpu0,fpureg         \1\xDB\11\xD8                 P6,FPU
+FCMOVU    fpureg              \1\xDA\10\xD8                 P6,FPU
+FCMOVU    fpu0,fpureg         \1\xDA\11\xD8                 P6,FPU
+FCOM      mem32               \300\1\xD8\202                8086,FPU
+FCOM      mem64               \300\1\xDC\202                8086,FPU
+FCOM      fpureg              \1\xD8\10\xD0                 8086,FPU
+FCOM      fpu0,fpureg         \1\xD8\11\xD0                 8086,FPU
+FCOMI     fpureg              \1\xDB\10\xF0                 P6,FPU
+FCOMI     fpu0,fpureg         \1\xDB\11\xF0                 P6,FPU
+FCOMIP    fpureg              \1\xDF\10\xF0                 P6,FPU
+FCOMIP    fpu0,fpureg         \1\xDF\11\xF0                 P6,FPU
+FCOMP     mem32               \300\1\xD8\203                8086,FPU
+FCOMP     mem64               \300\1\xDC\203                8086,FPU
+FCOMP     fpureg              \1\xD8\10\xD8                 8086,FPU
+FCOMP     fpu0,fpureg         \1\xD8\11\xD8                 8086,FPU
+FCOMPP    void                \2\xDE\xD9                    8086,FPU
+FCOS      void                \2\xD9\xFF                    386,FPU
+FDECSTP   void                \2\xD9\xF6                    8086,FPU
+FDISI     void                \3\x9B\xDB\xE1                8086,FPU
+FDIV      mem32               \300\1\xD8\206                8086,FPU
+FDIV      mem64               \300\1\xDC\206                8086,FPU
+FDIV      fpureg|to           \1\xDC\10\xF8                 8086,FPU
+FDIV      fpureg,fpu0         \1\xDC\10\xF8                 8086,FPU
+FDIV      fpureg              \1\xD8\10\xF0                 8086,FPU
+FDIV      fpu0,fpureg         \1\xD8\11\xF0                 8086,FPU
+FDIVP     fpureg,fpu0         \1\xDE\10\xF8                 8086,FPU
+FDIVP     fpureg              \1\xDE\10\xF8                 8086,FPU
+FDIVR     mem32               \300\1\xD8\207                8086,FPU
+FDIVR     mem64               \300\1\xDC\207                8086,FPU
+FDIVR     fpureg|to           \1\xDC\10\xF0                 8086,FPU
+FDIVR     fpureg,fpu0         \1\xDC\10\xF0                 8086,FPU
+FDIVR     fpureg              \1\xD8\10\xF8                 8086,FPU
+FDIVR     fpu0,fpureg         \1\xD8\11\xF8                 8086,FPU
+FDIVRP    fpureg              \1\xDE\10\xF0                 8086,FPU
+FDIVRP    fpureg,fpu0         \1\xDE\10\xF0                 8086,FPU
+FENI      void                \3\x9B\xDB\xE0                8086,FPU
+FFREE     fpureg              \1\xDD\10\xC0                 8086,FPU
+FIADD     mem32               \300\1\xDA\200                8086,FPU
+FIADD     mem16               \300\1\xDE\200                8086,FPU
+FICOM     mem32               \300\1\xDA\202                8086,FPU
+FICOM     mem16               \300\1\xDE\202                8086,FPU
+FICOMP    mem32               \300\1\xDA\203                8086,FPU
+FICOMP    mem16               \300\1\xDE\203                8086,FPU
+FIDIV     mem32               \300\1\xDA\206                8086,FPU
+FIDIV     mem16               \300\1\xDE\206                8086,FPU
+FIDIVR    mem32               \300\1\xDA\207                8086,FPU
+FIDIVR    mem16               \300\1\xDE\207                8086,FPU
+FILD      mem32               \300\1\xDB\200                8086,FPU
+FILD      mem16               \300\1\xDF\200                8086,FPU
+FILD      mem64               \300\1\xDF\205                8086,FPU
+FIMUL     mem32               \300\1\xDA\201                8086,FPU
+FIMUL     mem16               \300\1\xDE\201                8086,FPU
+FINCSTP   void                \2\xD9\xF7                    8086,FPU
+FINIT     void                \3\x9B\xDB\xE3                8086,FPU
+FIST      mem32               \300\1\xDB\202                8086,FPU
+FIST      mem16               \300\1\xDF\202                8086,FPU
+FISTP     mem32               \300\1\xDB\203                8086,FPU
+FISTP     mem16               \300\1\xDF\203                8086,FPU
+FISTP     mem64               \300\1\xDF\207                8086,FPU
+FISUB     mem32               \300\1\xDA\204                8086,FPU
+FISUB     mem16               \300\1\xDE\204                8086,FPU
+FISUBR    mem32               \300\1\xDA\205                8086,FPU
+FISUBR    mem16               \300\1\xDE\205                8086,FPU
+FLD       mem32               \300\1\xD9\200                8086,FPU
+FLD       mem64               \300\1\xDD\200                8086,FPU
+FLD       mem80               \300\1\xDB\205                8086,FPU
+FLD       fpureg              \1\xD9\10\xC0                 8086,FPU
+FLD1      void                \2\xD9\xE8                    8086,FPU
+FLDCW     mem                 \300\1\xD9\205                8086,FPU,SW
+FLDENV    mem                 \300\1\xD9\204                8086,FPU
+FLDL2E    void                \2\xD9\xEA                    8086,FPU
+FLDL2T    void                \2\xD9\xE9                    8086,FPU
+FLDLG2    void                \2\xD9\xEC                    8086,FPU
+FLDLN2    void                \2\xD9\xED                    8086,FPU
+FLDPI     void                \2\xD9\xEB                    8086,FPU
+FLDZ      void                \2\xD9\xEE                    8086,FPU
+FMUL      mem32               \300\1\xD8\201                8086,FPU
+FMUL      mem64               \300\1\xDC\201                8086,FPU
+FMUL      fpureg|to           \1\xDC\10\xC8                 8086,FPU
+FMUL      fpureg,fpu0         \1\xDC\10\xC8                 8086,FPU
+FMUL      fpureg              \1\xD8\10\xC8                 8086,FPU
+FMUL      fpu0,fpureg         \1\xD8\11\xC8                 8086,FPU
+FMULP     fpureg              \1\xDE\10\xC8                 8086,FPU
+FMULP     fpureg,fpu0         \1\xDE\10\xC8                 8086,FPU
+FNCLEX    void                \2\xDB\xE2                    8086,FPU
+FNDISI    void                \2\xDB\xE1                    8086,FPU
+FNENI     void                \2\xDB\xE0                    8086,FPU
+FNINIT    void                \2\xDB\xE3                    8086,FPU
+FNOP      void                \2\xD9\xD0                    8086,FPU
+FNSAVE    mem                 \300\1\xDD\206                8086,FPU
+FNSTCW    mem                 \300\1\xD9\207                8086,FPU,SW
+FNSTENV   mem                 \300\1\xD9\206                8086,FPU
+FNSTSW    mem                 \300\1\xDD\207                8086,FPU,SW
+FNSTSW    reg_ax              \2\xDF\xE0                    286,FPU
+FPATAN    void                \2\xD9\xF3                    8086,FPU
+FPREM     void                \2\xD9\xF8                    8086,FPU
+FPREM1    void                \2\xD9\xF5                    386,FPU
+FPTAN     void                \2\xD9\xF2                    8086,FPU
+FRNDINT   void                \2\xD9\xFC                    8086,FPU
+FRSTOR    mem                 \300\1\xDD\204                8086,FPU
+FSAVE     mem                 \300\2\x9B\xDD\206            8086,FPU
+FSCALE    void                \2\xD9\xFD                    8086,FPU
+FSETPM    void                \2\xDB\xE4                    286,FPU
+FSIN      void                \2\xD9\xFE                    386,FPU
+FSINCOS   void                \2\xD9\xFB                    386,FPU
+FSQRT     void                \2\xD9\xFA                    8086,FPU
+FST       mem32               \300\1\xD9\202                8086,FPU
+FST       mem64               \300\1\xDD\202                8086,FPU
+FST       fpureg              \1\xDD\10\xD0                 8086,FPU
+FSTCW     mem                 \300\2\x9B\xD9\207            8086,FPU,SW
+FSTENV    mem                 \300\2\x9B\xD9\206            8086,FPU
+FSTP      mem32               \300\1\xD9\203                8086,FPU
+FSTP      mem64               \300\1\xDD\203                8086,FPU
+FSTP      mem80               \300\1\xDB\207                8086,FPU
+FSTP      fpureg              \1\xDD\10\xD8                 8086,FPU
+FSTSW     mem                 \300\2\x9B\xDD\207            8086,FPU,SW
+FSTSW     reg_ax              \3\x9B\xDF\xE0                286,FPU
+FSUB      mem32               \300\1\xD8\204                8086,FPU
+FSUB      mem64               \300\1\xDC\204                8086,FPU
+FSUB      fpureg|to           \1\xDC\10\xE8                 8086,FPU
+FSUB      fpureg,fpu0         \1\xDC\10\xE8                 8086,FPU
+FSUB      fpureg              \1\xD8\10\xE0                 8086,FPU
+FSUB      fpu0,fpureg         \1\xD8\11\xE0                 8086,FPU
+FSUBP     fpureg              \1\xDE\10\xE8                 8086,FPU
+FSUBP     fpureg,fpu0         \1\xDE\10\xE8                 8086,FPU
+FSUBR     mem32               \300\1\xD8\205                8086,FPU
+FSUBR     mem64               \300\1\xDC\205                8086,FPU
+FSUBR     fpureg|to           \1\xDC\10\xE0                 8086,FPU
+FSUBR     fpureg,fpu0         \1\xDC\10\xE0                 8086,FPU
+FSUBR     fpureg              \1\xD8\10\xE8                 8086,FPU
+FSUBR     fpu0,fpureg         \1\xD8\11\xE8                 8086,FPU
+FSUBRP    fpureg              \1\xDE\10\xE0                 8086,FPU
+FSUBRP    fpureg,fpu0         \1\xDE\10\xE0                 8086,FPU
+FTST      void                \2\xD9\xE4                    8086,FPU
+FUCOM     fpureg              \1\xDD\10\xE0                 386,FPU
+FUCOM     fpu0,fpureg         \1\xDD\11\xE0                 386,FPU
+FUCOMI    fpureg              \1\xDB\10\xE8                 P6,FPU
+FUCOMI    fpu0,fpureg         \1\xDB\11\xE8                 P6,FPU
+FUCOMIP   fpureg              \1\xDF\10\xE8                 P6,FPU
+FUCOMIP   fpu0,fpureg         \1\xDF\11\xE8                 P6,FPU
+FUCOMP    fpureg              \1\xDD\10\xE8                 386,FPU
+FUCOMP    fpu0,fpureg         \1\xDD\11\xE8                 386,FPU
+FUCOMPP   void                \2\xDA\xE9                    386,FPU
+FXAM      void                \2\xD9\xE5                    8086,FPU
+FXCH      void                \2\xD9\xC9                    8086,FPU
+FXCH      fpureg              \1\xD9\10\xC8                 8086,FPU
+FXCH      fpureg,fpu0         \1\xD9\10\xC8                 8086,FPU
+FXCH      fpu0,fpureg         \1\xD9\11\xC8                 8086,FPU
+FXTRACT   void                \2\xD9\xF4                    8086,FPU
+FYL2X     void                \2\xD9\xF1                    8086,FPU
+FYL2XP1   void                \2\xD9\xF9                    8086,FPU
+HLT       void                \1\xF4                        8086
+IBTS      mem,reg16           \320\300\2\x0F\xA7\101        386,SW,UNDOC,ND
+IBTS      reg16,reg16         \320\300\2\x0F\xA7\101        386,UNDOC,ND
+IBTS      mem,reg32           \321\300\2\x0F\xA7\101        386,SD,UNDOC,ND
+IBTS      reg32,reg32         \321\300\2\x0F\xA7\101        386,UNDOC,ND
+ICEBP     void                \1\xF1                        P6,ND
+IDIV      rm8                 \300\1\xF6\207                8086
+IDIV      rm16                \320\300\1\xF7\207            8086
+IDIV      rm32                \321\300\1\xF7\207            386
+IMUL      rm8                 \300\1\xF6\205                8086
+IMUL      rm16                \320\300\1\xF7\205            8086
+IMUL      rm32                \321\300\1\xF7\205            386
+IMUL      reg16,mem           \320\301\2\x0F\xAF\110        386,SM
+IMUL      reg16,reg16         \320\301\2\x0F\xAF\110        386
+IMUL      reg32,mem           \321\301\2\x0F\xAF\110        386,SM
+IMUL      reg32,reg32         \321\301\2\x0F\xAF\110        386
+IMUL      reg16,mem,imm8      \320\301\1\x6B\110\16         286,SM
+IMUL      reg16,reg16,imm8    \320\301\1\x6B\110\16         286
+IMUL      reg16,mem,imm       \320\301\1\x69\110\32         286,SM
+IMUL      reg16,reg16,imm     \320\301\1\x69\110\32         286,SM
+IMUL      reg32,mem,imm8      \321\301\1\x6B\110\16         386,SM
+IMUL      reg32,reg32,imm8    \321\301\1\x6B\110\16         386
+IMUL      reg32,mem,imm       \321\301\1\x69\110\42         386,SM
+IMUL      reg32,reg32,imm     \321\301\1\x69\110\42         386,SM
+IMUL      reg16,imm8          \320\1\x6B\100\15             286
+IMUL      reg16,imm           \320\1\x69\100\31             286,SM
+IMUL      reg32,imm8          \321\1\x6B\100\15             386
+IMUL      reg32,imm           \321\1\x69\100\41             386,SM
+IN        reg_al,imm          \1\xE4\25                     8086
+IN        reg_ax,imm          \320\1\xE5\25                 8086
+IN        reg_eax,imm         \321\1\xE5\25                 386
+IN        reg_al,reg_dx       \1\xEC                        8086
+IN        reg_ax,reg_dx       \320\1\xED                    8086
+IN        reg_eax,reg_dx      \321\1\xED                    386
+INC       reg16               \320\10\x40                   8086
+INC       reg32               \321\10\x40                   386
+INC       rm8                 \300\1\xFE\200                8086
+INC       rm16                \320\300\1\xFF\200            8086
+INC       rm32                \321\300\1\xFF\200            386
+INCBIN    ignore              ignore                        ignore
+INSB      void                \1\x6C                        186
+INSD      void                \321\1\x6D                    386
+INSW      void                \320\1\x6D                    186
+INT       imm                 \1\xCD\24                     8086
+INT01     void                \1\xF1                        P6,ND
+INT1      void                \1\xF1                        P6
+INT3      void                \1\xCC                        8086
+INTO      void                \1\xCE                        8086
+INVD      void                \2\x0F\x08                    486
+INVLPG    mem                 \300\2\x0F\x01\207            486
+IRET      void                \322\1\xCF                    8086
+IRETD     void                \321\1\xCF                    386
+IRETW     void                \320\1\xCF                    8086
+JCXZ      imm                 \320\1\xE3\50                 8086
+JECXZ     imm                 \321\1\xE3\50                 386
+JMP       imm|short           \1\xEB\50                     8086
+JMP       imm                 \322\1\xE9\64                 8086
+JMP       imm|far             \322\1\xEA\34\37              8086,ND
+JMP       imm:imm             \322\1\xEA\35\30              8086
+JMP       imm16:imm           \320\1\xEA\31\30              8086
+JMP       imm:imm16           \320\1\xEA\31\30              8086
+JMP       imm32:imm           \321\1\xEA\41\30              386
+JMP       imm:imm32           \321\1\xEA\41\30              386
+JMP       mem|far             \322\300\1\xFF\205            8086
+JMP       mem16|far           \320\300\1\xFF\205            8086
+JMP       mem32|far           \321\300\1\xFF\205            386
+JMP       mem|near            \322\300\1\xFF\204            8086
+JMP       mem16|near          \320\300\1\xFF\204            8086
+JMP       mem32|near          \321\300\1\xFF\204            386
+JMP       reg16               \320\300\1\xFF\204            8086
+JMP       reg32               \321\300\1\xFF\204            386
+JMP       mem                 \322\300\1\xFF\204            8086
+JMP       mem16               \320\300\1\xFF\204            8086
+JMP       mem32               \321\300\1\xFF\204            386
+LAHF      void                \1\x9F                        8086
+LAR       reg16,mem           \320\301\2\x0F\x02\110        286,PRIV,SM
+LAR       reg16,reg16         \320\301\2\x0F\x02\110        286,PRIV
+LAR       reg32,mem           \321\301\2\x0F\x02\110        286,PRIV,SM
+LAR       reg32,reg32         \321\301\2\x0F\x02\110        286,PRIV
+LDS       reg16,mem           \320\301\1\xC5\110            8086
+LDS       reg32,mem           \321\301\1\xC5\110            8086
+LEA       reg16,mem           \320\301\1\x8D\110            8086
+LEA       reg32,mem           \321\301\1\x8D\110            8086
+LEAVE     void                \1\xC9                        186
+LES       reg16,mem           \320\301\1\xC4\110            8086
+LES       reg32,mem           \321\301\1\xC4\110            8086
+LFS       reg16,mem           \320\301\2\x0F\xB4\110        386
+LFS       reg32,mem           \321\301\2\x0F\xB4\110        386
+LGDT      mem                 \300\2\x0F\x01\202            286,PRIV
+LGS       reg16,mem           \320\301\2\x0F\xB5\110        386
+LGS       reg32,mem           \321\301\2\x0F\xB5\110        386
+LIDT      mem                 \300\2\x0F\x01\203            286,PRIV
+LLDT      mem                 \300\1\x0F\17\202             286,PRIV
+LLDT      mem16               \300\1\x0F\17\202             286,PRIV
+LLDT      reg16               \300\1\x0F\17\202             286,PRIV
+LMSW      mem                 \300\2\x0F\x01\206            286,PRIV
+LMSW      mem16               \300\2\x0F\x01\206            286,PRIV
+LMSW      reg16               \300\2\x0F\x01\206            286,PRIV
+LOADALL   void                \2\x0F\x07                    386,UNDOC
+LOADALL286 void               \2\x0F\x05                    286,UNDOC
+LODSB     void                \1\xAC                        8086
+LODSD     void                \321\1\xAD                    386
+LODSW     void                \320\1\xAD                    8086
+LOOP      imm                 \312\1\xE2\50                 8086
+LOOP      imm,reg_cx          \310\1\xE2\50                 8086
+LOOP      imm,reg_ecx         \311\1\xE2\50                 386
+LOOPE     imm                 \312\1\xE1\50                 8086
+LOOPE     imm,reg_cx          \310\1\xE1\50                 8086
+LOOPE     imm,reg_ecx         \311\1\xE1\50                 386
+LOOPNE    imm                 \312\1\xE0\50                 8086
+LOOPNE    imm,reg_cx          \310\1\xE0\50                 8086
+LOOPNE    imm,reg_ecx         \311\1\xE0\50                 386
+LOOPNZ    imm                 \312\1\xE0\50                 8086
+LOOPNZ    imm,reg_cx          \310\1\xE0\50                 8086
+LOOPNZ    imm,reg_ecx         \311\1\xE0\50                 386
+LOOPZ     imm                 \312\1\xE1\50                 8086
+LOOPZ     imm,reg_cx          \310\1\xE1\50                 8086
+LOOPZ     imm,reg_ecx         \311\1\xE1\50                 386
+LSL       reg16,mem           \320\301\2\x0F\x03\110        286,PRIV,SM
+LSL       reg16,reg16         \320\301\2\x0F\x03\110        286,PRIV
+LSL       reg32,mem           \321\301\2\x0F\x03\110        286,PRIV,SM
+LSL       reg32,reg32         \321\301\2\x0F\x03\110        286,PRIV
+LSS       reg16,mem           \320\301\2\x0F\xB2\110        386
+LSS       reg32,mem           \321\301\2\x0F\xB2\110        386
+LTR       mem                 \300\1\x0F\17\203             286,PRIV
+LTR       mem16               \300\1\x0F\17\203             286,PRIV
+LTR       reg16               \300\1\x0F\17\203             286,PRIV
+MOV       mem,reg_cs          \320\300\1\x8C\201            8086,SM
+MOV       mem,reg_dess        \320\300\1\x8C\101            8086,SM
+MOV       mem,reg_fsgs        \320\300\1\x8C\101            386,SM
+MOV       reg16,reg_cs        \320\300\1\x8C\201            8086
+MOV       reg16,reg_dess      \320\300\1\x8C\101            8086
+MOV       reg16,reg_fsgs      \320\300\1\x8C\101            386
+MOV       rm32,reg_cs         \321\300\1\x8C\201            8086
+MOV       rm32,reg_dess       \321\300\1\x8C\101            8086
+MOV       rm32,reg_fsgs       \321\300\1\x8C\101            386
+MOV       reg_dess,mem        \320\301\1\x8E\110            8086,SM
+MOV       reg_fsgs,mem        \320\301\1\x8E\110            386,SM
+MOV       reg_dess,reg16      \320\301\1\x8E\110            8086
+MOV       reg_fsgs,reg16      \320\301\1\x8E\110            386
+MOV       reg_dess,rm32       \321\301\1\x8E\110            8086
+MOV       reg_fsgs,rm32       \321\301\1\x8E\110            386
+MOV       reg_al,mem_offs     \301\1\xA0\35                 8086,SM
+MOV       reg_ax,mem_offs     \301\320\1\xA1\35             8086,SM
+MOV       reg_eax,mem_offs    \301\321\1\xA1\35             386,SM
+MOV       mem_offs,reg_al     \300\1\xA2\34                 8086,SM
+MOV       mem_offs,reg_ax     \300\320\1\xA3\34             8086,SM
+MOV       mem_offs,reg_eax    \300\321\1\xA3\34             386,SM
+MOV       reg32,reg_cr4       \2\x0F\x20\204                PENT
+MOV       reg32,reg_creg      \2\x0F\x20\101                386
+MOV       reg32,reg_dreg      \2\x0F\x21\101                386
+MOV       reg32,reg_treg      \2\x0F\x24\101                386
+MOV       reg_cr4,reg32       \2\x0F\x22\214                PENT
+MOV       reg_creg,reg32      \2\x0F\x22\110                386
+MOV       reg_dreg,reg32      \2\x0F\x23\110                386
+MOV       reg_treg,reg32      \2\x0F\x26\110                386
+MOV       mem,reg8            \300\1\x88\101                8086,SM
+MOV       reg8,reg8           \300\1\x88\101                8086
+MOV       mem,reg16           \320\300\1\x89\101            8086,SM
+MOV       reg16,reg16         \320\300\1\x89\101            8086
+MOV       mem,reg32           \321\300\1\x89\101            386,SM
+MOV       reg32,reg32         \321\300\1\x89\101            386
+MOV       reg8,mem            \301\1\x8A\110                8086,SM
+MOV       reg8,reg8           \301\1\x8A\110                8086
+MOV       reg16,mem           \320\301\1\x8B\110            8086,SM
+MOV       reg16,reg16         \320\301\1\x8B\110            8086
+MOV       reg32,mem           \321\301\1\x8B\110            386,SM
+MOV       reg32,reg32         \321\301\1\x8B\110            386
+MOV       reg8,imm            \10\xB0\21                    8086,SM
+MOV       reg16,imm           \320\10\xB8\31                8086,SM
+MOV       reg32,imm           \321\10\xB8\41                386,SM
+MOV       rm8,imm             \300\1\xC6\200\21             8086,SM
+MOV       rm16,imm            \320\300\1\xC7\200\31         8086,SM
+MOV       rm32,imm            \321\300\1\xC7\200\41         386,SM
+MOV       mem,imm8            \300\1\xC6\200\21             8086,SM
+MOV       mem,imm16           \320\300\1\xC7\200\31         8086,SM
+MOV       mem,imm32           \321\300\1\xC7\200\41         386,SM
+MOVD      mmxreg,mem          \301\2\x0F\x6E\110            PENT,MMX,SD
+MOVD      mmxreg,reg32        \2\x0F\x6E\110                PENT,MMX
+MOVD      mem,mmxreg          \300\2\x0F\x7E\101            PENT,MMX,SD
+MOVD      reg32,mmxreg        \2\x0F\x7E\101                PENT,MMX
+MOVQ      mmxreg,mem          \301\2\x0F\x6F\110            PENT,MMX,SM
+MOVQ      mmxreg,mmxreg       \2\x0F\x6F\110                PENT,MMX
+MOVQ      mem,mmxreg          \300\2\x0F\x7F\101            PENT,MMX,SM
+MOVQ      mmxreg,mmxreg       \2\x0F\x7F\101                PENT,MMX
+MOVSB     void                \1\xA4                        8086
+MOVSD     void                \321\1\xA5                    386
+MOVSW     void                \320\1\xA5                    8086
+MOVSX     reg16,mem           \320\301\2\x0F\xBE\110        386,SB
+MOVSX     reg16,reg8          \320\301\2\x0F\xBE\110        386
+MOVSX     reg32,rm8           \321\301\2\x0F\xBE\110        386
+MOVSX     reg32,rm16          \321\301\2\x0F\xBF\110        386
+MOVZX     reg16,mem           \320\301\2\x0F\xB6\110        386,SB
+MOVZX     reg16,reg8          \320\301\2\x0F\xB6\110        386
+MOVZX     reg32,rm8           \321\301\2\x0F\xB6\110        386
+MOVZX     reg32,rm16          \321\301\2\x0F\xB7\110        386
+MUL       rm8                 \300\1\xF6\204                8086
+MUL       rm16                \320\300\1\xF7\204            8086
+MUL       rm32                \321\300\1\xF7\204            386
+NEG       rm8                 \300\1\xF6\203                8086
+NEG       rm16                \320\300\1\xF7\203            8086
+NEG       rm32                \321\300\1\xF7\203            386
+NOP       void                \1\x90                        8086
+NOT       rm8                 \300\1\xF6\202                8086
+NOT       rm16                \320\300\1\xF7\202            8086
+NOT       rm32                \321\300\1\xF7\202            386
+OR        mem,reg8            \300\1\x08\101                8086,SM
+OR        reg8,reg8           \300\1\x08\101                8086
+OR        mem,reg16           \320\300\1\x09\101            8086,SM
+OR        reg16,reg16         \320\300\1\x09\101            8086
+OR        mem,reg32           \321\300\1\x09\101            386,SM
+OR        reg32,reg32         \321\300\1\x09\101            386
+OR        reg8,mem            \301\1\x0A\110                8086,SM
+OR        reg8,reg8           \301\1\x0A\110                8086
+OR        reg16,mem           \320\301\1\x0B\110            8086,SM
+OR        reg16,reg16         \320\301\1\x0B\110            8086
+OR        reg32,mem           \321\301\1\x0B\110            386,SM
+OR        reg32,reg32         \321\301\1\x0B\110            386
+OR        rm16,imm8           \320\300\1\x83\201\15         8086
+OR        rm32,imm8           \321\300\1\x83\201\15         386
+OR        reg_al,imm          \1\x0C\21                     8086,SM
+OR        reg_ax,imm          \320\1\x0D\31                 8086,SM
+OR        reg_eax,imm         \321\1\x0D\41                 386,SM
+OR        rm8,imm             \300\1\x80\201\21             8086,SM
+OR        rm16,imm            \320\300\1\x81\201\31         8086,SM
+OR        rm32,imm            \321\300\1\x81\201\41         386,SM
+OR        mem,imm8            \300\1\x80\201\21             8086,SM
+OR        mem,imm16           \320\300\1\x81\201\31         8086,SM
+OR        mem,imm32           \321\300\1\x81\201\41         386,SM
+OUT       imm,reg_al          \1\xE6\24                     8086
+OUT       imm,reg_ax          \320\1\xE7\24                 8086
+OUT       imm,reg_eax         \321\1\xE7\24                 386
+OUT       reg_dx,reg_al       \1\xEE                        8086
+OUT       reg_dx,reg_ax       \320\1\xEF                    8086
+OUT       reg_dx,reg_eax      \321\1\xEF                    386
+OUTSB     void                \1\x6E                        186
+OUTSD     void                \321\1\x6F                    386
+OUTSW     void                \320\1\x6F                    186
+PACKSSDW  mmxreg,mem          \301\2\x0F\x6B\110            PENT,MMX,SM
+PACKSSDW  mmxreg,mmxreg       \2\x0F\x6B\110                PENT,MMX
+PACKSSWB  mmxreg,mem          \301\2\x0F\x63\110            PENT,MMX,SM
+PACKSSWB  mmxreg,mmxreg       \2\x0F\x63\110                PENT,MMX
+PACKUSWB  mmxreg,mem          \301\2\x0F\x67\110            PENT,MMX,SM
+PACKUSWB  mmxreg,mmxreg       \2\x0F\x67\110                PENT,MMX
+PADDB     mmxreg,mem          \301\2\x0F\xFC\110            PENT,MMX,SM
+PADDB     mmxreg,mmxreg       \2\x0F\xFC\110                PENT,MMX
+PADDD     mmxreg,mem          \301\2\x0F\xFE\110            PENT,MMX,SM
+PADDD     mmxreg,mmxreg       \2\x0F\xFE\110                PENT,MMX
+PADDSB    mmxreg,mem          \301\2\x0F\xEC\110            PENT,MMX,SM
+PADDSB    mmxreg,mmxreg       \2\x0F\xEC\110                PENT,MMX
+PADDSIW   mmxreg,mem          \301\2\x0F\x51\110            PENT,MMX,SM,CYRIX
+PADDSIW   mmxreg,mmxreg       \2\x0F\x51\110                PENT,MMX,CYRIX
+PADDSW    mmxreg,mem          \301\2\x0F\xED\110            PENT,MMX,SM
+PADDSW    mmxreg,mmxreg       \2\x0F\xED\110                PENT,MMX
+PADDUSB   mmxreg,mem          \301\2\x0F\xDC\110            PENT,MMX,SM
+PADDUSB   mmxreg,mmxreg       \2\x0F\xDC\110                PENT,MMX
+PADDUSW   mmxreg,mem          \301\2\x0F\xDD\110            PENT,MMX,SM
+PADDUSW   mmxreg,mmxreg       \2\x0F\xDD\110                PENT,MMX
+PADDW     mmxreg,mem          \301\2\x0F\xFD\110            PENT,MMX,SM
+PADDW     mmxreg,mmxreg       \2\x0F\xFD\110                PENT,MMX
+PAND      mmxreg,mem          \301\2\x0F\xDB\110            PENT,MMX,SM
+PAND      mmxreg,mmxreg       \2\x0F\xDB\110                PENT,MMX
+PANDN     mmxreg,mem          \301\2\x0F\xDF\110            PENT,MMX,SM
+PANDN     mmxreg,mmxreg       \2\x0F\xDF\110                PENT,MMX
+PAVEB     mmxreg,mem          \301\2\x0F\x50\110            PENT,MMX,SM,CYRIX
+PAVEB     mmxreg,mmxreg       \2\x0F\x50\110                PENT,MMX,CYRIX
+PCMPEQB   mmxreg,mem          \301\2\x0F\x74\110            PENT,MMX,SM
+PCMPEQB   mmxreg,mmxreg       \2\x0F\x74\110                PENT,MMX
+PCMPEQD   mmxreg,mem          \301\2\x0F\x76\110            PENT,MMX,SM
+PCMPEQD   mmxreg,mmxreg       \2\x0F\x76\110                PENT,MMX
+PCMPEQW   mmxreg,mem          \301\2\x0F\x75\110            PENT,MMX,SM
+PCMPEQW   mmxreg,mmxreg       \2\x0F\x75\110                PENT,MMX
+PCMPGTB   mmxreg,mem          \301\2\x0F\x64\110            PENT,MMX,SM
+PCMPGTB   mmxreg,mmxreg       \2\x0F\x64\110                PENT,MMX
+PCMPGTD   mmxreg,mem          \301\2\x0F\x66\110            PENT,MMX,SM
+PCMPGTD   mmxreg,mmxreg       \2\x0F\x66\110                PENT,MMX
+PCMPGTW   mmxreg,mem          \301\2\x0F\x65\110            PENT,MMX,SM
+PCMPGTW   mmxreg,mmxreg       \2\x0F\x65\110                PENT,MMX
+PDISTIB   mmxreg,mem          \301\2\x0F\x54\110            PENT,MMX,SM,CYRIX
+PMACHRIW  mmxreg,mem          \301\2\x0F\x5E\110            PENT,MMX,SM,CYRIX
+PMADDWD   mmxreg,mem          \301\2\x0F\xF5\110            PENT,MMX,SM
+PMADDWD   mmxreg,mmxreg       \2\x0F\xF5\110                PENT,MMX
+PMAGW     mmxreg,mem          \301\2\x0F\x52\110            PENT,MMX,SM,CYRIX
+PMAGW     mmxreg,mmxreg       \2\x0F\x52\110                PENT,MMX,CYRIX
+PMULHRW   mmxreg,mem          \301\2\x0F\x59\110            PENT,MMX,SM,CYRIX
+PMULHRW   mmxreg,mmxreg       \2\x0F\x59\110                PENT,MMX,CYRIX
+PMULHRIW  mmxreg,mem          \301\2\x0F\x5D\110            PENT,MMX,SM,CYRIX
+PMULHRIW  mmxreg,mmxreg       \2\x0F\x5D\110                PENT,MMX,CYRIX
+PMULHW    mmxreg,mem          \301\2\x0F\xE5\110            PENT,MMX,SM
+PMULHW    mmxreg,mmxreg       \2\x0F\xE5\110                PENT,MMX
+PMULLW    mmxreg,mem          \301\2\x0F\xD5\110            PENT,MMX,SM
+PMULLW    mmxreg,mmxreg       \2\x0F\xD5\110                PENT,MMX
+PMVGEZB   mmxreg,mem          \301\2\x0F\x5C\110            PENT,MMX,SM,CYRIX
+PMVLZB    mmxreg,mem          \301\2\x0F\x5B\110            PENT,MMX,SM,CYRIX
+PMVNZB    mmxreg,mem          \301\2\x0F\x5A\110            PENT,MMX,SM,CYRIX
+PMVZB     mmxreg,mem          \301\2\x0F\x58\110            PENT,MMX,SM,CYRIX
+POP       reg16               \320\10\x58                   8086
+POP       reg32               \321\10\x58                   386
+POP       rm16                \320\300\1\x8F\200            8086
+POP       rm32                \321\300\1\x8F\200            386
+POP       reg_cs              \1\x0F                        8086,UNDOC,ND
+POP       reg_dess            \4                            8086
+POP       reg_fsgs            \1\x0F\5                      386
+POPA      void                \322\1\x61                    186
+POPAD     void                \321\1\x61                    386
+POPAW     void                \320\1\x61                    186
+POPF      void                \322\1\x9D                    186
+POPFD     void                \321\1\x9D                    386
+POPFW     void                \320\1\x9D                    186
+POR       mmxreg,mem          \301\2\x0F\xEB\110            PENT,MMX,SM
+POR       mmxreg,mmxreg       \2\x0F\xEB\110                PENT,MMX
+PSLLD     mmxreg,mem          \301\2\x0F\xF2\110            PENT,MMX,SM
+PSLLD     mmxreg,mmxreg       \2\x0F\xF2\110                PENT,MMX
+PSLLD     mmxreg,imm          \2\x0F\x72\206\25             PENT,MMX
+PSLLQ     mmxreg,mem          \301\2\x0F\xF3\110            PENT,MMX,SM
+PSLLQ     mmxreg,mmxreg       \2\x0F\xF3\110                PENT,MMX
+PSLLQ     mmxreg,imm          \2\x0F\x73\206\25             PENT,MMX
+PSLLW     mmxreg,mem          \301\2\x0F\xF1\110            PENT,MMX,SM
+PSLLW     mmxreg,mmxreg       \2\x0F\xF1\110                PENT,MMX
+PSLLW     mmxreg,imm          \2\x0F\x71\206\25             PENT,MMX
+PSRAD     mmxreg,mem          \301\2\x0F\xE2\110            PENT,MMX,SM
+PSRAD     mmxreg,mmxreg       \2\x0F\xE2\110                PENT,MMX
+PSRAD     mmxreg,imm          \2\x0F\x72\204\25             PENT,MMX
+PSRAW     mmxreg,mem          \301\2\x0F\xE1\110            PENT,MMX,SM
+PSRAW     mmxreg,mmxreg       \2\x0F\xE1\110                PENT,MMX
+PSRAW     mmxreg,imm          \2\x0F\x71\204\25             PENT,MMX
+PSRLD     mmxreg,mem          \301\2\x0F\xD2\110            PENT,MMX,SM
+PSRLD     mmxreg,mmxreg       \2\x0F\xD2\110                PENT,MMX
+PSRLD     mmxreg,imm          \2\x0F\x72\202\25             PENT,MMX
+PSRLQ     mmxreg,mem          \301\2\x0F\xD3\110            PENT,MMX,SM
+PSRLQ     mmxreg,mmxreg       \2\x0F\xD3\110                PENT,MMX
+PSRLQ     mmxreg,imm          \2\x0F\x73\202\25             PENT,MMX
+PSRLW     mmxreg,mem          \301\2\x0F\xD1\110            PENT,MMX,SM
+PSRLW     mmxreg,mmxreg       \2\x0F\xD1\110                PENT,MMX
+PSRLW     mmxreg,imm          \2\x0F\x71\202\25             PENT,MMX
+PSUBB     mmxreg,mem          \301\2\x0F\xF8\110            PENT,MMX,SM
+PSUBB     mmxreg,mmxreg       \2\x0F\xF8\110                PENT,MMX
+PSUBD     mmxreg,mem          \301\2\x0F\xFA\110            PENT,MMX,SM
+PSUBD     mmxreg,mmxreg       \2\x0F\xFA\110                PENT,MMX
+PSUBSB    mmxreg,mem          \301\2\x0F\xE8\110            PENT,MMX,SM
+PSUBSB    mmxreg,mmxreg       \2\x0F\xE8\110                PENT,MMX
+PSUBSIW   mmxreg,mem          \301\2\x0F\x55\110            PENT,MMX,SM,CYRIX
+PSUBSIW   mmxreg,mmxreg       \2\x0F\x55\110                PENT,MMX,CYRIX
+PSUBSW    mmxreg,mem          \301\2\x0F\xE9\110            PENT,MMX,SM
+PSUBSW    mmxreg,mmxreg       \2\x0F\xE9\110                PENT,MMX
+PSUBUSB   mmxreg,mem          \301\2\x0F\xD8\110            PENT,MMX,SM
+PSUBUSB   mmxreg,mmxreg       \2\x0F\xD8\110                PENT,MMX
+PSUBUSW   mmxreg,mem          \301\2\x0F\xD9\110            PENT,MMX,SM
+PSUBUSW   mmxreg,mmxreg       \2\x0F\xD9\110                PENT,MMX
+PSUBW     mmxreg,mem          \301\2\x0F\xF9\110            PENT,MMX,SM
+PSUBW     mmxreg,mmxreg       \2\x0F\xF9\110                PENT,MMX
+PUNPCKHBW mmxreg,mem          \301\2\x0F\x68\110            PENT,MMX,SM
+PUNPCKHBW mmxreg,mmxreg       \2\x0F\x68\110                PENT,MMX
+PUNPCKHDQ mmxreg,mem          \301\2\x0F\x6A\110            PENT,MMX,SM
+PUNPCKHDQ mmxreg,mmxreg       \2\x0F\x6A\110                PENT,MMX
+PUNPCKHWD mmxreg,mem          \301\2\x0F\x69\110            PENT,MMX,SM
+PUNPCKHWD mmxreg,mmxreg       \2\x0F\x69\110                PENT,MMX
+PUNPCKLBW mmxreg,mem          \301\2\x0F\x60\110            PENT,MMX,SM
+PUNPCKLBW mmxreg,mmxreg       \2\x0F\x60\110                PENT,MMX
+PUNPCKLDQ mmxreg,mem          \301\2\x0F\x62\110            PENT,MMX,SM
+PUNPCKLDQ mmxreg,mmxreg       \2\x0F\x62\110                PENT,MMX
+PUNPCKLWD mmxreg,mem          \301\2\x0F\x61\110            PENT,MMX,SM
+PUNPCKLWD mmxreg,mmxreg       \2\x0F\x61\110                PENT,MMX
+PUSH      reg16               \320\10\x50                   8086
+PUSH      reg32               \321\10\x50                   386
+PUSH      rm16                \320\300\1\xFF\206            8086
+PUSH      rm32                \321\300\1\xFF\206            386
+PUSH      reg_fsgs            \1\x0F\7                      386
+PUSH      reg_sreg            \6                            8086
+PUSH      imm8                \1\x6A\14                     286
+PUSH      imm16               \320\1\x68\30                 286
+PUSH      imm32               \321\1\x68\40                 386
+PUSHA     void                \322\1\x60                    186
+PUSHAD    void                \321\1\x60                    386
+PUSHAW    void                \320\1\x60                    186
+PUSHF     void                \322\1\x9C                    186
+PUSHFD    void                \321\1\x9C                    386
+PUSHFW    void                \320\1\x9C                    186
+PXOR      mmxreg,mem          \301\2\x0F\xEF\110            PENT,MMX,SM
+PXOR      mmxreg,mmxreg       \2\x0F\xEF\110                PENT,MMX
+RCL       rm8,unity           \300\1\xD0\202                8086
+RCL       rm8,reg_cl          \300\1\xD2\202                8086
+RCL       rm8,imm             \300\1\xC0\202\25             286,SB
+RCL       rm16,unity          \320\300\1\xD1\202            8086
+RCL       rm16,reg_cl         \320\300\1\xD3\202            8086
+RCL       rm16,imm            \320\300\1\xC1\202\25         286,SB
+RCL       rm32,unity          \321\300\1\xD1\202            386
+RCL       rm32,reg_cl         \321\300\1\xD3\202            386
+RCL       rm32,imm            \321\300\1\xC1\202\25         386,SB
+RCR       rm8,unity           \300\1\xD0\203                8086
+RCR       rm8,reg_cl          \300\1\xD2\203                8086
+RCR       rm8,imm             \300\1\xC0\203\25             286,SB
+RCR       rm16,unity          \320\300\1\xD1\203            8086
+RCR       rm16,reg_cl         \320\300\1\xD3\203            8086
+RCR       rm16,imm            \320\300\1\xC1\203\25         286,SB
+RCR       rm32,unity          \321\300\1\xD1\203            386
+RCR       rm32,reg_cl         \321\300\1\xD3\203            386
+RCR       rm32,imm            \321\300\1\xC1\203\25         386,SB
+RDMSR     void                \2\x0F\x32                    PENT
+RDPMC     void                \2\x0F\x33                    P6
+RDTSC     void                \2\x0F\x31                    PENT
+RESB      imm                 \340                          8086
+RESD      ignore              ignore                        ignore
+RESQ      ignore              ignore                        ignore
+REST      ignore              ignore                        ignore
+RESW      ignore              ignore                        ignore
+RET       void                \1\xC3                        8086
+RET       imm                 \1\xC2\30                     8086
+RETF      void                \1\xCB                        8086
+RETF      imm                 \1\xCA\30                     8086
+RETN      void                \1\xC3                        8086
+RETN      imm                 \1\xC2\30                     8086
+ROL       rm8,unity           \300\1\xD0\200                8086
+ROL       rm8,reg_cl          \300\1\xD2\200                8086
+ROL       rm8,imm             \300\1\xC0\200\25             286,SB
+ROL       rm16,unity          \320\300\1\xD1\200            8086
+ROL       rm16,reg_cl         \320\300\1\xD3\200            8086
+ROL       rm16,imm            \320\300\1\xC1\200\25         286,SB
+ROL       rm32,unity          \321\300\1\xD1\200            386
+ROL       rm32,reg_cl         \321\300\1\xD3\200            386
+ROL       rm32,imm            \321\300\1\xC1\200\25         386,SB
+ROR       rm8,unity           \300\1\xD0\201                8086
+ROR       rm8,reg_cl          \300\1\xD2\201                8086
+ROR       rm8,imm             \300\1\xC0\201\25             286,SB
+ROR       rm16,unity          \320\300\1\xD1\201            8086
+ROR       rm16,reg_cl         \320\300\1\xD3\201            8086
+ROR       rm16,imm            \320\300\1\xC1\201\25         286,SB
+ROR       rm32,unity          \321\300\1\xD1\201            386
+ROR       rm32,reg_cl         \321\300\1\xD3\201            386
+ROR       rm32,imm            \321\300\1\xC1\201\25         386,SB
+RSM       void                \2\x0F\xAA                    PENT
+SAHF      void                \1\x9E                        8086
+SAL       rm8,unity           \300\1\xD0\204                8086,ND
+SAL       rm8,reg_cl          \300\1\xD2\204                8086,ND
+SAL       rm8,imm             \300\1\xC0\204\25             286,ND,SB
+SAL       rm16,unity          \320\300\1\xD1\204            8086,ND
+SAL       rm16,reg_cl         \320\300\1\xD3\204            8086,ND
+SAL       rm16,imm            \320\300\1\xC1\204\25         286,ND,SB
+SAL       rm32,unity          \321\300\1\xD1\204            386,ND
+SAL       rm32,reg_cl         \321\300\1\xD3\204            386,ND
+SAL       rm32,imm            \321\300\1\xC1\204\25         386,ND,SB
+SALC      void                \1\xD6                        8086,UNDOC
+SAR       rm8,unity           \300\1\xD0\207                8086
+SAR       rm8,reg_cl          \300\1\xD2\207                8086
+SAR       rm8,imm             \300\1\xC0\207\25             286,SB
+SAR       rm16,unity          \320\300\1\xD1\207            8086
+SAR       rm16,reg_cl         \320\300\1\xD3\207            8086
+SAR       rm16,imm            \320\300\1\xC1\207\25         286,SB
+SAR       rm32,unity          \321\300\1\xD1\207            386
+SAR       rm32,reg_cl         \321\300\1\xD3\207            386
+SAR       rm32,imm            \321\300\1\xC1\207\25         386,SB
+SBB       mem,reg8            \300\1\x18\101                8086,SM
+SBB       reg8,reg8           \300\1\x18\101                8086
+SBB       mem,reg16           \320\300\1\x19\101            8086,SM
+SBB       reg16,reg16         \320\300\1\x19\101            8086
+SBB       mem,reg32           \321\300\1\x19\101            386,SM
+SBB       reg32,reg32         \321\300\1\x19\101            386
+SBB       reg8,mem            \301\1\x1A\110                8086,SM
+SBB       reg8,reg8           \301\1\x1A\110                8086
+SBB       reg16,mem           \320\301\1\x1B\110            8086,SM
+SBB       reg16,reg16         \320\301\1\x1B\110            8086
+SBB       reg32,mem           \321\301\1\x1B\110            386,SM
+SBB       reg32,reg32         \321\301\1\x1B\110            386
+SBB       rm16,imm8           \320\300\1\x83\203\15         8086
+SBB       rm32,imm8           \321\300\1\x83\203\15         8086
+SBB       reg_al,imm          \1\x1C\21                     8086,SM
+SBB       reg_ax,imm          \320\1\x1D\31                 8086,SM
+SBB       reg_eax,imm         \321\1\x1D\41                 386,SM
+SBB       rm8,imm             \300\1\x80\203\21             8086,SM
+SBB       rm16,imm            \320\300\1\x81\203\31         8086,SM
+SBB       rm32,imm            \321\300\1\x81\203\41         386,SM
+SBB       mem,imm8            \300\1\x80\203\21             8086,SM
+SBB       mem,imm16           \320\300\1\x81\203\31         8086,SM
+SBB       mem,imm32           \321\300\1\x81\203\41         386,SM
+SCASB     void                \1\xAE                        8086
+SCASD     void                \321\1\xAF                    386
+SCASW     void                \320\1\xAF                    8086
+SGDT      mem                 \300\2\x0F\x01\200            286,PRIV
+SHL       rm8,unity           \300\1\xD0\204                8086
+SHL       rm8,reg_cl          \300\1\xD2\204                8086
+SHL       rm8,imm             \300\1\xC0\204\25             286,SB
+SHL       rm16,unity          \320\300\1\xD1\204            8086
+SHL       rm16,reg_cl         \320\300\1\xD3\204            8086
+SHL       rm16,imm            \320\300\1\xC1\204\25         286,SB
+SHL       rm32,unity          \321\300\1\xD1\204            386
+SHL       rm32,reg_cl         \321\300\1\xD3\204            386
+SHL       rm32,imm            \321\300\1\xC1\204\25         386,SB
+SHLD      mem,reg16,imm       \300\320\2\x0F\xA4\101\26     386,SM2
+SHLD      reg16,reg16,imm     \300\320\2\x0F\xA4\101\26     386,SM2
+SHLD      mem,reg32,imm       \300\321\2\x0F\xA4\101\26     386,SM2
+SHLD      reg32,reg32,imm     \300\321\2\x0F\xA4\101\26     386,SM2
+SHLD      mem,reg16,reg_cl    \300\320\2\x0F\xA5\101        386,SM
+SHLD      reg16,reg16,reg_cl  \300\320\2\x0F\xA5\101        386
+SHLD      mem,reg32,reg_cl    \300\321\2\x0F\xA5\101        386,SM
+SHLD      reg32,reg32,reg_cl  \300\321\2\x0F\xA5\101        386
+SHR       rm8,unity           \300\1\xD0\205                8086
+SHR       rm8,reg_cl          \300\1\xD2\205                8086
+SHR       rm8,imm             \300\1\xC0\205\25             286,SB
+SHR       rm16,unity          \320\300\1\xD1\205            8086
+SHR       rm16,reg_cl         \320\300\1\xD3\205            8086
+SHR       rm16,imm            \320\300\1\xC1\205\25         286,SB
+SHR       rm32,unity          \321\300\1\xD1\205            386
+SHR       rm32,reg_cl         \321\300\1\xD3\205            386
+SHR       rm32,imm            \321\300\1\xC1\205\25         386,SB
+SHRD      mem,reg16,imm       \300\320\2\x0F\xAC\101\26     386,SM2
+SHRD      reg16,reg16,imm     \300\320\2\x0F\xAC\101\26     386,SM2
+SHRD      mem,reg32,imm       \300\321\2\x0F\xAC\101\26     386,SM2
+SHRD      reg32,reg32,imm     \300\321\2\x0F\xAC\101\26     386,SM2
+SHRD      mem,reg16,reg_cl    \300\320\2\x0F\xAD\101        386,SM
+SHRD      reg16,reg16,reg_cl  \300\320\2\x0F\xAD\101        386
+SHRD      mem,reg32,reg_cl    \300\321\2\x0F\xAD\101        386,SM
+SHRD      reg32,reg32,reg_cl  \300\321\2\x0F\xAD\101        386
+SIDT      mem                 \300\2\x0F\x01\201            286,PRIV
+SLDT      mem                 \300\1\x0F\17\200             286,PRIV
+SLDT      mem16               \300\1\x0F\17\200             286,PRIV
+SLDT      reg16               \300\1\x0F\17\200             286,PRIV
+SMI       void                \1\xF1                        386,UNDOC
+SMSW      mem                 \300\2\x0F\x01\204            286,PRIV
+SMSW      mem16               \300\2\x0F\x01\204            286,PRIV
+SMSW      reg16               \300\2\x0F\x01\204            286,PRIV
+STC       void                \1\xF9                        8086
+STD       void                \1\xFD                        8086
+STI       void                \1\xFB                        8086
+STOSB     void                \1\xAA                        8086
+STOSD     void                \321\1\xAB                    386
+STOSW     void                \320\1\xAB                    8086
+STR       mem                 \300\1\x0F\17\201             286,PRIV
+STR       mem16               \300\1\x0F\17\201             286,PRIV
+STR       reg16               \300\1\x0F\17\201             286,PRIV
+SUB       mem,reg8            \300\1\x28\101                8086,SM
+SUB       reg8,reg8           \300\1\x28\101                8086
+SUB       mem,reg16           \320\300\1\x29\101            8086,SM
+SUB       reg16,reg16         \320\300\1\x29\101            8086
+SUB       mem,reg32           \321\300\1\x29\101            386,SM
+SUB       reg32,reg32         \321\300\1\x29\101            386
+SUB       reg8,mem            \301\1\x2A\110                8086,SM
+SUB       reg8,reg8           \301\1\x2A\110                8086
+SUB       reg16,mem           \320\301\1\x2B\110            8086,SM
+SUB       reg16,reg16         \320\301\1\x2B\110            8086
+SUB       reg32,mem           \321\301\1\x2B\110            386,SM
+SUB       reg32,reg32         \321\301\1\x2B\110            386
+SUB       rm16,imm8           \320\300\1\x83\205\15         8086
+SUB       rm32,imm8           \321\300\1\x83\205\15         386
+SUB       reg_al,imm          \1\x2C\21                     8086,SM
+SUB       reg_ax,imm          \320\1\x2D\31                 8086,SM
+SUB       reg_eax,imm         \321\1\x2D\41                 386,SM
+SUB       rm8,imm             \300\1\x80\205\21             8086,SM
+SUB       rm16,imm            \320\300\1\x81\205\31         8086,SM
+SUB       rm32,imm            \321\300\1\x81\205\41         386,SM
+SUB       mem,imm8            \300\1\x80\205\21             8086,SM
+SUB       mem,imm16           \320\300\1\x81\205\31         8086,SM
+SUB       mem,imm32           \321\300\1\x81\205\41         386,SM
+TEST      mem,reg8            \300\1\x84\101                8086,SM
+TEST      reg8,reg8           \300\1\x84\101                8086
+TEST      mem,reg16           \320\300\1\x85\101            8086,SM
+TEST      reg16,reg16         \320\300\1\x85\101            8086
+TEST      mem,reg32           \321\300\1\x85\101            386,SM
+TEST      reg32,reg32         \321\300\1\x85\101            386
+TEST      reg_al,imm          \1\xA8\21                     8086,SM
+TEST      reg_ax,imm          \320\1\xA9\31                 8086,SM
+TEST      reg_eax,imm         \321\1\xA9\41                 386,SM
+TEST      rm8,imm             \300\1\xF6\200\21             8086,SM
+TEST      rm16,imm            \320\300\1\xF7\200\31         8086,SM
+TEST      rm32,imm            \321\300\1\xF7\200\41         386,SM
+TEST      mem,imm8            \300\1\xF6\200\21             8086,SM
+TEST      mem,imm16           \320\300\1\xF7\200\31         8086,SM
+TEST      mem,imm32           \321\300\1\xF7\200\41         386,SM
+UMOV      mem,reg8            \300\2\x0F\x10\101            386,UNDOC,SM
+UMOV      reg8,reg8           \300\2\x0F\x10\101            386,UNDOC
+UMOV      mem,reg16           \320\300\2\x0F\x11\101        386,UNDOC,SM
+UMOV      reg16,reg16         \320\300\2\x0F\x11\101        386,UNDOC
+UMOV      mem,reg32           \321\300\2\x0F\x11\101        386,UNDOC,SM
+UMOV      reg32,reg32         \321\300\2\x0F\x11\101        386,UNDOC
+UMOV      reg8,mem            \301\2\x0F\x12\110            386,UNDOC,SM
+UMOV      reg8,reg8           \301\2\x0F\x12\110            386,UNDOC
+UMOV      reg16,mem           \320\301\2\x0F\x13\110        386,UNDOC,SM
+UMOV      reg16,reg16         \320\301\2\x0F\x13\110        386,UNDOC
+UMOV      reg32,mem           \321\301\2\x0F\x13\110        386,UNDOC,SM
+UMOV      reg32,reg32         \321\301\2\x0F\x13\110        386,UNDOC
+VERR      mem                 \300\1\x0F\17\204             286,PRIV
+VERR      mem16               \300\1\x0F\17\204             286,PRIV
+VERR      reg16               \300\1\x0F\17\204             286,PRIV
+VERW      mem                 \300\1\x0F\17\205             286,PRIV
+VERW      mem16               \300\1\x0F\17\205             286,PRIV
+VERW      reg16               \300\1\x0F\17\205             286,PRIV
+WAIT      void                \1\x9B                        8086
+WBINVD    void                \2\x0F\x09                    486
+WRMSR     void                \2\x0F\x30                    PENT
+XADD      mem,reg8            \300\2\x0F\xC0\101            486,SM
+XADD      reg8,reg8           \300\2\x0F\xC0\101            486
+XADD      mem,reg16           \320\300\2\x0F\xC1\101        486,SM
+XADD      reg16,reg16         \320\300\2\x0F\xC1\101        486
+XADD      mem,reg32           \321\300\2\x0F\xC1\101        486,SM
+XADD      reg32,reg32         \321\300\2\x0F\xC1\101        486
+XBTS      reg16,mem           \320\301\2\x0F\xA6\110        386,SW,UNDOC,ND
+XBTS      reg16,reg16         \320\301\2\x0F\xA6\110        386,UNDOC,ND
+XBTS      reg32,mem           \321\301\2\x0F\xA6\110        386,SD,UNDOC,ND
+XBTS      reg32,reg32         \321\301\2\x0F\xA6\110        386,UNDOC,ND
+XCHG      reg_ax,reg16        \320\11\x90                   8086
+XCHG      reg_eax,reg32       \321\11\x90                   386
+XCHG      reg16,reg_ax        \320\10\x90                   8086
+XCHG      reg32,reg_eax       \321\10\x90                   386
+XCHG      reg8,mem            \301\1\x86\110                8086,SM
+XCHG      reg8,reg8           \301\1\x86\110                8086
+XCHG      reg16,mem           \320\301\1\x87\110            8086,SM
+XCHG      reg16,reg16         \320\301\1\x87\110            8086
+XCHG      reg32,mem           \321\301\1\x87\110            386,SM
+XCHG      reg32,reg32         \321\301\1\x87\110            386
+XCHG      mem,reg8            \300\1\x86\101                8086,SM
+XCHG      reg8,reg8           \300\1\x86\101                8086
+XCHG      mem,reg16           \320\300\1\x87\101            8086,SM
+XCHG      reg16,reg16         \320\300\1\x87\101            8086
+XCHG      mem,reg32           \321\300\1\x87\101            386,SM
+XCHG      reg32,reg32         \321\300\1\x87\101            386
+XLATB     void                \1\xD7                        8086
+XOR       mem,reg8            \300\1\x30\101                8086,SM
+XOR       reg8,reg8           \300\1\x30\101                8086
+XOR       mem,reg16           \320\300\1\x31\101            8086,SM
+XOR       reg16,reg16         \320\300\1\x31\101            8086
+XOR       mem,reg32           \321\300\1\x31\101            386,SM
+XOR       reg32,reg32         \321\300\1\x31\101            386
+XOR       reg8,mem            \301\1\x32\110                8086,SM
+XOR       reg8,reg8           \301\1\x32\110                8086
+XOR       reg16,mem           \320\301\1\x33\110            8086,SM
+XOR       reg16,reg16         \320\301\1\x33\110            8086
+XOR       reg32,mem           \321\301\1\x33\110            386,SM
+XOR       reg32,reg32         \321\301\1\x33\110            386
+XOR       rm16,imm8           \320\300\1\x83\206\15         8086
+XOR       rm32,imm8           \321\300\1\x83\206\15         386
+XOR       reg_al,imm          \1\x34\21                     8086,SM
+XOR       reg_ax,imm          \320\1\x35\31                 8086,SM
+XOR       reg_eax,imm         \321\1\x35\41                 386,SM
+XOR       rm8,imm             \300\1\x80\206\21             8086,SM
+XOR       rm16,imm            \320\300\1\x81\206\31         8086,SM
+XOR       rm32,imm            \321\300\1\x81\206\41         386,SM
+XOR       mem,imm8            \300\1\x80\206\21             8086,SM
+XOR       mem,imm16           \320\300\1\x81\206\31         8086,SM
+XOR       mem,imm32           \321\300\1\x81\206\41         386,SM
+CMOVcc    reg16,mem           \320\301\1\x0F\330\x40\110    P6,SM
+CMOVcc    reg16,reg16         \320\301\1\x0F\330\x40\110    P6
+CMOVcc    reg32,mem           \321\301\1\x0F\330\x40\110    P6,SM
+CMOVcc    reg32,reg32         \321\301\1\x0F\330\x40\110    P6
+Jcc       imm|near            \322\1\x0F\330\x80\64         386
+Jcc       imm                 \330\x70\50                   8086
+Jcc       imm|short           \330\x70\50                   8086
+SETcc     mem                 \300\1\x0F\330\x90\200        386,SB
+SETcc     reg8                \300\1\x0F\330\x90\200        386
diff --git a/i386/nasm/insns.h b/i386/nasm/insns.h
new file mode 100644 (file)
index 0000000..184aa28
--- /dev/null
@@ -0,0 +1,89 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
+ * Reserved.  This file contains Original Code and/or Modifications of
+ * Original Code as defined in and that are subject to the Apple Public
+ * Source License Version 1.1 (the "License").  You may not use this file
+ * except in compliance with the License.  Please obtain a copy of the
+ * License at http://www.apple.com/publicsource and read it before using
+ * this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/* insns.h   header file for insns.c
+ *
+ * The Netwide Assembler is copyright (C) 1996 Simon Tatham and
+ * Julian Hall. All rights reserved. The software is
+ * redistributable under the licence given in the file "Licence"
+ * distributed in the NASM archive.
+ */
+
+#ifndef NASM_INSNS_H
+#define NASM_INSNS_H
+
+struct itemplate {
+    int opcode;                               /* the token, passed from "parser.c" */
+    int operands;                     /* number of operands */
+    long opd[3];                      /* bit flags for operand types */
+    char *code;                               /* the code it assembles to */
+    int flags;                        /* some flags */
+};
+
+/*
+ * Instruction template flags. These specify which processor
+ * targets the instruction is eligible for, whether it is
+ * privileged or undocumented, and also specify extra error
+ * checking on the matching of the instruction.
+ *
+ * IF_SM stands for Size Match: any operand whose size is not
+ * explicitly specified by the template is `really' intended to be
+ * the same size as the first size-specified operand.
+ * Non-specification is tolerated in the input instruction, but
+ * _wrong_ specification is not.
+ *
+ * IF_SM2 invokes Size Match on only the first _two_ operands, for
+ * three-operand instructions such as SHLD: it implies that the
+ * first two operands must match in size, but that the third is
+ * required to be _unspecified_.
+ *
+ * IF_SB invokes Size Byte: operands with unspecified size in the
+ * template are really bytes, and so no non-byte specification in
+ * the input instruction will be tolerated. IF_SW similarly invokes
+ * Size Word, and IF_SD invokes Size Doubleword.
+ *
+ * (The default state if neither IF_SM nor IF_SM2 is specified is
+ * that any operand with unspecified size in the template is
+ * required to have unspecified size in the instruction too...)
+ */
+
+#define IF_SM     0x0001              /* size match */
+#define IF_SM2    0x0002              /* size match first two operands */
+#define IF_SB     0x0004              /* unsized operands can't be non-byte */
+#define IF_SW     0x0008              /* unsized operands can't be non-word */
+#define IF_SD     0x0010              /* unsized operands can't be nondword */
+#define IF_8086   0x0000              /* 8086 instruction */
+#define IF_186    0x0100              /* 186+ instruction */
+#define IF_286    0x0200              /* 286+ instruction */
+#define IF_386    0x0300              /* 386+ instruction */
+#define IF_486    0x0400              /* 486+ instruction */
+#define IF_PENT   0x0500              /* Pentium instruction */
+#define IF_P6     0x0600              /* P6 instruction */
+#define IF_CYRIX  0x0800              /* Cyrix-specific instruction */
+#define IF_PMASK  0x0F00              /* the mask for processor types */
+#define IF_PRIV   0x1000              /* it's a privileged instruction */
+#define IF_UNDOC  0x2000              /* it's an undocumented instruction */
+#define IF_FPU    0x4000              /* it's an FPU instruction */
+#define IF_MMX    0x8000              /* it's an MMX instruction */
+
+#endif
diff --git a/i386/nasm/insns.pl b/i386/nasm/insns.pl
new file mode 100755 (executable)
index 0000000..9dc4dd4
--- /dev/null
@@ -0,0 +1,162 @@
+#!/usr/bin/perl
+#
+# insns.pl   produce insnsa.c and insnsd.c from insns.dat
+#
+# The Netwide Assembler is copyright (C) 1996 Simon Tatham and
+# Julian Hall. All rights reserved. The software is
+# redistributable under the licence given in the file "Licence"
+# distributed in the NASM archive.
+
+print STDERR "Reading insns.dat...\n";
+
+$fname = "insns.dat" unless $fname = $ARGV[0];
+open (F, $fname) || die "unable to open $fname";
+
+$line = 0;
+$opcodes = 0;
+$insns = 0;
+while (<F>) {
+  $line++;
+  next if /^\s*;/;   # comments
+  chomp;
+  split;
+  next if $#_ == -1; # blank lines
+  (warn "line $line does not contain four fields\n"), next if $#_ != 3;
+  ($formatted, $nd) = &format(@_);
+  if ($formatted) {
+    $insns++;
+    $aname = "aa_$_[0]";
+    push @$aname, $formatted;
+  }
+  $opcodes[$opcodes++] = $_[0], $done{$_[0]} = 1 if !$done{$_[0]};
+  if ($formatted && !$nd) {
+    push @big, $formatted;
+    foreach $i (&startbyte($_[2])) {
+      $aname = sprintf "dd_%02X",$i;
+      push @$aname, $#big;
+    }
+  }
+}
+
+close F;
+
+print STDERR "Writing insnsa.c...\n";
+
+open A, ">insnsa.c";
+
+print A "/* This file auto-generated from insns.dat by insns.pl" .
+        " - don't edit it */\n\n";
+print A "#include <stdio.h>\n";
+print A "#include \"nasm.h\"\n";
+print A "#include \"insns.h\"\n";
+print A "\n";
+
+foreach $i (@opcodes) {
+  print A "static struct itemplate instrux_${i}[] = {\n";
+  $aname = "aa_$i";
+  foreach $j (@$aname) {
+    print A "    $j\n";
+  }
+  print A "    {-1}\n};\n\n";
+}
+print A "struct itemplate *nasm_instructions[] = {\n";
+foreach $i (@opcodes) {
+  print A "    instrux_${i},\n";
+}
+print A "};\n";
+
+close A;
+
+print STDERR "Writing insnsd.c...\n";
+
+open D, ">insnsd.c";
+
+print D "/* This file auto-generated from insns.dat by insns.pl" .
+        " - don't edit it */\n\n";
+print D "#include <stdio.h>\n";
+print D "#include \"nasm.h\"\n";
+print D "#include \"insns.h\"\n";
+print D "\n";
+
+print D "static struct itemplate instrux[] = {\n";
+foreach $j (@big) {
+  print D "    $j\n";
+}
+print D "    {-1}\n};\n\n";
+
+for ($c=0; $c<256; $c++) {
+  $h = sprintf "%02X", $c;
+  print D "static struct itemplate *itable_${h}[] = {\n";
+  $aname = "dd_$h";
+  foreach $j (@$aname) {
+    print D "    instrux + $j,\n";
+  }
+  print D "    NULL\n};\n\n";
+}
+
+print D "struct itemplate **itable[] = {\n";
+for ($c=0; $c<256; $c++) {
+  printf D "    itable_%02X,\n", $c;
+}
+print D "};\n";
+
+close D;
+
+printf STDERR "Done: %d instructions\n", $insns;
+
+sub format {
+  local ($opcode, $operands, $codes, $flags) = @_;
+  local $num, $nd = 0;
+
+  return (undef, undef) if $operands eq "ignore";
+
+  # format the operands
+  $operands =~ s/:/|colon,/g;
+  $operands =~ s/mem(\d+)/mem|bits$1/g;
+  $operands =~ s/mem/memory/g;
+  $operands =~ s/memory_offs/mem_offs/g;
+  $operands =~ s/imm(\d+)/imm|bits$1/g;
+  $operands =~ s/imm/immediate/g;
+  $operands =~ s/rm(\d+)/regmem|bits$1/g;
+  $num = 3;
+  $operands = '0,0,0', $num = 0 if $operands eq 'void';
+  $operands .= ',0', $num-- while $operands !~ /,.*,/;
+  $operands =~ tr/a-z/A-Z/;
+
+  # format the flags
+  $flags =~ s/,/|IF_/g;
+  $flags =~ s/(\|IF_ND|IF_ND\|)//, $nd = 1 if $flags =~ /IF_ND/;
+  $flags = "IF_" . $flags;
+
+  ("{I_$opcode, $num, {$operands}, \"$codes\", $flags},", $nd);
+}
+
+# Here we determine the range of possible starting bytes for a given
+# instruction. We need only consider the codes:
+# \1 \2 \3     mean literal bytes, of course
+# \4 \5 \6 \7  mean PUSH/POP of segment registers: special case
+# \10 \11 \12  mean byte plus register value
+# \17          means byte zero
+# \330         means byte plus condition code
+# \0 or \340   mean give up and return empty set
+sub startbyte {
+  local ($codes) = @_;
+  local $word, @range;
+
+  while (1) {
+    die "couldn't get code in '$codes'" if $codes !~ /^(\\[^\\]+)(\\.*)?$/;
+    $word = $1, $codes = $2;
+    return (hex $1) if $word =~ /^\\[123]$/ && $codes =~ /^\\x(..)/;
+    return (0x07, 0x17, 0x1F) if $word eq "\\4";
+    return (0xA1, 0xA9) if $word eq "\\5";
+    return (0x06, 0x0E, 0x16, 0x1E) if $word eq "\\6";
+    return (0xA0, 0xA8) if $word eq "\\7";
+    $start=hex $1, $r=8, last if $word =~ /^\\1[012]$/ && $codes =~/^\\x(..)/;
+    return (0) if $word eq "\\17";
+    $start=hex $1, $r=16, last if $word =~ /^\\330$/ && $codes =~ /^\\x(..)/;
+    return () if $word eq "\\0" || $word eq "\\340";
+  }
+  @range = ();
+  push @range, $start++ while ($r-- > 0);
+  @range;
+}
diff --git a/i386/nasm/insnsa.c b/i386/nasm/insnsa.c
new file mode 100644 (file)
index 0000000..690261f
--- /dev/null
@@ -0,0 +1,2716 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
+ * Reserved.  This file contains Original Code and/or Modifications of
+ * Original Code as defined in and that are subject to the Apple Public
+ * Source License Version 1.1 (the "License").  You may not use this file
+ * except in compliance with the License.  Please obtain a copy of the
+ * License at http://www.apple.com/publicsource and read it before using
+ * this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/* This file auto-generated from insns.dat by insns.pl - don't edit it */
+
+#include <stdio.h>
+#include "nasm.h"
+#include "insns.h"
+
+static struct itemplate instrux_AAA[] = {
+    {I_AAA, 0, {0,0,0}, "\1\x37", IF_8086},
+    {-1}
+};
+
+static struct itemplate instrux_AAD[] = {
+    {I_AAD, 0, {0,0,0}, "\2\xD5\x0A", IF_8086},
+    {I_AAD, 1, {IMMEDIATE,0,0}, "\1\xD5\24", IF_8086},
+    {-1}
+};
+
+static struct itemplate instrux_AAM[] = {
+    {I_AAM, 0, {0,0,0}, "\2\xD4\x0A", IF_8086},
+    {I_AAM, 1, {IMMEDIATE,0,0}, "\1\xD4\24", IF_8086},
+    {-1}
+};
+
+static struct itemplate instrux_AAS[] = {
+    {I_AAS, 0, {0,0,0}, "\1\x3F", IF_8086},
+    {-1}
+};
+
+static struct itemplate instrux_ADC[] = {
+    {I_ADC, 2, {MEMORY,REG8,0}, "\300\1\x10\101", IF_8086|IF_SM},
+    {I_ADC, 2, {REG8,REG8,0}, "\300\1\x10\101", IF_8086},
+    {I_ADC, 2, {MEMORY,REG16,0}, "\320\300\1\x11\101", IF_8086|IF_SM},
+    {I_ADC, 2, {REG16,REG16,0}, "\320\300\1\x11\101", IF_8086},
+    {I_ADC, 2, {MEMORY,REG32,0}, "\321\300\1\x11\101", IF_386|IF_SM},
+    {I_ADC, 2, {REG32,REG32,0}, "\321\300\1\x11\101", IF_386},
+    {I_ADC, 2, {REG8,MEMORY,0}, "\301\1\x12\110", IF_8086|IF_SM},
+    {I_ADC, 2, {REG8,REG8,0}, "\301\1\x12\110", IF_8086},
+    {I_ADC, 2, {REG16,MEMORY,0}, "\320\301\1\x13\110", IF_8086|IF_SM},
+    {I_ADC, 2, {REG16,REG16,0}, "\320\301\1\x13\110", IF_8086},
+    {I_ADC, 2, {REG32,MEMORY,0}, "\321\301\1\x13\110", IF_386|IF_SM},
+    {I_ADC, 2, {REG32,REG32,0}, "\321\301\1\x13\110", IF_386},
+    {I_ADC, 2, {REGMEM|BITS16,IMMEDIATE|BITS8,0}, "\320\300\1\x83\202\15", IF_8086},
+    {I_ADC, 2, {REGMEM|BITS32,IMMEDIATE|BITS8,0}, "\321\300\1\x83\202\15", IF_386},
+    {I_ADC, 2, {REG_AL,IMMEDIATE,0}, "\1\x14\21", IF_8086|IF_SM},
+    {I_ADC, 2, {REG_AX,IMMEDIATE,0}, "\320\1\x15\31", IF_8086|IF_SM},
+    {I_ADC, 2, {REG_EAX,IMMEDIATE,0}, "\321\1\x15\41", IF_386|IF_SM},
+    {I_ADC, 2, {REGMEM|BITS8,IMMEDIATE,0}, "\300\1\x80\202\21", IF_8086|IF_SM},
+    {I_ADC, 2, {REGMEM|BITS16,IMMEDIATE,0}, "\320\300\1\x81\202\31", IF_8086|IF_SM},
+    {I_ADC, 2, {REGMEM|BITS32,IMMEDIATE,0}, "\321\300\1\x81\202\41", IF_386|IF_SM},
+    {I_ADC, 2, {MEMORY,IMMEDIATE|BITS8,0}, "\300\1\x80\202\21", IF_8086|IF_SM},
+    {I_ADC, 2, {MEMORY,IMMEDIATE|BITS16,0}, "\320\300\1\x81\202\31", IF_8086|IF_SM},
+    {I_ADC, 2, {MEMORY,IMMEDIATE|BITS32,0}, "\321\300\1\x81\202\41", IF_386|IF_SM},
+    {-1}
+};
+
+static struct itemplate instrux_ADD[] = {
+    {I_ADD, 2, {MEMORY,REG8,0}, "\300\17\101", IF_8086|IF_SM},
+    {I_ADD, 2, {REG8,REG8,0}, "\300\17\101", IF_8086},
+    {I_ADD, 2, {MEMORY,REG16,0}, "\320\300\1\x01\101", IF_8086|IF_SM},
+    {I_ADD, 2, {REG16,REG16,0}, "\320\300\1\x01\101", IF_8086},
+    {I_ADD, 2, {MEMORY,REG32,0}, "\321\300\1\x01\101", IF_386|IF_SM},
+    {I_ADD, 2, {REG32,REG32,0}, "\321\300\1\x01\101", IF_386},
+    {I_ADD, 2, {REG8,MEMORY,0}, "\301\1\x02\110", IF_8086|IF_SM},
+    {I_ADD, 2, {REG8,REG8,0}, "\301\1\x02\110", IF_8086},
+    {I_ADD, 2, {REG16,MEMORY,0}, "\320\301\1\x03\110", IF_8086|IF_SM},
+    {I_ADD, 2, {REG16,REG16,0}, "\320\301\1\x03\110", IF_8086},
+    {I_ADD, 2, {REG32,MEMORY,0}, "\321\301\1\x03\110", IF_386|IF_SM},
+    {I_ADD, 2, {REG32,REG32,0}, "\321\301\1\x03\110", IF_386},
+    {I_ADD, 2, {REGMEM|BITS16,IMMEDIATE|BITS8,0}, "\320\300\1\x83\200\15", IF_8086},
+    {I_ADD, 2, {REGMEM|BITS32,IMMEDIATE|BITS8,0}, "\321\300\1\x83\200\15", IF_386},
+    {I_ADD, 2, {REG_AL,IMMEDIATE,0}, "\1\x04\21", IF_8086|IF_SM},
+    {I_ADD, 2, {REG_AX,IMMEDIATE,0}, "\320\1\x05\31", IF_8086|IF_SM},
+    {I_ADD, 2, {REG_EAX,IMMEDIATE,0}, "\321\1\x05\41", IF_386|IF_SM},
+    {I_ADD, 2, {REGMEM|BITS8,IMMEDIATE,0}, "\300\1\x80\200\21", IF_8086|IF_SM},
+    {I_ADD, 2, {REGMEM|BITS16,IMMEDIATE,0}, "\320\300\1\x81\200\31", IF_8086|IF_SM},
+    {I_ADD, 2, {REGMEM|BITS32,IMMEDIATE,0}, "\321\300\1\x81\200\41", IF_386|IF_SM},
+    {I_ADD, 2, {MEMORY,IMMEDIATE|BITS8,0}, "\300\1\x80\200\21", IF_8086|IF_SM},
+    {I_ADD, 2, {MEMORY,IMMEDIATE|BITS16,0}, "\320\300\1\x81\200\31", IF_8086|IF_SM},
+    {I_ADD, 2, {MEMORY,IMMEDIATE|BITS32,0}, "\321\300\1\x81\200\41", IF_386|IF_SM},
+    {-1}
+};
+
+static struct itemplate instrux_AND[] = {
+    {I_AND, 2, {MEMORY,REG8,0}, "\300\1\x20\101", IF_8086|IF_SM},
+    {I_AND, 2, {REG8,REG8,0}, "\300\1\x20\101", IF_8086},
+    {I_AND, 2, {MEMORY,REG16,0}, "\320\300\1\x21\101", IF_8086|IF_SM},
+    {I_AND, 2, {REG16,REG16,0}, "\320\300\1\x21\101", IF_8086},
+    {I_AND, 2, {MEMORY,REG32,0}, "\321\300\1\x21\101", IF_386|IF_SM},
+    {I_AND, 2, {REG32,REG32,0}, "\321\300\1\x21\101", IF_386},
+    {I_AND, 2, {REG8,MEMORY,0}, "\301\1\x22\110", IF_8086|IF_SM},
+    {I_AND, 2, {REG8,REG8,0}, "\301\1\x22\110", IF_8086},
+    {I_AND, 2, {REG16,MEMORY,0}, "\320\301\1\x23\110", IF_8086|IF_SM},
+    {I_AND, 2, {REG16,REG16,0}, "\320\301\1\x23\110", IF_8086},
+    {I_AND, 2, {REG32,MEMORY,0}, "\321\301\1\x23\110", IF_386|IF_SM},
+    {I_AND, 2, {REG32,REG32,0}, "\321\301\1\x23\110", IF_386},
+    {I_AND, 2, {REGMEM|BITS16,IMMEDIATE|BITS8,0}, "\320\300\1\x83\204\15", IF_8086},
+    {I_AND, 2, {REGMEM|BITS32,IMMEDIATE|BITS8,0}, "\321\300\1\x83\204\15", IF_386},
+    {I_AND, 2, {REG_AL,IMMEDIATE,0}, "\1\x24\21", IF_8086|IF_SM},
+    {I_AND, 2, {REG_AX,IMMEDIATE,0}, "\320\1\x25\31", IF_8086|IF_SM},
+    {I_AND, 2, {REG_EAX,IMMEDIATE,0}, "\321\1\x25\41", IF_386|IF_SM},
+    {I_AND, 2, {REGMEM|BITS8,IMMEDIATE,0}, "\300\1\x80\204\21", IF_8086|IF_SM},
+    {I_AND, 2, {REGMEM|BITS16,IMMEDIATE,0}, "\320\300\1\x81\204\31", IF_8086|IF_SM},
+    {I_AND, 2, {REGMEM|BITS32,IMMEDIATE,0}, "\321\300\1\x81\204\41", IF_386|IF_SM},
+    {I_AND, 2, {MEMORY,IMMEDIATE|BITS8,0}, "\300\1\x80\204\21", IF_8086|IF_SM},
+    {I_AND, 2, {MEMORY,IMMEDIATE|BITS16,0}, "\320\300\1\x81\204\31", IF_8086|IF_SM},
+    {I_AND, 2, {MEMORY,IMMEDIATE|BITS32,0}, "\321\300\1\x81\204\41", IF_386|IF_SM},
+    {-1}
+};
+
+static struct itemplate instrux_ARPL[] = {
+    {I_ARPL, 2, {MEMORY,REG16,0}, "\300\1\x63\101", IF_286|IF_PRIV|IF_SM},
+    {I_ARPL, 2, {REG16,REG16,0}, "\300\1\x63\101", IF_286|IF_PRIV},
+    {-1}
+};
+
+static struct itemplate instrux_BOUND[] = {
+    {I_BOUND, 2, {REG16,MEMORY,0}, "\320\301\1\x62\110", IF_186},
+    {I_BOUND, 2, {REG32,MEMORY,0}, "\321\301\1\x62\110", IF_386},
+    {-1}
+};
+
+static struct itemplate instrux_BSF[] = {
+    {I_BSF, 2, {REG16,MEMORY,0}, "\320\301\2\x0F\xBC\110", IF_386|IF_SM},
+    {I_BSF, 2, {REG16,REG16,0}, "\320\301\2\x0F\xBC\110", IF_386},
+    {I_BSF, 2, {REG32,MEMORY,0}, "\321\301\2\x0F\xBC\110", IF_386|IF_SM},
+    {I_BSF, 2, {REG32,REG32,0}, "\321\301\2\x0F\xBC\110", IF_386},
+    {-1}
+};
+
+static struct itemplate instrux_BSR[] = {
+    {I_BSR, 2, {REG16,MEMORY,0}, "\320\301\2\x0F\xBD\110", IF_386|IF_SM},
+    {I_BSR, 2, {REG16,REG16,0}, "\320\301\2\x0F\xBD\110", IF_386},
+    {I_BSR, 2, {REG32,MEMORY,0}, "\321\301\2\x0F\xBD\110", IF_386|IF_SM},
+    {I_BSR, 2, {REG32,REG32,0}, "\321\301\2\x0F\xBD\110", IF_386},
+    {-1}
+};
+
+static struct itemplate instrux_BSWAP[] = {
+    {I_BSWAP, 1, {REG32,0,0}, "\321\1\x0F\10\xC8", IF_486},
+    {-1}
+};
+
+static struct itemplate instrux_BT[] = {
+    {I_BT, 2, {MEMORY,REG16,0}, "\320\300\2\x0F\xA3\101", IF_386|IF_SM},
+    {I_BT, 2, {REG16,REG16,0}, "\320\300\2\x0F\xA3\101", IF_386},
+    {I_BT, 2, {MEMORY,REG32,0}, "\321\300\2\x0F\xA3\101", IF_386|IF_SM},
+    {I_BT, 2, {REG32,REG32,0}, "\321\300\2\x0F\xA3\101", IF_386},
+    {I_BT, 2, {REGMEM|BITS16,IMMEDIATE,0}, "\320\300\2\x0F\xBA\204\25", IF_386},
+    {I_BT, 2, {REGMEM|BITS32,IMMEDIATE,0}, "\321\300\2\x0F\xBA\204\25", IF_386},
+    {-1}
+};
+
+static struct itemplate instrux_BTC[] = {
+    {I_BTC, 2, {MEMORY,REG16,0}, "\320\300\2\x0F\xBB\101", IF_386|IF_SM},
+    {I_BTC, 2, {REG16,REG16,0}, "\320\300\2\x0F\xBB\101", IF_386},
+    {I_BTC, 2, {MEMORY,REG32,0}, "\321\300\2\x0F\xBB\101", IF_386|IF_SM},
+    {I_BTC, 2, {REG32,REG32,0}, "\321\300\2\x0F\xBB\101", IF_386},
+    {I_BTC, 2, {REGMEM|BITS16,IMMEDIATE,0}, "\320\300\2\x0F\xBA\207\25", IF_386},
+    {I_BTC, 2, {REGMEM|BITS32,IMMEDIATE,0}, "\321\300\2\x0F\xBA\207\25", IF_386},
+    {-1}
+};
+
+static struct itemplate instrux_BTR[] = {
+    {I_BTR, 2, {MEMORY,REG16,0}, "\320\300\2\x0F\xB3\101", IF_386|IF_SM},
+    {I_BTR, 2, {REG16,REG16,0}, "\320\300\2\x0F\xB3\101", IF_386},
+    {I_BTR, 2, {MEMORY,REG32,0}, "\321\300\2\x0F\xB3\101", IF_386|IF_SM},
+    {I_BTR, 2, {REG32,REG32,0}, "\321\300\2\x0F\xB3\101", IF_386},
+    {I_BTR, 2, {REGMEM|BITS16,IMMEDIATE,0}, "\320\300\2\x0F\xBA\206\25", IF_386},
+    {I_BTR, 2, {REGMEM|BITS32,IMMEDIATE,0}, "\321\300\2\x0F\xBA\206\25", IF_386},
+    {-1}
+};
+
+static struct itemplate instrux_BTS[] = {
+    {I_BTS, 2, {MEMORY,REG16,0}, "\320\300\2\x0F\xAB\101", IF_386|IF_SM},
+    {I_BTS, 2, {REG16,REG16,0}, "\320\300\2\x0F\xAB\101", IF_386},
+    {I_BTS, 2, {MEMORY,REG32,0}, "\321\300\2\x0F\xAB\101", IF_386|IF_SM},
+    {I_BTS, 2, {REG32,REG32,0}, "\321\300\2\x0F\xAB\101", IF_386},
+    {I_BTS, 2, {REGMEM|BITS16,IMMEDIATE,0}, "\320\300\2\x0F\xBA\205\25", IF_386},
+    {I_BTS, 2, {REGMEM|BITS32,IMMEDIATE,0}, "\321\300\2\x0F\xBA\205\25", IF_386},
+    {-1}
+};
+
+static struct itemplate instrux_CALL[] = {
+    {I_CALL, 1, {IMMEDIATE,0,0}, "\322\1\xE8\64", IF_8086},
+    {I_CALL, 1, {IMMEDIATE|FAR,0,0}, "\322\1\x9A\34\37", IF_8086},
+    {I_CALL, 2, {IMMEDIATE|COLON,IMMEDIATE,0}, "\322\1\x9A\35\30", IF_8086},
+    {I_CALL, 2, {IMMEDIATE|BITS16|COLON,IMMEDIATE,0}, "\320\1\x9A\31\30", IF_8086},
+    {I_CALL, 2, {IMMEDIATE|COLON,IMMEDIATE|BITS16,0}, "\320\1\x9A\31\30", IF_8086},
+    {I_CALL, 2, {IMMEDIATE|BITS32|COLON,IMMEDIATE,0}, "\321\1\x9A\41\30", IF_386},
+    {I_CALL, 2, {IMMEDIATE|COLON,IMMEDIATE|BITS32,0}, "\321\1\x9A\41\30", IF_386},
+    {I_CALL, 1, {MEMORY|FAR,0,0}, "\322\300\1\xFF\203", IF_8086},
+    {I_CALL, 1, {MEMORY|BITS16|FAR,0,0}, "\320\300\1\xFF\203", IF_8086},
+    {I_CALL, 1, {MEMORY|BITS32|FAR,0,0}, "\321\300\1\xFF\203", IF_386},
+    {I_CALL, 1, {MEMORY|NEAR,0,0}, "\322\300\1\xFF\202", IF_8086},
+    {I_CALL, 1, {MEMORY|BITS16|NEAR,0,0}, "\320\300\1\xFF\202", IF_8086},
+    {I_CALL, 1, {MEMORY|BITS32|NEAR,0,0}, "\321\300\1\xFF\202", IF_386},
+    {I_CALL, 1, {REG16,0,0}, "\320\300\1\xFF\202", IF_8086},
+    {I_CALL, 1, {REG32,0,0}, "\321\300\1\xFF\202", IF_386},
+    {I_CALL, 1, {MEMORY,0,0}, "\322\300\1\xFF\202", IF_8086},
+    {I_CALL, 1, {MEMORY|BITS16,0,0}, "\320\300\1\xFF\202", IF_8086},
+    {I_CALL, 1, {MEMORY|BITS32,0,0}, "\321\300\1\xFF\202", IF_386},
+    {-1}
+};
+
+static struct itemplate instrux_CBW[] = {
+    {I_CBW, 0, {0,0,0}, "\320\1\x98", IF_8086},
+    {-1}
+};
+
+static struct itemplate instrux_CDQ[] = {
+    {I_CDQ, 0, {0,0,0}, "\321\1\x99", IF_386},
+    {-1}
+};
+
+static struct itemplate instrux_CLC[] = {
+    {I_CLC, 0, {0,0,0}, "\1\xF8", IF_8086},
+    {-1}
+};
+
+static struct itemplate instrux_CLD[] = {
+    {I_CLD, 0, {0,0,0}, "\1\xFC", IF_8086},
+    {-1}
+};
+
+static struct itemplate instrux_CLI[] = {
+    {I_CLI, 0, {0,0,0}, "\1\xFA", IF_8086},
+    {-1}
+};
+
+static struct itemplate instrux_CLTS[] = {
+    {I_CLTS, 0, {0,0,0}, "\2\x0F\x06", IF_286|IF_PRIV},
+    {-1}
+};
+
+static struct itemplate instrux_CMC[] = {
+    {I_CMC, 0, {0,0,0}, "\1\xF5", IF_8086},
+    {-1}
+};
+
+static struct itemplate instrux_CMP[] = {
+    {I_CMP, 2, {MEMORY,REG8,0}, "\300\1\x38\101", IF_8086|IF_SM},
+    {I_CMP, 2, {REG8,REG8,0}, "\300\1\x38\101", IF_8086},
+    {I_CMP, 2, {MEMORY,REG16,0}, "\320\300\1\x39\101", IF_8086|IF_SM},
+    {I_CMP, 2, {REG16,REG16,0}, "\320\300\1\x39\101", IF_8086},
+    {I_CMP, 2, {MEMORY,REG32,0}, "\321\300\1\x39\101", IF_386|IF_SM},
+    {I_CMP, 2, {REG32,REG32,0}, "\321\300\1\x39\101", IF_386},
+    {I_CMP, 2, {REG8,MEMORY,0}, "\301\1\x3A\110", IF_8086|IF_SM},
+    {I_CMP, 2, {REG8,REG8,0}, "\301\1\x3A\110", IF_8086},
+    {I_CMP, 2, {REG16,MEMORY,0}, "\320\301\1\x3B\110", IF_8086|IF_SM},
+    {I_CMP, 2, {REG16,REG16,0}, "\320\301\1\x3B\110", IF_8086},
+    {I_CMP, 2, {REG32,MEMORY,0}, "\321\301\1\x3B\110", IF_386|IF_SM},
+    {I_CMP, 2, {REG32,REG32,0}, "\321\301\1\x3B\110", IF_386},
+    {I_CMP, 2, {REGMEM|BITS16,IMMEDIATE|BITS8,0}, "\320\300\1\x83\207\15", IF_8086},
+    {I_CMP, 2, {REGMEM|BITS32,IMMEDIATE|BITS8,0}, "\321\300\1\x83\207\15", IF_386},
+    {I_CMP, 2, {REG_AL,IMMEDIATE,0}, "\1\x3C\21", IF_8086|IF_SM},
+    {I_CMP, 2, {REG_AX,IMMEDIATE,0}, "\320\1\x3D\31", IF_8086|IF_SM},
+    {I_CMP, 2, {REG_EAX,IMMEDIATE,0}, "\321\1\x3D\41", IF_386|IF_SM},
+    {I_CMP, 2, {REGMEM|BITS8,IMMEDIATE,0}, "\300\1\x80\207\21", IF_8086|IF_SM},
+    {I_CMP, 2, {REGMEM|BITS16,IMMEDIATE,0}, "\320\300\1\x81\207\31", IF_8086|IF_SM},
+    {I_CMP, 2, {REGMEM|BITS32,IMMEDIATE,0}, "\321\300\1\x81\207\41", IF_386|IF_SM},
+    {I_CMP, 2, {MEMORY,IMMEDIATE|BITS8,0}, "\300\1\x80\207\21", IF_8086|IF_SM},
+    {I_CMP, 2, {MEMORY,IMMEDIATE|BITS16,0}, "\320\300\1\x81\207\31", IF_8086|IF_SM},
+    {I_CMP, 2, {MEMORY,IMMEDIATE|BITS32,0}, "\321\300\1\x81\207\41", IF_386|IF_SM},
+    {-1}
+};
+
+static struct itemplate instrux_CMPSB[] = {
+    {I_CMPSB, 0, {0,0,0}, "\1\xA6", IF_8086},
+    {-1}
+};
+
+static struct itemplate instrux_CMPSD[] = {
+    {I_CMPSD, 0, {0,0,0}, "\321\1\xA7", IF_386},
+    {-1}
+};
+
+static struct itemplate instrux_CMPSW[] = {
+    {I_CMPSW, 0, {0,0,0}, "\320\1\xA7", IF_8086},
+    {-1}
+};
+
+static struct itemplate instrux_CMPXCHG[] = {
+    {I_CMPXCHG, 2, {MEMORY,REG8,0}, "\300\2\x0F\xB0\101", IF_PENT|IF_SM},
+    {I_CMPXCHG, 2, {REG8,REG8,0}, "\300\2\x0F\xB0\101", IF_PENT},
+    {I_CMPXCHG, 2, {MEMORY,REG16,0}, "\320\300\2\x0F\xB1\101", IF_PENT|IF_SM},
+    {I_CMPXCHG, 2, {REG16,REG16,0}, "\320\300\2\x0F\xB1\101", IF_PENT},
+    {I_CMPXCHG, 2, {MEMORY,REG32,0}, "\321\300\2\x0F\xB1\101", IF_PENT|IF_SM},
+    {I_CMPXCHG, 2, {REG32,REG32,0}, "\321\300\2\x0F\xB1\101", IF_PENT},
+    {-1}
+};
+
+static struct itemplate instrux_CMPXCHG486[] = {
+    {I_CMPXCHG486, 2, {MEMORY,REG8,0}, "\300\2\x0F\xA6\101", IF_486|IF_SM|IF_UNDOC},
+    {I_CMPXCHG486, 2, {REG8,REG8,0}, "\300\2\x0F\xA6\101", IF_486|IF_UNDOC},
+    {I_CMPXCHG486, 2, {MEMORY,REG16,0}, "\320\300\2\x0F\xA7\101", IF_486|IF_SM|IF_UNDOC},
+    {I_CMPXCHG486, 2, {REG16,REG16,0}, "\320\300\2\x0F\xA7\101", IF_486|IF_UNDOC},
+    {I_CMPXCHG486, 2, {MEMORY,REG32,0}, "\321\300\2\x0F\xA7\101", IF_486|IF_SM|IF_UNDOC},
+    {I_CMPXCHG486, 2, {REG32,REG32,0}, "\321\300\2\x0F\xA7\101", IF_486|IF_UNDOC},
+    {-1}
+};
+
+static struct itemplate instrux_CMPXCHG8B[] = {
+    {I_CMPXCHG8B, 1, {MEMORY,0,0}, "\300\2\x0F\xC7\201", IF_PENT},
+    {-1}
+};
+
+static struct itemplate instrux_CPUID[] = {
+    {I_CPUID, 0, {0,0,0}, "\2\x0F\xA2", IF_PENT},
+    {-1}
+};
+
+static struct itemplate instrux_CWD[] = {
+    {I_CWD, 0, {0,0,0}, "\320\1\x99", IF_8086},
+    {-1}
+};
+
+static struct itemplate instrux_CWDE[] = {
+    {I_CWDE, 0, {0,0,0}, "\321\1\x98", IF_386},
+    {-1}
+};
+
+static struct itemplate instrux_DAA[] = {
+    {I_DAA, 0, {0,0,0}, "\1\x27", IF_8086},
+    {-1}
+};
+
+static struct itemplate instrux_DAS[] = {
+    {I_DAS, 0, {0,0,0}, "\1\x2F", IF_8086},
+    {-1}
+};
+
+static struct itemplate instrux_DB[] = {
+    {-1}
+};
+
+static struct itemplate instrux_DD[] = {
+    {-1}
+};
+
+static struct itemplate instrux_DEC[] = {
+    {I_DEC, 1, {REG16,0,0}, "\320\10\x48", IF_8086},
+    {I_DEC, 1, {REG32,0,0}, "\321\10\x48", IF_386},
+    {I_DEC, 1, {REGMEM|BITS8,0,0}, "\300\1\xFE\201", IF_8086},
+    {I_DEC, 1, {REGMEM|BITS16,0,0}, "\320\300\1\xFF\201", IF_8086},
+    {I_DEC, 1, {REGMEM|BITS32,0,0}, "\321\300\1\xFF\201", IF_386},
+    {-1}
+};
+
+static struct itemplate instrux_DIV[] = {
+    {I_DIV, 1, {REGMEM|BITS8,0,0}, "\300\1\xF6\206", IF_8086},
+    {I_DIV, 1, {REGMEM|BITS16,0,0}, "\320\300\1\xF7\206", IF_8086},
+    {I_DIV, 1, {REGMEM|BITS32,0,0}, "\321\300\1\xF7\206", IF_386},
+    {-1}
+};
+
+static struct itemplate instrux_DQ[] = {
+    {-1}
+};
+
+static struct itemplate instrux_DT[] = {
+    {-1}
+};
+
+static struct itemplate instrux_DW[] = {
+    {-1}
+};
+
+static struct itemplate instrux_EMMS[] = {
+    {I_EMMS, 0, {0,0,0}, "\2\x0F\x77", IF_PENT|IF_MMX},
+    {-1}
+};
+
+static struct itemplate instrux_ENTER[] = {
+    {I_ENTER, 2, {IMMEDIATE,IMMEDIATE,0}, "\1\xC8\30\25", IF_186},
+    {-1}
+};
+
+static struct itemplate instrux_EQU[] = {
+    {I_EQU, 1, {IMMEDIATE,0,0}, "\0", IF_8086},
+    {I_EQU, 2, {IMMEDIATE|COLON,IMMEDIATE,0}, "\0", IF_8086},
+    {-1}
+};
+
+static struct itemplate instrux_F2XM1[] = {
+    {I_F2XM1, 0, {0,0,0}, "\2\xD9\xF0", IF_8086|IF_FPU},
+    {-1}
+};
+
+static struct itemplate instrux_FABS[] = {
+    {I_FABS, 0, {0,0,0}, "\2\xD9\xE1", IF_8086|IF_FPU},
+    {-1}
+};
+
+static struct itemplate instrux_FADD[] = {
+    {I_FADD, 1, {MEMORY|BITS32,0,0}, "\300\1\xD8\200", IF_8086|IF_FPU},
+    {I_FADD, 1, {MEMORY|BITS64,0,0}, "\300\1\xDC\200", IF_8086|IF_FPU},
+    {I_FADD, 1, {FPUREG|TO,0,0}, "\1\xDC\10\xC0", IF_8086|IF_FPU},
+    {I_FADD, 1, {FPUREG,0,0}, "\1\xD8\10\xC0", IF_8086|IF_FPU},
+    {I_FADD, 2, {FPUREG,FPU0,0}, "\1\xDC\10\xC0", IF_8086|IF_FPU},
+    {I_FADD, 2, {FPU0,FPUREG,0}, "\1\xD8\11\xC0", IF_8086|IF_FPU},
+    {-1}
+};
+
+static struct itemplate instrux_FADDP[] = {
+    {I_FADDP, 1, {FPUREG,0,0}, "\1\xDE\10\xC0", IF_8086|IF_FPU},
+    {I_FADDP, 2, {FPUREG,FPU0,0}, "\1\xDE\10\xC0", IF_8086|IF_FPU},
+    {-1}
+};
+
+static struct itemplate instrux_FBLD[] = {
+    {I_FBLD, 1, {MEMORY|BITS80,0,0}, "\300\1\xDF\204", IF_8086|IF_FPU},
+    {I_FBLD, 1, {MEMORY,0,0}, "\300\1\xDF\204", IF_8086|IF_FPU},
+    {-1}
+};
+
+static struct itemplate instrux_FBSTP[] = {
+    {I_FBSTP, 1, {MEMORY|BITS80,0,0}, "\300\1\xDF\206", IF_8086|IF_FPU},
+    {I_FBSTP, 1, {MEMORY,0,0}, "\300\1\xDF\206", IF_8086|IF_FPU},
+    {-1}
+};
+
+static struct itemplate instrux_FCHS[] = {
+    {I_FCHS, 0, {0,0,0}, "\2\xD9\xE0", IF_8086|IF_FPU},
+    {-1}
+};
+
+static struct itemplate instrux_FCLEX[] = {
+    {I_FCLEX, 0, {0,0,0}, "\3\x9B\xDB\xE2", IF_8086|IF_FPU},
+    {-1}
+};
+
+static struct itemplate instrux_FCMOVB[] = {
+    {I_FCMOVB, 1, {FPUREG,0,0}, "\1\xDA\10\xC0", IF_P6|IF_FPU},
+    {I_FCMOVB, 2, {FPU0,FPUREG,0}, "\1\xDA\11\xC0", IF_P6|IF_FPU},
+    {-1}
+};
+
+static struct itemplate instrux_FCMOVBE[] = {
+    {I_FCMOVBE, 1, {FPUREG,0,0}, "\1\xDA\10\xD0", IF_P6|IF_FPU},
+    {I_FCMOVBE, 2, {FPU0,FPUREG,0}, "\1\xDA\11\xD0", IF_P6|IF_FPU},
+    {-1}
+};
+
+static struct itemplate instrux_FCMOVE[] = {
+    {I_FCMOVE, 1, {FPUREG,0,0}, "\1\xDA\10\xC8", IF_P6|IF_FPU},
+    {I_FCMOVE, 2, {FPU0,FPUREG,0}, "\1\xDA\11\xC8", IF_P6|IF_FPU},
+    {-1}
+};
+
+static struct itemplate instrux_FCMOVNB[] = {
+    {I_FCMOVNB, 1, {FPUREG,0,0}, "\1\xDB\10\xC0", IF_P6|IF_FPU},
+    {I_FCMOVNB, 2, {FPU0,FPUREG,0}, "\1\xDB\11\xC0", IF_P6|IF_FPU},
+    {-1}
+};
+
+static struct itemplate instrux_FCMOVNBE[] = {
+    {I_FCMOVNBE, 1, {FPUREG,0,0}, "\1\xDB\10\xD0", IF_P6|IF_FPU},
+    {I_FCMOVNBE, 2, {FPU0,FPUREG,0}, "\1\xDB\11\xD0", IF_P6|IF_FPU},
+    {-1}
+};
+
+static struct itemplate instrux_FCMOVNE[] = {
+    {I_FCMOVNE, 1, {FPUREG,0,0}, "\1\xDB\10\xC8", IF_P6|IF_FPU},
+    {I_FCMOVNE, 2, {FPU0,FPUREG,0}, "\1\xDB\11\xC8", IF_P6|IF_FPU},
+    {-1}
+};
+
+static struct itemplate instrux_FCMOVNU[] = {
+    {I_FCMOVNU, 1, {FPUREG,0,0}, "\1\xDB\10\xD8", IF_P6|IF_FPU},
+    {I_FCMOVNU, 2, {FPU0,FPUREG,0}, "\1\xDB\11\xD8", IF_P6|IF_FPU},
+    {-1}
+};
+
+static struct itemplate instrux_FCMOVU[] = {
+    {I_FCMOVU, 1, {FPUREG,0,0}, "\1\xDA\10\xD8", IF_P6|IF_FPU},
+    {I_FCMOVU, 2, {FPU0,FPUREG,0}, "\1\xDA\11\xD8", IF_P6|IF_FPU},
+    {-1}
+};
+
+static struct itemplate instrux_FCOM[] = {
+    {I_FCOM, 1, {MEMORY|BITS32,0,0}, "\300\1\xD8\202", IF_8086|IF_FPU},
+    {I_FCOM, 1, {MEMORY|BITS64,0,0}, "\300\1\xDC\202", IF_8086|IF_FPU},
+    {I_FCOM, 1, {FPUREG,0,0}, "\1\xD8\10\xD0", IF_8086|IF_FPU},
+    {I_FCOM, 2, {FPU0,FPUREG,0}, "\1\xD8\11\xD0", IF_8086|IF_FPU},
+    {-1}
+};
+
+static struct itemplate instrux_FCOMI[] = {
+    {I_FCOMI, 1, {FPUREG,0,0}, "\1\xDB\10\xF0", IF_P6|IF_FPU},
+    {I_FCOMI, 2, {FPU0,FPUREG,0}, "\1\xDB\11\xF0", IF_P6|IF_FPU},
+    {-1}
+};
+
+static struct itemplate instrux_FCOMIP[] = {
+    {I_FCOMIP, 1, {FPUREG,0,0}, "\1\xDF\10\xF0", IF_P6|IF_FPU},
+    {I_FCOMIP, 2, {FPU0,FPUREG,0}, "\1\xDF\11\xF0", IF_P6|IF_FPU},
+    {-1}
+};
+
+static struct itemplate instrux_FCOMP[] = {
+    {I_FCOMP, 1, {MEMORY|BITS32,0,0}, "\300\1\xD8\203", IF_8086|IF_FPU},
+    {I_FCOMP, 1, {MEMORY|BITS64,0,0}, "\300\1\xDC\203", IF_8086|IF_FPU},
+    {I_FCOMP, 1, {FPUREG,0,0}, "\1\xD8\10\xD8", IF_8086|IF_FPU},
+    {I_FCOMP, 2, {FPU0,FPUREG,0}, "\1\xD8\11\xD8", IF_8086|IF_FPU},
+    {-1}
+};
+
+static struct itemplate instrux_FCOMPP[] = {
+    {I_FCOMPP, 0, {0,0,0}, "\2\xDE\xD9", IF_8086|IF_FPU},
+    {-1}
+};
+
+static struct itemplate instrux_FCOS[] = {
+    {I_FCOS, 0, {0,0,0}, "\2\xD9\xFF", IF_386|IF_FPU},
+    {-1}
+};
+
+static struct itemplate instrux_FDECSTP[] = {
+    {I_FDECSTP, 0, {0,0,0}, "\2\xD9\xF6", IF_8086|IF_FPU},
+    {-1}
+};
+
+static struct itemplate instrux_FDISI[] = {
+    {I_FDISI, 0, {0,0,0}, "\3\x9B\xDB\xE1", IF_8086|IF_FPU},
+    {-1}
+};
+
+static struct itemplate instrux_FDIV[] = {
+    {I_FDIV, 1, {MEMORY|BITS32,0,0}, "\300\1\xD8\206", IF_8086|IF_FPU},
+    {I_FDIV, 1, {MEMORY|BITS64,0,0}, "\300\1\xDC\206", IF_8086|IF_FPU},
+    {I_FDIV, 1, {FPUREG|TO,0,0}, "\1\xDC\10\xF8", IF_8086|IF_FPU},
+    {I_FDIV, 2, {FPUREG,FPU0,0}, "\1\xDC\10\xF8", IF_8086|IF_FPU},
+    {I_FDIV, 1, {FPUREG,0,0}, "\1\xD8\10\xF0", IF_8086|IF_FPU},
+    {I_FDIV, 2, {FPU0,FPUREG,0}, "\1\xD8\11\xF0", IF_8086|IF_FPU},
+    {-1}
+};
+
+static struct itemplate instrux_FDIVP[] = {
+    {I_FDIVP, 2, {FPUREG,FPU0,0}, "\1\xDE\10\xF8", IF_8086|IF_FPU},
+    {I_FDIVP, 1, {FPUREG,0,0}, "\1\xDE\10\xF8", IF_8086|IF_FPU},
+    {-1}
+};
+
+static struct itemplate instrux_FDIVR[] = {
+    {I_FDIVR, 1, {MEMORY|BITS32,0,0}, "\300\1\xD8\207", IF_8086|IF_FPU},
+    {I_FDIVR, 1, {MEMORY|BITS64,0,0}, "\300\1\xDC\207", IF_8086|IF_FPU},
+    {I_FDIVR, 1, {FPUREG|TO,0,0}, "\1\xDC\10\xF0", IF_8086|IF_FPU},
+    {I_FDIVR, 2, {FPUREG,FPU0,0}, "\1\xDC\10\xF0", IF_8086|IF_FPU},
+    {I_FDIVR, 1, {FPUREG,0,0}, "\1\xD8\10\xF8", IF_8086|IF_FPU},
+    {I_FDIVR, 2, {FPU0,FPUREG,0}, "\1\xD8\11\xF8", IF_8086|IF_FPU},
+    {-1}
+};
+
+static struct itemplate instrux_FDIVRP[] = {
+    {I_FDIVRP, 1, {FPUREG,0,0}, "\1\xDE\10\xF0", IF_8086|IF_FPU},
+    {I_FDIVRP, 2, {FPUREG,FPU0,0}, "\1\xDE\10\xF0", IF_8086|IF_FPU},
+    {-1}
+};
+
+static struct itemplate instrux_FENI[] = {
+    {I_FENI, 0, {0,0,0}, "\3\x9B\xDB\xE0", IF_8086|IF_FPU},
+    {-1}
+};
+
+static struct itemplate instrux_FFREE[] = {
+    {I_FFREE, 1, {FPUREG,0,0}, "\1\xDD\10\xC0", IF_8086|IF_FPU},
+    {-1}
+};
+
+static struct itemplate instrux_FIADD[] = {
+    {I_FIADD, 1, {MEMORY|BITS32,0,0}, "\300\1\xDA\200", IF_8086|IF_FPU},
+    {I_FIADD, 1, {MEMORY|BITS16,0,0}, "\300\1\xDE\200", IF_8086|IF_FPU},
+    {-1}
+};
+
+static struct itemplate instrux_FICOM[] = {
+    {I_FICOM, 1, {MEMORY|BITS32,0,0}, "\300\1\xDA\202", IF_8086|IF_FPU},
+    {I_FICOM, 1, {MEMORY|BITS16,0,0}, "\300\1\xDE\202", IF_8086|IF_FPU},
+    {-1}
+};
+
+static struct itemplate instrux_FICOMP[] = {
+    {I_FICOMP, 1, {MEMORY|BITS32,0,0}, "\300\1\xDA\203", IF_8086|IF_FPU},
+    {I_FICOMP, 1, {MEMORY|BITS16,0,0}, "\300\1\xDE\203", IF_8086|IF_FPU},
+    {-1}
+};
+
+static struct itemplate instrux_FIDIV[] = {
+    {I_FIDIV, 1, {MEMORY|BITS32,0,0}, "\300\1\xDA\206", IF_8086|IF_FPU},
+    {I_FIDIV, 1, {MEMORY|BITS16,0,0}, "\300\1\xDE\206", IF_8086|IF_FPU},
+    {-1}
+};
+
+static struct itemplate instrux_FIDIVR[] = {
+    {I_FIDIVR, 1, {MEMORY|BITS32,0,0}, "\300\1\xDA\207", IF_8086|IF_FPU},
+    {I_FIDIVR, 1, {MEMORY|BITS16,0,0}, "\300\1\xDE\207", IF_8086|IF_FPU},
+    {-1}
+};
+
+static struct itemplate instrux_FILD[] = {
+    {I_FILD, 1, {MEMORY|BITS32,0,0}, "\300\1\xDB\200", IF_8086|IF_FPU},
+    {I_FILD, 1, {MEMORY|BITS16,0,0}, "\300\1\xDF\200", IF_8086|IF_FPU},
+    {I_FILD, 1, {MEMORY|BITS64,0,0}, "\300\1\xDF\205", IF_8086|IF_FPU},
+    {-1}
+};
+
+static struct itemplate instrux_FIMUL[] = {
+    {I_FIMUL, 1, {MEMORY|BITS32,0,0}, "\300\1\xDA\201", IF_8086|IF_FPU},
+    {I_FIMUL, 1, {MEMORY|BITS16,0,0}, "\300\1\xDE\201", IF_8086|IF_FPU},
+    {-1}
+};
+
+static struct itemplate instrux_FINCSTP[] = {
+    {I_FINCSTP, 0, {0,0,0}, "\2\xD9\xF7", IF_8086|IF_FPU},
+    {-1}
+};
+
+static struct itemplate instrux_FINIT[] = {
+    {I_FINIT, 0, {0,0,0}, "\3\x9B\xDB\xE3", IF_8086|IF_FPU},
+    {-1}
+};
+
+static struct itemplate instrux_FIST[] = {
+    {I_FIST, 1, {MEMORY|BITS32,0,0}, "\300\1\xDB\202", IF_8086|IF_FPU},
+    {I_FIST, 1, {MEMORY|BITS16,0,0}, "\300\1\xDF\202", IF_8086|IF_FPU},
+    {-1}
+};
+
+static struct itemplate instrux_FISTP[] = {
+    {I_FISTP, 1, {MEMORY|BITS32,0,0}, "\300\1\xDB\203", IF_8086|IF_FPU},
+    {I_FISTP, 1, {MEMORY|BITS16,0,0}, "\300\1\xDF\203", IF_8086|IF_FPU},
+    {I_FISTP, 1, {MEMORY|BITS64,0,0}, "\300\1\xDF\207", IF_8086|IF_FPU},
+    {-1}
+};
+
+static struct itemplate instrux_FISUB[] = {
+    {I_FISUB, 1, {MEMORY|BITS32,0,0}, "\300\1\xDA\204", IF_8086|IF_FPU},
+    {I_FISUB, 1, {MEMORY|BITS16,0,0}, "\300\1\xDE\204", IF_8086|IF_FPU},
+    {-1}
+};
+
+static struct itemplate instrux_FISUBR[] = {
+    {I_FISUBR, 1, {MEMORY|BITS32,0,0}, "\300\1\xDA\205", IF_8086|IF_FPU},
+    {I_FISUBR, 1, {MEMORY|BITS16,0,0}, "\300\1\xDE\205", IF_8086|IF_FPU},
+    {-1}
+};
+
+static struct itemplate instrux_FLD[] = {
+    {I_FLD, 1, {MEMORY|BITS32,0,0}, "\300\1\xD9\200", IF_8086|IF_FPU},
+    {I_FLD, 1, {MEMORY|BITS64,0,0}, "\300\1\xDD\200", IF_8086|IF_FPU},
+    {I_FLD, 1, {MEMORY|BITS80,0,0}, "\300\1\xDB\205", IF_8086|IF_FPU},
+    {I_FLD, 1, {FPUREG,0,0}, "\1\xD9\10\xC0", IF_8086|IF_FPU},
+    {-1}
+};
+
+static struct itemplate instrux_FLD1[] = {
+    {I_FLD1, 0, {0,0,0}, "\2\xD9\xE8", IF_8086|IF_FPU},
+    {-1}
+};
+
+static struct itemplate instrux_FLDCW[] = {
+    {I_FLDCW, 1, {MEMORY,0,0}, "\300\1\xD9\205", IF_8086|IF_FPU|IF_SW},
+    {-1}
+};
+
+static struct itemplate instrux_FLDENV[] = {
+    {I_FLDENV, 1, {MEMORY,0,0}, "\300\1\xD9\204", IF_8086|IF_FPU},
+    {-1}
+};
+
+static struct itemplate instrux_FLDL2E[] = {
+    {I_FLDL2E, 0, {0,0,0}, "\2\xD9\xEA", IF_8086|IF_FPU},
+    {-1}
+};
+
+static struct itemplate instrux_FLDL2T[] = {
+    {I_FLDL2T, 0, {0,0,0}, "\2\xD9\xE9", IF_8086|IF_FPU},
+    {-1}
+};
+
+static struct itemplate instrux_FLDLG2[] = {
+    {I_FLDLG2, 0, {0,0,0}, "\2\xD9\xEC", IF_8086|IF_FPU},
+    {-1}
+};
+
+static struct itemplate instrux_FLDLN2[] = {
+    {I_FLDLN2, 0, {0,0,0}, "\2\xD9\xED", IF_8086|IF_FPU},
+    {-1}
+};
+
+static struct itemplate instrux_FLDPI[] = {
+    {I_FLDPI, 0, {0,0,0}, "\2\xD9\xEB", IF_8086|IF_FPU},
+    {-1}
+};
+
+static struct itemplate instrux_FLDZ[] = {
+    {I_FLDZ, 0, {0,0,0}, "\2\xD9\xEE", IF_8086|IF_FPU},
+    {-1}
+};
+
+static struct itemplate instrux_FMUL[] = {
+    {I_FMUL, 1, {MEMORY|BITS32,0,0}, "\300\1\xD8\201", IF_8086|IF_FPU},
+    {I_FMUL, 1, {MEMORY|BITS64,0,0}, "\300\1\xDC\201", IF_8086|IF_FPU},
+    {I_FMUL, 1, {FPUREG|TO,0,0}, "\1\xDC\10\xC8", IF_8086|IF_FPU},
+    {I_FMUL, 2, {FPUREG,FPU0,0}, "\1\xDC\10\xC8", IF_8086|IF_FPU},
+    {I_FMUL, 1, {FPUREG,0,0}, "\1\xD8\10\xC8", IF_8086|IF_FPU},
+    {I_FMUL, 2, {FPU0,FPUREG,0}, "\1\xD8\11\xC8", IF_8086|IF_FPU},
+    {-1}
+};
+
+static struct itemplate instrux_FMULP[] = {
+    {I_FMULP, 1, {FPUREG,0,0}, "\1\xDE\10\xC8", IF_8086|IF_FPU},
+    {I_FMULP, 2, {FPUREG,FPU0,0}, "\1\xDE\10\xC8", IF_8086|IF_FPU},
+    {-1}
+};
+
+static struct itemplate instrux_FNCLEX[] = {
+    {I_FNCLEX, 0, {0,0,0}, "\2\xDB\xE2", IF_8086|IF_FPU},
+    {-1}
+};
+
+static struct itemplate instrux_FNDISI[] = {
+    {I_FNDISI, 0, {0,0,0}, "\2\xDB\xE1", IF_8086|IF_FPU},
+    {-1}
+};
+
+static struct itemplate instrux_FNENI[] = {
+    {I_FNENI, 0, {0,0,0}, "\2\xDB\xE0", IF_8086|IF_FPU},
+    {-1}
+};
+
+static struct itemplate instrux_FNINIT[] = {
+    {I_FNINIT, 0, {0,0,0}, "\2\xDB\xE3", IF_8086|IF_FPU},
+    {-1}
+};
+
+static struct itemplate instrux_FNOP[] = {
+    {I_FNOP, 0, {0,0,0}, "\2\xD9\xD0", IF_8086|IF_FPU},
+    {-1}
+};
+
+static struct itemplate instrux_FNSAVE[] = {
+    {I_FNSAVE, 1, {MEMORY,0,0}, "\300\1\xDD\206", IF_8086|IF_FPU},
+    {-1}
+};
+
+static struct itemplate instrux_FNSTCW[] = {
+    {I_FNSTCW, 1, {MEMORY,0,0}, "\300\1\xD9\207", IF_8086|IF_FPU|IF_SW},
+    {-1}
+};
+
+static struct itemplate instrux_FNSTENV[] = {
+    {I_FNSTENV, 1, {MEMORY,0,0}, "\300\1\xD9\206", IF_8086|IF_FPU},
+    {-1}
+};
+
+static struct itemplate instrux_FNSTSW[] = {
+    {I_FNSTSW, 1, {MEMORY,0,0}, "\300\1\xDD\207", IF_8086|IF_FPU|IF_SW},
+    {I_FNSTSW, 1, {REG_AX,0,0}, "\2\xDF\xE0", IF_286|IF_FPU},
+    {-1}
+};
+
+static struct itemplate instrux_FPATAN[] = {
+    {I_FPATAN, 0, {0,0,0}, "\2\xD9\xF3", IF_8086|IF_FPU},
+    {-1}
+};
+
+static struct itemplate instrux_FPREM[] = {
+    {I_FPREM, 0, {0,0,0}, "\2\xD9\xF8", IF_8086|IF_FPU},
+    {-1}
+};
+
+static struct itemplate instrux_FPREM1[] = {
+    {I_FPREM1, 0, {0,0,0}, "\2\xD9\xF5", IF_386|IF_FPU},
+    {-1}
+};
+
+static struct itemplate instrux_FPTAN[] = {
+    {I_FPTAN, 0, {0,0,0}, "\2\xD9\xF2", IF_8086|IF_FPU},
+    {-1}
+};
+
+static struct itemplate instrux_FRNDINT[] = {
+    {I_FRNDINT, 0, {0,0,0}, "\2\xD9\xFC", IF_8086|IF_FPU},
+    {-1}
+};
+
+static struct itemplate instrux_FRSTOR[] = {
+    {I_FRSTOR, 1, {MEMORY,0,0}, "\300\1\xDD\204", IF_8086|IF_FPU},
+    {-1}
+};
+
+static struct itemplate instrux_FSAVE[] = {
+    {I_FSAVE, 1, {MEMORY,0,0}, "\300\2\x9B\xDD\206", IF_8086|IF_FPU},
+    {-1}
+};
+
+static struct itemplate instrux_FSCALE[] = {
+    {I_FSCALE, 0, {0,0,0}, "\2\xD9\xFD", IF_8086|IF_FPU},
+    {-1}
+};
+
+static struct itemplate instrux_FSETPM[] = {
+    {I_FSETPM, 0, {0,0,0}, "\2\xDB\xE4", IF_286|IF_FPU},
+    {-1}
+};
+
+static struct itemplate instrux_FSIN[] = {
+    {I_FSIN, 0, {0,0,0}, "\2\xD9\xFE", IF_386|IF_FPU},
+    {-1}
+};
+
+static struct itemplate instrux_FSINCOS[] = {
+    {I_FSINCOS, 0, {0,0,0}, "\2\xD9\xFB", IF_386|IF_FPU},
+    {-1}
+};
+
+static struct itemplate instrux_FSQRT[] = {
+    {I_FSQRT, 0, {0,0,0}, "\2\xD9\xFA", IF_8086|IF_FPU},
+    {-1}
+};
+
+static struct itemplate instrux_FST[] = {
+    {I_FST, 1, {MEMORY|BITS32,0,0}, "\300\1\xD9\202", IF_8086|IF_FPU},
+    {I_FST, 1, {MEMORY|BITS64,0,0}, "\300\1\xDD\202", IF_8086|IF_FPU},
+    {I_FST, 1, {FPUREG,0,0}, "\1\xDD\10\xD0", IF_8086|IF_FPU},
+    {-1}
+};
+
+static struct itemplate instrux_FSTCW[] = {
+    {I_FSTCW, 1, {MEMORY,0,0}, "\300\2\x9B\xD9\207", IF_8086|IF_FPU|IF_SW},
+    {-1}
+};
+
+static struct itemplate instrux_FSTENV[] = {
+    {I_FSTENV, 1, {MEMORY,0,0}, "\300\2\x9B\xD9\206", IF_8086|IF_FPU},
+    {-1}
+};
+
+static struct itemplate instrux_FSTP[] = {
+    {I_FSTP, 1, {MEMORY|BITS32,0,0}, "\300\1\xD9\203", IF_8086|IF_FPU},
+    {I_FSTP, 1, {MEMORY|BITS64,0,0}, "\300\1\xDD\203", IF_8086|IF_FPU},
+    {I_FSTP, 1, {MEMORY|BITS80,0,0}, "\300\1\xDB\207", IF_8086|IF_FPU},
+    {I_FSTP, 1, {FPUREG,0,0}, "\1\xDD\10\xD8", IF_8086|IF_FPU},
+    {-1}
+};
+
+static struct itemplate instrux_FSTSW[] = {
+    {I_FSTSW, 1, {MEMORY,0,0}, "\300\2\x9B\xDD\207", IF_8086|IF_FPU|IF_SW},
+    {I_FSTSW, 1, {REG_AX,0,0}, "\3\x9B\xDF\xE0", IF_286|IF_FPU},
+    {-1}
+};
+
+static struct itemplate instrux_FSUB[] = {
+    {I_FSUB, 1, {MEMORY|BITS32,0,0}, "\300\1\xD8\204", IF_8086|IF_FPU},
+    {I_FSUB, 1, {MEMORY|BITS64,0,0}, "\300\1\xDC\204", IF_8086|IF_FPU},
+    {I_FSUB, 1, {FPUREG|TO,0,0}, "\1\xDC\10\xE8", IF_8086|IF_FPU},
+    {I_FSUB, 2, {FPUREG,FPU0,0}, "\1\xDC\10\xE8", IF_8086|IF_FPU},
+    {I_FSUB, 1, {FPUREG,0,0}, "\1\xD8\10\xE0", IF_8086|IF_FPU},
+    {I_FSUB, 2, {FPU0,FPUREG,0}, "\1\xD8\11\xE0", IF_8086|IF_FPU},
+    {-1}
+};
+
+static struct itemplate instrux_FSUBP[] = {
+    {I_FSUBP, 1, {FPUREG,0,0}, "\1\xDE\10\xE8", IF_8086|IF_FPU},
+    {I_FSUBP, 2, {FPUREG,FPU0,0}, "\1\xDE\10\xE8", IF_8086|IF_FPU},
+    {-1}
+};
+
+static struct itemplate instrux_FSUBR[] = {
+    {I_FSUBR, 1, {MEMORY|BITS32,0,0}, "\300\1\xD8\205", IF_8086|IF_FPU},
+    {I_FSUBR, 1, {MEMORY|BITS64,0,0}, "\300\1\xDC\205", IF_8086|IF_FPU},
+    {I_FSUBR, 1, {FPUREG|TO,0,0}, "\1\xDC\10\xE0", IF_8086|IF_FPU},
+    {I_FSUBR, 2, {FPUREG,FPU0,0}, "\1\xDC\10\xE0", IF_8086|IF_FPU},
+    {I_FSUBR, 1, {FPUREG,0,0}, "\1\xD8\10\xE8", IF_8086|IF_FPU},
+    {I_FSUBR, 2, {FPU0,FPUREG,0}, "\1\xD8\11\xE8", IF_8086|IF_FPU},
+    {-1}
+};
+
+static struct itemplate instrux_FSUBRP[] = {
+    {I_FSUBRP, 1, {FPUREG,0,0}, "\1\xDE\10\xE0", IF_8086|IF_FPU},
+    {I_FSUBRP, 2, {FPUREG,FPU0,0}, "\1\xDE\10\xE0", IF_8086|IF_FPU},
+    {-1}
+};
+
+static struct itemplate instrux_FTST[] = {
+    {I_FTST, 0, {0,0,0}, "\2\xD9\xE4", IF_8086|IF_FPU},
+    {-1}
+};
+
+static struct itemplate instrux_FUCOM[] = {
+    {I_FUCOM, 1, {FPUREG,0,0}, "\1\xDD\10\xE0", IF_386|IF_FPU},
+    {I_FUCOM, 2, {FPU0,FPUREG,0}, "\1\xDD\11\xE0", IF_386|IF_FPU},
+    {-1}
+};
+
+static struct itemplate instrux_FUCOMI[] = {
+    {I_FUCOMI, 1, {FPUREG,0,0}, "\1\xDB\10\xE8", IF_P6|IF_FPU},
+    {I_FUCOMI, 2, {FPU0,FPUREG,0}, "\1\xDB\11\xE8", IF_P6|IF_FPU},
+    {-1}
+};
+
+static struct itemplate instrux_FUCOMIP[] = {
+    {I_FUCOMIP, 1, {FPUREG,0,0}, "\1\xDF\10\xE8", IF_P6|IF_FPU},
+    {I_FUCOMIP, 2, {FPU0,FPUREG,0}, "\1\xDF\11\xE8", IF_P6|IF_FPU},
+    {-1}
+};
+
+static struct itemplate instrux_FUCOMP[] = {
+    {I_FUCOMP, 1, {FPUREG,0,0}, "\1\xDD\10\xE8", IF_386|IF_FPU},
+    {I_FUCOMP, 2, {FPU0,FPUREG,0}, "\1\xDD\11\xE8", IF_386|IF_FPU},
+    {-1}
+};
+
+static struct itemplate instrux_FUCOMPP[] = {
+    {I_FUCOMPP, 0, {0,0,0}, "\2\xDA\xE9", IF_386|IF_FPU},
+    {-1}
+};
+
+static struct itemplate instrux_FXAM[] = {
+    {I_FXAM, 0, {0,0,0}, "\2\xD9\xE5", IF_8086|IF_FPU},
+    {-1}
+};
+
+static struct itemplate instrux_FXCH[] = {
+    {I_FXCH, 0, {0,0,0}, "\2\xD9\xC9", IF_8086|IF_FPU},
+    {I_FXCH, 1, {FPUREG,0,0}, "\1\xD9\10\xC8", IF_8086|IF_FPU},
+    {I_FXCH, 2, {FPUREG,FPU0,0}, "\1\xD9\10\xC8", IF_8086|IF_FPU},
+    {I_FXCH, 2, {FPU0,FPUREG,0}, "\1\xD9\11\xC8", IF_8086|IF_FPU},
+    {-1}
+};
+
+static struct itemplate instrux_FXTRACT[] = {
+    {I_FXTRACT, 0, {0,0,0}, "\2\xD9\xF4", IF_8086|IF_FPU},
+    {-1}
+};
+
+static struct itemplate instrux_FYL2X[] = {
+    {I_FYL2X, 0, {0,0,0}, "\2\xD9\xF1", IF_8086|IF_FPU},
+    {-1}
+};
+
+static struct itemplate instrux_FYL2XP1[] = {
+    {I_FYL2XP1, 0, {0,0,0}, "\2\xD9\xF9", IF_8086|IF_FPU},
+    {-1}
+};
+
+static struct itemplate instrux_HLT[] = {
+    {I_HLT, 0, {0,0,0}, "\1\xF4", IF_8086},
+    {-1}
+};
+
+static struct itemplate instrux_IBTS[] = {
+    {I_IBTS, 2, {MEMORY,REG16,0}, "\320\300\2\x0F\xA7\101", IF_386|IF_SW|IF_UNDOC},
+    {I_IBTS, 2, {REG16,REG16,0}, "\320\300\2\x0F\xA7\101", IF_386|IF_UNDOC},
+    {I_IBTS, 2, {MEMORY,REG32,0}, "\321\300\2\x0F\xA7\101", IF_386|IF_SD|IF_UNDOC},
+    {I_IBTS, 2, {REG32,REG32,0}, "\321\300\2\x0F\xA7\101", IF_386|IF_UNDOC},
+    {-1}
+};
+
+static struct itemplate instrux_ICEBP[] = {
+    {I_ICEBP, 0, {0,0,0}, "\1\xF1", IF_P6},
+    {-1}
+};
+
+static struct itemplate instrux_IDIV[] = {
+    {I_IDIV, 1, {REGMEM|BITS8,0,0}, "\300\1\xF6\207", IF_8086},
+    {I_IDIV, 1, {REGMEM|BITS16,0,0}, "\320\300\1\xF7\207", IF_8086},
+    {I_IDIV, 1, {REGMEM|BITS32,0,0}, "\321\300\1\xF7\207", IF_386},
+    {-1}
+};
+
+static struct itemplate instrux_IMUL[] = {
+    {I_IMUL, 1, {REGMEM|BITS8,0,0}, "\300\1\xF6\205", IF_8086},
+    {I_IMUL, 1, {REGMEM|BITS16,0,0}, "\320\300\1\xF7\205", IF_8086},
+    {I_IMUL, 1, {REGMEM|BITS32,0,0}, "\321\300\1\xF7\205", IF_386},
+    {I_IMUL, 2, {REG16,MEMORY,0}, "\320\301\2\x0F\xAF\110", IF_386|IF_SM},
+    {I_IMUL, 2, {REG16,REG16,0}, "\320\301\2\x0F\xAF\110", IF_386},
+    {I_IMUL, 2, {REG32,MEMORY,0}, "\321\301\2\x0F\xAF\110", IF_386|IF_SM},
+    {I_IMUL, 2, {REG32,REG32,0}, "\321\301\2\x0F\xAF\110", IF_386},
+    {I_IMUL, 3, {REG16,MEMORY,IMMEDIATE|BITS8}, "\320\301\1\x6B\110\16", IF_286|IF_SM},
+    {I_IMUL, 3, {REG16,REG16,IMMEDIATE|BITS8}, "\320\301\1\x6B\110\16", IF_286},
+    {I_IMUL, 3, {REG16,MEMORY,IMMEDIATE}, "\320\301\1\x69\110\32", IF_286|IF_SM},
+    {I_IMUL, 3, {REG16,REG16,IMMEDIATE}, "\320\301\1\x69\110\32", IF_286|IF_SM},
+    {I_IMUL, 3, {REG32,MEMORY,IMMEDIATE|BITS8}, "\321\301\1\x6B\110\16", IF_386|IF_SM},
+    {I_IMUL, 3, {REG32,REG32,IMMEDIATE|BITS8}, "\321\301\1\x6B\110\16", IF_386},
+    {I_IMUL, 3, {REG32,MEMORY,IMMEDIATE}, "\321\301\1\x69\110\42", IF_386|IF_SM},
+    {I_IMUL, 3, {REG32,REG32,IMMEDIATE}, "\321\301\1\x69\110\42", IF_386|IF_SM},
+    {I_IMUL, 2, {REG16,IMMEDIATE|BITS8,0}, "\320\1\x6B\100\15", IF_286},
+    {I_IMUL, 2, {REG16,IMMEDIATE,0}, "\320\1\x69\100\31", IF_286|IF_SM},
+    {I_IMUL, 2, {REG32,IMMEDIATE|BITS8,0}, "\321\1\x6B\100\15", IF_386},
+    {I_IMUL, 2, {REG32,IMMEDIATE,0}, "\321\1\x69\100\41", IF_386|IF_SM},
+    {-1}
+};
+
+static struct itemplate instrux_IN[] = {
+    {I_IN, 2, {REG_AL,IMMEDIATE,0}, "\1\xE4\25", IF_8086},
+    {I_IN, 2, {REG_AX,IMMEDIATE,0}, "\320\1\xE5\25", IF_8086},
+    {I_IN, 2, {REG_EAX,IMMEDIATE,0}, "\321\1\xE5\25", IF_386},
+    {I_IN, 2, {REG_AL,REG_DX,0}, "\1\xEC", IF_8086},
+    {I_IN, 2, {REG_AX,REG_DX,0}, "\320\1\xED", IF_8086},
+    {I_IN, 2, {REG_EAX,REG_DX,0}, "\321\1\xED", IF_386},
+    {-1}
+};
+
+static struct itemplate instrux_INC[] = {
+    {I_INC, 1, {REG16,0,0}, "\320\10\x40", IF_8086},
+    {I_INC, 1, {REG32,0,0}, "\321\10\x40", IF_386},
+    {I_INC, 1, {REGMEM|BITS8,0,0}, "\300\1\xFE\200", IF_8086},
+    {I_INC, 1, {REGMEM|BITS16,0,0}, "\320\300\1\xFF\200", IF_8086},
+    {I_INC, 1, {REGMEM|BITS32,0,0}, "\321\300\1\xFF\200", IF_386},
+    {-1}
+};
+
+static struct itemplate instrux_INCBIN[] = {
+    {-1}
+};
+
+static struct itemplate instrux_INSB[] = {
+    {I_INSB, 0, {0,0,0}, "\1\x6C", IF_186},
+    {-1}
+};
+
+static struct itemplate instrux_INSD[] = {
+    {I_INSD, 0, {0,0,0}, "\321\1\x6D", IF_386},
+    {-1}
+};
+
+static struct itemplate instrux_INSW[] = {
+    {I_INSW, 0, {0,0,0}, "\320\1\x6D", IF_186},
+    {-1}
+};
+
+static struct itemplate instrux_INT[] = {
+    {I_INT, 1, {IMMEDIATE,0,0}, "\1\xCD\24", IF_8086},
+    {-1}
+};
+
+static struct itemplate instrux_INT01[] = {
+    {I_INT01, 0, {0,0,0}, "\1\xF1", IF_P6},
+    {-1}
+};
+
+static struct itemplate instrux_INT1[] = {
+    {I_INT1, 0, {0,0,0}, "\1\xF1", IF_P6},
+    {-1}
+};
+
+static struct itemplate instrux_INT3[] = {
+    {I_INT3, 0, {0,0,0}, "\1\xCC", IF_8086},
+    {-1}
+};
+
+static struct itemplate instrux_INTO[] = {
+    {I_INTO, 0, {0,0,0}, "\1\xCE", IF_8086},
+    {-1}
+};
+
+static struct itemplate instrux_INVD[] = {
+    {I_INVD, 0, {0,0,0}, "\2\x0F\x08", IF_486},
+    {-1}
+};
+
+static struct itemplate instrux_INVLPG[] = {
+    {I_INVLPG, 1, {MEMORY,0,0}, "\300\2\x0F\x01\207", IF_486},
+    {-1}
+};
+
+static struct itemplate instrux_IRET[] = {
+    {I_IRET, 0, {0,0,0}, "\322\1\xCF", IF_8086},
+    {-1}
+};
+
+static struct itemplate instrux_IRETD[] = {
+    {I_IRETD, 0, {0,0,0}, "\321\1\xCF", IF_386},
+    {-1}
+};
+
+static struct itemplate instrux_IRETW[] = {
+    {I_IRETW, 0, {0,0,0}, "\320\1\xCF", IF_8086},
+    {-1}
+};
+
+static struct itemplate instrux_JCXZ[] = {
+    {I_JCXZ, 1, {IMMEDIATE,0,0}, "\320\1\xE3\50", IF_8086},
+    {-1}
+};
+
+static struct itemplate instrux_JECXZ[] = {
+    {I_JECXZ, 1, {IMMEDIATE,0,0}, "\321\1\xE3\50", IF_386},
+    {-1}
+};
+
+static struct itemplate instrux_JMP[] = {
+    {I_JMP, 1, {IMMEDIATE|SHORT,0,0}, "\1\xEB\50", IF_8086},
+    {I_JMP, 1, {IMMEDIATE,0,0}, "\322\1\xE9\64", IF_8086},
+    {I_JMP, 1, {IMMEDIATE|FAR,0,0}, "\322\1\xEA\34\37", IF_8086},
+    {I_JMP, 2, {IMMEDIATE|COLON,IMMEDIATE,0}, "\322\1\xEA\35\30", IF_8086},
+    {I_JMP, 2, {IMMEDIATE|BITS16|COLON,IMMEDIATE,0}, "\320\1\xEA\31\30", IF_8086},
+    {I_JMP, 2, {IMMEDIATE|COLON,IMMEDIATE|BITS16,0}, "\320\1\xEA\31\30", IF_8086},
+    {I_JMP, 2, {IMMEDIATE|BITS32|COLON,IMMEDIATE,0}, "\321\1\xEA\41\30", IF_386},
+    {I_JMP, 2, {IMMEDIATE|COLON,IMMEDIATE|BITS32,0}, "\321\1\xEA\41\30", IF_386},
+    {I_JMP, 1, {MEMORY|FAR,0,0}, "\322\300\1\xFF\205", IF_8086},
+    {I_JMP, 1, {MEMORY|BITS16|FAR,0,0}, "\320\300\1\xFF\205", IF_8086},
+    {I_JMP, 1, {MEMORY|BITS32|FAR,0,0}, "\321\300\1\xFF\205", IF_386},
+    {I_JMP, 1, {MEMORY|NEAR,0,0}, "\322\300\1\xFF\204", IF_8086},
+    {I_JMP, 1, {MEMORY|BITS16|NEAR,0,0}, "\320\300\1\xFF\204", IF_8086},
+    {I_JMP, 1, {MEMORY|BITS32|NEAR,0,0}, "\321\300\1\xFF\204", IF_386},
+    {I_JMP, 1, {REG16,0,0}, "\320\300\1\xFF\204", IF_8086},
+    {I_JMP, 1, {REG32,0,0}, "\321\300\1\xFF\204", IF_386},
+    {I_JMP, 1, {MEMORY,0,0}, "\322\300\1\xFF\204", IF_8086},
+    {I_JMP, 1, {MEMORY|BITS16,0,0}, "\320\300\1\xFF\204", IF_8086},
+    {I_JMP, 1, {MEMORY|BITS32,0,0}, "\321\300\1\xFF\204", IF_386},
+    {-1}
+};
+
+static struct itemplate instrux_LAHF[] = {
+    {I_LAHF, 0, {0,0,0}, "\1\x9F", IF_8086},
+    {-1}
+};
+
+static struct itemplate instrux_LAR[] = {
+    {I_LAR, 2, {REG16,MEMORY,0}, "\320\301\2\x0F\x02\110", IF_286|IF_PRIV|IF_SM},
+    {I_LAR, 2, {REG16,REG16,0}, "\320\301\2\x0F\x02\110", IF_286|IF_PRIV},
+    {I_LAR, 2, {REG32,MEMORY,0}, "\321\301\2\x0F\x02\110", IF_286|IF_PRIV|IF_SM},
+    {I_LAR, 2, {REG32,REG32,0}, "\321\301\2\x0F\x02\110", IF_286|IF_PRIV},
+    {-1}
+};
+
+static struct itemplate instrux_LDS[] = {
+    {I_LDS, 2, {REG16,MEMORY,0}, "\320\301\1\xC5\110", IF_8086},
+    {I_LDS, 2, {REG32,MEMORY,0}, "\321\301\1\xC5\110", IF_8086},
+    {-1}
+};
+
+static struct itemplate instrux_LEA[] = {
+    {I_LEA, 2, {REG16,MEMORY,0}, "\320\301\1\x8D\110", IF_8086},
+    {I_LEA, 2, {REG32,MEMORY,0}, "\321\301\1\x8D\110", IF_8086},
+    {-1}
+};
+
+static struct itemplate instrux_LEAVE[] = {
+    {I_LEAVE, 0, {0,0,0}, "\1\xC9", IF_186},
+    {-1}
+};
+
+static struct itemplate instrux_LES[] = {
+    {I_LES, 2, {REG16,MEMORY,0}, "\320\301\1\xC4\110", IF_8086},
+    {I_LES, 2, {REG32,MEMORY,0}, "\321\301\1\xC4\110", IF_8086},
+    {-1}
+};
+
+static struct itemplate instrux_LFS[] = {
+    {I_LFS, 2, {REG16,MEMORY,0}, "\320\301\2\x0F\xB4\110", IF_386},
+    {I_LFS, 2, {REG32,MEMORY,0}, "\321\301\2\x0F\xB4\110", IF_386},
+    {-1}
+};
+
+static struct itemplate instrux_LGDT[] = {
+    {I_LGDT, 1, {MEMORY,0,0}, "\300\2\x0F\x01\202", IF_286|IF_PRIV},
+    {-1}
+};
+
+static struct itemplate instrux_LGS[] = {
+    {I_LGS, 2, {REG16,MEMORY,0}, "\320\301\2\x0F\xB5\110", IF_386},
+    {I_LGS, 2, {REG32,MEMORY,0}, "\321\301\2\x0F\xB5\110", IF_386},
+    {-1}
+};
+
+static struct itemplate instrux_LIDT[] = {
+    {I_LIDT, 1, {MEMORY,0,0}, "\300\2\x0F\x01\203", IF_286|IF_PRIV},
+    {-1}
+};
+
+static struct itemplate instrux_LLDT[] = {
+    {I_LLDT, 1, {MEMORY,0,0}, "\300\1\x0F\17\202", IF_286|IF_PRIV},
+    {I_LLDT, 1, {MEMORY|BITS16,0,0}, "\300\1\x0F\17\202", IF_286|IF_PRIV},
+    {I_LLDT, 1, {REG16,0,0}, "\300\1\x0F\17\202", IF_286|IF_PRIV},
+    {-1}
+};
+
+static struct itemplate instrux_LMSW[] = {
+    {I_LMSW, 1, {MEMORY,0,0}, "\300\2\x0F\x01\206", IF_286|IF_PRIV},
+    {I_LMSW, 1, {MEMORY|BITS16,0,0}, "\300\2\x0F\x01\206", IF_286|IF_PRIV},
+    {I_LMSW, 1, {REG16,0,0}, "\300\2\x0F\x01\206", IF_286|IF_PRIV},
+    {-1}
+};
+
+static struct itemplate instrux_LOADALL[] = {
+    {I_LOADALL, 0, {0,0,0}, "\2\x0F\x07", IF_386|IF_UNDOC},
+    {-1}
+};
+
+static struct itemplate instrux_LOADALL286[] = {
+    {I_LOADALL286, 0, {0,0,0}, "\2\x0F\x05", IF_286|IF_UNDOC},
+    {-1}
+};
+
+static struct itemplate instrux_LODSB[] = {
+    {I_LODSB, 0, {0,0,0}, "\1\xAC", IF_8086},
+    {-1}
+};
+
+static struct itemplate instrux_LODSD[] = {
+    {I_LODSD, 0, {0,0,0}, "\321\1\xAD", IF_386},
+    {-1}
+};
+
+static struct itemplate instrux_LODSW[] = {
+    {I_LODSW, 0, {0,0,0}, "\320\1\xAD", IF_8086},
+    {-1}
+};
+
+static struct itemplate instrux_LOOP[] = {
+    {I_LOOP, 1, {IMMEDIATE,0,0}, "\312\1\xE2\50", IF_8086},
+    {I_LOOP, 2, {IMMEDIATE,REG_CX,0}, "\310\1\xE2\50", IF_8086},
+    {I_LOOP, 2, {IMMEDIATE,REG_ECX,0}, "\311\1\xE2\50", IF_386},
+    {-1}
+};
+
+static struct itemplate instrux_LOOPE[] = {
+    {I_LOOPE, 1, {IMMEDIATE,0,0}, "\312\1\xE1\50", IF_8086},
+    {I_LOOPE, 2, {IMMEDIATE,REG_CX,0}, "\310\1\xE1\50", IF_8086},
+    {I_LOOPE, 2, {IMMEDIATE,REG_ECX,0}, "\311\1\xE1\50", IF_386},
+    {-1}
+};
+
+static struct itemplate instrux_LOOPNE[] = {
+    {I_LOOPNE, 1, {IMMEDIATE,0,0}, "\312\1\xE0\50", IF_8086},
+    {I_LOOPNE, 2, {IMMEDIATE,REG_CX,0}, "\310\1\xE0\50", IF_8086},
+    {I_LOOPNE, 2, {IMMEDIATE,REG_ECX,0}, "\311\1\xE0\50", IF_386},
+    {-1}
+};
+
+static struct itemplate instrux_LOOPNZ[] = {
+    {I_LOOPNZ, 1, {IMMEDIATE,0,0}, "\312\1\xE0\50", IF_8086},
+    {I_LOOPNZ, 2, {IMMEDIATE,REG_CX,0}, "\310\1\xE0\50", IF_8086},
+    {I_LOOPNZ, 2, {IMMEDIATE,REG_ECX,0}, "\311\1\xE0\50", IF_386},
+    {-1}
+};
+
+static struct itemplate instrux_LOOPZ[] = {
+    {I_LOOPZ, 1, {IMMEDIATE,0,0}, "\312\1\xE1\50", IF_8086},
+    {I_LOOPZ, 2, {IMMEDIATE,REG_CX,0}, "\310\1\xE1\50", IF_8086},
+    {I_LOOPZ, 2, {IMMEDIATE,REG_ECX,0}, "\311\1\xE1\50", IF_386},
+    {-1}
+};
+
+static struct itemplate instrux_LSL[] = {
+    {I_LSL, 2, {REG16,MEMORY,0}, "\320\301\2\x0F\x03\110", IF_286|IF_PRIV|IF_SM},
+    {I_LSL, 2, {REG16,REG16,0}, "\320\301\2\x0F\x03\110", IF_286|IF_PRIV},
+    {I_LSL, 2, {REG32,MEMORY,0}, "\321\301\2\x0F\x03\110", IF_286|IF_PRIV|IF_SM},
+    {I_LSL, 2, {REG32,REG32,0}, "\321\301\2\x0F\x03\110", IF_286|IF_PRIV},
+    {-1}
+};
+
+static struct itemplate instrux_LSS[] = {
+    {I_LSS, 2, {REG16,MEMORY,0}, "\320\301\2\x0F\xB2\110", IF_386},
+    {I_LSS, 2, {REG32,MEMORY,0}, "\321\301\2\x0F\xB2\110", IF_386},
+    {-1}
+};
+
+static struct itemplate instrux_LTR[] = {
+    {I_LTR, 1, {MEMORY,0,0}, "\300\1\x0F\17\203", IF_286|IF_PRIV},
+    {I_LTR, 1, {MEMORY|BITS16,0,0}, "\300\1\x0F\17\203", IF_286|IF_PRIV},
+    {I_LTR, 1, {REG16,0,0}, "\300\1\x0F\17\203", IF_286|IF_PRIV},
+    {-1}
+};
+
+static struct itemplate instrux_MOV[] = {
+    {I_MOV, 2, {MEMORY,REG_CS,0}, "\320\300\1\x8C\201", IF_8086|IF_SM},
+    {I_MOV, 2, {MEMORY,REG_DESS,0}, "\320\300\1\x8C\101", IF_8086|IF_SM},
+    {I_MOV, 2, {MEMORY,REG_FSGS,0}, "\320\300\1\x8C\101", IF_386|IF_SM},
+    {I_MOV, 2, {REG16,REG_CS,0}, "\320\300\1\x8C\201", IF_8086},
+    {I_MOV, 2, {REG16,REG_DESS,0}, "\320\300\1\x8C\101", IF_8086},
+    {I_MOV, 2, {REG16,REG_FSGS,0}, "\320\300\1\x8C\101", IF_386},
+    {I_MOV, 2, {REGMEM|BITS32,REG_CS,0}, "\321\300\1\x8C\201", IF_8086},
+    {I_MOV, 2, {REGMEM|BITS32,REG_DESS,0}, "\321\300\1\x8C\101", IF_8086},
+    {I_MOV, 2, {REGMEM|BITS32,REG_FSGS,0}, "\321\300\1\x8C\101", IF_386},
+    {I_MOV, 2, {REG_DESS,MEMORY,0}, "\320\301\1\x8E\110", IF_8086|IF_SM},
+    {I_MOV, 2, {REG_FSGS,MEMORY,0}, "\320\301\1\x8E\110", IF_386|IF_SM},
+    {I_MOV, 2, {REG_DESS,REG16,0}, "\320\301\1\x8E\110", IF_8086},
+    {I_MOV, 2, {REG_FSGS,REG16,0}, "\320\301\1\x8E\110", IF_386},
+    {I_MOV, 2, {REG_DESS,REGMEM|BITS32,0}, "\321\301\1\x8E\110", IF_8086},
+    {I_MOV, 2, {REG_FSGS,REGMEM|BITS32,0}, "\321\301\1\x8E\110", IF_386},
+    {I_MOV, 2, {REG_AL,MEM_OFFS,0}, "\301\1\xA0\35", IF_8086|IF_SM},
+    {I_MOV, 2, {REG_AX,MEM_OFFS,0}, "\301\320\1\xA1\35", IF_8086|IF_SM},
+    {I_MOV, 2, {REG_EAX,MEM_OFFS,0}, "\301\321\1\xA1\35", IF_386|IF_SM},
+    {I_MOV, 2, {MEM_OFFS,REG_AL,0}, "\300\1\xA2\34", IF_8086|IF_SM},
+    {I_MOV, 2, {MEM_OFFS,REG_AX,0}, "\300\320\1\xA3\34", IF_8086|IF_SM},
+    {I_MOV, 2, {MEM_OFFS,REG_EAX,0}, "\300\321\1\xA3\34", IF_386|IF_SM},
+    {I_MOV, 2, {REG32,REG_CR4,0}, "\2\x0F\x20\204", IF_PENT},
+    {I_MOV, 2, {REG32,REG_CREG,0}, "\2\x0F\x20\101", IF_386},
+    {I_MOV, 2, {REG32,REG_DREG,0}, "\2\x0F\x21\101", IF_386},
+    {I_MOV, 2, {REG32,REG_TREG,0}, "\2\x0F\x24\101", IF_386},
+    {I_MOV, 2, {REG_CR4,REG32,0}, "\2\x0F\x22\214", IF_PENT},
+    {I_MOV, 2, {REG_CREG,REG32,0}, "\2\x0F\x22\110", IF_386},
+    {I_MOV, 2, {REG_DREG,REG32,0}, "\2\x0F\x23\110", IF_386},
+    {I_MOV, 2, {REG_TREG,REG32,0}, "\2\x0F\x26\110", IF_386},
+    {I_MOV, 2, {MEMORY,REG8,0}, "\300\1\x88\101", IF_8086|IF_SM},
+    {I_MOV, 2, {REG8,REG8,0}, "\300\1\x88\101", IF_8086},
+    {I_MOV, 2, {MEMORY,REG16,0}, "\320\300\1\x89\101", IF_8086|IF_SM},
+    {I_MOV, 2, {REG16,REG16,0}, "\320\300\1\x89\101", IF_8086},
+    {I_MOV, 2, {MEMORY,REG32,0}, "\321\300\1\x89\101", IF_386|IF_SM},
+    {I_MOV, 2, {REG32,REG32,0}, "\321\300\1\x89\101", IF_386},
+    {I_MOV, 2, {REG8,MEMORY,0}, "\301\1\x8A\110", IF_8086|IF_SM},
+    {I_MOV, 2, {REG8,REG8,0}, "\301\1\x8A\110", IF_8086},
+    {I_MOV, 2, {REG16,MEMORY,0}, "\320\301\1\x8B\110", IF_8086|IF_SM},
+    {I_MOV, 2, {REG16,REG16,0}, "\320\301\1\x8B\110", IF_8086},
+    {I_MOV, 2, {REG32,MEMORY,0}, "\321\301\1\x8B\110", IF_386|IF_SM},
+    {I_MOV, 2, {REG32,REG32,0}, "\321\301\1\x8B\110", IF_386},
+    {I_MOV, 2, {REG8,IMMEDIATE,0}, "\10\xB0\21", IF_8086|IF_SM},
+    {I_MOV, 2, {REG16,IMMEDIATE,0}, "\320\10\xB8\31", IF_8086|IF_SM},
+    {I_MOV, 2, {REG32,IMMEDIATE,0}, "\321\10\xB8\41", IF_386|IF_SM},
+    {I_MOV, 2, {REGMEM|BITS8,IMMEDIATE,0}, "\300\1\xC6\200\21", IF_8086|IF_SM},
+    {I_MOV, 2, {REGMEM|BITS16,IMMEDIATE,0}, "\320\300\1\xC7\200\31", IF_8086|IF_SM},
+    {I_MOV, 2, {REGMEM|BITS32,IMMEDIATE,0}, "\321\300\1\xC7\200\41", IF_386|IF_SM},
+    {I_MOV, 2, {MEMORY,IMMEDIATE|BITS8,0}, "\300\1\xC6\200\21", IF_8086|IF_SM},
+    {I_MOV, 2, {MEMORY,IMMEDIATE|BITS16,0}, "\320\300\1\xC7\200\31", IF_8086|IF_SM},
+    {I_MOV, 2, {MEMORY,IMMEDIATE|BITS32,0}, "\321\300\1\xC7\200\41", IF_386|IF_SM},
+    {-1}
+};
+
+static struct itemplate instrux_MOVD[] = {
+    {I_MOVD, 2, {MMXREG,MEMORY,0}, "\301\2\x0F\x6E\110", IF_PENT|IF_MMX|IF_SD},
+    {I_MOVD, 2, {MMXREG,REG32,0}, "\2\x0F\x6E\110", IF_PENT|IF_MMX},
+    {I_MOVD, 2, {MEMORY,MMXREG,0}, "\300\2\x0F\x7E\101", IF_PENT|IF_MMX|IF_SD},
+    {I_MOVD, 2, {REG32,MMXREG,0}, "\2\x0F\x7E\101", IF_PENT|IF_MMX},
+    {-1}
+};
+
+static struct itemplate instrux_MOVQ[] = {
+    {I_MOVQ, 2, {MMXREG,MEMORY,0}, "\301\2\x0F\x6F\110", IF_PENT|IF_MMX|IF_SM},
+    {I_MOVQ, 2, {MMXREG,MMXREG,0}, "\2\x0F\x6F\110", IF_PENT|IF_MMX},
+    {I_MOVQ, 2, {MEMORY,MMXREG,0}, "\300\2\x0F\x7F\101", IF_PENT|IF_MMX|IF_SM},
+    {I_MOVQ, 2, {MMXREG,MMXREG,0}, "\2\x0F\x7F\101", IF_PENT|IF_MMX},
+    {-1}
+};
+
+static struct itemplate instrux_MOVSB[] = {
+    {I_MOVSB, 0, {0,0,0}, "\1\xA4", IF_8086},
+    {-1}
+};
+
+static struct itemplate instrux_MOVSD[] = {
+    {I_MOVSD, 0, {0,0,0}, "\321\1\xA5", IF_386},
+    {-1}
+};
+
+static struct itemplate instrux_MOVSW[] = {
+    {I_MOVSW, 0, {0,0,0}, "\320\1\xA5", IF_8086},
+    {-1}
+};
+
+static struct itemplate instrux_MOVSX[] = {
+    {I_MOVSX, 2, {REG16,MEMORY,0}, "\320\301\2\x0F\xBE\110", IF_386|IF_SB},
+    {I_MOVSX, 2, {REG16,REG8,0}, "\320\301\2\x0F\xBE\110", IF_386},
+    {I_MOVSX, 2, {REG32,REGMEM|BITS8,0}, "\321\301\2\x0F\xBE\110", IF_386},
+    {I_MOVSX, 2, {REG32,REGMEM|BITS16,0}, "\321\301\2\x0F\xBF\110", IF_386},
+    {-1}
+};
+
+static struct itemplate instrux_MOVZX[] = {
+    {I_MOVZX, 2, {REG16,MEMORY,0}, "\320\301\2\x0F\xB6\110", IF_386|IF_SB},
+    {I_MOVZX, 2, {REG16,REG8,0}, "\320\301\2\x0F\xB6\110", IF_386},
+    {I_MOVZX, 2, {REG32,REGMEM|BITS8,0}, "\321\301\2\x0F\xB6\110", IF_386},
+    {I_MOVZX, 2, {REG32,REGMEM|BITS16,0}, "\321\301\2\x0F\xB7\110", IF_386},
+    {-1}
+};
+
+static struct itemplate instrux_MUL[] = {
+    {I_MUL, 1, {REGMEM|BITS8,0,0}, "\300\1\xF6\204", IF_8086},
+    {I_MUL, 1, {REGMEM|BITS16,0,0}, "\320\300\1\xF7\204", IF_8086},
+    {I_MUL, 1, {REGMEM|BITS32,0,0}, "\321\300\1\xF7\204", IF_386},
+    {-1}
+};
+
+static struct itemplate instrux_NEG[] = {
+    {I_NEG, 1, {REGMEM|BITS8,0,0}, "\300\1\xF6\203", IF_8086},
+    {I_NEG, 1, {REGMEM|BITS16,0,0}, "\320\300\1\xF7\203", IF_8086},
+    {I_NEG, 1, {REGMEM|BITS32,0,0}, "\321\300\1\xF7\203", IF_386},
+    {-1}
+};
+
+static struct itemplate instrux_NOP[] = {
+    {I_NOP, 0, {0,0,0}, "\1\x90", IF_8086},
+    {-1}
+};
+
+static struct itemplate instrux_NOT[] = {
+    {I_NOT, 1, {REGMEM|BITS8,0,0}, "\300\1\xF6\202", IF_8086},
+    {I_NOT, 1, {REGMEM|BITS16,0,0}, "\320\300\1\xF7\202", IF_8086},
+    {I_NOT, 1, {REGMEM|BITS32,0,0}, "\321\300\1\xF7\202", IF_386},
+    {-1}
+};
+
+static struct itemplate instrux_OR[] = {
+    {I_OR, 2, {MEMORY,REG8,0}, "\300\1\x08\101", IF_8086|IF_SM},
+    {I_OR, 2, {REG8,REG8,0}, "\300\1\x08\101", IF_8086},
+    {I_OR, 2, {MEMORY,REG16,0}, "\320\300\1\x09\101", IF_8086|IF_SM},
+    {I_OR, 2, {REG16,REG16,0}, "\320\300\1\x09\101", IF_8086},
+    {I_OR, 2, {MEMORY,REG32,0}, "\321\300\1\x09\101", IF_386|IF_SM},
+    {I_OR, 2, {REG32,REG32,0}, "\321\300\1\x09\101", IF_386},
+    {I_OR, 2, {REG8,MEMORY,0}, "\301\1\x0A\110", IF_8086|IF_SM},
+    {I_OR, 2, {REG8,REG8,0}, "\301\1\x0A\110", IF_8086},
+    {I_OR, 2, {REG16,MEMORY,0}, "\320\301\1\x0B\110", IF_8086|IF_SM},
+    {I_OR, 2, {REG16,REG16,0}, "\320\301\1\x0B\110", IF_8086},
+    {I_OR, 2, {REG32,MEMORY,0}, "\321\301\1\x0B\110", IF_386|IF_SM},
+    {I_OR, 2, {REG32,REG32,0}, "\321\301\1\x0B\110", IF_386},
+    {I_OR, 2, {REGMEM|BITS16,IMMEDIATE|BITS8,0}, "\320\300\1\x83\201\15", IF_8086},
+    {I_OR, 2, {REGMEM|BITS32,IMMEDIATE|BITS8,0}, "\321\300\1\x83\201\15", IF_386},
+    {I_OR, 2, {REG_AL,IMMEDIATE,0}, "\1\x0C\21", IF_8086|IF_SM},
+    {I_OR, 2, {REG_AX,IMMEDIATE,0}, "\320\1\x0D\31", IF_8086|IF_SM},
+    {I_OR, 2, {REG_EAX,IMMEDIATE,0}, "\321\1\x0D\41", IF_386|IF_SM},
+    {I_OR, 2, {REGMEM|BITS8,IMMEDIATE,0}, "\300\1\x80\201\21", IF_8086|IF_SM},
+    {I_OR, 2, {REGMEM|BITS16,IMMEDIATE,0}, "\320\300\1\x81\201\31", IF_8086|IF_SM},
+    {I_OR, 2, {REGMEM|BITS32,IMMEDIATE,0}, "\321\300\1\x81\201\41", IF_386|IF_SM},
+    {I_OR, 2, {MEMORY,IMMEDIATE|BITS8,0}, "\300\1\x80\201\21", IF_8086|IF_SM},
+    {I_OR, 2, {MEMORY,IMMEDIATE|BITS16,0}, "\320\300\1\x81\201\31", IF_8086|IF_SM},
+    {I_OR, 2, {MEMORY,IMMEDIATE|BITS32,0}, "\321\300\1\x81\201\41", IF_386|IF_SM},
+    {-1}
+};
+
+static struct itemplate instrux_OUT[] = {
+    {I_OUT, 2, {IMMEDIATE,REG_AL,0}, "\1\xE6\24", IF_8086},
+    {I_OUT, 2, {IMMEDIATE,REG_AX,0}, "\320\1\xE7\24", IF_8086},
+    {I_OUT, 2, {IMMEDIATE,REG_EAX,0}, "\321\1\xE7\24", IF_386},
+    {I_OUT, 2, {REG_DX,REG_AL,0}, "\1\xEE", IF_8086},
+    {I_OUT, 2, {REG_DX,REG_AX,0}, "\320\1\xEF", IF_8086},
+    {I_OUT, 2, {REG_DX,REG_EAX,0}, "\321\1\xEF", IF_386},
+    {-1}
+};
+
+static struct itemplate instrux_OUTSB[] = {
+    {I_OUTSB, 0, {0,0,0}, "\1\x6E", IF_186},
+    {-1}
+};
+
+static struct itemplate instrux_OUTSD[] = {
+    {I_OUTSD, 0, {0,0,0}, "\321\1\x6F", IF_386},
+    {-1}
+};
+
+static struct itemplate instrux_OUTSW[] = {
+    {I_OUTSW, 0, {0,0,0}, "\320\1\x6F", IF_186},
+    {-1}
+};
+
+static struct itemplate instrux_PACKSSDW[] = {
+    {I_PACKSSDW, 2, {MMXREG,MEMORY,0}, "\301\2\x0F\x6B\110", IF_PENT|IF_MMX|IF_SM},
+    {I_PACKSSDW, 2, {MMXREG,MMXREG,0}, "\2\x0F\x6B\110", IF_PENT|IF_MMX},
+    {-1}
+};
+
+static struct itemplate instrux_PACKSSWB[] = {
+    {I_PACKSSWB, 2, {MMXREG,MEMORY,0}, "\301\2\x0F\x63\110", IF_PENT|IF_MMX|IF_SM},
+    {I_PACKSSWB, 2, {MMXREG,MMXREG,0}, "\2\x0F\x63\110", IF_PENT|IF_MMX},
+    {-1}
+};
+
+static struct itemplate instrux_PACKUSWB[] = {
+    {I_PACKUSWB, 2, {MMXREG,MEMORY,0}, "\301\2\x0F\x67\110", IF_PENT|IF_MMX|IF_SM},
+    {I_PACKUSWB, 2, {MMXREG,MMXREG,0}, "\2\x0F\x67\110", IF_PENT|IF_MMX},
+    {-1}
+};
+
+static struct itemplate instrux_PADDB[] = {
+    {I_PADDB, 2, {MMXREG,MEMORY,0}, "\301\2\x0F\xFC\110", IF_PENT|IF_MMX|IF_SM},
+    {I_PADDB, 2, {MMXREG,MMXREG,0}, "\2\x0F\xFC\110", IF_PENT|IF_MMX},
+    {-1}
+};
+
+static struct itemplate instrux_PADDD[] = {
+    {I_PADDD, 2, {MMXREG,MEMORY,0}, "\301\2\x0F\xFE\110", IF_PENT|IF_MMX|IF_SM},
+    {I_PADDD, 2, {MMXREG,MMXREG,0}, "\2\x0F\xFE\110", IF_PENT|IF_MMX},
+    {-1}
+};
+
+static struct itemplate instrux_PADDSB[] = {
+    {I_PADDSB, 2, {MMXREG,MEMORY,0}, "\301\2\x0F\xEC\110", IF_PENT|IF_MMX|IF_SM},
+    {I_PADDSB, 2, {MMXREG,MMXREG,0}, "\2\x0F\xEC\110", IF_PENT|IF_MMX},
+    {-1}
+};
+
+static struct itemplate instrux_PADDSIW[] = {
+    {I_PADDSIW, 2, {MMXREG,MEMORY,0}, "\301\2\x0F\x51\110", IF_PENT|IF_MMX|IF_SM|IF_CYRIX},
+    {I_PADDSIW, 2, {MMXREG,MMXREG,0}, "\2\x0F\x51\110", IF_PENT|IF_MMX|IF_CYRIX},
+    {-1}
+};
+
+static struct itemplate instrux_PADDSW[] = {
+    {I_PADDSW, 2, {MMXREG,MEMORY,0}, "\301\2\x0F\xED\110", IF_PENT|IF_MMX|IF_SM},
+    {I_PADDSW, 2, {MMXREG,MMXREG,0}, "\2\x0F\xED\110", IF_PENT|IF_MMX},
+    {-1}
+};
+
+static struct itemplate instrux_PADDUSB[] = {
+    {I_PADDUSB, 2, {MMXREG,MEMORY,0}, "\301\2\x0F\xDC\110", IF_PENT|IF_MMX|IF_SM},
+    {I_PADDUSB, 2, {MMXREG,MMXREG,0}, "\2\x0F\xDC\110", IF_PENT|IF_MMX},
+    {-1}
+};
+
+static struct itemplate instrux_PADDUSW[] = {
+    {I_PADDUSW, 2, {MMXREG,MEMORY,0}, "\301\2\x0F\xDD\110", IF_PENT|IF_MMX|IF_SM},
+    {I_PADDUSW, 2, {MMXREG,MMXREG,0}, "\2\x0F\xDD\110", IF_PENT|IF_MMX},
+    {-1}
+};
+
+static struct itemplate instrux_PADDW[] = {
+    {I_PADDW, 2, {MMXREG,MEMORY,0}, "\301\2\x0F\xFD\110", IF_PENT|IF_MMX|IF_SM},
+    {I_PADDW, 2, {MMXREG,MMXREG,0}, "\2\x0F\xFD\110", IF_PENT|IF_MMX},
+    {-1}
+};
+
+static struct itemplate instrux_PAND[] = {
+    {I_PAND, 2, {MMXREG,MEMORY,0}, "\301\2\x0F\xDB\110", IF_PENT|IF_MMX|IF_SM},
+    {I_PAND, 2, {MMXREG,MMXREG,0}, "\2\x0F\xDB\110", IF_PENT|IF_MMX},
+    {-1}
+};
+
+static struct itemplate instrux_PANDN[] = {
+    {I_PANDN, 2, {MMXREG,MEMORY,0}, "\301\2\x0F\xDF\110", IF_PENT|IF_MMX|IF_SM},
+    {I_PANDN, 2, {MMXREG,MMXREG,0}, "\2\x0F\xDF\110", IF_PENT|IF_MMX},
+    {-1}
+};
+
+static struct itemplate instrux_PAVEB[] = {
+    {I_PAVEB, 2, {MMXREG,MEMORY,0}, "\301\2\x0F\x50\110", IF_PENT|IF_MMX|IF_SM|IF_CYRIX},
+    {I_PAVEB, 2, {MMXREG,MMXREG,0}, "\2\x0F\x50\110", IF_PENT|IF_MMX|IF_CYRIX},
+    {-1}
+};
+
+static struct itemplate instrux_PCMPEQB[] = {
+    {I_PCMPEQB, 2, {MMXREG,MEMORY,0}, "\301\2\x0F\x74\110", IF_PENT|IF_MMX|IF_SM},
+    {I_PCMPEQB, 2, {MMXREG,MMXREG,0}, "\2\x0F\x74\110", IF_PENT|IF_MMX},
+    {-1}
+};
+
+static struct itemplate instrux_PCMPEQD[] = {
+    {I_PCMPEQD, 2, {MMXREG,MEMORY,0}, "\301\2\x0F\x76\110", IF_PENT|IF_MMX|IF_SM},
+    {I_PCMPEQD, 2, {MMXREG,MMXREG,0}, "\2\x0F\x76\110", IF_PENT|IF_MMX},
+    {-1}
+};
+
+static struct itemplate instrux_PCMPEQW[] = {
+    {I_PCMPEQW, 2, {MMXREG,MEMORY,0}, "\301\2\x0F\x75\110", IF_PENT|IF_MMX|IF_SM},
+    {I_PCMPEQW, 2, {MMXREG,MMXREG,0}, "\2\x0F\x75\110", IF_PENT|IF_MMX},
+    {-1}
+};
+
+static struct itemplate instrux_PCMPGTB[] = {
+    {I_PCMPGTB, 2, {MMXREG,MEMORY,0}, "\301\2\x0F\x64\110", IF_PENT|IF_MMX|IF_SM},
+    {I_PCMPGTB, 2, {MMXREG,MMXREG,0}, "\2\x0F\x64\110", IF_PENT|IF_MMX},
+    {-1}
+};
+
+static struct itemplate instrux_PCMPGTD[] = {
+    {I_PCMPGTD, 2, {MMXREG,MEMORY,0}, "\301\2\x0F\x66\110", IF_PENT|IF_MMX|IF_SM},
+    {I_PCMPGTD, 2, {MMXREG,MMXREG,0}, "\2\x0F\x66\110", IF_PENT|IF_MMX},
+    {-1}
+};
+
+static struct itemplate instrux_PCMPGTW[] = {
+    {I_PCMPGTW, 2, {MMXREG,MEMORY,0}, "\301\2\x0F\x65\110", IF_PENT|IF_MMX|IF_SM},
+    {I_PCMPGTW, 2, {MMXREG,MMXREG,0}, "\2\x0F\x65\110", IF_PENT|IF_MMX},
+    {-1}
+};
+
+static struct itemplate instrux_PDISTIB[] = {
+    {I_PDISTIB, 2, {MMXREG,MEMORY,0}, "\301\2\x0F\x54\110", IF_PENT|IF_MMX|IF_SM|IF_CYRIX},
+    {-1}
+};
+
+static struct itemplate instrux_PMACHRIW[] = {
+    {I_PMACHRIW, 2, {MMXREG,MEMORY,0}, "\301\2\x0F\x5E\110", IF_PENT|IF_MMX|IF_SM|IF_CYRIX},
+    {-1}
+};
+
+static struct itemplate instrux_PMADDWD[] = {
+    {I_PMADDWD, 2, {MMXREG,MEMORY,0}, "\301\2\x0F\xF5\110", IF_PENT|IF_MMX|IF_SM},
+    {I_PMADDWD, 2, {MMXREG,MMXREG,0}, "\2\x0F\xF5\110", IF_PENT|IF_MMX},
+    {-1}
+};
+
+static struct itemplate instrux_PMAGW[] = {
+    {I_PMAGW, 2, {MMXREG,MEMORY,0}, "\301\2\x0F\x52\110", IF_PENT|IF_MMX|IF_SM|IF_CYRIX},
+    {I_PMAGW, 2, {MMXREG,MMXREG,0}, "\2\x0F\x52\110", IF_PENT|IF_MMX|IF_CYRIX},
+    {-1}
+};
+
+static struct itemplate instrux_PMULHRW[] = {
+    {I_PMULHRW, 2, {MMXREG,MEMORY,0}, "\301\2\x0F\x59\110", IF_PENT|IF_MMX|IF_SM|IF_CYRIX},
+    {I_PMULHRW, 2, {MMXREG,MMXREG,0}, "\2\x0F\x59\110", IF_PENT|IF_MMX|IF_CYRIX},
+    {-1}
+};
+
+static struct itemplate instrux_PMULHRIW[] = {
+    {I_PMULHRIW, 2, {MMXREG,MEMORY,0}, "\301\2\x0F\x5D\110", IF_PENT|IF_MMX|IF_SM|IF_CYRIX},
+    {I_PMULHRIW, 2, {MMXREG,MMXREG,0}, "\2\x0F\x5D\110", IF_PENT|IF_MMX|IF_CYRIX},
+    {-1}
+};
+
+static struct itemplate instrux_PMULHW[] = {
+    {I_PMULHW, 2, {MMXREG,MEMORY,0}, "\301\2\x0F\xE5\110", IF_PENT|IF_MMX|IF_SM},
+    {I_PMULHW, 2, {MMXREG,MMXREG,0}, "\2\x0F\xE5\110", IF_PENT|IF_MMX},
+    {-1}
+};
+
+static struct itemplate instrux_PMULLW[] = {
+    {I_PMULLW, 2, {MMXREG,MEMORY,0}, "\301\2\x0F\xD5\110", IF_PENT|IF_MMX|IF_SM},
+    {I_PMULLW, 2, {MMXREG,MMXREG,0}, "\2\x0F\xD5\110", IF_PENT|IF_MMX},
+    {-1}
+};
+
+static struct itemplate instrux_PMVGEZB[] = {
+    {I_PMVGEZB, 2, {MMXREG,MEMORY,0}, "\301\2\x0F\x5C\110", IF_PENT|IF_MMX|IF_SM|IF_CYRIX},
+    {-1}
+};
+
+static struct itemplate instrux_PMVLZB[] = {
+    {I_PMVLZB, 2, {MMXREG,MEMORY,0}, "\301\2\x0F\x5B\110", IF_PENT|IF_MMX|IF_SM|IF_CYRIX},
+    {-1}
+};
+
+static struct itemplate instrux_PMVNZB[] = {
+    {I_PMVNZB, 2, {MMXREG,MEMORY,0}, "\301\2\x0F\x5A\110", IF_PENT|IF_MMX|IF_SM|IF_CYRIX},
+    {-1}
+};
+
+static struct itemplate instrux_PMVZB[] = {
+    {I_PMVZB, 2, {MMXREG,MEMORY,0}, "\301\2\x0F\x58\110", IF_PENT|IF_MMX|IF_SM|IF_CYRIX},
+    {-1}
+};
+
+static struct itemplate instrux_POP[] = {
+    {I_POP, 1, {REG16,0,0}, "\320\10\x58", IF_8086},
+    {I_POP, 1, {REG32,0,0}, "\321\10\x58", IF_386},
+    {I_POP, 1, {REGMEM|BITS16,0,0}, "\320\300\1\x8F\200", IF_8086},
+    {I_POP, 1, {REGMEM|BITS32,0,0}, "\321\300\1\x8F\200", IF_386},
+    {I_POP, 1, {REG_CS,0,0}, "\1\x0F", IF_8086|IF_UNDOC},
+    {I_POP, 1, {REG_DESS,0,0}, "\4", IF_8086},
+    {I_POP, 1, {REG_FSGS,0,0}, "\1\x0F\5", IF_386},
+    {-1}
+};
+
+static struct itemplate instrux_POPA[] = {
+    {I_POPA, 0, {0,0,0}, "\322\1\x61", IF_186},
+    {-1}
+};
+
+static struct itemplate instrux_POPAD[] = {
+    {I_POPAD, 0, {0,0,0}, "\321\1\x61", IF_386},
+    {-1}
+};
+
+static struct itemplate instrux_POPAW[] = {
+    {I_POPAW, 0, {0,0,0}, "\320\1\x61", IF_186},
+    {-1}
+};
+
+static struct itemplate instrux_POPF[] = {
+    {I_POPF, 0, {0,0,0}, "\322\1\x9D", IF_186},
+    {-1}
+};
+
+static struct itemplate instrux_POPFD[] = {
+    {I_POPFD, 0, {0,0,0}, "\321\1\x9D", IF_386},
+    {-1}
+};
+
+static struct itemplate instrux_POPFW[] = {
+    {I_POPFW, 0, {0,0,0}, "\320\1\x9D", IF_186},
+    {-1}
+};
+
+static struct itemplate instrux_POR[] = {
+    {I_POR, 2, {MMXREG,MEMORY,0}, "\301\2\x0F\xEB\110", IF_PENT|IF_MMX|IF_SM},
+    {I_POR, 2, {MMXREG,MMXREG,0}, "\2\x0F\xEB\110", IF_PENT|IF_MMX},
+    {-1}
+};
+
+static struct itemplate instrux_PSLLD[] = {
+    {I_PSLLD, 2, {MMXREG,MEMORY,0}, "\301\2\x0F\xF2\110", IF_PENT|IF_MMX|IF_SM},
+    {I_PSLLD, 2, {MMXREG,MMXREG,0}, "\2\x0F\xF2\110", IF_PENT|IF_MMX},
+    {I_PSLLD, 2, {MMXREG,IMMEDIATE,0}, "\2\x0F\x72\206\25", IF_PENT|IF_MMX},
+    {-1}
+};
+
+static struct itemplate instrux_PSLLQ[] = {
+    {I_PSLLQ, 2, {MMXREG,MEMORY,0}, "\301\2\x0F\xF3\110", IF_PENT|IF_MMX|IF_SM},
+    {I_PSLLQ, 2, {MMXREG,MMXREG,0}, "\2\x0F\xF3\110", IF_PENT|IF_MMX},
+    {I_PSLLQ, 2, {MMXREG,IMMEDIATE,0}, "\2\x0F\x73\206\25", IF_PENT|IF_MMX},
+    {-1}
+};
+
+static struct itemplate instrux_PSLLW[] = {
+    {I_PSLLW, 2, {MMXREG,MEMORY,0}, "\301\2\x0F\xF1\110", IF_PENT|IF_MMX|IF_SM},
+    {I_PSLLW, 2, {MMXREG,MMXREG,0}, "\2\x0F\xF1\110", IF_PENT|IF_MMX},
+    {I_PSLLW, 2, {MMXREG,IMMEDIATE,0}, "\2\x0F\x71\206\25", IF_PENT|IF_MMX},
+    {-1}
+};
+
+static struct itemplate instrux_PSRAD[] = {
+    {I_PSRAD, 2, {MMXREG,MEMORY,0}, "\301\2\x0F\xE2\110", IF_PENT|IF_MMX|IF_SM},
+    {I_PSRAD, 2, {MMXREG,MMXREG,0}, "\2\x0F\xE2\110", IF_PENT|IF_MMX},
+    {I_PSRAD, 2, {MMXREG,IMMEDIATE,0}, "\2\x0F\x72\204\25", IF_PENT|IF_MMX},
+    {-1}
+};
+
+static struct itemplate instrux_PSRAW[] = {
+    {I_PSRAW, 2, {MMXREG,MEMORY,0}, "\301\2\x0F\xE1\110", IF_PENT|IF_MMX|IF_SM},
+    {I_PSRAW, 2, {MMXREG,MMXREG,0}, "\2\x0F\xE1\110", IF_PENT|IF_MMX},
+    {I_PSRAW, 2, {MMXREG,IMMEDIATE,0}, "\2\x0F\x71\204\25", IF_PENT|IF_MMX},
+    {-1}
+};
+
+static struct itemplate instrux_PSRLD[] = {
+    {I_PSRLD, 2, {MMXREG,MEMORY,0}, "\301\2\x0F\xD2\110", IF_PENT|IF_MMX|IF_SM},
+    {I_PSRLD, 2, {MMXREG,MMXREG,0}, "\2\x0F\xD2\110", IF_PENT|IF_MMX},
+    {I_PSRLD, 2, {MMXREG,IMMEDIATE,0}, "\2\x0F\x72\202\25", IF_PENT|IF_MMX},
+    {-1}
+};
+
+static struct itemplate instrux_PSRLQ[] = {
+    {I_PSRLQ, 2, {MMXREG,MEMORY,0}, "\301\2\x0F\xD3\110", IF_PENT|IF_MMX|IF_SM},
+    {I_PSRLQ, 2, {MMXREG,MMXREG,0}, "\2\x0F\xD3\110", IF_PENT|IF_MMX},
+    {I_PSRLQ, 2, {MMXREG,IMMEDIATE,0}, "\2\x0F\x73\202\25", IF_PENT|IF_MMX},
+    {-1}
+};
+
+static struct itemplate instrux_PSRLW[] = {
+    {I_PSRLW, 2, {MMXREG,MEMORY,0}, "\301\2\x0F\xD1\110", IF_PENT|IF_MMX|IF_SM},
+    {I_PSRLW, 2, {MMXREG,MMXREG,0}, "\2\x0F\xD1\110", IF_PENT|IF_MMX},
+    {I_PSRLW, 2, {MMXREG,IMMEDIATE,0}, "\2\x0F\x71\202\25", IF_PENT|IF_MMX},
+    {-1}
+};
+
+static struct itemplate instrux_PSUBB[] = {
+    {I_PSUBB, 2, {MMXREG,MEMORY,0}, "\301\2\x0F\xF8\110", IF_PENT|IF_MMX|IF_SM},
+    {I_PSUBB, 2, {MMXREG,MMXREG,0}, "\2\x0F\xF8\110", IF_PENT|IF_MMX},
+    {-1}
+};
+
+static struct itemplate instrux_PSUBD[] = {
+    {I_PSUBD, 2, {MMXREG,MEMORY,0}, "\301\2\x0F\xFA\110", IF_PENT|IF_MMX|IF_SM},
+    {I_PSUBD, 2, {MMXREG,MMXREG,0}, "\2\x0F\xFA\110", IF_PENT|IF_MMX},
+    {-1}
+};
+
+static struct itemplate instrux_PSUBSB[] = {
+    {I_PSUBSB, 2, {MMXREG,MEMORY,0}, "\301\2\x0F\xE8\110", IF_PENT|IF_MMX|IF_SM},
+    {I_PSUBSB, 2, {MMXREG,MMXREG,0}, "\2\x0F\xE8\110", IF_PENT|IF_MMX},
+    {-1}
+};
+
+static struct itemplate instrux_PSUBSIW[] = {
+    {I_PSUBSIW, 2, {MMXREG,MEMORY,0}, "\301\2\x0F\x55\110", IF_PENT|IF_MMX|IF_SM|IF_CYRIX},
+    {I_PSUBSIW, 2, {MMXREG,MMXREG,0}, "\2\x0F\x55\110", IF_PENT|IF_MMX|IF_CYRIX},
+    {-1}
+};
+
+static struct itemplate instrux_PSUBSW[] = {
+    {I_PSUBSW, 2, {MMXREG,MEMORY,0}, "\301\2\x0F\xE9\110", IF_PENT|IF_MMX|IF_SM},
+    {I_PSUBSW, 2, {MMXREG,MMXREG,0}, "\2\x0F\xE9\110", IF_PENT|IF_MMX},
+    {-1}
+};
+
+static struct itemplate instrux_PSUBUSB[] = {
+    {I_PSUBUSB, 2, {MMXREG,MEMORY,0}, "\301\2\x0F\xD8\110", IF_PENT|IF_MMX|IF_SM},
+    {I_PSUBUSB, 2, {MMXREG,MMXREG,0}, "\2\x0F\xD8\110", IF_PENT|IF_MMX},
+    {-1}
+};
+
+static struct itemplate instrux_PSUBUSW[] = {
+    {I_PSUBUSW, 2, {MMXREG,MEMORY,0}, "\301\2\x0F\xD9\110", IF_PENT|IF_MMX|IF_SM},
+    {I_PSUBUSW, 2, {MMXREG,MMXREG,0}, "\2\x0F\xD9\110", IF_PENT|IF_MMX},
+    {-1}
+};
+
+static struct itemplate instrux_PSUBW[] = {
+    {I_PSUBW, 2, {MMXREG,MEMORY,0}, "\301\2\x0F\xF9\110", IF_PENT|IF_MMX|IF_SM},
+    {I_PSUBW, 2, {MMXREG,MMXREG,0}, "\2\x0F\xF9\110", IF_PENT|IF_MMX},
+    {-1}
+};
+
+static struct itemplate instrux_PUNPCKHBW[] = {
+    {I_PUNPCKHBW, 2, {MMXREG,MEMORY,0}, "\301\2\x0F\x68\110", IF_PENT|IF_MMX|IF_SM},
+    {I_PUNPCKHBW, 2, {MMXREG,MMXREG,0}, "\2\x0F\x68\110", IF_PENT|IF_MMX},
+    {-1}
+};
+
+static struct itemplate instrux_PUNPCKHDQ[] = {
+    {I_PUNPCKHDQ, 2, {MMXREG,MEMORY,0}, "\301\2\x0F\x6A\110", IF_PENT|IF_MMX|IF_SM},
+    {I_PUNPCKHDQ, 2, {MMXREG,MMXREG,0}, "\2\x0F\x6A\110", IF_PENT|IF_MMX},
+    {-1}
+};
+
+static struct itemplate instrux_PUNPCKHWD[] = {
+    {I_PUNPCKHWD, 2, {MMXREG,MEMORY,0}, "\301\2\x0F\x69\110", IF_PENT|IF_MMX|IF_SM},
+    {I_PUNPCKHWD, 2, {MMXREG,MMXREG,0}, "\2\x0F\x69\110", IF_PENT|IF_MMX},
+    {-1}
+};
+
+static struct itemplate instrux_PUNPCKLBW[] = {
+    {I_PUNPCKLBW, 2, {MMXREG,MEMORY,0}, "\301\2\x0F\x60\110", IF_PENT|IF_MMX|IF_SM},
+    {I_PUNPCKLBW, 2, {MMXREG,MMXREG,0}, "\2\x0F\x60\110", IF_PENT|IF_MMX},
+    {-1}
+};
+
+static struct itemplate instrux_PUNPCKLDQ[] = {
+    {I_PUNPCKLDQ, 2, {MMXREG,MEMORY,0}, "\301\2\x0F\x62\110", IF_PENT|IF_MMX|IF_SM},
+    {I_PUNPCKLDQ, 2, {MMXREG,MMXREG,0}, "\2\x0F\x62\110", IF_PENT|IF_MMX},
+    {-1}
+};
+
+static struct itemplate instrux_PUNPCKLWD[] = {
+    {I_PUNPCKLWD, 2, {MMXREG,MEMORY,0}, "\301\2\x0F\x61\110", IF_PENT|IF_MMX|IF_SM},
+    {I_PUNPCKLWD, 2, {MMXREG,MMXREG,0}, "\2\x0F\x61\110", IF_PENT|IF_MMX},
+    {-1}
+};
+
+static struct itemplate instrux_PUSH[] = {
+    {I_PUSH, 1, {REG16,0,0}, "\320\10\x50", IF_8086},
+    {I_PUSH, 1, {REG32,0,0}, "\321\10\x50", IF_386},
+    {I_PUSH, 1, {REGMEM|BITS16,0,0}, "\320\300\1\xFF\206", IF_8086},
+    {I_PUSH, 1, {REGMEM|BITS32,0,0}, "\321\300\1\xFF\206", IF_386},
+    {I_PUSH, 1, {REG_FSGS,0,0}, "\1\x0F\7", IF_386},
+    {I_PUSH, 1, {REG_SREG,0,0}, "\6", IF_8086},
+    {I_PUSH, 1, {IMMEDIATE|BITS8,0,0}, "\1\x6A\14", IF_286},
+    {I_PUSH, 1, {IMMEDIATE|BITS16,0,0}, "\320\1\x68\30", IF_286},
+    {I_PUSH, 1, {IMMEDIATE|BITS32,0,0}, "\321\1\x68\40", IF_386},
+    {-1}
+};
+
+static struct itemplate instrux_PUSHA[] = {
+    {I_PUSHA, 0, {0,0,0}, "\322\1\x60", IF_186},
+    {-1}
+};
+
+static struct itemplate instrux_PUSHAD[] = {
+    {I_PUSHAD, 0, {0,0,0}, "\321\1\x60", IF_386},
+    {-1}
+};
+
+static struct itemplate instrux_PUSHAW[] = {
+    {I_PUSHAW, 0, {0,0,0}, "\320\1\x60", IF_186},
+    {-1}
+};
+
+static struct itemplate instrux_PUSHF[] = {
+    {I_PUSHF, 0, {0,0,0}, "\322\1\x9C", IF_186},
+    {-1}
+};
+
+static struct itemplate instrux_PUSHFD[] = {
+    {I_PUSHFD, 0, {0,0,0}, "\321\1\x9C", IF_386},
+    {-1}
+};
+
+static struct itemplate instrux_PUSHFW[] = {
+    {I_PUSHFW, 0, {0,0,0}, "\320\1\x9C", IF_186},
+    {-1}
+};
+
+static struct itemplate instrux_PXOR[] = {
+    {I_PXOR, 2, {MMXREG,MEMORY,0}, "\301\2\x0F\xEF\110", IF_PENT|IF_MMX|IF_SM},
+    {I_PXOR, 2, {MMXREG,MMXREG,0}, "\2\x0F\xEF\110", IF_PENT|IF_MMX},
+    {-1}
+};
+
+static struct itemplate instrux_RCL[] = {
+    {I_RCL, 2, {REGMEM|BITS8,UNITY,0}, "\300\1\xD0\202", IF_8086},
+    {I_RCL, 2, {REGMEM|BITS8,REG_CL,0}, "\300\1\xD2\202", IF_8086},
+    {I_RCL, 2, {REGMEM|BITS8,IMMEDIATE,0}, "\300\1\xC0\202\25", IF_286|IF_SB},
+    {I_RCL, 2, {REGMEM|BITS16,UNITY,0}, "\320\300\1\xD1\202", IF_8086},
+    {I_RCL, 2, {REGMEM|BITS16,REG_CL,0}, "\320\300\1\xD3\202", IF_8086},
+    {I_RCL, 2, {REGMEM|BITS16,IMMEDIATE,0}, "\320\300\1\xC1\202\25", IF_286|IF_SB},
+    {I_RCL, 2, {REGMEM|BITS32,UNITY,0}, "\321\300\1\xD1\202", IF_386},
+    {I_RCL, 2, {REGMEM|BITS32,REG_CL,0}, "\321\300\1\xD3\202", IF_386},
+    {I_RCL, 2, {REGMEM|BITS32,IMMEDIATE,0}, "\321\300\1\xC1\202\25", IF_386|IF_SB},
+    {-1}
+};
+
+static struct itemplate instrux_RCR[] = {
+    {I_RCR, 2, {REGMEM|BITS8,UNITY,0}, "\300\1\xD0\203", IF_8086},
+    {I_RCR, 2, {REGMEM|BITS8,REG_CL,0}, "\300\1\xD2\203", IF_8086},
+    {I_RCR, 2, {REGMEM|BITS8,IMMEDIATE,0}, "\300\1\xC0\203\25", IF_286|IF_SB},
+    {I_RCR, 2, {REGMEM|BITS16,UNITY,0}, "\320\300\1\xD1\203", IF_8086},
+    {I_RCR, 2, {REGMEM|BITS16,REG_CL,0}, "\320\300\1\xD3\203", IF_8086},
+    {I_RCR, 2, {REGMEM|BITS16,IMMEDIATE,0}, "\320\300\1\xC1\203\25", IF_286|IF_SB},
+    {I_RCR, 2, {REGMEM|BITS32,UNITY,0}, "\321\300\1\xD1\203", IF_386},
+    {I_RCR, 2, {REGMEM|BITS32,REG_CL,0}, "\321\300\1\xD3\203", IF_386},
+    {I_RCR, 2, {REGMEM|BITS32,IMMEDIATE,0}, "\321\300\1\xC1\203\25", IF_386|IF_SB},
+    {-1}
+};
+
+static struct itemplate instrux_RDMSR[] = {
+    {I_RDMSR, 0, {0,0,0}, "\2\x0F\x32", IF_PENT},
+    {-1}
+};
+
+static struct itemplate instrux_RDPMC[] = {
+    {I_RDPMC, 0, {0,0,0}, "\2\x0F\x33", IF_P6},
+    {-1}
+};
+
+static struct itemplate instrux_RDTSC[] = {
+    {I_RDTSC, 0, {0,0,0}, "\2\x0F\x31", IF_PENT},
+    {-1}
+};
+
+static struct itemplate instrux_RESB[] = {
+    {I_RESB, 1, {IMMEDIATE,0,0}, "\340", IF_8086},
+    {-1}
+};
+
+static struct itemplate instrux_RESD[] = {
+    {-1}
+};
+
+static struct itemplate instrux_RESQ[] = {
+    {-1}
+};
+
+static struct itemplate instrux_REST[] = {
+    {-1}
+};
+
+static struct itemplate instrux_RESW[] = {
+    {-1}
+};
+
+static struct itemplate instrux_RET[] = {
+    {I_RET, 0, {0,0,0}, "\1\xC3", IF_8086},
+    {I_RET, 1, {IMMEDIATE,0,0}, "\1\xC2\30", IF_8086},
+    {-1}
+};
+
+static struct itemplate instrux_RETF[] = {
+    {I_RETF, 0, {0,0,0}, "\1\xCB", IF_8086},
+    {I_RETF, 1, {IMMEDIATE,0,0}, "\1\xCA\30", IF_8086},
+    {-1}
+};
+
+static struct itemplate instrux_RETN[] = {
+    {I_RETN, 0, {0,0,0}, "\1\xC3", IF_8086},
+    {I_RETN, 1, {IMMEDIATE,0,0}, "\1\xC2\30", IF_8086},
+    {-1}
+};
+
+static struct itemplate instrux_ROL[] = {
+    {I_ROL, 2, {REGMEM|BITS8,UNITY,0}, "\300\1\xD0\200", IF_8086},
+    {I_ROL, 2, {REGMEM|BITS8,REG_CL,0}, "\300\1\xD2\200", IF_8086},
+    {I_ROL, 2, {REGMEM|BITS8,IMMEDIATE,0}, "\300\1\xC0\200\25", IF_286|IF_SB},
+    {I_ROL, 2, {REGMEM|BITS16,UNITY,0}, "\320\300\1\xD1\200", IF_8086},
+    {I_ROL, 2, {REGMEM|BITS16,REG_CL,0}, "\320\300\1\xD3\200", IF_8086},
+    {I_ROL, 2, {REGMEM|BITS16,IMMEDIATE,0}, "\320\300\1\xC1\200\25", IF_286|IF_SB},
+    {I_ROL, 2, {REGMEM|BITS32,UNITY,0}, "\321\300\1\xD1\200", IF_386},
+    {I_ROL, 2, {REGMEM|BITS32,REG_CL,0}, "\321\300\1\xD3\200", IF_386},
+    {I_ROL, 2, {REGMEM|BITS32,IMMEDIATE,0}, "\321\300\1\xC1\200\25", IF_386|IF_SB},
+    {-1}
+};
+
+static struct itemplate instrux_ROR[] = {
+    {I_ROR, 2, {REGMEM|BITS8,UNITY,0}, "\300\1\xD0\201", IF_8086},
+    {I_ROR, 2, {REGMEM|BITS8,REG_CL,0}, "\300\1\xD2\201", IF_8086},
+    {I_ROR, 2, {REGMEM|BITS8,IMMEDIATE,0}, "\300\1\xC0\201\25", IF_286|IF_SB},
+    {I_ROR, 2, {REGMEM|BITS16,UNITY,0}, "\320\300\1\xD1\201", IF_8086},
+    {I_ROR, 2, {REGMEM|BITS16,REG_CL,0}, "\320\300\1\xD3\201", IF_8086},
+    {I_ROR, 2, {REGMEM|BITS16,IMMEDIATE,0}, "\320\300\1\xC1\201\25", IF_286|IF_SB},
+    {I_ROR, 2, {REGMEM|BITS32,UNITY,0}, "\321\300\1\xD1\201", IF_386},
+    {I_ROR, 2, {REGMEM|BITS32,REG_CL,0}, "\321\300\1\xD3\201", IF_386},
+    {I_ROR, 2, {REGMEM|BITS32,IMMEDIATE,0}, "\321\300\1\xC1\201\25", IF_386|IF_SB},
+    {-1}
+};
+
+static struct itemplate instrux_RSM[] = {
+    {I_RSM, 0, {0,0,0}, "\2\x0F\xAA", IF_PENT},
+    {-1}
+};
+
+static struct itemplate instrux_SAHF[] = {
+    {I_SAHF, 0, {0,0,0}, "\1\x9E", IF_8086},
+    {-1}
+};
+
+static struct itemplate instrux_SAL[] = {
+    {I_SAL, 2, {REGMEM|BITS8,UNITY,0}, "\300\1\xD0\204", IF_8086},
+    {I_SAL, 2, {REGMEM|BITS8,REG_CL,0}, "\300\1\xD2\204", IF_8086},
+    {I_SAL, 2, {REGMEM|BITS8,IMMEDIATE,0}, "\300\1\xC0\204\25", IF_286|IF_SB},
+    {I_SAL, 2, {REGMEM|BITS16,UNITY,0}, "\320\300\1\xD1\204", IF_8086},
+    {I_SAL, 2, {REGMEM|BITS16,REG_CL,0}, "\320\300\1\xD3\204", IF_8086},
+    {I_SAL, 2, {REGMEM|BITS16,IMMEDIATE,0}, "\320\300\1\xC1\204\25", IF_286|IF_SB},
+    {I_SAL, 2, {REGMEM|BITS32,UNITY,0}, "\321\300\1\xD1\204", IF_386},
+    {I_SAL, 2, {REGMEM|BITS32,REG_CL,0}, "\321\300\1\xD3\204", IF_386},
+    {I_SAL, 2, {REGMEM|BITS32,IMMEDIATE,0}, "\321\300\1\xC1\204\25", IF_386|IF_SB},
+    {-1}
+};
+
+static struct itemplate instrux_SALC[] = {
+    {I_SALC, 0, {0,0,0}, "\1\xD6", IF_8086|IF_UNDOC},
+    {-1}
+};
+
+static struct itemplate instrux_SAR[] = {
+    {I_SAR, 2, {REGMEM|BITS8,UNITY,0}, "\300\1\xD0\207", IF_8086},
+    {I_SAR, 2, {REGMEM|BITS8,REG_CL,0}, "\300\1\xD2\207", IF_8086},
+    {I_SAR, 2, {REGMEM|BITS8,IMMEDIATE,0}, "\300\1\xC0\207\25", IF_286|IF_SB},
+    {I_SAR, 2, {REGMEM|BITS16,UNITY,0}, "\320\300\1\xD1\207", IF_8086},
+    {I_SAR, 2, {REGMEM|BITS16,REG_CL,0}, "\320\300\1\xD3\207", IF_8086},
+    {I_SAR, 2, {REGMEM|BITS16,IMMEDIATE,0}, "\320\300\1\xC1\207\25", IF_286|IF_SB},
+    {I_SAR, 2, {REGMEM|BITS32,UNITY,0}, "\321\300\1\xD1\207", IF_386},
+    {I_SAR, 2, {REGMEM|BITS32,REG_CL,0}, "\321\300\1\xD3\207", IF_386},
+    {I_SAR, 2, {REGMEM|BITS32,IMMEDIATE,0}, "\321\300\1\xC1\207\25", IF_386|IF_SB},
+    {-1}
+};
+
+static struct itemplate instrux_SBB[] = {
+    {I_SBB, 2, {MEMORY,REG8,0}, "\300\1\x18\101", IF_8086|IF_SM},
+    {I_SBB, 2, {REG8,REG8,0}, "\300\1\x18\101", IF_8086},
+    {I_SBB, 2, {MEMORY,REG16,0}, "\320\300\1\x19\101", IF_8086|IF_SM},
+    {I_SBB, 2, {REG16,REG16,0}, "\320\300\1\x19\101", IF_8086},
+    {I_SBB, 2, {MEMORY,REG32,0}, "\321\300\1\x19\101", IF_386|IF_SM},
+    {I_SBB, 2, {REG32,REG32,0}, "\321\300\1\x19\101", IF_386},
+    {I_SBB, 2, {REG8,MEMORY,0}, "\301\1\x1A\110", IF_8086|IF_SM},
+    {I_SBB, 2, {REG8,REG8,0}, "\301\1\x1A\110", IF_8086},
+    {I_SBB, 2, {REG16,MEMORY,0}, "\320\301\1\x1B\110", IF_8086|IF_SM},
+    {I_SBB, 2, {REG16,REG16,0}, "\320\301\1\x1B\110", IF_8086},
+    {I_SBB, 2, {REG32,MEMORY,0}, "\321\301\1\x1B\110", IF_386|IF_SM},
+    {I_SBB, 2, {REG32,REG32,0}, "\321\301\1\x1B\110", IF_386},
+    {I_SBB, 2, {REGMEM|BITS16,IMMEDIATE|BITS8,0}, "\320\300\1\x83\203\15", IF_8086},
+    {I_SBB, 2, {REGMEM|BITS32,IMMEDIATE|BITS8,0}, "\321\300\1\x83\203\15", IF_8086},
+    {I_SBB, 2, {REG_AL,IMMEDIATE,0}, "\1\x1C\21", IF_8086|IF_SM},
+    {I_SBB, 2, {REG_AX,IMMEDIATE,0}, "\320\1\x1D\31", IF_8086|IF_SM},
+    {I_SBB, 2, {REG_EAX,IMMEDIATE,0}, "\321\1\x1D\41", IF_386|IF_SM},
+    {I_SBB, 2, {REGMEM|BITS8,IMMEDIATE,0}, "\300\1\x80\203\21", IF_8086|IF_SM},
+    {I_SBB, 2, {REGMEM|BITS16,IMMEDIATE,0}, "\320\300\1\x81\203\31", IF_8086|IF_SM},
+    {I_SBB, 2, {REGMEM|BITS32,IMMEDIATE,0}, "\321\300\1\x81\203\41", IF_386|IF_SM},
+    {I_SBB, 2, {MEMORY,IMMEDIATE|BITS8,0}, "\300\1\x80\203\21", IF_8086|IF_SM},
+    {I_SBB, 2, {MEMORY,IMMEDIATE|BITS16,0}, "\320\300\1\x81\203\31", IF_8086|IF_SM},
+    {I_SBB, 2, {MEMORY,IMMEDIATE|BITS32,0}, "\321\300\1\x81\203\41", IF_386|IF_SM},
+    {-1}
+};
+
+static struct itemplate instrux_SCASB[] = {
+    {I_SCASB, 0, {0,0,0}, "\1\xAE", IF_8086},
+    {-1}
+};
+
+static struct itemplate instrux_SCASD[] = {
+    {I_SCASD, 0, {0,0,0}, "\321\1\xAF", IF_386},
+    {-1}
+};
+
+static struct itemplate instrux_SCASW[] = {
+    {I_SCASW, 0, {0,0,0}, "\320\1\xAF", IF_8086},
+    {-1}
+};
+
+static struct itemplate instrux_SGDT[] = {
+    {I_SGDT, 1, {MEMORY,0,0}, "\300\2\x0F\x01\200", IF_286|IF_PRIV},
+    {-1}
+};
+
+static struct itemplate instrux_SHL[] = {
+    {I_SHL, 2, {REGMEM|BITS8,UNITY,0}, "\300\1\xD0\204", IF_8086},
+    {I_SHL, 2, {REGMEM|BITS8,REG_CL,0}, "\300\1\xD2\204", IF_8086},
+    {I_SHL, 2, {REGMEM|BITS8,IMMEDIATE,0}, "\300\1\xC0\204\25", IF_286|IF_SB},
+    {I_SHL, 2, {REGMEM|BITS16,UNITY,0}, "\320\300\1\xD1\204", IF_8086},
+    {I_SHL, 2, {REGMEM|BITS16,REG_CL,0}, "\320\300\1\xD3\204", IF_8086},
+    {I_SHL, 2, {REGMEM|BITS16,IMMEDIATE,0}, "\320\300\1\xC1\204\25", IF_286|IF_SB},
+    {I_SHL, 2, {REGMEM|BITS32,UNITY,0}, "\321\300\1\xD1\204", IF_386},
+    {I_SHL, 2, {REGMEM|BITS32,REG_CL,0}, "\321\300\1\xD3\204", IF_386},
+    {I_SHL, 2, {REGMEM|BITS32,IMMEDIATE,0}, "\321\300\1\xC1\204\25", IF_386|IF_SB},
+    {-1}
+};
+
+static struct itemplate instrux_SHLD[] = {
+    {I_SHLD, 3, {MEMORY,REG16,IMMEDIATE}, "\300\320\2\x0F\xA4\101\26", IF_386|IF_SM2},
+    {I_SHLD, 3, {REG16,REG16,IMMEDIATE}, "\300\320\2\x0F\xA4\101\26", IF_386|IF_SM2},
+    {I_SHLD, 3, {MEMORY,REG32,IMMEDIATE}, "\300\321\2\x0F\xA4\101\26", IF_386|IF_SM2},
+    {I_SHLD, 3, {REG32,REG32,IMMEDIATE}, "\300\321\2\x0F\xA4\101\26", IF_386|IF_SM2},
+    {I_SHLD, 3, {MEMORY,REG16,REG_CL}, "\300\320\2\x0F\xA5\101", IF_386|IF_SM},
+    {I_SHLD, 3, {REG16,REG16,REG_CL}, "\300\320\2\x0F\xA5\101", IF_386},
+    {I_SHLD, 3, {MEMORY,REG32,REG_CL}, "\300\321\2\x0F\xA5\101", IF_386|IF_SM},
+    {I_SHLD, 3, {REG32,REG32,REG_CL}, "\300\321\2\x0F\xA5\101", IF_386},
+    {-1}
+};
+
+static struct itemplate instrux_SHR[] = {
+    {I_SHR, 2, {REGMEM|BITS8,UNITY,0}, "\300\1\xD0\205", IF_8086},
+    {I_SHR, 2, {REGMEM|BITS8,REG_CL,0}, "\300\1\xD2\205", IF_8086},
+    {I_SHR, 2, {REGMEM|BITS8,IMMEDIATE,0}, "\300\1\xC0\205\25", IF_286|IF_SB},
+    {I_SHR, 2, {REGMEM|BITS16,UNITY,0}, "\320\300\1\xD1\205", IF_8086},
+    {I_SHR, 2, {REGMEM|BITS16,REG_CL,0}, "\320\300\1\xD3\205", IF_8086},
+    {I_SHR, 2, {REGMEM|BITS16,IMMEDIATE,0}, "\320\300\1\xC1\205\25", IF_286|IF_SB},
+    {I_SHR, 2, {REGMEM|BITS32,UNITY,0}, "\321\300\1\xD1\205", IF_386},
+    {I_SHR, 2, {REGMEM|BITS32,REG_CL,0}, "\321\300\1\xD3\205", IF_386},
+    {I_SHR, 2, {REGMEM|BITS32,IMMEDIATE,0}, "\321\300\1\xC1\205\25", IF_386|IF_SB},
+    {-1}
+};
+
+static struct itemplate instrux_SHRD[] = {
+    {I_SHRD, 3, {MEMORY,REG16,IMMEDIATE}, "\300\320\2\x0F\xAC\101\26", IF_386|IF_SM2},
+    {I_SHRD, 3, {REG16,REG16,IMMEDIATE}, "\300\320\2\x0F\xAC\101\26", IF_386|IF_SM2},
+    {I_SHRD, 3, {MEMORY,REG32,IMMEDIATE}, "\300\321\2\x0F\xAC\101\26", IF_386|IF_SM2},
+    {I_SHRD, 3, {REG32,REG32,IMMEDIATE}, "\300\321\2\x0F\xAC\101\26", IF_386|IF_SM2},
+    {I_SHRD, 3, {MEMORY,REG16,REG_CL}, "\300\320\2\x0F\xAD\101", IF_386|IF_SM},
+    {I_SHRD, 3, {REG16,REG16,REG_CL}, "\300\320\2\x0F\xAD\101", IF_386},
+    {I_SHRD, 3, {MEMORY,REG32,REG_CL}, "\300\321\2\x0F\xAD\101", IF_386|IF_SM},
+    {I_SHRD, 3, {REG32,REG32,REG_CL}, "\300\321\2\x0F\xAD\101", IF_386},
+    {-1}
+};
+
+static struct itemplate instrux_SIDT[] = {
+    {I_SIDT, 1, {MEMORY,0,0}, "\300\2\x0F\x01\201", IF_286|IF_PRIV},
+    {-1}
+};
+
+static struct itemplate instrux_SLDT[] = {
+    {I_SLDT, 1, {MEMORY,0,0}, "\300\1\x0F\17\200", IF_286|IF_PRIV},
+    {I_SLDT, 1, {MEMORY|BITS16,0,0}, "\300\1\x0F\17\200", IF_286|IF_PRIV},
+    {I_SLDT, 1, {REG16,0,0}, "\300\1\x0F\17\200", IF_286|IF_PRIV},
+    {-1}
+};
+
+static struct itemplate instrux_SMI[] = {
+    {I_SMI, 0, {0,0,0}, "\1\xF1", IF_386|IF_UNDOC},
+    {-1}
+};
+
+static struct itemplate instrux_SMSW[] = {
+    {I_SMSW, 1, {MEMORY,0,0}, "\300\2\x0F\x01\204", IF_286|IF_PRIV},
+    {I_SMSW, 1, {MEMORY|BITS16,0,0}, "\300\2\x0F\x01\204", IF_286|IF_PRIV},
+    {I_SMSW, 1, {REG16,0,0}, "\300\2\x0F\x01\204", IF_286|IF_PRIV},
+    {-1}
+};
+
+static struct itemplate instrux_STC[] = {
+    {I_STC, 0, {0,0,0}, "\1\xF9", IF_8086},
+    {-1}
+};
+
+static struct itemplate instrux_STD[] = {
+    {I_STD, 0, {0,0,0}, "\1\xFD", IF_8086},
+    {-1}
+};
+
+static struct itemplate instrux_STI[] = {
+    {I_STI, 0, {0,0,0}, "\1\xFB", IF_8086},
+    {-1}
+};
+
+static struct itemplate instrux_STOSB[] = {
+    {I_STOSB, 0, {0,0,0}, "\1\xAA", IF_8086},
+    {-1}
+};
+
+static struct itemplate instrux_STOSD[] = {
+    {I_STOSD, 0, {0,0,0}, "\321\1\xAB", IF_386},
+    {-1}
+};
+
+static struct itemplate instrux_STOSW[] = {
+    {I_STOSW, 0, {0,0,0}, "\320\1\xAB", IF_8086},
+    {-1}
+};
+
+static struct itemplate instrux_STR[] = {
+    {I_STR, 1, {MEMORY,0,0}, "\300\1\x0F\17\201", IF_286|IF_PRIV},
+    {I_STR, 1, {MEMORY|BITS16,0,0}, "\300\1\x0F\17\201", IF_286|IF_PRIV},
+    {I_STR, 1, {REG16,0,0}, "\300\1\x0F\17\201", IF_286|IF_PRIV},
+    {-1}
+};
+
+static struct itemplate instrux_SUB[] = {
+    {I_SUB, 2, {MEMORY,REG8,0}, "\300\1\x28\101", IF_8086|IF_SM},
+    {I_SUB, 2, {REG8,REG8,0}, "\300\1\x28\101", IF_8086},
+    {I_SUB, 2, {MEMORY,REG16,0}, "\320\300\1\x29\101", IF_8086|IF_SM},
+    {I_SUB, 2, {REG16,REG16,0}, "\320\300\1\x29\101", IF_8086},
+    {I_SUB, 2, {MEMORY,REG32,0}, "\321\300\1\x29\101", IF_386|IF_SM},
+    {I_SUB, 2, {REG32,REG32,0}, "\321\300\1\x29\101", IF_386},
+    {I_SUB, 2, {REG8,MEMORY,0}, "\301\1\x2A\110", IF_8086|IF_SM},
+    {I_SUB, 2, {REG8,REG8,0}, "\301\1\x2A\110", IF_8086},
+    {I_SUB, 2, {REG16,MEMORY,0}, "\320\301\1\x2B\110", IF_8086|IF_SM},
+    {I_SUB, 2, {REG16,REG16,0}, "\320\301\1\x2B\110", IF_8086},
+    {I_SUB, 2, {REG32,MEMORY,0}, "\321\301\1\x2B\110", IF_386|IF_SM},
+    {I_SUB, 2, {REG32,REG32,0}, "\321\301\1\x2B\110", IF_386},
+    {I_SUB, 2, {REGMEM|BITS16,IMMEDIATE|BITS8,0}, "\320\300\1\x83\205\15", IF_8086},
+    {I_SUB, 2, {REGMEM|BITS32,IMMEDIATE|BITS8,0}, "\321\300\1\x83\205\15", IF_386},
+    {I_SUB, 2, {REG_AL,IMMEDIATE,0}, "\1\x2C\21", IF_8086|IF_SM},
+    {I_SUB, 2, {REG_AX,IMMEDIATE,0}, "\320\1\x2D\31", IF_8086|IF_SM},
+    {I_SUB, 2, {REG_EAX,IMMEDIATE,0}, "\321\1\x2D\41", IF_386|IF_SM},
+    {I_SUB, 2, {REGMEM|BITS8,IMMEDIATE,0}, "\300\1\x80\205\21", IF_8086|IF_SM},
+    {I_SUB, 2, {REGMEM|BITS16,IMMEDIATE,0}, "\320\300\1\x81\205\31", IF_8086|IF_SM},
+    {I_SUB, 2, {REGMEM|BITS32,IMMEDIATE,0}, "\321\300\1\x81\205\41", IF_386|IF_SM},
+    {I_SUB, 2, {MEMORY,IMMEDIATE|BITS8,0}, "\300\1\x80\205\21", IF_8086|IF_SM},
+    {I_SUB, 2, {MEMORY,IMMEDIATE|BITS16,0}, "\320\300\1\x81\205\31", IF_8086|IF_SM},
+    {I_SUB, 2, {MEMORY,IMMEDIATE|BITS32,0}, "\321\300\1\x81\205\41", IF_386|IF_SM},
+    {-1}
+};
+
+static struct itemplate instrux_TEST[] = {
+    {I_TEST, 2, {MEMORY,REG8,0}, "\300\1\x84\101", IF_8086|IF_SM},
+    {I_TEST, 2, {REG8,REG8,0}, "\300\1\x84\101", IF_8086},
+    {I_TEST, 2, {MEMORY,REG16,0}, "\320\300\1\x85\101", IF_8086|IF_SM},
+    {I_TEST, 2, {REG16,REG16,0}, "\320\300\1\x85\101", IF_8086},
+    {I_TEST, 2, {MEMORY,REG32,0}, "\321\300\1\x85\101", IF_386|IF_SM},
+    {I_TEST, 2, {REG32,REG32,0}, "\321\300\1\x85\101", IF_386},
+    {I_TEST, 2, {REG_AL,IMMEDIATE,0}, "\1\xA8\21", IF_8086|IF_SM},
+    {I_TEST, 2, {REG_AX,IMMEDIATE,0}, "\320\1\xA9\31", IF_8086|IF_SM},
+    {I_TEST, 2, {REG_EAX,IMMEDIATE,0}, "\321\1\xA9\41", IF_386|IF_SM},
+    {I_TEST, 2, {REGMEM|BITS8,IMMEDIATE,0}, "\300\1\xF6\200\21", IF_8086|IF_SM},
+    {I_TEST, 2, {REGMEM|BITS16,IMMEDIATE,0}, "\320\300\1\xF7\200\31", IF_8086|IF_SM},
+    {I_TEST, 2, {REGMEM|BITS32,IMMEDIATE,0}, "\321\300\1\xF7\200\41", IF_386|IF_SM},
+    {I_TEST, 2, {MEMORY,IMMEDIATE|BITS8,0}, "\300\1\xF6\200\21", IF_8086|IF_SM},
+    {I_TEST, 2, {MEMORY,IMMEDIATE|BITS16,0}, "\320\300\1\xF7\200\31", IF_8086|IF_SM},
+    {I_TEST, 2, {MEMORY,IMMEDIATE|BITS32,0}, "\321\300\1\xF7\200\41", IF_386|IF_SM},
+    {-1}
+};
+
+static struct itemplate instrux_UMOV[] = {
+    {I_UMOV, 2, {MEMORY,REG8,0}, "\300\2\x0F\x10\101", IF_386|IF_UNDOC|IF_SM},
+    {I_UMOV, 2, {REG8,REG8,0}, "\300\2\x0F\x10\101", IF_386|IF_UNDOC},
+    {I_UMOV, 2, {MEMORY,REG16,0}, "\320\300\2\x0F\x11\101", IF_386|IF_UNDOC|IF_SM},
+    {I_UMOV, 2, {REG16,REG16,0}, "\320\300\2\x0F\x11\101", IF_386|IF_UNDOC},
+    {I_UMOV, 2, {MEMORY,REG32,0}, "\321\300\2\x0F\x11\101", IF_386|IF_UNDOC|IF_SM},
+    {I_UMOV, 2, {REG32,REG32,0}, "\321\300\2\x0F\x11\101", IF_386|IF_UNDOC},
+    {I_UMOV, 2, {REG8,MEMORY,0}, "\301\2\x0F\x12\110", IF_386|IF_UNDOC|IF_SM},
+    {I_UMOV, 2, {REG8,REG8,0}, "\301\2\x0F\x12\110", IF_386|IF_UNDOC},
+    {I_UMOV, 2, {REG16,MEMORY,0}, "\320\301\2\x0F\x13\110", IF_386|IF_UNDOC|IF_SM},
+    {I_UMOV, 2, {REG16,REG16,0}, "\320\301\2\x0F\x13\110", IF_386|IF_UNDOC},
+    {I_UMOV, 2, {REG32,MEMORY,0}, "\321\301\2\x0F\x13\110", IF_386|IF_UNDOC|IF_SM},
+    {I_UMOV, 2, {REG32,REG32,0}, "\321\301\2\x0F\x13\110", IF_386|IF_UNDOC},
+    {-1}
+};
+
+static struct itemplate instrux_VERR[] = {
+    {I_VERR, 1, {MEMORY,0,0}, "\300\1\x0F\17\204", IF_286|IF_PRIV},
+    {I_VERR, 1, {MEMORY|BITS16,0,0}, "\300\1\x0F\17\204", IF_286|IF_PRIV},
+    {I_VERR, 1, {REG16,0,0}, "\300\1\x0F\17\204", IF_286|IF_PRIV},
+    {-1}
+};
+
+static struct itemplate instrux_VERW[] = {
+    {I_VERW, 1, {MEMORY,0,0}, "\300\1\x0F\17\205", IF_286|IF_PRIV},
+    {I_VERW, 1, {MEMORY|BITS16,0,0}, "\300\1\x0F\17\205", IF_286|IF_PRIV},
+    {I_VERW, 1, {REG16,0,0}, "\300\1\x0F\17\205", IF_286|IF_PRIV},
+    {-1}
+};
+
+static struct itemplate instrux_WAIT[] = {
+    {I_WAIT, 0, {0,0,0}, "\1\x9B", IF_8086},
+    {-1}
+};
+
+static struct itemplate instrux_WBINVD[] = {
+    {I_WBINVD, 0, {0,0,0}, "\2\x0F\x09", IF_486},
+    {-1}
+};
+
+static struct itemplate instrux_WRMSR[] = {
+    {I_WRMSR, 0, {0,0,0}, "\2\x0F\x30", IF_PENT},
+    {-1}
+};
+
+static struct itemplate instrux_XADD[] = {
+    {I_XADD, 2, {MEMORY,REG8,0}, "\300\2\x0F\xC0\101", IF_486|IF_SM},
+    {I_XADD, 2, {REG8,REG8,0}, "\300\2\x0F\xC0\101", IF_486},
+    {I_XADD, 2, {MEMORY,REG16,0}, "\320\300\2\x0F\xC1\101", IF_486|IF_SM},
+    {I_XADD, 2, {REG16,REG16,0}, "\320\300\2\x0F\xC1\101", IF_486},
+    {I_XADD, 2, {MEMORY,REG32,0}, "\321\300\2\x0F\xC1\101", IF_486|IF_SM},
+    {I_XADD, 2, {REG32,REG32,0}, "\321\300\2\x0F\xC1\101", IF_486},
+    {-1}
+};
+
+static struct itemplate instrux_XBTS[] = {
+    {I_XBTS, 2, {REG16,MEMORY,0}, "\320\301\2\x0F\xA6\110", IF_386|IF_SW|IF_UNDOC},
+    {I_XBTS, 2, {REG16,REG16,0}, "\320\301\2\x0F\xA6\110", IF_386|IF_UNDOC},
+    {I_XBTS, 2, {REG32,MEMORY,0}, "\321\301\2\x0F\xA6\110", IF_386|IF_SD|IF_UNDOC},
+    {I_XBTS, 2, {REG32,REG32,0}, "\321\301\2\x0F\xA6\110", IF_386|IF_UNDOC},
+    {-1}
+};
+
+static struct itemplate instrux_XCHG[] = {
+    {I_XCHG, 2, {REG_AX,REG16,0}, "\320\11\x90", IF_8086},
+    {I_XCHG, 2, {REG_EAX,REG32,0}, "\321\11\x90", IF_386},
+    {I_XCHG, 2, {REG16,REG_AX,0}, "\320\10\x90", IF_8086},
+    {I_XCHG, 2, {REG32,REG_EAX,0}, "\321\10\x90", IF_386},
+    {I_XCHG, 2, {REG8,MEMORY,0}, "\301\1\x86\110", IF_8086|IF_SM},
+    {I_XCHG, 2, {REG8,REG8,0}, "\301\1\x86\110", IF_8086},
+    {I_XCHG, 2, {REG16,MEMORY,0}, "\320\301\1\x87\110", IF_8086|IF_SM},
+    {I_XCHG, 2, {REG16,REG16,0}, "\320\301\1\x87\110", IF_8086},
+    {I_XCHG, 2, {REG32,MEMORY,0}, "\321\301\1\x87\110", IF_386|IF_SM},
+    {I_XCHG, 2, {REG32,REG32,0}, "\321\301\1\x87\110", IF_386},
+    {I_XCHG, 2, {MEMORY,REG8,0}, "\300\1\x86\101", IF_8086|IF_SM},
+    {I_XCHG, 2, {REG8,REG8,0}, "\300\1\x86\101", IF_8086},
+    {I_XCHG, 2, {MEMORY,REG16,0}, "\320\300\1\x87\101", IF_8086|IF_SM},
+    {I_XCHG, 2, {REG16,REG16,0}, "\320\300\1\x87\101", IF_8086},
+    {I_XCHG, 2, {MEMORY,REG32,0}, "\321\300\1\x87\101", IF_386|IF_SM},
+    {I_XCHG, 2, {REG32,REG32,0}, "\321\300\1\x87\101", IF_386},
+    {-1}
+};
+
+static struct itemplate instrux_XLATB[] = {
+    {I_XLATB, 0, {0,0,0}, "\1\xD7", IF_8086},
+    {-1}
+};
+
+static struct itemplate instrux_XOR[] = {
+    {I_XOR, 2, {MEMORY,REG8,0}, "\300\1\x30\101", IF_8086|IF_SM},
+    {I_XOR, 2, {REG8,REG8,0}, "\300\1\x30\101", IF_8086},
+    {I_XOR, 2, {MEMORY,REG16,0}, "\320\300\1\x31\101", IF_8086|IF_SM},
+    {I_XOR, 2, {REG16,REG16,0}, "\320\300\1\x31\101", IF_8086},
+    {I_XOR, 2, {MEMORY,REG32,0}, "\321\300\1\x31\101", IF_386|IF_SM},
+    {I_XOR, 2, {REG32,REG32,0}, "\321\300\1\x31\101", IF_386},
+    {I_XOR, 2, {REG8,MEMORY,0}, "\301\1\x32\110", IF_8086|IF_SM},
+    {I_XOR, 2, {REG8,REG8,0}, "\301\1\x32\110", IF_8086},
+    {I_XOR, 2, {REG16,MEMORY,0}, "\320\301\1\x33\110", IF_8086|IF_SM},
+    {I_XOR, 2, {REG16,REG16,0}, "\320\301\1\x33\110", IF_8086},
+    {I_XOR, 2, {REG32,MEMORY,0}, "\321\301\1\x33\110", IF_386|IF_SM},
+    {I_XOR, 2, {REG32,REG32,0}, "\321\301\1\x33\110", IF_386},
+    {I_XOR, 2, {REGMEM|BITS16,IMMEDIATE|BITS8,0}, "\320\300\1\x83\206\15", IF_8086},
+    {I_XOR, 2, {REGMEM|BITS32,IMMEDIATE|BITS8,0}, "\321\300\1\x83\206\15", IF_386},
+    {I_XOR, 2, {REG_AL,IMMEDIATE,0}, "\1\x34\21", IF_8086|IF_SM},
+    {I_XOR, 2, {REG_AX,IMMEDIATE,0}, "\320\1\x35\31", IF_8086|IF_SM},
+    {I_XOR, 2, {REG_EAX,IMMEDIATE,0}, "\321\1\x35\41", IF_386|IF_SM},
+    {I_XOR, 2, {REGMEM|BITS8,IMMEDIATE,0}, "\300\1\x80\206\21", IF_8086|IF_SM},
+    {I_XOR, 2, {REGMEM|BITS16,IMMEDIATE,0}, "\320\300\1\x81\206\31", IF_8086|IF_SM},
+    {I_XOR, 2, {REGMEM|BITS32,IMMEDIATE,0}, "\321\300\1\x81\206\41", IF_386|IF_SM},
+    {I_XOR, 2, {MEMORY,IMMEDIATE|BITS8,0}, "\300\1\x80\206\21", IF_8086|IF_SM},
+    {I_XOR, 2, {MEMORY,IMMEDIATE|BITS16,0}, "\320\300\1\x81\206\31", IF_8086|IF_SM},
+    {I_XOR, 2, {MEMORY,IMMEDIATE|BITS32,0}, "\321\300\1\x81\206\41", IF_386|IF_SM},
+    {-1}
+};
+
+static struct itemplate instrux_CMOVcc[] = {
+    {I_CMOVcc, 2, {REG16,MEMORY,0}, "\320\301\1\x0F\330\x40\110", IF_P6|IF_SM},
+    {I_CMOVcc, 2, {REG16,REG16,0}, "\320\301\1\x0F\330\x40\110", IF_P6},
+    {I_CMOVcc, 2, {REG32,MEMORY,0}, "\321\301\1\x0F\330\x40\110", IF_P6|IF_SM},
+    {I_CMOVcc, 2, {REG32,REG32,0}, "\321\301\1\x0F\330\x40\110", IF_P6},
+    {-1}
+};
+
+static struct itemplate instrux_Jcc[] = {
+    {I_Jcc, 1, {IMMEDIATE|NEAR,0,0}, "\322\1\x0F\330\x80\64", IF_386},
+    {I_Jcc, 1, {IMMEDIATE,0,0}, "\330\x70\50", IF_8086},
+    {I_Jcc, 1, {IMMEDIATE|SHORT,0,0}, "\330\x70\50", IF_8086},
+    {-1}
+};
+
+static struct itemplate instrux_SETcc[] = {
+    {I_SETcc, 1, {MEMORY,0,0}, "\300\1\x0F\330\x90\200", IF_386|IF_SB},
+    {I_SETcc, 1, {REG8,0,0}, "\300\1\x0F\330\x90\200", IF_386},
+    {-1}
+};
+
+struct itemplate *nasm_instructions[] = {
+    instrux_AAA,
+    instrux_AAD,
+    instrux_AAM,
+    instrux_AAS,
+    instrux_ADC,
+    instrux_ADD,
+    instrux_AND,
+    instrux_ARPL,
+    instrux_BOUND,
+    instrux_BSF,
+    instrux_BSR,
+    instrux_BSWAP,
+    instrux_BT,
+    instrux_BTC,
+    instrux_BTR,
+    instrux_BTS,
+    instrux_CALL,
+    instrux_CBW,
+    instrux_CDQ,
+    instrux_CLC,
+    instrux_CLD,
+    instrux_CLI,
+    instrux_CLTS,
+    instrux_CMC,
+    instrux_CMP,
+    instrux_CMPSB,
+    instrux_CMPSD,
+    instrux_CMPSW,
+    instrux_CMPXCHG,
+    instrux_CMPXCHG486,
+    instrux_CMPXCHG8B,
+    instrux_CPUID,
+    instrux_CWD,
+    instrux_CWDE,
+    instrux_DAA,
+    instrux_DAS,
+    instrux_DB,
+    instrux_DD,
+    instrux_DEC,
+    instrux_DIV,
+    instrux_DQ,
+    instrux_DT,
+    instrux_DW,
+    instrux_EMMS,
+    instrux_ENTER,
+    instrux_EQU,
+    instrux_F2XM1,
+    instrux_FABS,
+    instrux_FADD,
+    instrux_FADDP,
+    instrux_FBLD,
+    instrux_FBSTP,
+    instrux_FCHS,
+    instrux_FCLEX,
+    instrux_FCMOVB,
+    instrux_FCMOVBE,
+    instrux_FCMOVE,
+    instrux_FCMOVNB,
+    instrux_FCMOVNBE,
+    instrux_FCMOVNE,
+    instrux_FCMOVNU,
+    instrux_FCMOVU,
+    instrux_FCOM,
+    instrux_FCOMI,
+    instrux_FCOMIP,
+    instrux_FCOMP,
+    instrux_FCOMPP,
+    instrux_FCOS,
+    instrux_FDECSTP,
+    instrux_FDISI,
+    instrux_FDIV,
+    instrux_FDIVP,
+    instrux_FDIVR,
+    instrux_FDIVRP,
+    instrux_FENI,
+    instrux_FFREE,
+    instrux_FIADD,
+    instrux_FICOM,
+    instrux_FICOMP,
+    instrux_FIDIV,
+    instrux_FIDIVR,
+    instrux_FILD,
+    instrux_FIMUL,
+    instrux_FINCSTP,
+    instrux_FINIT,
+    instrux_FIST,
+    instrux_FISTP,
+    instrux_FISUB,
+    instrux_FISUBR,
+    instrux_FLD,
+    instrux_FLD1,
+    instrux_FLDCW,
+    instrux_FLDENV,
+    instrux_FLDL2E,
+    instrux_FLDL2T,
+    instrux_FLDLG2,
+    instrux_FLDLN2,
+    instrux_FLDPI,
+    instrux_FLDZ,
+    instrux_FMUL,
+    instrux_FMULP,
+    instrux_FNCLEX,
+    instrux_FNDISI,
+    instrux_FNENI,
+    instrux_FNINIT,
+    instrux_FNOP,
+    instrux_FNSAVE,
+    instrux_FNSTCW,
+    instrux_FNSTENV,
+    instrux_FNSTSW,
+    instrux_FPATAN,
+    instrux_FPREM,
+    instrux_FPREM1,
+    instrux_FPTAN,
+    instrux_FRNDINT,
+    instrux_FRSTOR,
+    instrux_FSAVE,
+    instrux_FSCALE,
+    instrux_FSETPM,
+    instrux_FSIN,
+    instrux_FSINCOS,
+    instrux_FSQRT,
+    instrux_FST,
+    instrux_FSTCW,
+    instrux_FSTENV,
+    instrux_FSTP,
+    instrux_FSTSW,
+    instrux_FSUB,
+    instrux_FSUBP,
+    instrux_FSUBR,
+    instrux_FSUBRP,
+    instrux_FTST,
+    instrux_FUCOM,
+    instrux_FUCOMI,
+    instrux_FUCOMIP,
+    instrux_FUCOMP,
+    instrux_FUCOMPP,
+    instrux_FXAM,
+    instrux_FXCH,
+    instrux_FXTRACT,
+    instrux_FYL2X,
+    instrux_FYL2XP1,
+    instrux_HLT,
+    instrux_IBTS,
+    instrux_ICEBP,
+    instrux_IDIV,
+    instrux_IMUL,
+    instrux_IN,
+    instrux_INC,
+    instrux_INCBIN,
+    instrux_INSB,
+    instrux_INSD,
+    instrux_INSW,
+    instrux_INT,
+    instrux_INT01,
+    instrux_INT1,
+    instrux_INT3,
+    instrux_INTO,
+    instrux_INVD,
+    instrux_INVLPG,
+    instrux_IRET,
+    instrux_IRETD,
+    instrux_IRETW,
+    instrux_JCXZ,
+    instrux_JECXZ,
+    instrux_JMP,
+    instrux_LAHF,
+    instrux_LAR,
+    instrux_LDS,
+    instrux_LEA,
+    instrux_LEAVE,
+    instrux_LES,
+    instrux_LFS,
+    instrux_LGDT,
+    instrux_LGS,
+    instrux_LIDT,
+    instrux_LLDT,
+    instrux_LMSW,
+    instrux_LOADALL,
+    instrux_LOADALL286,
+    instrux_LODSB,
+    instrux_LODSD,
+    instrux_LODSW,
+    instrux_LOOP,
+    instrux_LOOPE,
+    instrux_LOOPNE,
+    instrux_LOOPNZ,
+    instrux_LOOPZ,
+    instrux_LSL,
+    instrux_LSS,
+    instrux_LTR,
+    instrux_MOV,
+    instrux_MOVD,
+    instrux_MOVQ,
+    instrux_MOVSB,
+    instrux_MOVSD,
+    instrux_MOVSW,
+    instrux_MOVSX,
+    instrux_MOVZX,
+    instrux_MUL,
+    instrux_NEG,
+    instrux_NOP,
+    instrux_NOT,
+    instrux_OR,
+    instrux_OUT,
+    instrux_OUTSB,
+    instrux_OUTSD,
+    instrux_OUTSW,
+    instrux_PACKSSDW,
+    instrux_PACKSSWB,
+    instrux_PACKUSWB,
+    instrux_PADDB,
+    instrux_PADDD,
+    instrux_PADDSB,
+    instrux_PADDSIW,
+    instrux_PADDSW,
+    instrux_PADDUSB,
+    instrux_PADDUSW,
+    instrux_PADDW,
+    instrux_PAND,
+    instrux_PANDN,
+    instrux_PAVEB,
+    instrux_PCMPEQB,
+    instrux_PCMPEQD,
+    instrux_PCMPEQW,
+    instrux_PCMPGTB,
+    instrux_PCMPGTD,
+    instrux_PCMPGTW,
+    instrux_PDISTIB,
+    instrux_PMACHRIW,
+    instrux_PMADDWD,
+    instrux_PMAGW,
+    instrux_PMULHRW,
+    instrux_PMULHRIW,
+    instrux_PMULHW,
+    instrux_PMULLW,
+    instrux_PMVGEZB,
+    instrux_PMVLZB,
+    instrux_PMVNZB,
+    instrux_PMVZB,
+    instrux_POP,
+    instrux_POPA,
+    instrux_POPAD,
+    instrux_POPAW,
+    instrux_POPF,
+    instrux_POPFD,
+    instrux_POPFW,
+    instrux_POR,
+    instrux_PSLLD,
+    instrux_PSLLQ,
+    instrux_PSLLW,
+    instrux_PSRAD,
+    instrux_PSRAW,
+    instrux_PSRLD,
+    instrux_PSRLQ,
+    instrux_PSRLW,
+    instrux_PSUBB,
+    instrux_PSUBD,
+    instrux_PSUBSB,
+    instrux_PSUBSIW,
+    instrux_PSUBSW,
+    instrux_PSUBUSB,
+    instrux_PSUBUSW,
+    instrux_PSUBW,
+    instrux_PUNPCKHBW,
+    instrux_PUNPCKHDQ,
+    instrux_PUNPCKHWD,
+    instrux_PUNPCKLBW,
+    instrux_PUNPCKLDQ,
+    instrux_PUNPCKLWD,
+    instrux_PUSH,
+    instrux_PUSHA,
+    instrux_PUSHAD,
+    instrux_PUSHAW,
+    instrux_PUSHF,
+    instrux_PUSHFD,
+    instrux_PUSHFW,
+    instrux_PXOR,
+    instrux_RCL,
+    instrux_RCR,
+    instrux_RDMSR,
+    instrux_RDPMC,
+    instrux_RDTSC,
+    instrux_RESB,
+    instrux_RESD,
+    instrux_RESQ,
+    instrux_REST,
+    instrux_RESW,
+    instrux_RET,
+    instrux_RETF,
+    instrux_RETN,
+    instrux_ROL,
+    instrux_ROR,
+    instrux_RSM,
+    instrux_SAHF,
+    instrux_SAL,
+    instrux_SALC,
+    instrux_SAR,
+    instrux_SBB,
+    instrux_SCASB,
+    instrux_SCASD,
+    instrux_SCASW,
+    instrux_SGDT,
+    instrux_SHL,
+    instrux_SHLD,
+    instrux_SHR,
+    instrux_SHRD,
+    instrux_SIDT,
+    instrux_SLDT,
+    instrux_SMI,
+    instrux_SMSW,
+    instrux_STC,
+    instrux_STD,
+    instrux_STI,
+    instrux_STOSB,
+    instrux_STOSD,
+    instrux_STOSW,
+    instrux_STR,
+    instrux_SUB,
+    instrux_TEST,
+    instrux_UMOV,
+    instrux_VERR,
+    instrux_VERW,
+    instrux_WAIT,
+    instrux_WBINVD,
+    instrux_WRMSR,
+    instrux_XADD,
+    instrux_XBTS,
+    instrux_XCHG,
+    instrux_XLATB,
+    instrux_XOR,
+    instrux_CMOVcc,
+    instrux_Jcc,
+    instrux_SETcc,
+};
diff --git a/i386/nasm/insnsd.c b/i386/nasm/insnsd.c
new file mode 100644 (file)
index 0000000..476405f
--- /dev/null
@@ -0,0 +1,3438 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
+ * Reserved.  This file contains Original Code and/or Modifications of
+ * Original Code as defined in and that are subject to the Apple Public
+ * Source License Version 1.1 (the "License").  You may not use this file
+ * except in compliance with the License.  Please obtain a copy of the
+ * License at http://www.apple.com/publicsource and read it before using
+ * this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/* This file auto-generated from insns.dat by insns.pl - don't edit it */
+
+#include <stdio.h>
+#include "nasm.h"
+#include "insns.h"
+
+static struct itemplate instrux[] = {
+    {I_AAA, 0, {0,0,0}, "\1\x37", IF_8086},
+    {I_AAD, 0, {0,0,0}, "\2\xD5\x0A", IF_8086},
+    {I_AAD, 1, {IMMEDIATE,0,0}, "\1\xD5\24", IF_8086},
+    {I_AAM, 0, {0,0,0}, "\2\xD4\x0A", IF_8086},
+    {I_AAM, 1, {IMMEDIATE,0,0}, "\1\xD4\24", IF_8086},
+    {I_AAS, 0, {0,0,0}, "\1\x3F", IF_8086},
+    {I_ADC, 2, {MEMORY,REG8,0}, "\300\1\x10\101", IF_8086|IF_SM},
+    {I_ADC, 2, {REG8,REG8,0}, "\300\1\x10\101", IF_8086},
+    {I_ADC, 2, {MEMORY,REG16,0}, "\320\300\1\x11\101", IF_8086|IF_SM},
+    {I_ADC, 2, {REG16,REG16,0}, "\320\300\1\x11\101", IF_8086},
+    {I_ADC, 2, {MEMORY,REG32,0}, "\321\300\1\x11\101", IF_386|IF_SM},
+    {I_ADC, 2, {REG32,REG32,0}, "\321\300\1\x11\101", IF_386},
+    {I_ADC, 2, {REG8,MEMORY,0}, "\301\1\x12\110", IF_8086|IF_SM},
+    {I_ADC, 2, {REG8,REG8,0}, "\301\1\x12\110", IF_8086},
+    {I_ADC, 2, {REG16,MEMORY,0}, "\320\301\1\x13\110", IF_8086|IF_SM},
+    {I_ADC, 2, {REG16,REG16,0}, "\320\301\1\x13\110", IF_8086},
+    {I_ADC, 2, {REG32,MEMORY,0}, "\321\301\1\x13\110", IF_386|IF_SM},
+    {I_ADC, 2, {REG32,REG32,0}, "\321\301\1\x13\110", IF_386},
+    {I_ADC, 2, {REGMEM|BITS16,IMMEDIATE|BITS8,0}, "\320\300\1\x83\202\15", IF_8086},
+    {I_ADC, 2, {REGMEM|BITS32,IMMEDIATE|BITS8,0}, "\321\300\1\x83\202\15", IF_386},
+    {I_ADC, 2, {REG_AL,IMMEDIATE,0}, "\1\x14\21", IF_8086|IF_SM},
+    {I_ADC, 2, {REG_AX,IMMEDIATE,0}, "\320\1\x15\31", IF_8086|IF_SM},
+    {I_ADC, 2, {REG_EAX,IMMEDIATE,0}, "\321\1\x15\41", IF_386|IF_SM},
+    {I_ADC, 2, {REGMEM|BITS8,IMMEDIATE,0}, "\300\1\x80\202\21", IF_8086|IF_SM},
+    {I_ADC, 2, {REGMEM|BITS16,IMMEDIATE,0}, "\320\300\1\x81\202\31", IF_8086|IF_SM},
+    {I_ADC, 2, {REGMEM|BITS32,IMMEDIATE,0}, "\321\300\1\x81\202\41", IF_386|IF_SM},
+    {I_ADC, 2, {MEMORY,IMMEDIATE|BITS8,0}, "\300\1\x80\202\21", IF_8086|IF_SM},
+    {I_ADC, 2, {MEMORY,IMMEDIATE|BITS16,0}, "\320\300\1\x81\202\31", IF_8086|IF_SM},
+    {I_ADC, 2, {MEMORY,IMMEDIATE|BITS32,0}, "\321\300\1\x81\202\41", IF_386|IF_SM},
+    {I_ADD, 2, {MEMORY,REG8,0}, "\300\17\101", IF_8086|IF_SM},
+    {I_ADD, 2, {REG8,REG8,0}, "\300\17\101", IF_8086},
+    {I_ADD, 2, {MEMORY,REG16,0}, "\320\300\1\x01\101", IF_8086|IF_SM},
+    {I_ADD, 2, {REG16,REG16,0}, "\320\300\1\x01\101", IF_8086},
+    {I_ADD, 2, {MEMORY,REG32,0}, "\321\300\1\x01\101", IF_386|IF_SM},
+    {I_ADD, 2, {REG32,REG32,0}, "\321\300\1\x01\101", IF_386},
+    {I_ADD, 2, {REG8,MEMORY,0}, "\301\1\x02\110", IF_8086|IF_SM},
+    {I_ADD, 2, {REG8,REG8,0}, "\301\1\x02\110", IF_8086},
+    {I_ADD, 2, {REG16,MEMORY,0}, "\320\301\1\x03\110", IF_8086|IF_SM},
+    {I_ADD, 2, {REG16,REG16,0}, "\320\301\1\x03\110", IF_8086},
+    {I_ADD, 2, {REG32,MEMORY,0}, "\321\301\1\x03\110", IF_386|IF_SM},
+    {I_ADD, 2, {REG32,REG32,0}, "\321\301\1\x03\110", IF_386},
+    {I_ADD, 2, {REGMEM|BITS16,IMMEDIATE|BITS8,0}, "\320\300\1\x83\200\15", IF_8086},
+    {I_ADD, 2, {REGMEM|BITS32,IMMEDIATE|BITS8,0}, "\321\300\1\x83\200\15", IF_386},
+    {I_ADD, 2, {REG_AL,IMMEDIATE,0}, "\1\x04\21", IF_8086|IF_SM},
+    {I_ADD, 2, {REG_AX,IMMEDIATE,0}, "\320\1\x05\31", IF_8086|IF_SM},
+    {I_ADD, 2, {REG_EAX,IMMEDIATE,0}, "\321\1\x05\41", IF_386|IF_SM},
+    {I_ADD, 2, {REGMEM|BITS8,IMMEDIATE,0}, "\300\1\x80\200\21", IF_8086|IF_SM},
+    {I_ADD, 2, {REGMEM|BITS16,IMMEDIATE,0}, "\320\300\1\x81\200\31", IF_8086|IF_SM},
+    {I_ADD, 2, {REGMEM|BITS32,IMMEDIATE,0}, "\321\300\1\x81\200\41", IF_386|IF_SM},
+    {I_ADD, 2, {MEMORY,IMMEDIATE|BITS8,0}, "\300\1\x80\200\21", IF_8086|IF_SM},
+    {I_ADD, 2, {MEMORY,IMMEDIATE|BITS16,0}, "\320\300\1\x81\200\31", IF_8086|IF_SM},
+    {I_ADD, 2, {MEMORY,IMMEDIATE|BITS32,0}, "\321\300\1\x81\200\41", IF_386|IF_SM},
+    {I_AND, 2, {MEMORY,REG8,0}, "\300\1\x20\101", IF_8086|IF_SM},
+    {I_AND, 2, {REG8,REG8,0}, "\300\1\x20\101", IF_8086},
+    {I_AND, 2, {MEMORY,REG16,0}, "\320\300\1\x21\101", IF_8086|IF_SM},
+    {I_AND, 2, {REG16,REG16,0}, "\320\300\1\x21\101", IF_8086},
+    {I_AND, 2, {MEMORY,REG32,0}, "\321\300\1\x21\101", IF_386|IF_SM},
+    {I_AND, 2, {REG32,REG32,0}, "\321\300\1\x21\101", IF_386},
+    {I_AND, 2, {REG8,MEMORY,0}, "\301\1\x22\110", IF_8086|IF_SM},
+    {I_AND, 2, {REG8,REG8,0}, "\301\1\x22\110", IF_8086},
+    {I_AND, 2, {REG16,MEMORY,0}, "\320\301\1\x23\110", IF_8086|IF_SM},
+    {I_AND, 2, {REG16,REG16,0}, "\320\301\1\x23\110", IF_8086},
+    {I_AND, 2, {REG32,MEMORY,0}, "\321\301\1\x23\110", IF_386|IF_SM},
+    {I_AND, 2, {REG32,REG32,0}, "\321\301\1\x23\110", IF_386},
+    {I_AND, 2, {REGMEM|BITS16,IMMEDIATE|BITS8,0}, "\320\300\1\x83\204\15", IF_8086},
+    {I_AND, 2, {REGMEM|BITS32,IMMEDIATE|BITS8,0}, "\321\300\1\x83\204\15", IF_386},
+    {I_AND, 2, {REG_AL,IMMEDIATE,0}, "\1\x24\21", IF_8086|IF_SM},
+    {I_AND, 2, {REG_AX,IMMEDIATE,0}, "\320\1\x25\31", IF_8086|IF_SM},
+    {I_AND, 2, {REG_EAX,IMMEDIATE,0}, "\321\1\x25\41", IF_386|IF_SM},
+    {I_AND, 2, {REGMEM|BITS8,IMMEDIATE,0}, "\300\1\x80\204\21", IF_8086|IF_SM},
+    {I_AND, 2, {REGMEM|BITS16,IMMEDIATE,0}, "\320\300\1\x81\204\31", IF_8086|IF_SM},
+    {I_AND, 2, {REGMEM|BITS32,IMMEDIATE,0}, "\321\300\1\x81\204\41", IF_386|IF_SM},
+    {I_AND, 2, {MEMORY,IMMEDIATE|BITS8,0}, "\300\1\x80\204\21", IF_8086|IF_SM},
+    {I_AND, 2, {MEMORY,IMMEDIATE|BITS16,0}, "\320\300\1\x81\204\31", IF_8086|IF_SM},
+    {I_AND, 2, {MEMORY,IMMEDIATE|BITS32,0}, "\321\300\1\x81\204\41", IF_386|IF_SM},
+    {I_ARPL, 2, {MEMORY,REG16,0}, "\300\1\x63\101", IF_286|IF_PRIV|IF_SM},
+    {I_ARPL, 2, {REG16,REG16,0}, "\300\1\x63\101", IF_286|IF_PRIV},
+    {I_BOUND, 2, {REG16,MEMORY,0}, "\320\301\1\x62\110", IF_186},
+    {I_BOUND, 2, {REG32,MEMORY,0}, "\321\301\1\x62\110", IF_386},
+    {I_BSF, 2, {REG16,MEMORY,0}, "\320\301\2\x0F\xBC\110", IF_386|IF_SM},
+    {I_BSF, 2, {REG16,REG16,0}, "\320\301\2\x0F\xBC\110", IF_386},
+    {I_BSF, 2, {REG32,MEMORY,0}, "\321\301\2\x0F\xBC\110", IF_386|IF_SM},
+    {I_BSF, 2, {REG32,REG32,0}, "\321\301\2\x0F\xBC\110", IF_386},
+    {I_BSR, 2, {REG16,MEMORY,0}, "\320\301\2\x0F\xBD\110", IF_386|IF_SM},
+    {I_BSR, 2, {REG16,REG16,0}, "\320\301\2\x0F\xBD\110", IF_386},
+    {I_BSR, 2, {REG32,MEMORY,0}, "\321\301\2\x0F\xBD\110", IF_386|IF_SM},
+    {I_BSR, 2, {REG32,REG32,0}, "\321\301\2\x0F\xBD\110", IF_386},
+    {I_BSWAP, 1, {REG32,0,0}, "\321\1\x0F\10\xC8", IF_486},
+    {I_BT, 2, {MEMORY,REG16,0}, "\320\300\2\x0F\xA3\101", IF_386|IF_SM},
+    {I_BT, 2, {REG16,REG16,0}, "\320\300\2\x0F\xA3\101", IF_386},
+    {I_BT, 2, {MEMORY,REG32,0}, "\321\300\2\x0F\xA3\101", IF_386|IF_SM},
+    {I_BT, 2, {REG32,REG32,0}, "\321\300\2\x0F\xA3\101", IF_386},
+    {I_BT, 2, {REGMEM|BITS16,IMMEDIATE,0}, "\320\300\2\x0F\xBA\204\25", IF_386},
+    {I_BT, 2, {REGMEM|BITS32,IMMEDIATE,0}, "\321\300\2\x0F\xBA\204\25", IF_386},
+    {I_BTC, 2, {MEMORY,REG16,0}, "\320\300\2\x0F\xBB\101", IF_386|IF_SM},
+    {I_BTC, 2, {REG16,REG16,0}, "\320\300\2\x0F\xBB\101", IF_386},
+    {I_BTC, 2, {MEMORY,REG32,0}, "\321\300\2\x0F\xBB\101", IF_386|IF_SM},
+    {I_BTC, 2, {REG32,REG32,0}, "\321\300\2\x0F\xBB\101", IF_386},
+    {I_BTC, 2, {REGMEM|BITS16,IMMEDIATE,0}, "\320\300\2\x0F\xBA\207\25", IF_386},
+    {I_BTC, 2, {REGMEM|BITS32,IMMEDIATE,0}, "\321\300\2\x0F\xBA\207\25", IF_386},
+    {I_BTR, 2, {MEMORY,REG16,0}, "\320\300\2\x0F\xB3\101", IF_386|IF_SM},
+    {I_BTR, 2, {REG16,REG16,0}, "\320\300\2\x0F\xB3\101", IF_386},
+    {I_BTR, 2, {MEMORY,REG32,0}, "\321\300\2\x0F\xB3\101", IF_386|IF_SM},
+    {I_BTR, 2, {REG32,REG32,0}, "\321\300\2\x0F\xB3\101", IF_386},
+    {I_BTR, 2, {REGMEM|BITS16,IMMEDIATE,0}, "\320\300\2\x0F\xBA\206\25", IF_386},
+    {I_BTR, 2, {REGMEM|BITS32,IMMEDIATE,0}, "\321\300\2\x0F\xBA\206\25", IF_386},
+    {I_BTS, 2, {MEMORY,REG16,0}, "\320\300\2\x0F\xAB\101", IF_386|IF_SM},
+    {I_BTS, 2, {REG16,REG16,0}, "\320\300\2\x0F\xAB\101", IF_386},
+    {I_BTS, 2, {MEMORY,REG32,0}, "\321\300\2\x0F\xAB\101", IF_386|IF_SM},
+    {I_BTS, 2, {REG32,REG32,0}, "\321\300\2\x0F\xAB\101", IF_386},
+    {I_BTS, 2, {REGMEM|BITS16,IMMEDIATE,0}, "\320\300\2\x0F\xBA\205\25", IF_386},
+    {I_BTS, 2, {REGMEM|BITS32,IMMEDIATE,0}, "\321\300\2\x0F\xBA\205\25", IF_386},
+    {I_CALL, 1, {IMMEDIATE,0,0}, "\322\1\xE8\64", IF_8086},
+    {I_CALL, 2, {IMMEDIATE|COLON,IMMEDIATE,0}, "\322\1\x9A\35\30", IF_8086},
+    {I_CALL, 2, {IMMEDIATE|BITS16|COLON,IMMEDIATE,0}, "\320\1\x9A\31\30", IF_8086},
+    {I_CALL, 2, {IMMEDIATE|COLON,IMMEDIATE|BITS16,0}, "\320\1\x9A\31\30", IF_8086},
+    {I_CALL, 2, {IMMEDIATE|BITS32|COLON,IMMEDIATE,0}, "\321\1\x9A\41\30", IF_386},
+    {I_CALL, 2, {IMMEDIATE|COLON,IMMEDIATE|BITS32,0}, "\321\1\x9A\41\30", IF_386},
+    {I_CALL, 1, {MEMORY|FAR,0,0}, "\322\300\1\xFF\203", IF_8086},
+    {I_CALL, 1, {MEMORY|BITS16|FAR,0,0}, "\320\300\1\xFF\203", IF_8086},
+    {I_CALL, 1, {MEMORY|BITS32|FAR,0,0}, "\321\300\1\xFF\203", IF_386},
+    {I_CALL, 1, {MEMORY|NEAR,0,0}, "\322\300\1\xFF\202", IF_8086},
+    {I_CALL, 1, {MEMORY|BITS16|NEAR,0,0}, "\320\300\1\xFF\202", IF_8086},
+    {I_CALL, 1, {MEMORY|BITS32|NEAR,0,0}, "\321\300\1\xFF\202", IF_386},
+    {I_CALL, 1, {REG16,0,0}, "\320\300\1\xFF\202", IF_8086},
+    {I_CALL, 1, {REG32,0,0}, "\321\300\1\xFF\202", IF_386},
+    {I_CALL, 1, {MEMORY,0,0}, "\322\300\1\xFF\202", IF_8086},
+    {I_CALL, 1, {MEMORY|BITS16,0,0}, "\320\300\1\xFF\202", IF_8086},
+    {I_CALL, 1, {MEMORY|BITS32,0,0}, "\321\300\1\xFF\202", IF_386},
+    {I_CBW, 0, {0,0,0}, "\320\1\x98", IF_8086},
+    {I_CDQ, 0, {0,0,0}, "\321\1\x99", IF_386},
+    {I_CLC, 0, {0,0,0}, "\1\xF8", IF_8086},
+    {I_CLD, 0, {0,0,0}, "\1\xFC", IF_8086},
+    {I_CLI, 0, {0,0,0}, "\1\xFA", IF_8086},
+    {I_CLTS, 0, {0,0,0}, "\2\x0F\x06", IF_286|IF_PRIV},
+    {I_CMC, 0, {0,0,0}, "\1\xF5", IF_8086},
+    {I_CMP, 2, {MEMORY,REG8,0}, "\300\1\x38\101", IF_8086|IF_SM},
+    {I_CMP, 2, {REG8,REG8,0}, "\300\1\x38\101", IF_8086},
+    {I_CMP, 2, {MEMORY,REG16,0}, "\320\300\1\x39\101", IF_8086|IF_SM},
+    {I_CMP, 2, {REG16,REG16,0}, "\320\300\1\x39\101", IF_8086},
+    {I_CMP, 2, {MEMORY,REG32,0}, "\321\300\1\x39\101", IF_386|IF_SM},
+    {I_CMP, 2, {REG32,REG32,0}, "\321\300\1\x39\101", IF_386},
+    {I_CMP, 2, {REG8,MEMORY,0}, "\301\1\x3A\110", IF_8086|IF_SM},
+    {I_CMP, 2, {REG8,REG8,0}, "\301\1\x3A\110", IF_8086},
+    {I_CMP, 2, {REG16,MEMORY,0}, "\320\301\1\x3B\110", IF_8086|IF_SM},
+    {I_CMP, 2, {REG16,REG16,0}, "\320\301\1\x3B\110", IF_8086},
+    {I_CMP, 2, {REG32,MEMORY,0}, "\321\301\1\x3B\110", IF_386|IF_SM},
+    {I_CMP, 2, {REG32,REG32,0}, "\321\301\1\x3B\110", IF_386},
+    {I_CMP, 2, {REGMEM|BITS16,IMMEDIATE|BITS8,0}, "\320\300\1\x83\207\15", IF_8086},
+    {I_CMP, 2, {REGMEM|BITS32,IMMEDIATE|BITS8,0}, "\321\300\1\x83\207\15", IF_386},
+    {I_CMP, 2, {REG_AL,IMMEDIATE,0}, "\1\x3C\21", IF_8086|IF_SM},
+    {I_CMP, 2, {REG_AX,IMMEDIATE,0}, "\320\1\x3D\31", IF_8086|IF_SM},
+    {I_CMP, 2, {REG_EAX,IMMEDIATE,0}, "\321\1\x3D\41", IF_386|IF_SM},
+    {I_CMP, 2, {REGMEM|BITS8,IMMEDIATE,0}, "\300\1\x80\207\21", IF_8086|IF_SM},
+    {I_CMP, 2, {REGMEM|BITS16,IMMEDIATE,0}, "\320\300\1\x81\207\31", IF_8086|IF_SM},
+    {I_CMP, 2, {REGMEM|BITS32,IMMEDIATE,0}, "\321\300\1\x81\207\41", IF_386|IF_SM},
+    {I_CMP, 2, {MEMORY,IMMEDIATE|BITS8,0}, "\300\1\x80\207\21", IF_8086|IF_SM},
+    {I_CMP, 2, {MEMORY,IMMEDIATE|BITS16,0}, "\320\300\1\x81\207\31", IF_8086|IF_SM},
+    {I_CMP, 2, {MEMORY,IMMEDIATE|BITS32,0}, "\321\300\1\x81\207\41", IF_386|IF_SM},
+    {I_CMPSB, 0, {0,0,0}, "\1\xA6", IF_8086},
+    {I_CMPSD, 0, {0,0,0}, "\321\1\xA7", IF_386},
+    {I_CMPSW, 0, {0,0,0}, "\320\1\xA7", IF_8086},
+    {I_CMPXCHG, 2, {MEMORY,REG8,0}, "\300\2\x0F\xB0\101", IF_PENT|IF_SM},
+    {I_CMPXCHG, 2, {REG8,REG8,0}, "\300\2\x0F\xB0\101", IF_PENT},
+    {I_CMPXCHG, 2, {MEMORY,REG16,0}, "\320\300\2\x0F\xB1\101", IF_PENT|IF_SM},
+    {I_CMPXCHG, 2, {REG16,REG16,0}, "\320\300\2\x0F\xB1\101", IF_PENT},
+    {I_CMPXCHG, 2, {MEMORY,REG32,0}, "\321\300\2\x0F\xB1\101", IF_PENT|IF_SM},
+    {I_CMPXCHG, 2, {REG32,REG32,0}, "\321\300\2\x0F\xB1\101", IF_PENT},
+    {I_CMPXCHG486, 2, {MEMORY,REG8,0}, "\300\2\x0F\xA6\101", IF_486|IF_SM|IF_UNDOC},
+    {I_CMPXCHG486, 2, {REG8,REG8,0}, "\300\2\x0F\xA6\101", IF_486|IF_UNDOC},
+    {I_CMPXCHG486, 2, {MEMORY,REG16,0}, "\320\300\2\x0F\xA7\101", IF_486|IF_SM|IF_UNDOC},
+    {I_CMPXCHG486, 2, {REG16,REG16,0}, "\320\300\2\x0F\xA7\101", IF_486|IF_UNDOC},
+    {I_CMPXCHG486, 2, {MEMORY,REG32,0}, "\321\300\2\x0F\xA7\101", IF_486|IF_SM|IF_UNDOC},
+    {I_CMPXCHG486, 2, {REG32,REG32,0}, "\321\300\2\x0F\xA7\101", IF_486|IF_UNDOC},
+    {I_CMPXCHG8B, 1, {MEMORY,0,0}, "\300\2\x0F\xC7\201", IF_PENT},
+    {I_CPUID, 0, {0,0,0}, "\2\x0F\xA2", IF_PENT},
+    {I_CWD, 0, {0,0,0}, "\320\1\x99", IF_8086},
+    {I_CWDE, 0, {0,0,0}, "\321\1\x98", IF_386},
+    {I_DAA, 0, {0,0,0}, "\1\x27", IF_8086},
+    {I_DAS, 0, {0,0,0}, "\1\x2F", IF_8086},
+    {I_DEC, 1, {REG16,0,0}, "\320\10\x48", IF_8086},
+    {I_DEC, 1, {REG32,0,0}, "\321\10\x48", IF_386},
+    {I_DEC, 1, {REGMEM|BITS8,0,0}, "\300\1\xFE\201", IF_8086},
+    {I_DEC, 1, {REGMEM|BITS16,0,0}, "\320\300\1\xFF\201", IF_8086},
+    {I_DEC, 1, {REGMEM|BITS32,0,0}, "\321\300\1\xFF\201", IF_386},
+    {I_DIV, 1, {REGMEM|BITS8,0,0}, "\300\1\xF6\206", IF_8086},
+    {I_DIV, 1, {REGMEM|BITS16,0,0}, "\320\300\1\xF7\206", IF_8086},
+    {I_DIV, 1, {REGMEM|BITS32,0,0}, "\321\300\1\xF7\206", IF_386},
+    {I_EMMS, 0, {0,0,0}, "\2\x0F\x77", IF_PENT|IF_MMX},
+    {I_ENTER, 2, {IMMEDIATE,IMMEDIATE,0}, "\1\xC8\30\25", IF_186},
+    {I_EQU, 1, {IMMEDIATE,0,0}, "\0", IF_8086},
+    {I_EQU, 2, {IMMEDIATE|COLON,IMMEDIATE,0}, "\0", IF_8086},
+    {I_F2XM1, 0, {0,0,0}, "\2\xD9\xF0", IF_8086|IF_FPU},
+    {I_FABS, 0, {0,0,0}, "\2\xD9\xE1", IF_8086|IF_FPU},
+    {I_FADD, 1, {MEMORY|BITS32,0,0}, "\300\1\xD8\200", IF_8086|IF_FPU},
+    {I_FADD, 1, {MEMORY|BITS64,0,0}, "\300\1\xDC\200", IF_8086|IF_FPU},
+    {I_FADD, 1, {FPUREG|TO,0,0}, "\1\xDC\10\xC0", IF_8086|IF_FPU},
+    {I_FADD, 1, {FPUREG,0,0}, "\1\xD8\10\xC0", IF_8086|IF_FPU},
+    {I_FADD, 2, {FPUREG,FPU0,0}, "\1\xDC\10\xC0", IF_8086|IF_FPU},
+    {I_FADD, 2, {FPU0,FPUREG,0}, "\1\xD8\11\xC0", IF_8086|IF_FPU},
+    {I_FADDP, 1, {FPUREG,0,0}, "\1\xDE\10\xC0", IF_8086|IF_FPU},
+    {I_FADDP, 2, {FPUREG,FPU0,0}, "\1\xDE\10\xC0", IF_8086|IF_FPU},
+    {I_FBLD, 1, {MEMORY|BITS80,0,0}, "\300\1\xDF\204", IF_8086|IF_FPU},
+    {I_FBLD, 1, {MEMORY,0,0}, "\300\1\xDF\204", IF_8086|IF_FPU},
+    {I_FBSTP, 1, {MEMORY|BITS80,0,0}, "\300\1\xDF\206", IF_8086|IF_FPU},
+    {I_FBSTP, 1, {MEMORY,0,0}, "\300\1\xDF\206", IF_8086|IF_FPU},
+    {I_FCHS, 0, {0,0,0}, "\2\xD9\xE0", IF_8086|IF_FPU},
+    {I_FCLEX, 0, {0,0,0}, "\3\x9B\xDB\xE2", IF_8086|IF_FPU},
+    {I_FCMOVB, 1, {FPUREG,0,0}, "\1\xDA\10\xC0", IF_P6|IF_FPU},
+    {I_FCMOVB, 2, {FPU0,FPUREG,0}, "\1\xDA\11\xC0", IF_P6|IF_FPU},
+    {I_FCMOVBE, 1, {FPUREG,0,0}, "\1\xDA\10\xD0", IF_P6|IF_FPU},
+    {I_FCMOVBE, 2, {FPU0,FPUREG,0}, "\1\xDA\11\xD0", IF_P6|IF_FPU},
+    {I_FCMOVE, 1, {FPUREG,0,0}, "\1\xDA\10\xC8", IF_P6|IF_FPU},
+    {I_FCMOVE, 2, {FPU0,FPUREG,0}, "\1\xDA\11\xC8", IF_P6|IF_FPU},
+    {I_FCMOVNB, 1, {FPUREG,0,0}, "\1\xDB\10\xC0", IF_P6|IF_FPU},
+    {I_FCMOVNB, 2, {FPU0,FPUREG,0}, "\1\xDB\11\xC0", IF_P6|IF_FPU},
+    {I_FCMOVNBE, 1, {FPUREG,0,0}, "\1\xDB\10\xD0", IF_P6|IF_FPU},
+    {I_FCMOVNBE, 2, {FPU0,FPUREG,0}, "\1\xDB\11\xD0", IF_P6|IF_FPU},
+    {I_FCMOVNE, 1, {FPUREG,0,0}, "\1\xDB\10\xC8", IF_P6|IF_FPU},
+    {I_FCMOVNE, 2, {FPU0,FPUREG,0}, "\1\xDB\11\xC8", IF_P6|IF_FPU},
+    {I_FCMOVNU, 1, {FPUREG,0,0}, "\1\xDB\10\xD8", IF_P6|IF_FPU},
+    {I_FCMOVNU, 2, {FPU0,FPUREG,0}, "\1\xDB\11\xD8", IF_P6|IF_FPU},
+    {I_FCMOVU, 1, {FPUREG,0,0}, "\1\xDA\10\xD8", IF_P6|IF_FPU},
+    {I_FCMOVU, 2, {FPU0,FPUREG,0}, "\1\xDA\11\xD8", IF_P6|IF_FPU},
+    {I_FCOM, 1, {MEMORY|BITS32,0,0}, "\300\1\xD8\202", IF_8086|IF_FPU},
+    {I_FCOM, 1, {MEMORY|BITS64,0,0}, "\300\1\xDC\202", IF_8086|IF_FPU},
+    {I_FCOM, 1, {FPUREG,0,0}, "\1\xD8\10\xD0", IF_8086|IF_FPU},
+    {I_FCOM, 2, {FPU0,FPUREG,0}, "\1\xD8\11\xD0", IF_8086|IF_FPU},
+    {I_FCOMI, 1, {FPUREG,0,0}, "\1\xDB\10\xF0", IF_P6|IF_FPU},
+    {I_FCOMI, 2, {FPU0,FPUREG,0}, "\1\xDB\11\xF0", IF_P6|IF_FPU},
+    {I_FCOMIP, 1, {FPUREG,0,0}, "\1\xDF\10\xF0", IF_P6|IF_FPU},
+    {I_FCOMIP, 2, {FPU0,FPUREG,0}, "\1\xDF\11\xF0", IF_P6|IF_FPU},
+    {I_FCOMP, 1, {MEMORY|BITS32,0,0}, "\300\1\xD8\203", IF_8086|IF_FPU},
+    {I_FCOMP, 1, {MEMORY|BITS64,0,0}, "\300\1\xDC\203", IF_8086|IF_FPU},
+    {I_FCOMP, 1, {FPUREG,0,0}, "\1\xD8\10\xD8", IF_8086|IF_FPU},
+    {I_FCOMP, 2, {FPU0,FPUREG,0}, "\1\xD8\11\xD8", IF_8086|IF_FPU},
+    {I_FCOMPP, 0, {0,0,0}, "\2\xDE\xD9", IF_8086|IF_FPU},
+    {I_FCOS, 0, {0,0,0}, "\2\xD9\xFF", IF_386|IF_FPU},
+    {I_FDECSTP, 0, {0,0,0}, "\2\xD9\xF6", IF_8086|IF_FPU},
+    {I_FDISI, 0, {0,0,0}, "\3\x9B\xDB\xE1", IF_8086|IF_FPU},
+    {I_FDIV, 1, {MEMORY|BITS32,0,0}, "\300\1\xD8\206", IF_8086|IF_FPU},
+    {I_FDIV, 1, {MEMORY|BITS64,0,0}, "\300\1\xDC\206", IF_8086|IF_FPU},
+    {I_FDIV, 1, {FPUREG|TO,0,0}, "\1\xDC\10\xF8", IF_8086|IF_FPU},
+    {I_FDIV, 2, {FPUREG,FPU0,0}, "\1\xDC\10\xF8", IF_8086|IF_FPU},
+    {I_FDIV, 1, {FPUREG,0,0}, "\1\xD8\10\xF0", IF_8086|IF_FPU},
+    {I_FDIV, 2, {FPU0,FPUREG,0}, "\1\xD8\11\xF0", IF_8086|IF_FPU},
+    {I_FDIVP, 2, {FPUREG,FPU0,0}, "\1\xDE\10\xF8", IF_8086|IF_FPU},
+    {I_FDIVP, 1, {FPUREG,0,0}, "\1\xDE\10\xF8", IF_8086|IF_FPU},
+    {I_FDIVR, 1, {MEMORY|BITS32,0,0}, "\300\1\xD8\207", IF_8086|IF_FPU},
+    {I_FDIVR, 1, {MEMORY|BITS64,0,0}, "\300\1\xDC\207", IF_8086|IF_FPU},
+    {I_FDIVR, 1, {FPUREG|TO,0,0}, "\1\xDC\10\xF0", IF_8086|IF_FPU},
+    {I_FDIVR, 2, {FPUREG,FPU0,0}, "\1\xDC\10\xF0", IF_8086|IF_FPU},
+    {I_FDIVR, 1, {FPUREG,0,0}, "\1\xD8\10\xF8", IF_8086|IF_FPU},
+    {I_FDIVR, 2, {FPU0,FPUREG,0}, "\1\xD8\11\xF8", IF_8086|IF_FPU},
+    {I_FDIVRP, 1, {FPUREG,0,0}, "\1\xDE\10\xF0", IF_8086|IF_FPU},
+    {I_FDIVRP, 2, {FPUREG,FPU0,0}, "\1\xDE\10\xF0", IF_8086|IF_FPU},
+    {I_FENI, 0, {0,0,0}, "\3\x9B\xDB\xE0", IF_8086|IF_FPU},
+    {I_FFREE, 1, {FPUREG,0,0}, "\1\xDD\10\xC0", IF_8086|IF_FPU},
+    {I_FIADD, 1, {MEMORY|BITS32,0,0}, "\300\1\xDA\200", IF_8086|IF_FPU},
+    {I_FIADD, 1, {MEMORY|BITS16,0,0}, "\300\1\xDE\200", IF_8086|IF_FPU},
+    {I_FICOM, 1, {MEMORY|BITS32,0,0}, "\300\1\xDA\202", IF_8086|IF_FPU},
+    {I_FICOM, 1, {MEMORY|BITS16,0,0}, "\300\1\xDE\202", IF_8086|IF_FPU},
+    {I_FICOMP, 1, {MEMORY|BITS32,0,0}, "\300\1\xDA\203", IF_8086|IF_FPU},
+    {I_FICOMP, 1, {MEMORY|BITS16,0,0}, "\300\1\xDE\203", IF_8086|IF_FPU},
+    {I_FIDIV, 1, {MEMORY|BITS32,0,0}, "\300\1\xDA\206", IF_8086|IF_FPU},
+    {I_FIDIV, 1, {MEMORY|BITS16,0,0}, "\300\1\xDE\206", IF_8086|IF_FPU},
+    {I_FIDIVR, 1, {MEMORY|BITS32,0,0}, "\300\1\xDA\207", IF_8086|IF_FPU},
+    {I_FIDIVR, 1, {MEMORY|BITS16,0,0}, "\300\1\xDE\207", IF_8086|IF_FPU},
+    {I_FILD, 1, {MEMORY|BITS32,0,0}, "\300\1\xDB\200", IF_8086|IF_FPU},
+    {I_FILD, 1, {MEMORY|BITS16,0,0}, "\300\1\xDF\200", IF_8086|IF_FPU},
+    {I_FILD, 1, {MEMORY|BITS64,0,0}, "\300\1\xDF\205", IF_8086|IF_FPU},
+    {I_FIMUL, 1, {MEMORY|BITS32,0,0}, "\300\1\xDA\201", IF_8086|IF_FPU},
+    {I_FIMUL, 1, {MEMORY|BITS16,0,0}, "\300\1\xDE\201", IF_8086|IF_FPU},
+    {I_FINCSTP, 0, {0,0,0}, "\2\xD9\xF7", IF_8086|IF_FPU},
+    {I_FINIT, 0, {0,0,0}, "\3\x9B\xDB\xE3", IF_8086|IF_FPU},
+    {I_FIST, 1, {MEMORY|BITS32,0,0}, "\300\1\xDB\202", IF_8086|IF_FPU},
+    {I_FIST, 1, {MEMORY|BITS16,0,0}, "\300\1\xDF\202", IF_8086|IF_FPU},
+    {I_FISTP, 1, {MEMORY|BITS32,0,0}, "\300\1\xDB\203", IF_8086|IF_FPU},
+    {I_FISTP, 1, {MEMORY|BITS16,0,0}, "\300\1\xDF\203", IF_8086|IF_FPU},
+    {I_FISTP, 1, {MEMORY|BITS64,0,0}, "\300\1\xDF\207", IF_8086|IF_FPU},
+    {I_FISUB, 1, {MEMORY|BITS32,0,0}, "\300\1\xDA\204", IF_8086|IF_FPU},
+    {I_FISUB, 1, {MEMORY|BITS16,0,0}, "\300\1\xDE\204", IF_8086|IF_FPU},
+    {I_FISUBR, 1, {MEMORY|BITS32,0,0}, "\300\1\xDA\205", IF_8086|IF_FPU},
+    {I_FISUBR, 1, {MEMORY|BITS16,0,0}, "\300\1\xDE\205", IF_8086|IF_FPU},
+    {I_FLD, 1, {MEMORY|BITS32,0,0}, "\300\1\xD9\200", IF_8086|IF_FPU},
+    {I_FLD, 1, {MEMORY|BITS64,0,0}, "\300\1\xDD\200", IF_8086|IF_FPU},
+    {I_FLD, 1, {MEMORY|BITS80,0,0}, "\300\1\xDB\205", IF_8086|IF_FPU},
+    {I_FLD, 1, {FPUREG,0,0}, "\1\xD9\10\xC0", IF_8086|IF_FPU},
+    {I_FLD1, 0, {0,0,0}, "\2\xD9\xE8", IF_8086|IF_FPU},
+    {I_FLDCW, 1, {MEMORY,0,0}, "\300\1\xD9\205", IF_8086|IF_FPU|IF_SW},
+    {I_FLDENV, 1, {MEMORY,0,0}, "\300\1\xD9\204", IF_8086|IF_FPU},
+    {I_FLDL2E, 0, {0,0,0}, "\2\xD9\xEA", IF_8086|IF_FPU},
+    {I_FLDL2T, 0, {0,0,0}, "\2\xD9\xE9", IF_8086|IF_FPU},
+    {I_FLDLG2, 0, {0,0,0}, "\2\xD9\xEC", IF_8086|IF_FPU},
+    {I_FLDLN2, 0, {0,0,0}, "\2\xD9\xED", IF_8086|IF_FPU},
+    {I_FLDPI, 0, {0,0,0}, "\2\xD9\xEB", IF_8086|IF_FPU},
+    {I_FLDZ, 0, {0,0,0}, "\2\xD9\xEE", IF_8086|IF_FPU},
+    {I_FMUL, 1, {MEMORY|BITS32,0,0}, "\300\1\xD8\201", IF_8086|IF_FPU},
+    {I_FMUL, 1, {MEMORY|BITS64,0,0}, "\300\1\xDC\201", IF_8086|IF_FPU},
+    {I_FMUL, 1, {FPUREG|TO,0,0}, "\1\xDC\10\xC8", IF_8086|IF_FPU},
+    {I_FMUL, 2, {FPUREG,FPU0,0}, "\1\xDC\10\xC8", IF_8086|IF_FPU},
+    {I_FMUL, 1, {FPUREG,0,0}, "\1\xD8\10\xC8", IF_8086|IF_FPU},
+    {I_FMUL, 2, {FPU0,FPUREG,0}, "\1\xD8\11\xC8", IF_8086|IF_FPU},
+    {I_FMULP, 1, {FPUREG,0,0}, "\1\xDE\10\xC8", IF_8086|IF_FPU},
+    {I_FMULP, 2, {FPUREG,FPU0,0}, "\1\xDE\10\xC8", IF_8086|IF_FPU},
+    {I_FNCLEX, 0, {0,0,0}, "\2\xDB\xE2", IF_8086|IF_FPU},
+    {I_FNDISI, 0, {0,0,0}, "\2\xDB\xE1", IF_8086|IF_FPU},
+    {I_FNENI, 0, {0,0,0}, "\2\xDB\xE0", IF_8086|IF_FPU},
+    {I_FNINIT, 0, {0,0,0}, "\2\xDB\xE3", IF_8086|IF_FPU},
+    {I_FNOP, 0, {0,0,0}, "\2\xD9\xD0", IF_8086|IF_FPU},
+    {I_FNSAVE, 1, {MEMORY,0,0}, "\300\1\xDD\206", IF_8086|IF_FPU},
+    {I_FNSTCW, 1, {MEMORY,0,0}, "\300\1\xD9\207", IF_8086|IF_FPU|IF_SW},
+    {I_FNSTENV, 1, {MEMORY,0,0}, "\300\1\xD9\206", IF_8086|IF_FPU},
+    {I_FNSTSW, 1, {MEMORY,0,0}, "\300\1\xDD\207", IF_8086|IF_FPU|IF_SW},
+    {I_FNSTSW, 1, {REG_AX,0,0}, "\2\xDF\xE0", IF_286|IF_FPU},
+    {I_FPATAN, 0, {0,0,0}, "\2\xD9\xF3", IF_8086|IF_FPU},
+    {I_FPREM, 0, {0,0,0}, "\2\xD9\xF8", IF_8086|IF_FPU},
+    {I_FPREM1, 0, {0,0,0}, "\2\xD9\xF5", IF_386|IF_FPU},
+    {I_FPTAN, 0, {0,0,0}, "\2\xD9\xF2", IF_8086|IF_FPU},
+    {I_FRNDINT, 0, {0,0,0}, "\2\xD9\xFC", IF_8086|IF_FPU},
+    {I_FRSTOR, 1, {MEMORY,0,0}, "\300\1\xDD\204", IF_8086|IF_FPU},
+    {I_FSAVE, 1, {MEMORY,0,0}, "\300\2\x9B\xDD\206", IF_8086|IF_FPU},
+    {I_FSCALE, 0, {0,0,0}, "\2\xD9\xFD", IF_8086|IF_FPU},
+    {I_FSETPM, 0, {0,0,0}, "\2\xDB\xE4", IF_286|IF_FPU},
+    {I_FSIN, 0, {0,0,0}, "\2\xD9\xFE", IF_386|IF_FPU},
+    {I_FSINCOS, 0, {0,0,0}, "\2\xD9\xFB", IF_386|IF_FPU},
+    {I_FSQRT, 0, {0,0,0}, "\2\xD9\xFA", IF_8086|IF_FPU},
+    {I_FST, 1, {MEMORY|BITS32,0,0}, "\300\1\xD9\202", IF_8086|IF_FPU},
+    {I_FST, 1, {MEMORY|BITS64,0,0}, "\300\1\xDD\202", IF_8086|IF_FPU},
+    {I_FST, 1, {FPUREG,0,0}, "\1\xDD\10\xD0", IF_8086|IF_FPU},
+    {I_FSTCW, 1, {MEMORY,0,0}, "\300\2\x9B\xD9\207", IF_8086|IF_FPU|IF_SW},
+    {I_FSTENV, 1, {MEMORY,0,0}, "\300\2\x9B\xD9\206", IF_8086|IF_FPU},
+    {I_FSTP, 1, {MEMORY|BITS32,0,0}, "\300\1\xD9\203", IF_8086|IF_FPU},
+    {I_FSTP, 1, {MEMORY|BITS64,0,0}, "\300\1\xDD\203", IF_8086|IF_FPU},
+    {I_FSTP, 1, {MEMORY|BITS80,0,0}, "\300\1\xDB\207", IF_8086|IF_FPU},
+    {I_FSTP, 1, {FPUREG,0,0}, "\1\xDD\10\xD8", IF_8086|IF_FPU},
+    {I_FSTSW, 1, {MEMORY,0,0}, "\300\2\x9B\xDD\207", IF_8086|IF_FPU|IF_SW},
+    {I_FSTSW, 1, {REG_AX,0,0}, "\3\x9B\xDF\xE0", IF_286|IF_FPU},
+    {I_FSUB, 1, {MEMORY|BITS32,0,0}, "\300\1\xD8\204", IF_8086|IF_FPU},
+    {I_FSUB, 1, {MEMORY|BITS64,0,0}, "\300\1\xDC\204", IF_8086|IF_FPU},
+    {I_FSUB, 1, {FPUREG|TO,0,0}, "\1\xDC\10\xE8", IF_8086|IF_FPU},
+    {I_FSUB, 2, {FPUREG,FPU0,0}, "\1\xDC\10\xE8", IF_8086|IF_FPU},
+    {I_FSUB, 1, {FPUREG,0,0}, "\1\xD8\10\xE0", IF_8086|IF_FPU},
+    {I_FSUB, 2, {FPU0,FPUREG,0}, "\1\xD8\11\xE0", IF_8086|IF_FPU},
+    {I_FSUBP, 1, {FPUREG,0,0}, "\1\xDE\10\xE8", IF_8086|IF_FPU},
+    {I_FSUBP, 2, {FPUREG,FPU0,0}, "\1\xDE\10\xE8", IF_8086|IF_FPU},
+    {I_FSUBR, 1, {MEMORY|BITS32,0,0}, "\300\1\xD8\205", IF_8086|IF_FPU},
+    {I_FSUBR, 1, {MEMORY|BITS64,0,0}, "\300\1\xDC\205", IF_8086|IF_FPU},
+    {I_FSUBR, 1, {FPUREG|TO,0,0}, "\1\xDC\10\xE0", IF_8086|IF_FPU},
+    {I_FSUBR, 2, {FPUREG,FPU0,0}, "\1\xDC\10\xE0", IF_8086|IF_FPU},
+    {I_FSUBR, 1, {FPUREG,0,0}, "\1\xD8\10\xE8", IF_8086|IF_FPU},
+    {I_FSUBR, 2, {FPU0,FPUREG,0}, "\1\xD8\11\xE8", IF_8086|IF_FPU},
+    {I_FSUBRP, 1, {FPUREG,0,0}, "\1\xDE\10\xE0", IF_8086|IF_FPU},
+    {I_FSUBRP, 2, {FPUREG,FPU0,0}, "\1\xDE\10\xE0", IF_8086|IF_FPU},
+    {I_FTST, 0, {0,0,0}, "\2\xD9\xE4", IF_8086|IF_FPU},
+    {I_FUCOM, 1, {FPUREG,0,0}, "\1\xDD\10\xE0", IF_386|IF_FPU},
+    {I_FUCOM, 2, {FPU0,FPUREG,0}, "\1\xDD\11\xE0", IF_386|IF_FPU},
+    {I_FUCOMI, 1, {FPUREG,0,0}, "\1\xDB\10\xE8", IF_P6|IF_FPU},
+    {I_FUCOMI, 2, {FPU0,FPUREG,0}, "\1\xDB\11\xE8", IF_P6|IF_FPU},
+    {I_FUCOMIP, 1, {FPUREG,0,0}, "\1\xDF\10\xE8", IF_P6|IF_FPU},
+    {I_FUCOMIP, 2, {FPU0,FPUREG,0}, "\1\xDF\11\xE8", IF_P6|IF_FPU},
+    {I_FUCOMP, 1, {FPUREG,0,0}, "\1\xDD\10\xE8", IF_386|IF_FPU},
+    {I_FUCOMP, 2, {FPU0,FPUREG,0}, "\1\xDD\11\xE8", IF_386|IF_FPU},
+    {I_FUCOMPP, 0, {0,0,0}, "\2\xDA\xE9", IF_386|IF_FPU},
+    {I_FXAM, 0, {0,0,0}, "\2\xD9\xE5", IF_8086|IF_FPU},
+    {I_FXCH, 0, {0,0,0}, "\2\xD9\xC9", IF_8086|IF_FPU},
+    {I_FXCH, 1, {FPUREG,0,0}, "\1\xD9\10\xC8", IF_8086|IF_FPU},
+    {I_FXCH, 2, {FPUREG,FPU0,0}, "\1\xD9\10\xC8", IF_8086|IF_FPU},
+    {I_FXCH, 2, {FPU0,FPUREG,0}, "\1\xD9\11\xC8", IF_8086|IF_FPU},
+    {I_FXTRACT, 0, {0,0,0}, "\2\xD9\xF4", IF_8086|IF_FPU},
+    {I_FYL2X, 0, {0,0,0}, "\2\xD9\xF1", IF_8086|IF_FPU},
+    {I_FYL2XP1, 0, {0,0,0}, "\2\xD9\xF9", IF_8086|IF_FPU},
+    {I_HLT, 0, {0,0,0}, "\1\xF4", IF_8086},
+    {I_IDIV, 1, {REGMEM|BITS8,0,0}, "\300\1\xF6\207", IF_8086},
+    {I_IDIV, 1, {REGMEM|BITS16,0,0}, "\320\300\1\xF7\207", IF_8086},
+    {I_IDIV, 1, {REGMEM|BITS32,0,0}, "\321\300\1\xF7\207", IF_386},
+    {I_IMUL, 1, {REGMEM|BITS8,0,0}, "\300\1\xF6\205", IF_8086},
+    {I_IMUL, 1, {REGMEM|BITS16,0,0}, "\320\300\1\xF7\205", IF_8086},
+    {I_IMUL, 1, {REGMEM|BITS32,0,0}, "\321\300\1\xF7\205", IF_386},
+    {I_IMUL, 2, {REG16,MEMORY,0}, "\320\301\2\x0F\xAF\110", IF_386|IF_SM},
+    {I_IMUL, 2, {REG16,REG16,0}, "\320\301\2\x0F\xAF\110", IF_386},
+    {I_IMUL, 2, {REG32,MEMORY,0}, "\321\301\2\x0F\xAF\110", IF_386|IF_SM},
+    {I_IMUL, 2, {REG32,REG32,0}, "\321\301\2\x0F\xAF\110", IF_386},
+    {I_IMUL, 3, {REG16,MEMORY,IMMEDIATE|BITS8}, "\320\301\1\x6B\110\16", IF_286|IF_SM},
+    {I_IMUL, 3, {REG16,REG16,IMMEDIATE|BITS8}, "\320\301\1\x6B\110\16", IF_286},
+    {I_IMUL, 3, {REG16,MEMORY,IMMEDIATE}, "\320\301\1\x69\110\32", IF_286|IF_SM},
+    {I_IMUL, 3, {REG16,REG16,IMMEDIATE}, "\320\301\1\x69\110\32", IF_286|IF_SM},
+    {I_IMUL, 3, {REG32,MEMORY,IMMEDIATE|BITS8}, "\321\301\1\x6B\110\16", IF_386|IF_SM},
+    {I_IMUL, 3, {REG32,REG32,IMMEDIATE|BITS8}, "\321\301\1\x6B\110\16", IF_386},
+    {I_IMUL, 3, {REG32,MEMORY,IMMEDIATE}, "\321\301\1\x69\110\42", IF_386|IF_SM},
+    {I_IMUL, 3, {REG32,REG32,IMMEDIATE}, "\321\301\1\x69\110\42", IF_386|IF_SM},
+    {I_IMUL, 2, {REG16,IMMEDIATE|BITS8,0}, "\320\1\x6B\100\15", IF_286},
+    {I_IMUL, 2, {REG16,IMMEDIATE,0}, "\320\1\x69\100\31", IF_286|IF_SM},
+    {I_IMUL, 2, {REG32,IMMEDIATE|BITS8,0}, "\321\1\x6B\100\15", IF_386},
+    {I_IMUL, 2, {REG32,IMMEDIATE,0}, "\321\1\x69\100\41", IF_386|IF_SM},
+    {I_IN, 2, {REG_AL,IMMEDIATE,0}, "\1\xE4\25", IF_8086},
+    {I_IN, 2, {REG_AX,IMMEDIATE,0}, "\320\1\xE5\25", IF_8086},
+    {I_IN, 2, {REG_EAX,IMMEDIATE,0}, "\321\1\xE5\25", IF_386},
+    {I_IN, 2, {REG_AL,REG_DX,0}, "\1\xEC", IF_8086},
+    {I_IN, 2, {REG_AX,REG_DX,0}, "\320\1\xED", IF_8086},
+    {I_IN, 2, {REG_EAX,REG_DX,0}, "\321\1\xED", IF_386},
+    {I_INC, 1, {REG16,0,0}, "\320\10\x40", IF_8086},
+    {I_INC, 1, {REG32,0,0}, "\321\10\x40", IF_386},
+    {I_INC, 1, {REGMEM|BITS8,0,0}, "\300\1\xFE\200", IF_8086},
+    {I_INC, 1, {REGMEM|BITS16,0,0}, "\320\300\1\xFF\200", IF_8086},
+    {I_INC, 1, {REGMEM|BITS32,0,0}, "\321\300\1\xFF\200", IF_386},
+    {I_INSB, 0, {0,0,0}, "\1\x6C", IF_186},
+    {I_INSD, 0, {0,0,0}, "\321\1\x6D", IF_386},
+    {I_INSW, 0, {0,0,0}, "\320\1\x6D", IF_186},
+    {I_INT, 1, {IMMEDIATE,0,0}, "\1\xCD\24", IF_8086},
+    {I_INT1, 0, {0,0,0}, "\1\xF1", IF_P6},
+    {I_INT3, 0, {0,0,0}, "\1\xCC", IF_8086},
+    {I_INTO, 0, {0,0,0}, "\1\xCE", IF_8086},
+    {I_INVD, 0, {0,0,0}, "\2\x0F\x08", IF_486},
+    {I_INVLPG, 1, {MEMORY,0,0}, "\300\2\x0F\x01\207", IF_486},
+    {I_IRET, 0, {0,0,0}, "\322\1\xCF", IF_8086},
+    {I_IRETD, 0, {0,0,0}, "\321\1\xCF", IF_386},
+    {I_IRETW, 0, {0,0,0}, "\320\1\xCF", IF_8086},
+    {I_JCXZ, 1, {IMMEDIATE,0,0}, "\320\1\xE3\50", IF_8086},
+    {I_JECXZ, 1, {IMMEDIATE,0,0}, "\321\1\xE3\50", IF_386},
+    {I_JMP, 1, {IMMEDIATE|SHORT,0,0}, "\1\xEB\50", IF_8086},
+    {I_JMP, 1, {IMMEDIATE,0,0}, "\322\1\xE9\64", IF_8086},
+    {I_JMP, 2, {IMMEDIATE|COLON,IMMEDIATE,0}, "\322\1\xEA\35\30", IF_8086},
+    {I_JMP, 2, {IMMEDIATE|BITS16|COLON,IMMEDIATE,0}, "\320\1\xEA\31\30", IF_8086},
+    {I_JMP, 2, {IMMEDIATE|COLON,IMMEDIATE|BITS16,0}, "\320\1\xEA\31\30", IF_8086},
+    {I_JMP, 2, {IMMEDIATE|BITS32|COLON,IMMEDIATE,0}, "\321\1\xEA\41\30", IF_386},
+    {I_JMP, 2, {IMMEDIATE|COLON,IMMEDIATE|BITS32,0}, "\321\1\xEA\41\30", IF_386},
+    {I_JMP, 1, {MEMORY|FAR,0,0}, "\322\300\1\xFF\205", IF_8086},
+    {I_JMP, 1, {MEMORY|BITS16|FAR,0,0}, "\320\300\1\xFF\205", IF_8086},
+    {I_JMP, 1, {MEMORY|BITS32|FAR,0,0}, "\321\300\1\xFF\205", IF_386},
+    {I_JMP, 1, {MEMORY|NEAR,0,0}, "\322\300\1\xFF\204", IF_8086},
+    {I_JMP, 1, {MEMORY|BITS16|NEAR,0,0}, "\320\300\1\xFF\204", IF_8086},
+    {I_JMP, 1, {MEMORY|BITS32|NEAR,0,0}, "\321\300\1\xFF\204", IF_386},
+    {I_JMP, 1, {REG16,0,0}, "\320\300\1\xFF\204", IF_8086},
+    {I_JMP, 1, {REG32,0,0}, "\321\300\1\xFF\204", IF_386},
+    {I_JMP, 1, {MEMORY,0,0}, "\322\300\1\xFF\204", IF_8086},
+    {I_JMP, 1, {MEMORY|BITS16,0,0}, "\320\300\1\xFF\204", IF_8086},
+    {I_JMP, 1, {MEMORY|BITS32,0,0}, "\321\300\1\xFF\204", IF_386},
+    {I_LAHF, 0, {0,0,0}, "\1\x9F", IF_8086},
+    {I_LAR, 2, {REG16,MEMORY,0}, "\320\301\2\x0F\x02\110", IF_286|IF_PRIV|IF_SM},
+    {I_LAR, 2, {REG16,REG16,0}, "\320\301\2\x0F\x02\110", IF_286|IF_PRIV},
+    {I_LAR, 2, {REG32,MEMORY,0}, "\321\301\2\x0F\x02\110", IF_286|IF_PRIV|IF_SM},
+    {I_LAR, 2, {REG32,REG32,0}, "\321\301\2\x0F\x02\110", IF_286|IF_PRIV},
+    {I_LDS, 2, {REG16,MEMORY,0}, "\320\301\1\xC5\110", IF_8086},
+    {I_LDS, 2, {REG32,MEMORY,0}, "\321\301\1\xC5\110", IF_8086},
+    {I_LEA, 2, {REG16,MEMORY,0}, "\320\301\1\x8D\110", IF_8086},
+    {I_LEA, 2, {REG32,MEMORY,0}, "\321\301\1\x8D\110", IF_8086},
+    {I_LEAVE, 0, {0,0,0}, "\1\xC9", IF_186},
+    {I_LES, 2, {REG16,MEMORY,0}, "\320\301\1\xC4\110", IF_8086},
+    {I_LES, 2, {REG32,MEMORY,0}, "\321\301\1\xC4\110", IF_8086},
+    {I_LFS, 2, {REG16,MEMORY,0}, "\320\301\2\x0F\xB4\110", IF_386},
+    {I_LFS, 2, {REG32,MEMORY,0}, "\321\301\2\x0F\xB4\110", IF_386},
+    {I_LGDT, 1, {MEMORY,0,0}, "\300\2\x0F\x01\202", IF_286|IF_PRIV},
+    {I_LGS, 2, {REG16,MEMORY,0}, "\320\301\2\x0F\xB5\110", IF_386},
+    {I_LGS, 2, {REG32,MEMORY,0}, "\321\301\2\x0F\xB5\110", IF_386},
+    {I_LIDT, 1, {MEMORY,0,0}, "\300\2\x0F\x01\203", IF_286|IF_PRIV},
+    {I_LLDT, 1, {MEMORY,0,0}, "\300\1\x0F\17\202", IF_286|IF_PRIV},
+    {I_LLDT, 1, {MEMORY|BITS16,0,0}, "\300\1\x0F\17\202", IF_286|IF_PRIV},
+    {I_LLDT, 1, {REG16,0,0}, "\300\1\x0F\17\202", IF_286|IF_PRIV},
+    {I_LMSW, 1, {MEMORY,0,0}, "\300\2\x0F\x01\206", IF_286|IF_PRIV},
+    {I_LMSW, 1, {MEMORY|BITS16,0,0}, "\300\2\x0F\x01\206", IF_286|IF_PRIV},
+    {I_LMSW, 1, {REG16,0,0}, "\300\2\x0F\x01\206", IF_286|IF_PRIV},
+    {I_LOADALL, 0, {0,0,0}, "\2\x0F\x07", IF_386|IF_UNDOC},
+    {I_LOADALL286, 0, {0,0,0}, "\2\x0F\x05", IF_286|IF_UNDOC},
+    {I_LODSB, 0, {0,0,0}, "\1\xAC", IF_8086},
+    {I_LODSD, 0, {0,0,0}, "\321\1\xAD", IF_386},
+    {I_LODSW, 0, {0,0,0}, "\320\1\xAD", IF_8086},
+    {I_LOOP, 1, {IMMEDIATE,0,0}, "\312\1\xE2\50", IF_8086},
+    {I_LOOP, 2, {IMMEDIATE,REG_CX,0}, "\310\1\xE2\50", IF_8086},
+    {I_LOOP, 2, {IMMEDIATE,REG_ECX,0}, "\311\1\xE2\50", IF_386},
+    {I_LOOPE, 1, {IMMEDIATE,0,0}, "\312\1\xE1\50", IF_8086},
+    {I_LOOPE, 2, {IMMEDIATE,REG_CX,0}, "\310\1\xE1\50", IF_8086},
+    {I_LOOPE, 2, {IMMEDIATE,REG_ECX,0}, "\311\1\xE1\50", IF_386},
+    {I_LOOPNE, 1, {IMMEDIATE,0,0}, "\312\1\xE0\50", IF_8086},
+    {I_LOOPNE, 2, {IMMEDIATE,REG_CX,0}, "\310\1\xE0\50", IF_8086},
+    {I_LOOPNE, 2, {IMMEDIATE,REG_ECX,0}, "\311\1\xE0\50", IF_386},
+    {I_LOOPNZ, 1, {IMMEDIATE,0,0}, "\312\1\xE0\50", IF_8086},
+    {I_LOOPNZ, 2, {IMMEDIATE,REG_CX,0}, "\310\1\xE0\50", IF_8086},
+    {I_LOOPNZ, 2, {IMMEDIATE,REG_ECX,0}, "\311\1\xE0\50", IF_386},
+    {I_LOOPZ, 1, {IMMEDIATE,0,0}, "\312\1\xE1\50", IF_8086},
+    {I_LOOPZ, 2, {IMMEDIATE,REG_CX,0}, "\310\1\xE1\50", IF_8086},
+    {I_LOOPZ, 2, {IMMEDIATE,REG_ECX,0}, "\311\1\xE1\50", IF_386},
+    {I_LSL, 2, {REG16,MEMORY,0}, "\320\301\2\x0F\x03\110", IF_286|IF_PRIV|IF_SM},
+    {I_LSL, 2, {REG16,REG16,0}, "\320\301\2\x0F\x03\110", IF_286|IF_PRIV},
+    {I_LSL, 2, {REG32,MEMORY,0}, "\321\301\2\x0F\x03\110", IF_286|IF_PRIV|IF_SM},
+    {I_LSL, 2, {REG32,REG32,0}, "\321\301\2\x0F\x03\110", IF_286|IF_PRIV},
+    {I_LSS, 2, {REG16,MEMORY,0}, "\320\301\2\x0F\xB2\110", IF_386},
+    {I_LSS, 2, {REG32,MEMORY,0}, "\321\301\2\x0F\xB2\110", IF_386},
+    {I_LTR, 1, {MEMORY,0,0}, "\300\1\x0F\17\203", IF_286|IF_PRIV},
+    {I_LTR, 1, {MEMORY|BITS16,0,0}, "\300\1\x0F\17\203", IF_286|IF_PRIV},
+    {I_LTR, 1, {REG16,0,0}, "\300\1\x0F\17\203", IF_286|IF_PRIV},
+    {I_MOV, 2, {MEMORY,REG_CS,0}, "\320\300\1\x8C\201", IF_8086|IF_SM},
+    {I_MOV, 2, {MEMORY,REG_DESS,0}, "\320\300\1\x8C\101", IF_8086|IF_SM},
+    {I_MOV, 2, {MEMORY,REG_FSGS,0}, "\320\300\1\x8C\101", IF_386|IF_SM},
+    {I_MOV, 2, {REG16,REG_CS,0}, "\320\300\1\x8C\201", IF_8086},
+    {I_MOV, 2, {REG16,REG_DESS,0}, "\320\300\1\x8C\101", IF_8086},
+    {I_MOV, 2, {REG16,REG_FSGS,0}, "\320\300\1\x8C\101", IF_386},
+    {I_MOV, 2, {REGMEM|BITS32,REG_CS,0}, "\321\300\1\x8C\201", IF_8086},
+    {I_MOV, 2, {REGMEM|BITS32,REG_DESS,0}, "\321\300\1\x8C\101", IF_8086},
+    {I_MOV, 2, {REGMEM|BITS32,REG_FSGS,0}, "\321\300\1\x8C\101", IF_386},
+    {I_MOV, 2, {REG_DESS,MEMORY,0}, "\320\301\1\x8E\110", IF_8086|IF_SM},
+    {I_MOV, 2, {REG_FSGS,MEMORY,0}, "\320\301\1\x8E\110", IF_386|IF_SM},
+    {I_MOV, 2, {REG_DESS,REG16,0}, "\320\301\1\x8E\110", IF_8086},
+    {I_MOV, 2, {REG_FSGS,REG16,0}, "\320\301\1\x8E\110", IF_386},
+    {I_MOV, 2, {REG_DESS,REGMEM|BITS32,0}, "\321\301\1\x8E\110", IF_8086},
+    {I_MOV, 2, {REG_FSGS,REGMEM|BITS32,0}, "\321\301\1\x8E\110", IF_386},
+    {I_MOV, 2, {REG_AL,MEM_OFFS,0}, "\301\1\xA0\35", IF_8086|IF_SM},
+    {I_MOV, 2, {REG_AX,MEM_OFFS,0}, "\301\320\1\xA1\35", IF_8086|IF_SM},
+    {I_MOV, 2, {REG_EAX,MEM_OFFS,0}, "\301\321\1\xA1\35", IF_386|IF_SM},
+    {I_MOV, 2, {MEM_OFFS,REG_AL,0}, "\300\1\xA2\34", IF_8086|IF_SM},
+    {I_MOV, 2, {MEM_OFFS,REG_AX,0}, "\300\320\1\xA3\34", IF_8086|IF_SM},
+    {I_MOV, 2, {MEM_OFFS,REG_EAX,0}, "\300\321\1\xA3\34", IF_386|IF_SM},
+    {I_MOV, 2, {REG32,REG_CR4,0}, "\2\x0F\x20\204", IF_PENT},
+    {I_MOV, 2, {REG32,REG_CREG,0}, "\2\x0F\x20\101", IF_386},
+    {I_MOV, 2, {REG32,REG_DREG,0}, "\2\x0F\x21\101", IF_386},
+    {I_MOV, 2, {REG32,REG_TREG,0}, "\2\x0F\x24\101", IF_386},
+    {I_MOV, 2, {REG_CR4,REG32,0}, "\2\x0F\x22\214", IF_PENT},
+    {I_MOV, 2, {REG_CREG,REG32,0}, "\2\x0F\x22\110", IF_386},
+    {I_MOV, 2, {REG_DREG,REG32,0}, "\2\x0F\x23\110", IF_386},
+    {I_MOV, 2, {REG_TREG,REG32,0}, "\2\x0F\x26\110", IF_386},
+    {I_MOV, 2, {MEMORY,REG8,0}, "\300\1\x88\101", IF_8086|IF_SM},
+    {I_MOV, 2, {REG8,REG8,0}, "\300\1\x88\101", IF_8086},
+    {I_MOV, 2, {MEMORY,REG16,0}, "\320\300\1\x89\101", IF_8086|IF_SM},
+    {I_MOV, 2, {REG16,REG16,0}, "\320\300\1\x89\101", IF_8086},
+    {I_MOV, 2, {MEMORY,REG32,0}, "\321\300\1\x89\101", IF_386|IF_SM},
+    {I_MOV, 2, {REG32,REG32,0}, "\321\300\1\x89\101", IF_386},
+    {I_MOV, 2, {REG8,MEMORY,0}, "\301\1\x8A\110", IF_8086|IF_SM},
+    {I_MOV, 2, {REG8,REG8,0}, "\301\1\x8A\110", IF_8086},
+    {I_MOV, 2, {REG16,MEMORY,0}, "\320\301\1\x8B\110", IF_8086|IF_SM},
+    {I_MOV, 2, {REG16,REG16,0}, "\320\301\1\x8B\110", IF_8086},
+    {I_MOV, 2, {REG32,MEMORY,0}, "\321\301\1\x8B\110", IF_386|IF_SM},
+    {I_MOV, 2, {REG32,REG32,0}, "\321\301\1\x8B\110", IF_386},
+    {I_MOV, 2, {REG8,IMMEDIATE,0}, "\10\xB0\21", IF_8086|IF_SM},
+    {I_MOV, 2, {REG16,IMMEDIATE,0}, "\320\10\xB8\31", IF_8086|IF_SM},
+    {I_MOV, 2, {REG32,IMMEDIATE,0}, "\321\10\xB8\41", IF_386|IF_SM},
+    {I_MOV, 2, {REGMEM|BITS8,IMMEDIATE,0}, "\300\1\xC6\200\21", IF_8086|IF_SM},
+    {I_MOV, 2, {REGMEM|BITS16,IMMEDIATE,0}, "\320\300\1\xC7\200\31", IF_8086|IF_SM},
+    {I_MOV, 2, {REGMEM|BITS32,IMMEDIATE,0}, "\321\300\1\xC7\200\41", IF_386|IF_SM},
+    {I_MOV, 2, {MEMORY,IMMEDIATE|BITS8,0}, "\300\1\xC6\200\21", IF_8086|IF_SM},
+    {I_MOV, 2, {MEMORY,IMMEDIATE|BITS16,0}, "\320\300\1\xC7\200\31", IF_8086|IF_SM},
+    {I_MOV, 2, {MEMORY,IMMEDIATE|BITS32,0}, "\321\300\1\xC7\200\41", IF_386|IF_SM},
+    {I_MOVD, 2, {MMXREG,MEMORY,0}, "\301\2\x0F\x6E\110", IF_PENT|IF_MMX|IF_SD},
+    {I_MOVD, 2, {MMXREG,REG32,0}, "\2\x0F\x6E\110", IF_PENT|IF_MMX},
+    {I_MOVD, 2, {MEMORY,MMXREG,0}, "\300\2\x0F\x7E\101", IF_PENT|IF_MMX|IF_SD},
+    {I_MOVD, 2, {REG32,MMXREG,0}, "\2\x0F\x7E\101", IF_PENT|IF_MMX},
+    {I_MOVQ, 2, {MMXREG,MEMORY,0}, "\301\2\x0F\x6F\110", IF_PENT|IF_MMX|IF_SM},
+    {I_MOVQ, 2, {MMXREG,MMXREG,0}, "\2\x0F\x6F\110", IF_PENT|IF_MMX},
+    {I_MOVQ, 2, {MEMORY,MMXREG,0}, "\300\2\x0F\x7F\101", IF_PENT|IF_MMX|IF_SM},
+    {I_MOVQ, 2, {MMXREG,MMXREG,0}, "\2\x0F\x7F\101", IF_PENT|IF_MMX},
+    {I_MOVSB, 0, {0,0,0}, "\1\xA4", IF_8086},
+    {I_MOVSD, 0, {0,0,0}, "\321\1\xA5", IF_386},
+    {I_MOVSW, 0, {0,0,0}, "\320\1\xA5", IF_8086},
+    {I_MOVSX, 2, {REG16,MEMORY,0}, "\320\301\2\x0F\xBE\110", IF_386|IF_SB},
+    {I_MOVSX, 2, {REG16,REG8,0}, "\320\301\2\x0F\xBE\110", IF_386},
+    {I_MOVSX, 2, {REG32,REGMEM|BITS8,0}, "\321\301\2\x0F\xBE\110", IF_386},
+    {I_MOVSX, 2, {REG32,REGMEM|BITS16,0}, "\321\301\2\x0F\xBF\110", IF_386},
+    {I_MOVZX, 2, {REG16,MEMORY,0}, "\320\301\2\x0F\xB6\110", IF_386|IF_SB},
+    {I_MOVZX, 2, {REG16,REG8,0}, "\320\301\2\x0F\xB6\110", IF_386},
+    {I_MOVZX, 2, {REG32,REGMEM|BITS8,0}, "\321\301\2\x0F\xB6\110", IF_386},
+    {I_MOVZX, 2, {REG32,REGMEM|BITS16,0}, "\321\301\2\x0F\xB7\110", IF_386},
+    {I_MUL, 1, {REGMEM|BITS8,0,0}, "\300\1\xF6\204", IF_8086},
+    {I_MUL, 1, {REGMEM|BITS16,0,0}, "\320\300\1\xF7\204", IF_8086},
+    {I_MUL, 1, {REGMEM|BITS32,0,0}, "\321\300\1\xF7\204", IF_386},
+    {I_NEG, 1, {REGMEM|BITS8,0,0}, "\300\1\xF6\203", IF_8086},
+    {I_NEG, 1, {REGMEM|BITS16,0,0}, "\320\300\1\xF7\203", IF_8086},
+    {I_NEG, 1, {REGMEM|BITS32,0,0}, "\321\300\1\xF7\203", IF_386},
+    {I_NOP, 0, {0,0,0}, "\1\x90", IF_8086},
+    {I_NOT, 1, {REGMEM|BITS8,0,0}, "\300\1\xF6\202", IF_8086},
+    {I_NOT, 1, {REGMEM|BITS16,0,0}, "\320\300\1\xF7\202", IF_8086},
+    {I_NOT, 1, {REGMEM|BITS32,0,0}, "\321\300\1\xF7\202", IF_386},
+    {I_OR, 2, {MEMORY,REG8,0}, "\300\1\x08\101", IF_8086|IF_SM},
+    {I_OR, 2, {REG8,REG8,0}, "\300\1\x08\101", IF_8086},
+    {I_OR, 2, {MEMORY,REG16,0}, "\320\300\1\x09\101", IF_8086|IF_SM},
+    {I_OR, 2, {REG16,REG16,0}, "\320\300\1\x09\101", IF_8086},
+    {I_OR, 2, {MEMORY,REG32,0}, "\321\300\1\x09\101", IF_386|IF_SM},
+    {I_OR, 2, {REG32,REG32,0}, "\321\300\1\x09\101", IF_386},
+    {I_OR, 2, {REG8,MEMORY,0}, "\301\1\x0A\110", IF_8086|IF_SM},
+    {I_OR, 2, {REG8,REG8,0}, "\301\1\x0A\110", IF_8086},
+    {I_OR, 2, {REG16,MEMORY,0}, "\320\301\1\x0B\110", IF_8086|IF_SM},
+    {I_OR, 2, {REG16,REG16,0}, "\320\301\1\x0B\110", IF_8086},
+    {I_OR, 2, {REG32,MEMORY,0}, "\321\301\1\x0B\110", IF_386|IF_SM},
+    {I_OR, 2, {REG32,REG32,0}, "\321\301\1\x0B\110", IF_386},
+    {I_OR, 2, {REGMEM|BITS16,IMMEDIATE|BITS8,0}, "\320\300\1\x83\201\15", IF_8086},
+    {I_OR, 2, {REGMEM|BITS32,IMMEDIATE|BITS8,0}, "\321\300\1\x83\201\15", IF_386},
+    {I_OR, 2, {REG_AL,IMMEDIATE,0}, "\1\x0C\21", IF_8086|IF_SM},
+    {I_OR, 2, {REG_AX,IMMEDIATE,0}, "\320\1\x0D\31", IF_8086|IF_SM},
+    {I_OR, 2, {REG_EAX,IMMEDIATE,0}, "\321\1\x0D\41", IF_386|IF_SM},
+    {I_OR, 2, {REGMEM|BITS8,IMMEDIATE,0}, "\300\1\x80\201\21", IF_8086|IF_SM},
+    {I_OR, 2, {REGMEM|BITS16,IMMEDIATE,0}, "\320\300\1\x81\201\31", IF_8086|IF_SM},
+    {I_OR, 2, {REGMEM|BITS32,IMMEDIATE,0}, "\321\300\1\x81\201\41", IF_386|IF_SM},
+    {I_OR, 2, {MEMORY,IMMEDIATE|BITS8,0}, "\300\1\x80\201\21", IF_8086|IF_SM},
+    {I_OR, 2, {MEMORY,IMMEDIATE|BITS16,0}, "\320\300\1\x81\201\31", IF_8086|IF_SM},
+    {I_OR, 2, {MEMORY,IMMEDIATE|BITS32,0}, "\321\300\1\x81\201\41", IF_386|IF_SM},
+    {I_OUT, 2, {IMMEDIATE,REG_AL,0}, "\1\xE6\24", IF_8086},
+    {I_OUT, 2, {IMMEDIATE,REG_AX,0}, "\320\1\xE7\24", IF_8086},
+    {I_OUT, 2, {IMMEDIATE,REG_EAX,0}, "\321\1\xE7\24", IF_386},
+    {I_OUT, 2, {REG_DX,REG_AL,0}, "\1\xEE", IF_8086},
+    {I_OUT, 2, {REG_DX,REG_AX,0}, "\320\1\xEF", IF_8086},
+    {I_OUT, 2, {REG_DX,REG_EAX,0}, "\321\1\xEF", IF_386},
+    {I_OUTSB, 0, {0,0,0}, "\1\x6E", IF_186},
+    {I_OUTSD, 0, {0,0,0}, "\321\1\x6F", IF_386},
+    {I_OUTSW, 0, {0,0,0}, "\320\1\x6F", IF_186},
+    {I_PACKSSDW, 2, {MMXREG,MEMORY,0}, "\301\2\x0F\x6B\110", IF_PENT|IF_MMX|IF_SM},
+    {I_PACKSSDW, 2, {MMXREG,MMXREG,0}, "\2\x0F\x6B\110", IF_PENT|IF_MMX},
+    {I_PACKSSWB, 2, {MMXREG,MEMORY,0}, "\301\2\x0F\x63\110", IF_PENT|IF_MMX|IF_SM},
+    {I_PACKSSWB, 2, {MMXREG,MMXREG,0}, "\2\x0F\x63\110", IF_PENT|IF_MMX},
+    {I_PACKUSWB, 2, {MMXREG,MEMORY,0}, "\301\2\x0F\x67\110", IF_PENT|IF_MMX|IF_SM},
+    {I_PACKUSWB, 2, {MMXREG,MMXREG,0}, "\2\x0F\x67\110", IF_PENT|IF_MMX},
+    {I_PADDB, 2, {MMXREG,MEMORY,0}, "\301\2\x0F\xFC\110", IF_PENT|IF_MMX|IF_SM},
+    {I_PADDB, 2, {MMXREG,MMXREG,0}, "\2\x0F\xFC\110", IF_PENT|IF_MMX},
+    {I_PADDD, 2, {MMXREG,MEMORY,0}, "\301\2\x0F\xFE\110", IF_PENT|IF_MMX|IF_SM},
+    {I_PADDD, 2, {MMXREG,MMXREG,0}, "\2\x0F\xFE\110", IF_PENT|IF_MMX},
+    {I_PADDSB, 2, {MMXREG,MEMORY,0}, "\301\2\x0F\xEC\110", IF_PENT|IF_MMX|IF_SM},
+    {I_PADDSB, 2, {MMXREG,MMXREG,0}, "\2\x0F\xEC\110", IF_PENT|IF_MMX},
+    {I_PADDSIW, 2, {MMXREG,MEMORY,0}, "\301\2\x0F\x51\110", IF_PENT|IF_MMX|IF_SM|IF_CYRIX},
+    {I_PADDSIW, 2, {MMXREG,MMXREG,0}, "\2\x0F\x51\110", IF_PENT|IF_MMX|IF_CYRIX},
+    {I_PADDSW, 2, {MMXREG,MEMORY,0}, "\301\2\x0F\xED\110", IF_PENT|IF_MMX|IF_SM},
+    {I_PADDSW, 2, {MMXREG,MMXREG,0}, "\2\x0F\xED\110", IF_PENT|IF_MMX},
+    {I_PADDUSB, 2, {MMXREG,MEMORY,0}, "\301\2\x0F\xDC\110", IF_PENT|IF_MMX|IF_SM},
+    {I_PADDUSB, 2, {MMXREG,MMXREG,0}, "\2\x0F\xDC\110", IF_PENT|IF_MMX},
+    {I_PADDUSW, 2, {MMXREG,MEMORY,0}, "\301\2\x0F\xDD\110", IF_PENT|IF_MMX|IF_SM},
+    {I_PADDUSW, 2, {MMXREG,MMXREG,0}, "\2\x0F\xDD\110", IF_PENT|IF_MMX},
+    {I_PADDW, 2, {MMXREG,MEMORY,0}, "\301\2\x0F\xFD\110", IF_PENT|IF_MMX|IF_SM},
+    {I_PADDW, 2, {MMXREG,MMXREG,0}, "\2\x0F\xFD\110", IF_PENT|IF_MMX},
+    {I_PAND, 2, {MMXREG,MEMORY,0}, "\301\2\x0F\xDB\110", IF_PENT|IF_MMX|IF_SM},
+    {I_PAND, 2, {MMXREG,MMXREG,0}, "\2\x0F\xDB\110", IF_PENT|IF_MMX},
+    {I_PANDN, 2, {MMXREG,MEMORY,0}, "\301\2\x0F\xDF\110", IF_PENT|IF_MMX|IF_SM},
+    {I_PANDN, 2, {MMXREG,MMXREG,0}, "\2\x0F\xDF\110", IF_PENT|IF_MMX},
+    {I_PAVEB, 2, {MMXREG,MEMORY,0}, "\301\2\x0F\x50\110", IF_PENT|IF_MMX|IF_SM|IF_CYRIX},
+    {I_PAVEB, 2, {MMXREG,MMXREG,0}, "\2\x0F\x50\110", IF_PENT|IF_MMX|IF_CYRIX},
+    {I_PCMPEQB, 2, {MMXREG,MEMORY,0}, "\301\2\x0F\x74\110", IF_PENT|IF_MMX|IF_SM},
+    {I_PCMPEQB, 2, {MMXREG,MMXREG,0}, "\2\x0F\x74\110", IF_PENT|IF_MMX},
+    {I_PCMPEQD, 2, {MMXREG,MEMORY,0}, "\301\2\x0F\x76\110", IF_PENT|IF_MMX|IF_SM},
+    {I_PCMPEQD, 2, {MMXREG,MMXREG,0}, "\2\x0F\x76\110", IF_PENT|IF_MMX},
+    {I_PCMPEQW, 2, {MMXREG,MEMORY,0}, "\301\2\x0F\x75\110", IF_PENT|IF_MMX|IF_SM},
+    {I_PCMPEQW, 2, {MMXREG,MMXREG,0}, "\2\x0F\x75\110", IF_PENT|IF_MMX},
+    {I_PCMPGTB, 2, {MMXREG,MEMORY,0}, "\301\2\x0F\x64\110", IF_PENT|IF_MMX|IF_SM},
+    {I_PCMPGTB, 2, {MMXREG,MMXREG,0}, "\2\x0F\x64\110", IF_PENT|IF_MMX},
+    {I_PCMPGTD, 2, {MMXREG,MEMORY,0}, "\301\2\x0F\x66\110", IF_PENT|IF_MMX|IF_SM},
+    {I_PCMPGTD, 2, {MMXREG,MMXREG,0}, "\2\x0F\x66\110", IF_PENT|IF_MMX},
+    {I_PCMPGTW, 2, {MMXREG,MEMORY,0}, "\301\2\x0F\x65\110", IF_PENT|IF_MMX|IF_SM},
+    {I_PCMPGTW, 2, {MMXREG,MMXREG,0}, "\2\x0F\x65\110", IF_PENT|IF_MMX},
+    {I_PDISTIB, 2, {MMXREG,MEMORY,0}, "\301\2\x0F\x54\110", IF_PENT|IF_MMX|IF_SM|IF_CYRIX},
+    {I_PMACHRIW, 2, {MMXREG,MEMORY,0}, "\301\2\x0F\x5E\110", IF_PENT|IF_MMX|IF_SM|IF_CYRIX},
+    {I_PMADDWD, 2, {MMXREG,MEMORY,0}, "\301\2\x0F\xF5\110", IF_PENT|IF_MMX|IF_SM},
+    {I_PMADDWD, 2, {MMXREG,MMXREG,0}, "\2\x0F\xF5\110", IF_PENT|IF_MMX},
+    {I_PMAGW, 2, {MMXREG,MEMORY,0}, "\301\2\x0F\x52\110", IF_PENT|IF_MMX|IF_SM|IF_CYRIX},
+    {I_PMAGW, 2, {MMXREG,MMXREG,0}, "\2\x0F\x52\110", IF_PENT|IF_MMX|IF_CYRIX},
+    {I_PMULHRW, 2, {MMXREG,MEMORY,0}, "\301\2\x0F\x59\110", IF_PENT|IF_MMX|IF_SM|IF_CYRIX},
+    {I_PMULHRW, 2, {MMXREG,MMXREG,0}, "\2\x0F\x59\110", IF_PENT|IF_MMX|IF_CYRIX},
+    {I_PMULHRIW, 2, {MMXREG,MEMORY,0}, "\301\2\x0F\x5D\110", IF_PENT|IF_MMX|IF_SM|IF_CYRIX},
+    {I_PMULHRIW, 2, {MMXREG,MMXREG,0}, "\2\x0F\x5D\110", IF_PENT|IF_MMX|IF_CYRIX},
+    {I_PMULHW, 2, {MMXREG,MEMORY,0}, "\301\2\x0F\xE5\110", IF_PENT|IF_MMX|IF_SM},
+    {I_PMULHW, 2, {MMXREG,MMXREG,0}, "\2\x0F\xE5\110", IF_PENT|IF_MMX},
+    {I_PMULLW, 2, {MMXREG,MEMORY,0}, "\301\2\x0F\xD5\110", IF_PENT|IF_MMX|IF_SM},
+    {I_PMULLW, 2, {MMXREG,MMXREG,0}, "\2\x0F\xD5\110", IF_PENT|IF_MMX},
+    {I_PMVGEZB, 2, {MMXREG,MEMORY,0}, "\301\2\x0F\x5C\110", IF_PENT|IF_MMX|IF_SM|IF_CYRIX},
+    {I_PMVLZB, 2, {MMXREG,MEMORY,0}, "\301\2\x0F\x5B\110", IF_PENT|IF_MMX|IF_SM|IF_CYRIX},
+    {I_PMVNZB, 2, {MMXREG,MEMORY,0}, "\301\2\x0F\x5A\110", IF_PENT|IF_MMX|IF_SM|IF_CYRIX},
+    {I_PMVZB, 2, {MMXREG,MEMORY,0}, "\301\2\x0F\x58\110", IF_PENT|IF_MMX|IF_SM|IF_CYRIX},
+    {I_POP, 1, {REG16,0,0}, "\320\10\x58", IF_8086},
+    {I_POP, 1, {REG32,0,0}, "\321\10\x58", IF_386},
+    {I_POP, 1, {REGMEM|BITS16,0,0}, "\320\300\1\x8F\200", IF_8086},
+    {I_POP, 1, {REGMEM|BITS32,0,0}, "\321\300\1\x8F\200", IF_386},
+    {I_POP, 1, {REG_DESS,0,0}, "\4", IF_8086},
+    {I_POP, 1, {REG_FSGS,0,0}, "\1\x0F\5", IF_386},
+    {I_POPA, 0, {0,0,0}, "\322\1\x61", IF_186},
+    {I_POPAD, 0, {0,0,0}, "\321\1\x61", IF_386},
+    {I_POPAW, 0, {0,0,0}, "\320\1\x61", IF_186},
+    {I_POPF, 0, {0,0,0}, "\322\1\x9D", IF_186},
+    {I_POPFD, 0, {0,0,0}, "\321\1\x9D", IF_386},
+    {I_POPFW, 0, {0,0,0}, "\320\1\x9D", IF_186},
+    {I_POR, 2, {MMXREG,MEMORY,0}, "\301\2\x0F\xEB\110", IF_PENT|IF_MMX|IF_SM},
+    {I_POR, 2, {MMXREG,MMXREG,0}, "\2\x0F\xEB\110", IF_PENT|IF_MMX},
+    {I_PSLLD, 2, {MMXREG,MEMORY,0}, "\301\2\x0F\xF2\110", IF_PENT|IF_MMX|IF_SM},
+    {I_PSLLD, 2, {MMXREG,MMXREG,0}, "\2\x0F\xF2\110", IF_PENT|IF_MMX},
+    {I_PSLLD, 2, {MMXREG,IMMEDIATE,0}, "\2\x0F\x72\206\25", IF_PENT|IF_MMX},
+    {I_PSLLQ, 2, {MMXREG,MEMORY,0}, "\301\2\x0F\xF3\110", IF_PENT|IF_MMX|IF_SM},
+    {I_PSLLQ, 2, {MMXREG,MMXREG,0}, "\2\x0F\xF3\110", IF_PENT|IF_MMX},
+    {I_PSLLQ, 2, {MMXREG,IMMEDIATE,0}, "\2\x0F\x73\206\25", IF_PENT|IF_MMX},
+    {I_PSLLW, 2, {MMXREG,MEMORY,0}, "\301\2\x0F\xF1\110", IF_PENT|IF_MMX|IF_SM},
+    {I_PSLLW, 2, {MMXREG,MMXREG,0}, "\2\x0F\xF1\110", IF_PENT|IF_MMX},
+    {I_PSLLW, 2, {MMXREG,IMMEDIATE,0}, "\2\x0F\x71\206\25", IF_PENT|IF_MMX},
+    {I_PSRAD, 2, {MMXREG,MEMORY,0}, "\301\2\x0F\xE2\110", IF_PENT|IF_MMX|IF_SM},
+    {I_PSRAD, 2, {MMXREG,MMXREG,0}, "\2\x0F\xE2\110", IF_PENT|IF_MMX},
+    {I_PSRAD, 2, {MMXREG,IMMEDIATE,0}, "\2\x0F\x72\204\25", IF_PENT|IF_MMX},
+    {I_PSRAW, 2, {MMXREG,MEMORY,0}, "\301\2\x0F\xE1\110", IF_PENT|IF_MMX|IF_SM},
+    {I_PSRAW, 2, {MMXREG,MMXREG,0}, "\2\x0F\xE1\110", IF_PENT|IF_MMX},
+    {I_PSRAW, 2, {MMXREG,IMMEDIATE,0}, "\2\x0F\x71\204\25", IF_PENT|IF_MMX},
+    {I_PSRLD, 2, {MMXREG,MEMORY,0}, "\301\2\x0F\xD2\110", IF_PENT|IF_MMX|IF_SM},
+    {I_PSRLD, 2, {MMXREG,MMXREG,0}, "\2\x0F\xD2\110", IF_PENT|IF_MMX},
+    {I_PSRLD, 2, {MMXREG,IMMEDIATE,0}, "\2\x0F\x72\202\25", IF_PENT|IF_MMX},
+    {I_PSRLQ, 2, {MMXREG,MEMORY,0}, "\301\2\x0F\xD3\110", IF_PENT|IF_MMX|IF_SM},
+    {I_PSRLQ, 2, {MMXREG,MMXREG,0}, "\2\x0F\xD3\110", IF_PENT|IF_MMX},
+    {I_PSRLQ, 2, {MMXREG,IMMEDIATE,0}, "\2\x0F\x73\202\25", IF_PENT|IF_MMX},
+    {I_PSRLW, 2, {MMXREG,MEMORY,0}, "\301\2\x0F\xD1\110", IF_PENT|IF_MMX|IF_SM},
+    {I_PSRLW, 2, {MMXREG,MMXREG,0}, "\2\x0F\xD1\110", IF_PENT|IF_MMX},
+    {I_PSRLW, 2, {MMXREG,IMMEDIATE,0}, "\2\x0F\x71\202\25", IF_PENT|IF_MMX},
+    {I_PSUBB, 2, {MMXREG,MEMORY,0}, "\301\2\x0F\xF8\110", IF_PENT|IF_MMX|IF_SM},
+    {I_PSUBB, 2, {MMXREG,MMXREG,0}, "\2\x0F\xF8\110", IF_PENT|IF_MMX},
+    {I_PSUBD, 2, {MMXREG,MEMORY,0}, "\301\2\x0F\xFA\110", IF_PENT|IF_MMX|IF_SM},
+    {I_PSUBD, 2, {MMXREG,MMXREG,0}, "\2\x0F\xFA\110", IF_PENT|IF_MMX},
+    {I_PSUBSB, 2, {MMXREG,MEMORY,0}, "\301\2\x0F\xE8\110", IF_PENT|IF_MMX|IF_SM},
+    {I_PSUBSB, 2, {MMXREG,MMXREG,0}, "\2\x0F\xE8\110", IF_PENT|IF_MMX},
+    {I_PSUBSIW, 2, {MMXREG,MEMORY,0}, "\301\2\x0F\x55\110", IF_PENT|IF_MMX|IF_SM|IF_CYRIX},
+    {I_PSUBSIW, 2, {MMXREG,MMXREG,0}, "\2\x0F\x55\110", IF_PENT|IF_MMX|IF_CYRIX},
+    {I_PSUBSW, 2, {MMXREG,MEMORY,0}, "\301\2\x0F\xE9\110", IF_PENT|IF_MMX|IF_SM},
+    {I_PSUBSW, 2, {MMXREG,MMXREG,0}, "\2\x0F\xE9\110", IF_PENT|IF_MMX},
+    {I_PSUBUSB, 2, {MMXREG,MEMORY,0}, "\301\2\x0F\xD8\110", IF_PENT|IF_MMX|IF_SM},
+    {I_PSUBUSB, 2, {MMXREG,MMXREG,0}, "\2\x0F\xD8\110", IF_PENT|IF_MMX},
+    {I_PSUBUSW, 2, {MMXREG,MEMORY,0}, "\301\2\x0F\xD9\110", IF_PENT|IF_MMX|IF_SM},
+    {I_PSUBUSW, 2, {MMXREG,MMXREG,0}, "\2\x0F\xD9\110", IF_PENT|IF_MMX},
+    {I_PSUBW, 2, {MMXREG,MEMORY,0}, "\301\2\x0F\xF9\110", IF_PENT|IF_MMX|IF_SM},
+    {I_PSUBW, 2, {MMXREG,MMXREG,0}, "\2\x0F\xF9\110", IF_PENT|IF_MMX},
+    {I_PUNPCKHBW, 2, {MMXREG,MEMORY,0}, "\301\2\x0F\x68\110", IF_PENT|IF_MMX|IF_SM},
+    {I_PUNPCKHBW, 2, {MMXREG,MMXREG,0}, "\2\x0F\x68\110", IF_PENT|IF_MMX},
+    {I_PUNPCKHDQ, 2, {MMXREG,MEMORY,0}, "\301\2\x0F\x6A\110", IF_PENT|IF_MMX|IF_SM},
+    {I_PUNPCKHDQ, 2, {MMXREG,MMXREG,0}, "\2\x0F\x6A\110", IF_PENT|IF_MMX},
+    {I_PUNPCKHWD, 2, {MMXREG,MEMORY,0}, "\301\2\x0F\x69\110", IF_PENT|IF_MMX|IF_SM},
+    {I_PUNPCKHWD, 2, {MMXREG,MMXREG,0}, "\2\x0F\x69\110", IF_PENT|IF_MMX},
+    {I_PUNPCKLBW, 2, {MMXREG,MEMORY,0}, "\301\2\x0F\x60\110", IF_PENT|IF_MMX|IF_SM},
+    {I_PUNPCKLBW, 2, {MMXREG,MMXREG,0}, "\2\x0F\x60\110", IF_PENT|IF_MMX},
+    {I_PUNPCKLDQ, 2, {MMXREG,MEMORY,0}, "\301\2\x0F\x62\110", IF_PENT|IF_MMX|IF_SM},
+    {I_PUNPCKLDQ, 2, {MMXREG,MMXREG,0}, "\2\x0F\x62\110", IF_PENT|IF_MMX},
+    {I_PUNPCKLWD, 2, {MMXREG,MEMORY,0}, "\301\2\x0F\x61\110", IF_PENT|IF_MMX|IF_SM},
+    {I_PUNPCKLWD, 2, {MMXREG,MMXREG,0}, "\2\x0F\x61\110", IF_PENT|IF_MMX},
+    {I_PUSH, 1, {REG16,0,0}, "\320\10\x50", IF_8086},
+    {I_PUSH, 1, {REG32,0,0}, "\321\10\x50", IF_386},
+    {I_PUSH, 1, {REGMEM|BITS16,0,0}, "\320\300\1\xFF\206", IF_8086},
+    {I_PUSH, 1, {REGMEM|BITS32,0,0}, "\321\300\1\xFF\206", IF_386},
+    {I_PUSH, 1, {REG_FSGS,0,0}, "\1\x0F\7", IF_386},
+    {I_PUSH, 1, {REG_SREG,0,0}, "\6", IF_8086},
+    {I_PUSH, 1, {IMMEDIATE|BITS8,0,0}, "\1\x6A\14", IF_286},
+    {I_PUSH, 1, {IMMEDIATE|BITS16,0,0}, "\320\1\x68\30", IF_286},
+    {I_PUSH, 1, {IMMEDIATE|BITS32,0,0}, "\321\1\x68\40", IF_386},
+    {I_PUSHA, 0, {0,0,0}, "\322\1\x60", IF_186},
+    {I_PUSHAD, 0, {0,0,0}, "\321\1\x60", IF_386},
+    {I_PUSHAW, 0, {0,0,0}, "\320\1\x60", IF_186},
+    {I_PUSHF, 0, {0,0,0}, "\322\1\x9C", IF_186},
+    {I_PUSHFD, 0, {0,0,0}, "\321\1\x9C", IF_386},
+    {I_PUSHFW, 0, {0,0,0}, "\320\1\x9C", IF_186},
+    {I_PXOR, 2, {MMXREG,MEMORY,0}, "\301\2\x0F\xEF\110", IF_PENT|IF_MMX|IF_SM},
+    {I_PXOR, 2, {MMXREG,MMXREG,0}, "\2\x0F\xEF\110", IF_PENT|IF_MMX},
+    {I_RCL, 2, {REGMEM|BITS8,UNITY,0}, "\300\1\xD0\202", IF_8086},
+    {I_RCL, 2, {REGMEM|BITS8,REG_CL,0}, "\300\1\xD2\202", IF_8086},
+    {I_RCL, 2, {REGMEM|BITS8,IMMEDIATE,0}, "\300\1\xC0\202\25", IF_286|IF_SB},
+    {I_RCL, 2, {REGMEM|BITS16,UNITY,0}, "\320\300\1\xD1\202", IF_8086},
+    {I_RCL, 2, {REGMEM|BITS16,REG_CL,0}, "\320\300\1\xD3\202", IF_8086},
+    {I_RCL, 2, {REGMEM|BITS16,IMMEDIATE,0}, "\320\300\1\xC1\202\25", IF_286|IF_SB},
+    {I_RCL, 2, {REGMEM|BITS32,UNITY,0}, "\321\300\1\xD1\202", IF_386},
+    {I_RCL, 2, {REGMEM|BITS32,REG_CL,0}, "\321\300\1\xD3\202", IF_386},
+    {I_RCL, 2, {REGMEM|BITS32,IMMEDIATE,0}, "\321\300\1\xC1\202\25", IF_386|IF_SB},
+    {I_RCR, 2, {REGMEM|BITS8,UNITY,0}, "\300\1\xD0\203", IF_8086},
+    {I_RCR, 2, {REGMEM|BITS8,REG_CL,0}, "\300\1\xD2\203", IF_8086},
+    {I_RCR, 2, {REGMEM|BITS8,IMMEDIATE,0}, "\300\1\xC0\203\25", IF_286|IF_SB},
+    {I_RCR, 2, {REGMEM|BITS16,UNITY,0}, "\320\300\1\xD1\203", IF_8086},
+    {I_RCR, 2, {REGMEM|BITS16,REG_CL,0}, "\320\300\1\xD3\203", IF_8086},
+    {I_RCR, 2, {REGMEM|BITS16,IMMEDIATE,0}, "\320\300\1\xC1\203\25", IF_286|IF_SB},
+    {I_RCR, 2, {REGMEM|BITS32,UNITY,0}, "\321\300\1\xD1\203", IF_386},
+    {I_RCR, 2, {REGMEM|BITS32,REG_CL,0}, "\321\300\1\xD3\203", IF_386},
+    {I_RCR, 2, {REGMEM|BITS32,IMMEDIATE,0}, "\321\300\1\xC1\203\25", IF_386|IF_SB},
+    {I_RDMSR, 0, {0,0,0}, "\2\x0F\x32", IF_PENT},
+    {I_RDPMC, 0, {0,0,0}, "\2\x0F\x33", IF_P6},
+    {I_RDTSC, 0, {0,0,0}, "\2\x0F\x31", IF_PENT},
+    {I_RESB, 1, {IMMEDIATE,0,0}, "\340", IF_8086},
+    {I_RET, 0, {0,0,0}, "\1\xC3", IF_8086},
+    {I_RET, 1, {IMMEDIATE,0,0}, "\1\xC2\30", IF_8086},
+    {I_RETF, 0, {0,0,0}, "\1\xCB", IF_8086},
+    {I_RETF, 1, {IMMEDIATE,0,0}, "\1\xCA\30", IF_8086},
+    {I_RETN, 0, {0,0,0}, "\1\xC3", IF_8086},
+    {I_RETN, 1, {IMMEDIATE,0,0}, "\1\xC2\30", IF_8086},
+    {I_ROL, 2, {REGMEM|BITS8,UNITY,0}, "\300\1\xD0\200", IF_8086},
+    {I_ROL, 2, {REGMEM|BITS8,REG_CL,0}, "\300\1\xD2\200", IF_8086},
+    {I_ROL, 2, {REGMEM|BITS8,IMMEDIATE,0}, "\300\1\xC0\200\25", IF_286|IF_SB},
+    {I_ROL, 2, {REGMEM|BITS16,UNITY,0}, "\320\300\1\xD1\200", IF_8086},
+    {I_ROL, 2, {REGMEM|BITS16,REG_CL,0}, "\320\300\1\xD3\200", IF_8086},
+    {I_ROL, 2, {REGMEM|BITS16,IMMEDIATE,0}, "\320\300\1\xC1\200\25", IF_286|IF_SB},
+    {I_ROL, 2, {REGMEM|BITS32,UNITY,0}, "\321\300\1\xD1\200", IF_386},
+    {I_ROL, 2, {REGMEM|BITS32,REG_CL,0}, "\321\300\1\xD3\200", IF_386},
+    {I_ROL, 2, {REGMEM|BITS32,IMMEDIATE,0}, "\321\300\1\xC1\200\25", IF_386|IF_SB},
+    {I_ROR, 2, {REGMEM|BITS8,UNITY,0}, "\300\1\xD0\201", IF_8086},
+    {I_ROR, 2, {REGMEM|BITS8,REG_CL,0}, "\300\1\xD2\201", IF_8086},
+    {I_ROR, 2, {REGMEM|BITS8,IMMEDIATE,0}, "\300\1\xC0\201\25", IF_286|IF_SB},
+    {I_ROR, 2, {REGMEM|BITS16,UNITY,0}, "\320\300\1\xD1\201", IF_8086},
+    {I_ROR, 2, {REGMEM|BITS16,REG_CL,0}, "\320\300\1\xD3\201", IF_8086},
+    {I_ROR, 2, {REGMEM|BITS16,IMMEDIATE,0}, "\320\300\1\xC1\201\25", IF_286|IF_SB},
+    {I_ROR, 2, {REGMEM|BITS32,UNITY,0}, "\321\300\1\xD1\201", IF_386},
+    {I_ROR, 2, {REGMEM|BITS32,REG_CL,0}, "\321\300\1\xD3\201", IF_386},
+    {I_ROR, 2, {REGMEM|BITS32,IMMEDIATE,0}, "\321\300\1\xC1\201\25", IF_386|IF_SB},
+    {I_RSM, 0, {0,0,0}, "\2\x0F\xAA", IF_PENT},
+    {I_SAHF, 0, {0,0,0}, "\1\x9E", IF_8086},
+    {I_SALC, 0, {0,0,0}, "\1\xD6", IF_8086|IF_UNDOC},
+    {I_SAR, 2, {REGMEM|BITS8,UNITY,0}, "\300\1\xD0\207", IF_8086},
+    {I_SAR, 2, {REGMEM|BITS8,REG_CL,0}, "\300\1\xD2\207", IF_8086},
+    {I_SAR, 2, {REGMEM|BITS8,IMMEDIATE,0}, "\300\1\xC0\207\25", IF_286|IF_SB},
+    {I_SAR, 2, {REGMEM|BITS16,UNITY,0}, "\320\300\1\xD1\207", IF_8086},
+    {I_SAR, 2, {REGMEM|BITS16,REG_CL,0}, "\320\300\1\xD3\207", IF_8086},
+    {I_SAR, 2, {REGMEM|BITS16,IMMEDIATE,0}, "\320\300\1\xC1\207\25", IF_286|IF_SB},
+    {I_SAR, 2, {REGMEM|BITS32,UNITY,0}, "\321\300\1\xD1\207", IF_386},
+    {I_SAR, 2, {REGMEM|BITS32,REG_CL,0}, "\321\300\1\xD3\207", IF_386},
+    {I_SAR, 2, {REGMEM|BITS32,IMMEDIATE,0}, "\321\300\1\xC1\207\25", IF_386|IF_SB},
+    {I_SBB, 2, {MEMORY,REG8,0}, "\300\1\x18\101", IF_8086|IF_SM},
+    {I_SBB, 2, {REG8,REG8,0}, "\300\1\x18\101", IF_8086},
+    {I_SBB, 2, {MEMORY,REG16,0}, "\320\300\1\x19\101", IF_8086|IF_SM},
+    {I_SBB, 2, {REG16,REG16,0}, "\320\300\1\x19\101", IF_8086},
+    {I_SBB, 2, {MEMORY,REG32,0}, "\321\300\1\x19\101", IF_386|IF_SM},
+    {I_SBB, 2, {REG32,REG32,0}, "\321\300\1\x19\101", IF_386},
+    {I_SBB, 2, {REG8,MEMORY,0}, "\301\1\x1A\110", IF_8086|IF_SM},
+    {I_SBB, 2, {REG8,REG8,0}, "\301\1\x1A\110", IF_8086},
+    {I_SBB, 2, {REG16,MEMORY,0}, "\320\301\1\x1B\110", IF_8086|IF_SM},
+    {I_SBB, 2, {REG16,REG16,0}, "\320\301\1\x1B\110", IF_8086},
+    {I_SBB, 2, {REG32,MEMORY,0}, "\321\301\1\x1B\110", IF_386|IF_SM},
+    {I_SBB, 2, {REG32,REG32,0}, "\321\301\1\x1B\110", IF_386},
+    {I_SBB, 2, {REGMEM|BITS16,IMMEDIATE|BITS8,0}, "\320\300\1\x83\203\15", IF_8086},
+    {I_SBB, 2, {REGMEM|BITS32,IMMEDIATE|BITS8,0}, "\321\300\1\x83\203\15", IF_8086},
+    {I_SBB, 2, {REG_AL,IMMEDIATE,0}, "\1\x1C\21", IF_8086|IF_SM},
+    {I_SBB, 2, {REG_AX,IMMEDIATE,0}, "\320\1\x1D\31", IF_8086|IF_SM},
+    {I_SBB, 2, {REG_EAX,IMMEDIATE,0}, "\321\1\x1D\41", IF_386|IF_SM},
+    {I_SBB, 2, {REGMEM|BITS8,IMMEDIATE,0}, "\300\1\x80\203\21", IF_8086|IF_SM},
+    {I_SBB, 2, {REGMEM|BITS16,IMMEDIATE,0}, "\320\300\1\x81\203\31", IF_8086|IF_SM},
+    {I_SBB, 2, {REGMEM|BITS32,IMMEDIATE,0}, "\321\300\1\x81\203\41", IF_386|IF_SM},
+    {I_SBB, 2, {MEMORY,IMMEDIATE|BITS8,0}, "\300\1\x80\203\21", IF_8086|IF_SM},
+    {I_SBB, 2, {MEMORY,IMMEDIATE|BITS16,0}, "\320\300\1\x81\203\31", IF_8086|IF_SM},
+    {I_SBB, 2, {MEMORY,IMMEDIATE|BITS32,0}, "\321\300\1\x81\203\41", IF_386|IF_SM},
+    {I_SCASB, 0, {0,0,0}, "\1\xAE", IF_8086},
+    {I_SCASD, 0, {0,0,0}, "\321\1\xAF", IF_386},
+    {I_SCASW, 0, {0,0,0}, "\320\1\xAF", IF_8086},
+    {I_SGDT, 1, {MEMORY,0,0}, "\300\2\x0F\x01\200", IF_286|IF_PRIV},
+    {I_SHL, 2, {REGMEM|BITS8,UNITY,0}, "\300\1\xD0\204", IF_8086},
+    {I_SHL, 2, {REGMEM|BITS8,REG_CL,0}, "\300\1\xD2\204", IF_8086},
+    {I_SHL, 2, {REGMEM|BITS8,IMMEDIATE,0}, "\300\1\xC0\204\25", IF_286|IF_SB},
+    {I_SHL, 2, {REGMEM|BITS16,UNITY,0}, "\320\300\1\xD1\204", IF_8086},
+    {I_SHL, 2, {REGMEM|BITS16,REG_CL,0}, "\320\300\1\xD3\204", IF_8086},
+    {I_SHL, 2, {REGMEM|BITS16,IMMEDIATE,0}, "\320\300\1\xC1\204\25", IF_286|IF_SB},
+    {I_SHL, 2, {REGMEM|BITS32,UNITY,0}, "\321\300\1\xD1\204", IF_386},
+    {I_SHL, 2, {REGMEM|BITS32,REG_CL,0}, "\321\300\1\xD3\204", IF_386},
+    {I_SHL, 2, {REGMEM|BITS32,IMMEDIATE,0}, "\321\300\1\xC1\204\25", IF_386|IF_SB},
+    {I_SHLD, 3, {MEMORY,REG16,IMMEDIATE}, "\300\320\2\x0F\xA4\101\26", IF_386|IF_SM2},
+    {I_SHLD, 3, {REG16,REG16,IMMEDIATE}, "\300\320\2\x0F\xA4\101\26", IF_386|IF_SM2},
+    {I_SHLD, 3, {MEMORY,REG32,IMMEDIATE}, "\300\321\2\x0F\xA4\101\26", IF_386|IF_SM2},
+    {I_SHLD, 3, {REG32,REG32,IMMEDIATE}, "\300\321\2\x0F\xA4\101\26", IF_386|IF_SM2},
+    {I_SHLD, 3, {MEMORY,REG16,REG_CL}, "\300\320\2\x0F\xA5\101", IF_386|IF_SM},
+    {I_SHLD, 3, {REG16,REG16,REG_CL}, "\300\320\2\x0F\xA5\101", IF_386},
+    {I_SHLD, 3, {MEMORY,REG32,REG_CL}, "\300\321\2\x0F\xA5\101", IF_386|IF_SM},
+    {I_SHLD, 3, {REG32,REG32,REG_CL}, "\300\321\2\x0F\xA5\101", IF_386},
+    {I_SHR, 2, {REGMEM|BITS8,UNITY,0}, "\300\1\xD0\205", IF_8086},
+    {I_SHR, 2, {REGMEM|BITS8,REG_CL,0}, "\300\1\xD2\205", IF_8086},
+    {I_SHR, 2, {REGMEM|BITS8,IMMEDIATE,0}, "\300\1\xC0\205\25", IF_286|IF_SB},
+    {I_SHR, 2, {REGMEM|BITS16,UNITY,0}, "\320\300\1\xD1\205", IF_8086},
+    {I_SHR, 2, {REGMEM|BITS16,REG_CL,0}, "\320\300\1\xD3\205", IF_8086},
+    {I_SHR, 2, {REGMEM|BITS16,IMMEDIATE,0}, "\320\300\1\xC1\205\25", IF_286|IF_SB},
+    {I_SHR, 2, {REGMEM|BITS32,UNITY,0}, "\321\300\1\xD1\205", IF_386},
+    {I_SHR, 2, {REGMEM|BITS32,REG_CL,0}, "\321\300\1\xD3\205", IF_386},
+    {I_SHR, 2, {REGMEM|BITS32,IMMEDIATE,0}, "\321\300\1\xC1\205\25", IF_386|IF_SB},
+    {I_SHRD, 3, {MEMORY,REG16,IMMEDIATE}, "\300\320\2\x0F\xAC\101\26", IF_386|IF_SM2},
+    {I_SHRD, 3, {REG16,REG16,IMMEDIATE}, "\300\320\2\x0F\xAC\101\26", IF_386|IF_SM2},
+    {I_SHRD, 3, {MEMORY,REG32,IMMEDIATE}, "\300\321\2\x0F\xAC\101\26", IF_386|IF_SM2},
+    {I_SHRD, 3, {REG32,REG32,IMMEDIATE}, "\300\321\2\x0F\xAC\101\26", IF_386|IF_SM2},
+    {I_SHRD, 3, {MEMORY,REG16,REG_CL}, "\300\320\2\x0F\xAD\101", IF_386|IF_SM},
+    {I_SHRD, 3, {REG16,REG16,REG_CL}, "\300\320\2\x0F\xAD\101", IF_386},
+    {I_SHRD, 3, {MEMORY,REG32,REG_CL}, "\300\321\2\x0F\xAD\101", IF_386|IF_SM},
+    {I_SHRD, 3, {REG32,REG32,REG_CL}, "\300\321\2\x0F\xAD\101", IF_386},
+    {I_SIDT, 1, {MEMORY,0,0}, "\300\2\x0F\x01\201", IF_286|IF_PRIV},
+    {I_SLDT, 1, {MEMORY,0,0}, "\300\1\x0F\17\200", IF_286|IF_PRIV},
+    {I_SLDT, 1, {MEMORY|BITS16,0,0}, "\300\1\x0F\17\200", IF_286|IF_PRIV},
+    {I_SLDT, 1, {REG16,0,0}, "\300\1\x0F\17\200", IF_286|IF_PRIV},
+    {I_SMI, 0, {0,0,0}, "\1\xF1", IF_386|IF_UNDOC},
+    {I_SMSW, 1, {MEMORY,0,0}, "\300\2\x0F\x01\204", IF_286|IF_PRIV},
+    {I_SMSW, 1, {MEMORY|BITS16,0,0}, "\300\2\x0F\x01\204", IF_286|IF_PRIV},
+    {I_SMSW, 1, {REG16,0,0}, "\300\2\x0F\x01\204", IF_286|IF_PRIV},
+    {I_STC, 0, {0,0,0}, "\1\xF9", IF_8086},
+    {I_STD, 0, {0,0,0}, "\1\xFD", IF_8086},
+    {I_STI, 0, {0,0,0}, "\1\xFB", IF_8086},
+    {I_STOSB, 0, {0,0,0}, "\1\xAA", IF_8086},
+    {I_STOSD, 0, {0,0,0}, "\321\1\xAB", IF_386},
+    {I_STOSW, 0, {0,0,0}, "\320\1\xAB", IF_8086},
+    {I_STR, 1, {MEMORY,0,0}, "\300\1\x0F\17\201", IF_286|IF_PRIV},
+    {I_STR, 1, {MEMORY|BITS16,0,0}, "\300\1\x0F\17\201", IF_286|IF_PRIV},
+    {I_STR, 1, {REG16,0,0}, "\300\1\x0F\17\201", IF_286|IF_PRIV},
+    {I_SUB, 2, {MEMORY,REG8,0}, "\300\1\x28\101", IF_8086|IF_SM},
+    {I_SUB, 2, {REG8,REG8,0}, "\300\1\x28\101", IF_8086},
+    {I_SUB, 2, {MEMORY,REG16,0}, "\320\300\1\x29\101", IF_8086|IF_SM},
+    {I_SUB, 2, {REG16,REG16,0}, "\320\300\1\x29\101", IF_8086},
+    {I_SUB, 2, {MEMORY,REG32,0}, "\321\300\1\x29\101", IF_386|IF_SM},
+    {I_SUB, 2, {REG32,REG32,0}, "\321\300\1\x29\101", IF_386},
+    {I_SUB, 2, {REG8,MEMORY,0}, "\301\1\x2A\110", IF_8086|IF_SM},
+    {I_SUB, 2, {REG8,REG8,0}, "\301\1\x2A\110", IF_8086},
+    {I_SUB, 2, {REG16,MEMORY,0}, "\320\301\1\x2B\110", IF_8086|IF_SM},
+    {I_SUB, 2, {REG16,REG16,0}, "\320\301\1\x2B\110", IF_8086},
+    {I_SUB, 2, {REG32,MEMORY,0}, "\321\301\1\x2B\110", IF_386|IF_SM},
+    {I_SUB, 2, {REG32,REG32,0}, "\321\301\1\x2B\110", IF_386},
+    {I_SUB, 2, {REGMEM|BITS16,IMMEDIATE|BITS8,0}, "\320\300\1\x83\205\15", IF_8086},
+    {I_SUB, 2, {REGMEM|BITS32,IMMEDIATE|BITS8,0}, "\321\300\1\x83\205\15", IF_386},
+    {I_SUB, 2, {REG_AL,IMMEDIATE,0}, "\1\x2C\21", IF_8086|IF_SM},
+    {I_SUB, 2, {REG_AX,IMMEDIATE,0}, "\320\1\x2D\31", IF_8086|IF_SM},
+    {I_SUB, 2, {REG_EAX,IMMEDIATE,0}, "\321\1\x2D\41", IF_386|IF_SM},
+    {I_SUB, 2, {REGMEM|BITS8,IMMEDIATE,0}, "\300\1\x80\205\21", IF_8086|IF_SM},
+    {I_SUB, 2, {REGMEM|BITS16,IMMEDIATE,0}, "\320\300\1\x81\205\31", IF_8086|IF_SM},
+    {I_SUB, 2, {REGMEM|BITS32,IMMEDIATE,0}, "\321\300\1\x81\205\41", IF_386|IF_SM},
+    {I_SUB, 2, {MEMORY,IMMEDIATE|BITS8,0}, "\300\1\x80\205\21", IF_8086|IF_SM},
+    {I_SUB, 2, {MEMORY,IMMEDIATE|BITS16,0}, "\320\300\1\x81\205\31", IF_8086|IF_SM},
+    {I_SUB, 2, {MEMORY,IMMEDIATE|BITS32,0}, "\321\300\1\x81\205\41", IF_386|IF_SM},
+    {I_TEST, 2, {MEMORY,REG8,0}, "\300\1\x84\101", IF_8086|IF_SM},
+    {I_TEST, 2, {REG8,REG8,0}, "\300\1\x84\101", IF_8086},
+    {I_TEST, 2, {MEMORY,REG16,0}, "\320\300\1\x85\101", IF_8086|IF_SM},
+    {I_TEST, 2, {REG16,REG16,0}, "\320\300\1\x85\101", IF_8086},
+    {I_TEST, 2, {MEMORY,REG32,0}, "\321\300\1\x85\101", IF_386|IF_SM},
+    {I_TEST, 2, {REG32,REG32,0}, "\321\300\1\x85\101", IF_386},
+    {I_TEST, 2, {REG_AL,IMMEDIATE,0}, "\1\xA8\21", IF_8086|IF_SM},
+    {I_TEST, 2, {REG_AX,IMMEDIATE,0}, "\320\1\xA9\31", IF_8086|IF_SM},
+    {I_TEST, 2, {REG_EAX,IMMEDIATE,0}, "\321\1\xA9\41", IF_386|IF_SM},
+    {I_TEST, 2, {REGMEM|BITS8,IMMEDIATE,0}, "\300\1\xF6\200\21", IF_8086|IF_SM},
+    {I_TEST, 2, {REGMEM|BITS16,IMMEDIATE,0}, "\320\300\1\xF7\200\31", IF_8086|IF_SM},
+    {I_TEST, 2, {REGMEM|BITS32,IMMEDIATE,0}, "\321\300\1\xF7\200\41", IF_386|IF_SM},
+    {I_TEST, 2, {MEMORY,IMMEDIATE|BITS8,0}, "\300\1\xF6\200\21", IF_8086|IF_SM},
+    {I_TEST, 2, {MEMORY,IMMEDIATE|BITS16,0}, "\320\300\1\xF7\200\31", IF_8086|IF_SM},
+    {I_TEST, 2, {MEMORY,IMMEDIATE|BITS32,0}, "\321\300\1\xF7\200\41", IF_386|IF_SM},
+    {I_UMOV, 2, {MEMORY,REG8,0}, "\300\2\x0F\x10\101", IF_386|IF_UNDOC|IF_SM},
+    {I_UMOV, 2, {REG8,REG8,0}, "\300\2\x0F\x10\101", IF_386|IF_UNDOC},
+    {I_UMOV, 2, {MEMORY,REG16,0}, "\320\300\2\x0F\x11\101", IF_386|IF_UNDOC|IF_SM},
+    {I_UMOV, 2, {REG16,REG16,0}, "\320\300\2\x0F\x11\101", IF_386|IF_UNDOC},
+    {I_UMOV, 2, {MEMORY,REG32,0}, "\321\300\2\x0F\x11\101", IF_386|IF_UNDOC|IF_SM},
+    {I_UMOV, 2, {REG32,REG32,0}, "\321\300\2\x0F\x11\101", IF_386|IF_UNDOC},
+    {I_UMOV, 2, {REG8,MEMORY,0}, "\301\2\x0F\x12\110", IF_386|IF_UNDOC|IF_SM},
+    {I_UMOV, 2, {REG8,REG8,0}, "\301\2\x0F\x12\110", IF_386|IF_UNDOC},
+    {I_UMOV, 2, {REG16,MEMORY,0}, "\320\301\2\x0F\x13\110", IF_386|IF_UNDOC|IF_SM},
+    {I_UMOV, 2, {REG16,REG16,0}, "\320\301\2\x0F\x13\110", IF_386|IF_UNDOC},
+    {I_UMOV, 2, {REG32,MEMORY,0}, "\321\301\2\x0F\x13\110", IF_386|IF_UNDOC|IF_SM},
+    {I_UMOV, 2, {REG32,REG32,0}, "\321\301\2\x0F\x13\110", IF_386|IF_UNDOC},
+    {I_VERR, 1, {MEMORY,0,0}, "\300\1\x0F\17\204", IF_286|IF_PRIV},
+    {I_VERR, 1, {MEMORY|BITS16,0,0}, "\300\1\x0F\17\204", IF_286|IF_PRIV},
+    {I_VERR, 1, {REG16,0,0}, "\300\1\x0F\17\204", IF_286|IF_PRIV},
+    {I_VERW, 1, {MEMORY,0,0}, "\300\1\x0F\17\205", IF_286|IF_PRIV},
+    {I_VERW, 1, {MEMORY|BITS16,0,0}, "\300\1\x0F\17\205", IF_286|IF_PRIV},
+    {I_VERW, 1, {REG16,0,0}, "\300\1\x0F\17\205", IF_286|IF_PRIV},
+    {I_WAIT, 0, {0,0,0}, "\1\x9B", IF_8086},
+    {I_WBINVD, 0, {0,0,0}, "\2\x0F\x09", IF_486},
+    {I_WRMSR, 0, {0,0,0}, "\2\x0F\x30", IF_PENT},
+    {I_XADD, 2, {MEMORY,REG8,0}, "\300\2\x0F\xC0\101", IF_486|IF_SM},
+    {I_XADD, 2, {REG8,REG8,0}, "\300\2\x0F\xC0\101", IF_486},
+    {I_XADD, 2, {MEMORY,REG16,0}, "\320\300\2\x0F\xC1\101", IF_486|IF_SM},
+    {I_XADD, 2, {REG16,REG16,0}, "\320\300\2\x0F\xC1\101", IF_486},
+    {I_XADD, 2, {MEMORY,REG32,0}, "\321\300\2\x0F\xC1\101", IF_486|IF_SM},
+    {I_XADD, 2, {REG32,REG32,0}, "\321\300\2\x0F\xC1\101", IF_486},
+    {I_XCHG, 2, {REG_AX,REG16,0}, "\320\11\x90", IF_8086},
+    {I_XCHG, 2, {REG_EAX,REG32,0}, "\321\11\x90", IF_386},
+    {I_XCHG, 2, {REG16,REG_AX,0}, "\320\10\x90", IF_8086},
+    {I_XCHG, 2, {REG32,REG_EAX,0}, "\321\10\x90", IF_386},
+    {I_XCHG, 2, {REG8,MEMORY,0}, "\301\1\x86\110", IF_8086|IF_SM},
+    {I_XCHG, 2, {REG8,REG8,0}, "\301\1\x86\110", IF_8086},
+    {I_XCHG, 2, {REG16,MEMORY,0}, "\320\301\1\x87\110", IF_8086|IF_SM},
+    {I_XCHG, 2, {REG16,REG16,0}, "\320\301\1\x87\110", IF_8086},
+    {I_XCHG, 2, {REG32,MEMORY,0}, "\321\301\1\x87\110", IF_386|IF_SM},
+    {I_XCHG, 2, {REG32,REG32,0}, "\321\301\1\x87\110", IF_386},
+    {I_XCHG, 2, {MEMORY,REG8,0}, "\300\1\x86\101", IF_8086|IF_SM},
+    {I_XCHG, 2, {REG8,REG8,0}, "\300\1\x86\101", IF_8086},
+    {I_XCHG, 2, {MEMORY,REG16,0}, "\320\300\1\x87\101", IF_8086|IF_SM},
+    {I_XCHG, 2, {REG16,REG16,0}, "\320\300\1\x87\101", IF_8086},
+    {I_XCHG, 2, {MEMORY,REG32,0}, "\321\300\1\x87\101", IF_386|IF_SM},
+    {I_XCHG, 2, {REG32,REG32,0}, "\321\300\1\x87\101", IF_386},
+    {I_XLATB, 0, {0,0,0}, "\1\xD7", IF_8086},
+    {I_XOR, 2, {MEMORY,REG8,0}, "\300\1\x30\101", IF_8086|IF_SM},
+    {I_XOR, 2, {REG8,REG8,0}, "\300\1\x30\101", IF_8086},
+    {I_XOR, 2, {MEMORY,REG16,0}, "\320\300\1\x31\101", IF_8086|IF_SM},
+    {I_XOR, 2, {REG16,REG16,0}, "\320\300\1\x31\101", IF_8086},
+    {I_XOR, 2, {MEMORY,REG32,0}, "\321\300\1\x31\101", IF_386|IF_SM},
+    {I_XOR, 2, {REG32,REG32,0}, "\321\300\1\x31\101", IF_386},
+    {I_XOR, 2, {REG8,MEMORY,0}, "\301\1\x32\110", IF_8086|IF_SM},
+    {I_XOR, 2, {REG8,REG8,0}, "\301\1\x32\110", IF_8086},
+    {I_XOR, 2, {REG16,MEMORY,0}, "\320\301\1\x33\110", IF_8086|IF_SM},
+    {I_XOR, 2, {REG16,REG16,0}, "\320\301\1\x33\110", IF_8086},
+    {I_XOR, 2, {REG32,MEMORY,0}, "\321\301\1\x33\110", IF_386|IF_SM},
+    {I_XOR, 2, {REG32,REG32,0}, "\321\301\1\x33\110", IF_386},
+    {I_XOR, 2, {REGMEM|BITS16,IMMEDIATE|BITS8,0}, "\320\300\1\x83\206\15", IF_8086},
+    {I_XOR, 2, {REGMEM|BITS32,IMMEDIATE|BITS8,0}, "\321\300\1\x83\206\15", IF_386},
+    {I_XOR, 2, {REG_AL,IMMEDIATE,0}, "\1\x34\21", IF_8086|IF_SM},
+    {I_XOR, 2, {REG_AX,IMMEDIATE,0}, "\320\1\x35\31", IF_8086|IF_SM},
+    {I_XOR, 2, {REG_EAX,IMMEDIATE,0}, "\321\1\x35\41", IF_386|IF_SM},
+    {I_XOR, 2, {REGMEM|BITS8,IMMEDIATE,0}, "\300\1\x80\206\21", IF_8086|IF_SM},
+    {I_XOR, 2, {REGMEM|BITS16,IMMEDIATE,0}, "\320\300\1\x81\206\31", IF_8086|IF_SM},
+    {I_XOR, 2, {REGMEM|BITS32,IMMEDIATE,0}, "\321\300\1\x81\206\41", IF_386|IF_SM},
+    {I_XOR, 2, {MEMORY,IMMEDIATE|BITS8,0}, "\300\1\x80\206\21", IF_8086|IF_SM},
+    {I_XOR, 2, {MEMORY,IMMEDIATE|BITS16,0}, "\320\300\1\x81\206\31", IF_8086|IF_SM},
+    {I_XOR, 2, {MEMORY,IMMEDIATE|BITS32,0}, "\321\300\1\x81\206\41", IF_386|IF_SM},
+    {I_CMOVcc, 2, {REG16,MEMORY,0}, "\320\301\1\x0F\330\x40\110", IF_P6|IF_SM},
+    {I_CMOVcc, 2, {REG16,REG16,0}, "\320\301\1\x0F\330\x40\110", IF_P6},
+    {I_CMOVcc, 2, {REG32,MEMORY,0}, "\321\301\1\x0F\330\x40\110", IF_P6|IF_SM},
+    {I_CMOVcc, 2, {REG32,REG32,0}, "\321\301\1\x0F\330\x40\110", IF_P6},
+    {I_Jcc, 1, {IMMEDIATE|NEAR,0,0}, "\322\1\x0F\330\x80\64", IF_386},
+    {I_Jcc, 1, {IMMEDIATE,0,0}, "\330\x70\50", IF_8086},
+    {I_Jcc, 1, {IMMEDIATE|SHORT,0,0}, "\330\x70\50", IF_8086},
+    {I_SETcc, 1, {MEMORY,0,0}, "\300\1\x0F\330\x90\200", IF_386|IF_SB},
+    {I_SETcc, 1, {REG8,0,0}, "\300\1\x0F\330\x90\200", IF_386},
+    {-1}
+};
+
+static struct itemplate *itable_00[] = {
+    instrux + 29,
+    instrux + 30,
+    NULL
+};
+
+static struct itemplate *itable_01[] = {
+    instrux + 31,
+    instrux + 32,
+    instrux + 33,
+    instrux + 34,
+    NULL
+};
+
+static struct itemplate *itable_02[] = {
+    instrux + 35,
+    instrux + 36,
+    NULL
+};
+
+static struct itemplate *itable_03[] = {
+    instrux + 37,
+    instrux + 38,
+    instrux + 39,
+    instrux + 40,
+    NULL
+};
+
+static struct itemplate *itable_04[] = {
+    instrux + 43,
+    NULL
+};
+
+static struct itemplate *itable_05[] = {
+    instrux + 44,
+    instrux + 45,
+    NULL
+};
+
+static struct itemplate *itable_06[] = {
+    instrux + 731,
+    NULL
+};
+
+static struct itemplate *itable_07[] = {
+    instrux + 664,
+    NULL
+};
+
+static struct itemplate *itable_08[] = {
+    instrux + 570,
+    instrux + 571,
+    NULL
+};
+
+static struct itemplate *itable_09[] = {
+    instrux + 572,
+    instrux + 573,
+    instrux + 574,
+    instrux + 575,
+    NULL
+};
+
+static struct itemplate *itable_0A[] = {
+    instrux + 576,
+    instrux + 577,
+    NULL
+};
+
+static struct itemplate *itable_0B[] = {
+    instrux + 578,
+    instrux + 579,
+    instrux + 580,
+    instrux + 581,
+    NULL
+};
+
+static struct itemplate *itable_0C[] = {
+    instrux + 584,
+    NULL
+};
+
+static struct itemplate *itable_0D[] = {
+    instrux + 585,
+    instrux + 586,
+    NULL
+};
+
+static struct itemplate *itable_0E[] = {
+    instrux + 731,
+    NULL
+};
+
+static struct itemplate *itable_0F[] = {
+    instrux + 79,
+    instrux + 80,
+    instrux + 81,
+    instrux + 82,
+    instrux + 83,
+    instrux + 84,
+    instrux + 85,
+    instrux + 86,
+    instrux + 87,
+    instrux + 88,
+    instrux + 89,
+    instrux + 90,
+    instrux + 91,
+    instrux + 92,
+    instrux + 93,
+    instrux + 94,
+    instrux + 95,
+    instrux + 96,
+    instrux + 97,
+    instrux + 98,
+    instrux + 99,
+    instrux + 100,
+    instrux + 101,
+    instrux + 102,
+    instrux + 103,
+    instrux + 104,
+    instrux + 105,
+    instrux + 106,
+    instrux + 107,
+    instrux + 108,
+    instrux + 109,
+    instrux + 110,
+    instrux + 111,
+    instrux + 134,
+    instrux + 162,
+    instrux + 163,
+    instrux + 164,
+    instrux + 165,
+    instrux + 166,
+    instrux + 167,
+    instrux + 168,
+    instrux + 169,
+    instrux + 170,
+    instrux + 171,
+    instrux + 172,
+    instrux + 173,
+    instrux + 174,
+    instrux + 175,
+    instrux + 188,
+    instrux + 379,
+    instrux + 380,
+    instrux + 381,
+    instrux + 382,
+    instrux + 413,
+    instrux + 414,
+    instrux + 439,
+    instrux + 440,
+    instrux + 441,
+    instrux + 442,
+    instrux + 450,
+    instrux + 451,
+    instrux + 452,
+    instrux + 453,
+    instrux + 454,
+    instrux + 455,
+    instrux + 456,
+    instrux + 457,
+    instrux + 458,
+    instrux + 459,
+    instrux + 460,
+    instrux + 461,
+    instrux + 462,
+    instrux + 463,
+    instrux + 482,
+    instrux + 483,
+    instrux + 484,
+    instrux + 485,
+    instrux + 486,
+    instrux + 487,
+    instrux + 488,
+    instrux + 489,
+    instrux + 490,
+    instrux + 512,
+    instrux + 513,
+    instrux + 514,
+    instrux + 515,
+    instrux + 516,
+    instrux + 517,
+    instrux + 518,
+    instrux + 519,
+    instrux + 541,
+    instrux + 542,
+    instrux + 543,
+    instrux + 544,
+    instrux + 545,
+    instrux + 546,
+    instrux + 547,
+    instrux + 548,
+    instrux + 552,
+    instrux + 553,
+    instrux + 554,
+    instrux + 555,
+    instrux + 556,
+    instrux + 557,
+    instrux + 558,
+    instrux + 559,
+    instrux + 602,
+    instrux + 603,
+    instrux + 604,
+    instrux + 605,
+    instrux + 606,
+    instrux + 607,
+    instrux + 608,
+    instrux + 609,
+    instrux + 610,
+    instrux + 611,
+    instrux + 612,
+    instrux + 613,
+    instrux + 614,
+    instrux + 615,
+    instrux + 616,
+    instrux + 617,
+    instrux + 618,
+    instrux + 619,
+    instrux + 620,
+    instrux + 621,
+    instrux + 622,
+    instrux + 623,
+    instrux + 624,
+    instrux + 625,
+    instrux + 626,
+    instrux + 627,
+    instrux + 628,
+    instrux + 629,
+    instrux + 630,
+    instrux + 631,
+    instrux + 632,
+    instrux + 633,
+    instrux + 634,
+    instrux + 635,
+    instrux + 636,
+    instrux + 637,
+    instrux + 638,
+    instrux + 639,
+    instrux + 640,
+    instrux + 641,
+    instrux + 642,
+    instrux + 643,
+    instrux + 644,
+    instrux + 645,
+    instrux + 646,
+    instrux + 647,
+    instrux + 648,
+    instrux + 649,
+    instrux + 650,
+    instrux + 651,
+    instrux + 652,
+    instrux + 653,
+    instrux + 654,
+    instrux + 655,
+    instrux + 656,
+    instrux + 657,
+    instrux + 658,
+    instrux + 659,
+    instrux + 665,
+    instrux + 672,
+    instrux + 673,
+    instrux + 674,
+    instrux + 675,
+    instrux + 676,
+    instrux + 677,
+    instrux + 678,
+    instrux + 679,
+    instrux + 680,
+    instrux + 681,
+    instrux + 682,
+    instrux + 683,
+    instrux + 684,
+    instrux + 685,
+    instrux + 686,
+    instrux + 687,
+    instrux + 688,
+    instrux + 689,
+    instrux + 690,
+    instrux + 691,
+    instrux + 692,
+    instrux + 693,
+    instrux + 694,
+    instrux + 695,
+    instrux + 696,
+    instrux + 697,
+    instrux + 698,
+    instrux + 699,
+    instrux + 700,
+    instrux + 701,
+    instrux + 702,
+    instrux + 703,
+    instrux + 704,
+    instrux + 705,
+    instrux + 706,
+    instrux + 707,
+    instrux + 708,
+    instrux + 709,
+    instrux + 710,
+    instrux + 711,
+    instrux + 712,
+    instrux + 713,
+    instrux + 714,
+    instrux + 715,
+    instrux + 716,
+    instrux + 717,
+    instrux + 718,
+    instrux + 719,
+    instrux + 720,
+    instrux + 721,
+    instrux + 722,
+    instrux + 723,
+    instrux + 724,
+    instrux + 725,
+    instrux + 730,
+    instrux + 741,
+    instrux + 742,
+    instrux + 761,
+    instrux + 762,
+    instrux + 763,
+    instrux + 789,
+    instrux + 827,
+    instrux + 837,
+    instrux + 838,
+    instrux + 839,
+    instrux + 840,
+    instrux + 841,
+    instrux + 842,
+    instrux + 843,
+    instrux + 844,
+    instrux + 854,
+    instrux + 855,
+    instrux + 856,
+    instrux + 857,
+    instrux + 858,
+    instrux + 859,
+    instrux + 860,
+    instrux + 861,
+    instrux + 862,
+    instrux + 863,
+    instrux + 864,
+    instrux + 865,
+    instrux + 867,
+    instrux + 868,
+    instrux + 869,
+    instrux + 876,
+    instrux + 877,
+    instrux + 878,
+    instrux + 917,
+    instrux + 918,
+    instrux + 919,
+    instrux + 920,
+    instrux + 921,
+    instrux + 922,
+    instrux + 923,
+    instrux + 924,
+    instrux + 925,
+    instrux + 926,
+    instrux + 927,
+    instrux + 928,
+    instrux + 929,
+    instrux + 930,
+    instrux + 931,
+    instrux + 932,
+    instrux + 933,
+    instrux + 934,
+    instrux + 936,
+    instrux + 937,
+    instrux + 938,
+    instrux + 939,
+    instrux + 940,
+    instrux + 941,
+    instrux + 942,
+    instrux + 943,
+    instrux + 984,
+    instrux + 985,
+    instrux + 986,
+    instrux + 987,
+    instrux + 988,
+    instrux + 991,
+    instrux + 992,
+    NULL
+};
+
+static struct itemplate *itable_10[] = {
+    instrux + 6,
+    instrux + 7,
+    NULL
+};
+
+static struct itemplate *itable_11[] = {
+    instrux + 8,
+    instrux + 9,
+    instrux + 10,
+    instrux + 11,
+    NULL
+};
+
+static struct itemplate *itable_12[] = {
+    instrux + 12,
+    instrux + 13,
+    NULL
+};
+
+static struct itemplate *itable_13[] = {
+    instrux + 14,
+    instrux + 15,
+    instrux + 16,
+    instrux + 17,
+    NULL
+};
+
+static struct itemplate *itable_14[] = {
+    instrux + 20,
+    NULL
+};
+
+static struct itemplate *itable_15[] = {
+    instrux + 21,
+    instrux + 22,
+    NULL
+};
+
+static struct itemplate *itable_16[] = {
+    instrux + 731,
+    NULL
+};
+
+static struct itemplate *itable_17[] = {
+    instrux + 664,
+    NULL
+};
+
+static struct itemplate *itable_18[] = {
+    instrux + 801,
+    instrux + 802,
+    NULL
+};
+
+static struct itemplate *itable_19[] = {
+    instrux + 803,
+    instrux + 804,
+    instrux + 805,
+    instrux + 806,
+    NULL
+};
+
+static struct itemplate *itable_1A[] = {
+    instrux + 807,
+    instrux + 808,
+    NULL
+};
+
+static struct itemplate *itable_1B[] = {
+    instrux + 809,
+    instrux + 810,
+    instrux + 811,
+    instrux + 812,
+    NULL
+};
+
+static struct itemplate *itable_1C[] = {
+    instrux + 815,
+    NULL
+};
+
+static struct itemplate *itable_1D[] = {
+    instrux + 816,
+    instrux + 817,
+    NULL
+};
+
+static struct itemplate *itable_1E[] = {
+    instrux + 731,
+    NULL
+};
+
+static struct itemplate *itable_1F[] = {
+    instrux + 664,
+    NULL
+};
+
+static struct itemplate *itable_20[] = {
+    instrux + 52,
+    instrux + 53,
+    NULL
+};
+
+static struct itemplate *itable_21[] = {
+    instrux + 54,
+    instrux + 55,
+    instrux + 56,
+    instrux + 57,
+    NULL
+};
+
+static struct itemplate *itable_22[] = {
+    instrux + 58,
+    instrux + 59,
+    NULL
+};
+
+static struct itemplate *itable_23[] = {
+    instrux + 60,
+    instrux + 61,
+    instrux + 62,
+    instrux + 63,
+    NULL
+};
+
+static struct itemplate *itable_24[] = {
+    instrux + 66,
+    NULL
+};
+
+static struct itemplate *itable_25[] = {
+    instrux + 67,
+    instrux + 68,
+    NULL
+};
+
+static struct itemplate *itable_26[] = {
+    NULL
+};
+
+static struct itemplate *itable_27[] = {
+    instrux + 178,
+    NULL
+};
+
+static struct itemplate *itable_28[] = {
+    instrux + 879,
+    instrux + 880,
+    NULL
+};
+
+static struct itemplate *itable_29[] = {
+    instrux + 881,
+    instrux + 882,
+    instrux + 883,
+    instrux + 884,
+    NULL
+};
+
+static struct itemplate *itable_2A[] = {
+    instrux + 885,
+    instrux + 886,
+    NULL
+};
+
+static struct itemplate *itable_2B[] = {
+    instrux + 887,
+    instrux + 888,
+    instrux + 889,
+    instrux + 890,
+    NULL
+};
+
+static struct itemplate *itable_2C[] = {
+    instrux + 893,
+    NULL
+};
+
+static struct itemplate *itable_2D[] = {
+    instrux + 894,
+    instrux + 895,
+    NULL
+};
+
+static struct itemplate *itable_2E[] = {
+    NULL
+};
+
+static struct itemplate *itable_2F[] = {
+    instrux + 179,
+    NULL
+};
+
+static struct itemplate *itable_30[] = {
+    instrux + 961,
+    instrux + 962,
+    NULL
+};
+
+static struct itemplate *itable_31[] = {
+    instrux + 963,
+    instrux + 964,
+    instrux + 965,
+    instrux + 966,
+    NULL
+};
+
+static struct itemplate *itable_32[] = {
+    instrux + 967,
+    instrux + 968,
+    NULL
+};
+
+static struct itemplate *itable_33[] = {
+    instrux + 969,
+    instrux + 970,
+    instrux + 971,
+    instrux + 972,
+    NULL
+};
+
+static struct itemplate *itable_34[] = {
+    instrux + 975,
+    NULL
+};
+
+static struct itemplate *itable_35[] = {
+    instrux + 976,
+    instrux + 977,
+    NULL
+};
+
+static struct itemplate *itable_36[] = {
+    NULL
+};
+
+static struct itemplate *itable_37[] = {
+    instrux + 0,
+    NULL
+};
+
+static struct itemplate *itable_38[] = {
+    instrux + 136,
+    instrux + 137,
+    NULL
+};
+
+static struct itemplate *itable_39[] = {
+    instrux + 138,
+    instrux + 139,
+    instrux + 140,
+    instrux + 141,
+    NULL
+};
+
+static struct itemplate *itable_3A[] = {
+    instrux + 142,
+    instrux + 143,
+    NULL
+};
+
+static struct itemplate *itable_3B[] = {
+    instrux + 144,
+    instrux + 145,
+    instrux + 146,
+    instrux + 147,
+    NULL
+};
+
+static struct itemplate *itable_3C[] = {
+    instrux + 150,
+    NULL
+};
+
+static struct itemplate *itable_3D[] = {
+    instrux + 151,
+    instrux + 152,
+    NULL
+};
+
+static struct itemplate *itable_3E[] = {
+    NULL
+};
+
+static struct itemplate *itable_3F[] = {
+    instrux + 5,
+    NULL
+};
+
+static struct itemplate *itable_40[] = {
+    instrux + 401,
+    instrux + 402,
+    NULL
+};
+
+static struct itemplate *itable_41[] = {
+    instrux + 401,
+    instrux + 402,
+    NULL
+};
+
+static struct itemplate *itable_42[] = {
+    instrux + 401,
+    instrux + 402,
+    NULL
+};
+
+static struct itemplate *itable_43[] = {
+    instrux + 401,
+    instrux + 402,
+    NULL
+};
+
+static struct itemplate *itable_44[] = {
+    instrux + 401,
+    instrux + 402,
+    NULL
+};
+
+static struct itemplate *itable_45[] = {
+    instrux + 401,
+    instrux + 402,
+    NULL
+};
+
+static struct itemplate *itable_46[] = {
+    instrux + 401,
+    instrux + 402,
+    NULL
+};
+
+static struct itemplate *itable_47[] = {
+    instrux + 401,
+    instrux + 402,
+    NULL
+};
+
+static struct itemplate *itable_48[] = {
+    instrux + 180,
+    instrux + 181,
+    NULL
+};
+
+static struct itemplate *itable_49[] = {
+    instrux + 180,
+    instrux + 181,
+    NULL
+};
+
+static struct itemplate *itable_4A[] = {
+    instrux + 180,
+    instrux + 181,
+    NULL
+};
+
+static struct itemplate *itable_4B[] = {
+    instrux + 180,
+    instrux + 181,
+    NULL
+};
+
+static struct itemplate *itable_4C[] = {
+    instrux + 180,
+    instrux + 181,
+    NULL
+};
+
+static struct itemplate *itable_4D[] = {
+    instrux + 180,
+    instrux + 181,
+    NULL
+};
+
+static struct itemplate *itable_4E[] = {
+    instrux + 180,
+    instrux + 181,
+    NULL
+};
+
+static struct itemplate *itable_4F[] = {
+    instrux + 180,
+    instrux + 181,
+    NULL
+};
+
+static struct itemplate *itable_50[] = {
+    instrux + 726,
+    instrux + 727,
+    NULL
+};
+
+static struct itemplate *itable_51[] = {
+    instrux + 726,
+    instrux + 727,
+    NULL
+};
+
+static struct itemplate *itable_52[] = {
+    instrux + 726,
+    instrux + 727,
+    NULL
+};
+
+static struct itemplate *itable_53[] = {
+    instrux + 726,
+    instrux + 727,
+    NULL
+};
+
+static struct itemplate *itable_54[] = {
+    instrux + 726,
+    instrux + 727,
+    NULL
+};
+
+static struct itemplate *itable_55[] = {
+    instrux + 726,
+    instrux + 727,
+    NULL
+};
+
+static struct itemplate *itable_56[] = {
+    instrux + 726,
+    instrux + 727,
+    NULL
+};
+
+static struct itemplate *itable_57[] = {
+    instrux + 726,
+    instrux + 727,
+    NULL
+};
+
+static struct itemplate *itable_58[] = {
+    instrux + 660,
+    instrux + 661,
+    NULL
+};
+
+static struct itemplate *itable_59[] = {
+    instrux + 660,
+    instrux + 661,
+    NULL
+};
+
+static struct itemplate *itable_5A[] = {
+    instrux + 660,
+    instrux + 661,
+    NULL
+};
+
+static struct itemplate *itable_5B[] = {
+    instrux + 660,
+    instrux + 661,
+    NULL
+};
+
+static struct itemplate *itable_5C[] = {
+    instrux + 660,
+    instrux + 661,
+    NULL
+};
+
+static struct itemplate *itable_5D[] = {
+    instrux + 660,
+    instrux + 661,
+    NULL
+};
+
+static struct itemplate *itable_5E[] = {
+    instrux + 660,
+    instrux + 661,
+    NULL
+};
+
+static struct itemplate *itable_5F[] = {
+    instrux + 660,
+    instrux + 661,
+    NULL
+};
+
+static struct itemplate *itable_60[] = {
+    instrux + 735,
+    instrux + 736,
+    instrux + 737,
+    NULL
+};
+
+static struct itemplate *itable_61[] = {
+    instrux + 666,
+    instrux + 667,
+    instrux + 668,
+    NULL
+};
+
+static struct itemplate *itable_62[] = {
+    instrux + 77,
+    instrux + 78,
+    NULL
+};
+
+static struct itemplate *itable_63[] = {
+    instrux + 75,
+    instrux + 76,
+    NULL
+};
+
+static struct itemplate *itable_64[] = {
+    NULL
+};
+
+static struct itemplate *itable_65[] = {
+    NULL
+};
+
+static struct itemplate *itable_66[] = {
+    NULL
+};
+
+static struct itemplate *itable_67[] = {
+    NULL
+};
+
+static struct itemplate *itable_68[] = {
+    instrux + 733,
+    instrux + 734,
+    NULL
+};
+
+static struct itemplate *itable_69[] = {
+    instrux + 385,
+    instrux + 386,
+    instrux + 389,
+    instrux + 390,
+    instrux + 392,
+    instrux + 394,
+    NULL
+};
+
+static struct itemplate *itable_6A[] = {
+    instrux + 732,
+    NULL
+};
+
+static struct itemplate *itable_6B[] = {
+    instrux + 383,
+    instrux + 384,
+    instrux + 387,
+    instrux + 388,
+    instrux + 391,
+    instrux + 393,
+    NULL
+};
+
+static struct itemplate *itable_6C[] = {
+    instrux + 406,
+    NULL
+};
+
+static struct itemplate *itable_6D[] = {
+    instrux + 407,
+    instrux + 408,
+    NULL
+};
+
+static struct itemplate *itable_6E[] = {
+    instrux + 599,
+    NULL
+};
+
+static struct itemplate *itable_6F[] = {
+    instrux + 600,
+    instrux + 601,
+    NULL
+};
+
+static struct itemplate *itable_70[] = {
+    instrux + 989,
+    instrux + 990,
+    NULL
+};
+
+static struct itemplate *itable_71[] = {
+    instrux + 989,
+    instrux + 990,
+    NULL
+};
+
+static struct itemplate *itable_72[] = {
+    instrux + 989,
+    instrux + 990,
+    NULL
+};
+
+static struct itemplate *itable_73[] = {
+    instrux + 989,
+    instrux + 990,
+    NULL
+};
+
+static struct itemplate *itable_74[] = {
+    instrux + 989,
+    instrux + 990,
+    NULL
+};
+
+static struct itemplate *itable_75[] = {
+    instrux + 989,
+    instrux + 990,
+    NULL
+};
+
+static struct itemplate *itable_76[] = {
+    instrux + 989,
+    instrux + 990,
+    NULL
+};
+
+static struct itemplate *itable_77[] = {
+    instrux + 989,
+    instrux + 990,
+    NULL
+};
+
+static struct itemplate *itable_78[] = {
+    instrux + 989,
+    instrux + 990,
+    NULL
+};
+
+static struct itemplate *itable_79[] = {
+    instrux + 989,
+    instrux + 990,
+    NULL
+};
+
+static struct itemplate *itable_7A[] = {
+    instrux + 989,
+    instrux + 990,
+    NULL
+};
+
+static struct itemplate *itable_7B[] = {
+    instrux + 989,
+    instrux + 990,
+    NULL
+};
+
+static struct itemplate *itable_7C[] = {
+    instrux + 989,
+    instrux + 990,
+    NULL
+};
+
+static struct itemplate *itable_7D[] = {
+    instrux + 989,
+    instrux + 990,
+    NULL
+};
+
+static struct itemplate *itable_7E[] = {
+    instrux + 989,
+    instrux + 990,
+    NULL
+};
+
+static struct itemplate *itable_7F[] = {
+    instrux + 989,
+    instrux + 990,
+    NULL
+};
+
+static struct itemplate *itable_80[] = {
+    instrux + 23,
+    instrux + 26,
+    instrux + 46,
+    instrux + 49,
+    instrux + 69,
+    instrux + 72,
+    instrux + 153,
+    instrux + 156,
+    instrux + 587,
+    instrux + 590,
+    instrux + 818,
+    instrux + 821,
+    instrux + 896,
+    instrux + 899,
+    instrux + 978,
+    instrux + 981,
+    NULL
+};
+
+static struct itemplate *itable_81[] = {
+    instrux + 24,
+    instrux + 25,
+    instrux + 27,
+    instrux + 28,
+    instrux + 47,
+    instrux + 48,
+    instrux + 50,
+    instrux + 51,
+    instrux + 70,
+    instrux + 71,
+    instrux + 73,
+    instrux + 74,
+    instrux + 154,
+    instrux + 155,
+    instrux + 157,
+    instrux + 158,
+    instrux + 588,
+    instrux + 589,
+    instrux + 591,
+    instrux + 592,
+    instrux + 819,
+    instrux + 820,
+    instrux + 822,
+    instrux + 823,
+    instrux + 897,
+    instrux + 898,
+    instrux + 900,
+    instrux + 901,
+    instrux + 979,
+    instrux + 980,
+    instrux + 982,
+    instrux + 983,
+    NULL
+};
+
+static struct itemplate *itable_82[] = {
+    NULL
+};
+
+static struct itemplate *itable_83[] = {
+    instrux + 18,
+    instrux + 19,
+    instrux + 41,
+    instrux + 42,
+    instrux + 64,
+    instrux + 65,
+    instrux + 148,
+    instrux + 149,
+    instrux + 582,
+    instrux + 583,
+    instrux + 813,
+    instrux + 814,
+    instrux + 891,
+    instrux + 892,
+    instrux + 973,
+    instrux + 974,
+    NULL
+};
+
+static struct itemplate *itable_84[] = {
+    instrux + 902,
+    instrux + 903,
+    NULL
+};
+
+static struct itemplate *itable_85[] = {
+    instrux + 904,
+    instrux + 905,
+    instrux + 906,
+    instrux + 907,
+    NULL
+};
+
+static struct itemplate *itable_86[] = {
+    instrux + 948,
+    instrux + 949,
+    instrux + 954,
+    instrux + 955,
+    NULL
+};
+
+static struct itemplate *itable_87[] = {
+    instrux + 950,
+    instrux + 951,
+    instrux + 952,
+    instrux + 953,
+    instrux + 956,
+    instrux + 957,
+    instrux + 958,
+    instrux + 959,
+    NULL
+};
+
+static struct itemplate *itable_88[] = {
+    instrux + 520,
+    instrux + 521,
+    NULL
+};
+
+static struct itemplate *itable_89[] = {
+    instrux + 522,
+    instrux + 523,
+    instrux + 524,
+    instrux + 525,
+    NULL
+};
+
+static struct itemplate *itable_8A[] = {
+    instrux + 526,
+    instrux + 527,
+    NULL
+};
+
+static struct itemplate *itable_8B[] = {
+    instrux + 528,
+    instrux + 529,
+    instrux + 530,
+    instrux + 531,
+    NULL
+};
+
+static struct itemplate *itable_8C[] = {
+    instrux + 491,
+    instrux + 492,
+    instrux + 493,
+    instrux + 494,
+    instrux + 495,
+    instrux + 496,
+    instrux + 497,
+    instrux + 498,
+    instrux + 499,
+    NULL
+};
+
+static struct itemplate *itable_8D[] = {
+    instrux + 445,
+    instrux + 446,
+    NULL
+};
+
+static struct itemplate *itable_8E[] = {
+    instrux + 500,
+    instrux + 501,
+    instrux + 502,
+    instrux + 503,
+    instrux + 504,
+    instrux + 505,
+    NULL
+};
+
+static struct itemplate *itable_8F[] = {
+    instrux + 662,
+    instrux + 663,
+    NULL
+};
+
+static struct itemplate *itable_90[] = {
+    instrux + 566,
+    instrux + 944,
+    instrux + 945,
+    instrux + 946,
+    instrux + 947,
+    NULL
+};
+
+static struct itemplate *itable_91[] = {
+    instrux + 944,
+    instrux + 945,
+    instrux + 946,
+    instrux + 947,
+    NULL
+};
+
+static struct itemplate *itable_92[] = {
+    instrux + 944,
+    instrux + 945,
+    instrux + 946,
+    instrux + 947,
+    NULL
+};
+
+static struct itemplate *itable_93[] = {
+    instrux + 944,
+    instrux + 945,
+    instrux + 946,
+    instrux + 947,
+    NULL
+};
+
+static struct itemplate *itable_94[] = {
+    instrux + 944,
+    instrux + 945,
+    instrux + 946,
+    instrux + 947,
+    NULL
+};
+
+static struct itemplate *itable_95[] = {
+    instrux + 944,
+    instrux + 945,
+    instrux + 946,
+    instrux + 947,
+    NULL
+};
+
+static struct itemplate *itable_96[] = {
+    instrux + 944,
+    instrux + 945,
+    instrux + 946,
+    instrux + 947,
+    NULL
+};
+
+static struct itemplate *itable_97[] = {
+    instrux + 944,
+    instrux + 945,
+    instrux + 946,
+    instrux + 947,
+    NULL
+};
+
+static struct itemplate *itable_98[] = {
+    instrux + 129,
+    instrux + 177,
+    NULL
+};
+
+static struct itemplate *itable_99[] = {
+    instrux + 130,
+    instrux + 176,
+    NULL
+};
+
+static struct itemplate *itable_9A[] = {
+    instrux + 113,
+    instrux + 114,
+    instrux + 115,
+    instrux + 116,
+    instrux + 117,
+    NULL
+};
+
+static struct itemplate *itable_9B[] = {
+    instrux + 207,
+    instrux + 239,
+    instrux + 256,
+    instrux + 274,
+    instrux + 321,
+    instrux + 330,
+    instrux + 331,
+    instrux + 336,
+    instrux + 337,
+    instrux + 935,
+    NULL
+};
+
+static struct itemplate *itable_9C[] = {
+    instrux + 738,
+    instrux + 739,
+    instrux + 740,
+    NULL
+};
+
+static struct itemplate *itable_9D[] = {
+    instrux + 669,
+    instrux + 670,
+    instrux + 671,
+    NULL
+};
+
+static struct itemplate *itable_9E[] = {
+    instrux + 790,
+    NULL
+};
+
+static struct itemplate *itable_9F[] = {
+    instrux + 438,
+    NULL
+};
+
+static struct itemplate *itable_A0[] = {
+    instrux + 506,
+    NULL
+};
+
+static struct itemplate *itable_A1[] = {
+    instrux + 507,
+    instrux + 508,
+    NULL
+};
+
+static struct itemplate *itable_A2[] = {
+    instrux + 509,
+    NULL
+};
+
+static struct itemplate *itable_A3[] = {
+    instrux + 510,
+    instrux + 511,
+    NULL
+};
+
+static struct itemplate *itable_A4[] = {
+    instrux + 549,
+    NULL
+};
+
+static struct itemplate *itable_A5[] = {
+    instrux + 550,
+    instrux + 551,
+    NULL
+};
+
+static struct itemplate *itable_A6[] = {
+    instrux + 159,
+    NULL
+};
+
+static struct itemplate *itable_A7[] = {
+    instrux + 160,
+    instrux + 161,
+    NULL
+};
+
+static struct itemplate *itable_A8[] = {
+    instrux + 908,
+    NULL
+};
+
+static struct itemplate *itable_A9[] = {
+    instrux + 909,
+    instrux + 910,
+    NULL
+};
+
+static struct itemplate *itable_AA[] = {
+    instrux + 873,
+    NULL
+};
+
+static struct itemplate *itable_AB[] = {
+    instrux + 874,
+    instrux + 875,
+    NULL
+};
+
+static struct itemplate *itable_AC[] = {
+    instrux + 464,
+    NULL
+};
+
+static struct itemplate *itable_AD[] = {
+    instrux + 465,
+    instrux + 466,
+    NULL
+};
+
+static struct itemplate *itable_AE[] = {
+    instrux + 824,
+    NULL
+};
+
+static struct itemplate *itable_AF[] = {
+    instrux + 825,
+    instrux + 826,
+    NULL
+};
+
+static struct itemplate *itable_B0[] = {
+    instrux + 532,
+    NULL
+};
+
+static struct itemplate *itable_B1[] = {
+    instrux + 532,
+    NULL
+};
+
+static struct itemplate *itable_B2[] = {
+    instrux + 532,
+    NULL
+};
+
+static struct itemplate *itable_B3[] = {
+    instrux + 532,
+    NULL
+};
+
+static struct itemplate *itable_B4[] = {
+    instrux + 532,
+    NULL
+};
+
+static struct itemplate *itable_B5[] = {
+    instrux + 532,
+    NULL
+};
+
+static struct itemplate *itable_B6[] = {
+    instrux + 532,
+    NULL
+};
+
+static struct itemplate *itable_B7[] = {
+    instrux + 532,
+    NULL
+};
+
+static struct itemplate *itable_B8[] = {
+    instrux + 533,
+    instrux + 534,
+    NULL
+};
+
+static struct itemplate *itable_B9[] = {
+    instrux + 533,
+    instrux + 534,
+    NULL
+};
+
+static struct itemplate *itable_BA[] = {
+    instrux + 533,
+    instrux + 534,
+    NULL
+};
+
+static struct itemplate *itable_BB[] = {
+    instrux + 533,
+    instrux + 534,
+    NULL
+};
+
+static struct itemplate *itable_BC[] = {
+    instrux + 533,
+    instrux + 534,
+    NULL
+};
+
+static struct itemplate *itable_BD[] = {
+    instrux + 533,
+    instrux + 534,
+    NULL
+};
+
+static struct itemplate *itable_BE[] = {
+    instrux + 533,
+    instrux + 534,
+    NULL
+};
+
+static struct itemplate *itable_BF[] = {
+    instrux + 533,
+    instrux + 534,
+    NULL
+};
+
+static struct itemplate *itable_C0[] = {
+    instrux + 745,
+    instrux + 754,
+    instrux + 773,
+    instrux + 782,
+    instrux + 794,
+    instrux + 830,
+    instrux + 847,
+    NULL
+};
+
+static struct itemplate *itable_C1[] = {
+    instrux + 748,
+    instrux + 751,
+    instrux + 757,
+    instrux + 760,
+    instrux + 776,
+    instrux + 779,
+    instrux + 785,
+    instrux + 788,
+    instrux + 797,
+    instrux + 800,
+    instrux + 833,
+    instrux + 836,
+    instrux + 850,
+    instrux + 853,
+    NULL
+};
+
+static struct itemplate *itable_C2[] = {
+    instrux + 766,
+    instrux + 770,
+    NULL
+};
+
+static struct itemplate *itable_C3[] = {
+    instrux + 765,
+    instrux + 769,
+    NULL
+};
+
+static struct itemplate *itable_C4[] = {
+    instrux + 448,
+    instrux + 449,
+    NULL
+};
+
+static struct itemplate *itable_C5[] = {
+    instrux + 443,
+    instrux + 444,
+    NULL
+};
+
+static struct itemplate *itable_C6[] = {
+    instrux + 535,
+    instrux + 538,
+    NULL
+};
+
+static struct itemplate *itable_C7[] = {
+    instrux + 536,
+    instrux + 537,
+    instrux + 539,
+    instrux + 540,
+    NULL
+};
+
+static struct itemplate *itable_C8[] = {
+    instrux + 189,
+    NULL
+};
+
+static struct itemplate *itable_C9[] = {
+    instrux + 447,
+    NULL
+};
+
+static struct itemplate *itable_CA[] = {
+    instrux + 768,
+    NULL
+};
+
+static struct itemplate *itable_CB[] = {
+    instrux + 767,
+    NULL
+};
+
+static struct itemplate *itable_CC[] = {
+    instrux + 411,
+    NULL
+};
+
+static struct itemplate *itable_CD[] = {
+    instrux + 409,
+    NULL
+};
+
+static struct itemplate *itable_CE[] = {
+    instrux + 412,
+    NULL
+};
+
+static struct itemplate *itable_CF[] = {
+    instrux + 415,
+    instrux + 416,
+    instrux + 417,
+    NULL
+};
+
+static struct itemplate *itable_D0[] = {
+    instrux + 743,
+    instrux + 752,
+    instrux + 771,
+    instrux + 780,
+    instrux + 792,
+    instrux + 828,
+    instrux + 845,
+    NULL
+};
+
+static struct itemplate *itable_D1[] = {
+    instrux + 746,
+    instrux + 749,
+    instrux + 755,
+    instrux + 758,
+    instrux + 774,
+    instrux + 777,
+    instrux + 783,
+    instrux + 786,
+    instrux + 795,
+    instrux + 798,
+    instrux + 831,
+    instrux + 834,
+    instrux + 848,
+    instrux + 851,
+    NULL
+};
+
+static struct itemplate *itable_D2[] = {
+    instrux + 744,
+    instrux + 753,
+    instrux + 772,
+    instrux + 781,
+    instrux + 793,
+    instrux + 829,
+    instrux + 846,
+    NULL
+};
+
+static struct itemplate *itable_D3[] = {
+    instrux + 747,
+    instrux + 750,
+    instrux + 756,
+    instrux + 759,
+    instrux + 775,
+    instrux + 778,
+    instrux + 784,
+    instrux + 787,
+    instrux + 796,
+    instrux + 799,
+    instrux + 832,
+    instrux + 835,
+    instrux + 849,
+    instrux + 852,
+    NULL
+};
+
+static struct itemplate *itable_D4[] = {
+    instrux + 3,
+    instrux + 4,
+    NULL
+};
+
+static struct itemplate *itable_D5[] = {
+    instrux + 1,
+    instrux + 2,
+    NULL
+};
+
+static struct itemplate *itable_D6[] = {
+    instrux + 791,
+    NULL
+};
+
+static struct itemplate *itable_D7[] = {
+    instrux + 960,
+    NULL
+};
+
+static struct itemplate *itable_D8[] = {
+    instrux + 194,
+    instrux + 197,
+    instrux + 199,
+    instrux + 224,
+    instrux + 226,
+    instrux + 227,
+    instrux + 232,
+    instrux + 234,
+    instrux + 235,
+    instrux + 240,
+    instrux + 244,
+    instrux + 245,
+    instrux + 248,
+    instrux + 252,
+    instrux + 253,
+    instrux + 297,
+    instrux + 301,
+    instrux + 302,
+    instrux + 338,
+    instrux + 342,
+    instrux + 343,
+    instrux + 346,
+    instrux + 350,
+    instrux + 351,
+    NULL
+};
+
+static struct itemplate *itable_D9[] = {
+    instrux + 192,
+    instrux + 193,
+    instrux + 206,
+    instrux + 237,
+    instrux + 238,
+    instrux + 273,
+    instrux + 284,
+    instrux + 287,
+    instrux + 288,
+    instrux + 289,
+    instrux + 290,
+    instrux + 291,
+    instrux + 292,
+    instrux + 293,
+    instrux + 294,
+    instrux + 295,
+    instrux + 296,
+    instrux + 309,
+    instrux + 311,
+    instrux + 312,
+    instrux + 315,
+    instrux + 316,
+    instrux + 317,
+    instrux + 318,
+    instrux + 319,
+    instrux + 322,
+    instrux + 324,
+    instrux + 325,
+    instrux + 326,
+    instrux + 327,
+    instrux + 332,
+    instrux + 354,
+    instrux + 364,
+    instrux + 365,
+    instrux + 366,
+    instrux + 367,
+    instrux + 368,
+    instrux + 369,
+    instrux + 370,
+    instrux + 371,
+    NULL
+};
+
+static struct itemplate *itable_DA[] = {
+    instrux + 208,
+    instrux + 209,
+    instrux + 210,
+    instrux + 211,
+    instrux + 212,
+    instrux + 213,
+    instrux + 222,
+    instrux + 223,
+    instrux + 258,
+    instrux + 260,
+    instrux + 262,
+    instrux + 264,
+    instrux + 266,
+    instrux + 271,
+    instrux + 280,
+    instrux + 282,
+    instrux + 363,
+    NULL
+};
+
+static struct itemplate *itable_DB[] = {
+    instrux + 214,
+    instrux + 215,
+    instrux + 216,
+    instrux + 217,
+    instrux + 218,
+    instrux + 219,
+    instrux + 220,
+    instrux + 221,
+    instrux + 228,
+    instrux + 229,
+    instrux + 268,
+    instrux + 275,
+    instrux + 277,
+    instrux + 286,
+    instrux + 305,
+    instrux + 306,
+    instrux + 307,
+    instrux + 308,
+    instrux + 323,
+    instrux + 334,
+    instrux + 357,
+    instrux + 358,
+    NULL
+};
+
+static struct itemplate *itable_DC[] = {
+    instrux + 195,
+    instrux + 196,
+    instrux + 198,
+    instrux + 225,
+    instrux + 233,
+    instrux + 241,
+    instrux + 242,
+    instrux + 243,
+    instrux + 249,
+    instrux + 250,
+    instrux + 251,
+    instrux + 298,
+    instrux + 299,
+    instrux + 300,
+    instrux + 339,
+    instrux + 340,
+    instrux + 341,
+    instrux + 347,
+    instrux + 348,
+    instrux + 349,
+    NULL
+};
+
+static struct itemplate *itable_DD[] = {
+    instrux + 257,
+    instrux + 285,
+    instrux + 310,
+    instrux + 313,
+    instrux + 320,
+    instrux + 328,
+    instrux + 329,
+    instrux + 333,
+    instrux + 335,
+    instrux + 355,
+    instrux + 356,
+    instrux + 361,
+    instrux + 362,
+    NULL
+};
+
+static struct itemplate *itable_DE[] = {
+    instrux + 200,
+    instrux + 201,
+    instrux + 236,
+    instrux + 246,
+    instrux + 247,
+    instrux + 254,
+    instrux + 255,
+    instrux + 259,
+    instrux + 261,
+    instrux + 263,
+    instrux + 265,
+    instrux + 267,
+    instrux + 272,
+    instrux + 281,
+    instrux + 283,
+    instrux + 303,
+    instrux + 304,
+    instrux + 344,
+    instrux + 345,
+    instrux + 352,
+    instrux + 353,
+    NULL
+};
+
+static struct itemplate *itable_DF[] = {
+    instrux + 202,
+    instrux + 203,
+    instrux + 204,
+    instrux + 205,
+    instrux + 230,
+    instrux + 231,
+    instrux + 269,
+    instrux + 270,
+    instrux + 276,
+    instrux + 278,
+    instrux + 279,
+    instrux + 314,
+    instrux + 359,
+    instrux + 360,
+    NULL
+};
+
+static struct itemplate *itable_E0[] = {
+    instrux + 473,
+    instrux + 474,
+    instrux + 475,
+    instrux + 476,
+    instrux + 477,
+    instrux + 478,
+    NULL
+};
+
+static struct itemplate *itable_E1[] = {
+    instrux + 470,
+    instrux + 471,
+    instrux + 472,
+    instrux + 479,
+    instrux + 480,
+    instrux + 481,
+    NULL
+};
+
+static struct itemplate *itable_E2[] = {
+    instrux + 467,
+    instrux + 468,
+    instrux + 469,
+    NULL
+};
+
+static struct itemplate *itable_E3[] = {
+    instrux + 418,
+    instrux + 419,
+    NULL
+};
+
+static struct itemplate *itable_E4[] = {
+    instrux + 395,
+    NULL
+};
+
+static struct itemplate *itable_E5[] = {
+    instrux + 396,
+    instrux + 397,
+    NULL
+};
+
+static struct itemplate *itable_E6[] = {
+    instrux + 593,
+    NULL
+};
+
+static struct itemplate *itable_E7[] = {
+    instrux + 594,
+    instrux + 595,
+    NULL
+};
+
+static struct itemplate *itable_E8[] = {
+    instrux + 112,
+    NULL
+};
+
+static struct itemplate *itable_E9[] = {
+    instrux + 421,
+    NULL
+};
+
+static struct itemplate *itable_EA[] = {
+    instrux + 422,
+    instrux + 423,
+    instrux + 424,
+    instrux + 425,
+    instrux + 426,
+    NULL
+};
+
+static struct itemplate *itable_EB[] = {
+    instrux + 420,
+    NULL
+};
+
+static struct itemplate *itable_EC[] = {
+    instrux + 398,
+    NULL
+};
+
+static struct itemplate *itable_ED[] = {
+    instrux + 399,
+    instrux + 400,
+    NULL
+};
+
+static struct itemplate *itable_EE[] = {
+    instrux + 596,
+    NULL
+};
+
+static struct itemplate *itable_EF[] = {
+    instrux + 597,
+    instrux + 598,
+    NULL
+};
+
+static struct itemplate *itable_F0[] = {
+    NULL
+};
+
+static struct itemplate *itable_F1[] = {
+    instrux + 410,
+    instrux + 866,
+    NULL
+};
+
+static struct itemplate *itable_F2[] = {
+    NULL
+};
+
+static struct itemplate *itable_F3[] = {
+    NULL
+};
+
+static struct itemplate *itable_F4[] = {
+    instrux + 372,
+    NULL
+};
+
+static struct itemplate *itable_F5[] = {
+    instrux + 135,
+    NULL
+};
+
+static struct itemplate *itable_F6[] = {
+    instrux + 185,
+    instrux + 373,
+    instrux + 376,
+    instrux + 560,
+    instrux + 563,
+    instrux + 567,
+    instrux + 911,
+    instrux + 914,
+    NULL
+};
+
+static struct itemplate *itable_F7[] = {
+    instrux + 186,
+    instrux + 187,
+    instrux + 374,
+    instrux + 375,
+    instrux + 377,
+    instrux + 378,
+    instrux + 561,
+    instrux + 562,
+    instrux + 564,
+    instrux + 565,
+    instrux + 568,
+    instrux + 569,
+    instrux + 912,
+    instrux + 913,
+    instrux + 915,
+    instrux + 916,
+    NULL
+};
+
+static struct itemplate *itable_F8[] = {
+    instrux + 131,
+    NULL
+};
+
+static struct itemplate *itable_F9[] = {
+    instrux + 870,
+    NULL
+};
+
+static struct itemplate *itable_FA[] = {
+    instrux + 133,
+    NULL
+};
+
+static struct itemplate *itable_FB[] = {
+    instrux + 872,
+    NULL
+};
+
+static struct itemplate *itable_FC[] = {
+    instrux + 132,
+    NULL
+};
+
+static struct itemplate *itable_FD[] = {
+    instrux + 871,
+    NULL
+};
+
+static struct itemplate *itable_FE[] = {
+    instrux + 182,
+    instrux + 403,
+    NULL
+};
+
+static struct itemplate *itable_FF[] = {
+    instrux + 118,
+    instrux + 119,
+    instrux + 120,
+    instrux + 121,
+    instrux + 122,
+    instrux + 123,
+    instrux + 124,
+    instrux + 125,
+    instrux + 126,
+    instrux + 127,
+    instrux + 128,
+    instrux + 183,
+    instrux + 184,
+    instrux + 404,
+    instrux + 405,
+    instrux + 427,
+    instrux + 428,
+    instrux + 429,
+    instrux + 430,
+    instrux + 431,
+    instrux + 432,
+    instrux + 433,
+    instrux + 434,
+    instrux + 435,
+    instrux + 436,
+    instrux + 437,
+    instrux + 728,
+    instrux + 729,
+    NULL
+};
+
+struct itemplate **itable[] = {
+    itable_00,
+    itable_01,
+    itable_02,
+    itable_03,
+    itable_04,
+    itable_05,
+    itable_06,
+    itable_07,
+    itable_08,
+    itable_09,
+    itable_0A,
+    itable_0B,
+    itable_0C,
+    itable_0D,
+    itable_0E,
+    itable_0F,
+    itable_10,
+    itable_11,
+    itable_12,
+    itable_13,
+    itable_14,
+    itable_15,
+    itable_16,
+    itable_17,
+    itable_18,
+    itable_19,
+    itable_1A,
+    itable_1B,
+    itable_1C,
+    itable_1D,
+    itable_1E,
+    itable_1F,
+    itable_20,
+    itable_21,
+    itable_22,
+    itable_23,
+    itable_24,
+    itable_25,
+    itable_26,
+    itable_27,
+    itable_28,
+    itable_29,
+    itable_2A,
+    itable_2B,
+    itable_2C,
+    itable_2D,
+    itable_2E,
+    itable_2F,
+    itable_30,
+    itable_31,
+    itable_32,
+    itable_33,
+    itable_34,
+    itable_35,
+    itable_36,
+    itable_37,
+    itable_38,
+    itable_39,
+    itable_3A,
+    itable_3B,
+    itable_3C,
+    itable_3D,
+    itable_3E,
+    itable_3F,
+    itable_40,
+    itable_41,
+    itable_42,
+    itable_43,
+    itable_44,
+    itable_45,
+    itable_46,
+    itable_47,
+    itable_48,
+    itable_49,
+    itable_4A,
+    itable_4B,
+    itable_4C,
+    itable_4D,
+    itable_4E,
+    itable_4F,
+    itable_50,
+    itable_51,
+    itable_52,
+    itable_53,
+    itable_54,
+    itable_55,
+    itable_56,
+    itable_57,
+    itable_58,
+    itable_59,
+    itable_5A,
+    itable_5B,
+    itable_5C,
+    itable_5D,
+    itable_5E,
+    itable_5F,
+    itable_60,
+    itable_61,
+    itable_62,
+    itable_63,
+    itable_64,
+    itable_65,
+    itable_66,
+    itable_67,
+    itable_68,
+    itable_69,
+    itable_6A,
+    itable_6B,
+    itable_6C,
+    itable_6D,
+    itable_6E,
+    itable_6F,
+    itable_70,
+    itable_71,
+    itable_72,
+    itable_73,
+    itable_74,
+    itable_75,
+    itable_76,
+    itable_77,
+    itable_78,
+    itable_79,
+    itable_7A,
+    itable_7B,
+    itable_7C,
+    itable_7D,
+    itable_7E,
+    itable_7F,
+    itable_80,
+    itable_81,
+    itable_82,
+    itable_83,
+    itable_84,
+    itable_85,
+    itable_86,
+    itable_87,
+    itable_88,
+    itable_89,
+    itable_8A,
+    itable_8B,
+    itable_8C,
+    itable_8D,
+    itable_8E,
+    itable_8F,
+    itable_90,
+    itable_91,
+    itable_92,
+    itable_93,
+    itable_94,
+    itable_95,
+    itable_96,
+    itable_97,
+    itable_98,
+    itable_99,
+    itable_9A,
+    itable_9B,
+    itable_9C,
+    itable_9D,
+    itable_9E,
+    itable_9F,
+    itable_A0,
+    itable_A1,
+    itable_A2,
+    itable_A3,
+    itable_A4,
+    itable_A5,
+    itable_A6,
+    itable_A7,
+    itable_A8,
+    itable_A9,
+    itable_AA,
+    itable_AB,
+    itable_AC,
+    itable_AD,
+    itable_AE,
+    itable_AF,
+    itable_B0,
+    itable_B1,
+    itable_B2,
+    itable_B3,
+    itable_B4,
+    itable_B5,
+    itable_B6,
+    itable_B7,
+    itable_B8,
+    itable_B9,
+    itable_BA,
+    itable_BB,
+    itable_BC,
+    itable_BD,
+    itable_BE,
+    itable_BF,
+    itable_C0,
+    itable_C1,
+    itable_C2,
+    itable_C3,
+    itable_C4,
+    itable_C5,
+    itable_C6,
+    itable_C7,
+    itable_C8,
+    itable_C9,
+    itable_CA,
+    itable_CB,
+    itable_CC,
+    itable_CD,
+    itable_CE,
+    itable_CF,
+    itable_D0,
+    itable_D1,
+    itable_D2,
+    itable_D3,
+    itable_D4,
+    itable_D5,
+    itable_D6,
+    itable_D7,
+    itable_D8,
+    itable_D9,
+    itable_DA,
+    itable_DB,
+    itable_DC,
+    itable_DD,
+    itable_DE,
+    itable_DF,
+    itable_E0,
+    itable_E1,
+    itable_E2,
+    itable_E3,
+    itable_E4,
+    itable_E5,
+    itable_E6,
+    itable_E7,
+    itable_E8,
+    itable_E9,
+    itable_EA,
+    itable_EB,
+    itable_EC,
+    itable_ED,
+    itable_EE,
+    itable_EF,
+    itable_F0,
+    itable_F1,
+    itable_F2,
+    itable_F3,
+    itable_F4,
+    itable_F5,
+    itable_F6,
+    itable_F7,
+    itable_F8,
+    itable_F9,
+    itable_FA,
+    itable_FB,
+    itable_FC,
+    itable_FD,
+    itable_FE,
+    itable_FF,
+};
diff --git a/i386/nasm/labels.c b/i386/nasm/labels.c
new file mode 100644 (file)
index 0000000..7689fa4
--- /dev/null
@@ -0,0 +1,340 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
+ * Reserved.  This file contains Original Code and/or Modifications of
+ * Original Code as defined in and that are subject to the Apple Public
+ * Source License Version 1.1 (the "License").  You may not use this file
+ * except in compliance with the License.  Please obtain a copy of the
+ * License at http://www.apple.com/publicsource and read it before using
+ * this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/* labels.c  label handling for the Netwide Assembler
+ *
+ * The Netwide Assembler is copyright (C) 1996 Simon Tatham and
+ * Julian Hall. All rights reserved. The software is
+ * redistributable under the licence given in the file "Licence"
+ * distributed in the NASM archive.
+ */
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include "nasm.h"
+#include "nasmlib.h"
+
+/*
+ * A local label is one that begins with exactly one period. Things
+ * that begin with _two_ periods are NASM-specific things.
+ */
+#define islocal(l) ((l)[0] == '.' && (l)[1] != '.')
+
+#define LABEL_BLOCK  320              /* no. of labels/block */
+#define LBLK_SIZE    (LABEL_BLOCK*sizeof(union label))
+#define LABEL_HASHES 32                       /* no. of hash table entries */
+
+#define END_LIST -3                   /* don't clash with NO_SEG! */
+#define END_BLOCK -2
+#define BOGUS_VALUE -4
+
+#define PERMTS_SIZE  4096             /* size of text blocks */
+
+/* values for label.defn.is_global */
+#define DEFINED_BIT 1
+#define GLOBAL_BIT 2
+#define EXTERN_BIT 4
+
+#define NOT_DEFINED_YET 0
+#define TYPE_MASK 3
+#define LOCAL_SYMBOL (DEFINED_BIT)
+#define GLOBAL_PLACEHOLDER (GLOBAL_BIT)
+#define GLOBAL_SYMBOL (DEFINED_BIT|GLOBAL_BIT)
+
+union label {                         /* actual label structures */
+    struct {
+       long segment, offset;
+        char *label, *special;
+       int is_global;
+    } defn;
+    struct {
+       long movingon, dummy;
+       union label *next;
+    } admin;
+};
+
+struct permts {                               /* permanent text storage */
+    struct permts *next;              /* for the linked list */
+    int size, usage;                  /* size and used space in ... */
+    char data[PERMTS_SIZE];           /* ... the data block itself */
+};
+
+static union label *ltab[LABEL_HASHES];/* using a hash table */
+static union label *lfree[LABEL_HASHES];/* pointer into the above */
+static struct permts *perm_head;      /* start of perm. text storage */
+static struct permts *perm_tail;      /* end of perm. text storage */
+
+static void init_block (union label *blk);
+static char *perm_copy (char *string1, char *string2);
+
+static char *prevlabel;
+
+static int initialised = FALSE;
+
+/*
+ * Internal routine: finds the `union label' corresponding to the
+ * given label name. Creates a new one, if it isn't found, and if
+ * `create' is TRUE.
+ */
+static union label *find_label (char *label, int create) {
+    int hash = 0;
+    char *p, *prev;
+    int prevlen;
+    union label *lptr;
+
+    if (islocal(label))
+       prev = prevlabel;
+    else
+       prev = "";
+    prevlen = strlen(prev);
+    p = prev;
+    while (*p) hash += *p++;
+    p = label;
+    while (*p) hash += *p++;
+    hash %= LABEL_HASHES;
+    lptr = ltab[hash];
+    while (lptr->admin.movingon != END_LIST) {
+       if (lptr->admin.movingon == END_BLOCK) {
+           lptr = lptr->admin.next;
+           if (!lptr)
+               break;
+       }
+       if (!strncmp(lptr->defn.label, prev, prevlen) &&
+           !strcmp(lptr->defn.label+prevlen, label))
+           return lptr;
+       lptr++;
+    }
+    if (create) {
+       if (lfree[hash]->admin.movingon == END_BLOCK) {
+           /*
+            * must allocate a new block
+            */
+           lfree[hash]->admin.next = (union label *) nasm_malloc (LBLK_SIZE);
+           lfree[hash] = lfree[hash]->admin.next;
+           init_block(lfree[hash]);
+       }
+
+       lfree[hash]->admin.movingon = BOGUS_VALUE;
+       lfree[hash]->defn.label = perm_copy (prev, label);
+       lfree[hash]->defn.special = NULL;
+       lfree[hash]->defn.is_global = NOT_DEFINED_YET;
+       return lfree[hash]++;
+    } else
+       return NULL;
+}
+
+int lookup_label (char *label, long *segment, long *offset) {
+    union label *lptr;
+
+    if (!initialised)
+       return 0;
+
+    lptr = find_label (label, 0);
+    if (lptr && (lptr->defn.is_global & DEFINED_BIT)) {
+       *segment = lptr->defn.segment;
+       *offset = lptr->defn.offset;
+       return 1;
+    } else
+       return 0;
+}
+
+int is_extern (char *label) {
+    union label *lptr;
+
+    if (!initialised)
+       return 0;
+
+    lptr = find_label (label, 0);
+    if (lptr && (lptr->defn.is_global & EXTERN_BIT))
+       return 1;
+    else
+       return 0;
+}
+
+void define_label_stub (char *label, efunc error) {
+    union label *lptr;
+
+    if (!islocal(label)) {
+       lptr = find_label (label, 1);
+       if (!lptr)
+           error (ERR_PANIC, "can't find label `%s' on pass two", label);
+       if (*label != '.')
+           prevlabel = lptr->defn.label;
+    }
+}
+
+void define_label (char *label, long segment, long offset, char *special,
+                  int is_norm, int isextrn, struct ofmt *ofmt, efunc error) {
+    union label *lptr;
+
+    lptr = find_label (label, 1);
+    if (lptr->defn.is_global & DEFINED_BIT) {
+       error(ERR_NONFATAL, "symbol `%s' redefined", label);
+       return;
+    }
+    lptr->defn.is_global |= DEFINED_BIT;
+    if (isextrn)
+       lptr->defn.is_global |= EXTERN_BIT;
+
+    if (label[0] != '.' && is_norm)    /* not local, but not special either */
+       prevlabel = lptr->defn.label;
+    else if (label[0] == '.' && label[1] != '.' && !*prevlabel)
+       error(ERR_NONFATAL, "attempt to define a local label before any"
+             " non-local labels");
+
+    lptr->defn.segment = segment;
+    lptr->defn.offset = offset;
+
+    ofmt->symdef (lptr->defn.label, segment, offset,
+                 !!(lptr->defn.is_global & GLOBAL_BIT),
+                 special ? special : lptr->defn.special);
+}
+
+void define_common (char *label, long segment, long size, char *special,
+                   struct ofmt *ofmt, efunc error) {
+    union label *lptr;
+
+    lptr = find_label (label, 1);
+    if (lptr->defn.is_global & DEFINED_BIT) {
+       error(ERR_NONFATAL, "symbol `%s' redefined", label);
+       return;
+    }
+    lptr->defn.is_global |= DEFINED_BIT;
+
+    if (label[0] != '.')              /* not local, but not special either */
+       prevlabel = lptr->defn.label;
+    else
+       error(ERR_NONFATAL, "attempt to define a local label as a "
+             "common variable");
+
+    lptr->defn.segment = segment;
+    lptr->defn.offset = 0;
+
+    ofmt->symdef (lptr->defn.label, segment, size, 2,
+                 special ? special : lptr->defn.special);
+}
+
+void declare_as_global (char *label, char *special, efunc error) {
+    union label *lptr;
+
+    if (islocal(label)) {
+       error(ERR_NONFATAL, "attempt to declare local symbol `%s' as"
+             " global", label);
+       return;
+    }
+    lptr = find_label (label, 1);
+    switch (lptr->defn.is_global & TYPE_MASK) {
+      case NOT_DEFINED_YET:
+       lptr->defn.is_global = GLOBAL_PLACEHOLDER;
+       lptr->defn.special = special ? perm_copy(special, "") : NULL;
+       break;
+      case GLOBAL_PLACEHOLDER:        /* already done: silently ignore */
+      case GLOBAL_SYMBOL:
+       break;
+      case LOCAL_SYMBOL:
+       if (!lptr->defn.is_global & EXTERN_BIT)
+           error(ERR_NONFATAL, "symbol `%s': GLOBAL directive must"
+                 " appear before symbol definition", label);
+       break;
+    }
+}
+
+int init_labels (void) {
+    int i;
+
+    for (i=0; i<LABEL_HASHES; i++) {
+       ltab[i] = (union label *) nasm_malloc (LBLK_SIZE);
+       if (!ltab[i])
+           return -1;                 /* can't initialise, panic */
+       init_block (ltab[i]);
+       lfree[i] = ltab[i];
+    }
+
+    perm_head = perm_tail = (struct permts *) nasm_malloc (sizeof(struct permts));
+    if (!perm_head)
+       return -1;
+
+    perm_head->next = NULL;
+    perm_head->size = PERMTS_SIZE;
+    perm_head->usage = 0;
+
+    prevlabel = "";
+
+    initialised = TRUE;
+
+    return 0;
+}
+
+void cleanup_labels (void) {
+    int i;
+
+    initialised = FALSE;
+
+    for (i=0; i<LABEL_HASHES; i++) {
+       union label *lptr, *lhold;
+
+       lptr = lhold = ltab[i];
+
+       while (lptr) {
+           while (lptr->admin.movingon != END_BLOCK) lptr++;
+           lptr = lptr->admin.next;
+           nasm_free (lhold);
+           lhold = lptr;
+       }
+    }
+
+    while (perm_head) {
+       perm_tail = perm_head;
+       perm_head = perm_head->next;
+       nasm_free (perm_tail);
+    }
+}
+
+static void init_block (union label *blk) {
+    int j;
+
+    for (j=0; j<LABEL_BLOCK-1; j++)
+       blk[j].admin.movingon = END_LIST;
+    blk[LABEL_BLOCK-1].admin.movingon = END_BLOCK;
+    blk[LABEL_BLOCK-1].admin.next = NULL;
+}
+
+static char *perm_copy (char *string1, char *string2) {
+    char *p, *q;
+    int len = strlen(string1)+strlen(string2)+1;
+
+    if (perm_tail->size - perm_tail->usage < len) {
+       perm_tail->next = (struct permts *)nasm_malloc(sizeof(struct permts));
+       perm_tail = perm_tail->next;
+       perm_tail->next = NULL;
+       perm_tail->size = PERMTS_SIZE;
+       perm_tail->usage = 0;
+    }
+    p = q = perm_tail->data + perm_tail->usage;
+    while ( (*q = *string1++) ) q++;
+    while ( (*q++ = *string2++) );
+    perm_tail->usage = q - perm_tail->data;
+
+    return p;
+}
diff --git a/i386/nasm/labels.h b/i386/nasm/labels.h
new file mode 100644 (file)
index 0000000..40729d8
--- /dev/null
@@ -0,0 +1,41 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
+ * Reserved.  This file contains Original Code and/or Modifications of
+ * Original Code as defined in and that are subject to the Apple Public
+ * Source License Version 1.1 (the "License").  You may not use this file
+ * except in compliance with the License.  Please obtain a copy of the
+ * License at http://www.apple.com/publicsource and read it before using
+ * this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/* labels.h  header file for labels.c
+ *
+ * The Netwide Assembler is copyright (C) 1996 Simon Tatham and
+ * Julian Hall. All rights reserved. The software is
+ * redistributable under the licence given in the file "Licence"
+ * distributed in the NASM archive.
+ */
+
+int lookup_label (char *label, long *segment, long *offset);
+int is_extern (char *label);
+void define_label (char *label, long segment, long offset, char *special,
+                  int is_norm, int isextrn, struct ofmt *ofmt, efunc error);
+void define_common (char *label, long segment, long size, char *special,
+                   struct ofmt *ofmt, efunc error);
+void define_label_stub (char *label, efunc error);
+void declare_as_global (char *label, char *special, efunc error);
+int init_labels (void);
+void cleanup_labels (void);
diff --git a/i386/nasm/listing.c b/i386/nasm/listing.c
new file mode 100644 (file)
index 0000000..b5ee519
--- /dev/null
@@ -0,0 +1,263 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
+ * Reserved.  This file contains Original Code and/or Modifications of
+ * Original Code as defined in and that are subject to the Apple Public
+ * Source License Version 1.1 (the "License").  You may not use this file
+ * except in compliance with the License.  Please obtain a copy of the
+ * License at http://www.apple.com/publicsource and read it before using
+ * this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/* listing.c    listing file generator for the Netwide Assembler
+ *
+ * The Netwide Assembler is copyright (C) 1996 Simon Tatham and
+ * Julian Hall. All rights reserved. The software is
+ * redistributable under the licence given in the file "Licence"
+ * distributed in the NASM archive.
+ *
+ * initial version 2/vii/97 by Simon Tatham
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <stddef.h>
+#include <string.h>
+#include <ctype.h>
+
+#include "nasm.h"
+#include "nasmlib.h"
+#include "listing.h"
+
+#define LIST_MAX_LEN 216              /* something sensible */
+#define LIST_INDENT  40
+#define LIST_HEXBIT  18
+
+typedef struct MacroInhibit MacroInhibit;
+
+static struct MacroInhibit {
+    MacroInhibit *next;
+    int level;
+    int inhibiting;
+} *mistack;
+
+static char xdigit[] = "0123456789ABCDEF";
+
+#define HEX(a,b) (*(a)=xdigit[((b)>>4)&15],(a)[1]=xdigit[(b)&15]);
+
+static char listline[LIST_MAX_LEN];
+static int listlinep;
+
+static char listdata[2*LIST_INDENT];   /* we need less than that actually */
+static long listoffset;
+
+static long listlineno;
+
+static long listp;
+
+static int suppress;                  /* for INCBIN & TIMES special cases */
+
+static int listlevel, listlevel_e;
+
+static FILE *listfp;
+
+static void list_emit (void) {
+    if (!listlinep && !listdata[0])
+       return;
+    fprintf(listfp, "%6ld ", ++listlineno);
+    if (listdata[0])
+       fprintf(listfp, "%08lX %-*s", listoffset, LIST_HEXBIT+1, listdata);
+    else
+       fprintf(listfp, "%*s", LIST_HEXBIT+10, "");
+    if (listlevel_e)
+       fprintf(listfp, "%s<%d>", (listlevel < 10 ? " " : ""), listlevel_e);
+    else if (listlinep)
+       fprintf(listfp, "    ");
+    if (listlinep)
+       fprintf(listfp, " %s", listline);
+    fputc('\n', listfp);
+    listlinep = FALSE;
+    listdata[0] = '\0';
+}
+
+static void list_init (char *fname, efunc error) {
+    listfp = fopen (fname, "w");
+    if (!listfp) {
+       error (ERR_NONFATAL, "unable to open listing file `%s'", fname);
+       return;
+    }
+    *listline = '\0';
+    listlineno = 0;
+    listp = TRUE;
+    listlevel = 0;
+    suppress = 0;
+    mistack = nasm_malloc(sizeof(MacroInhibit));
+    mistack->next = NULL;
+    mistack->level = 0;
+    mistack->inhibiting = TRUE;
+}
+
+static void list_cleanup (void) {
+    if (!listp)
+       return;
+    while (mistack) {
+       MacroInhibit *temp = mistack;
+       mistack = temp->next;
+       nasm_free (temp);
+    }
+    list_emit();
+    fclose (listfp);
+}
+
+static void list_out (long offset, char *str) {
+    if (strlen(listdata) + strlen(str) > LIST_HEXBIT) {
+       strcat(listdata, "-");
+       list_emit();
+    }
+    if (!listdata[0])
+       listoffset = offset;
+    strcat(listdata, str);
+}
+
+static void list_output (long offset, void *data, unsigned long type) {
+    long typ, size;
+
+    if (!listp || suppress)
+       return;
+
+    typ = type & OUT_TYPMASK;
+    size = type & OUT_SIZMASK;
+
+    if (typ == OUT_RAWDATA) {
+       unsigned char *p = data;
+       char q[3];
+       while (size--) {
+           HEX (q, *p);
+           q[2] = '\0';
+           list_out (offset++, q);
+           p++;
+       }
+    } else if (typ == OUT_ADDRESS) {
+       unsigned long d = *(long *)data;
+       char q[11];
+       unsigned char p[4], *r = p;
+       if (size == 4) {
+           q[0] = '['; q[9] = ']'; q[10] = '\0';
+           WRITELONG (r, d);
+           HEX (q+1, p[0]);
+           HEX (q+3, p[1]);
+           HEX (q+5, p[2]);
+           HEX (q+7, p[3]);
+           list_out (offset, q);
+       } else {
+           q[0] = '['; q[5] = ']'; q[6] = '\0';
+           WRITESHORT (r, d);
+           HEX (q+1, p[0]);
+           HEX (q+3, p[1]);
+           list_out (offset, q);
+       }
+    } else if (typ == OUT_REL2ADR) {
+       unsigned long d = *(long *)data;
+       char q[11];
+       unsigned char p[4], *r = p;
+       q[0] = '('; q[5] = ')'; q[6] = '\0';
+       WRITESHORT (r, d);
+       HEX (q+1, p[0]);
+       HEX (q+3, p[1]);
+       list_out (offset, q);
+    } else if (typ == OUT_REL4ADR) {
+       unsigned long d = *(long *)data;
+       char q[11];
+       unsigned char p[4], *r = p;
+       q[0] = '('; q[9] = ')'; q[10] = '\0';
+       WRITELONG (r, d);
+       HEX (q+1, p[0]);
+       HEX (q+3, p[1]);
+       HEX (q+5, p[2]);
+       HEX (q+7, p[3]);
+       list_out (offset, q);
+    } else if (typ == OUT_RESERVE) {
+       char q[20];
+       sprintf(q, "<res %08lX>", size);
+       list_out (offset, q);
+    }
+}
+
+static void list_line (int type, char *line) {
+    if (!listp)
+       return;
+    if (mistack && mistack->inhibiting) {
+       if (type == LIST_MACRO)
+           return;
+       else {                         /* pop the m i stack */
+           MacroInhibit *temp = mistack;
+           mistack = temp->next;
+           nasm_free (temp);
+       }
+    }
+    list_emit();
+    listlinep = TRUE;
+    strncpy (listline, line, LIST_MAX_LEN-1);
+    listline[LIST_MAX_LEN-1] = '\0';
+    listlevel_e = listlevel;
+}
+
+static void list_uplevel (int type) {
+    if (!listp)
+       return;
+    if (type == LIST_INCBIN || type == LIST_TIMES) {
+       suppress |= (type == LIST_INCBIN ? 1 : 2);
+       list_out (listoffset, type == LIST_INCBIN ? "<incbin>" : "<rept>");
+       return;
+    }
+    listlevel++;
+    if (mistack && mistack->inhibiting && type == LIST_INCLUDE) {
+       MacroInhibit *temp = nasm_malloc(sizeof(MacroInhibit));
+       temp->next = mistack;
+       temp->level = listlevel;
+       temp->inhibiting = FALSE;
+       mistack = temp;
+    } else if (type == LIST_MACRO_NOLIST) {
+       MacroInhibit *temp = nasm_malloc(sizeof(MacroInhibit));
+       temp->next = mistack;
+       temp->level = listlevel;
+       temp->inhibiting = TRUE;
+       mistack = temp;
+    }
+}
+
+static void list_downlevel (int type) {
+    if (!listp)
+       return;
+    if (type == LIST_INCBIN || type == LIST_TIMES) {
+       suppress &= ~(type == LIST_INCBIN ? 1 : 2);
+       return;
+    }
+    listlevel--;
+    while (mistack && mistack->level > listlevel) {
+       MacroInhibit *temp = mistack;
+       mistack = temp->next;
+       nasm_free (temp);
+    }
+}
+
+ListGen nasmlist = {
+    list_init,
+    list_cleanup,
+    list_output,
+    list_line,
+    list_uplevel,
+    list_downlevel
+};
diff --git a/i386/nasm/listing.h b/i386/nasm/listing.h
new file mode 100644 (file)
index 0000000..01f6048
--- /dev/null
@@ -0,0 +1,37 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
+ * Reserved.  This file contains Original Code and/or Modifications of
+ * Original Code as defined in and that are subject to the Apple Public
+ * Source License Version 1.1 (the "License").  You may not use this file
+ * except in compliance with the License.  Please obtain a copy of the
+ * License at http://www.apple.com/publicsource and read it before using
+ * this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/* listing.h   header file for listing.c
+ *
+ * The Netwide Assembler is copyright (C) 1996 Simon Tatham and
+ * Julian Hall. All rights reserved. The software is
+ * redistributable under the licence given in the file "Licence"
+ * distributed in the NASM archive.
+ */
+
+#ifndef NASM_LISTING_H
+#define NASM_LISTING_H
+
+extern ListGen nasmlist;
+
+#endif
diff --git a/i386/nasm/macros.c b/i386/nasm/macros.c
new file mode 100644 (file)
index 0000000..66f9131
--- /dev/null
@@ -0,0 +1,96 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
+ * Reserved.  This file contains Original Code and/or Modifications of
+ * Original Code as defined in and that are subject to the Apple Public
+ * Source License Version 1.1 (the "License").  You may not use this file
+ * except in compliance with the License.  Please obtain a copy of the
+ * License at http://www.apple.com/publicsource and read it before using
+ * this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/* This file auto-generated from standard.mac by macros.pl - don't edit it */
+
+static char *stdmac[] = {
+    "%define __NASM_MAJOR__ 0",
+    "%define __NASM_MINOR__ 97",
+    "%define __FILE__",
+    "%define __LINE__",
+    "%define __SECT__",
+    "%imacro section 1+.nolist",
+    "%define __SECT__ [section %1]",
+    "__SECT__",
+    "%endmacro",
+    "%imacro segment 1+.nolist",
+    "%define __SECT__ [segment %1]",
+    "__SECT__",
+    "%endmacro",
+    "%imacro absolute 1+.nolist",
+    "%define __SECT__ [absolute %1]",
+    "__SECT__",
+    "%endmacro",
+    "%imacro struc 1.nolist",
+    "%push struc",
+    "%define %$strucname %1",
+    "[absolute 0]",
+    "%$strucname:",
+    "%endmacro",
+    "%imacro endstruc 0.nolist",
+    "%{$strucname}_size:",
+    "%pop",
+    "__SECT__",
+    "%endmacro",
+    "%imacro istruc 1.nolist",
+    "%push istruc",
+    "%define %$strucname %1",
+    "%$strucstart:",
+    "%endmacro",
+    "%imacro at 1-2+.nolist",
+    "times %1-($-%$strucstart) db 0",
+    "%2",
+    "%endmacro",
+    "%imacro iend 0.nolist",
+    "times %{$strucname}_size-($-%$strucstart) db 0",
+    "%pop",
+    "%endmacro",
+    "%imacro align 1-2+.nolist nop",
+    "times ($$-$) & ((%1)-1) %2",
+    "%endmacro",
+    "%imacro alignb 1-2+.nolist resb 1",
+    "times ($$-$) & ((%1)-1) %2",
+    "%endmacro",
+    "%imacro extern 1-*.nolist",
+    "%rep %0",
+    "[extern %1]",
+    "%rotate 1",
+    "%endrep",
+    "%endmacro",
+    "%imacro bits 1+.nolist",
+    "[bits %1]",
+    "%endmacro",
+    "%imacro global 1-*.nolist",
+    "%rep %0",
+    "[global %1]",
+    "%rotate 1",
+    "%endrep",
+    "%endmacro",
+    "%imacro common 1-*.nolist",
+    "%rep %0",
+    "[common %1]",
+    "%rotate 1",
+    "%endrep",
+    "%endmacro",
+    NULL
+};
diff --git a/i386/nasm/macros.pl b/i386/nasm/macros.pl
new file mode 100755 (executable)
index 0000000..0a12bb0
--- /dev/null
@@ -0,0 +1,28 @@
+#!/usr/bin/perl
+#
+# macros.pl   produce macros.c from standard.mac
+#
+# The Netwide Assembler is copyright (C) 1996 Simon Tatham and
+# Julian Hall. All rights reserved. The software is
+# redistributable under the licence given in the file "Licence"
+# distributed in the NASM archive.
+
+$fname = "standard.mac" unless $fname = $ARGV[0];
+open INPUT,$fname || die "unable to open $fname\n";
+open OUTPUT,">macros.c" || die "unable to open macros.c\n";
+
+print OUTPUT "/* This file auto-generated from standard.mac by macros.pl" .
+        " - don't edit it */\n\nstatic char *stdmac[] = {\n";
+
+while (<INPUT>) {
+  chomp;
+  # this regexp ought to match anything at all, so why bother with
+  # a sensible error message ;-)
+  die "swirly thing alert" unless /^\s*((\s*([^"';\s]+|"[^"]*"|'[^']*'))*)/;
+  $_ = $1;
+  s/\\/\\\\/g;
+  s/"/\\"/g;
+  print OUTPUT "    \"$_\",\n" if length > 0;
+}
+
+print OUTPUT "    NULL\n};\n"
diff --git a/i386/nasm/names.c b/i386/nasm/names.c
new file mode 100644 (file)
index 0000000..3d64302
--- /dev/null
@@ -0,0 +1,107 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
+ * Reserved.  This file contains Original Code and/or Modifications of
+ * Original Code as defined in and that are subject to the Apple Public
+ * Source License Version 1.1 (the "License").  You may not use this file
+ * except in compliance with the License.  Please obtain a copy of the
+ * License at http://www.apple.com/publicsource and read it before using
+ * this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/* names.c   included source file defining instruction and register
+ *           names for the Netwide [Dis]Assembler
+ *
+ * The Netwide Assembler is copyright (C) 1996 Simon Tatham and
+ * Julian Hall. All rights reserved. The software is
+ * redistributable under the licence given in the file "Licence"
+ * distributed in the NASM archive.
+ */
+
+static char *reg_names[] = {          /* register names, as strings */
+    "ah", "al", "ax", "bh", "bl", "bp", "bx", "ch", "cl",
+    "cr0", "cr2", "cr3", "cr4", "cs", "cx", "dh", "di", "dl", "dr0",
+    "dr1", "dr2", "dr3", "dr6", "dr7", "ds", "dx", "eax", "ebp",
+    "ebx", "ecx", "edi", "edx", "es", "esi", "esp", "fs", "gs",
+    "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7", "si",
+    "sp", "ss", "st0", "st1", "st2", "st3", "st4", "st5", "st6",
+    "st7", "tr3", "tr4", "tr5", "tr6", "tr7"
+};
+
+static char *insn_names[] = {         /* instruction names, as strings */
+    "aaa", "aad", "aam", "aas", "adc", "add", "and", "arpl",
+    "bound", "bsf", "bsr", "bswap", "bt", "btc", "btr", "bts",
+    "call", "cbw", "cdq", "clc", "cld", "cli", "clts", "cmc", "cmp",
+    "cmpsb", "cmpsd", "cmpsw", "cmpxchg", "cmpxchg486", "cmpxchg8b",
+    "cpuid", "cwd", "cwde", "daa", "das", "db", "dd", "dec", "div",
+    "dq", "dt", "dw", "emms", "enter", "equ", "f2xm1", "fabs",
+    "fadd", "faddp", "fbld", "fbstp", "fchs", "fclex", "fcmovb",
+    "fcmovbe", "fcmove", "fcmovnb", "fcmovnbe", "fcmovne",
+    "fcmovnu", "fcmovu", "fcom", "fcomi", "fcomip", "fcomp",
+    "fcompp", "fcos", "fdecstp", "fdisi", "fdiv", "fdivp", "fdivr",
+    "fdivrp", "feni", "ffree", "fiadd", "ficom", "ficomp", "fidiv",
+    "fidivr", "fild", "fimul", "fincstp", "finit", "fist", "fistp",
+    "fisub", "fisubr", "fld", "fld1", "fldcw", "fldenv", "fldl2e",
+    "fldl2t", "fldlg2", "fldln2", "fldpi", "fldz", "fmul", "fmulp",
+    "fnclex", "fndisi", "fneni", "fninit", "fnop", "fnsave",
+    "fnstcw", "fnstenv", "fnstsw", "fpatan", "fprem", "fprem1",
+    "fptan", "frndint", "frstor", "fsave", "fscale", "fsetpm",
+    "fsin", "fsincos", "fsqrt", "fst", "fstcw", "fstenv", "fstp",
+    "fstsw", "fsub", "fsubp", "fsubr", "fsubrp", "ftst", "fucom",
+    "fucomi", "fucomip", "fucomp", "fucompp", "fxam", "fxch",
+    "fxtract", "fyl2x", "fyl2xp1", "hlt", "ibts", "icebp", "idiv",
+    "imul", "in", "inc", "incbin", "insb", "insd", "insw", "int",
+    "int1", "int01", "int3", "into", "invd", "invlpg", "iret",
+    "iretd", "iretw", "jcxz", "jecxz", "jmp", "lahf", "lar", "lds",
+    "lea", "leave", "les", "lfs", "lgdt", "lgs", "lidt", "lldt",
+    "lmsw", "loadall", "loadall286", "lodsb", "lodsd", "lodsw",
+    "loop", "loope", "loopne", "loopnz", "loopz", "lsl", "lss",
+    "ltr", "mov", "movd", "movq", "movsb", "movsd", "movsw",
+    "movsx", "movzx", "mul", "neg", "nop", "not", "or", "out",
+    "outsb", "outsd", "outsw", "packssdw", "packsswb", "packuswb",
+    "paddb", "paddd", "paddsb", "paddsiw", "paddsw", "paddusb",
+    "paddusw", "paddw", "pand", "pandn", "paveb", "pcmpeqb",
+    "pcmpeqd", "pcmpeqw", "pcmpgtb", "pcmpgtd", "pcmpgtw",
+    "pdistib", "pmachriw", "pmaddwd", "pmagw", "pmulhrw",
+    "pmulhriw", "pmulhw", "pmullw", "pmvgezb", "pmvlzb", "pmvnzb",
+    "pmvzb", "pop", "popa", "popad", "popaw", "popf", "popfd",
+    "popfw", "por", "pslld", "psllq", "psllw", "psrad", "psraw",
+    "psrld", "psrlq", "psrlw", "psubb", "psubd", "psubsb",
+    "psubsiw", "psubsw", "psubusb", "psubusw", "psubw", "punpckhbw",
+    "punpckhdq", "punpckhwd", "punpcklbw", "punpckldq", "punpcklwd",
+    "push", "pusha", "pushad", "pushaw", "pushf", "pushfd",
+    "pushfw", "pxor", "rcl", "rcr", "rdmsr", "rdpmc", "rdtsc",
+    "resb", "resd", "resq", "rest", "resw", "ret", "retf", "retn",
+    "rol", "ror", "rsm", "sahf", "sal", "salc", "sar", "sbb",
+    "scasb", "scasd", "scasw", "sgdt", "shl", "shld", "shr", "shrd",
+    "sidt", "sldt", "smi", "smsw", "stc", "std", "sti", "stosb",
+    "stosd", "stosw", "str", "sub", "test", "umov", "verr", "verw",
+    "wait", "wbinvd", "wrmsr", "xadd", "xbts", "xchg", "xlatb",
+    "xor"
+};
+
+static char *icn[] = {                /* conditional instructions */
+    "cmov", "j", "set"
+};
+
+static int ico[] = {                  /* and the corresponding opcodes */
+    I_CMOVcc, I_Jcc, I_SETcc
+};
+
+static char *conditions[] = {         /* condition code names */
+    "a", "ae", "b", "be", "c", "e", "g", "ge", "l", "le", "na", "nae",
+    "nb", "nbe", "nc", "ne", "ng", "nge", "nl", "nle", "no", "np",
+    "ns", "nz", "o", "p", "pe", "po", "s", "z"
+};
diff --git a/i386/nasm/nasm.1 b/i386/nasm/nasm.1
new file mode 100644 (file)
index 0000000..051da48
--- /dev/null
@@ -0,0 +1,423 @@
+.TH NASM 1 "The Netwide Assembler Project"
+.SH NAME
+nasm \- the Netwide Assembler \- portable 80x86 assembler
+.SH SYNOPSIS
+.B nasm
+[
+.B \-f
+format
+] [
+.B \-o
+outfile
+] [
+.IR options ...
+] infile
+.br
+.B nasm \-h
+.br
+.B nasm \-r
+.SH DESCRIPTION
+The
+.B nasm
+command assembles the file
+.I infile
+and directs output to the file
+.I outfile
+if specified. If
+.I outfile
+is not specified,
+.B nasm
+will derive a default output file name from the name of its input
+file, usually by appending `.o' or `.obj', or by removing all
+extensions for a raw binary file. Failing that, the output file name
+will be `nasm.out'.
+.SS OPTIONS
+.TP
+.B \-h
+Causes
+.B nasm
+to exit immediately, after giving a summary of its invocation
+options, and listing all its supported output file formats.
+.TP
+.B \-a
+Causes
+.B nasm
+to assemble the given input file without first applying the macro
+preprocessor.
+.TP
+.B \-e
+Causes
+.B nasm
+to preprocess the given input file, and write the output to
+.I stdout
+(or the specified output file name), and not actually assemble
+anything.
+.TP
+.BI \-r
+Causes
+.B nasm
+to exit immediately, after displaying its version number.
+.TP
+.BI \-f " format"
+Specifies the output file format. Formats include
+.IR bin ,
+to produce flat-form binary files, and
+.I aout
+and
+.I elf
+to produce Linux a.out and ELF object files, respectively.
+.TP
+.BI \-o " outfile"
+Specifies a precise name for the output file, overriding
+.BR nasm 's
+default means of determining it.
+.TP
+.BI \-l " listfile"
+Causes an assembly listing to be directed to the given file, in
+which the original source is displayed on the right hand side (plus
+the source for included files and the expansions of multi-line
+macros) and the generated code is shown in hex on the left.
+.TP
+.B \-s
+Causes
+.B nasm
+to send its error messages and/or help text to
+.I stdout
+instead of
+.IR stderr .
+.TP
+.BI \-w [+-]foo
+Causes
+.B nasm
+to enable or disable certain classes of warning messages, for
+example
+.B \-w+orphan-labels
+or
+.B \-w-macro-params
+to, respectively, enable warnings about labels alone on lines or
+disable warnings about incorrect numbers of parameters in macro
+calls.
+.TP
+.BI \-i " directory"
+Adds a directory to the search path for include files. The directory
+specification must include the trailing slash, as it will be
+directly prepended to the name of the include file.
+.TP
+.BI \-p " file"
+Specifies a file to be pre-included, before the main source file
+starts to be processed.
+.TP
+.BI \-d " macro[=value]"
+Pre-defines a single-line macro.
+.PP
+.RE
+.SS SYNTAX
+This man page does not fully describe the syntax of
+.BR nasm 's
+assembly language, but does give a summary of the differences from
+other assemblers.
+.PP
+.I Registers
+have no leading `%' sign, unlike
+.BR gas ,
+and floating-point stack registers are referred to as
+.IR st0 ,
+.IR st1 ,
+and so on.
+.PP
+.I Floating-point instructions
+may use either the single-operand form or the double. A
+.I TO
+keyword is provided; thus, one could either write
+.PP
+.ti +15n
+fadd st0,st1
+.br
+.ti +15n
+fadd st1,st0
+.PP
+or one could use the alternative single-operand forms
+.PP
+.ti +15n
+fadd st1
+.br
+.ti +15n
+fadd to st1
+.PP
+.I Uninitialised storage
+is reserved using the
+.IR RESB ,
+.IR RESW ,
+.IR RESD ,
+.I RESQ
+and
+.I REST
+pseudo-opcodes, each taking one parameter which gives the number of
+bytes, words, doublewords, quadwords or ten-byte words to reserve.
+.PP
+.I Repetition
+of data items is not done by the
+.I DUP
+keyword as seen in DOS assemblers, but by the use of the
+.I TIMES
+prefix, like this:
+.PP
+.ti +6n
+.ta 9n
+message:       times 3 db 'abc'
+.br
+.ti +15n
+times 64-$+message db 0
+.PP
+which defines the string `abcabcabc', followed by the right number
+of zero bytes to make the total length up to 64 bytes.
+.PP
+.I Symbol references
+are always understood to be immediate (i.e. the address of the
+symbol), unless square brackets are used, in which case the contents
+of the memory location are used. Thus:
+.PP
+.ti +15n
+mov ax,wordvar
+.PP
+loads AX with the address of the variable `wordvar', whereas
+.PP
+.ti +15n
+mov ax,[wordvar]
+.br
+.ti +15n
+mov ax,[wordvar+1]
+.br
+.ti +15n
+mov ax,[es:wordvar+bx]
+.PP
+all refer to the
+.I contents
+of memory locations. The syntaxes
+.PP
+.ti +15n
+mov ax,es:wordvar[bx]
+.br
+.ti +15n
+es mov ax,wordvar[1]
+.PP
+are not legal at all, although the use of a segment register name as
+an instruction prefix is valid, and can be used with instructions
+such as
+.I LODSB
+which can't be overridden any other way.
+.PP
+.I Constants
+may be expressed numerically in most formats: a trailing H, Q or B
+denotes hex, octal or binary respectively, and a leading `0x' or `$'
+denotes hex as well. Leading zeros are not treated specially at all.
+Character constants may be enclosed in single or double quotes;
+there is no escape character. The ordering is little-endian
+(reversed), so that the character constant
+.I 'abcd'
+denotes 0x64636261 and not 0x61626364.
+.PP
+.I Local labels
+begin with a period, and their `locality' is granted by the
+assembler prepending the name of the previous non-local symbol. Thus
+declaring a label `.loop' after a label `label' has actually defined
+a symbol called `label.loop'.
+.SS DIRECTIVES
+.I SECTION name
+or
+.I SEGMENT name
+causes
+.B nasm
+to direct all following code to the named section. Section names
+vary with output file format, although most formats support the
+names
+.IR .text ,
+.I .data
+and
+.IR .bss .
+(The exception is the
+.I obj
+format, in which all segments are user-definable.)
+.PP
+.I ABSOLUTE address
+causes
+.B nasm
+to position its notional assembly point at an absolute address: so
+no code or data may be generated, but you can use
+.IR RESB ,
+.I RESW
+and
+.I RESD
+to move the assembly point further on, and you can define labels. So
+this directive may be used to define data structures. When you have
+finished doing absolute assembly, you must issue another
+.I SECTION
+directive to return to normal assembly.
+.PP
+.I BITS 16
+or
+.I BITS 32
+switches the default processor mode for which
+.B nasm
+is generating code: it is equivalent to
+.I USE16
+or
+.I USE32
+in DOS assemblers.
+.PP
+.I EXTERN symbol
+and
+.I GLOBAL symbol
+import and export symbol definitions, respectively, from and to
+other modules. Note that the
+.I GLOBAL
+directive must appear before the definition of the symbol it refers
+to.
+.PP
+.I STRUC strucname
+and
+.IR ENDSTRUC ,
+when used to bracket a number of
+.IR RESB ,
+.I RESW
+or similar instructions, define a data structure. In addition to
+defining the offsets of the structure members, the construct also
+defines a symbol for the size of the structure, which is simply the
+structure name with
+.I _size
+tacked on to the end.
+.SS FORMAT-SPECIFIC DIRECTIVES
+.I ORG address
+is used by the
+.I bin
+flat-form binary output format, and specifies the address at which
+the output code will eventually be loaded.
+.PP
+.I GROUP grpname seg1 seg2...
+is used by the
+.I obj
+(Microsoft 16-bit) output format, and defines segment groups. This
+format also uses
+.IR UPPERCASE ,
+which directs that all segment, group and symbol names output to the
+object file should be in uppercase. Note that the actual assembly is
+still case sensitive.
+.PP
+.I LIBRARY libname
+is used by the
+.I rdf
+output format, and causes a dependency record to be written to the
+output file which indicates that the program requires a certain
+library in order to run.
+.SS MACRO PREPROCESSOR
+Single-line macros are defined using the
+.I %define
+or
+.I %idefine
+commands, in a similar fashion to the C preprocessor. They can be
+overloaded with respect to number of parameters, although defining a
+macro with no parameters prevents the definition of any macro with
+the same name taking parameters, and vice versa.
+.I %define
+defines macros whose names match case-sensitively, whereas
+.I %idefine
+defines case-insensitive macros.
+.PP
+Multi-line macros are defined using
+.I %macro
+and
+.I %imacro
+(the distinction is the same as that between
+.I %define
+and
+.IR %idefine ),
+whose syntax is as follows:
+.PP
+.ti +6n
+%macro
+.I name
+.IR minprm [- maxprm "][+][.nolist] [" defaults ]
+.br
+.ti +15n
+<some lines of macro expansion text>
+.br
+.ti +6n
+%endmacro
+.PP
+Again, these macros may be overloaded. The trailing plus sign
+indicates that any parameters after the last one get subsumed, with
+their separating commas, into the last parameter. The
+.I defaults
+part can be used to specify defaults for unspecified macro
+parameters after
+.IR minparam .
+.I %endm
+is a valid synonym for
+.IR %endmacro .
+.PP
+To refer to the macro parameters within a macro expansion, you use
+.IR %1 ,
+.I %2
+and so on. You can also enforce that a macro parameter should
+contain a condition code by using
+.IR %+1 ,
+and you can invert the condition code by using
+.IR %-1 .
+You can also define a label specific to a macro invocation by
+prefixing it with a double % sign.
+.PP
+Files can be included using the
+.I %include
+directive, which works like C.
+.PP
+The preprocessor has a `context stack', which may be used by one
+macro to store information that a later one will retrieve. You can
+push a context on the stack using
+.IR %push ,
+remove one using
+.IR %pop ,
+and change the name of the top context (without disturbing any
+associated definitions) using
+.IR %repl .
+Labels and
+.I %define
+macros specific to the top context may be defined by prefixing their
+names with %$, and things specific to the next context down with
+%$$, and so on.
+.PP
+Conditional assembly is done by means of
+.IR %ifdef ,
+.IR %ifndef ,
+.I %else
+and
+.I %endif
+as in C. (Except that
+.I %ifdef
+can accept several putative macro names, and will evaluate TRUE if
+any of them is defined.) In addition, the directives
+.I %ifctx
+and
+.I %ifnctx
+can be used to condition on the name of the top context on the
+context stack. The obvious set of `else-if' directives,
+.IR %elifdef ,
+.IR %elifndef ,
+.IR %elifctx
+and
+.IR %elifnctx
+are also supported.
+.SH BUGS
+There is a reported seg-fault on some (Linux) systems with some
+large source files. This appears to be very hard to reproduce. All
+other
+.I known
+bugs have been fixed...
+.SH RESTRICTIONS
+There is no support for listing files, symbol maps, or debugging
+object-file records. The advanced features of the ELF and Win32
+object file formats are not supported, and there is no means for
+warning the programmer against using an instruction beyond the
+capability of the target processor.
+.SH SEE ALSO
+.BR as "(" 1 "),"
+.BR ld "(" 1 ")."
diff --git a/i386/nasm/nasm.c b/i386/nasm/nasm.c
new file mode 100644 (file)
index 0000000..5c1e742
--- /dev/null
@@ -0,0 +1,1130 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
+ * Reserved.  This file contains Original Code and/or Modifications of
+ * Original Code as defined in and that are subject to the Apple Public
+ * Source License Version 1.1 (the "License").  You may not use this file
+ * except in compliance with the License.  Please obtain a copy of the
+ * License at http://www.apple.com/publicsource and read it before using
+ * this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/* The Netwide Assembler main program module
+ *
+ * The Netwide Assembler is copyright (C) 1996 Simon Tatham and
+ * Julian Hall. All rights reserved. The software is
+ * redistributable under the licence given in the file "Licence"
+ * distributed in the NASM archive.
+ */
+
+#include <stdio.h>
+#include <stdarg.h>
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+
+#include "nasm.h"
+#include "nasmlib.h"
+#include "preproc.h"
+#include "parser.h"
+#include "eval.h"
+#include "assemble.h"
+#include "labels.h"
+#include "outform.h"
+#include "listing.h"
+
+static void report_error (int, char *, ...);
+static void parse_cmdline (int, char **);
+static void assemble_file (char *);
+static int getkw (char *buf, char **value);
+static void register_output_formats(void);
+static void usage(void);
+
+static char *obuf;
+static char inname[FILENAME_MAX];
+static char outname[FILENAME_MAX];
+static char listname[FILENAME_MAX];
+static int lineno;                    /* for error reporting */
+static int lineinc;                   /* set by [LINE] or [ONELINE] */
+static int globallineno;              /* for forward-reference tracking */
+static int pass;
+static struct ofmt *ofmt = NULL;
+
+static FILE *ofile = NULL;
+static int sb = 16;                   /* by default */
+
+static int use_stdout = FALSE;        /* by default, errors to stderr */
+
+static long current_seg, abs_seg;
+static struct RAA *offsets;
+static long abs_offset;
+
+static struct SAA *forwrefs;          /* keep track of forward references */
+static int forwline;
+
+static Preproc *preproc;
+static int preprocess_only;
+
+/* used by error function to report location */
+static char currentfile[FILENAME_MAX];
+
+/*
+ * Which of the suppressible warnings are suppressed. Entry zero
+ * doesn't do anything. Initial defaults are given here.
+ */
+static char suppressed[1+ERR_WARN_MAX] = {
+    0, FALSE, TRUE, FALSE
+};
+
+/*
+ * The option names for the suppressible warnings. As before, entry
+ * zero does nothing.
+ */
+static char *suppressed_names[1+ERR_WARN_MAX] = {
+    NULL, "macro-params", "orphan-labels", "number-overflow"
+};
+
+/*
+ * The explanations for the suppressible warnings. As before, entry
+ * zero does nothing.
+ */
+static char *suppressed_what[1+ERR_WARN_MAX] = {
+    NULL, "macro calls with wrong no. of params",
+    "labels alone on lines without trailing `:'",
+    "numeric constants greater than 0xFFFFFFFF"
+};
+
+/*
+ * This is a null preprocessor which just copies lines from input
+ * to output. It's used when someone explicitly requests that NASM
+ * not preprocess their source file.
+ */
+
+static void no_pp_reset (char *, int, efunc, evalfunc, ListGen *);
+static char *no_pp_getline (void);
+static void no_pp_cleanup (void);
+static Preproc no_pp = {
+    no_pp_reset,
+    no_pp_getline,
+    no_pp_cleanup
+};
+
+/*
+ * get/set current offset...
+ */
+#define get_curr_ofs (current_seg==NO_SEG?abs_offset:\
+                     raa_read(offsets,current_seg))
+#define set_curr_ofs(x) (current_seg==NO_SEG?(void)(abs_offset=(x)):\
+                        (void)(offsets=raa_write(offsets,current_seg,(x))))
+
+static int want_usage;
+static int terminate_after_phase;
+
+int main(int argc, char **argv) {
+    want_usage = terminate_after_phase = FALSE;
+
+    nasm_set_malloc_error (report_error);
+    offsets = raa_init();
+    forwrefs = saa_init ((long)sizeof(int));
+
+    preproc = &nasmpp;
+    preprocess_only = FALSE;
+
+    seg_init();
+
+    register_output_formats();
+
+    parse_cmdline(argc, argv);
+
+    if (terminate_after_phase) {
+       if (want_usage)
+           usage();
+       return 1;
+    }
+
+    if (ofmt->stdmac)
+       pp_extra_stdmac (ofmt->stdmac);
+    eval_global_info (ofmt, lookup_label);
+
+    if (preprocess_only) {
+       char *line;
+
+       if (*outname) {
+           ofile = fopen(outname, "w");
+           if (!ofile)
+               report_error (ERR_FATAL | ERR_NOFILE,
+                             "unable to open output file `%s'", outname);
+       } else
+           ofile = NULL;
+
+       eval_info ("%", 0L, 0L);       /* disallow labels, $ or $$ in exprs */
+
+       preproc->reset (inname, 2, report_error, evaluate, &nasmlist);
+       strcpy(currentfile,inname);
+       lineno = 0;
+       lineinc = 1;
+       while ( (line = preproc->getline()) ) {
+           int ln, li;
+           char buf[FILENAME_MAX];
+
+           lineno += lineinc;
+           /*
+            * We must still check for %line directives, so that we
+            * can report errors accurately.
+            */
+           if (!strncmp(line, "%line", 5) &&
+               sscanf(line, "%%line %d+%d %s", &ln, &li, buf) == 3) {
+               lineno = ln - li;
+               lineinc = li;
+               strncpy (currentfile, buf, FILENAME_MAX-1);
+               currentfile[FILENAME_MAX-1] = '\0';
+           }
+           if (ofile) {
+               fputs(line, ofile);
+               fputc('\n', ofile);
+           } else
+               puts(line);
+           nasm_free (line);
+       }
+       preproc->cleanup();
+       if (ofile)
+           fclose(ofile);
+       if (ofile && terminate_after_phase)
+           remove(outname);
+    } else {
+       /*
+        * We must call ofmt->filename _anyway_, even if the user
+        * has specified their own output file, because some
+        * formats (eg OBJ and COFF) use ofmt->filename to find out
+        * the name of the input file and then put that inside the
+        * file.
+        */
+       ofmt->filename (inname, outname, report_error);
+
+       ofile = fopen(outname, "wb");
+       if (!ofile) {
+           report_error (ERR_FATAL | ERR_NOFILE,
+                         "unable to open output file `%s'", outname);
+       }
+       /*
+        * We must call init_labels() before ofmt->init() since
+        * some object formats will want to define labels in their
+        * init routines. (eg OS/2 defines the FLAT group)
+        */
+       init_labels ();
+       ofmt->init (ofile, report_error, define_label, evaluate);
+       assemble_file (inname);
+       if (!terminate_after_phase) {
+           ofmt->cleanup ();
+           cleanup_labels ();
+       }
+       /*
+        * We had an fclose on the output file here, but we
+        * actually do that in all the object file drivers as well,
+        * so we're leaving out the one here.
+        *     fclose (ofile);
+        */
+       if (terminate_after_phase) {
+           remove(outname);
+           if (listname[0])
+               remove(listname);
+       }
+    }
+
+    if (want_usage)
+       usage();
+    raa_free (offsets);
+    saa_free (forwrefs);
+
+    if (terminate_after_phase)
+       return 1;
+    else
+       return 0;
+}
+
+static int process_arg (char *p, char *q) {
+    char *param;
+    int i;
+    int advance = 0;
+
+    if (!p || !p[0])
+       return 0;
+
+    if (p[0]=='-') {
+       switch (p[1]) {
+         case 's':
+           use_stdout = TRUE;
+           break;
+         case 'o':                    /* these parameters take values */
+         case 'f':
+         case 'p':
+         case 'd':
+         case 'i':
+         case 'l':
+           if (p[2])                  /* the parameter's in the option */
+               param = p+2;
+           else if (!q) {
+               report_error (ERR_NONFATAL | ERR_NOFILE | ERR_USAGE,
+                             "option `-%c' requires an argument",
+                             p[1]);
+               break;
+           } else
+               advance = 1, param = q;
+           if (p[1]=='o') {           /* output file */
+               strcpy (outname, param);
+           } else if (p[1]=='f') {    /* output format */
+               ofmt = ofmt_find(param);
+               if (!ofmt) {
+                   report_error (ERR_FATAL | ERR_NOFILE | ERR_USAGE,
+                                 "unrecognised output format `%s'",
+                                 param);
+               }
+           } else if (p[1]=='p') {    /* pre-include */
+               pp_pre_include (param);
+           } else if (p[1]=='d') {    /* pre-define */
+               pp_pre_define (param);
+           } else if (p[1]=='i') {    /* include search path */
+               pp_include_path (param);
+           } else if (p[1]=='l') {    /* listing file */
+               strcpy (listname, param);
+           }
+           break;
+         case 'h':
+           fprintf(use_stdout ? stdout : stderr,
+                   "usage: nasm [-o outfile] [-f format] [-l listfile]"
+                   " [options...] filename\n");
+           fprintf(use_stdout ? stdout : stderr,
+                   "    or nasm -r   for version info\n\n");
+           fprintf(use_stdout ? stdout : stderr,
+                   "    -e means preprocess only; "
+                   "-a means don't preprocess\n");
+           fprintf(use_stdout ? stdout : stderr,
+                   "    -s means send errors to stdout not stderr\n");
+           fprintf(use_stdout ? stdout : stderr,
+                   "    -i<path> adds a pathname to the include file"
+                   " path\n    -p<file> pre-includes a file;"
+                   " -d<macro>[=<value] pre-defines a macro\n");
+           fprintf(use_stdout ? stdout : stderr,
+                   "    -w+foo enables warnings about foo; "
+                   "-w-foo disables them\n  where foo can be:\n");
+           for (i=1; i<=ERR_WARN_MAX; i++)
+               fprintf(use_stdout ? stdout : stderr,
+                       "    %-16s%s (default %s)\n",
+                       suppressed_names[i], suppressed_what[i],
+                       suppressed[i] ? "off" : "on");
+           fprintf(use_stdout ? stdout : stderr,
+                   "\nvalid output formats for -f are"
+                   " (`*' denotes default):\n");
+           ofmt_list(ofmt, use_stdout ? stdout : stderr);
+           exit (0);                  /* never need usage message here */
+           break;
+         case 'r':
+           fprintf(use_stdout ? stdout : stderr,
+                   "NASM version %s\n", NASM_VER);
+           exit (0);                  /* never need usage message here */
+           break;
+         case 'e':                    /* preprocess only */
+           preprocess_only = TRUE;
+           break;
+         case 'a':                    /* assemble only - don't preprocess */
+           preproc = &no_pp;
+           break;
+         case 'w':
+           if (p[2] != '+' && p[2] != '-') {
+               report_error (ERR_NONFATAL | ERR_NOFILE | ERR_USAGE,
+                             "invalid option to `-w'");
+           } else {
+               for (i=1; i<=ERR_WARN_MAX; i++)
+                   if (!nasm_stricmp(p+3, suppressed_names[i]))
+                       break;
+               if (i <= ERR_WARN_MAX)
+                   suppressed[i] = (p[2] == '-');
+               else
+                   report_error (ERR_NONFATAL | ERR_NOFILE | ERR_USAGE,
+                                 "invalid option to `-w'");
+           }
+           break;
+         default:
+           report_error (ERR_NONFATAL | ERR_NOFILE | ERR_USAGE,
+                         "unrecognised option `-%c'",
+                         p[1]);
+           break;
+       }
+    } else {
+       if (*inname) {
+           report_error (ERR_NONFATAL | ERR_NOFILE | ERR_USAGE,
+                         "more than one input file specified");
+       } else
+           strcpy(inname, p);
+    }
+
+    return advance;
+}
+
+static void parse_cmdline(int argc, char **argv) {
+    char *envreal, *envcopy, *p, *q, *arg, *prevarg;
+    char separator = ' ';
+
+    *inname = *outname = *listname = '\0';
+
+    /*
+     * First, process the NASM environment variable.
+     */
+    envreal = getenv("NASM");
+    arg = NULL;
+    if (envreal) {
+       envcopy = nasm_strdup(envreal);
+       p = envcopy;
+       if (*p && *p != '-')
+           separator = *p++;
+       while (*p) {
+           q = p;
+           while (*p && *p != separator) p++;
+           while (*p == separator) *p++ = '\0';
+           prevarg = arg;
+           arg = q;
+           if (process_arg (prevarg, arg))
+               arg = NULL;
+       }
+       nasm_free (envcopy);
+    }
+    if (arg)
+       process_arg (arg, NULL);
+
+    /*
+     * Now process the actual command line.
+     */
+    while (--argc) {
+       int i;
+       argv++;
+       i = process_arg (argv[0], argc > 1 ? argv[1] : NULL);
+       argv += i, argc -= i;
+    }
+
+    if (!*inname)
+       report_error (ERR_NONFATAL | ERR_NOFILE | ERR_USAGE,
+                     "no input file specified");
+}
+
+static void assemble_file (char *fname) {
+    char *value, *p, *q, *special, *line;
+    insn output_ins;
+    int i, rn_error, validid;
+    long seg, offs;
+    struct tokenval tokval;
+    expr *e;
+
+    /* pass one */
+    pass = 1;
+    current_seg = ofmt->section(NULL, pass, &sb);
+    preproc->reset(fname, 1, report_error, evaluate, &nasmlist);
+    strcpy(currentfile,fname);
+    lineno = 0;
+    lineinc = 1;
+    globallineno = 0;
+    offs = get_curr_ofs;
+    eval_info (NULL, current_seg, offs);   /* set $ */
+    while ( (line = preproc->getline()) ) {
+       lineno += lineinc;
+       globallineno++;
+
+       if (line[0] == '%') {
+           int ln, li;
+           char buf[FILENAME_MAX];
+
+           /*
+            * This will be a line number directive. They come
+            * straight from the preprocessor, so we'll subject
+            * them to only minimal error checking.
+            */
+           if (strncmp(line, "%line", 5)) {
+               if (preproc == &no_pp)
+                   report_error (ERR_WARNING, "unknown `%%' directive in "
+                                 " preprocessed source");
+           } else if (sscanf(line, "%%line %d+%d %s", &ln, &li, buf) != 3) {
+               report_error (ERR_WARNING, "bogus line number directive in"
+                             " preprocessed source");
+           } else {
+               lineno = ln - li;
+               lineinc = li;
+               strncpy (currentfile, buf, FILENAME_MAX-1);
+               currentfile[FILENAME_MAX-1] = '\0';
+           }
+           continue;
+       }
+
+       /* here we parse our directives; this is not handled by the 'real'
+        * parser. */
+       if ( (i = getkw (line, &value)) ) {
+           switch (i) {
+             case 1:          /* [SEGMENT n] */
+               seg = ofmt->section (value, pass, &sb);
+               if (seg == NO_SEG) {
+                   report_error (ERR_NONFATAL,
+                                 "segment name `%s' not recognised",
+                                 value);
+               } else {
+                   current_seg = seg;
+               }
+               break;
+             case 2:          /* [EXTERN label:special] */
+               if (*value == '$')
+                   value++;           /* skip initial $ if present */
+               q = value;
+               validid = TRUE;
+               if (!isidstart(*q))
+                   validid = FALSE;
+               while (*q && *q != ':') {
+                   if (!isidchar(*q))
+                       validid = FALSE;
+                   q++;
+               }
+               if (!validid) {
+                   report_error (ERR_NONFATAL,
+                                 "identifier expected after EXTERN");
+                   break;
+               }
+               if (*q == ':') {
+                   *q++ = '\0';
+                   special = q;
+               } else
+                   special = NULL;
+               if (!is_extern(value)) {   /* allow re-EXTERN to be ignored */
+                   declare_as_global (value, special, report_error);
+                   define_label (value, seg_alloc(), 0L, NULL, FALSE, TRUE,
+                                 ofmt, report_error);
+               }
+               break;
+             case 3:          /* [BITS bits] */
+               switch (atoi(value)) {
+                 case 16:
+                 case 32:
+                   sb = atoi(value);
+                   break;
+                 default:
+                   report_error(ERR_NONFATAL,
+                                "`%s' is not a valid argument to [BITS]",
+                                value);
+                   break;
+               }
+               break;
+             case 4:          /* [GLOBAL symbol:special] */
+               if (*value == '$')
+                   value++;           /* skip initial $ if present */
+               q = value;
+               validid = TRUE;
+               if (!isidstart(*q))
+                   validid = FALSE;
+               while (*q && *q != ':') {
+                   if (!isidchar(*q))
+                       validid = FALSE;
+                   q++;
+               }
+               if (!validid) {
+                   report_error (ERR_NONFATAL,
+                                 "identifier expected after GLOBAL");
+                   break;
+               }
+               if (*q == ':') {
+                   *q++ = '\0';
+                   special = q;
+               } else
+                   special = NULL;
+               declare_as_global (value, special, report_error);
+               break;
+             case 5:          /* [COMMON symbol size:special] */
+               p = value;
+               validid = TRUE;
+               if (!isidstart(*p))
+                   validid = FALSE;
+               while (*p && !isspace(*p)) {
+                   if (!isidchar(*p))
+                       validid = FALSE;
+                   p++;
+               }
+               if (!validid) {
+                   report_error (ERR_NONFATAL,
+                                 "identifier expected after COMMON");
+                   break;
+               }
+               if (*p) {
+                   long size;
+
+                   while (*p && isspace(*p))
+                       *p++ = '\0';
+                   q = p;
+                   while (*q && *q != ':')
+                       q++;
+                   if (*q == ':') {
+                       *q++ = '\0';
+                       special = q;
+                   } else
+                       special = NULL;
+                   size = readnum (p, &rn_error);
+                   if (rn_error)
+                       report_error (ERR_NONFATAL, "invalid size specified"
+                                     " in COMMON declaration");
+                   else
+                       define_common (value, seg_alloc(), size,
+                                      special, ofmt, report_error);
+               } else
+                   report_error (ERR_NONFATAL, "no size specified in"
+                                 " COMMON declaration");
+               break;
+             case 6:                  /* [ABSOLUTE address] */
+               current_seg = NO_SEG;
+               stdscan_reset();
+               stdscan_bufptr = value;
+               tokval.t_type = TOKEN_INVALID;
+               e = evaluate(stdscan, NULL, &tokval, NULL, 1, report_error,
+                            NULL);
+               if (e) {
+                   if (!is_reloc(e))
+                       report_error (ERR_NONFATAL, "cannot use non-"
+                                     "relocatable expression as ABSOLUTE"
+                                     " address");
+                   else {
+                       abs_seg = reloc_seg(e);
+                       abs_offset = reloc_value(e);
+                   }
+               } else
+                   abs_offset = 0x100;/* don't go near zero in case of / */
+               break;
+             default:
+               if (!ofmt->directive (line+1, value, 1))
+                   report_error (ERR_NONFATAL, "unrecognised directive [%s]",
+                                 line+1);
+               break;
+           }
+       } else {
+           parse_line (1, line, &output_ins,
+                       report_error, evaluate, eval_info);
+           if (output_ins.forw_ref)
+               *(int *)saa_wstruct(forwrefs) = globallineno;
+
+           /*
+            * Hack to prevent phase error in the code
+            *   rol ax,x
+            *   x equ 1
+            *
+            * We rule that the presence of a forward reference
+            * cancels out the UNITY property of the number 1. This
+            * isn't _strictly_ necessary in pass one, since the
+            * problem occurs in pass two, but for the sake of
+            * having the passes as near to identical as we can
+            * manage, we do it like this.
+            */
+           if (output_ins.forw_ref) {
+               int i;
+               for (i=0; i<output_ins.operands; i++)
+                   output_ins.oprs[i].type &= ~ONENESS;
+           }
+
+           if (output_ins.opcode == I_EQU) {
+               /*
+                * Special `..' EQUs get processed in pass two,
+                * except `..@' macro-processor EQUs which are done
+                * in the normal place.
+                */
+               if (!output_ins.label)
+                   report_error (ERR_NONFATAL,
+                                 "EQU not preceded by label");
+               else if (output_ins.label[0] != '.' ||
+                        output_ins.label[1] != '.' ||
+                        output_ins.label[2] == '@') {
+                   if (output_ins.operands == 1 &&
+                       (output_ins.oprs[0].type & IMMEDIATE) &&
+                       output_ins.oprs[0].wrt == NO_SEG) {
+                       define_label (output_ins.label,
+                                     output_ins.oprs[0].segment,
+                                     output_ins.oprs[0].offset,
+                                     NULL, FALSE, FALSE, ofmt, report_error);
+                   } else if (output_ins.operands == 2 &&
+                              (output_ins.oprs[0].type & IMMEDIATE) &&
+                              (output_ins.oprs[0].type & COLON) &&
+                              output_ins.oprs[0].segment == NO_SEG &&
+                              output_ins.oprs[0].wrt == NO_SEG &&
+                              (output_ins.oprs[1].type & IMMEDIATE) &&
+                              output_ins.oprs[1].segment == NO_SEG &&
+                              output_ins.oprs[1].wrt == NO_SEG) {
+                       define_label (output_ins.label,
+                                     output_ins.oprs[0].offset | SEG_ABS,
+                                     output_ins.oprs[1].offset,
+                                     NULL, FALSE, FALSE, ofmt, report_error);
+                   } else
+                       report_error(ERR_NONFATAL, "bad syntax for EQU");
+               }
+           } else {
+               if (output_ins.label)
+                   define_label (output_ins.label,
+                                 current_seg==NO_SEG ? abs_seg : current_seg,
+                                 offs, NULL, TRUE, FALSE, ofmt, report_error);
+               offs += insn_size (current_seg, offs, sb,
+                                  &output_ins, report_error);
+               set_curr_ofs (offs);
+           }
+           cleanup_insn (&output_ins);
+       }
+       nasm_free (line);
+       offs = get_curr_ofs;
+       eval_info (NULL, current_seg, offs);   /* set $ */
+    }
+    preproc->cleanup();
+
+    if (terminate_after_phase) {
+       fclose(ofile);
+       remove(outname);
+       if (want_usage)
+           usage();
+       exit (1);
+    }
+
+    /* pass two */
+    pass = 2;
+    saa_rewind (forwrefs);
+    if (*listname)
+       nasmlist.init(listname, report_error);
+    {
+       int *p = saa_rstruct (forwrefs);
+       if (p)
+           forwline = *p;
+       else
+           forwline = -1;
+    }
+    current_seg = ofmt->section(NULL, pass, &sb);
+    raa_free (offsets);
+    offsets = raa_init();
+    preproc->reset(fname, 2, report_error, evaluate, &nasmlist);
+    strcpy(currentfile,fname);
+    lineno = 0;
+    lineinc = 1;
+    globallineno = 0;
+    offs = get_curr_ofs;
+    eval_info (NULL, current_seg, offs);   /* set $ */
+    while ( (line = preproc->getline()) ) {
+       lineno += lineinc;
+       globallineno++;
+
+       if (line[0] == '%') {
+           int ln, li;
+           char buf[FILENAME_MAX];
+
+           /*
+            * This will be a line number directive. They come
+            * straight from the preprocessor, so we'll subject
+            * them to only minimal error checking.
+            */
+           if (!strncmp(line, "%line", 5) &&
+               sscanf(line, "%%line %d+%d %s", &ln, &li, buf) == 3) {
+               lineno = ln - li;
+               lineinc = li;
+               strncpy (currentfile, buf, FILENAME_MAX-1);
+               currentfile[FILENAME_MAX-1] = '\0';
+           }
+           continue;
+       }
+
+       /* here we parse our directives; this is not handled by
+        * the 'real' parser. */
+       if ( (i = getkw (line, &value)) ) {
+           switch (i) {
+             case 1:          /* [SEGMENT n] */
+               seg = ofmt->section (value, pass, &sb);
+               if (seg == NO_SEG) {
+                   report_error (ERR_PANIC,
+                                 "invalid segment name on pass two");
+               } else
+                   current_seg = seg;
+               break;
+             case 2:          /* [EXTERN label] */
+               q = value;
+               while (*q && *q != ':')
+                   q++;
+               if (*q == ':') {
+                   *q++ = '\0';
+                   ofmt->symdef(value, 0L, 0L, 3, q);
+               }
+               break;
+             case 3:          /* [BITS bits] */
+               switch (atoi(value)) {
+                 case 16:
+                 case 32:
+                   sb = atoi(value);
+                   break;
+                 default:
+                   report_error(ERR_PANIC,
+                                "invalid [BITS] value on pass two",
+                                value);
+                   break;
+               }
+               break;
+             case 4:                  /* [GLOBAL symbol] */
+               q = value;
+               while (*q && *q != ':')
+                   q++;
+               if (*q == ':') {
+                   *q++ = '\0';
+                   ofmt->symdef(value, 0L, 0L, 3, q);
+               }
+               break;
+             case 5:                  /* [COMMON symbol size] */
+               q = value;
+               while (*q && *q != ':') {
+                   if (isspace(*q))
+                       *q = '\0';
+                   q++;
+               }
+               if (*q == ':') {
+                   *q++ = '\0';
+                   ofmt->symdef(value, 0L, 0L, 3, q);
+               }
+               break;
+             case 6:                  /* [ABSOLUTE addr] */
+               current_seg = NO_SEG;
+               stdscan_reset();
+               stdscan_bufptr = value;
+               tokval.t_type = TOKEN_INVALID;
+               e = evaluate(stdscan, NULL, &tokval, NULL, 2, report_error,
+                            NULL);
+               if (e) {
+                   if (!is_reloc(e))
+                       report_error (ERR_PANIC, "non-reloc ABSOLUTE address"
+                                     " in pass two");
+                   else {
+                       abs_seg = reloc_seg(e);
+                       abs_offset = reloc_value(e);
+                   }
+               } else
+                   report_error (ERR_PANIC, "invalid ABSOLUTE address "
+                                 "in pass two");
+               break;
+             default:
+               if (!ofmt->directive (line+1, value, 2))
+                   report_error (ERR_PANIC, "invalid directive on pass two");
+               break;
+           }
+       } else {
+           parse_line (2, line, &output_ins,
+                       report_error, evaluate, eval_info);
+           if (globallineno == forwline) {
+               int *p = saa_rstruct (forwrefs);
+               if (p)
+                   forwline = *p;
+               else
+                   forwline = -1;
+               output_ins.forw_ref = TRUE;
+           } else
+               output_ins.forw_ref = FALSE;
+
+           /*
+            * Hack to prevent phase error in the code
+            *   rol ax,x
+            *   x equ 1
+            */
+           if (output_ins.forw_ref) {
+               int i;
+               for (i=0; i<output_ins.operands; i++)
+                   output_ins.oprs[i].type &= ~ONENESS;
+           }
+
+           obuf = line;
+           if (output_ins.label)
+               define_label_stub (output_ins.label, report_error);
+           if (output_ins.opcode == I_EQU) {
+               /*
+                * Special `..' EQUs get processed here, except
+                * `..@' macro processor EQUs which are done above.
+                */
+               if (output_ins.label[0] == '.' &&
+                   output_ins.label[1] == '.' &&
+                   output_ins.label[2] != '@') {
+                   if (output_ins.operands == 1 &&
+                       (output_ins.oprs[0].type & IMMEDIATE)) {
+                       define_label (output_ins.label,
+                                     output_ins.oprs[0].segment,
+                                     output_ins.oprs[0].offset,
+                                     NULL, FALSE, FALSE, ofmt, report_error);
+                   } else if (output_ins.operands == 2 &&
+                              (output_ins.oprs[0].type & IMMEDIATE) &&
+                              (output_ins.oprs[0].type & COLON) &&
+                              output_ins.oprs[0].segment == NO_SEG &&
+                              (output_ins.oprs[1].type & IMMEDIATE) &&
+                              output_ins.oprs[1].segment == NO_SEG) {
+                       define_label (output_ins.label,
+                                     output_ins.oprs[0].offset | SEG_ABS,
+                                     output_ins.oprs[1].offset,
+                                     NULL, FALSE, FALSE, ofmt, report_error);
+                   } else
+                       report_error(ERR_NONFATAL, "bad syntax for EQU");
+               }
+           }
+           offs += assemble (current_seg, offs, sb,
+                             &output_ins, ofmt, report_error, &nasmlist);
+           cleanup_insn (&output_ins);
+           set_curr_ofs (offs);
+       }
+       nasm_free (line);
+
+       offs = get_curr_ofs;
+       eval_info (NULL, current_seg, offs);   /* set $ */
+    }
+    preproc->cleanup();
+    nasmlist.cleanup();
+}
+
+static int getkw (char *buf, char **value) {
+    char *p, *q;
+
+    if (*buf!='[')
+       return 0;
+    p = buf;
+    while (*p && *p != ']') p++;
+    if (!*p)
+       return 0;
+    q = p++;
+    while (*p && *p != ';') {
+       if (!isspace(*p))
+           return 0;
+       p++;
+    }
+    q[1] = '\0';
+
+    p = buf+1;
+    while (*buf && *buf!=' ' && *buf!=']' && *buf!='\t')
+       buf++;
+    if (*buf==']') {
+       *buf = '\0';
+       *value = buf;
+    } else {
+       *buf++ = '\0';
+        while (isspace(*buf)) buf++;   /* beppu - skip leading whitespace */
+       *value = buf;
+       while (*buf!=']') buf++;
+       *buf++ = '\0';
+    }
+    for (q=p; *q; q++)
+       *q = tolower(*q);
+    if (!strcmp(p, "segment") || !strcmp(p, "section"))
+       return 1;
+    if (!strcmp(p, "extern"))
+       return 2;
+    if (!strcmp(p, "bits"))
+       return 3;
+    if (!strcmp(p, "global"))
+       return 4;
+    if (!strcmp(p, "common"))
+       return 5;
+    if (!strcmp(p, "absolute"))
+       return 6;
+    return -1;
+}
+
+static void report_error (int severity, char *fmt, ...) {
+    va_list ap;
+
+    /*
+     * See if it's a suppressed warning.
+     */
+    if ((severity & ERR_MASK) == ERR_WARNING &&
+       (severity & ERR_WARN_MASK) != 0 &&
+       suppressed[ (severity & ERR_WARN_MASK) >> ERR_WARN_SHR ])
+       return;                        /* and bail out if so */
+
+    /*
+     * See if it's a pass-one only warning and we're not in pass one.
+     */
+    if ((severity & ERR_PASS1) && pass != 1)
+       return;
+
+    if (severity & ERR_NOFILE)
+       fputs ("nasm: ", use_stdout ? stdout : stderr);
+    else
+       fprintf (use_stdout ? stdout : stderr, "%s:%d: ", currentfile,
+                lineno + (severity & ERR_OFFBY1 ? lineinc : 0));
+
+    if ( (severity & ERR_MASK) == ERR_WARNING)
+       fputs ("warning: ", use_stdout ? stdout : stderr);
+    else if ( (severity & ERR_MASK) == ERR_PANIC)
+       fputs ("panic: ", use_stdout ? stdout : stderr);
+
+    va_start (ap, fmt);
+    vfprintf (use_stdout ? stdout : stderr, fmt, ap);
+    fputc ('\n', use_stdout ? stdout : stderr);
+
+    if (severity & ERR_USAGE)
+       want_usage = TRUE;
+
+    switch (severity & ERR_MASK) {
+      case ERR_WARNING:
+       /* no further action, by definition */
+       break;
+      case ERR_NONFATAL:
+       terminate_after_phase = TRUE;
+       break;
+      case ERR_FATAL:
+       if (ofile) {
+           fclose(ofile);
+           remove(outname);
+       }
+       if (want_usage)
+           usage();
+       exit(1);                       /* instantly die */
+       break;                         /* placate silly compilers */
+      case ERR_PANIC:
+       abort();                       /* halt, catch fire, and dump core */
+       break;
+    }
+}
+
+static void usage(void) {
+    fputs("type `nasm -h' for help\n", use_stdout ? stdout : stderr);
+}
+
+static void register_output_formats(void) {
+    /* Flat-form binary format */
+#ifdef OF_BIN
+    extern struct ofmt of_bin;
+#endif
+    /* Unix formats: a.out, COFF, ELF */
+#ifdef OF_AOUT
+    extern struct ofmt of_aout;
+#endif
+#ifdef OF_AOUTB
+    extern struct ofmt of_aoutb;
+#endif
+#ifdef OF_COFF
+    extern struct ofmt of_coff;
+#endif
+#ifdef OF_ELF
+    extern struct ofmt of_elf;
+#endif
+    /* Linux strange format: as86 */
+#ifdef OF_AS86
+    extern struct ofmt of_as86;
+#endif
+    /* DOS and DOS-ish formats: OBJ, OS/2, Win32 */
+#ifdef OF_OBJ
+    extern struct ofmt of_obj;
+#endif
+#ifdef OF_WIN32
+    extern struct ofmt of_win32;
+#endif
+#ifdef OF_RDF
+    extern struct ofmt of_rdf;
+#endif
+#ifdef OF_DBG     /* debug format must be included specifically */
+    extern struct ofmt of_dbg;
+#endif
+
+#ifdef OF_BIN
+    ofmt_register (&of_bin);
+#endif
+#ifdef OF_AOUT
+    ofmt_register (&of_aout);
+#endif
+#ifdef OF_AOUTB
+    ofmt_register (&of_aoutb);
+#endif
+#ifdef OF_COFF
+    ofmt_register (&of_coff);
+#endif
+#ifdef OF_ELF
+    ofmt_register (&of_elf);
+#endif
+#ifdef OF_AS86
+    ofmt_register (&of_as86);
+#endif
+#ifdef OF_OBJ
+    ofmt_register (&of_obj);
+#endif
+#ifdef OF_WIN32
+    ofmt_register (&of_win32);
+#endif
+#ifdef OF_RDF
+    ofmt_register (&of_rdf);
+#endif
+#ifdef OF_DBG
+    ofmt_register (&of_dbg);
+#endif
+    /*
+     * set the default format
+     */
+    ofmt = &OF_DEFAULT;
+}
+
+#define BUF_DELTA 512
+
+static FILE *no_pp_fp;
+static efunc no_pp_err;
+static ListGen *no_pp_list;
+
+static void no_pp_reset (char *file, int pass, efunc error, evalfunc eval,
+                        ListGen *listgen) {
+    no_pp_err = error;
+    no_pp_fp = fopen(file, "r");
+    if (!no_pp_fp)
+       no_pp_err (ERR_FATAL | ERR_NOFILE,
+                  "unable to open input file `%s'", file);
+    no_pp_list = listgen;
+    (void) pass;                      /* placate compilers */
+    (void) eval;                      /* placate compilers */
+}
+
+static char *no_pp_getline (void) {
+    char *buffer, *p, *q;
+    int bufsize;
+
+    bufsize = BUF_DELTA;
+    buffer = nasm_malloc(BUF_DELTA);
+    p = buffer;
+    while (1) {
+       q = fgets(p, bufsize-(p-buffer), no_pp_fp);
+       if (!q)
+           break;
+       p += strlen(p);
+       if (p > buffer && p[-1] == '\n')
+           break;
+       if (p-buffer > bufsize-10) {
+           bufsize += BUF_DELTA;
+           buffer = nasm_realloc(buffer, bufsize);
+       }
+    }
+
+    if (!q && p == buffer) {
+       nasm_free (buffer);
+       return NULL;
+    }
+
+    /*
+     * Play safe: remove CRs as well as LFs, if any of either are
+     * present at the end of the line.
+     */
+    while (p > buffer && (p[-1] == '\n' || p[-1] == '\r'))
+       *--p = '\0';
+
+    /*
+     * Handle spurious ^Z, which may be inserted into source files
+     * by some file transfer utilities.
+     */
+    buffer[strcspn(buffer, "\032")] = '\0';
+
+    no_pp_list->line (LIST_READ, buffer);
+
+    return buffer;
+}
+
+static void no_pp_cleanup (void) {
+    fclose(no_pp_fp);
+}
diff --git a/i386/nasm/nasm.h b/i386/nasm/nasm.h
new file mode 100644 (file)
index 0000000..262a2df
--- /dev/null
@@ -0,0 +1,773 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
+ * Reserved.  This file contains Original Code and/or Modifications of
+ * Original Code as defined in and that are subject to the Apple Public
+ * Source License Version 1.1 (the "License").  You may not use this file
+ * except in compliance with the License.  Please obtain a copy of the
+ * License at http://www.apple.com/publicsource and read it before using
+ * this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/* nasm.h   main header file for the Netwide Assembler: inter-module interface
+ *
+ * The Netwide Assembler is copyright (C) 1996 Simon Tatham and
+ * Julian Hall. All rights reserved. The software is
+ * redistributable under the licence given in the file "Licence"
+ * distributed in the NASM archive.
+ *
+ * initial version: 27/iii/95 by Simon Tatham
+ */
+
+#ifndef NASM_NASM_H
+#define NASM_NASM_H
+
+#define NASM_MAJOR_VER 0
+#define NASM_MINOR_VER 97
+#define NASM_VER "0.97"
+
+#ifndef NULL
+#define NULL 0
+#endif
+
+#ifndef FALSE
+#define FALSE 0                               /* comes in handy */
+#endif
+#ifndef TRUE
+#define TRUE 1
+#endif
+
+#define NO_SEG -1L                    /* null segment value */
+#define SEG_ABS 0x40000000L           /* mask for far-absolute segments */
+
+#ifndef FILENAME_MAX
+#define FILENAME_MAX 256
+#endif
+
+/*
+ * Name pollution problems: <time.h> on Digital UNIX pulls in some
+ * strange hardware header file which sees fit to define R_SP. We
+ * undefine it here so as not to break the enum below.
+ */
+#ifdef R_SP
+#undef R_SP
+#endif
+
+/*
+ * We must declare the existence of this structure type up here,
+ * since we have to reference it before we define it...
+ */
+struct ofmt;
+
+/*
+ * -------------------------
+ * Error reporting functions
+ * -------------------------
+ */
+
+/*
+ * An error reporting function should look like this.
+ */
+typedef void (*efunc) (int severity, char *fmt, ...);
+
+/*
+ * These are the error severity codes which get passed as the first
+ * argument to an efunc.
+ */
+
+#define ERR_WARNING 0                 /* warn only: no further action */
+#define ERR_NONFATAL 1                /* terminate assembly after phase */
+#define ERR_FATAL 2                   /* instantly fatal: exit with error */
+#define ERR_PANIC 3                   /* internal error: panic instantly
+                                       * and dump core for reference */
+#define ERR_MASK 0x0F                 /* mask off the above codes */
+#define ERR_NOFILE 0x10                       /* don't give source file name/line */
+#define ERR_USAGE 0x20                /* print a usage message */
+#define ERR_OFFBY1 0x40                       /* report error as being on the line 
+                                       * we're just _about_ to read, not
+                                       * the one we've just read */
+#define ERR_PASS1 0x80                /* only print this error on pass one */
+
+/*
+ * These codes define specific types of suppressible warning.
+ */
+#define ERR_WARN_MNP  0x0100          /* macro-num-parameters warning */
+#define ERR_WARN_OL   0x0200          /* orphan label (no colon, and
+                                       * alone on line) */
+#define ERR_WARN_NOV  0x0300          /* numeric overflow */
+#define ERR_WARN_MASK 0xFF00          /* the mask for this feature */
+#define ERR_WARN_SHR  8                       /* how far to shift right */
+#define ERR_WARN_MAX  3                       /* the highest numbered one */
+
+/*
+ * -----------------------
+ * Other function typedefs
+ * -----------------------
+ */
+
+/*
+ * A label-lookup function should look like this.
+ */
+typedef int (*lfunc) (char *label, long *segment, long *offset);
+
+/*
+ * And a label-definition function like this. The boolean parameter
+ * `is_norm' states whether the label is a `normal' label (which
+ * should affect the local-label system), or something odder like
+ * an EQU or a segment-base symbol, which shouldn't.
+ */
+typedef void (*ldfunc) (char *label, long segment, long offset, char *special,
+                       int is_norm, int isextrn, struct ofmt *ofmt,
+                       efunc error);
+
+/*
+ * List-file generators should look like this:
+ */
+typedef struct {
+    /*
+     * Called to initialise the listing file generator. Before this
+     * is called, the other routines will silently do nothing when
+     * called. The `char *' parameter is the file name to write the
+     * listing to.
+     */
+    void (*init) (char *, efunc);
+
+    /*
+     * Called to clear stuff up and close the listing file.
+     */
+    void (*cleanup) (void);
+
+    /*
+     * Called to output binary data. Parameters are: the offset;
+     * the data; the data type. Data types are similar to the
+     * output-format interface, only OUT_ADDRESS will _always_ be
+     * displayed as if it's relocatable, so ensure that any non-
+     * relocatable address has been converted to OUT_RAWDATA by
+     * then. Note that OUT_RAWDATA+0 is a valid data type, and is a
+     * dummy call used to give the listing generator an offset to
+     * work with when doing things like uplevel(LIST_TIMES) or
+     * uplevel(LIST_INCBIN).
+     */
+    void (*output) (long, void *, unsigned long);
+
+    /*
+     * Called to send a text line to the listing generator. The
+     * `int' parameter is LIST_READ or LIST_MACRO depending on
+     * whether the line came directly from an input file or is the
+     * result of a multi-line macro expansion.
+     */
+    void (*line) (int, char *);
+
+    /*
+     * Called to change one of the various levelled mechanisms in
+     * the listing generator. LIST_INCLUDE and LIST_MACRO can be
+     * used to increase the nesting level of include files and
+     * macro expansions; LIST_TIMES and LIST_INCBIN switch on the
+     * two binary-output-suppression mechanisms for large-scale
+     * pseudo-instructions.
+     *
+     * LIST_MACRO_NOLIST is synonymous with LIST_MACRO except that
+     * it indicates the beginning of the expansion of a `nolist'
+     * macro, so anything under that level won't be expanded unless
+     * it includes another file.
+     */
+    void (*uplevel) (int);
+
+    /*
+     * Reverse the effects of uplevel.
+     */
+    void (*downlevel) (int);
+} ListGen;
+
+/*
+ * The expression evaluator must be passed a scanner function; a
+ * standard scanner is provided as part of nasmlib.c. The
+ * preprocessor will use a different one. Scanners, and the
+ * token-value structures they return, look like this.
+ *
+ * The return value from the scanner is always a copy of the
+ * `t_type' field in the structure.
+ */
+struct tokenval {
+    int t_type;
+    long t_integer, t_inttwo;
+    char *t_charptr;
+};
+typedef int (*scanner) (void *private_data, struct tokenval *tv);
+
+/*
+ * Token types returned by the scanner, in addition to ordinary
+ * ASCII character values, and zero for end-of-string.
+ */
+enum {                                /* token types, other than chars */
+    TOKEN_INVALID = -1,                       /* a placeholder value */
+    TOKEN_EOS = 0,                    /* end of string */
+    TOKEN_EQ = '=', TOKEN_GT = '>', TOKEN_LT = '<',   /* aliases */
+    TOKEN_ID = 256, TOKEN_NUM, TOKEN_REG, TOKEN_INSN,  /* major token types */
+    TOKEN_ERRNUM,                     /* numeric constant with error in */
+    TOKEN_HERE, TOKEN_BASE,           /* $ and $$ */
+    TOKEN_SPECIAL,                    /* BYTE, WORD, DWORD, FAR, NEAR, etc */
+    TOKEN_PREFIX,                     /* A32, O16, LOCK, REPNZ, TIMES, etc */
+    TOKEN_SHL, TOKEN_SHR,             /* << and >> */
+    TOKEN_SDIV, TOKEN_SMOD,           /* // and %% */
+    TOKEN_GE, TOKEN_LE, TOKEN_NE,      /* >=, <= and <> (!= is same as <>) */
+    TOKEN_DBL_AND, TOKEN_DBL_OR, TOKEN_DBL_XOR,   /* &&, || and ^^ */
+    TOKEN_SEG, TOKEN_WRT,             /* SEG and WRT */
+    TOKEN_FLOAT                               /* floating-point constant */
+};
+
+/*
+ * Expression-evaluator datatype. Expressions, within the
+ * evaluator, are stored as an array of these beasts, terminated by
+ * a record with type==0. Mostly, it's a vector type: each type
+ * denotes some kind of a component, and the value denotes the
+ * multiple of that component present in the expression. The
+ * exception is the WRT type, whose `value' field denotes the
+ * segment to which the expression is relative. These segments will
+ * be segment-base types, i.e. either odd segment values or SEG_ABS
+ * types. So it is still valid to assume that anything with a
+ * `value' field of zero is insignificant.
+ */
+typedef struct {
+    long type;                        /* a register, or EXPR_xxx */
+    long value;                               /* must be >= 32 bits */
+} expr;
+
+/*
+ * The evaluator can also return hints about which of two registers
+ * used in an expression should be the base register. See also the
+ * `operand' structure.
+ */
+struct eval_hints {
+    int base;
+    int type;
+};
+
+/*
+ * The actual expression evaluator function looks like this. When
+ * called, it expects the first token of its expression to already
+ * be in `*tv'; if it is not, set tv->t_type to TOKEN_INVALID and
+ * it will start by calling the scanner.
+ *
+ * If a forward reference happens during evaluation, the evaluator
+ * must set `*fwref' to TRUE if `fwref' is non-NULL.
+ *
+ * `critical' is non-zero if the expression may not contain forward
+ * references. The evaluator will report its own error if this
+ * occurs; if `critical' is 1, the error will be "symbol not
+ * defined before use", whereas if `critical' is 2, the error will
+ * be "symbol undefined".
+ *
+ * If `critical' has bit 4 set (in addition to its main value: 0x11
+ * and 0x12 correspond to 1 and 2) then an extended expression
+ * syntax is recognised, in which relational operators such as =, <
+ * and >= are accepted, as well as low-precedence logical operators
+ * &&, ^^ and ||.
+ *
+ * If `hints' is non-NULL, it gets filled in with some hints as to
+ * the base register in complex effective addresses.
+ */
+typedef expr *(*evalfunc) (scanner sc, void *scprivate, struct tokenval *tv,
+                          int *fwref, int critical, efunc error,
+                          struct eval_hints *hints);
+
+/*
+ * There's also an auxiliary routine through which the evaluator
+ * needs to hear about the value of $ and the label (if any)
+ * defined on the current line.
+ */
+typedef void (*evalinfofunc) (char *labelname, long segment, long offset);
+
+/*
+ * Special values for expr->type. ASSUMPTION MADE HERE: the number
+ * of distinct register names (i.e. possible "type" fields for an
+ * expr structure) does not exceed 124 (EXPR_REG_START through
+ * EXPR_REG_END).
+ */
+#define EXPR_REG_START 1
+#define EXPR_REG_END 124
+#define EXPR_UNKNOWN 125L             /* for forward references */
+#define EXPR_SIMPLE 126L
+#define EXPR_WRT 127L
+#define EXPR_SEGBASE 128L
+
+/*
+ * Preprocessors ought to look like this:
+ */
+typedef struct {
+    /*
+     * Called at the start of a pass; given a file name, the number
+     * of the pass, an error reporting function, an evaluator
+     * function, and a listing generator to talk to.
+     */
+    void (*reset) (char *, int, efunc, evalfunc, ListGen *);
+
+    /*
+     * Called to fetch a line of preprocessed source. The line
+     * returned has been malloc'ed, and so should be freed after
+     * use.
+     */
+    char *(*getline) (void);
+
+    /*
+     * Called at the end of a pass.
+     */
+    void (*cleanup) (void);
+} Preproc;
+
+/*
+ * ----------------------------------------------------------------
+ * Some lexical properties of the NASM source language, included
+ * here because they are shared between the parser and preprocessor
+ * ----------------------------------------------------------------
+ */
+
+/* isidstart matches any character that may start an identifier, and isidchar
+ * matches any character that may appear at places other than the start of an
+ * identifier. E.g. a period may only appear at the start of an identifier
+ * (for local labels), whereas a number may appear anywhere *but* at the
+ * start. */
+
+#define isidstart(c) ( isalpha(c) || (c)=='_' || (c)=='.' || (c)=='?' \
+                                  || (c)=='@' )
+#define isidchar(c)  ( isidstart(c) || isdigit(c) || (c)=='$' || (c)=='#' \
+                                                  || (c)=='~' )
+
+/* Ditto for numeric constants. */
+
+#define isnumstart(c)  ( isdigit(c) || (c)=='$' )
+#define isnumchar(c)   ( isalnum(c) )
+
+/* This returns the numeric value of a given 'digit'. */
+
+#define numvalue(c)  ((c)>='a' ? (c)-'a'+10 : (c)>='A' ? (c)-'A'+10 : (c)-'0')
+
+/*
+ * Data-type flags that get passed to listing-file routines.
+ */
+enum {
+    LIST_READ, LIST_MACRO, LIST_MACRO_NOLIST, LIST_INCLUDE,
+    LIST_INCBIN, LIST_TIMES
+};
+
+/*
+ * -----------------------------------------------------------
+ * Format of the `insn' structure returned from `parser.c' and
+ * passed into `assemble.c'
+ * -----------------------------------------------------------
+ */
+
+/*
+ * Here we define the operand types. These are implemented as bit
+ * masks, since some are subsets of others; e.g. AX in a MOV
+ * instruction is a special operand type, whereas AX in other
+ * contexts is just another 16-bit register. (Also, consider CL in
+ * shift instructions, DX in OUT, etc.)
+ */
+
+/* size, and other attributes, of the operand */
+#define BITS8     0x00000001L
+#define BITS16    0x00000002L
+#define BITS32    0x00000004L
+#define BITS64    0x00000008L         /* FPU only */
+#define BITS80    0x00000010L         /* FPU only */
+#define FAR       0x00000020L         /* grotty: this means 16:16 or */
+                                      /* 16:32, like in CALL/JMP */
+#define NEAR      0x00000040L
+#define SHORT     0x00000080L         /* and this means what it says :) */
+
+#define SIZE_MASK 0x000000FFL         /* all the size attributes */
+#define NON_SIZE  (~SIZE_MASK)
+
+#define TO        0x00000100L          /* reverse effect in FADD, FSUB &c */
+#define COLON     0x00000200L         /* operand is followed by a colon */
+
+/* type of operand: memory reference, register, etc. */
+#define MEMORY    0x00204000L
+#define REGISTER  0x00001000L         /* register number in 'basereg' */
+#define IMMEDIATE 0x00002000L
+
+#define REGMEM    0x00200000L         /* for r/m, ie EA, operands */
+#define REGNORM   0x00201000L         /* 'normal' reg, qualifies as EA */
+#define REG8      0x00201001L
+#define REG16     0x00201002L
+#define REG32     0x00201004L
+#define MMXREG    0x00201008L         /* MMX registers */
+#define FPUREG    0x01000000L         /* floating point stack registers */
+#define FPU0      0x01000800L         /* FPU stack register zero */
+
+/* special register operands: these may be treated differently */
+#define REG_SMASK 0x00070000L         /* a mask for the following */
+#define REG_ACCUM 0x00211000L         /* accumulator: AL, AX or EAX */
+#define REG_AL    0x00211001L         /* REG_ACCUM | BITSxx */
+#define REG_AX    0x00211002L         /* ditto */
+#define REG_EAX   0x00211004L         /* and again */
+#define REG_COUNT 0x00221000L         /* counter: CL, CX or ECX */
+#define REG_CL    0x00221001L         /* REG_COUNT | BITSxx */
+#define REG_CX    0x00221002L         /* ditto */
+#define REG_ECX   0x00221004L         /* another one */
+#define REG_DX    0x00241002L
+#define REG_SREG  0x00081002L         /* any segment register */
+#define REG_CS    0x01081002L         /* CS */
+#define REG_DESS  0x02081002L         /* DS, ES, SS (non-CS 86 registers) */
+#define REG_FSGS  0x04081002L         /* FS, GS (386 extended registers) */
+#define REG_CDT   0x00101004L         /* CRn, DRn and TRn */
+#define REG_CREG  0x08101004L         /* CRn */
+#define REG_CR4   0x08101404L         /* CR4 (Pentium only) */
+#define REG_DREG  0x10101004L         /* DRn */
+#define REG_TREG  0x20101004L         /* TRn */
+
+/* special type of EA */
+#define MEM_OFFS  0x00604000L         /* simple [address] offset */
+
+/* special type of immediate operand */
+#define ONENESS   0x00800000L          /* so UNITY == IMMEDIATE | ONENESS */
+#define UNITY     0x00802000L         /* for shift/rotate instructions */
+
+/*
+ * Next, the codes returned from the parser, for registers and
+ * instructions.
+ */
+
+enum {                                /* register names */
+    R_AH = EXPR_REG_START, R_AL, R_AX, R_BH, R_BL, R_BP, R_BX, R_CH,
+    R_CL, R_CR0, R_CR2, R_CR3, R_CR4, R_CS, R_CX, R_DH, R_DI, R_DL,
+    R_DR0, R_DR1, R_DR2, R_DR3, R_DR6, R_DR7, R_DS, R_DX, R_EAX,
+    R_EBP, R_EBX, R_ECX, R_EDI, R_EDX, R_ES, R_ESI, R_ESP, R_FS,
+    R_GS, R_MM0, R_MM1, R_MM2, R_MM3, R_MM4, R_MM5, R_MM6, R_MM7,
+    R_SI, R_SP, R_SS, R_ST0, R_ST1, R_ST2, R_ST3, R_ST4, R_ST5,
+    R_ST6, R_ST7, R_TR3, R_TR4, R_TR5, R_TR6, R_TR7, REG_ENUM_LIMIT
+};
+
+enum {                                /* instruction names */
+    I_AAA, I_AAD, I_AAM, I_AAS, I_ADC, I_ADD, I_AND, I_ARPL,
+    I_BOUND, I_BSF, I_BSR, I_BSWAP, I_BT, I_BTC, I_BTR, I_BTS,
+    I_CALL, I_CBW, I_CDQ, I_CLC, I_CLD, I_CLI, I_CLTS, I_CMC, I_CMP,
+    I_CMPSB, I_CMPSD, I_CMPSW, I_CMPXCHG, I_CMPXCHG486, I_CMPXCHG8B,
+    I_CPUID, I_CWD, I_CWDE, I_DAA, I_DAS, I_DB, I_DD, I_DEC, I_DIV,
+    I_DQ, I_DT, I_DW, I_EMMS, I_ENTER, I_EQU, I_F2XM1, I_FABS,
+    I_FADD, I_FADDP, I_FBLD, I_FBSTP, I_FCHS, I_FCLEX, I_FCMOVB,
+    I_FCMOVBE, I_FCMOVE, I_FCMOVNB, I_FCMOVNBE, I_FCMOVNE,
+    I_FCMOVNU, I_FCMOVU, I_FCOM, I_FCOMI, I_FCOMIP, I_FCOMP,
+    I_FCOMPP, I_FCOS, I_FDECSTP, I_FDISI, I_FDIV, I_FDIVP, I_FDIVR,
+    I_FDIVRP, I_FENI, I_FFREE, I_FIADD, I_FICOM, I_FICOMP, I_FIDIV,
+    I_FIDIVR, I_FILD, I_FIMUL, I_FINCSTP, I_FINIT, I_FIST, I_FISTP,
+    I_FISUB, I_FISUBR, I_FLD, I_FLD1, I_FLDCW, I_FLDENV, I_FLDL2E,
+    I_FLDL2T, I_FLDLG2, I_FLDLN2, I_FLDPI, I_FLDZ, I_FMUL, I_FMULP,
+    I_FNCLEX, I_FNDISI, I_FNENI, I_FNINIT, I_FNOP, I_FNSAVE,
+    I_FNSTCW, I_FNSTENV, I_FNSTSW, I_FPATAN, I_FPREM, I_FPREM1,
+    I_FPTAN, I_FRNDINT, I_FRSTOR, I_FSAVE, I_FSCALE, I_FSETPM,
+    I_FSIN, I_FSINCOS, I_FSQRT, I_FST, I_FSTCW, I_FSTENV, I_FSTP,
+    I_FSTSW, I_FSUB, I_FSUBP, I_FSUBR, I_FSUBRP, I_FTST, I_FUCOM,
+    I_FUCOMI, I_FUCOMIP, I_FUCOMP, I_FUCOMPP, I_FXAM, I_FXCH,
+    I_FXTRACT, I_FYL2X, I_FYL2XP1, I_HLT, I_IBTS, I_ICEBP, I_IDIV,
+    I_IMUL, I_IN, I_INC, I_INCBIN, I_INSB, I_INSD, I_INSW, I_INT,
+    I_INT1, I_INT01, I_INT3, I_INTO, I_INVD, I_INVLPG, I_IRET,
+    I_IRETD, I_IRETW, I_JCXZ, I_JECXZ, I_JMP, I_LAHF, I_LAR, I_LDS,
+    I_LEA, I_LEAVE, I_LES, I_LFS, I_LGDT, I_LGS, I_LIDT, I_LLDT,
+    I_LMSW, I_LOADALL, I_LOADALL286, I_LODSB, I_LODSD, I_LODSW,
+    I_LOOP, I_LOOPE, I_LOOPNE, I_LOOPNZ, I_LOOPZ, I_LSL, I_LSS,
+    I_LTR, I_MOV, I_MOVD, I_MOVQ, I_MOVSB, I_MOVSD, I_MOVSW,
+    I_MOVSX, I_MOVZX, I_MUL, I_NEG, I_NOP, I_NOT, I_OR, I_OUT,
+    I_OUTSB, I_OUTSD, I_OUTSW, I_PACKSSDW, I_PACKSSWB, I_PACKUSWB,
+    I_PADDB, I_PADDD, I_PADDSB, I_PADDSIW, I_PADDSW, I_PADDUSB,
+    I_PADDUSW, I_PADDW, I_PAND, I_PANDN, I_PAVEB, I_PCMPEQB,
+    I_PCMPEQD, I_PCMPEQW, I_PCMPGTB, I_PCMPGTD, I_PCMPGTW,
+    I_PDISTIB, I_PMACHRIW, I_PMADDWD, I_PMAGW, I_PMULHRW,
+    I_PMULHRIW, I_PMULHW, I_PMULLW, I_PMVGEZB, I_PMVLZB, I_PMVNZB,
+    I_PMVZB, I_POP, I_POPA, I_POPAD, I_POPAW, I_POPF, I_POPFD,
+    I_POPFW, I_POR, I_PSLLD, I_PSLLQ, I_PSLLW, I_PSRAD, I_PSRAW,
+    I_PSRLD, I_PSRLQ, I_PSRLW, I_PSUBB, I_PSUBD, I_PSUBSB,
+    I_PSUBSIW, I_PSUBSW, I_PSUBUSB, I_PSUBUSW, I_PSUBW, I_PUNPCKHBW,
+    I_PUNPCKHDQ, I_PUNPCKHWD, I_PUNPCKLBW, I_PUNPCKLDQ, I_PUNPCKLWD,
+    I_PUSH, I_PUSHA, I_PUSHAD, I_PUSHAW, I_PUSHF, I_PUSHFD,
+    I_PUSHFW, I_PXOR, I_RCL, I_RCR, I_RDMSR, I_RDPMC, I_RDTSC,
+    I_RESB, I_RESD, I_RESQ, I_REST, I_RESW, I_RET, I_RETF, I_RETN,
+    I_ROL, I_ROR, I_RSM, I_SAHF, I_SAL, I_SALC, I_SAR, I_SBB,
+    I_SCASB, I_SCASD, I_SCASW, I_SGDT, I_SHL, I_SHLD, I_SHR, I_SHRD,
+    I_SIDT, I_SLDT, I_SMI, I_SMSW, I_STC, I_STD, I_STI, I_STOSB,
+    I_STOSD, I_STOSW, I_STR, I_SUB, I_TEST, I_UMOV, I_VERR, I_VERW,
+    I_WAIT, I_WBINVD, I_WRMSR, I_XADD, I_XBTS, I_XCHG, I_XLATB,
+    I_XOR, I_CMOVcc, I_Jcc, I_SETcc
+};
+
+enum {                                /* condition code names */
+    C_A, C_AE, C_B, C_BE, C_C, C_E, C_G, C_GE, C_L, C_LE, C_NA, C_NAE,
+    C_NB, C_NBE, C_NC, C_NE, C_NG, C_NGE, C_NL, C_NLE, C_NO, C_NP,
+    C_NS, C_NZ, C_O, C_P, C_PE, C_PO, C_S, C_Z
+};
+
+/*
+ * Note that because segment registers may be used as instruction
+ * prefixes, we must ensure the enumerations for prefixes and
+ * register names do not overlap.
+ */
+enum {                                /* instruction prefixes */
+    PREFIX_ENUM_START = REG_ENUM_LIMIT,
+    P_A16 = PREFIX_ENUM_START, P_A32, P_LOCK, P_O16, P_O32, P_REP, P_REPE,
+    P_REPNE, P_REPNZ, P_REPZ, P_TIMES
+};
+
+enum {                                /* extended operand types */
+    EOT_NOTHING, EOT_DB_STRING, EOT_DB_NUMBER
+};
+
+enum {                                /* special EA flags */
+    EAF_BYTEOFFS = 1,                 /* force offset part to byte size */
+    EAF_WORDOFFS = 2,                 /* force offset part to [d]word size */
+    EAF_TIMESTWO = 4                  /* really do EAX*2 not EAX+EAX */
+};
+
+enum {                                /* values for `hinttype' */
+    EAH_NOHINT = 0,                   /* no hint at all - our discretion */
+    EAH_MAKEBASE = 1,                 /* try to make given reg the base */
+    EAH_NOTBASE = 2                   /* try _not_ to make reg the base */
+};
+
+typedef struct {                      /* operand to an instruction */
+    long type;                        /* type of operand */
+    int addr_size;                    /* 0 means default; 16; 32 */
+    int basereg, indexreg, scale;      /* registers and scale involved */
+    int hintbase, hinttype;           /* hint as to real base register */
+    long segment;                     /* immediate segment, if needed */
+    long offset;                      /* any immediate number */
+    long wrt;                         /* segment base it's relative to */
+    int eaflags;                      /* special EA flags */
+} operand;
+
+typedef struct extop {                /* extended operand */
+    struct extop *next;                       /* linked list */
+    long type;                        /* defined above */
+    char *stringval;                  /* if it's a string, then here it is */
+    int stringlen;                    /* ... and here's how long it is */
+    long segment;                     /* if it's a number/address, then... */
+    long offset;                      /* ... it's given here ... */
+    long wrt;                         /* ... and here */
+} extop;
+
+#define MAXPREFIX 4
+
+typedef struct {                      /* an instruction itself */
+    char *label;                      /* the label defined, or NULL */
+    int prefixes[MAXPREFIX];          /* instruction prefixes, if any */
+    int nprefix;                      /* number of entries in above */
+    int opcode;                               /* the opcode - not just the string */
+    int condition;                    /* the condition code, if Jcc/SETcc */
+    int operands;                     /* how many operands? 0-3 */
+    operand oprs[3];                  /* the operands, defined as above */
+    extop *eops;                      /* extended operands */
+    long times;                               /* repeat count (TIMES prefix) */
+    int forw_ref;                     /* is there a forward reference? */
+} insn;
+
+/*
+ * ------------------------------------------------------------
+ * The data structure defining an output format driver, and the
+ * interfaces to the functions therein.
+ * ------------------------------------------------------------
+ */
+
+struct ofmt {
+    /*
+     * This is a short (one-liner) description of the type of
+     * output generated by the driver.
+     */
+    char *fullname;
+
+    /*
+     * This is a single keyword used to select the driver.
+     */
+    char *shortname;
+
+    /*
+     * This, if non-NULL, is a NULL-terminated list of `char *'s
+     * pointing to extra standard macros supplied by the object
+     * format (e.g. a sensible initial default value of __SECT__,
+     * and user-level equivalents for any format-specific
+     * directives).
+     */
+    char **stdmac;
+
+    /*
+     * This procedure is called at the start of an output session.
+     * It tells the output format what file it will be writing to,
+     * what routine to report errors through, and how to interface
+     * to the label manager and expression evaluator if necessary.
+     * It also gives it a chance to do other initialisation.
+     */
+    void (*init) (FILE *fp, efunc error, ldfunc ldef, evalfunc eval);
+
+    /*
+     * This procedure is called by assemble() to write actual
+     * generated code or data to the object file. Typically it
+     * doesn't have to actually _write_ it, just store it for
+     * later.
+     *
+     * The `type' argument specifies the type of output data, and
+     * usually the size as well: its contents are described below.
+     */
+    void (*output) (long segto, void *data, unsigned long type,
+                   long segment, long wrt);
+
+    /*
+     * This procedure is called once for every symbol defined in
+     * the module being assembled. It gives the name and value of
+     * the symbol, in NASM's terms, and indicates whether it has
+     * been declared to be global. Note that the parameter "name",
+     * when passed, will point to a piece of static storage
+     * allocated inside the label manager - it's safe to keep using
+     * that pointer, because the label manager doesn't clean up
+     * until after the output driver has.
+     *
+     * Values of `is_global' are: 0 means the symbol is local; 1
+     * means the symbol is global; 2 means the symbol is common (in
+     * which case `offset' holds the _size_ of the variable).
+     * Anything else is available for the output driver to use
+     * internally.
+     *
+     * This routine explicitly _is_ allowed to call the label
+     * manager to define further symbols, if it wants to, even
+     * though it's been called _from_ the label manager. That much
+     * re-entrancy is guaranteed in the label manager. However, the
+     * label manager will in turn call this routine, so it should
+     * be prepared to be re-entrant itself.
+     *
+     * The `special' parameter contains special information passed
+     * through from the command that defined the label: it may have
+     * been an EXTERN, a COMMON or a GLOBAL. The distinction should
+     * be obvious to the output format from the other parameters.
+     */
+    void (*symdef) (char *name, long segment, long offset, int is_global,
+                   char *special);
+
+    /*
+     * This procedure is called when the source code requests a
+     * segment change. It should return the corresponding segment
+     * _number_ for the name, or NO_SEG if the name is not a valid
+     * segment name.
+     *
+     * It may also be called with NULL, in which case it is to
+     * return the _default_ section number for starting assembly in.
+     *
+     * It is allowed to modify the string it is given a pointer to.
+     *
+     * It is also allowed to specify a default instruction size for
+     * the segment, by setting `*bits' to 16 or 32. Or, if it
+     * doesn't wish to define a default, it can leave `bits' alone.
+     */
+    long (*section) (char *name, int pass, int *bits);
+
+    /*
+     * This procedure is called to modify the segment base values
+     * returned from the SEG operator. It is given a segment base
+     * value (i.e. a segment value with the low bit set), and is
+     * required to produce in return a segment value which may be
+     * different. It can map segment bases to absolute numbers by
+     * means of returning SEG_ABS types.
+     *
+     * It should return NO_SEG if the segment base cannot be
+     * determined; the evaluator (which calls this routine) is
+     * responsible for throwing an error condition if that occurs
+     * in pass two or in a critical expression.
+     */
+    long (*segbase) (long segment);
+
+    /*
+     * This procedure is called to allow the output driver to
+     * process its own specific directives. When called, it has the
+     * directive word in `directive' and the parameter string in
+     * `value'. It is called in both assembly passes, and `pass'
+     * will be either 1 or 2.
+     *
+     * This procedure should return zero if it does not _recognise_
+     * the directive, so that the main program can report an error.
+     * If it recognises the directive but then has its own errors,
+     * it should report them itself and then return non-zero. It
+     * should also return non-zero if it correctly processes the
+     * directive.
+     */
+    int (*directive) (char *directive, char *value, int pass);
+
+    /*
+     * This procedure is called before anything else - even before
+     * the "init" routine - and is passed the name of the input
+     * file from which this output file is being generated. It
+     * should return its preferred name for the output file in
+     * `outname', if outname[0] is not '\0', and do nothing to
+     * `outname' otherwise. Since it is called before the driver is
+     * properly initialised, it has to be passed its error handler
+     * separately.
+     *
+     * This procedure may also take its own copy of the input file
+     * name for use in writing the output file: it is _guaranteed_
+     * that it will be called before the "init" routine.
+     *
+     * The parameter `outname' points to an area of storage
+     * guaranteed to be at least FILENAME_MAX in size.
+     */
+    void (*filename) (char *inname, char *outname, efunc error);
+
+    /*
+     * This procedure is called after assembly finishes, to allow
+     * the output driver to clean itself up and free its memory.
+     * Typically, it will also be the point at which the object
+     * file actually gets _written_.
+     *
+     * One thing the cleanup routine should always do is to close
+     * the output file pointer.
+     */
+    void (*cleanup) (void);
+};
+
+/*
+ * values for the `type' parameter to an output function. Each one
+ * must have the actual number of _bytes_ added to it.
+ *
+ * Exceptions are OUT_RELxADR, which denote an x-byte relocation
+ * which will be a relative jump. For this we need to know the
+ * distance in bytes from the start of the relocated record until
+ * the end of the containing instruction. _This_ is what is stored
+ * in the size part of the parameter, in this case.
+ *
+ * Also OUT_RESERVE denotes reservation of N bytes of BSS space,
+ * and the contents of the "data" parameter is irrelevant.
+ *
+ * The "data" parameter for the output function points to a "long",
+ * containing the address in question, unless the type is
+ * OUT_RAWDATA, in which case it points to an "unsigned char"
+ * array.
+ */
+#define OUT_RAWDATA 0x00000000UL
+#define OUT_ADDRESS 0x10000000UL
+#define OUT_REL2ADR 0x20000000UL
+#define OUT_REL4ADR 0x30000000UL
+#define OUT_RESERVE 0x40000000UL
+#define OUT_TYPMASK 0xF0000000UL
+#define OUT_SIZMASK 0x0FFFFFFFUL
+
+/*
+ * -----
+ * Other
+ * -----
+ */
+
+/*
+ * This is a useful #define which I keep meaning to use more often:
+ * the number of elements of a statically defined array.
+ */
+
+#define elements(x)     ( sizeof(x) / sizeof(*(x)) )
+
+#endif
diff --git a/i386/nasm/nasmlib.c b/i386/nasm/nasmlib.c
new file mode 100644 (file)
index 0000000..3d55c22
--- /dev/null
@@ -0,0 +1,989 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
+ * Reserved.  This file contains Original Code and/or Modifications of
+ * Original Code as defined in and that are subject to the Apple Public
+ * Source License Version 1.1 (the "License").  You may not use this file
+ * except in compliance with the License.  Please obtain a copy of the
+ * License at http://www.apple.com/publicsource and read it before using
+ * this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/* nasmlib.c   library routines for the Netwide Assembler
+ *
+ * The Netwide Assembler is copyright (C) 1996 Simon Tatham and
+ * Julian Hall. All rights reserved. The software is
+ * redistributable under the licence given in the file "Licence"
+ * distributed in the NASM archive.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+
+#include "nasm.h"
+#include "nasmlib.h"
+
+static efunc nasm_malloc_error;
+
+#ifdef LOGALLOC
+static FILE *logfp;
+#endif
+
+void nasm_set_malloc_error (efunc error) {
+    nasm_malloc_error = error;
+#ifdef LOGALLOC
+    logfp = fopen ("malloc.log", "w");
+    setvbuf (logfp, NULL, _IOLBF, BUFSIZ);
+    fprintf (logfp, "null pointer is %p\n", NULL);
+#endif
+}
+
+#ifdef LOGALLOC
+void *nasm_malloc_log (char *file, int line, size_t size)
+#else
+void *nasm_malloc (size_t size)
+#endif
+{
+    void *p = malloc(size);
+    if (!p)
+       nasm_malloc_error (ERR_FATAL | ERR_NOFILE, "out of memory");
+#ifdef LOGALLOC
+    else
+       fprintf(logfp, "%s %d malloc(%ld) returns %p\n",
+               file, line, (long)size, p);
+#endif
+    return p;
+}
+
+#ifdef LOGALLOC
+void *nasm_realloc_log (char *file, int line, void *q, size_t size)
+#else
+void *nasm_realloc (void *q, size_t size)
+#endif
+{
+    void *p = q ? realloc(q, size) : malloc(size);
+    if (!p)
+       nasm_malloc_error (ERR_FATAL | ERR_NOFILE, "out of memory");
+#ifdef LOGALLOC
+    else if (q)
+       fprintf(logfp, "%s %d realloc(%p,%ld) returns %p\n",
+               file, line, q, (long)size, p);
+    else
+       fprintf(logfp, "%s %d malloc(%ld) returns %p\n",
+               file, line, (long)size, p);
+#endif
+    return p;
+}
+
+#ifdef LOGALLOC
+void nasm_free_log (char *file, int line, void *q)
+#else
+void nasm_free (void *q)
+#endif
+{
+    if (q) {
+       free (q);
+#ifdef LOGALLOC
+       fprintf(logfp, "%s %d free(%p)\n",
+               file, line, q);
+#endif
+    }
+}
+
+#ifdef LOGALLOC
+char *nasm_strdup_log (char *file, int line, char *s)
+#else
+char *nasm_strdup (char *s)
+#endif
+{
+    char *p;
+    int size = strlen(s)+1;
+
+    p = malloc(size);
+    if (!p)
+       nasm_malloc_error (ERR_FATAL | ERR_NOFILE, "out of memory");
+#ifdef LOGALLOC
+    else
+       fprintf(logfp, "%s %d strdup(%ld) returns %p\n",
+               file, line, (long)size, p);
+#endif
+    strcpy (p, s);
+    return p;
+}
+
+#ifdef LOGALLOC
+char *nasm_strndup_log (char *file, int line, char *s, size_t len)
+#else
+char *nasm_strndup (char *s, size_t len)
+#endif
+{
+    char *p;
+    int size = len+1;
+
+    p = malloc(size);
+    if (!p)
+       nasm_malloc_error (ERR_FATAL | ERR_NOFILE, "out of memory");
+#ifdef LOGALLOC
+    else
+       fprintf(logfp, "%s %d strndup(%ld) returns %p\n",
+               file, line, (long)size, p);
+#endif
+    strncpy (p, s, len);
+    p[len] = '\0';
+    return p;
+}
+
+int nasm_stricmp (char *s1, char *s2) {
+    while (*s1 && toupper(*s1) == toupper(*s2))
+       s1++, s2++;
+    if (!*s1 && !*s2)
+       return 0;
+    else if (toupper(*s1) < toupper(*s2))
+       return -1;
+    else
+       return 1;
+}
+
+int nasm_strnicmp (char *s1, char *s2, int n) {
+    while (n > 0 && *s1 && toupper(*s1) == toupper(*s2))
+       s1++, s2++, n--;
+    if ((!*s1 && !*s2) || n==0)
+       return 0;
+    else if (toupper(*s1) < toupper(*s2))
+       return -1;
+    else
+       return 1;
+}
+
+#define lib_isnumchar(c)   ( isalnum(c) || (c) == '$')
+#define numvalue(c)  ((c)>='a' ? (c)-'a'+10 : (c)>='A' ? (c)-'A'+10 : (c)-'0')
+
+long readnum (char *str, int *error) {
+    char *r = str, *q;
+    long radix;
+    unsigned long result, checklimit;
+    int warn = FALSE;
+
+    *error = FALSE;
+
+    while (isspace(*r)) r++;          /* find start of number */
+    q = r;
+
+    while (lib_isnumchar(*q)) q++;     /* find end of number */
+
+    /*
+     * If it begins 0x, 0X or $, or ends in H, it's in hex. if it
+     * ends in Q, it's octal. if it ends in B, it's binary.
+     * Otherwise, it's ordinary decimal.
+     */
+    if (*r=='0' && (r[1]=='x' || r[1]=='X'))
+       radix = 16, r += 2;
+    else if (*r=='$')
+       radix = 16, r++;
+    else if (q[-1]=='H' || q[-1]=='h')
+       radix = 16 , q--;
+    else if (q[-1]=='Q' || q[-1]=='q')
+       radix = 8 , q--;
+    else if (q[-1]=='B' || q[-1]=='b')
+       radix = 2 , q--;
+    else
+       radix = 10;
+
+    /*
+     * If this number has been found for us by something other than
+     * the ordinary scanners, then it might be malformed by having
+     * nothing between the prefix and the suffix. Check this case
+     * now.
+     */
+    if (r >= q) {
+       *error = TRUE;
+       return 0;
+    }
+
+    /*
+     * `checklimit' must be 2**32 / radix. We can't do that in
+     * 32-bit arithmetic, which we're (probably) using, so we
+     * cheat: since we know that all radices we use are even, we
+     * can divide 2**31 by radix/2 instead.
+     */
+    checklimit = 0x80000000UL / (radix>>1);
+
+    result = 0;
+    while (*r && r < q) {
+       if (*r<'0' || (*r>'9' && *r<'A') || numvalue(*r)>=radix) {
+           *error = TRUE;
+           return 0;
+       }
+       if (result >= checklimit)
+           warn = TRUE;
+       result = radix * result + numvalue(*r);
+       r++;
+    }
+
+    if (warn)
+       nasm_malloc_error (ERR_WARNING | ERR_PASS1 | ERR_WARN_NOV,
+                          "numeric constant %s does not fit in 32 bits",
+                          str);
+
+    return result;
+}
+
+static long next_seg;
+
+void seg_init(void) {
+    next_seg = 0;
+}
+
+long seg_alloc(void) {
+    return (next_seg += 2) - 2;
+}
+
+void fwriteshort (int data, FILE *fp) {
+    fputc ((int) (data & 255), fp);
+    fputc ((int) ((data >> 8) & 255), fp);
+}
+
+void fwritelong (long data, FILE *fp) {
+    fputc ((int) (data & 255), fp);
+    fputc ((int) ((data >> 8) & 255), fp);
+    fputc ((int) ((data >> 16) & 255), fp);
+    fputc ((int) ((data >> 24) & 255), fp);
+}
+
+void standard_extension (char *inname, char *outname, char *extension,
+                        efunc error) {
+    char *p, *q;
+
+    if (*outname)                     /* file name already exists, */
+       return;                        /* so do nothing */
+    q = inname;
+    p = outname;
+    while (*q) *p++ = *q++;           /* copy, and find end of string */
+    *p = '\0';                        /* terminate it */
+    while (p > outname && *--p != '.');/* find final period (or whatever) */
+    if (*p != '.') while (*p) p++;     /* go back to end if none found */
+    if (!strcmp(p, extension)) {       /* is the extension already there? */
+       if (*extension)
+           error(ERR_WARNING | ERR_NOFILE,
+                 "file name already ends in `%s': "
+                 "output will be in `nasm.out'",
+                 extension);
+       else
+           error(ERR_WARNING | ERR_NOFILE,
+                 "file name already has no extension: "
+                 "output will be in `nasm.out'");
+       strcpy(outname, "nasm.out");
+    } else
+       strcpy(p, extension);
+}
+
+#define RAA_BLKSIZE 4096              /* this many longs allocated at once */
+#define RAA_LAYERSIZE 1024            /* this many _pointers_ allocated */
+
+typedef struct RAA RAA;
+typedef union RAA_UNION RAA_UNION;
+typedef struct RAA_LEAF RAA_LEAF;
+typedef struct RAA_BRANCH RAA_BRANCH;
+
+struct RAA {
+    /*
+     * Number of layers below this one to get to the real data. 0
+     * means this structure is a leaf, holding RAA_BLKSIZE real
+     * data items; 1 and above mean it's a branch, holding
+     * RAA_LAYERSIZE pointers to the next level branch or leaf
+     * structures.
+     */
+    int layers;
+    /*
+     * Number of real data items spanned by one position in the
+     * `data' array at this level. This number is 1, trivially, for
+     * a leaf (level 0): for a level 1 branch it should be
+     * RAA_BLKSIZE, and for a level 2 branch it's
+     * RAA_LAYERSIZE*RAA_BLKSIZE.
+     */
+    long stepsize;
+    union RAA_UNION {
+       struct RAA_LEAF {
+           long data[RAA_BLKSIZE];
+       } l;
+       struct RAA_BRANCH {
+           struct RAA *data[RAA_LAYERSIZE];
+       } b;
+    } u;
+};
+
+#define LEAFSIZ (sizeof(RAA)-sizeof(RAA_UNION)+sizeof(RAA_LEAF))
+#define BRANCHSIZ (sizeof(RAA)-sizeof(RAA_UNION)+sizeof(RAA_BRANCH))
+
+#define LAYERSIZ(r) ( (r)->layers==0 ? RAA_BLKSIZE : RAA_LAYERSIZE )
+
+static struct RAA *real_raa_init (int layers) {
+    struct RAA *r;
+
+    if (layers == 0) {
+       r = nasm_malloc (LEAFSIZ);
+       memset (r->u.l.data, 0, sizeof(r->u.l.data));
+       r->layers = 0;
+       r->stepsize = 1L;
+    } else {
+       r = nasm_malloc (BRANCHSIZ);
+       memset (r->u.b.data, 0, sizeof(r->u.b.data));
+       r->layers = layers;
+       r->stepsize = RAA_BLKSIZE;
+       while (--layers)
+           r->stepsize *= RAA_LAYERSIZE;
+    }
+    return r;
+}
+
+struct RAA *raa_init (void) {
+    return real_raa_init (0);
+}
+
+void raa_free (struct RAA *r) {
+    if (r->layers == 0)
+       nasm_free (r);
+    else {
+       struct RAA **p;
+       for (p = r->u.b.data; p - r->u.b.data < RAA_LAYERSIZE; p++)
+           if (*p)
+               raa_free (*p);
+    }
+}
+
+long raa_read (struct RAA *r, long posn) {
+    if (posn > r->stepsize * LAYERSIZ(r))
+       return 0L;
+    while (r->layers > 0) {
+       ldiv_t l;
+       l = ldiv (posn, r->stepsize);
+       r = r->u.b.data[l.quot];
+       posn = l.rem;
+       if (!r)                        /* better check this */
+           return 0L;
+    }
+    return r->u.l.data[posn];
+}
+
+struct RAA *raa_write (struct RAA *r, long posn, long value) {
+    struct RAA *result;
+
+    if (posn < 0)
+       nasm_malloc_error (ERR_PANIC, "negative position in raa_write");
+
+    while (r->stepsize * LAYERSIZ(r) < posn) {
+       /*
+        * Must go up a layer.
+        */
+       struct RAA *s;
+
+       s = nasm_malloc (BRANCHSIZ);
+       memset (s->u.b.data, 0, sizeof(r->u.b.data));
+       s->layers = r->layers + 1;
+       s->stepsize = RAA_LAYERSIZE * r->stepsize;
+       s->u.b.data[0] = r;
+       r = s;
+    }
+
+    result = r;
+
+    while (r->layers > 0) {
+       ldiv_t l;
+       struct RAA **s;
+       l = ldiv (posn, r->stepsize);
+       s = &r->u.b.data[l.quot];
+       if (!*s)
+           *s = real_raa_init (r->layers - 1);
+       r = *s;
+       posn = l.rem;
+    }
+
+    r->u.l.data[posn] = value;
+
+    return result;
+}
+
+#define SAA_MAXLEN 8192
+
+struct SAA {
+    /*
+     * members `end' and `elem_len' are only valid in first link in
+     * list; `rptr' and `rpos' are used for reading
+     */
+    struct SAA *next, *end, *rptr;
+    long elem_len, length, posn, start, rpos;
+    char *data;
+};
+
+struct SAA *saa_init (long elem_len) {
+    struct SAA *s;
+
+    if (elem_len > SAA_MAXLEN)
+       nasm_malloc_error (ERR_PANIC | ERR_NOFILE, "SAA with huge elements");
+
+    s = nasm_malloc (sizeof(struct SAA));
+    s->posn = s->start = 0L;
+    s->elem_len = elem_len;
+    s->length = SAA_MAXLEN - (SAA_MAXLEN % elem_len);
+    s->data = nasm_malloc (s->length);
+    s->next = NULL;
+    s->end = s;
+
+    return s;
+}
+
+void saa_free (struct SAA *s) {
+    struct SAA *t;
+
+    while (s) {
+       t = s->next;
+       nasm_free (s->data);
+       nasm_free (s);
+       s = t;
+    }
+}
+
+void *saa_wstruct (struct SAA *s) {
+    void *p;
+
+    if (s->end->length - s->end->posn < s->elem_len) {
+       s->end->next = nasm_malloc (sizeof(struct SAA));
+       s->end->next->start = s->end->start + s->end->posn;
+       s->end = s->end->next;
+       s->end->length = s->length;
+       s->end->next = NULL;
+       s->end->posn = 0L;
+       s->end->data = nasm_malloc (s->length);
+    }
+
+    p = s->end->data + s->end->posn;
+    s->end->posn += s->elem_len;
+    return p;
+}
+
+void saa_wbytes (struct SAA *s, void *data, long len) {
+    char *d = data;
+
+    while (len > 0) {
+       long l = s->end->length - s->end->posn;
+       if (l > len)
+           l = len;
+       if (l > 0) {
+           if (d) {
+               memcpy (s->end->data + s->end->posn, d, l);
+               d += l;
+           } else
+               memset (s->end->data + s->end->posn, 0, l);
+           s->end->posn += l;
+           len -= l;
+       }
+       if (len > 0) {
+           s->end->next = nasm_malloc (sizeof(struct SAA));
+           s->end->next->start = s->end->start + s->end->posn;
+           s->end = s->end->next;
+           s->end->length = s->length;
+           s->end->next = NULL;
+           s->end->posn = 0L;
+           s->end->data = nasm_malloc (s->length);
+       }
+    }
+}
+
+void saa_rewind (struct SAA *s) {
+    s->rptr = s;
+    s->rpos = 0L;
+}
+
+void *saa_rstruct (struct SAA *s) {
+    void *p;
+
+    if (!s->rptr)
+       return NULL;
+
+    if (s->rptr->posn - s->rpos < s->elem_len) {
+       s->rptr = s->rptr->next;
+       if (!s->rptr)
+           return NULL;               /* end of array */
+       s->rpos = 0L;
+    }
+
+    p = s->rptr->data + s->rpos;
+    s->rpos += s->elem_len;
+    return p;
+}
+
+void *saa_rbytes (struct SAA *s, long *len) {
+    void *p;
+
+    if (!s->rptr)
+       return NULL;
+
+    p = s->rptr->data + s->rpos;
+    *len = s->rptr->posn - s->rpos;
+    s->rptr = s->rptr->next;
+    s->rpos = 0L;
+    return p;
+}
+
+void saa_rnbytes (struct SAA *s, void *data, long len) {
+    char *d = data;
+
+    while (len > 0) {
+       long l;
+
+       if (!s->rptr)
+           return;
+
+       l = s->rptr->posn - s->rpos;
+       if (l > len)
+           l = len;
+       if (l > 0) {
+           memcpy (d, s->rptr->data + s->rpos, l);
+           d += l;
+           s->rpos += l;
+           len -= l;
+       }
+       if (len > 0) {
+           s->rptr = s->rptr->next;
+           s->rpos = 0L;
+       }
+    }
+}
+
+void saa_fread (struct SAA *s, long posn, void *data, long len) {
+    struct SAA *p;
+    long pos;
+    char *cdata = data;
+
+    if (!s->rptr || posn > s->rptr->start + s->rpos)
+       saa_rewind (s);
+    while (posn >= s->rptr->start + s->rptr->posn) {
+       s->rptr = s->rptr->next;
+       if (!s->rptr)
+           return;                    /* what else can we do?! */
+    }
+
+    p = s->rptr;
+    pos = posn - s->rptr->start;
+    while (len) {
+       long l = s->rptr->posn - pos;
+       if (l > len)
+           l = len;
+       memcpy (cdata, s->rptr->data+pos, l);
+       len -= l;
+       cdata += l;
+       p = p->next;
+       if (!p)
+           return;
+       pos = 0L;
+    }
+}
+
+void saa_fwrite (struct SAA *s, long posn, void *data, long len) {
+    struct SAA *p;
+    long pos;
+    char *cdata = data;
+
+    if (!s->rptr || posn > s->rptr->start + s->rpos)
+       saa_rewind (s);
+    while (posn >= s->rptr->start + s->rptr->posn) {
+       s->rptr = s->rptr->next;
+       if (!s->rptr)
+           return;                    /* what else can we do?! */
+    }
+
+    p = s->rptr;
+    pos = posn - s->rptr->start;
+    while (len) {
+       long l = s->rptr->posn - pos;
+       if (l > len)
+           l = len;
+       memcpy (s->rptr->data+pos, cdata, l);
+       len -= l;
+       cdata += l;
+       p = p->next;
+       if (!p)
+           return;
+       pos = 0L;
+    }
+}
+
+void saa_fpwrite (struct SAA *s, FILE *fp) {
+    char *data;
+    long len;
+
+    saa_rewind (s);
+    while ( (data = saa_rbytes (s, &len)) )
+       fwrite (data, 1, len, fp);
+}
+
+/*
+ * Register, instruction, condition-code and prefix keywords used
+ * by the scanner.
+ */
+#include "names.c"
+static char *special_names[] = {
+    "byte", "dword", "far", "long", "near", "nosplit", "qword",
+    "short", "to", "tword", "word"
+};
+static char *prefix_names[] = {
+    "a16", "a32", "lock", "o16", "o32", "rep", "repe", "repne",
+    "repnz", "repz", "times"
+};
+
+
+/*
+ * Standard scanner routine used by parser.c and some output
+ * formats. It keeps a succession of temporary-storage strings in
+ * stdscan_tempstorage, which can be cleared using stdscan_reset.
+ */
+static char **stdscan_tempstorage = NULL;
+static int stdscan_tempsize = 0, stdscan_templen = 0;
+#define STDSCAN_TEMP_DELTA 256
+
+static void stdscan_pop(void) {
+    nasm_free (stdscan_tempstorage[--stdscan_templen]);
+}
+
+void stdscan_reset(void) {
+    while (stdscan_templen > 0)
+       stdscan_pop();
+}
+
+static char *stdscan_copy(char *p, int len) {
+    char *text;
+
+    text = nasm_malloc(len+1);
+    strncpy (text, p, len);
+    text[len] = '\0';
+
+    if (stdscan_templen >= stdscan_tempsize) {
+       stdscan_tempsize += STDSCAN_TEMP_DELTA;
+       stdscan_tempstorage = nasm_realloc(stdscan_tempstorage,
+                                          stdscan_tempsize*sizeof(char *));
+    }
+    stdscan_tempstorage[stdscan_templen++] = text;
+
+    return text;
+}
+
+char *stdscan_bufptr = NULL;
+int stdscan (void *private_data, struct tokenval *tv) {
+    char ourcopy[256], *r, *s;
+
+    while (isspace(*stdscan_bufptr)) stdscan_bufptr++;
+    if (!*stdscan_bufptr)
+       return tv->t_type = 0;
+
+    /* we have a token; either an id, a number or a char */
+    if (isidstart(*stdscan_bufptr) ||
+       (*stdscan_bufptr == '$' && isidstart(stdscan_bufptr[1]))) {
+       /* now we've got an identifier */
+       int i;
+       int is_sym = FALSE;
+
+       if (*stdscan_bufptr == '$') {
+           is_sym = TRUE;
+           stdscan_bufptr++;
+       }
+
+       r = stdscan_bufptr++;
+       while (isidchar(*stdscan_bufptr)) stdscan_bufptr++;
+       tv->t_charptr = stdscan_copy(r, stdscan_bufptr - r);
+
+       for (s=tv->t_charptr, r=ourcopy; *s; s++)
+           *r++ = tolower (*s);
+       *r = '\0';
+       if (is_sym)
+           return tv->t_type = TOKEN_ID;/* bypass all other checks */
+       /* right, so we have an identifier sitting in temp storage. now,
+        * is it actually a register or instruction name, or what? */
+       if ((tv->t_integer=bsi(ourcopy, reg_names,
+                              elements(reg_names)))>=0) {
+           tv->t_integer += EXPR_REG_START;
+           return tv->t_type = TOKEN_REG;
+       } else if ((tv->t_integer=bsi(ourcopy, insn_names,
+                                     elements(insn_names)))>=0) {
+           return tv->t_type = TOKEN_INSN;
+       }
+       for (i=0; i<elements(icn); i++)
+           if (!strncmp(ourcopy, icn[i], strlen(icn[i]))) {
+               char *p = ourcopy + strlen(icn[i]);
+               tv->t_integer = ico[i];
+               if ((tv->t_inttwo=bsi(p, conditions,
+                                        elements(conditions)))>=0)
+                   return tv->t_type = TOKEN_INSN;
+           }
+       if ((tv->t_integer=bsi(ourcopy, prefix_names,
+                                 elements(prefix_names)))>=0) {
+           tv->t_integer += PREFIX_ENUM_START;
+           return tv->t_type = TOKEN_PREFIX;
+       }
+       if ((tv->t_integer=bsi(ourcopy, special_names,
+                                 elements(special_names)))>=0)
+           return tv->t_type = TOKEN_SPECIAL;
+       if (!strcmp(ourcopy, "seg"))
+           return tv->t_type = TOKEN_SEG;
+       if (!strcmp(ourcopy, "wrt"))
+           return tv->t_type = TOKEN_WRT;
+       return tv->t_type = TOKEN_ID;
+    } else if (*stdscan_bufptr == '$' && !isnumchar(stdscan_bufptr[1])) {
+       /*
+        * It's a $ sign with no following hex number; this must
+        * mean it's a Here token ($), evaluating to the current
+        * assembly location, or a Base token ($$), evaluating to
+        * the base of the current segment.
+        */
+       stdscan_bufptr++;
+       if (*stdscan_bufptr == '$') {
+           stdscan_bufptr++;
+           return tv->t_type = TOKEN_BASE;
+       }
+       return tv->t_type = TOKEN_HERE;
+    } else if (isnumstart(*stdscan_bufptr)) {  /* now we've got a number */
+       int rn_error;
+
+       r = stdscan_bufptr++;
+       while (isnumchar(*stdscan_bufptr))
+           stdscan_bufptr++;
+
+       if (*stdscan_bufptr == '.') {
+           /*
+            * a floating point constant
+            */
+           stdscan_bufptr++;
+           while (isnumchar(*stdscan_bufptr)) {
+               stdscan_bufptr++;
+           }
+           tv->t_charptr = stdscan_copy(r, stdscan_bufptr - r);
+           return tv->t_type = TOKEN_FLOAT;
+       }
+       r = stdscan_copy(r, stdscan_bufptr - r);
+       tv->t_integer = readnum(r, &rn_error);
+       stdscan_pop();
+       if (rn_error)
+           return tv->t_type = TOKEN_ERRNUM;/* some malformation occurred */
+       tv->t_charptr = NULL;
+       return tv->t_type = TOKEN_NUM;
+    } else if (*stdscan_bufptr == '\'' ||
+              *stdscan_bufptr == '"') {/* a char constant */
+       char quote = *stdscan_bufptr++, *r;
+       r = tv->t_charptr = stdscan_bufptr;
+       while (*stdscan_bufptr && *stdscan_bufptr != quote) stdscan_bufptr++;
+       tv->t_inttwo = stdscan_bufptr - r;      /* store full version */
+       if (!*stdscan_bufptr)
+           return tv->t_type = TOKEN_ERRNUM;       /* unmatched quotes */
+       tv->t_integer = 0;
+       r = stdscan_bufptr++;                  /* skip over final quote */
+       while (quote != *--r) {
+           tv->t_integer = (tv->t_integer<<8) + (unsigned char) *r;
+       }
+       return tv->t_type = TOKEN_NUM;
+    } else if (*stdscan_bufptr == ';') {  /* a comment has happened - stay */
+       return tv->t_type = 0;
+    } else if (stdscan_bufptr[0] == '>' && stdscan_bufptr[1] == '>') {
+       stdscan_bufptr += 2;
+       return tv->t_type = TOKEN_SHR;
+    } else if (stdscan_bufptr[0] == '<' && stdscan_bufptr[1] == '<') {
+       stdscan_bufptr += 2;
+       return tv->t_type = TOKEN_SHL;
+    } else if (stdscan_bufptr[0] == '/' && stdscan_bufptr[1] == '/') {
+       stdscan_bufptr += 2;
+       return tv->t_type = TOKEN_SDIV;
+    } else if (stdscan_bufptr[0] == '%' && stdscan_bufptr[1] == '%') {
+       stdscan_bufptr += 2;
+       return tv->t_type = TOKEN_SMOD;
+    } else if (stdscan_bufptr[0] == '=' && stdscan_bufptr[1] == '=') {
+       stdscan_bufptr += 2;
+       return tv->t_type = TOKEN_EQ;
+    } else if (stdscan_bufptr[0] == '<' && stdscan_bufptr[1] == '>') {
+       stdscan_bufptr += 2;
+       return tv->t_type = TOKEN_NE;
+    } else if (stdscan_bufptr[0] == '!' && stdscan_bufptr[1] == '=') {
+       stdscan_bufptr += 2;
+       return tv->t_type = TOKEN_NE;
+    } else if (stdscan_bufptr[0] == '<' && stdscan_bufptr[1] == '=') {
+       stdscan_bufptr += 2;
+       return tv->t_type = TOKEN_LE;
+    } else if (stdscan_bufptr[0] == '>' && stdscan_bufptr[1] == '=') {
+       stdscan_bufptr += 2;
+       return tv->t_type = TOKEN_GE;
+    } else if (stdscan_bufptr[0] == '&' && stdscan_bufptr[1] == '&') {
+       stdscan_bufptr += 2;
+       return tv->t_type = TOKEN_DBL_AND;
+    } else if (stdscan_bufptr[0] == '^' && stdscan_bufptr[1] == '^') {
+       stdscan_bufptr += 2;
+       return tv->t_type = TOKEN_DBL_XOR;
+    } else if (stdscan_bufptr[0] == '|' && stdscan_bufptr[1] == '|') {
+       stdscan_bufptr += 2;
+       return tv->t_type = TOKEN_DBL_OR;
+    } else                            /* just an ordinary char */
+       return tv->t_type = (unsigned char) (*stdscan_bufptr++);
+}
+
+/*
+ * Return TRUE if the argument is a simple scalar. (Or a far-
+ * absolute, which counts.)
+ */
+int is_simple (expr *vect) {
+    while (vect->type && !vect->value)
+       vect++;
+    if (!vect->type)
+       return 1;
+    if (vect->type != EXPR_SIMPLE)
+       return 0;
+    do {
+       vect++;
+    } while (vect->type && !vect->value);
+    if (vect->type && vect->type < EXPR_SEGBASE+SEG_ABS) return 0;
+    return 1;
+}
+
+/*
+ * Return TRUE if the argument is a simple scalar, _NOT_ a far-
+ * absolute.
+ */
+int is_really_simple (expr *vect) {
+    while (vect->type && !vect->value)
+       vect++;
+    if (!vect->type)
+       return 1;
+    if (vect->type != EXPR_SIMPLE)
+       return 0;
+    do {
+       vect++;
+    } while (vect->type && !vect->value);
+    if (vect->type) return 0;
+    return 1;
+}
+
+/*
+ * Return TRUE if the argument is relocatable (i.e. a simple
+ * scalar, plus at most one segment-base, plus possibly a WRT).
+ */
+int is_reloc (expr *vect) {
+    while (vect->type && !vect->value) /* skip initial value-0 terms */
+       vect++;
+    if (!vect->type)                  /* trivially return TRUE if nothing */
+       return 1;                      /* is present apart from value-0s */
+    if (vect->type < EXPR_SIMPLE)      /* FALSE if a register is present */
+       return 0;
+    if (vect->type == EXPR_SIMPLE) {   /* skip over a pure number term... */
+       do {
+           vect++;
+       } while (vect->type && !vect->value);
+       if (!vect->type)               /* ...returning TRUE if that's all */
+           return 1;
+    }
+    if (vect->type == EXPR_WRT) {      /* skip over a WRT term... */
+       do {
+           vect++;
+       } while (vect->type && !vect->value);
+       if (!vect->type)               /* ...returning TRUE if that's all */
+           return 1;
+    }
+    if (vect->value != 0 && vect->value != 1)
+       return 0;                      /* segment base multiplier non-unity */
+    do {                              /* skip over _one_ seg-base term... */
+       vect++;
+    } while (vect->type && !vect->value);
+    if (!vect->type)                  /* ...returning TRUE if that's all */
+       return 1;
+    return 0;                         /* And return FALSE if there's more */
+}
+
+/*
+ * Return TRUE if the argument contains an `unknown' part.
+ */
+int is_unknown(expr *vect) {
+    while (vect->type && vect->type < EXPR_UNKNOWN)
+       vect++;
+    return (vect->type == EXPR_UNKNOWN);
+}
+
+/*
+ * Return TRUE if the argument contains nothing but an `unknown'
+ * part.
+ */
+int is_just_unknown(expr *vect) {
+    while (vect->type && !vect->value)
+       vect++;
+    return (vect->type == EXPR_UNKNOWN);
+}
+
+/*
+ * Return the scalar part of a relocatable vector. (Including
+ * simple scalar vectors - those qualify as relocatable.)
+ */
+long reloc_value (expr *vect) {
+    while (vect->type && !vect->value)
+       vect++;
+    if (!vect->type) return 0;
+    if (vect->type == EXPR_SIMPLE)
+       return vect->value;
+    else
+       return 0;
+}
+
+/*
+ * Return the segment number of a relocatable vector, or NO_SEG for
+ * simple scalars.
+ */
+long reloc_seg (expr *vect) {
+    while (vect->type && (vect->type == EXPR_WRT || !vect->value))
+       vect++;
+    if (vect->type == EXPR_SIMPLE) {
+       do {
+           vect++;
+       } while (vect->type && (vect->type == EXPR_WRT || !vect->value));
+    }
+    if (!vect->type)
+       return NO_SEG;
+    else
+       return vect->type - EXPR_SEGBASE;
+}
+
+/*
+ * Return the WRT segment number of a relocatable vector, or NO_SEG
+ * if no WRT part is present.
+ */
+long reloc_wrt (expr *vect) {
+    while (vect->type && vect->type < EXPR_WRT)
+       vect++;
+    if (vect->type == EXPR_WRT) {
+       return vect->value;
+    } else
+       return NO_SEG;
+}
+
+/*
+ * Binary search.
+ */
+int bsi (char *string, char **array, int size) {
+    int i = -1, j = size;             /* always, i < index < j */
+    while (j-i >= 2) {
+       int k = (i+j)/2;
+       int l = strcmp(string, array[k]);
+       if (l<0)                       /* it's in the first half */
+           j = k;
+       else if (l>0)                  /* it's in the second half */
+           i = k;
+       else                           /* we've got it :) */
+           return k;
+    }
+    return -1;                        /* we haven't got it :( */
+}
diff --git a/i386/nasm/nasmlib.h b/i386/nasm/nasmlib.h
new file mode 100644 (file)
index 0000000..3874e58
--- /dev/null
@@ -0,0 +1,195 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
+ * Reserved.  This file contains Original Code and/or Modifications of
+ * Original Code as defined in and that are subject to the Apple Public
+ * Source License Version 1.1 (the "License").  You may not use this file
+ * except in compliance with the License.  Please obtain a copy of the
+ * License at http://www.apple.com/publicsource and read it before using
+ * this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/* nasmlib.c   header file for nasmlib.h
+ *
+ * The Netwide Assembler is copyright (C) 1996 Simon Tatham and
+ * Julian Hall. All rights reserved. The software is
+ * redistributable under the licence given in the file "Licence"
+ * distributed in the NASM archive.
+ */
+
+#ifndef NASM_NASMLIB_H
+#define NASM_NASMLIB_H
+
+/*
+ * If this is defined, the wrappers around malloc et al will
+ * transform into logging variants, which will cause NASM to create
+ * a file called `malloc.log' when run, and spew details of all its
+ * memory management into that. That can then be analysed to detect
+ * memory leaks and potentially other problems too.
+ */
+/* #define LOGALLOC */
+
+/*
+ * Wrappers around malloc, realloc and free. nasm_malloc will
+ * fatal-error and die rather than return NULL; nasm_realloc will
+ * do likewise, and will also guarantee to work right on being
+ * passed a NULL pointer; nasm_free will do nothing if it is passed
+ * a NULL pointer.
+ */
+#ifdef NASM_NASM_H                    /* need efunc defined for this */
+void nasm_set_malloc_error (efunc);
+#ifndef LOGALLOC
+void *nasm_malloc (size_t);
+void *nasm_realloc (void *, size_t);
+void nasm_free (void *);
+char *nasm_strdup (char *);
+char *nasm_strndup (char *, size_t);
+#else
+void *nasm_malloc_log (char *, int, size_t);
+void *nasm_realloc_log (char *, int, void *, size_t);
+void nasm_free_log (char *, int, void *);
+char *nasm_strdup_log (char *, int, char *);
+char *nasm_strndup_log (char *, int, char *, size_t);
+#define nasm_malloc(x) nasm_malloc_log(__FILE__,__LINE__,x)
+#define nasm_realloc(x,y) nasm_realloc_log(__FILE__,__LINE__,x,y)
+#define nasm_free(x) nasm_free_log(__FILE__,__LINE__,x)
+#define nasm_strdup(x) nasm_strdup_log(__FILE__,__LINE__,x)
+#define nasm_strndup(x,y) nasm_strndup_log(__FILE__,__LINE__,x,y)
+#endif
+#endif
+
+/*
+ * ANSI doesn't guarantee the presence of `stricmp' or
+ * `strcasecmp'.
+ */
+int nasm_stricmp (char *, char *);
+int nasm_strnicmp (char *, char *, int);
+
+/*
+ * Convert a string into a number, using NASM number rules. Sets
+ * `*error' to TRUE if an error occurs, and FALSE otherwise.
+ */
+long readnum(char *str, int *error);
+
+/*
+ * seg_init: Initialise the segment-number allocator.
+ * seg_alloc: allocate a hitherto unused segment number.
+ */
+void seg_init(void);
+long seg_alloc(void);
+
+/*
+ * many output formats will be able to make use of this: a standard
+ * function to add an extension to the name of the input file
+ */
+#ifdef NASM_NASM_H
+void standard_extension (char *inname, char *outname, char *extension,
+                        efunc error);
+#endif
+
+/*
+ * some handy macros that will probably be of use in more than one
+ * output format: convert integers into little-endian byte packed
+ * format in memory
+ */
+
+#define WRITELONG(p,v) \
+  do { \
+    *(p)++ = (v) & 0xFF; \
+    *(p)++ = ((v) >> 8) & 0xFF; \
+    *(p)++ = ((v) >> 16) & 0xFF; \
+    *(p)++ = ((v) >> 24) & 0xFF; \
+  } while (0)
+
+#define WRITESHORT(p,v) \
+  do { \
+    *(p)++ = (v) & 0xFF; \
+    *(p)++ = ((v) >> 8) & 0xFF; \
+  } while (0)
+
+/*
+ * and routines to do the same thing to a file
+ */
+void fwriteshort (int data, FILE *fp);
+void fwritelong (long data, FILE *fp);
+
+/*
+ * Routines to manage a dynamic random access array of longs which
+ * may grow in size to be more than the largest single malloc'able
+ * chunk.
+ */
+
+struct RAA;
+
+struct RAA *raa_init (void);
+void raa_free (struct RAA *);
+long raa_read (struct RAA *, long);
+struct RAA *raa_write (struct RAA *r, long posn, long value);
+
+/*
+ * Routines to manage a dynamic sequential-access array, under the
+ * same restriction on maximum mallocable block. This array may be
+ * written to in two ways: a contiguous chunk can be reserved of a
+ * given size, and a pointer returned, or single-byte data may be
+ * written. The array can also be read back in the same two ways:
+ * as a series of big byte-data blocks or as a list of structures
+ * of a given size.
+ */
+
+struct SAA;
+
+struct SAA *saa_init (long elem_len);  /* 1 == byte */
+void saa_free (struct SAA *);
+void *saa_wstruct (struct SAA *);      /* return a structure of elem_len */
+void saa_wbytes (struct SAA *, void *, long);  /* write arbitrary bytes */
+void saa_rewind (struct SAA *);               /* for reading from beginning */
+void *saa_rstruct (struct SAA *);      /* return NULL on EOA */
+void *saa_rbytes (struct SAA *, long *);   /* return 0 on EOA */
+void saa_rnbytes (struct SAA *, void *, long); /* read a given no. of bytes */
+void saa_fread (struct SAA *s, long posn, void *p, long len);   /* fixup */
+void saa_fwrite (struct SAA *s, long posn, void *p, long len);   /* fixup */
+void saa_fpwrite (struct SAA *, FILE *);
+
+#ifdef NASM_NASM_H
+/*
+ * Standard scanner.
+ */
+extern char *stdscan_bufptr;
+void stdscan_reset(void);
+int stdscan (void *private_data, struct tokenval *tv);
+#endif
+
+#ifdef NASM_NASM_H
+/*
+ * Library routines to manipulate expression data types.
+ */
+int is_reloc(expr *);
+int is_simple(expr *);
+int is_really_simple (expr *);
+int is_unknown(expr *);
+int is_just_unknown(expr *);
+long reloc_value(expr *);
+long reloc_seg(expr *);
+long reloc_wrt(expr *);
+#endif
+
+/*
+ * Binary search routine. Returns index into `array' of an entry
+ * matching `string', or <0 if no match. `array' is taken to
+ * contain `size' elements.
+ */
+int bsi (char *string, char **array, int size);
+
+#endif
diff --git a/i386/nasm/ndisasm.1 b/i386/nasm/ndisasm.1
new file mode 100644 (file)
index 0000000..78d313c
--- /dev/null
@@ -0,0 +1,117 @@
+.TH NDISASM 1 "The Netwide Assembler Project"
+.SH NAME
+ndisasm \- the Netwide Disassembler \- 80x86 binary file disassembler
+.SH SYNOPSIS
+.B ndisasm
+[
+.B \-o
+origin
+] [
+.B \-s
+sync-point [...]]
+[
+.B \-a
+|
+.B \-i
+] [
+.B \-b
+bits
+] [
+.B -u
+] [
+.B \-e
+hdrlen
+] [
+.B \-k
+offset,length [...]]
+infile
+.br
+.B ndisasm \-h
+.br
+.B ndisasm \-r
+.SH DESCRIPTION
+The
+.B ndisasm
+command generates a disassembly listing of the binary file
+.I infile
+and directs it to stdout.
+.SS OPTIONS
+.TP
+.B \-h
+Causes
+.B ndisasm
+to exit immediately, after giving a summary of its invocation
+options.
+.TP
+.BI \-r
+Causes
+.B ndisasm
+to exit immediately, after displaying its version number.
+.TP
+.BI \-o " origin"
+Specifies the notional load address for the file. This option causes
+.B ndisasm
+to get the addresses it lists down the left hand margin, and the
+target addresses of PC-relative jumps and calls, right.
+.TP
+.BI \-s " sync-point"
+Manually specifies a synchronisation address, such that
+.B ndisasm
+will not output any machine instruction which encompasses bytes on
+both sides of the address. Hence the instruction which
+.I starts
+at that address will be correctly disassembled.
+.TP
+.BI \-e " hdrlen"
+Specifies a number of bytes to discard from the beginning of the
+file before starting disassembly. This does not count towards the
+calculation of the disassembly offset: the first
+.I disassembled
+instruction will be shown starting at the given load address.
+.TP
+.BI \-k " offset,length"
+Specifies that
+.I length
+bytes, starting from disassembly offset
+.IR offset ,
+should be skipped over without generating any output. The skipped
+bytes still count towards the calculation of the disassembly offset.
+.TP
+.BR \-a " or " \-i
+Enables automatic (or intelligent) sync mode, in which
+.B ndisasm
+will attempt to guess where synchronisation should be performed, by
+means of examining the target addresses of the relative jumps and
+calls it disassembles.
+.TP
+.BI \-b " bits"
+Specifies either 16-bit or 32-bit mode. The default is 16-bit mode.
+.TP
+.B \-u
+Specifies 32-bit mode, more compactly than using `-b 32'.
+.PP
+.RE
+.SH RESTRICTIONS
+.B ndisasm
+only disassembles binary files: it has no understanding of the
+header information present in object or executable files. If you
+want to disassemble an object file, you should probably be using
+.BR objdump "(" 1 ")."
+.PP
+Auto-sync mode won't necessarily cure all your synchronisation
+problems: a sync marker can only be placed automatically if a jump
+or call instruction is found to refer to it
+.I before
+.B ndisasm
+actually disassembles that part of the code. Also, if spurious jumps
+or calls result from disassembling non-machine-code data, sync
+markers may get placed in strange places. Feel free to turn
+auto-sync off and go back to doing it manually if necessary.
+.PP
+.B ndisasm
+can only keep track of 8192 sync markers internally at once: this is
+to do with portability, since DOS machines don't take kindly to more
+than 64K being allocated at a time.
+.PP
+.SH SEE ALSO
+.BR objdump "(" 1 ")."
diff --git a/i386/nasm/ndisasm.c b/i386/nasm/ndisasm.c
new file mode 100644 (file)
index 0000000..ae6c34f
--- /dev/null
@@ -0,0 +1,301 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
+ * Reserved.  This file contains Original Code and/or Modifications of
+ * Original Code as defined in and that are subject to the Apple Public
+ * Source License Version 1.1 (the "License").  You may not use this file
+ * except in compliance with the License.  Please obtain a copy of the
+ * License at http://www.apple.com/publicsource and read it before using
+ * this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/* ndisasm.c   the Netwide Disassembler main module
+ *
+ * The Netwide Assembler is copyright (C) 1996 Simon Tatham and
+ * Julian Hall. All rights reserved. The software is
+ * redistributable under the licence given in the file "Licence"
+ * distributed in the NASM archive.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+#include <errno.h>
+
+#include "nasm.h"
+#include "nasmlib.h"
+#include "sync.h"
+#include "disasm.h"
+
+#define BPL 8                         /* bytes per line of hex dump */
+
+static const char *help =
+"usage: ndisasm [-a] [-i] [-h] [-r] [-u] [-b bits] [-o origin] [-s sync...]\n"
+"               [-e bytes] [-k start,bytes] file\n"
+"   -a or -i activates auto (intelligent) sync\n"
+"   -u sets USE32 (32-bit mode)\n"
+"   -b 16 or -b 32 sets number of bits too\n"
+"   -h displays this text\n"
+"   -r displays the version number\n"
+"   -e skips <bytes> bytes of header\n"
+"   -k avoids disassembling <bytes> bytes from position <start>\n";
+
+static void output_ins (unsigned long, unsigned char *, int, char *);
+static void skip (unsigned long dist, FILE *fp);
+
+int main(int argc, char **argv) {
+    unsigned char buffer[INSN_MAX * 2], *p, *q;
+    char outbuf[256];
+    char *pname = *argv;
+    char *filename = NULL;
+    unsigned long nextsync, synclen, initskip = 0L;
+    int lenread, lendis;
+    int autosync = FALSE;
+    int bits = 16;
+    int eof = FALSE;
+    int rn_error;
+    long offset;
+    FILE *fp;
+
+    offset = 0;
+    init_sync();
+
+    while (--argc) {
+       char *v, *vv, *p = *++argv;
+       if (*p == '-') {
+           p++;
+           while (*p) switch (tolower(*p)) {
+             case 'a':                /* auto or intelligent sync */
+             case 'i':
+               autosync = TRUE;
+               p++;
+               break;
+             case 'h':
+               fprintf(stderr, help);
+               return 0;
+             case 'r':
+               fprintf(stderr, "NDISASM version " NASM_VER "\n");
+               return 0;
+             case 'u':                /* USE32 */
+               bits = 32;
+               p++;
+               break;
+             case 'b':                /* bits */
+               v = p[1] ? p+1 : --argc ? *++argv : NULL;
+               if (!v) {
+                   fprintf(stderr, "%s: `-b' requires an argument\n", pname);
+                   return 1;
+               }
+               if (!strcmp(v, "16"))
+                   bits = 16;
+               else if (!strcmp(v, "32"))
+                   bits = 32;
+               else {
+                   fprintf(stderr, "%s: argument to `-b' should"
+                           " be `16' or `32'\n", pname);
+               }
+               p = "";                /* force to next argument */
+               break;
+             case 'o':                /* origin */
+               v = p[1] ? p+1 : --argc ? *++argv : NULL;
+               if (!v) {
+                   fprintf(stderr, "%s: `-o' requires an argument\n", pname);
+                   return 1;
+               }
+               offset = readnum (v, &rn_error);
+               if (rn_error) {
+                   fprintf(stderr, "%s: `-o' requires a numeric argument\n",
+                           pname);
+                   return 1;
+               }
+               p = "";                /* force to next argument */
+               break;
+             case 's':                /* sync point */
+               v = p[1] ? p+1 : --argc ? *++argv : NULL;
+               if (!v) {
+                   fprintf(stderr, "%s: `-s' requires an argument\n", pname);
+                   return 1;
+               }
+               add_sync (readnum (v, &rn_error), 0L);
+               if (rn_error) {
+                   fprintf(stderr, "%s: `-s' requires a numeric argument\n",
+                           pname);
+                   return 1;
+               }
+               p = "";                /* force to next argument */
+               break;
+             case 'e':                /* skip a header */
+               v = p[1] ? p+1 : --argc ? *++argv : NULL;
+               if (!v) {
+                   fprintf(stderr, "%s: `-e' requires an argument\n", pname);
+                   return 1;
+               }
+               initskip = readnum (v, &rn_error);
+               if (rn_error) {
+                   fprintf(stderr, "%s: `-e' requires a numeric argument\n",
+                           pname);
+                   return 1;
+               }
+               p = "";                /* force to next argument */
+               break;
+             case 'k':                /* skip a region */
+               v = p[1] ? p+1 : --argc ? *++argv : NULL;
+               if (!v) {
+                   fprintf(stderr, "%s: `-k' requires an argument\n", pname);
+                   return 1;
+               }
+               vv = strchr(v, ',');
+               if (!vv) {
+                   fprintf(stderr, "%s: `-k' requires two numbers separated"
+                           " by a comma\n", pname);
+                   return 1;
+               }
+               *vv++ = '\0';
+               nextsync = readnum (v, &rn_error);
+               if (rn_error) {
+                   fprintf(stderr, "%s: `-k' requires numeric arguments\n",
+                           pname);
+                   return 1;
+               }
+               synclen = readnum (vv, &rn_error);
+               if (rn_error) {
+                   fprintf(stderr, "%s: `-k' requires numeric arguments\n",
+                           pname);
+                   return 1;
+               }
+               add_sync (nextsync, synclen);
+               p = "";                /* force to next argument */
+               break;
+           }
+       } else if (!filename) {
+           filename = p;
+       } else {
+           fprintf(stderr, "%s: more than one filename specified\n", pname);
+           return 1;
+       }
+    }
+
+    if (!filename) {
+       fprintf(stderr, help, pname);
+       return 0;
+    }
+
+    fp = fopen(filename, "rb");
+    if (!fp) {
+       fprintf(stderr, "%s: unable to open `%s': %s\n",
+               pname, filename, strerror(errno));
+       return 1;
+    }
+    if (initskip > 0)
+       skip (initskip, fp);
+
+    /*
+     * This main loop is really horrible, and wants rewriting with
+     * an axe. It'll stay the way it is for a while though, until I
+     * find the energy...
+     */
+
+    p = q = buffer;
+    nextsync = next_sync (offset, &synclen);
+    do {
+       unsigned long to_read = buffer+sizeof(buffer)-p;
+       if (to_read > nextsync-offset-(p-q))
+           to_read = nextsync-offset-(p-q);
+       lenread = fread (p, 1, to_read, fp);
+       if (lenread == 0)
+           eof = TRUE;                /* help along systems with bad feof */
+       p += lenread;
+       if (offset == nextsync) {
+           if (synclen) {
+               printf("%08lX  skipping 0x%lX bytes\n", offset, synclen);
+               offset += synclen;
+               skip (synclen, fp);
+           }
+           p = q = buffer;
+           nextsync = next_sync (offset, &synclen);
+       }
+       while (p > q && (p - q >= INSN_MAX || lenread == 0)) {
+           lendis = disasm (q, outbuf, bits, offset, autosync);
+           if (!lendis || lendis > (p - q) ||
+               lendis > nextsync-offset)
+               lendis = eatbyte (q, outbuf);
+           output_ins (offset, q, lendis, outbuf);
+           q += lendis;
+           offset += lendis;
+       }
+       if (q >= buffer+INSN_MAX) {
+           unsigned char *r = buffer, *s = q;
+           int count = p - q;
+           while (count--)
+               *r++ = *s++;
+           p -= (q - buffer);
+           q = buffer;
+       }
+    } while (lenread > 0 || !(eof || feof(fp)));
+    fclose (fp);
+    return 0;
+}
+
+static void output_ins (unsigned long offset, unsigned char *data,
+                       int datalen, char *insn) {
+    int bytes;
+    printf("%08lX  ", offset);
+
+    bytes = 0;
+    while (datalen > 0 && bytes < BPL) {
+       printf("%02X", *data++);
+       bytes++;
+       datalen--;
+    }
+
+    printf("%*s%s\n", (BPL+1-bytes)*2, "", insn);
+
+    while (datalen > 0) {
+       printf("         -");
+       bytes = 0;
+       while (datalen > 0 && bytes < BPL) {
+           printf("%02X", *data++);
+           bytes++;
+           datalen--;
+       }
+       printf("\n");
+    }
+}
+
+/*
+ * Skip a certain amount of data in a file, either by seeking if
+ * possible, or if that fails then by reading and discarding.
+ */
+static void skip (unsigned long dist, FILE *fp) {
+    char buffer[256];                 /* should fit on most stacks :-) */
+
+    /*
+     * Got to be careful with fseek: at least one fseek I've tried
+     * doesn't approve of SEEK_CUR. So I'll use SEEK_SET and
+     * ftell... horrible but apparently necessary.
+     */
+    if (fseek (fp, dist+ftell(fp), SEEK_SET)) {
+       while (dist > 0) {
+           unsigned long len = (dist < sizeof(buffer) ?
+                                dist : sizeof(buffer));
+           if (fread (buffer, 1, len, fp) < len) {
+               perror("fread");
+               exit(1);
+           }
+           dist -= len;
+       }
+    }
+}
diff --git a/i386/nasm/outaout.c b/i386/nasm/outaout.c
new file mode 100644 (file)
index 0000000..1faa613
--- /dev/null
@@ -0,0 +1,919 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
+ * Reserved.  This file contains Original Code and/or Modifications of
+ * Original Code as defined in and that are subject to the Apple Public
+ * Source License Version 1.1 (the "License").  You may not use this file
+ * except in compliance with the License.  Please obtain a copy of the
+ * License at http://www.apple.com/publicsource and read it before using
+ * this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/* outaout.c   output routines for the Netwide Assembler to produce
+ *             Linux a.out object files
+ *
+ * The Netwide Assembler is copyright (C) 1996 Simon Tatham and
+ * Julian Hall. All rights reserved. The software is
+ * redistributable under the licence given in the file "Licence"
+ * distributed in the NASM archive.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+
+#include "nasm.h"
+#include "nasmlib.h"
+#include "outform.h"
+
+#if defined OF_AOUT || defined OF_AOUTB
+
+#define RELTYPE_ABSOLUTE 0x00
+#define RELTYPE_RELATIVE 0x01
+#define RELTYPE_GOTPC    0x01   /* no explicit GOTPC in a.out */
+#define RELTYPE_GOTOFF   0x10
+#define RELTYPE_GOT      0x10   /* distinct from GOTOFF bcos sym not sect */
+#define RELTYPE_PLT      0x21
+#define RELTYPE_SYMFLAG  0x08
+
+struct Reloc {
+    struct Reloc *next;
+    long address;                     /* relative to _start_ of section */
+    long symbol;                      /* symbol number or -ve section id */
+    int bytes;                        /* 2 or 4 */
+    int reltype;                      /* see above */
+};
+
+struct Symbol {
+    long strpos;                      /* string table position of name */
+    int type;                         /* symbol type - see flags below */
+    long value;                               /* address, or COMMON variable size */
+    long size;                        /* size for data or function exports */
+    long segment;                     /* back-reference used by gsym_reloc */
+    struct Symbol *next;              /* list of globals in each section */
+    struct Symbol *nextfwd;           /* list of unresolved-size symbols */
+    char *name;                               /* for unresolved-size symbols */
+    long symnum;                      /* index into symbol table */
+};
+
+/*
+ * Section IDs - used in Reloc.symbol when negative, and in
+ * Symbol.type when positive.
+ */
+#define SECT_ABS 2                    /* absolute value */
+#define SECT_TEXT 4                   /* text section */
+#define SECT_DATA 6                   /* data section */
+#define SECT_BSS 8                    /* bss section */
+#define SECT_MASK 0xE                 /* mask out any of the above */
+
+/*
+ * More flags used in Symbol.type.
+ */
+#define SYM_GLOBAL 1                  /* it's a global symbol */
+#define SYM_DATA 0x100                /* used for shared libs */
+#define SYM_FUNCTION 0x200            /* used for shared libs */
+#define SYM_WITH_SIZE 0x4000          /* not output; internal only */
+
+/*
+ * Bit more explanation of symbol types: SECT_xxx denotes a local
+ * symbol. SECT_xxx|SYM_GLOBAL denotes a global symbol, defined in
+ * this module. Just SYM_GLOBAL, with zero value, denotes an
+ * external symbol referenced in this module. And just SYM_GLOBAL,
+ * but with a non-zero value, declares a C `common' variable, of
+ * size `value'.
+ */
+
+struct Section {
+    struct SAA *data;
+    unsigned long len, size, nrelocs;
+    long index;
+    struct Reloc *head, **tail;
+    struct Symbol *gsyms, *asym;
+};
+
+static struct Section stext, sdata, sbss;
+
+static struct SAA *syms;
+static unsigned long nsyms;
+
+static struct RAA *bsym;
+
+static struct SAA *strs;
+static unsigned long strslen;
+
+static struct Symbol *fwds;
+
+static FILE *aoutfp;
+static efunc error;
+static evalfunc evaluate;
+
+static int bsd;
+static int is_pic;
+
+static void aout_write(void);
+static void aout_write_relocs(struct Reloc *);
+static void aout_write_syms(void);
+static void aout_sect_write(struct Section *, unsigned char *, unsigned long);
+static void aout_pad_sections(void);
+static void aout_fixup_relocs(struct Section *);
+
+/*
+ * Special section numbers which are used to define special
+ * symbols, which can be used with WRT to provide PIC relocation
+ * types.
+ */
+static long aout_gotpc_sect, aout_gotoff_sect;
+static long aout_got_sect, aout_plt_sect;
+static long aout_sym_sect;
+
+static void aoutg_init(FILE *fp, efunc errfunc, ldfunc ldef, evalfunc eval) {
+    aoutfp = fp;
+    error = errfunc;
+    evaluate = eval;
+    (void) ldef;                      /* placate optimisers */
+    stext.data = saa_init(1L); stext.head = NULL; stext.tail = &stext.head;
+    sdata.data = saa_init(1L); sdata.head = NULL; sdata.tail = &sdata.head;
+    stext.len = stext.size = sdata.len = sdata.size = sbss.len = 0;
+    stext.nrelocs = sdata.nrelocs = 0;
+    stext.gsyms = sdata.gsyms = sbss.gsyms = NULL;
+    stext.index = seg_alloc();
+    sdata.index = seg_alloc();
+    sbss.index = seg_alloc();
+    stext.asym = sdata.asym = sbss.asym = NULL;
+    syms = saa_init((long)sizeof(struct Symbol));
+    nsyms = 0;
+    bsym = raa_init();
+    strs = saa_init(1L);
+    strslen = 0;
+    fwds = NULL;
+}
+
+#ifdef OF_AOUT
+
+static void aout_init(FILE *fp, efunc errfunc, ldfunc ldef, evalfunc eval) {
+    bsd = FALSE;
+    aoutg_init (fp, errfunc, ldef, eval);
+
+    aout_gotpc_sect = aout_gotoff_sect = aout_got_sect =
+       aout_plt_sect = aout_sym_sect = NO_SEG;
+}
+
+#endif
+
+#ifdef OF_AOUTB
+
+extern struct ofmt of_aoutb;
+
+static void aoutb_init(FILE *fp, efunc errfunc, ldfunc ldef, evalfunc eval) {
+    bsd = TRUE;
+    aoutg_init (fp, errfunc, ldef, eval);
+
+    is_pic = 0x00;                    /* may become 0x40 */
+
+    aout_gotpc_sect = seg_alloc();
+    ldef("..gotpc", aout_gotpc_sect+1, 0L, NULL, FALSE,FALSE,&of_aoutb,error);
+    aout_gotoff_sect = seg_alloc();
+    ldef("..gotoff", aout_gotoff_sect+1, 0L,NULL,FALSE,FALSE,&of_aoutb,error);
+    aout_got_sect = seg_alloc();
+    ldef("..got", aout_got_sect+1, 0L, NULL, FALSE,FALSE,&of_aoutb,error);
+    aout_plt_sect = seg_alloc();
+    ldef("..plt", aout_plt_sect+1, 0L, NULL, FALSE,FALSE,&of_aoutb,error);
+    aout_sym_sect = seg_alloc();
+    ldef("..sym", aout_sym_sect+1, 0L, NULL, FALSE,FALSE,&of_aoutb,error);
+}
+
+#endif
+
+static void aout_cleanup(void) {
+    struct Reloc *r;
+
+    aout_pad_sections();
+    aout_fixup_relocs(&stext);
+    aout_fixup_relocs(&sdata);
+    aout_write();
+    fclose (aoutfp);
+    saa_free (stext.data);
+    while (stext.head) {
+       r = stext.head;
+       stext.head = stext.head->next;
+       nasm_free (r);
+    }
+    saa_free (sdata.data);
+    while (sdata.head) {
+       r = sdata.head;
+       sdata.head = sdata.head->next;
+       nasm_free (r);
+    }
+    saa_free (syms);
+    raa_free (bsym);
+    saa_free (strs);
+}
+
+static long aout_section_names (char *name, int pass, int *bits) {
+    /*
+     * Default to 32 bits.
+     */
+    if (!name)
+       *bits = 32;
+
+    if (!name)
+       return stext.index;
+
+    if (!strcmp(name, ".text"))
+       return stext.index;
+    else if (!strcmp(name, ".data"))
+       return sdata.index;
+    else if (!strcmp(name, ".bss"))
+       return sbss.index;
+    else
+       return NO_SEG;
+}
+
+static void aout_deflabel (char *name, long segment, long offset,
+                          int is_global, char *special) {
+    int pos = strslen+4;
+    struct Symbol *sym;
+    int special_used = FALSE;
+
+    if (name[0] == '.' && name[1] == '.' && name[2] != '@') {
+       /*
+        * This is a NASM special symbol. We never allow it into
+        * the a.out symbol table, even if it's a valid one. If it
+        * _isn't_ a valid one, we should barf immediately.
+        */
+       if (strcmp(name, "..gotpc") && strcmp(name, "..gotoff") &&
+           strcmp(name, "..got") && strcmp(name, "..plt") &&
+           strcmp(name, "..sym"))
+           error (ERR_NONFATAL, "unrecognised special symbol `%s'", name);
+       return;
+    }
+
+    if (is_global == 3) {
+       struct Symbol **s;
+       /*
+        * Fix up a forward-reference symbol size from the first
+        * pass.
+        */
+       for (s = &fwds; *s; s = &(*s)->nextfwd)
+           if (!strcmp((*s)->name, name)) {
+               struct tokenval tokval;
+               expr *e;
+               char *p = special;
+
+               while (*p && !isspace(*p)) p++;
+               while (*p && isspace(*p)) p++;
+               stdscan_reset();
+               stdscan_bufptr = p;
+               tokval.t_type = TOKEN_INVALID;
+               e = evaluate(stdscan, NULL, &tokval, NULL, 1, error, NULL);
+               if (e) {
+                   if (!is_simple(e))
+                       error (ERR_NONFATAL, "cannot use relocatable"
+                              " expression as symbol size");
+                   else
+                       (*s)->size = reloc_value(e);
+               }
+
+               /*
+                * Remove it from the list of unresolved sizes.
+                */
+               nasm_free ((*s)->name);
+               *s = (*s)->nextfwd;
+               return;
+           }
+       return;                        /* it wasn't an important one */
+    }
+
+    saa_wbytes (strs, name, (long)(1+strlen(name)));
+    strslen += 1+strlen(name);
+
+    sym = saa_wstruct (syms);
+
+    sym->strpos = pos;
+    sym->type = is_global ? SYM_GLOBAL : 0;
+    sym->segment = segment;
+    if (segment == NO_SEG)
+       sym->type |= SECT_ABS;
+    else if (segment == stext.index) {
+       sym->type |= SECT_TEXT;
+       if (is_global) {
+           sym->next = stext.gsyms;
+           stext.gsyms = sym;
+       } else if (!stext.asym)
+           stext.asym = sym;
+    } else if (segment == sdata.index) {
+       sym->type |= SECT_DATA;
+       if (is_global) {
+           sym->next = sdata.gsyms;
+           sdata.gsyms = sym;
+       } else if (!sdata.asym)
+           sdata.asym = sym;
+    } else if (segment == sbss.index) {
+       sym->type |= SECT_BSS;
+       if (is_global) {
+           sym->next = sbss.gsyms;
+           sbss.gsyms = sym;
+       } else if (!sbss.asym)
+           sbss.asym = sym;
+    } else
+       sym->type = SYM_GLOBAL;
+    if (is_global == 2)
+       sym->value = offset;
+    else
+       sym->value = (sym->type == SYM_GLOBAL ? 0 : offset);
+
+    if (is_global && sym->type != SYM_GLOBAL) {
+       /*
+        * Global symbol exported _from_ this module. We must check
+        * the special text for type information.
+        */
+
+       if (special) {
+           int n = strcspn(special, " ");
+
+           if (!nasm_strnicmp(special, "function", n))
+               sym->type |= SYM_FUNCTION;
+           else if (!nasm_strnicmp(special, "data", n) ||
+                    !nasm_strnicmp(special, "object", n))
+               sym->type |= SYM_DATA;
+           else
+               error(ERR_NONFATAL, "unrecognised symbol type `%.*s'",
+                     n, special);
+           if (special[n]) {
+               struct tokenval tokval;
+               expr *e;
+               int fwd = FALSE;
+
+               if (!bsd) {
+                   error(ERR_NONFATAL, "Linux a.out does not support"
+                         " symbol size information");
+               } else {
+                   while (special[n] && isspace(special[n]))
+                       n++;
+                   /*
+                    * We have a size expression; attempt to
+                    * evaluate it.
+                    */
+                   sym->type |= SYM_WITH_SIZE;
+                   stdscan_reset();
+                   stdscan_bufptr = special+n;
+                   tokval.t_type = TOKEN_INVALID;
+                   e = evaluate(stdscan, NULL, &tokval, &fwd, 0, error, NULL);
+                   if (fwd) {
+                       sym->nextfwd = fwds;
+                       fwds = sym;
+                       sym->name = nasm_strdup(name);
+                   } else if (e) {
+                       if (!is_simple(e))
+                           error (ERR_NONFATAL, "cannot use relocatable"
+                                  " expression as symbol size");
+                       else
+                           sym->size = reloc_value(e);
+                   }
+               }
+           }
+           special_used = TRUE;
+       }
+    }
+
+    /*
+     * define the references from external-symbol segment numbers
+     * to these symbol records.
+     */
+    if (segment != NO_SEG && segment != stext.index &&
+       segment != sdata.index && segment != sbss.index)
+       bsym = raa_write (bsym, segment, nsyms);
+    sym->symnum = nsyms;
+
+    nsyms++;
+    if (sym->type & SYM_WITH_SIZE)
+       nsyms++;                       /* and another for the size */
+
+    if (special && !special_used)
+       error(ERR_NONFATAL, "no special symbol features supported here");
+}
+
+static void aout_add_reloc (struct Section *sect, long segment,
+                           int reltype, int bytes) {
+    struct Reloc *r;
+
+    r = *sect->tail = nasm_malloc(sizeof(struct Reloc));
+    sect->tail = &r->next;
+    r->next = NULL;
+
+    r->address = sect->len;
+    r->symbol = (segment == NO_SEG ? -SECT_ABS :
+                segment == stext.index ? -SECT_TEXT :
+                segment == sdata.index ? -SECT_DATA :
+                segment == sbss.index ? -SECT_BSS :
+                raa_read(bsym, segment));
+    r->reltype = reltype;
+    if (r->symbol >= 0)
+       r->reltype |= RELTYPE_SYMFLAG;
+    r->bytes = bytes;
+
+    sect->nrelocs++;
+}
+
+/*
+ * This routine deals with ..got and ..sym relocations: the more
+ * complicated kinds. In shared-library writing, some relocations
+ * with respect to global symbols must refer to the precise symbol
+ * rather than referring to an offset from the base of the section
+ * _containing_ the symbol. Such relocations call to this routine,
+ * which searches the symbol list for the symbol in question.
+ *
+ * RELTYPE_GOT references require the _exact_ symbol address to be
+ * used; RELTYPE_ABSOLUTE references can be at an offset from the
+ * symbol. The boolean argument `exact' tells us this.
+ *
+ * Return value is the adjusted value of `addr', having become an
+ * offset from the symbol rather than the section. Should always be
+ * zero when returning from an exact call.
+ *
+ * Limitation: if you define two symbols at the same place,
+ * confusion will occur.
+ *
+ * Inefficiency: we search, currently, using a linked list which
+ * isn't even necessarily sorted.
+ */
+static long aout_add_gsym_reloc (struct Section *sect,
+                                long segment, long offset,
+                                int type, int bytes, int exact) {
+    struct Symbol *sym, *sm, *shead;
+    struct Reloc *r;
+
+    /*
+     * First look up the segment to find whether it's text, data,
+     * bss or an external symbol.
+     */
+    shead = NULL;
+    if (segment == stext.index)
+       shead = stext.gsyms;
+    else if (segment == sdata.index)
+       shead = sdata.gsyms;
+    else if (segment == sbss.index)
+       shead = sbss.gsyms;
+    if (!shead) {
+       if (exact && offset != 0)
+           error (ERR_NONFATAL, "unable to find a suitable global symbol"
+                  " for this reference");
+       else
+           aout_add_reloc (sect, segment, type, bytes);
+       return offset;
+    }
+
+    if (exact) {
+       /*
+        * Find a symbol pointing _exactly_ at this one.
+        */
+       for (sym = shead; sym; sym = sym->next)
+           if (sym->value == offset)
+               break;
+    } else {
+       /*
+        * Find the nearest symbol below this one.
+        */
+       sym = NULL;
+       for (sm = shead; sm; sm = sm->next)
+           if (sm->value <= offset && (!sym || sm->value > sym->value))
+               sym = sm;
+    }
+    if (!sym && exact) {
+       error (ERR_NONFATAL, "unable to find a suitable global symbol"
+              " for this reference");
+       return 0;
+    }
+
+    r = *sect->tail = nasm_malloc(sizeof(struct Reloc));
+    sect->tail = &r->next;
+    r->next = NULL;
+
+    r->address = sect->len;
+    r->symbol = sym->symnum;
+    r->reltype = type | RELTYPE_SYMFLAG;
+    r->bytes = bytes;
+
+    sect->nrelocs++;
+
+    return offset - sym->value;
+}
+
+/*
+ * This routine deals with ..gotoff relocations. These _must_ refer
+ * to a symbol, due to a perversity of *BSD's PIC implementation,
+ * and it must be a non-global one as well; so we store `asym', the
+ * first nonglobal symbol defined in each section, and always work
+ * from that. Relocation type is always RELTYPE_GOTOFF.
+ *
+ * Return value is the adjusted value of `addr', having become an
+ * offset from the `asym' symbol rather than the section.
+ */
+static long aout_add_gotoff_reloc (struct Section *sect, long segment,
+                                  long offset, int bytes) {
+    struct Reloc *r;
+    struct Symbol *asym;
+
+    /*
+     * First look up the segment to find whether it's text, data,
+     * bss or an external symbol.
+     */
+    asym = NULL;
+    if (segment == stext.index)
+       asym = stext.asym;
+    else if (segment == sdata.index)
+       asym = sdata.asym;
+    else if (segment == sbss.index)
+       asym = sbss.asym;
+    if (!asym)
+       error (ERR_NONFATAL, "`..gotoff' relocations require a non-global"
+              " symbol in the section");
+
+    r = *sect->tail = nasm_malloc(sizeof(struct Reloc));
+    sect->tail = &r->next;
+    r->next = NULL;
+
+    r->address = sect->len;
+    r->symbol = asym->symnum;
+    r->reltype = RELTYPE_GOTOFF;
+    r->bytes = bytes;
+
+    sect->nrelocs++;
+
+    return offset - asym->value;
+}
+
+static void aout_out (long segto, void *data, unsigned long type,
+                     long segment, long wrt) {
+    struct Section *s;
+    long realbytes = type & OUT_SIZMASK;
+    long addr;
+    unsigned char mydata[4], *p;
+
+    type &= OUT_TYPMASK;
+
+    /*
+     * handle absolute-assembly (structure definitions)
+     */
+    if (segto == NO_SEG) {
+       if (type != OUT_RESERVE)
+           error (ERR_NONFATAL, "attempt to assemble code in [ABSOLUTE]"
+                  " space");
+       return;
+    }
+
+    if (segto == stext.index)
+       s = &stext;
+    else if (segto == sdata.index)
+       s = &sdata;
+    else if (segto == sbss.index)
+       s = NULL;
+    else {
+       error(ERR_WARNING, "attempt to assemble code in"
+             " segment %d: defaulting to `.text'", segto);
+       s = &stext;
+    }
+
+    if (!s && type != OUT_RESERVE) {
+       error(ERR_WARNING, "attempt to initialise memory in the"
+             " BSS section: ignored");
+       if (type == OUT_REL2ADR)
+           realbytes = 2;
+       else if (type == OUT_REL4ADR)
+           realbytes = 4;
+       sbss.len += realbytes;
+       return;
+    }
+
+    if (type == OUT_RESERVE) {
+       if (s) {
+           error(ERR_WARNING, "uninitialised space declared in"
+                 " %s section: zeroing",
+                 (segto == stext.index ? "code" : "data"));
+           aout_sect_write (s, NULL, realbytes);
+       } else
+           sbss.len += realbytes;
+    } else if (type == OUT_RAWDATA) {
+       if (segment != NO_SEG)
+           error(ERR_PANIC, "OUT_RAWDATA with other than NO_SEG");
+       aout_sect_write (s, data, realbytes);
+    } else if (type == OUT_ADDRESS) {
+       addr = *(long *)data;
+       if (segment != NO_SEG) {
+           if (segment % 2) {
+               error(ERR_NONFATAL, "a.out format does not support"
+                     " segment base references");
+           } else {
+               if (wrt == NO_SEG) {
+                   aout_add_reloc (s, segment, RELTYPE_ABSOLUTE, realbytes);
+               } else if (!bsd) {
+                   error (ERR_NONFATAL, "Linux a.out format does not support"
+                          " any use of WRT");
+                   wrt = NO_SEG;      /* we can at least _try_ to continue */
+               } else if (wrt == aout_gotpc_sect+1) {
+                   is_pic = 0x40;
+                   aout_add_reloc (s, segment, RELTYPE_GOTPC, realbytes);
+               } else if (wrt == aout_gotoff_sect+1) {
+                   is_pic = 0x40;
+                   addr = aout_add_gotoff_reloc (s, segment,
+                                                 addr, realbytes);
+               } else if (wrt == aout_got_sect+1) {
+                   is_pic = 0x40;
+                   addr = aout_add_gsym_reloc (s, segment, addr, RELTYPE_GOT,
+                                               realbytes, TRUE);
+               } else if (wrt == aout_sym_sect+1) {
+                   addr = aout_add_gsym_reloc (s, segment, addr,
+                                               RELTYPE_ABSOLUTE, realbytes,
+                                               FALSE);
+               } else if (wrt == aout_plt_sect+1) {
+                   is_pic = 0x40;
+                   error(ERR_NONFATAL, "a.out format cannot produce non-PC-"
+                         "relative PLT references");
+               } else {
+                   error (ERR_NONFATAL, "a.out format does not support this"
+                          " use of WRT");
+                   wrt = NO_SEG;      /* we can at least _try_ to continue */
+               }
+           }
+       }
+       p = mydata;
+       if (realbytes == 2)
+           WRITESHORT (p, addr);
+       else
+           WRITELONG (p, addr);
+       aout_sect_write (s, mydata, realbytes);
+    } else if (type == OUT_REL2ADR) {
+       if (segment == segto)
+           error(ERR_PANIC, "intra-segment OUT_REL2ADR");
+       if (segment != NO_SEG && segment % 2) {
+           error(ERR_NONFATAL, "a.out format does not support"
+                 " segment base references");
+       } else {
+           if (wrt == NO_SEG) {
+               aout_add_reloc (s, segment, RELTYPE_RELATIVE, 2);
+           } else if (!bsd) {
+               error (ERR_NONFATAL, "Linux a.out format does not support"
+                      " any use of WRT");
+               wrt = NO_SEG;      /* we can at least _try_ to continue */
+           } else if (wrt == aout_plt_sect+1) {
+               is_pic = 0x40;
+               aout_add_reloc (s, segment, RELTYPE_PLT, 2);
+           } else if (wrt == aout_gotpc_sect+1 ||
+                      wrt == aout_gotoff_sect+1 ||
+                      wrt == aout_got_sect+1) {
+               error(ERR_NONFATAL, "a.out format cannot produce PC-"
+                     "relative GOT references");
+           } else {
+               error (ERR_NONFATAL, "a.out format does not support this"
+                      " use of WRT");
+               wrt = NO_SEG;      /* we can at least _try_ to continue */
+           }
+       }
+       p = mydata;
+       WRITESHORT (p, *(long*)data-(realbytes + s->len));
+       aout_sect_write (s, mydata, 2L);
+    } else if (type == OUT_REL4ADR) {
+       if (segment == segto)
+           error(ERR_PANIC, "intra-segment OUT_REL4ADR");
+       if (segment != NO_SEG && segment % 2) {
+           error(ERR_NONFATAL, "a.out format does not support"
+                 " segment base references");
+       } else {
+           if (wrt == NO_SEG) {
+               aout_add_reloc (s, segment, RELTYPE_RELATIVE, 4);
+           } else if (!bsd) {
+               error (ERR_NONFATAL, "Linux a.out format does not support"
+                      " any use of WRT");
+               wrt = NO_SEG;      /* we can at least _try_ to continue */
+           } else if (wrt == aout_plt_sect+1) {
+               is_pic = 0x40;
+               aout_add_reloc (s, segment, RELTYPE_PLT, 4);
+           } else if (wrt == aout_gotpc_sect+1 ||
+                      wrt == aout_gotoff_sect+1 ||
+                      wrt == aout_got_sect+1) {
+               error(ERR_NONFATAL, "a.out format cannot produce PC-"
+                     "relative GOT references");
+           } else {
+               error (ERR_NONFATAL, "a.out format does not support this"
+                      " use of WRT");
+               wrt = NO_SEG;      /* we can at least _try_ to continue */
+           }
+       }
+       p = mydata;
+       WRITELONG (p, *(long*)data-(realbytes + s->len));
+       aout_sect_write (s, mydata, 4L);
+    }
+}
+
+static void aout_pad_sections(void) {
+    static unsigned char pad[] = { 0x90, 0x90, 0x90, 0x90 };
+    /*
+     * Pad each of the text and data sections with NOPs until their
+     * length is a multiple of four. (NOP == 0x90.) Also increase
+     * the length of the BSS section similarly.
+     */
+    aout_sect_write (&stext, pad, (-(long)stext.len) & 3);
+    aout_sect_write (&sdata, pad, (-(long)sdata.len) & 3);
+    sbss.len = (sbss.len + 3) & ~3;
+}
+
+/*
+ * a.out files have the curious property that all references to
+ * things in the data or bss sections are done by addresses which
+ * are actually relative to the start of the _text_ section, in the
+ * _file_. (No relation to what happens after linking. No idea why
+ * this should be so. It's very strange.) So we have to go through
+ * the relocation table, _after_ the final size of each section is
+ * known, and fix up the relocations pointed to.
+ */
+static void aout_fixup_relocs(struct Section *sect) {
+    struct Reloc *r;
+
+    saa_rewind (sect->data);
+    for (r = sect->head; r; r = r->next) {
+       unsigned char *p, *q, blk[4];
+       long l;
+
+       saa_fread (sect->data, r->address, blk, (long)r->bytes);
+       p = q = blk;
+       l = *p++;
+       if (r->bytes > 1) {
+           l += ((long)*p++) << 8;
+           if (r->bytes == 4) {
+               l += ((long)*p++) << 16;
+               l += ((long)*p++) << 24;
+           }
+       }
+       if (r->symbol == -SECT_DATA)
+           l += stext.len;
+       else if (r->symbol == -SECT_BSS)
+           l += stext.len + sdata.len;
+       if (r->bytes == 4)
+           WRITELONG(q, l);
+       else if (r->bytes == 2)
+           WRITESHORT(q, l);
+       else
+           *q++ = l & 0xFF;
+       saa_fwrite (sect->data, r->address, blk, (long)r->bytes);
+    }
+}
+
+static void aout_write(void) {
+    /*
+     * Emit the a.out header.
+     */
+    /* OMAGIC, M_386 or MID_I386, no flags */
+    fwritelong (bsd ? 0x07018600 | is_pic : 0x640107L, aoutfp);
+    fwritelong (stext.len, aoutfp);
+    fwritelong (sdata.len, aoutfp);
+    fwritelong (sbss.len, aoutfp);
+    fwritelong (nsyms * 12, aoutfp);   /* length of symbol table */
+    fwritelong (0L, aoutfp);          /* object files have no entry point */
+    fwritelong (stext.nrelocs * 8, aoutfp);   /* size of text relocs */
+    fwritelong (sdata.nrelocs * 8, aoutfp);   /* size of data relocs */
+
+    /*
+     * Write out the code section and the data section.
+     */
+    saa_fpwrite (stext.data, aoutfp);
+    saa_fpwrite (sdata.data, aoutfp);
+
+    /*
+     * Write out the relocations.
+     */
+    aout_write_relocs (stext.head);
+    aout_write_relocs (sdata.head);
+
+    /*
+     * Write the symbol table.
+     */
+    aout_write_syms ();
+
+    /*
+     * And the string table.
+     */
+    fwritelong (strslen+4, aoutfp);    /* length includes length count */
+    saa_fpwrite (strs, aoutfp);
+}
+
+static void aout_write_relocs (struct Reloc *r) {
+    while (r) {
+       unsigned long word2;
+
+       fwritelong (r->address, aoutfp);
+
+       if (r->symbol >= 0)
+           word2 = r->symbol;
+       else
+           word2 = -r->symbol;
+       word2 |= r->reltype << 24;
+       word2 |= (r->bytes == 1 ? 0 :
+                 r->bytes == 2 ? 0x2000000L : 0x4000000L);
+       fwritelong (word2, aoutfp);
+
+       r = r->next;
+    }
+}
+
+static void aout_write_syms (void) {
+    int i;
+
+    saa_rewind (syms);
+    for (i=0; i<nsyms; i++) {
+       struct Symbol *sym = saa_rstruct(syms);
+       fwritelong (sym->strpos, aoutfp);
+       fwritelong ((long)sym->type & ~SYM_WITH_SIZE, aoutfp);
+       /*
+        * Fix up the symbol value now we know the final section
+        * sizes.
+        */
+       if ((sym->type & SECT_MASK) == SECT_DATA)
+           sym->value += stext.len;
+       if ((sym->type & SECT_MASK) == SECT_BSS)
+           sym->value += stext.len + sdata.len;
+       fwritelong (sym->value, aoutfp);
+       /*
+        * Output a size record if necessary.
+        */
+       if (sym->type & SYM_WITH_SIZE) {
+           fwritelong(sym->strpos, aoutfp);
+           fwritelong(0x0DL, aoutfp);  /* special value: means size */
+           fwritelong(sym->size, aoutfp);
+           i++;                       /* use up another of `nsyms' */
+       }
+    }
+}
+
+static void aout_sect_write (struct Section *sect,
+                            unsigned char *data, unsigned long len) {
+    saa_wbytes (sect->data, data, len);
+    sect->len += len;
+}
+
+static long aout_segbase (long segment) {
+    return segment;
+}
+
+static int aout_directive (char *directive, char *value, int pass) {
+    return 0;
+}
+
+static void aout_filename (char *inname, char *outname, efunc error) {
+    standard_extension (inname, outname, ".o", error);
+}
+
+static char *aout_stdmac[] = {
+    "%define __SECT__ [section .text]",
+    NULL
+};
+
+#endif /* OF_AOUT || OF_AOUTB */
+
+#ifdef OF_AOUT
+
+struct ofmt of_aout = {
+    "Linux a.out object files",
+    "aout",
+    aout_stdmac,
+    aout_init,
+    aout_out,
+    aout_deflabel,
+    aout_section_names,
+    aout_segbase,
+    aout_directive,
+    aout_filename,
+    aout_cleanup
+};
+
+#endif
+
+#ifdef OF_AOUTB
+
+struct ofmt of_aoutb = {
+    "NetBSD/FreeBSD a.out object files",
+    "aoutb",
+    aout_stdmac,
+    aoutb_init,
+    aout_out,
+    aout_deflabel,
+    aout_section_names,
+    aout_segbase,
+    aout_directive,
+    aout_filename,
+    aout_cleanup
+};
+
+#endif
diff --git a/i386/nasm/outas86.c b/i386/nasm/outas86.c
new file mode 100644 (file)
index 0000000..553920d
--- /dev/null
@@ -0,0 +1,582 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
+ * Reserved.  This file contains Original Code and/or Modifications of
+ * Original Code as defined in and that are subject to the Apple Public
+ * Source License Version 1.1 (the "License").  You may not use this file
+ * except in compliance with the License.  Please obtain a copy of the
+ * License at http://www.apple.com/publicsource and read it before using
+ * this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/* outas86.c   output routines for the Netwide Assembler to produce
+ *             Linux as86 (bin86-0.3) object files
+ *
+ * The Netwide Assembler is copyright (C) 1996 Simon Tatham and
+ * Julian Hall. All rights reserved. The software is
+ * redistributable under the licence given in the file "Licence"
+ * distributed in the NASM archive.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+
+#include "nasm.h"
+#include "nasmlib.h"
+#include "outform.h"
+
+#ifdef OF_AS86
+
+struct Piece {
+    struct Piece *next;
+    int type;                         /* 0 = absolute, 1 = seg, 2 = sym */
+    long offset;                      /* relative offset */
+    int number;                               /* symbol/segment number (4=bss) */
+    long bytes;                               /* size of reloc or of absolute data */
+    int relative;                     /* TRUE or FALSE */
+};
+
+struct Symbol {
+    long strpos;                      /* string table position of name */
+    int flags;                        /* symbol flags */
+    int segment;                      /* 4=bss at this point */
+    long value;                               /* address, or COMMON variable size */
+};
+
+/*
+ * Section IDs - used in Piece.number and Symbol.segment.
+ */
+#define SECT_TEXT 0                   /* text section */
+#define SECT_DATA 3                   /* data section */
+#define SECT_BSS 4                    /* bss section */
+
+/*
+ * Flags used in Symbol.flags.
+ */
+#define SYM_ENTRY (1<<8)
+#define SYM_EXPORT (1<<7)
+#define SYM_IMPORT (1<<6)
+#define SYM_ABSOLUTE (1<<4)
+
+struct Section {
+    struct SAA *data;
+    unsigned long datalen, size, len;
+    long index;
+    struct Piece *head, *last, **tail;
+};
+
+static char as86_module[FILENAME_MAX];
+
+static struct Section stext, sdata;
+static unsigned long bsslen;
+static long bssindex;
+
+static struct SAA *syms;
+static unsigned long nsyms;
+
+static struct RAA *bsym;
+
+static struct SAA *strs;
+static unsigned long strslen;
+
+static int as86_reloc_size;
+
+static FILE *as86fp;
+static efunc error;
+
+static void as86_write(void);
+static void as86_write_section (struct Section *, int);
+static int as86_add_string (char *name);
+static void as86_sect_write(struct Section *, unsigned char *, unsigned long);
+
+static void as86_init(FILE *fp, efunc errfunc, ldfunc ldef, evalfunc eval) {
+    as86fp = fp;
+    error = errfunc;
+    (void) ldef;                      /* placate optimisers */
+    stext.data = saa_init(1L); stext.datalen = 0L;
+    stext.head = stext.last = NULL;
+    stext.tail = &stext.head;
+    sdata.data = saa_init(1L); sdata.datalen = 0L;
+    sdata.head = sdata.last = NULL;
+    sdata.tail = &sdata.head;
+    bsslen =
+       stext.len = stext.datalen = stext.size =
+       sdata.len = sdata.datalen = sdata.size = 0;
+    stext.index = seg_alloc();
+    sdata.index = seg_alloc();
+    bssindex = seg_alloc();
+    syms = saa_init((long)sizeof(struct Symbol));
+    nsyms = 0;
+    bsym = raa_init();
+    strs = saa_init(1L);
+    strslen = 0;
+
+    as86_add_string (as86_module);
+}
+
+static void as86_cleanup(void) {
+    struct Piece *p;
+
+    as86_write();
+    fclose (as86fp);
+    saa_free (stext.data);
+    while (stext.head) {
+       p = stext.head;
+       stext.head = stext.head->next;
+       nasm_free (p);
+    }
+    saa_free (sdata.data);
+    while (sdata.head) {
+       p = sdata.head;
+       sdata.head = sdata.head->next;
+       nasm_free (p);
+    }
+    saa_free (syms);
+    raa_free (bsym);
+    saa_free (strs);
+}
+
+static long as86_section_names (char *name, int pass, int *bits) {
+    /*
+     * Default is 16 bits.
+     */
+    if (!name)
+       *bits = 16;
+
+    if (!name)
+       return stext.index;
+
+    if (!strcmp(name, ".text"))
+       return stext.index;
+    else if (!strcmp(name, ".data"))
+       return sdata.index;
+    else if (!strcmp(name, ".bss"))
+       return bssindex;
+    else
+       return NO_SEG;
+}
+
+static int as86_add_string (char *name) {
+    int pos = strslen;
+    int length = strlen(name);
+
+    saa_wbytes (strs, name, (long)(length+1));
+    strslen += 1+length;
+
+    return pos;
+}
+
+static void as86_deflabel (char *name, long segment, long offset,
+                          int is_global, char *special) {
+    struct Symbol *sym;
+
+    if (special)
+       error (ERR_NONFATAL, "as86 format does not support any"
+              " special symbol types");
+
+    if (name[0] == '.' && name[1] == '.' && name[2] != '@') {
+       error (ERR_NONFATAL, "unrecognised special symbol `%s'", name);
+       return;
+    }
+
+    sym = saa_wstruct (syms);
+
+    sym->strpos = as86_add_string (name);
+    sym->flags = 0;
+    if (segment == NO_SEG)
+       sym->flags |= SYM_ABSOLUTE, sym->segment = 0;
+    else if (segment == stext.index)
+       sym->segment = SECT_TEXT;
+    else if (segment == sdata.index)
+       sym->segment = SECT_DATA;
+    else if (segment == bssindex)
+       sym->segment = SECT_BSS;
+    else {
+       sym->flags |= SYM_IMPORT;
+       sym->segment = 15;
+    }
+
+    if (is_global == 2)
+       sym->segment = 3;       /* already have IMPORT */
+
+    if (is_global && !(sym->flags & SYM_IMPORT))
+       sym->flags |= SYM_EXPORT;
+
+    sym->value = offset;
+
+    /*
+     * define the references from external-symbol segment numbers
+     * to these symbol records.
+     */
+    if (segment != NO_SEG && segment != stext.index &&
+       segment != sdata.index && segment != bssindex)
+       bsym = raa_write (bsym, segment, nsyms);
+
+    nsyms++;
+}
+
+static void as86_add_piece (struct Section *sect, int type, long offset,
+                           long segment, long bytes, int relative) {
+    struct Piece *p;
+
+    sect->len += bytes;
+
+    if (type == 0 && sect->last && sect->last->type == 0) {
+       sect->last->bytes += bytes;
+       return;
+    }
+
+    p = sect->last = *sect->tail = nasm_malloc(sizeof(struct Piece));
+    sect->tail = &p->next;
+    p->next = NULL;
+
+    p->type = type;
+    p->offset = offset;
+    p->bytes = bytes;
+    p->relative = relative;
+
+    if (type == 1 && segment == stext.index)
+       p->number = SECT_TEXT;
+    else if (type == 1 && segment == sdata.index)
+       p->number = SECT_DATA;
+    else if (type == 1 && segment == bssindex)
+       p->number = SECT_BSS;
+    else if (type == 1)
+       p->number = raa_read (bsym, segment), p->type = 2;
+}
+
+static void as86_out (long segto, void *data, unsigned long type,
+                     long segment, long wrt) {
+    struct Section *s;
+    long realbytes = type & OUT_SIZMASK;
+    long offset;
+    unsigned char mydata[4], *p;
+
+    if (wrt != NO_SEG) {
+       wrt = NO_SEG;                  /* continue to do _something_ */
+       error (ERR_NONFATAL, "WRT not supported by as86 output format");
+    }
+
+    type &= OUT_TYPMASK;
+
+    /*
+     * handle absolute-assembly (structure definitions)
+     */
+    if (segto == NO_SEG) {
+       if (type != OUT_RESERVE)
+           error (ERR_NONFATAL, "attempt to assemble code in [ABSOLUTE]"
+                  " space");
+       return;
+    }
+
+    if (segto == stext.index)
+       s = &stext;
+    else if (segto == sdata.index)
+       s = &sdata;
+    else if (segto == bssindex)
+       s = NULL;
+    else {
+       error(ERR_WARNING, "attempt to assemble code in"
+             " segment %d: defaulting to `.text'", segto);
+       s = &stext;
+    }
+
+    if (!s && type != OUT_RESERVE) {
+       error(ERR_WARNING, "attempt to initialise memory in the"
+             " BSS section: ignored");
+       if (type == OUT_REL2ADR)
+           realbytes = 2;
+       else if (type == OUT_REL4ADR)
+           realbytes = 4;
+       bsslen += realbytes;
+       return;
+    }
+
+    if (type == OUT_RESERVE) {
+       if (s) {
+           error(ERR_WARNING, "uninitialised space declared in"
+                 " %s section: zeroing",
+                 (segto == stext.index ? "code" : "data"));
+           as86_sect_write (s, NULL, realbytes);
+           as86_add_piece (s, 0, 0L, 0L, realbytes, 0);
+       } else
+           bsslen += realbytes;
+    } else if (type == OUT_RAWDATA) {
+       if (segment != NO_SEG)
+           error(ERR_PANIC, "OUT_RAWDATA with other than NO_SEG");
+       as86_sect_write (s, data, realbytes);
+       as86_add_piece (s, 0, 0L, 0L, realbytes, 0);
+    } else if (type == OUT_ADDRESS) {
+       if (segment != NO_SEG) {
+           if (segment % 2) {
+               error(ERR_NONFATAL, "as86 format does not support"
+                     " segment base references");
+           } else{
+               offset = * (long *) data;
+               as86_add_piece (s, 1, offset, segment, realbytes, 0);
+           }
+       } else {
+           p = mydata;
+           WRITELONG (p, * (long *) data);
+           as86_sect_write (s, data, realbytes);
+           as86_add_piece (s, 0, 0L, 0L, realbytes, 0);
+       }
+    } else if (type == OUT_REL2ADR) {
+       if (segment == segto)
+           error(ERR_PANIC, "intra-segment OUT_REL2ADR");
+       if (segment != NO_SEG) {
+           if (segment % 2) {
+               error(ERR_NONFATAL, "as86 format does not support"
+                     " segment base references");
+           } else {
+               offset = * (long *) data;
+               as86_add_piece (s, 1, offset-realbytes+2, segment, 2L, 1);
+           }
+       }
+    } else if (type == OUT_REL4ADR) {
+       if (segment == segto)
+           error(ERR_PANIC, "intra-segment OUT_REL4ADR");
+       if (segment != NO_SEG) {
+           if (segment % 2) {
+               error(ERR_NONFATAL, "as86 format does not support"
+                     " segment base references");
+           } else {
+               offset = * (long *) data;
+               as86_add_piece (s, 1, offset-realbytes+4, segment, 4L, 1);
+           }
+       }
+    }
+}
+
+static void as86_write(void) {
+    int i;
+    long symlen, seglen, segsize;
+
+    /*
+     * First, go through the symbol records working out how big
+     * each will be. Also fix up BSS references at this time, and
+     * set the flags words up completely.
+     */
+    symlen = 0;
+    saa_rewind (syms);
+    for (i = 0; i < nsyms; i++) {
+       struct Symbol *sym = saa_rstruct (syms);
+       if (sym->segment == SECT_BSS)
+           sym->segment = SECT_DATA, sym->value += sdata.len;
+       sym->flags |= sym->segment;
+       if (sym->value == 0)
+           sym->flags |= 0 << 14, symlen += 4;
+       else if (sym->value >= 0 && sym->value <= 255)
+           sym->flags |= 1 << 14, symlen += 5;
+       else if (sym->value >= 0 && sym->value <= 65535L)
+           sym->flags |= 2 << 14, symlen += 6;
+       else
+           sym->flags |= 3 << 14, symlen += 8;
+    }
+
+    /*
+     * Now do the same for the segments, and get the segment size
+     * descriptor word at the same time.
+     */
+    seglen = segsize = 0;
+    if ((unsigned long) stext.len > 65535L)
+       segsize |= 0x03000000L, seglen += 4;
+    else
+       segsize |= 0x02000000L, seglen += 2;
+    if ((unsigned long) sdata.len > 65535L)
+       segsize |= 0xC0000000L, seglen += 4;
+    else
+       segsize |= 0x80000000L, seglen += 2;
+
+    /*
+     * Emit the as86 header.
+     */
+    fwritelong (0x000186A3L, as86fp);
+    fputc (0x2A, as86fp);
+    fwritelong (27+symlen+seglen+strslen, as86fp);   /* header length */
+    fwritelong (stext.len+sdata.len, as86fp);
+    fwriteshort (strslen, as86fp);
+    fwriteshort (0, as86fp);          /* class = revision = 0 */
+    fwritelong (0x55555555L, as86fp);   /* segment max sizes: always this */
+    fwritelong (segsize, as86fp);      /* segment size descriptors */
+    if (segsize & 0x01000000L)
+       fwritelong (stext.len, as86fp);
+    else
+       fwriteshort (stext.len, as86fp);
+    if (segsize & 0x40000000L)
+       fwritelong (sdata.len, as86fp);
+    else
+       fwriteshort (sdata.len, as86fp);
+    fwriteshort (nsyms, as86fp);
+
+    /*
+     * Write the symbol table.
+     */
+    saa_rewind (syms);
+    for (i = 0; i < nsyms; i++) {
+       struct Symbol *sym = saa_rstruct (syms);
+       fwriteshort (sym->strpos, as86fp);
+       fwriteshort (sym->flags, as86fp);
+       switch (sym->flags & (3<<14)) {
+         case 0<<14: break;
+         case 1<<14: fputc (sym->value, as86fp); break;
+         case 2<<14: fwriteshort (sym->value, as86fp); break;
+         case 3<<14: fwritelong (sym->value, as86fp); break;
+       }
+    }
+
+    /*
+     * Write out the string table.
+     */
+    saa_fpwrite (strs, as86fp);
+
+    /*
+     * Write the program text.
+     */
+    as86_reloc_size = -1;
+    as86_write_section (&stext, SECT_TEXT);
+    as86_write_section (&sdata, SECT_DATA);
+    fputc (0, as86fp);                /* termination */
+}
+
+static void as86_set_rsize (int size) {
+    if (as86_reloc_size != size) {
+       switch (as86_reloc_size = size) {
+         case 1: fputc (0x01, as86fp); break;
+         case 2: fputc (0x02, as86fp); break;
+         case 4: fputc (0x03, as86fp); break;
+         default: error (ERR_PANIC, "bizarre relocation size %d", size);
+       }
+    }
+}
+
+static void as86_write_section (struct Section *sect, int index) {
+    struct Piece *p;
+    unsigned long s;
+    long length;
+
+    fputc (0x20+index, as86fp);               /* select the right section */
+
+    saa_rewind (sect->data);
+
+    for (p = sect->head; p; p = p->next)
+       switch (p->type) {
+         case 0:
+           /*
+            * Absolute data. Emit it in chunks of at most 64
+            * bytes.
+            */
+           length = p->bytes;
+           do {
+               char buf[64];
+               long tmplen = (length > 64 ? 64 : length);
+               fputc (0x40 | (tmplen & 0x3F), as86fp);
+               saa_rnbytes (sect->data, buf, tmplen);
+               fwrite (buf, 1, tmplen, as86fp);
+               length -= tmplen;
+           } while (length > 0);
+           break;
+         case 1:
+           /*
+            * A segment-type relocation. First fix up the BSS.
+            */
+           if (p->number == SECT_BSS)
+               p->number = SECT_DATA, p->offset += sdata.len;
+           as86_set_rsize (p->bytes);
+           fputc (0x80 | (p->relative ? 0x20 : 0) | p->number, as86fp);
+           if (as86_reloc_size == 2)
+               fwriteshort (p->offset, as86fp);
+           else
+               fwritelong (p->offset, as86fp);
+           break;
+         case 2:
+           /*
+            * A symbol-type relocation.
+            */
+           as86_set_rsize (p->bytes);
+           s = p->offset;
+           if (s > 65535L)
+               s = 3;
+           else if (s > 255)
+               s = 2;
+           else if (s > 0)
+               s = 1;
+           else
+               s = 0;
+           fputc (0xC0 |
+                  (p->relative ? 0x20 : 0) |
+                  (p->number > 255 ? 0x04 : 0) | s, as86fp);
+           if (p->number > 255)
+               fwriteshort (p->number, as86fp);
+           else
+               fputc (p->number, as86fp);
+           switch ((int)s) {
+             case 0: break;
+             case 1: fputc (p->offset, as86fp); break;
+             case 2: fwriteshort (p->offset, as86fp); break;
+             case 3: fwritelong (p->offset, as86fp); break;
+           }
+           break;
+       }
+}
+
+static void as86_sect_write (struct Section *sect,
+                            unsigned char *data, unsigned long len) {
+    saa_wbytes (sect->data, data, len);
+    sect->datalen += len;
+}
+
+static long as86_segbase (long segment) {
+    return segment;
+}
+
+static int as86_directive (char *directive, char *value, int pass) {
+    return 0;
+}
+
+static void as86_filename (char *inname, char *outname, efunc error) {
+    char *p;
+
+    if ( (p = strrchr (inname, '.')) != NULL) {
+       strncpy (as86_module, inname, p-inname);
+       as86_module[p-inname] = '\0';
+    } else
+       strcpy (as86_module, inname);
+
+    standard_extension (inname, outname, ".o", error);
+}
+
+static char *as86_stdmac[] = {
+    "%define __SECT__ [section .text]",
+    NULL
+};
+
+struct ofmt of_as86 = {
+    "Linux as86 (bin86 version 0.3) object files",
+    "as86",
+    as86_stdmac,
+    as86_init,
+    as86_out,
+    as86_deflabel,
+    as86_section_names,
+    as86_segbase,
+    as86_directive,
+    as86_filename,
+    as86_cleanup
+};
+
+#endif /* OF_AS86 */
diff --git a/i386/nasm/outbin.c b/i386/nasm/outbin.c
new file mode 100644 (file)
index 0000000..f34d648
--- /dev/null
@@ -0,0 +1,386 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
+ * Reserved.  This file contains Original Code and/or Modifications of
+ * Original Code as defined in and that are subject to the Apple Public
+ * Source License Version 1.1 (the "License").  You may not use this file
+ * except in compliance with the License.  Please obtain a copy of the
+ * License at http://www.apple.com/publicsource and read it before using
+ * this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/* outbin.c    output routines for the Netwide Assembler to produce
+ *             flat-form binary files
+ *
+ * The Netwide Assembler is copyright (C) 1996 Simon Tatham and
+ * Julian Hall. All rights reserved. The software is
+ * redistributable under the licence given in the file "Licence"
+ * distributed in the NASM archive.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+
+#include "nasm.h"
+#include "nasmlib.h"
+#include "outform.h"
+
+#ifdef OF_BIN
+
+static FILE *fp;
+static efunc error;
+
+static struct Section {
+    struct SAA *contents;
+    long length;
+    long index;
+} textsect, datasect;
+static long bsslen, bssindex;
+
+static struct Reloc {
+    struct Reloc *next;
+    long posn;
+    long bytes;
+    long secref;
+    long secrel;
+    struct Section *target;
+} *relocs, **reloctail;
+
+static long data_align, bss_align;
+
+static long start_point;
+
+static void add_reloc (struct Section *s, long bytes, long secref,
+                      long secrel) {
+    struct Reloc *r;
+
+    r = *reloctail = nasm_malloc(sizeof(struct Reloc));
+    reloctail = &r->next;
+    r->next = NULL;
+    r->posn = s->length;
+    r->bytes = bytes;
+    r->secref = secref;
+    r->secrel = secrel;
+    r->target = s;
+}
+
+static void bin_init (FILE *afp, efunc errfunc, ldfunc ldef, evalfunc eval) {
+    fp = afp;
+
+    error = errfunc;
+    (void) ldef;                      /* placate optimisers */
+
+    start_point = 0L;                 /* default */
+    textsect.contents = saa_init(1L);
+    datasect.contents = saa_init(1L);
+    textsect.length = datasect.length = 0;
+    textsect.index = seg_alloc();
+    datasect.index = seg_alloc();
+    bsslen = 0;
+    bssindex = seg_alloc();
+    relocs = NULL;
+    reloctail = &relocs;
+    data_align = bss_align = 4;
+}
+
+static void bin_cleanup (void) {
+    struct Reloc *r;
+    long datapos, datagap, bsspos;
+
+    datapos = start_point + textsect.length;
+    datapos = (datapos + data_align-1) & ~(data_align-1);
+    datagap = datapos - (start_point + textsect.length);
+    bsspos = datapos + datasect.length;
+    bsspos = (bsspos + bss_align-1) & ~(bss_align-1);
+
+    saa_rewind (textsect.contents);
+    saa_rewind (datasect.contents);
+
+    for (r = relocs; r; r = r->next) {
+       unsigned char *p, *q, mydata[4];
+       long l;
+
+       saa_fread (r->target->contents, r->posn, mydata, r->bytes);
+       p = q = mydata;
+       l = *p++;
+       if (r->bytes > 1) {
+           l += ((long)*p++) << 8;
+           if (r->bytes == 4) {
+               l += ((long)*p++) << 16;
+               l += ((long)*p++) << 24;
+           }
+       }
+
+       if (r->secref == textsect.index)
+           l += start_point;
+       else if (r->secref == datasect.index)
+           l += datapos;
+       else if (r->secref == bssindex)
+           l += bsspos;
+
+       if (r->secrel == textsect.index)
+           l -= start_point;
+       else if (r->secrel == datasect.index)
+           l -= datapos;
+       else if (r->secrel == bssindex)
+           l -= bsspos;
+
+       if (r->bytes == 4)
+           WRITELONG(q, l);
+       else if (r->bytes == 2)
+           WRITESHORT(q, l);
+       else
+           *q++ = l & 0xFF;
+       saa_fwrite (r->target->contents, r->posn, mydata, r->bytes);
+    }
+    saa_fpwrite (textsect.contents, fp);
+    if (datasect.length > 0) {
+       while (datagap--)
+           fputc('\0', fp);
+       saa_fpwrite (datasect.contents, fp);
+    }
+    fclose (fp);
+    saa_free (textsect.contents);
+    saa_free (datasect.contents);
+    while (relocs) {
+       r = relocs->next;
+       nasm_free (relocs);
+       relocs = r;
+    }
+}
+
+static void bin_out (long segto, void *data, unsigned long type,
+                    long segment, long wrt) {
+    unsigned char *p, mydata[4];
+    struct Section *s;
+    long realbytes;
+
+    if (wrt != NO_SEG) {
+       wrt = NO_SEG;                  /* continue to do _something_ */
+       error (ERR_NONFATAL, "WRT not supported by binary output format");
+    }
+
+    /*
+     * handle absolute-assembly (structure definitions)
+     */
+    if (segto == NO_SEG) {
+       if ((type & OUT_TYPMASK) != OUT_RESERVE)
+           error (ERR_NONFATAL, "attempt to assemble code in [ABSOLUTE]"
+                  " space");
+       return;
+    }
+
+    if (segto == bssindex) {          /* BSS */
+       if ((type & OUT_TYPMASK) != OUT_RESERVE)
+           error(ERR_WARNING, "attempt to initialise memory in the"
+                 " BSS section: ignored");
+       s = NULL;
+    } else if (segto == textsect.index) {
+       s = &textsect;
+    } else if (segto == datasect.index) {
+       s = &datasect;
+    } else {
+       error(ERR_WARNING, "attempt to assemble code in"
+             " segment %d: defaulting to `.text'", segto);
+       s = &textsect;
+    }
+
+    if ((type & OUT_TYPMASK) == OUT_ADDRESS) {
+       if (segment != NO_SEG &&
+           segment != textsect.index &&
+           segment != datasect.index &&
+           segment != bssindex) {
+           if (segment % 2)
+               error(ERR_NONFATAL, "binary output format does not support"
+                     " segment base references");
+           else
+               error(ERR_NONFATAL, "binary output format does not support"
+                     " external references");
+           segment = NO_SEG;
+       }
+       if (s) {
+           if (segment != NO_SEG)
+               add_reloc (s, type & OUT_SIZMASK, segment, -1L);
+           p = mydata;
+           if ((type & OUT_SIZMASK) == 4)
+               WRITELONG (p, *(long *)data);
+           else
+               WRITESHORT (p, *(long *)data);
+           saa_wbytes (s->contents, mydata, type & OUT_SIZMASK);
+           s->length += type & OUT_SIZMASK;
+       } else
+           bsslen += type & OUT_SIZMASK;
+    } else if ((type & OUT_TYPMASK) == OUT_RAWDATA) {
+       type &= OUT_SIZMASK;
+       p = data;
+       if (s) {
+           saa_wbytes (s->contents, data, type);
+           s->length += type;
+       } else
+           bsslen += type;
+    } else if ((type & OUT_TYPMASK) == OUT_RESERVE) {
+       if (s) {
+           error(ERR_WARNING, "uninitialised space declared in"
+                 " %s section: zeroing",
+                 (segto == textsect.index ? "code" : "data"));
+       }
+       type &= OUT_SIZMASK;
+       if (s) {
+           saa_wbytes (s->contents, NULL, type);
+           s->length += type;
+       } else
+           bsslen += type;
+    } else if ((type & OUT_TYPMASK) == OUT_REL2ADR ||
+              (type & OUT_TYPMASK) == OUT_REL4ADR) {
+       realbytes = ((type & OUT_TYPMASK) == OUT_REL4ADR ? 4 : 2);
+       if (segment != NO_SEG &&
+           segment != textsect.index &&
+           segment != datasect.index &&
+           segment != bssindex) {
+           if (segment % 2)
+               error(ERR_NONFATAL, "binary output format does not support"
+                     " segment base references");
+           else
+               error(ERR_NONFATAL, "binary output format does not support"
+                     " external references");
+           segment = NO_SEG;
+       }
+       if (s) {
+           add_reloc (s, realbytes, segment, segto);
+           p = mydata;
+           if (realbytes == 4)
+               WRITELONG (p, *(long*)data - realbytes - s->length);
+           else
+               WRITESHORT (p, *(long*)data - realbytes - s->length);
+           saa_wbytes (s->contents, mydata, realbytes);
+           s->length += realbytes;
+       } else
+           bsslen += realbytes;
+    }
+}
+
+static void bin_deflabel (char *name, long segment, long offset,
+                         int is_global, char *special) {
+
+    if (special)
+       error (ERR_NONFATAL, "binary format does not support any"
+              " special symbol types");
+
+    if (name[0] == '.' && name[1] == '.' && name[2] != '@') {
+       error (ERR_NONFATAL, "unrecognised special symbol `%s'", name);
+       return;
+    }
+
+    if (is_global == 2) {
+       error (ERR_NONFATAL, "binary output format does not support common"
+              " variables");
+    }
+}
+
+static long bin_secname (char *name, int pass, int *bits) {
+    int sec_index;
+    long *sec_align;
+    char *p;
+
+    /*
+     * Default is 16 bits.
+     */
+    if (!name)
+       *bits = 16;
+
+    if (!name)
+       return textsect.index;
+
+    p = name;
+    while (*p && !isspace(*p)) p++;
+    if (*p) *p++ = '\0';
+    if (!strcmp(name, ".text")) {
+       sec_index = textsect.index;
+       sec_align = NULL;
+    } else if (!strcmp(name, ".data")) {
+       sec_index = datasect.index;
+       sec_align = &data_align;
+    } else if (!strcmp(name, ".bss")) {
+       sec_index = bssindex;
+       sec_align = &bss_align;
+    } else
+       return NO_SEG;
+
+    if (*p) {
+       if (!nasm_strnicmp(p,"align=",6)) {
+           if (sec_align == NULL)
+               error(ERR_NONFATAL, "cannot specify an alignment to"
+                     " the `.text' section");
+           else if (p[6+strspn(p+6,"0123456789")])
+               error(ERR_NONFATAL, "argument to `align' is not numeric");
+           else {
+               unsigned int align = atoi(p+6);
+               if (!align || ((align-1) & align))
+                   error(ERR_NONFATAL, "argument to `align' is not a"
+                         " power of two");
+               else
+                   *sec_align = align;
+           }
+       }
+    }
+
+    return sec_index;
+}
+
+static long bin_segbase (long segment) {
+    return segment;
+}
+
+static int bin_directive (char *directive, char *value, int pass) {
+    int rn_error;
+
+    if (!strcmp(directive, "org")) {
+       start_point = readnum (value, &rn_error);
+       if (rn_error)
+           error (ERR_NONFATAL, "argument to ORG should be numeric");
+       return 1;
+    } else
+       return 0;
+}
+
+static void bin_filename (char *inname, char *outname, efunc error) {
+    standard_extension (inname, outname, "", error);
+}
+
+static char *bin_stdmac[] = {
+    "%define __SECT__ [section .text]",
+    "%imacro org 1+.nolist",
+    "[org %1]",
+    "%endmacro",
+    NULL
+};
+
+struct ofmt of_bin = {
+    "flat-form binary files (e.g. DOS .COM, .SYS)",
+    "bin",
+    bin_stdmac,
+    bin_init,
+    bin_out,
+    bin_deflabel,
+    bin_secname,
+    bin_segbase,
+    bin_directive,
+    bin_filename,
+    bin_cleanup
+};
+
+#endif /* OF_BIN */
diff --git a/i386/nasm/outcoff.c b/i386/nasm/outcoff.c
new file mode 100644 (file)
index 0000000..b4c751a
--- /dev/null
@@ -0,0 +1,755 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
+ * Reserved.  This file contains Original Code and/or Modifications of
+ * Original Code as defined in and that are subject to the Apple Public
+ * Source License Version 1.1 (the "License").  You may not use this file
+ * except in compliance with the License.  Please obtain a copy of the
+ * License at http://www.apple.com/publicsource and read it before using
+ * this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/* outcoff.c   output routines for the Netwide Assembler to produce
+ *             COFF object files (for DJGPP and Win32)
+ *
+ * The Netwide Assembler is copyright (C) 1996 Simon Tatham and
+ * Julian Hall. All rights reserved. The software is
+ * redistributable under the licence given in the file "Licence"
+ * distributed in the NASM archive.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+#include <time.h>
+
+#include "nasm.h"
+#include "nasmlib.h"
+#include "outform.h"
+
+#if defined(OF_COFF) || defined(OF_WIN32)
+
+/*
+ * Notes on COFF:
+ *
+ * (0) When I say `standard COFF' below, I mean `COFF as output and
+ * used by DJGPP'. I assume DJGPP gets it right.
+ *
+ * (1) Win32 appears to interpret the term `relative relocation'
+ * differently from standard COFF. Standard COFF understands a
+ * relative relocation to mean that during relocation you add the
+ * address of the symbol you're referencing, and subtract the base
+ * address of the section you're in. Win32 COFF, by contrast, seems
+ * to add the address of the symbol and then subtract the address
+ * of THE BYTE AFTER THE RELOCATED DWORD. Hence the two formats are
+ * subtly incompatible.
+ *
+ * (2) Win32 doesn't bother putting any flags in the header flags
+ * field (at offset 0x12 into the file).
+ *
+ * (3) Win32 uses some extra flags into the section header table:
+ * it defines flags 0x80000000 (writable), 0x40000000 (readable)
+ * and 0x20000000 (executable), and uses them in the expected
+ * combinations. It also defines 0x00100000 through 0x00700000 for
+ * section alignments of 1 through 64 bytes.
+ *
+ * (4) Both standard COFF and Win32 COFF seem to use the DWORD
+ * field directly after the section name in the section header
+ * table for something strange: they store what the address of the
+ * section start point _would_ be, if you laid all the sections end
+ * to end starting at zero. Dunno why. Microsoft's documentation
+ * lists this field as "Virtual Size of Section", which doesn't
+ * seem to fit at all. In fact, Win32 even includes non-linked
+ * sections such as .drectve in this calculation.
+ *
+ * (5) Standard COFF does something very strange to common
+ * variables: the relocation point for a common variable is as far
+ * _before_ the variable as its size stretches out _after_ it. So
+ * we must fix up common variable references. Win32 seems to be
+ * sensible on this one.
+ */
+
+/* Flag which version of COFF we are currently outputting. */
+static int win32;
+
+struct Reloc {
+    struct Reloc *next;
+    long address;                     /* relative to _start_ of section */
+    long symbol;                      /* symbol number */
+    enum {
+       SECT_SYMBOLS,
+       ABS_SYMBOL,
+       REAL_SYMBOLS
+    } symbase;                        /* relocation for symbol number :) */
+    int relative;                     /* TRUE or FALSE */
+};
+
+struct Symbol {
+    char name[9];
+    long strpos;                      /* string table position of name */
+    int section;                      /* section number where it's defined
+                                       * - in COFF codes, not NASM codes */
+    int is_global;                    /* is it a global symbol or not? */
+    long value;                               /* address, or COMMON variable size */
+};
+
+static FILE *coffp;
+static efunc error;
+static char coff_infile[FILENAME_MAX];
+
+struct Section {
+    struct SAA *data;
+    unsigned long len;
+    int nrelocs;
+    long index;
+    struct Reloc *head, **tail;
+    unsigned long flags;              /* section flags */
+    char name[9];
+    long pos, relpos;
+};
+
+#define TEXT_FLAGS (win32 ? 0x60500020L : 0x20L)
+#define DATA_FLAGS (win32 ? 0xC0300040L : 0x40L)
+#define BSS_FLAGS (win32 ? 0xC0300080L : 0x80L)
+#define INFO_FLAGS 0x00100A00L
+
+#define SECT_DELTA 32
+static struct Section **sects;
+static int nsects, sectlen;
+
+static struct SAA *syms;
+static unsigned long nsyms;
+
+static long def_seg;
+
+static int initsym;
+
+static struct RAA *bsym, *symval;
+
+static struct SAA *strs;
+static unsigned long strslen;
+
+static void coff_gen_init(FILE *, efunc);
+static void coff_sect_write (struct Section *, unsigned char *,
+                            unsigned long);
+static void coff_write (void);
+static void coff_section_header (char *, long, long, long, long, int, long);
+static void coff_write_relocs (struct Section *);
+static void coff_write_symbols (void);
+
+static void coff_win32_init(FILE *fp, efunc errfunc,
+                           ldfunc ldef, evalfunc eval) {
+    win32 = TRUE;
+    (void) ldef;                      /* placate optimisers */
+    coff_gen_init(fp, errfunc);
+}
+
+static void coff_std_init(FILE *fp, efunc errfunc,
+                         ldfunc ldef, evalfunc eval) {
+    win32 = FALSE;
+    (void) ldef;                      /* placate optimisers */
+    coff_gen_init(fp, errfunc);
+}
+
+static void coff_gen_init(FILE *fp, efunc errfunc) {
+    coffp = fp;
+    error = errfunc;
+    sects = NULL;
+    nsects = sectlen = 0;
+    syms = saa_init((long)sizeof(struct Symbol));
+    nsyms = 0;
+    bsym = raa_init();
+    symval = raa_init();
+    strs = saa_init(1L);
+    strslen = 0;
+    def_seg = seg_alloc();
+}
+
+static void coff_cleanup(void) {
+    struct Reloc *r;
+    int i;
+
+    coff_write();
+    fclose (coffp);
+    for (i=0; i<nsects; i++) {
+       if (sects[i]->data)
+           saa_free (sects[i]->data);
+       while (sects[i]->head) {
+           r = sects[i]->head;
+           sects[i]->head = sects[i]->head->next;
+           nasm_free (r);
+       }
+    }
+    nasm_free (sects);
+    saa_free (syms);
+    raa_free (bsym);
+    raa_free (symval);
+    saa_free (strs);
+}
+
+static int coff_make_section (char *name, unsigned long flags) {
+    struct Section *s;
+
+    s = nasm_malloc (sizeof(*s));
+
+    if (flags != BSS_FLAGS)
+       s->data = saa_init (1L);
+    else
+       s->data = NULL;
+    s->head = NULL;
+    s->tail = &s->head;
+    s->len = 0;
+    s->nrelocs = 0;
+    if (!strcmp(name, ".text"))
+       s->index = def_seg;
+    else
+       s->index = seg_alloc();
+    strncpy (s->name, name, 8);
+    s->name[8] = '\0';
+    s->flags = flags;
+
+    if (nsects >= sectlen)
+       sects = nasm_realloc (sects, (sectlen += SECT_DELTA)*sizeof(*sects));
+    sects[nsects++] = s;
+
+    return nsects-1;
+}
+
+static long coff_section_names (char *name, int pass, int *bits) {
+    char *p;
+    unsigned long flags, align_and = ~0L, align_or = 0L;
+    int i;
+
+    /*
+     * Default is 32 bits.
+     */
+    if (!name)
+       *bits = 32;
+
+    if (!name)
+       return def_seg;
+
+    p = name;
+    while (*p && !isspace(*p)) p++;
+    if (*p) *p++ = '\0';
+    if (strlen(name) > 8) {
+       error (ERR_WARNING, "COFF section names limited to 8 characters:"
+              " truncating");
+       p[8] = '\0';
+    }
+    flags = 0;
+
+    while (*p && isspace(*p)) p++;
+    while (*p) {
+       char *q = p;
+       while (*p && !isspace(*p)) p++;
+       if (*p) *p++ = '\0';
+       while (*p && isspace(*p)) p++;
+
+       if (!nasm_stricmp(q, "code") || !nasm_stricmp(q, "text")) {
+           flags = TEXT_FLAGS;
+       } else if (!nasm_stricmp(q, "data")) {
+           flags = DATA_FLAGS;
+       } else if (!nasm_stricmp(q, "bss")) {
+           flags = BSS_FLAGS;
+       } else if (!nasm_stricmp(q, "info")) {
+           if (win32)
+               flags = INFO_FLAGS;
+           else {
+               flags = DATA_FLAGS;    /* gotta do something */
+               error (ERR_NONFATAL, "standard COFF does not support"
+                      " informational sections");
+           }
+       } else if (!nasm_strnicmp(q,"align=",6)) {
+           if (!win32)
+               error (ERR_NONFATAL, "standard COFF does not support"
+                      " section alignment specification");
+           else {
+               if (q[6+strspn(q+6,"0123456789")])
+                   error(ERR_NONFATAL, "argument to `align' is not numeric");
+               else {
+                   unsigned int align = atoi(q+6);
+                   if (!align || ((align-1) & align))
+                       error(ERR_NONFATAL, "argument to `align' is not a"
+                             " power of two");
+                   else if (align > 64)
+                       error(ERR_NONFATAL, "Win32 cannot align sections"
+                             " to better than 64-byte boundaries");
+                   else {
+                       align_and = ~0x00F00000L;
+                       align_or = (align == 1 ? 0x00100000L :
+                                   align == 2 ? 0x00200000L :
+                                   align == 4 ? 0x00300000L :
+                                   align == 8 ? 0x00400000L :
+                                   align == 16 ? 0x00500000L :
+                                   align == 32 ? 0x00600000L : 0x00700000L);
+                   }
+               }
+           }
+       }
+    }
+
+    for (i=0; i<nsects; i++)
+       if (!strcmp(name, sects[i]->name))
+           break;
+    if (i == nsects) {
+       if (!flags) {
+           if (!strcmp(name, ".data"))
+               flags = DATA_FLAGS;
+           else if (!strcmp(name, ".bss"))
+               flags = BSS_FLAGS;
+           else
+               flags = TEXT_FLAGS;
+       }
+       i = coff_make_section (name, flags);
+       if (flags)
+           sects[i]->flags = flags;
+       sects[i]->flags &= align_and;
+       sects[i]->flags |= align_or;
+    } else if (pass == 1) {
+       if (flags)
+           error (ERR_WARNING, "section attributes ignored on"
+                  " redeclaration of section `%s'", name);
+    }
+
+    return sects[i]->index;
+}
+
+static void coff_deflabel (char *name, long segment, long offset,
+                          int is_global, char *special) {
+    int pos = strslen+4;
+    struct Symbol *sym;
+
+    if (special)
+       error (ERR_NONFATAL, "binary format does not support any"
+              " special symbol types");
+
+    if (name[0] == '.' && name[1] == '.' && name[2] != '@') {
+       error (ERR_NONFATAL, "unrecognised special symbol `%s'", name);
+       return;
+    }
+
+    if (strlen(name) > 8) {
+       saa_wbytes (strs, name, (long)(1+strlen(name)));
+       strslen += 1+strlen(name);
+    } else
+       pos = -1;
+
+    sym = saa_wstruct (syms);
+
+    sym->strpos = pos;
+    if (pos == -1)
+       strcpy (sym->name, name);
+    sym->is_global = !!is_global;
+    if (segment == NO_SEG)
+       sym->section = -1;      /* absolute symbol */
+    else {
+       int i;
+       sym->section = 0;
+       for (i=0; i<nsects; i++)
+           if (segment == sects[i]->index) {
+               sym->section = i+1;
+               break;
+           }
+       if (!sym->section)
+           sym->is_global = TRUE;
+    }
+    if (is_global == 2)
+       sym->value = offset;
+    else
+       sym->value = (sym->section == 0 ? 0 : offset);
+
+    /*
+     * define the references from external-symbol segment numbers
+     * to these symbol records.
+     */
+    if (sym->section == 0)
+       bsym = raa_write (bsym, segment, nsyms);
+
+    if (segment != NO_SEG)
+       symval = raa_write (symval, segment, sym->section ? 0 : sym->value);
+
+    nsyms++;
+}
+
+static long coff_add_reloc (struct Section *sect, long segment,
+                           int relative) {
+    struct Reloc *r;
+
+    r = *sect->tail = nasm_malloc(sizeof(struct Reloc));
+    sect->tail = &r->next;
+    r->next = NULL;
+
+    r->address = sect->len;
+    if (segment == NO_SEG)
+       r->symbol = 0, r->symbase = ABS_SYMBOL;
+    else {
+       int i;
+       r->symbase = REAL_SYMBOLS;
+       for (i=0; i<nsects; i++)
+           if (segment == sects[i]->index) {
+               r->symbol = i*2;
+               r->symbase = SECT_SYMBOLS;
+               break;
+           }
+       if (r->symbase == REAL_SYMBOLS)
+           r->symbol = raa_read (bsym, segment);
+    }
+    r->relative = relative;
+
+    sect->nrelocs++;
+
+    /*
+     * Return the fixup for standard COFF common variables.
+     */
+    if (r->symbase == REAL_SYMBOLS && !win32)
+       return raa_read (symval, segment);
+    else
+       return 0;
+}
+
+static void coff_out (long segto, void *data, unsigned long type,
+                     long segment, long wrt) {
+    struct Section *s;
+    long realbytes = type & OUT_SIZMASK;
+    unsigned char mydata[4], *p;
+    int i;
+
+    if (wrt != NO_SEG) {
+       wrt = NO_SEG;                  /* continue to do _something_ */
+       error (ERR_NONFATAL, "WRT not supported by COFF output formats");
+    }
+
+    type &= OUT_TYPMASK;
+
+    /*
+     * handle absolute-assembly (structure definitions)
+     */
+    if (segto == NO_SEG) {
+       if (type != OUT_RESERVE)
+           error (ERR_NONFATAL, "attempt to assemble code in [ABSOLUTE]"
+                  " space");
+       return;
+    }
+
+    s = NULL;
+    for (i=0; i<nsects; i++)
+       if (segto == sects[i]->index) {
+           s = sects[i];
+           break;
+       }
+    if (!s) {
+       int tempint;                   /* ignored */
+       if (segto != coff_section_names (".text", 2, &tempint))
+           error (ERR_PANIC, "strange segment conditions in COFF driver");
+       else
+           s = sects[nsects-1];
+    }
+
+    if (!s->data && type != OUT_RESERVE) {
+       error(ERR_WARNING, "attempt to initialise memory in"
+             " BSS section `%s': ignored", s->name);
+       if (type == OUT_REL2ADR)
+           realbytes = 2;
+       else if (type == OUT_REL4ADR)
+           realbytes = 4;
+       s->len += realbytes;
+       return;
+    }
+
+    if (type == OUT_RESERVE) {
+       if (s->data) {
+           error(ERR_WARNING, "uninitialised space declared in"
+                 " non-BSS section `%s': zeroing", s->name);
+           coff_sect_write (s, NULL, realbytes);
+       } else
+           s->len += realbytes;
+    } else if (type == OUT_RAWDATA) {
+       if (segment != NO_SEG)
+           error(ERR_PANIC, "OUT_RAWDATA with other than NO_SEG");
+       coff_sect_write (s, data, realbytes);
+    } else if (type == OUT_ADDRESS) {
+       if (realbytes != 4 && (segment != NO_SEG || wrt != NO_SEG))
+           error(ERR_NONFATAL, "COFF format does not support non-32-bit"
+                 " relocations");
+       else {
+           long fix = 0;
+           if (segment != NO_SEG || wrt != NO_SEG) {
+               if (wrt != NO_SEG) {
+                   error(ERR_NONFATAL, "COFF format does not support"
+                         " WRT types");
+               } else if (segment % 2) {
+                   error(ERR_NONFATAL, "COFF format does not support"
+                         " segment base references");
+               } else
+                   fix = coff_add_reloc (s, segment, FALSE);
+           }
+           p = mydata;
+           WRITELONG (p, *(long *)data + fix);
+           coff_sect_write (s, mydata, realbytes);
+       }
+    } else if (type == OUT_REL2ADR) {
+       error(ERR_NONFATAL, "COFF format does not support 16-bit"
+             " relocations");
+    } else if (type == OUT_REL4ADR) {
+       if (segment == segto)
+           error(ERR_PANIC, "intra-segment OUT_REL4ADR");
+       else if (segment == NO_SEG && win32)
+           error(ERR_NONFATAL, "Win32 COFF does not correctly support"
+                 " relative references to absolute addresses");
+       else {
+           long fix = 0;
+           if (segment != NO_SEG && segment % 2) {
+               error(ERR_NONFATAL, "COFF format does not support"
+                     " segment base references");
+           } else
+               fix = coff_add_reloc (s, segment, TRUE);
+           p = mydata;
+           if (win32) {
+               WRITELONG (p, *(long*)data + 4 - realbytes + fix);
+           } else {
+               WRITELONG (p, *(long*)data-(realbytes + s->len) + fix);
+           }
+           coff_sect_write (s, mydata, 4L);
+       }
+    }
+}
+
+static void coff_sect_write (struct Section *sect,
+                            unsigned char *data, unsigned long len) {
+    saa_wbytes (sect->data, data, len);
+    sect->len += len;
+}
+
+static int coff_directives (char *directive, char *value, int pass) {
+    return 0;
+}
+
+static void coff_write (void) {
+    long pos, sympos, vsize;
+    int i;
+
+    /*
+     * Work out how big the file will get. Calculate the start of
+     * the `real' symbols at the same time.
+     */
+    pos = 0x14 + 0x28 * nsects;
+    initsym = 3;                      /* two for the file, one absolute */
+    for (i=0; i<nsects; i++) {
+       if (sects[i]->data) {
+           sects[i]->pos = pos;
+           pos += sects[i]->len;
+           sects[i]->relpos = pos;
+           pos += 10 * sects[i]->nrelocs;
+       } else
+           sects[i]->pos = sects[i]->relpos = 0L;
+       initsym += 2;                  /* two for each section */
+    }
+    sympos = pos;
+
+    /*
+     * Output the COFF header.
+     */
+    fwriteshort (0x14C, coffp);               /* MACHINE_i386 */
+    fwriteshort (nsects, coffp);       /* number of sections */
+    fwritelong (time(NULL), coffp);    /* time stamp */
+    fwritelong (sympos, coffp);
+    fwritelong (nsyms + initsym, coffp);
+    fwriteshort (0, coffp);           /* no optional header */
+    /* Flags: 32-bit, no line numbers. Win32 doesn't even bother with them. */
+    fwriteshort (win32 ? 0 : 0x104, coffp);
+
+    /*
+     * Output the section headers.
+     */
+    vsize = 0L;
+    for (i=0; i<nsects; i++) {
+       coff_section_header (sects[i]->name, vsize, sects[i]->len,
+                            sects[i]->pos, sects[i]->relpos,
+                            sects[i]->nrelocs, sects[i]->flags);
+       vsize += sects[i]->len;
+    }
+
+    /*
+     * Output the sections and their relocations.
+     */
+    for (i=0; i<nsects; i++)
+       if (sects[i]->data) {
+           saa_fpwrite (sects[i]->data, coffp);
+           coff_write_relocs (sects[i]);
+       }
+
+    /*
+     * Output the symbol and string tables.
+     */
+    coff_write_symbols();
+    fwritelong (strslen+4, coffp);     /* length includes length count */
+    saa_fpwrite (strs, coffp);
+}
+
+static void coff_section_header (char *name, long vsize,
+                                long datalen, long datapos,
+                                long relpos, int nrelocs, long flags) {
+    char padname[8];
+
+    memset (padname, 0, 8);
+    strncpy (padname, name, 8);
+    fwrite (padname, 8, 1, coffp);
+    fwritelong (vsize, coffp);
+    fwritelong (0L, coffp);           /* RVA/offset - we ignore */
+    fwritelong (datalen, coffp);
+    fwritelong (datapos, coffp);
+    fwritelong (relpos, coffp);
+    fwritelong (0L, coffp);           /* no line numbers - we don't do 'em */
+    fwriteshort (nrelocs, coffp);
+    fwriteshort (0, coffp);           /* again, no line numbers */
+    fwritelong (flags, coffp);
+}
+
+static void coff_write_relocs (struct Section *s) {
+    struct Reloc *r;
+
+    for (r = s->head; r; r = r->next) {
+       fwritelong (r->address, coffp);
+       fwritelong (r->symbol + (r->symbase == REAL_SYMBOLS ? initsym :
+                                r->symbase == ABS_SYMBOL ? initsym-1 :
+                                r->symbase == SECT_SYMBOLS ? 2 : 0), coffp);
+       /*
+        * Strange: Microsoft's COFF documentation says 0x03 for an
+        * absolute relocation, but both Visual C++ and DJGPP agree
+        * that in fact it's 0x06. I'll use 0x06 until someone
+        * argues.
+        */
+       fwriteshort (r->relative ? 0x14 : 0x06, coffp);
+    }
+}
+
+static void coff_symbol (char *name, long strpos, long value,
+                        int section, int type, int aux) {
+    char padname[8];
+
+    if (name) {
+       memset (padname, 0, 8);
+       strncpy (padname, name, 8);
+       fwrite (padname, 8, 1, coffp);
+    } else {
+       fwritelong (0L, coffp);
+       fwritelong (strpos, coffp);
+    }
+    fwritelong (value, coffp);
+    fwriteshort (section, coffp);
+    fwriteshort (0, coffp);
+    fputc (type, coffp);
+    fputc (aux, coffp);
+}
+
+static void coff_write_symbols (void) {
+    char filename[18];
+    int i;
+
+    /*
+     * The `.file' record, and the file name auxiliary record.
+     */
+    coff_symbol (".file", 0L, 0L, -2, 0x67, 1);
+    memset (filename, 0, 18);
+    strncpy (filename, coff_infile, 18);
+    fwrite (filename, 18, 1, coffp);
+
+    /*
+     * The section records, with their auxiliaries.
+     */
+    memset (filename, 0, 18);         /* useful zeroed buffer */
+
+    for (i=0; i<nsects; i++) {
+       coff_symbol (sects[i]->name, 0L, 0L, i+1, 3, 1);
+       fwritelong (sects[i]->len, coffp);
+       fwriteshort (sects[i]->nrelocs, coffp);
+       fwrite (filename, 12, 1, coffp);
+    }
+
+    /*
+     * The absolute symbol, for relative-to-absolute relocations.
+     */
+    coff_symbol (".absolut", 0L, 0L, -1, 3, 0);
+
+    /*
+     * The real symbols.
+     */
+    saa_rewind (syms);
+    for (i=0; i<nsyms; i++) {
+       struct Symbol *sym = saa_rstruct (syms);
+       coff_symbol (sym->strpos == -1 ? sym->name : NULL,
+                    sym->strpos, sym->value, sym->section,
+                    sym->is_global ? 2 : 3, 0);
+    }
+}
+
+static long coff_segbase (long segment) {
+    return segment;
+}
+
+static void coff_std_filename (char *inname, char *outname, efunc error) {
+    strcpy(coff_infile, inname);
+    standard_extension (inname, outname, ".o", error);
+}
+
+static void coff_win32_filename (char *inname, char *outname, efunc error) {
+    strcpy(coff_infile, inname);
+    standard_extension (inname, outname, ".obj", error);
+}
+
+#endif /* defined(OF_COFF) || defined(OF_WIN32) */
+
+static char *coff_stdmac[] = {
+    "%define __SECT__ [section .text]",
+    NULL
+};
+
+#ifdef OF_COFF
+
+struct ofmt of_coff = {
+    "COFF (i386) object files (e.g. DJGPP for DOS)",
+    "coff",
+    coff_stdmac,
+    coff_std_init,
+    coff_out,
+    coff_deflabel,
+    coff_section_names,
+    coff_segbase,
+    coff_directives,
+    coff_std_filename,
+    coff_cleanup
+};
+
+#endif
+
+#ifdef OF_WIN32
+
+struct ofmt of_win32 = {
+    "Microsoft Win32 (i386) object files",
+    "win32",
+    coff_stdmac,
+    coff_win32_init,
+    coff_out,
+    coff_deflabel,
+    coff_section_names,
+    coff_segbase,
+    coff_directives,
+    coff_win32_filename,
+    coff_cleanup
+};
+
+#endif
diff --git a/i386/nasm/outdbg.c b/i386/nasm/outdbg.c
new file mode 100644 (file)
index 0000000..d7a1af3
--- /dev/null
@@ -0,0 +1,189 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
+ * Reserved.  This file contains Original Code and/or Modifications of
+ * Original Code as defined in and that are subject to the Apple Public
+ * Source License Version 1.1 (the "License").  You may not use this file
+ * except in compliance with the License.  Please obtain a copy of the
+ * License at http://www.apple.com/publicsource and read it before using
+ * this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/* outdbg.c    output routines for the Netwide Assembler to produce
+ *             a debugging trace
+ *
+ * The Netwide Assembler is copyright (C) 1996 Simon Tatham and
+ * Julian Hall. All rights reserved. The software is
+ * redistributable under the licence given in the file "Licence"
+ * distributed in the NASM archive.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+
+#include "nasm.h"
+#include "nasmlib.h"
+#include "outform.h"
+
+#ifdef OF_DBG
+
+struct Section {
+    struct Section *next;
+    long number;
+    char *name;
+} *dbgsect;
+
+FILE *dbgf;
+efunc dbgef;
+
+static void dbg_init(FILE *fp, efunc errfunc, ldfunc ldef, evalfunc eval)
+{
+    dbgf = fp;
+    dbgef = errfunc;
+    dbgsect = NULL;
+    (void) ldef;
+    fprintf(fp,"NASM Output format debug dump\n");
+}
+
+static void dbg_cleanup(void)
+{
+    while (dbgsect) {
+       struct Section *tmp = dbgsect;
+       dbgsect = dbgsect->next;
+       nasm_free (tmp->name);
+       nasm_free (tmp);
+    }
+    fclose(dbgf);
+}
+
+static long dbg_section_names (char *name, int pass, int *bits)
+{
+    int seg;
+
+    /*
+     * We must have an initial default: let's make it 16.
+     */
+    if (!name)
+       *bits = 16;
+
+    if (!name)
+       fprintf(dbgf, "section_name on init: returning %d\n",
+               seg = seg_alloc());
+    else {
+       int n = strcspn(name, " \t");
+       char *sname = nasm_strndup(name, n);
+       struct Section *s;
+
+       seg = NO_SEG;
+       for (s = dbgsect; s; s = s->next)
+           if (!strcmp(s->name, sname))
+               seg = s->number;
+       
+       if (seg == NO_SEG) {
+           s = nasm_malloc(sizeof(*s));
+           s->name = sname;
+           s->number = seg = seg_alloc();
+           s->next = dbgsect;
+           dbgsect = s;
+           fprintf(dbgf, "section_name %s (pass %d): returning %d\n",
+                   name, pass, seg);
+       }
+    }
+    return seg;
+}
+
+static void dbg_deflabel (char *name, long segment, long offset,
+                         int is_global, char *special) {
+    fprintf(dbgf,"deflabel %s := %08lx:%08lx %s (%d)%s%s\n",
+           name, segment, offset,
+           is_global == 2 ? "common" : is_global ? "global" : "local",
+           is_global,
+           special ? ": " : "", special);
+}
+
+static void dbg_out (long segto, void *data, unsigned long type,
+                    long segment, long wrt) {
+    long realbytes = type & OUT_SIZMASK;
+    long ldata;
+    int id;
+
+    type &= OUT_TYPMASK;
+
+    fprintf(dbgf,"out to %lx, len = %ld: ",segto,realbytes);
+
+    switch(type) {
+      case OUT_RESERVE:
+       fprintf(dbgf,"reserved.\n"); break;
+      case OUT_RAWDATA:
+       fprintf(dbgf,"raw data = ");
+       while (realbytes--) {
+           id = *(unsigned char *)data;
+           data = (char *)data + 1;
+           fprintf(dbgf,"%02x ",id);
+       }
+       fprintf(dbgf,"\n"); break;
+      case OUT_ADDRESS:
+       ldata = 0; /* placate gcc */
+       if (realbytes == 1)
+           ldata = *((char *)data);
+       else if (realbytes == 2)
+           ldata = *((short *)data);
+       else if (realbytes == 4)
+           ldata = *((long *)data);
+       fprintf(dbgf,"addr %08lx (seg %08lx, wrt %08lx)\n",ldata,
+               segment,wrt);break;
+      case OUT_REL2ADR:
+       fprintf(dbgf,"rel2adr %04x (seg %08lx)\n",(int)*(short *)data,segment);
+       break;
+      case OUT_REL4ADR:
+       fprintf(dbgf,"rel4adr %08lx (seg %08lx)\n",*(long *)data,segment);
+       break;
+      default:
+       fprintf(dbgf,"unknown\n");
+       break;
+    }
+}
+
+static long dbg_segbase(long segment) {
+    return segment;
+}
+
+static int dbg_directive (char *directive, char *value, int pass) {
+    fprintf(dbgf, "directive [%s] value [%s] (pass %d)\n",
+           directive, value, pass);
+    return 1;
+}
+
+static void dbg_filename (char *inname, char *outname, efunc error) {
+    standard_extension (inname, outname, ".dbg", error);
+}
+
+struct ofmt of_dbg = {
+    "Trace of all info passed to output stage",
+    "dbg",
+    NULL,
+    dbg_init,
+    dbg_out,
+    dbg_deflabel,
+    dbg_section_names,
+    dbg_segbase,
+    dbg_directive,
+    dbg_filename,
+    dbg_cleanup
+};
+
+#endif /* OF_DBG */
diff --git a/i386/nasm/outelf.c b/i386/nasm/outelf.c
new file mode 100644 (file)
index 0000000..d6de959
--- /dev/null
@@ -0,0 +1,1067 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
+ * Reserved.  This file contains Original Code and/or Modifications of
+ * Original Code as defined in and that are subject to the Apple Public
+ * Source License Version 1.1 (the "License").  You may not use this file
+ * except in compliance with the License.  Please obtain a copy of the
+ * License at http://www.apple.com/publicsource and read it before using
+ * this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/* outelf.c    output routines for the Netwide Assembler to produce
+ *             ELF32 (i386 of course) object file format
+ *
+ * The Netwide Assembler is copyright (C) 1996 Simon Tatham and
+ * Julian Hall. All rights reserved. The software is
+ * redistributable under the licence given in the file "Licence"
+ * distributed in the NASM archive.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+
+#include "nasm.h"
+#include "nasmlib.h"
+#include "outform.h"
+
+#ifdef OF_ELF
+
+/*
+ * Relocation types.
+ */
+#define R_386_32 1                    /* ordinary absolute relocation */
+#define R_386_PC32 2                  /* PC-relative relocation */
+#define R_386_GOT32 3                 /* an offset into GOT */
+#define R_386_PLT32 4                 /* a PC-relative offset into PLT */
+#define R_386_GOTOFF 9                /* an offset from GOT base */
+#define R_386_GOTPC 10                /* a PC-relative offset _to_ GOT */
+
+struct Reloc {
+    struct Reloc *next;
+    long address;                     /* relative to _start_ of section */
+    long symbol;                      /* ELF symbol info thingy */
+    int type;                         /* type of relocation */
+};
+
+struct Symbol {
+    long strpos;                      /* string table position of name */
+    long section;                     /* section ID of the symbol */
+    int type;                         /* symbol type */
+    long value;                               /* address, or COMMON variable align */
+    long size;                        /* size of symbol */
+    long globnum;                     /* symbol table offset if global */
+    struct Symbol *next;              /* list of globals in each section */
+    struct Symbol *nextfwd;           /* list of unresolved-size symbols */
+    char *name;                               /* used temporarily if in above list */
+};
+
+#define SHT_PROGBITS 1
+#define SHT_NOBITS 8
+
+#define SHF_WRITE 1
+#define SHF_ALLOC 2
+#define SHF_EXECINSTR 4
+
+struct Section {
+    struct SAA *data;
+    unsigned long len, size, nrelocs;
+    long index;
+    int type;                         /* SHT_PROGBITS or SHT_NOBITS */
+    int align;                        /* alignment: power of two */
+    unsigned long flags;              /* section flags */
+    char *name;
+    struct SAA *rel;
+    long rellen;
+    struct Reloc *head, **tail;
+    struct Symbol *gsyms;             /* global symbols in section */
+};
+
+#define SECT_DELTA 32
+static struct Section **sects;
+static int nsects, sectlen;
+
+#define SHSTR_DELTA 256
+static char *shstrtab;
+static int shstrtablen, shstrtabsize;
+
+static struct SAA *syms;
+static unsigned long nlocals, nglobs;
+
+static long def_seg;
+
+static struct RAA *bsym;
+
+static struct SAA *strs;
+static unsigned long strslen;
+
+static FILE *elffp;
+static efunc error;
+static evalfunc evaluate;
+
+static struct Symbol *fwds;
+
+static char elf_module[FILENAME_MAX];
+
+extern struct ofmt of_elf;
+
+#define SHN_ABS 0xFFF1
+#define SHN_COMMON 0xFFF2
+#define SHN_UNDEF 0
+
+#define SYM_SECTION 0x04
+#define SYM_GLOBAL 0x10
+#define SYM_DATA 0x01
+#define SYM_FUNCTION 0x02
+
+#define GLOBAL_TEMP_BASE 6            /* bigger than any constant sym id */
+
+#define SEG_ALIGN 16                  /* alignment of sections in file */
+#define SEG_ALIGN_1 (SEG_ALIGN-1)
+
+static const char align_str[SEG_ALIGN] = ""; /* ANSI will pad this with 0s */
+
+#define ELF_MAX_SECTIONS 16           /* really 10, but let's play safe */
+static struct ELF_SECTDATA {
+    void *data;
+    long len;
+    int is_saa;
+} elf_sects[ELF_MAX_SECTIONS];
+static int elf_nsect;
+static long elf_foffs;
+
+static void elf_write(void);
+static void elf_sect_write(struct Section *, unsigned char *, unsigned long);
+static void elf_section_header (int, int, int, void *, int, long,
+                               int, int, int, int);
+static void elf_write_sections (void);
+static struct SAA *elf_build_symtab (long *, long *);
+static struct SAA *elf_build_reltab (long *, struct Reloc *);
+static void add_sectname (char *, char *);
+
+/*
+ * Special section numbers which are used to define ELF special
+ * symbols, which can be used with WRT to provide PIC relocation
+ * types.
+ */
+static long elf_gotpc_sect, elf_gotoff_sect;
+static long elf_got_sect, elf_plt_sect;
+static long elf_sym_sect;
+
+static void elf_init(FILE *fp, efunc errfunc, ldfunc ldef, evalfunc eval) {
+    elffp = fp;
+    error = errfunc;
+    evaluate = eval;
+    (void) ldef;                      /* placate optimisers */
+    sects = NULL;
+    nsects = sectlen = 0;
+    syms = saa_init((long)sizeof(struct Symbol));
+    nlocals = nglobs = 0;
+    bsym = raa_init();
+    strs = saa_init(1L);
+    saa_wbytes (strs, "\0", 1L);
+    saa_wbytes (strs, elf_module, (long)(strlen(elf_module)+1));
+    strslen = 2+strlen(elf_module);
+    shstrtab = NULL;
+    shstrtablen = shstrtabsize = 0;;
+    add_sectname ("", "");
+
+    fwds = NULL;
+
+    elf_gotpc_sect = seg_alloc();
+    ldef("..gotpc", elf_gotpc_sect+1, 0L, NULL, FALSE, FALSE, &of_elf, error);
+    elf_gotoff_sect = seg_alloc();
+    ldef("..gotoff", elf_gotoff_sect+1, 0L, NULL, FALSE, FALSE,&of_elf,error);
+    elf_got_sect = seg_alloc();
+    ldef("..got", elf_got_sect+1, 0L, NULL, FALSE, FALSE, &of_elf, error);
+    elf_plt_sect = seg_alloc();
+    ldef("..plt", elf_plt_sect+1, 0L, NULL, FALSE, FALSE, &of_elf, error);
+    elf_sym_sect = seg_alloc();
+    ldef("..sym", elf_sym_sect+1, 0L, NULL, FALSE, FALSE, &of_elf, error);
+
+    def_seg = seg_alloc();
+}
+
+static void elf_cleanup(void) {
+    struct Reloc *r;
+    int i;
+
+    elf_write();
+    fclose (elffp);
+    for (i=0; i<nsects; i++) {
+       if (sects[i]->type != SHT_NOBITS)
+           saa_free (sects[i]->data);
+       if (sects[i]->head)
+           saa_free (sects[i]->rel);
+       while (sects[i]->head) {
+           r = sects[i]->head;
+           sects[i]->head = sects[i]->head->next;
+           nasm_free (r);
+       }
+    }
+    nasm_free (sects);
+    saa_free (syms);
+    raa_free (bsym);
+    saa_free (strs);
+}
+
+static void add_sectname (char *firsthalf, char *secondhalf) {
+    int len = strlen(firsthalf)+strlen(secondhalf);
+    while (shstrtablen + len + 1 > shstrtabsize)
+       shstrtab = nasm_realloc (shstrtab, (shstrtabsize += SHSTR_DELTA));
+    strcpy (shstrtab+shstrtablen, firsthalf);
+    strcat (shstrtab+shstrtablen, secondhalf);
+    shstrtablen += len+1;
+}
+
+static int elf_make_section (char *name, int type, int flags, int align) {
+    struct Section *s;
+
+    s = nasm_malloc (sizeof(*s));
+
+    if (type != SHT_NOBITS)
+       s->data = saa_init (1L);
+    s->head = NULL;
+    s->tail = &s->head;
+    s->len = s->size = 0;
+    s->nrelocs = 0;
+    if (!strcmp(name, ".text"))
+       s->index = def_seg;
+    else
+       s->index = seg_alloc();
+    add_sectname ("", name);
+    s->name = nasm_malloc (1+strlen(name));
+    strcpy (s->name, name);
+    s->type = type;
+    s->flags = flags;
+    s->align = align;
+    s->gsyms = NULL;
+
+    if (nsects >= sectlen)
+       sects = nasm_realloc (sects, (sectlen += SECT_DELTA)*sizeof(*sects));
+    sects[nsects++] = s;
+
+    return nsects-1;
+}
+
+static long elf_section_names (char *name, int pass, int *bits) {
+    char *p;
+    int flags_and, flags_or, type, align, i;
+
+    /*
+     * Default is 32 bits.
+     */
+    if (!name)
+       *bits = 32;
+
+    if (!name)
+       return def_seg;
+
+    p = name;
+    while (*p && !isspace(*p)) p++;
+    if (*p) *p++ = '\0';
+    flags_and = flags_or = type = align = 0;
+
+    while (*p && isspace(*p)) p++;
+    while (*p) {
+       char *q = p;
+       while (*p && !isspace(*p)) p++;
+       if (*p) *p++ = '\0';
+       while (*p && isspace(*p)) p++;
+       
+       if (!nasm_strnicmp(q, "align=", 6)) {
+           align = atoi(q+6);
+           if (align == 0)
+               align = 1;
+           if ( (align-1) & align ) {   /* means it's not a power of two */
+               error (ERR_NONFATAL, "section alignment %d is not"
+                      " a power of two", align);
+               align = 1;
+           }
+       } else if (!nasm_stricmp(q, "alloc")) {
+           flags_and |= SHF_ALLOC;
+           flags_or |= SHF_ALLOC;
+       } else if (!nasm_stricmp(q, "noalloc")) {
+           flags_and |= SHF_ALLOC;
+           flags_or &= ~SHF_ALLOC;
+       } else if (!nasm_stricmp(q, "exec")) {
+           flags_and |= SHF_EXECINSTR;
+           flags_or |= SHF_EXECINSTR;
+       } else if (!nasm_stricmp(q, "noexec")) {
+           flags_and |= SHF_EXECINSTR;
+           flags_or &= ~SHF_EXECINSTR;
+       } else if (!nasm_stricmp(q, "write")) {
+           flags_and |= SHF_WRITE;
+           flags_or |= SHF_WRITE;
+       } else if (!nasm_stricmp(q, "nowrite")) {
+           flags_and |= SHF_WRITE;
+           flags_or &= ~SHF_WRITE;
+       } else if (!nasm_stricmp(q, "progbits")) {
+           type = SHT_PROGBITS;
+       } else if (!nasm_stricmp(q, "nobits")) {
+           type = SHT_NOBITS;
+       }
+    }
+
+    if (!strcmp(name, ".comment") ||
+       !strcmp(name, ".shstrtab") ||
+       !strcmp(name, ".symtab") ||
+       !strcmp(name, ".strtab")) {
+       error (ERR_NONFATAL, "attempt to redefine reserved section"
+              "name `%s'", name);
+       return NO_SEG;
+    }
+
+    for (i=0; i<nsects; i++)
+       if (!strcmp(name, sects[i]->name))
+           break;
+    if (i == nsects) {
+       if (!strcmp(name, ".text"))
+           i = elf_make_section (name, SHT_PROGBITS,
+                                 SHF_ALLOC | SHF_EXECINSTR, 16);
+       else if (!strcmp(name, ".data"))
+           i = elf_make_section (name, SHT_PROGBITS,
+                                 SHF_ALLOC | SHF_WRITE, 4);
+       else if (!strcmp(name, ".bss"))
+           i = elf_make_section (name, SHT_NOBITS,
+                                 SHF_ALLOC | SHF_WRITE, 4);
+       else
+           i = elf_make_section (name, SHT_PROGBITS, SHF_ALLOC, 1);
+       if (type)
+           sects[i]->type = type;
+       if (align)
+           sects[i]->align = align;
+       sects[i]->flags &= ~flags_and;
+       sects[i]->flags |= flags_or;
+    } else if (pass == 1) {
+       if (type || align || flags_and)
+           error (ERR_WARNING, "section attributes ignored on"
+                  " redeclaration of section `%s'", name);
+    }
+
+    return sects[i]->index;
+}
+
+static void elf_deflabel (char *name, long segment, long offset,
+                          int is_global, char *special) {
+    int pos = strslen;
+    struct Symbol *sym;
+    int special_used = FALSE;
+
+    if (name[0] == '.' && name[1] == '.' && name[2] != '@') {
+       /*
+        * This is a NASM special symbol. We never allow it into
+        * the ELF symbol table, even if it's a valid one. If it
+        * _isn't_ a valid one, we should barf immediately.
+        */
+       if (strcmp(name, "..gotpc") && strcmp(name, "..gotoff") &&
+           strcmp(name, "..got") && strcmp(name, "..plt") &&
+           strcmp(name, "..sym"))
+           error (ERR_NONFATAL, "unrecognised special symbol `%s'", name);
+       return;
+    }
+
+    if (is_global == 3) {
+       struct Symbol **s;
+       /*
+        * Fix up a forward-reference symbol size from the first
+        * pass.
+        */
+       for (s = &fwds; *s; s = &(*s)->nextfwd)
+           if (!strcmp((*s)->name, name)) {
+               struct tokenval tokval;
+               expr *e;
+               char *p = special;
+
+               while (*p && !isspace(*p)) p++;
+               while (*p && isspace(*p)) p++;
+               stdscan_reset();
+               stdscan_bufptr = p;
+               tokval.t_type = TOKEN_INVALID;
+               e = evaluate(stdscan, NULL, &tokval, NULL, 1, error, NULL);
+               if (e) {
+                   if (!is_simple(e))
+                       error (ERR_NONFATAL, "cannot use relocatable"
+                              " expression as symbol size");
+                   else
+                       (*s)->size = reloc_value(e);
+               }
+
+               /*
+                * Remove it from the list of unresolved sizes.
+                */
+               nasm_free ((*s)->name);
+               *s = (*s)->nextfwd;
+               return;
+           }
+       return;                        /* it wasn't an important one */
+    }
+
+    saa_wbytes (strs, name, (long)(1+strlen(name)));
+    strslen += 1+strlen(name);
+
+    sym = saa_wstruct (syms);
+
+    sym->strpos = pos;
+    sym->type = is_global ? SYM_GLOBAL : 0;
+    sym->size = 0;
+    if (segment == NO_SEG)
+       sym->section = SHN_ABS;
+    else {
+       int i;
+       sym->section = SHN_UNDEF;
+       if (nsects == 0 && segment == def_seg) {
+           int tempint;
+           if (segment != elf_section_names (".text", 2, &tempint))
+               error (ERR_PANIC, "strange segment conditions in ELF driver");
+           sym->section = nsects;
+       } else {
+           for (i=0; i<nsects; i++)
+               if (segment == sects[i]->index) {
+                   sym->section = i+1;
+                   break;
+               }
+       }
+    }
+
+    if (is_global == 2) {
+       sym->size = offset;
+       sym->value = 0;
+       sym->section = SHN_COMMON;
+       /*
+        * We have a common variable. Check the special text to see
+        * if it's a valid number and power of two; if so, store it
+        * as the alignment for the common variable.
+        */
+       if (special) {
+           int err;
+           sym->value = readnum (special, &err);
+           if (err)
+               error(ERR_NONFATAL, "alignment constraint `%s' is not a"
+                     " valid number", special);
+           else if ( (sym->value | (sym->value-1)) != 2*sym->value - 1)
+               error(ERR_NONFATAL, "alignment constraint `%s' is not a"
+                     " power of two", special);
+       }
+       special_used = TRUE;
+    } else
+       sym->value = (sym->section == SHN_UNDEF ? 0 : offset);
+
+    if (sym->type == SYM_GLOBAL) {
+       if (sym->section == SHN_UNDEF || sym->section == SHN_COMMON)
+           bsym = raa_write (bsym, segment, nglobs);
+       else {
+           /*
+            * This is a global symbol; so we must add it to the linked
+            * list of global symbols in its section. We'll push it on
+            * the beginning of the list, because it doesn't matter
+            * much which end we put it on and it's easier like this.
+            *
+            * In addition, we check the special text for symbol
+            * type and size information.
+            */
+           sym->next = sects[sym->section-1]->gsyms;
+           sects[sym->section-1]->gsyms = sym;
+
+           if (special) {
+               int n = strcspn(special, " ");
+
+               if (!nasm_strnicmp(special, "function", n))
+                   sym->type |= SYM_FUNCTION;
+               else if (!nasm_strnicmp(special, "data", n) ||
+                        !nasm_strnicmp(special, "object", n))
+                   sym->type |= SYM_DATA;
+               else
+                   error(ERR_NONFATAL, "unrecognised symbol type `%.*s'",
+                         n, special);
+               if (special[n]) {
+                   struct tokenval tokval;
+                   expr *e;
+                   int fwd = FALSE;
+
+                   while (special[n] && isspace(special[n]))
+                       n++;
+                   /*
+                    * We have a size expression; attempt to
+                    * evaluate it.
+                    */
+                   stdscan_reset();
+                   stdscan_bufptr = special+n;
+                   tokval.t_type = TOKEN_INVALID;
+                   e = evaluate(stdscan, NULL, &tokval, &fwd, 0, error, NULL);
+                   if (fwd) {
+                       sym->nextfwd = fwds;
+                       fwds = sym;
+                       sym->name = nasm_strdup(name);
+                   } else if (e) {
+                       if (!is_simple(e))
+                           error (ERR_NONFATAL, "cannot use relocatable"
+                                  " expression as symbol size");
+                       else
+                           sym->size = reloc_value(e);
+                   }
+               }
+               special_used = TRUE;
+           }
+       }
+       sym->globnum = nglobs;
+       nglobs++;
+    } else
+       nlocals++;
+
+    if (special && !special_used)
+       error(ERR_NONFATAL, "no special symbol features supported here");
+}
+
+static void elf_add_reloc (struct Section *sect, long segment,
+                          int type) {
+    struct Reloc *r;
+
+    r = *sect->tail = nasm_malloc(sizeof(struct Reloc));
+    sect->tail = &r->next;
+    r->next = NULL;
+
+    r->address = sect->len;
+    if (segment == NO_SEG)
+       r->symbol = 2;
+    else {
+       int i;
+       r->symbol = 0;
+       for (i=0; i<nsects; i++)
+           if (segment == sects[i]->index)
+               r->symbol = i+3;
+       if (!r->symbol)
+           r->symbol = GLOBAL_TEMP_BASE + raa_read(bsym, segment);
+    }
+    r->type = type;
+
+    sect->nrelocs++;
+}
+
+/*
+ * This routine deals with ..got and ..sym relocations: the more
+ * complicated kinds. In shared-library writing, some relocations
+ * with respect to global symbols must refer to the precise symbol
+ * rather than referring to an offset from the base of the section
+ * _containing_ the symbol. Such relocations call to this routine,
+ * which searches the symbol list for the symbol in question.
+ *
+ * R_386_GOT32 references require the _exact_ symbol address to be
+ * used; R_386_32 references can be at an offset from the symbol.
+ * The boolean argument `exact' tells us this.
+ *
+ * Return value is the adjusted value of `addr', having become an
+ * offset from the symbol rather than the section. Should always be
+ * zero when returning from an exact call.
+ *
+ * Limitation: if you define two symbols at the same place,
+ * confusion will occur.
+ *
+ * Inefficiency: we search, currently, using a linked list which
+ * isn't even necessarily sorted.
+ */
+static long elf_add_gsym_reloc (struct Section *sect,
+                               long segment, long offset,
+                               int type, int exact) {
+    struct Reloc *r;
+    struct Section *s;
+    struct Symbol *sym, *sm;
+    int i;
+
+    /*
+     * First look up the segment/offset pair and find a global
+     * symbol corresponding to it. If it's not one of our segments,
+     * then it must be an external symbol, in which case we're fine
+     * doing a normal elf_add_reloc after first sanity-checking
+     * that the offset from the symbol is zero.
+     */
+    s = NULL;
+    for (i=0; i<nsects; i++)
+       if (segment == sects[i]->index) {
+           s = sects[i];
+           break;
+       }
+    if (!s) {
+       if (exact && offset != 0)
+           error (ERR_NONFATAL, "unable to find a suitable global symbol"
+                  " for this reference");
+       else
+           elf_add_reloc (sect, segment, type);
+       return offset;
+    }
+
+    if (exact) {
+       /*
+        * Find a symbol pointing _exactly_ at this one.
+        */
+       for (sym = s->gsyms; sym; sym = sym->next)
+           if (sym->value == offset)
+               break;
+    } else {
+       /*
+        * Find the nearest symbol below this one.
+        */
+       sym = NULL;
+       for (sm = s->gsyms; sm; sm = sm->next)
+           if (sm->value <= offset && (!sym || sm->value > sym->value))
+               sym = sm;
+    }
+    if (!sym && exact) {
+       error (ERR_NONFATAL, "unable to find a suitable global symbol"
+              " for this reference");
+       return 0;
+    }
+
+    r = *sect->tail = nasm_malloc(sizeof(struct Reloc));
+    sect->tail = &r->next;
+    r->next = NULL;
+
+    r->address = sect->len;
+    r->symbol = GLOBAL_TEMP_BASE + sym->globnum;
+    r->type = type;
+
+    sect->nrelocs++;
+
+    return offset - sym->value;
+}
+
+static void elf_out (long segto, void *data, unsigned long type,
+                     long segment, long wrt) {
+    struct Section *s;
+    long realbytes = type & OUT_SIZMASK;
+    long addr;
+    unsigned char mydata[4], *p;
+    int i;
+
+    type &= OUT_TYPMASK;
+
+    /*
+     * handle absolute-assembly (structure definitions)
+     */
+    if (segto == NO_SEG) {
+       if (type != OUT_RESERVE)
+           error (ERR_NONFATAL, "attempt to assemble code in [ABSOLUTE]"
+                  " space");
+       return;
+    }
+
+    s = NULL;
+    for (i=0; i<nsects; i++)
+       if (segto == sects[i]->index) {
+           s = sects[i];
+           break;
+       }
+    if (!s) {
+       int tempint;                   /* ignored */
+       if (segto != elf_section_names (".text", 2, &tempint))
+           error (ERR_PANIC, "strange segment conditions in ELF driver");
+       else
+           s = sects[nsects-1];
+    }
+
+    if (s->type == SHT_NOBITS && type != OUT_RESERVE) {
+       error(ERR_WARNING, "attempt to initialise memory in"
+             " BSS section `%s': ignored", s->name);
+       if (type == OUT_REL2ADR)
+           realbytes = 2;
+       else if (type == OUT_REL4ADR)
+           realbytes = 4;
+       s->len += realbytes;
+       return;
+    }
+
+    if (type == OUT_RESERVE) {
+       if (s->type == SHT_PROGBITS) {
+           error(ERR_WARNING, "uninitialised space declared in"
+                 " non-BSS section `%s': zeroing", s->name);
+           elf_sect_write (s, NULL, realbytes);
+       } else
+           s->len += realbytes;
+    } else if (type == OUT_RAWDATA) {
+       if (segment != NO_SEG)
+           error(ERR_PANIC, "OUT_RAWDATA with other than NO_SEG");
+       elf_sect_write (s, data, realbytes);
+    } else if (type == OUT_ADDRESS) {
+       addr = *(long *)data;
+       if (segment != NO_SEG) {
+           if (segment % 2) {
+               error(ERR_NONFATAL, "ELF format does not support"
+                     " segment base references");
+           } else {
+               if (wrt == NO_SEG) {
+                   elf_add_reloc (s, segment, R_386_32);
+               } else if (wrt == elf_gotpc_sect+1) {
+                   /*
+                    * The user will supply GOT relative to $$. ELF
+                    * will let us have GOT relative to $. So we
+                    * need to fix up the data item by $-$$.
+                    */
+                   addr += s->len;
+                   elf_add_reloc (s, segment, R_386_GOTPC);
+               } else if (wrt == elf_gotoff_sect+1) {
+                   elf_add_reloc (s, segment, R_386_GOTOFF);
+               } else if (wrt == elf_got_sect+1) {
+                   addr = elf_add_gsym_reloc (s, segment, addr,
+                                              R_386_GOT32, TRUE);
+               } else if (wrt == elf_sym_sect+1) {
+                   addr = elf_add_gsym_reloc (s, segment, addr,
+                                              R_386_32, FALSE);
+               } else if (wrt == elf_plt_sect+1) {
+                   error(ERR_NONFATAL, "ELF format cannot produce non-PC-"
+                         "relative PLT references");
+               } else {
+                   error (ERR_NONFATAL, "ELF format does not support this"
+                          " use of WRT");
+                   wrt = NO_SEG;      /* we can at least _try_ to continue */
+               }
+           }
+       }
+       p = mydata;
+       if (realbytes != 4 && segment != NO_SEG)
+           error (ERR_NONFATAL, "ELF format does not support non-32-bit"
+                  " relocations");
+       WRITELONG (p, addr);
+       elf_sect_write (s, mydata, realbytes);
+    } else if (type == OUT_REL2ADR) {
+       error (ERR_NONFATAL, "ELF format does not support 16-bit"
+              " relocations");
+    } else if (type == OUT_REL4ADR) {
+       if (segment == segto)
+           error(ERR_PANIC, "intra-segment OUT_REL4ADR");
+       if (segment != NO_SEG && segment % 2) {
+           error(ERR_NONFATAL, "ELF format does not support"
+                 " segment base references");
+       } else {
+           if (wrt == NO_SEG) {
+               elf_add_reloc (s, segment, R_386_PC32);
+           } else if (wrt == elf_plt_sect+1) {
+               elf_add_reloc (s, segment, R_386_PLT32);
+           } else if (wrt == elf_gotpc_sect+1 ||
+                      wrt == elf_gotoff_sect+1 ||
+                      wrt == elf_got_sect+1) {
+               error(ERR_NONFATAL, "ELF format cannot produce PC-"
+                     "relative GOT references");
+           } else {
+               error (ERR_NONFATAL, "ELF format does not support this"
+                      " use of WRT");
+               wrt = NO_SEG;      /* we can at least _try_ to continue */
+           }
+       }
+       p = mydata;
+       WRITELONG (p, *(long*)data - realbytes);
+       elf_sect_write (s, mydata, 4L);
+    }
+}
+
+static void elf_write(void) {
+    int nsections, align;
+    char *p;
+    int commlen;
+    char comment[64];
+    int i;
+
+    struct SAA *symtab;
+    long symtablen, symtablocal;
+
+    /*
+     * Work out how many sections we will have. We have SHN_UNDEF,
+     * then the flexible user sections, then the four fixed
+     * sections `.comment', `.shstrtab', `.symtab' and `.strtab',
+     * then optionally relocation sections for the user sections.
+     */
+    nsections = 5;                    /* SHN_UNDEF and the fixed ones */
+    add_sectname ("", ".comment");
+    add_sectname ("", ".shstrtab");
+    add_sectname ("", ".symtab");
+    add_sectname ("", ".strtab");
+    for (i=0; i<nsects; i++) {
+       nsections++;                   /* for the section itself */
+       if (sects[i]->head) {
+           nsections++;               /* for its relocations */
+           add_sectname (".rel", sects[i]->name);
+       }
+    }
+
+    /*
+     * Do the comment.
+     */
+    *comment = '\0';
+    commlen = 2+sprintf(comment+1, "The Netwide Assembler %s", NASM_VER);
+
+    /*
+     * Output the ELF header.
+     */
+    fwrite ("\177ELF\1\1\1\0\0\0\0\0\0\0\0\0", 16, 1, elffp);
+    fwriteshort (1, elffp);           /* ET_REL relocatable file */
+    fwriteshort (3, elffp);           /* EM_386 processor ID */
+    fwritelong (1L, elffp);           /* EV_CURRENT file format version */
+    fwritelong (0L, elffp);           /* no entry point */
+    fwritelong (0L, elffp);           /* no program header table */
+    fwritelong (0x40L, elffp);        /* section headers straight after
+                                       * ELF header plus alignment */
+    fwritelong (0L, elffp);           /* 386 defines no special flags */
+    fwriteshort (0x34, elffp);        /* size of ELF header */
+    fwriteshort (0, elffp);           /* no program header table, again */
+    fwriteshort (0, elffp);           /* still no program header table */
+    fwriteshort (0x28, elffp);        /* size of section header */
+    fwriteshort (nsections, elffp);    /* number of sections */
+    fwriteshort (nsects+2, elffp);     /* string table section index for
+                                       * section header table */
+    fwritelong (0L, elffp);           /* align to 0x40 bytes */
+    fwritelong (0L, elffp);
+    fwritelong (0L, elffp);
+
+    /*
+     * Build the symbol table and relocation tables.
+     */
+    symtab = elf_build_symtab (&symtablen, &symtablocal);
+    for (i=0; i<nsects; i++)
+       if (sects[i]->head)
+           sects[i]->rel = elf_build_reltab (&sects[i]->rellen,
+                                             sects[i]->head);
+
+    /*
+     * Now output the section header table.
+     */
+
+    elf_foffs = 0x40 + 0x28 * nsections;
+    align = ((elf_foffs+SEG_ALIGN_1) & ~SEG_ALIGN_1) - elf_foffs;
+    elf_foffs += align;
+    elf_nsect = 0;
+
+    elf_section_header (0, 0, 0, NULL, FALSE, 0L, 0, 0, 0, 0); /* SHN_UNDEF */
+    p = shstrtab+1;
+    for (i=0; i<nsects; i++) {
+       elf_section_header (p - shstrtab, sects[i]->type, sects[i]->flags,
+                           (sects[i]->type == SHT_PROGBITS ?
+                            sects[i]->data : NULL), TRUE,
+                           sects[i]->len, 0, 0, sects[i]->align, 0);
+       p += strlen(p)+1;
+    }
+    elf_section_header (p - shstrtab, 1, 0, comment, FALSE,
+                       (long)commlen, 0, 0, 1, 0);/* .comment */
+    p += strlen(p)+1;
+    elf_section_header (p - shstrtab, 3, 0, shstrtab, FALSE,
+                       (long)shstrtablen, 0, 0, 1, 0);/* .shstrtab */
+    p += strlen(p)+1;
+    elf_section_header (p - shstrtab, 2, 0, symtab, TRUE,
+                       symtablen, nsects+4, symtablocal, 4, 16);/* .symtab */
+    p += strlen(p)+1;
+    elf_section_header (p - shstrtab, 3, 0, strs, TRUE,
+                       strslen, 0, 0, 1, 0);       /* .strtab */
+    for (i=0; i<nsects; i++) if (sects[i]->head) {
+       p += strlen(p)+1;
+       elf_section_header (p - shstrtab, 9, 0, sects[i]->rel, TRUE,
+                           sects[i]->rellen, nsects+3, i+1, 4, 8);
+    }
+
+    fwrite (align_str, align, 1, elffp);
+
+    /*
+     * Now output the sections.
+     */
+    elf_write_sections();
+
+    saa_free (symtab);
+}
+
+static struct SAA *elf_build_symtab (long *len, long *local) {
+    struct SAA *s = saa_init(1L);
+    struct Symbol *sym;
+    unsigned char entry[16], *p;
+    int i;
+
+    *len = *local = 0;
+
+    /*
+     * First, an all-zeros entry, required by the ELF spec.
+     */
+    saa_wbytes (s, NULL, 16L);        /* null symbol table entry */
+    *len += 16;
+    (*local)++;
+
+    /*
+     * Next, an entry for the file name.
+     */
+    p = entry;
+    WRITELONG (p, 1);                 /* we know it's 1st thing in strtab */
+    WRITELONG (p, 0);                 /* no value */
+    WRITELONG (p, 0);                 /* no size either */
+    WRITESHORT (p, 4);                /* type FILE */
+    WRITESHORT (p, SHN_ABS);
+    saa_wbytes (s, entry, 16L);
+    *len += 16;
+    (*local)++;
+
+    /*
+     * Now some standard symbols defining the segments, for relocation
+     * purposes.
+     */
+    for (i = 1; i <= nsects+1; i++) {
+       p = entry;
+       WRITELONG (p, 0);              /* no symbol name */
+       WRITELONG (p, 0);              /* offset zero */
+       WRITELONG (p, 0);              /* size zero */
+       WRITESHORT (p, 3);             /* local section-type thing */
+       WRITESHORT (p, (i==1 ? SHN_ABS : i-1));   /* the section id */
+       saa_wbytes (s, entry, 16L);
+       *len += 16;
+       (*local)++;
+    }
+
+    /*
+     * Now the other local symbols.
+     */
+    saa_rewind (syms);
+    while ( (sym = saa_rstruct (syms)) ) {
+       if (sym->type & SYM_GLOBAL)
+           continue;
+       p = entry;
+       WRITELONG (p, sym->strpos);
+       WRITELONG (p, sym->value);
+       WRITELONG (p, sym->size);
+       WRITESHORT (p, sym->type);     /* local non-typed thing */
+       WRITESHORT (p, sym->section);
+       saa_wbytes (s, entry, 16L);
+        *len += 16;
+       (*local)++;
+    }
+
+    /*
+     * Now the global symbols.
+     */
+    saa_rewind (syms);
+    while ( (sym = saa_rstruct (syms)) ) {
+       if (!(sym->type & SYM_GLOBAL))
+           continue;
+       p = entry;
+       WRITELONG (p, sym->strpos);
+       WRITELONG (p, sym->value);
+       WRITELONG (p, sym->size);
+       WRITESHORT (p, sym->type);     /* global non-typed thing */
+       WRITESHORT (p, sym->section);
+       saa_wbytes (s, entry, 16L);
+       *len += 16;
+    }
+
+    return s;
+}
+
+static struct SAA *elf_build_reltab (long *len, struct Reloc *r) {
+    struct SAA *s;
+    unsigned char *p, entry[8];
+
+    if (!r)
+       return NULL;
+
+    s = saa_init(1L);
+    *len = 0;
+
+    while (r) {
+       long sym = r->symbol;
+
+       if (sym >= GLOBAL_TEMP_BASE)
+           sym += -GLOBAL_TEMP_BASE + (nsects+3) + nlocals;
+
+       p = entry;
+       WRITELONG (p, r->address);
+       WRITELONG (p, (sym << 8) + r->type);
+       saa_wbytes (s, entry, 8L);
+       *len += 8;
+
+       r = r->next;
+    }
+
+    return s;
+}
+
+static void elf_section_header (int name, int type, int flags,
+                               void *data, int is_saa, long datalen,
+                               int link, int info, int align, int eltsize) {
+    elf_sects[elf_nsect].data = data;
+    elf_sects[elf_nsect].len = datalen;
+    elf_sects[elf_nsect].is_saa = is_saa;
+    elf_nsect++;
+
+    fwritelong ((long)name, elffp);
+    fwritelong ((long)type, elffp);
+    fwritelong ((long)flags, elffp);
+    fwritelong (0L, elffp);           /* no address, ever, in object files */
+    fwritelong (type == 0 ? 0L : elf_foffs, elffp);
+    fwritelong (datalen, elffp);
+    if (data)
+       elf_foffs += (datalen+SEG_ALIGN_1) & ~SEG_ALIGN_1;
+    fwritelong ((long)link, elffp);
+    fwritelong ((long)info, elffp);
+    fwritelong ((long)align, elffp);
+    fwritelong ((long)eltsize, elffp);
+}
+
+static void elf_write_sections (void) {
+    int i;
+    for (i = 0; i < elf_nsect; i++)
+       if (elf_sects[i].data) {
+           long len = elf_sects[i].len;
+           long reallen = (len+SEG_ALIGN_1) & ~SEG_ALIGN_1;
+           long align = reallen - len;
+           if (elf_sects[i].is_saa)
+               saa_fpwrite (elf_sects[i].data, elffp);
+           else
+               fwrite (elf_sects[i].data, len, 1, elffp);
+           fwrite (align_str, align, 1, elffp);
+       }
+}
+
+static void elf_sect_write (struct Section *sect,
+                            unsigned char *data, unsigned long len) {
+    saa_wbytes (sect->data, data, len);
+    sect->len += len;
+}
+
+static long elf_segbase (long segment) {
+    return segment;
+}
+
+static int elf_directive (char *directive, char *value, int pass) {
+    return 0;
+}
+
+static void elf_filename (char *inname, char *outname, efunc error) {
+    strcpy(elf_module, inname);
+    standard_extension (inname, outname, ".o", error);
+}
+
+static char *elf_stdmac[] = {
+    "%define __SECT__ [section .text]",
+    NULL
+};
+
+struct ofmt of_elf = {
+    "ELF32 (i386) object files (e.g. Linux)",
+    "elf",
+    elf_stdmac,
+    elf_init,
+    elf_out,
+    elf_deflabel,
+    elf_section_names,
+    elf_segbase,
+    elf_directive,
+    elf_filename,
+    elf_cleanup
+};
+
+#endif /* OF_ELF */
diff --git a/i386/nasm/outform.c b/i386/nasm/outform.c
new file mode 100644 (file)
index 0000000..2f1cc80
--- /dev/null
@@ -0,0 +1,65 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
+ * Reserved.  This file contains Original Code and/or Modifications of
+ * Original Code as defined in and that are subject to the Apple Public
+ * Source License Version 1.1 (the "License").  You may not use this file
+ * except in compliance with the License.  Please obtain a copy of the
+ * License at http://www.apple.com/publicsource and read it before using
+ * this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/* outform.c   manages a list of output formats, and associates
+ *             them with their relevant drivers. Also has a
+ *             routine to find the correct driver given a name
+ *             for it
+ *
+ * The Netwide Assembler is copyright (C) 1996 Simon Tatham and
+ * Julian Hall. All rights reserved. The software is
+ * redistributable under the licence given in the file "Licence"
+ * distributed in the NASM archive.
+ */
+
+#include <stdio.h>
+#include <string.h>
+#include "outform.h"
+
+static struct ofmt *drivers[MAX_OUTPUT_FORMATS];
+static int ndrivers = 0;
+
+struct ofmt *ofmt_find(char *name)     /* find driver */
+{
+    int i;
+
+    for (i=0; i<ndrivers; i++)
+       if (!strcmp(name,drivers[i]->shortname))
+           return drivers[i];
+
+    return NULL;
+}
+
+void ofmt_list(struct ofmt *deffmt, FILE *fp)
+{
+    int i;
+    for (i=0; i<ndrivers; i++)
+       fprintf(fp, "  %c %-7s%s\n",
+               drivers[i] == deffmt ? '*' : ' ',
+               drivers[i]->shortname,
+               drivers[i]->fullname);
+}
+
+void ofmt_register (struct ofmt *info) {
+    drivers[ndrivers++] = info;
+}
diff --git a/i386/nasm/outform.h b/i386/nasm/outform.h
new file mode 100644 (file)
index 0000000..63521eb
--- /dev/null
@@ -0,0 +1,199 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
+ * Reserved.  This file contains Original Code and/or Modifications of
+ * Original Code as defined in and that are subject to the Apple Public
+ * Source License Version 1.1 (the "License").  You may not use this file
+ * except in compliance with the License.  Please obtain a copy of the
+ * License at http://www.apple.com/publicsource and read it before using
+ * this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/* outform.h   header file for binding output format drivers to the
+ *              remainder of the code in the Netwide Assembler
+ *
+ * The Netwide Assembler is copyright (C) 1996 Simon Tatham and
+ * Julian Hall. All rights reserved. The software is
+ * redistributable under the licence given in the file "Licence"
+ * distributed in the NASM archive.
+ */
+
+/*
+ * This header file allows configuration of which output formats
+ * get compiled into the NASM binary. You can configure by defining
+ * various preprocessor symbols beginning with "OF_", either on the
+ * compiler command line or at the top of this file.
+ *
+ * OF_ONLY                -- only include specified object formats
+ * OF_name                -- ensure that output format 'name' is included
+ * OF_NO_name             -- remove output format 'name'
+ * OF_DOS                 -- ensure that 'obj', 'bin' & 'win32' are included.
+ * OF_UNIX                -- ensure that 'aout', 'aoutb', 'coff', 'elf' are in.
+ * OF_OTHERS              -- ensure that 'bin', 'as86' & 'rdf' are in.
+ * OF_ALL                 -- ensure that all formats are included.
+ *
+ * OF_DEFAULT=of_name     -- ensure that 'name' is the default format.
+ *
+ * eg: -DOF_UNIX -DOF_ELF -DOF_DEFAULT=of_elf would be a suitable config
+ * for an average linux system.
+ *
+ * Default config = -DOF_ALL -DOF_DEFAULT=of_bin
+ *
+ * You probably only want to set these options while compiling 'nasm.c'. */
+
+#ifndef NASM_OUTFORM_H
+#define NASM_OUTFORM_H
+
+#include "nasm.h"
+
+#define MAX_OUTPUT_FORMATS 16
+
+struct ofmt *ofmt_find(char *);
+void ofmt_list(struct ofmt *, FILE *);
+void ofmt_register (struct ofmt *);
+
+/* -------------- USER MODIFIABLE PART ---------------- */
+
+/*
+ * Insert #defines here in accordance with the configuration
+ * instructions above.
+ *
+ * E.g.
+ *
+ * #define OF_ONLY
+ * #define OF_OBJ
+ * #define OF_BIN
+ *
+ * for a 16-bit DOS assembler with no extraneous formats.
+ */
+
+/* ------------ END USER MODIFIABLE PART -------------- */
+
+/* ====configurable info begins here==== */
+/* formats configurable:
+ * bin,obj,elf,aout,aoutb,coff,win32,as86,rdf */
+
+/* process options... */
+
+#ifndef OF_ONLY
+#ifndef OF_ALL
+#define OF_ALL      /* default is to have all formats */
+#endif
+#endif
+
+#ifdef OF_ALL      /* set all formats on... */
+#ifndef OF_BIN
+#define OF_BIN
+#endif
+#ifndef OF_OBJ
+#define OF_OBJ
+#endif
+#ifndef OF_ELF
+#define OF_ELF
+#endif
+#ifndef OF_COFF
+#define OF_COFF
+#endif
+#ifndef OF_AOUT
+#define OF_AOUT
+#endif
+#ifndef OF_AOUTB
+#define OF_AOUTB
+#endif
+#ifndef OF_WIN32
+#define OF_WIN32
+#endif
+#ifndef OF_AS86
+#define OF_AS86
+#endif
+#ifndef OF_RDF
+#define OF_RDF
+#endif
+#endif /* OF_ALL */
+
+/* turn on groups of formats specified.... */
+#ifdef OF_DOS
+#ifndef OF_OBJ
+#define OF_OBJ
+#endif
+#ifndef OF_BIN
+#define OF_BIN
+#endif
+#ifndef OF_WIN32
+#define OF_WIN32
+#endif
+#endif
+
+#ifdef OF_UNIX
+#ifndef OF_AOUT
+#define OF_AOUT
+#endif
+#ifndef OF_AOUTB
+#define OF_AOUTB
+#endif
+#ifndef OF_COFF
+#define OF_COFF
+#endif
+#ifndef OF_ELF
+#define OF_ELF
+#endif
+#endif
+
+#ifdef OF_OTHERS
+#ifndef OF_BIN
+#define OF_BIN
+#endif
+#ifndef OF_AS86
+#define OF_AS86
+#endif
+#ifndef OF_RDF
+#define OF_RDF
+#endif
+#endif
+
+/* finally... override any format specifically specifed to be off */
+#ifdef OF_NO_BIN
+#undef OF_BIN
+#endif
+#ifdef OF_NO_OBJ
+#undef OF_OBJ
+#endif
+#ifdef OF_NO_ELF
+#undef OF_ELF
+#endif
+#ifdef OF_NO_AOUT
+#undef OF_AOUT
+#endif
+#ifdef OF_NO_AOUTB
+#undef OF_AOUTB
+#endif
+#ifdef OF_NO_COFF
+#undef OF_COFF
+#endif
+#ifdef OF_NO_WIN32
+#undef OF_WIN32
+#endif
+#ifdef OF_NO_AS86
+#undef OF_AS86
+#endif
+#ifdef OF_NO_RDF
+#undef OF_RDF
+#endif
+
+#ifndef OF_DEFAULT
+#define OF_DEFAULT of_bin
+#endif
+
+#endif  /* NASM_OUTFORM_H */
diff --git a/i386/nasm/outobj.c b/i386/nasm/outobj.c
new file mode 100644 (file)
index 0000000..e56830e
--- /dev/null
@@ -0,0 +1,1794 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
+ * Reserved.  This file contains Original Code and/or Modifications of
+ * Original Code as defined in and that are subject to the Apple Public
+ * Source License Version 1.1 (the "License").  You may not use this file
+ * except in compliance with the License.  Please obtain a copy of the
+ * License at http://www.apple.com/publicsource and read it before using
+ * this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/* outobj.c    output routines for the Netwide Assembler to produce
+ *             Microsoft 16-bit .OBJ object files
+ *
+ * The Netwide Assembler is copyright (C) 1996 Simon Tatham and
+ * Julian Hall. All rights reserved. The software is
+ * redistributable under the licence given in the file "Licence"
+ * distributed in the NASM archive.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+
+#include "nasm.h"
+#include "nasmlib.h"
+#include "outform.h"
+
+#ifdef OF_OBJ
+
+static char obj_infile[FILENAME_MAX];
+static int obj_uppercase;
+
+static efunc error;
+static evalfunc evaluate;
+static ldfunc deflabel;
+static FILE *ofp;
+static long first_seg;
+static int any_segs;
+
+#define LEDATA_MAX 1024                       /* maximum size of LEDATA record */
+#define RECORD_MAX 1024                       /* maximum size of _any_ record */
+#define GROUP_MAX 256                 /* we won't _realistically_ have more
+                                       * than this many segs in a group */
+#define EXT_BLKSIZ 256                /* block size for externals list */
+
+static unsigned char record[RECORD_MAX], *recptr;
+
+struct Segment;                               /* need to know these structs exist */
+struct Group;
+
+static struct Public {
+    struct Public *next;
+    char *name;
+    long offset;
+    long segment;                     /* only if it's far-absolute */
+} *fpubhead, **fpubtail;
+
+static struct External {
+    struct External *next;
+    char *name;
+    long commonsize;
+    long commonelem;                  /* element size if FAR, else zero */
+    int index;                        /* OBJ-file external index */
+    enum {
+       DEFWRT_NONE,                   /* no unusual default-WRT */
+       DEFWRT_STRING,                 /* a string we don't yet understand */
+       DEFWRT_SEGMENT,                /* a segment */
+       DEFWRT_GROUP                   /* a group */
+    } defwrt_type;
+    union {
+       char *string;
+       struct Segment *seg;
+       struct Group *grp;
+    } defwrt_ptr;
+    struct External *next_dws;        /* next with DEFWRT_STRING */
+} *exthead, **exttail, *dws;
+
+static int externals;
+
+static struct ExtBack {
+    struct ExtBack *next;
+    struct External *exts[EXT_BLKSIZ];
+} *ebhead, **ebtail;
+
+static struct Segment {
+    struct Segment *next;
+    long index;                               /* the NASM segment id */
+    long obj_index;                   /* the OBJ-file segment index */
+    struct Group *grp;                /* the group it belongs to */
+    long currentpos;
+    long align;                               /* can be SEG_ABS + absolute addr */
+    enum {
+       CMB_PRIVATE = 0,
+       CMB_PUBLIC = 2,
+       CMB_STACK = 5,
+       CMB_COMMON = 6
+    } combine;
+    long use32;                               /* is this segment 32-bit? */
+    struct Public *pubhead, **pubtail;
+    char *name;
+    char *segclass, *overlay;         /* `class' is a C++ keyword :-) */
+} *seghead, **segtail, *obj_seg_needs_update;
+
+static struct Group {
+    struct Group *next;
+    char *name;
+    long index;                               /* NASM segment id */
+    long obj_index;                   /* OBJ-file group index */
+    long nentries;                    /* number of elements... */
+    long nindices;                    /* ...and number of index elts... */
+    union {
+       long index;
+       char *name;
+    } segs[GROUP_MAX];                /* ...in this */
+} *grphead, **grptail, *obj_grp_needs_update;
+
+static struct ObjData {
+    struct ObjData *next;
+    int nonempty;
+    struct Segment *seg;
+    long startpos;
+    int letype, ftype;
+    unsigned char ledata[LEDATA_MAX], *lptr;
+    unsigned char fixupp[RECORD_MAX], *fptr;
+} *datahead, *datacurr, **datatail;
+
+static struct ImpDef {
+    struct ImpDef *next;
+    char *extname;
+    char *libname;
+    unsigned int impindex;
+    char *impname;
+} *imphead, **imptail;
+
+static struct ExpDef {
+    struct ExpDef *next;
+    char *intname;
+    char *extname;
+    unsigned int ordinal;
+    int flags;
+} *exphead, **exptail;
+
+#define EXPDEF_FLAG_ORDINAL  0x80
+#define EXPDEF_FLAG_RESIDENT 0x40
+#define EXPDEF_FLAG_NODATA   0x20
+#define EXPDEF_MASK_PARMCNT  0x1F
+
+static long obj_entry_seg, obj_entry_ofs;
+
+enum RecordID {                               /* record ID codes */
+
+    THEADR = 0x80,                    /* module header */
+    COMENT = 0x88,                    /* comment record */
+
+    LNAMES = 0x96,                    /* list of names */
+
+    SEGDEF = 0x98,                    /* segment definition */
+    GRPDEF = 0x9A,                    /* group definition */
+    EXTDEF = 0x8C,                    /* external definition */
+    PUBDEF = 0x90,                    /* public definition */
+    COMDEF = 0xB0,                    /* common definition */
+
+    LEDATA = 0xA0,                    /* logical enumerated data */
+    FIXUPP = 0x9C,                    /* fixups (relocations) */
+
+    MODEND = 0x8A                     /* module end */
+};
+
+extern struct ofmt of_obj;
+
+static long obj_ledata_space(struct Segment *);
+static int obj_fixup_free(struct Segment *);
+static void obj_ledata_new(struct Segment *);
+static void obj_ledata_commit(void);
+static void obj_write_fixup (struct ObjData *, int, int, long, long, long);
+static long obj_segment (char *, int, int *);
+static void obj_write_file(void);
+static unsigned char *obj_write_data(unsigned char *, unsigned char *, int);
+static unsigned char *obj_write_byte(unsigned char *, int);
+static unsigned char *obj_write_word(unsigned char *, int);
+static unsigned char *obj_write_dword(unsigned char *, long);
+static unsigned char *obj_write_rword(unsigned char *, int);
+static unsigned char *obj_write_name(unsigned char *, char *);
+static unsigned char *obj_write_index(unsigned char *, int);
+static unsigned char *obj_write_value(unsigned char *, unsigned long);
+static void obj_record(int, unsigned char *, unsigned char *);
+static int obj_directive (char *, char *, int);
+
+static void obj_init (FILE *fp, efunc errfunc, ldfunc ldef, evalfunc eval) {
+    ofp = fp;
+    error = errfunc;
+    evaluate = eval;
+    deflabel = ldef;
+    first_seg = seg_alloc();
+    any_segs = FALSE;
+    fpubhead = NULL;
+    fpubtail = &fpubhead;
+    exthead = NULL;
+    exttail = &exthead;
+    imphead = NULL;
+    imptail = &imphead;
+    exphead = NULL;
+    exptail = &exphead;
+    dws = NULL;
+    externals = 0;
+    ebhead = NULL;
+    ebtail = &ebhead;
+    seghead = obj_seg_needs_update = NULL;
+    segtail = &seghead;
+    grphead = obj_grp_needs_update = NULL;
+    grptail = &grphead;
+    datahead = datacurr = NULL;
+    datatail = &datahead;
+    obj_entry_seg = NO_SEG;
+    obj_uppercase = FALSE;
+}
+
+static void obj_cleanup (void) {
+    obj_write_file();
+    fclose (ofp);
+    while (seghead) {
+       struct Segment *segtmp = seghead;
+       seghead = seghead->next;
+       while (segtmp->pubhead) {
+           struct Public *pubtmp = segtmp->pubhead;
+           segtmp->pubhead = pubtmp->next;
+           nasm_free (pubtmp->name);
+           nasm_free (pubtmp);
+       }
+       nasm_free (segtmp);
+    }
+    while (fpubhead) {
+       struct Public *pubtmp = fpubhead;
+       fpubhead = fpubhead->next;
+       nasm_free (pubtmp->name);
+       nasm_free (pubtmp);
+    }
+    while (exthead) {
+       struct External *exttmp = exthead;
+       exthead = exthead->next;
+       nasm_free (exttmp);
+    }
+    while (imphead) {
+       struct ImpDef *imptmp = imphead;
+       imphead = imphead->next;
+       nasm_free (imptmp->extname);
+       nasm_free (imptmp->libname);
+       nasm_free (imptmp->impname);   /* nasm_free won't mind if it's NULL */
+       nasm_free (imptmp);
+    }
+    while (exphead) {
+       struct ExpDef *exptmp = exphead;
+       exphead = exphead->next;
+       nasm_free (exptmp->extname);
+       nasm_free (exptmp->intname);
+       nasm_free (exptmp);
+    }
+    while (ebhead) {
+       struct ExtBack *ebtmp = ebhead;
+       ebhead = ebhead->next;
+       nasm_free (ebtmp);
+    }
+    while (grphead) {
+       struct Group *grptmp = grphead;
+       grphead = grphead->next;
+       nasm_free (grptmp);
+    }
+    while (datahead) {
+       struct ObjData *datatmp = datahead;
+       datahead = datahead->next;
+       nasm_free (datatmp);
+    }
+}
+
+static void obj_ext_set_defwrt (struct External *ext, char *id) {
+    struct Segment *seg;
+    struct Group *grp;
+
+    for (seg = seghead; seg; seg = seg->next)
+       if (!strcmp(seg->name, id)) {
+           ext->defwrt_type = DEFWRT_SEGMENT;
+           ext->defwrt_ptr.seg = seg;
+           nasm_free (id);
+           return;
+       }
+
+    for (grp = grphead; grp; grp = grp->next)
+       if (!strcmp(grp->name, id)) {
+           ext->defwrt_type = DEFWRT_GROUP;
+           ext->defwrt_ptr.grp = grp;
+           nasm_free (id);
+           return;
+       }
+
+    ext->defwrt_type = DEFWRT_STRING;
+    ext->defwrt_ptr.string = id;
+    ext->next_dws = dws;
+    dws = ext;
+}
+
+static void obj_deflabel (char *name, long segment,
+                         long offset, int is_global, char *special) {
+    /*
+     * We have three cases:
+     *
+     * (i) `segment' is a segment-base. If so, set the name field
+     * for the segment or group structure it refers to, and then
+     * return.
+     *
+     * (ii) `segment' is one of our segments, or a SEG_ABS segment.
+     * Save the label position for later output of a PUBDEF record.
+     * (Or a MODPUB, if we work out how.)
+     *
+     * (iii) `segment' is not one of our segments. Save the label
+     * position for later output of an EXTDEF, and also store a
+     * back-reference so that we can map later references to this
+     * segment number to the external index.
+     */
+    struct External *ext;
+    struct ExtBack *eb;
+    struct Segment *seg;
+    int i;
+    int used_special = FALSE;         /* have we used the special text? */
+
+    /*
+     * If it's a special-retry from pass two, discard it.
+     */
+    if (is_global == 3)
+       return;
+
+    /*
+     * First check for the double-period, signifying something
+     * unusual.
+     */
+    if (name[0] == '.' && name[1] == '.' && name[2] != '@') {
+       if (!strcmp(name, "..start")) {
+           obj_entry_seg = segment;
+           obj_entry_ofs = offset;
+           return;
+       }
+       error (ERR_NONFATAL, "unrecognised special symbol `%s'", name);
+    }
+
+    /*
+     * Case (i):
+     */
+    if (obj_seg_needs_update) {
+       obj_seg_needs_update->name = name;
+       return;
+    } else if (obj_grp_needs_update) {
+       obj_grp_needs_update->name = name;
+       return;
+    }
+    if (segment < SEG_ABS && segment != NO_SEG && segment % 2)
+       return;
+
+    if (segment >= SEG_ABS || segment == NO_SEG) {
+       /*
+        * SEG_ABS subcase of (ii).
+        */
+       if (is_global) {
+           struct Public *pub;
+
+           pub = *fpubtail = nasm_malloc(sizeof(*pub));
+           fpubtail = &pub->next;
+           pub->next = NULL;
+           pub->name = nasm_strdup(name);
+           pub->offset = offset;
+           pub->segment = (segment == NO_SEG ? 0 : segment & ~SEG_ABS);
+       }
+       if (special)
+           error(ERR_NONFATAL, "OBJ supports no special symbol features"
+                 " for this symbol type");
+       return;
+    }
+
+    /*
+     * If `any_segs' is still FALSE, we might need to define a
+     * default segment, if they're trying to declare a label in
+     * `first_seg'.
+     */
+    if (!any_segs && segment == first_seg) {
+       int tempint;                   /* ignored */
+       if (segment != obj_segment("__NASMDEFSEG", 2, &tempint))
+           error (ERR_PANIC, "strange segment conditions in OBJ driver");
+    }
+
+    for (seg = seghead; seg; seg = seg->next)
+       if (seg->index == segment) {
+           /*
+            * Case (ii). Maybe MODPUB someday?
+            */
+           if (is_global) {
+               struct Public *pub;
+               pub = *seg->pubtail = nasm_malloc(sizeof(*pub));
+               seg->pubtail = &pub->next;
+               pub->next = NULL;
+               pub->name = nasm_strdup(name);
+               pub->offset = offset;
+           }
+           if (special)
+               error(ERR_NONFATAL, "OBJ supports no special symbol features"
+                     " for this symbol type");
+           return;
+       }
+
+    /*
+     * Case (iii).
+     */
+    ext = *exttail = nasm_malloc(sizeof(*ext));
+    ext->next = NULL;
+    exttail = &ext->next;
+    ext->name = name;
+    ext->defwrt_type = DEFWRT_NONE;
+    if (is_global == 2) {
+       ext->commonsize = offset;
+       ext->commonelem = 1;           /* default FAR */
+    } else
+       ext->commonsize = 0;
+
+    /*
+     * Now process the special text, if any, to find default-WRT
+     * specifications and common-variable element-size and near/far
+     * specifications.
+     */
+    while (special && *special) {
+       used_special = TRUE;
+
+       /*
+        * We might have a default-WRT specification.
+        */
+       if (!nasm_strnicmp(special, "wrt", 3)) {
+           char *p;
+           int len;
+           special += 3;
+           special += strspn(special, " \t");
+           p = nasm_strndup(special, len = strcspn(special, ":"));
+           obj_ext_set_defwrt (ext, p);
+           special += len;
+           if (*special && *special != ':')
+               error(ERR_NONFATAL, "`:' expected in special symbol"
+                     " text for `%s'", ext->name);
+           else if (*special == ':')
+               special++;
+       }
+
+       /*
+        * The NEAR or FAR keywords specify nearness or
+        * farness. FAR gives default element size 1.
+        */
+       if (!nasm_strnicmp(special, "far", 3)) {
+           if (ext->commonsize)
+               ext->commonelem = 1;
+           else
+               error(ERR_NONFATAL, "`%s': `far' keyword may only be applied"
+                     " to common variables\n", ext->name);
+           special += 3;
+           special += strspn(special, " \t");
+       } else if (!nasm_strnicmp(special, "near", 4)) {
+           if (ext->commonsize)
+               ext->commonelem = 0;
+           else
+               error(ERR_NONFATAL, "`%s': `far' keyword may only be applied"
+                     " to common variables\n", ext->name);
+           special += 4;
+           special += strspn(special, " \t");
+       }
+
+       /*
+        * If it's a common, and anything else remains on the line
+        * before a further colon, evaluate it as an expression and
+        * use that as the element size. Forward references aren't
+        * allowed.
+        */
+       if (*special == ':')
+           special++;
+       else if (*special) {
+           if (ext->commonsize) {
+               expr *e;
+               struct tokenval tokval;
+
+               stdscan_reset();
+               stdscan_bufptr = special;
+               tokval.t_type = TOKEN_INVALID;
+               e = evaluate(stdscan, NULL, &tokval, NULL, 1, error, NULL);
+               if (e) {
+                   if (!is_simple(e))
+                       error (ERR_NONFATAL, "cannot use relocatable"
+                              " expression as common-variable element size");
+                   else
+                       ext->commonelem = reloc_value(e);
+               }
+               special = stdscan_bufptr;
+           } else {
+               error (ERR_NONFATAL, "`%s': element-size specifications only"
+                      " apply to common variables", ext->name);
+               while (*special && *special != ':')
+                   special++;
+               if (*special == ':')
+                   special++;
+           }
+       }
+    }
+
+    i = segment/2;
+    eb = ebhead;
+    if (!eb) {
+       eb = *ebtail = nasm_malloc(sizeof(*eb));
+       eb->next = NULL;
+       ebtail = &eb->next;
+    }
+    while (i > EXT_BLKSIZ) {
+       if (eb && eb->next)
+           eb = eb->next;
+       else {
+           eb = *ebtail = nasm_malloc(sizeof(*eb));
+           eb->next = NULL;
+           ebtail = &eb->next;
+       }
+       i -= EXT_BLKSIZ;
+    }
+    eb->exts[i] = ext;
+    ext->index = ++externals;
+
+    if (special && !used_special)
+       error(ERR_NONFATAL, "OBJ supports no special symbol features"
+             " for this symbol type");
+}
+
+static void obj_out (long segto, void *data, unsigned long type,
+                    long segment, long wrt) {
+    long size, realtype;
+    unsigned char *ucdata;
+    long ldata;
+    struct Segment *seg;
+
+    /*
+     * handle absolute-assembly (structure definitions)
+     */
+    if (segto == NO_SEG) {
+       if ((type & OUT_TYPMASK) != OUT_RESERVE)
+           error (ERR_NONFATAL, "attempt to assemble code in [ABSOLUTE]"
+                  " space");
+       return;
+    }
+
+    /*
+     * If `any_segs' is still FALSE, we must define a default
+     * segment.
+     */
+    if (!any_segs) {
+       int tempint;                   /* ignored */
+       if (segto != obj_segment("__NASMDEFSEG", 2, &tempint))
+           error (ERR_PANIC, "strange segment conditions in OBJ driver");
+    }
+
+    /*
+     * Find the segment we are targetting.
+     */
+    for (seg = seghead; seg; seg = seg->next)
+       if (seg->index == segto)
+           break;
+    if (!seg)
+       error (ERR_PANIC, "code directed to nonexistent segment?");
+
+    size = type & OUT_SIZMASK;
+    realtype = type & OUT_TYPMASK;
+    if (realtype == OUT_RAWDATA) {
+       ucdata = data;
+       while (size > 0) {
+           long len = obj_ledata_space(seg);
+           if (len == 0) {
+               obj_ledata_new(seg);
+               len = obj_ledata_space(seg);
+           }
+           if (len > size)
+               len = size;
+           datacurr->lptr = obj_write_data (datacurr->lptr, ucdata, len);
+           datacurr->nonempty = TRUE;
+           ucdata += len;
+           size -= len;
+           seg->currentpos += len;
+       }
+    } else if (realtype == OUT_ADDRESS || realtype == OUT_REL2ADR ||
+              realtype == OUT_REL4ADR) {
+       int rsize;
+
+       if (segment == NO_SEG && realtype != OUT_ADDRESS)
+           error(ERR_NONFATAL, "relative call to absolute address not"
+                 " supported by OBJ format");
+       if (segment >= SEG_ABS)
+           error(ERR_NONFATAL, "far-absolute relocations not supported"
+                 " by OBJ format");
+       ldata = *(long *)data;
+       if (realtype == OUT_REL2ADR) {
+           ldata += (size-2);
+           size = 2;
+       }
+       if (realtype == OUT_REL4ADR) {
+           ldata += (size-4);
+           size = 4;
+       }
+       if (obj_ledata_space(seg) < 4 || !obj_fixup_free(seg))
+           obj_ledata_new(seg);
+       if (size == 2)
+           datacurr->lptr = obj_write_word (datacurr->lptr, ldata);
+       else
+           datacurr->lptr = obj_write_dword (datacurr->lptr, ldata);
+       datacurr->nonempty = TRUE;
+       rsize = size;
+       if (segment < SEG_ABS && (segment != NO_SEG && segment % 2) &&
+           size == 4) {
+           /*
+            * This is a 4-byte segment-base relocation such as
+            * `MOV EAX,SEG foo'. OBJ format can't actually handle
+            * these, but if the constant term has the 16 low bits
+            * zero, we can just apply a 2-byte segment-base
+            * relocation to the low word instead.
+            */
+           rsize = 2;
+           if (ldata & 0xFFFF)
+               error(ERR_NONFATAL, "OBJ format cannot handle complex"
+                     " dword-size segment base references");
+       }
+       if (segment != NO_SEG)
+           obj_write_fixup (datacurr, rsize,
+                            (realtype == OUT_REL2ADR ||
+                             realtype == OUT_REL4ADR ? 0 : 0x4000),
+                            segment, wrt,
+                            (seg->currentpos - datacurr->startpos));
+       seg->currentpos += size;
+    } else if (realtype == OUT_RESERVE) {
+       obj_ledata_commit();
+       seg->currentpos += size;
+    }
+}
+
+static long obj_ledata_space(struct Segment *segto) {
+    if (datacurr && datacurr->seg == segto)
+       return datacurr->ledata + LEDATA_MAX - datacurr->lptr;
+    else
+       return 0;
+}
+
+static int obj_fixup_free(struct Segment *segto) {
+    if (datacurr && datacurr->seg == segto)
+       return (datacurr->fixupp + RECORD_MAX - datacurr->fptr) > 8;
+    else
+       return 0;
+}
+
+static void obj_ledata_new(struct Segment *segto) {
+    datacurr = *datatail = nasm_malloc(sizeof(*datacurr));
+    datacurr->next = NULL;
+    datatail = &datacurr->next;
+    datacurr->nonempty = FALSE;
+    datacurr->lptr = datacurr->ledata;
+    datacurr->fptr = datacurr->fixupp;
+    datacurr->seg = segto;
+    if (segto->use32)
+       datacurr->letype = LEDATA+1;
+    else
+       datacurr->letype = LEDATA;
+    datacurr->startpos = segto->currentpos;
+    datacurr->ftype = FIXUPP;
+
+    datacurr->lptr = obj_write_index (datacurr->lptr, segto->obj_index);
+    if (datacurr->letype == LEDATA)
+       datacurr->lptr = obj_write_word (datacurr->lptr, segto->currentpos);
+    else
+       datacurr->lptr = obj_write_dword (datacurr->lptr, segto->currentpos);
+}
+
+static void obj_ledata_commit(void) {
+    datacurr = NULL;
+}
+
+static void obj_write_fixup (struct ObjData *data, int bytes,
+                            int segrel, long seg, long wrt,
+                            long offset) {
+    int locat, method;
+    int base;
+    long tidx, fidx;
+    struct Segment *s = NULL;
+    struct Group *g = NULL;
+    struct External *e = NULL;
+
+    if (bytes == 1) {
+       error(ERR_NONFATAL, "`obj' output driver does not support"
+             " one-byte relocations");
+       return;
+    }
+
+    locat = 0x8000 | segrel | offset;
+    if (seg % 2) {
+       base = TRUE;
+       locat |= 0x800;
+       seg--;
+       if (bytes != 2)
+           error(ERR_PANIC, "OBJ: 4-byte segment base fixup got"
+                 " through sanity check");
+    } else {
+       base = FALSE;
+       if (bytes == 2)
+           locat |= 0x400;
+       else {
+           locat |= 0x2400;
+           data->ftype = FIXUPP+1;    /* need new-style FIXUPP record */
+       }
+    }
+    data->fptr = obj_write_rword (data->fptr, locat);
+
+    tidx = fidx = -1, method = 0;      /* placate optimisers */
+
+    /*
+     * See if we can find the segment ID in our segment list. If
+     * so, we have a T4 (LSEG) target.
+     */
+    for (s = seghead; s; s = s->next)
+       if (s->index == seg)
+           break;
+    if (s)
+       method = 4, tidx = s->obj_index;
+    else {
+       for (g = grphead; g; g = g->next)
+           if (g->index == seg)
+               break;
+       if (g)
+           method = 5, tidx = g->obj_index;
+       else {
+           long i = seg/2;
+           struct ExtBack *eb = ebhead;
+           while (i > EXT_BLKSIZ) {
+               if (eb)
+                   eb = eb->next;
+               else
+                   break;
+               i -= EXT_BLKSIZ;
+           }
+           if (eb)
+               method = 6, e = eb->exts[i], tidx = e->index;
+           else
+               error(ERR_PANIC,
+                     "unrecognised segment value in obj_write_fixup");
+       }
+    }
+
+    /*
+     * If no WRT given, assume the natural default, which is method
+     * F5 unless:
+     *
+     * - we are doing an OFFSET fixup for a grouped segment, in
+     *   which case we require F1 (group).
+     *
+     * - we are doing an OFFSET fixup for an external with a
+     *   default WRT, in which case we must honour the default WRT.
+     */
+    if (wrt == NO_SEG) {
+       if (!base && s && s->grp)
+           method |= 0x10, fidx = s->grp->obj_index;
+       else if (!base && e && e->defwrt_type != DEFWRT_NONE) {
+           if (e->defwrt_type == DEFWRT_SEGMENT)
+               method |= 0x00, fidx = e->defwrt_ptr.seg->obj_index;
+           else if (e->defwrt_type == DEFWRT_GROUP)
+               method |= 0x10, fidx = e->defwrt_ptr.grp->obj_index;
+           else {
+               error(ERR_NONFATAL, "default WRT specification for"
+                     " external `%s' unresolved", e->name);
+               method |= 0x50, fidx = -1; /* got to do _something_ */
+           }
+       } else
+           method |= 0x50, fidx = -1;
+    } else {
+       /*
+        * See if we can find the WRT-segment ID in our segment
+        * list. If so, we have a F0 (LSEG) frame.
+        */
+       for (s = seghead; s; s = s->next)
+           if (s->index == wrt-1)
+               break;
+       if (s)
+           method |= 0x00, fidx = s->obj_index;
+       else {
+           for (g = grphead; g; g = g->next)
+               if (g->index == wrt-1)
+                   break;
+           if (g)
+               method |= 0x10, fidx = g->obj_index;
+           else {
+               long i = wrt/2;
+               struct ExtBack *eb = ebhead;
+               while (i > EXT_BLKSIZ) {
+                   if (eb)
+                       eb = eb->next;
+                   else
+                       break;
+                   i -= EXT_BLKSIZ;
+               }
+               if (eb)
+                   method |= 0x20, fidx = eb->exts[i]->index;
+               else
+                   error(ERR_PANIC,
+                         "unrecognised WRT value in obj_write_fixup");
+           }
+       }
+    }
+
+    data->fptr = obj_write_byte (data->fptr, method);
+    if (fidx != -1)
+       data->fptr = obj_write_index (data->fptr, fidx);
+    data->fptr = obj_write_index (data->fptr, tidx);
+}
+
+static long obj_segment (char *name, int pass, int *bits) {
+    /*
+     * We call the label manager here to define a name for the new
+     * segment, and when our _own_ label-definition stub gets
+     * called in return, it should register the new segment name
+     * using the pointer it gets passed. That way we save memory,
+     * by sponging off the label manager.
+     */
+    if (!name) {
+       *bits = 16;
+       return first_seg;
+    } else {
+       struct Segment *seg;
+       struct Group *grp;
+       struct External **extp;
+       int obj_idx, i, attrs, rn_error;
+       char *p;
+
+       /*
+        * Look for segment attributes.
+        */
+       attrs = 0;
+       while (*name == '.')
+           name++;                    /* hack, but a documented one */
+       p = name;
+       while (*p && !isspace(*p))
+           p++;
+       if (*p) {
+           *p++ = '\0';
+           while (*p && isspace(*p))
+               *p++ = '\0';
+       }
+       while (*p) {
+           while (*p && !isspace(*p))
+               p++;
+           if (*p) {
+               *p++ = '\0';
+               while (*p && isspace(*p))
+                   *p++ = '\0';
+           }
+
+           attrs++;
+       }
+
+       obj_idx = 1;
+       for (seg = seghead; seg; seg = seg->next) {
+           obj_idx++;
+           if (!strcmp(seg->name, name)) {
+               if (attrs > 0 && pass == 1)
+                   error(ERR_WARNING, "segment attributes specified on"
+                         " redeclaration of segment: ignoring");
+               if (seg->use32)
+                   *bits = 32;
+               else
+                   *bits = 16;
+               return seg->index;
+           }
+       }
+
+       *segtail = seg = nasm_malloc(sizeof(*seg));
+       seg->next = NULL;
+       segtail = &seg->next;
+       seg->index = (any_segs ? seg_alloc() : first_seg);
+       seg->obj_index = obj_idx;
+       seg->grp = NULL;
+       any_segs = TRUE;
+       seg->name = NULL;
+       seg->currentpos = 0;
+       seg->align = 1;                /* default */
+       seg->use32 = FALSE;            /* default */
+       seg->combine = CMB_PUBLIC;     /* default */
+       seg->segclass = seg->overlay = NULL;
+       seg->pubhead = NULL;
+       seg->pubtail = &seg->pubhead;
+
+       /*
+        * Process the segment attributes.
+        */
+       p = name;
+       while (attrs--) {
+           p += strlen(p);
+           while (!*p) p++;
+
+           /*
+            * `p' contains a segment attribute.
+            */
+           if (!nasm_stricmp(p, "private"))
+               seg->combine = CMB_PRIVATE;
+           else if (!nasm_stricmp(p, "public"))
+               seg->combine = CMB_PUBLIC;
+           else if (!nasm_stricmp(p, "common"))
+               seg->combine = CMB_COMMON;
+           else if (!nasm_stricmp(p, "stack"))
+               seg->combine = CMB_STACK;
+           else if (!nasm_stricmp(p, "use16"))
+               seg->use32 = FALSE;
+           else if (!nasm_stricmp(p, "use32"))
+               seg->use32 = TRUE;
+           else if (!nasm_stricmp(p, "flat")) {
+               /*
+                * This segment is an OS/2 FLAT segment. That means
+                * that its default group is group FLAT, even if
+                * the group FLAT does not explicitly _contain_ the
+                * segment.
+                * 
+                * When we see this, we must create the group
+                * `FLAT', containing no segments, if it does not
+                * already exist; then we must set the default
+                * group of this segment to be the FLAT group.
+                */
+               struct Group *grp;
+               for (grp = grphead; grp; grp = grp->next)
+                   if (!strcmp(grp->name, "FLAT"))
+                       break;
+               if (!grp) {
+                   obj_directive ("group", "FLAT", 1);
+                   for (grp = grphead; grp; grp = grp->next)
+                       if (!strcmp(grp->name, "FLAT"))
+                           break;
+                   if (!grp)
+                       error (ERR_PANIC, "failure to define FLAT?!");
+               }
+               seg->grp = grp;
+           } else if (!nasm_strnicmp(p, "class=", 6))
+               seg->segclass = nasm_strdup(p+6);
+           else if (!nasm_strnicmp(p, "overlay=", 8))
+               seg->overlay = nasm_strdup(p+8);
+           else if (!nasm_strnicmp(p, "align=", 6)) {
+               seg->align = readnum(p+6, &rn_error);
+               if (rn_error) {
+                   seg->align = 1;
+                   error (ERR_NONFATAL, "segment alignment should be"
+                          " numeric");
+               }
+               switch ((int) seg->align) {
+                 case 1:              /* BYTE */
+                 case 2:              /* WORD */
+                 case 4:              /* DWORD */
+                 case 16:             /* PARA */
+                 case 256:            /* PAGE */
+                 case 4096:           /* PharLap extension */
+                   break;
+                 case 8:
+                   error(ERR_WARNING, "OBJ format does not support alignment"
+                         " of 8: rounding up to 16");
+                   seg->align = 16;
+                   break;
+                 case 32:
+                 case 64:
+                 case 128:
+                   error(ERR_WARNING, "OBJ format does not support alignment"
+                         " of %d: rounding up to 256", seg->align);
+                   seg->align = 256;
+                   break;
+                 case 512:
+                 case 1024:
+                 case 2048:
+                   error(ERR_WARNING, "OBJ format does not support alignment"
+                         " of %d: rounding up to 4096", seg->align);
+                   seg->align = 4096;
+                   break;
+                 default:
+                   error(ERR_NONFATAL, "invalid alignment value %d",
+                         seg->align);
+                   seg->align = 1;
+                   break;
+               }
+           } else if (!nasm_strnicmp(p, "absolute=", 9)) {
+               seg->align = SEG_ABS + readnum(p+9, &rn_error);
+               if (rn_error)
+                   error (ERR_NONFATAL, "argument to `absolute' segment"
+                          " attribute should be numeric");
+           }
+       }
+
+       obj_seg_needs_update = seg;
+       if (seg->align >= SEG_ABS)
+           deflabel (name, NO_SEG, seg->align - SEG_ABS,
+                     NULL, FALSE, FALSE, &of_obj, error);
+       else
+           deflabel (name, seg->index+1, 0L,
+                     NULL, FALSE, FALSE, &of_obj, error);
+       obj_seg_needs_update = NULL;
+
+       /*
+        * See if this segment is defined in any groups.
+        */
+       for (grp = grphead; grp; grp = grp->next) {
+           for (i = grp->nindices; i < grp->nentries; i++) {
+               if (!strcmp(grp->segs[i].name, seg->name)) {
+                   nasm_free (grp->segs[i].name);
+                   grp->segs[i] = grp->segs[grp->nindices];
+                   grp->segs[grp->nindices++].index = seg->obj_index;
+                   if (seg->grp)
+                       error(ERR_WARNING, "segment `%s' is already part of"
+                             " a group: first one takes precedence",
+                             seg->name);
+                   else
+                       seg->grp = grp;
+               }
+           }
+       }
+
+       /*
+        * Walk through the list of externals with unresolved
+        * default-WRT clauses, and resolve any that point at this
+        * segment.
+        */
+       extp = &dws;
+       while (*extp) {
+           if ((*extp)->defwrt_type == DEFWRT_STRING &&
+               !strcmp((*extp)->defwrt_ptr.string, seg->name)) {
+               (*extp)->defwrt_type = DEFWRT_SEGMENT;
+               (*extp)->defwrt_ptr.seg = seg;
+               *extp = (*extp)->next_dws;
+           } else
+               extp = &(*extp)->next_dws;
+       }
+
+       if (seg->use32)
+           *bits = 32;
+       else
+           *bits = 16;
+       return seg->index;
+    }
+}
+
+static int obj_directive (char *directive, char *value, int pass) {
+    if (!strcmp(directive, "group")) {
+       char *p, *q, *v;
+       if (pass == 1) {
+           struct Group *grp;
+           struct Segment *seg;
+           struct External **extp;
+           int obj_idx;
+
+           q = value;
+           while (*q == '.')
+               q++;                   /* hack, but a documented one */
+           v = q;
+           while (*q && !isspace(*q))
+               q++;
+           if (isspace(*q)) {
+               *q++ = '\0';
+               while (*q && isspace(*q))
+                   q++;
+           }
+           /*
+            * Here we used to sanity-check the group directive to
+            * ensure nobody tried to declare a group containing no
+            * segments. However, OS/2 does this as standard
+            * practice, so the sanity check has been removed.
+            *
+            * if (!*q) {
+            *     error(ERR_NONFATAL,"GROUP directive contains no segments");
+            *     return 1;
+            * }
+            */
+
+           obj_idx = 1;
+           for (grp = grphead; grp; grp = grp->next) {
+               obj_idx++;
+               if (!strcmp(grp->name, v)) {
+                   error(ERR_NONFATAL, "group `%s' defined twice", v);
+                   return 1;
+               }
+           }
+
+           *grptail = grp = nasm_malloc(sizeof(*grp));
+           grp->next = NULL;
+           grptail = &grp->next;
+           grp->index = seg_alloc();
+           grp->obj_index = obj_idx;
+           grp->nindices = grp->nentries = 0;
+           grp->name = NULL;
+
+           obj_grp_needs_update = grp;
+           deflabel (v, grp->index+1, 0L,
+                     NULL, FALSE, FALSE, &of_obj, error);
+           obj_grp_needs_update = NULL;
+
+           while (*q) {
+               p = q;
+               while (*q && !isspace(*q))
+                   q++;
+               if (isspace(*q)) {
+                   *q++ = '\0';
+                   while (*q && isspace(*q))
+                       q++;
+               }
+               /*
+                * Now p contains a segment name. Find it.
+                */
+               for (seg = seghead; seg; seg = seg->next)
+                   if (!strcmp(seg->name, p))
+                       break;
+               if (seg) {
+                   /*
+                    * We have a segment index. Shift a name entry
+                    * to the end of the array to make room.
+                    */
+                   grp->segs[grp->nentries++] = grp->segs[grp->nindices];
+                   grp->segs[grp->nindices++].index = seg->obj_index;
+                   if (seg->grp)
+                       error(ERR_WARNING, "segment `%s' is already part of"
+                             " a group: first one takes precedence",
+                             seg->name);
+                   else
+                       seg->grp = grp;
+               } else {
+                   /*
+                    * We have an as-yet undefined segment.
+                    * Remember its name, for later.
+                    */
+                   grp->segs[grp->nentries++].name = nasm_strdup(p);
+               }
+           }
+
+           /*
+            * Walk through the list of externals with unresolved
+            * default-WRT clauses, and resolve any that point at
+            * this group.
+            */
+           extp = &dws;
+           while (*extp) {
+               if ((*extp)->defwrt_type == DEFWRT_STRING &&
+                   !strcmp((*extp)->defwrt_ptr.string, grp->name)) {
+                   (*extp)->defwrt_type = DEFWRT_GROUP;
+                   (*extp)->defwrt_ptr.grp = grp;
+                   *extp = (*extp)->next_dws;
+           } else
+                   extp = &(*extp)->next_dws;
+           }
+       }
+       return 1;
+    }
+    if (!strcmp(directive, "uppercase")) {
+       obj_uppercase = TRUE;
+       return 1;
+    }
+    if (!strcmp(directive, "import")) {
+       char *q, *extname, *libname, *impname;
+
+       if (pass == 2)
+           return 1;                  /* ignore in pass two */
+       extname = q = value;
+       while (*q && !isspace(*q))
+           q++;
+       if (isspace(*q)) {
+           *q++ = '\0';
+           while (*q && isspace(*q))
+               q++;
+       }
+
+       libname = q;
+       while (*q && !isspace(*q))
+           q++;
+       if (isspace(*q)) {
+           *q++ = '\0';
+           while (*q && isspace(*q))
+               q++;
+       }
+
+       impname = q;
+
+       if (!*extname || !*libname)
+           error(ERR_NONFATAL, "`import' directive requires symbol name"
+                 " and library name");
+       else {
+           struct ImpDef *imp;
+           int err = FALSE;
+
+           imp = *imptail = nasm_malloc(sizeof(struct ImpDef));
+           imptail = &imp->next;
+           imp->next = NULL;
+           imp->extname = nasm_strdup(extname);
+           imp->libname = nasm_strdup(libname);
+           imp->impindex = readnum(impname, &err);
+           if (!*impname || err)
+               imp->impname = nasm_strdup(impname);
+           else
+               imp->impname = NULL;
+       }
+
+       return 1;
+    }
+    if (!strcmp(directive, "export")) {
+       char *q, *extname, *intname, *v;
+       struct ExpDef *export;
+       int flags = 0;
+       unsigned int ordinal = 0;
+
+       if (pass == 2)
+           return 1;                  /* ignore in pass two */
+       intname = q = value;
+       while (*q && !isspace(*q))
+           q++;
+       if (isspace(*q)) {
+           *q++ = '\0';
+           while (*q && isspace(*q))
+               q++;
+       }
+
+       extname = q;
+       while (*q && !isspace(*q))
+           q++;
+       if (isspace(*q)) {
+           *q++ = '\0';
+           while (*q && isspace(*q))
+               q++;
+       }
+
+       if (!*intname) {
+           error(ERR_NONFATAL, "`export' directive requires export name");
+           return 1;
+       }
+       if (!*extname) {
+           extname = intname;
+           intname = "";
+       }
+       while (*q) {
+           v = q;
+           while (*q && !isspace(*q))
+               q++;
+           if (isspace(*q)) {
+               *q++ = '\0';
+               while (*q && isspace(*q))
+                   q++;
+           }
+           if (!nasm_stricmp(v, "resident"))
+               flags |= EXPDEF_FLAG_RESIDENT;
+           else if (!nasm_stricmp(v, "nodata"))
+               flags |= EXPDEF_FLAG_NODATA;
+           else if (!nasm_strnicmp(v, "parm=", 5)) {
+               int err = FALSE;
+               flags |= EXPDEF_MASK_PARMCNT & readnum(v+5, &err);
+               if (err) {
+                   error(ERR_NONFATAL,
+                         "value `%s' for `parm' is non-numeric", v+5);
+                   return 1;
+               }
+           } else {
+               int err = FALSE;
+               ordinal = readnum(v, &err);
+               if (err) {
+                   error(ERR_NONFATAL, "unrecognised export qualifier `%s'",
+                         v);
+                   return 1;
+               }
+               flags |= EXPDEF_FLAG_ORDINAL;
+           }
+       }
+
+       export = *exptail = nasm_malloc(sizeof(struct ExpDef));
+       exptail = &export->next;
+       export->next = NULL;
+       export->extname = nasm_strdup(extname);
+       export->intname = nasm_strdup(intname);
+       export->ordinal = ordinal;
+       export->flags = flags;
+
+       return 1;
+    }
+    return 0;
+}
+
+static long obj_segbase (long segment) {
+    struct Segment *seg;
+
+    /*
+     * Find the segment in our list.
+     */
+    for (seg = seghead; seg; seg = seg->next)
+       if (seg->index == segment-1)
+           break;
+
+    if (!seg) {
+       /*
+        * Might be an external with a default WRT.
+        */
+       long i = segment/2;
+       struct ExtBack *eb = ebhead;
+       struct External *e;
+
+       while (i > EXT_BLKSIZ) {
+           if (eb)
+               eb = eb->next;
+           else
+               break;
+           i -= EXT_BLKSIZ;
+       }
+       if (eb) {
+           e = eb->exts[i];
+           if (e->defwrt_type == DEFWRT_NONE)
+               return segment;        /* fine */
+           else if (e->defwrt_type == DEFWRT_SEGMENT)
+               return e->defwrt_ptr.seg->index+1;
+           else if (e->defwrt_type == DEFWRT_GROUP)
+               return e->defwrt_ptr.grp->index+1;
+           else if (e->defwrt_type == DEFWRT_STRING)
+               return NO_SEG;         /* can't tell what it is */
+       }
+
+       return segment;                /* not one of ours - leave it alone */
+    }
+
+    if (seg->align >= SEG_ABS)
+       return seg->align;             /* absolute segment */
+    if (seg->grp)
+       return seg->grp->index+1;      /* grouped segment */
+
+    return segment;                   /* no special treatment */
+}
+
+static void obj_filename (char *inname, char *outname, efunc error) {
+    strcpy(obj_infile, inname);
+    standard_extension (inname, outname, ".obj", error);
+}
+
+static void obj_write_file (void) {
+    struct Segment *seg;
+    struct Group *grp;
+    struct Public *pub;
+    struct External *ext;
+    struct ObjData *data;
+    struct ImpDef *imp;
+    struct ExpDef *export;
+    static char boast[] = "The Netwide Assembler " NASM_VER;
+    int lname_idx, rectype;
+
+    /*
+     * Write the THEADR module header.
+     */
+    recptr = record;
+    recptr = obj_write_name (recptr, obj_infile);
+    obj_record (THEADR, record, recptr);
+
+    /*
+     * Write the NASM boast comment.
+     */
+    recptr = record;
+    recptr = obj_write_rword (recptr, 0);   /* comment type zero */
+    recptr = obj_write_name (recptr, boast);
+    obj_record (COMENT, record, recptr);
+
+    /*
+     * Write the IMPDEF records, if any.
+     */
+    for (imp = imphead; imp; imp = imp->next) {
+       recptr = record;
+       recptr = obj_write_rword (recptr, 0xA0);   /* comment class A0 */
+       recptr = obj_write_byte (recptr, 1);   /* subfunction 1: IMPDEF */
+       if (imp->impname)
+           recptr = obj_write_byte (recptr, 0);   /* import by name */
+       else
+           recptr = obj_write_byte (recptr, 1);   /* import by ordinal */
+       recptr = obj_write_name (recptr, imp->extname);
+       recptr = obj_write_name (recptr, imp->libname);
+       if (imp->impname)
+           recptr = obj_write_name (recptr, imp->impname);
+       else
+           recptr = obj_write_word (recptr, imp->impindex);
+       obj_record (COMENT, record, recptr);
+    }
+
+    /*
+     * Write the EXPDEF records, if any.
+     */
+    for (export = exphead; export; export = export->next) {
+       recptr = record;
+       recptr = obj_write_rword (recptr, 0xA0);   /* comment class A0 */
+       recptr = obj_write_byte (recptr, 2);   /* subfunction 1: EXPDEF */
+       recptr = obj_write_byte (recptr, export->flags);
+       recptr = obj_write_name (recptr, export->extname);
+       recptr = obj_write_name (recptr, export->intname);
+       if (export->flags & EXPDEF_FLAG_ORDINAL)
+           recptr = obj_write_word (recptr, export->ordinal);
+       obj_record (COMENT, record, recptr);
+    }
+
+    /*
+     * Write the first LNAMES record, containing LNAME one, which
+     * is null. Also initialise the LNAME counter.
+     */
+    recptr = record;
+    recptr = obj_write_name (recptr, "");
+    obj_record (LNAMES, record, recptr);
+    lname_idx = 2;
+
+    /*
+     * Write the SEGDEF records. Each has an associated LNAMES
+     * record.
+     */
+    for (seg = seghead; seg; seg = seg->next) {
+       int new_segdef;                /* do we use the newer record type? */
+       int acbp;
+       int sn, cn, on;                /* seg, class, overlay LNAME idx */
+
+       if (seg->use32 || seg->currentpos >= 0x10000L)
+           new_segdef = TRUE;
+       else
+           new_segdef = FALSE;
+
+       recptr = record;
+       recptr = obj_write_name (recptr, seg->name);
+       sn = lname_idx++;
+       if (seg->segclass) {
+           recptr = obj_write_name (recptr, seg->segclass);
+           cn = lname_idx++;
+       } else
+           cn = 1;
+       if (seg->overlay) {
+           recptr = obj_write_name (recptr, seg->overlay);
+           on = lname_idx++;
+       } else
+           on = 1;
+       obj_record (LNAMES, record, recptr);
+
+       acbp = (seg->combine << 2);    /* C field */
+
+       if (seg->currentpos >= 0x10000L && !new_segdef)
+           acbp |= 0x02;              /* B bit */
+
+       if (seg->use32)
+           acbp |= 0x01;              /* P bit is Use32 flag */
+
+       /* A field */
+       if (seg->align >= SEG_ABS)
+           acbp |= 0x00;
+       else if (seg->align >= 4096) {
+           if (seg->align > 4096)
+               error(ERR_NONFATAL, "segment `%s' requires more alignment"
+                     " than OBJ format supports", seg->name);
+           acbp |= 0xC0;              /* PharLap extension */
+       } else if (seg->align >= 256) {
+           acbp |= 0x80;
+       } else if (seg->align >= 16) {
+           acbp |= 0x60;
+       } else if (seg->align >= 4) {
+           acbp |= 0xA0;
+       } else if (seg->align >= 2) {
+           acbp |= 0x40;
+       } else
+           acbp |= 0x20;
+
+       recptr = record;
+       recptr = obj_write_byte (recptr, acbp);
+       if (seg->align & SEG_ABS) {
+           recptr = obj_write_word (recptr, seg->align - SEG_ABS);
+           recptr = obj_write_byte (recptr, 0);
+       }
+       if (new_segdef)
+           recptr = obj_write_dword (recptr, seg->currentpos);
+       else
+           recptr = obj_write_word (recptr, seg->currentpos & 0xFFFF);
+       recptr = obj_write_index (recptr, sn);
+       recptr = obj_write_index (recptr, cn);
+       recptr = obj_write_index (recptr, on);
+       if (new_segdef)
+           obj_record (SEGDEF+1, record, recptr);
+       else
+           obj_record (SEGDEF, record, recptr);
+    }
+
+    /*
+     * Write some LNAMES for the group names. lname_idx is left
+     * alone here - it will catch up when we write the GRPDEFs.
+     */
+    recptr = record;
+    for (grp = grphead; grp; grp = grp->next) {
+       if (recptr - record + strlen(grp->name)+2 > 1024) {
+           obj_record (LNAMES, record, recptr);
+           recptr = record;
+       }
+       recptr = obj_write_name (recptr, grp->name);
+    }
+    if (recptr > record)
+       obj_record (LNAMES, record, recptr);
+
+    /*
+     * Write the GRPDEF records.
+     */
+    for (grp = grphead; grp; grp = grp->next) {
+       int i;
+
+       if (grp->nindices != grp->nentries) {
+           for (i = grp->nindices; i < grp->nentries; i++) {
+               error(ERR_NONFATAL, "group `%s' contains undefined segment"
+                     " `%s'", grp->name, grp->segs[i].name);
+               nasm_free (grp->segs[i].name);
+               grp->segs[i].name = NULL;
+           }
+       }
+       recptr = record;
+       recptr = obj_write_index (recptr, lname_idx++);
+       for (i = 0; i < grp->nindices; i++) {
+           recptr = obj_write_byte (recptr, 0xFF);
+           recptr = obj_write_index (recptr, grp->segs[i].index);
+       }
+       obj_record (GRPDEF, record, recptr);
+    }
+
+    /*
+     * Write the PUBDEF records: first the ones in the segments,
+     * then the far-absolutes.
+     */
+    for (seg = seghead; seg; seg = seg->next) {
+       int any;
+
+       recptr = record;
+       recptr = obj_write_index (recptr, seg->grp ? seg->grp->obj_index : 0);
+       recptr = obj_write_index (recptr, seg->obj_index);
+       any = FALSE;
+       if (seg->use32)
+           rectype = PUBDEF+1;
+       else
+           rectype = PUBDEF;
+       for (pub = seg->pubhead; pub; pub = pub->next) {
+           if (recptr - record + strlen(pub->name) + 7 > 1024) {
+               if (any)
+                   obj_record (rectype, record, recptr);
+               recptr = record;
+               recptr = obj_write_index (recptr, 0);
+               recptr = obj_write_index (recptr, seg->obj_index);
+           }
+           recptr = obj_write_name (recptr, pub->name);
+           if (seg->use32)
+               recptr = obj_write_dword (recptr, pub->offset);
+           else
+               recptr = obj_write_word (recptr, pub->offset);
+           recptr = obj_write_index (recptr, 0);
+           any = TRUE;
+       }
+       if (any)
+           obj_record (rectype, record, recptr);
+    }
+    for (pub = fpubhead; pub; pub = pub->next) {   /* pub-crawl :-) */
+       recptr = record;
+       recptr = obj_write_index (recptr, 0);   /* no group */
+       recptr = obj_write_index (recptr, 0);   /* no segment either */
+       recptr = obj_write_word (recptr, pub->segment);
+       recptr = obj_write_name (recptr, pub->name);
+       recptr = obj_write_word (recptr, pub->offset);
+       recptr = obj_write_index (recptr, 0);
+       obj_record (PUBDEF, record, recptr);
+    }
+
+    /*
+     * Write the EXTDEF and COMDEF records, in order.
+     */
+    recptr = record;
+    for (ext = exthead; ext; ext = ext->next) {
+       if (ext->commonsize == 0) {
+           /* dj@delorie.com: check for buffer overrun before we overrun it */
+           if (recptr - record + strlen(ext->name)+2 > RECORD_MAX) {
+               obj_record (EXTDEF, record, recptr);
+               recptr = record;
+           }
+           recptr = obj_write_name (recptr, ext->name);
+           recptr = obj_write_index (recptr, 0);
+       } else {
+           if (recptr > record)
+               obj_record (EXTDEF, record, recptr);
+           recptr = record;
+           if (ext->commonsize) {
+               recptr = obj_write_name (recptr, ext->name);
+               recptr = obj_write_index (recptr, 0);
+               if (ext->commonelem) {
+                   recptr = obj_write_byte (recptr, 0x61);/* far communal */
+                   recptr = obj_write_value (recptr, (ext->commonsize /
+                                                      ext->commonelem));
+                   recptr = obj_write_value (recptr, ext->commonelem);
+               } else {
+                   recptr = obj_write_byte (recptr, 0x62);/* near communal */
+                   recptr = obj_write_value (recptr, ext->commonsize);
+               }
+               obj_record (COMDEF, record, recptr);
+           }
+           recptr = record;
+       }
+    }
+    if (recptr > record)
+       obj_record (EXTDEF, record, recptr);
+
+    /*
+     * Write a COMENT record stating that the linker's first pass
+     * may stop processing at this point. Exception is if our
+     * MODEND record specifies a start point, in which case,
+     * according to some variants of the documentation, this COMENT
+     * should be omitted. So we'll omit it just in case.
+     */
+    if (obj_entry_seg == NO_SEG) {
+       recptr = record;
+       recptr = obj_write_rword (recptr, 0x40A2);
+       recptr = obj_write_byte (recptr, 1);
+       obj_record (COMENT, record, recptr);
+    }
+
+    /*
+     * Write the LEDATA/FIXUPP pairs.
+     */
+    for (data = datahead; data; data = data->next) {
+       if (data->nonempty) {
+           obj_record (data->letype, data->ledata, data->lptr);
+           if (data->fptr != data->fixupp)
+               obj_record (data->ftype, data->fixupp, data->fptr);
+       }
+    }
+
+    /*
+     * Write the MODEND module end marker.
+     */
+    recptr = record;
+    rectype = MODEND;
+    if (obj_entry_seg != NO_SEG) {
+       recptr = obj_write_byte (recptr, 0xC1);
+       /*
+        * Find the segment in the segment list.
+        */
+       for (seg = seghead; seg; seg = seg->next) {
+           if (seg->index == obj_entry_seg) {
+               if (seg->grp) {
+                   recptr = obj_write_byte (recptr, 0x10);
+                   recptr = obj_write_index (recptr, seg->grp->obj_index);
+               } else {
+                   recptr = obj_write_byte (recptr, 0x50);
+               }
+               recptr = obj_write_index (recptr, seg->obj_index);
+               if (seg->use32) {
+                   rectype = MODEND+1;
+                   recptr = obj_write_dword (recptr, obj_entry_ofs);
+               } else
+                   recptr = obj_write_word (recptr, obj_entry_ofs);
+               break;
+           }
+       }
+       if (!seg)
+           error(ERR_NONFATAL, "entry point is not in this module");
+    } else
+       recptr = obj_write_byte (recptr, 0);
+    obj_record (rectype, record, recptr);
+}
+
+static unsigned char *obj_write_data(unsigned char *ptr,
+                                    unsigned char *data, int len) {
+    while (len--)
+       *ptr++ = *data++;
+    return ptr;
+}
+
+static unsigned char *obj_write_byte(unsigned char *ptr, int data) {
+    *ptr++ = data;
+    return ptr;
+}
+
+static unsigned char *obj_write_word(unsigned char *ptr, int data) {
+    *ptr++ = data & 0xFF;
+    *ptr++ = (data >> 8) & 0xFF;
+    return ptr;
+}
+
+static unsigned char *obj_write_dword(unsigned char *ptr, long data) {
+    *ptr++ = data & 0xFF;
+    *ptr++ = (data >> 8) & 0xFF;
+    *ptr++ = (data >> 16) & 0xFF;
+    *ptr++ = (data >> 24) & 0xFF;
+    return ptr;
+}
+
+static unsigned char *obj_write_rword(unsigned char *ptr, int data) {
+    *ptr++ = (data >> 8) & 0xFF;
+    *ptr++ = data & 0xFF;
+    return ptr;
+}
+
+static unsigned char *obj_write_name(unsigned char *ptr, char *data) {
+    *ptr++ = strlen(data);
+    if (obj_uppercase) {
+       while (*data) {
+           *ptr++ = (unsigned char) toupper(*data);
+           data++;
+       }
+    } else {
+       while (*data)
+           *ptr++ = (unsigned char) *data++;
+    }
+    return ptr;
+}
+
+static unsigned char *obj_write_index(unsigned char *ptr, int data) {
+    if (data < 128)
+       *ptr++ = data;
+    else {
+       *ptr++ = 0x80 | ((data >> 8) & 0x7F);
+       *ptr++ = data & 0xFF;
+    }
+    return ptr;
+}
+
+static unsigned char *obj_write_value(unsigned char *ptr,
+                                     unsigned long data) {
+    if (data <= 128)
+       *ptr++ = data;
+    else if (data <= 0xFFFF) {
+       *ptr++ = 129;
+       *ptr++ = data & 0xFF;
+       *ptr++ = (data >> 8) & 0xFF;
+    } else if (data <= 0xFFFFFFL) {
+       *ptr++ = 132;
+       *ptr++ = data & 0xFF;
+       *ptr++ = (data >> 8) & 0xFF;
+       *ptr++ = (data >> 16) & 0xFF;
+    } else {
+       *ptr++ = 136;
+       *ptr++ = data & 0xFF;
+       *ptr++ = (data >> 8) & 0xFF;
+       *ptr++ = (data >> 16) & 0xFF;
+       *ptr++ = (data >> 24) & 0xFF;
+    }
+    return ptr;
+}
+
+static void obj_record(int type, unsigned char *start, unsigned char *end) {
+    unsigned long cksum, len;
+
+    cksum = type;
+    fputc (type, ofp);
+    len = end-start+1;
+    cksum += (len & 0xFF) + ((len>>8) & 0xFF);
+    fwriteshort (len, ofp);
+    fwrite (start, 1, end-start, ofp);
+    while (start < end)
+       cksum += *start++;
+    fputc ( (-(long)cksum) & 0xFF, ofp);
+}
+
+static char *obj_stdmac[] = {
+    "%define __SECT__ [section .text]",
+    "%imacro group 1+.nolist",
+    "[group %1]",
+    "%endmacro",
+    "%imacro uppercase 1+.nolist",
+    "[uppercase %1]",
+    "%endmacro",
+    "%imacro export 1+.nolist",
+    "[export %1]",
+    "%endmacro",
+    "%imacro import 1+.nolist",
+    "[import %1]",
+    "%endmacro",
+    NULL
+};
+
+struct ofmt of_obj = {
+    "Microsoft MS-DOS 16-bit OMF object files",
+    "obj",
+    obj_stdmac,
+    obj_init,
+    obj_out,
+    obj_deflabel,
+    obj_segment,
+    obj_segbase,
+    obj_directive,
+    obj_filename,
+    obj_cleanup
+};
+#endif /* OF_OBJ */
diff --git a/i386/nasm/outrdf.c b/i386/nasm/outrdf.c
new file mode 100644 (file)
index 0000000..ffc07b2
--- /dev/null
@@ -0,0 +1,539 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
+ * Reserved.  This file contains Original Code and/or Modifications of
+ * Original Code as defined in and that are subject to the Apple Public
+ * Source License Version 1.1 (the "License").  You may not use this file
+ * except in compliance with the License.  Please obtain a copy of the
+ * License at http://www.apple.com/publicsource and read it before using
+ * this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/* outrdf.c    output routines for the Netwide Assembler to produce
+ *             RDOFF format object files (which are intended mainly
+ *             for use in proprietary projects, as the code to load and
+ *             execute them is very simple). They will also be used
+ *             for device drivers and possibly some executable files
+ *             in the MOSCOW operating system. See Rdoff.txt for
+ *             details.
+ *
+ * The Netwide Assembler is copyright (C) 1996 Simon Tatham and
+ * Julian Hall. All rights reserved. The software is
+ * redistributable under the licence given in the file "Licence"
+ * distributed in the NASM archive.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+#include <assert.h>
+
+#include "nasm.h"
+#include "nasmlib.h"
+#include "outform.h"
+
+/* VERBOSE_WARNINGS: define this to add some extra warnings... */
+#define VERBOSE_WARNINGS     
+
+#ifdef OF_RDF
+
+typedef short int16;   /* not sure if this will be required to be altered
+                          at all... best to typedef it just in case */
+
+static const char *RDOFFId = "RDOFF1"; /* written to start of RDOFF files */
+
+/* the records that can be found in the RDOFF header */
+
+/* Note that whenever a segment is referred to in the RDOFF file, its number
+ * is always half of the segment number that NASM uses to refer to it; this
+ * is because NASM only allocates even numbered segments, so as to not
+ * waste any of the 16 bits of segment number written to the file - this
+ * allows up to 65533 external labels to be defined; otherwise it would be
+ * 32764. */
+
+struct RelocRec {
+  char type;           /* must be 1 */
+  char segment;        /* only 0 for code, or 1 for data supported,
+                        * but add 64 for relative refs (ie do not require
+                        * reloc @ loadtime, only linkage) */
+  long offset;         /* from start of segment in which reference is loc'd */
+  char length;         /* 1 2 or 4 bytes */
+  int16        refseg;         /* segment to which reference refers to */
+};
+
+struct ImportRec {
+  char         type;           /* must be 2 */
+  int16        segment;        /* segment number allocated to the label for reloc
+                        * records - label is assumed to be at offset zero
+                        * in this segment, so linker must fix up with offset
+                        * of segment and of offset within segment */
+  char label[33];      /* zero terminated... should be written to file until
+                        * the zero, but not after it - max len = 32 chars */
+};
+
+struct ExportRec {
+  char type;           /* must be 3 */
+  char segment;        /* segment referred to (0/1) */
+  long offset;         /* offset within segment */
+  char label[33];      /* zero terminated as above. max len = 32 chars */
+};
+
+struct DLLRec {
+  char type;           /* must be 4 */
+  char libname[128];   /* name of library to link with at load time */
+};
+
+struct BSSRec {
+  char type;           /* must be 5 */
+  long amount;         /* number of bytes BSS to reserve */
+};
+
+/* code for managing buffers needed to seperate code and data into individual
+ * sections until they are ready to be written to the file.
+ * We'd better hope that it all fits in memory else we're buggered... */
+
+#define BUF_BLOCK_LEN 4088             /* selected to match page size (4096)
+                                         * on 80x86 machines for efficiency */
+
+typedef struct memorybuffer {
+  int length;
+  char buffer[BUF_BLOCK_LEN];
+  struct memorybuffer *next;
+} memorybuffer;
+
+static memorybuffer * newmembuf(void){
+  memorybuffer * t;
+
+  t = nasm_malloc(sizeof(memorybuffer));
+
+  t->length = 0;
+  t->next = NULL;
+  return t;
+}
+
+static void membufwrite(memorybuffer *b, void *data, int bytes) {
+  int16 w;
+  long l;
+
+  if (b->next) {       /* memory buffer full - use next buffer */
+    membufwrite(b->next,data,bytes);
+    return;
+  }
+  if ((bytes < 0 && b->length - bytes > BUF_BLOCK_LEN)
+      || (bytes > 0 && b->length + bytes > BUF_BLOCK_LEN)) {
+
+    /* buffer full and no next allocated... allocate and initialise next
+     * buffer */
+
+    b->next = newmembuf();
+    membufwrite(b->next,data,bytes);
+    return;
+  }
+
+  switch(bytes) {
+  case -4:             /* convert to little-endian */
+    l = * (long *) data ;
+    b->buffer[b->length++] = l & 0xFF;
+    l >>= 8 ;
+    b->buffer[b->length++] = l & 0xFF;
+    l >>= 8 ;
+    b->buffer[b->length++] = l & 0xFF;
+    l >>= 8 ;
+    b->buffer[b->length++] = l & 0xFF;
+    break;
+
+  case -2:
+    w = * (int16 *) data ;
+    b->buffer[b->length++] = w & 0xFF;
+    w >>= 8 ;
+    b->buffer[b->length++] = w & 0xFF;
+    break;
+
+  default:
+    while(bytes--) {
+      b->buffer[b->length++] = *(* (unsigned char **) &data);
+
+      (* (unsigned char **) &data)++ ;
+    }
+    break;
+  }
+}
+
+static void membufdump(memorybuffer *b,FILE *fp)
+{
+  if (!b) return;
+
+  fwrite (b->buffer, 1, b->length, fp);
+
+  membufdump(b->next,fp);
+}
+
+static int membuflength(memorybuffer *b)
+{
+  if (!b) return 0;
+  return b->length + membuflength(b->next);
+}
+
+static void freemembuf(memorybuffer *b)
+{
+  if (!b) return;
+  freemembuf(b->next);
+  nasm_free(b);
+}
+
+/***********************************************************************
+ * Actual code to deal with RDOFF ouput format begins here...
+ */
+
+/* global variables set during the initialisation phase */
+
+static memorybuffer *seg[2];   /* seg 0 = code, seg 1 = data */
+static memorybuffer *header;   /* relocation/import/export records */
+
+static FILE *ofile;
+
+static efunc error;
+
+static int segtext,segdata,segbss;
+static long bsslength;
+
+static void rdf_init(FILE *fp, efunc errfunc, ldfunc ldef, evalfunc eval)
+{
+  ofile = fp;
+  error = errfunc;
+  seg[0] = newmembuf();
+  seg[1] = newmembuf();
+  header = newmembuf();
+  segtext = seg_alloc();
+  segdata = seg_alloc();
+  segbss = seg_alloc();
+  if (segtext != 0 || segdata != 2 || segbss != 4)
+    error(ERR_PANIC,"rdf segment numbers not allocated as expected (%d,%d,%d)",
+         segtext,segdata,segbss);
+  bsslength=0;
+}
+
+static long rdf_section_names(char *name, int pass, int *bits)
+{
+  /*
+   * Default is 32 bits.
+   */
+  if (!name)
+    *bits = 32;
+
+  if (!name) return 0;
+  if (!strcmp(name, ".text"))          return 0;
+  else if (!strcmp(name, ".data"))     return 2;
+  else if (!strcmp(name, ".bss"))      return 4;
+  else
+    return NO_SEG;
+}
+
+static void write_reloc_rec(struct RelocRec *r)
+{
+  if (r->refseg != NO_SEG && (r->refseg & 1))
+    error (ERR_NONFATAL, "RDF format does not support segment base"
+          " references");
+
+  r->refseg >>= 1;    /* adjust segment nos to RDF rather than NASM */
+
+  membufwrite(header,&r->type,1);
+  membufwrite(header,&r->segment,1);
+  membufwrite(header,&r->offset,-4);
+  membufwrite(header,&r->length,1);
+  membufwrite(header,&r->refseg,-2);   /* 9 bytes written */
+}
+
+static void write_export_rec(struct ExportRec *r)
+{
+  r->segment >>= 1;
+
+  membufwrite(header,&r->type,1);
+  membufwrite(header,&r->segment,1);
+  membufwrite(header,&r->offset,-4);
+  membufwrite(header,r->label,strlen(r->label) + 1);
+}
+
+static void write_import_rec(struct ImportRec *r)
+{
+  r->segment >>= 1;
+
+  membufwrite(header,&r->type,1);
+  membufwrite(header,&r->segment,-2);
+  membufwrite(header,r->label,strlen(r->label) + 1);
+}
+
+static void write_bss_rec(struct BSSRec *r)
+{
+    membufwrite(header,&r->type,1);
+    membufwrite(header,&r->amount,-4);
+}
+
+static void write_dll_rec(struct DLLRec *r)
+{
+    membufwrite(header,&r->type,1);
+    membufwrite(header,r->libname,strlen(r->libname) + 1);
+}
+
+static void rdf_deflabel(char *name, long segment, long offset,
+                        int is_global, char *special)
+{
+  struct ExportRec r;
+  struct ImportRec ri;
+#ifdef VERBOSE_WARNINGS
+  static int warned_common = 0;
+#endif
+
+  if (special)
+    error (ERR_NONFATAL, "RDOFF format does not support any"
+          " special symbol types");
+
+  if (name[0] == '.' && name[1] == '.' && name[2] != '@') {
+    error (ERR_NONFATAL, "unrecognised special symbol `%s'", name);
+    return;
+  }
+
+  if (is_global == 2) {
+#ifdef VERBOSE_WARNINGS
+    if (!warned_common) {
+      error(ERR_WARNING,"common declarations not supported: using extern");
+      warned_common = 1;
+    }
+#endif
+    is_global = 1;
+  }
+
+  if (segment > 4) {   /* EXTERN declaration */
+    ri.type = 2;
+    ri.segment = segment;
+    strncpy(ri.label,name,32);
+    ri.label[32] = 0;
+    write_import_rec(&ri);
+  } else if (is_global) {
+    r.type = 3;
+    r.segment = segment;
+    r.offset = offset;
+    strncpy(r.label,name,32);
+    r.label[32] = 0;
+    write_export_rec(&r);
+  }
+}
+
+static void rdf_out (long segto, void *data, unsigned long type,
+                    long segment, long wrt)
+{
+  long bytes = type & OUT_SIZMASK;
+  struct RelocRec rr;
+  unsigned char databuf[4],*pd;
+
+  segto >>= 1;    /* convert NASM segment no to RDF number */
+
+  if (segto != 0 && segto != 1 && segto != 2) {
+    error(ERR_NONFATAL,"specified segment not supported by rdf output format");
+    return;
+  }
+
+  if (wrt != NO_SEG) {
+    wrt = NO_SEG;                     /* continue to do _something_ */
+    error (ERR_NONFATAL, "WRT not supported by rdf output format");
+  }
+
+  type &= OUT_TYPMASK;
+
+  if (segto == 2 && type != OUT_RESERVE)
+  {
+      error(ERR_NONFATAL, "BSS segments may not be initialised");
+
+      /* just reserve the space for now... */
+
+      if (type == OUT_REL2ADR)
+       bytes = 2;
+      else
+       bytes = 4;
+      type = OUT_RESERVE;
+  }
+
+  if (type == OUT_RESERVE) {
+      if (segto == 2)          /* BSS segment space reserverd */
+         bsslength += bytes;
+      else
+       while (bytes --)
+           membufwrite(seg[segto],databuf,1);
+  }
+  else if (type == OUT_RAWDATA) {
+      if (segment != NO_SEG)
+         error(ERR_PANIC, "OUT_RAWDATA with other than NO_SEG");
+      membufwrite(seg[segto],data,bytes);
+  }
+  else if (type == OUT_ADDRESS) {
+
+    /* if segment == NO_SEG then we are writing an address of an
+       object within the same segment - do not produce reloc rec. */
+
+    if (segment != NO_SEG)
+    {
+
+       /* it's an address, so we must write a relocation record */
+
+       rr.type = 1;            /* type signature */
+       rr.segment = segto;             /* segment we're currently in */
+       rr.offset = membuflength(seg[segto]);   /* current offset */
+       rr.length = bytes;              /* length of reference */
+       rr.refseg = segment;    /* segment referred to */
+       write_reloc_rec(&rr);
+    }
+
+    pd = databuf;      /* convert address to little-endian */
+    if (bytes == 2)
+      WRITESHORT (pd, *(long *)data);
+    else
+      WRITELONG (pd, *(long *)data);
+
+    membufwrite(seg[segto],databuf,bytes);
+
+  }
+  else if (type == OUT_REL2ADR)
+  {
+    if (segment == segto)
+      error(ERR_PANIC, "intra-segment OUT_REL2ADR");
+    if (segment != NO_SEG && segment % 2) {
+      error(ERR_NONFATAL, "rdf format does not support segment base refs");
+    }
+
+    rr.type = 1;               /* type signature */
+    rr.segment = segto+64;     /* segment we're currently in + rel flag */
+    rr.offset = membuflength(seg[segto]);      /* current offset */
+    rr.length = 2;             /* length of reference */
+    rr.refseg = segment;       /* segment referred to */
+    write_reloc_rec(&rr);
+
+    /* work out what to put in the code: offset of the end of this operand,
+     * subtracted from any data specified, so that loader can just add
+     * address of imported symbol onto it to get address relative to end of
+     * instruction: import_address + data(offset) - end_of_instrn */
+
+    rr.offset = *(long *)data -(rr.offset + bytes);
+
+    membufwrite(seg[segto],&rr.offset,-2);
+  }
+  else if (type == OUT_REL4ADR)
+  {
+    if (segment == segto)
+      error(ERR_PANIC, "intra-segment OUT_REL4ADR");
+    if (segment != NO_SEG && segment % 2) {
+      error(ERR_NONFATAL, "rdf format does not support segment base refs");
+    }
+
+    rr.type = 1;               /* type signature */
+    rr.segment = segto+64;     /* segment we're currently in + rel tag */
+    rr.offset = membuflength(seg[segto]);      /* current offset */
+    rr.length = 4;             /* length of reference */
+    rr.refseg = segment;       /* segment referred to */
+    write_reloc_rec(&rr);
+
+    rr.offset = *(long *)data -(rr.offset + bytes);
+    membufwrite(seg[segto],&rr.offset,-4);
+  }
+}
+
+static void rdf_cleanup (void) {
+  long         l;
+  unsigned char b[4],*d;
+  struct BSSRec        bs;
+
+
+  /* should write imported & exported symbol declarations to header here */
+
+  /* generate the output file... */
+  fwrite(RDOFFId,6,1,ofile);   /* file type magic number */
+
+  if (bsslength != 0)          /* reserve BSS */
+  {
+      bs.type = 5;
+      bs.amount = bsslength;
+      write_bss_rec(&bs);
+  }
+
+  l = membuflength(header);d=b;
+  WRITELONG(d,l);
+
+  fwrite(b,4,1,ofile);         /* write length of header */
+  membufdump(header,ofile);    /* dump header */
+
+  l = membuflength(seg[0]);d=b;        /* code segment */
+  WRITELONG(d,l);
+
+  fwrite(b,4,1,ofile);
+  membufdump(seg[0],ofile);
+
+  l = membuflength(seg[1]);d=b;        /* data segment */
+  WRITELONG(d,l);
+
+  fwrite(b,4,1,ofile);
+  membufdump(seg[1],ofile);
+
+  freemembuf(header);
+  freemembuf(seg[0]);
+  freemembuf(seg[1]);
+  fclose(ofile);
+}
+
+static long rdf_segbase (long segment) {
+    return segment;
+}
+
+static int rdf_directive (char *directive, char *value, int pass) {
+    struct DLLRec r;
+    
+    if (! strcmp(directive, "library")) {
+       if (pass == 1) {
+           r.type = 4;
+           strcpy(r.libname, value);
+           write_dll_rec(&r);
+       }
+       return 1;
+    }
+
+    return 0;
+}
+
+static void rdf_filename (char *inname, char *outname, efunc error) {
+  standard_extension(inname,outname,".rdf",error);
+}
+
+static char *rdf_stdmac[] = {
+    "%define __SECT__ [section .text]",
+    "%imacro library 1+.nolist",
+    "[library %1]",
+    "%endmacro",
+    NULL
+};
+
+struct ofmt of_rdf = {
+  "Relocatable Dynamic Object File Format v1.1",
+  "rdf",
+  rdf_stdmac,
+  rdf_init,
+  rdf_out,
+  rdf_deflabel,
+  rdf_section_names,
+  rdf_segbase,
+  rdf_directive,
+  rdf_filename,
+  rdf_cleanup
+};
+
+#endif /* OF_RDF */
diff --git a/i386/nasm/parser.c b/i386/nasm/parser.c
new file mode 100644 (file)
index 0000000..c817583
--- /dev/null
@@ -0,0 +1,657 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
+ * Reserved.  This file contains Original Code and/or Modifications of
+ * Original Code as defined in and that are subject to the Apple Public
+ * Source License Version 1.1 (the "License").  You may not use this file
+ * except in compliance with the License.  Please obtain a copy of the
+ * License at http://www.apple.com/publicsource and read it before using
+ * this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/* parser.c   source line parser for the Netwide Assembler
+ *
+ * The Netwide Assembler is copyright (C) 1996 Simon Tatham and
+ * Julian Hall. All rights reserved. The software is
+ * redistributable under the licence given in the file "Licence"
+ * distributed in the NASM archive.
+ *
+ * initial version 27/iii/95 by Simon Tatham
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <stddef.h>
+#include <string.h>
+#include <ctype.h>
+
+#include "nasm.h"
+#include "nasmlib.h"
+#include "parser.h"
+#include "float.h"
+
+static long reg_flags[] = {           /* sizes and special flags */
+    0, REG8, REG_AL, REG_AX, REG8, REG8, REG16, REG16, REG8, REG_CL,
+    REG_CREG, REG_CREG, REG_CREG, REG_CR4, REG_CS, REG_CX, REG8,
+    REG16, REG8, REG_DREG, REG_DREG, REG_DREG, REG_DREG, REG_DREG,
+    REG_DREG, REG_DESS, REG_DX, REG_EAX, REG32, REG32, REG_ECX,
+    REG32, REG32, REG_DESS, REG32, REG32, REG_FSGS, REG_FSGS,
+    MMXREG, MMXREG, MMXREG, MMXREG, MMXREG, MMXREG, MMXREG, MMXREG,
+    REG16, REG16, REG_DESS, FPU0, FPUREG, FPUREG, FPUREG, FPUREG,
+    FPUREG, FPUREG, FPUREG, REG_TREG, REG_TREG, REG_TREG, REG_TREG,
+    REG_TREG
+};
+
+enum {                                /* special tokens */
+    S_BYTE, S_DWORD, S_FAR, S_LONG, S_NEAR, S_NOSPLIT, S_QWORD,
+    S_SHORT, S_TO, S_TWORD, S_WORD
+};
+
+static int is_comma_next (void);
+
+static int i;
+static struct tokenval tokval;
+static efunc error;
+
+insn *parse_line (int pass, char *buffer, insn *result,
+                 efunc errfunc, evalfunc evaluate, evalinfofunc einfo) {
+    int operand;
+    int critical;
+    struct eval_hints hints;
+
+    result->forw_ref = FALSE;
+    error = errfunc;
+    einfo ("", 0L, 0L);
+
+    stdscan_reset();
+    stdscan_bufptr = buffer;
+    i = stdscan(NULL, &tokval);
+
+    result->eops = NULL;              /* must do this, whatever happens */
+    result->operands = 0;             /* must initialise this */
+
+    if (i==0) {                               /* blank line - ignore */
+       result->label = NULL;          /* so, no label on it */
+       result->opcode = -1;           /* and no instruction either */
+       return result;
+    }
+    if (i != TOKEN_ID && i != TOKEN_INSN && i != TOKEN_PREFIX &&
+       (i!=TOKEN_REG || (REG_SREG & ~reg_flags[tokval.t_integer]))) {
+       error (ERR_NONFATAL, "label or instruction expected"
+              " at start of line");
+       result->label = NULL;
+       result->opcode = -1;
+       return result;
+    }
+
+    if (i == TOKEN_ID) {              /* there's a label here */
+       result->label = tokval.t_charptr;
+       einfo (result->label, 0L, 0L);
+       i = stdscan(NULL, &tokval);
+       if (i == ':') {                /* skip over the optional colon */
+           i = stdscan(NULL, &tokval);
+       } else if (i == 0 && pass == 1) {
+           error (ERR_WARNING|ERR_WARN_OL,
+                  "label alone on a line without a colon might be in error");
+       }
+    } else                            /* no label; so, moving swiftly on */
+       result->label = NULL;
+
+    if (i==0) {
+       result->opcode = -1;           /* this line contains just a label */
+       return result;
+    }
+
+    result->nprefix = 0;
+    result->times = 1L;
+
+    while (i == TOKEN_PREFIX ||
+          (i==TOKEN_REG && !(REG_SREG & ~reg_flags[tokval.t_integer]))) {
+       /*
+        * Handle special case: the TIMES prefix.
+        */
+       if (i == TOKEN_PREFIX && tokval.t_integer == P_TIMES) {
+           expr *value;
+
+           i = stdscan(NULL, &tokval);
+           value = evaluate (stdscan, NULL, &tokval, NULL, pass, error, NULL);
+           i = tokval.t_type;
+           if (!value) {              /* but, error in evaluator */
+               result->opcode = -1;   /* unrecoverable parse error: */
+               return result;         /* ignore this instruction */
+           }
+           if (!is_simple (value)) {
+               error (ERR_NONFATAL,
+                      "non-constant argument supplied to TIMES");
+               result->times = 1L;
+           } else {
+               result->times = value->value;
+               if (value->value < 0)
+                   error(ERR_NONFATAL, "TIMES value %d is negative",
+                         value->value);
+           }
+       } else {
+           if (result->nprefix == MAXPREFIX)
+               error (ERR_NONFATAL,
+                      "instruction has more than %d prefixes", MAXPREFIX);
+           else
+               result->prefixes[result->nprefix++] = tokval.t_integer;
+           i = stdscan(NULL, &tokval);
+       }
+    }
+
+    if (i != TOKEN_INSN) {
+       if (result->nprefix > 0 && i == 0) {
+           /*
+            * Instruction prefixes are present, but no actual
+            * instruction. This is allowed: at this point we
+            * invent a notional instruction of RESB 0.
+            */
+           result->opcode = I_RESB;
+           result->operands = 1;
+           result->oprs[0].type = IMMEDIATE;
+           result->oprs[0].offset = 0L;
+           result->oprs[0].segment = result->oprs[0].wrt = NO_SEG;
+           return result;
+       } else {
+           error (ERR_NONFATAL, "parser: instruction expected");
+           result->opcode = -1;
+           return result;
+       }
+    }
+
+    result->opcode = tokval.t_integer;
+    result->condition = tokval.t_inttwo;
+
+    /*
+     * RESB, RESW and RESD cannot be satisfied with incorrectly
+     * evaluated operands, since the correct values _must_ be known
+     * on the first pass. Hence, even in pass one, we set the
+     * `critical' flag on calling evaluate(), so that it will bomb
+     * out on undefined symbols. Nasty, but there's nothing we can
+     * do about it.
+     *
+     * For the moment, EQU has the same difficulty, so we'll
+     * include that.
+     */
+    if (result->opcode == I_RESB ||
+       result->opcode == I_RESW ||
+       result->opcode == I_RESD ||
+       result->opcode == I_RESQ ||
+       result->opcode == I_REST ||
+       result->opcode == I_EQU)
+       critical = pass;
+    else
+       critical = (pass==2 ? 2 : 0);
+
+    if (result->opcode == I_DB ||
+       result->opcode == I_DW ||
+       result->opcode == I_DD ||
+       result->opcode == I_DQ ||
+       result->opcode == I_DT ||
+       result->opcode == I_INCBIN) {
+       extop *eop, **tail = &result->eops, **fixptr;
+       int oper_num = 0;
+
+       /*
+        * Begin to read the DB/DW/DD/DQ/DT operands.
+        */
+       while (1) {
+           i = stdscan(NULL, &tokval);
+           if (i == 0)
+               break;
+           fixptr = tail;
+           eop = *tail = nasm_malloc(sizeof(extop));
+           tail = &eop->next;
+           eop->next = NULL;
+           eop->type = EOT_NOTHING;
+           oper_num++;
+
+           if (i == TOKEN_NUM && tokval.t_charptr && is_comma_next()) {
+               eop->type = EOT_DB_STRING;
+               eop->stringval = tokval.t_charptr;
+               eop->stringlen = tokval.t_inttwo;
+               i = stdscan(NULL, &tokval);       /* eat the comma */
+               continue;
+           }
+
+           if (i == TOKEN_FLOAT || i == '-') {
+               long sign = +1L;
+
+               if (i == '-') {
+                   char *save = stdscan_bufptr;
+                   i = stdscan(NULL, &tokval);
+                   sign = -1L;
+                   if (i != TOKEN_FLOAT) {
+                       stdscan_bufptr = save;
+                       i = tokval.t_type = '-';
+                   }
+               }
+
+               if (i == TOKEN_FLOAT) {
+                   eop->type = EOT_DB_STRING;
+                   if (result->opcode == I_DD)
+                       eop->stringlen = 4;
+                   else if (result->opcode == I_DQ)
+                       eop->stringlen = 8;
+                   else if (result->opcode == I_DT)
+                   eop->stringlen = 10;
+                   else {
+                       error(ERR_NONFATAL, "floating-point constant"
+                             " encountered in `D%c' instruction",
+                             result->opcode == I_DW ? 'W' : 'B');
+                       eop->type = EOT_NOTHING;
+                   }
+                   eop = nasm_realloc(eop, sizeof(extop)+eop->stringlen);
+                   tail = &eop->next;
+                   *fixptr = eop;
+                   eop->stringval = (char *)eop + sizeof(extop);
+                   if (!float_const (tokval.t_charptr, sign,
+                                     (unsigned char *)eop->stringval,
+                                     eop->stringlen, error))
+                       eop->type = EOT_NOTHING;
+                   i = stdscan(NULL, &tokval);       /* eat the comma */
+                   continue;
+               }
+           }
+
+           /* anything else */ {
+               expr *value;
+               value = evaluate (stdscan, NULL, &tokval, NULL,
+                                 critical, error, NULL);
+               i = tokval.t_type;
+               if (!value) {          /* error in evaluator */
+                   result->opcode = -1;/* unrecoverable parse error: */
+                   return result;     /* ignore this instruction */
+               }
+               if (is_unknown(value)) {
+                   eop->type = EOT_DB_NUMBER;
+                   eop->offset = 0;   /* doesn't matter what we put */
+                   eop->segment = eop->wrt = NO_SEG;   /* likewise */
+               } else if (is_reloc(value)) {
+                   eop->type = EOT_DB_NUMBER;
+                   eop->offset = reloc_value(value);
+                   eop->segment = reloc_seg(value);
+                   eop->wrt = reloc_wrt(value);
+               } else {
+                   error (ERR_NONFATAL,
+                          "operand %d: expression is not simple"
+                          " or relocatable", oper_num);
+               }
+           }
+
+           /*
+            * We're about to call stdscan(), which will eat the
+            * comma that we're currently sitting on between
+            * arguments. However, we'd better check first that it
+            * _is_ a comma.
+            */
+           if (i == 0)                /* also could be EOL */
+               break;
+           if (i != ',') {
+               error (ERR_NONFATAL, "comma expected after operand %d",
+                      oper_num);
+               result->opcode = -1;/* unrecoverable parse error: */
+               return result;     /* ignore this instruction */
+           }
+       }
+
+       if (result->opcode == I_INCBIN) {
+           /*
+            * Correct syntax for INCBIN is that there should be
+            * one string operand, followed by one or two numeric
+            * operands.
+            */
+           if (!result->eops || result->eops->type != EOT_DB_STRING)
+               error (ERR_NONFATAL, "`incbin' expects a file name");
+           else if (result->eops->next &&
+                    result->eops->next->type != EOT_DB_NUMBER)
+               error (ERR_NONFATAL, "`incbin': second parameter is",
+                      " non-numeric");
+           else if (result->eops->next && result->eops->next->next &&
+                    result->eops->next->next->type != EOT_DB_NUMBER)
+               error (ERR_NONFATAL, "`incbin': third parameter is",
+                      " non-numeric");
+           else if (result->eops->next && result->eops->next->next &&
+                    result->eops->next->next->next)
+               error (ERR_NONFATAL, "`incbin': more than three parameters");
+           else
+               return result;
+           /*
+            * If we reach here, one of the above errors happened.
+            * Throw the instruction away.
+            */
+           result->opcode = -1;
+           return result;
+       }
+
+       return result;
+    }
+
+    /* right. Now we begin to parse the operands. There may be up to three
+     * of these, separated by commas, and terminated by a zero token. */
+
+    for (operand = 0; operand < 3; operand++) {
+       expr *value;                   /* used most of the time */
+       int mref;                      /* is this going to be a memory ref? */
+       int bracket;                   /* is it a [] mref, or a & mref? */
+
+       result->oprs[operand].addr_size = 0;/* have to zero this whatever */
+       result->oprs[operand].eaflags = 0;   /* and this */
+       i = stdscan(NULL, &tokval);
+       if (i == 0) break;             /* end of operands: get out of here */
+       result->oprs[operand].type = 0;   /* so far, no override */
+       while (i == TOKEN_SPECIAL)      {/* size specifiers */
+           switch ((int)tokval.t_integer) {
+             case S_BYTE:
+               result->oprs[operand].type |= BITS8;
+               break;
+             case S_WORD:
+               result->oprs[operand].type |= BITS16;
+               break;
+             case S_DWORD:
+             case S_LONG:
+               result->oprs[operand].type |= BITS32;
+               break;
+             case S_QWORD:
+               result->oprs[operand].type |= BITS64;
+               break;
+             case S_TWORD:
+               result->oprs[operand].type |= BITS80;
+               break;
+             case S_TO:
+               result->oprs[operand].type |= TO;
+               break;
+             case S_FAR:
+               result->oprs[operand].type |= FAR;
+               break;
+             case S_NEAR:
+               result->oprs[operand].type |= NEAR;
+               break;
+             case S_SHORT:
+               result->oprs[operand].type |= SHORT;
+               break;
+           }
+           i = stdscan(NULL, &tokval);
+       }
+
+       if (i == '[' || i == '&') {    /* memory reference */
+           mref = TRUE;
+           bracket = (i == '[');
+           i = stdscan(NULL, &tokval);     
+           if (i == TOKEN_SPECIAL) {  /* check for address size override */
+               switch ((int)tokval.t_integer) {
+                 case S_NOSPLIT:
+                   result->oprs[operand].eaflags |= EAF_TIMESTWO;
+                   break;
+                 case S_BYTE:
+                   result->oprs[operand].eaflags |= EAF_BYTEOFFS;
+                   break;
+                 case S_WORD:
+                   result->oprs[operand].addr_size = 16;
+                   result->oprs[operand].eaflags |= EAF_WORDOFFS;
+                   break;
+                 case S_DWORD:
+                 case S_LONG:
+                   result->oprs[operand].addr_size = 32;
+                   result->oprs[operand].eaflags |= EAF_WORDOFFS;
+                   break;
+                 default:
+                   error (ERR_NONFATAL, "invalid size specification in"
+                          " effective address");
+               }
+               i = stdscan(NULL, &tokval);
+           }
+       } else {                       /* immediate operand, or register */
+           mref = FALSE;
+           bracket = FALSE;           /* placate optimisers */
+       }
+
+       value = evaluate (stdscan, NULL, &tokval,
+                         &result->forw_ref, critical, error, &hints);
+       i = tokval.t_type;
+       if (!value) {                  /* error in evaluator */
+           result->opcode = -1;       /* unrecoverable parse error: */
+           return result;             /* ignore this instruction */
+       }
+       if (i == ':' && mref) {        /* it was seg:offset */
+           /*
+            * Process the segment override.
+            */
+           if (value[1].type!=0 || value->value!=1 ||
+               REG_SREG & ~reg_flags[value->type])
+               error (ERR_NONFATAL, "invalid segment override");
+           else if (result->nprefix == MAXPREFIX)
+               error (ERR_NONFATAL,
+                      "instruction has more than %d prefixes",
+                      MAXPREFIX);
+           else
+               result->prefixes[result->nprefix++] = value->type;
+
+           i = stdscan(NULL, &tokval);        /* then skip the colon */
+           if (i == TOKEN_SPECIAL) {  /* another check for size override */
+               switch ((int)tokval.t_integer) {
+                 case S_WORD:
+                   result->oprs[operand].addr_size = 16;
+                   break;
+                 case S_DWORD:
+                 case S_LONG:
+                   result->oprs[operand].addr_size = 32;
+                   break;
+                 default:
+                   error (ERR_NONFATAL, "invalid size specification in"
+                          " effective address");
+               }
+               i = stdscan(NULL, &tokval);
+           }
+           value = evaluate (stdscan, NULL, &tokval,
+                             &result->forw_ref, critical, error, &hints);
+           i = tokval.t_type;
+           /* and get the offset */
+           if (!value) {              /* but, error in evaluator */
+               result->opcode = -1;   /* unrecoverable parse error: */
+               return result;         /* ignore this instruction */
+           }
+       }
+       if (mref && bracket) {         /* find ] at the end */
+           if (i != ']') {
+               error (ERR_NONFATAL, "parser: expecting ]");
+               do {                   /* error recovery again */
+                   i = stdscan(NULL, &tokval);
+               } while (i != 0 && i != ',');
+           } else                     /* we got the required ] */
+               i = stdscan(NULL, &tokval);
+       } else {                       /* immediate operand */
+           if (i != 0 && i != ',' && i != ':') {
+               error (ERR_NONFATAL, "comma or end of line expected");
+               do {                   /* error recovery */
+                   i = stdscan(NULL, &tokval);
+               } while (i != 0 && i != ',');
+           } else if (i == ':') {
+               result->oprs[operand].type |= COLON;
+           }
+       }
+
+       /* now convert the exprs returned from evaluate() into operand
+        * descriptions... */
+
+       if (mref) {                    /* it's a memory reference */
+           expr *e = value;
+           int b, i, s;               /* basereg, indexreg, scale */
+           long o;                    /* offset */
+
+           b = i = -1, o = s = 0;
+           result->oprs[operand].hintbase = hints.base;
+           result->oprs[operand].hinttype = hints.type;
+
+           if (e->type <= EXPR_REG_END) {   /* this bit's a register */
+               if (e->value == 1) /* in fact it can be basereg */
+                   b = e->type;
+               else           /* no, it has to be indexreg */
+                   i = e->type, s = e->value;
+               e++;
+           }
+           if (e->type && e->type <= EXPR_REG_END) {/* it's a 2nd register */
+               if (e->value != 1) {   /* it has to be indexreg */
+                   if (i != -1) {     /* but it can't be */
+                       error(ERR_NONFATAL, "invalid effective address");
+                       result->opcode = -1;
+                       return result;
+                   } else
+                       i = e->type, s = e->value;
+               } else {               /* it can be basereg */
+                   if (b != -1)       /* or can it? */
+                       i = e->type, s = 1;
+                   else
+                       b = e->type;
+               }
+               e++;
+           }
+           if (e->type != 0) {        /* is there an offset? */
+               if (e->type <= EXPR_REG_END) {/* in fact, is there an error? */
+                   error (ERR_NONFATAL, "invalid effective address");
+                   result->opcode = -1;
+                   return result;
+               } else {
+                   if (e->type == EXPR_UNKNOWN) {
+                       o = 0;         /* doesn't matter what */
+                       result->oprs[operand].wrt = NO_SEG;   /* nor this */
+                       result->oprs[operand].segment = NO_SEG;  /* or this */
+                       while (e->type) e++;   /* go to the end of the line */
+                   } else {
+                       if (e->type == EXPR_SIMPLE) {
+                           o = e->value;
+                           e++;
+                       }
+                       if (e->type == EXPR_WRT) {
+                           result->oprs[operand].wrt = e->value;
+                           e++;
+                       } else
+                           result->oprs[operand].wrt = NO_SEG;
+                       /*
+                        * Look for a segment base type.
+                        */
+                       if (e->type && e->type < EXPR_SEGBASE) {
+                           error (ERR_NONFATAL, "invalid effective address");
+                           result->opcode = -1;
+                           return result;
+                       }
+                       while (e->type && e->value == 0)
+                           e++;
+                       if (e->type && e->value != 1) {
+                           error (ERR_NONFATAL, "invalid effective address");
+                           result->opcode = -1;
+                           return result;
+                       }
+                       if (e->type) {
+                           result->oprs[operand].segment =
+                               e->type - EXPR_SEGBASE;
+                           e++;
+                       } else
+                           result->oprs[operand].segment = NO_SEG;
+                       while (e->type && e->value == 0)
+                           e++;
+                       if (e->type) {
+                           error (ERR_NONFATAL, "invalid effective address");
+                           result->opcode = -1;
+                           return result;
+                       }
+                   }
+               }
+           } else {
+               o = 0;
+               result->oprs[operand].wrt = NO_SEG;
+               result->oprs[operand].segment = NO_SEG;
+           }
+
+           if (e->type != 0) {    /* there'd better be nothing left! */
+               error (ERR_NONFATAL, "invalid effective address");
+               result->opcode = -1;
+               return result;
+           }
+
+           result->oprs[operand].type |= MEMORY;
+           if (b==-1 && (i==-1 || s==0))
+               result->oprs[operand].type |= MEM_OFFS;
+           result->oprs[operand].basereg = b;
+           result->oprs[operand].indexreg = i;
+           result->oprs[operand].scale = s;
+           result->oprs[operand].offset = o;
+       } else {                       /* it's not a memory reference */
+           if (is_just_unknown(value)) {     /* it's immediate but unknown */
+               result->oprs[operand].type |= IMMEDIATE;
+               result->oprs[operand].offset = 0;   /* don't care */
+               result->oprs[operand].segment = NO_SEG; /* don't care again */
+               result->oprs[operand].wrt = NO_SEG;/* still don't care */
+           } else if (is_reloc(value)) {     /* it's immediate */
+               result->oprs[operand].type |= IMMEDIATE;
+               result->oprs[operand].offset = reloc_value(value);
+               result->oprs[operand].segment = reloc_seg(value);
+               result->oprs[operand].wrt = reloc_wrt(value);
+               if (is_simple(value) && reloc_value(value)==1)
+                   result->oprs[operand].type |= UNITY;
+           } else {           /* it's a register */
+               if (value->type>=EXPR_SIMPLE || value->value!=1) {
+                   error (ERR_NONFATAL, "invalid operand type");
+                   result->opcode = -1;
+                   return result;
+               }
+               /* clear overrides, except TO which applies to FPU regs */
+               result->oprs[operand].type &= TO;
+               result->oprs[operand].type |= REGISTER;
+               result->oprs[operand].type |= reg_flags[value->type];
+               result->oprs[operand].basereg = value->type;
+           }
+       }
+    }
+
+    result->operands = operand;       /* set operand count */
+
+    while (operand<3)                 /* clear remaining operands */
+       result->oprs[operand++].type = 0;
+
+    /*
+     * Transform RESW, RESD, RESQ, REST into RESB.
+     */
+    switch (result->opcode) {
+      case I_RESW: result->opcode=I_RESB; result->oprs[0].offset*=2; break;
+      case I_RESD: result->opcode=I_RESB; result->oprs[0].offset*=4; break;
+      case I_RESQ: result->opcode=I_RESB; result->oprs[0].offset*=8; break;
+      case I_REST: result->opcode=I_RESB; result->oprs[0].offset*=10; break;
+    }
+
+    return result;
+}
+
+static int is_comma_next (void) {
+    char *p;
+    int i;
+    struct tokenval tv;
+
+    p = stdscan_bufptr;
+    i = stdscan (NULL, &tv);
+    stdscan_bufptr = p;
+    return (i == ',' || i == ';' || !i);
+}
+
+void cleanup_insn (insn *i) {
+    extop *e;
+
+    while (i->eops) {
+       e = i->eops;
+       i->eops = i->eops->next;
+       nasm_free (e);
+    }
+}
diff --git a/i386/nasm/parser.h b/i386/nasm/parser.h
new file mode 100644 (file)
index 0000000..d35a11c
--- /dev/null
@@ -0,0 +1,40 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
+ * Reserved.  This file contains Original Code and/or Modifications of
+ * Original Code as defined in and that are subject to the Apple Public
+ * Source License Version 1.1 (the "License").  You may not use this file
+ * except in compliance with the License.  Please obtain a copy of the
+ * License at http://www.apple.com/publicsource and read it before using
+ * this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/* parser.h   header file for the parser module of the Netwide
+ *            Assembler
+ *
+ * The Netwide Assembler is copyright (C) 1996 Simon Tatham and
+ * Julian Hall. All rights reserved. The software is
+ * redistributable under the licence given in the file "Licence"
+ * distributed in the NASM archive.
+ */
+
+#ifndef NASM_PARSER_H
+#define NASM_PARSER_H
+
+insn *parse_line (int pass, char *buffer, insn *result,
+                 efunc error, evalfunc evaluate, evalinfofunc einfo);
+void cleanup_insn (insn *instruction);
+
+#endif
diff --git a/i386/nasm/preproc.c b/i386/nasm/preproc.c
new file mode 100644 (file)
index 0000000..8e4ada7
--- /dev/null
@@ -0,0 +1,3024 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
+ * Reserved.  This file contains Original Code and/or Modifications of
+ * Original Code as defined in and that are subject to the Apple Public
+ * Source License Version 1.1 (the "License").  You may not use this file
+ * except in compliance with the License.  Please obtain a copy of the
+ * License at http://www.apple.com/publicsource and read it before using
+ * this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/* preproc.c   macro preprocessor for the Netwide Assembler
+ *
+ * The Netwide Assembler is copyright (C) 1996 Simon Tatham and
+ * Julian Hall. All rights reserved. The software is
+ * redistributable under the licence given in the file "Licence"
+ * distributed in the NASM archive.
+ *
+ * initial version 18/iii/97 by Simon Tatham
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <stddef.h>
+#include <string.h>
+#include <ctype.h>
+#include <limits.h>
+
+#include "nasm.h"
+#include "nasmlib.h"
+
+typedef struct SMacro SMacro;
+typedef struct MMacro MMacro;
+typedef struct Context Context;
+typedef struct Token Token;
+typedef struct Line Line;
+typedef struct Include Include;
+typedef struct Cond Cond;
+typedef struct IncPath IncPath;
+
+/*
+ * Store the definition of a single-line macro.
+ */
+struct SMacro {
+    SMacro *next;
+    char *name;
+    int casesense;
+    int nparam;
+    int in_progress;
+    Token *expansion;
+};
+
+/*
+ * Store the definition of a multi-line macro. This is also used to
+ * store the interiors of `%rep...%endrep' blocks, which are
+ * effectively self-re-invoking multi-line macros which simply
+ * don't have a name or bother to appear in the hash tables. %rep
+ * blocks are signified by having a NULL `name' field.
+ *
+ * In a MMacro describing a `%rep' block, the `in_progress' field
+ * isn't merely boolean, but gives the number of repeats left to
+ * run.
+ *
+ * The `next' field is used for storing MMacros in hash tables; the
+ * `next_active' field is for stacking them on istk entries.
+ *
+ * When a MMacro is being expanded, `params', `iline', `nparam',
+ * `paramlen', `rotate' and `unique' are local to the invocation.
+ */
+struct MMacro {
+    MMacro *next;
+    char *name;
+    int casesense;
+    int nparam_min, nparam_max;
+    int plus;                         /* is the last parameter greedy? */
+    int nolist;                               /* is this macro listing-inhibited? */
+    int in_progress;
+    Token **defaults, *dlist;
+    int ndefs;                        /* number of default parameters */
+    Line *expansion;
+
+    MMacro *next_active;
+    Token **params, *iline;
+    int nparam, rotate, *paramlen;
+    unsigned long unique;
+};
+
+/*
+ * The context stack is composed of a linked list of these.
+ */
+struct Context {
+    Context *next;
+    SMacro *localmac;
+    char *name;
+    unsigned long number;
+};
+
+/*
+ * This is the internal form which we break input lines up into.
+ * Typically stored in linked lists.
+ *
+ * TOK_PS_OTHER is a token type used internally within
+ * expand_smacro(), to denote a token which has already been
+ * checked for being a potential macro, but may still be a context-
+ * local label.
+ *
+ * Note that `type' serves a double meaning: TOK_SMAC_PARAM is not
+ * necessarily used as-is, but is intended to denote the number of
+ * the substituted parameter. So in the definition
+ *
+ *     %define a(x,y) ( (x) & ~(y) )
+ * 
+ * the token representing `x' will have its type changed to
+ * TOK_SMAC_PARAM, but the one representing `y' will be
+ * TOK_SMAC_PARAM+1.
+ *
+ * TOK_INTERNAL_STRING is a dirty hack: it's a single string token
+ * which doesn't need quotes around it. Used in the pre-include
+ * mechanism as an alternative to trying to find a sensible type of
+ * quote to use on the filename we were passed.
+ */
+struct Token {
+    Token *next;
+    char *text;
+    SMacro *mac;                      /* associated macro for TOK_SMAC_END */
+    int type;
+};
+enum {
+    TOK_WHITESPACE = 1, TOK_COMMENT, TOK_ID, TOK_PREPROC_ID, TOK_STRING,
+    TOK_NUMBER, TOK_SMAC_END, TOK_OTHER, TOK_PS_OTHER, TOK_SMAC_PARAM,
+    TOK_INTERNAL_STRING
+};
+
+/*
+ * Multi-line macro definitions are stored as a linked list of
+ * these, which is essentially a container to allow several linked
+ * lists of Tokens.
+ * 
+ * Note that in this module, linked lists are treated as stacks
+ * wherever possible. For this reason, Lines are _pushed_ on to the
+ * `expansion' field in MMacro structures, so that the linked list,
+ * if walked, would give the macro lines in reverse order; this
+ * means that we can walk the list when expanding a macro, and thus
+ * push the lines on to the `expansion' field in _istk_ in reverse
+ * order (so that when popped back off they are in the right
+ * order). It may seem cockeyed, and it relies on my design having
+ * an even number of steps in, but it works...
+ *
+ * Some of these structures, rather than being actual lines, are
+ * markers delimiting the end of the expansion of a given macro.
+ * This is for use in the cycle-tracking and %rep-handling code.
+ * Such structures have `finishes' non-NULL, and `first' NULL. All
+ * others have `finishes' NULL, but `first' may still be NULL if
+ * the line is blank.
+ */
+struct Line {
+    Line *next;
+    MMacro *finishes;
+    Token *first;
+};
+
+/*
+ * To handle an arbitrary level of file inclusion, we maintain a
+ * stack (ie linked list) of these things.
+ */
+struct Include {
+    Include *next;
+    FILE *fp;
+    Cond *conds;
+    Line *expansion;
+    char *fname;
+    int lineno, lineinc;
+    MMacro *mstk;                     /* stack of active macros/reps */
+};
+
+/*
+ * Include search path. This is simply a list of strings which get
+ * prepended, in turn, to the name of an include file, in an
+ * attempt to find the file if it's not in the current directory.
+ */
+struct IncPath {
+    IncPath *next;
+    char *path;
+};
+
+/*
+ * Conditional assembly: we maintain a separate stack of these for
+ * each level of file inclusion. (The only reason we keep the
+ * stacks separate is to ensure that a stray `%endif' in a file
+ * included from within the true branch of a `%if' won't terminate
+ * it and cause confusion: instead, rightly, it'll cause an error.)
+ */
+struct Cond {
+    Cond *next;
+    int state;
+};
+enum {
+    /*
+     * These states are for use just after %if or %elif: IF_TRUE
+     * means the condition has evaluated to truth so we are
+     * currently emitting, whereas IF_FALSE means we are not
+     * currently emitting but will start doing so if a %else comes
+     * up. In these states, all directives are admissible: %elif,
+     * %else and %endif. (And of course %if.)
+     */
+    COND_IF_TRUE, COND_IF_FALSE,
+    /*
+     * These states come up after a %else: ELSE_TRUE means we're
+     * emitting, and ELSE_FALSE means we're not. In ELSE_* states,
+     * any %elif or %else will cause an error.
+     */
+    COND_ELSE_TRUE, COND_ELSE_FALSE,
+    /*
+     * This state means that we're not emitting now, and also that
+     * nothing until %endif will be emitted at all. It's for use in
+     * two circumstances: (i) when we've had our moment of emission
+     * and have now started seeing %elifs, and (ii) when the
+     * condition construct in question is contained within a
+     * non-emitting branch of a larger condition construct.
+     */
+    COND_NEVER
+};
+#define emitting(x) ( (x) == COND_IF_TRUE || (x) == COND_ELSE_TRUE )
+
+/*
+ * Condition codes. Note that we use c_ prefix not C_ because C_ is
+ * used in nasm.h for the "real" condition codes. At _this_ level,
+ * we treat CXZ and ECXZ as condition codes, albeit non-invertible
+ * ones, so we need a different enum...
+ */
+static char *conditions[] = {
+    "a", "ae", "b", "be", "c", "cxz", "e", "ecxz", "g", "ge", "l", "le",
+    "na", "nae", "nb", "nbe", "nc", "ne", "ng", "nge", "nl", "nle", "no",
+    "np", "ns", "nz", "o", "p", "pe", "po", "s", "z"
+};
+enum {
+    c_A, c_AE, c_B, c_BE, c_C, c_CXZ, c_E, c_ECXZ, c_G, c_GE, c_L, c_LE,
+    c_NA, c_NAE, c_NB, c_NBE, c_NC, c_NE, c_NG, c_NGE, c_NL, c_NLE, c_NO,
+    c_NP, c_NS, c_NZ, c_O, c_P, c_PE, c_PO, c_S, c_Z
+};
+static int inverse_ccs[] = {
+    c_NA, c_NAE, c_NB, c_NBE, c_NC, -1, c_NE, -1, c_NG, c_NGE, c_NL, c_NLE,
+    c_A, c_AE, c_B, c_BE, c_C, c_E, c_G, c_GE, c_L, c_LE, c_O, c_P, c_S,
+    c_Z, c_NO, c_NP, c_PO, c_PE, c_NS, c_NZ
+};
+
+/*
+ * Directive names.
+ */
+static char *directives[] = {
+    "%assign", "%clear", "%define", "%elif", "%elifctx", "%elifdef",
+    "%elifid", "%elifidn", "%elifidni", "%elifnctx", "%elifndef",
+    "%elifnid", "%elifnidn", "%elifnidni", "%elifnnum", "%elifnstr",
+    "%elifnum", "%elifstr", "%else", "%endif", "%endm", "%endmacro",
+    "%endrep", "%error", "%exitrep", "%iassign", "%idefine", "%if",
+    "%ifctx", "%ifdef", "%ifid", "%ifidn", "%ifidni", "%ifnctx",
+    "%ifndef", "%ifnid", "%ifnidn", "%ifnidni", "%ifnnum",
+    "%ifnstr", "%ifnum", "%ifstr", "%imacro", "%include", "%line",
+    "%macro", "%pop", "%push", "%rep", "%repl", "%rotate"
+};
+enum {
+    PP_ASSIGN, PP_CLEAR, PP_DEFINE, PP_ELIF, PP_ELIFCTX, PP_ELIFDEF,
+    PP_ELIFID, PP_ELIFIDN, PP_ELIFIDNI, PP_ELIFNCTX, PP_ELIFNDEF,
+    PP_ELIFNID, PP_ELIFNIDN, PP_ELIFNIDNI, PP_ELIFNNUM, PP_ELIFNSTR,
+    PP_ELIFNUM, PP_ELIFSTR, PP_ELSE, PP_ENDIF, PP_ENDM, PP_ENDMACRO,
+    PP_ENDREP, PP_ERROR, PP_EXITREP, PP_IASSIGN, PP_IDEFINE, PP_IF,
+    PP_IFCTX, PP_IFDEF, PP_IFID, PP_IFIDN, PP_IFIDNI, PP_IFNCTX,
+    PP_IFNDEF, PP_IFNID, PP_IFNIDN, PP_IFNIDNI, PP_IFNNUM,
+    PP_IFNSTR, PP_IFNUM, PP_IFSTR, PP_IMACRO, PP_INCLUDE, PP_LINE,
+    PP_MACRO, PP_POP, PP_PUSH, PP_REP, PP_REPL, PP_ROTATE
+};
+
+
+static Context *cstk;
+static Include *istk;
+static IncPath *ipath = NULL;
+
+static efunc error;
+static evalfunc evaluate;
+
+static int pass;
+
+static unsigned long unique;          /* unique identifier numbers */
+
+static char *linesync, *outline;
+
+static Line *predef = NULL;
+
+static ListGen *list;
+
+/*
+ * The number of hash values we use for the macro lookup tables.
+ */
+#define NHASH 31
+
+/*
+ * The current set of multi-line macros we have defined.
+ */
+static MMacro *mmacros[NHASH];
+
+/*
+ * The current set of single-line macros we have defined.
+ */
+static SMacro *smacros[NHASH];
+
+/*
+ * The multi-line macro we are currently defining, or the %rep
+ * block we are currently reading, if any.
+ */
+static MMacro *defining;
+
+/*
+ * The number of macro parameters to allocate space for at a time.
+ */
+#define PARAM_DELTA 16
+
+/*
+ * The standard macro set: defined as `static char *stdmac[]'. Also
+ * gives our position in the macro set, when we're processing it.
+ */
+#include "macros.c"
+static char **stdmacpos;
+
+/*
+ * The extra standard macros that come from the object format, if
+ * any.
+ */
+static char **extrastdmac = NULL;
+int any_extrastdmac;
+
+/*
+ * Forward declarations.
+ */
+static Token *expand_smacro (Token *tline);
+static void update_fileline (int which);
+
+/*
+ * The pre-preprocessing stage... This function translates line
+ * number indications as they emerge from GNU cpp (`# lineno "file"
+ * flags') into NASM preprocessor line number indications (`%line
+ * lineno file').
+ */
+static char *prepreproc(char *line) {
+    int lineno, fnlen;
+    char *fname, *oldline;
+
+    if (line[0] == '#' && line[1] == ' ') {
+       oldline = line;
+       fname = oldline+2;
+       lineno = atoi(fname);
+       fname += strspn(fname, "0123456789 ");
+       if (*fname == '"')
+           fname++;
+       fnlen = strcspn(fname, "\"");
+       line = nasm_malloc(20+fnlen);
+       sprintf(line, "%%line %d %.*s", lineno, fnlen, fname);
+       nasm_free (oldline);
+    }
+    return line;
+}
+
+/*
+ * The hash function for macro lookups. Note that due to some
+ * macros having case-insensitive names, the hash function must be
+ * invariant under case changes. We implement this by applying a
+ * perfectly normal hash function to the uppercase of the string.
+ */
+static int hash(char *s) {
+    /*
+     * Powers of three, mod 31.
+     */
+    static const int multipliers[] = {
+       1, 3, 9, 27, 19, 26, 16, 17, 20, 29, 25, 13, 8, 24, 10,
+       30, 28, 22, 4, 12, 5, 15, 14, 11, 2, 6, 18, 23, 7, 21
+    };
+    int h = 0;
+    int i = 0;
+
+    while (*s) {
+       h += multipliers[i] * (unsigned char) (toupper(*s));
+       s++;
+       if (++i >= sizeof(multipliers)/sizeof(*multipliers))
+           i = 0;
+    }
+    h %= NHASH;
+    return h;
+}
+
+/*
+ * Free a linked list of tokens.
+ */
+static void free_tlist (Token *list) {
+    Token *t;
+    while (list) {
+       t = list;
+       list = list->next;
+       nasm_free (t->text);
+       nasm_free (t);
+    }
+}
+
+/*
+ * Free a linked list of lines.
+ */
+static void free_llist (Line *list) {
+    Line *l;
+    while (list) {
+       l = list;
+       list = list->next;
+       free_tlist (l->first);
+       nasm_free (l);
+    }
+}
+
+/*
+ * Pop the context stack.
+ */
+static void ctx_pop (void) {
+    Context *c = cstk;
+    SMacro *smac, *s;
+
+    cstk = cstk->next;
+    smac = c->localmac;
+    while (smac) {
+       s = smac;
+       smac = smac->next;
+       nasm_free (s->name);
+       free_tlist (s->expansion);
+       nasm_free (s);
+    }
+    nasm_free (c->name);
+    nasm_free (c);
+}
+
+/*
+ * Generate a line synchronisation comment, to ensure the assembler
+ * knows which source file the current output has really come from.
+ */
+static void line_sync (void) {
+    char text[30+FILENAME_MAX];
+    sprintf(text, "%%line %d+%d %s",
+           (istk->expansion ? istk->lineno - istk->lineinc : istk->lineno),
+           (istk->expansion ? 0 : istk->lineinc), istk->fname);
+    nasm_free (linesync);
+    linesync = nasm_strdup(text);
+}
+
+#define BUF_DELTA 512
+/*
+ * Read a line from the top file in istk, handling multiple CR/LFs
+ * at the end of the line read, and handling spurious ^Zs. Will
+ * return lines from the standard macro set if this has not already
+ * been done.
+ */
+static char *read_line (void) {
+    char *buffer, *p, *q;
+    int bufsize;
+
+    if (stdmacpos) {
+       if (*stdmacpos) {
+           char *ret = nasm_strdup(*stdmacpos++);
+           if (!*stdmacpos && any_extrastdmac) {
+               stdmacpos = extrastdmac;
+               any_extrastdmac = FALSE;
+               return ret;
+           }
+           /*
+            * Nasty hack: here we push the contents of `predef' on
+            * to the top-level expansion stack, since this is the
+            * most convenient way to implement the pre-include and
+            * pre-define features.
+            */
+           if (!*stdmacpos) {
+               Line *pd, *l;
+               Token *head, **tail, *t, *tt;
+
+               for (pd = predef; pd; pd = pd->next) {
+                   head = NULL;
+                   tail = &head;
+                   for (t = pd->first; t; t = t->next) {
+                       tt = *tail = nasm_malloc(sizeof(Token));
+                       tt->next = NULL;
+                       tail = &tt->next;
+                       tt->type = t->type;
+                       tt->text = nasm_strdup(t->text);
+                       tt->mac = t->mac;   /* always NULL here, in fact */
+                   }
+                   l = nasm_malloc(sizeof(Line));
+                   l->next = istk->expansion;
+                   l->first = head;
+                   l->finishes = FALSE;
+                   istk->expansion = l;
+               }
+           }
+           return ret;
+       } else {
+           stdmacpos = NULL;
+           line_sync();
+           update_fileline(3);        /* update __FILE__ and __LINE__ */
+       }
+    }
+
+    bufsize = BUF_DELTA;
+    buffer = nasm_malloc(BUF_DELTA);
+    p = buffer;
+    while (1) {
+       q = fgets(p, bufsize-(p-buffer), istk->fp);
+       if (!q)
+           break;
+       p += strlen(p);
+       if (p > buffer && p[-1] == '\n') {
+           istk->lineno += istk->lineinc;
+           update_fileline(1);        /* update __LINE__ only */
+           break;
+       }
+       if (p-buffer > bufsize-10) {
+           bufsize += BUF_DELTA;
+           buffer = nasm_realloc(buffer, bufsize);
+       }
+    }
+
+    if (!q && p == buffer) {
+       nasm_free (buffer);
+       return NULL;
+    }
+
+    /*
+     * Play safe: remove CRs as well as LFs, if any of either are
+     * present at the end of the line.
+     */
+    while (p > buffer && (p[-1] == '\n' || p[-1] == '\r'))
+       *--p = '\0';
+
+    /*
+     * Handle spurious ^Z, which may be inserted into source files
+     * by some file transfer utilities.
+     */
+    buffer[strcspn(buffer, "\032")] = '\0';
+
+    list->line (LIST_READ, buffer);
+
+    return buffer;
+}
+
+/*
+ * Tokenise a line of text. This is a very simple process since we
+ * don't need to parse the value out of e.g. numeric tokens: we
+ * simply split one string into many.
+ */
+static Token *tokenise (char *line) {
+    char *p = line;
+    int type;
+    Token *list = NULL;
+    Token *t, **tail = &list;
+
+    while (*line) {
+       p = line;
+       if (*p == '%' &&
+           (p[1] == '{' || p[1] == '!' || (p[1] == '%' && isidchar(p[2])) ||
+            p[1] == '$' || p[1] == '+' || p[1] == '-' || isidchar(p[1]))) {
+           type = TOK_PREPROC_ID;
+           p++;
+           if (*p == '{') {
+               p++;
+               while (*p && *p != '}') {
+                   p[-1] = *p;
+                   p++;
+               }
+               p[-1] = '\0';
+               if (*p) p++;
+           } else {
+               if (*p == '!' || *p == '%' || *p == '$' ||
+                   *p == '+' || *p == '-') p++;
+               while (*p && isidchar(*p))
+                   p++;
+           }
+       } else if (isidstart(*p) || (*p == '$' && isidstart(p[1]))) {
+           type = TOK_ID;
+           p++;
+           while (*p && isidchar(*p))
+               p++;
+       } else if (*p == '\'' || *p == '"') {
+           /*
+            * A string token.
+            */
+           char c = *p;
+           p++;
+           type = TOK_STRING;
+           while (*p && *p != c)
+               p++;
+           if (*p) p++;
+       } else if (isnumstart(*p)) {
+           /*
+            * A number token.
+            */
+           type = TOK_NUMBER;
+           p++;
+           while (*p && isnumchar(*p))
+               p++;
+       } else if (isspace(*p)) {
+           type = TOK_WHITESPACE;
+           p++;
+           while (*p && isspace(*p))
+               p++;
+           /*
+            * Whitespace just before end-of-line is discarded by
+            * pretending it's a comment; whitespace just before a
+            * comment gets lumped into the comment.
+            */
+           if (!*p || *p == ';') {
+               type = TOK_COMMENT;
+               while (*p) p++;
+           }
+       } else if (*p == ';') {
+           type = TOK_COMMENT;
+           while (*p) p++;
+       } else {
+           /*
+            * Anything else is an operator of some kind. We check
+            * for all the double-character operators (>>, <<, //,
+            * %%, <=, >=, ==, !=, <>, &&, ||, ^^), but anything
+            * else is a single-character operator.
+            */
+           type = TOK_OTHER;
+           if ((p[0] == '>' && p[1] == '>') ||
+               (p[0] == '<' && p[1] == '<') ||
+               (p[0] == '/' && p[1] == '/') ||
+               (p[0] == '%' && p[1] == '%') ||
+               (p[0] == '<' && p[1] == '=') ||
+               (p[0] == '>' && p[1] == '=') ||
+               (p[0] == '=' && p[1] == '=') ||
+               (p[0] == '!' && p[1] == '=') ||
+               (p[0] == '<' && p[1] == '>') ||
+               (p[0] == '&' && p[1] == '&') ||
+               (p[0] == '|' && p[1] == '|') ||
+               (p[0] == '^' && p[1] == '^'))
+               p++;
+           p++;
+       }
+       if (type != TOK_COMMENT) {
+           *tail = t = nasm_malloc (sizeof(Token));
+           tail = &t->next;
+           t->next = NULL;
+           t->type = type;
+           t->text = nasm_malloc(1+p-line);
+           strncpy(t->text, line, p-line);
+           t->text[p-line] = '\0';
+       }
+       line = p;
+    }
+
+    return list;
+}
+
+/*
+ * Convert a line of tokens back into text.
+ */
+static char *detoken (Token *tlist) {
+    Token *t;
+    int len;
+    char *line, *p;
+
+    len = 0;
+    for (t = tlist; t; t = t->next) {
+       if (t->type == TOK_PREPROC_ID && t->text[1] == '!') {
+           char *p = getenv(t->text+2);
+           nasm_free (t->text);
+           if (p)
+               t->text = nasm_strdup(p);
+           else
+               t->text = NULL;
+       }
+       if (t->text)
+           len += strlen(t->text);
+    }
+    p = line = nasm_malloc(len+1);
+    for (t = tlist; t; t = t->next) {
+       if (t->text) {
+           strcpy (p, t->text);
+           p += strlen(p);
+       }
+    }
+    *p = '\0';
+    return line;
+}
+
+/*
+ * A scanner, suitable for use by the expression evaluator, which
+ * operates on a line of Tokens. Expects a pointer to a pointer to
+ * the first token in the line to be passed in as its private_data
+ * field.
+ */
+static int ppscan(void *private_data, struct tokenval *tokval) {
+    Token **tlineptr = private_data;
+    Token *tline;
+
+    do {
+       tline = *tlineptr;
+       *tlineptr = tline ? tline->next : NULL;
+    } while (tline && (tline->type == TOK_WHITESPACE ||
+                      tline->type == TOK_COMMENT));
+
+    if (!tline)
+       return tokval->t_type = TOKEN_EOS;
+
+    if (tline->text[0] == '$' && !tline->text[1])
+       return tokval->t_type = TOKEN_HERE;
+    if (tline->text[0] == '$' && tline->text[1] == '$' && !tline->text[1])
+       return tokval->t_type = TOKEN_BASE;
+
+    if (tline->type == TOK_ID) {
+       tokval->t_charptr = tline->text;
+       if (tline->text[0] == '$') {
+           tokval->t_charptr++;
+           return tokval->t_type = TOKEN_ID;
+       }
+
+       /*
+        * This is the only special case we actually need to worry
+        * about in this restricted context.
+        */
+       if (!nasm_stricmp(tline->text, "seg"))
+           return tokval->t_type = TOKEN_SEG;
+
+       return tokval->t_type = TOKEN_ID;
+    }
+
+    if (tline->type == TOK_NUMBER) {
+       int rn_error;
+
+       tokval->t_integer = readnum(tline->text, &rn_error);
+       if (rn_error)
+           return tokval->t_type = TOKEN_ERRNUM;
+       tokval->t_charptr = NULL;
+       return tokval->t_type = TOKEN_NUM;
+    }
+
+    if (tline->type == TOK_OTHER) {
+       if (!strcmp(tline->text, "<<")) return tokval->t_type = TOKEN_SHL;
+       if (!strcmp(tline->text, ">>")) return tokval->t_type = TOKEN_SHR;
+       if (!strcmp(tline->text, "//")) return tokval->t_type = TOKEN_SDIV;
+       if (!strcmp(tline->text, "%%")) return tokval->t_type = TOKEN_SMOD;
+       if (!strcmp(tline->text, "==")) return tokval->t_type = TOKEN_EQ;
+       if (!strcmp(tline->text, "<>")) return tokval->t_type = TOKEN_NE;
+       if (!strcmp(tline->text, "!=")) return tokval->t_type = TOKEN_NE;
+       if (!strcmp(tline->text, "<=")) return tokval->t_type = TOKEN_LE;
+       if (!strcmp(tline->text, ">=")) return tokval->t_type = TOKEN_GE;
+       if (!strcmp(tline->text, "&&")) return tokval->t_type = TOKEN_DBL_AND;
+       if (!strcmp(tline->text, "^^")) return tokval->t_type = TOKEN_DBL_XOR;
+       if (!strcmp(tline->text, "||")) return tokval->t_type = TOKEN_DBL_OR;
+    }
+
+    /*
+     * We have no other options: just return the first character of
+     * the token text.
+     */
+    return tokval->t_type = tline->text[0];
+}
+
+/*
+ * Return the Context structure associated with a %$ token. Return
+ * NULL, having _already_ reported an error condition, if the
+ * context stack isn't deep enough for the supplied number of $
+ * signs.
+ */
+static Context *get_ctx (char *name) {
+    Context *ctx;
+    int i;
+
+    if (!cstk) {
+       error (ERR_NONFATAL|ERR_OFFBY1, "`%s': context stack is empty", name);
+       return NULL;
+    }
+
+    i = 1;
+    ctx = cstk;
+    while (name[i+1] == '$') {
+       i++;
+       ctx = ctx->next;
+       if (!ctx) {
+           error (ERR_NONFATAL|ERR_OFFBY1, "`%s': context stack is only"
+                  " %d level%s deep", name, i-1, (i==2 ? "" : "s"));
+           return NULL;
+       }
+    }
+    return ctx;
+}
+
+/*
+ * Compare a string to the name of an existing macro; this is a
+ * simple wrapper which calls either strcmp or nasm_stricmp
+ * depending on the value of the `casesense' parameter.
+ */
+static int mstrcmp(char *p, char *q, int casesense) {
+    return casesense ? strcmp(p,q) : nasm_stricmp(p,q);
+}
+
+/*
+ * Open an include file. This routine must always return a valid
+ * file pointer if it returns - it's responsible for throwing an
+ * ERR_FATAL and bombing out completely if not. It should also try
+ * the include path one by one until it finds the file or reaches
+ * the end of the path.
+ */
+static FILE *inc_fopen(char *file) {
+    FILE *fp;
+    char *prefix = "", *combine;
+    IncPath *ip = ipath;
+    int len = strlen(file);
+
+    do {
+       combine = nasm_malloc(strlen(prefix)+len+1);
+       strcpy(combine, prefix);
+       strcat(combine, file);
+       fp = fopen(combine, "r");
+       nasm_free (combine);
+       if (fp)
+           return fp;
+       prefix = ip ? ip->path : NULL;
+       if (ip)
+           ip = ip->next;
+    } while (prefix);
+
+    error (ERR_FATAL|ERR_OFFBY1,
+          "unable to open include file `%s'", file);
+    return NULL;                      /* never reached - placate compilers */
+}
+
+/*
+ * Determine if we should warn on defining a single-line macro of
+ * name `name', with `nparam' parameters. If nparam is 0, will
+ * return TRUE if _any_ single-line macro of that name is defined.
+ * Otherwise, will return TRUE if a single-line macro with either
+ * `nparam' or no parameters is defined.
+ *
+ * If a macro with precisely the right number of parameters is
+ * defined, the address of the definition structure will be
+ * returned in `defn'; otherwise NULL will be returned. If `defn'
+ * is NULL, no action will be taken regarding its contents, and no
+ * error will occur.
+ *
+ * Note that this is also called with nparam zero to resolve
+ * `ifdef'.
+ */
+static int smacro_defined (char *name, int nparam, SMacro **defn) {
+    SMacro *m;
+    Context *ctx;
+    char *p;
+
+    if (name[0] == '%' && name[1] == '$') {
+       ctx = get_ctx (name);
+       if (!ctx)
+           return FALSE;              /* got to return _something_ */
+       m = ctx->localmac;
+       p = name+1;
+       p += strspn(p, "$");
+    } else {
+       m = smacros[hash(name)];
+       p = name;
+    }
+
+    while (m) {
+       if (!mstrcmp(m->name, p, m->casesense) &&
+           (nparam == 0 || m->nparam == 0 || nparam == m->nparam)) {
+           if (defn) {
+               if (nparam == m->nparam)
+                   *defn = m;
+               else
+                   *defn = NULL;
+           }
+           return TRUE;
+       }
+       m = m->next;
+    }
+    return FALSE;
+}
+
+/*
+ * Update the __FILE__ and __LINE__ macros. Specifically, update
+ * __FILE__ if bit 1 of our argument is set, and update __LINE__ if
+ * bit 0 is set.
+ *
+ * If the macros don't exist, a `%clear' must have happened, in
+ * which case we should exit quite happily and carry on going. It's
+ * not an error condition.
+ */
+static void update_fileline(int which) {
+    SMacro *sm;
+    char num[20];
+
+    if ((which & 3) && smacro_defined ("__FILE__", 0, &sm) && sm) {
+       free_tlist(sm->expansion);
+       sm->expansion = nasm_malloc(sizeof(Token));
+       sm->expansion->next = NULL;
+       sm->expansion->mac = NULL;
+       sm->expansion->type = TOK_STRING;
+       sm->expansion->text = nasm_malloc(3+strlen(istk->fname));
+       /* FIXME: throw an error if both sorts of quote are present */
+       /* Better still, invent a way for us to cope with that case */
+       sprintf(sm->expansion->text, "\"%s\"", istk->fname);
+    }
+
+    if ((which & 1) && smacro_defined ("__LINE__", 0, &sm) && sm) {
+       free_tlist(sm->expansion);
+       sm->expansion = nasm_malloc(sizeof(Token));
+       sm->expansion->next = NULL;
+       sm->expansion->mac = NULL;
+       sm->expansion->type = TOK_NUMBER;
+       sprintf(num, "%d", istk->lineno - istk->lineinc);
+       sm->expansion->text = nasm_strdup(num);
+    }
+}
+
+/*
+ * Count and mark off the parameters in a multi-line macro call.
+ * This is called both from within the multi-line macro expansion
+ * code, and also to mark off the default parameters when provided
+ * in a %macro definition line.
+ */
+static void count_mmac_params (Token *t, int *nparam, Token ***params) {
+    int paramsize, brace;
+
+    *nparam = paramsize = 0;
+    *params = NULL;
+    while (t) {
+       if (*nparam >= paramsize) {
+           paramsize += PARAM_DELTA;
+           *params = nasm_realloc(*params, sizeof(**params) * paramsize);
+       }
+       if (t && t->type == TOK_WHITESPACE)
+           t = t->next;
+       brace = FALSE;
+       if (t && t->type == TOK_OTHER && !strcmp(t->text, "{"))
+           brace = TRUE;
+       (*params)[(*nparam)++] = t;
+       while (t && (t->type != TOK_OTHER ||
+                    strcmp(t->text, brace ? "}" : ",")))
+           t = t->next;
+       if (t) {                       /* got a comma/brace */
+           t = t->next;
+           if (brace) {
+               /*
+                * Now we've found the closing brace, look further
+                * for the comma.
+                */
+               if (t && t->type == TOK_WHITESPACE)
+                   t = t->next;
+               if (t && (t->type != TOK_OTHER || strcmp(t->text, ","))) {
+                   error (ERR_NONFATAL|ERR_OFFBY1,
+                          "braces do not enclose all of macro parameter");
+                   while (t && (t->type != TOK_OTHER ||
+                                strcmp(t->text, ",")))
+                       t = t->next;
+               }
+               if (t)
+                   t = t->next;               /* eat the comma */
+           }
+       }
+       else                           /* got EOL */
+           break;
+    }
+}
+
+/*
+ * Determine whether one of the various `if' conditions is true or
+ * not.
+ *
+ * We must free the tline we get passed.
+ */
+static int if_condition (Token *tline, int i) {
+    int j, casesense;
+    Token *t, *tt, **tptr, *origline;
+    struct tokenval tokval;
+    expr *evalresult;
+
+    origline = tline;
+
+    switch (i) {
+      case PP_IFCTX: case PP_ELIFCTX:
+      case PP_IFNCTX: case PP_ELIFNCTX:
+       j = FALSE;                     /* have we matched yet? */
+       if (!cstk)
+           error(ERR_FATAL|ERR_OFFBY1,
+                 "`%s': context stack is empty", directives[i]);
+       else while (tline) {
+           if (tline->type == TOK_WHITESPACE)
+               tline = tline->next;
+           if (!tline || tline->type != TOK_ID) {
+               error(ERR_NONFATAL|ERR_OFFBY1,
+                     "`%s' expects context identifiers", directives[i]);
+               free_tlist (origline);
+               return -1;
+           }
+           if (!nasm_stricmp(tline->text, cstk->name))
+               j = TRUE;
+           tline = tline->next;
+       }
+       if (i == PP_IFNCTX || i == PP_ELIFNCTX)
+           j = !j;
+       free_tlist (origline);
+       return j;
+
+      case PP_IFDEF: case PP_ELIFDEF:
+      case PP_IFNDEF: case PP_ELIFNDEF:
+       j = FALSE;                     /* have we matched yet? */
+       while (tline) {
+           if (tline->type == TOK_WHITESPACE)
+               tline = tline->next;
+           if (!tline || (tline->type != TOK_ID &&
+                          (tline->type != TOK_PREPROC_ID ||
+                           tline->text[1] != '$'))) {
+               error(ERR_NONFATAL|ERR_OFFBY1,
+                     "`%%if%sdef' expects macro identifiers",
+                     (i==PP_ELIFNDEF ? "n" : ""));
+               free_tlist (origline);
+               return -1;
+           }
+           if (smacro_defined(tline->text, 0, NULL))
+               j = TRUE;
+               tline = tline->next;
+       }
+       if (i == PP_IFNDEF || i == PP_ELIFNDEF)
+           j = !j;
+       free_tlist (origline);
+       return j;
+
+      case PP_IFIDN: case PP_ELIFIDN: case PP_IFNIDN: case PP_ELIFNIDN:
+      case PP_IFIDNI: case PP_ELIFIDNI: case PP_IFNIDNI: case PP_ELIFNIDNI:
+       tline = expand_smacro(tline);
+       t = tt = tline;
+       while (tt && (tt->type != TOK_OTHER || strcmp(tt->text, ",")))
+           tt = tt->next;
+       if (!tt) {
+           error(ERR_NONFATAL, "`%s' expects two comma-separated arguments");
+           free_tlist (tline);
+           return -1;
+       }
+       tt = tt->next;
+       casesense = (i == PP_IFIDN || i == PP_ELIFIDN ||
+                    i == PP_IFNIDN || i == PP_ELIFNIDN);
+       j = TRUE;                      /* assume equality unless proved not */
+       while ((t->type != TOK_OTHER || strcmp(t->text, ",")) && tt) {
+           if (tt->type == TOK_OTHER && !strcmp(tt->text, ",")) {
+               error(ERR_NONFATAL, "`%s': more than one comma on line",
+                     directives[i]);
+               free_tlist (tline);
+               return -1;
+           }
+           if (t->type == TOK_WHITESPACE) {
+               t = t->next;
+               continue;
+           } else if (tt->type == TOK_WHITESPACE) {
+               tt = tt->next;
+               continue;
+           } else if (tt->type != t->type ||
+                      (casesense ? strcmp(tt->text, t->text) :
+                       nasm_stricmp(tt->text, t->text))) {
+               j = FALSE;             /* found mismatching tokens */
+               break;
+           } else {
+               t = t->next;
+               tt = tt->next;
+               continue;
+           }
+       }
+       if ((t->type != TOK_OTHER || strcmp(t->text, ",")) || tt)
+           j = FALSE;                 /* trailing gunk on one end or other */
+       if (i == PP_IFNIDN || i == PP_ELIFNIDN)
+           j = !j;
+       free_tlist (tline);
+       return j;
+
+      case PP_IFID: case PP_ELIFID: case PP_IFNID: case PP_ELIFNID:
+      case PP_IFNUM: case PP_ELIFNUM: case PP_IFNNUM: case PP_ELIFNNUM:
+      case PP_IFSTR: case PP_ELIFSTR: case PP_IFNSTR: case PP_ELIFNSTR:
+       tline = expand_smacro(tline);
+       t = tline;
+       while (t && t->type == TOK_WHITESPACE)
+           t = t->next;
+       j = FALSE;                     /* placate optimiser */
+       switch (i) {
+         case PP_IFID: case PP_ELIFID: case PP_IFNID: case PP_ELIFNID:
+           j = (t->type == TOK_ID);
+           break;
+         case PP_IFNUM: case PP_ELIFNUM: case PP_IFNNUM: case PP_ELIFNNUM:
+           j = (t->type == TOK_NUMBER);
+           break;
+         case PP_IFSTR: case PP_ELIFSTR: case PP_IFNSTR: case PP_ELIFNSTR:
+           j = (t->type == TOK_STRING);
+           break;
+       }
+       if (i == PP_IFNID || i == PP_ELIFNID ||
+           i == PP_IFNNUM || i == PP_ELIFNNUM ||
+           i == PP_IFNSTR || i == PP_ELIFNSTR)
+           j = !j;
+       free_tlist (tline);
+       return j;
+
+      case PP_IF: case PP_ELIF:
+       t = tline = expand_smacro(tline);
+       tptr = &t;
+       tokval.t_type = TOKEN_INVALID;
+       evalresult = evaluate (ppscan, tptr, &tokval,
+                              NULL, pass | 0x10, error, NULL);
+       free_tlist (tline);
+       if (!evalresult)
+           return -1;
+       if (tokval.t_type)
+           error(ERR_WARNING|ERR_OFFBY1,
+                 "trailing garbage after expression ignored");
+       if (!is_simple(evalresult)) {
+           error(ERR_NONFATAL|ERR_OFFBY1,
+                 "non-constant value given to `%s'", directives[i]);
+           return -1;
+       }
+       return reloc_value(evalresult) != 0;
+
+      default:
+       error(ERR_FATAL|ERR_OFFBY1,
+             "preprocessor directive `%s' not yet implemented",
+             directives[i]);
+       free_tlist (origline);
+       return -1;                     /* yeah, right */
+    }
+}
+
+/*
+ * Find out if a line contains a preprocessor directive, and deal
+ * with it if so.
+ * 
+ * If a directive _is_ found, we are expected to free_tlist() the
+ * line.
+ *
+ * Return values go like this:
+ * 
+ * bit 0 is set if a directive was found (so the line gets freed)
+ * bit 1 is set if a blank line should be emitted
+ * bit 2 is set if a re-sync line number comment should be emitted
+ *
+ * (bits 1 and 2 are mutually exclusive in that the rest of the
+ * preprocessor doesn't guarantee to be able to handle the case in
+ * which both are set)
+ */
+static int do_directive (Token *tline) {
+    int i, j, k, m, nparam, nolist;
+    char *p, *mname;
+    Include *inc;
+    Context *ctx;
+    Cond *cond;
+    SMacro *smac, **smhead;
+    MMacro *mmac;
+    Token *t, *tt, *param_start, *macro_start, *last, **tptr, *origline;
+    Line *l;
+    struct tokenval tokval;
+    expr *evalresult;
+
+    origline = tline;
+
+    if (tline && tline->type == TOK_WHITESPACE)
+       tline = tline->next;
+    if (!tline || tline->type != TOK_PREPROC_ID ||
+       (tline->text[1]=='%' || tline->text[1]=='$' || tline->text[1]=='!'))
+       return 0;
+
+    i = -1;
+    j = sizeof(directives)/sizeof(*directives);
+    while (j-i > 1) {
+       k = (j+i) / 2;
+       m = nasm_stricmp(tline->text, directives[k]);
+       if (m == 0) {
+           i = k;
+           j = -2;
+           break;
+       } else if (m < 0) {
+           j = k;
+       } else
+           i = k;
+    }
+
+    /*
+     * If we're in a non-emitting branch of a condition construct,
+     * or walking to the end of an already terminated %rep block,
+     * we should ignore all directives except for condition
+     * directives.
+     */
+    if (((istk->conds && !emitting(istk->conds->state)) ||
+        (istk->mstk && !istk->mstk->in_progress)) &&
+       i != PP_IF && i != PP_ELIF &&
+       i != PP_IFCTX && i != PP_ELIFCTX &&
+       i != PP_IFDEF && i != PP_ELIFDEF &&
+       i != PP_IFID && i != PP_ELIFID &&
+       i != PP_IFIDN && i != PP_ELIFIDN &&
+       i != PP_IFIDNI && i != PP_ELIFIDNI &&
+       i != PP_IFNCTX && i != PP_ELIFNCTX &&
+       i != PP_IFNDEF && i != PP_ELIFNDEF &&
+       i != PP_IFNID && i != PP_ELIFNID &&
+       i != PP_IFNIDN && i != PP_ELIFNIDN &&
+       i != PP_IFNIDNI && i != PP_ELIFNIDNI &&
+       i != PP_IFNNUM && i != PP_ELIFNNUM &&
+       i != PP_IFNSTR && i != PP_ELIFNSTR &&
+       i != PP_IFNUM && i != PP_ELIFNUM &&
+       i != PP_IFSTR && i != PP_ELIFSTR &&
+       i != PP_ELSE && i != PP_ENDIF)
+       return 0;
+
+    /*
+     * If we're defining a macro or reading a %rep block, we should
+     * ignore all directives except for %macro/%imacro (which
+     * generate an error), %endm/%endmacro, and (only if we're in a
+     * %rep block) %endrep.
+     */
+    if (defining && i != PP_MACRO && i != PP_IMACRO &&
+       i != PP_ENDMACRO && i != PP_ENDM &&
+       (defining->name || i != PP_ENDREP))
+       return 0;
+
+    if (j != -2) {
+       error(ERR_NONFATAL|ERR_OFFBY1, "unknown preprocessor directive `%s'",
+             tline->text);
+       return 0;                      /* didn't get it */
+    }
+
+    switch (i) {
+
+      case PP_CLEAR:
+       if (tline->next)
+           error(ERR_WARNING|ERR_OFFBY1,
+                 "trailing garbage after `%%clear' ignored");
+       for (j=0; j<NHASH; j++) {
+           while (mmacros[j]) {
+               MMacro *m = mmacros[j];
+               mmacros[j] = mmacros[j]->next;
+               nasm_free (m->name);
+               free_tlist (m->dlist);
+               free_llist (m->expansion);
+               nasm_free (m);
+           }
+           while (smacros[j]) {
+               SMacro *s = smacros[j];
+               smacros[j] = smacros[j]->next;
+               nasm_free (s->name);
+               free_tlist (s->expansion);
+               nasm_free (s);
+           }
+       }
+       free_tlist (origline);
+       return 3;
+
+      case PP_INCLUDE:
+       tline = tline->next;
+       if (tline && tline->type == TOK_WHITESPACE)
+           tline = tline->next;
+       if (!tline || (tline->type != TOK_STRING &&
+                      tline->type != TOK_INTERNAL_STRING)) {
+           error(ERR_NONFATAL|ERR_OFFBY1, "`%%include' expects a file name");
+           free_tlist (origline);
+           return 3;                  /* but we did _something_ */
+       }
+       if (tline->next)
+           error(ERR_WARNING|ERR_OFFBY1,
+                 "trailing garbage after `%%include' ignored");
+       if (tline->type != TOK_INTERNAL_STRING) {
+           p = tline->text+1;         /* point past the quote to the name */
+           p[strlen(p)-1] = '\0';     /* remove the trailing quote */
+       } else
+           p = tline->text;           /* internal_string is easier */
+       inc = nasm_malloc(sizeof(Include));
+       inc->next = istk;
+       inc->conds = NULL;
+       inc->fp = inc_fopen(p);
+       inc->fname = nasm_strdup(p);
+       inc->lineno = inc->lineinc = 1;
+       inc->expansion = NULL;
+       inc->mstk = NULL;
+       istk = inc;
+       list->uplevel (LIST_INCLUDE);
+       update_fileline(3);            /* update __FILE__ and __LINE__ */
+       free_tlist (origline);
+       return 5;
+
+      case PP_PUSH:
+       tline = tline->next;
+       if (tline && tline->type == TOK_WHITESPACE)
+           tline = tline->next;
+       if (!tline || tline->type != TOK_ID) {
+           error(ERR_NONFATAL|ERR_OFFBY1,
+                 "`%%push' expects a context identifier");
+           free_tlist (origline);
+           return 3;                  /* but we did _something_ */
+       }
+       if (tline->next)
+           error(ERR_WARNING|ERR_OFFBY1,
+                 "trailing garbage after `%%push' ignored");
+       ctx = nasm_malloc(sizeof(Context));
+       ctx->next = cstk;
+       ctx->localmac = NULL;
+       ctx->name = nasm_strdup(tline->text);
+       ctx->number = unique++;
+       cstk = ctx;
+       free_tlist (origline);
+       break;
+
+      case PP_REPL:
+       tline = tline->next;
+       if (tline && tline->type == TOK_WHITESPACE)
+           tline = tline->next;
+       if (!tline || tline->type != TOK_ID) {
+           error(ERR_NONFATAL|ERR_OFFBY1,
+                 "`%%repl' expects a context identifier");
+           free_tlist (origline);
+           return 3;                  /* but we did _something_ */
+       }
+       if (tline->next)
+           error(ERR_WARNING|ERR_OFFBY1,
+                 "trailing garbage after `%%repl' ignored");
+       if (!cstk)
+           error(ERR_NONFATAL|ERR_OFFBY1,
+                 "`%%repl': context stack is empty");
+       else {
+           nasm_free (cstk->name);
+           cstk->name = nasm_strdup(tline->text);
+       }
+       free_tlist (origline);
+       break;
+
+      case PP_POP:
+       if (tline->next)
+           error(ERR_WARNING|ERR_OFFBY1,
+                 "trailing garbage after `%%pop' ignored");
+       if (!cstk)
+           error(ERR_NONFATAL|ERR_OFFBY1,
+                 "`%%pop': context stack is already empty");
+       else
+           ctx_pop();
+       free_tlist (origline);
+       break;
+
+      case PP_ERROR:
+       tline = tline->next;
+       if (tline && tline->type == TOK_WHITESPACE)
+           tline = tline->next;
+       if (!tline || tline->type != TOK_STRING) {
+           error(ERR_NONFATAL|ERR_OFFBY1,
+                 "`%%error' expects an error string");
+           free_tlist (origline);
+           return 3;                  /* but we did _something_ */
+       }
+       if (tline->next)
+           error(ERR_WARNING|ERR_OFFBY1,
+                 "trailing garbage after `%%error' ignored");
+       p = tline->text+1;             /* point past the quote to the name */
+       p[strlen(p)-1] = '\0';         /* remove the trailing quote */
+       error(ERR_NONFATAL|ERR_OFFBY1, "user error: %s", p);
+       free_tlist (origline);
+       break;
+
+      case PP_IF:
+      case PP_IFCTX:
+      case PP_IFDEF:
+      case PP_IFID:
+      case PP_IFIDN:
+      case PP_IFIDNI:
+      case PP_IFNCTX:
+      case PP_IFNDEF:
+      case PP_IFNID:
+      case PP_IFNIDN:
+      case PP_IFNIDNI:
+      case PP_IFNNUM:
+      case PP_IFNSTR:
+      case PP_IFNUM:
+      case PP_IFSTR:
+       if (istk->conds && !emitting(istk->conds->state))
+           j = COND_NEVER;
+       else {
+           j = if_condition(tline->next, i);
+           tline->next = NULL;        /* it got freed */
+           free_tlist (origline);
+           if (j < 0)
+               return 3;
+           else
+               j = j ? COND_IF_TRUE : COND_IF_FALSE;
+       }
+       cond = nasm_malloc(sizeof(Cond));
+       cond->next = istk->conds;
+       cond->state = j;
+       istk->conds = cond;
+       return (j == COND_IF_TRUE ? 3 : 1);
+
+      case PP_ELIF:
+      case PP_ELIFCTX:
+      case PP_ELIFDEF:
+      case PP_ELIFID:
+      case PP_ELIFIDN:
+      case PP_ELIFIDNI:
+      case PP_ELIFNCTX:
+      case PP_ELIFNDEF:
+      case PP_ELIFNID:
+      case PP_ELIFNIDN:
+      case PP_ELIFNIDNI:
+      case PP_ELIFNNUM:
+      case PP_ELIFNSTR:
+      case PP_ELIFNUM:
+      case PP_ELIFSTR:
+       if (!istk->conds)
+           error(ERR_FATAL|ERR_OFFBY1, "`%s': no matching `%%if'",
+                 directives[i]);
+       if (emitting(istk->conds->state) || istk->conds->state == COND_NEVER)
+           istk->conds->state = COND_NEVER;
+       else {
+           j = if_condition(tline->next, i);
+           tline->next = NULL;        /* it got freed */
+           free_tlist (origline);
+           if (j < 0)
+               return 3;
+           else
+               istk->conds->state = j ? COND_IF_TRUE : COND_IF_FALSE;
+       }
+       return (istk->conds->state == COND_IF_TRUE ? 5 : 1);
+
+      case PP_ELSE:
+       if (tline->next)
+           error(ERR_WARNING|ERR_OFFBY1,
+                 "trailing garbage after `%%else' ignored");
+       if (!istk->conds)
+           error(ERR_FATAL|ERR_OFFBY1,
+                 "`%%else': no matching `%%if'");
+       if (emitting(istk->conds->state) || istk->conds->state == COND_NEVER)
+           istk->conds->state = COND_ELSE_FALSE;
+       else
+           istk->conds->state = COND_ELSE_TRUE;
+       free_tlist (origline);
+       return 5;
+
+      case PP_ENDIF:
+       if (tline->next)
+           error(ERR_WARNING|ERR_OFFBY1,
+                 "trailing garbage after `%%endif' ignored");
+       if (!istk->conds)
+           error(ERR_FATAL|ERR_OFFBY1,
+                 "`%%endif': no matching `%%if'");
+       cond = istk->conds;
+       istk->conds = cond->next;
+       nasm_free (cond);
+       free_tlist (origline);
+       return 5;
+
+      case PP_MACRO:
+      case PP_IMACRO:
+       if (defining)
+           error (ERR_FATAL|ERR_OFFBY1,
+                  "`%%%smacro': already defining a macro",
+                  (i == PP_IMACRO ? "i" : ""));
+       tline = tline->next;
+       if (tline && tline->type == TOK_WHITESPACE)
+           tline = tline->next;
+       if (!tline || tline->type != TOK_ID) {
+           error (ERR_NONFATAL|ERR_OFFBY1,
+                  "`%%%smacro' expects a macro name",
+                  (i == PP_IMACRO ? "i" : ""));
+           return 3;
+       }
+       defining = nasm_malloc(sizeof(MMacro));
+       defining->name = nasm_strdup(tline->text);
+       defining->casesense = (i == PP_MACRO);
+       defining->plus = FALSE;
+       defining->nolist = FALSE;
+       defining->in_progress = FALSE;
+       tline = tline->next;
+       if (tline && tline->type == TOK_WHITESPACE)
+           tline = tline->next;
+       if (!tline || tline->type != TOK_NUMBER) {
+           error (ERR_NONFATAL|ERR_OFFBY1,
+                  "`%%%smacro' expects a parameter count",
+                  (i == PP_IMACRO ? "i" : ""));
+           defining->nparam_min = defining->nparam_max = 0;
+       } else {
+           defining->nparam_min = defining->nparam_max =
+               readnum(tline->text, &j);
+           if (j)
+               error (ERR_NONFATAL|ERR_OFFBY1,
+                      "unable to parse parameter count `%s'", tline->text);
+       }
+       if (tline && tline->next && tline->next->type == TOK_OTHER &&
+           !strcmp(tline->next->text, "-")) {
+           tline = tline->next->next;
+           if (tline && tline->type == TOK_OTHER &&
+               !strcmp(tline->text, "*"))
+               defining->nparam_max = INT_MAX;
+           else if (!tline || tline->type != TOK_NUMBER)
+               error (ERR_NONFATAL|ERR_OFFBY1,
+                      "`%%%smacro' expects a parameter count after `-'",
+                      (i == PP_IMACRO ? "i" : ""));
+           else {
+               defining->nparam_max = readnum(tline->text, &j);
+               if (j)
+                   error (ERR_NONFATAL|ERR_OFFBY1,
+                          "unable to parse parameter count `%s'",
+                          tline->text);
+               if (defining->nparam_min > defining->nparam_max)
+                   error (ERR_NONFATAL|ERR_OFFBY1,
+                          "minimum parameter count exceeds maximum");
+           }
+       }
+       if (tline && tline->next && tline->next->type == TOK_OTHER &&
+           !strcmp(tline->next->text, "+")) {
+           tline = tline->next;
+           defining->plus = TRUE;
+       }
+       if (tline && tline->next && tline->next->type == TOK_ID &&
+           !nasm_stricmp(tline->next->text, ".nolist")) {
+           tline = tline->next;
+           defining->nolist = TRUE;
+       }
+       mmac = mmacros[hash(defining->name)];
+       while (mmac) {
+           if (!strcmp(mmac->name, defining->name) &&
+               (mmac->nparam_min<=defining->nparam_max || defining->plus) &&
+               (defining->nparam_min<=mmac->nparam_max || mmac->plus)) {
+               error (ERR_WARNING|ERR_OFFBY1,
+                      "redefining multi-line macro `%s'", defining->name);
+               break;
+           }
+           mmac = mmac->next;
+       }
+       /*
+        * Handle default parameters.
+        */
+       if (tline && tline->next) {
+           defining->dlist = tline->next;
+           tline->next = NULL;
+           count_mmac_params (defining->dlist, &defining->ndefs,
+                              &defining->defaults);
+       } else {
+           defining->dlist = NULL;
+           defining->defaults = NULL;
+       }
+       defining->expansion = NULL;
+       free_tlist (origline);
+       return 1;
+
+      case PP_ENDM:
+      case PP_ENDMACRO:
+       if (!defining) {
+           error (ERR_NONFATAL|ERR_OFFBY1, "`%s': not defining a macro",
+                  tline->text);
+           return 3;
+       }
+       k = hash(defining->name);
+       defining->next = mmacros[k];
+       mmacros[k] = defining;
+       defining = NULL;
+       free_tlist (origline);
+       return 5;
+
+      case PP_ROTATE:
+       if (tline->next && tline->next->type == TOK_WHITESPACE)
+           tline = tline->next;
+       t = expand_smacro(tline->next);
+       tline->next = NULL;
+       free_tlist (origline);
+       tline = t;
+       tptr = &t;
+       tokval.t_type = TOKEN_INVALID;
+       evalresult = evaluate (ppscan, tptr, &tokval, NULL, pass, error, NULL);
+       free_tlist (tline);
+       if (!evalresult)
+           return 3;
+       if (tokval.t_type)
+           error(ERR_WARNING|ERR_OFFBY1,
+                 "trailing garbage after expression ignored");
+       if (!is_simple(evalresult)) {
+           error(ERR_NONFATAL|ERR_OFFBY1,
+                 "non-constant value given to `%%rotate'");
+           return 3;
+       }
+       mmac = istk->mstk;
+       while (mmac && !mmac->name)    /* avoid mistaking %reps for macros */
+           mmac = mmac->next_active;
+       if (!mmac)
+           error(ERR_NONFATAL, "`%rotate' invoked outside a macro call");
+       mmac->rotate = mmac->rotate + reloc_value(evalresult);
+       if (mmac->rotate < 0)
+           mmac->rotate = mmac->nparam - (-mmac->rotate) % mmac->nparam;
+       mmac->rotate %= mmac->nparam;
+       return 1;
+
+      case PP_REP:
+       nolist = FALSE;
+       tline = tline->next;
+       if (tline->next && tline->next->type == TOK_WHITESPACE)
+           tline = tline->next;
+       if (tline->next && tline->next->type == TOK_ID &&
+           !nasm_stricmp(tline->next->text, ".nolist")) {
+           tline = tline->next;
+           nolist = TRUE;
+       }
+       t = expand_smacro(tline->next);
+       tline->next = NULL;
+       free_tlist (origline);
+       tline = t;
+       tptr = &t;
+       tokval.t_type = TOKEN_INVALID;
+       evalresult = evaluate (ppscan, tptr, &tokval, NULL, pass, error, NULL);
+       free_tlist (tline);
+       if (!evalresult)
+           return 3;
+       if (tokval.t_type)
+           error(ERR_WARNING|ERR_OFFBY1,
+                 "trailing garbage after expression ignored");
+       if (!is_simple(evalresult)) {
+           error(ERR_NONFATAL|ERR_OFFBY1,
+                 "non-constant value given to `%%rep'");
+           return 3;
+       }
+       defining = nasm_malloc(sizeof(MMacro));
+       defining->name = NULL;         /* flags this macro as a %rep block */
+       defining->casesense = 0;
+       defining->plus = FALSE;
+       defining->nolist = nolist;
+       defining->in_progress = reloc_value(evalresult) + 1;
+       defining->nparam_min = defining->nparam_max = 0;
+       defining->expansion = NULL;
+       defining->next_active = istk->mstk;
+       return 1;
+
+      case PP_ENDREP:
+       if (!defining) {
+           error (ERR_NONFATAL|ERR_OFFBY1,
+                  "`%%endrep': no matching `%%rep'");
+           return 3;
+       }
+
+       /*
+        * Now we have a "macro" defined - although it has no name
+        * and we won't be entering it in the hash tables - we must
+        * push a macro-end marker for it on to istk->expansion.
+        * After that, it will take care of propagating itself (a
+        * macro-end marker line for a macro which is really a %rep
+        * block will cause the macro to be re-expanded, complete
+        * with another macro-end marker to ensure the process
+        * continues) until the whole expansion is forcibly removed
+        * from istk->expansion by a %exitrep.
+        */
+       l = nasm_malloc(sizeof(Line));
+       l->next = istk->expansion;
+       l->finishes = defining;
+       l->first = NULL;
+       istk->expansion = l;
+
+       istk->mstk = defining;
+
+       list->uplevel (defining->nolist ? LIST_MACRO_NOLIST : LIST_MACRO);
+       defining = NULL;
+       free_tlist (origline);
+       return 1;                      /* the expansion will line-sync */
+
+      case PP_EXITREP:
+       /*
+        * We must search along istk->expansion until we hit a
+        * macro-end marker for a macro with no name. Then we set
+        * its `in_progress' flag to 0.
+        */
+       for (l = istk->expansion; l; l = l->next)
+           if (l->finishes && !l->finishes->name)
+               break;
+
+       if (l->finishes && !l->finishes->name)
+           l->finishes->in_progress = 0;
+       else
+           error (ERR_NONFATAL, "`%%exitrep' not within `%%rep' block");
+       free_tlist (origline);
+       return 1;                      /* the end marker will line-sync */
+
+      case PP_DEFINE:
+      case PP_IDEFINE:
+       tline = tline->next;
+       if (tline && tline->type == TOK_WHITESPACE)
+           tline = tline->next;
+       if (!tline || (tline->type != TOK_ID &&
+                      (tline->type != TOK_PREPROC_ID ||
+                       tline->text[1] != '$'))) {
+           error (ERR_NONFATAL|ERR_OFFBY1,
+                  "`%%%sdefine' expects a macro identifier",
+                  (i == PP_IDEFINE ? "i" : ""));
+           free_tlist (origline);
+           return 3;
+       }
+       mname = tline->text;
+       if (tline->type == TOK_ID) {
+           p = tline->text;
+           smhead = &smacros[hash(mname)];
+       } else {
+           ctx = get_ctx (tline->text);
+           if (ctx == NULL)
+               return 3;
+           else {
+               p = tline->text+1;
+               p += strspn(p, "$");
+               smhead = &ctx->localmac;
+           }
+       }
+       last = tline;
+       param_start = tline = tline->next;
+       nparam = 0;
+       if (tline && tline->type == TOK_OTHER && !strcmp(tline->text, "(")) {
+           /*
+            * This macro has parameters.
+            */
+
+           tline = tline->next;
+           while (1) {
+               if (tline && tline->type == TOK_WHITESPACE)
+                   tline = tline->next;
+               if (!tline) {
+                   error (ERR_NONFATAL|ERR_OFFBY1,
+                          "parameter identifier expected");
+                   free_tlist (origline);
+                   return 3;
+               }
+               if (tline->type != TOK_ID) {
+                   error (ERR_NONFATAL|ERR_OFFBY1,
+                          "`%s': parameter identifier expected",
+                          tline->text);
+                   free_tlist (origline);
+                   return 3;
+               }
+               tline->type = TOK_SMAC_PARAM + nparam++;
+               tline = tline->next;
+               if (tline && tline->type == TOK_WHITESPACE)
+                   tline = tline->next;
+               if (tline && tline->type == TOK_OTHER &&
+                   !strcmp(tline->text, ",")) {
+                   tline = tline->next;
+                   continue;
+               }
+               if (!tline || tline->type != TOK_OTHER ||
+                   strcmp(tline->text, ")")) {
+                   error (ERR_NONFATAL|ERR_OFFBY1,
+                          "`)' expected to terminate macro template");
+                   free_tlist (origline);
+                   return 3;
+               }
+               break;
+           }
+           last = tline;
+           tline = tline->next;
+       }
+       if (tline && tline->type == TOK_WHITESPACE)
+           last = tline, tline = tline->next;
+       macro_start = NULL;
+       last->next = NULL;
+       t = tline;
+       while (t) {
+           if (t->type == TOK_ID) {
+               for (tt = param_start; tt; tt = tt->next)
+                   if (tt->type >= TOK_SMAC_PARAM &&
+                       !strcmp(tt->text, t->text))
+                       t->type = tt->type;
+           }
+           tt = t->next;
+           t->next = macro_start;
+           macro_start = t;
+           t = tt;
+       }
+       /*
+        * Good. We now have a macro name, a parameter count, and a
+        * token list (in reverse order) for an expansion. We ought
+        * to be OK just to create an SMacro, store it, and let
+        * free_tlist have the rest of the line (which we have
+        * carefully re-terminated after chopping off the expansion
+        * from the end).
+        */
+       if (smacro_defined (mname, nparam, &smac)) {
+           if (!smac)
+               error (ERR_WARNING|ERR_OFFBY1,
+                      "single-line macro `%s' defined both with and"
+                      " without parameters", mname);
+           else {
+               /*
+                * We're redefining, so we have to take over an
+                * existing SMacro structure. This means freeing
+                * what was already in it.
+                */
+               nasm_free (smac->name);
+               free_tlist (smac->expansion);
+           }
+       } else {
+           smac = nasm_malloc(sizeof(SMacro));
+           smac->next = *smhead;
+           *smhead = smac;
+       }
+       smac->name = nasm_strdup(p);
+       smac->casesense = (i == PP_DEFINE);
+       smac->nparam = nparam;
+       smac->expansion = macro_start;
+       smac->in_progress = FALSE;
+       free_tlist (origline);
+       return 3;
+
+      case PP_ASSIGN:
+      case PP_IASSIGN:
+       tline = tline->next;
+       if (tline && tline->type == TOK_WHITESPACE)
+           tline = tline->next;
+       if (!tline || (tline->type != TOK_ID &&
+                      (tline->type != TOK_PREPROC_ID ||
+                       tline->text[1] != '$'))) {
+           error (ERR_NONFATAL|ERR_OFFBY1,
+                  "`%%%sassign' expects a macro identifier",
+                  (i == PP_IASSIGN ? "i" : ""));
+           free_tlist (origline);
+           return 3;
+       }
+       mname = tline->text;
+       if (tline->type == TOK_ID) {
+           p = tline->text;
+           smhead = &smacros[hash(mname)];
+       } else {
+           ctx = get_ctx (tline->text);
+           if (ctx == NULL) {
+               free_tlist (origline);
+               return 3;
+           } else {
+               p = tline->text+1;
+               p += strspn(p, "$");
+               smhead = &ctx->localmac;
+           }
+       }
+       last = tline;
+       tline = tline->next;
+       last->next = NULL;
+
+       tline = expand_smacro (tline);
+       t = tline;
+       tptr = &t;
+       tokval.t_type = TOKEN_INVALID;
+       evalresult = evaluate (ppscan, tptr, &tokval, NULL, pass, error, NULL);
+       free_tlist (tline);
+       if (!evalresult) {
+           free_tlist (origline);
+           return 3;
+       }
+
+       if (tokval.t_type)
+           error(ERR_WARNING|ERR_OFFBY1,
+                 "trailing garbage after expression ignored");
+
+       if (!is_simple(evalresult)) {
+           error(ERR_NONFATAL|ERR_OFFBY1,
+                 "non-constant value given to `%%%sassign'",
+                 (i == PP_IASSIGN ? "i" : ""));
+           free_tlist (origline);
+           return 3;
+       }
+
+       macro_start = nasm_malloc(sizeof(*macro_start));
+       macro_start->next = NULL;
+       {
+           char numbuf[20];
+           sprintf(numbuf, "%ld", reloc_value(evalresult));
+           macro_start->text = nasm_strdup(numbuf);
+       }
+       macro_start->mac = NULL;
+       macro_start->type = TOK_NUMBER;
+
+       /*
+        * We now have a macro name, an implicit parameter count of
+        * zero, and a numeric token to use as an expansion. Create
+        * and store an SMacro.
+        */
+       if (smacro_defined (mname, 0, &smac)) {
+           if (!smac)
+               error (ERR_WARNING|ERR_OFFBY1,
+                      "single-line macro `%s' defined both with and"
+                      " without parameters", mname);
+           else {
+               /*
+                * We're redefining, so we have to take over an
+                * existing SMacro structure. This means freeing
+                * what was already in it.
+                */
+               nasm_free (smac->name);
+               free_tlist (smac->expansion);
+           }
+       } else {
+           smac = nasm_malloc(sizeof(SMacro));
+           smac->next = *smhead;
+           *smhead = smac;
+       }
+       smac->name = nasm_strdup(p);
+       smac->casesense = (i == PP_ASSIGN);
+       smac->nparam = 0;
+       smac->expansion = macro_start;
+       smac->in_progress = FALSE;
+       free_tlist (origline);
+       return 3;
+
+      case PP_LINE:
+       /*
+        * Syntax is `%line nnn[+mmm] [filename]'
+        */
+       tline = tline->next;
+       if (tline && tline->type == TOK_WHITESPACE)
+           tline = tline->next;
+       if (!tline || tline->type != TOK_NUMBER) {
+           error (ERR_NONFATAL|ERR_OFFBY1, "`%%line' expects line number");
+           free_tlist (origline);
+           return 3;
+       }
+       k = readnum(tline->text, &j);
+       m = 1;
+       tline = tline->next;
+       if (tline && tline->type == TOK_OTHER && !strcmp(tline->text, "+")) {
+           tline = tline->next;
+           if (!tline || tline->type != TOK_NUMBER) {
+               error (ERR_NONFATAL|ERR_OFFBY1,
+                      "`%%line' expects line increment");
+               free_tlist (origline);
+               return 3;
+           }
+           m = readnum(tline->text, &j);
+           tline = tline->next;
+       }
+       if (tline && tline->type == TOK_WHITESPACE)
+           tline = tline->next;
+       istk->lineno = k;
+       istk->lineinc = m;
+       update_fileline(3);            /* update __FILE__ and __LINE__ */
+       if (tline) {
+           char *s = detoken(tline);
+           nasm_free (istk->fname);
+           istk->fname = s;
+       }
+       free_tlist (origline);
+       return 5;
+
+      default:
+       error(ERR_FATAL|ERR_OFFBY1,
+             "preprocessor directive `%s' not yet implemented",
+             directives[i]);
+       break;
+    }
+    return 3;
+}
+
+/*
+ * Ensure that a macro parameter contains a condition code and
+ * nothing else. Return the condition code index if so, or -1
+ * otherwise.
+ */
+static int find_cc (Token *t) {
+    Token *tt;
+    int i, j, k, m;
+
+    if (t && t->type == TOK_WHITESPACE)
+       t = t->next;
+    if (t->type != TOK_ID)
+       return -1;
+    tt = t->next;
+    if (tt && tt->type == TOK_WHITESPACE)
+       tt = tt->next;
+    if (tt && (tt->type != TOK_OTHER || strcmp(tt->text, ",")))
+       return -1;
+
+    i = -1;
+    j = sizeof(conditions)/sizeof(*conditions);
+    while (j-i > 1) {
+       k = (j+i) / 2;
+       m = nasm_stricmp(t->text, conditions[k]);
+       if (m == 0) {
+           i = k;
+           j = -2;
+           break;
+       } else if (m < 0) {
+           j = k;
+       } else
+           i = k;
+    }
+    if (j != -2)
+       return -1;
+    return i;
+}
+
+/*
+ * Expand MMacro-local things: parameter references (%0, %n, %+n,
+ * %-n) and MMacro-local identifiers (%%foo).
+ */
+static Token *expand_mmac_params (Token *tline) {
+    Token *t, *tt, *ttt, **tail, *thead;
+
+    tail = &thead;
+    thead = NULL;
+
+    while (tline) {
+       if (tline->type == TOK_PREPROC_ID &&
+           (tline->text[1] == '+' || tline->text[1] == '-' ||
+            tline->text[1] == '%' ||
+            (tline->text[1] >= '0' && tline->text[1] <= '9'))) {
+           char *text = NULL;
+           int type = 0, cc;          /* type = 0 to placate optimisers */
+           char tmpbuf[30];
+           int n, i;
+           MMacro *mac;
+
+           t = tline;
+           tline = tline->next;
+
+           mac = istk->mstk;
+           while (mac && !mac->name)  /* avoid mistaking %reps for macros */
+               mac = mac->next_active;
+           if (!mac)
+               error(ERR_NONFATAL, "`%s': not in a macro call", t->text);
+           else switch (t->text[1]) {
+               /*
+                * We have to make a substitution of one of the
+                * forms %1, %-1, %+1, %%foo, %0.
+                */
+             case '0':
+               type = TOK_NUMBER;
+               sprintf(tmpbuf, "%d", mac->nparam);
+               text = nasm_strdup(tmpbuf);
+               break;
+             case '%':
+               type = TOK_ID;
+               sprintf(tmpbuf, "..@%lu.", mac->unique);
+               text = nasm_malloc(strlen(tmpbuf)+strlen(t->text+2)+1);
+               strcpy(text, tmpbuf);
+               strcat(text, t->text+2);
+               break;
+             case '-':
+               n = atoi(t->text+2)-1;
+               if (n >= mac->nparam)
+                   tt = NULL;
+               else {
+                   if (mac->nparam > 1)
+                       n = (n + mac->rotate) % mac->nparam;
+                   tt = mac->params[n];
+               }
+               cc = find_cc (tt);
+               if (cc == -1) {
+                   error (ERR_NONFATAL|ERR_OFFBY1,
+                          "macro parameter %d is not a condition code",
+                          n+1);
+                   text = NULL;
+               } else {
+                   type = TOK_ID;
+                   if (inverse_ccs[cc] == -1) {
+                       error (ERR_NONFATAL|ERR_OFFBY1,
+                              "condition code `%s' is not invertible",
+                              conditions[cc]);
+                       text = NULL;
+                   } else
+                       text = nasm_strdup(conditions[inverse_ccs[cc]]);
+               }
+               break;
+             case '+':
+               n = atoi(t->text+2)-1;
+               if (n >= mac->nparam)
+                   tt = NULL;
+               else {
+                   if (mac->nparam > 1)
+                       n = (n + mac->rotate) % mac->nparam;
+                   tt = mac->params[n];
+               }
+               cc = find_cc (tt);
+               if (cc == -1) {
+                   error (ERR_NONFATAL|ERR_OFFBY1,
+                          "macro parameter %d is not a condition code",
+                          n+1);
+                   text = NULL;
+               } else {
+                   type = TOK_ID;
+                   text = nasm_strdup(conditions[cc]);
+               }
+               break;
+             default:
+               n = atoi(t->text+1)-1;
+               if (n >= mac->nparam)
+                   tt = NULL;
+               else {
+                   if (mac->nparam > 1)
+                       n = (n + mac->rotate) % mac->nparam;
+                   tt = mac->params[n];
+               }
+               if (tt) {
+                   for (i=0; i<mac->paramlen[n]; i++) {
+                       ttt = *tail = nasm_malloc(sizeof(Token));
+                       ttt->next = NULL;
+                       tail = &ttt->next;
+                       ttt->type = tt->type;
+                       ttt->text = nasm_strdup(tt->text);
+                       ttt->mac = NULL;
+                       tt = tt->next;
+                   }
+               }
+               text = NULL;       /* we've done it here */
+               break;
+           }
+           nasm_free (t->text);
+           nasm_free (t);
+           if (text) {
+               t = *tail = nasm_malloc(sizeof(Token));
+               t->next = NULL;
+               tail = &t->next;
+               t->type = type;
+               t->text = text;
+               t->mac = NULL;
+           }
+           continue;
+       } else {
+           t = *tail = tline;
+           tline = tline->next;
+           t->mac = NULL;
+           t->next = NULL;
+           tail = &t->next;
+       }
+    }
+    return thead;
+}
+
+/*
+ * Expand all single-line macro calls made in the given line.
+ * Return the expanded version of the line. The original is deemed
+ * to be destroyed in the process. (In reality we'll just move
+ * Tokens from input to output a lot of the time, rather than
+ * actually bothering to destroy and replicate.)
+ */
+static Token *expand_smacro (Token *tline) {
+    Token *t, *tt, *mstart, **tail, *thead;
+    SMacro *head, *m;
+    Token **params;
+    int *paramsize;
+    int nparam, sparam, brackets;
+    char *p;
+
+    tail = &thead;
+    thead = NULL;
+
+    while (tline) {
+       while (tline && tline->type != TOK_ID &&
+              (tline->type != TOK_PREPROC_ID || tline->text[1] != '$')) {
+           if (tline->type == TOK_SMAC_END) {
+               tline->mac->in_progress = FALSE;
+               t = tline;
+               tline = tline->next;
+               nasm_free (t);
+           } else {
+               t = *tail = tline;
+               tline = tline->next;
+               t->mac = NULL;
+               t->next = NULL;
+               tail = &t->next;
+               if (t->type == TOK_PS_OTHER) {
+                   /*
+                    * If we see a PS_OTHER, we must at the very
+                    * least restore its correct token type. We
+                    * should also check for a %$ token, since this
+                    * is the point at which we expand context-
+                    * local labels.
+                    */
+                   t->type = TOK_ID;
+                   if (t->text[0] == '%' && t->text[1] == '$') {
+                       Context *c = get_ctx (t->text);
+                       char *p, *q, buffer[40];
+
+                       if (c) {
+                           q = t->text+1;
+                           q += strspn(q, "$");
+                           sprintf(buffer, "..@%lu.", c->number);
+                           p = nasm_malloc (strlen(buffer)+strlen(q)+1);
+                           strcpy (p, buffer);
+                           strcat (p, q);
+                           nasm_free (t->text);
+                           t->text = p;
+                       }
+                   }
+               }
+           }
+       }
+
+       if (!tline)
+           break;
+       /*
+        * We've hit an identifier. As in is_mmacro below, we first
+        * check whether the identifier is a single-line macro at
+        * all, then think about checking for parameters if
+        * necessary.
+        */
+       if (tline->type == TOK_ID) {
+           head = smacros[hash(tline->text)];
+           p = tline->text;
+       } else {
+           Context *ctx = get_ctx (tline->text);
+           if (ctx) {
+               p = tline->text+1;
+               p += strspn(p, "$");
+               head = ctx->localmac;
+           } else {
+               tline->type = TOK_OTHER; /* so it will get copied above */
+               continue;               
+           }
+       }
+       for (m = head; m; m = m->next)
+           if (!mstrcmp(m->name, p, m->casesense))
+               break;
+       if (!m || m->in_progress) {
+           /*
+            * Either we didn't find a macro, so this can't be a
+            * macro call, or we found a macro which was already in
+            * progress, in which case we don't _treat_ this as a
+            * macro call. Copy it through and ignore it.
+            */
+           tline->type = TOK_PS_OTHER;   /* so it will get copied above */
+           continue;
+       }
+       mstart = tline;
+       if (m->nparam == 0) {
+           /*
+            * Simple case: the macro is parameterless. Discard the
+            * one token that the macro call took, and push the
+            * expansion back on the to-do stack.
+            */
+           params = NULL;
+           paramsize = NULL;
+       } else {
+           /*
+            * Complicated case: at least one macro with this name
+            * exists and takes parameters. We must find the
+            * parameters in the call, count them, find the SMacro
+            * that corresponds to that form of the macro call, and
+            * substitute for the parameters when we expand. What a
+            * pain.
+            */
+           nparam = sparam = 0;
+           params = NULL;
+           paramsize = NULL;
+           tline = tline->next;
+           if (tline && tline->type == TOK_WHITESPACE)
+               tline = tline->next;
+           if (!tline || tline->type != TOK_OTHER ||
+               strcmp(tline->text, "(")) {
+               /*
+                * This macro wasn't called with parameters: ignore
+                * the call. (Behaviour borrowed from gnu cpp.)
+                */
+               tline = mstart;
+               tline->type = TOK_PS_OTHER;
+               continue;
+           }
+           tline = tline->next;
+           while (1) {
+               if (tline && tline->type == TOK_WHITESPACE)
+                   tline = tline->next;
+               if (!tline) {
+                   error(ERR_NONFATAL|ERR_OFFBY1,
+                         "macro call expects terminating `)'");
+                   break;
+               }
+               if (nparam >= sparam) {
+                   sparam += PARAM_DELTA;
+                   params = nasm_realloc (params, sparam*sizeof(Token *));
+                   paramsize = nasm_realloc (paramsize, sparam*sizeof(int));
+               }
+               params[nparam] = tline;
+               paramsize[nparam] = 0;
+               brackets = 0;
+               if (tline && tline->type == TOK_OTHER &&
+                   !strcmp(tline->text, "{")) {
+                   params[nparam] = tline = tline->next;
+                   while (tline && (brackets > 0 ||
+                                    tline->type != TOK_OTHER ||
+                                    strcmp(tline->text, "}"))) {
+                       tline = tline->next;
+                       paramsize[nparam]++;
+                   }
+                   tline = tline->next;
+                   if (tline && tline->type == TOK_WHITESPACE)
+                       tline = tline->next;
+                   if (tline && (tline->type != TOK_OTHER ||
+                                 (strcmp(tline->text, ")") &&
+                                  strcmp(tline->text, ",")))) {
+                       error (ERR_NONFATAL|ERR_OFFBY1, "braces do not "
+                              "enclose all of macro parameter");
+                   }
+                   if (tline && tline->type == TOK_OTHER &&
+                       !strcmp(tline->text, ","))
+                       tline = tline->next;
+               } else {
+                   while (tline && (brackets > 0 ||
+                                    tline->type != TOK_OTHER ||
+                                    (strcmp(tline->text, ",") &&
+                                     strcmp(tline->text, ")")))) {
+                       if (tline->type == TOK_OTHER && !tline->text[1])
+                           brackets += (tline->text[0] == '(' ? 1 :
+                                        tline->text[0] == ')' ? -1 : 0);
+                       tline = tline->next;
+                       paramsize[nparam]++;
+                   }
+               }
+               nparam++;
+               if (tline && !strcmp(tline->text, ")"))
+                   break;
+               if (tline && !strcmp(tline->text, ","))
+                   tline = tline->next;
+           }
+           while (m && m->nparam != nparam) {
+               while ( (m = m->next) )
+                   if (!strcmp(m->name, mstart->text))
+                       break;
+           }
+           if (!m) {
+               error (ERR_WARNING|ERR_OFFBY1|ERR_WARN_MNP,
+                      "macro `%s' exists, but not taking %d parameters",
+                      mstart->text, nparam);
+               nasm_free (params);
+               nasm_free (paramsize);
+               tline = mstart;
+               tline->type = TOK_PS_OTHER;
+               continue;
+           }
+       }
+       /*
+        * Expand the macro: we are placed on the last token of the
+        * call, so that we can easily split the call from the
+        * following tokens. We also start by pushing an SMAC_END
+        * token for the cycle removal.
+        */
+       t = tline;
+       tline = tline->next;
+       t->next = NULL;
+       tt = nasm_malloc(sizeof(Token));
+       tt->type = TOK_SMAC_END;
+       tt->text = NULL;
+       tt->mac = m;
+       m->in_progress = TRUE;
+       tt->next = tline;
+       tline = tt;
+       for (t = m->expansion; t; t = t->next) {
+           if (t->type >= TOK_SMAC_PARAM) {
+               Token *pcopy = tline, **ptail = &pcopy;
+               Token *ttt, *pt;
+               int i;
+               
+               ttt = params[t->type - TOK_SMAC_PARAM];
+               for (i=0; i<paramsize[t->type-TOK_SMAC_PARAM]; i++) {
+                   pt = *ptail = nasm_malloc(sizeof(Token));
+                   pt->next = tline;
+                   ptail = &pt->next;
+                   pt->text = nasm_strdup(ttt->text);
+                   pt->type = ttt->type;
+                   pt->mac = NULL;
+                   ttt = ttt->next;
+               }
+               tline = pcopy;
+           } else {
+               tt = nasm_malloc(sizeof(Token));
+               tt->type = t->type;
+               tt->text = nasm_strdup(t->text);
+               tt->mac = NULL;
+               tt->next = tline;
+               tline = tt;
+           }
+       }
+
+       /*
+        * Having done that, get rid of the macro call, and clean
+        * up the parameters.
+        */
+       nasm_free (params);
+       nasm_free (paramsize);
+       free_tlist (mstart);
+    }
+
+    return thead;
+}
+
+/*
+ * Determine whether the given line constitutes a multi-line macro
+ * call, and return the MMacro structure called if so. Doesn't have
+ * to check for an initial label - that's taken care of in
+ * expand_mmacro - but must check numbers of parameters. Guaranteed
+ * to be called with tline->type == TOK_ID, so the putative macro
+ * name is easy to find.
+ */
+static MMacro *is_mmacro (Token *tline, Token ***params_array) {
+    MMacro *head, *m;
+    Token **params;
+    int nparam;
+
+    head = mmacros[hash(tline->text)];
+
+    /*
+     * Efficiency: first we see if any macro exists with the given
+     * name. If not, we can return NULL immediately. _Then_ we
+     * count the parameters, and then we look further along the
+     * list if necessary to find the proper MMacro.
+     */
+    for (m = head; m; m = m->next)
+       if (!mstrcmp(m->name, tline->text, m->casesense))
+           break;
+    if (!m)
+       return NULL;
+
+    /*
+     * OK, we have a potential macro. Count and demarcate the
+     * parameters.
+     */
+    count_mmac_params (tline->next, &nparam, &params);
+
+    /*
+     * So we know how many parameters we've got. Find the MMacro
+     * structure that handles this number.
+     */
+    while (m) {
+       if (m->nparam_min <= nparam && (m->plus || nparam <= m->nparam_max)) {
+           /*
+            * This one is right. Just check if cycle removal
+            * prohibits us using it before we actually celebrate...
+            */
+           if (m->in_progress) {
+               error (ERR_NONFATAL|ERR_OFFBY1,
+                      "self-reference in multi-line macro `%s'",
+                      m->name);
+               nasm_free (params);
+               return NULL;
+           }
+           /*
+            * It's right, and we can use it. Add its default
+            * parameters to the end of our list if necessary.
+            */
+           if (m->defaults && nparam < m->nparam_min + m->ndefs) {
+               params = nasm_realloc (params, ((m->nparam_min+m->ndefs+1) *
+                                               sizeof(*params)));
+               while (nparam < m->nparam_min + m->ndefs) {
+                   params[nparam] = m->defaults[nparam - m->nparam_min];
+                   nparam++;
+               }
+           }
+           /*
+            * If we've gone over the maximum parameter count (and
+            * we're in Plus mode), ignore parameters beyond
+            * nparam_max.
+            */
+           if (m->plus && nparam > m->nparam_max)
+               nparam = m->nparam_max;
+           /*
+            * Then terminate the parameter list, and leave.
+            */
+           if (!params) {             /* need this special case */
+               params = nasm_malloc(sizeof(*params));
+               nparam = 0;
+           }
+           params[nparam] = NULL;
+           *params_array = params;
+           return m;
+       }
+       /*
+        * This one wasn't right: look for the next one with the
+        * same name.
+        */
+       for (m = m->next; m; m = m->next)
+           if (!mstrcmp(m->name, tline->text, m->casesense))
+               break;
+    }
+
+    /*
+     * After all that, we didn't find one with the right number of
+     * parameters. Issue a warning, and fail to expand the macro.
+     */
+    error (ERR_WARNING|ERR_OFFBY1|ERR_WARN_MNP,
+          "macro `%s' exists, but not taking %d parameters",
+          tline->text, nparam);
+    nasm_free (params);
+    return NULL;
+}
+
+/*
+ * Expand the multi-line macro call made by the given line, if
+ * there is one to be expanded. If there is, push the expansion on
+ * istk->expansion and return 1 or 2, as according to whether a
+ * line sync is needed (2 if it is). Otherwise return 0.
+ */
+static int expand_mmacro (Token *tline) {
+    Token *label = NULL, **params, *t, *tt, *last = NULL;
+    MMacro *m = NULL;
+    Line *l, *ll;
+    int i, nparam, *paramlen;
+    int need_sync = FALSE;
+
+    t = tline;
+    if (t && t->type == TOK_WHITESPACE)
+       t = t->next;
+    if (t && t->type == TOK_ID) {
+       m = is_mmacro (t, &params);
+       if (!m) {
+           /*
+            * We have an id which isn't a macro call. We'll assume
+            * it might be a label; we'll also check to see if a
+            * colon follows it. Then, if there's another id after
+            * that lot, we'll check it again for macro-hood.
+            */
+           last = t, t = t->next;
+           if (t && t->type == TOK_WHITESPACE)
+               last = t, t = t->next;
+           if (t && t->type == TOK_OTHER && !strcmp(t->text, ":"))
+               last = t, t = t->next;
+           if (t && t->type == TOK_WHITESPACE)
+               last = t, t = t->next;
+           if (t && t->type == TOK_ID) {
+               m = is_mmacro(t, &params);
+               if (m) {
+                   last->next = NULL;
+                   label = tline;
+                   tline = t;
+               }
+           }
+       }       
+    }
+    if (!m)
+       return 0;
+
+    /*
+     * If we're not already inside another macro expansion, we'd
+     * better push a line synchronisation to ensure we stay put on
+     * line numbering.
+     */
+    if (!istk->expansion)
+       need_sync = TRUE;
+
+    /*
+     * Fix up the parameters: this involves stripping leading and
+     * trailing whitespace, then stripping braces if they are
+     * present.
+     */
+    for (nparam = 0; params[nparam]; nparam++);
+    paramlen = nparam ? nasm_malloc(nparam*sizeof(*paramlen)) : NULL;
+
+    for (i = 0; params[i]; i++) {
+       int brace = FALSE;
+       int comma = (!m->plus || i < nparam-1);
+
+       t = params[i];
+       if (t && t->type == TOK_WHITESPACE)
+           t = t->next;
+       if (t && t->type == TOK_OTHER && !strcmp(t->text, "{"))
+           t = t->next, brace = TRUE, comma = FALSE;
+       params[i] = t;
+       paramlen[i] = 0;
+       while (t) {
+           if (!t)                    /* end of param because EOL */
+               break;
+           if (comma && t->type == TOK_OTHER && !strcmp(t->text, ","))
+               break;                 /* ... because we have hit a comma */
+           if (comma && t->type == TOK_WHITESPACE &&
+               t->next->type == TOK_OTHER && !strcmp(t->next->text, ","))
+               break;                 /* ... or a space then a comma */
+           if (brace && t->type == TOK_OTHER && !strcmp(t->text, "}"))
+               break;                 /* ... or a brace */
+           t = t->next;
+           paramlen[i]++;
+       }
+    }
+
+    /*
+     * OK, we have a MMacro structure together with a set of
+     * parameters. We must now go through the expansion and push
+     * copies of each Line on to istk->expansion. Substitution of
+     * parameter tokens and macro-local tokens doesn't get done
+     * until the single-line macro substitution process; this is
+     * because delaying them allows us to change the semantics
+     * later through %rotate.
+     *
+     * First, push an end marker on to istk->expansion, mark this
+     * macro as in progress, and set up its invocation-specific
+     * variables.
+     */
+    ll = nasm_malloc(sizeof(Line));
+    ll->next = istk->expansion;
+    ll->finishes = m;
+    ll->first = NULL;
+    istk->expansion = ll;
+
+    m->in_progress = TRUE;
+    m->params = params;
+    m->iline = tline;
+    m->nparam = nparam;
+    m->rotate = 0;
+    m->paramlen = paramlen;
+    m->unique = unique++;
+
+    m->next_active = istk->mstk;
+    istk->mstk = m;
+
+    for (l = m->expansion; l; l = l->next) {
+       Token **tail;
+
+       ll = nasm_malloc(sizeof(Line));
+       ll->next = istk->expansion;
+       ll->finishes = NULL;
+       ll->first = NULL;
+       tail = &ll->first;
+
+       for (t = l->first; t; t = t->next) {
+           tt = *tail = nasm_malloc(sizeof(Token));
+           tt->next = NULL;
+           tail = &tt->next;
+           tt->type = t->type;
+           tt->text = nasm_strdup(t->text);
+           tt->mac = NULL;
+       }
+
+       istk->expansion = ll;
+
+    }
+
+    /*
+     * If we had a label, push it on the front of the first line of
+     * the macro expansion. We must check that this doesn't give
+     * two consecutive TOK_WHITESPACE.
+     */
+    if (label) {
+       if (last->type == TOK_WHITESPACE &&
+           istk->expansion->first->type == TOK_WHITESPACE) {
+           Token *victim = istk->expansion->first; /* kill this whitespace */
+           istk->expansion->first = victim->next;
+           nasm_free (victim->text);
+           nasm_free (victim);
+       }
+       last->next = istk->expansion->first;
+       istk->expansion->first = label;
+    }
+
+    list->uplevel (m->nolist ? LIST_MACRO_NOLIST : LIST_MACRO);
+
+    return need_sync ? 2 : 1;
+}
+
+static void pp_reset (char *file, int apass, efunc errfunc, evalfunc eval,
+                     ListGen *listgen) {
+    int h;
+
+    error = errfunc;
+    cstk = NULL;
+    linesync = outline = NULL;
+    istk = nasm_malloc(sizeof(Include));
+    istk->next = NULL;
+    istk->conds = NULL;
+    istk->expansion = NULL;
+    istk->mstk = NULL;
+    istk->fp = fopen(file, "r");
+    istk->fname = nasm_strdup(file);
+    istk->lineno = istk->lineinc = 1;
+    if (!istk->fp)
+       error (ERR_FATAL|ERR_NOFILE, "unable to open input file `%s'", file);
+    defining = NULL;
+    for (h=0; h<NHASH; h++) {
+       mmacros[h] = NULL;
+       smacros[h] = NULL;
+    }
+    unique = 0;
+    stdmacpos = stdmac;
+    any_extrastdmac = (extrastdmac != NULL);
+    list = listgen;
+    evaluate = eval;
+    pass = apass;
+}
+
+static char *pp_getline (void) {
+    char *line;
+    Token *tline;
+    int ret;
+
+    if (outline) {
+       line = outline;
+       outline = NULL;
+       return line;
+    }
+
+    while (1) {
+       /*
+        * Fetch a tokenised line, either from the macro-expansion
+        * buffer or from the input file.
+        */
+       tline = NULL;
+       while (istk->expansion && istk->expansion->finishes) {
+           Line *l = istk->expansion;
+           if (!l->finishes->name && l->finishes->in_progress > 1) {
+               Line *ll;
+
+               /*
+                * This is a macro-end marker for a macro with no
+                * name, which means it's not really a macro at all
+                * but a %rep block, and the `in_progress' field is
+                * more than 1, meaning that we still need to
+                * repeat. (1 means the natural last repetition; 0
+                * means termination by %exitrep.) We have
+                * therefore expanded up to the %endrep, and must
+                * push the whole block on to the expansion buffer
+                * again. We don't bother to remove the macro-end
+                * marker: we'd only have to generate another one
+                * if we did.
+                */
+               l->finishes->in_progress--;
+               for (l = l->finishes->expansion; l; l = l->next) {
+                   Token *t, *tt, **tail;
+
+                   ll = nasm_malloc(sizeof(Line));
+                   ll->next = istk->expansion;
+                   ll->finishes = NULL;
+                   ll->first = NULL;
+                   tail = &ll->first;
+
+                   for (t = l->first; t; t = t->next) {
+                       if (t->text) {
+                           tt = *tail = nasm_malloc(sizeof(Token));
+                           tt->next = NULL;
+                           tail = &tt->next;
+                           tt->type = t->type;
+                           tt->text = nasm_strdup(t->text);
+                           tt->mac = NULL;
+                       }
+                   }
+
+                   istk->expansion = ll;
+               }
+               line_sync();
+           } else {
+               /*
+                * Check whether a `%rep' was started and not ended
+                * within this macro expansion. This can happen and
+                * should be detected. It's a fatal error because
+                * I'm too confused to work out how to recover
+                * sensibly from it.
+                */
+               if (defining) {
+                   if (defining->name)
+                       error (ERR_PANIC,
+                              "defining with name in expansion");
+                   else if (!istk->mstk->name)
+                       error (ERR_PANIC, "istk->mstk has no name but"
+                              " defining is set at end of expansion");
+                   else
+                       error (ERR_FATAL, "`%%rep' without `%%endrep' within"
+                              " expansion of macro `%s'", istk->mstk->name);
+               }
+
+               if (istk->mstk->name) {
+                   /*
+                    * This was a real macro call, not a %rep, and
+                    * therefore the parameter information needs to
+                    * be freed.
+                    */
+                   nasm_free(istk->mstk->params);
+                   free_tlist(istk->mstk->iline);
+                   nasm_free(istk->mstk->paramlen);
+               }
+               istk->mstk = istk->mstk->next_active;
+               l->finishes->in_progress = FALSE;
+               istk->expansion = l->next;
+               nasm_free (l);
+               list->downlevel (LIST_MACRO);
+               if (!istk->expansion)
+                   line_sync();
+           }
+       }
+       if (istk->expansion) {
+           char *p;
+           Line *l = istk->expansion;
+           tline = l->first;
+           istk->expansion = l->next;
+           nasm_free (l);
+           p = detoken(tline);
+           list->line (LIST_MACRO, p);
+           nasm_free(p);
+           if (!istk->expansion)
+               line_sync();
+       } else {
+           line = read_line();
+           while (!line) {
+               /*
+                * The current file has ended; work down the istk
+                * until we find a file we can read from.
+                */
+               Include *i;
+               fclose(istk->fp);
+               if (istk->conds)
+                   error(ERR_FATAL, "expected `%%endif' before end of file");
+               i = istk;
+               istk = istk->next;
+               list->downlevel (LIST_INCLUDE);
+               nasm_free (i->fname);
+               nasm_free (i);
+               if (!istk)
+                   return NULL;
+               else
+                   line_sync();
+               update_fileline(3);    /* update __FILE__ and __LINE__ */
+               line = read_line();
+           }
+           line = prepreproc(line);
+           tline = tokenise(line);
+           nasm_free (line);
+       }
+
+       /*
+        * We must expand MMacro parameters and MMacro-local labels
+        * _before_ we plunge into directive processing, to cope
+        * with things like `%define something %1' such as STRUC
+        * uses. Unless we're _defining_ a MMacro, in which case
+        * those tokens should be left alone to go into the
+        * definition.
+        */
+       if (!defining)
+           tline = expand_mmac_params(tline);
+
+       /*
+        * Check the line to see if it's a preprocessor directive.
+        */
+       ret = do_directive(tline);
+       if (ret & 1) {
+           if (ret & 4)
+               line_sync();
+           if ((ret & 2) && !stdmacpos) {/* give a blank line to the output */
+               outline = nasm_strdup("");
+               break;
+           }
+           else
+               continue;
+       } else if (defining) {
+           /*
+            * We're defining a multi-line macro. We emit nothing
+            * at all, not even a blank line (when we finish
+            * defining the macro, we'll emit a line-number
+            * directive so that we keep sync properly), and just
+            * shove the tokenised line on to the macro definition.
+            */
+           Line *l = nasm_malloc(sizeof(Line));
+           l->next = defining->expansion;
+           l->first = tline;
+           l->finishes = FALSE;
+           defining->expansion = l;
+           continue;
+       } else if (istk->conds && !emitting(istk->conds->state)) {
+           /*
+            * We're in a non-emitting branch of a condition block.
+            * Emit nothing at all, not even a blank line: when we
+            * emerge from the condition we'll give a line-number
+            * directive so we keep our place correctly.
+            */
+           free_tlist(tline);
+           continue;
+       } else if (istk->mstk && !istk->mstk->in_progress) {
+           /*
+            * We're in a %rep block which has been terminated, so
+            * we're walking through to the %endrep without
+            * emitting anything. Emit nothing at all, not even a
+            * blank line: when we emerge from the %rep block we'll
+            * give a line-number directive so we keep our place
+            * correctly.
+            */
+           free_tlist(tline);
+           continue;
+       } else {
+           tline = expand_smacro(tline);
+           ret = expand_mmacro(tline);
+           if (!ret) {
+               /*
+                * De-tokenise the line again, and emit it.
+                */
+               line = detoken(tline);
+               free_tlist (tline);
+               outline = line;
+               break;
+           } else {
+               if (ret == 2)
+                   line_sync();
+               continue;              /* expand_mmacro calls free_tlist */
+           }
+       }
+    }
+
+    /*
+     * Once we're out of this loop, outline _must_ be non-NULL. The
+     * only question is whether linesync is NULL or not.
+     */
+    if (linesync) {
+       line = linesync;
+       linesync = NULL;
+    } else {
+       line = outline;
+       outline = NULL;
+    }
+    return line;
+}
+
+static void pp_cleanup (void) {
+    int h;
+
+    if (defining) {
+       error (ERR_NONFATAL, "end of file while still defining macro `%s'",
+              defining->name);
+       nasm_free (defining->name);
+       free_tlist (defining->dlist);
+       free_llist (defining->expansion);
+       nasm_free (defining);
+    }
+    nasm_free (linesync);             /* might just be necessary */
+    nasm_free (outline);              /* really shouldn't be necessary */
+    while (cstk)
+       ctx_pop();
+    for (h=0; h<NHASH; h++) {
+       while (mmacros[h]) {
+           MMacro *m = mmacros[h];
+           mmacros[h] = mmacros[h]->next;
+           nasm_free (m->name);
+           free_tlist (m->dlist);
+           nasm_free (m->defaults);
+           free_llist (m->expansion);
+           nasm_free (m);
+       }
+       while (smacros[h]) {
+           SMacro *s = smacros[h];
+           smacros[h] = smacros[h]->next;
+           nasm_free (s->name);
+           free_tlist (s->expansion);
+           nasm_free (s);
+       }
+    }
+    while (istk) {
+       Include *i = istk;
+       istk = istk->next;
+       fclose(i->fp);
+       nasm_free (i->fname);
+       nasm_free (i);
+    }
+    while (cstk)
+       ctx_pop();
+}
+
+void pp_include_path (char *path) {
+    IncPath *i;
+
+    i = nasm_malloc(sizeof(IncPath));
+    i->path = nasm_strdup(path);
+    i->next = ipath;
+
+    ipath = i;
+}
+
+void pp_pre_include (char *fname) {
+    Token *inc, *space, *name;
+    Line *l;
+
+    inc = nasm_malloc(sizeof(Token));
+    inc->next = space = nasm_malloc(sizeof(Token));
+    space->next = name = nasm_malloc(sizeof(Token));
+    name->next = NULL;
+
+    inc->type = TOK_PREPROC_ID;
+    inc->text = nasm_strdup("%include");
+    space->type = TOK_WHITESPACE;
+    space->text = nasm_strdup(" ");
+    name->type = TOK_INTERNAL_STRING;
+    name->text = nasm_strdup(fname);
+
+    inc->mac = space->mac = name->mac = NULL;
+
+    l = nasm_malloc(sizeof(Line));
+    l->next = predef;
+    l->first = inc;
+    l->finishes = FALSE;
+    predef = l;
+}
+
+void pp_pre_define (char *definition) {
+    Token *def, *space, *name;
+    Line *l;
+    char *equals;
+
+    equals = strchr(definition, '=');
+
+    def = nasm_malloc(sizeof(Token));
+    def->next = space = nasm_malloc(sizeof(Token));
+    if (equals)
+       *equals = ' ';
+    space->next = name = tokenise(definition);
+    if (equals)
+       *equals = '=';
+
+    def->type = TOK_PREPROC_ID;
+    def->text = nasm_strdup("%define");
+    space->type = TOK_WHITESPACE;
+    space->text = nasm_strdup(" ");
+
+    def->mac = space->mac = NULL;
+
+    l = nasm_malloc(sizeof(Line));
+    l->next = predef;
+    l->first = def;
+    l->finishes = FALSE;
+    predef = l;
+}
+
+void pp_extra_stdmac (char **macros) {
+    extrastdmac = macros;
+}
+
+Preproc nasmpp = {
+    pp_reset,
+    pp_getline,
+    pp_cleanup
+};
diff --git a/i386/nasm/preproc.h b/i386/nasm/preproc.h
new file mode 100644 (file)
index 0000000..11934a5
--- /dev/null
@@ -0,0 +1,42 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
+ * Reserved.  This file contains Original Code and/or Modifications of
+ * Original Code as defined in and that are subject to the Apple Public
+ * Source License Version 1.1 (the "License").  You may not use this file
+ * except in compliance with the License.  Please obtain a copy of the
+ * License at http://www.apple.com/publicsource and read it before using
+ * this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/* preproc.h  header file for preproc.c
+ *
+ * The Netwide Assembler is copyright (C) 1996 Simon Tatham and
+ * Julian Hall. All rights reserved. The software is
+ * redistributable under the licence given in the file "Licence"
+ * distributed in the NASM archive.
+ */
+
+#ifndef NASM_PREPROC_H
+#define NASM_PREPROC_H
+
+void pp_include_path (char *);
+void pp_pre_include (char *);
+void pp_pre_define (char *);
+void pp_extra_stdmac (char **);
+
+extern Preproc nasmpp;
+
+#endif
diff --git a/i386/nasm/standard.mac b/i386/nasm/standard.mac
new file mode 100644 (file)
index 0000000..0be8108
--- /dev/null
@@ -0,0 +1,86 @@
+; Standard macro set for NASM 0.97 -*- nasm -*-
+; Note that although some user-level forms of directives are defined
+; here, not all of them are: the user-level form of a format-specific
+; directive should be defined in the module for that directive.
+
+%define __NASM_MAJOR__ 0
+%define __NASM_MINOR__ 97
+
+; These two need to be defined, though the actual definitions will
+; be constantly updated during preprocessing.
+%define __FILE__
+%define __LINE__
+
+%define __SECT__               ; it ought to be defined, even if as nothing
+
+%imacro section 1+.nolist
+%define __SECT__ [section %1]
+         __SECT__
+%endmacro
+%imacro segment 1+.nolist
+%define __SECT__ [segment %1]
+         __SECT__
+%endmacro
+
+%imacro absolute 1+.nolist
+%define __SECT__ [absolute %1]
+         __SECT__
+%endmacro
+
+%imacro struc 1.nolist
+%push struc
+%define %$strucname %1
+[absolute 0]
+%$strucname:                   ; allow definition of `.member' to work sanely
+%endmacro
+%imacro endstruc 0.nolist
+%{$strucname}_size:
+%pop
+__SECT__
+%endmacro
+
+%imacro istruc 1.nolist
+%push istruc
+%define %$strucname %1
+%$strucstart:
+%endmacro
+%imacro at 1-2+.nolist
+         times %1-($-%$strucstart) db 0
+         %2
+%endmacro
+%imacro iend 0.nolist
+         times %{$strucname}_size-($-%$strucstart) db 0
+%pop
+%endmacro
+
+%imacro align 1-2+.nolist nop
+         times ($$-$) & ((%1)-1) %2
+%endmacro
+%imacro alignb 1-2+.nolist resb 1
+         times ($$-$) & ((%1)-1) %2
+%endmacro
+
+%imacro extern 1-*.nolist
+%rep %0
+[extern %1]
+%rotate 1
+%endrep
+%endmacro
+
+%imacro bits 1+.nolist
+[bits %1]
+%endmacro
+
+%imacro global 1-*.nolist
+%rep %0
+[global %1]
+%rotate 1
+%endrep
+%endmacro
+
+%imacro common 1-*.nolist
+%rep %0
+[common %1]
+%rotate 1
+%endrep
+%endmacro
diff --git a/i386/nasm/sync.c b/i386/nasm/sync.c
new file mode 100644 (file)
index 0000000..4fe4efa
--- /dev/null
@@ -0,0 +1,132 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
+ * Reserved.  This file contains Original Code and/or Modifications of
+ * Original Code as defined in and that are subject to the Apple Public
+ * Source License Version 1.1 (the "License").  You may not use this file
+ * except in compliance with the License.  Please obtain a copy of the
+ * License at http://www.apple.com/publicsource and read it before using
+ * this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/* sync.c   the Netwide Disassembler synchronisation processing module
+ *
+ * The Netwide Assembler is copyright (C) 1996 Simon Tatham and
+ * Julian Hall. All rights reserved. The software is
+ * redistributable under the licence given in the file "Licence"
+ * distributed in the NASM archive.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <limits.h>
+
+#include "sync.h"
+
+#define SYNC_MAX 4096                 /* max # of sync points */
+
+/*
+ * This lot manages the current set of sync points by means of a
+ * heap (priority queue) structure.
+ */
+
+static struct Sync {
+    unsigned long pos;
+    unsigned long length;
+} *synx;
+static int nsynx;
+
+void init_sync(void) {
+    /*
+     * I'd like to allocate an array of size SYNC_MAX, then write
+     * `synx--' which would allow numbering the array from one
+     * instead of zero without wasting memory. Sadly I don't trust
+     * this to work in 16-bit Large model, so it's staying the way
+     * it is. Btw, we don't care about freeing this array, since it
+     * has to last for the duration of the program and will then be
+     * auto-freed on exit. And I'm lazy ;-)
+     * 
+     * Speaking of 16-bit Large model, that's also the reason I'm
+     * not declaring this array statically - by doing it
+     * dynamically I avoid problems with the total size of DGROUP
+     * in Borland C.
+     */
+    synx = malloc((SYNC_MAX+1) * sizeof(*synx));
+    if (!synx) {
+       fprintf(stderr, "ndisasm: not enough memory for sync array\n");
+       exit(1);
+    }
+    nsynx = 0;
+}
+
+void add_sync(unsigned long pos, unsigned long length) {
+    int i;
+
+    if (nsynx == SYNC_MAX)
+       return;                        /* can't do anything - overflow */
+
+    nsynx++;
+    synx[nsynx].pos = pos;
+    synx[nsynx].length = length;
+
+    for (i = nsynx; i > 1; i /= 2) {
+       if (synx[i/2].pos > synx[i].pos) {
+           struct Sync t;
+           t = synx[i/2];             /* structure copy */
+           synx[i/2] = synx[i];       /* structure copy again */
+           synx[i] = t;               /* another structure copy */
+       }
+    }
+}
+
+unsigned long next_sync(unsigned long position, unsigned long *length) {
+    while (nsynx > 0 && synx[1].pos + synx[1].length <= position) {
+       int i, j;
+       struct Sync t;
+       t = synx[nsynx];               /* structure copy */
+       synx[nsynx] = synx[1];         /* structure copy */
+       synx[1] = t;                   /* ditto */
+
+       nsynx--;
+
+        i = 1;
+       while (i*2 <= nsynx) {
+           j = i*2;
+           if (synx[j].pos < synx[i].pos &&
+               (j+1 > nsynx || synx[j+1].pos > synx[j].pos)) {
+               t = synx[j];           /* structure copy */
+               synx[j] = synx[i];     /* lots of these... */
+               synx[i] = t;           /* ...aren't there? */
+               i = j;
+           } else if (j+1 <= nsynx && synx[j+1].pos < synx[i].pos) {
+               t = synx[j+1];         /* structure copy */
+               synx[j+1] = synx[i];   /* structure <yawn> copy */
+               synx[i] = t;           /* structure copy <zzzz....> */
+               i = j+1;
+           } else
+               break;
+       }
+    }
+
+    if (nsynx > 0) {
+       if (length)
+           *length = synx[1].length;
+       return synx[1].pos;
+    } else {
+       if (length)
+           *length = 0L;
+       return ULONG_MAX;
+    }
+}
diff --git a/i386/nasm/sync.h b/i386/nasm/sync.h
new file mode 100644 (file)
index 0000000..ee01bc2
--- /dev/null
@@ -0,0 +1,39 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
+ * Reserved.  This file contains Original Code and/or Modifications of
+ * Original Code as defined in and that are subject to the Apple Public
+ * Source License Version 1.1 (the "License").  You may not use this file
+ * except in compliance with the License.  Please obtain a copy of the
+ * License at http://www.apple.com/publicsource and read it before using
+ * this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/* sync.h   header file for sync.c
+ *
+ * The Netwide Assembler is copyright (C) 1996 Simon Tatham and
+ * Julian Hall. All rights reserved. The software is
+ * redistributable under the licence given in the file "Licence"
+ * distributed in the NASM archive.
+ */
+
+#ifndef NASM_SYNC_H
+#define NASM_SYNC_H
+
+void init_sync(void);
+void add_sync(unsigned long position, unsigned long length);
+unsigned long next_sync(unsigned long position, unsigned long *length);
+
+#endif
diff --git a/i386/rcz/Makefile b/i386/rcz/Makefile
new file mode 100644 (file)
index 0000000..cf15acd
--- /dev/null
@@ -0,0 +1,55 @@
+
+DIR = rcz
+include ../MakePaths.dir
+
+UTILDIR = ../util
+LIBSADIR = ../libsa
+INSTALLDIR = $(DSTROOT)/System/Library/Frameworks/System.framework/Versions/B/PrivateHeaders/standalone
+
+OPTIM = -Os
+CFLAGS = $(RC_CFLAGS) $(OPTIM) $(MORECPP) -arch i386 -g -Wmost -Wno-precomp \
+    -munaligned-text -static -traditional-cpp
+DEFINES=
+CONFIG = hd
+INC = -I. -I$(SYMROOT) -I$(UTILDIR) -I$(LIBSADIR)
+ifneq "" "$(wildcard /bin/mkdirs)"
+  MKDIRS = /bin/mkdirs
+else
+  MKDIRS = /bin/mkdir -p
+endif
+AS = as
+LD = ld
+# LIBS= -lc_static
+LIBS=
+
+VPATH = $(OBJROOT):$(SYMROOT)
+
+RCZ_OBJS =rcz_compress_mem.o \
+       rcz_decompress_file.o \
+       rcz_decompress_mem.o
+
+SFILES =
+CFILES = 
+HFILES = 
+EXPORTED_HFILES =
+INSTALLED_HFILES =
+OTHERFILES = Makefile
+ALLSRC =  $(SFILES) $(CFILES) \
+       $(HFILES) $(OTHERFILES)
+LIBS = librcz.a
+DIRS_NEEDED = $(OBJROOT) $(SYMROOT)
+
+all: $(DIRS_NEEDED) $(LIBS)
+
+librcz.a: $(RCZ_OBJS)
+       rm -f $(SYMROOT)/$(@F)
+       libtool -o $(SYMROOT)/$(@F) $(RCZ_OBJS)
+       ranlib $(SYMROOT)/$(@F)
+
+clean::
+       rm -rf $(SYMROOT)/librcz.a
+
+include ../MakeInc.dir
+
+# dependencies
+-include $(OBJROOT)/Makedep
diff --git a/i386/rcz/rcz_common.c b/i386/rcz/rcz_common.c
new file mode 100644 (file)
index 0000000..264dafd
--- /dev/null
@@ -0,0 +1,31 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
+ * Reserved.  This file contains Original Code and/or Modifications of
+ * Original Code as defined in and that are subject to the Apple Public
+ * Source License Version 1.1 (the "License").  You may not use this file
+ * except in compliance with the License.  Please obtain a copy of the
+ * License at http://www.apple.com/publicsource and read it before using
+ * this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/* Copyright 1995 NeXT Computer, Inc.  All rights reserved. */
+
+/* Common storage for compression functions. */
+
+#import "rcz_common.h"
+
+unsigned short que[QLEN];
+
diff --git a/i386/rcz/rcz_common.h b/i386/rcz/rcz_common.h
new file mode 100644 (file)
index 0000000..9c691ac
--- /dev/null
@@ -0,0 +1,37 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
+ * Reserved.  This file contains Original Code and/or Modifications of
+ * Original Code as defined in and that are subject to the Apple Public
+ * Source License Version 1.1 (the "License").  You may not use this file
+ * except in compliance with the License.  Please obtain a copy of the
+ * License at http://www.apple.com/publicsource and read it before using
+ * this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/* Copyright 1995 NeXT Computer, Inc.  All rights reserved. */
+
+/* Common storage for compression functions. */
+
+#define QLEN 255
+#define F1 12
+#define F2 12
+#define ABOVE ((F2 * QLEN) >> 4)
+#define METHOD_17_JUL_95 666
+
+
+#define RCZ_EXTENSION  ".rcz"
+
+
diff --git a/i386/rcz/rcz_compress_file.c b/i386/rcz/rcz_compress_file.c
new file mode 100644 (file)
index 0000000..200ebe7
--- /dev/null
@@ -0,0 +1,129 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
+ * Reserved.  This file contains Original Code and/or Modifications of
+ * Original Code as defined in and that are subject to the Apple Public
+ * Source License Version 1.1 (the "License").  You may not use this file
+ * except in compliance with the License.  Please obtain a copy of the
+ * License at http://www.apple.com/publicsource and read it before using
+ * this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/* 
+   Library: compressor for executable files.
+
+   R. E. Crandall, July 1995
+   
+   Copyright 1995 NeXT Computer, Inc.
+   All rights reserved.
+   
+ */
+#import "rcz_common.h"
+static unsigned short que[QLEN];
+
+unsigned int
+rcz_compress_file(
+    int in_fd,
+    unsigned int inbytes,
+    unsigned char *out
+) 
+/* Returns actual number of bytes emitted as compressed stream 'out.' */
+{
+    unsigned int c, ct, j, jmatch, jabove, match;
+    unsigned int data[32], version;
+    unsigned int word, token, tokenct, total;
+    unsigned char *outorigin = out;
+
+/* First, put version number into stream. */
+    *out++ = (METHOD_17_JUL_95>>24) & 0xff;
+    *out++ = (METHOD_17_JUL_95>>16) & 0xff;
+    *out++ = (METHOD_17_JUL_95>>8) & 0xff;
+    *out++ = (METHOD_17_JUL_95) & 0xff;
+/* Next, put the initial size into stream. */
+    *out++ = (inbytes>>24) & 0xff;
+    *out++ = (inbytes>>16) & 0xff;
+    *out++ = (inbytes>>8) & 0xff;
+    *out++ = (inbytes) & 0xff;
+    
+    for(ct=0; ct < QLEN; ct++) que[ct] = ct;
+    word = token = tokenct = 0;
+    for(ct = 0; ct < inbytes; ct++) {
+       /* Next, update bucket-brigade register. */
+         word = (word << 8) | (*in++);  
+         if(ct % 2 == 1) {
+               word &= 0xffff;
+               match = 0;
+               for(j=0; j < QLEN; j++) {
+                       if(que[j] == word) {
+                               match = 1;
+                               jmatch = j;
+                               break;
+                       }
+               }
+               token = (token<<1) | match;
+               if(match) { /* 16-bit symbol is in queue. */
+                       c = que[jmatch];
+                       jabove = (F1 * jmatch) >> 4;
+                       for(j = jmatch; j > jabove; j--) {
+                            que[j] = que[j-1];
+                       }
+                       que[jabove] = c;
+                       data[tokenct++] = jmatch;
+               } else {   /* 16-bit symbol is not in queue. */
+                   for(j=QLEN-1; j > ABOVE; j--) {
+                       que[j] = que[j-1];
+                   } 
+                   que[ABOVE] = word;
+                   data[tokenct++] = word;
+               }
+               if(tokenct == 32) {  /* Unload tokens and data. */
+                   *out++ = (token>>24) & 0xff;
+                   *out++ = (token>>16) & 0xff;
+                   *out++ = (token>>8) & 0xff;
+                   *out++ = (token) & 0xff;
+                   c = (1<<31);
+                   for(j = 0; j < tokenct; j++) {
+                       if(token & c) *out++ = data[j] & 0xff;
+                          else {
+                              *out++ = (data[j] >> 8) & 0xff;
+                              *out++ = (data[j]) & 0xff;
+                          }
+                       c >>= 1;
+                   } 
+                   token = tokenct = 0;
+               }
+         }
+    }
+    if(tokenct > 0) { /* Flush final token and data. */
+        token <<= (32-tokenct);
+       *out++ = (token>>24) & 0xff;
+       *out++ = (token>>16) & 0xff;
+       *out++ = (token>>8) & 0xff;
+       *out++ = (token) & 0xff;
+       c = (1<<31);
+       for(j = 0; j < tokenct; j++) {
+               if(token & c) *out++ = data[j] & 0xff;
+                  else {
+                      *out++ = (data[j] >> 8) & 0xff;
+                      *out++ = (data[j]) & 0xff;
+                  }
+               c >>= 1;
+       } 
+    }
+    if(ct % 2 == 1) *out++ = (word) & 0xff;
+    return((int)(out-outorigin));
+}
diff --git a/i386/rcz/rcz_compress_file.h b/i386/rcz/rcz_compress_file.h
new file mode 100644 (file)
index 0000000..47798f2
--- /dev/null
@@ -0,0 +1,34 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
+ * Reserved.  This file contains Original Code and/or Modifications of
+ * Original Code as defined in and that are subject to the Apple Public
+ * Source License Version 1.1 (the "License").  You may not use this file
+ * except in compliance with the License.  Please obtain a copy of the
+ * License at http://www.apple.com/publicsource and read it before using
+ * this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/* Copyright 1995 NeXT Computer, Inc.  All rights reserved. */
+/* Compression functions. */
+
+extern unsigned int
+rcz_compress_file(
+    int in_fd,
+    unsigned int inbytes,
+    unsigned char *out
+);
+/* Returns actual number of bytes emitted as compressed stream 'out.' */
+
diff --git a/i386/rcz/rcz_compress_mem.c b/i386/rcz/rcz_compress_mem.c
new file mode 100644 (file)
index 0000000..af44704
--- /dev/null
@@ -0,0 +1,130 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
+ * Reserved.  This file contains Original Code and/or Modifications of
+ * Original Code as defined in and that are subject to the Apple Public
+ * Source License Version 1.1 (the "License").  You may not use this file
+ * except in compliance with the License.  Please obtain a copy of the
+ * License at http://www.apple.com/publicsource and read it before using
+ * this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/* 
+   Library: compressor for executable files.
+
+   R. E. Crandall, July 1995
+   
+   Copyright 1995 NeXT Computer, Inc.
+   All rights reserved.
+   
+ */
+#import "rcz_common.h"
+static unsigned short que[QLEN];
+
+
+unsigned int
+rcz_compress_memory(
+    unsigned char *in,
+    unsigned int inbytes,
+    unsigned char *out
+) 
+/* Returns actual number of bytes emitted as compressed stream 'out.' */
+{
+    unsigned int c, ct, j, jmatch, jabove, match;
+    unsigned int data[32], version;
+    unsigned int word, token, tokenct, total;
+    unsigned char *outorigin = out;
+
+/* First, put version number into stream. */
+    *out++ = (METHOD_17_JUL_95>>24) & 0xff;
+    *out++ = (METHOD_17_JUL_95>>16) & 0xff;
+    *out++ = (METHOD_17_JUL_95>>8) & 0xff;
+    *out++ = (METHOD_17_JUL_95) & 0xff;
+/* Next, put the initial size into stream. */
+    *out++ = (inbytes>>24) & 0xff;
+    *out++ = (inbytes>>16) & 0xff;
+    *out++ = (inbytes>>8) & 0xff;
+    *out++ = (inbytes) & 0xff;
+    
+    for(ct=0; ct < QLEN; ct++) que[ct] = ct;
+    word = token = tokenct = 0;
+    for(ct = 0; ct < inbytes; ct++) {
+       /* Next, update bucket-brigade register. */
+         word = (word << 8) | (*in++);  
+         if(ct % 2 == 1) {
+               word &= 0xffff;
+               match = 0;
+               for(j=0; j < QLEN; j++) {
+                       if(que[j] == word) {
+                               match = 1;
+                               jmatch = j;
+                               break;
+                       }
+               }
+               token = (token<<1) | match;
+               if(match) { /* 16-bit symbol is in queue. */
+                       c = que[jmatch];
+                       jabove = (F1 * jmatch) >> 4;
+                       for(j = jmatch; j > jabove; j--) {
+                            que[j] = que[j-1];
+                       }
+                       que[jabove] = c;
+                       data[tokenct++] = jmatch;
+               } else {   /* 16-bit symbol is not in queue. */
+                   for(j=QLEN-1; j > ABOVE; j--) {
+                       que[j] = que[j-1];
+                   } 
+                   que[ABOVE] = word;
+                   data[tokenct++] = word;
+               }
+               if(tokenct == 32) {  /* Unload tokens and data. */
+                   *out++ = (token>>24) & 0xff;
+                   *out++ = (token>>16) & 0xff;
+                   *out++ = (token>>8) & 0xff;
+                   *out++ = (token) & 0xff;
+                   c = (1<<31);
+                   for(j = 0; j < tokenct; j++) {
+                       if(token & c) *out++ = data[j] & 0xff;
+                          else {
+                              *out++ = (data[j] >> 8) & 0xff;
+                              *out++ = (data[j]) & 0xff;
+                          }
+                       c >>= 1;
+                   } 
+                   token = tokenct = 0;
+               }
+         }
+    }
+    if(tokenct > 0) { /* Flush final token and data. */
+        token <<= (32-tokenct);
+       *out++ = (token>>24) & 0xff;
+       *out++ = (token>>16) & 0xff;
+       *out++ = (token>>8) & 0xff;
+       *out++ = (token) & 0xff;
+       c = (1<<31);
+       for(j = 0; j < tokenct; j++) {
+               if(token & c) *out++ = data[j] & 0xff;
+                  else {
+                      *out++ = (data[j] >> 8) & 0xff;
+                      *out++ = (data[j]) & 0xff;
+                  }
+               c >>= 1;
+       } 
+    }
+    if(ct % 2 == 1) *out++ = (word) & 0xff;
+    return((int)(out-outorigin));
+}
diff --git a/i386/rcz/rcz_compress_mem.h b/i386/rcz/rcz_compress_mem.h
new file mode 100644 (file)
index 0000000..bf3e8b1
--- /dev/null
@@ -0,0 +1,34 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
+ * Reserved.  This file contains Original Code and/or Modifications of
+ * Original Code as defined in and that are subject to the Apple Public
+ * Source License Version 1.1 (the "License").  You may not use this file
+ * except in compliance with the License.  Please obtain a copy of the
+ * License at http://www.apple.com/publicsource and read it before using
+ * this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/* Copyright 1995 NeXT Computer, Inc.  All rights reserved. */
+/* Compression functions. */
+
+unsigned int
+rcz_compress_memory(
+    unsigned char *in,
+    unsigned int inbytes,
+    unsigned char *out
+);
+/* Returns actual number of bytes emitted as compressed stream 'out.' */
+
diff --git a/i386/rcz/rcz_decompress_file.c b/i386/rcz/rcz_decompress_file.c
new file mode 100644 (file)
index 0000000..4d48b8c
--- /dev/null
@@ -0,0 +1,163 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
+ * Reserved.  This file contains Original Code and/or Modifications of
+ * Original Code as defined in and that are subject to the Apple Public
+ * Source License Version 1.1 (the "License").  You may not use this file
+ * except in compliance with the License.  Please obtain a copy of the
+ * License at http://www.apple.com/publicsource and read it before using
+ * this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/* 
+   Library: compressor for executable files.
+
+   R. E. Crandall, July 1995
+   
+   Copyright 1995 NeXT Computer, Inc.
+   All rights reserved.
+   
+ */
+
+#import "rcz_common.h"
+#import "unistd.h"
+static unsigned short que[QLEN];
+#define REWIND -1
+
+// extern int read(int fd, char *buf, int len);
+
+static unsigned char *buf;
+static int buf_count;
+
+#define BUF_SIZE 8192
+
+static void
+alloc_buf(int fd)
+{
+    buf = (unsigned char *)malloc(BUF_SIZE);
+    buf_count = 0;
+}
+
+static unsigned char
+get_byte(int fd)
+{
+    static unsigned char *ptr;
+
+    if (buf_count == 0) {
+       buf_count = read(fd, buf, BUF_SIZE);
+       ptr = buf;
+       if (buf_count <= 0)
+           return 0xFF;
+    }
+    buf_count--;
+    return *ptr++;
+}
+
+static void
+free_buf(void)
+{
+    buf_count = 0;
+    free(buf);
+}
+
+
+int
+rcz_file_size(
+    int in_fd
+)
+{
+    unsigned int version, length;
+    
+    alloc_buf(in_fd);
+    b_lseek(in_fd, 0, 0);
+    version = get_byte(in_fd);
+    version = (version<<8) | (get_byte(in_fd));
+    version = (version<<8) | (get_byte(in_fd));
+    version = (version<<8) | (get_byte(in_fd));
+    if(version != METHOD_17_JUL_95) {
+       return (-1);
+//     fprintf(stderr, "Incompatible version.\n");
+//     return(0);
+    }
+       
+    length = get_byte(in_fd);
+    length = (length<<8) | (get_byte(in_fd));
+    length = (length<<8) | (get_byte(in_fd));
+    length = (length<<8) | (get_byte(in_fd));
+    free_buf();
+    return length;
+}
+
+int
+rcz_decompress_file(
+    int in_fd,
+    unsigned char *out
+)
+/* Returns actual number of bytes emitted as decompressed stream 'out.'
+   Note that the 'in' stream contains this byte count already.
+   
+   Returns -1 if the input stream was not in compressed format.
+ */
+{
+    unsigned int c, j, k, jmatch, jabove;
+    int length;
+    unsigned int even_length, word, token, version;
+    unsigned char *outorigin = out;
+
+    length = rcz_file_size(in_fd);
+    if (length < 0)
+       return length;
+
+    alloc_buf(in_fd);
+    b_lseek(in_fd, 8, 0);
+    for(c=0; c < QLEN; c++) que[c] = c;
+    even_length = 2*(length/2);
+    while((int)(out-outorigin) < even_length) {
+       token = get_byte(in_fd);
+        token = (token<<8) | (get_byte(in_fd));
+        token = (token<<8) | (get_byte(in_fd));
+        token = (token<<8) | (get_byte(in_fd));
+       c = 1<<31;      
+       for(k = 0; k<32; k++) {
+               if(c & token) {
+                     jmatch = get_byte(in_fd);
+                     word = que[jmatch];
+                 /* Next, dynamically process the queue for match. */
+                     jabove = (F1*jmatch) >> 4;
+                     for(j = jmatch; j > jabove; j--) {
+                            que[j] = que[j-1];
+                     }
+                     que[jabove] = word;
+               } else {
+                 /* Next, dynamically process the queue for unmatch. */
+                   word = get_byte(in_fd);
+                   word = (word << 8) | (get_byte(in_fd));
+                   for(j=QLEN-1; j > ABOVE; j--) {
+                       que[j] = que[j-1];
+                   } 
+                   que[ABOVE] = word;
+               }
+               *out++ = (word >> 8) & 0xff;
+               *out++ = (word) & 0xff;
+               if((int)(out-outorigin) >= even_length) break;
+               c >>= 1;
+       }       
+    }          
+    if(even_length != length) *out++ = get_byte(in_fd);
+    free_buf();
+    return(length);
+}
diff --git a/i386/rcz/rcz_decompress_file.h b/i386/rcz/rcz_decompress_file.h
new file mode 100644 (file)
index 0000000..f962a12
--- /dev/null
@@ -0,0 +1,38 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
+ * Reserved.  This file contains Original Code and/or Modifications of
+ * Original Code as defined in and that are subject to the Apple Public
+ * Source License Version 1.1 (the "License").  You may not use this file
+ * except in compliance with the License.  Please obtain a copy of the
+ * License at http://www.apple.com/publicsource and read it before using
+ * this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/* Copyright 1995 NeXT Computer, Inc.  All rights reserved. */
+/* Compression functions. */
+
+extern int
+rcz_file_size(
+    int in_fd
+);
+
+extern int
+rcz_decompress_file(
+    int in_fd,
+    unsigned char *out
+);
+
+
diff --git a/i386/rcz/rcz_decompress_mem.c b/i386/rcz/rcz_decompress_mem.c
new file mode 100644 (file)
index 0000000..b5a3f86
--- /dev/null
@@ -0,0 +1,102 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
+ * Reserved.  This file contains Original Code and/or Modifications of
+ * Original Code as defined in and that are subject to the Apple Public
+ * Source License Version 1.1 (the "License").  You may not use this file
+ * except in compliance with the License.  Please obtain a copy of the
+ * License at http://www.apple.com/publicsource and read it before using
+ * this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/* 
+   Library: compressor for executable files.
+
+   R. E. Crandall, July 1995
+   
+   Copyright 1995 NeXT Computer, Inc.
+   All rights reserved.
+   
+ */
+
+#import "rcz_common.h"
+static unsigned short que[QLEN];
+
+unsigned int
+rcz_decompress_memory(unsigned char *in, unsigned char *out) 
+/* Returns actual number of bytes emitted as decompressed stream 'out.'
+   Note that the 'in' stream contains this byte count already.
+   
+   Returns -1 if the input stream was not in compressed format.
+ */
+{
+    unsigned int c, j, k, jmatch, jabove;
+    unsigned int length, even_length, word, token, version;
+    unsigned char *outorigin = out;
+    int *a, *b;
+
+    version = *in++;
+    version = (version<<8) | (*in++);
+    version = (version<<8) | (*in++);
+    version = (version<<8) | (*in++);
+    if(version != METHOD_17_JUL_95) {
+       return (-1);
+//     fprintf(stderr, "Incompatible version.\n");
+//     return(0);
+    }
+       
+    length = *in++;
+    length = (length<<8) | (*in++);
+    length = (length<<8) | (*in++);
+    length = (length<<8) | (*in++);
+
+    for(c=0; c < QLEN; c++) que[c] = c;
+    even_length = 2*(length/2);
+    while((int)(out-outorigin) < even_length) {
+       token = *in++;
+        token = (token<<8) | (*in++);
+        token = (token<<8) | (*in++);
+        token = (token<<8) | (*in++);
+       c = 1<<31;      
+       for(k = 0; k<32; k++) {
+               if(c & token) {
+                     jmatch = *in++;
+                     word = que[jmatch];
+                 /* Next, dynamically process the queue for match. */
+                     jabove = (F1*jmatch) >> 4;
+                     for(j = jmatch; j > jabove; j--) {
+                            que[j] = que[j-1];
+                     }
+                     que[jabove] = word;
+               } else {
+                 /* Next, dynamically process the queue for unmatch. */
+                   word = *in++;
+                   word = (word << 8) | (*in++);
+                   for(j=QLEN-1; j > ABOVE; j--) {
+                       que[j] = que[j-1];
+                   } 
+                   que[ABOVE] = word;
+               }
+               *out++ = (word >> 8) & 0xff;
+               *out++ = (word) & 0xff;
+               if((int)(out-outorigin) >= even_length) break;
+               c >>= 1;
+       }       
+    }          
+    if(even_length != length) *out++ = *in++;
+    return(length);
+}
diff --git a/i386/rcz/rcz_decompress_mem.h b/i386/rcz/rcz_decompress_mem.h
new file mode 100644 (file)
index 0000000..bae443f
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
+ * Reserved.  This file contains Original Code and/or Modifications of
+ * Original Code as defined in and that are subject to the Apple Public
+ * Source License Version 1.1 (the "License").  You may not use this file
+ * except in compliance with the License.  Please obtain a copy of the
+ * License at http://www.apple.com/publicsource and read it before using
+ * this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/* Copyright 1995 NeXT Computer, Inc.  All rights reserved. */
+
+extern unsigned int
+rcz_decompress_memory(unsigned char *in, unsigned char *out);
+
diff --git a/i386/sarld/Makefile b/i386/sarld/Makefile
new file mode 100644 (file)
index 0000000..3e29bd4
--- /dev/null
@@ -0,0 +1,38 @@
+
+DIR = sarld
+include ../MakePaths.dir
+
+DIRS_NEEDED = $(OBJROOT) $(SYMROOT)
+VPATH = $(OBJROOT):$(SYMROOT)
+
+INSTALLDIR = $(DSTROOT)/usr/standalone/i386
+
+LIBSA=$(SYMROOT)/libsa.a
+LIBSADIR = ../libsa
+LIBSARLD = -lsarld
+SARLD = $(SYMROOT)/sarld
+
+CFLAGS = -static
+ARCHFLAGS = -arch i386
+
+RLD_ADDR = `awk '/RLD_ADDR/ { print $$3 }' < $(LIBSADIR)/memory.h`
+
+all: $(SARLD)
+
+$(SARLD): $(SARLD).sys
+       strip -o $(SARLD) $(SARLD).sys
+       
+$(SARLD).sys: $(LIBSA)
+       $(CC) $(COPTS) $(CFLAGS) $(ARCHFLAGS) -o $(SARLD).sys \
+               -e _sa_rld -u _sa_rld \
+                -seg1addr $(RLD_ADDR) -preload -nostdlib $(LIBSARLD) $(LIBSA)
+
+clean::
+       rm -rf $(SARLD) $(SARLD).sys
+       
+install_i386:: $(SARLD) $(INSTALLDIR)
+       cp $(SARLD) $(INSTALLDIR)
+
+include ../MakeInc.dir
+
+#dependencies
diff --git a/i386/strings/BootHelp.txt b/i386/strings/BootHelp.txt
new file mode 100644 (file)
index 0000000..6f09934
--- /dev/null
@@ -0,0 +1,19 @@
+
+The boot: prompt waits ten seconds for you to type advanced startup options.
+If you don't type anything, the computer continues starting up normally: It
+uses the kernel and configuration files on the startup device, which it also
+uses as the root device.  Advanced startup options use the following syntax:
+
+    <<device>kernel> <arguments>
+
+For example, to start up from:
+  the first SCSI device, type: sd()mach_kernel
+  the b partition of the second IDE disk, type: hd(1,b)mach_kernel
+  the floppy disk but use the SCSI disk as the root device, type:
+    fd()mach_kernel rootdev=sd0a
+
+If the computer won't start up properly, you may be able to start it up using
+the drivers you used to install Rhapsody. Type: config=Default
+
+To continue starting up using standard options, press Return.
+
diff --git a/i386/strings/English.lproj/Localizable.strings b/i386/strings/English.lproj/Localizable.strings
new file mode 100644 (file)
index 0000000..a990744
--- /dev/null
@@ -0,0 +1,126 @@
+/* Informational messages */
+
+"Loading Rhapsody";
+"Loading %s\n";
+"Reading Rhapsody configuration";
+"Couldn't load standalone linker; unable to load boot drivers.\n";
+"Insert file system media and press Return";
+"Errors encountered while starting up the computer.\n";
+"Pausing %d seconds...\n";
+"Starting Rhapsody";
+"Can't find %s\n";
+"Couldn't start up the computer using this floppy disk.";
+"Error occurred while linking driver %s:\n%s";
+"Loading %s device driver.\n";
+"The driver was loaded successfully.\n";
+"An error occurred while loading the %s device driver.\n";
+"Press Return to continue.\n";
+"That driver has already been loaded.\n";
+"Searching for drivers\n";
+"Reading configuration file '%s'.\n";
+
+/* Warnings */
+
+"Config file \"%s\" not found\n";
+"System config file '%s' not found\n";
+"Loading binary for %s device driver.\n";
+"Warning: No active drivers specified in system config.\n";
+
+/* Install messages */
+
+"DRIVER_MESSAGE_1" =
+"The floppy disk in the drive contains device drivers for the following SCSI
+adapters:\n";
+"DRIVER_INSTRUCTION_1" = 
+"Type the number for the SCSI adapter your CD-ROM drive is connected to.\n\n";
+"DRIVER_ALTERNATE_1" =
+"If the driver for this device is on another disk, insert that disk in the
+floppy disk drive and type %d.\n";
+"DRIVER_QUIT_1" = "";
+"DRIVER_MESSAGE_2" = 
+"The floppy disk in the drive contains device drivers for the following SCSI
+adapters and hard disk controllers:\n";
+"DRIVER_INSTRUCTION_2" = 
+"Type the number for the SCSI adapter or hard disk controller that
+the hard disk you want to install Rhapsody on is connected to.
+(This may be the same SCSI adapter that your CD-ROM drive is connected to.)\n\n";
+"DRIVER_ALTERNATE_2" = 
+"If the driver for this device is on another disk, insert that disk in the
+floppy disk drive and type %d.\n";
+"DRIVER_QUIT_2" = "";
+"DRIVER_MESSAGE_3" = 
+"The floppy disk in the drive contains the following device drivers:\n";
+"DRIVER_INSTRUCTION_3" = 
+"Type the number for the device driver you need to install Rhapsody.\n\n";
+"DRIVER_ALTERNATE_3" = 
+"If the device driver you need to load is on another disk, insert it in
+the drive and type %d.\n\n";
+"DRIVER_QUIT_3" = "Type %d to continue without installing a device driver from this disk.\n";
+"DRIVER_QUESTION_3" =
+"Normally, you only need to load the device drivers for the adapters your
+CD-ROM drive and hard disk are connected to in order to install Rhapsody.
+Other drivers are loaded automatically.
+
+If you do need to load another device driver, insert the disk that contains it
+in the floppy disk drive.\n\n";
+
+"Really Install?" =
+"This program is for installing Rhapsody on a hard disk.
+THIS IS NOT AN UPGRADE: ANY EXISTING Rhapsody FILES WILL BE DELETED.
+
+If you have files on your hard disk that you want to keep,
+quit this program and copy what you want to keep onto another disk.
+
+Type 1 to prepare to install Rhapsody.
+Type 2 to quit this installation program.\n";
+
+"Type %d to view a list of additional device drivers on this disk.\n\n";
+
+"Insert Driver Disk" = 
+"Please insert the Rhapsody Device Drivers disk in the floppy disk drive
+and press Return.\n\n---> ";
+
+"Load Other Drivers?" =
+"Normally, you only need to load the device drivers for the adapters your
+CD-ROM drive and hard disk are connected to in order to install Rhapsody.
+Other drivers are loaded automatically from the Rhapsody CD-ROM.
+
+If you do need to load another device driver, insert the disk that contains it
+in the floppy disk drive.\n";
+
+"Missing Drivers:" =
+"When you began installing Rhapsody, you loaded one or more device drivers
+that were not on the Rhapsody CD-ROM:\n";
+
+"No Drivers On This Disk" =
+"There are no suitable device drivers on this floppy disk.
+Please insert a new disk and press Return.
+---> ";
+
+"Install Canceled" =
+"Installation canceled.  Eject the floppy disk and restart the computer.\n";
+
+"1 To Continue" =
+"Type 1 to continue without loading additional device drivers.\n";
+
+"2 To Load" =
+"Type 2 to load a device driver from the disk in the floppy disk drive.\n";
+
+"1 To Load Driver" =
+"Please insert the floppy disk that contains one or more of these device
+drivers and type 1.\n";
+
+"2 To Continue" =
+"Type 2 to continue without loading any of the device drivers in this list.\n";
+
+/* Somewhat obscure error messages */
+
+"Error loading %s\n";
+"Read error\n";
+"Error in standalone linker executable\n";
+"Fat binary file doesn't contain i386 code\n";
+"Unrecognized binary format\n";
+"Error reading commands\n";
+"Error loading section\n";
+"Can't load driver %s without sarld\n";
+"Driver %s is larger than %d bytes and can't be loaded.\n";
diff --git a/i386/strings/English.lproj/NetInstall.strings b/i386/strings/English.lproj/NetInstall.strings
new file mode 100644 (file)
index 0000000..97d780d
--- /dev/null
@@ -0,0 +1,126 @@
+/* Informational messages */
+
+"Loading Rhapsody";
+"Loading %s\n";
+"Reading Rhapsody configuration";
+"Couldn't load standalone linker; unable to load boot drivers.\n";
+"Insert file system media and press Return";
+"Errors encountered while starting up the computer.\n";
+"Pausing %d seconds...\n";
+"Starting Rhapsody";
+"Can't find %s\n";
+"Couldn't start up the computer using this floppy disk.";
+"Error occurred while linking driver %s:\n%s";
+"Loading %s device driver.\n";
+"The driver was loaded successfully.\n";
+"An error occurred while loading the %s device driver.\n";
+"Press Return to continue.\n";
+"That driver has already been loaded.\n";
+"Searching for drivers\n";
+"Reading configuration file '%s'.\n";
+
+/* Warnings */
+
+"Config file \"%s\" not found\n";
+"System config file '%s' not found\n";
+"Loading binary for %s device driver.\n";
+"Warning: No active drivers specified in system config.\n";
+
+/* Install messages */
+
+"DRIVER_MESSAGE_1" = 
+"The floppy disk in the drive contains device drivers for the following SCSI
+adapters and hard disk controllers:\n";
+"DRIVER_INSTRUCTION_1" = 
+"Type the number for the SCSI adapter or hard disk controller that
+the hard disk you want to install Rhapsody on is connected to.
+(This may be the same SCSI adapter that your CD-ROM drive is connected to.)\n\n";
+"DRIVER_ALTERNATE_1" = 
+"If the driver for this device is on another disk, insert that disk in the
+floppy disk drive and type %d.\n";
+"DRIVER_QUIT_1" = "";
+"DRIVER_MESSAGE_2" =
+"The floppy disk in the drive contains device drivers for the following
+SCSI adapters, hard disk controllers, and network adapters:\n";
+"DRIVER_INSTRUCTION_2" = 
+"Type the number for the network adapter in your computer.\n\n";
+"DRIVER_ALTERNATE_2" =
+"If the driver for this device is on another disk, insert that disk in the
+floppy disk drive and type %d.\n";
+"DRIVER_QUIT_2" = "";
+"DRIVER_MESSAGE_3" = 
+"The floppy disk in the drive contains the following device drivers:\n";
+"DRIVER_INSTRUCTION_3" = 
+"Type the number for the device driver you need to install Rhapsody.\n\n";
+"DRIVER_ALTERNATE_3" = 
+"If the device driver you need to load is on another disk, insert it in
+the drive and type %d.\n\n";
+"DRIVER_QUIT_3" = "Type %d to continue without installing a device driver from this disk.\n";
+"DRIVER_QUESTION_3" =
+"Normally, you only need to load the device drivers for the adapters your
+CD-ROM drive and hard disk are connected to in order to install Rhapsody.
+Other drivers are loaded automatically.
+
+If you do need to load another device driver, insert the disk that contains it
+in the floppy disk drive.\n\n";
+
+"Really Install?" =
+"This program is for installing Rhapsody on a hard disk.
+THIS IS NOT AN UPGRADE: ANY EXISTING FILES WILL BE DELETED.
+
+If you have files on your hard disk that you want to keep,
+quit this program and copy what you want to keep onto another disk.
+
+Type 1 to prepare to install Rhapsody.
+Type 2 to quit this installation program.\n";
+
+"Type %d to view a list of additional device drivers on this disk.\n\n";
+
+"Insert Driver Disk" = 
+"Please insert the Rhapsody Device Drivers disk in the floppy disk drive
+and press Return.\n\n---> ";
+
+"Load Other Drivers?" =
+"Normally, you only need to load the device drivers for the adapters your
+CD-ROM drive and hard disk are connected to in order to install Rhapsody.
+Other drivers are loaded automatically from the Rhapsody CD-ROM.
+
+If you do need to load another device driver, insert the disk that contains it
+in the floppy disk drive.\n";
+
+"Missing Drivers:" =
+"When you began installing Rhapsody, you loaded one or more device drivers
+that were not on the Rhapsody CD-ROM:\n";
+
+"No Drivers On This Disk" =
+"There are no suitable device drivers on this floppy disk.
+Please insert a new disk and press Return.
+---> ";
+
+"Install Canceled" =
+"Installation canceled.  Eject the floppy disk and restart the computer.\n";
+
+"1 To Continue" =
+"Type 1 to continue without loading additional device drivers.\n";
+
+"2 To Load" =
+"Type 2 to load a device driver from the disk in the floppy disk drive.\n";
+
+"1 To Load Driver" =
+"Please insert the floppy disk that contains one or more of these device
+drivers and type 1.\n";
+
+"2 To Continue" =
+"Type 2 to continue without loading any of the device drivers in this list.\n";
+
+/* Somewhat obscure error messages */
+
+"Error loading %s\n";
+"Read error\n";
+"Error in standalone linker executable\n";
+"Fat binary file doesn't contain i386 code\n";
+"Unrecognized binary format\n";
+"Error reading commands\n";
+"Error loading section\n";
+"Can't load driver %s without sarld\n";
+"Driver %s is larger than %d bytes and can't be loaded.\n";
diff --git a/i386/strings/French.lproj/Localizable.strings b/i386/strings/French.lproj/Localizable.strings
new file mode 100644 (file)
index 0000000..3f81b62
--- /dev/null
@@ -0,0 +1,78 @@
+/* Informational messages */
+
+"Loading Rhapsody" = "Chargement de Rhapsody en cours";
+"Loading %s\n" = "Chargement de %s en cours\n";
+"Reading Rhapsody configuration" = "Lecture de la configuration de Rhapsody en cours";
+"Couldn't load standalone linker; unable to load boot drivers.\n" = "Impossible de charger le \"linker\" autonome: impossible de charger les drivers\nd'initialisation.\n";
+"Insert file system media and press Return" = "Inserez le disque du systeme de fichiers et appuyez sur Retour";
+"Errors encountered while starting up the computer.\n" = "Des erreurs se sont produites lors du lancement de l'ordinateur.\n";
+"Pausing %d seconds...\n" = "Pause de %d secondes...\n";
+"Starting Rhapsody" = "Demarrage de Rhapsody en cours";
+"Can't find %s\n" = "%s introuvable\n";
+"Couldn't start up the computer using this floppy disk." = "Impossible de lancer l'ordinateur a l'aide de cette disquette.";
+"Error occurred while linking driver %s:\n%s" = "Apparition d'une erreur lors de la liaison du driver %s :\n%s";
+"Loading %s device driver.\n" = "Chargement du driver de peripherique %s.\n";
+"The driver was loaded successfully.\n" = "Chargement du driver reussi.\n";
+"An error occurred while loading the %s device driver.\n" = "Erreur au cours du chargement du driver de peripherique %s.\n";
+"Press Return to continue.\n" = "Appuyez sur Retour pour continuer.\n";
+"That driver has already been loaded.\n" = "Ce driver a deja ete charge.\n";
+"Searching for drivers\n" = "Recherche des drivers en cours\n";
+"Reading configuration file '%s'.\n" = "Lecture du fichier de configuration '%s'.\n";
+
+/* Warnings */
+
+"Config file \"%s\" not found\n" = "Fichier de configuration \"%s\" introuvable\n";
+"System config file '%s' not found\n" = "Fichier de configuration du systeme '%s' introuvable\n";
+"Loading binary for %s device driver.\n" = "Chargement du programme en binaire pour %s driver de peripherique.\n";
+"Warning: No active drivers specified in system config.\n" = "Attention : aucun driver actif n'a ete specifie dans la configuration systeme.\n";
+
+/* Install messages */
+
+"DRIVER_MESSAGE_1" = "La disquette placee dans le lecteur contient des drivers de peripherique pour \nles adaptateurs SCSI suivants :\n";
+"DRIVER_INSTRUCTION_1" = "Entrez le numero de l'adaptateur SCSI auquel le lecteur de votre CD-ROM est \nconnecte.\n\n";
+"DRIVER_ALTERNATE_1" = "Si le driver de ce peripherique est sur un autre disque, inserez cette \ndisquette dans le lecteur et entrez %d.\n";
+"DRIVER_QUIT_1" = "";
+"DRIVER_MESSAGE_2" = "La disquette placee dans le lecteur contient des drivers de peripherique pour \nles adaptateurs SCSI et controleurs de disque dur suivants :\n";
+"DRIVER_INSTRUCTION_2" = "Entrez le numero de l'adaptateur SCSI ou du contreleur de disque dur auquel le \ndisque dur sur lequel vous voulez installer Rhapsody est connecte. (Il peut \ns'agir du meme adaptateur SCSI auquel celui de votre lecteur de CD-ROM est \nconnecte.)\n\n";
+"DRIVER_ALTERNATE_2" = "Si le driver de ce peripherique est sur une autre disquette, inserez-la dans \nle lecteur et entrez %d.\n";
+"DRIVER_QUIT_2" = "";
+"DRIVER_MESSAGE_3" = "La disquette placee dans le lecteur contient les drivers de peripheriques \nsuivants :\n";
+"DRIVER_INSTRUCTION_3" = "Entrez le numero pour le driver de peripherique pour lequel vous devez \ninstaller Rhapsody.\n\n";
+"DRIVER_ALTERNATE_3" = "Si le driver de peripherique que vous devez charger est sur une autre disquette,\ninserez-la dans le lecteur et entrez %d.\n\n";
+"DRIVER_QUIT_3" = "Entrez %d pour continuer sans installer de driver de peripherique a partir de\ncette disquette.\n";
+"DRIVER_QUESTION_3" = "Generalement, vous devez uniquement charger les drivers de peripherique pour\nles adaptateurs auxquels le lecteur de votre CD-ROM et votre disque dur sont \nconnectes pour installer Rhapsody.\nLes autres drivers sont charges automatiquement.\n\nSi vous devez charger un autre driver de peripherique, inserez la disquette sur\nlaquelle il est stocke dans le lecteur.\n\n";
+
+"Type %d to view a list of additional device drivers on this disk.\n\n" = 
+"Tapez %d pour afficher la liste des autres drivers de peripherique
+se trouvant sur ce disque.\n\n";
+
+"Really Install?" = "Ce programme vous permet d'installer Rhapsody sur un disque dur.\nIL NE S'AGIT PAS D'UNE MISE A NIVEAU : TOUS LES FICHIERS Rhapsody EXISTANTS\nSERONT SUPPRIMES.\n\nSi vous souhaitez conserver des fichiers stockes sur votre disque dur,\nquittez ce programme et copiez ce que vous souhaitez conserver sur un autre\ndisque.\n\nEntrez 1 pour vous preparer a installer Rhapsody.\nEntrez 2 pour quitter ce programme d'installation.\n";
+
+"Insert Driver Disk" = "Veuillez inserer la disquette des drivers de peripherique Rhapsody dans le\nlecteur et appuyez sur Retour.\n\n---> ";
+
+"Load Other Drivers?" = "Generalement, vous devez uniquement charger les drivers de peripherique pour\nles adaptateurs auxquels le lecteur de votre CD-ROM et votre disque dur sont\nconnectes pour installer Rhapsody.\nLes autres drivers sont charges automatiquement a partir du CD-ROM Rhapsody.\n\nSi vous devez charger un autre driver de peripherique, inserez la disquette sur\nlaquelle il est stocke dans le lecteur.\n\n";
+"Missing Drivers:" = "Lorsque vous avez commence l'installation de Rhapsody, vous avez charge un ou\nplusieurs drivers de peripherique qui n'etaient pas stockes sur le CD-ROM\nRhapsody :\n";
+
+"No Drivers On This Disk" = "Il n'existe pas de driver adequat sur cette disquette.\nVeuillez inserer une nouvelle disquette et appuyer sur Retour.\n---> ";
+
+"Install Canceled" = "Installation annulee.  Ejectez la disquette et redemarrez l'ordinateur.\n";
+
+"1 To Continue" = "Entrez 1 pour continuer sans charger de driver de peripherique supplementaire.\n";
+
+"2 To Load" = "Entrez 2 pour charger un driver de peripherique stocke sur la disquette inseree\ndans le lecteur.\n";
+
+"1 To Load Driver" = "Veuillez inserer la disquette sur laquelle est stockee un ou plusieurs de ces\ndrivers de peripherique et entrez 1.\n";
+
+"2 To Continue" = "Entrez 2 pour continuer sans charger de driver de peripherique affiche de cette\nliste.\n";
+
+/* Somewhat obscure error messages */
+
+"Error loading %s\n" = "Erreur de chargement de %s\n";
+"Read error\n" = "Erreur de lecture\n";
+"Error in standalone linker executable\n" = "Erreur dans le programme d'execution du \"linker\" autonome\n";
+"Fat binary file doesn't contain i386 code\n" = "Le fichier Fat Binary ne contient pas le code i386\n";
+"Unrecognized binary format\n" = "Format binaire inconnu\n";
+"Error reading commands\n" = "Erreur de lecture des commandes\n";
+"Error loading section\n" = "Erreur de chargement de section\n";
+"Can't load driver %s without sarld\n" = "Impossible de charger le driver %s sans le programme sarld\n";
+"Driver %s is larger than %d bytes and can't be loaded.\n" = "La taille du driver %s depasse %d octets : impossible de le charger.\n";
diff --git a/i386/strings/French.lproj/NetInstall.strings b/i386/strings/French.lproj/NetInstall.strings
new file mode 100644 (file)
index 0000000..9a65c30
--- /dev/null
@@ -0,0 +1,78 @@
+/* Informational messages */
+
+"Loading Rhapsody" = "Chargement de Rhapsody en cours";
+"Loading %s\n" = "Chargement de %s en cours\n";
+"Reading Rhapsody configuration" = "Lecture de la configuration de Rhapsody en cours";
+"Couldn't load standalone linker; unable to load boot drivers.\n" = "Impossible de charger le \"linker\" autonome: impossible de charger les drivers\nd'initialisation.\n";
+"Insert file system media and press Return" = "Inserez le disque du systeme de fichiers et appuyez sur Retour";
+"Errors encountered while starting up the computer.\n" = "Des erreurs se sont produites lors du lancement de l'ordinateur.\n";
+"Pausing %d seconds...\n" = "Pause de %d secondes...\n";
+"Starting Rhapsody" = "Demarrage de Rhapsody en cours";
+"Can't find %s\n" = "%s introuvable\n";
+"Couldn't start up the computer using this floppy disk." = "Impossible de lancer l'ordinateur a l'aide de cette disquette.";
+"Error occurred while linking driver %s:\n%s" = "Apparition d'une erreur lors de la liaison du driver %s :\n%s";
+"Loading %s device driver.\n" = "Chargement du driver de peripherique %s.\n";
+"The driver was loaded successfully.\n" = "Chargement du driver reussi.\n";
+"An error occurred while loading the %s device driver.\n" = "Erreur au cours du chargement du driver de peripherique %s.\n";
+"Press Return to continue.\n" = "Appuyez sur Retour pour continuer.\n";
+"That driver has already been loaded.\n" = "Ce driver a deja ete charge.\n";
+"Searching for drivers\n" = "Recherche des drivers en cours\n";
+"Reading configuration file '%s'.\n" = "Lecture du fichier de configuration '%s'.\n";
+
+/* Warnings */
+
+"Config file \"%s\" not found\n" = "Fichier de configuration \"%s\" introuvable\n";
+"System config file '%s' not found\n" = "Fichier de configuration du systeme '%s' introuvable\n";
+"Loading binary for %s device driver.\n" = "Chargement du programme en binaire pour %s driver de peripherique.\n";
+"Warning: No active drivers specified in system config.\n" = "Attention : aucun driver actif n'a ete specifie dans la configuration systeme.\n";
+
+/* Install messages */
+
+"DRIVER_MESSAGE_1" = "La disquette inseree dans le lecteur contient des drivers de peripherique pour\nles adaptateurs SCSI, les controleurs de disque dur et les adaptateurs reseaux \nsuivants :\n";
+"DRIVER_INSTRUCTION_1" = "Entrez le numero de l'adaptateur reseau de votre ordinateur.\n\n";
+"DRIVER_ALTERNATE_1" = "Si le driver de ce peripherique est sur un autre disque, inserez cette \ndisquette dans le lecteur et entrez %d.\n";
+"DRIVER_QUIT_1" = "";
+"DRIVER_MESSAGE_2" = "La disquette placee dans le lecteur contient des drivers de peripherique pour \nles adaptateurs SCSI et controleurs de disque dur suivants :\n";
+"DRIVER_INSTRUCTION_2" = "Entrez le numero de l'adaptateur SCSI ou du contreleur de disque dur auquel le \ndisque dur sur lequel vous voulez installer Rhapsody est connecte. (Il peut \ns'agir du meme adaptateur SCSI auquel celui de votre lecteur de CD-ROM est \nconnecte.)\n\n";
+"DRIVER_ALTERNATE_2" = "Si le driver de ce peripherique est sur une autre disquette, inserez-la dans \nle lecteur et entrez %d.\n";
+"DRIVER_QUIT_2" = "";
+"DRIVER_MESSAGE_3" = "La disquette placee dans le lecteur contient les drivers de peripheriques \nsuivants :\n";
+"DRIVER_INSTRUCTION_3" = "Entrez le numero pour le driver de peripherique pour lequel vous devez \ninstaller Rhapsody.\n\n";
+"DRIVER_ALTERNATE_3" = "Si le driver de peripherique que vous devez charger est sur une autre disquette,\ninserez-la dans le lecteur et entrez %d.\n\n";
+"DRIVER_QUIT_3" = "Entrez %d pour continuer sans installer de driver de peripherique a partir de\ncette disquette.\n";
+"DRIVER_QUESTION_3" = "Generalement, vous devez uniquement charger les drivers de peripherique pour\nles adaptateurs auxquels le lecteur de votre CD-ROM et votre disque dur sont \nconnectes pour installer Rhapsody.\nLes autres drivers sont charges automatiquement.\n\nSi vous devez charger un autre driver de peripherique, inserez la disquette sur\nlaquelle il est stocke dans le lecteur.\n\n";
+
+"Type %d to view a list of additional device drivers on this disk.\n\n" = 
+"Tapez %d pour afficher la liste des autres drivers de peripherique
+se trouvant sur ce disque.\n\n";
+
+"Really Install?" = "Ce programme vous permet d'installer Rhapsody sur un disque dur.\nIL NE S'AGIT PAS D'UNE MISE A NIVEAU : TOUS LES FICHIERS Rhapsody EXISTANTS\nSERONT SUPPRIMES.\n\nSi vous souhaitez conserver des fichiers stockes sur votre disque dur,\nquittez ce programme et copiez ce que vous souhaitez conserver sur un autre\ndisque.\n\nEntrez 1 pour vous preparer a installer Rhapsody.\nEntrez 2 pour quitter ce programme d'installation.\n";
+
+"Insert Driver Disk" = "Veuillez inserer la disquette des drivers de peripherique Rhapsody dans le\nlecteur et appuyez sur Retour.\n\n---> ";
+
+"Load Other Drivers?" = "Generalement, vous devez uniquement charger les drivers de peripherique pour\nles adaptateurs auxquels le lecteur de votre CD-ROM et votre disque dur sont\nconnectes pour installer Rhapsody.\nLes autres drivers sont charges automatiquement a partir du CD-ROM Rhapsody.\n\nSi vous devez charger un autre driver de peripherique, inserez la disquette sur\nlaquelle il est stocke dans le lecteur.\n\n";
+"Missing Drivers:" = "Lorsque vous avez commence l'installation de Rhapsody, vous avez charge un ou\nplusieurs drivers de peripherique qui n'etaient pas stockes sur le CD-ROM\nRhapsody :\n";
+
+"No Drivers On This Disk" = "Il n'existe pas de driver adequat sur cette disquette.\nVeuillez inserer une nouvelle disquette et appuyer sur Retour.\n---> ";
+
+"Install Canceled" = "Installation annulee.  Ejectez la disquette et redemarrez l'ordinateur.\n";
+
+"1 To Continue" = "Entrez 1 pour continuer sans charger de driver de peripherique supplementaire.\n";
+
+"2 To Load" = "Entrez 2 pour charger un driver de peripherique stocke sur la disquette inseree\ndans le lecteur.\n";
+
+"1 To Load Driver" = "Veuillez inserer la disquette sur laquelle est stockee un ou plusieurs de ces\ndrivers de peripherique et entrez 1.\n";
+
+"2 To Continue" = "Entrez 2 pour continuer sans charger de driver de peripherique affiche de cette\nliste.\n";
+
+/* Somewhat obscure error messages */
+
+"Error loading %s\n" = "Erreur de chargement de %s\n";
+"Read error\n" = "Erreur de lecture\n";
+"Error in standalone linker executable\n" = "Erreur dans le programme d'execution du \"linker\" autonome\n";
+"Fat binary file doesn't contain i386 code\n" = "Le fichier Fat Binary ne contient pas le code i386\n";
+"Unrecognized binary format\n" = "Format binaire inconnu\n";
+"Error reading commands\n" = "Erreur de lecture des commandes\n";
+"Error loading section\n" = "Erreur de chargement de section\n";
+"Can't load driver %s without sarld\n" = "Impossible de charger le driver %s sans le programme sarld\n";
+"Driver %s is larger than %d bytes and can't be loaded.\n" = "La taille du driver %s depasse %d octets : impossible de le charger.\n";
diff --git a/i386/strings/German.lproj/Localizable.strings b/i386/strings/German.lproj/Localizable.strings
new file mode 100644 (file)
index 0000000..597f0b0
--- /dev/null
@@ -0,0 +1,79 @@
+/* Informational messages */
+
+"Loading Rhapsody" = "Lade Rhapsody";
+"Loading %s\n" = "Lade %s\n";
+"Reading Rhapsody configuration" = "Lese Rhapsody-Konfiguration";
+"Couldn't load standalone linker; unable to load boot drivers.\n" = "Konnte Standalone-\"linker\" nicht laden; Start-Treiber konnten nicht geladen\nwerden.\n";
+"Insert file system media and press Return" = "Legen Sie die Disk fuer das Dateisystem ein und druecken Sie die Return-Taste.";
+"Errors encountered while starting up the computer.\n" = "Waehrend des Systemstarts ist ein Fehler aufgetreten.\n";
+"Pausing %d seconds...\n" = "Unterbreche %d Sekunden lang...\n";
+"Starting Rhapsody" = "Starte Rhapsody";
+"Can't find %s\n" = "%s\n konnte nicht gefunden werden";
+"Couldn't start up the computer using this floppy disk." = "Konnte den Computer nicht mit dieser Diskette starten.";
+"Error occurred while linking driver %s:\n%s" = "Bei der Verbindung des Treibers %s ist ein Fehler aufgetreten:\n%s";
+"Loading %s device driver.\n" = "Lade %s Geraetetreiber.\n";
+"The driver was loaded successfully.\n" = "Der Treiber wurde erfolgreich geladen.\n";
+"An error occurred while loading the %s device driver.\n" = "Fehler beim Laden des %s Geraetetreibers.\n";
+"Press Return to continue.\n" = "Druecken Sie die Return-Taste, um fortzusetzen.\n";
+"That driver has already been loaded.\n" = "Dieser Treiber wurde bereits geladen.\n";
+"Searching for drivers\n" = "Suche nach Treibern\n";
+"Reading configuration file '%s'.\n" = "Lese Konfigurationsdatei '%s'.\n";
+
+/* Warnings */
+
+"Config file \"%s\" not found\n" = "Kann Konfigurations-Datei \"%s\" nicht finden\n";
+"System config file '%s' not found\n" = "Kann Systemkonfigurations-Datei \"%s\" nicht finden\n";
+"Loading binary for %s device driver.\n" = "Lade binaer fuer %s Geraetetreiber.\n";
+"Warning: No active drivers specified in system config.\n" = "Achtung: Es wurden keine aktiven Treiber in der Systemkonfiguration angegeben.\n";
+
+/* Install messages */
+
+"DRIVER_MESSAGE_1" = "Die Diskette im Laufwerk enthaelt Geraetetreiber fuer die folgenden\nSCSI-Adapter:\n";
+"DRIVER_INSTRUCTION_1" = "Geben Sie die Nummer fuer den SCSI-Adapter ein, an den Ihr CD-ROM-Laufwerk\nangeschlossen ist.\n\n";
+"DRIVER_ALTERNATE_1" = "Wenn sich der Treiber fuer dieses Geraet auf einer anderen Diskette befindet,\nlegen Sie diese Diskette in das Diskettenlaufwerk ein und geben Sie %d ein.\n";
+"DRIVER_QUIT_1" = "";
+"DRIVER_MESSAGE_2" = "Die Diskette im Laufwerk enthaelt Geraetetreiber fuer die folgenden\nSCSI-Adapter und Festplatten-Controller:\n";
+"DRIVER_INSTRUCTION_2" = "Geben Sie die Nummer fuer den SCSI-Adapter oder den Festplatten-Controller ein,\nan den die Festplatte angeschlossen ist, auf der Sie Rhapsody installieren\nmoechten. (Hierbei kann es sich um denselben SCSI-Adapter handeln, an den\nIhr CD-ROM-Laufwerk angeschlossen ist.)\n\n";
+"DRIVER_ALTERNATE_2" = "Wenn sich der Treiber fuer dieses Geraet auf einer anderen Diskette befindet,\nlegen Sie diese Diskette in das Laufwerk ein und geben Sie %d  ein.";
+"DRIVER_QUIT_2" = "";
+"DRIVER_MESSAGE_3" = "Die Diskette im Laufwerk enthaelt die folgenden Geraetetreiber:\n";
+"DRIVER_INSTRUCTION_3" = "Geben Sie die Nummer des Geraetetreibers fuer die Installation von Rhapsody ein.  \n";
+"DRIVER_ALTERNATE_3" = "Wenn sich der Geraetetreiber, den Sie laden muessen, auf einer anderen Diskette\nbefindet, legen Sie sie in das Laufwerk ein und geben Sie %d.\n\n";
+"DRIVER_QUIT_3" = "Geben Sie %d ein, um fortzufahren, ohne den Geraetetreiber  von der Diskette zu\ninstallieren.\n";
+"DRIVER_QUESTION_3" = "Normalerweise muessen Sie nur die Geraetetreiber fuer die Adapter laden, an die\nIhr CD-ROM-Laufwerk und Ihre Festplatte angeschlossen sind, um  Rhapsody zu\ninstallieren. Andere Treiber werden automatisch geladen.\n\nWenn Sie dennoch andere Geraetetreiber laden muessen, legen Sie die\nentsprechende Diskette in das Diskettenlaufwerk ein.\n\n";
+
+"Type %d to view a list of additional device drivers on this disk.\n\n" = 
+"Geben Sie %d ein, um eine Liste zusaetzlicher Geraetetreiber
+auf dieser Disk einzusehen.\n\n";
+
+"Really Install?" = "Dieses Programm installiert Rhapsody auf einer Festplatte.\nDIES IST KEIN UPGRADE: ALLE EXISTIERENDEN Rhapsody-DATEIEN WERDEN GELOSCHT.\n\nWenn Sie bestimmte Dateien auf Ihrer Festplatte behalten moechten,\nverlassen Sie das Programm und kopieren Sie die gewuenschten Dateien\nauf eine andere Platte.\n\nGeben Sie 1 ein, um die Installation von Rhapsody vorzubereiten.\nGeben Sie 2 ein, um dieses Installationsprogramm zu verlassen.\n";
+
+"Insert Driver Disk" = "Bitte legen Sie die Rhapsody-Geraetetreiberdiskette in das Laufwerk ein\nund druecken Sie die Return-Taste.\n\n---> ";
+
+"Load Other Drivers?" = "Normalerweise muessen Sie nur die Geraetetreiber fuer die Adapter installieren,\nan die Ihr CD-ROM-Laufwerk und Festplatte angeschlossen sind, um Rhapsody zu\ninstallieren. Andere Treiber werden automatisch von der Rhapsody CD-ROM geladen.\n\nWenn Sie dennoch andere Geraetetreiber laden muessen, legen Sie die\nentsprechende Diskette in das Laufwerk ein.\n";
+
+"Missing Drivers:" = "Als Sie mit der Installation von Rhapsody begonnen haben, haben Sie einen\noder mehrere Geraetetreiber geladen, die sich nicht auf der Rhapsody CD-ROM\nbefinden:\n";
+
+"No Drivers On This Disk" = "Auf dieser Diskette befinden sich keine geeigneten Geraetetreiber.\nLegen Sie bitte eine neue Diskette ein und druecken Sie die Return-Taste.\n---> ";
+
+"Install Canceled" = "Installation abgebrochen. Werfen Sie die Diskette aus und starten Sie den\nComputer neu.\n";
+
+"1 To Continue" = "Geben Sie 1 ein, um fortzufahren, ohne zusaetzliche Geraetetreiber zu laden.\n";
+
+"2 To Load" = "Geben Sie 2 ein, um einen Geraetetreiber von der Diskette im Laufwerk zu laden.\n";
+
+"1 To Load Driver" = "Bitte legen Sie die Diskette ein, die einen oder mehrere dieser Geraetetreiber\nenthaelt und geben Sie 1 ein.\n";
+
+"2 To Continue" = "Geben Sie 2 ein, um fortzufahren, ohne einen Geraetetreiber aus dieser Liste\nzu laden.\n";
+
+/* Somewhat obscure error messages */
+
+"Error loading %s\n" = "Beim Laden von %s ist ein Fehler aufgetreten\n";
+"Read error\n" = "Lesefehler\n";
+"Error in standalone linker executable\n" = "Im Standalone-\"linker\"-Programm ist ein Fehler aufgetreten\n";
+"Fat binary file doesn't contain i386 code\n" = "\"Fat binary\"-Datei enthaelt keinen i386-Code";
+"Unrecognized binary format\n" = "Binaerformat nicht erkennbar\n";
+"Error reading commands\n" = "Beim Lesen der Befehle ist ein Fehler aufgetreten\n";
+"Error loading section\n" = "Beim Laden des Abschnittes ist ein Fehler aufgetreten\n";
+"Can't load driver %s without sarld\n" = "Konnte Treiber %s ohne sarld nicht laden\n";
+"Driver %s is larger than %d bytes and can't be loaded.\n" = "Treiber %s ist groesser als %d Bytes und konnte nicht geladen werden.\n";
diff --git a/i386/strings/German.lproj/NetInstall.strings b/i386/strings/German.lproj/NetInstall.strings
new file mode 100644 (file)
index 0000000..3ec4aee
--- /dev/null
@@ -0,0 +1,79 @@
+/* Informational messages */
+
+"Loading Rhapsody" = "Lade Rhapsody";
+"Loading %s\n" = "Lade %s\n";
+"Reading Rhapsody configuration" = "Lese Rhapsody-Konfiguration";
+"Couldn't load standalone linker; unable to load boot drivers.\n" = "Konnte Standalone-\"linker\" nicht laden; Start-Treiber konnten nicht geladen\nwerden.\n";
+"Insert file system media and press Return" = "Legen Sie die Disk fuer das Dateisystem ein und druecken Sie die Return-Taste.";
+"Errors encountered while starting up the computer.\n" = "Waehrend des Systemstarts ist ein Fehler aufgetreten.\n";
+"Pausing %d seconds...\n" = "Unterbreche %d Sekunden lang...\n";
+"Starting Rhapsody" = "Starte Rhapsody";
+"Can't find %s\n" = "%s\n konnte nicht gefunden werden";
+"Couldn't start up the computer using this floppy disk." = "Konnte den Computer nicht mit dieser Diskette starten.";
+"Error occurred while linking driver %s:\n%s" = "Bei der Verbindung des Treibers %s ist ein Fehler aufgetreten:\n%s";
+"Loading %s device driver.\n" = "Lade %s Geraetetreiber.\n";
+"The driver was loaded successfully.\n" = "Der Treiber wurde erfolgreich geladen.\n";
+"An error occurred while loading the %s device driver.\n" = "Fehler beim Laden des %s Geraetetreibers.\n";
+"Press Return to continue.\n" = "Druecken Sie die Return-Taste, um fortzusetzen.\n";
+"That driver has already been loaded.\n" = "Dieser Treiber wurde bereits geladen.\n";
+"Searching for drivers\n" = "Suche nach Treibern\n";
+"Reading configuration file '%s'.\n" = "Lese Konfigurationsdatei '%s'.\n";
+
+/* Warnings */
+
+"Config file \"%s\" not found\n" = "Kann Konfigurations-Datei \"%s\" nicht finden\n";
+"System config file '%s' not found\n" = "Kann Systemkonfigurations-Datei \"%s\" nicht finden\n";
+"Loading binary for %s device driver.\n" = "Lade binaer fuer %s Geraetetreiber.\n";
+"Warning: No active drivers specified in system config.\n" = "Achtung: Es wurden keine aktiven Treiber in der Systemkonfiguration angegeben.\n";
+
+/* Install messages */
+
+"DRIVER_MESSAGE_1" = "Die Diskette im Laufwerk enthaelt Geraetetreiber fuer die folgenden\nSCIS-Adapter, Festplatten-Controller und Netzwerkadapter:\n";
+"DRIVER_INSTRUCTION_1" = "Geben Sie die Nummer fuer den Netzwerkadapter in Ihrem Computer ein.\n\n";
+"DRIVER_ALTERNATE_1" = "Wenn sich der Treiber fuer dieses Geraet auf einer anderen Diskette befindet,\nlegen Sie diese Diskette in das Diskettenlaufwerk ein und geben Sie %d ein.\n";
+"DRIVER_QUIT_1" = "";
+"DRIVER_MESSAGE_2" = "Die Diskette im Laufwerk enthaelt Geraetetreiber fuer die folgenden\nSCSI-Adapter und Festplatten-Controller:\n";
+"DRIVER_INSTRUCTION_2" = "Geben Sie die Nummer fuer den SCSI-Adapter oder den Festplatten-Controller ein,\nan den die Festplatte angeschlossen ist, auf der Sie Rhapsody installieren\nmoechten. (Hierbei kann es sich um denselben SCSI-Adapter handeln, an den\nIhr CD-ROM-Laufwerk angeschlossen ist.)\n\n";
+"DRIVER_ALTERNATE_2" = "Wenn sich der Treiber fuer dieses Geraet auf einer anderen Diskette befindet,\nlegen Sie diese Diskette in das Laufwerk ein und geben Sie %d ein.";
+"DRIVER_QUIT_2" = "";
+"DRIVER_MESSAGE_3" = "Die Diskette im Laufwerk enthaelt die folgenden Geraetetreiber:\n";
+"DRIVER_INSTRUCTION_3" = "Geben Sie die Nummer des Geraetetreibers fuer die Installation von Rhapsody ein.  \n";
+"DRIVER_ALTERNATE_3" = "Wenn sich der Geraetetreiber, den Sie laden muessen, auf einer anderen Diskette\nbefindet, legen Sie sie in das Laufwerk ein und geben Sie %d.\n\n";
+"DRIVER_QUIT_3" = "Geben Sie %d ein, um fortzufahren, ohne den Geraetetreiber  von der Diskette zu\ninstallieren.\n";
+"DRIVER_QUESTION_3" = "Normalerweise muessen Sie nur die Geraetetreiber fuer die Adapter laden, an die\nIhr CD-ROM-Laufwerk und Ihre Festplatte angeschlossen sind, um  Rhapsody zu\ninstallieren. Andere Treiber werden automatisch geladen.\n\nWenn Sie dennoch andere Geraetetreiber laden muessen, legen Sie die\nentsprechende Diskette in das Diskettenlaufwerk ein.\n\n";
+
+"Type %d to view a list of additional device drivers on this disk.\n\n"= 
+"Geben Sie %d ein, um eine Liste zusaetzlicher Geraetetreiber
+auf dieser Disk einzusehen.\n\n";
+
+"Really Install?" = "Dieses Programm installiert Rhapsody auf einer Festplatte.\nDIES IST KEIN UPGRADE: ALLE EXISTIERENDEN Rhapsody-DATEIEN WERDEN GELOSCHT.\n\nWenn Sie bestimmte Dateien auf Ihrer Festplatte behalten moechten,\nverlassen Sie das Programm und kopieren Sie die gewuenschten Dateien\nauf eine andere Platte.\n\nGeben Sie 1 ein, um die Installation von Rhapsody vorzubereiten.\nGeben Sie 2 ein, um dieses Installationsprogramm zu verlassen.\n";
+
+"Insert Driver Disk" = "Bitte legen Sie die Rhapsody-Geraetetreiberdiskette in das Laufwerk ein\nund druecken Sie die Return-Taste.\n\n---> ";
+
+"Load Other Drivers?" = "Normalerweise muessen Sie nur die Geraetetreiber fuer die Adapter installieren,\nan die Ihr CD-ROM-Laufwerk und Festplatte angeschlossen sind, um Rhapsody zu\ninstallieren. Andere Treiber werden automatisch von der Rhapsody CD-ROM geladen.\n\nWenn Sie dennoch andere Geraetetreiber laden muessen, legen Sie die\nentsprechende Diskette in das Laufwerk ein.\n";
+
+"Missing Drivers:" = "Als Sie mit der Installation von Rhapsody begonnen haben, haben Sie einen\noder mehrere Geraetetreiber geladen, die sich nicht auf der Rhapsody CD-ROM\nbefinden:\n";
+
+"No Drivers On This Disk" = "Auf dieser Diskette befinden sich keine geeigneten Geraetetreiber.\nLegen Sie bitte eine neue Diskette ein und druecken Sie die Return-Taste.\n---> ";
+
+"Install Canceled" = "Installation abgebrochen. Werfen Sie die Diskette aus und starten Sie den\nComputer neu.\n";
+
+"1 To Continue" = "Geben Sie 1 ein, um fortzufahren, ohne zusaetzliche Geraetetreiber zu laden.\n";
+
+"2 To Load" = "Geben Sie 2 ein, um einen Geraetetreiber von der Diskette im Laufwerk zu laden.\n";
+
+"1 To Load Driver" = "Bitte legen Sie die Diskette ein, die einen oder mehrere dieser Geraetetreiber\nenthaelt und geben Sie 1 ein.\n";
+
+"2 To Continue" = "Geben Sie 2 ein, um fortzufahren, ohne einen Geraetetreiber aus dieser Liste\nzu laden.\n";
+
+/* Somewhat obscure error messages */
+
+"Error loading %s\n" = "Beim Laden von %s ist ein Fehler aufgetreten\n";
+"Read error\n" = "Lesefehler\n";
+"Error in standalone linker executable\n" = "Im Standalone-\"linker\"-Programm ist ein Fehler aufgetreten\n";
+"Fat binary file doesn't contain i386 code\n" = "\"Fat binary\"-Datei enthaelt keinen i386-Code";
+"Unrecognized binary format\n" = "Binaerformat nicht erkennbar\n";
+"Error reading commands\n" = "Beim Lesen der Befehle ist ein Fehler aufgetreten\n";
+"Error loading section\n" = "Beim Laden des Abschnittes ist ein Fehler aufgetreten\n";
+"Can't load driver %s without sarld\n" = "Konnte Treiber %s ohne sarld nicht laden\n";
+"Driver %s is larger than %d bytes and can't be loaded.\n" = "Treiber %s ist groesser als %d Bytes und konnte nicht geladen werden.\n";
diff --git a/i386/strings/Italian.lproj/Localizable.strings b/i386/strings/Italian.lproj/Localizable.strings
new file mode 100644 (file)
index 0000000..cb1cb0e
--- /dev/null
@@ -0,0 +1,79 @@
+/* Informational messages */
+
+"Loading Rhapsody" = "Caricamento di Rhapsody";
+"Loading %s\n" = "Caricamento di %s\n";
+"Reading Rhapsody configuration" = "Lettura della configurazione di Rhapsody";
+"Couldn't load standalone linker; unable to load boot drivers.\n" = "Impossibile caricare linker autonomo: impossibile caricare driver di avviamento.\n";
+"Insert file system media and press Return" = "Introduci il disco col sistema di file e premi Invio";
+"Errors encountered while starting up the computer.\n" = "Sono stati rilevati errori durante l'avviamento del computer.\n";
+"Pausing %d seconds...\n" = "Pausa di %d secondi\n";
+"Starting Rhapsody" = "Avviamento di Rhapsody";
+"Can't find %s\n" = "%s\n non trovato\n";
+"Couldn't start up the computer using this floppy disk." = "Impossibile avviare il computer tramite questo disco flessibile.";
+"Error occurred while linking driver %s:\n%s" = "Errore durante la creazione del legame per il driver %s:\n%s";
+"Loading %s device driver.\n" = "Caricamento del driver di dispositivo %s\n";
+"The driver was loaded successfully.\n" = "Caricamento del driver riuscito.\n";
+"An error occurred while loading the %s device driver.\n" = "Si e verificato un errore durante il caricamento del driver di dispositivo %s.\n";
+"Press Return to continue.\n" = "Per continuare, premi Invio.\n";
+"That driver has already been loaded.\n" = "Questo driver e gia stato caricato.\n";
+"Searching for drivers\n" = "Ricerca dei driver\n";
+"Reading configuration file '%s'.\n" = "Lettura del file di configurazione '%s' in corso.\n";
+
+/* Warnings */
+
+"Config file \"%s\" not found\n" = "File di configurazione \"%s\" non trovato\n";
+"System config file '%s' not found\n" = "File di configurazione del sistema '%s' non trovato\n";
+"Loading binary for %s device driver.\n" = "Caricamento del file binario per il driver di dispositivo %s.\n";
+"Warning: No active drivers specified in system config.\n" = "Attenzione: nessun driver attivo indicato nella configurazione del sistema.\n";
+
+/* Install messages */
+
+"DRIVER_MESSAGE_1" = "Il disco flessibile nell'unita contiene driver per i seguenti adattattori SCSI:\n";
+"DRIVER_INSTRUCTION_1" = "Inserire il numero dell'adattatore SCSI al quale e collegata l'unita CD-ROM.\n\n";
+"DRIVER_ALTERNATE_1" = "Se il driver per questo dispositivo si trova su un altro disco,\ninserirlo nell'unita disco flessibile e digitare %d.\n";
+"DRIVER_QUIT_1" = "";
+"DRIVER_MESSAGE_2" = "Il disco flessibile nell'unita contiene driver per i seguenti adattattori\nSCSI e controllori per disco fisso:\n";
+"DRIVER_INSTRUCTION_2" = "Inserire il numero dell'adattatore SCSI o del controllore per disco fisso al\nquale e collegato il disco fisso sul quale si desidera installare Rhapsody.\n(Puo trattarsi dello stesso adattatore SCSI al quale e collegata l'unita\nCD-ROM.)\n\n";
+"DRIVER_ALTERNATE_2" = "Se il driver per questo dispositivo si trova su un altro disco,\ninserirlo nell'unita disco flessibile e digitare %d.\n";
+"DRIVER_QUIT_2" = "";
+"DRIVER_MESSAGE_3" = "Il disco flessibile nell'unita contiene i seguenti driver di dispositivo:\n";
+"DRIVER_INSTRUCTION_3" = "Inserire il numero del driver di dispositivo sul quale si desidera installare\nRhapsody.\n\n";
+"DRIVER_ALTERNATE_3" = "Se il driver per questo dispositivo si trova su un altro disco,\ninserirlo nell'unita disco flessibile e digitare %d.\n";
+"DRIVER_QUIT_3" = "Digitare %d per continuare senza installare un driver di dispositivo da questo\ndisco.\n";
+"DRIVER_QUESTION_3" = "In genere, per installare Rhapsody e sufficiente caricare i driver di\ndispositivo per gli adattatori ai quali sono collegati il CD-ROM e il disco\nrigido. Gli altri driver vengono caricati automaticamente.\n\nSe fosse necessario caricare un altro driver di dispositivo, inserire il\nrelativo disco nell'unita disco flessibile.\n\n";
+
+"Type %d to view a list of additional device drivers on this disk.\n\n" = 
+"Digita %d per visualizzare la lista dei driver di dispositivo
+addizionali contenuti in questo disco.\n\n";
+
+"Really Install?" = "Questo programma consente di installare Rhapsody su un diosco fisso.\nQUESTO NON E' UN AGGIORNAMENTO: TUTTI I FILE Rhapsody ESISTENTI VERRANNO\nCANCELLATI.\n\nSe si desidera conservare alcuni file, uscire da questo programma e copiare i\nfile che si desidera conservare su un altro disco.\n\nDigitare 1 per iniziare la preparazione all'installazione di Rhapsody.\nDigitare 2 per uscire da questo progrmma di installazione.\n";
+
+"Insert Driver Disk" = "Inserire il dischetto dei dirver di dispositivo Rhapsody nell'unita disco\nflessibile e premere Invio.\n\n---> ";
+
+"Load Other Drivers?" = "In genere, per installare Rhapsody e sufficiente caricare i driver di\ndispositivo per gli adattatori ai quali sono collegati il CD-ROM e il disco\nrigido. Gli altri driver vengono caricati automaticamente dal CD-ROM Rhapsody.\n\nSe fosse necessario caricare un altro driver di dispositivo, inserire il\nrelativo disco nell'unita disco flessibile.\n";
+
+"Missing Drivers:" = "All'inizio dell'installazione di Rhapsody sono stati caricati uno o piu driver\ndi dispositivo che non si trovavano sul CD-ROM Rhapsody:\n";
+
+"No Drivers On This Disk" = "Questo disco non contiene driver di dispositivo adatti.\nInserire un nuovo dischetto e premere Invio.\n---> ";
+
+"Install Canceled" = "Installazione annullata.  Estrarre il disco flessibile e riavviare il computer.\n";
+
+"1 To Continue" = "Digitare 1 per continuare senza caricare driver di dispositivo supplementari.\n";
+
+"2 To Load" = "Digitare 2 per  caricare un  driver di dispositivo dal dischetto nell'unita\ndisco flessibile.\n";
+
+"1 To Load Driver" = "Inserire il dischetto contenente uno o piu di questi driver di dispositivo\ne digitare 1.\n";
+
+"2 To Continue" = "Digitare 2 per continuare senza caricare driver di dispositivo in questo elenco.\n";
+
+/* Somewhat obscure error messages */
+
+"Error loading %s\n" = "Errore durante il caricamento di %s\n";
+"Read error\n" = "Errore di lettura\n";
+"Error in standalone linker executable\n" = "Errore nel programma eseguibile del linker autonomo\n";
+"Fat binary file doesn't contain i386 code\n" = "Il file fat binary non contiene il codice i386\n";
+"Unrecognized binary format\n" = "Formato binario non riconosciuto\n";
+"Error reading commands\n" = "Errore durante la lettura dei comandi\n";
+"Error loading section\n" = "Errore durante il caricamento della sezione\n";
+"Can't load driver %s without sarld\n" = "Impossibile caricare il driver %s senza sarld\n";
+"Driver %s is larger than %d bytes and can't be loaded.\n" = "Il driver %s supera %d byte. Impossibile caricarlo.\n";
diff --git a/i386/strings/Italian.lproj/NetInstall.strings b/i386/strings/Italian.lproj/NetInstall.strings
new file mode 100644 (file)
index 0000000..ce1fb2a
--- /dev/null
@@ -0,0 +1,79 @@
+/* Informational messages */
+
+"Loading Rhapsody" = "Caricamento di Rhapsody";
+"Loading %s\n" = "Caricamento di %s\n";
+"Reading Rhapsody configuration" = "Lettura della configurazione di Rhapsody";
+"Couldn't load standalone linker; unable to load boot drivers.\n" = "Impossibile caricare linker autonomo: impossibile caricare driver di avviamento.\n";
+"Insert file system media and press Return" = "Introduci il disco col sistema di file e premi Invio";
+"Errors encountered while starting up the computer.\n" = "Sono stati rilevati errori durante l'avviamento del computer.\n";
+"Pausing %d seconds...\n" = "Pausa di %d secondi\n";
+"Starting Rhapsody" = "Avviamento di Rhapsody";
+"Can't find %s\n" = "%s\n non trovato\n";
+"Couldn't start up the computer using this floppy disk." = "Impossibile avviare il computer tramite questo disco flessibile.";
+"Error occurred while linking driver %s:\n%s" = "Errore durante la creazione del legame per il driver %s:\n%s";
+"Loading %s device driver.\n" = "Caricamento del driver di dispositivo %s\n";
+"The driver was loaded successfully.\n" = "Caricamento del driver riuscito.\n";
+"An error occurred while loading the %s device driver.\n" = "Si e verificato un errore durante il caricamento del driver di dispositivo %s.\n";
+"Press Return to continue.\n" = "Per continuare, premi Invio.\n";
+"That driver has already been loaded.\n" = "Questo driver e gia stato caricato.\n";
+"Searching for drivers\n" = "Ricerca dei driver\n";
+"Reading configuration file '%s'.\n" = "Lettura del file di configurazione '%s' in corso.\n";
+
+/* Warnings */
+
+"Config file \"%s\" not found\n" = "File di configurazione \"%s\" non trovato\n";
+"System config file '%s' not found\n" = "File di configurazione del sistema '%s' non trovato\n";
+"Loading binary for %s device driver.\n" = "Caricamento del file binario per il driver di dispositivo %s.\n";
+"Warning: No active drivers specified in system config.\n" = "Attenzione: nessun driver attivo indicato nella configurazione del sistema.\n";
+
+/* Install messages */
+
+"DRIVER_MESSAGE_1" = "Il dischetto inserito nell'unita disco flessibile contiene driver di\ndispositivo per i seguenti adattatori SCSI, controllori di disco fisso ed\nadattatori di rete:\n";
+"DRIVER_INSTRUCTION_1" = "Digitare il numero della rete.\n\n";
+"DRIVER_ALTERNATE_1" = "Se il driver per questo dispositivo si trova su un altro disco,\ninserirlo nell'unita disco flessibile e digitare %d.\n";
+"DRIVER_QUIT_1" = "";
+"DRIVER_MESSAGE_2" = "Il disco flessibile nell'unita contiene driver per i seguenti adattattori\nSCSI e controllori per disco fisso:\n";
+"DRIVER_INSTRUCTION_2" = "Inserire il numero dell'adattatore SCSI o del controllore per disco fisso al\nquale e collegato il disco fisso sul quale si desidera installare Rhapsody.\n(Puo trattarsi dello stesso adattatore SCSI al quale e collegata l'unita\nCD-ROM.)\n\n";
+"DRIVER_ALTERNATE_2" = "Se il driver per questo dispositivo si trova su un altro disco,\ninserirlo nell'unita disco flessibile e digitare %d.\n";
+"DRIVER_QUIT_2" = "";
+"DRIVER_MESSAGE_3" = "Il disco flessibile nell'unita contiene i seguenti driver di dispositivo:\n";
+"DRIVER_INSTRUCTION_3" = "Inserire il numero del driver di dispositivo sul quale si desidera installare\nRhapsody.\n\n";
+"DRIVER_ALTERNATE_3" = "Se il driver per questo dispositivo si trova su un altro disco,\ninserirlo nell'unita disco flessibile e digitare %d.\n";
+"DRIVER_QUIT_3" = "Digitare %d per continuare senza installare un driver di dispositivo da questo\ndisco.\n";
+"DRIVER_QUESTION_3" = "In genere, per installare Rhapsody e sufficiente caricare i driver di\ndispositivo per gli adattatori ai quali sono collegati il CD-ROM e il disco\nrigido. Gli altri driver vengono caricati automaticamente.\n\nSe fosse necessario caricare un altro driver di dispositivo, inserire il\nrelativo disco nell'unita disco flessibile.\n\n";
+
+"Type %d to view a list of additional device drivers on this disk.\n\n" =
+"Digita %d per visualizzare la lista dei driver di dispositivo
+addizionali contenuti in questo disco.\n\n";
+
+"Really Install?" = "Questo programma consente di installare Rhapsody su un diosco fisso.\nQUESTO NON E' UN AGGIORNAMENTO: TUTTI I FILE Rhapsody ESISTENTI VERRANNO\nCANCELLATI.\n\nSe si desidera conservare alcuni file, uscire da questo programma e copiare i\nfile che si desidera conservare su un altro disco.\n\nDigitare 1 per iniziare la preparazione all'installazione di Rhapsody.\nDigitare 2 per uscire da questo progrmma di installazione.\n";
+
+"Insert Driver Disk" = "Inserire il dischetto dei dirver di dispositivo Rhapsody nell'unita disco\nflessibile e premere Invio.\n\n---> ";
+
+"Load Other Drivers?" = "In genere, per installare Rhapsody e sufficiente caricare i driver di\ndispositivo per gli adattatori ai quali sono collegati il CD-ROM e il disco\nrigido. Gli altri driver vengono caricati automaticamente dal CD-ROM Rhapsody.\n\nSe fosse necessario caricare un altro driver di dispositivo, inserire il\nrelativo disco nell'unita disco flessibile.\n";
+
+"Missing Drivers:" = "All'inizio dell'installazione di Rhapsody sono stati caricati uno o piu driver\ndi dispositivo che non si trovavano sul CD-ROM Rhapsody:\n";
+
+"No Drivers On This Disk" = "Questo disco non contiene driver di dispositivo adatti.\nInserire un nuovo dischetto e premere Invio.\n---> ";
+
+"Install Canceled" = "Installazione annullata.  Estrarre il disco flessibile e riavviare il computer.\n";
+
+"1 To Continue" = "Digitare 1 per continuare senza caricare driver di dispositivo supplementari.\n";
+
+"2 To Load" = "Digitare 2 per  caricare un  driver di dispositivo dal dischetto nell'unita\ndisco flessibile.\n";
+
+"1 To Load Driver" = "Inserire il dischetto contenente uno o piu di questi driver di dispositivo\ne digitare 1.\n";
+
+"2 To Continue" = "Digitare 2 per continuare senza caricare driver di dispositivo in questo elenco.\n";
+
+/* Somewhat obscure error messages */
+
+"Error loading %s\n" = "Errore durante il caricamento di %s\n";
+"Read error\n" = "Errore di lettura\n";
+"Error in standalone linker executable\n" = "Errore nel programma eseguibile del linker autonomo\n";
+"Fat binary file doesn't contain i386 code\n" = "Il file fat binary non contiene il codice i386\n";
+"Unrecognized binary format\n" = "Formato binario non riconosciuto\n";
+"Error reading commands\n" = "Errore durante la lettura dei comandi\n";
+"Error loading section\n" = "Errore durante il caricamento della sezione\n";
+"Can't load driver %s without sarld\n" = "Impossibile caricare il driver %s senza sarld\n";
+"Driver %s is larger than %d bytes and can't be loaded.\n" = "Il driver %s supera %d byte. Impossibile caricarlo.\n";
diff --git a/i386/strings/Language.table b/i386/strings/Language.table
new file mode 100644 (file)
index 0000000..ec4a0a8
--- /dev/null
@@ -0,0 +1,5 @@
+"Languages" = "English French German";
+"English" = "Type 1 to use the English language and USA keyboard while installing Rhapsody.\n";
+"French" = "Tapez 2 pour installer Rhapsody avec un clavier et des messages francais.\n";
+"German" = "Eingabe 3 fuer Rhapsody-Installation mit deutscher Sprache und Tastatur.\n";
+
diff --git a/i386/strings/Makefile b/i386/strings/Makefile
new file mode 100644 (file)
index 0000000..0ea9d36
--- /dev/null
@@ -0,0 +1,45 @@
+
+DIR = strings
+include ../MakePaths.dir
+
+INSTALLDIR = $(DSTROOT)/usr/standalone/i386
+VPATH = $(OBJROOT)
+
+CHOWN = chown
+
+FILES = Language.table \
+       BootHelp.txt \
+       English.lproj/Localizable.strings \
+       English.lproj/NetInstall.strings \
+       French.lproj/Localizable.strings \
+       French.lproj/NetInstall.strings \
+       German.lproj/Localizable.strings \
+       German.lproj/NetInstall.strings
+
+# Remove Swedish, Italian and Spanish for Rhap 1.0
+#      Italian.lproj/Localizable.strings \
+#      Italian.lproj/NetInstall.strings \
+#      Spanish.lproj/Localizable.strings \
+#      Spanish.lproj/NetInstall.strings \
+#      Swedish.lproj/Localizable.strings \
+#      Swedish.lproj/NetInstall.strings
+
+DIRS =  ${INSTALLDIR}/English.lproj \
+       ${INSTALLDIR}/French.lproj \
+       ${INSTALLDIR}/German.lproj
+
+# Remove Swedish, Italian and Spanish for Rhap 1.0
+#      ${INSTALLDIR}/Italian.lproj
+#      ${INSTALLDIR}/Spanish.lproj \
+#      ${INSTALLDIR}/Swedish.lproj
+
+DIRS_NEEDED = ${DIRS}
+
+all:
+
+install_i386:: $(INSTALLDIR) $(DIRS_NEEDED)
+       tar cf - ${FILES} | (cd ${INSTALLDIR}; tar xfBp - )
+       chown -fR root.wheel $(INSTALLDIR)
+       chmod -R ugo-w  $(INSTALLDIR)
+
+include ../MakeInc.dir
diff --git a/i386/strings/Spanish.lproj/Localizable.strings b/i386/strings/Spanish.lproj/Localizable.strings
new file mode 100644 (file)
index 0000000..fed9058
--- /dev/null
@@ -0,0 +1,79 @@
+/* Informational messages */
+
+"Loading Rhapsody" = "Cargando Rhapsody";
+"Loading %s\n" = "Cargando %s\n";
+"Reading Rhapsody configuration" = "Leyendo configuracion de Rhapsody";
+"Couldn't load standalone linker; unable to load boot drivers.\n" = "Imposible cargar linker autonomo; imposible cargar controladores de arranque.\n";
+"Insert file system media and press Return" = "Inserte el disco del sistema de ficheros y pulse Intro";
+"Errors encountered while starting up the computer.\n" = "Se han encontrado errores al arrancar el ordenador.\n";
+"Pausing %d seconds...\n" = "Parada de %d segundos...\n";
+"Starting Rhapsody" = "Arrancando Rhapsody";
+"Can't find %s\n" = "Imposible encontrar %s\n";
+"Couldn't start up the computer using this floppy disk." = "No se ha podido arrancar el ordenador utilizando este disquete.";
+"Error occurred while linking driver %s:\n%s" = "Se ha producido un error al enlazar el controlador %s:\n%s";
+"Loading %s device driver.\n" = "Cargando el controlador de dispositivo %s.\n";
+"The driver was loaded successfully.\n" = "El controlador se ha cargado correctamente.\n";
+"An error occurred while loading the %s device driver.\n" = "Se ha producido un error al cargar el controlador de dispositivo %s.\n";
+"Press Return to continue.\n" = "Pulse Retorno para continuar.\n";
+"That driver has already been loaded.\n" = "Ese controlador ya ha sido cargado.\n";
+"Searching for drivers\n" = "Buscando controladores\n";
+"Reading configuration file '%s'.\n" = "Leyendo el fichero de configuracion '%s'.\n";
+
+/* Warnings */
+
+"Config file \"%s\" not found\n" = "No se encuentra el fichero de configuracion \"%s\"\n";
+"System config file '%s' not found\n" = "No se encuentra el fichero de configuracion del sistema '%s'\n";
+"Loading binary for %s device driver.\n" = "Cargando binario para el controlador de dispositivo %s.\n";
+"Warning: No active drivers specified in system config.\n" = "Advertencia: no hay controladores activos especificados en la configuracion\ndel sistema.\n";
+
+/* Install messages */
+
+"DRIVER_MESSAGE_1" = "El disquete de la unidad contiene controladores de dispositivo para los\nsiguientes adaptadores SCSI:\n";
+"DRIVER_INSTRUCTION_1" = "Escriba el numero para el adaptador SCSI al que esta conectada la unidad de\nCD-ROM.\n\n";
+"DRIVER_ALTERNATE_1" = "Si el controlador de este dispositivo se encuentra en otro disco, inserte ese\ndisco en la unidad de disquete y escriba %d.\n";
+"DRIVER_QUIT_1" = "";
+"DRIVER_MESSAGE_2" = "El disquete de la unidad contiene controladores de dispositivo para los\nsiguientes adaptadores SCSI y controladores de disco duro:\n";
+"DRIVER_INSTRUCTION_2" = "Escriba el numero del adaptador SCSI o del controlador de disco duro que este\nconectado al disco duro en el que desea instalar Rhapsody.\n(Es posible que se trate del mismo adaptador SCSI al que esta conectada la\nunidad de CD-ROM.)\n\n";
+"DRIVER_ALTERNATE_2" = "Si el controlador de este dispositivo se encuentra en otro disco, inserte ese\ndisco en la unidad de disquete y escriba %d.\n";
+"DRIVER_QUIT_2" = "";
+"DRIVER_MESSAGE_3" = "El disquete de la unidad contiene los siguientes controladores de dispositivo:\n";
+"DRIVER_INSTRUCTION_3" = "Escriba el numero del controlador de dispositivo que necesita para instalar\nRhapsody.\n\n";
+"DRIVER_ALTERNATE_3" = "Si el controlador de dispositivo que necesita cargar se encuentra en otro \ndisco, insertelo en la unidad y escriba %d.\n\n";
+"DRIVER_QUIT_3" = "Escriba %d para continuar sin instalar un controlador de dispositivo de este\ndisco.\n";
+"DRIVER_QUESTION_3" = "Normalmente, solo tiene que cargar los controladores de dispositivo para los\nadaptadores a los que esten conectados la unidad de CD-ROM y el disco duro\npara poder instalar Rhapsody. Otros controladores se cargan automaticamente.\n\nSi necesita cargar otro controlador de dispositivo, inserte el disco que lo\ncontiene en la unidad de disquete.\n\n";
+
+"Type %d to view a list of additional device drivers on this disk.\n\n" =
+"Escriba %d para visualizar una lista de controladores de dispositivo
+adicionales de este disco.\n\n";
+
+"Really Install?" = "Este programa sirve para instalar Rhapsody en el disco duro.\nNO SE TRATA DE UNA ACTUALIZACION: SE BORRARAN TODOS LOS FICHEROS DE Rhapsody\nEXISTENTES.\n\nSi tiene ficheros en el disco duro que desea conservar, salga de este programa\ny copie la informacion que desea conservar en otro disco.\n\nEscriba 1 si esta listo para instalar Rhapsody.\nEscriba 2 para salir del programa de instalacion.\n";
+
+"Insert Driver Disk" = "Inserte el disco de controladores de dispositivos de Rhapsody en la unidad de\ndisquete y pulse Intro.\n\n---> ";
+
+"Load Other Drivers?" = "Normalmente, solo tiene que cargar los controladores de dispositivo para los\nadaptadores a los que esten conectados la unidad de CD-ROM y el disco duro\npara poder instalar Rhapsody. Otros controladores se cargan automaticamente\ndesde la CD-ROM de Rhapsody.\n\nSi necesita cargar otro controlador de dispositivo, inserte el disco que lo\ncontiene en la unidad de disquete.\n";
+
+"Missing Drivers:" = "Cuando empezo a instalar NEXSTEP, cargo uno o mas controladores de dispositivo\nque no se encontraban en la CD-ROM de Rhapsody:\n";
+
+"No Drivers On This Disk" = "No hay ningun controlador de dispositivo adecuado en este disquete.\nInserte un nuevo disco y pulse Intro.\n---> ";
+
+"Install Canceled" = "Instalacion cancelada. Extraiga el disquete y vuelva a arrancar el ordenador.\n";
+
+"1 To Continue" = "Escriba 1 para continuar sin cargar controladores de dispositivos adicionales.\n";
+
+"2 To Load" = "Escriba 2 para cargar un controlador de dispositivo desde el disco en la\nunidad de disquete.\n";
+
+"1 To Load Driver" = "Inserte el disquete que contiene uno o mas de estos controladores\nde dispositivo y escriba 1.\n";
+
+"2 To Continue" = "Escriba 2 para continuar sin cargar ninguno de los controladores de dispositivo\nde esta lista.\n";
+
+/* Somewhat obscure error messages */
+
+"Error loading %s\n" = "Error cargando %s\n";
+"Read error\n" = "Error de lectura\n";
+"Error in standalone linker executable\n" = "Error en linker autonomo ejecutable\n";
+"Fat binary file doesn't contain i386 code\n" = "El fichero fat binary no contiene codigo i386\n";
+"Unrecognized binary format\n" = "Formato binario no reconocido\n";
+"Error reading commands\n" = "Error leyendo comandos\n";
+"Error loading section\n" = "Error cargando seccion\n";
+"Can't load driver %s without sarld\n" = "Imposible cargar el controlador %s sin sarld\n";
+"Driver %s is larger than %d bytes and can't be loaded.\n" = "El controlador %s es mayor de %d bytes y no puede cargarse.\n";
diff --git a/i386/strings/Spanish.lproj/NetInstall.strings b/i386/strings/Spanish.lproj/NetInstall.strings
new file mode 100644 (file)
index 0000000..4a29699
--- /dev/null
@@ -0,0 +1,79 @@
+/* Informational messages */
+
+"Loading Rhapsody" = "Cargando Rhapsody";
+"Loading %s\n" = "Cargando %s\n";
+"Reading Rhapsody configuration" = "Leyendo configuracion de Rhapsody";
+"Couldn't load standalone linker; unable to load boot drivers.\n" = "Imposible cargar linker autonomo; imposible cargar controladores de arranque.\n";
+"Insert file system media and press Return" = "Inserte el disco del sistema de ficheros y pulse Intro";
+"Errors encountered while starting up the computer.\n" = "Se han encontrado errores al arrancar el ordenador.\n";
+"Pausing %d seconds...\n" = "Parada de %d segundos...\n";
+"Starting Rhapsody" = "Arrancando Rhapsody";
+"Can't find %s\n" = "Imposible encontrar %s\n";
+"Couldn't start up the computer using this floppy disk." = "No se ha podido arrancar el ordenador utilizando este disquete.";
+"Error occurred while linking driver %s:\n%s" = "Se ha producido un error al enlazar el controlador %s:\n%s";
+"Loading %s device driver.\n" = "Cargando el controlador de dispositivo %s.\n";
+"The driver was loaded successfully.\n" = "El controlador se ha cargado correctamente.\n";
+"An error occurred while loading the %s device driver.\n" = "Se ha producido un error al cargar el controlador de dispositivo %s.\n";
+"Press Return to continue.\n" = "Pulse Retorno para continuar.\n";
+"That driver has already been loaded.\n" = "Ese controlador ya ha sido cargado.\n";
+"Searching for drivers\n" = "Buscando controladores\n";
+"Reading configuration file '%s'.\n" = "Leyendo el fichero de configuracion '%s'.\n";
+
+/* Warnings */
+
+"Config file \"%s\" not found\n" = "No se encuentra el fichero de configuracion \"%s\"\n";
+"System config file '%s' not found\n" = "No se encuentra el fichero de configuracion del sistema '%s'\n";
+"Loading binary for %s device driver.\n" = "Cargando binario para el controlador de dispositivo %s.\n";
+"Warning: No active drivers specified in system config.\n" = "Advertencia: no hay controladores activos especificados en la configuracion\ndel sistema.\n";
+
+/* Install messages */
+
+"DRIVER_MESSAGE_1" = "El disquete de la unidad contiene controladores de dispositivo para los\nsiguientes adaptadores SCSI, controladores de disco duro y adaptadores de red:\n";
+"DRIVER_INSTRUCTION_1" = "Escriba el numero del adaptador de red de su ordenador.\n\n";
+"DRIVER_ALTERNATE_1" = "Si el controlador de este dispositivo se encuentra en otro disco, inserte ese\ndisco en la unidad de disquete y escriba %d.\n";
+"DRIVER_QUIT_1" = "";
+"DRIVER_MESSAGE_2" = "El disquete de la unidad contiene controladores de dispositivo para los\nsiguientes adaptadores SCSI y controladores de disco duro:\n";
+"DRIVER_INSTRUCTION_2" = "Escriba el numero del adaptador SCSI o del controlador de disco duro que este\nconectado al disco duro en el que desea instalar Rhapsody.\n(Es posible que se trate del mismo adaptador SCSI al que esta conectada la\nunidad de CD-ROM.)\n\n";
+"DRIVER_ALTERNATE_2" = "Si el controlador de este dispositivo se encuentra en otro disco, inserte ese\ndisco en la unidad de disquete y escriba %d.\n";
+"DRIVER_QUIT_2" = "";
+"DRIVER_MESSAGE_3" = "El disquete de la unidad contiene los siguientes controladores de dispositivo:\n";
+"DRIVER_INSTRUCTION_3" = "Escriba el numero del controlador de dispositivo que necesita para instalar\nRhapsody.\n\n";
+"DRIVER_ALTERNATE_3" = "Si el controlador de dispositivo que necesita cargar se encuentra en otro \ndisco, insertelo en la unidad y escriba %d.\n\n";
+"DRIVER_QUIT_3" = "Escriba %d para continuar sin instalar un controlador de dispositivo de este\ndisco.\n";
+"DRIVER_QUESTION_3" = "Normalmente, solo tiene que cargar los controladores de dispositivo para los\nadaptadores a los que esten conectados la unidad de CD-ROM y el disco duro\npara poder instalar Rhapsody. Otros controladores se cargan automaticamente.\n\nSi necesita cargar otro controlador de dispositivo, inserte el disco que lo\ncontiene en la unidad de disquete.\n\n";
+
+"Type %d to view a list of additional device drivers on this disk.\n\n" =
+"Escriba %d para visualizar una lista de controladores de dispositivo
+adicionales de este disco.\n\n";
+
+"Really Install?" = "Este programa sirve para instalar Rhapsody en el disco duro.\nNO SE TRATA DE UNA ACTUALIZACION: SE BORRARAN TODOS LOS FICHEROS DE Rhapsody\nEXISTENTES.\n\nSi tiene ficheros en el disco duro que desea conservar, salga de este programa\ny copie la informacion que desea conservar en otro disco.\n\nEscriba 1 si esta listo para instalar Rhapsody.\nEscriba 2 para salir del programa de instalacion.\n";
+
+"Insert Driver Disk" = "Inserte el disco de controladores de dispositivos de Rhapsody en la unidad de\ndisquete y pulse Intro.\n\n---> ";
+
+"Load Other Drivers?" = "Normalmente, solo tiene que cargar los controladores de dispositivo para los\nadaptadores a los que esten conectados la unidad de CD-ROM y el disco duro\npara poder instalar Rhapsody. Otros controladores se cargan automaticamente\ndesde la CD-ROM de Rhapsody.\n\nSi necesita cargar otro controlador de dispositivo, inserte el disco que lo\ncontiene en la unidad de disquete.\n";
+
+"Missing Drivers:" = "Cuando empezo a instalar NEXSTEP, cargo uno o mas controladores de dispositivo\nque no se encontraban en la CD-ROM de Rhapsody:\n";
+
+"No Drivers On This Disk" = "No hay ningun controlador de dispositivo adecuado en este disquete.\nInserte un nuevo disco y pulse Intro.\n---> ";
+
+"Install Canceled" = "Instalacion cancelada. Extraiga el disquete y vuelva a arrancar el ordenador.\n";
+
+"1 To Continue" = "Escriba 1 para continuar sin cargar controladores de dispositivos adicionales.\n";
+
+"2 To Load" = "Escriba 2 para cargar un controlador de dispositivo desde el disco en la\nunidad de disquete.\n";
+
+"1 To Load Driver" = "Inserte el disquete que contiene uno o mas de estos controladores\nde dispositivo y escriba 1.\n";
+
+"2 To Continue" = "Escriba 2 para continuar sin cargar ninguno de los controladores de dispositivo\nde esta lista.\n";
+
+/* Somewhat obscure error messages */
+
+"Error loading %s\n" = "Error cargando %s\n";
+"Read error\n" = "Error de lectura\n";
+"Error in standalone linker executable\n" = "Error en linker autonomo ejecutable\n";
+"Fat binary file doesn't contain i386 code\n" = "El fichero fat binary no contiene codigo i386\n";
+"Unrecognized binary format\n" = "Formato binario no reconocido\n";
+"Error reading commands\n" = "Error leyendo comandos\n";
+"Error loading section\n" = "Error cargando seccion\n";
+"Can't load driver %s without sarld\n" = "Imposible cargar el controlador %s sin sarld\n";
+"Driver %s is larger than %d bytes and can't be loaded.\n" = "El controlador %s es mayor de %d bytes y no puede cargarse.\n";
diff --git a/i386/strings/Swedish.lproj/Localizable.strings b/i386/strings/Swedish.lproj/Localizable.strings
new file mode 100644 (file)
index 0000000..10762af
--- /dev/null
@@ -0,0 +1,78 @@
+/* Informational messages */
+
+"Loading Rhapsody" = "Laser inr Rhapsody";
+"Loading %s\n" = "Laser in %s\n";
+"Reading Rhapsody configuration" = "Laser Rhapsody-konfiguration";
+"Couldn't load standalone linker; unable to load boot drivers.\n" = "Kan inte lasa in fristaende linker; kan inte lasa in startdrivrutiner.\n";
+"Insert file system media and press Return" = "Satt in filsystemdisketten och tryck pa Retur";
+"Errors encountered while starting up the computer.\n" = "Fel vid start av datorn.\n";
+"Pausing %d seconds...\n" = "Gor uppehall i %d sekunder...\n";
+"Starting Rhapsody" = "Startar Rhapsody";
+"Can't find %s\n" = "Hittar inte %s\n";
+"Couldn't start up the computer using this floppy disk." = "Kan inte starta datorn med denna diskett.";
+"Error occurred while linking driver %s:\n%s" = "Fel vid lankning av drivrutinen %s:\n%s";
+"Loading %s device driver.\n" = "Laser in drivrutin %s.\n";
+"The driver was loaded successfully.\n" = "Drivrutinen har lasts i.\n";
+"An error occurred while loading the %s device driver.\n" = "Ett fel uppstod vid inlasning av drivrutinen %s.\n";
+"Press Return to continue.\n" = "Tryck pa Retur for att fortsatta.\n";
+"That driver has already been loaded.\n" = "Den drivrutinen har redan lasts in.\n";
+"Searching for drivers\n" = "Letar efter drivrutiner\n";
+"Reading configuration file '%s'.\n" = "Laser konfigurationsfil '%s'.\n";
+
+/* Warnings */
+
+"Config file \"%s\" not found\n" = "Hittar inte konfigurationsfilen \"%s\"\n";
+"System config file '%s' not found\n" = "Hittar inte systemkonfigurationsfilen '%s'\n";
+"Loading binary for %s device driver.\n" = "Laser in binar for drivrutin %s.\n";
+"Warning: No active drivers specified in system config.\n" = "Varning: inga aktiva drivrutiner har angivits i systemkonfigurationen.\n";
+
+/* Install messages */
+
+"DRIVER_MESSAGE_1" = "Disketten i enheten innehaller drivrutiner for foljande SCSI-adaptrar:\n";
+"DRIVER_INSTRUCTION_1" = "Skriv numret for den SCSI-adapter CS-ROM-enheten ar kopplad till.\n\n";
+"DRIVER_ALTERNATE_1" = "Om drivrutinen for den har enheten ligger pa en annan diskett satter du \nin den i diskettenheten och skriver %d.\n";
+"DRIVER_QUIT_1" = "";
+"DRIVER_MESSAGE_2" = "Disketten i enheten innehaller drivrutiner for foljande SCSI-adaptrar och\nstyrenheter for harddiskar:\n";
+"DRIVER_INSTRUCTION_2" = "Skriv in numret for den SCSI-adapter eller styrenhet som harddisken du vill\ninstallera Rhapsody pa ar ansluten till.\n(Det kan vara samma SCSI-adapter som CD-ROM-enheten ar ansluten till.)\n\n";
+"DRIVER_ALTERNATE_2"  = "Om drivrutinen for den har enheten ligger pa en annan diskett satter du \nin den i diskettenheten och skriver %d.\n";
+"DRIVER_QUIT_2" = "";
+"DRIVER_MESSAGE_3" = "Disketten i diskettenheten innehaller foljande drivrutiner:\n";
+"DRIVER_INSTRUCTION_3" = "Skriv numret for drivrutinen du behover for att installera Rhapsody.\n\n";
+"DRIVER_ALTERNATE_3" = "Om drivrutinen du vill lasa in ligger pa en annan diskett satter du in den i\ndiskettenheten och skriver %d.\n";
+"DRIVER_QUIT_3" = "Skriv %d om du vill fortsatta utan att installera en drivrutin fran den har\ndisketten.\n";
+"DRIVER_QUESTION_3" = "I vanliga fall behover du bara lasa in drivrutinerna for de adaptrar\nCD-ROM-enheten och harddisken ar anslutna till for att kunna installera\nRhapsody. Andra drivrutiner lases in automatiskt.\n\nOm du behover lasa in en annan drivrutin satter du in disketten med drivrutinen\ni diskettenheten.\n\n";
+
+"Type %d to view a list of additional device drivers on this disk.\n\n" =
+"Skriv %d for att visa en lista over ytterligare drivrutiner pa denna diskett.\n\n";
+
+"Really Install?" = "Det har programmet ar avsett for att installera Rhapsody pa en harddisk.\nDETTA AR INTE EN UPPGRADERING: BEFINTLIGA Rhapsody-FILER KOMMER ATT RADERAS.\n\nOm du vill behalla egna filer pa harddisken avslutar du programmet och kopierar\nde filer du vill behalla till en annan disk eller diskett.\n\nSkriv 1 om du vill forbereda for Rhapsody-installation.\nSkriv 2 om du vill avsluta installationsprogrammet.\n";
+
+"Insert Driver Disk" = "Satt in disketten med Rhapsody-drivrutinerna i diskettenheten\noch tryck pa Retur.\n\n---> ";
+
+"Load Other Drivers?" = "I vanliga fall behover du bara lasa in drivrutinerna for de adaptrar\nCD-ROM-enheten och harddisken ar anslutna till for att kunna installera\nRhapsody. Andra drivrutiner lases in automatiskt fran Rhapsody CD-ROM.\n\nOm du behover lasa in en annan drivrutin satter du in disketten med drivrutinen\ni diskettenheten.\n\n";
+
+"Missing Drivers:" = "Nar du paborjade Rhapsody-installationen laste du in en eller flera drivrutiner\nsom inte fanns pa Rhapsody CD-ROM:\n";
+
+"No Drivers On This Disk" = "Det finns inga lampliga drivrutiner pa den har disketten.\nSatt in en ny diskett och tryck pa Retur.\n---> ";
+
+"Install Canceled" = "Installationen avbrots. Mata ut disketten och starta om datorn.\n";
+
+"1 To Continue" = "Skriv 1 om du vill fortsatta utan att lasa in andra drivrutiner.\n";
+
+"2 To Load" = "Skriv 2 om du vill lasa in en drivrutin fran disketten i enheten.\n";
+
+"1 To Load Driver" = "Satt in disketten som innehaller en eller flera av dessa enhets-drivrutiner\noch skriv 1.\n";
+
+"2 To Continue" = "Skriv 2 om du vill fortsatta utan att lasa in nagon av drivrutinerna pa listan.\n";
+
+/* Somewhat obscure error messages */
+
+"Error loading %s\n" = "Fel vid inlasning av %s\n";
+"Read error\n" = "Lasfel\n";
+"Error in standalone linker executable\n" = "Fel i fristaende linker-program\n";
+"Fat binary file doesn't contain i386 code\n" = "Fat binary innehaller inte i386-kod\n";
+"Unrecognized binary format\n" = "Okant binart format\n";
+"Error reading commands\n" = "Fel vid lasning av kommandon\n";
+"Error loading section\n" = "Fel vid inlasning av sektion\n";
+"Can't load driver %s without sarld\n" = "Kan inte lasa in drivrutinen %s utan sarld\n";
+"Driver %s is larger than %d bytes and can't be loaded.\n" = "Drivrutinen %s ar storre an %d byte och kan inte lasas ins.\n";
diff --git a/i386/strings/Swedish.lproj/NetInstall.strings b/i386/strings/Swedish.lproj/NetInstall.strings
new file mode 100644 (file)
index 0000000..19d9dd1
--- /dev/null
@@ -0,0 +1,78 @@
+/* Informational messages */
+
+"Loading Rhapsody" = "Laser inr Rhapsody";
+"Loading %s\n" = "Laser in %s\n";
+"Reading Rhapsody configuration" = "Laser Rhapsody-konfiguration";
+"Couldn't load standalone linker; unable to load boot drivers.\n" = "Kan inte lasa in fristaende linker; kan inte lasa in startdrivrutiner.\n";
+"Insert file system media and press Return" = "Satt in filsystemdisketten och tryck pa Retur";
+"Errors encountered while starting up the computer.\n" = "Fel vid start av datorn.\n";
+"Pausing %d seconds...\n" = "Gor uppehall i %d sekunder...\n";
+"Starting Rhapsody" = "Startar Rhapsody";
+"Can't find %s\n" = "Hittar inte %s\n";
+"Couldn't start up the computer using this floppy disk." = "Kan inte starta datorn med denna diskett.";
+"Error occurred while linking driver %s:\n%s" = "Fel vid lankning av drivrutinen %s:\n%s";
+"Loading %s device driver.\n" = "Laser in drivrutin %s.\n";
+"The driver was loaded successfully.\n" = "Drivrutinen har lasts i.\n";
+"An error occurred while loading the %s device driver.\n" = "Ett fel uppstod vid inlasning av drivrutinen %s.\n";
+"Press Return to continue.\n" = "Tryck pa Retur for att fortsatta.\n";
+"That driver has already been loaded.\n" = "Den drivrutinen har redan lasts in.\n";
+"Searching for drivers\n" = "Letar efter drivrutiner\n";
+"Reading configuration file '%s'.\n" = "Laser konfigurationsfil '%s'.\n";
+
+/* Warnings */
+
+"Config file \"%s\" not found\n" = "Hittar inte konfigurationsfilen \"%s\"\n";
+"System config file '%s' not found\n" = "Hittar inte systemkonfigurationsfilen '%s'\n";
+"Loading binary for %s device driver.\n" = "Laser in binar for drivrutin %s.\n";
+"Warning: No active drivers specified in system config.\n" = "Varning: inga aktiva drivrutiner har angivits i systemkonfigurationen.\n";
+
+/* Install messages */
+
+"DRIVER_MESSAGE_1" = "Disketten i enheten innehaller drivrutiner for foljande SCSI-adaptrar,\nharddiskstyrenheter och natverksadaptrar:\n";
+"DRIVER_INSTRUCTION_1" = "Skriv numret pa datorns natverksadapter.\n\n";
+"DRIVER_ALTERNATE_1" = "Om drivrutinen for den har enheten ligger pa en annan diskett satter du \nin den i diskettenheten och skriver %d.\n";
+"DRIVER_QUIT_1" = "";
+"DRIVER_MESSAGE_2" = "Disketten i enheten innehaller drivrutiner for foljande SCSI-adaptrar och\nstyrenheter for harddiskar:\n";
+"DRIVER_INSTRUCTION_2" = "Skriv in numret for den SCSI-adapter eller styrenhet som harddisken du vill\ninstallera Rhapsody pa ar ansluten till.\n(Det kan vara samma SCSI-adapter som CD-ROM-enheten ar ansluten till.)\n\n";
+"DRIVER_ALTERNATE_2"  = "Om drivrutinen for den har enheten ligger pa en annan diskett satter du \nin den i diskettenheten och skriver %d.\n";
+"DRIVER_QUIT_2" = "";
+"DRIVER_MESSAGE_3" = "Disketten i diskettenheten innehaller foljande drivrutiner:\n";
+"DRIVER_INSTRUCTION_3" = "Skriv numret for drivrutinen du behover for att installera Rhapsody.\n\n";
+"DRIVER_ALTERNATE_3" = "Om drivrutinen du vill lasa in ligger pa en annan diskett satter du in den i\ndiskettenheten och skriver %d.\n";
+"DRIVER_QUIT_3" = "Skriv %d om du vill fortsatta utan att installera en drivrutin fran den har\ndisketten.\n";
+"DRIVER_QUESTION_3" = "I vanliga fall behover du bara lasa in drivrutinerna for de adaptrar\nCD-ROM-enheten och harddisken ar anslutna till for att kunna installera\nRhapsody. Andra drivrutiner lases in automatiskt.\n\nOm du behover lasa in en annan drivrutin satter du in disketten med drivrutinen\ni diskettenheten.\n\n";
+
+"Type %d to view a list of additional device drivers on this disk.\n\n" =
+"Skriv %d for att visa en lista over ytterligare drivrutiner pa denna diskett.\n\n";
+
+"Really Install?" = "Det har programmet ar avsett for att installera Rhapsody pa en harddisk.\nDETTA AR INTE EN UPPGRADERING: BEFINTLIGA Rhapsody-FILER KOMMER ATT RADERAS.\n\nOm du vill behalla egna filer pa harddisken avslutar du programmet och kopierar\nde filer du vill behalla till en annan disk eller diskett.\n\nSkriv 1 om du vill forbereda for Rhapsody-installation.\nSkriv 2 om du vill avsluta installationsprogrammet.\n";
+
+"Insert Driver Disk" = "Satt in disketten med Rhapsody-drivrutinerna i diskettenheten\noch tryck pa Retur.\n\n---> ";
+
+"Load Other Drivers?" = "I vanliga fall behover du bara lasa in drivrutinerna for de adaptrar\nCD-ROM-enheten och harddisken ar anslutna till for att kunna installera\nRhapsody. Andra drivrutiner lases in automatiskt fran Rhapsody CD-ROM.\n\nOm du behover lasa in en annan drivrutin satter du in disketten med drivrutinen\ni diskettenheten.\n\n";
+
+"Missing Drivers:" = "Nar du paborjade Rhapsody-installationen laste du in en eller flera drivrutiner\nsom inte fanns pa Rhapsody CD-ROM:\n";
+
+"No Drivers On This Disk" = "Det finns inga lampliga drivrutiner pa den har disketten.\nSatt in en ny diskett och tryck pa Retur.\n---> ";
+
+"Install Canceled" = "Installationen avbrots. Mata ut disketten och starta om datorn.\n";
+
+"1 To Continue" = "Skriv 1 om du vill fortsatta utan att lasa in andra drivrutiner.\n";
+
+"2 To Load" = "Skriv 2 om du vill lasa in en drivrutin fran disketten i enheten.\n";
+
+"1 To Load Driver" = "Satt in disketten som innehaller en eller flera av dessa enhets-drivrutiner\noch skriv 1.\n";
+
+"2 To Continue" = "Skriv 2 om du vill fortsatta utan att lasa in nagon av drivrutinerna pa listan.\n";
+
+/* Somewhat obscure error messages */
+
+"Error loading %s\n" = "Fel vid inlasning av %s\n";
+"Read error\n" = "Lasfel\n";
+"Error in standalone linker executable\n" = "Fel i fristaende linker-program\n";
+"Fat binary file doesn't contain i386 code\n" = "Fat binary innehaller inte i386-kod\n";
+"Unrecognized binary format\n" = "Okant binart format\n";
+"Error reading commands\n" = "Fel vid lasning av kommandon\n";
+"Error loading section\n" = "Fel vid inlasning av sektion\n";
+"Can't load driver %s without sarld\n" = "Kan inte lasa in drivrutinen %s utan sarld\n";
+"Driver %s is larger than %d bytes and can't be loaded.\n" = "Drivrutinen %s ar storre an %d byte och kan inte lasas ins.\n";
diff --git a/i386/testmodule/Makefile b/i386/testmodule/Makefile
new file mode 100644 (file)
index 0000000..3baf106
--- /dev/null
@@ -0,0 +1,79 @@
+
+#      Makefile for i386 boot program
+#      define FLOPPY and SMALL using DEFINES macro as necessary
+
+DIR = testmodule
+include ../MakePaths.dir
+
+DEBUG = -g
+OPTIM = -Os
+CFLAGS = $(DEBUG) $(OPTIM) $(MORECPP) -arch i386 -Wmost -DTEST_INTERNAL_USER
+DEFINES=
+CONFIG = hd
+SYMDIR = $(SYMROOT)
+LIBSADIR = ../libsa
+LIBSAIODIR = ../libsaio
+UTILDIR = ../util
+INC = -I. -I.. -I$(SYMDIR) -I$(LIBSADIR) -I$(LIBSAIODIR) -I$(UTILDIR)
+ifneq "" "$(wildcard /bin/mkdirs)"
+  MKDIRS = /bin/mkdirs
+else
+  MKDIRS = /bin/mkdir -p
+endif
+AS = as
+LD = ld
+
+LIBSA = $(SYMDIR)/libsa.a
+LIBSAIO = $(SYMDIR)/libsaio.a
+LIBS = $(LIBSAIO) $(LIBSA)
+
+OTHER_FILES =
+
+INSTALLDIR = $(DSTROOT)/usr/standalone/i386
+
+VPATH = $(OBJROOT):$(SYMROOT)
+
+OBJS = test.o test_table.o
+
+UTILDIR = ../util
+SFILES = boot2.s
+CFILES = boot.c load.c stringTable.c graphics.c browser.c \
+        button.c scrollbar.c prompt.c
+HFILES = kernBootStruct.h
+OTHERFILES = Makefile machOconv.c README
+ALLSRC = $(FOREIGNSRC) $(FOREIGNBIN) $(SFILES) $(CFILES) \
+       $(HFILES) $(OTHERFILES)
+DIRS_NEEDED = $(OBJROOT) $(SYMROOT)
+BOOT2ADDR = 3000
+
+SIG = $(SYMROOT)/sig
+GENFILES = $(SYMROOT)/install_internal.h \
+       $(SYMROOT)/install_external.h \
+       $(SYMROOT)/install_table.c \
+       $(SYMROOT)/install_defs.h
+
+all: $(DIRS_NEEDED) test_external.h test.module
+
+test.module: $(SYMROOT) $(OBJS)
+       $(CC) $(COPTS) $(CFLAGS) $(RC_CFLAGS) -o $@ \
+               $(OBJS) \
+               -e _test_entry -u _test_entry \
+                -seg1addr 50000 -preload -nostdlib $(LIBS)
+
+test_internal.h: test_external.h
+test_table.c: test_external.h
+test_defs.h: test_external.h
+test_external.h: test.def
+       $(SIG) -d $(SYMROOT) test.def
+
+install_i386:: all $(INSTALLDIR)
+       cp $(SYMROOT)/boot $(OTHER_FILES) $(INSTALLDIR)
+       cd $(INSTALLDIR); chmod u+w boot $(OTHER_FILES)
+
+clean::
+       rm -f $(SYMROOT)/boot.sys $(GENFILES)
+
+include ../MakeInc.dir
+
+#dependencies
+-include $(OBJROOT)/Makedep
diff --git a/i386/testmodule/install.def b/i386/testmodule/install.def
new file mode 100644 (file)
index 0000000..c19d16f
--- /dev/null
@@ -0,0 +1,9 @@
+int install_choose( char **strings, int nstrings, int min, int max )
+strings, nstrings, min, max;
+int install_chooseFromDriverList(
+    char *title,
+    char *message,
+    char **strings,
+    int nstrings
+) title, message, strings, nstrings;
+void install_clearScreen(void) ;
\ No newline at end of file
diff --git a/i386/testmodule/install/Makefile b/i386/testmodule/install/Makefile
new file mode 100644 (file)
index 0000000..a0836ee
--- /dev/null
@@ -0,0 +1,77 @@
+
+#      Makefile for i386 boot program
+#      define FLOPPY and SMALL using DEFINES macro as necessary
+
+DIR = install
+include ../MakePaths.dir
+
+DEBUG = -g
+CFLAGS = $(DEBUG) $(MORECPP) -arch i386 -Wmost -DINSTALL_INTERNAL_USER
+DEFINES=
+CONFIG = hd
+SYMDIR = $(SYMROOT)
+LIBSADIR = ../libsa
+LIBSAIODIR = ../libsaio
+UTILDIR = ../util
+INC = -I. -I$(SYMDIR) -I$(LIBSADIR) -I$(LIBSAIODIR) -I$(UTILDIR)
+ifneq "" "$(wildcard /bin/mkdirs)"
+  MKDIRS = /bin/mkdirs
+else
+  MKDIRS = /bin/mkdir -p
+endif
+AS = as
+LD = ld
+
+LIBSA = $(SYMDIR)/libsa.a
+LIBSAIO = $(SYMDIR)/libsaio.a
+LIBS = $(LIBSAIO) $(LIBSA)
+
+OTHER_FILES =
+
+INSTALLDIR = $(DSTROOT)/usr/standalone/i386
+VPATH = $(OBJROOT):$(SYMROOT)
+
+OBJS = choose.o mode.o install_table.o
+
+UTILDIR = ../util
+SFILES = boot2.s
+CFILES = boot.c load.c stringTable.c graphics.c browser.c \
+        button.c scrollbar.c prompt.c
+HFILES = kernBootStruct.h
+OTHERFILES = Makefile machOconv.c README
+ALLSRC = $(FOREIGNSRC) $(FOREIGNBIN) $(SFILES) $(CFILES) \
+       $(HFILES) $(OTHERFILES)
+DIRS_NEEDED = $(OBJROOT) $(SYMROOT)
+BOOT2ADDR = 3000
+
+SIG = $(SYMROOT)/sig
+GENFILES = $(SYMROOT)/install_internal.h \
+       $(SYMROOT)/install_external.h \
+       $(SYMROOT)/install_table.c \
+       $(SYMROOT)/install_defs.h
+
+all: $(DIRS_NEEDED) install_external.h install.module
+
+install.module: $(SYMROOT) $(OBJS)
+       $(CC) $(COPTS) $(CFLAGS) $(RC_CFLAGS) -o $@ \
+               $(OBJS) \
+               -e _install_functions -u _install_functions \
+                -seg1addr 30000 -preload -nostdlib $(LIBS)
+
+install_internal.h: install_external.h
+install_table.c: install_external.h
+install_defs.h: install_external.h
+install_external.h: install.def
+       $(SIG) -d $(SYMROOT) -n install install.def
+
+install_i386:: all $(INSTALLDIR)
+       cp $(SYMROOT)/boot $(OTHER_FILES) $(INSTALLDIR)
+       cd $(INSTALLDIR); chmod u+w boot $(OTHER_FILES)
+
+clean::
+       rm -f $(SYMROOT)/boot.sys $(GENFILES)
+
+include ../MakeInc.dir
+
+#dependencies
+-include $(OBJROOT)/Makedep
diff --git a/i386/testmodule/install/install.def b/i386/testmodule/install/install.def
new file mode 100644 (file)
index 0000000..c19d16f
--- /dev/null
@@ -0,0 +1,9 @@
+int install_choose( char **strings, int nstrings, int min, int max )
+strings, nstrings, min, max;
+int install_chooseFromDriverList(
+    char *title,
+    char *message,
+    char **strings,
+    int nstrings
+) title, message, strings, nstrings;
+void install_clearScreen(void) ;
\ No newline at end of file
diff --git a/i386/testmodule/install/install.h b/i386/testmodule/install/install.h
new file mode 100644 (file)
index 0000000..252ea96
--- /dev/null
@@ -0,0 +1,30 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
+ * Reserved.  This file contains Original Code and/or Modifications of
+ * Original Code as defined in and that are subject to the Apple Public
+ * Source License Version 1.1 (the "License").  You may not use this file
+ * except in compliance with the License.  Please obtain a copy of the
+ * License at http://www.apple.com/publicsource and read it before using
+ * this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+
+#ifdef INSTALL_INTERNAL_USER
+#import "install_internal.h"
+#import "install_defs.h"
+#else
+#import "install_external.h"
+#endif
\ No newline at end of file
diff --git a/i386/testmodule/install/install.module b/i386/testmodule/install/install.module
new file mode 100755 (executable)
index 0000000..5258bb3
Binary files /dev/null and b/i386/testmodule/install/install.module differ
diff --git a/i386/testmodule/install/mode.c b/i386/testmodule/install/mode.c
new file mode 100644 (file)
index 0000000..7afcb19
--- /dev/null
@@ -0,0 +1,95 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
+ * Reserved.  This file contains Original Code and/or Modifications of
+ * Original Code as defined in and that are subject to the Apple Public
+ * Source License Version 1.1 (the "License").  You may not use this file
+ * except in compliance with the License.  Please obtain a copy of the
+ * License at http://www.apple.com/publicsource and read it before using
+ * this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+#import "libsa.h"
+#import "libsaio.h"
+#import "install.h"
+
+void install_enterInstallMode(void)
+{
+    int answer, count, size;
+    char *LanguageTable, *val;
+    char *LoadableFamilies;
+    
+    /* Load language choice table */
+    loadConfigFile("/usr/standalone/i386/Language.table",
+       &LanguageTable, 1);
+    
+    /* Get language choices. */
+    if (LanguageTable &&
+       getValueForStringTableKey(
+           LanguageTable, "Languages", &val, &count))
+    {
+       char *string, *languages[16], *language_strings[16];
+       int nlang = 0;
+    
+       while (string = (char *)newStringFromList(&val, &count)) {
+           languages[nlang] = string;
+           language_strings[nlang++] = (char *)
+               newStringForStringTableKey(
+                   LanguageTable, string);
+       }
+    
+       for(answer = -1; answer == -1;) {
+           install_clearScreen();
+           answer = install_choose(language_strings, nlang,
+               1, nlang);
+       }
+       setLanguage(languages[answer - 1]);
+       while (nlang)
+           zfree(language_strings[nlang--]);
+       /* Don't bother freeing the language names. */
+       
+       zfree(LanguageTable);
+    } else {
+       printf("Could not load language choice file; "
+           "defaulting to English.\n");
+       setLanguage("English");
+    }
+    
+    /* Now save the language in the "Language" key,
+       * which has cleverly been made large for us.
+       */
+    if (getValueForKey("Language", &val, &size)) {
+       char *Language = getLanguage();
+       if ((strlen(Language)+2) < size) {
+           strcpy(val, Language);
+           val += strlen(Language);
+           *val++ = '\"';
+           *val++ = ';';
+           *val++ = '\n';
+           size -= strlen(Language) + 1;
+           while (size--)
+               *val++ = ' ';
+       }
+    }
+    
+    /* Now limit the families we look for when considering
+       * drivers during installation.
+       */
+    if (getValueForKey("Installation Driver Families",
+                                           &val, &size)) {
+       LoadableFamilies = zalloc(size+1);
+       strncpy(LoadableFamilies,val,size);
+    }
+}
\ No newline at end of file
diff --git a/i386/testmodule/test.c b/i386/testmodule/test.c
new file mode 100644 (file)
index 0000000..12e49b1
--- /dev/null
@@ -0,0 +1,45 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
+ * Reserved.  This file contains Original Code and/or Modifications of
+ * Original Code as defined in and that are subject to the Apple Public
+ * Source License Version 1.1 (the "License").  You may not use this file
+ * except in compliance with the License.  Please obtain a copy of the
+ * License at http://www.apple.com/publicsource and read it before using
+ * this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+#import "testmodule/test.h"
+
+extern unsigned long (*test_functions[])();
+void *test_entry = test_functions;
+
+void test_init(char *string)
+{
+    printf("Here comes your string...\n");
+    printf(string);
+}
+
+void test_start(char *string)
+{
+    printf("Here comes your string...\n");
+    printf(string);
+}
+
+void test_end(char *string)
+{
+    printf("Here comes your string...\n");
+    printf(string);
+}
\ No newline at end of file
diff --git a/i386/testmodule/test.def b/i386/testmodule/test.def
new file mode 100644 (file)
index 0000000..c258652
--- /dev/null
@@ -0,0 +1,3 @@
+void test_init(char *string) string;
+void test_start(char *string) string;
+void test_end(char *string) string;
\ No newline at end of file
diff --git a/i386/testmodule/test.h b/i386/testmodule/test.h
new file mode 100644 (file)
index 0000000..08575be
--- /dev/null
@@ -0,0 +1,33 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
+ * Reserved.  This file contains Original Code and/or Modifications of
+ * Original Code as defined in and that are subject to the Apple Public
+ * Source License Version 1.1 (the "License").  You may not use this file
+ * except in compliance with the License.  Please obtain a copy of the
+ * License at http://www.apple.com/publicsource and read it before using
+ * this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+#import "libsaio.h"
+moduleEntry_t test_table_pointer;
+#define TEST_TABLE_POINTER (test_table_pointer)
+#ifdef TEST_INTERNAL_USER
+#import "test_internal.h"
+#import "test_defs.h"
+#else
+#import "test_external.h"
+#endif
+
diff --git a/i386/testmodule/test.module b/i386/testmodule/test.module
new file mode 100755 (executable)
index 0000000..533445a
Binary files /dev/null and b/i386/testmodule/test.module differ
diff --git a/i386/tests/Makefile b/i386/tests/Makefile
new file mode 100644 (file)
index 0000000..15d2a8b
--- /dev/null
@@ -0,0 +1,14 @@
+CFLAGS = -g
+TESTS= rldtest satest
+LIBSA= ../sym/libsa.a
+
+all: $(TESTS)
+
+sizeof: sizeof.c
+       cc -I../libsa sizeof.c -o sizeof
+
+rldtest: rldtest.o
+       cc -o rldtest rldtest.o
+
+satest: satest.o $(LIBSA)
+       cc -o satest satest.o $(LIBSA) -lsys_s
diff --git a/i386/tests/bootHelper.c b/i386/tests/bootHelper.c
new file mode 100644 (file)
index 0000000..07ddc33
--- /dev/null
@@ -0,0 +1,58 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
+ * Reserved.  This file contains Original Code and/or Modifications of
+ * Original Code as defined in and that are subject to the Apple Public
+ * Source License Version 1.1 (the "License").  You may not use this file
+ * except in compliance with the License.  Please obtain a copy of the
+ * License at http://www.apple.com/publicsource and read it before using
+ * this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/* Boot helper */
+
+#import <mach-o/loader.h>
+
+sa_rld(
+char              *basefile_name,  // base file name
+struct mach_header *basefile_addr,  // mach header of the base file
+
+char               *object_name,    // name of the object to load
+char               *object_addr,    // addr of the object in memory to load
+unsigned long       object_size,    // size of the object in memory to load
+
+char               *workmem_addr,   // address of working memory
+unsigned long      *workmem_size,   // size of working memory (in/out)
+
+char               *error_buf_addr, // address of error message buffer
+unsigned long       error_buf_size, // size of error message buffer
+
+char               *malloc_addr,    // address to use for initializing malloc
+unsigned long       malloc_len     // length to use for same
+)
+{
+    static int firstTime = 0;
+    char helloString[] = "BootHelper here!";
+    
+    sprintf(error_buf_addr, "OK, here I am.\n");
+    error_buf_addr += strlen(error_buf_addr);
+    if (firstTime == 0) {
+       //zinit(malloc_addr, malloc_len);
+       bzero(malloc_addr, malloc_len);
+       firstTime = 1;
+       sprintf(error_buf_addr, "I initialized the malloc arena.\n");
+       error_buf_addr += strlen(error_buf_addr);
+    }
+}
diff --git a/i386/tests/rldtest.c b/i386/tests/rldtest.c
new file mode 100644 (file)
index 0000000..428ee4e
--- /dev/null
@@ -0,0 +1,259 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
+ * Reserved.  This file contains Original Code and/or Modifications of
+ * Original Code as defined in and that are subject to the Apple Public
+ * Source License Version 1.1 (the "License").  You may not use this file
+ * except in compliance with the License.  Please obtain a copy of the
+ * License at http://www.apple.com/publicsource and read it before using
+ * this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/* test of standalone rld
+ * usage: rldtest <sarld> <kernel> <driver>
+ *
+ */
+
+#include <stdio.h>
+#include <streams/streams.h>
+#include <mach-o/loader.h>
+
+extern int errno;
+
+typedef unsigned int entry_t;
+struct mach_header head;
+
+#define zalloc(a) malloc(a)
+#define zfree(a) free(a)
+#define xread read
+
+#define min(a,b) ((a) < (b) ? (a) : (b))
+
+extern void *malloc(int size);
+loadmacho(
+    struct mach_header *head,
+    int dev,
+    int io,
+    entry_t *rentry,
+    char **raddr,
+    int *rsize,
+    int file_offset
+)
+{
+       int ncmds;
+       unsigned  cmds, cp;
+       struct xxx_thread_command {
+               unsigned long   cmd;
+               unsigned long   cmdsize;
+               unsigned long   flavor;
+               unsigned long   count;
+               i386_thread_state_t state;
+       } *th;
+       unsigned int    entry;
+       int size, vmsize = 0;
+       unsigned int vmaddr = ~0;
+
+       // XXX should check cputype
+       cmds = (unsigned int) zalloc(head->sizeofcmds);
+       b_lseek(io, sizeof (struct mach_header) + file_offset, 0);
+
+       if (read(io, cmds, head->sizeofcmds) != head->sizeofcmds)
+{printf("error reading commands\n");
+           goto shread;}
+    
+       for (ncmds = head->ncmds, cp = cmds; ncmds > 0; ncmds--)
+       {
+               unsigned int    addr;
+
+//             putchar('.');
+
+#define lcp    ((struct load_command *)cp)             
+               switch (lcp->cmd)
+               {
+           
+               case LC_SEGMENT:
+#define scp    ((struct segment_command *)cp)
+
+                       addr = (scp->vmaddr & 0x3fffffff) + (int)*raddr;
+                       if (scp->filesize) {
+                           // Is this an OK assumption?
+                           // if the filesize is zero, it doesn't
+                           // take up any virtual space...
+                           // (Hopefully this only excludes PAGEZERO.)
+                           // Also, ignore linkedit segment when
+                           // computing size, because we will erase
+                           // the linkedit segment later.
+                           if(strncmp(scp->segname, SEG_LINKEDIT,
+                                           sizeof(scp->segname)) != 0)
+                               vmsize += scp->vmsize;
+                           vmaddr = min(vmaddr, addr);
+                           
+                           // Zero any space at the end of the segment.
+                           bzero((char *)(addr + scp->filesize),
+                               scp->vmsize - scp->filesize);
+                               
+                           // FIXME:  check to see if we overflow
+                           // the available space (should be passed in
+                           // as the size argument).
+                           
+                           b_lseek(io, scp->fileoff + file_offset, 0);
+                           if (xread(io, (char *)addr, scp->filesize)
+                                                       != scp->filesize) {
+                                       printf("Error loading section\n");
+                                       printf("File size =%x; fileoff_set=%x; addr=%x\n",
+                                               scp->filesize, scp->fileoff, addr);
+                                       goto shread;
+                           }
+                       }
+                       break;
+                   
+               case LC_THREAD:
+               case LC_UNIXTHREAD:
+                       th = (struct xxx_thread_command *)cp;
+                       entry = th->state.eip;
+                       break;
+               }
+           
+               cp += lcp->cmdsize;
+       }
+
+//     kernBootStruct->rootdev = (dev & 0xffffff00) | devMajor[Dev(dev)];
+
+       zfree((char *)cmds);
+       *rentry = (entry_t)( (int) entry & 0x3fffffff );
+       *rsize = vmsize;
+       *raddr = (char *)vmaddr;
+       return 0;
+
+shread:
+       zfree((char *)cmds);
+       printf("Read error\n");
+       return -1;
+}
+
+loadprog(
+       int             dev,
+       int             fd,
+       entry_t         *entry,         // entry point
+       char            **addr,         // load address
+       int             *size           // size of loaded program
+)
+{
+    /* get file header */
+    read(fd, &head, sizeof(head));
+
+    if (head.magic == MH_MAGIC) {
+       return loadmacho((struct mach_header *) &head,
+               dev, fd, entry, addr, size,0);
+    }
+
+    else if (head.magic == 0xbebafeca)
+    {
+       printf("no fat binary support yet\n");
+       return -1;
+    }
+
+    printf("unrecognized binary format\n");
+    return -1;
+}
+
+#define DRIVER "/usr/Devices/EtherExpress16.config/EtherExpress16_reloc"
+
+void usage(void)
+{
+    fprintf(stderr,"usage: rldtest <sarld> <kernel> <driver>\n");
+    exit(1);
+}
+
+main(int argc, char **argv)
+{
+    int fd;
+    char *mem, *workmem, *ebuf;
+    char *laddr, *kaddr, *daddr;
+    NXStream *str;
+    struct mach_header *mh;
+    int ret, size, ksize, dsize, count;
+    entry_t entry;
+    int (*fn)();
+    struct section *sp;
+    char *kernel, *sarld, *driver;
+    
+    if (argc != 4)
+       usage();
+    sarld = argv[1];
+    kernel = argv[2];
+    driver = argv[3];
+    mem = malloc(1024 * 1024 * 16);
+    printf("mem = %x\n",mem);
+    laddr = (char *)0x0;
+    fd = open(sarld,0);
+    if (fd < 0) {
+       fprintf(stderr, "couldn't open sarld %s, error %d\n",sarld,errno);
+       exit(1);
+    }
+    printf("fd = %d\n",fd);
+    loadprog(0, fd, &entry, &laddr, &size);
+    close(fd);
+    printf("entry = %x, laddr = %x, size = %d\n",entry, laddr, size);
+    fn = (int (*)())entry;
+    fd = open(kernel,0);
+    if (fd < 0) {
+       fprintf(stderr, "couldn't open kernel %s, error %d\n",kernel,errno);
+       exit(1);
+    }
+    kaddr = 0;
+    loadprog(0, fd, &entry, &kaddr, &ksize);
+    printf("entry = %x, kaddr = %x, ksize = %d\n",entry, kaddr, ksize);
+    close(fd);
+    daddr = (char *)0x70000;
+    fd = open(driver,0);
+    if (fd < 0) {
+       fprintf(stderr, "couldn't open driver %s, error %d\n",driver,errno);
+       exit(1);
+    }
+    size = 0;
+    do {
+       count = read(fd, daddr, 65536);
+       daddr += count;
+       size += count;
+    } while (count > 0);
+    daddr = (char *)0x70000;
+    printf("entry = %x, daddr = %x, size = %d\n",entry, daddr, size);
+    close(fd);
+    workmem = malloc(300 * 1024);
+    ebuf = malloc(64 * 1024);
+    ebuf[0] = 0;
+    dsize = 16 * 1024 * 1024 - (int)kaddr - (int)ksize;
+    printf("about to call %x\n",fn);
+    ret = (*fn)( "mach_kernel", kaddr,
+       "driver", daddr, size,
+       kaddr + ksize, &dsize,
+       ebuf, 64 * 1024,
+       workmem, 300 * 1024
+    );
+    printf("rld return: %d '%s'\n",ret, ebuf);
+    
+#define SEG_OBJC "__OBJC"
+    sp = getsectbyname ("__TEXT", "__text");
+    printf("text section: %s\n",sp->sectname);
+    sp = getsectbynamefromheader (kaddr+ksize, "__OBJC", "__module_info");
+    printf("objc section: %s\n",sp->sectname);
+    sp = getsectdatafromheader (kaddr+ksize,
+                   SEG_OBJC, "__module_info", &size);
+    printf("objc section: %s\n",sp->sectname);
+
+    printf("getsectdata ret = %d\n",sp);
+    free(mem);
+}
diff --git a/i386/tests/satest.c b/i386/tests/satest.c
new file mode 100644 (file)
index 0000000..ea5c106
--- /dev/null
@@ -0,0 +1,110 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
+ * Reserved.  This file contains Original Code and/or Modifications of
+ * Original Code as defined in and that are subject to the Apple Public
+ * Source License Version 1.1 (the "License").  You may not use this file
+ * except in compliance with the License.  Please obtain a copy of the
+ * License at http://www.apple.com/publicsource and read it before using
+ * this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/* test standalone library */
+#include <stdarg.h>
+
+#define TEST_RESULT "The quick brown #5 fox did fine.\n"
+#define TEST_FMT "The quick %s #%d fox did fine.\n"
+#define TEST_ARGS "brown", 5
+char error_buf[1024];
+char *sa_rld_error_buf_addr = error_buf;
+int sa_rld_error_buf_size = 1024;
+char progname[] = "satest";
+
+ /*
+ * All printing of all messages goes through this function.
+ */
+void
+vprint(
+const char *format,
+va_list ap)
+{
+       sa_rld_error_buf_size =- slvprintf(sa_rld_error_buf_addr,
+                                          sa_rld_error_buf_size,
+                                          format, ap);
+}
+/*
+ * Print the error message and set the 'error' indication.
+ */
+void
+error(
+const char *format,
+...)
+{
+    va_list ap;
+
+//     if(arch_multiple)
+//         print_architecture_banner();
+       va_start(ap, format);
+//        print("%s: ", progname);
+       vprint(format, ap);
+//        print("\n");
+       va_end(ap);
+//     errors = 1;
+}
+
+main()
+{
+    char buf[1024];
+    int args[4], ret;
+    
+    printf("Testing standalone library\n");
+    printf("The following two lines should be identical:\n");
+    sprintf(buf, TEST_FMT, TEST_ARGS);
+    printf(buf);
+    printf(TEST_RESULT);
+    printf("\nThe following two lines should be identical:\n");
+    error(TEST_FMT, TEST_ARGS);
+    printf(error_buf);
+    printf(TEST_RESULT); 
+    
+    printf("Comparing two strings:\n");
+    ret = strcmp("abra","cadabra");
+    printf("%d should not be 0.\n",ret);
+    
+    printf("Comparing two strings:\n");
+    ret = strcmp("abra","abra");
+    printf("%d should be 0.\n",ret);
+    
+    printf("Comparing two strings:\n");
+    ret = strncmp("abcdefghij","abcdef",6);
+    printf("%d should be 0.\n",ret);
+    
+    printf("printf(\"Test: %% 12s\\n\",\"abb\");\n");
+    printf("Test:          abb\n");
+    printf("Test: % 12s\n","abb");
+    
+    printf("printf(\"Test: %%04d\\n\",77);\n");
+    printf("Test: 0077\n");
+    printf("Test: %04d\n",77);
+    
+    printf("printf(\"Test: %% 2d\\n\",9);\n");
+    printf("Test:  9\n");
+    printf("Test: % 2d\n",9);
+
+    printf("printf(\"Test: %% 8d\\n\",-9);\n");
+    printf("Test:       -9\n");
+    printf("Test: % 8d\n",-9);
+}
diff --git a/i386/tests/sizeof b/i386/tests/sizeof
new file mode 100755 (executable)
index 0000000..540414f
Binary files /dev/null and b/i386/tests/sizeof differ
diff --git a/i386/tests/sizeof.c b/i386/tests/sizeof.c
new file mode 100644 (file)
index 0000000..9bd48db
--- /dev/null
@@ -0,0 +1,32 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
+ * Reserved.  This file contains Original Code and/or Modifications of
+ * Original Code as defined in and that are subject to the Apple Public
+ * Source License Version 1.1 (the "License").  You may not use this file
+ * except in compliance with the License.  Please obtain a copy of the
+ * License at http://www.apple.com/publicsource and read it before using
+ * this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+#import "kernBootStruct.h"
+
+main()
+{
+    printf("sizeof(kernBootStruct) = %d (0x%x)\n",
+       sizeof(KERNBOOTSTRUCT),
+       sizeof(KERNBOOTSTRUCT));
+    exit(0);
+}
diff --git a/i386/util/12.Charcoal b/i386/util/12.Charcoal
new file mode 100644 (file)
index 0000000..0b595c0
--- /dev/null
@@ -0,0 +1,3484 @@
+STARTFONT 2.1
+FONT Charcoal
+SIZE 12 75 75
+FONTBOUNDINGBOX 16 15 -1 -3
+CHARS 228
+STARTCHAR space
+ENCODING 32
+SWIDTH 249 0
+DWIDTH 3 0
+BBX 0 0 0 0
+BITMAP
+ENDCHAR
+STARTCHAR exclam
+ENCODING 33
+SWIDTH 346 0
+DWIDTH 5 0
+BBX 2 9 2 0
+BITMAP
+c0
+c0
+c0
+c0
+c0
+c0
+00
+c0
+c0
+ENDCHAR
+STARTCHAR quotedbl
+ENCODING 34
+SWIDTH 498 0
+DWIDTH 6 0
+BBX 5 3 1 6
+BITMAP
+d8
+d8
+d8
+ENDCHAR
+STARTCHAR numbersign
+ENCODING 35
+SWIDTH 746 0
+DWIDTH 9 0
+BBX 9 9 0 0
+BITMAP
+0a00
+0a00
+7f80
+7f80
+1400
+ff00
+ff00
+2800
+2800
+ENDCHAR
+STARTCHAR dollar
+ENCODING 36
+SWIDTH 583 0
+DWIDTH 7 0
+BBX 6 11 1 -1
+BITMAP
+10
+7c
+d0
+d0
+f0
+78
+3c
+2c
+2c
+f8
+20
+ENDCHAR
+STARTCHAR percent
+ENCODING 37
+SWIDTH 917 0
+DWIDTH 11 0
+BBX 11 9 0 0
+BITMAP
+7100
+d900
+da00
+7400
+0400
+09c0
+0b60
+1360
+11c0
+ENDCHAR
+STARTCHAR ampersand
+ENCODING 38
+SWIDTH 708 0
+DWIDTH 9 0
+BBX 8 9 1 0
+BITMAP
+38
+6c
+6c
+38
+73
+db
+ce
+ce
+7b
+ENDCHAR
+STARTCHAR quoteright
+ENCODING 39
+SWIDTH 332 0
+DWIDTH 4 0
+BBX 2 4 1 5
+BITMAP
+c0
+c0
+40
+80
+ENDCHAR
+STARTCHAR parenleft
+ENCODING 40
+SWIDTH 415 0
+DWIDTH 5 0
+BBX 4 11 1 -2
+BITMAP
+30
+60
+60
+c0
+c0
+c0
+c0
+c0
+60
+60
+30
+ENDCHAR
+STARTCHAR parenright
+ENCODING 41
+SWIDTH 415 0
+DWIDTH 5 0
+BBX 4 11 1 -2
+BITMAP
+c0
+60
+60
+30
+30
+30
+30
+30
+60
+60
+c0
+ENDCHAR
+STARTCHAR asterisk
+ENCODING 42
+SWIDTH 538 0
+DWIDTH 7 0
+BBX 6 5 1 3
+BITMAP
+48
+30
+fc
+30
+48
+ENDCHAR
+STARTCHAR plus
+ENCODING 43
+SWIDTH 580 0
+DWIDTH 7 0
+BBX 6 6 1 1
+BITMAP
+30
+30
+fc
+fc
+30
+30
+ENDCHAR
+STARTCHAR comma
+ENCODING 44
+SWIDTH 285 0
+DWIDTH 3 0
+BBX 2 4 1 -2
+BITMAP
+c0
+c0
+40
+80
+ENDCHAR
+STARTCHAR hyphen
+ENCODING 45
+SWIDTH 581 0
+DWIDTH 7 0
+BBX 5 2 1 3
+BITMAP
+f8
+f8
+ENDCHAR
+STARTCHAR period
+ENCODING 46
+SWIDTH 285 0
+DWIDTH 3 0
+BBX 2 2 1 0
+BITMAP
+c0
+c0
+ENDCHAR
+STARTCHAR slash
+ENCODING 47
+SWIDTH 463 0
+DWIDTH 6 0
+BBX 5 9 1 0
+BITMAP
+08
+18
+10
+30
+20
+60
+40
+c0
+80
+ENDCHAR
+STARTCHAR zero
+ENCODING 48
+SWIDTH 580 0
+DWIDTH 7 0
+BBX 6 9 1 0
+BITMAP
+78
+cc
+cc
+cc
+cc
+cc
+cc
+cc
+78
+ENDCHAR
+STARTCHAR one
+ENCODING 49
+SWIDTH 580 0
+DWIDTH 7 0
+BBX 3 9 2 0
+BITMAP
+60
+e0
+60
+60
+60
+60
+60
+60
+60
+ENDCHAR
+STARTCHAR two
+ENCODING 50
+SWIDTH 580 0
+DWIDTH 7 0
+BBX 6 9 1 0
+BITMAP
+78
+cc
+0c
+0c
+18
+30
+60
+c0
+fc
+ENDCHAR
+STARTCHAR three
+ENCODING 51
+SWIDTH 580 0
+DWIDTH 7 0
+BBX 6 9 1 0
+BITMAP
+78
+cc
+0c
+0c
+38
+0c
+0c
+cc
+78
+ENDCHAR
+STARTCHAR four
+ENCODING 52
+SWIDTH 580 0
+DWIDTH 7 0
+BBX 7 9 0 0
+BITMAP
+04
+0c
+1c
+2c
+4c
+fe
+0c
+0c
+0c
+ENDCHAR
+STARTCHAR five
+ENCODING 53
+SWIDTH 580 0
+DWIDTH 7 0
+BBX 6 9 1 0
+BITMAP
+fc
+c0
+c0
+f8
+0c
+0c
+0c
+cc
+78
+ENDCHAR
+STARTCHAR six
+ENCODING 54
+SWIDTH 580 0
+DWIDTH 7 0
+BBX 6 9 1 0
+BITMAP
+38
+60
+c0
+f8
+cc
+cc
+cc
+cc
+78
+ENDCHAR
+STARTCHAR seven
+ENCODING 55
+SWIDTH 580 0
+DWIDTH 7 0
+BBX 6 9 1 0
+BITMAP
+fc
+0c
+18
+10
+30
+30
+60
+60
+60
+ENDCHAR
+STARTCHAR eight
+ENCODING 56
+SWIDTH 580 0
+DWIDTH 7 0
+BBX 6 9 1 0
+BITMAP
+78
+cc
+cc
+cc
+78
+cc
+cc
+cc
+78
+ENDCHAR
+STARTCHAR nine
+ENCODING 57
+SWIDTH 580 0
+DWIDTH 7 0
+BBX 6 9 1 0
+BITMAP
+78
+cc
+cc
+cc
+cc
+7c
+0c
+18
+70
+ENDCHAR
+STARTCHAR colon
+ENCODING 58
+SWIDTH 249 0
+DWIDTH 3 0
+BBX 2 7 1 0
+BITMAP
+c0
+c0
+00
+00
+00
+c0
+c0
+ENDCHAR
+STARTCHAR semicolon
+ENCODING 59
+SWIDTH 249 0
+DWIDTH 3 0
+BBX 2 9 1 -2
+BITMAP
+c0
+c0
+00
+00
+00
+c0
+c0
+40
+80
+ENDCHAR
+STARTCHAR less
+ENCODING 60
+SWIDTH 500 0
+DWIDTH 6 0
+BBX 4 6 1 0
+BITMAP
+30
+60
+c0
+c0
+60
+30
+ENDCHAR
+STARTCHAR equal
+ENCODING 61
+SWIDTH 580 0
+DWIDTH 7 0
+BBX 5 5 1 1
+BITMAP
+f8
+f8
+00
+f8
+f8
+ENDCHAR
+STARTCHAR greater
+ENCODING 62
+SWIDTH 500 0
+DWIDTH 6 0
+BBX 4 6 1 0
+BITMAP
+c0
+60
+30
+30
+60
+c0
+ENDCHAR
+STARTCHAR question
+ENCODING 63
+SWIDTH 448 0
+DWIDTH 6 0
+BBX 5 9 1 0
+BITMAP
+f0
+18
+18
+30
+60
+60
+00
+60
+60
+ENDCHAR
+STARTCHAR at
+ENCODING 64
+SWIDTH 913 0
+DWIDTH 11 0
+BBX 10 11 1 -2
+BITMAP
+1e00
+6180
+4080
+9a40
+b640
+b640
+b640
+9b80
+4000
+6000
+1e00
+ENDCHAR
+STARTCHAR A
+ENCODING 65
+SWIDTH 663 0
+DWIDTH 8 0
+BBX 8 9 0 0
+BITMAP
+18
+18
+3c
+3c
+26
+66
+7e
+c3
+c3
+ENDCHAR
+STARTCHAR B
+ENCODING 66
+SWIDTH 634 0
+DWIDTH 8 0
+BBX 7 9 1 0
+BITMAP
+f8
+cc
+cc
+f8
+cc
+c6
+c6
+cc
+f8
+ENDCHAR
+STARTCHAR C
+ENCODING 67
+SWIDTH 581 0
+DWIDTH 7 0
+BBX 6 9 1 0
+BITMAP
+3c
+64
+c0
+c0
+c0
+c0
+c0
+60
+3c
+ENDCHAR
+STARTCHAR D
+ENCODING 68
+SWIDTH 664 0
+DWIDTH 8 0
+BBX 7 9 1 0
+BITMAP
+f8
+cc
+c6
+c6
+c6
+c6
+c6
+cc
+f8
+ENDCHAR
+STARTCHAR E
+ENCODING 69
+SWIDTH 570 0
+DWIDTH 7 0
+BBX 6 9 1 0
+BITMAP
+fc
+c0
+c0
+c0
+f8
+c0
+c0
+c0
+fc
+ENDCHAR
+STARTCHAR F
+ENCODING 70
+SWIDTH 542 0
+DWIDTH 6 0
+BBX 5 9 1 0
+BITMAP
+f8
+c0
+c0
+c0
+f0
+c0
+c0
+c0
+c0
+ENDCHAR
+STARTCHAR G
+ENCODING 71
+SWIDTH 664 0
+DWIDTH 8 0
+BBX 7 9 1 0
+BITMAP
+3c
+64
+c0
+c0
+ce
+c6
+c6
+66
+3c
+ENDCHAR
+STARTCHAR H
+ENCODING 72
+SWIDTH 664 0
+DWIDTH 8 0
+BBX 7 9 1 0
+BITMAP
+c6
+c6
+c6
+c6
+fe
+c6
+c6
+c6
+c6
+ENDCHAR
+STARTCHAR I
+ENCODING 73
+SWIDTH 366 0
+DWIDTH 5 0
+BBX 2 9 2 0
+BITMAP
+c0
+c0
+c0
+c0
+c0
+c0
+c0
+c0
+c0
+ENDCHAR
+STARTCHAR J
+ENCODING 74
+SWIDTH 466 0
+DWIDTH 6 0
+BBX 4 9 1 0
+BITMAP
+30
+30
+30
+30
+30
+30
+30
+30
+e0
+ENDCHAR
+STARTCHAR K
+ENCODING 75
+SWIDTH 654 0
+DWIDTH 8 0
+BBX 7 9 1 0
+BITMAP
+c6
+cc
+d8
+f0
+f0
+f8
+dc
+ce
+c6
+ENDCHAR
+STARTCHAR L
+ENCODING 76
+SWIDTH 550 0
+DWIDTH 6 0
+BBX 5 9 1 0
+BITMAP
+c0
+c0
+c0
+c0
+c0
+c0
+c0
+c0
+f8
+ENDCHAR
+STARTCHAR M
+ENCODING 77
+SWIDTH 918 0
+DWIDTH 11 0
+BBX 10 9 1 0
+BITMAP
+c0c0
+c0c0
+e1c0
+e1c0
+b2c0
+b2c0
+9cc0
+9cc0
+88c0
+ENDCHAR
+STARTCHAR N
+ENCODING 78
+SWIDTH 682 0
+DWIDTH 8 0
+BBX 7 9 1 0
+BITMAP
+82
+c2
+e2
+f2
+ba
+9e
+8e
+86
+82
+ENDCHAR
+STARTCHAR O
+ENCODING 79
+SWIDTH 667 0
+DWIDTH 8 0
+BBX 7 9 1 0
+BITMAP
+38
+6c
+c6
+c6
+c6
+c6
+c6
+6c
+38
+ENDCHAR
+STARTCHAR P
+ENCODING 80
+SWIDTH 581 0
+DWIDTH 7 0
+BBX 6 9 1 0
+BITMAP
+f8
+cc
+cc
+cc
+f8
+c0
+c0
+c0
+c0
+ENDCHAR
+STARTCHAR Q
+ENCODING 81
+SWIDTH 667 0
+DWIDTH 8 0
+BBX 7 11 1 -2
+BITMAP
+38
+6c
+c6
+c6
+c6
+c6
+c6
+6e
+3c
+18
+0c
+ENDCHAR
+STARTCHAR R
+ENCODING 82
+SWIDTH 611 0
+DWIDTH 7 0
+BBX 6 9 1 0
+BITMAP
+f8
+cc
+cc
+cc
+f8
+dc
+cc
+cc
+cc
+ENDCHAR
+STARTCHAR S
+ENCODING 83
+SWIDTH 564 0
+DWIDTH 7 0
+BBX 5 9 1 0
+BITMAP
+78
+c0
+c0
+e0
+70
+38
+18
+18
+f0
+ENDCHAR
+STARTCHAR T
+ENCODING 84
+SWIDTH 500 0
+DWIDTH 6 0
+BBX 6 9 0 0
+BITMAP
+fc
+30
+30
+30
+30
+30
+30
+30
+30
+ENDCHAR
+STARTCHAR U
+ENCODING 85
+SWIDTH 656 0
+DWIDTH 8 0
+BBX 7 9 1 0
+BITMAP
+c2
+c2
+c2
+c2
+c2
+c2
+c2
+64
+38
+ENDCHAR
+STARTCHAR V
+ENCODING 86
+SWIDTH 609 0
+DWIDTH 8 0
+BBX 8 9 0 0
+BITMAP
+c3
+c2
+66
+66
+64
+3c
+3c
+18
+18
+ENDCHAR
+STARTCHAR W
+ENCODING 87
+SWIDTH 943 0
+DWIDTH 12 0
+BBX 12 9 0 0
+BITMAP
+c630
+c620
+c620
+6f60
+6b40
+7bc0
+3180
+3180
+3180
+ENDCHAR
+STARTCHAR X
+ENCODING 88
+SWIDTH 611 0
+DWIDTH 8 0
+BBX 8 9 0 0
+BITMAP
+e3
+66
+34
+38
+18
+3c
+2c
+66
+c7
+ENDCHAR
+STARTCHAR Y
+ENCODING 89
+SWIDTH 648 0
+DWIDTH 8 0
+BBX 8 9 0 0
+BITMAP
+e3
+62
+66
+34
+3c
+18
+18
+18
+18
+ENDCHAR
+STARTCHAR Z
+ENCODING 90
+SWIDTH 541 0
+DWIDTH 7 0
+BBX 6 9 1 0
+BITMAP
+fc
+0c
+18
+18
+30
+60
+60
+c0
+fc
+ENDCHAR
+STARTCHAR bracketleft
+ENCODING 91
+SWIDTH 395 0
+DWIDTH 5 0
+BBX 3 11 1 -2
+BITMAP
+e0
+c0
+c0
+c0
+c0
+c0
+c0
+c0
+c0
+c0
+e0
+ENDCHAR
+STARTCHAR backslash
+ENCODING 92
+SWIDTH 463 0
+DWIDTH 6 0
+BBX 5 9 0 0
+BITMAP
+80
+c0
+40
+60
+20
+30
+10
+18
+08
+ENDCHAR
+STARTCHAR bracketright
+ENCODING 93
+SWIDTH 395 0
+DWIDTH 5 0
+BBX 3 11 1 -2
+BITMAP
+e0
+60
+60
+60
+60
+60
+60
+60
+60
+60
+e0
+ENDCHAR
+STARTCHAR asciicircum
+ENCODING 94
+SWIDTH 550 0
+DWIDTH 7 0
+BBX 6 5 1 4
+BITMAP
+30
+78
+78
+cc
+cc
+ENDCHAR
+STARTCHAR underscore
+ENCODING 95
+SWIDTH 498 0
+DWIDTH 6 0
+BBX 5 1 1 -2
+BITMAP
+f8
+ENDCHAR
+STARTCHAR quoteleft
+ENCODING 96
+SWIDTH 332 0
+DWIDTH 4 0
+BBX 2 4 1 5
+BITMAP
+40
+80
+c0
+c0
+ENDCHAR
+STARTCHAR a
+ENCODING 97
+SWIDTH 604 0
+DWIDTH 8 0
+BBX 6 7 1 0
+BITMAP
+78
+0c
+7c
+cc
+cc
+dc
+6c
+ENDCHAR
+STARTCHAR b
+ENCODING 98
+SWIDTH 634 0
+DWIDTH 8 0
+BBX 6 9 1 0
+BITMAP
+c0
+c0
+d8
+ec
+cc
+cc
+cc
+cc
+f8
+ENDCHAR
+STARTCHAR c
+ENCODING 99
+SWIDTH 549 0
+DWIDTH 7 0
+BBX 5 7 1 0
+BITMAP
+78
+c8
+c0
+c0
+c0
+c0
+78
+ENDCHAR
+STARTCHAR d
+ENCODING 100
+SWIDTH 634 0
+DWIDTH 8 0
+BBX 6 9 1 0
+BITMAP
+0c
+0c
+7c
+cc
+cc
+cc
+cc
+cc
+74
+ENDCHAR
+STARTCHAR e
+ENCODING 101
+SWIDTH 636 0
+DWIDTH 8 0
+BBX 6 7 1 0
+BITMAP
+78
+cc
+cc
+fc
+c0
+c0
+7c
+ENDCHAR
+STARTCHAR f
+ENCODING 102
+SWIDTH 332 0
+DWIDTH 4 0
+BBX 5 9 0 0
+BITMAP
+38
+60
+f0
+60
+60
+60
+60
+60
+60
+ENDCHAR
+STARTCHAR g
+ENCODING 103
+SWIDTH 653 0
+DWIDTH 8 0
+BBX 6 9 1 -2
+BITMAP
+74
+cc
+cc
+cc
+cc
+dc
+6c
+0c
+78
+ENDCHAR
+STARTCHAR h
+ENCODING 104
+SWIDTH 633 0
+DWIDTH 8 0
+BBX 6 9 1 0
+BITMAP
+c0
+c0
+d8
+ec
+cc
+cc
+cc
+cc
+cc
+ENDCHAR
+STARTCHAR i
+ENCODING 105
+SWIDTH 298 0
+DWIDTH 4 0
+BBX 2 9 1 0
+BITMAP
+c0
+00
+c0
+c0
+c0
+c0
+c0
+c0
+c0
+ENDCHAR
+STARTCHAR j
+ENCODING 106
+SWIDTH 309 0
+DWIDTH 4 0
+BBX 4 11 -1 -2
+BITMAP
+30
+00
+30
+30
+30
+30
+30
+30
+30
+30
+e0
+ENDCHAR
+STARTCHAR k
+ENCODING 107
+SWIDTH 581 0
+DWIDTH 7 0
+BBX 6 9 1 0
+BITMAP
+c0
+c0
+cc
+d8
+f0
+e0
+f0
+d8
+cc
+ENDCHAR
+STARTCHAR l
+ENCODING 108
+SWIDTH 310 0
+DWIDTH 4 0
+BBX 2 9 1 0
+BITMAP
+c0
+c0
+c0
+c0
+c0
+c0
+c0
+c0
+c0
+ENDCHAR
+STARTCHAR m
+ENCODING 109
+SWIDTH 954 0
+DWIDTH 12 0
+BBX 10 7 1 0
+BITMAP
+d980
+eec0
+ccc0
+ccc0
+ccc0
+ccc0
+ccc0
+ENDCHAR
+STARTCHAR n
+ENCODING 110
+SWIDTH 633 0
+DWIDTH 8 0
+BBX 6 7 1 0
+BITMAP
+d8
+ec
+cc
+cc
+cc
+cc
+cc
+ENDCHAR
+STARTCHAR o
+ENCODING 111
+SWIDTH 664 0
+DWIDTH 8 0
+BBX 6 7 1 0
+BITMAP
+78
+cc
+cc
+cc
+cc
+cc
+78
+ENDCHAR
+STARTCHAR p
+ENCODING 112
+SWIDTH 634 0
+DWIDTH 8 0
+BBX 6 9 1 -2
+BITMAP
+d8
+ec
+cc
+cc
+cc
+cc
+f8
+c0
+c0
+ENDCHAR
+STARTCHAR q
+ENCODING 113
+SWIDTH 634 0
+DWIDTH 8 0
+BBX 6 9 1 -2
+BITMAP
+74
+cc
+cc
+cc
+cc
+cc
+7c
+0c
+0c
+ENDCHAR
+STARTCHAR r
+ENCODING 114
+SWIDTH 498 0
+DWIDTH 6 0
+BBX 5 7 1 0
+BITMAP
+d8
+f8
+c0
+c0
+c0
+c0
+c0
+ENDCHAR
+STARTCHAR s
+ENCODING 115
+SWIDTH 455 0
+DWIDTH 7 0
+BBX 5 7 1 0
+BITMAP
+78
+c0
+e0
+70
+38
+18
+f0
+ENDCHAR
+STARTCHAR t
+ENCODING 116
+SWIDTH 415 0
+DWIDTH 5 0
+BBX 5 9 0 0
+BITMAP
+20
+60
+f8
+60
+60
+60
+60
+60
+38
+ENDCHAR
+STARTCHAR u
+ENCODING 117
+SWIDTH 633 0
+DWIDTH 8 0
+BBX 6 7 1 0
+BITMAP
+cc
+cc
+cc
+cc
+cc
+dc
+6c
+ENDCHAR
+STARTCHAR v
+ENCODING 118
+SWIDTH 581 0
+DWIDTH 7 0
+BBX 7 7 0 0
+BITMAP
+c6
+c6
+64
+6c
+38
+38
+10
+ENDCHAR
+STARTCHAR w
+ENCODING 119
+SWIDTH 866 0
+DWIDTH 11 0
+BBX 11 7 0 0
+BITMAP
+cc60
+cc60
+6e40
+6ec0
+3b80
+3b80
+1100
+ENDCHAR
+STARTCHAR x
+ENCODING 120
+SWIDTH 594 0
+DWIDTH 7 0
+BBX 7 7 0 0
+BITMAP
+e6
+6c
+38
+38
+38
+6c
+ce
+ENDCHAR
+STARTCHAR y
+ENCODING 121
+SWIDTH 581 0
+DWIDTH 7 0
+BBX 7 9 0 -2
+BITMAP
+c6
+c6
+64
+6c
+38
+38
+10
+30
+60
+ENDCHAR
+STARTCHAR z
+ENCODING 122
+SWIDTH 498 0
+DWIDTH 7 0
+BBX 5 7 1 0
+BITMAP
+f8
+18
+30
+60
+c0
+c0
+f8
+ENDCHAR
+STARTCHAR braceleft
+ENCODING 123
+SWIDTH 395 0
+DWIDTH 5 0
+BBX 4 11 1 -2
+BITMAP
+30
+60
+60
+60
+c0
+60
+60
+60
+60
+60
+30
+ENDCHAR
+STARTCHAR bar
+ENCODING 124
+SWIDTH 415 0
+DWIDTH 5 0
+BBX 2 11 2 -2
+BITMAP
+c0
+c0
+c0
+c0
+c0
+c0
+c0
+c0
+c0
+c0
+c0
+ENDCHAR
+STARTCHAR braceright
+ENCODING 125
+SWIDTH 395 0
+DWIDTH 5 0
+BBX 4 11 0 -2
+BITMAP
+c0
+60
+60
+60
+30
+60
+60
+60
+60
+60
+c0
+ENDCHAR
+STARTCHAR asciitilde
+ENCODING 126
+SWIDTH 636 0
+DWIDTH 8 0
+BBX 7 3 1 3
+BITMAP
+62
+fe
+8c
+ENDCHAR
+STARTCHAR exclamdown
+ENCODING 161
+SWIDTH 346 0
+DWIDTH 5 0
+BBX 2 9 2 0
+BITMAP
+c0
+c0
+00
+c0
+c0
+c0
+c0
+c0
+c0
+ENDCHAR
+STARTCHAR cent
+ENCODING 162
+SWIDTH 581 0
+DWIDTH 7 0
+BBX 5 9 1 -1
+BITMAP
+10
+78
+c0
+c0
+c0
+c0
+c0
+78
+10
+ENDCHAR
+STARTCHAR sterling
+ENCODING 163
+SWIDTH 581 0
+DWIDTH 7 0
+BBX 7 9 0 0
+BITMAP
+3c
+60
+60
+60
+f8
+60
+60
+60
+7e
+ENDCHAR
+STARTCHAR fraction
+ENCODING 164
+SWIDTH 250 0
+DWIDTH 3 0
+BBX 6 9 -1 0
+BITMAP
+04
+08
+08
+10
+20
+20
+40
+40
+80
+ENDCHAR
+STARTCHAR yen
+ENCODING 165
+SWIDTH 644 0
+DWIDTH 8 0
+BBX 8 9 0 0
+BITMAP
+e3
+62
+76
+3c
+18
+7e
+18
+7e
+18
+ENDCHAR
+STARTCHAR florin
+ENCODING 166
+SWIDTH 462 0
+DWIDTH 6 0
+BBX 6 11 0 -2
+BITMAP
+1c
+30
+30
+30
+78
+30
+30
+30
+30
+30
+e0
+ENDCHAR
+STARTCHAR section
+ENCODING 167
+SWIDTH 443 0
+DWIDTH 5 0
+BBX 4 9 1 0
+BITMAP
+70
+80
+c0
+e0
+90
+70
+30
+10
+e0
+ENDCHAR
+STARTCHAR currency
+ENCODING 168
+SWIDTH 648 0
+DWIDTH 8 0
+BBX 8 9 0 0
+BITMAP
+42
+c3
+3c
+24
+24
+24
+3c
+c3
+42
+ENDCHAR
+STARTCHAR quotesingle
+ENCODING 169
+SWIDTH 250 0
+DWIDTH 3 0
+BBX 2 3 1 6
+BITMAP
+c0
+c0
+c0
+ENDCHAR
+STARTCHAR quotedblleft
+ENCODING 170
+SWIDTH 537 0
+DWIDTH 7 0
+BBX 5 4 1 5
+BITMAP
+48
+90
+d8
+d8
+ENDCHAR
+STARTCHAR guillemotleft
+ENCODING 171
+SWIDTH 664 0
+DWIDTH 8 0
+BBX 6 6 1 0
+BITMAP
+24
+6c
+d8
+d8
+6c
+24
+ENDCHAR
+STARTCHAR guilsinglleft
+ENCODING 172
+SWIDTH 363 0
+DWIDTH 5 0
+BBX 3 6 0 0
+BITMAP
+20
+60
+c0
+c0
+60
+20
+ENDCHAR
+STARTCHAR guilsinglright
+ENCODING 173
+SWIDTH 363 0
+DWIDTH 4 0
+BBX 3 6 1 0
+BITMAP
+80
+c0
+60
+60
+c0
+80
+ENDCHAR
+STARTCHAR fi
+ENCODING 174
+SWIDTH 632 0
+DWIDTH 8 0
+BBX 7 9 0 0
+BITMAP
+38
+60
+fe
+66
+66
+66
+66
+66
+66
+ENDCHAR
+STARTCHAR fl
+ENCODING 175
+SWIDTH 623 0
+DWIDTH 7 0
+BBX 7 9 0 0
+BITMAP
+3e
+66
+f6
+66
+66
+66
+66
+66
+66
+ENDCHAR
+STARTCHAR endash
+ENCODING 177
+SWIDTH 500 0
+DWIDTH 6 0
+BBX 4 2 1 3
+BITMAP
+f0
+f0
+ENDCHAR
+STARTCHAR dagger
+ENCODING 178
+SWIDTH 512 0
+DWIDTH 5 0
+BBX 4 11 1 -2
+BITMAP
+60
+60
+f0
+60
+60
+60
+60
+60
+60
+60
+60
+ENDCHAR
+STARTCHAR daggerdbl
+ENCODING 179
+SWIDTH 512 0
+DWIDTH 5 0
+BBX 4 11 1 -2
+BITMAP
+60
+60
+f0
+60
+f0
+60
+60
+60
+60
+60
+60
+ENDCHAR
+STARTCHAR periodcentered
+ENCODING 180
+SWIDTH 332 0
+DWIDTH 4 0
+BBX 2 2 1 3
+BITMAP
+c0
+c0
+ENDCHAR
+STARTCHAR paragraph
+ENCODING 182
+SWIDTH 582 0
+DWIDTH 7 0
+BBX 6 9 0 0
+BITMAP
+7c
+d4
+d4
+d4
+74
+14
+14
+14
+14
+ENDCHAR
+STARTCHAR bullet
+ENCODING 183
+SWIDTH 583 0
+DWIDTH 7 0
+BBX 5 5 1 2
+BITMAP
+70
+f8
+f8
+f8
+70
+ENDCHAR
+STARTCHAR quotesinglbase
+ENCODING 184
+SWIDTH 332 0
+DWIDTH 4 0
+BBX 2 4 1 -2
+BITMAP
+c0
+c0
+40
+80
+ENDCHAR
+STARTCHAR quotedblbase
+ENCODING 185
+SWIDTH 537 0
+DWIDTH 7 0
+BBX 5 4 1 -2
+BITMAP
+d8
+d8
+48
+90
+ENDCHAR
+STARTCHAR quotedblright
+ENCODING 186
+SWIDTH 537 0
+DWIDTH 7 0
+BBX 5 4 1 5
+BITMAP
+d8
+d8
+48
+90
+ENDCHAR
+STARTCHAR guillemotright
+ENCODING 187
+SWIDTH 664 0
+DWIDTH 8 0
+BBX 6 6 1 0
+BITMAP
+90
+d8
+6c
+6c
+d8
+90
+ENDCHAR
+STARTCHAR ellipsis
+ENCODING 188
+SWIDTH 854 0
+DWIDTH 10 0
+BBX 8 2 1 0
+BITMAP
+db
+db
+ENDCHAR
+STARTCHAR perthousand
+ENCODING 189
+SWIDTH 1250 0
+DWIDTH 15 0
+BBX 15 9 0 0
+BITMAP
+7100
+d900
+da00
+7200
+0400
+0b9c
+0ef6
+16f6
+139c
+ENDCHAR
+STARTCHAR questiondown
+ENCODING 191
+SWIDTH 448 0
+DWIDTH 6 0
+BBX 5 9 1 0
+BITMAP
+30
+30
+00
+30
+30
+60
+c0
+c0
+78
+ENDCHAR
+STARTCHAR grave
+ENCODING 193
+SWIDTH 500 0
+DWIDTH 6 0
+BBX 3 2 2 8
+BITMAP
+c0
+60
+ENDCHAR
+STARTCHAR acute
+ENCODING 194
+SWIDTH 500 0
+DWIDTH 6 0
+BBX 3 2 2 8
+BITMAP
+60
+c0
+ENDCHAR
+STARTCHAR circumflex
+ENCODING 195
+SWIDTH 500 0
+DWIDTH 6 0
+BBX 4 2 1 8
+BITMAP
+60
+90
+ENDCHAR
+STARTCHAR tilde
+ENCODING 196
+SWIDTH 500 0
+DWIDTH 6 0
+BBX 5 2 1 9
+BITMAP
+68
+b0
+ENDCHAR
+STARTCHAR macron
+ENCODING 197
+SWIDTH 500 0
+DWIDTH 6 0
+BBX 4 1 1 8
+BITMAP
+f0
+ENDCHAR
+STARTCHAR breve
+ENCODING 198
+SWIDTH 500 0
+DWIDTH 6 0
+BBX 4 2 1 9
+BITMAP
+90
+60
+ENDCHAR
+STARTCHAR dotaccent
+ENCODING 199
+SWIDTH 500 0
+DWIDTH 6 0
+BBX 2 2 2 9
+BITMAP
+c0
+c0
+ENDCHAR
+STARTCHAR dieresis
+ENCODING 200
+SWIDTH 500 0
+DWIDTH 6 0
+BBX 4 2 1 9
+BITMAP
+90
+90
+ENDCHAR
+STARTCHAR ring
+ENCODING 202
+SWIDTH 500 0
+DWIDTH 6 0
+BBX 4 3 1 9
+BITMAP
+60
+90
+60
+ENDCHAR
+STARTCHAR cedilla
+ENCODING 203
+SWIDTH 500 0
+DWIDTH 6 0
+BBX 3 3 2 -3
+BITMAP
+40
+20
+c0
+ENDCHAR
+STARTCHAR hungarumlaut
+ENCODING 205
+SWIDTH 500 0
+DWIDTH 6 0
+BBX 6 2 1 8
+BITMAP
+6c
+d8
+ENDCHAR
+STARTCHAR ogonek
+ENCODING 206
+SWIDTH 500 0
+DWIDTH 6 0
+BBX 2 3 2 -3
+BITMAP
+40
+80
+c0
+ENDCHAR
+STARTCHAR caron
+ENCODING 207
+SWIDTH 500 0
+DWIDTH 6 0
+BBX 5 2 1 10
+BITMAP
+d8
+70
+ENDCHAR
+STARTCHAR emdash
+ENCODING 208
+SWIDTH 833 0
+DWIDTH 10 0
+BBX 8 2 1 3
+BITMAP
+ff
+ff
+ENDCHAR
+STARTCHAR AE
+ENCODING 225
+SWIDTH 872 0
+DWIDTH 10 0
+BBX 10 9 0 0
+BITMAP
+0fc0
+1e00
+1e00
+3600
+3780
+6600
+7e00
+c600
+c7c0
+ENDCHAR
+STARTCHAR ordfeminine
+ENCODING 227
+SWIDTH 473 0
+DWIDTH 6 0
+BBX 5 7 1 2
+BITMAP
+70
+18
+78
+d8
+78
+00
+f8
+ENDCHAR
+STARTCHAR Lslash
+ENCODING 232
+SWIDTH 550 0
+DWIDTH 7 0
+BBX 5 9 1 0
+BITMAP
+c0
+c0
+c0
+c0
+c0
+c0
+c0
+c0
+f8
+ENDCHAR
+STARTCHAR Oslash
+ENCODING 233
+SWIDTH 667 0
+DWIDTH 9 0
+BBX 8 9 1 0
+BITMAP
+39
+6e
+c6
+ce
+d6
+d6
+e6
+6c
+b8
+ENDCHAR
+STARTCHAR OE
+ENCODING 234
+SWIDTH 917 0
+DWIDTH 11 0
+BBX 11 9 0 0
+BITMAP
+3fe0
+6600
+c600
+c600
+c7c0
+c600
+c600
+6600
+3fe0
+ENDCHAR
+STARTCHAR ordmasculine
+ENCODING 235
+SWIDTH 538 0
+DWIDTH 6 0
+BBX 5 7 1 2
+BITMAP
+70
+d8
+d8
+d8
+70
+00
+f8
+ENDCHAR
+STARTCHAR ae
+ENCODING 241
+SWIDTH 912 0
+DWIDTH 12 0
+BBX 10 7 1 0
+BITMAP
+7b80
+0cc0
+7cc0
+cfc0
+cc00
+dc00
+63c0
+ENDCHAR
+STARTCHAR dotlessi
+ENCODING 245
+SWIDTH 298 0
+DWIDTH 4 0
+BBX 2 7 1 0
+BITMAP
+c0
+c0
+c0
+c0
+c0
+c0
+c0
+ENDCHAR
+STARTCHAR lslash
+ENCODING 248
+SWIDTH 310 0
+DWIDTH 4 0
+BBX 2 9 1 0
+BITMAP
+c0
+c0
+c0
+c0
+c0
+c0
+c0
+c0
+c0
+ENDCHAR
+STARTCHAR oslash
+ENCODING 249
+SWIDTH 664 0
+DWIDTH 8 0
+BBX 6 9 1 -1
+BITMAP
+04
+78
+cc
+dc
+ec
+ec
+cc
+78
+80
+ENDCHAR
+STARTCHAR oe
+ENCODING 250
+SWIDTH 997 0
+DWIDTH 12 0
+BBX 10 7 1 0
+BITMAP
+7b80
+ccc0
+ccc0
+cfc0
+cc00
+cc00
+7bc0
+ENDCHAR
+STARTCHAR germandbls
+ENCODING 251
+SWIDTH 667 0
+DWIDTH 8 0
+BBX 7 9 1 0
+BITMAP
+70
+d8
+d8
+d0
+d8
+cc
+c6
+c6
+cc
+ENDCHAR
+STARTCHAR Zcaron
+ENCODING -1
+SWIDTH 541 0
+DWIDTH 6 0
+BBX 5 11 1 0
+BITMAP
+d8
+70
+f8
+18
+18
+30
+70
+60
+c0
+c0
+f8
+ENDCHAR
+STARTCHAR ccedilla
+ENCODING -1
+SWIDTH 549 0
+DWIDTH 7 0
+BBX 5 10 1 -3
+BITMAP
+78
+c8
+c0
+c0
+c0
+c0
+78
+10
+08
+30
+ENDCHAR
+STARTCHAR ydieresis
+ENCODING -1
+SWIDTH 581 0
+DWIDTH 7 0
+BBX 7 12 0 -2
+BITMAP
+44
+44
+00
+c6
+c6
+64
+6c
+38
+38
+10
+30
+60
+ENDCHAR
+STARTCHAR atilde
+ENCODING -1
+SWIDTH 604 0
+DWIDTH 8 0
+BBX 6 10 1 0
+BITMAP
+34
+58
+00
+78
+0c
+7c
+cc
+cc
+dc
+6c
+ENDCHAR
+STARTCHAR icircumflex
+ENCODING -1
+SWIDTH 298 0
+DWIDTH 4 0
+BBX 4 10 0 0
+BITMAP
+60
+90
+00
+60
+60
+60
+60
+60
+60
+60
+ENDCHAR
+STARTCHAR threesuperior
+ENCODING -1
+SWIDTH 448 0
+DWIDTH 5 0
+BBX 3 6 1 3
+BITMAP
+c0
+20
+40
+20
+20
+c0
+ENDCHAR
+STARTCHAR ecircumflex
+ENCODING -1
+SWIDTH 636 0
+DWIDTH 8 0
+BBX 6 10 1 0
+BITMAP
+30
+48
+00
+78
+cc
+cc
+fc
+c0
+c0
+7c
+ENDCHAR
+STARTCHAR thorn
+ENCODING -1
+SWIDTH 634 0
+DWIDTH 8 0
+BBX 6 11 1 -2
+BITMAP
+c0
+c0
+d8
+fc
+cc
+cc
+cc
+cc
+f8
+c0
+c0
+ENDCHAR
+STARTCHAR egrave
+ENCODING -1
+SWIDTH 636 0
+DWIDTH 8 0
+BBX 6 10 1 0
+BITMAP
+60
+30
+00
+78
+cc
+cc
+fc
+c0
+c0
+7c
+ENDCHAR
+STARTCHAR twosuperior
+ENCODING -1
+SWIDTH 448 0
+DWIDTH 5 0
+BBX 3 6 1 3
+BITMAP
+40
+a0
+20
+40
+80
+e0
+ENDCHAR
+STARTCHAR eacute
+ENCODING -1
+SWIDTH 636 0
+DWIDTH 8 0
+BBX 6 10 1 0
+BITMAP
+18
+30
+00
+78
+cc
+cc
+fc
+c0
+c0
+7c
+ENDCHAR
+STARTCHAR otilde
+ENCODING -1
+SWIDTH 664 0
+DWIDTH 8 0
+BBX 6 10 1 0
+BITMAP
+68
+b0
+00
+78
+cc
+cc
+cc
+cc
+cc
+78
+ENDCHAR
+STARTCHAR Aacute
+ENCODING -1
+SWIDTH 663 0
+DWIDTH 8 0
+BBX 8 12 0 0
+BITMAP
+0c
+18
+00
+18
+18
+3c
+3c
+26
+66
+7e
+c3
+c3
+ENDCHAR
+STARTCHAR ocircumflex
+ENCODING -1
+SWIDTH 664 0
+DWIDTH 8 0
+BBX 6 10 1 0
+BITMAP
+30
+48
+00
+78
+cc
+cc
+cc
+cc
+cc
+78
+ENDCHAR
+STARTCHAR yacute
+ENCODING -1
+SWIDTH 581 0
+DWIDTH 7 0
+BBX 7 11 0 -2
+BITMAP
+08
+10
+c6
+c6
+64
+6c
+38
+38
+10
+30
+60
+ENDCHAR
+STARTCHAR udieresis
+ENCODING -1
+SWIDTH 633 0
+DWIDTH 8 0
+BBX 6 10 1 0
+BITMAP
+48
+48
+00
+cc
+cc
+cc
+cc
+cc
+dc
+6c
+ENDCHAR
+STARTCHAR threequarters
+ENCODING -1
+SWIDTH 861 0
+DWIDTH 10 0
+BBX 7 9 1 0
+BITMAP
+c2
+24
+44
+28
+28
+d0
+20
+20
+40
+ENDCHAR
+STARTCHAR acircumflex
+ENCODING -1
+SWIDTH 604 0
+DWIDTH 8 0
+BBX 6 10 1 0
+BITMAP
+30
+48
+00
+78
+0c
+7c
+cc
+cc
+dc
+6c
+ENDCHAR
+STARTCHAR Eth
+ENCODING -1
+SWIDTH 664 0
+DWIDTH 8 0
+BBX 8 9 0 0
+BITMAP
+7c
+66
+63
+f3
+f3
+63
+63
+66
+7c
+ENDCHAR
+STARTCHAR edieresis
+ENCODING -1
+SWIDTH 636 0
+DWIDTH 8 0
+BBX 6 10 1 0
+BITMAP
+48
+48
+00
+78
+cc
+cc
+fc
+c0
+c0
+7c
+ENDCHAR
+STARTCHAR ugrave
+ENCODING -1
+SWIDTH 633 0
+DWIDTH 8 0
+BBX 6 10 1 0
+BITMAP
+60
+30
+00
+cc
+cc
+cc
+cc
+cc
+dc
+6c
+ENDCHAR
+STARTCHAR trademark
+ENCODING -1
+SWIDTH 704 0
+DWIDTH 8 0
+BBX 8 4 0 5
+BITMAP
+f1
+5b
+55
+55
+ENDCHAR
+STARTCHAR ograve
+ENCODING -1
+SWIDTH 664 0
+DWIDTH 8 0
+BBX 6 10 1 0
+BITMAP
+60
+30
+00
+78
+cc
+cc
+cc
+cc
+cc
+78
+ENDCHAR
+STARTCHAR scaron
+ENCODING -1
+SWIDTH 455 0
+DWIDTH 5 0
+BBX 5 9 0 0
+BITMAP
+d8
+70
+78
+c0
+e0
+70
+38
+18
+f0
+ENDCHAR
+STARTCHAR Idieresis
+ENCODING -1
+SWIDTH 366 0
+DWIDTH 5 0
+BBX 4 12 1 0
+BITMAP
+90
+90
+00
+60
+60
+60
+60
+60
+60
+60
+60
+60
+ENDCHAR
+STARTCHAR uacute
+ENCODING -1
+SWIDTH 633 0
+DWIDTH 8 0
+BBX 6 10 1 0
+BITMAP
+18
+30
+00
+cc
+cc
+cc
+cc
+cc
+dc
+6c
+ENDCHAR
+STARTCHAR agrave
+ENCODING -1
+SWIDTH 604 0
+DWIDTH 8 0
+BBX 6 10 1 0
+BITMAP
+30
+18
+00
+78
+0c
+7c
+cc
+cc
+dc
+6c
+ENDCHAR
+STARTCHAR ntilde
+ENCODING -1
+SWIDTH 633 0
+DWIDTH 8 0
+BBX 6 10 1 0
+BITMAP
+34
+58
+00
+d8
+ec
+cc
+cc
+cc
+cc
+cc
+ENDCHAR
+STARTCHAR aring
+ENCODING -1
+SWIDTH 604 0
+DWIDTH 8 0
+BBX 6 12 1 0
+BITMAP
+30
+48
+30
+00
+00
+78
+0c
+7c
+cc
+cc
+dc
+6c
+ENDCHAR
+STARTCHAR zcaron
+ENCODING -1
+SWIDTH 498 0
+DWIDTH 6 0
+BBX 5 9 1 0
+BITMAP
+d8
+70
+f8
+18
+30
+60
+c0
+c0
+f8
+ENDCHAR
+STARTCHAR Icircumflex
+ENCODING -1
+SWIDTH 366 0
+DWIDTH 5 0
+BBX 4 12 1 0
+BITMAP
+60
+90
+00
+60
+60
+60
+60
+60
+60
+60
+60
+60
+ENDCHAR
+STARTCHAR Ntilde
+ENCODING -1
+SWIDTH 682 0
+DWIDTH 8 0
+BBX 7 12 1 0
+BITMAP
+34
+58
+00
+82
+c2
+e2
+f2
+ba
+9e
+8e
+86
+82
+ENDCHAR
+STARTCHAR ucircumflex
+ENCODING -1
+SWIDTH 633 0
+DWIDTH 8 0
+BBX 6 10 1 0
+BITMAP
+30
+48
+00
+cc
+cc
+cc
+cc
+cc
+dc
+6c
+ENDCHAR
+STARTCHAR Ecircumflex
+ENCODING -1
+SWIDTH 570 0
+DWIDTH 7 0
+BBX 6 12 1 0
+BITMAP
+30
+48
+00
+fc
+c0
+c0
+c0
+f8
+c0
+c0
+c0
+fc
+ENDCHAR
+STARTCHAR Iacute
+ENCODING -1
+SWIDTH 366 0
+DWIDTH 5 0
+BBX 3 12 2 0
+BITMAP
+60
+c0
+00
+c0
+c0
+c0
+c0
+c0
+c0
+c0
+c0
+c0
+ENDCHAR
+STARTCHAR Ccedilla
+ENCODING -1
+SWIDTH 581 0
+DWIDTH 7 0
+BBX 6 12 1 -3
+BITMAP
+3c
+64
+c0
+c0
+c0
+c0
+c0
+60
+3c
+10
+08
+30
+ENDCHAR
+STARTCHAR Odieresis
+ENCODING -1
+SWIDTH 667 0
+DWIDTH 9 0
+BBX 7 12 1 0
+BITMAP
+24
+24
+00
+38
+6c
+c6
+c6
+c6
+c6
+c6
+6c
+38
+ENDCHAR
+STARTCHAR Scaron
+ENCODING -1
+SWIDTH 564 0
+DWIDTH 7 0
+BBX 5 11 1 0
+BITMAP
+d8
+70
+78
+c0
+c0
+e0
+70
+38
+18
+18
+f0
+ENDCHAR
+STARTCHAR Edieresis
+ENCODING -1
+SWIDTH 570 0
+DWIDTH 7 0
+BBX 6 12 1 0
+BITMAP
+48
+48
+00
+fc
+c0
+c0
+c0
+f8
+c0
+c0
+c0
+fc
+ENDCHAR
+STARTCHAR Igrave
+ENCODING -1
+SWIDTH 366 0
+DWIDTH 5 0
+BBX 3 12 1 0
+BITMAP
+c0
+60
+00
+60
+60
+60
+60
+60
+60
+60
+60
+60
+ENDCHAR
+STARTCHAR adieresis
+ENCODING -1
+SWIDTH 604 0
+DWIDTH 8 0
+BBX 6 10 1 0
+BITMAP
+48
+48
+00
+78
+0c
+7c
+cc
+cc
+dc
+6c
+ENDCHAR
+STARTCHAR Ograve
+ENCODING -1
+SWIDTH 667 0
+DWIDTH 9 0
+BBX 7 12 1 0
+BITMAP
+30
+18
+00
+38
+6c
+c6
+c6
+c6
+c6
+c6
+6c
+38
+ENDCHAR
+STARTCHAR Egrave
+ENCODING -1
+SWIDTH 570 0
+DWIDTH 7 0
+BBX 6 12 1 0
+BITMAP
+60
+30
+00
+fc
+c0
+c0
+c0
+f8
+c0
+c0
+c0
+fc
+ENDCHAR
+STARTCHAR Ydieresis
+ENCODING -1
+SWIDTH 648 0
+DWIDTH 8 0
+BBX 8 12 0 0
+BITMAP
+22
+22
+00
+e3
+62
+66
+34
+3c
+18
+18
+18
+18
+ENDCHAR
+STARTCHAR registered
+ENCODING -1
+SWIDTH 744 0
+DWIDTH 9 0
+BBX 8 8 1 0
+BITMAP
+3c
+42
+b9
+a5
+b9
+a5
+42
+3c
+ENDCHAR
+STARTCHAR Otilde
+ENCODING -1
+SWIDTH 667 0
+DWIDTH 9 0
+BBX 7 12 1 0
+BITMAP
+1a
+2c
+00
+38
+6c
+c6
+c6
+c6
+c6
+c6
+6c
+38
+ENDCHAR
+STARTCHAR onequarter
+ENCODING -1
+SWIDTH 804 0
+DWIDTH 10 0
+BBX 7 9 1 0
+BITMAP
+42
+c4
+44
+48
+48
+50
+20
+20
+40
+ENDCHAR
+STARTCHAR Ugrave
+ENCODING -1
+SWIDTH 656 0
+DWIDTH 8 0
+BBX 7 12 1 0
+BITMAP
+30
+18
+00
+c2
+c2
+c2
+c2
+c2
+c2
+c2
+64
+38
+ENDCHAR
+STARTCHAR Ucircumflex
+ENCODING -1
+SWIDTH 656 0
+DWIDTH 8 0
+BBX 7 12 1 0
+BITMAP
+18
+24
+00
+c2
+c2
+c2
+c2
+c2
+c2
+c2
+64
+38
+ENDCHAR
+STARTCHAR Thorn
+ENCODING -1
+SWIDTH 582 0
+DWIDTH 7 0
+BBX 6 9 1 0
+BITMAP
+c0
+c0
+f8
+cc
+cc
+cc
+f8
+c0
+c0
+ENDCHAR
+STARTCHAR divide
+ENCODING -1
+SWIDTH 580 0
+DWIDTH 7 0
+BBX 6 8 1 0
+BITMAP
+30
+30
+00
+fc
+fc
+00
+30
+30
+ENDCHAR
+STARTCHAR Atilde
+ENCODING -1
+SWIDTH 663 0
+DWIDTH 8 0
+BBX 8 12 0 0
+BITMAP
+34
+58
+00
+18
+18
+3c
+3c
+26
+66
+7e
+c3
+c3
+ENDCHAR
+STARTCHAR Uacute
+ENCODING -1
+SWIDTH 656 0
+DWIDTH 8 0
+BBX 7 12 1 0
+BITMAP
+0c
+18
+00
+c2
+c2
+c2
+c2
+c2
+c2
+c2
+64
+38
+ENDCHAR
+STARTCHAR Ocircumflex
+ENCODING -1
+SWIDTH 667 0
+DWIDTH 9 0
+BBX 7 12 1 0
+BITMAP
+18
+24
+00
+38
+6c
+c6
+c6
+c6
+c6
+c6
+6c
+38
+ENDCHAR
+STARTCHAR logicalnot
+ENCODING -1
+SWIDTH 583 0
+DWIDTH 7 0
+BBX 5 3 1 2
+BITMAP
+f8
+f8
+08
+ENDCHAR
+STARTCHAR Aring
+ENCODING -1
+SWIDTH 663 0
+DWIDTH 8 0
+BBX 8 11 0 0
+BITMAP
+18
+24
+18
+18
+3c
+3c
+66
+66
+7e
+c3
+c3
+ENDCHAR
+STARTCHAR idieresis
+ENCODING -1
+SWIDTH 298 0
+DWIDTH 4 0
+BBX 4 10 0 0
+BITMAP
+90
+90
+00
+60
+60
+60
+60
+60
+60
+60
+ENDCHAR
+STARTCHAR iacute
+ENCODING -1
+SWIDTH 298 0
+DWIDTH 4 0
+BBX 3 10 1 0
+BITMAP
+60
+c0
+00
+c0
+c0
+c0
+c0
+c0
+c0
+c0
+ENDCHAR
+STARTCHAR aacute
+ENCODING -1
+SWIDTH 604 0
+DWIDTH 8 0
+BBX 6 10 1 0
+BITMAP
+18
+30
+00
+78
+0c
+7c
+cc
+cc
+dc
+6c
+ENDCHAR
+STARTCHAR plusminus
+ENCODING -1
+SWIDTH 580 0
+DWIDTH 7 0
+BBX 6 9 1 -1
+BITMAP
+30
+30
+fc
+fc
+30
+30
+00
+fc
+fc
+ENDCHAR
+STARTCHAR multiply
+ENCODING -1
+SWIDTH 580 0
+DWIDTH 7 0
+BBX 4 4 2 2
+BITMAP
+90
+60
+60
+90
+ENDCHAR
+STARTCHAR Udieresis
+ENCODING -1
+SWIDTH 656 0
+DWIDTH 8 0
+BBX 7 12 1 0
+BITMAP
+24
+24
+00
+c2
+c2
+c2
+c2
+c2
+c2
+c2
+64
+38
+ENDCHAR
+STARTCHAR minus
+ENCODING -1
+SWIDTH 580 0
+DWIDTH 7 0
+BBX 5 1 1 3
+BITMAP
+f8
+ENDCHAR
+STARTCHAR onesuperior
+ENCODING -1
+SWIDTH 370 0
+DWIDTH 4 0
+BBX 2 6 1 3
+BITMAP
+40
+c0
+40
+40
+40
+40
+ENDCHAR
+STARTCHAR Eacute
+ENCODING -1
+SWIDTH 570 0
+DWIDTH 7 0
+BBX 6 12 1 0
+BITMAP
+18
+30
+00
+fc
+c0
+c0
+c0
+f8
+c0
+c0
+c0
+fc
+ENDCHAR
+STARTCHAR Acircumflex
+ENCODING -1
+SWIDTH 663 0
+DWIDTH 8 0
+BBX 8 12 0 0
+BITMAP
+18
+24
+00
+18
+18
+3c
+3c
+26
+66
+7e
+c3
+c3
+ENDCHAR
+STARTCHAR copyright
+ENCODING -1
+SWIDTH 744 0
+DWIDTH 9 0
+BBX 8 8 1 0
+BITMAP
+3c
+42
+99
+a5
+a1
+99
+42
+3c
+ENDCHAR
+STARTCHAR Agrave
+ENCODING -1
+SWIDTH 663 0
+DWIDTH 8 0
+BBX 8 12 0 0
+BITMAP
+30
+18
+00
+18
+18
+3c
+3c
+26
+66
+7e
+c3
+c3
+ENDCHAR
+STARTCHAR odieresis
+ENCODING -1
+SWIDTH 664 0
+DWIDTH 8 0
+BBX 6 10 1 0
+BITMAP
+48
+48
+00
+78
+cc
+cc
+cc
+cc
+cc
+78
+ENDCHAR
+STARTCHAR oacute
+ENCODING -1
+SWIDTH 664 0
+DWIDTH 8 0
+BBX 6 10 1 0
+BITMAP
+18
+30
+00
+78
+cc
+cc
+cc
+cc
+cc
+78
+ENDCHAR
+STARTCHAR degree
+ENCODING -1
+SWIDTH 402 0
+DWIDTH 5 0
+BBX 4 4 1 5
+BITMAP
+60
+90
+90
+60
+ENDCHAR
+STARTCHAR igrave
+ENCODING -1
+SWIDTH 298 0
+DWIDTH 4 0
+BBX 3 10 0 0
+BITMAP
+c0
+60
+00
+60
+60
+60
+60
+60
+60
+60
+ENDCHAR
+STARTCHAR mu
+ENCODING -1
+SWIDTH 633 0
+DWIDTH 8 0
+BBX 6 9 1 -2
+BITMAP
+cc
+cc
+cc
+cc
+cc
+dc
+ec
+c0
+c0
+ENDCHAR
+STARTCHAR Oacute
+ENCODING -1
+SWIDTH 667 0
+DWIDTH 9 0
+BBX 7 12 1 0
+BITMAP
+0c
+18
+00
+38
+6c
+c6
+c6
+c6
+c6
+c6
+6c
+38
+ENDCHAR
+STARTCHAR eth
+ENCODING -1
+SWIDTH 581 0
+DWIDTH 7 0
+BBX 6 9 1 0
+BITMAP
+78
+38
+0c
+7c
+cc
+cc
+cc
+cc
+78
+ENDCHAR
+STARTCHAR Adieresis
+ENCODING -1
+SWIDTH 663 0
+DWIDTH 8 0
+BBX 8 12 0 0
+BITMAP
+24
+24
+00
+18
+18
+3c
+3c
+26
+66
+7e
+c3
+c3
+ENDCHAR
+STARTCHAR Yacute
+ENCODING -1
+SWIDTH 648 0
+DWIDTH 8 0
+BBX 8 11 0 0
+BITMAP
+08
+10
+c3
+62
+66
+34
+3c
+18
+18
+18
+18
+ENDCHAR
+STARTCHAR brokenbar
+ENCODING -1
+SWIDTH 415 0
+DWIDTH 5 0
+BBX 2 11 2 -2
+BITMAP
+c0
+c0
+c0
+c0
+c0
+00
+c0
+c0
+c0
+c0
+c0
+ENDCHAR
+STARTCHAR onehalf
+ENCODING -1
+SWIDTH 804 0
+DWIDTH 10 0
+BBX 8 9 1 0
+BITMAP
+44
+c8
+48
+50
+56
+61
+22
+44
+47
+ENDCHAR
+ENDFONT
diff --git a/i386/util/BooterBitmap.h b/i386/util/BooterBitmap.h
new file mode 100644 (file)
index 0000000..58ba632
--- /dev/null
@@ -0,0 +1,70 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
+ * Reserved.  This file contains Original Code and/or Modifications of
+ * Original Code as defined in and that are subject to the Apple Public
+ * Source License Version 1.1 (the "License").  You may not use this file
+ * except in compliance with the License.  Please obtain a copy of the
+ * License at http://www.apple.com/publicsource and read it before using
+ * this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/* Two-plane bitmap. */
+
+#import <objc/Object.h>
+#import "bitmap.h"
+
+@interface BooterBitmap : Object
+{
+    char *filename;
+    id bitmapImageRep;
+    unsigned char *planes[5];
+    int bytes_per_plane;
+    int bg_color;
+    int width, height;
+    
+    unsigned char *packed_planes[2];
+    int plane_len[2];
+    int packed;
+}
+- initFromTiffFile: (char *)filename;
+- (BOOL) writeAsCFile: (char *)filename;
+- (BOOL) writeAsBinaryFile: (char *)filename;
+
+- (int) width;
+- (int) height;
+- (int) setWidth: (int)newWidth;
+- (int) setHeight: (int)newHeight;
+
+- (BOOL)setTwoBitsPerPixelColorData: (unsigned char *)bits;
+- (BOOL)setTwoBitsPerPixelAlphaData: (unsigned char *)bits;
+- (unsigned char *)twoBitsPerPixelColorData;
+- (unsigned char *)twoBitsPerPixelAlphaData;
+
+- (int) colorDataBytes;
+- (int) setColorDataBytes: (int)bpp;
+
+- (int)bgColor;
+- (int)setBgColor: (int) color;
+
+- (char *)filename;
+
+- (BOOL)_convertPlanes;
+- (BOOL)_allocPlanes;
+@end
+
+#define NPLANES 2
+#define BITS_PER_PIXEL 2
+#define BG_COLOR 2     /* light gray */
diff --git a/i386/util/BooterBitmap.m b/i386/util/BooterBitmap.m
new file mode 100644 (file)
index 0000000..16e5354
--- /dev/null
@@ -0,0 +1,363 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
+ * Reserved.  This file contains Original Code and/or Modifications of
+ * Original Code as defined in and that are subject to the Apple Public
+ * Source License Version 1.1 (the "License").  You may not use this file
+ * except in compliance with the License.  Please obtain a copy of the
+ * License at http://www.apple.com/publicsource and read it before using
+ * this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+#import <stdio.h>
+#import <sys/param.h>
+#import <appkit/NXBitmapImageRep.h>
+#import "BooterBitmap.h"
+#import "bitmap.h"
+
+@implementation BooterBitmap
+
+- init
+{
+    bg_color = BG_COLOR;
+    return [super init];
+}
+
+- free
+{
+    if (bitmapImageRep) [bitmapImageRep free];
+    if (packed_planes[0]) free(packed_planes[0]);
+    if (packed_planes[1]) free(packed_planes[1]);
+    return [super free];
+}
+
+- initFromTiffFile: (char *)inputFileName;
+{    
+    [self init];
+    filename = inputFileName;
+    bitmapImageRep = [[NXBitmapImageRep alloc]
+                               initFromFile:inputFileName];
+    if (bitmapImageRep == nil) {
+       fprintf(stderr, "BooterBitmap: couldn't load tiff file %s\n",filename);
+       return nil;
+    }
+    if ([bitmapImageRep numPlanes] - [bitmapImageRep hasAlpha] != 1) {
+       fprintf(stderr,
+           "BooterBitmap: can't deal with more than one input plane (excluding alpha)\n");
+       return nil;
+    }
+    if ([bitmapImageRep bitsPerPixel] != BITS_PER_PIXEL) {
+       fprintf(stderr,
+           "BooterBitmap: can't deal with anything but %d bits per pixel\n",
+           BITS_PER_PIXEL);
+       return nil;
+    }
+    [bitmapImageRep getDataPlanes:planes];
+    width = [bitmapImageRep pixelsWide];
+    height = [bitmapImageRep pixelsHigh];
+    bytes_per_plane = [bitmapImageRep bytesPerPlane];
+    return self;
+}
+
+- (BOOL)_allocPlanes
+{
+    if (packed_planes[0]) free(packed_planes[0]);
+    if (packed_planes[1]) free(packed_planes[1]);
+    packed_planes[0] = (unsigned char *)malloc(bytes_per_plane / NPLANES);
+    packed_planes[1] = (unsigned char *)malloc(bytes_per_plane / NPLANES);
+    if (packed_planes[0] == 0 || packed_planes[1] == 0)
+       return NO;
+    else
+       return YES;
+}
+
+- (BOOL)_convertPlanes
+{
+    int plane, i, j, outbit, index;
+    unsigned char *pp, *alpha, *plane_tmp, *data;
+    unsigned char alphabyte, inbyte, outbyte;
+    int new_bytes_per_plane, bytes_per_row;
+    TIFF tif;
+    int doPack = 1;
+
+startOver:
+    if ([self _allocPlanes] == NO)
+       return NO;
+    plane_tmp = (unsigned char *)malloc(bytes_per_plane / NPLANES);
+    for (plane = 0; plane < NPLANES; plane++) {
+       int col;
+
+       data = planes[0];
+       alpha = planes[1];
+       pp = plane_tmp;
+       
+       bytes_per_row = bytes_per_plane / height;
+
+       for(i=0; i < height; i++) {
+           for(j = outbyte = col = 0, outbit = 7; j < width; j++) {
+               if ((j % (8 / NPLANES)) == 0) {
+                   index = (i * bytes_per_row) + (j / (8 / NPLANES));
+                   inbyte = data[index];
+                   if (alpha)
+                       alphabyte = alpha[index];
+               }
+               if (alpha && ((alphabyte & 0xC0) == 0)) {
+                   outbyte |= 
+                       ((bg_color & (1 << plane)) >> plane) << outbit;
+               } else {
+                   outbyte |= 
+                       ((((inbyte & 0xC0) >> (8 - NPLANES)) & (1 << plane))
+                               >> plane) << outbit;
+               }
+               if (outbit-- == 0) {
+                   *pp++ = outbyte;
+                   outbyte = 0;
+                   outbit = 7;
+               }
+               inbyte <<= NPLANES;
+               alphabyte <<= NPLANES;
+           }
+           if (outbit < 7)
+               *pp++ = outbyte;
+       }
+       bytes_per_row = (width + 7) / 8;
+       new_bytes_per_plane = pp - plane_tmp;
+
+       tif.tif_rawdata = tif.tif_rawcp = packed_planes[plane];
+       tif.tif_rawdatasize = new_bytes_per_plane;
+       tif.tif_rawcc = 0;
+       tif.tif_row = 0;
+       pp = plane_tmp;
+       if (doPack) {
+           for (i=0; i < height; i++) {
+               if (PackBitsEncode(&tif, pp, bytes_per_row, 0) == -1) {
+                   // packed data is bigger than raw data!
+                   doPack = 0;
+                   free(plane_tmp);
+                   goto startOver;
+               }
+               pp += bytes_per_row;
+           }
+       } else {
+           bcopy(plane_tmp, packed_planes[plane], new_bytes_per_plane);
+           tif.tif_rawcc = new_bytes_per_plane;
+       }
+       plane_len[plane] = tif.tif_rawcc;
+    }
+    free(plane_tmp);
+    packed = doPack;
+    return YES;
+}
+
+
+- (BOOL) writeAsCFile: (char *)output_name
+{
+    char buf[MAXPATHLEN], oname_buf[MAXPATHLEN];
+    char *name;
+    FILE *bhfile, *hfile;
+    int i, plane;
+    
+    if (output_name) {
+       strcpy(oname_buf, output_name);
+    } else if (filename) {
+       strcpy(oname_buf, filename);
+       buf[strlen(buf) - strlen(".tiff")] = '\0';
+    } else {
+       fprintf(stderr,"BooterBitmap writeAsCFile: no filename\n");
+       return NO;
+    }
+    output_name = oname_buf;
+    if ([self _convertPlanes] == NO) {
+       fprintf(stderr,"_convertPlanes failed\n");
+       return NO;
+    }
+    
+    name = (char *)strrchr(output_name, '/');
+    if (name == NULL)
+       name = output_name;
+    else
+       name++;
+    sprintf(buf, "%s_bitmap.h",output_name);
+    bhfile = fopen(buf,"w");
+    if (bhfile == 0) {
+       fprintf(stderr,"Couldn't open %s for writing\n",buf);
+       perror("open");
+       return NO;
+    }
+    sprintf(buf,"%s.h",output_name);
+    hfile = fopen(buf,"w");
+    if (hfile == 0) {
+       fprintf(stderr,"Couldn't open %s for writing\n",buf);
+       perror("open");
+       return NO;
+    }
+    
+    for(plane = 0; plane < NPLANES; plane++) {
+       int col = 0;
+       unsigned char *pp;
+       fprintf(bhfile,"unsigned char %s_bitmap_plane_%d[] =\n",name,plane);
+       fprintf(bhfile," {\n");
+       fprintf(bhfile,"// plane %d\n",plane);
+       pp = packed_planes[plane];
+       for (i=0; i < plane_len[plane]; i++) {
+           fprintf(bhfile,"0x%02x, ",*pp++);
+           if ((col += 7) > 70) {
+               col = 0;
+               fprintf(bhfile,"\n");
+           }
+       }
+       fprintf(bhfile,"};\n");
+    }
+    
+    fprintf(bhfile,"struct bitmap %s_bitmap = {\n",name);
+    fprintf(bhfile,"%d,\t// packed\n",packed);
+    fprintf(bhfile,"%d,\t// bytes_per_plane\n",bytes_per_plane / NPLANES);
+    fprintf(bhfile,"%d,\t// bytes_per_row\n", (width + 7) / 8);
+    fprintf(bhfile,"%d,\t// bits per pixel\n", 1);
+    fprintf(bhfile,"%d,\t// width\n", width);
+    fprintf(bhfile,"%d,\t// height\n", height);
+    fprintf(bhfile,"{\n");
+    fprintf(bhfile,"  %d,\n", plane_len[0]);
+    fprintf(bhfile,"  %d,\n", plane_len[1]);
+    fprintf(bhfile,"},\n");
+    fprintf(bhfile,"{\n");
+    fprintf(bhfile,"  %s_bitmap_plane_0,\n", name);
+    fprintf(bhfile,"  %s_bitmap_plane_1\n", name);
+    fprintf(bhfile,"}\n");
+    fprintf(bhfile,"};\n");
+    fprintf(bhfile,"\n#define %s_bitmap_WIDTH\t%d\n", name, width);
+    fprintf(bhfile,"#define %s_bitmap_HEIGHT\t%d\n", name, height);
+    fclose(bhfile);
+    fprintf(hfile,"extern struct bitmap %s_bitmap;\n",name);
+    fprintf(hfile,"\n#define %s_bitmap_WIDTH\t%d\n", name, width);
+    fprintf(hfile,"#define %s_bitmap_HEIGHT\t%d\n", name, height);
+    fclose(bhfile);
+    return YES;
+}
+
+- (BOOL) writeAsBinaryFile: (char *)outputFile
+{
+    struct bitmap bd;
+    char buf[MAXPATHLEN];
+    FILE *file;
+    
+    if (outputFile) {
+       strcpy(buf, outputFile);
+    } else if (filename) {
+       strcpy(buf, filename);
+    } else {
+       fprintf(stderr,"writeAsBinaryFile: no filename\n");
+       return NO;
+    }
+    strcat(buf, ".image");
+    file = fopen(buf, "w");
+    if (file == NULL) {
+       fprintf(stderr, "writeAsBinaryFile: couldn't open output file %s\n",
+           buf);
+       return NO;
+    }
+    if ([self _convertPlanes] == NO) {
+       fprintf(stderr,"_convertPlanes failed\n");
+       return NO;
+    }
+    bd.packed = packed;
+    bd.bytes_per_plane = bytes_per_plane / NPLANES;
+    bd.bytes_per_row = (width + 7) / 8;
+    bd.bits_per_pixel = 1;
+    bd.width = width;
+    bd.height = height;
+    bd.plane_len[0] = plane_len[0];
+    bd.plane_len[1] = plane_len[1];
+    bd.plane_data[0] = bd.plane_data[1] = 0;
+    if (fwrite(&bd, sizeof(bd), 1, file) < 1) goto error;
+    if (fwrite(packed_planes[0], plane_len[0], 1, file) < 1) goto error;
+    if (fwrite(packed_planes[1], plane_len[1], 1, file) < 1) goto error;
+    fclose(file);
+    return YES;
+error:
+    perror("fwrite");
+    return NO;
+}
+
+
+- (int) width
+{
+    return width;
+}
+
+- (int) height
+{
+    return height;
+}
+
+- (int) setWidth: (int)newWidth
+{
+    return width = newWidth;
+}
+
+- (int) setHeight: (int)newHeight
+{
+    return height = newHeight;
+}
+
+- (int) bgColor
+{
+    return bg_color;
+}
+
+- (int) setBgColor: (int)newColor
+{
+    return bg_color = newColor;
+}
+
+- (BOOL) setTwoBitsPerPixelColorData: (unsigned char *)bits;
+{
+    planes[0] = bits;
+    return YES;
+}
+
+- (BOOL) setTwoBitsPerPixelAlphaData: (unsigned char *)bits;
+{
+    planes[1] = bits;
+    return YES;
+}
+
+- (unsigned char *) twoBitsPerPixelColorData
+{
+    return planes[0];
+}
+
+- (unsigned char *) twoBitsPerPixelAlphaData
+{
+    return planes[1];
+}
+
+- (int) colorDataBytes
+{
+    return bytes_per_plane;
+}
+
+- (int) setColorDataBytes: (int)bpp
+{
+    return bytes_per_plane = bpp;
+}
+
+- (char *)filename
+{
+    return filename;
+}
+
+
+@end
diff --git a/i386/util/Default.font b/i386/util/Default.font
new file mode 100644 (file)
index 0000000..be436ad
Binary files /dev/null and b/i386/util/Default.font differ
diff --git a/i386/util/FontBitmap.h b/i386/util/FontBitmap.h
new file mode 100644 (file)
index 0000000..64873b1
--- /dev/null
@@ -0,0 +1,231 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
+ * Reserved.  This file contains Original Code and/or Modifications of
+ * Original Code as defined in and that are subject to the Apple Public
+ * Source License Version 1.1 (the "License").  You may not use this file
+ * except in compliance with the License.  Please obtain a copy of the
+ * License at http://www.apple.com/publicsource and read it before using
+ * this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/* generated by mkfont */
+
+#import "font.h"
+
+static const char bits_array[] = {
+       0x33, 0x30, 0xc0, 0x82, 0x08, 0x41, 0x06, 0x20, 
+       0x82, 0x10, 0x46, 0x02, 0x22, 0x44, 0x48, 0x88, 
+       0x91, 0x10, 0x18, 0x82, 0x10, 0x41, 0x18, 0x20, 
+       0x84, 0x10, 0x40, 0xc3, 0xe9, 0x08, 0x42, 0x11, 
+       0x7c, 0xcc, 0x89, 0x12, 0x44, 0x8a, 0x08, 0x11, 
+       0x43, 0x03, 0x32, 0x43, 0x04, 0x14, 0x4b, 0x8b, 
+       0x26, 0x92, 0x49, 0x25, 0x16, 0x8d, 0x84, 0x86, 
+       0x68, 0xa4, 0x92, 0x8c, 0x20, 0xc9, 0x29, 0x25, 
+       0x25, 0xbb, 0x08, 0x4f, 0x22, 0x11, 0x0a, 0x60, 
+       0xe9, 0x41, 0x05, 0x2e, 0x2c, 0x88, 0x44, 0x21, 
+       0x01, 0xa4, 0x91, 0x24, 0x89, 0x21, 0xc0, 0x82, 
+       0x0e, 0x0d, 0x86, 0x44, 0x44, 0x48, 0x89, 0x8e, 
+       0x10, 0x10, 0x38, 0x06, 0x6d, 0x18, 0x62, 0xd9, 
+       0x86, 0xcd, 0x65, 0x24, 0xa5, 0x8b, 0xb6, 0x6d, 
+       0x64, 0xa4, 0x92, 0x52, 0x59, 0x11, 0x89, 0x12, 
+       0x22, 0x45, 0x21, 0x81, 0x02, 0x09, 0x92, 0x78, 
+       0xa1, 0x44, 0xa8, 0x80, 0x80, 0x00, 0xc1, 0x04, 
+       0x20, 0x82, 0x10, 0x45, 0x18, 0x08, 0x03, 0x12, 
+       0x24, 0x52, 0x18, 0x20, 0x85, 0x9a, 0xca, 0x49, 
+       0x4b, 0x10, 0xf2, 0x48, 0x92, 0x18, 0x40, 0xe2, 
+       0x24, 0x47, 0x00, 0x60, 0xa0, 0x83, 0xc1, 0x01, 
+       0x02, 0x02, 0x02, 0x04, 0x04, 0x14, 0x18, 0x03, 
+       0x32, 0x9f, 0x90, 0x64, 0xe0, 0x30, 0x20, 0x8d, 
+       0x26, 0x89, 0x12, 0x45, 0xa5, 0x83, 0xb2, 0x84, 
+       0x10, 0x64, 0xe1, 0x82, 0x10, 0x53, 0xa8, 0xa3, 
+       0x16, 0xcc, 0x0d, 0x6c, 0x8a, 0x24, 0xca, 0xa9, 
+       0x9b, 0xff, 0x08, 0xca, 0x98, 0xc4, 0x70, 0x41, 
+       0x08, 0x20, 0x84, 0x10, 0x42, 0x08, 0x23, 0x88, 
+       0x88, 0xc4, 0x46, 0x22, 0x31, 0xc4, 0x10, 0x82, 
+       0x08, 0x41, 0x04, 0x20, 0x82, 0x0e, 0x1f, 0xd0, 
+       0x40, 0x81, 0x02, 0x04, 0x08, 0x10, 0x20, 0xbf, 
+       0xb8, 0xe8, 0x22, 0x20, 0xa0, 0x60, 0x20, 0x10, 
+       0x10, 0x08, 0x0e, 0x07, 0x39, 0x08, 0x48, 0x28, 
+       0x08, 0x04, 0x05, 0x04, 0x84, 0x27, 0x3b, 0xb9, 
+       0xd1, 0x09, 0x11, 0x11, 0x11, 0x11, 0x0a, 0xa0, 
+       0xaa, 0x0c, 0xc0, 0xcc, 0x08, 0x83, 0x8e, 0x82, 
+       0x42, 0x21, 0x11, 0x09, 0x04, 0x82, 0x81, 0x80, 
+       0x80, 0x79, 0xc8, 0x22, 0x11, 0x04, 0x41, 0x10, 
+       0x88, 0x22, 0x08, 0x84, 0x1e, 0x0f, 0xf2, 0x44, 
+       0x10, 0x20, 0x41, 0x02, 0x04, 0x1c, 0x06, 0x93, 
+       0x22, 0x40, 0x40, 0x40, 0x50, 0xb1, 0x5c, 0x3f, 
+       0x08, 0x44, 0x24, 0x23, 0xe1, 0x41, 0x10, 0x88, 
+       0x42, 0x71, 0x83, 0x86, 0x26, 0x0a, 0x07, 0x03, 
+       0x03, 0x81, 0x41, 0x91, 0x87, 0x02, 0x02, 0x0b, 
+       0xf8, 0x7e, 0x10, 0x88, 0x48, 0x47, 0xc2, 0x02, 
+       0x01, 0x00, 0x80, 0xe0, 0x07, 0x0c, 0x4c, 0x14, 
+       0x0e, 0x06, 0x07, 0x02, 0x83, 0x23, 0x0e, 0x06, 
+       0x1c, 0x41, 0x08, 0x22, 0x88, 0x51, 0x09, 0x22, 
+       0x28, 0x45, 0x08, 0x63, 0x84, 0x18, 0x38, 0x83, 
+       0x0c, 0x51, 0x4a, 0x14, 0xa1, 0x52, 0x25, 0x42, 
+       0x64, 0x24, 0x47, 0x4e, 0x1c, 0x10, 0x20, 0x81, 
+       0x02, 0x08, 0x10, 0x21, 0xfc, 0x73, 0x88, 0x82, 
+       0x41, 0x20, 0x70, 0x14, 0x08, 0x82, 0x10, 0x82, 
+       0x71, 0xc3, 0x84, 0x10, 0x82, 0x08, 0x41, 0x14, 
+       0x60, 0x71, 0x08, 0x84, 0x22, 0x10, 0x8e, 0x1c, 
+       0xe2, 0x10, 0x84, 0x42, 0x1f, 0x84, 0x22, 0x10, 
+       0x84, 0x21, 0x1c, 0xe0, 0xf4, 0xc4, 0x82, 0x40, 
+       0x40, 0x21, 0xd0, 0x48, 0x26, 0x21, 0xe0, 0x7f, 
+       0x10, 0x88, 0x08, 0x87, 0x82, 0x42, 0x01, 0x00, 
+       0x80, 0xe0, 0x1f, 0xc4, 0x22, 0x02, 0x21, 0xf0, 
+       0x90, 0x80, 0x40, 0x20, 0xbf, 0x87, 0xe1, 0x18, 
+       0x84, 0x82, 0x41, 0x20, 0xa0, 0x90, 0x48, 0xcf, 
+       0x80, 0xf4, 0xc4, 0x82, 0x40, 0x40, 0x20, 0x10, 
+       0x08, 0x06, 0x21, 0xe0, 0x7e, 0x10, 0x88, 0x48, 
+       0x47, 0xc2, 0x32, 0x09, 0x04, 0x84, 0xfc, 0x01, 
+       0x80, 0xc0, 0xa0, 0x90, 0x48, 0x44, 0x7e, 0x21, 
+       0x20, 0xb8, 0xe0, 0xf0, 0x30, 0xc4, 0x04, 0x87, 
+       0x29, 0x93, 0x11, 0x32, 0x23, 0x26, 0x32, 0xa4, 
+       0x91, 0x88, 0x00, 0x60, 0x81, 0xf0, 0xd3, 0xa2, 
+       0x49, 0x10, 0x10, 0x60, 0x18, 0x04, 0x02, 0x0c, 
+       0x71, 0x80, 0xfe, 0x01, 0xfc, 0x06, 0x38, 0xc1, 
+       0x00, 0x80, 0x60, 0x18, 0x48, 0x03, 0x28, 0xa0, 
+       0x50, 0xc5, 0xa2, 0x8a, 0x66, 0x84, 0x11, 0x98, 
+       0x0c, 0x4a, 0x25, 0x18, 0xa4, 0x51, 0x48, 0xc3, 
+       0xf0, 0x84, 0x10, 0x84, 0x10, 0x84, 0x10, 0x06, 
+       0x62, 0x08, 0x79, 0x14, 0x51, 0x68, 0xc1, 0xe8, 
+       0x20, 0xe0, 0xc1, 0x04, 0x14, 0x9c, 0x02, 0x18, 
+       0xa5, 0x25, 0x27, 0xe2, 0x10, 0x40, 0xc4, 0x82, 
+       0x11, 0x81, 0x04, 0x14, 0x8c, 0x1c, 0x88, 0x20, 
+       0x84, 0x21, 0x08, 0x45, 0xf1, 0x88, 0x91, 0x12, 
+       0x22, 0x70, 0xc4, 0xa2, 0x8c, 0x30, 0xc5, 0x14, 
+       0x8c, 0x04, 0x22, 0x11, 0x08, 0x84, 0x42, 0x1f, 
+       0xd8, 0x40, 0x81, 0x1f, 0xc4, 0x08, 0x10, 0x4a, 
+       0xb9, 0xd5, 0x21, 0x08, 0x88, 0x88, 0x91, 0x12, 
+       0x24, 0x09, 0x12, 0x22, 0x44, 0x44, 0x44, 0x26, 
+       0xc1, 0x81, 0x20, 0x90, 0x70, 0x73, 0x49, 0x45, 
+       0x21, 0x11, 0xd7, 0x31, 0xc4, 0x4f, 0x91, 0x22, 
+       0x48, 0x32, 0x00, 0x4c, 0x12, 0x44, 0x88, 0x92, 
+       0x21, 0x80, 0x87, 0x15, 0x2a, 0x50, 0x60, 0xa1, 
+       0x54, 0xa9, 0x3c, 0x20, 0x28, 0x50, 0xa7, 0xe5, 
+       0x0a, 0x7e, 0x50, 0xa1, 0x41, 0xb6, 0xc9, 0x24, 
+       0x08, 0x89, 0x11, 0x22, 0x04, 0x02, 
+};
+
+const font_c_t Times_Italic_14 = {
+       "Times-Italic-14",
+       14,
+       {17, 15, -3, -4},
+       {
+           { {   0,    0,    0,    0},    3,   5865 }, /* 0x20 */
+           { {   4,   10,    1,    0},    5,   5825 }, /* 0x21 */
+           { {   7,    4,    0,    6},    6,   5797 }, /* 0x22 */
+           { {   7,   10,    0,    0},    7,   5727 }, /* 0x23 */
+           { {   7,   12,    0,   -1},    7,   5643 }, /* 0x24 */
+           { {  11,   10,    0,    0},   12,   5533 }, /* 0x25 */
+           { {   9,   10,    0,    0},   11,   5443 }, /* 0x26 */
+           { {   2,    3,    2,    7},    5,   5437 }, /* 0x27 */
+           { {   4,   13,    1,   -3},    5,   5385 }, /* 0x28 */
+           { {   4,   13,    0,   -3},    5,   5333 }, /* 0x29 */
+           { {   5,    6,    1,    4},    7,   5303 }, /* 0x2a */
+           { {   7,    7,    1,    0},   10,   5254 }, /* 0x2b */
+           { {   2,    3,    1,   -1},    4,   5248 }, /* 0x2c */
+           { {   3,    1,    1,    3},    5,   5245 }, /* 0x2d */
+           { {   1,    2,    1,    0},    3,   5243 }, /* 0x2e */
+           { {   5,   10,   -1,    0},    4,   5193 }, /* 0x2f */
+           { {   6,   10,    0,    0},    7,   5133 }, /* 0x30 */
+           { {   4,   10,    1,    0},    7,   5093 }, /* 0x31 */
+           { {   6,   10,    0,    0},    7,   5033 }, /* 0x32 */
+           { {   6,   10,    0,    0},    7,   4973 }, /* 0x33 */
+           { {   6,   10,    0,    0},    7,   4913 }, /* 0x34 */
+           { {   6,   10,    0,    0},    7,   4853 }, /* 0x35 */
+           { {   6,   10,    1,    0},    7,   4793 }, /* 0x36 */
+           { {   6,   10,    1,    0},    7,   4733 }, /* 0x37 */
+           { {   6,   10,    0,    0},    7,   4673 }, /* 0x38 */
+           { {   6,   10,    0,    0},    7,   4613 }, /* 0x39 */
+           { {   2,    7,    1,    0},    4,   4599 }, /* 0x3a */
+           { {   3,    8,    0,   -1},    4,   4575 }, /* 0x3b */
+           { {   8,    7,    1,    0},   10,   4519 }, /* 0x3c */
+           { {   8,    3,    1,    2},   10,   4495 }, /* 0x3d */
+           { {   8,    7,    1,    0},   10,   4439 }, /* 0x3e */
+           { {   4,   10,    2,    0},    7,   4399 }, /* 0x3f */
+           { {  12,   13,    0,   -3},   13,   4243 }, /* 0x40 */
+           { {   9,   10,   -1,    0},    9,   4153 }, /* 0x41 */
+           { {   9,   10,   -1,    0},    8,   4063 }, /* 0x42 */
+           { {   9,   10,    0,    0},    9,   3973 }, /* 0x43 */
+           { {   9,   10,    0,    0},   10,   3883 }, /* 0x44 */
+           { {   9,   10,    0,    0},    9,   3793 }, /* 0x45 */
+           { {   9,   10,    0,    0},    9,   3703 }, /* 0x46 */
+           { {   9,   10,    1,    0},   10,   3613 }, /* 0x47 */
+           { {  10,   10,    0,    0},   10,   3513 }, /* 0x48 */
+           { {   5,   10,    0,    0},    5,   3463 }, /* 0x49 */
+           { {   6,   10,    0,    0},    6,   3403 }, /* 0x4a */
+           { {  10,   10,    0,    0},   10,   3303 }, /* 0x4b */
+           { {   7,   10,    0,    0},    8,   3233 }, /* 0x4c */
+           { {  12,   10,    0,    0},   12,   3113 }, /* 0x4d */
+           { {  11,   10,    0,    0},   11,   3003 }, /* 0x4e */
+           { {   9,   10,    0,    0},   10,   2913 }, /* 0x4f */
+           { {   9,   10,    0,    0},    9,   2823 }, /* 0x50 */
+           { {   9,   13,    0,   -3},   10,   2706 }, /* 0x51 */
+           { {   9,   10,    0,    0},    9,   2616 }, /* 0x52 */
+           { {   7,   10,    0,    0},    7,   2546 }, /* 0x53 */
+           { {   7,   10,    1,    0},    8,   2476 }, /* 0x54 */
+           { {  10,   10,    0,    0},   10,   2376 }, /* 0x55 */
+           { {   9,   10,    1,    0},    9,   2286 }, /* 0x56 */
+           { {  12,   10,    0,    0},   11,   2166 }, /* 0x57 */
+           { {   9,   10,    0,    0},    9,   2076 }, /* 0x58 */
+           { {   9,   10,    0,    0},    8,   1986 }, /* 0x59 */
+           { {   8,   10,    0,    0},    8,   1906 }, /* 0x5a */
+           { {   6,   13,    0,   -3},    6,   1828 }, /* 0x5b */
+           { {   4,   10,    0,    0},    4,   1788 }, /* 0x5c */
+           { {   6,   13,    0,   -3},    6,   1710 }, /* 0x5d */
+           { {   5,    6,    0,    4},    6,   1680 }, /* 0x5e */
+           { {   8,    1,   -2,   -4},    7,   1672 }, /* 0x5f */
+           { {   2,    3,    2,    7},    5,   1666 }, /* 0x60 */
+           { {   7,    7,    0,    0},    7,   1617 }, /* 0x61 */
+           { {   6,   10,    0,    0},    7,   1557 }, /* 0x62 */
+           { {   6,    7,    0,    0},    6,   1515 }, /* 0x63 */
+           { {   7,   10,    0,    0},    7,   1445 }, /* 0x64 */
+           { {   6,    7,    0,    0},    7,   1403 }, /* 0x65 */
+           { {   8,   13,   -2,   -3},    5,   1299 }, /* 0x66 */
+           { {   7,   10,   -1,   -3},    6,   1229 }, /* 0x67 */
+           { {   6,   10,    0,    0},    7,   1169 }, /* 0x68 */
+           { {   4,   10,    0,    0},    4,   1129 }, /* 0x69 */
+           { {   6,   13,   -2,   -3},    4,   1051 }, /* 0x6a */
+           { {   7,   10,    0,    0},    7,    981 }, /* 0x6b */
+           { {   4,   10,    0,    0},    4,    941 }, /* 0x6c */
+           { {   9,    7,    0,    0},   10,    878 }, /* 0x6d */
+           { {   6,    7,    0,    0},    7,    836 }, /* 0x6e */
+           { {   6,    7,    0,    0},    7,    794 }, /* 0x6f */
+           { {   8,   10,   -2,   -3},    7,    714 }, /* 0x70 */
+           { {   7,   10,    0,   -3},    7,    644 }, /* 0x71 */
+           { {   5,    7,    0,    0},    5,    609 }, /* 0x72 */
+           { {   5,    7,    0,    0},    6,    574 }, /* 0x73 */
+           { {   5,    9,    0,    0},    5,    529 }, /* 0x74 */
+           { {   6,    7,    0,    0},    7,    487 }, /* 0x75 */
+           { {   6,    7,    0,    0},    6,    445 }, /* 0x76 */
+           { {   9,    7,    0,    0},    9,    382 }, /* 0x77 */
+           { {   7,    7,   -1,    0},    7,    333 }, /* 0x78 */
+           { {   7,   10,   -1,   -3},    7,    263 }, /* 0x79 */
+           { {   6,    7,    0,    0},    6,    221 }, /* 0x7a */
+           { {   6,   13,    0,   -3},    6,    143 }, /* 0x7b */
+           { {   4,   13,    0,   -3},    4,     91 }, /* 0x7c */
+           { {   6,   13,   -1,   -3},    6,     13 }, /* 0x7d */
+           { {   6,    2,    1,    3},    8,      1 }, /* 0x7e */
+
+       },
+       bits_array,
+};
+
+#define Times_Italic_14_BBX_WIDTH      17
+#define Times_Italic_14_BBX_HEIGHT     15
+#define Times_Italic_14_BBX_XOFF       -3
+#define Times_Italic_14_BBX_YOFF       -4
diff --git a/i386/util/Makefile b/i386/util/Makefile
new file mode 100644 (file)
index 0000000..5914861
--- /dev/null
@@ -0,0 +1,96 @@
+#
+# Until I can remove the dependency on the appkit,
+# we'll just keep the generated files in this directory
+# and install them directly, rather than generating them again.
+#
+
+DIR = util
+include ../MakePaths.dir
+
+VPATH = $(OBJROOT):$(SYMROOT)
+
+INSTALLDIR = $(DSTROOT)/usr/standalone/i386
+LOCALBIN = $(DSTROOT)/usr/local/bin
+LANGDIR = $(INSTALLDIR)/English.lproj
+
+OPTIM = -Os
+CFLAGS = $(RC_CFLAGS) $(OPTIM) -Wmost -Wno-precomp -g -I../rcz -traditional-cpp -nostdinc -nostdlib -I/usr/include -I/System/Library/Frameworks/System.framework/Headers
+LDFLAGS = /usr/lib/crt1.o /System/Library/Frameworks/System.framework/System -lcc
+CFILES = machOconv.c mkfont.c tif_packbits.c
+MFILES = dumptiff.m
+HFILES = cursor.h
+EXPORT_HFILES = bitmap.h font.h
+ALLSRC = $(CFILES) $(MFILES) $(HFILES) $(EXPORT_HFILES)
+
+TIFFILES = return.tiff ns_box.tiff ns_text.tiff ns_logo.tiff dot.tiff
+TIFF_HFILES = $(TIFFILES:.tiff=.h)
+TIFF_BFILES = $(TIFFILES:.tiff=_bitmap.h)
+
+CURSOR_HFILES = ns_wait1.h ns_wait1_bitmap.h \
+               ns_wait2.h ns_wait2_bitmap.h \
+               ns_wait3.h ns_wait3_bitmap.h
+OTHER_HFILES = hdot.h hdot_bitmap.h
+
+FONTFILES = 14.TimesIta
+FONT_HFILES = FontBitmap.h
+
+#PROGRAMS = machOconv mkfont dumptiff sig
+PROGRAMS = machOconv
+
+OUTFILES = $(PROGRAMS) $(TIFF_HFILES) $(TIFF_BFILES) $(CURSOR_HFILES) \
+               $(FONT_HFILES) $(OTHER_HFILES)
+DUMPTIFF = $(SYMROOT)/dumptiff
+DUMPTIFF_OBJS = tif_packbits.o dumptiff.o BooterBitmap.o
+SIG = $(SYMROOT)/sig
+SIG_OBJS = sig.o
+
+DIRS_NEEDED = $(OBJROOT) $(SYMROOT) $(LANGDIR) $(LOCALBIN)
+
+#BITMAPS = Panel.image Wait1.image Wait2.image Wait3.image
+BITMAPS = Panel.image
+FONTS = Default.font
+
+.SUFFIXES: .tiff
+.tiff.h:
+       $(DUMPTIFF) -o $(SYMROOT)/$* $<
+
+#all: $(DIRS_NEEDED) $(PROGRAMS) $(OUTFILES)
+all: $(DIRS_NEEDED) $(PROGRAMS) $(BITMAPS)
+
+#clean::
+#      cd $(SYMROOT); rm -f $(OUTFILES)
+clean::
+       -(cd $(SYMROOT); rm -f $(PROGRAMS))
+
+install_i386:: $(INSTALLDIR) $(LANGDIR)
+       cp $(BITMAPS) $(INSTALLDIR)
+       cp $(FONTS) $(INSTALLDIR)/English.lproj
+
+$(TIFF_HFILES): $(DUMPTIFF)
+$(TIFF_BFILES): $(TIFF_HFILES)
+$(CURSOR_HFILES): CURSOR_HFILES
+CURSOR_HFILES: $(DUMPTIFF)
+       $(DUMPTIFF) -c -o $(SYMROOT)/ns_wait
+$(FONT_HFILES): mkfont $(FONTFILES)
+       mkfont $(FONTFILES) -c $(SYMROOT)/$(@F)
+
+hdot.h hdot_bitmap.h: dot.tiff $(DUMPTIFF)
+       $(DUMPTIFF) -b 3 -o $(SYMROOT)/hdot dot.tiff
+
+sig: $(SIG_OBJS)
+       $(CC) $(CFLAGS) $(LDFLAGS) $(DEFINES) -o $(SYMROOT)/$(@F) $(SIG_OBJS)
+
+dumptiff: $(DUMPTIFF_OBJS)
+       $(CC) $(CFLAGS) $(LDFLAGS) $(DEFINES) -o $(SYMROOT)/$(@F) $(DUMPTIFF_OBJS) -lNeXT_s
+
+mkfont: mkfont.o
+       $(CC) $(CFLAGS) $(LDFLAGS) $(DEFINES) -o $(SYMROOT)/$(@F) mkfont.o
+
+machOconv: machOconv.o
+       $(CC) $(CFLAGS) $(LDFLAGS) $(DEFINES) -o $(SYMROOT)/$(@F) machOconv.o
+
+include ../MakeInc.dir
+
+#dependencies
+-include $(OBJROOT)/Makedep
+
diff --git a/i386/util/Newpanel.image b/i386/util/Newpanel.image
new file mode 100644 (file)
index 0000000..5d19346
Binary files /dev/null and b/i386/util/Newpanel.image differ
diff --git a/i386/util/Panel.image b/i386/util/Panel.image
new file mode 100644 (file)
index 0000000..5bb1230
Binary files /dev/null and b/i386/util/Panel.image differ
diff --git a/i386/util/Wait1.image b/i386/util/Wait1.image
new file mode 100644 (file)
index 0000000..27d765e
Binary files /dev/null and b/i386/util/Wait1.image differ
diff --git a/i386/util/Wait2.image b/i386/util/Wait2.image
new file mode 100644 (file)
index 0000000..39fe404
Binary files /dev/null and b/i386/util/Wait2.image differ
diff --git a/i386/util/Wait3.image b/i386/util/Wait3.image
new file mode 100644 (file)
index 0000000..6db0db5
Binary files /dev/null and b/i386/util/Wait3.image differ
diff --git a/i386/util/bitmap.h b/i386/util/bitmap.h
new file mode 100644 (file)
index 0000000..4c142e4
--- /dev/null
@@ -0,0 +1,49 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
+ * Reserved.  This file contains Original Code and/or Modifications of
+ * Original Code as defined in and that are subject to the Apple Public
+ * Source License Version 1.1 (the "License").  You may not use this file
+ * except in compliance with the License.  Please obtain a copy of the
+ * License at http://www.apple.com/publicsource and read it before using
+ * this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/* compiled bitmaps */
+
+typedef struct tiff {
+       char    *tif_name;              /* name of open file */
+       long    tif_row;                /* current scanline */
+       char    *tif_rawdata;           /* raw data buffer */
+       long    tif_rawdatasize;        /* # of bytes in raw data buffer */
+       char    *tif_rawcp;             /* current spot in raw buffer */
+       long    tif_rawcc;              /* bytes unread from raw buffer */
+       int     tif_curstrip;           /* current strip for read/write */
+       long    tif_curoff;             /* current offset for read/write */
+} TIFF;
+
+
+
+struct bitmap {
+       long packed;
+       long bytes_per_plane;
+       short bytes_per_row;
+       short bits_per_pixel;
+       short width, height;
+       long plane_len[2];
+       unsigned char *plane_data[2];
+};
+
+
diff --git a/i386/util/cursor.h b/i386/util/cursor.h
new file mode 100644 (file)
index 0000000..bb37a33
--- /dev/null
@@ -0,0 +1,102 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
+ * Reserved.  This file contains Original Code and/or Modifications of
+ * Original Code as defined in and that are subject to the Apple Public
+ * Source License Version 1.1 (the "License").  You may not use this file
+ * except in compliance with the License.  Please obtain a copy of the
+ * License at http://www.apple.com/publicsource and read it before using
+ * this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+static const unsigned char waitAlpha2[] =
+{
+    0x00,0x3f,0xfc,0x00,
+    0x03,0xff,0xff,0xc0,
+    0x0f,0xff,0xff,0xf0,
+    0x3f,0xff,0xff,0xfc,
+    0x3f,0xff,0xff,0xfc,
+    0xff,0xff,0xff,0xff,
+    0xff,0xff,0xff,0xff,
+    0xff,0xff,0xff,0xff,
+    0xff,0xff,0xff,0xff,
+    0xff,0xff,0xff,0xff,
+    0xff,0xff,0xff,0xff,
+    0x3f,0xff,0xff,0xfc,
+    0x3f,0xff,0xff,0xfc,
+    0x0f,0xff,0xff,0xf0,
+    0x03,0xff,0xff,0xc0,
+    0x00,0x3f,0xfc,0x00
+};
+
+static unsigned char waitData2W1[] =
+{
+    0x00,0x3F,0xFC,0x00,
+    0x03,0xE9,0x42,0x80,
+    0x0F,0xA9,0x41,0x60,
+    0x3F,0xE9,0x05,0x54,
+    0x3B,0xF9,0x15,0xA4,
+    0xEA,0xB9,0x16,0xBC,
+    0xD6,0x6D,0x1B,0xFC,
+    0xD5,0x55,0x6E,0xA8,
+    0xD1,0x01,0x55,0x98,
+    0xC0,0x16,0x50,0x54,
+    0xC1,0x5B,0x94,0x04,
+    0x25,0x6B,0xA5,0x00,
+    0x25,0xAB,0xE5,0x40,
+    0x09,0xAF,0xA5,0x40,
+    0x01,0x7F,0xE4,0x00,
+    0x00,0x00,0x00,0x00
+};
+
+static unsigned char waitData2W2[] =
+{
+    0x00,0x3F,0xFC,0x00,
+    0x03,0xEF,0xEA,0x80,
+    0x0E,0xAF,0xA9,0x60,
+    0x35,0xAB,0xA5,0x04,
+    0x31,0x6B,0x94,0x04,
+    0xC0,0x5B,0x90,0x54,
+    0xD0,0x06,0x81,0x58,
+    0xD5,0x41,0x16,0xA8,
+    0xD9,0x94,0x1F,0xF8,
+    0xEA,0xAD,0x1A,0xFC,
+    0xEB,0xF9,0x06,0xA4,
+    0x2F,0xE9,0x05,0xA0,
+    0x2F,0xA9,0x05,0x60,
+    0x0B,0xA5,0x41,0x40,
+    0x02,0x95,0x40,0x00,
+    0x00,0x00,0x00,0x00
+};
+
+static unsigned char waitData2W3[] =
+{
+    0x00,0x3F,0xFC,0x00,
+    0x03,0xC5,0x6B,0xC0,
+    0x0D,0x05,0x6B,0xF0,
+    0x39,0x41,0xAF,0xF4,
+    0x39,0x41,0xAF,0xA4,
+    0xEA,0x51,0xAA,0x94,
+    0xFE,0x94,0x95,0x54,
+    0xFF,0xF9,0x00,0x00,
+    0xFB,0xA4,0x55,0x00,
+    0xEA,0x94,0xA9,0x54,
+    0xE9,0x51,0xBA,0x54,
+    0x25,0x41,0xBA,0x90,
+    0x25,0x01,0xAE,0x80,
+    0x09,0x05,0xAF,0x40,
+    0x01,0x55,0x64,0x00,
+    0x00,0x00,0x00,0x00
+};
diff --git a/i386/util/dot.h b/i386/util/dot.h
new file mode 100644 (file)
index 0000000..95a87b9
--- /dev/null
@@ -0,0 +1,27 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
+ * Reserved.  This file contains Original Code and/or Modifications of
+ * Original Code as defined in and that are subject to the Apple Public
+ * Source License Version 1.1 (the "License").  You may not use this file
+ * except in compliance with the License.  Please obtain a copy of the
+ * License at http://www.apple.com/publicsource and read it before using
+ * this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+extern struct bitmap dot_bitmap;
+
+#define dot_bitmap_WIDTH       6
+#define dot_bitmap_HEIGHT      6
diff --git a/i386/util/dot.tiff b/i386/util/dot.tiff
new file mode 100644 (file)
index 0000000..c391057
Binary files /dev/null and b/i386/util/dot.tiff differ
diff --git a/i386/util/dot_bitmap.h b/i386/util/dot_bitmap.h
new file mode 100644 (file)
index 0000000..98f5083
--- /dev/null
@@ -0,0 +1,50 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
+ * Reserved.  This file contains Original Code and/or Modifications of
+ * Original Code as defined in and that are subject to the Apple Public
+ * Source License Version 1.1 (the "License").  You may not use this file
+ * except in compliance with the License.  Please obtain a copy of the
+ * License at http://www.apple.com/publicsource and read it before using
+ * this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+unsigned char dot_bitmap_plane_0[] =
+ {
+// plane 0
+0x60, 0xd4, 0xa8, 0xd4, 0x2c, 0x58, };
+unsigned char dot_bitmap_plane_1[] =
+ {
+// plane 1
+0x8c, 0x00, 0x00, 0x00, 0x80, 0x84, };
+struct bitmap dot_bitmap = {
+0,     // packed
+6,     // bytes_per_plane
+1,     // bytes_per_row
+1,     // bits per pixel
+6,     // width
+6,     // height
+{
+  6,
+  6,
+},
+{
+  dot_bitmap_plane_0,
+  dot_bitmap_plane_1
+}
+};
+
+#define dot_bitmap_WIDTH       6
+#define dot_bitmap_HEIGHT      6
diff --git a/i386/util/dumptiff b/i386/util/dumptiff
new file mode 100755 (executable)
index 0000000..eec7853
Binary files /dev/null and b/i386/util/dumptiff differ
diff --git a/i386/util/dumptiff.m b/i386/util/dumptiff.m
new file mode 100644 (file)
index 0000000..89e38b6
--- /dev/null
@@ -0,0 +1,146 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
+ * Reserved.  This file contains Original Code and/or Modifications of
+ * Original Code as defined in and that are subject to the Apple Public
+ * Source License Version 1.1 (the "License").  You may not use this file
+ * except in compliance with the License.  Please obtain a copy of the
+ * License at http://www.apple.com/publicsource and read it before using
+ * this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Dump a tiff file into a format that is easily
+ * used by the booter.
+ *
+ * Copyright 1993 NeXT, Inc.
+ * All rights reserved.
+ */
+
+#import <stdio.h>
+#import <sys/param.h>
+#import "bitmap.h"
+#import "cursor.h"
+#import "BooterBitmap.h"
+
+#define DEFAULT_CURSOR_NAME "ns_wait"
+
+void printCursors(char *name, int bg_color, int use_c_mode)
+{
+    id bitmap;
+    char buf[MAXPATHLEN];
+    bitmap = [[BooterBitmap alloc] init];
+    
+    [bitmap setWidth:16];
+    [bitmap setHeight:16];
+    [bitmap setColorDataBytes:64];
+    [bitmap setBgColor:bg_color];
+    [bitmap setTwoBitsPerPixelAlphaData:(unsigned char *)waitAlpha2];
+
+    sprintf(buf,"%s1",name);
+    [bitmap setTwoBitsPerPixelColorData:waitData2W1];
+    use_c_mode ? [bitmap writeAsCFile:buf] :
+       [bitmap writeAsBinaryFile:buf];
+    
+    sprintf(buf,"%s2",name);
+    [bitmap setTwoBitsPerPixelColorData:waitData2W2];
+    use_c_mode ? [bitmap writeAsCFile:buf] :
+       [bitmap writeAsBinaryFile:buf];
+    
+    sprintf(buf,"%s3",name);
+    [bitmap setTwoBitsPerPixelColorData:waitData2W3];
+    use_c_mode ? [bitmap writeAsCFile:buf] :
+       [bitmap writeAsBinaryFile:buf];
+    
+    [bitmap free];
+}
+
+void usage(void)
+{
+    fprintf(stderr,"Usage: dumptiff [-b <bgcolor] [-c] [-C] [-o <ofile>] <tiff>\n");
+    fprintf(stderr,"-C prints cursor bitmaps\n");
+    fprintf(stderr,"-c creates files <tiff>.h and <tiff>_bitmap.h\n");
+    fprintf(stderr,"(default is to create binary .bitmap file)\n");
+    exit(1);
+}
+
+void
+main(int argc, char **argv)
+{
+    id bitmap;
+    char buf[MAXPATHLEN], *file;
+    int vflag=0, errflag=0, pcursors=0, c, ret;
+    extern char *optarg;
+    extern int optind;
+    int bg_color = BG_COLOR;
+    int use_c_mode = 0;
+    char *output_name = NULL;
+    
+    while ((c = getopt(argc, argv, "Ccvb:o:")) != EOF)
+       switch (c) {
+       case 'C':
+           pcursors++;
+           break;
+       case 'c':
+           use_c_mode++;
+           break;
+       case 'v':
+           vflag++;
+           break;
+       case 'b':
+           bg_color = atoi(optarg);
+           break;
+       case 'o':
+           output_name = optarg;
+           break;
+       default:
+           errflag++;
+           break;
+       }
+
+    if (pcursors && !errflag) {
+       if (output_name == NULL)
+           output_name = DEFAULT_CURSOR_NAME;
+       printCursors(output_name, bg_color, use_c_mode);
+       exit(0);
+    }
+    
+    if (errflag || (optind != argc-1))
+       usage();
+    
+    file = argv[optind];
+    if (strcmp(file + strlen(file) - strlen(".tiff"), ".tiff") != 0)
+       sprintf(buf,"%s.tiff",file);
+    else
+       sprintf(buf,"%s",file);
+    bitmap = [[BooterBitmap alloc] initFromTiffFile:buf];
+    if (bitmap == nil) {
+       fprintf(stderr, "Could not create booter bitmap object\n");
+       exit(1);
+    }
+    [bitmap setBgColor:bg_color];
+
+    buf[strlen(buf) - strlen(".tiff")] = '\0';
+    if (output_name == NULL)
+       output_name = buf;
+
+    ret = use_c_mode ?
+       [bitmap writeAsCFile: output_name] :
+       [bitmap writeAsBinaryFile: output_name];
+    
+    [bitmap free];
+    exit(ret);
+}
+    
\ No newline at end of file
diff --git a/i386/util/font.h b/i386/util/font.h
new file mode 100644 (file)
index 0000000..745ac68
--- /dev/null
@@ -0,0 +1,69 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
+ * Reserved.  This file contains Original Code and/or Modifications of
+ * Original Code as defined in and that are subject to the Apple Public
+ * Source License Version 1.1 (the "License").  You may not use this file
+ * except in compliance with the License.  Please obtain a copy of the
+ * License at http://www.apple.com/publicsource and read it before using
+ * this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * font.h -- definitions used in generating bitmap fonts for newblit
+ */
+
+/* Sizes of structure elements are small to save space...
+ * Watch out for fonts that exceed the limits imposed by
+ * these small elements.
+ */
+typedef struct {
+       char width;
+       char height;
+       char xoff;
+       char yoff;
+} bbox_t;
+
+typedef struct {
+       bbox_t bbx;
+       short dwidth;
+       short bitx;
+} bitmap_t;
+
+#define        FONTNAMELEN             64
+#define        ENCODEBASE              0x20
+#define        ENCODELAST              0x7E
+
+typedef struct {
+       char font[FONTNAMELEN+1];
+       unsigned short size;
+       bbox_t bbx;
+       bitmap_t bitmaps[ENCODELAST - ENCODEBASE + 1];
+       unsigned const char bits[0];
+} font_t;
+
+/*
+ * For 'c' output.
+ */
+typedef struct {
+       char *font;
+       unsigned short size;
+       bbox_t bbx;
+       bitmap_t bitmaps[ENCODELAST - ENCODEBASE + 1];
+       unsigned const char *bits;
+} font_c_t;
+
+extern const font_t *fontp;
\ No newline at end of file
diff --git a/i386/util/hdot.h b/i386/util/hdot.h
new file mode 100644 (file)
index 0000000..6cc8999
--- /dev/null
@@ -0,0 +1,27 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
+ * Reserved.  This file contains Original Code and/or Modifications of
+ * Original Code as defined in and that are subject to the Apple Public
+ * Source License Version 1.1 (the "License").  You may not use this file
+ * except in compliance with the License.  Please obtain a copy of the
+ * License at http://www.apple.com/publicsource and read it before using
+ * this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+extern struct bitmap hdot_bitmap;
+
+#define hdot_bitmap_WIDTH      6
+#define hdot_bitmap_HEIGHT     6
diff --git a/i386/util/hdot_bitmap.h b/i386/util/hdot_bitmap.h
new file mode 100644 (file)
index 0000000..49107db
--- /dev/null
@@ -0,0 +1,50 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
+ * Reserved.  This file contains Original Code and/or Modifications of
+ * Original Code as defined in and that are subject to the Apple Public
+ * Source License Version 1.1 (the "License").  You may not use this file
+ * except in compliance with the License.  Please obtain a copy of the
+ * License at http://www.apple.com/publicsource and read it before using
+ * this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+unsigned char hdot_bitmap_plane_0[] =
+ {
+// plane 0
+0xe4, 0xd4, 0xa8, 0xd4, 0x2c, 0xdc, };
+unsigned char hdot_bitmap_plane_1[] =
+ {
+// plane 1
+0x8c, 0x00, 0x00, 0x00, 0x80, 0x84, };
+struct bitmap hdot_bitmap = {
+0,     // packed
+6,     // bytes_per_plane
+1,     // bytes_per_row
+1,     // bits per pixel
+6,     // width
+6,     // height
+{
+  6,
+  6,
+},
+{
+  hdot_bitmap_plane_0,
+  hdot_bitmap_plane_1
+}
+};
+
+#define hdot_bitmap_WIDTH      6
+#define hdot_bitmap_HEIGHT     6
diff --git a/i386/util/images.h b/i386/util/images.h
new file mode 100644 (file)
index 0000000..d5f307a
--- /dev/null
@@ -0,0 +1,5912 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
+ * Reserved.  This file contains Original Code and/or Modifications of
+ * Original Code as defined in and that are subject to the Apple Public
+ * Source License Version 1.1 (the "License").  You may not use this file
+ * except in compliance with the License.  Please obtain a copy of the
+ * License at http://www.apple.com/publicsource and read it before using
+ * this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+#define SPIN_WIDTH 16
+
+#define BIG_WIDTH      353
+#define BIG_HEIGHT     264
+#define BIG_DY 0
+
+static char waitCursors[ 3 * SPIN_WIDTH * SPIN_WIDTH ] = {
+
+        0xf9,0xf9,0x56,0xf9,0xfa,0x2c,0x32,0x2d,0x57,0x51,0x56,0x56,0x56,0xf9,0xf9,0x56,
+        0x56,0xfa,0x56,0x56,0x2c,0x5e,0x58,0x5f,0x58,0x7d,0x52,0x57,0x56,0x56,0xf9,0xf9,
+        0xf9,0x56,0xf9,0x33,0x3a,0x34,0x5f,0x59,0x83,0x52,0x7c,0x76,0x76,0x7b,0x5d,0x56,
+        0xf9,0x56,0x0f,0x39,0x33,0x3a,0x34,0x59,0x58,0x58,0x52,0x76,0x4b,0x75,0x7b,0x56,
+        0xf9,0x0e,0x15,0x0f,0x39,0x34,0x5e,0x59,0x83,0x7c,0x7c,0x4b,0x75,0x6f,0x7b,0x56,
+        0x56,0x39,0x0e,0x14,0x0e,0x39,0x33,0x57,0x57,0x7c,0x4b,0x6f,0x4a,0x75,0x6e,0xa6,
+        0x32,0x38,0x3f,0x39,0x39,0x0e,0x5d,0x81,0x81,0x57,0x75,0x6f,0x75,0x6e,0x75,0xa6,
+        0x31,0x3e,0x38,0x3e,0x38,0x38,0x7b,0x81,0x56,0x56,0x75,0x74,0x6e,0x74,0x74,0xa5,
+        0x38,0x3f,0x63,0x63,0x69,0x62,0x81,0x7b,0x56,0x56,0xa5,0x99,0x9f,0x99,0x9f,0xa6,
+        0x31,0x69,0x62,0x68,0x62,0x8d,0x5c,0x5c,0x56,0xa5,0xc2,0xc2,0x98,0xc3,0x98,0xac,
+        0x5c,0x62,0x69,0x68,0x8c,0x62,0x86,0x7f,0x7f,0x79,0xa4,0xc2,0xc9,0x9e,0xc9,0xac,
+        0x56,0x62,0x62,0x8c,0x62,0x85,0x5b,0x7e,0x78,0x7f,0x9d,0xc8,0x9e,0xc8,0xc9,0x81,
+        0xf9,0x81,0x8c,0x62,0x8c,0x85,0x85,0x7e,0x7f,0x79,0xa3,0x9d,0xa4,0xc8,0xac,0x56,
+        0xf9,0xf9,0x80,0x86,0x5b,0x85,0x5a,0x7e,0x54,0x7f,0x79,0xa3,0x9d,0xd0,0x56,0xf9,
+        0xf9,0xf9,0x56,0x81,0x86,0x5b,0x85,0x7e,0x7e,0x78,0xa3,0xa4,0xac,0x56,0xfa,0xf9,
+        0xf9,0x56,0xf9,0xf9,0x56,0xab,0xa5,0x80,0x80,0xab,0xac,0x81,0x56,0xf9,0x56,0xf9,
+
+        0xf9,0xf9,0x56,0xf9,0xfa,0xf9,0x2c,0x2c,0x2d,0x2c,0x56,0x56,0x56,0xf9,0xf9,0x56,
+        0x56,0xfa,0x56,0x56,0x08,0x09,0x09,0x2d,0x2d,0x58,0x52,0x7b,0x56,0x56,0xf9,0xf9,
+        0xf9,0x56,0x07,0x33,0x33,0x09,0x09,0x2d,0x2e,0x52,0x7d,0x7d,0xa7,0x7b,0x5d,0x56,
+        0xf9,0x56,0x39,0x3a,0x33,0x0f,0x08,0x09,0x2d,0x58,0x76,0xa7,0xa1,0xa0,0x81,0x56,
+        0xf9,0x39,0x64,0x3a,0x3a,0x33,0x0f,0x09,0x58,0x7c,0xa7,0xa1,0xa1,0xa0,0xa6,0x7b,
+        0x56,0x6a,0x64,0x64,0x3a,0x3a,0x0f,0x2c,0x2d,0x7d,0xa1,0xa0,0x9a,0xa0,0x99,0xac,
+        0x32,0x64,0x6a,0x6a,0x6a,0x40,0x5d,0x81,0x81,0x7b,0xa1,0x9a,0xa0,0x75,0x9f,0xa6,
+        0x32,0x69,0x63,0x6a,0x64,0x6a,0x7b,0x81,0x56,0x56,0x75,0x74,0x6e,0x74,0x6e,0x9f,
+        0x5c,0x63,0x69,0x63,0x69,0x62,0x81,0x7b,0x56,0x56,0x74,0x6d,0x74,0x6e,0x74,0x9f,
+        0x31,0x62,0x3e,0x3e,0x37,0x3d,0x55,0x5c,0x50,0xa5,0x73,0x73,0x6d,0x73,0x49,0xa5,
+        0x5c,0x37,0x3e,0x37,0x3d,0x30,0x5b,0x85,0xd4,0xa4,0xa4,0x97,0x97,0x6d,0x73,0xac,
+        0x56,0x37,0x36,0x37,0x30,0x36,0x5a,0x85,0xaa,0xce,0x9d,0x9e,0x73,0x73,0x74,0x81,
+        0xf9,0x81,0x37,0x30,0x36,0x5b,0x85,0xa9,0xd4,0xce,0xce,0x9e,0xa4,0x9e,0xac,0x56,
+        0xf9,0xf9,0x5c,0x36,0x30,0x61,0x7f,0xa9,0xa9,0xce,0xc8,0xa4,0x9e,0xd0,0x56,0xf9,
+        0xf9,0xf9,0x56,0x81,0x86,0x5b,0x85,0xaa,0xd4,0xaa,0xcf,0xcf,0xd6,0x56,0xfa,0xf9,
+        0xf9,0x56,0xf9,0xf9,0x7b,0xac,0xab,0xab,0xab,0xd0,0xac,0x81,0x56,0xf9,0x56,0xf9,
+
+        0xf9,0xf9,0x56,0xf9,0xfa,0x2c,0x2c,0x2c,0x2c,0x2c,0x56,0x56,0x56,0xf9,0xf9,0x56,
+        0x56,0xfa,0x56,0x56,0x33,0x5e,0x34,0x2d,0x27,0x2d,0x26,0x50,0x56,0x56,0xf9,0xf9,
+        0xf9,0x56,0x32,0x65,0x65,0x58,0x5e,0x2e,0x2d,0x27,0x2d,0x51,0x76,0x7b,0x5d,0x56,
+        0xf9,0x56,0x5e,0x65,0x5f,0x5e,0x34,0x34,0x27,0x27,0x27,0x76,0x75,0x76,0x81,0x56,
+        0x56,0x39,0x6a,0x64,0x6b,0x65,0x5f,0x34,0x2d,0x27,0x51,0x75,0xa0,0xa0,0xa6,0x56,
+        0xf9,0x64,0x39,0x64,0x64,0x65,0x5e,0x33,0x26,0x51,0x75,0x9a,0x9a,0xc4,0xa0,0xac,
+        0x32,0x39,0x3f,0x3f,0x64,0x40,0x5d,0x81,0x81,0x57,0xa0,0xa0,0xca,0xa0,0xca,0xa6,
+        0xf7,0x38,0x14,0x38,0x38,0x38,0x7b,0x81,0x56,0x56,0xa0,0xc4,0xc3,0xc4,0x9f,0xca,
+        0x32,0x13,0x14,0x13,0x13,0x13,0x81,0x7b,0x56,0x56,0x9f,0x9f,0x9f,0x9f,0xc3,0xca,
+        0xf7,0x13,0x0d,0x13,0x13,0x3d,0x5c,0x5c,0x50,0x80,0x6d,0x97,0x98,0x9e,0x98,0xac,
+        0x81,0x13,0x3d,0x37,0x61,0x61,0x8c,0xaa,0xaa,0x72,0x73,0x73,0x97,0x73,0x9e,0xac,
+        0x56,0x37,0x37,0x61,0x61,0x86,0xaa,0xaa,0xa3,0x79,0x72,0x72,0x6c,0x73,0x9e,0x81,
+        0xf9,0x5d,0x62,0x61,0x8c,0x8c,0xb1,0xaa,0xaa,0x7f,0x79,0x4e,0x73,0x73,0xac,0x56,
+        0xf9,0xf9,0x80,0x86,0x86,0xb0,0xaa,0xaa,0xa3,0xa3,0x78,0x78,0x72,0xac,0x56,0xf9,
+        0xf9,0xf9,0x56,0x81,0xb1,0xaa,0xb0,0xaa,0xaa,0x7f,0xa3,0xa4,0xac,0x56,0xfa,0xf9,
+        0xf9,0x56,0xf9,0xf9,0x56,0x87,0xac,0xab,0xab,0xac,0xa5,0x81,0x56,0xf9,0x56,0xf9
+};
+
+static unsigned char bigImage[ BIG_WIDTH * BIG_HEIGHT ] = {
+
+0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xff,0xff,0xff,0xff,0xff,0xff,
+       0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+       0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+       0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+       0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+       0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+       0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+       0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+       0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+       0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+       0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+       0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+       0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+       0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+       0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+       0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+       0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+       0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+       0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+       0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+       0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+       0xff,0xff,0xff,0xff,0xff,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
+       0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xff,0x2b,0xf6,0x2b,0x2b,
+       0x2b,0xf6,0x2b,0x2b,0xf6,0x2b,0x2b,0xf6,0x2b,0xf6,0xf6,0xf6,0x2b,0xf6,0x2b,0xf6,
+       0x2b,0xf6,0x2b,0x2b,0x2b,0x2b,0xf6,0xf6,0x2b,0x2b,0x2b,0xf6,0x2b,0x2b,0x2b,0x2b,
+       0x2b,0x2b,0x2b,0x2b,0xf6,0x2b,0x2b,0xf6,0x2b,0xf6,0x2b,0xf6,0x2b,0x2b,0xf6,0xf6,
+       0x2b,0x2b,0xf6,0x2b,0x2b,0xf6,0xf6,0x2b,0x2b,0xf6,0x2b,0x2b,0x2b,0xf6,0x2b,0x2b,
+       0xf6,0x2b,0x2b,0xf6,0x2b,0xf6,0xf6,0xf6,0x2b,0xf6,0x2b,0xf6,0x2b,0xf6,0x2b,0x2b,
+       0x2b,0x2b,0xf6,0xf6,0x2b,0x2b,0x2b,0x2b,0xf6,0x2b,0x2b,0xf6,0x2b,0xf6,0x2b,0x2b,
+       0xf6,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,
+       0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0xf7,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,
+       0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0xf6,0x2b,0xf6,0x2b,0xf6,0x2b,
+       0x2b,0xf6,0x2b,0xf6,0xf6,0x2b,0xf6,0xf6,0x2b,0x2b,0xf6,0x2b,0x2b,0x2b,0x2b,0x2b,
+       0xf6,0xf6,0x2b,0x2b,0x2b,0x2b,0xf6,0x2b,0x2b,0xf6,0x2b,0xf6,0x2b,0xf6,0x2b,0x2b,
+       0xf6,0x2b,0xf6,0x2b,0x2b,0x2b,0xf6,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0xf6,0x2b,0x2b,
+       0xf6,0x2b,0xf6,0x2b,0xf6,0x2b,0x2b,0xf6,0xf6,0x2b,0x2b,0xf6,0x2b,0x2b,0xf6,0xf6,
+       0x2b,0x2b,0xf6,0x2b,0x2b,0x2b,0xf6,0x2b,0x2b,0xf6,0x2b,0x2b,0xf6,0x2b,0xf6,0xf6,
+       0xf6,0x2b,0xf6,0x2b,0xf6,0x2b,0xf6,0x2b,0x2b,0x2b,0x2b,0xf6,0xf6,0x2b,0x2b,0x2b,
+       0x2b,0xf6,0x2b,0x2b,0xf6,0x2b,0xf6,0x2b,0xf6,0x2b,0x2b,0xf6,0xf6,0x2b,0x2b,0x2b,
+       0x2b,0xf6,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0xf6,0x2b,0x2b,0xf6,0x2b,0x2b,0xf6,0xf6,
+       0x2b,0x2b,0xf6,0xf6,0x2b,0x2b,0xf6,0x2b,0x2b,0xf6,0x2b,0x2b,0xf6,0x2b,0x2b,0x2b,
+       0xf6,0x2b,0x2b,0xf6,0x2b,0x2b,0xf6,0x2b,0xf6,0xf6,0x2b,0xf6,0xf6,0x2b,0x2b,0xf6,
+       0x2b,0x2b,0x2b,0x2b,0x2b,0xf6,0xf6,0x2b,0x2b,0x2b,0x2b,0xf6,0x2b,0x2b,0xf6,0x2b,
+       0xf6,0x2b,0xf6,0x2b,0xf9,0xff,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
+       0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xff,0x2b,0x56,0xf9,
+       0x56,0x56,0xf9,0x56,0x56,0x56,0x56,0xf9,0x56,0x56,0xfa,0xf9,0xf9,0x56,0xf9,0xf9,
+       0x56,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,
+       0x56,0x56,0xf9,0xf9,0x56,0xf9,0xfa,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,
+       0x56,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xf9,0x56,
+       0x56,0x56,0x56,0xf9,0x56,0x56,0xfa,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,
+       0xf9,0x56,0x56,0xf9,0xfa,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,
+       0xf9,0xfa,0xfa,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0x81,0xfa,0xfa,
+       0xfa,0x81,0xf9,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xf9,0xf9,0xf9,0xfa,0xfa,0xf9,0xf9,
+       0xfa,0xf9,0xf9,0xfa,0x56,0xf9,0xfa,0xf9,0x56,0xf9,0x56,0x56,0x56,0x56,0x56,0x56,
+       0x56,0xf9,0x56,0x56,0xfa,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,0x56,0xf9,0xf9,0x56,
+       0x56,0xf9,0xfa,0xf9,0xf9,0xf9,0x56,0x56,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,
+       0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xfa,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xfa,
+       0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0x56,
+       0xf9,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xf9,0x56,0x56,0x56,0x56,0xf9,0x56,0x56,0xfa,
+       0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xfa,0xf9,0xf9,
+       0xf9,0x56,0x56,0x56,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0xf9,
+       0xf9,0x56,0xf9,0xfa,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,0x56,0xf9,0xf9,
+       0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0x56,
+       0x56,0xf9,0x56,0x56,0x56,0x56,0xf9,0x56,0x56,0xfa,0xf9,0xf9,0x56,0xf9,0xf9,0x56,
+       0x56,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xfa,0xf9,0xf9,0xf9,0x56,0x56,0x56,0x56,0xf9,
+       0xf9,0xf9,0xf9,0xf9,0xf9,0xfc,0xff,0xff,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
+       0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xff,0xf6,0x56,
+       0xf9,0x56,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0x56,0x56,0x56,0xfa,
+       0xf9,0x56,0x56,0xf9,0xfa,0x56,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0x56,
+       0xfa,0x56,0x56,0xfa,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,
+       0x56,0xfa,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0x56,0xf9,0xf9,
+       0xfa,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0x56,0x56,0x56,0xfa,0xf9,0x56,0x56,0xf9,
+       0xfa,0x56,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,
+       0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0xfa,0xf9,0xf9,0x81,0xfa,0xf9,0x81,0xf9,
+       0xfa,0xfa,0x81,0xf9,0xfa,0xfa,0xfa,0xf9,0xf9,0xfa,0xfa,0xf9,0xfa,0xfa,0xfa,0xf9,
+       0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0xfa,0x56,0x56,0x56,0xf8,0x56,0xf9,0xf9,0xf9,
+       0xf9,0xfa,0xf9,0x56,0x56,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xfa,0x56,
+       0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0x56,0xf9,0x56,0x56,0xf9,0x56,
+       0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xf9,0x56,0x56,0xfa,0x56,0x56,0xf9,
+       0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xfa,0xf9,0xf9,0xf9,0x56,0xf9,
+       0xf9,0xf9,0xf9,0x56,0x56,0xf9,0x56,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0x56,0x56,
+       0xf9,0x56,0x56,0x56,0xfa,0xf9,0x56,0x56,0xf9,0xfa,0x56,0xf9,0x56,0xf9,0x56,0xf9,
+       0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,
+       0xf9,0xf9,0x56,0x56,0xf9,0x56,0x56,0xfa,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xfa,
+       0x56,0x56,0xf9,0xf9,0x56,0xfa,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xfa,0x56,0x56,0xf9,
+       0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0x56,0x56,0xf9,0x56,0x56,0xf9,0xf9,0xf9,
+       0x56,0xf9,0xf9,0xfa,0x56,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0x56,
+       0xf9,0x56,0x56,0xf9,0x56,0xf9,0xfc,0xff,0xff,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
+       0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xff,0x2b,
+       0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0x56,0xf9,0xf9,
+       0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,0x56,0x56,0xf9,0x56,0x56,0x56,0xf9,0x56,
+       0x56,0xf9,0x56,0x56,0xfa,0x56,0x56,0xfa,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,
+       0xf9,0xf9,0x56,0x56,0x56,0xf9,0xf9,0x56,0xf9,0x56,0xfa,0x56,0x56,0xf9,0xf9,0x56,
+       0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,
+       0xf9,0xf9,0x56,0x56,0x56,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,
+       0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0xfa,0x81,0xf9,0xfa,0x81,
+       0xfa,0xf9,0x81,0xfa,0xf9,0xfa,0xfa,0xfa,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,
+       0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,
+       0x56,0xf9,0xf9,0x56,0x56,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xfa,0x56,
+       0x56,0x56,0x56,0x56,0xf9,0x56,0x56,0x56,0x56,0xf9,0xfa,0x56,0xf9,0x56,0x56,0xf9,
+       0x56,0xf9,0x56,0xf9,0x56,0xf9,0x56,0xf9,0x56,0x56,0xfa,0x56,0x56,0xfa,0x56,0x56,
+       0xfa,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xf9,0xf9,
+       0x56,0xf9,0x56,0xfa,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,
+       0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,0x56,0x56,0xf9,
+       0x56,0x56,0x56,0x56,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xf9,0x56,0xf9,0x56,0x56,0x56,
+       0xf9,0x56,0x56,0x56,0x56,0xfa,0x56,0x56,0xf9,0x56,0x56,0xfa,0xf9,0x56,0xf9,0xf9,
+       0xf9,0x56,0x56,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,
+       0xfa,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0x56,0x56,0xf9,0xf9,0x56,0xf9,
+       0xf9,0x56,0x56,0xfa,0x56,0x56,0x56,0x56,0x56,0xf9,0x56,0x56,0x56,0x56,0xf9,0xfa,
+       0x56,0xf9,0x56,0x56,0xf9,0x56,0xf9,0xfc,0xff,0xff,0xfb,0x80,0x80,0x80,0x80,0x80,
+       0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xff,
+       0xf6,0x56,0xfa,0x56,0xf9,0x56,0x56,0x56,0x56,0x56,0x56,0x56,0xf9,0xf9,0xfa,0xf9,
+       0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,0x56,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0x56,0xf9,
+       0xf9,0xf9,0xfa,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xfa,0x56,0x56,0x56,
+       0xf9,0x56,0x56,0x56,0x56,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0x56,0x56,0xfa,0x56,
+       0xf9,0x56,0x56,0x56,0x56,0x56,0x56,0x56,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0x56,0xf9,
+       0xf9,0xf9,0x56,0x56,0xf9,0xfa,0xfa,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0xfa,
+       0xf9,0xf9,0xfa,0xf9,0xf9,0xfa,0xfa,0xfa,0xfa,0xfa,0x81,0xfa,0xfa,0x81,0xf9,0xfa,
+       0xfa,0xfa,0xf9,0xfa,0xfa,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,
+       0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0x56,0x56,0xf8,0x56,0xf9,0x56,0x56,0x56,
+       0x56,0x56,0x56,0x56,0x56,0x56,0xfa,0xf9,0xf9,0xfa,0xf9,0xf9,0x56,0xf9,0xf9,0x56,
+       0x56,0x56,0xf9,0xf9,0xfa,0xf9,0xfa,0xf9,0x56,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xf9,
+       0xf9,0x56,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,
+       0x56,0xf9,0xf9,0x56,0x56,0xfa,0x56,0x56,0x56,0xf9,0x56,0x56,0x56,0x56,0x56,0xf9,
+       0xf9,0xf9,0x56,0xf9,0x56,0x56,0x56,0xfa,0x56,0xf9,0x56,0x56,0x56,0x56,0x56,0x56,
+       0x56,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,0x56,0xf9,0xf9,0xf9,
+       0xfa,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,
+       0x56,0xf9,0x56,0xfa,0xf9,0xf9,0xf9,0x56,0xf9,0xfa,0x56,0xf9,0xf9,0xf9,0x56,0x56,
+       0xfa,0x56,0x56,0x56,0xf9,0x56,0x56,0x56,0x56,0x56,0xf9,0xf9,0x56,0x56,0xf9,0x56,
+       0x56,0xf9,0x56,0xf9,0xf9,0x56,0x56,0x56,0x56,0x56,0x56,0xfa,0xf9,0xf9,0xfa,0xf9,
+       0xf9,0x56,0xf9,0xf9,0x56,0x56,0x56,0xf9,0xf9,0xfa,0xf9,0xfa,0xf9,0x56,0xf9,0x56,
+       0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xfc,0xff,0xff,0x80,0x80,0x80,0xfb,0x80,
+       0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
+       0xff,0x2b,0x56,0x56,0xf9,0x56,0xf9,0xf9,0xfa,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,
+       0xf9,0xfa,0x56,0x56,0x56,0x56,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xfa,
+       0xfa,0x56,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xfa,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,
+       0xf9,0x56,0x56,0xfa,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0x56,
+       0xf9,0x56,0xf9,0xf9,0xfa,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0x56,0x56,
+       0x56,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,
+       0xfa,0xfa,0xfa,0xfa,0xf9,0xf9,0xfa,0xfa,0xfa,0xf9,0x81,0xfa,0xfa,0xfa,0x81,0xfa,
+       0xf9,0xf9,0xfa,0xfa,0xfa,0xf9,0xfa,0xfa,0xfa,0xfa,0xfa,0xf9,0xf9,0xf9,0xfa,0xf9,
+       0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,0x56,0x56,0xf9,0xf9,0x56,0x56,0x56,0x56,0x56,
+       0xf9,0xfa,0xf9,0xfa,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0x56,0xfa,0x56,0x56,0x56,0xf9,
+       0xf9,0x56,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xf9,0xf9,
+       0xf9,0xf9,0x56,0x56,0x56,0xf9,0x56,0x56,0xf9,0xfa,0x56,0x56,0xfa,0xf9,0x56,0x56,
+       0xf9,0xfa,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xfa,0xf9,0xf9,0xf9,
+       0x56,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0x56,0xf9,0xf9,0xfa,0xf9,0xfa,
+       0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0x56,0x56,0x56,0x56,0xf9,0x56,0x56,0xf9,0xf9,
+       0xf9,0x56,0x56,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0x56,
+       0xf9,0x56,0x56,0xfa,0xf9,0x56,0x56,0xfa,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0x56,0xf9,
+       0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xfa,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xfa,0xf9,
+       0xf9,0x56,0xf9,0x56,0x56,0x56,0xfa,0xf9,0xfa,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0x56,
+       0xfa,0x56,0x56,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,
+       0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xfc,0xff,0xff,0x80,0xfb,0x80,0x80,
+       0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
+       0x80,0xff,0x2b,0xfa,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,0x56,0x56,0x56,0xf9,0xf9,
+       0x56,0x56,0xf9,0x56,0x56,0x56,0xfa,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0x56,0xf9,0xf9,
+       0xf9,0x56,0x56,0xf9,0xf9,0x56,0x56,0x56,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xf9,0x56,
+       0x56,0xf9,0x56,0x56,0xf9,0x56,0x56,0x56,0x56,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0xfa,
+       0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,0x56,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,
+       0x56,0xf9,0xfa,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xfa,0xf9,0xf9,
+       0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0x81,0xfa,0xfa,0xfa,0xfa,0x81,0xfa,0xf9,0xf9,0xfa,
+       0xf9,0xf9,0xf9,0xfa,0xfa,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0xfa,0xf9,0x56,0xfa,
+       0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,
+       0x56,0xf9,0xf9,0x56,0x56,0x56,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,
+       0xf9,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xfa,
+       0xf9,0x56,0xf9,0xf9,0xfa,0xf9,0xf9,0x56,0xf9,0xfa,0x56,0x56,0xf9,0xf9,0x56,0x56,
+       0x56,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xf9,0x56,0x56,0xf9,0x56,0x56,0xf9,0x56,0x56,
+       0x56,0x56,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,
+       0x56,0x56,0x56,0xf9,0xf9,0x56,0x56,0xf9,0x56,0x56,0x56,0xfa,0xf9,0xf9,0xf9,0x56,
+       0x56,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,
+       0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,0x56,0xf9,0xf9,0x56,0xf9,
+       0x56,0x56,0xf9,0x56,0x56,0xf9,0x56,0x56,0xf9,0x56,0x56,0x56,0x56,0xfa,0xf9,0xf9,
+       0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0x56,0x56,0x56,0xf9,0xf9,0x56,
+       0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0x56,0xf9,0x56,0xf9,
+       0xf9,0x56,0xf9,0xf9,0xfa,0xf9,0x56,0xf9,0xf9,0xfa,0xfc,0xff,0xff,0xaa,0x80,0x80,
+       0xfb,0x80,0xfb,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
+       0x80,0x80,0xff,0xf6,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,0x56,0x56,0xf9,0xf9,0x56,
+       0x56,0x56,0x56,0xfa,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,
+       0x56,0xfa,0x56,0x56,0xf9,0xf9,0x56,0xfa,0xf9,0xf9,0x56,0x56,0x56,0x56,0xf9,0xf9,
+       0xf9,0xf9,0xfa,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0x56,0x56,0xf9,0xf9,0x56,
+       0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xfa,
+       0xf9,0xf9,0xf9,0xfa,0xf9,0xfa,0xfa,0xf9,0xf9,0xfa,0xf9,0xfa,0xf9,0xf9,0xfa,0xfa,
+       0xfa,0xfa,0xfa,0xf9,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0x81,0xfa,0xfa,0xf9,0xf9,0xfa,
+       0xfa,0xf9,0xfa,0xfa,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0xfa,0xf9,0xf9,
+       0xfa,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xf9,0x56,0x56,0xf9,0x56,0x56,0xf9,0xf9,
+       0x56,0xf9,0xf9,0x56,0x56,0x56,0xf9,0xf9,0x56,0xf9,0x56,0x56,0x56,0xfa,0x56,0x56,
+       0xf9,0xfa,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,
+       0x56,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xfa,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,
+       0xf9,0xf9,0xf9,0x56,0x56,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xfa,0x56,0xf9,0xf9,0xf9,
+       0xf9,0xf9,0xf9,0xfa,0x56,0x56,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,
+       0x56,0x56,0xf9,0xf9,0x56,0x56,0x56,0x56,0xfa,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,
+       0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0x56,0x56,0x56,0xf9,0x56,0xf9,
+       0xf9,0xf9,0xf9,0xfa,0xf9,0xfa,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,
+       0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,
+       0xfa,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0x56,
+       0x56,0x56,0xfa,0x56,0x56,0xf9,0xfa,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,
+       0x56,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xfc,0xff,0xff,0x81,0xfb,
+       0xaa,0x80,0x80,0x80,0x80,0xfb,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
+       0x80,0x80,0x80,0xff,0xf6,0xf9,0xf9,0x56,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,
+       0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xf9,0x56,0xf9,0x56,0x56,0xf9,0xf9,0x56,
+       0x56,0x56,0x56,0x56,0xf9,0xfa,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,
+       0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xfa,0x56,0xf9,0x56,0x56,0xf9,0x56,0x56,0xfa,0x56,
+       0x56,0xf9,0xf9,0x56,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xfa,0xfa,0xf9,0xf9,0xfa,0xfa,
+       0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0xfa,0xfa,0xfa,
+       0xfa,0xfa,0xf9,0xf9,0xfa,0x81,0xf9,0xfa,0xfa,0xfa,0xfa,0xf9,0xfa,0xfa,0xf9,0xfa,
+       0xfa,0xf9,0xfa,0xfa,0xf9,0xf9,0xf9,0xfa,0xfa,0xf9,0xfa,0xfa,0xf9,0xfa,0xf9,0x56,
+       0xfa,0xf9,0xf9,0x56,0x56,0x56,0xf9,0x56,0x56,0xf9,0x56,0x56,0xf9,0xf9,0x56,0x56,
+       0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xfa,0xf9,0x56,0xfa,0xf9,0xf9,0x56,
+       0x56,0x56,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xf9,0x56,0x56,0x56,0x56,0xf9,0xf9,0xf9,
+       0x56,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xfa,0x56,
+       0xf9,0xfa,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xfa,
+       0x56,0xf9,0x56,0x56,0xf9,0x56,0x56,0xfa,0x56,0x56,0xf9,0xf9,0x56,0x56,0x56,0xf9,
+       0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xf9,0x56,0xf9,
+       0x56,0x56,0xf9,0xf9,0x56,0x56,0x56,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,
+       0x56,0xf9,0x56,0x56,0xf9,0x56,0x56,0x56,0xf9,0xfa,0x56,0xfa,0xf9,0x56,0x56,0xf9,
+       0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xfa,0x56,0xf9,0x56,0x56,0xfa,
+       0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xfa,0xf9,
+       0x56,0xfa,0xf9,0xf9,0x56,0x56,0x56,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xf9,0x56,0x56,
+       0x56,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xfc,0xff,0xff,0xaa,
+       0xfb,0x80,0xfb,0x80,0xfb,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
+       0x80,0x80,0x80,0x80,0xff,0xf6,0xf9,0xfa,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,
+       0xf9,0x56,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xfa,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0x56,
+       0x56,0x56,0xf9,0xf9,0x56,0xfa,0x56,0x56,0xfa,0xf9,0x56,0xfa,0xf9,0xfa,0xf9,0x56,
+       0xf9,0xf9,0x56,0xfa,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xfa,0xf9,0xf9,0xfa,
+       0x56,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xfa,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0xfa,
+       0xf9,0xf9,0x56,0xfa,0xfa,0xfa,0xf9,0xf9,0xfa,0xfa,0xfa,0xfa,0xfa,0xf9,0xfa,0xfa,
+       0xfa,0x81,0xf9,0xfa,0xfa,0xfa,0x81,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,
+       0x81,0xf9,0xf9,0x81,0xf9,0xf9,0x81,0xfa,0xfa,0xfa,0xf9,0xf9,0xfa,0xf9,0xfa,0xf9,
+       0xf9,0xf9,0xf9,0x56,0x56,0x56,0x56,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xfa,0x56,0x56,
+       0xf9,0xfa,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xf9,0xf9,0xf9,
+       0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,
+       0x56,0x56,0x56,0x56,0xfa,0x56,0x56,0xf9,0xf9,0x56,0x56,0x56,0xf9,0xf9,0xfa,0x56,
+       0x56,0xfa,0x56,0x56,0xfa,0xf9,0xfa,0xf9,0x56,0xf9,0xf9,0x56,0xfa,0xf9,0x56,0xf9,
+       0xf9,0xf9,0xf9,0x56,0x56,0xfa,0xf9,0xf9,0xfa,0x56,0x56,0xf9,0xfa,0x56,0x56,0xf9,
+       0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xfa,0xf9,0x56,
+       0xf9,0xf9,0x56,0xf9,0x56,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0x56,0xfa,
+       0x56,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xf9,0x56,0xfa,0x56,0x56,0xf9,0xf9,0x56,0xfa,
+       0xf9,0xfa,0xf9,0x56,0xf9,0xf9,0x56,0xfa,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0x56,
+       0xf9,0xf9,0xfa,0x56,0x56,0xf9,0xfa,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,
+       0x56,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0x56,
+       0x56,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0x56,0x56,0xfa,0x56,0x56,0xf9,0xfc,0xff,0xff,
+       0xfb,0x80,0xfb,0xaa,0xfb,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
+       0x80,0x80,0x80,0x80,0x80,0xff,0x2b,0xfa,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0x56,0xf9,
+       0x56,0xf9,0x56,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,
+       0xf9,0xf9,0xf9,0xfa,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,
+       0x56,0xf9,0xfa,0x56,0xf9,0x56,0x56,0xf9,0x56,0x56,0xf9,0x56,0x56,0xf9,0x56,0xf9,
+       0x56,0x56,0x56,0xfa,0xf9,0x56,0x56,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,
+       0xf9,0xfa,0xf9,0xf9,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0x81,
+       0xfa,0x81,0xfa,0xf9,0xfa,0xfa,0xfa,0xfa,0xf9,0xf9,0xfa,0xfa,0xf9,0xfa,0xfa,0xf9,
+       0xfa,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0xfa,0xfa,0xf9,0xf9,0xf9,0xfa,0xfa,0x56,0xf9,
+       0xf9,0x56,0x56,0x56,0x56,0x56,0x56,0x56,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0x56,0x56,
+       0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0x56,0x56,0x56,0xf9,
+       0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,
+       0xf9,0x56,0xf9,0xf9,0xfa,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0x56,
+       0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0xfa,0x56,0xf9,0x56,0x56,
+       0xf9,0x56,0x56,0xf9,0x56,0x56,0xf9,0x56,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0x56,0x56,
+       0xf9,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0x56,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,
+       0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,
+       0xfa,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xfa,0x56,0x56,
+       0xfa,0x56,0xf9,0x56,0x56,0xfa,0xf9,0x56,0xf9,0x56,0x56,0xf9,0x56,0x56,0xf9,0xf9,
+       0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xfa,0x56,0x56,0xf9,0x56,
+       0xf9,0x56,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,
+       0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xfa,0xf9,0x56,0x56,0xf9,0xfc,0xff,
+       0xff,0xfb,0xaa,0xfb,0x80,0x80,0xaa,0x81,0x80,0xfb,0x80,0x80,0x80,0x80,0x80,0x80,
+       0x80,0x80,0x80,0x80,0x80,0x80,0xff,0x2b,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0x56,
+       0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xf9,0x56,
+       0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xfa,0x56,0x56,0x56,0x56,0x56,0xf9,0x56,0xf9,0x56,
+       0xf9,0x56,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xfa,0xf9,
+       0x56,0x56,0x56,0xfa,0xf9,0x56,0x56,0xf9,0xfa,0xf9,0xf9,0xf9,0xfa,0xfa,0xfa,0xf9,
+       0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,
+       0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0xfa,
+       0xfa,0xfa,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,
+       0xf9,0x56,0x56,0xf9,0x56,0x56,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,
+       0x56,0xf9,0xfa,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,
+       0x56,0xf9,0x56,0xf9,0xf9,0x56,0x56,0x56,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,
+       0xf9,0xf9,0x56,0xfa,0xf9,0x56,0x56,0x56,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xfa,
+       0x56,0x56,0x56,0x56,0x56,0xf9,0x56,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0x56,
+       0xf9,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xfa,0xf9,0x56,0x56,0x56,0xf9,0xfa,0x56,0x56,
+       0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,
+       0x56,0x56,0x56,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,
+       0x56,0x56,0x56,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xfa,0x56,0x56,0xf9,0x56,0x56,
+       0x56,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0xf9,
+       0x56,0x56,0xfa,0xf9,0x56,0x56,0xf9,0xfa,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,
+       0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0x56,0x56,0x56,0x56,0xf9,0x56,
+       0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xfa,0xf9,0x56,0x56,0x56,0x56,0xf9,0xfc,
+       0xff,0xff,0xfb,0xfb,0xaa,0xfb,0xfb,0x80,0xfb,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
+       0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xff,0x2b,0xf9,0x56,0xfa,0xfa,0xf9,0x56,0xf9,
+       0xf9,0x56,0xfa,0x56,0xf9,0x56,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0x56,0x56,0x56,0xf9,
+       0x56,0x56,0xf9,0x56,0x56,0xf9,0xf9,0x56,0x56,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,
+       0xf9,0x56,0x56,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xfa,0x56,0xf9,0xf9,
+       0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xfa,0xfa,0xf9,0xf9,0xfa,0xf9,0xf9,0xfa,0xfa,
+       0xfa,0xfa,0xfa,0xfa,0x81,0xfa,0xfa,0x81,0xf9,0xf9,0xf9,0xfa,0xfa,0xf9,0xfa,0xf9,
+       0xf9,0xfa,0xfa,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0xfa,0xfa,0xfa,0xfa,0xf9,0xf9,0xf9,
+       0xfa,0xfa,0xf9,0xf9,0xf9,0xfa,0xf9,0xfa,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,
+       0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xfa,0x56,0x56,0xfa,0x56,0x56,
+       0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xfa,0xf9,0x56,0xf9,0xf9,0x56,0xfa,0xf9,0x56,0xf9,
+       0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xf9,0x56,0x56,0xf9,0x56,0x56,0xf9,
+       0x56,0xf9,0x56,0xf9,0x56,0x56,0x56,0xfa,0xf9,0xfa,0xf9,0x56,0x56,0x56,0xfa,0xf9,
+       0x56,0x56,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,0x56,0x56,0xf9,0xf9,
+       0xf9,0xf9,0xf9,0x56,0xf9,0xfa,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0x56,
+       0xfa,0xfa,0xf9,0x56,0xf9,0xf9,0x56,0xfa,0x56,0xf9,0x56,0xf9,0x56,0xf9,0x56,0xf9,
+       0xf9,0x56,0x56,0x56,0xf9,0x56,0x56,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,
+       0x56,0x56,0xfa,0xf9,0xfa,0xf9,0x56,0x56,0x56,0xfa,0xf9,0x56,0x56,0x56,0x56,0xf9,
+       0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,
+       0xfa,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xfa,0xf9,0xf9,0x56,0xf9,0x56,
+       0x56,0xfa,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xf9,0x56,
+       0x56,0xf9,0x56,0x56,0xf9,0x56,0xf9,0x56,0xf9,0x56,0x56,0x56,0xfa,0xf9,0xfa,0xf9,
+       0xfc,0xff,0xff,0xab,0xab,0xfb,0xfb,0xaa,0xfb,0x80,0xaa,0x80,0xfb,0x80,0x80,0x80,
+       0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xff,0x2b,0x56,0xf9,0x56,0x56,0x56,0x56,
+       0xfa,0x56,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xf9,0xfa,0xf9,0x56,0xf9,0x56,0xf9,0xf9,
+       0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xfa,0xf9,0xf9,0x56,0x56,0x56,0xf9,0xf9,0xf9,0xf9,
+       0xf9,0xf9,0x56,0x56,0xf9,0x56,0xfa,0x56,0xf9,0xfa,0x56,0x56,0xfa,0xf9,0x56,0x56,
+       0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xfa,0xfa,0x81,
+       0xfa,0xfa,0xf9,0xf9,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0x81,0xfa,0xfa,0xfa,0xfa,
+       0xf9,0xfa,0xfa,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0x81,0xf9,0xfa,0xf9,0xfa,0xfa,
+       0xfa,0xfa,0xf9,0xfa,0xf9,0xf9,0xf9,0xfa,0xfa,0xfa,0xfa,0xfa,0xf9,0xf9,0xf9,0xf9,
+       0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,
+       0xf9,0xf9,0xf9,0xfa,0x56,0xf9,0x56,0xf9,0x56,0x56,0xfa,0x56,0xf9,0xf9,0x56,0x56,
+       0x56,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xfa,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,
+       0xfa,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,
+       0xf9,0xf9,0x56,0x56,0x56,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0x56,0xfa,
+       0x56,0xf9,0xfa,0x56,0x56,0xfa,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0x56,
+       0xf9,0x56,0x56,0x56,0x56,0xfa,0x56,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xf9,0xfa,0xf9,
+       0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xfa,0xf9,0x56,0x56,0xf9,
+       0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,
+       0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xfa,0x56,0xf9,0xfa,0xf9,0x56,
+       0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xfa,0x56,0xf9,0x56,0xf9,0xf9,0x56,0xf9,
+       0xf9,0xf9,0xf9,0x56,0x56,0x56,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xfa,0xf9,
+       0xf9,0xf9,0xf9,0x56,0xf9,0xfa,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,
+       0xf9,0xfc,0xff,0xff,0xab,0xfb,0xfb,0xaa,0xfb,0x80,0xaa,0x81,0x80,0x80,0x80,0x80,
+       0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xff,0x2b,0x56,0xf9,0x56,0xf9,0xf9,
+       0x56,0xf9,0x56,0xf9,0x56,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0x56,0x56,0x56,0xf9,0xf9,
+       0xf9,0xf9,0x56,0xfa,0xf9,0x56,0xf9,0xf9,0x56,0x56,0x56,0x56,0xf9,0xf9,0xf9,0xf9,
+       0xf9,0xfa,0x56,0x56,0xfa,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0x56,0x56,0x56,0xf9,0xf9,
+       0xf9,0x56,0xf9,0x56,0xf9,0x56,0xf9,0x56,0xf9,0x56,0xfa,0xf9,0xf9,0xfa,0xfa,0xfa,
+       0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xf9,0xf9,0xfa,0xfa,0xfa,0xfa,0xf9,0xfa,
+       0xfa,0xf9,0xfa,0xfa,0xfa,0xf9,0xfa,0xfa,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0xfa,0xf9,
+       0xfa,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xfa,0xf9,0xfa,0xfa,0xf9,0x56,0xfa,
+       0xfa,0x56,0x56,0x56,0x56,0x56,0x56,0x56,0x56,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0x56,
+       0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,0x56,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0x56,0xf9,
+       0xf9,0xf9,0x56,0xf9,0xfa,0x56,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xfa,0xf9,0x56,
+       0xf9,0xf9,0x56,0x56,0xf9,0x56,0x56,0x56,0x56,0xf9,0x56,0x56,0xf9,0x56,0xf9,0xfa,
+       0x56,0x56,0x56,0x56,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xfa,0x56,0x56,0xfa,0xf9,0x56,
+       0xf9,0x56,0xf9,0xf9,0x56,0x56,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0x56,0xf9,
+       0x56,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0x56,0xf9,0x56,0xf9,0x56,0xf9,0xf9,
+       0x56,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xfa,0xf9,0x56,0xf9,0xfa,0x56,0xf9,0xf9,
+       0x56,0x56,0x56,0xf9,0xf9,0x56,0x56,0xf9,0x56,0xf9,0xfa,0x56,0x56,0x56,0x56,0x56,
+       0x56,0xf9,0xf9,0x56,0xf9,0xfa,0x56,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0x56,0x56,
+       0x56,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xf9,0x56,0x56,
+       0xfa,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xfa,0x56,0x56,0x56,0xf9,0xf9,0xf9,
+       0xf9,0x56,0xfa,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xf9,0x56,0x56,0x56,0x56,0xf9,0x56,
+       0x56,0xf9,0xfc,0xff,0xff,0xab,0xfb,0xaa,0xfb,0xfb,0xaa,0x81,0x80,0x80,0x80,0x80,
+       0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xff,0xf6,0x56,0x56,0xf9,0x56,
+       0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,
+       0xf9,0xf9,0xf9,0x56,0x56,0x56,0x56,0xfa,0xf9,0x56,0xf9,0x56,0xf9,0xfa,0x56,0xf9,
+       0xf9,0x56,0xf9,0x56,0x56,0x56,0x56,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,
+       0xf9,0x56,0xf9,0xf9,0x56,0x56,0x56,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xfa,0xfa,0xfa,
+       0xf9,0xfa,0xfa,0xf9,0xfa,0xf9,0x81,0xfa,0xf9,0xf9,0xfa,0xfa,0xfa,0xfa,0xf9,0xf9,
+       0xfa,0xf9,0xf9,0xfa,0xfa,0xf9,0xfa,0xf9,0xf9,0xf9,0xfa,0xf9,0xfa,0xfa,0xf9,0xfa,
+       0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xfa,0xfa,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,
+       0xf9,0x56,0x56,0x56,0x56,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0x56,
+       0xf9,0xf9,0x56,0x56,0x56,0x56,0x56,0xf9,0xf9,0x56,0xf9,0x56,0xfa,0xf9,0x56,0xf9,
+       0x56,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0x56,0x56,
+       0x56,0xfa,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0xfa,0x56,0xf9,
+       0x56,0x56,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0x56,0x56,0x56,
+       0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0x56,0x56,0x56,
+       0x56,0x56,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,
+       0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0x56,0x56,0xfa,0xf9,0x56,0xf9,
+       0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xf9,0x56,
+       0xf9,0xfa,0x56,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,
+       0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0x56,0x56,0xf9,0xf9,0x56,0xf9,
+       0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,
+       0xf9,0x56,0x56,0x56,0x56,0x56,0xfa,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,
+       0xf9,0x56,0xfa,0xfb,0xff,0xff,0xab,0xab,0xfb,0xaa,0xfb,0x80,0xfb,0x80,0xfb,0x80,
+       0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xff,0x2b,0xf9,0xf9,0xfa,
+       0xf9,0x56,0xf9,0x56,0xf9,0x56,0xf9,0x56,0x56,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,
+       0xfa,0xf9,0x56,0x56,0x56,0xf9,0xf9,0x56,0xf9,0x56,0xfa,0xf9,0xf9,0x56,0x56,0x56,
+       0xf9,0x56,0x56,0x56,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0x56,0x56,0x56,
+       0xf9,0xf9,0xf9,0x56,0xfa,0xf9,0x56,0xf9,0xf9,0x56,0xfa,0xfa,0xf9,0xf9,0xfa,0xfa,
+       0xfa,0xfa,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0xfa,0xfa,0xf9,0xfa,0xf9,
+       0xf9,0xf9,0xf9,0xfa,0xfa,0xf9,0xf9,0xf9,0xf9,0xfa,0xfa,0xfa,0x81,0xfa,0xf9,0xf9,
+       0xfa,0xf9,0xf9,0xf9,0xf9,0xfa,0x81,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,
+       0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xf9,0xf9,0xf9,0x56,0xf9,
+       0xf9,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0xfa,0xf9,0x56,0xf9,0x56,0x56,0xf9,
+       0xf9,0x56,0x56,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0x56,0xf9,
+       0x56,0xf9,0xf9,0x56,0x56,0xf9,0x56,0x56,0xf9,0xfa,0xf9,0xfa,0x56,0xf9,0x56,0x56,
+       0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0x56,0x56,0x56,0x56,0x56,0x56,0xf9,
+       0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0x56,0x56,0x56,0xf9,0xf9,0xf9,0x56,0xfa,0xf9,0x56,
+       0xf9,0xf9,0x56,0xfa,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0x56,0xf9,0x56,0x56,0x56,0x56,
+       0xf9,0xf9,0x56,0xf9,0xf9,0xfa,0xf9,0x56,0x56,0x56,0xf9,0x56,0xf9,0xf9,0x56,0x56,
+       0xf9,0x56,0x56,0xf9,0xfa,0xf9,0xfa,0x56,0x56,0xf9,0x56,0x56,0x56,0xf9,0xf9,0xf9,
+       0xf9,0xf9,0x56,0x56,0xf9,0x56,0x56,0xf9,0x56,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,
+       0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,
+       0x56,0xf9,0xf9,0xf9,0x56,0xfa,0x56,0x56,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xfa,
+       0xf9,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xf9,0x56,0x56,0xf9,0xfa,0xf9,
+       0xfa,0x56,0xf9,0x56,0xfc,0xff,0xff,0xfc,0xab,0xab,0xfb,0xfb,0xaa,0xfb,0xaa,0x80,
+       0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xff,0x2b,0xfa,0xf9,
+       0xf9,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0x56,
+       0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xfa,0xfa,0x56,0xf9,0xf9,0x56,0xf9,0xf9,
+       0xf9,0x56,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xfa,0xf9,0xf9,0x56,0xf9,0x56,0x56,0x56,
+       0x56,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0xfa,0xfa,
+       0xfa,0xfa,0xfa,0xfa,0xf9,0xfa,0xf9,0xfa,0xf9,0xfa,0xfa,0xf9,0xf9,0xfa,0xfa,0xf9,
+       0xf9,0xf9,0xfa,0xfa,0xfa,0xfa,0xf9,0xfa,0xfa,0xf9,0xf9,0xf9,0xfa,0xf9,0xfa,0xf9,
+       0xf9,0xfa,0xf9,0xfa,0xfa,0x81,0xfa,0xf9,0xf9,0xfa,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,
+       0xf9,0xf9,0xf9,0xf9,0x56,0x56,0x56,0x56,0xf9,0x56,0x56,0x56,0xf9,0xf9,0xf9,0xf9,
+       0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xfa,0xf9,0xfa,0xfa,0x56,0x56,0xf9,0xf9,0xf9,0xf9,
+       0xf9,0xf9,0x56,0x56,0x56,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xf9,0x56,0x56,0x56,0x56,
+       0xf9,0xfa,0xf9,0xfa,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xf9,
+       0xf9,0xf9,0xfa,0xf9,0xfa,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0xf9,
+       0xf9,0xfa,0xf9,0xf9,0x56,0xf9,0x56,0x56,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0x56,
+       0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xf9,
+       0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xfa,0xf9,0xfa,0x56,
+       0x56,0xfa,0x56,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xfa,
+       0xf9,0x56,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0x56,0x56,0xf9,0xfa,0xfa,0xf9,0xf9,0x56,
+       0xf9,0x56,0x56,0x56,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xfa,0xf9,0xfa,0xf9,
+       0xf9,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0x56,0x56,0x56,0xf9,0x56,0xf9,0xf9,0x56,0x56,
+       0xf9,0x56,0x56,0x56,0x56,0xf9,0xfa,0xf9,0xfa,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,
+       0x56,0xf9,0x56,0x56,0xf9,0xfc,0xff,0xff,0xab,0xfb,0xab,0xfb,0xaa,0xfb,0xfb,0x80,
+       0xfb,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xff,0x2b,0x56,
+       0x56,0x56,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,
+       0x56,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xfa,
+       0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0x56,0xfa,0xf9,0x56,0x56,0xf9,0x56,0x56,0xf9,0xf9,
+       0xf9,0xf9,0xf9,0xfa,0x56,0x56,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xfa,0x56,
+       0xfa,0xfa,0xfa,0xfa,0xf9,0xf9,0xf9,0xfa,0xfa,0xfa,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,
+       0xf9,0xf9,0xf9,0xfa,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xfa,0xf9,0xf9,
+       0xf9,0xfa,0xfa,0xfa,0xfa,0xf9,0xf9,0xfa,0xf9,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xf9,
+       0xf9,0xf9,0xf9,0x56,0x56,0x56,0x56,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xfa,0x56,
+       0x56,0x56,0x56,0x56,0x56,0x56,0x56,0xf9,0xf9,0x56,0x56,0x56,0xf9,0x56,0x56,0xf9,
+       0xf9,0x56,0x56,0x56,0xf9,0xfa,0xfa,0xf9,0xfa,0x56,0x56,0x56,0xf9,0xf9,0xf9,0x56,
+       0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,0x56,0x56,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,
+       0xfa,0xf9,0xf9,0x56,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,
+       0xfa,0xf9,0x56,0x56,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0x56,0x56,0x56,
+       0x56,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,
+       0xf9,0xfa,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0x56,
+       0x56,0xf9,0x56,0x56,0x56,0xf9,0xf9,0x56,0x56,0x56,0xf9,0xfa,0xf9,0xf9,0xf9,0x56,
+       0xf9,0x56,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0x56,
+       0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0x56,0x56,
+       0x56,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xf9,0xfa,0xf9,0xf9,0xfa,0x56,0x56,
+       0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,0x56,0x56,0x56,0xf9,
+       0xf9,0xf9,0x56,0x56,0xfa,0xf9,0xfc,0xff,0xff,0xfc,0xab,0xab,0xfb,0xfb,0x80,0xaa,
+       0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xff,0xf6,
+       0x56,0x56,0xf9,0x56,0x56,0xf9,0xf9,0x56,0x56,0x56,0xf9,0x56,0xfa,0x56,0xf9,0xf9,
+       0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,
+       0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,
+       0xfa,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0x56,0x56,0x56,0xf9,0xf9,
+       0xf9,0xf9,0xfa,0xfa,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,
+       0xfa,0xf9,0xf9,0xfa,0xf9,0xf9,0xfa,0xf9,0xf9,0xfa,0xfa,0xf9,0xfa,0xfa,0xfa,0xfa,
+       0xf9,0xf9,0xfa,0xfa,0xf9,0xfa,0xf9,0xf9,0xfa,0xfa,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,
+       0xf9,0xfa,0xf9,0xf9,0x56,0x56,0x56,0xf9,0x56,0x56,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,
+       0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,
+       0x56,0xf9,0x56,0x56,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,
+       0x56,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0x56,0x56,
+       0xfa,0xf9,0x56,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,
+       0xfa,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0x56,0x56,
+       0xf9,0xf9,0x56,0xf9,0x56,0x56,0x56,0xf9,0x56,0x56,0xf9,0xf9,0x56,0x56,0x56,0xf9,
+       0x56,0xfa,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,
+       0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xfa,0x56,0xf9,0xf9,0x56,
+       0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,
+       0xf9,0x56,0x56,0xfa,0xf9,0xf9,0xf9,0xfa,0xf9,0x56,0x56,0xf9,0x56,0xf9,0x56,0x56,
+       0x56,0x56,0xf9,0x56,0x56,0xf9,0xf9,0x56,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,
+       0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,
+       0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xfc,0xff,0xff,0xab,0xfc,0xab,0xab,0xfb,0xfb,
+       0xfb,0x80,0xfb,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xff,
+       0x2b,0xfa,0xf9,0x56,0xfa,0xf9,0x56,0xf9,0x56,0x56,0xfa,0xf9,0xf9,0xf9,0xfa,0xf9,
+       0x56,0xf9,0x56,0xfa,0xf9,0xf9,0x56,0xf9,0x56,0x56,0x56,0xf9,0x56,0xf9,0x56,0xf9,
+       0xf9,0x56,0x56,0xfa,0xf9,0xf9,0xf9,0x56,0x56,0x56,0x56,0xf9,0x56,0xf9,0x56,0xf9,
+       0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xfa,0xf9,0x56,
+       0xfa,0xf9,0xf9,0xfa,0xf9,0xf9,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xf9,0xfa,0xf9,0xfa,
+       0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0xfa,0xfa,0xf9,0xf9,0xfa,0xfa,0xf9,0xf9,0xf9,
+       0xf9,0xfa,0xfa,0xf9,0xf9,0xfa,0xfa,0xfa,0xfa,0xfa,0xf9,0xfa,0xf9,0xf9,0xfa,0xfa,
+       0xf9,0xf9,0x56,0x56,0x56,0x56,0x56,0x56,0x56,0x56,0xf9,0xfa,0x56,0xf9,0x56,0xf9,
+       0xf9,0xfa,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xf9,0xfa,0x56,0xf9,0xf9,
+       0x56,0xf9,0x56,0x56,0xfa,0xf9,0xf9,0xf9,0xfa,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0x56,
+       0xf9,0xf9,0xf9,0x56,0x56,0xfa,0xf9,0x56,0x56,0x2b,0xf5,0x00,0xf8,0x56,0x56,0xfa,
+       0xfa,0x56,0x56,0xfa,0xf9,0xfa,0xfa,0xf9,0xf9,0x56,0x56,0x56,0xf9,0xf9,0xf9,0x56,
+       0x56,0x56,0x56,0x56,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xfa,
+       0xf9,0xf9,0xf9,0x56,0x56,0x56,0xfa,0xf9,0x56,0xfa,0x56,0xf9,0x56,0x56,0x56,0xfa,
+       0xf9,0xf9,0xf9,0xfa,0xf9,0x56,0xf9,0x56,0xfa,0xf9,0xf9,0x56,0xf9,0x56,0x56,0x56,
+       0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,0x56,0x56,0xf9,0xfa,0x56,0x56,0xf9,0xf9,
+       0xf9,0xfa,0xf9,0xf9,0xf9,0x56,0x56,0xfa,0xf9,0x56,0xf9,0x56,0x56,0x56,0x56,0xf9,
+       0x56,0xf9,0x56,0xf9,0xfa,0x56,0xf9,0x56,0x56,0xf9,0xfa,0xf9,0xf9,0xf9,0x56,0x56,
+       0xf9,0xfa,0x56,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,
+       0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xfa,0xf9,0x56,0xf9,0x56,0xf9,
+       0x56,0x56,0x56,0x56,0xf9,0xfa,0x56,0x56,0xfc,0xff,0xff,0xfc,0xab,0xab,0xfb,0xab,
+       0x80,0xaa,0xfb,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
+       0xff,0xf6,0xfa,0x56,0x56,0xf9,0x56,0xf9,0x56,0x56,0x56,0xf9,0xf9,0x56,0x56,0x56,
+       0xf9,0xf9,0xf9,0xfa,0xf9,0x56,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xfa,0xf9,0x56,0xf9,
+       0x56,0xf9,0xf9,0xfa,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xfa,0xf9,0xf9,0xf9,0xf9,0x56,
+       0xfa,0xf9,0x56,0x56,0x56,0x56,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xf9,
+       0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,
+       0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xfa,0xfa,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,
+       0xf9,0xf9,0xfa,0xfa,0xf9,0xfa,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0xfa,0xf9,0xfa,0xfa,
+       0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0x56,
+       0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0x56,0xfa,
+       0x56,0xf9,0x56,0x56,0x56,0xf9,0xf9,0x56,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0x56,
+       0x56,0x56,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf7,0xf5,0x00,0x00,0x00,0xf8,0xf9,0xf9,
+       0xfa,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0x56,
+       0xf9,0xf9,0x56,0xfa,0xf9,0xf9,0xf9,0xf9,0x56,0xfa,0xf9,0x56,0x56,0x56,0x56,0xf9,
+       0xf9,0x56,0xf9,0x56,0xf9,0x56,0xf9,0xfa,0x56,0x56,0xf9,0xf9,0x56,0xf9,0x56,0x56,
+       0xf9,0xf9,0x56,0x56,0x56,0xf9,0xf9,0xf9,0xfa,0xf9,0x56,0x56,0xf9,0x56,0xf9,0xf9,
+       0xf9,0xfa,0x56,0xf9,0x56,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xfa,0xf9,0x56,0x56,0xf9,
+       0x56,0xfa,0x56,0x56,0x56,0xf9,0x56,0xfa,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xfa,
+       0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0x56,
+       0xf9,0xfa,0x56,0x56,0xfa,0x56,0x56,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,
+       0xf9,0xf9,0xf9,0xf9,0x56,0x56,0x56,0x56,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0xf9,
+       0x56,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xfc,0xff,0xff,0xab,0xfc,0xab,0xfb,
+       0xaa,0xfb,0xfb,0x80,0xaa,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
+       0x80,0xff,0x2b,0xf9,0x56,0xf9,0xfa,0xf9,0x56,0x56,0x56,0xf9,0xfa,0x56,0x56,0xf9,
+       0x56,0x56,0xf9,0x56,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0x56,0x56,
+       0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xfa,0x56,0xf9,0xf9,0x56,
+       0xf9,0xfa,0x56,0x56,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,
+       0x56,0xfa,0xfa,0xf9,0x56,0x56,0x56,0xf9,0xfa,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,
+       0x56,0x56,0x56,0x56,0xf9,0x56,0xfa,0xfa,0xfa,0xfa,0xfa,0xf9,0xf9,0xfa,0xf9,0xfa,
+       0xfa,0x81,0xfa,0x81,0xf9,0xf9,0xf9,0xfa,0xf9,0x81,0xf9,0xfa,0xf9,0xf9,0xfa,0xfa,
+       0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,
+       0x56,0xf9,0x56,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,
+       0xf9,0xf9,0x56,0x56,0x56,0x56,0xfa,0x56,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0x56,
+       0x56,0x56,0xfa,0x56,0xfa,0xf9,0xfa,0xf9,0xf6,0x00,0x00,0x00,0x00,0x00,0x56,0xfa,
+       0xfa,0xfa,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0x56,
+       0xf9,0x56,0xfa,0xf9,0xfa,0x56,0xf9,0xf9,0x56,0xf9,0xfa,0x56,0x56,0x56,0xf9,0x56,
+       0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xfa,0xf9,0xf9,0x56,0x56,0x56,
+       0xf9,0xfa,0x56,0x56,0xf9,0x56,0x56,0xf9,0x56,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,
+       0xf9,0xf9,0xf9,0x56,0x56,0x56,0xf9,0x56,0xf9,0xf9,0xfa,0xf9,0xfa,0x56,0x56,0xf9,
+       0xf9,0x56,0xfa,0x56,0xf9,0x56,0x56,0xf9,0xfa,0x56,0x56,0xf9,0x56,0xf9,0xfa,0xf9,
+       0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,
+       0x56,0xf9,0x56,0x56,0xfa,0xf9,0xf9,0x56,0x56,0x56,0x56,0xfa,0x56,0x56,0x56,0x56,
+       0xf9,0xf9,0x56,0xf9,0x56,0x56,0x56,0xfa,0x56,0xfa,0xfa,0xf9,0xf9,0xf9,0x56,0x56,
+       0x56,0xf9,0xf9,0xfa,0xf9,0xfa,0xf9,0xf9,0x56,0xf9,0xfc,0xff,0xff,0xfc,0xab,0xab,
+       0xfb,0xfb,0xaa,0x80,0xfb,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
+       0x80,0x80,0xff,0x2b,0x56,0x56,0xfa,0x56,0x56,0xf9,0x56,0xf9,0x56,0x56,0x56,0xf9,
+       0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0x56,0xf9,0x56,0x56,0x56,0x56,
+       0x56,0x56,0x56,0x56,0xf9,0x56,0x56,0x56,0x56,0x56,0xf9,0xf9,0x56,0xf9,0x56,0xf9,
+       0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0x56,0x56,0x56,0x56,0xf9,
+       0x56,0x56,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0x56,0x56,0x56,0x56,0xf9,0xf9,0x56,0x56,
+       0x56,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xfa,
+       0xfa,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0xfa,0xfa,0xfa,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,
+       0xf9,0x56,0xf9,0xf9,0x56,0xf9,0x56,0x56,0x56,0x56,0xf9,0x56,0x56,0xfa,0x56,0x56,
+       0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0x56,0x56,0xf9,0x56,0x56,
+       0xfa,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xf9,
+       0xf9,0xf9,0xfa,0xf9,0xf9,0x56,0x56,0x56,0xf6,0x00,0x00,0x00,0x00,0x00,0x00,0xfa,
+       0xfa,0xfa,0xfa,0xf9,0xf9,0xf9,0xfa,0xf9,0xfa,0x56,0x56,0x56,0x56,0xf9,0x56,0x56,
+       0x56,0x56,0x56,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,
+       0xf9,0x56,0x56,0xf9,0x56,0x56,0x56,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0x56,
+       0xf9,0x56,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,
+       0xf9,0x56,0x56,0x56,0x56,0x56,0x56,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xf9,0x56,0xf9,
+       0xf9,0xf9,0xf9,0xf9,0x56,0x56,0x56,0x56,0xf9,0x56,0x56,0x56,0x56,0x56,0xf9,0x56,
+       0xf9,0x56,0x56,0xf9,0x56,0x56,0xfa,0x56,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0x56,
+       0xf9,0x56,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,
+       0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0x56,0x56,0x56,0x56,0x56,0x56,
+       0x56,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xf9,0x56,0xf9,0xf9,0xfc,0xff,0xff,0xab,0xfc,
+       0xab,0xab,0xfb,0xfb,0xaa,0x80,0xfb,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
+       0x80,0x80,0x80,0xff,0x2b,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,
+       0xf9,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xfa,
+       0xfa,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,0x56,
+       0xf9,0xf9,0x56,0xfa,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,
+       0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,
+       0x56,0x56,0x56,0x56,0x56,0xf9,0x56,0x56,0x56,0x56,0xf9,0xfa,0xfa,0xfa,0xfa,0xfa,
+       0xfa,0xf9,0xfa,0xf9,0xfa,0xf9,0xf9,0xf9,0xfa,0xf9,0xfa,0xf9,0xf9,0xfa,0xfa,0xf9,
+       0xf9,0xfa,0xf9,0xf9,0x56,0xf9,0x56,0x56,0x56,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,
+       0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xf9,0x56,0xf9,0xf9,0x56,0xfa,0xf9,
+       0xf9,0x56,0xf9,0x56,0xf9,0x56,0xfa,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0x56,0xf9,0xf9,
+       0x56,0x56,0x56,0xf9,0xf9,0x56,0x56,0x56,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x2b,
+       0xfa,0xfa,0xfa,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0x56,0xf9,
+       0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xfa,0x56,0x56,0xf9,
+       0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xfa,0xf9,0x56,0xf9,0x56,0xf9,0x56,
+       0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0x56,0x56,0xf9,0xf9,0xf9,
+       0x56,0x56,0x56,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,0x56,
+       0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,
+       0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,
+       0x56,0xf9,0x56,0xfa,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xfa,
+       0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xf9,0xf9,0x56,0x56,0x56,0xf9,0xf9,0xf9,
+       0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xf9,0xfc,0xff,0xff,0xfc,
+       0xab,0xab,0xfb,0xab,0x80,0xfb,0xfb,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
+       0x80,0x80,0x80,0x80,0xff,0x2b,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0x56,0xfa,0xf9,0xf9,
+       0xf9,0xfa,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,
+       0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,
+       0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,
+       0xf9,0xfa,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,
+       0x56,0x56,0xf9,0x56,0x56,0xf9,0x56,0xf9,0x56,0x56,0x56,0xf9,0xfa,0x81,0xfa,0xfa,
+       0xfa,0xfa,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0xfa,0xfa,
+       0xf9,0xf9,0xfa,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xfa,
+       0xf9,0x56,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0x56,0xf9,0x56,0x56,0x56,0xf9,0xf9,0xf9,
+       0x56,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xfa,0xf9,0x56,0xf9,0x56,
+       0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,0x56,0x56,0xf5,0x00,0x00,0x00,0x00,0x00,0x00,
+       0xf9,0x81,0xfa,0x81,0xfa,0xf9,0xfa,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,
+       0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,
+       0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,
+       0xf9,0x56,0xfa,0xf9,0xf9,0xf9,0xfa,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xf9,
+       0xf9,0x56,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0x56,
+       0x56,0x56,0xf9,0x56,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0x56,0xfa,0x56,0xf9,0xf9,0xf9,
+       0xf9,0x56,0x56,0xf9,0x56,0xf9,0xf9,0x56,0xfa,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0x56,
+       0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xfa,0x56,0xf9,0xf9,
+       0xfa,0xf9,0x56,0x56,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0x56,0x56,0x56,0x56,0xf9,0xf9,
+       0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0x56,0x56,0x56,0x56,0x56,0xfc,0xff,0xff,
+       0xab,0xfc,0xab,0xfb,0xaa,0xfb,0xfb,0x80,0x80,0xfb,0x80,0x80,0x80,0x80,0x80,0x80,
+       0x80,0x80,0x80,0x80,0x80,0xff,0x2b,0x56,0x56,0xf9,0x56,0x56,0x56,0xf9,0x56,0x56,
+       0xf9,0xf9,0xf9,0x56,0xf9,0x56,0xfa,0xfa,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,
+       0xfa,0xfa,0xf9,0xf9,0xfa,0xf9,0x56,0xf9,0xf9,0xf9,0xfa,0xf9,0xfa,0xf9,0xf9,0xf9,
+       0x56,0x56,0xfa,0x56,0xf9,0xf9,0x56,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,
+       0x56,0x56,0xf9,0x56,0xf9,0xf9,0x56,0x56,0x56,0xf9,0x56,0x56,0xf9,0xf9,0x56,0x56,
+       0xf9,0x56,0xf9,0xf9,0x56,0x56,0x56,0xf9,0x56,0x56,0xf9,0xf9,0xfa,0xf9,0xf9,0xfa,
+       0xfa,0xfa,0xfa,0xf9,0xfa,0xfa,0xfa,0xfa,0xf9,0xf9,0xfa,0xf9,0xfa,0xf9,0xf9,0xfa,
+       0xfa,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xfa,0x56,0xf9,
+       0xf9,0x56,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,
+       0xf9,0xf9,0x56,0xf9,0x56,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,
+       0xf9,0xf9,0x56,0x56,0x56,0x56,0x56,0x56,0x56,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,
+       0xf7,0x81,0x81,0xfb,0x81,0xfa,0xfa,0xf9,0xfa,0xf9,0xf9,0x56,0x56,0xfa,0xf9,0x56,
+       0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xfa,0x56,0xf9,0xf9,0x56,
+       0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0x56,0x56,0xf9,0x56,
+       0x56,0x56,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xfa,0x56,0x56,0x56,
+       0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,
+       0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xfa,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,
+       0xfa,0xf9,0xfa,0xf9,0x56,0x56,0xfa,0x56,0xf9,0xf9,0x56,0x56,0xf9,0x56,0xf9,0x56,
+       0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0x56,0x56,0x56,0xf9,0x56,0x56,0xf9,
+       0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xfa,0x56,0x56,0x56,0x56,0x56,0x56,0x56,0xf9,0xfa,
+       0xf9,0xf9,0x56,0x56,0xfa,0xf9,0x56,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xfc,0xff,
+       0xff,0xfc,0xab,0xab,0xfb,0xfb,0xaa,0x80,0xaa,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
+       0x80,0x80,0x80,0x80,0x80,0x80,0xff,0x2b,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0x56,
+       0x56,0x56,0xf9,0x56,0x56,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0xfa,0xfa,0xf9,
+       0xfa,0xfa,0xf9,0xf9,0x56,0xfa,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xf9,
+       0xf9,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xf9,0x56,
+       0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0x56,0x56,0x56,0x56,
+       0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xfa,0xf9,0xf9,0xfa,0xf9,0xf9,
+       0xfa,0xf9,0x81,0xf9,0xf9,0xfa,0xfa,0xf9,0xfa,0xfa,0xfa,0xfa,0xfa,0xf9,0xf9,0xfa,
+       0xfa,0xf9,0xf9,0xf9,0xfa,0xf9,0x56,0x56,0x56,0x56,0x56,0x56,0x56,0xf9,0xf9,0x56,
+       0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0x56,0x56,0xf9,0x56,0x56,0xf9,
+       0x56,0xf9,0x56,0xf9,0xf9,0xfa,0xf9,0x56,0xf9,0x56,0x56,0xf9,0x56,0x56,0x56,0xf9,
+       0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0x2b,0x00,0x00,0x00,0x00,0x00,
+       0xf7,0x81,0x81,0xfb,0x81,0x81,0x81,0x81,0xfa,0xfa,0xf9,0x56,0x56,0xf9,0xf9,0xf9,
+       0x56,0x56,0xfa,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xf9,
+       0xf9,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,
+       0xf9,0xf9,0x56,0xf9,0x56,0x56,0x56,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0x56,0xf9,
+       0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,0x56,0xfa,0xf9,0x56,0xf9,0xf9,
+       0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,
+       0xf9,0x56,0x56,0x56,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xfa,0xf9,0xf9,
+       0x56,0xf9,0x56,0x56,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xfa,0xf9,0xf9,0x56,0x56,0x56,
+       0xf9,0x56,0x56,0x56,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0x56,
+       0xf9,0x56,0x56,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xfa,0xfc,
+       0xff,0xff,0xab,0xfc,0xab,0xab,0xfb,0xfb,0xfb,0x80,0xfb,0x80,0x80,0x80,0x80,0x80,
+       0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xff,0x2b,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,
+       0xf9,0xf9,0xfa,0xf9,0xf9,0xfa,0xfa,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xfa,
+       0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0x56,
+       0x56,0x56,0x56,0xf9,0xf9,0x56,0xf9,0x56,0x56,0x56,0xf9,0x56,0xf9,0x56,0xf9,0x56,
+       0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,
+       0xf9,0xf9,0xfa,0x56,0x56,0x56,0x56,0x56,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xfa,0xf9,
+       0xf9,0xfa,0xfa,0xfa,0xfa,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0xfa,
+       0xfa,0xfa,0xf9,0xf9,0xfa,0xfa,0x56,0x56,0x56,0x56,0x56,0x56,0x56,0x56,0xf9,0xf9,
+       0x56,0xf9,0x56,0x56,0x56,0xf9,0x56,0x56,0xf9,0x56,0x56,0x56,0xf9,0x56,0x56,0xf9,
+       0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xfa,0xf9,0x56,0xfa,0xf9,0xf9,0xf9,0xf9,
+       0xfa,0x56,0x56,0x56,0x56,0x56,0x56,0x56,0xf9,0xf9,0x56,0xf6,0x00,0x00,0x00,0x00,
+       0xf7,0x81,0x81,0x81,0x81,0xfb,0x81,0x81,0xf9,0xfa,0xfa,0xf9,0x56,0xfa,0xf9,0xfa,
+       0x56,0xf9,0xf9,0xfa,0x56,0xf9,0x56,0x56,0x56,0x56,0x56,0x56,0xf9,0xf9,0x56,0xf9,
+       0x56,0x56,0x56,0xf9,0x56,0xf9,0x56,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,
+       0xf9,0xf9,0x56,0xfa,0xf9,0xf9,0xf9,0xfa,0x56,0xf9,0xf9,0xfa,0x56,0x56,0x56,0x56,
+       0x56,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0xf9,
+       0x56,0xf9,0x56,0x56,0x56,0xfa,0x56,0x56,0xf9,0xfa,0xf9,0xf9,0x56,0xf9,0xfa,0x56,
+       0x56,0xf9,0x56,0x56,0x56,0x56,0x56,0xf9,0xf9,0x56,0xf9,0x56,0x56,0x56,0x56,0x56,
+       0x56,0xf9,0x56,0x56,0x56,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,
+       0xf9,0xfa,0xf9,0xf9,0xf9,0xfa,0x56,0x56,0x56,0x56,0x56,0x56,0x56,0xf9,0xf9,0x56,
+       0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,
+       0xfb,0xff,0xff,0xfc,0xab,0xab,0xfb,0xaa,0xfb,0xaa,0xfb,0x80,0x80,0x80,0x80,0x80,
+       0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xff,0xf6,0xf9,0xf9,0x56,0x56,0x56,0xf9,
+       0x56,0x56,0xfa,0x56,0xf9,0xfa,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0x81,
+       0xfa,0xfa,0x81,0x81,0xfa,0xfa,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0xf9,
+       0x56,0x56,0xf9,0x56,0xfa,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xf9,0xfa,0x56,
+       0xfa,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0x56,0x56,0xf9,0x56,0x56,0xf9,0xf9,
+       0xf9,0xf9,0xfa,0x56,0x56,0x56,0xf9,0x56,0xf9,0x56,0xf9,0xfa,0xf9,0xf9,0xf9,0xfa,
+       0xf9,0xf9,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xf9,0xf9,0xfa,0xfa,0xf9,0xfa,
+       0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0x56,0x56,0x56,0xf9,0x56,0xf9,0xfa,
+       0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xfa,0xf9,0xf9,0xfa,0xf9,0x56,0xfa,0xf9,
+       0x56,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xf9,0x56,0x56,0x56,0x56,0xf9,0xf9,0xf9,0xf9,
+       0xfa,0xf9,0x56,0x56,0xf8,0xf8,0xf8,0xf8,0xf9,0xfa,0xf9,0xf9,0xf6,0x00,0x00,0x2b,
+       0xf9,0x81,0x81,0xfb,0xf9,0xfa,0xf9,0xf9,0xfa,0xfa,0xfa,0xfa,0x56,0xfa,0xfa,0xf9,
+       0x56,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0x56,0xf9,0x56,0xfa,0xf9,0xf9,
+       0xf9,0xf9,0x56,0xf9,0x56,0x56,0xf9,0xfa,0x56,0xfa,0xf9,0x56,0xf9,0x56,0xf9,0xf9,
+       0x56,0xf9,0x56,0x56,0x56,0x56,0x56,0xfa,0x56,0xf9,0xf9,0xfa,0x56,0x56,0xf9,0xf9,
+       0xf9,0xf9,0x56,0xf9,0xfa,0xf9,0xf9,0xf9,0xfa,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0x56,
+       0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xfa,0xf9,0xf9,0x56,0x56,0xf9,0x56,0xf9,
+       0x56,0xf9,0x56,0xf9,0x56,0xf9,0x56,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,
+       0x56,0xfa,0xf9,0xf9,0xfa,0xf9,0x56,0x56,0xf9,0xf9,0x56,0x56,0xf9,0x56,0xf9,0x56,
+       0x56,0xf9,0xf9,0x56,0xfa,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xf9,
+       0xf9,0xf9,0xfa,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,
+       0xf9,0xfc,0xff,0xff,0xfc,0xab,0xfb,0xab,0xfb,0xfb,0x80,0x80,0xaa,0x80,0x80,0x80,
+       0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xff,0x2b,0xf9,0x56,0xf9,0xf9,0x56,
+       0x56,0xf9,0xfa,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,
+       0xfa,0xf9,0xfa,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xf9,0xf9,
+       0x56,0x56,0xf9,0x56,0xf9,0xf9,0x56,0x56,0x56,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0x56,
+       0x56,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0x56,0xfa,0xf9,
+       0xf9,0x56,0x56,0xf9,0xf9,0x56,0xfa,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xf9,
+       0xf9,0xf9,0xf9,0xfa,0xf9,0xfa,0xfa,0xfa,0xf9,0xfa,0xfa,0xf9,0xfa,0xfa,0xf9,0xf9,
+       0xfa,0xfa,0xf9,0xf9,0xf9,0xfa,0xf9,0x56,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,
+       0xf9,0x56,0x56,0x56,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xf9,0x56,0x56,0xf9,
+       0x56,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xfa,0xfa,0x56,0x56,
+       0xf9,0x56,0xf8,0xf6,0x00,0x00,0x00,0x00,0x00,0x00,0x2b,0xf8,0xf9,0xf9,0x56,0xf9,
+       0xfa,0xfa,0xf8,0xf6,0x00,0x00,0x00,0x00,0x00,0x00,0x2b,0xf9,0xf9,0xf9,0xfa,0xf9,
+       0x56,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xfa,0xf9,0x56,0x56,0xf9,0x56,0xf9,0xf9,0x56,
+       0x56,0x56,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xf9,0x56,0x56,0xf9,0xf9,0xf9,
+       0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xfa,0xf9,0x56,0xf9,0x56,0xf9,0x56,0xf9,0xf9,
+       0xf9,0x56,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xf9,0x56,0x56,0x56,0xf9,0x56,0x56,0xf9,
+       0xf9,0x56,0xfa,0xf9,0x56,0xf9,0xfa,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,
+       0x56,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0x56,0x56,0xf9,0xf9,
+       0xf9,0x56,0xf9,0x56,0x56,0xf9,0x56,0xfa,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,
+       0x56,0xfa,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,
+       0x56,0x56,0xf9,0x56,0x56,0x56,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,
+       0xf9,0x56,0xfc,0xff,0xff,0xab,0xfc,0xab,0xfb,0xfb,0xaa,0xfb,0xfb,0x80,0x80,0x80,
+       0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xff,0x2b,0x56,0xf9,0xf9,0xf9,
+       0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0xfa,0xfa,0x81,0xfa,
+       0xfa,0xfa,0xfa,0xfa,0xfa,0xf9,0xfa,0xfa,0xfa,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,
+       0x56,0x56,0xf9,0xf9,0xf9,0x56,0xfa,0xf9,0x56,0x56,0x56,0xfa,0xf9,0x56,0xf9,0x56,
+       0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,
+       0xf9,0x56,0xf9,0x56,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,
+       0xf9,0x56,0xf9,0xfa,0xfa,0xfa,0xfa,0xfa,0xf9,0xfa,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,
+       0xfa,0xf9,0xf9,0xf9,0xf9,0xfa,0xfa,0x56,0x56,0x56,0xf9,0x56,0x56,0x56,0xfa,0x56,
+       0x56,0xfa,0xf9,0x56,0x56,0x56,0xfa,0xf9,0x56,0xf9,0x56,0xf9,0x56,0xf9,0x56,0xf9,
+       0x56,0x56,0xf9,0xfa,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0x56,0xf9,
+       0xf9,0xf8,0xf6,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf5,0xf6,0xf7,
+       0x2b,0xf6,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2b,0xf9,0xfa,
+       0xf9,0xf9,0xf9,0xfa,0xf9,0x56,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0x56,0xfa,
+       0xf9,0x56,0x56,0x56,0xfa,0xf9,0x56,0xf9,0x56,0xf9,0x56,0xf9,0x56,0xf9,0xfa,0xf9,
+       0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,
+       0x56,0xf9,0x56,0xfa,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,
+       0x56,0xf9,0xf9,0xf9,0x56,0x56,0x56,0x56,0x56,0x56,0xf9,0x56,0x56,0xf9,0xf9,0xf9,
+       0x56,0x56,0xf9,0xfa,0x56,0x56,0xf9,0xf9,0x56,0x56,0xfa,0xf9,0x56,0x56,0x56,0xfa,
+       0xf9,0x56,0xf9,0x56,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,
+       0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,
+       0xf9,0x56,0xf9,0x56,0x56,0x56,0xfa,0xf9,0x56,0xf9,0x56,0x56,0xf9,0xf9,0x56,0x56,
+       0xf9,0x56,0x56,0xfc,0xff,0xff,0xab,0xab,0xab,0xab,0xfb,0x80,0xaa,0x80,0xfb,0x80,
+       0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xff,0x2b,0x56,0x56,0xfa,
+       0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0xfa,0xf9,0xfa,0xfa,
+       0xfa,0xfa,0xfa,0xfa,0xfa,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0xfa,0x56,0x56,0x56,0x56,
+       0xfa,0x56,0x56,0xf9,0xfa,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xfa,0xf9,0x56,0x56,0xf9,
+       0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,0x56,0xf9,0xf9,0x56,0x56,0xf9,
+       0xf9,0xf9,0x56,0xf9,0x56,0xf9,0x56,0x56,0x56,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,
+       0xf9,0xf9,0x56,0xf9,0xfa,0xf9,0xfa,0xfa,0xfa,0x81,0xfa,0xf9,0xf9,0xfa,0xfa,0xf9,
+       0xfa,0xf9,0xfa,0xfa,0xf9,0xf9,0xfa,0xf9,0xf9,0x56,0x56,0xf9,0x56,0x56,0xf9,0xf9,
+       0xf9,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,
+       0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,0x56,0xfa,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,
+       0x56,0x56,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+       0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf6,
+       0xf9,0xfa,0xf9,0xf9,0xfa,0xf9,0x56,0xf9,0x56,0xfa,0x56,0x56,0xf9,0xfa,0x56,0xf9,
+       0xf9,0xf9,0x56,0x56,0xfa,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0x56,0x56,
+       0xf9,0x56,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,0x56,0x56,0xf9,0x56,
+       0x56,0x56,0x56,0x56,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xfa,0x56,0x56,
+       0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xfa,
+       0xf9,0x56,0xf9,0x56,0xf9,0x56,0x56,0xf9,0xfa,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,
+       0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xfa,0xf9,
+       0xf9,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0x56,0x56,0x56,0x56,0x56,0xf9,0xf9,0xf9,
+       0x56,0xf9,0xf9,0xfa,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xfa,0xf9,0xf9,0x56,
+       0xf9,0xf9,0xf9,0xf9,0xfc,0xff,0xff,0xfc,0xfc,0xab,0xfb,0xaa,0xfb,0xfb,0xfb,0x80,
+       0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xff,0x2b,0x56,0xf9,
+       0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0x81,0xfa,0x81,0xfa,0xfa,0xfa,
+       0xfa,0xfa,0xfa,0xfa,0xf9,0xfa,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0x56,0x56,0xf9,
+       0xf9,0xfa,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0xf9,
+       0xfa,0x56,0x56,0xfa,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xfa,0xf9,0xf9,0x56,
+       0x56,0x56,0x56,0xf9,0xf9,0x56,0xfa,0xf9,0xfa,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,
+       0x56,0xf9,0x56,0xf9,0xf9,0xfa,0xf9,0xf9,0xfa,0xfa,0xf9,0xfa,0xf9,0xf9,0xfa,0xf9,
+       0xfa,0xfa,0xfa,0xfa,0xfa,0xf9,0xf9,0xfa,0xf9,0x56,0xf9,0x56,0xf9,0x56,0xf9,0xf9,
+       0xf9,0x56,0xf9,0xfa,0x56,0xf9,0xf9,0xfa,0xf9,0x56,0xf9,0xfa,0x56,0x56,0xfa,0xf9,
+       0x56,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0x56,0x56,0x56,0xf9,
+       0x56,0x56,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+       0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+       0x00,0xf6,0xfa,0xfa,0xfa,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,
+       0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xfa,0x56,0x56,0xf9,0xf9,0x56,0xf9,
+       0xf9,0xf9,0xf9,0x56,0xf9,0xfa,0xf9,0x56,0x56,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,
+       0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xf9,0xf9,0xf9,
+       0x56,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xfa,0x56,0xf9,
+       0xf9,0xf9,0x56,0xf9,0xf9,0xfa,0x56,0xf9,0xf9,0x56,0xf9,0x56,0xfa,0xf9,0x56,0xf9,
+       0xfa,0xf9,0x56,0xf9,0xfa,0x56,0x56,0xfa,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,
+       0x56,0x56,0x56,0x56,0x56,0x56,0xf9,0x56,0xf9,0xfa,0xfa,0xf9,0xf9,0x56,0xf9,0xf9,
+       0x56,0xf9,0xf9,0x56,0x56,0x56,0x56,0x56,0xf9,0x56,0x56,0x56,0x56,0xf9,0x56,0x56,
+       0x56,0xf9,0x56,0xf9,0xf9,0xfc,0xff,0xff,0xfc,0xab,0xfb,0xab,0xfb,0xfb,0xaa,0x80,
+       0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xff,0x2b,0xf9,
+       0xf9,0xf9,0xf9,0x56,0xf9,0xfa,0xfa,0xf9,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xf9,0xfa,
+       0xfa,0xfa,0xfa,0xfa,0xf9,0xf9,0xf9,0xf9,0xfa,0xfa,0xfa,0xf9,0xf9,0x56,0x56,0x56,
+       0x56,0x56,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0x56,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0x56,
+       0xfa,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0x56,0x56,
+       0x56,0xfa,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0x56,0x56,0xf9,0x56,0xf9,0xf9,0xfa,
+       0x56,0x56,0x56,0xf9,0xfa,0xfa,0xfa,0xf9,0xfa,0xfa,0xfa,0xfa,0xf9,0xf9,0xfa,0xf9,
+       0xfa,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xf9,0x56,0x56,
+       0x56,0x56,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xf9,0x56,0x56,0xfa,0xf9,0x56,0xf9,0xfa,
+       0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xf9,
+       0xf9,0x56,0xf5,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+       0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+       0x00,0x00,0xf7,0xf9,0xfa,0xfa,0xf9,0xf9,0x56,0xf9,0x56,0xfa,0xf9,0x56,0xf9,0x56,
+       0xf9,0x56,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0x56,0xfa,0xf9,0x56,0xf9,0xfa,0x56,0xf9,
+       0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0x56,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0x56,
+       0xf9,0x56,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xfa,0x56,0x56,0x56,0xf9,0xfa,0xf9,0xf9,
+       0xf9,0x56,0xf9,0xf9,0x56,0x56,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0x56,0x56,
+       0xf9,0x56,0x56,0x56,0x56,0x56,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0xf9,
+       0x56,0xf9,0x56,0x56,0xfa,0xf9,0x56,0xf9,0xfa,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,
+       0xf9,0x56,0x56,0x56,0xf9,0xf9,0xf9,0xfa,0x56,0xf9,0x56,0x56,0xf9,0x56,0xf9,0x56,
+       0xf9,0xfa,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xfa,0xfa,0xf9,0x56,0xf9,0xf9,0xf9,0x56,
+       0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xfc,0xff,0xff,0xab,0xab,0xab,0xfb,0xfb,0xaa,0x80,
+       0xfb,0x80,0xfb,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xff,0x2b,
+       0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0xfa,0x81,0xfa,0xf9,0xfa,0xf9,0xfa,0xf9,
+       0xf9,0xf9,0xfa,0xf9,0xfa,0xf9,0xfa,0xfa,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,
+       0x56,0x56,0x56,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xf9,0x56,0xfa,0x56,
+       0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0x56,
+       0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xf9,0x56,0x56,0x56,0xf9,0xf9,
+       0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xfa,0xfa,0xf9,0xfa,0xfa,
+       0xfa,0xfa,0xf9,0xf9,0xfa,0xfa,0xf9,0xf9,0xf9,0xfa,0xf9,0x56,0x56,0x56,0x56,0xf9,
+       0xf9,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,
+       0xf9,0x56,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0x56,0x56,0x56,0xf9,0xf9,0xf9,
+       0xf9,0x56,0x2b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+       0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+       0x00,0x00,0x56,0xfb,0x81,0x81,0xfa,0x81,0xfa,0xfa,0x56,0xf9,0x56,0xf9,0x56,0xf9,
+       0x56,0xf9,0xf9,0x56,0x56,0xf9,0x56,0xfa,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,
+       0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xfa,0x56,0x56,0xfa,0xf9,
+       0x56,0x56,0x56,0xf9,0x56,0x56,0x56,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,
+       0xf9,0x56,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xfa,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,
+       0x56,0xf9,0xf9,0xfa,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,0x56,
+       0xf9,0x56,0xfa,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0x56,
+       0x56,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0x56,0x56,0xf9,0x56,0x56,
+       0x56,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xf9,0x56,
+       0x56,0xf9,0xfa,0xf9,0xfa,0x56,0x56,0xfc,0xff,0xff,0xfc,0xab,0xab,0xab,0xfb,0xfb,
+       0x80,0xfb,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xff,
+       0x2b,0xf9,0xf9,0xf9,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xf9,0xfa,0xfa,0xfa,0x81,
+       0xfa,0xf9,0xfa,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0xf9,
+       0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,
+       0xf9,0x56,0xf9,0x56,0x56,0xf9,0x56,0x56,0x56,0xf9,0x56,0x56,0x56,0x56,0x56,0x56,
+       0xfa,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,
+       0x56,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x81,0x81,0xfa,0xf9,0xfa,
+       0xfa,0xf9,0xfa,0xfa,0xf9,0xfa,0xf9,0xf9,0xfa,0xfa,0xfa,0xf9,0x56,0xf9,0xf9,0x56,
+       0xf9,0x56,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xfa,0x56,0xf9,0x56,0x56,0xf9,0xf9,0x56,
+       0xf9,0x56,0x56,0x56,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xf9,0xf9,0xf9,
+       0xf9,0xf9,0xf9,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+       0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+       0x00,0x00,0x56,0xfb,0xfb,0x81,0x81,0x81,0x81,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,
+       0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0x56,0x56,0xf9,0x56,
+       0x56,0x56,0xf9,0x56,0x56,0x56,0x56,0x56,0x56,0xfa,0xf9,0xf9,0x56,0xf9,0xf9,0x56,
+       0x56,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0x56,0x56,
+       0x56,0x56,0x56,0x56,0xf9,0xf9,0xf9,0x56,0xfa,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0x56,
+       0x56,0xf9,0xf9,0xfa,0x56,0x56,0xf9,0xfa,0x56,0xfa,0x56,0x56,0xf9,0xf9,0xf9,0x56,
+       0x56,0xfa,0x56,0x56,0x56,0x56,0xf9,0xf9,0x56,0xf9,0x56,0x56,0x56,0xf9,0x56,0x56,
+       0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xf9,0xf9,0xf9,0xf9,
+       0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0x56,0x56,0x56,0x56,0x56,0xf9,0xfa,
+       0xf9,0x56,0xfa,0xf9,0x56,0xf9,0xf9,0x56,0xfc,0xff,0xff,0xab,0xfc,0xfb,0xaa,0xfb,
+       0xaa,0xfb,0xaa,0xfb,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
+       0xff,0x2b,0xf9,0xfa,0xfa,0x81,0xfa,0xf9,0xfa,0x81,0xf9,0xfa,0xfa,0xfa,0x81,0xfa,
+       0xfa,0xf9,0xf9,0xfa,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,
+       0x56,0x56,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xfa,0x56,
+       0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,
+       0xfa,0xf9,0xf9,0x56,0x56,0xfa,0x56,0x56,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0x56,0xf9,
+       0xf9,0xf9,0x56,0x56,0x56,0x56,0x56,0xf9,0xf9,0xf9,0xfa,0x81,0xfa,0xfa,0xfa,0xf9,
+       0xfa,0xf9,0xf9,0xfa,0xf9,0xfa,0xf9,0xf9,0xf9,0xfa,0xfa,0x56,0x56,0x56,0xf9,0xf9,
+       0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0x56,0xf9,0x56,0xfa,0x56,
+       0x56,0x56,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xf9,0xfa,0xf9,0xfa,
+       0xf9,0x56,0x56,0xf7,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+       0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+       0x00,0x00,0x2b,0xfc,0xfb,0xfb,0x81,0xfb,0x81,0xfa,0xf9,0xf9,0xfa,0xf9,0x56,0xf9,
+       0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xfa,0x56,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,
+       0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xfa,0xfa,0xf9,0xf9,0x56,0xf9,0xf9,0x56,
+       0xf9,0xf9,0xf9,0xfa,0xf9,0xfa,0x56,0x56,0xf9,0xf9,0x56,0x56,0x56,0x56,0x56,0x56,
+       0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0xf9,
+       0x56,0x56,0xfa,0xf9,0x56,0x56,0x56,0xfa,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0x56,
+       0x56,0xf9,0xfa,0x56,0xf9,0xf9,0x56,0xfa,0x56,0x56,0x56,0xfa,0xf9,0x56,0xf9,0x56,
+       0xf9,0xf9,0xfa,0xf9,0xfa,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,
+       0xf9,0x56,0xfa,0x56,0xf9,0x56,0x56,0x56,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,
+       0xf9,0x56,0x56,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xfc,0xff,0xff,0xfc,0xab,0xab,0xfb,
+       0xab,0x80,0xfb,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
+       0x80,0xff,0x2b,0x81,0x81,0xfa,0xfa,0xfa,0xfa,0xfa,0x81,0xf9,0xf9,0xfa,0xfa,0xfa,
+       0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xfa,0xfa,0x56,0x56,
+       0x56,0x56,0x56,0xf9,0xf9,0x56,0x56,0xf9,0x56,0xf9,0x56,0x56,0xf9,0x56,0xf9,0xf9,
+       0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xfa,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xfa,
+       0xf9,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xf9,
+       0x56,0x56,0x56,0x56,0x56,0xf9,0xf9,0x56,0xfa,0xfa,0xf9,0xf9,0xf9,0xfa,0xfa,0xfa,
+       0xf9,0xfa,0xfa,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0x56,0xf9,0x56,
+       0x56,0x56,0xf9,0x56,0xf9,0x56,0x56,0x56,0x56,0xfa,0xf9,0x56,0xf9,0x56,0x56,0xf9,
+       0xf9,0xf9,0xf9,0xfa,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xfa,0xf9,0xf9,0x56,
+       0xf9,0x56,0x56,0xf9,0x2b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+       0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+       0x00,0x00,0x00,0xfb,0xfc,0xfc,0xfb,0xfb,0xfb,0x81,0xf9,0xfa,0xfa,0xf9,0x56,0x56,
+       0xf9,0x56,0xf9,0x56,0x56,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,
+       0xf9,0xfa,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0x56,0x56,0xfa,
+       0x56,0x56,0x56,0xf9,0xf9,0x56,0x56,0x56,0xf9,0x56,0x56,0xf9,0x56,0xf9,0x56,0xf9,
+       0x56,0xf9,0xf9,0x56,0xf9,0x56,0x56,0x56,0xf9,0x56,0xfa,0xf9,0xf9,0x56,0x56,0x56,
+       0xf9,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xfa,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0x56,0x56,
+       0x56,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xfa,0x56,0xf9,0x56,
+       0x56,0xfa,0xf9,0xf9,0x56,0xf9,0x56,0x56,0x56,0xfa,0x56,0x56,0x56,0xfa,0xf9,0x56,
+       0x56,0x56,0xf9,0x56,0x56,0xf9,0x56,0x56,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,
+       0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0xfc,0xff,0xff,0xab,0xfc,0xab,
+       0xfb,0xfb,0xfb,0xaa,0x80,0xfb,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
+       0x80,0x80,0xff,0x2b,0xfa,0xf9,0xf9,0xfa,0xfa,0xf9,0xfa,0xfa,0xf9,0xfa,0xfa,0xfa,
+       0xf9,0xf9,0xf9,0xfa,0xfa,0xf9,0xf9,0xfa,0xfa,0xfa,0xfa,0xfa,0xf9,0xf9,0x56,0x56,
+       0x56,0x56,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xfa,0xf9,0x56,0x56,0x56,0xf9,0x56,0xf9,
+       0x56,0x56,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xfa,
+       0x56,0x56,0x56,0x56,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xfa,0x56,0x56,0xf9,0xf9,
+       0xf9,0x56,0xf9,0xf9,0xfa,0xfa,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0xfa,0xfa,0xfa,
+       0xfa,0xf9,0xfa,0xf9,0xf9,0xfa,0xf9,0xf9,0xfa,0xf9,0xfa,0xf9,0xf9,0x56,0xf9,0xf9,
+       0x56,0x56,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0x56,0x56,
+       0xf9,0xf9,0x56,0xf9,0x56,0xf9,0x56,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0x56,
+       0x56,0x56,0x56,0x56,0xf9,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+       0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+       0x00,0x00,0x00,0xf6,0xfc,0xfc,0xfc,0xfb,0xfb,0x81,0x81,0xfa,0xfa,0xfa,0xf9,0x56,
+       0xfa,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0x56,0xf9,0x56,0x56,0xf9,0x56,0x56,0xf9,0xf9,
+       0x56,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xfa,0x56,0x56,0x56,0x56,0x56,0x56,0xf9,
+       0xf9,0x56,0xf9,0xfa,0xfa,0x56,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xfa,0xf9,0xfa,
+       0xf9,0xf9,0xfa,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0x56,0xf9,0x56,
+       0x56,0xf9,0x56,0xfa,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xfa,0xf9,0xf9,0x56,0x56,
+       0x56,0xf9,0x56,0xf9,0x56,0x56,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0xf9,
+       0x56,0xf9,0xf9,0x56,0x56,0x56,0x56,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xfa,0x56,
+       0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xfa,0xfa,0xfa,0xf9,0xf9,0xfa,0xf9,0x56,0xf9,
+       0xf9,0x56,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xfc,0xff,0xff,0xab,0xab,
+       0xab,0xab,0xfb,0xaa,0x81,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
+       0x80,0x80,0x80,0xff,0x2b,0xf9,0xfa,0xfa,0xfa,0xf9,0xf9,0xfa,0xfa,0xf9,0xf9,0xfa,
+       0xfa,0xf9,0xfa,0xfa,0xfa,0xfa,0xf9,0xfa,0xfa,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0x56,
+       0x56,0x56,0x56,0xf9,0xf9,0x56,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,
+       0xf9,0x56,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0x56,0x56,0x56,0xf9,
+       0xf9,0x56,0x56,0xf9,0xf9,0x56,0x56,0x56,0xfa,0x56,0x56,0xf9,0xf9,0x56,0xfa,0xf9,
+       0xf9,0xfa,0x56,0xfa,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xfa,0xf9,0xf9,0xf9,0xfa,0xfa,
+       0x81,0xfa,0xf9,0xf9,0xfa,0xfa,0xf9,0xf9,0xfa,0xfa,0xf9,0xf9,0xf9,0xf9,0x56,0x56,
+       0x56,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xfa,0x56,0x56,0xf9,0x56,0xf9,0x56,
+       0xfa,0xf9,0xfa,0x56,0xf9,0x56,0xf9,0x56,0x56,0xf9,0x56,0x56,0x56,0xf9,0xf9,0x56,
+       0x56,0xf9,0xf9,0xf9,0x56,0xf9,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+       0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+       0x00,0x00,0x00,0x00,0xf8,0xfc,0xfc,0xfc,0xfb,0xfb,0x81,0xfa,0xfa,0xfa,0xf9,0x56,
+       0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xf9,0xf9,0xf9,
+       0xf9,0xf9,0x56,0xf9,0x56,0x56,0x56,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0x56,
+       0x56,0xfa,0x56,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0xfa,0x56,0xf9,
+       0x56,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0x56,
+       0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,
+       0x56,0xfa,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xfa,0x56,0xf9,0x56,0xf9,
+       0x56,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xf9,0x56,
+       0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0xfa,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xf9,0xf9,0x56,
+       0x56,0xf9,0xf9,0xfa,0xf9,0x56,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xfc,0xff,0xff,0xfc,
+       0xfc,0xfb,0xaa,0xfb,0xfb,0xfb,0xaa,0xfb,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
+       0x80,0x80,0x80,0x80,0xff,0x2b,0xfa,0xfa,0xfa,0xfa,0x81,0xfa,0xfa,0xfa,0xf9,0xf9,
+       0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0x56,0x56,0x56,
+       0x56,0x56,0xf9,0x56,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xfa,0xf9,
+       0x56,0xf9,0xf9,0xfa,0xf9,0x56,0xfa,0x56,0x56,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xf9,
+       0xfa,0xf9,0x56,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0x56,0xf9,0x56,
+       0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0x56,0x56,0x56,0x56,0xf9,0xf9,0xf9,0xfa,0x81,
+       0xfa,0xfa,0xfa,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0xfa,0xfa,0xf9,0xf9,0xf9,0xf9,0x56,
+       0x56,0x56,0x56,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xfa,0x56,0xf9,0xf9,0x56,0xfa,0xf9,
+       0xf9,0xf9,0x56,0x56,0xf9,0x56,0xf9,0x56,0x56,0x56,0x56,0x56,0x56,0xf9,0xfa,0xf9,
+       0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+       0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+       0x00,0x00,0x00,0x00,0x00,0x56,0xfc,0xfc,0xfc,0xfb,0x81,0x81,0xfa,0xf9,0xf9,0xf9,
+       0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xfa,0xf9,0x56,0xf9,0xf9,0xfa,0xf9,0x56,0xfa,
+       0x56,0x56,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xf9,0xfa,0xf9,0x56,0xf9,0xf9,0xf9,0xfa,
+       0xf9,0xf9,0xf9,0x56,0x56,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,
+       0x56,0x56,0x56,0x56,0xf9,0x56,0x56,0xf9,0xfa,0x56,0xf9,0xf9,0x56,0xf9,0x56,0x56,
+       0x56,0xf9,0xf9,0xf9,0x56,0x56,0x56,0x56,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,
+       0x56,0xfa,0xf9,0xf9,0x56,0xf9,0x56,0xfa,0xf9,0x56,0xfa,0x56,0x56,0xf9,0x56,0xf9,
+       0x56,0x56,0xf9,0xfa,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0x56,0xf9,0xf9,
+       0x56,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0x56,0x56,0x56,0xf9,0x56,
+       0x56,0xf9,0xfa,0x56,0xf9,0x56,0x56,0xf9,0xf9,0x56,0x56,0x56,0xfa,0xfc,0xff,0xff,
+       0xfc,0xab,0xab,0xab,0xfb,0xfb,0xaa,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
+       0x80,0x80,0x80,0x80,0x80,0xff,0x2b,0xf9,0xf9,0xfa,0xf9,0xf9,0xfa,0xf9,0xfa,0xf9,
+       0xfa,0xfa,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xf8,0xf9,0xf9,
+       0x56,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0x56,0xf9,0xfa,0x56,
+       0x56,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xf9,0x56,0xfa,0xf9,0x56,0x56,0x56,0xf9,0xfa,
+       0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,
+       0x56,0x56,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0x56,0x56,0xf9,0xfa,0xf9,0xf9,0xf9,0xfa,
+       0xfa,0xf9,0xfa,0xfa,0xf9,0xfa,0xfa,0xfa,0xf9,0xfa,0xfa,0x56,0xf9,0xf9,0xfa,0xf9,
+       0x56,0x56,0xf9,0xf9,0x56,0x56,0xf9,0x56,0xf9,0xfa,0x56,0x56,0xf9,0xf9,0xf9,0xf9,
+       0x56,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xfa,0x56,0xf9,0xfa,0xf9,0xf9,
+       0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+       0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+       0x00,0x00,0x00,0x00,0x00,0x00,0x56,0xfc,0xfc,0xfb,0x81,0x81,0x81,0xfa,0xfa,0xf9,
+       0xfa,0xf9,0x56,0x56,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0x56,0x56,0x56,
+       0xf9,0x56,0xfa,0xf9,0x56,0x56,0x56,0xf9,0xfa,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,
+       0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0x56,0x56,0xf9,0x56,0x56,0xf9,0x56,
+       0xf9,0x56,0x56,0xfa,0xf9,0xf9,0xf9,0x56,0xfa,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,
+       0xf9,0xf9,0x56,0xfa,0x56,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,0x56,0xf9,
+       0x56,0x56,0xfa,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xf9,0xf9,0xf9,
+       0x56,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0x56,0xf9,
+       0xf9,0xfa,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0x56,0x56,0xfa,0xf9,0xf9,
+       0x56,0xf9,0xfa,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xfc,0xff,
+       0xff,0xab,0xfc,0xab,0xfb,0xfb,0xaa,0x80,0xfb,0x80,0xfb,0x80,0x80,0x80,0x80,0x80,
+       0x80,0x80,0x80,0x80,0x80,0x80,0xff,0x2b,0xf9,0xfa,0xfa,0xf9,0xf9,0xfa,0xf9,0xfa,
+       0xf9,0xf9,0xfa,0xf9,0xf9,0xfa,0xf9,0xfa,0xf9,0x56,0xf9,0x56,0x56,0x56,0x56,0x56,
+       0x56,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0xfa,0x56,0x56,0xf9,0xf9,0x56,0x56,0xf9,
+       0x56,0x56,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0x56,0xf9,0xf9,0x56,0x56,
+       0xf9,0x56,0xf9,0xf9,0x56,0x56,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xfa,0x56,
+       0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xfa,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xfa,0xfa,
+       0xfa,0xf9,0xfa,0xfa,0xfa,0xf9,0xfa,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0xfa,0xfa,
+       0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0x56,0xf9,0x56,0x56,0xf9,0x56,0x56,
+       0xf9,0x56,0xf9,0xf9,0xfa,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0x56,0x56,0x56,0x56,0x56,
+       0xf9,0x56,0x56,0xf9,0x56,0x56,0x56,0xf9,0x56,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+       0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+       0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0xfc,0xfc,0xfb,0xfb,0xfb,0x81,0xfa,0xfa,
+       0xfa,0xfa,0x56,0x56,0xf9,0xf9,0x56,0x56,0xfa,0x56,0x56,0xf9,0x56,0x56,0xf9,0xf9,
+       0xf9,0xf9,0xf9,0xfa,0x56,0xf9,0xf9,0x56,0x56,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xf9,
+       0x56,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xfa,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,
+       0xf9,0x56,0x56,0xf9,0x56,0xf9,0x56,0xf9,0xfa,0xf9,0x56,0x56,0xf9,0x56,0x56,0xf9,
+       0x56,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0xfa,0xf9,0x56,0xf9,
+       0xf9,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xfa,0xf9,0xf9,
+       0x56,0xf9,0x56,0xf9,0x56,0xf9,0x56,0x56,0xf9,0x56,0x56,0x56,0xf9,0x56,0xf9,0x56,
+       0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xf9,0xf9,
+       0xf9,0xf9,0xfa,0xf9,0x56,0x56,0xf9,0x56,0x56,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xfb,
+       0xff,0xff,0xab,0xab,0xfb,0xab,0xfb,0xfb,0xfb,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
+       0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xff,0x2b,0xf9,0xfa,0xfa,0xfa,0xf9,0xfa,0xfa,
+       0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,
+       0x56,0x56,0xf9,0x56,0xf9,0x56,0x56,0xf9,0xf9,0x56,0x56,0x56,0x56,0x56,0xf9,0xfa,
+       0xfa,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xfa,0x56,0xf9,0xf9,0x56,0x56,0x56,
+       0xf9,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,0x56,0xf9,
+       0xf9,0x56,0xf9,0x56,0xf9,0x56,0xfa,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,
+       0xf9,0xf9,0xf9,0xfa,0xfa,0xfa,0xfa,0xf9,0xf9,0xfa,0xfa,0xfa,0xf9,0xfa,0xfa,0xfa,
+       0xf9,0x56,0x56,0xf9,0x56,0x56,0x56,0x56,0xf9,0x56,0xfa,0xfa,0x56,0xf9,0x56,0xf9,
+       0xf9,0x56,0xf9,0x56,0xfa,0x56,0xf9,0x56,0x56,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,
+       0x56,0xfa,0x56,0x56,0xf9,0xfa,0xf9,0x56,0xfa,0xf9,0x00,0x00,0x00,0x00,0x00,0x00,
+       0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+       0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf6,0xfc,0xfc,0xfb,0xfb,0x81,0xfa,0xfa,
+       0xf9,0xf9,0xf9,0x56,0x56,0x56,0x56,0xf9,0xf9,0xfa,0x56,0xf9,0x56,0xf9,0xf9,0xf9,
+       0x56,0xf9,0xfa,0x56,0xf9,0xf9,0x56,0x56,0x56,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xf9,
+       0xf9,0xf9,0xf9,0xf9,0x56,0x56,0x56,0x56,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0x56,0xf9,
+       0xfa,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,
+       0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0x56,0x56,0xf9,0xf9,0x56,0x56,0x56,
+       0x56,0xf9,0x56,0xfa,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0x56,0xfa,0x56,0xf9,
+       0x56,0x56,0x56,0x56,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0x56,
+       0x56,0x56,0xfa,0x56,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xfa,0x56,0xf9,0xf9,0xf9,0x56,
+       0x56,0xf9,0x56,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0x56,
+       0xfc,0xff,0xff,0xfc,0xfc,0xab,0xaa,0xfb,0xaa,0x80,0xaa,0xfb,0x80,0x80,0x80,0x80,
+       0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xff,0x2b,0xf9,0xfa,0xfa,0xf9,0xfa,0xfa,
+       0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xf9,0x56,0x56,0x56,0xf9,
+       0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0x56,0x56,0x56,0x56,0x56,0x56,0xfa,0xfa,0xf9,
+       0xf9,0x56,0xf9,0xf9,0xfa,0xf9,0x56,0x56,0x56,0xf9,0xf9,0x56,0x56,0x56,0x56,0x56,
+       0xf9,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xfa,0xf9,0x56,0x56,0xf9,0xf9,
+       0xfa,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xfa,0xf9,0xf9,0xf9,0xf9,
+       0xfa,0xf9,0xf9,0xf9,0x81,0x81,0xfa,0xfa,0xf9,0xf9,0xf9,0xfa,0xf9,0xfa,0xf9,0xf9,
+       0xf9,0xf9,0x56,0x56,0x56,0x56,0x56,0x56,0xfa,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xfa,
+       0xf9,0xf9,0x56,0x56,0xf9,0x56,0x56,0xf9,0x56,0x56,0xf9,0x56,0xf9,0xf9,0x56,0xf9,
+       0xf9,0xf9,0x56,0x56,0x56,0xf9,0xf9,0x56,0xfa,0xf9,0x56,0x00,0x00,0x00,0x00,0x00,
+       0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+       0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x81,0xfc,0xfb,0xfb,0x81,0xfa,
+       0xf9,0xf9,0x56,0x56,0x56,0x56,0xfa,0xfa,0xf9,0xf9,0x56,0xf9,0xf9,0xfa,0xf9,0x56,
+       0x56,0x56,0xf9,0xf9,0x56,0x56,0x56,0x56,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0x56,
+       0xf9,0xf9,0x56,0xf9,0xfa,0x56,0x56,0xf9,0xf9,0xfa,0xf9,0x56,0xf9,0x56,0x56,0xf9,
+       0xf9,0xf9,0x56,0x56,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,
+       0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0x56,0x56,0x56,0x56,0x56,
+       0x56,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,
+       0xf9,0x56,0x56,0x56,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xfa,0x56,
+       0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xfa,0xf9,
+       0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xfa,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0x56,
+       0xf9,0xfc,0xff,0xff,0xfc,0xab,0xab,0xfb,0xfb,0xfb,0xfb,0xfb,0x80,0x80,0x80,0x80,
+       0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xff,0x2b,0xf9,0xfa,0xf9,0xf9,0x81,
+       0xf9,0xf9,0xfa,0xfa,0xf9,0xfa,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0x56,0x56,0xf9,
+       0xf9,0x56,0xf9,0x56,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0x56,
+       0x56,0x56,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0x56,
+       0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,
+       0xf9,0xf9,0x56,0xf9,0x56,0x56,0xf9,0xfa,0x56,0xf9,0x56,0xfa,0xf9,0x56,0xf9,0x56,
+       0xf9,0xf9,0xfa,0x56,0x81,0xfa,0xfa,0xf9,0xf9,0xfa,0xfa,0xfa,0xfa,0xfa,0xf9,0xf9,
+       0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0x56,
+       0xf9,0x56,0x56,0x56,0xfa,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0x56,0xf9,0xf9,0x56,0xf9,
+       0xf9,0x56,0x56,0xfa,0xf9,0x56,0xfa,0x56,0x56,0xf9,0xf9,0xf9,0xf6,0x00,0x00,0x00,
+       0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+       0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2b,0xfc,0xfb,0x81,0x81,
+       0xfa,0xf9,0xfa,0xf9,0xf9,0xf9,0xfa,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0x56,
+       0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,
+       0xf9,0xfa,0xf9,0x56,0xfa,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xf9,
+       0xfa,0x56,0xf9,0x56,0xfa,0xf9,0x56,0x56,0x56,0xf9,0x56,0xf9,0x56,0xf9,0xfa,0xf9,
+       0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,
+       0xf9,0xfa,0xf9,0x56,0x56,0x56,0xf9,0x56,0xf9,0x56,0x56,0x56,0x56,0xfa,0xf9,0x56,
+       0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xfa,0x56,0x56,0xfa,0x56,
+       0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xfa,
+       0x56,0xf9,0x56,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xfa,0xf9,0xf9,
+       0xf9,0xf9,0xfc,0xff,0xff,0xab,0xfc,0xab,0xfb,0xaa,0xfb,0x80,0x80,0x80,0xfb,0x80,
+       0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xff,0x2b,0xfa,0xfa,0xf9,0xf9,
+       0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0x56,0x56,0x56,0xf9,0x56,0x56,0x56,0xf9,
+       0x56,0xf9,0x56,0x56,0xf9,0x56,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,
+       0x56,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xf9,0xfa,0xf9,0xf9,0x56,0x56,0xfa,0xf9,
+       0xfa,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0x56,0x56,0xfa,0x56,0x56,0xf9,
+       0x56,0x56,0xfa,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0x56,0xf9,0x56,0x56,
+       0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xfa,0xf9,0xf9,0xfa,0x81,0xf9,0xf9,0xf9,0xfa,0xf9,
+       0xf9,0xfa,0xfa,0xf9,0x56,0x56,0x56,0x56,0xf9,0xfa,0x56,0x56,0xf9,0x56,0xf9,0xf9,
+       0xf9,0x56,0x56,0xf9,0xfa,0xf9,0x56,0x56,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,
+       0x56,0xfa,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xfa,0x56,0x56,0x2b,0x00,0x00,
+       0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+       0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x56,0xfb,0xfb,
+       0x81,0xfa,0xfa,0xfa,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xf9,0x56,0xf9,0xf9,0x56,
+       0x56,0xf9,0xfa,0xf9,0xf9,0x56,0x56,0xfa,0xf9,0xfa,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,
+       0x56,0x56,0xf9,0x56,0x56,0xf9,0x56,0x56,0xf9,0x56,0x56,0xfa,0x56,0x56,0xf9,0xf9,
+       0xf9,0xf9,0x56,0x56,0xf9,0x56,0xf9,0x56,0x56,0xf9,0x56,0xf9,0x56,0x56,0x56,0x56,
+       0x56,0x56,0xf9,0xfa,0x56,0x56,0x56,0xf9,0x56,0xf9,0xf9,0xfa,0x56,0xf9,0xf9,0xf9,
+       0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xfa,0xf9,0x56,
+       0x56,0xf9,0xf9,0xfa,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xf9,
+       0x56,0x56,0xf9,0x56,0x56,0xf9,0x56,0x56,0xf9,0xf9,0xfa,0xf9,0x56,0x56,0xf9,0x56,
+       0xf9,0x56,0x56,0xf9,0x56,0xf9,0x56,0x56,0x56,0x56,0x56,0x56,0xfa,0xf9,0x56,0x56,
+       0x56,0xf9,0x56,0xfc,0xff,0xff,0xfc,0xab,0xab,0xfb,0xfb,0xaa,0xfb,0xaa,0x80,0x80,
+       0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xff,0x2b,0xf9,0xfa,0xf9,
+       0xfa,0xfa,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0x56,0x56,0x56,0xf9,0x56,
+       0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0x56,0x56,0x56,0xf9,0xf9,
+       0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0x56,0x56,0xf9,0xf9,
+       0xf9,0x56,0x56,0xf9,0xfa,0x56,0x56,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,
+       0x56,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0x56,
+       0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x81,0xfa,0xfa,0xfa,0xfa,0xf9,0xf9,0xf9,0xf9,0xfa,
+       0xf9,0xf9,0xfa,0xf9,0x56,0x56,0x56,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,
+       0x56,0xf9,0x56,0x56,0xf9,0xf9,0x56,0x56,0x56,0x56,0xfa,0x56,0xf9,0x56,0x56,0xfa,
+       0x56,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf8,0x00,
+       0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+       0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf5,0xfa,
+       0xfb,0x81,0x81,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0xfa,0xf9,0xf9,0x56,0xf9,
+       0x56,0x56,0xf9,0xf9,0x56,0x56,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xfa,0x56,0x56,
+       0xf9,0x56,0xf9,0x56,0x56,0xf9,0xfa,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0x56,
+       0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,
+       0xfa,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0x56,
+       0x56,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,
+       0x56,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0x56,0xf9,
+       0xfa,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xf9,0xf9,0xf9,
+       0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0x56,0xf9,0x56,0x56,
+       0x56,0xf9,0xfa,0x56,0xfc,0xff,0xff,0xfc,0xab,0xfb,0xab,0xab,0x80,0xfb,0x80,0xfb,
+       0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xff,0x2b,0xfa,0xfa,
+       0xfa,0xfa,0xfa,0xf9,0xfa,0xfa,0xfa,0xf9,0xfa,0xf9,0xf9,0x56,0x56,0x56,0x56,0xf9,
+       0xfa,0xf9,0x56,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xfa,0x56,0x56,0x56,0xf9,0xf9,
+       0xf9,0x56,0x56,0xf9,0x56,0xf9,0x56,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xfa,0xf9,0xf9,
+       0xf9,0x56,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0x56,
+       0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0x56,0x56,0x56,0xf9,0xf9,0xf9,0x56,0x56,
+       0xf9,0x56,0xfa,0xf9,0xfa,0xfa,0xfa,0x81,0xfa,0xfa,0xfa,0xfa,0xf9,0xfa,0xfa,0xfa,
+       0xfa,0xf9,0xf9,0xfa,0xf9,0x56,0x56,0x56,0x56,0x56,0xf9,0xf9,0x56,0x56,0xf9,0x56,
+       0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xfa,0xf9,0xf9,0x56,0xf9,0x56,0x56,
+       0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xfa,0xf9,0x56,0xf9,0xf9,
+       0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+       0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+       0x00,0x56,0x81,0xfa,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0x56,0x56,0xf9,
+       0xf9,0x56,0x56,0xf9,0xf9,0x56,0xfa,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xf9,0xf9,
+       0x56,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,
+       0xf9,0x56,0x56,0x56,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,
+       0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xfa,0x56,0x56,0xf9,0xf9,0x56,0x56,
+       0x56,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0x56,0xf9,0x56,0xf9,0x56,0x56,0xf9,0xf9,
+       0x56,0xfa,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,
+       0xfa,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,0x56,0xf9,0xf9,
+       0xf9,0x56,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0x56,0xf9,0xf9,0xf9,0x56,
+       0xfa,0xf9,0xf9,0xf9,0xf9,0xfb,0xff,0xff,0xab,0xfc,0xab,0xab,0xfb,0xfb,0xaa,0xfb,
+       0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xff,0x2b,0xf9,
+       0xf9,0xfa,0xfa,0xf9,0xf9,0xf9,0xf9,0x56,0xfa,0xfa,0x56,0x56,0x56,0x56,0x56,0x56,
+       0xf9,0x56,0x56,0x56,0xf9,0xf9,0xf9,0xfa,0xf9,0x56,0x56,0xf9,0x56,0xf9,0xfa,0xf9,
+       0xf9,0xfa,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,
+       0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,
+       0x56,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,
+       0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0xfa,0xf9,0xfa,0xfa,0xfa,0xfa,0xf9,0xf9,0xf9,
+       0xf9,0xf9,0xf9,0x56,0xfa,0xf9,0x56,0x56,0x56,0xf9,0xf9,0xfa,0xf9,0x56,0x56,0xfa,
+       0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,
+       0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0x56,0xf9,
+       0xf9,0xf6,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+       0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+       0x00,0x00,0x00,0xf5,0xf9,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0x56,0x56,0xf9,0xf9,0xfa,
+       0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,
+       0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xf9,0xf9,0xf9,
+       0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,
+       0xf9,0x56,0x56,0x56,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xf9,0x56,0x56,0xf9,0xf9,0x56,
+       0xf9,0x56,0xfa,0xf9,0xf9,0xf9,0x56,0x56,0xfa,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,
+       0xf9,0x56,0x56,0xf9,0x56,0x56,0xf9,0xf9,0x56,0x56,0xf9,0x56,0xf9,0xf9,0x56,0x56,
+       0xf9,0xf9,0x56,0x56,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,
+       0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xfa,0x56,0x56,0xf9,0xf9,0x56,0x56,0xf9,0x56,0xf9,
+       0x56,0xf9,0x56,0x56,0x56,0x56,0xfc,0xff,0xff,0xfc,0xab,0xab,0xfb,0xfb,0xaa,0x80,
+       0x80,0x80,0xfb,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xff,0x2b,
+       0xfa,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0x56,0xf9,0x56,0x56,0xf9,
+       0xf9,0xf9,0xf9,0x56,0x56,0x56,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,
+       0xf9,0x56,0xf9,0x56,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0x56,0x56,0xf9,
+       0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0x56,0x56,
+       0x56,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0x56,
+       0x56,0x56,0xf9,0x56,0xfa,0xf9,0xf9,0xf9,0xfa,0xf9,0xfa,0xfa,0xf9,0xf9,0xfa,0xfa,
+       0xf9,0xfa,0xfa,0xf9,0xfa,0xfa,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0x56,0xf9,
+       0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,
+       0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0x56,0x56,
+       0xf9,0xf9,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+       0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+       0x00,0x00,0x00,0x00,0x00,0xfa,0x81,0x81,0xfa,0xf9,0xf9,0xf9,0x56,0xf9,0xfa,0x56,
+       0xf9,0x56,0xf9,0xfa,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,
+       0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,
+       0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xf9,0xf9,0x56,0xfa,0x56,0xf9,
+       0xf9,0x56,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xfa,0x56,
+       0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,
+       0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,
+       0xf9,0x56,0x56,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xf9,0xf9,
+       0xf9,0x56,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xf9,0x56,0xf9,
+       0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xfc,0xff,0xff,0xab,0xfc,0xab,0xab,0xfb,0xfb,
+       0xfb,0xaa,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xff,
+       0x2b,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xfa,0xfa,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,
+       0x56,0x56,0xfa,0x56,0x56,0xf9,0x56,0xf9,0x56,0xfa,0x56,0x56,0xf9,0xf9,0x56,0x56,
+       0xf9,0xf9,0xf9,0x56,0x56,0xf9,0x56,0x56,0x56,0x56,0x56,0x56,0x56,0x56,0xf9,0xf9,
+       0xf9,0xf9,0x56,0x56,0xf9,0xfa,0xf9,0xf9,0xfa,0xf9,0x56,0x56,0xf9,0xf9,0x56,0x56,
+       0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0x56,0xf9,0xf9,0x56,0xfa,0x56,
+       0x56,0xf9,0xf9,0x56,0x56,0xfa,0xf9,0xf9,0xf9,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xf9,
+       0xf9,0xf9,0xfa,0xfa,0xf9,0xfa,0xf9,0x56,0x56,0x56,0x56,0x56,0xf9,0xf9,0x56,0x56,
+       0xf9,0xf9,0x56,0x56,0x56,0x56,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xf9,
+       0xfa,0xf9,0xf9,0xfa,0xf9,0xf9,0xfa,0xf9,0x56,0x56,0xf9,0xf9,0x56,0x56,0xf9,0x56,
+       0x56,0xf9,0xfa,0xf9,0xf5,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+       0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+       0x00,0x00,0x00,0x00,0x00,0xf7,0x81,0x81,0xfa,0xfa,0xfa,0xf9,0xf9,0x56,0xf9,0xf9,
+       0x56,0x56,0xf9,0x56,0x56,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xfa,0xf9,
+       0xf9,0xfa,0xf9,0x56,0x56,0xf9,0xf9,0x56,0x56,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0x56,
+       0x56,0x56,0xf9,0x56,0xf9,0xf9,0x56,0xfa,0x56,0x56,0xf9,0x56,0x56,0x56,0xfa,0x56,
+       0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,
+       0x56,0x56,0xf9,0x56,0x56,0xf9,0x56,0x56,0x56,0xf9,0xf9,0x56,0x56,0x56,0x56,0xf9,
+       0x56,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xfa,0x56,0xf9,0xfa,0x56,0x56,0xf9,
+       0x56,0x56,0x56,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xf9,0x56,0xf9,0xf9,
+       0x56,0xfa,0x56,0x56,0xf9,0x56,0xf9,0x56,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,
+       0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xfc,0xff,0xff,0xfc,0xfc,0xab,0xfb,0xfb,
+       0xaa,0xfb,0x80,0xfb,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
+       0xff,0x2b,0xf9,0xf9,0xfa,0xfa,0xf9,0xfa,0xfa,0xfa,0xf9,0xfa,0xfa,0xf9,0x56,0x56,
+       0x56,0x56,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0x56,0x56,0x56,0x56,0x56,
+       0x56,0xf9,0xfa,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0x56,0xf9,0xfa,
+       0xf9,0x56,0x56,0xfa,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0x56,0x56,
+       0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0x56,0x56,0x56,
+       0x56,0xf9,0xf9,0xf9,0xf9,0xfa,0xfa,0xf9,0xf9,0xf9,0xf9,0xfa,0xfa,0xfa,0xfa,0xf9,
+       0xfa,0xf9,0xfa,0xfa,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0x56,0x56,0xf9,0xfa,0x56,0xf9,
+       0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,
+       0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0x56,0x56,0xf9,0xf9,
+       0xf9,0xf9,0xf9,0xfa,0xf9,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+       0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+       0x00,0x00,0x00,0x00,0x00,0x00,0x81,0xfb,0x81,0xfa,0x81,0x81,0xf9,0xf9,0xf9,0xf9,
+       0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xfa,0xf9,0x56,0x56,0xfa,0xf9,0x56,0xf9,
+       0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xfa,0xf9,0xf9,
+       0xf9,0xf9,0xf9,0xf9,0x56,0x56,0x56,0x56,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,
+       0x56,0x56,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0x56,
+       0x56,0x56,0x56,0x56,0x56,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,
+       0xf9,0x56,0xf9,0xf9,0xfa,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,
+       0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0x56,0x56,
+       0x56,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0x56,0xfa,0xfa,0x56,0x56,0x56,0x56,0xf9,0xf9,
+       0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xfc,0xff,0xff,0xab,0xab,0xab,0xfb,
+       0xaa,0xfb,0x80,0xfb,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
+       0x80,0xff,0x2b,0xfa,0xf9,0xfa,0xf9,0xfa,0xfa,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,
+       0x56,0xf9,0xf9,0xfa,0x56,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,
+       0xf9,0xfa,0xf9,0xf9,0x56,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,
+       0xf9,0xf9,0x56,0xfa,0xf9,0x56,0x56,0x56,0x56,0x56,0x56,0x56,0x56,0xf9,0xf9,0x56,
+       0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0x56,0x56,0x56,0xf9,0x56,0xfa,0xfa,
+       0xf9,0xf9,0x56,0xf9,0x56,0xf9,0xfa,0x56,0xf9,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,
+       0xfa,0xf9,0xf9,0xfa,0xfa,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0x56,
+       0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xfa,
+       0x56,0x56,0x56,0x56,0x56,0x56,0x56,0x56,0x56,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,
+       0x56,0xf9,0xf9,0xfa,0x56,0xf9,0xfa,0xf5,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+       0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+       0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0xfc,0xfb,0xfb,0xfb,0x81,0xfa,0xf9,0xf9,0xf9,
+       0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xfa,0xf9,0x56,0x56,
+       0x56,0x56,0x56,0x56,0x56,0x56,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,
+       0x56,0xf9,0x56,0x56,0x56,0xf9,0x56,0xfa,0xfa,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0xf9,
+       0x56,0x56,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0x56,
+       0x56,0x56,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0x56,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,
+       0xf9,0x56,0x56,0xfa,0xf9,0x56,0x56,0xf9,0xfa,0x56,0x56,0x56,0x56,0x56,0x56,0x56,
+       0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,0x56,0x56,0x56,0xf9,0x56,
+       0x56,0xfa,0xf9,0x56,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xfa,0xf9,0xf9,0x56,
+       0x56,0x56,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xfb,0xff,0xff,0xfc,0xab,0xfb,
+       0xab,0xfb,0xaa,0xfb,0x80,0xaa,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
+       0x80,0x80,0xff,0x2b,0xfa,0xf9,0xfa,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,
+       0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xfa,0xfa,0x56,0x56,0x56,0xfa,0xf9,
+       0xf9,0xf9,0xf9,0x56,0x56,0x56,0x56,0xf9,0xf9,0x56,0xf9,0x56,0x56,0x56,0xf9,0x56,
+       0xf9,0xf9,0x56,0x56,0xfa,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,
+       0xf9,0x56,0xf9,0x56,0x56,0x56,0xf9,0xf9,0x56,0x56,0x56,0x56,0xf9,0xf9,0xf9,0x56,
+       0xf9,0xf9,0xf9,0xf9,0x56,0xfa,0xf9,0x56,0xf9,0xf9,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,
+       0xfa,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0x56,0xf9,0x56,0x56,
+       0x56,0x56,0xfa,0x56,0xf9,0x56,0xf9,0x56,0x56,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xfa,
+       0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,
+       0x56,0x56,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+       0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+       0x00,0x00,0x00,0x00,0x00,0x00,0xf5,0xfc,0xfc,0xfc,0xfb,0x81,0xfa,0xfa,0xf9,0xf9,
+       0xfa,0x56,0x56,0xf9,0x56,0x56,0x56,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xfa,0xf9,0x56,
+       0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xfa,0xf9,0x56,0xf9,0x56,0x56,0x56,0xf9,
+       0xf9,0x56,0x56,0x56,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xfa,0xfa,
+       0x56,0x56,0x56,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0x56,0x56,0xf9,0xf9,
+       0x56,0x56,0xfa,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0x56,0x56,0xfa,0x56,0xf9,0x56,0xf9,
+       0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xfa,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,
+       0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xf9,
+       0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0x56,0xfa,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,
+       0xf9,0xf9,0xfa,0xf9,0x56,0x56,0x56,0x56,0xf9,0xf9,0x56,0xfc,0xff,0xff,0xac,0xab,
+       0xab,0xfb,0xfb,0xfb,0xaa,0x80,0x81,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
+       0x80,0x80,0x80,0xff,0x2b,0xf9,0xfa,0xfa,0xfa,0xfa,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,
+       0xfa,0xfa,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0x56,0xf9,
+       0x56,0x56,0x56,0xf9,0x56,0x56,0xfa,0xf9,0xfa,0x56,0x56,0x56,0xf9,0x56,0x56,0xf9,
+       0xf9,0x56,0xf9,0x56,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0xf9,
+       0xf9,0x56,0xfa,0xf9,0xfa,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0x56,
+       0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0xfa,
+       0x81,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0xfa,0xf9,0x56,0x56,0x56,0x56,0x56,
+       0x56,0xfa,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0x56,0x56,0xf9,0xf9,0x56,0x56,0xf9,0x56,
+       0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0x56,
+       0xf9,0xfa,0xfa,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xf7,0x00,0x00,0x00,0x00,0x00,
+       0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+       0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfa,0xfc,0xfc,0xfb,0x81,0x81,0xfa,0xfa,0xfa,
+       0xfa,0xfa,0xf9,0x56,0x56,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0x56,0xf9,
+       0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0x56,0xfa,0xf9,0xfa,0xf9,0xf9,
+       0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,
+       0x56,0x56,0xf9,0xf9,0x56,0x56,0x56,0x56,0xf9,0xfa,0x56,0x56,0xf9,0x56,0x56,0xfa,
+       0xf9,0x56,0xf9,0xfa,0xf9,0x56,0x56,0xf9,0x56,0x56,0xfa,0xf9,0xf9,0xf9,0x56,0x56,
+       0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,
+       0x56,0x56,0xf9,0xf9,0x56,0xf9,0xfa,0xfa,0xf9,0x56,0x56,0xf9,0x56,0x56,0xf9,0xf9,
+       0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,
+       0xf9,0x56,0xf9,0xf9,0x56,0x56,0xf9,0x56,0x56,0xfa,0xf9,0x56,0xfc,0xff,0xff,0xfc,
+       0xab,0xfb,0xab,0xaa,0x80,0xfb,0xfb,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
+       0x80,0x80,0x80,0x80,0xff,0x2b,0xfa,0xfa,0xf9,0xf9,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,
+       0xfa,0xfa,0xf9,0xfa,0x56,0xf9,0xfa,0xf9,0xf9,0x56,0x56,0xf9,0x56,0x56,0xf9,0xf9,
+       0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xfa,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xf9,0x56,0xf9,
+       0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xf9,0x56,0x56,0x56,0x56,0xf9,0xf9,
+       0xf9,0xf9,0xf9,0x56,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,
+       0x56,0xf9,0xfa,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0xfa,0xf9,0xf9,0xf9,0xfa,0xfa,
+       0x81,0xfa,0xf9,0xf9,0xfa,0xfa,0xfa,0xfa,0xf9,0x56,0xfa,0x56,0x56,0x56,0x56,0xf9,
+       0x56,0xfa,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,
+       0xf9,0x56,0xf9,0x56,0xf9,0x56,0x56,0x56,0x56,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0x56,
+       0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xfa,0xf9,0xfa,0xfa,0xf9,0xf6,0x00,0x00,0x00,
+       0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+       0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0xac,0xfc,0xfc,0xfb,0xfb,0x81,0x81,0x81,
+       0xfa,0xf9,0x56,0xf9,0x56,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,
+       0x56,0x56,0xf9,0x56,0x56,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,0x56,0xf9,
+       0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xfa,0xf9,0xf9,0x56,0x56,
+       0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xfa,0xf9,
+       0xf9,0x56,0x56,0xfa,0x56,0x56,0xf9,0x56,0xf9,0x56,0xfa,0xf9,0xf9,0x56,0xf9,0x56,
+       0x56,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xf9,0x56,0x56,
+       0x56,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,
+       0xf9,0xf9,0xf9,0x56,0xf9,0xfa,0xf9,0x56,0xf9,0x56,0xf9,0x56,0x56,0xf9,0xf9,0x56,
+       0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xfa,0xf9,0xf9,0x56,0x56,0xfc,0xff,0xff,
+       0xab,0xfc,0xab,0xab,0xfb,0xfb,0xfb,0x80,0x80,0xfb,0x80,0x80,0x80,0x80,0x80,0x80,
+       0x80,0x80,0x80,0x80,0x80,0xff,0x2b,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0xfa,0xf9,
+       0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0x56,0x56,0xf9,0x56,0x56,0x56,0xf9,0xf9,0xf9,0xf9,
+       0x56,0x56,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0x56,
+       0x56,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0x56,0x56,0x56,0x56,0xf9,0xf9,0xf9,0x56,0xfa,
+       0xf9,0x56,0x56,0x56,0x56,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,0x56,0x56,
+       0xf9,0xf9,0x56,0x56,0xf9,0x56,0x56,0x56,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xfa,
+       0xfa,0xfa,0xf9,0xf9,0xfa,0x81,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0x56,
+       0x56,0xfa,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xf9,0x56,0x56,0xfa,
+       0xf9,0x56,0x56,0x56,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,
+       0xf9,0x56,0x56,0x56,0x56,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0xf5,0x00,
+       0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+       0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf6,0xfc,0xfc,0xfc,0xfc,0xfb,0x81,0x81,0x81,
+       0xfa,0xf9,0xf9,0x56,0xfa,0xf9,0x56,0xf9,0x56,0x56,0xf9,0x56,0x56,0xf9,0xf9,0xf9,
+       0x56,0x56,0x56,0x56,0xf9,0xf9,0xf9,0x56,0xfa,0xf9,0x56,0xf9,0x56,0x56,0x56,0x56,
+       0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,0x56,0x56,0xf9,0xf9,0x56,0x56,0xf9,0x56,0x56,
+       0x56,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xf9,0x56,0xfa,0x56,0x56,0xf9,0xfa,0x56,
+       0x56,0xf9,0x56,0x56,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xfa,0xf9,0xf9,0x56,0x56,0xf9,
+       0xf9,0x56,0xf9,0x56,0xf9,0x56,0x56,0x56,0xfa,0xf9,0xf9,0x56,0x56,0x56,0xf9,0x56,
+       0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0x56,0x56,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0x56,
+       0x56,0x56,0x56,0xf9,0xf9,0x56,0x56,0xf9,0x56,0x56,0x56,0xf9,0xf9,0x56,0xf9,0x56,
+       0xf9,0x56,0xf9,0x56,0xfa,0x56,0x56,0xf9,0xfa,0x56,0x56,0xf9,0x56,0x56,0xfc,0xff,
+       0xff,0xfc,0xab,0xab,0xfb,0xfb,0xaa,0x80,0xaa,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
+       0x80,0x80,0x80,0x80,0x80,0x80,0xff,0x2b,0xfa,0xfa,0xfa,0xfa,0xfa,0xf9,0xf9,0xf9,
+       0xf9,0xf9,0xf9,0xf9,0xfa,0xfa,0xfa,0x56,0xf9,0x56,0x56,0x56,0xfa,0xf9,0xf9,0x56,
+       0xf9,0xfa,0xfa,0xfa,0xf9,0x56,0x56,0xf9,0x56,0xf9,0x56,0x56,0xf9,0x56,0x56,0xf9,
+       0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0x56,0x56,0x56,0xf9,0xfa,0xf9,0xfa,0xf9,0xf9,0xf9,
+       0xf9,0x56,0x56,0xf9,0xfa,0xfa,0xf9,0xfa,0xf9,0x56,0x56,0x56,0x56,0x56,0x56,0x56,
+       0xf9,0xf9,0xf9,0x56,0xf9,0x56,0x56,0x56,0xfa,0xf9,0xf9,0xf9,0xfa,0xfa,0xfa,0x81,
+       0xfa,0x81,0x81,0xf9,0xfa,0xfa,0xfa,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0x56,
+       0x56,0x56,0xf9,0x56,0xf9,0x56,0x56,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,
+       0xf9,0x56,0x56,0x56,0xf9,0xf9,0xfa,0xf9,0xfa,0x56,0xf9,0xf9,0xf9,0x56,0xfa,0x56,
+       0x56,0xf9,0xf9,0xfa,0xf9,0xfa,0xf9,0x56,0x56,0x56,0x56,0x56,0xf9,0xf9,0xfa,0xf9,
+       0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+       0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf6,0xfc,0xac,0xfc,0xfc,0xfc,0x81,0x81,0xfa,
+       0xfa,0xfa,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0x56,
+       0x56,0x56,0xf9,0xfa,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xfa,0xf9,
+       0xfa,0xf9,0x56,0x56,0x56,0x56,0x56,0x56,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0x56,
+       0x56,0xfa,0xf9,0xf9,0x56,0xf9,0xfa,0xfa,0xf9,0xf9,0xfa,0xf9,0x56,0xf9,0xf9,0xf9,
+       0x56,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xfa,0x56,0x56,0x56,0xf9,0x56,0xf9,0x56,0x56,
+       0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0x56,0x56,0x56,0xf9,0xf9,0xfa,
+       0xf9,0xfa,0x56,0xf9,0x56,0x56,0xf9,0xf9,0xfa,0xf9,0xfa,0xf9,0x56,0x56,0x56,0x56,
+       0x56,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xf9,0xf9,0xfa,0xf9,0x56,0xf9,
+       0xfa,0xf9,0xfa,0xf9,0xf9,0xfa,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0x56,0xfa,0xfc,
+       0xff,0xff,0xab,0xfc,0xab,0xab,0xfb,0xfb,0xfb,0x80,0xfb,0x80,0x80,0x80,0x80,0x80,
+       0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xff,0x2b,0xfa,0xfa,0xf9,0xfa,0xf9,0xfa,0xfa,
+       0xf9,0xfa,0xf9,0xfa,0xfa,0xfa,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0x56,
+       0x56,0xfa,0x56,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,0x56,0x56,0xf9,0x56,0xf9,
+       0xf9,0xfa,0x56,0x56,0xf9,0x56,0x56,0x56,0x56,0xfa,0xf9,0xf9,0x56,0x56,0xf9,0x56,
+       0x56,0xfa,0xf9,0x56,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xfa,
+       0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0x56,0xfa,0xf9,0xf9,0x56,0xf9,0xfa,0xf9,0xf9,
+       0xfa,0xfa,0xfa,0xfa,0xf9,0xfa,0xfa,0xf9,0xf9,0xfa,0xf9,0xf9,0xfa,0x56,0xf9,0x56,
+       0x56,0xf9,0xf9,0x56,0x56,0x56,0x56,0x56,0xf9,0x56,0xf9,0xf9,0xfa,0x56,0x56,0xf9,
+       0x56,0x56,0x56,0x56,0xfa,0xf9,0xf9,0x56,0x56,0x56,0xf9,0x56,0xfa,0x56,0x56,0xf9,
+       0xf9,0x56,0x56,0xfa,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xfa,0xfa,0xfa,
+       0xfa,0xf9,0xf5,0x00,0x00,0x00,0x00,0x00,0x00,0xf5,0xf8,0x81,0xfa,0x81,0xfa,0xf8,
+       0xf5,0x00,0x00,0x00,0x00,0x00,0x00,0x2b,0xfc,0xfc,0xfc,0xfc,0xfc,0xfb,0x81,0x81,
+       0x81,0xfa,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0x56,0xf9,0xfa,0x56,0x56,0xf9,0x56,0x56,
+       0x56,0x56,0xfa,0xf9,0xf9,0x56,0x56,0xf9,0x56,0x56,0xfa,0xf9,0x56,0xf9,0xf9,0xf9,
+       0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0x56,0xf9,0x56,0x56,0xf9,
+       0xf9,0xf9,0xfa,0x56,0xf9,0x56,0xfa,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xfa,0xf9,
+       0x56,0x56,0xfa,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0x56,0x56,0x56,
+       0x56,0xf9,0x56,0xf9,0xf9,0xfa,0x56,0x56,0x56,0x56,0x56,0x56,0x56,0xfa,0xf9,0xf9,
+       0x56,0x56,0xf9,0x56,0x56,0xf9,0x56,0x56,0xfa,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,
+       0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0x56,0xf9,0xfa,0x56,0xf9,0x56,
+       0xfa,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,
+       0xfb,0xff,0xff,0xfc,0xab,0xab,0xfb,0xab,0x80,0xaa,0xfb,0x80,0x80,0x80,0x80,0x80,
+       0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xff,0x2b,0xfa,0xf9,0xfa,0xf9,0xf9,0xfa,
+       0xf9,0xfa,0xfa,0xfa,0x81,0xf9,0xf9,0xfa,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,
+       0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,
+       0xf9,0xf9,0x56,0x56,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xf9,
+       0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xfa,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xfa,
+       0xf9,0xf9,0x56,0x56,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,
+       0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0x56,0xf9,
+       0x56,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0x56,
+       0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,
+       0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,
+       0xf9,0xfa,0xfa,0xfa,0xf7,0xf6,0x00,0xf5,0x2b,0xfa,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,
+       0xfc,0xfc,0xf9,0x2b,0xf5,0x00,0x2b,0xf9,0xfc,0xfc,0xfc,0xfc,0xfb,0xfb,0x81,0x81,
+       0x81,0xfa,0xf9,0xfa,0xf9,0xf9,0xfa,0xf9,0x56,0xfa,0xf9,0x56,0x56,0xf9,0x56,0x56,
+       0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xfa,
+       0x56,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0x56,0x56,0xf9,0xf9,0x56,0x56,
+       0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,
+       0x56,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0xfa,0x56,0x56,0xfa,0x56,0xf9,0xf9,0xf9,
+       0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,
+       0x56,0x56,0x56,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xf9,0xf9,
+       0xf9,0xfa,0xf9,0xfa,0xf9,0x56,0x56,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,
+       0x56,0x56,0xf9,0x56,0xf9,0x56,0xf9,0x56,0xf9,0xfa,0x56,0x56,0xf9,0xfa,0x56,0xf9,
+       0x56,0xfc,0xff,0xff,0xab,0xfc,0xab,0xfb,0xaa,0xfb,0xfb,0x80,0xaa,0x80,0x80,0x80,
+       0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xff,0x2b,0xfa,0xfa,0xf9,0xf9,0xfa,
+       0xfa,0xfa,0xf9,0xfa,0xfa,0xf9,0xfa,0xf9,0xfa,0xfa,0xf9,0xfa,0xf9,0x56,0xf9,0x56,
+       0x56,0x56,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0x56,0x56,0xf9,0xf9,0x56,0x56,0x56,
+       0x56,0xf9,0x56,0x56,0xfa,0xf9,0xf9,0xfa,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,
+       0xf9,0x56,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,
+       0x56,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0x56,0x56,0x56,0x56,0x56,0x56,0xfa,
+       0xfa,0xf9,0xfa,0xf9,0xfa,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,
+       0xf9,0x56,0x56,0xf9,0x56,0x56,0xfa,0x56,0x56,0x56,0x56,0x56,0xf9,0x56,0x56,0xf9,
+       0xfa,0xf9,0xf9,0xfa,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xfa,0x56,0x56,0x56,0x56,
+       0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,
+       0xf9,0xf9,0xf9,0xfa,0xfa,0x81,0x81,0x81,0xfb,0xfb,0xfb,0xfb,0xfb,0xfc,0xfc,0xfc,
+       0xfb,0xfb,0xfc,0xfb,0xfb,0xfc,0xfb,0xfb,0xfc,0xfc,0xfc,0xfb,0xfb,0xfb,0xfb,0x81,
+       0x81,0x81,0xf9,0xf9,0xfa,0xf9,0xf9,0x56,0x56,0x56,0xf9,0x56,0x56,0xfa,0xf9,0xf9,
+       0xfa,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xf9,0xf9,0x56,
+       0x56,0xf9,0x56,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,
+       0xf9,0x56,0x56,0xf9,0x56,0x56,0x56,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,
+       0xf9,0x56,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xfa,
+       0x56,0x56,0x56,0x56,0x56,0xf9,0x56,0x56,0xfa,0xf9,0xfa,0xf9,0xf9,0xf9,0x56,0xf9,
+       0xf9,0x56,0xf9,0xf9,0xfa,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,
+       0xf9,0x56,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0x56,0x56,0x56,0x56,0x56,
+       0x56,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0x56,0xf9,0x56,0x56,0xf9,0x56,0xf9,0xf9,
+       0x56,0xf9,0xfc,0xff,0xff,0xfc,0xab,0xab,0xfb,0xfb,0xaa,0x80,0xfb,0x80,0x80,0x80,
+       0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xff,0x2b,0xf9,0xf9,0xf9,0xfa,
+       0xfa,0xfa,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0xfa,0xf9,0xfa,0xfa,0xfa,0xfa,0xfa,0xf9,
+       0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0x56,0x56,0x56,0xfa,0x56,0xf9,0xf9,0x56,0x56,0xf9,
+       0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xfa,0xf9,0xf9,0xf9,
+       0xfa,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0x56,0xf9,0xfa,0xf9,0xf9,0x56,
+       0xf9,0x56,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,
+       0xfa,0xfa,0xf9,0xfa,0xf9,0x81,0xfa,0xf9,0xf9,0xf9,0x81,0xfa,0xf9,0xfa,0xf9,0xf9,
+       0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0x56,0x56,0x56,0xf9,0x56,0xf9,0x56,0xf9,0xf9,
+       0xfa,0x56,0xf9,0xf9,0x56,0x56,0x56,0xfa,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xfa,
+       0x56,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,
+       0xf9,0xf9,0xf9,0xf9,0xfa,0xfa,0xfa,0x81,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfc,0xfb,
+       0xfb,0xfb,0x81,0xfb,0xfb,0xfb,0xfb,0xfb,0xfc,0xfc,0xfb,0xfb,0xfb,0xfb,0xfb,0x81,
+       0xfa,0xfa,0xfa,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,
+       0xf9,0xf9,0x56,0x56,0x56,0xfa,0xf9,0xf9,0xf9,0xfa,0xf9,0x56,0xf9,0xfa,0xf9,0xf9,
+       0x56,0x56,0xf9,0x56,0xf9,0xfa,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0x56,0xf9,0x56,0xf9,
+       0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xfa,0xf9,0x56,0x56,0x56,0xf9,0xf9,
+       0x56,0xf9,0x56,0xfa,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,
+       0x56,0x56,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0x56,0x56,
+       0xfa,0xf9,0x56,0xf9,0xfa,0x56,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0x56,0xf9,0xf9,
+       0xf9,0x56,0xf9,0x56,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,
+       0xf9,0x56,0xf9,0xfa,0xf9,0x56,0x56,0x56,0xfa,0x56,0xf9,0x56,0xf9,0xf9,0xfa,0xf9,
+       0xf9,0x56,0x56,0xfc,0xff,0xff,0xab,0xfc,0xab,0xab,0xfb,0xfb,0xaa,0x80,0xfb,0x80,
+       0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xff,0x2b,0xf9,0xfa,0xfa,
+       0xf9,0xfa,0xf9,0xfa,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,
+       0xf9,0xf9,0xf9,0xfa,0xf9,0x56,0x56,0x56,0xf9,0x56,0xf9,0x56,0xf9,0x56,0xfa,0xf9,
+       0xf9,0xf9,0xf9,0xf9,0x56,0xfa,0xf9,0x56,0x56,0x56,0x56,0x56,0xfa,0xf9,0x56,0x56,
+       0x56,0x56,0x56,0x56,0xf9,0x56,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,
+       0x56,0xf9,0x56,0xf9,0x56,0x56,0x56,0x56,0x56,0x56,0x56,0xf9,0x56,0x56,0xfa,0xfa,
+       0xfa,0xf9,0xf9,0xf9,0xfa,0xfa,0xfa,0xfa,0xfa,0xf9,0xfa,0xf9,0xf9,0xf9,0xfa,0x56,
+       0xf9,0xf9,0x56,0xf8,0x56,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0xfa,0x56,0xf9,
+       0xf9,0xf9,0x56,0x56,0xf9,0x56,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0x56,0xf9,
+       0x56,0x56,0xf9,0x56,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0x56,
+       0xf9,0x56,0x56,0x56,0x56,0xf9,0xf9,0xfa,0xfa,0xfa,0x81,0x81,0xfb,0xfb,0xfb,0xfb,
+       0x81,0x81,0x81,0xfb,0xfb,0x81,0x81,0x81,0x81,0xfb,0x81,0xfb,0xfb,0x81,0x81,0xfb,
+       0xfa,0xfa,0xfa,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xfa,0xf9,
+       0x56,0x56,0x56,0x56,0x56,0xfa,0xf9,0x56,0x56,0x56,0x56,0x56,0x56,0xf9,0x56,0x56,
+       0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0x56,0xf9,0xf9,0x56,0x56,0x56,0x56,
+       0x56,0x56,0x56,0x56,0xf9,0x56,0x56,0xfa,0xf9,0xf9,0x56,0x56,0x56,0xf9,0xf9,0xf9,
+       0xf9,0xf9,0x56,0xf9,0x56,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,
+       0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xfa,0xf9,0x56,0x56,0xf9,0x56,0x56,
+       0xfa,0xf9,0x56,0x56,0x56,0xf9,0x56,0x56,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,
+       0xf9,0x56,0xf9,0x56,0xf9,0x56,0xf9,0x56,0x56,0x56,0x56,0x56,0x56,0x56,0xf9,0x56,
+       0x56,0xfa,0xf9,0xf9,0x56,0x56,0x56,0xf9,0x56,0xfa,0xf9,0x56,0xf9,0x56,0xf9,0x56,
+       0x56,0xf9,0x56,0xf9,0xfc,0xff,0xff,0xfc,0xfc,0xab,0xfb,0xab,0x80,0xfb,0xfb,0x80,
+       0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xff,0x2b,0xf9,0xfa,
+       0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0xfa,0xfa,0xfa,0xf9,0xf9,0xfa,
+       0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0x56,0xf9,0xfa,0xf9,0xfa,0xf9,0xf9,0x56,0xf9,0xf9,
+       0x56,0x56,0xfa,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,
+       0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xfa,0xf9,0x56,0xf9,0x56,0x56,0xf9,0x56,
+       0x56,0x56,0x56,0xf9,0x56,0x56,0xfa,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,0x56,0xfa,
+       0xf9,0xf9,0xf9,0xf9,0x81,0xfa,0x81,0x81,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0xfa,
+       0xf9,0xf9,0xf9,0x56,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,
+       0xf9,0xfa,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,
+       0xf9,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xf9,0x56,0x56,0x56,
+       0x56,0xf9,0x56,0x56,0xfa,0xf9,0xf9,0xf9,0xf9,0xfa,0xfa,0xfa,0x81,0xfb,0x81,0x81,
+       0x81,0x81,0xfb,0x81,0x81,0x81,0xfa,0xfa,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x81,
+       0x81,0xfa,0xf9,0xfa,0xf9,0xf9,0x56,0xf9,0xfa,0x56,0x56,0xfa,0xf9,0x56,0xf9,0xf9,
+       0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,
+       0x56,0xfa,0xf9,0x56,0xf9,0x56,0x56,0xf9,0x56,0x56,0x56,0x56,0xf9,0x56,0x56,0xfa,
+       0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xfa,0xf9,0xf9,
+       0xfa,0x56,0x56,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xf9,
+       0xf9,0x56,0xf9,0xfa,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,
+       0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0x56,
+       0x56,0xf9,0x56,0x56,0x56,0x56,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,
+       0x56,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xfa,0xf9,0xfa,0xf9,0x56,0x56,0xf9,0x56,0xf9,
+       0xf9,0xf9,0xf9,0xf9,0xf9,0xfc,0xff,0xff,0xab,0xab,0xfb,0xaa,0xfb,0xfb,0xfb,0x80,
+       0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xff,0x2b,0xf9,
+       0xf9,0xf9,0xf9,0x81,0xfa,0xfa,0xfa,0xfa,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x81,
+       0xfa,0xf9,0xfa,0xfa,0xfa,0x56,0xf9,0x56,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0x56,0x56,
+       0xfa,0x56,0x56,0xf9,0x56,0x56,0xf9,0xf9,0x56,0x56,0xfa,0xf9,0xf9,0x56,0xf9,0x56,
+       0xf9,0xf9,0xfa,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0x56,0xf9,0xf9,
+       0xfa,0xf9,0xf9,0xfa,0xf9,0x56,0x56,0xf9,0x56,0x56,0x56,0xfa,0xf9,0x56,0xf9,0xf9,
+       0xfa,0xf9,0xf9,0xf9,0xfa,0xfa,0xfa,0xfa,0xf9,0xf9,0xf9,0xfa,0xf9,0xfa,0xf9,0xf9,
+       0xf9,0xf9,0xf9,0x56,0x56,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xfa,0x56,0x56,0xfa,0x56,
+       0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xfa,0xf9,0xf9,0xf9,
+       0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xfa,0x56,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xfa,
+       0xf9,0xf9,0xfa,0x56,0x56,0xf9,0x56,0xf9,0xf9,0xfa,0xfa,0xf9,0xfa,0xfa,0x81,0xfa,
+       0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,
+       0xfa,0xfa,0xfa,0xf9,0xfa,0xf9,0xfa,0x56,0x56,0xf9,0x56,0x56,0xf9,0x56,0x56,0xf9,
+       0xf9,0x56,0x56,0xfa,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xfa,0xf9,0xf9,0x56,0xf9,
+       0xf9,0xf9,0xf9,0x56,0x56,0xf9,0x56,0xf9,0xf9,0xfa,0xf9,0xf9,0xfa,0xf9,0x56,0x56,
+       0xf9,0x56,0x56,0x56,0xfa,0xf9,0x56,0x56,0xf9,0xfa,0x56,0x56,0x56,0xf9,0x56,0xf9,
+       0xf9,0x56,0x56,0x56,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,
+       0xf9,0xf9,0x56,0x56,0xf9,0x56,0x56,0xfa,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,
+       0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xfa,0x56,0x56,0xf9,
+       0x56,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0xfa,0x56,0x56,0xf9,0x56,0x56,0xf9,0xf9,0xf9,
+       0x56,0xf9,0xf9,0xfa,0x56,0x56,0x56,0xf9,0x56,0xf9,0x56,0xf9,0x56,0x56,0xf9,0x56,
+       0xf9,0xf9,0x56,0xf9,0x56,0xf9,0xfc,0xff,0xff,0xfc,0xab,0xab,0xfb,0xab,0xaa,0x80,
+       0xaa,0x81,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xff,0x2b,
+       0xf9,0xfa,0xfa,0xfa,0xfa,0xf9,0xfa,0xf9,0xfa,0xf9,0xf9,0xf9,0xfa,0xf9,0xfa,0xf9,
+       0xfa,0xfa,0xf9,0xf9,0x81,0xfa,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xf9,0x56,
+       0x56,0xf9,0x56,0x56,0xfa,0x56,0x56,0xfa,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,
+       0xf9,0xf9,0x56,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,
+       0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0x56,
+       0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xfa,0xfa,0xf9,0xf9,0xfa,0xfa,0xf9,0xf9,0xf9,
+       0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0x56,0x56,0x56,0x56,0x56,0xfa,0x56,0x56,0xf9,
+       0x56,0x56,0xfa,0xf9,0x56,0x56,0xfa,0xf9,0x56,0x56,0x56,0xf9,0xf9,0x56,0x56,0x56,
+       0xf9,0x56,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xfa,0xf9,0x56,0xf9,0xf9,
+       0x56,0xf9,0xf9,0x56,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xfa,
+       0xf9,0xfa,0xf9,0xfa,0xf9,0xfa,0xf9,0xf9,0xf9,0xfa,0xfa,0xf9,0xfa,0xfa,0xf9,0xfa,
+       0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xfa,0x56,0x56,
+       0xfa,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xf9,0xf9,
+       0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,
+       0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,0x56,0x56,0xf9,
+       0x56,0x56,0x56,0x56,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xf9,0x56,0xf9,0xf9,0x56,0xf9,
+       0x56,0x56,0xf9,0x56,0x56,0xfa,0x56,0x56,0xf9,0x56,0x56,0xfa,0xf9,0x56,0x56,0xfa,
+       0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0x56,0xf9,0x56,0xf9,0x56,0x56,
+       0xfa,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,0x56,0xf9,0x56,0xf9,0xf9,0xf9,
+       0xf9,0x56,0x56,0xfa,0x56,0x56,0x56,0x56,0x56,0xf9,0x56,0x56,0x56,0x56,0xf9,0xf9,
+       0x56,0x56,0x56,0x56,0xf9,0x56,0xf9,0xfc,0xff,0xff,0xac,0xfc,0xab,0xfb,0xfb,0xfb,
+       0xfb,0x80,0x80,0xfb,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xff,
+       0x2b,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xfa,0xfa,0xfa,
+       0xfa,0xfa,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0xfa,0xfa,0xfa,0xf9,0xfa,0xf9,0x56,0xf9,
+       0xf9,0xf9,0xfa,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,0x56,
+       0xf9,0x56,0x56,0x56,0x56,0x56,0xf9,0xf9,0x56,0x56,0x56,0xf9,0x56,0x56,0xfa,0x56,
+       0xf9,0x56,0x56,0x56,0x56,0x56,0x56,0x56,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0x56,0xf9,
+       0xf9,0x56,0x56,0xf9,0xf9,0xfa,0xfa,0x81,0xfa,0xfa,0xf9,0xf9,0xfa,0xfa,0xf9,0xfa,
+       0xf9,0xf9,0xfa,0x56,0xf9,0x56,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,
+       0xfa,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0x56,0x56,0x56,
+       0x56,0xfa,0x56,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xf9,0x56,0x56,0xf9,0x56,0xf9,0xf9,
+       0x56,0x56,0x56,0x56,0x56,0x56,0xf9,0xfa,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,
+       0xf9,0xf9,0xf9,0xfa,0xfa,0xfa,0xfa,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0xfa,0xf9,0xfa,
+       0xfa,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0x56,0x56,0xfa,0x56,
+       0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,0x56,0xf9,0x56,0x56,0x56,0x56,0x56,0xf9,
+       0xf9,0x56,0x56,0x56,0xf9,0x56,0x56,0xfa,0x56,0x56,0xf9,0x56,0x56,0x56,0x56,0x56,
+       0x56,0xfa,0xf9,0xfa,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,0x56,0xf9,0xf9,0xfa,
+       0xf9,0xfa,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0xf9,
+       0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xfa,0xf9,0x56,0xf9,0xf9,0x56,0xf9,
+       0xf9,0x56,0x56,0xf9,0x56,0xf9,0x56,0x56,0x56,0x56,0xfa,0xf9,0x56,0xf9,0xf9,0x56,
+       0x56,0xf9,0x56,0xf9,0xf9,0x56,0x56,0x56,0x56,0x56,0x56,0xf9,0xfa,0xf9,0xfa,0xf9,
+       0xf9,0x56,0xf9,0xf9,0x56,0x56,0x56,0xf9,0xfa,0xf9,0xfa,0xf9,0xf9,0x56,0xf9,0x56,
+       0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xfc,0xff,0xff,0xab,0xfc,0xab,0xaa,0xfb,
+       0xaa,0x80,0xfb,0xaa,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
+       0xff,0x2b,0xf9,0xfa,0xf9,0xf9,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,
+       0xfa,0xfa,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0x56,0xf9,0xfa,
+       0xfa,0x56,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xfa,0xf9,0x56,0xf9,0xf9,0xf9,0xfa,0xf9,
+       0xf9,0x56,0x56,0xfa,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xfa,0xf9,0xf9,0x56,0x56,
+       0xf9,0x56,0xf9,0xfa,0xf9,0xfa,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0x56,0x56,
+       0x56,0xf9,0xf9,0x56,0xf9,0xfa,0xf9,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xf9,0xf9,0xf9,
+       0xfa,0xfa,0xfa,0xf9,0xf9,0x56,0x56,0x56,0x56,0x56,0xf9,0xfa,0x56,0x56,0xfa,0xf9,
+       0x56,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0xfa,0xf9,0xf9,0xf9,0x56,0x56,0xfa,0xf9,
+       0xf9,0xf9,0x56,0x56,0xf9,0x56,0x56,0x56,0xf9,0xfa,0xf9,0xf9,0x56,0xf9,0x56,0x56,
+       0x56,0xfa,0xf9,0xfa,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0x56,0xfa,0x56,0xf9,0x56,0xf9,
+       0xf9,0xf9,0x56,0xfa,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xfa,0xfa,
+       0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xfa,0x56,0x56,0xf9,0xf9,0x56,0x56,
+       0xf9,0xfa,0xf9,0x56,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0x56,0x56,0xfa,0xf9,0xf9,0xf9,
+       0x56,0x56,0xf9,0xf9,0xfa,0xf9,0xf9,0x56,0x56,0xf9,0x56,0x56,0xf9,0xfa,0xf9,0xfa,
+       0xf9,0xf9,0xf9,0xfa,0x56,0xf9,0xfa,0x56,0x56,0x56,0x56,0xf9,0x56,0x56,0xf9,0xf9,
+       0xf9,0x56,0x56,0x56,0xf9,0xf9,0x56,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0x56,
+       0xf9,0x56,0x56,0xfa,0xfa,0x56,0x56,0xfa,0xf9,0x56,0x56,0xf9,0xfa,0xf9,0x56,0xf9,
+       0x56,0xfa,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,
+       0xf9,0x56,0xf9,0x56,0x56,0xf9,0xf9,0xfa,0xf9,0xfa,0xf9,0xfa,0xf9,0xf9,0xf9,0x56,
+       0xfa,0x56,0x56,0x56,0xf9,0xf9,0x56,0x56,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0x56,
+       0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xfc,0xff,0xff,0xfc,0xab,0xab,0xfb,
+       0xfb,0xfb,0xfb,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
+       0x80,0xff,0x2b,0xfa,0xfa,0xfa,0xf9,0xfa,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,
+       0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0xfa,0xfa,0xfa,0xfa,0xfa,0xf9,0xfa,0x56,0xf9,0xf9,
+       0xfa,0x56,0x56,0xf9,0xf9,0x56,0x56,0x56,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xf9,0x56,
+       0x56,0xf9,0x56,0x56,0xf9,0x56,0x56,0x56,0x56,0xfa,0xf9,0xf9,0xf9,0x56,0xf9,0xfa,
+       0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,0x56,0x56,0x56,0xf9,0xf9,0x56,0x56,0xf9,0x56,
+       0x56,0x56,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0xfa,0xfa,0xfa,0xfa,0xf9,0xf9,
+       0xfa,0xfa,0xf9,0xf9,0xfa,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xfa,0x56,0x56,0xf9,0xf9,
+       0x56,0x56,0x56,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xf9,0x56,0x56,0xf9,0x56,0x56,0xf9,
+       0x56,0x56,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,
+       0xf9,0xf9,0xf9,0x56,0x56,0x56,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,
+       0xfa,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xfa,0xf9,
+       0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0x56,0xf9,0xfa,0x56,0x56,0xf9,0xf9,0x56,0x56,
+       0x56,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xf9,0x56,0x56,0xf9,0x56,0x56,0xf9,0x56,0x56,
+       0x56,0x56,0xfa,0xf9,0xf9,0xf9,0x56,0xf9,0xfa,0xf9,0xf9,0x56,0xf9,0xfa,0x56,0x56,
+       0x56,0x56,0x56,0xf9,0x56,0x56,0xf9,0xf9,0x56,0x56,0x56,0xfa,0xf9,0xf9,0xf9,0x56,
+       0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,
+       0xf9,0xf9,0x56,0xf9,0xfa,0x56,0x56,0xf9,0xf9,0x56,0x56,0x56,0xf9,0xf9,0x56,0xf9,
+       0x56,0x56,0xf9,0x56,0x56,0xf9,0x56,0x56,0xfa,0x56,0x56,0x56,0x56,0xf9,0xf9,0xf9,
+       0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xfa,0x56,0x56,0x56,0x56,0x56,0x56,0xf9,0x56,
+       0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0x56,0xf9,0x56,0xf9,
+       0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0x56,0xf9,0xf9,0xfa,0xfc,0xff,0xff,0xab,0xfc,0xab,
+       0xfb,0xaa,0xfb,0xaa,0xfb,0x80,0xfb,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
+       0x80,0x80,0xff,0x2b,0xfa,0xf9,0xfa,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0xfa,
+       0xf9,0xf9,0xf9,0xfa,0xfa,0xf9,0xfa,0xfa,0xfa,0xfa,0xfa,0xf9,0xfa,0xfa,0xfa,0xf9,
+       0xf9,0xf9,0x56,0x56,0xfa,0xf9,0x56,0xfa,0xf9,0xf9,0x56,0x56,0x56,0x56,0x56,0xf9,
+       0xf9,0xf9,0xfa,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,
+       0xf9,0x56,0xf9,0xf9,0x56,0xf9,0x56,0x56,0x56,0xf9,0xf9,0x56,0x56,0x56,0x56,0xfa,
+       0xf9,0x56,0xf9,0xfa,0xf9,0xf9,0xfa,0xf9,0xfa,0x81,0xfa,0xfa,0xfa,0xf9,0xfa,0xfa,
+       0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xfa,0xf9,0x56,0x56,0xf9,
+       0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,
+       0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xfa,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,
+       0x56,0xf9,0x56,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0x56,0x56,0x56,0xfa,0x56,0x56,
+       0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0xf9,
+       0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,
+       0xfa,0xf9,0xf9,0x56,0x56,0x56,0x56,0x56,0xf9,0xf9,0xf9,0xfa,0x56,0xf9,0xf9,0xf9,
+       0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,
+       0x56,0x56,0xf9,0xf9,0x56,0x56,0x56,0x56,0xfa,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,
+       0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xf9,0x56,0xf9,
+       0xf9,0x56,0xf9,0xfa,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,
+       0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,
+       0xfa,0x56,0x56,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0x56,
+       0x56,0x56,0xfa,0x56,0x56,0xf9,0xfa,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,
+       0x56,0xf9,0x56,0x56,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xfc,0xff,0xff,0xfc,0xab,
+       0xab,0xfb,0xfb,0xaa,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
+       0x80,0x80,0x80,0xff,0x2b,0xf9,0xfa,0xf9,0xf9,0xf9,0xfa,0xfa,0xf9,0xfa,0xfa,0xfa,
+       0xfa,0xf9,0xfa,0xfa,0xfa,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0xfa,0xf9,0xfa,0xfa,0xf9,
+       0xf9,0xf9,0xf9,0x56,0xfa,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,
+       0xfa,0x56,0xf9,0xf9,0x56,0xf9,0xfa,0x56,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xfa,0x56,
+       0x56,0xf9,0xf9,0x56,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,
+       0xf9,0x56,0x56,0x56,0xf9,0x56,0xfa,0xf9,0xf9,0xf9,0xfa,0xfa,0xf9,0xf9,0xf9,0xfa,
+       0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0x56,0xf9,0x56,0x56,0x56,0xf9,0xf9,0x56,0xf9,
+       0xfa,0x56,0xfa,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,
+       0xf9,0xfa,0x56,0xf9,0x56,0x56,0xfa,0x56,0x56,0xf9,0x56,0x56,0xfa,0x56,0x56,0x56,
+       0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xfa,0xf9,0x56,0xfa,0xf9,0xf9,0x56,
+       0x56,0xf9,0x56,0x56,0xf9,0x56,0x56,0xf9,0xf9,0x56,0x56,0x56,0x56,0xf9,0xf9,0x56,
+       0x56,0x56,0xf9,0xf9,0x56,0x56,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xfa,0x56,
+       0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0x56,0xf9,0xf9,0x56,0xf9,0xfa,
+       0x56,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xfa,0x56,0x56,0xf9,0xf9,0x56,0x56,0x56,0xf9,
+       0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xf9,0x56,0xf9,
+       0x56,0x56,0xf9,0xf9,0x56,0x56,0x56,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xf9,0xf9,0x56,
+       0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xfa,0x56,0xfa,0xf9,0x56,0x56,0xf9,
+       0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,
+       0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xfa,0xf9,
+       0xf9,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,
+       0x56,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xfc,0xff,0xff,0xab,
+       0xfc,0xfc,0xaa,0xfb,0xfb,0xfb,0xfb,0x80,0xfb,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
+       0x80,0x80,0x80,0x80,0xff,0x2b,0xfa,0xfa,0xf9,0xf9,0xfa,0xfa,0xfa,0xfa,0xfa,0xf9,
+       0xfa,0xf9,0xf9,0xfa,0xfa,0xf9,0xf9,0xfa,0xfa,0xfa,0xfa,0xf9,0xfa,0xf9,0xfa,0xf9,
+       0xfa,0xf9,0xfa,0xf9,0xf9,0xfa,0xf9,0x56,0xfa,0xf9,0x56,0xfa,0xf9,0xfa,0xf9,0x56,
+       0xf9,0xf9,0x56,0xfa,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xfa,0xf9,0xf9,0xfa,
+       0x56,0x56,0xf9,0xfa,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,
+       0xf9,0xf9,0x56,0xf9,0xfa,0xf9,0xf9,0xf9,0xfa,0xf9,0xfa,0xfa,0xf9,0xfa,0xfa,0xf9,
+       0xfa,0xfa,0xf9,0xf9,0xf9,0xf9,0xfa,0x56,0x56,0xf9,0x56,0x56,0x56,0x56,0xf9,0x56,
+       0xfa,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xfa,0xfa,0xf9,0x56,0xf9,0xf9,0x56,0xfa,0xf9,
+       0x56,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0xfa,0x56,0x56,
+       0xf9,0xfa,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xf9,0xf9,0xf9,
+       0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,
+       0x56,0x56,0x56,0x56,0xfa,0x56,0x56,0xf9,0xf9,0x56,0x56,0x56,0xf9,0x56,0xfa,0x56,
+       0x56,0xfa,0xf9,0x56,0xfa,0xf9,0xfa,0xf9,0x56,0xf9,0xf9,0x56,0xfa,0xf9,0x56,0xf9,
+       0xf9,0xf9,0xf9,0x56,0x56,0xfa,0xf9,0xf9,0xfa,0x56,0x56,0xf9,0xfa,0x56,0x56,0xf9,
+       0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xfa,0xf9,0x56,
+       0xf9,0xf9,0x56,0xf9,0x56,0x56,0x56,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xf9,0x56,0xfa,
+       0x56,0x56,0xf9,0xf9,0x56,0x56,0x56,0xf9,0x56,0xfa,0x56,0x56,0xf9,0xf9,0x56,0xfa,
+       0xf9,0xfa,0xf9,0x56,0xf9,0xf9,0x56,0xfa,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0x56,
+       0xfa,0xf9,0xfa,0x56,0x56,0xf9,0xfa,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,
+       0x56,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xfa,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0x56,
+       0x56,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0x56,0x56,0xfa,0x56,0x56,0xf9,0xfc,0xff,0xff,
+       0xfc,0xab,0xab,0xab,0xfb,0xfb,0xaa,0x80,0xaa,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
+       0x80,0x80,0x80,0x80,0x80,0xff,0x2b,0xfa,0xfa,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0xfa,
+       0xf9,0xfa,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0xfa,0xfa,0xf9,0xf9,0xfa,0xfa,0xfa,0xf9,
+       0xfa,0xfa,0xfa,0x81,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,
+       0x56,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xf9,0x56,0x56,0xf9,0x56,0x56,0xf9,0x56,0xf9,
+       0x56,0x56,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xfa,0x56,0x56,0xf9,0x56,0xf9,0x56,0x56,
+       0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0xfa,0xfa,0xfa,0xfa,0xfa,
+       0xfa,0xfa,0xfa,0xf9,0xf9,0xfa,0xfa,0xfa,0x56,0x56,0x56,0xf9,0x56,0xf9,0x56,0x56,
+       0xf9,0xf9,0x56,0x56,0xfa,0x56,0x56,0xfa,0xf9,0x56,0x56,0x56,0xfa,0xf9,0x56,0xf9,
+       0x56,0x56,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,0x56,
+       0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0x56,0x56,0x56,0xf9,
+       0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,
+       0xf9,0x56,0xf9,0xf9,0xfa,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,
+       0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0x56,0x56,
+       0xf9,0x56,0x56,0xf9,0x56,0x56,0xf9,0x56,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0x56,0x56,
+       0x56,0xfa,0x56,0x56,0xf9,0x56,0xf9,0x56,0x56,0x56,0xf9,0x56,0x56,0xf9,0xf9,0xf9,
+       0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,
+       0xfa,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xfa,0x56,0x56,
+       0xfa,0x56,0xf9,0x56,0x56,0xfa,0xf9,0x56,0xf9,0x56,0x56,0xf9,0x56,0x56,0xf9,0xf9,
+       0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xfa,0x56,0x56,0xf9,0x56,
+       0xf9,0x56,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,
+       0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xfa,0xf9,0x56,0x56,0xf9,0xfc,0xff,
+       0xff,0xab,0xfc,0xab,0xfb,0xfb,0xaa,0x80,0xfb,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
+       0x80,0x80,0x80,0x80,0x80,0x80,0xff,0x2b,0xfa,0xf9,0xf9,0xfa,0xfa,0xfa,0xfa,0xf9,
+       0xfa,0xfa,0xfa,0xf9,0xfa,0xfa,0xf9,0xfa,0xf9,0xfa,0xfa,0xf9,0xfa,0xf9,0xf9,0xf9,
+       0xfa,0xf9,0xfa,0xfa,0xfa,0xfa,0x81,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0x56,
+       0xf9,0x56,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xfa,0xf9,
+       0x56,0x56,0x56,0xf9,0xfa,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,
+       0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xfa,0xfa,0xfa,0xfa,
+       0xfa,0xfa,0xf9,0xfa,0xf9,0xfa,0xfa,0x56,0xf9,0x56,0x56,0x56,0xf9,0x56,0x56,0xf9,
+       0xfa,0xf9,0x56,0x56,0xf9,0x56,0x56,0x56,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,
+       0xf9,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xfa,0xf9,0x56,0xfa,0xf9,0x56,0x56,
+       0x56,0xfa,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xfa,0x56,0xf9,0xf9,
+       0x56,0xf9,0x56,0xf9,0xf9,0x56,0x56,0x56,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,
+       0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0x56,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xfa,
+       0x56,0x56,0x56,0x56,0x56,0xf9,0x56,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0x56,
+       0xf9,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xfa,0xf9,0x56,0x56,0x56,0xf9,0xfa,0x56,0x56,
+       0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,
+       0x56,0x56,0x56,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,
+       0x56,0x56,0x56,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xfa,0x56,0x56,0xf9,0x56,0x56,
+       0x56,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0xfa,
+       0x56,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xfa,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,
+       0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xf9,0x56,
+       0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xfa,0xf9,0x56,0x56,0x56,0x56,0xf9,0xfc,
+       0xff,0xff,0xab,0xab,0xfb,0xab,0xfb,0xfb,0x80,0xfb,0x80,0x80,0x80,0x80,0x80,0x80,
+       0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xff,0x2b,0xfa,0xf9,0xfa,0xfa,0xfa,0xf9,0xfa,
+       0xf9,0xf9,0xfa,0xfa,0xf9,0xf9,0xf9,0xfa,0xfa,0xfa,0xf9,0xfa,0xf9,0xf9,0xf9,0xfa,
+       0xf9,0xf9,0xfa,0xf9,0xf9,0xfa,0xfa,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,
+       0xf9,0x56,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xfa,0xfa,0x56,0xf9,0xf9,
+       0xf9,0x56,0x56,0xf9,0xf9,0xf9,0x56,0xfa,0xfa,0xf9,0x56,0xf9,0xf9,0x56,0xfa,0x56,
+       0xf9,0x56,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xfa,0xfa,0xf9,
+       0xfa,0xfa,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0x56,0x56,0x56,
+       0xfa,0xf9,0xf9,0x56,0x56,0x56,0xf9,0xf9,0xf9,0x56,0xfa,0x56,0x56,0x56,0x56,0x56,
+       0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xfa,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,
+       0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,
+       0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xf9,0x56,0x56,0xf9,0x56,0x56,0xf9,
+       0x56,0xf9,0x56,0x56,0xf9,0x56,0x56,0xfa,0xf9,0xfa,0xf9,0x56,0x56,0x56,0xfa,0xf9,
+       0x56,0x56,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0x56,0xf9,0xf9,
+       0xf9,0xf9,0xf9,0x56,0xfa,0xfa,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0x56,
+       0xfa,0xfa,0xf9,0x56,0xf9,0xf9,0x56,0xfa,0x56,0xf9,0x56,0x56,0x56,0xf9,0x56,0xf9,
+       0xf9,0x56,0x56,0x56,0xf9,0x56,0x56,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0x56,0xf9,
+       0x56,0x56,0xfa,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xfa,0xf9,0x56,0x56,0x56,0x56,0xf9,
+       0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,
+       0xf9,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xfa,0xf9,0xf9,0x56,0xf9,0x56,
+       0x56,0xfa,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xf9,0x56,
+       0x56,0xf9,0x56,0x56,0xf9,0x56,0xf9,0x56,0xf9,0x56,0x56,0x56,0xfa,0xf9,0xfa,0xf9,
+       0xfc,0xff,0xff,0xfc,0xfc,0xab,0xaa,0xfb,0xaa,0xfb,0xaa,0x80,0xfb,0x80,0x80,0x80,
+       0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xff,0x2b,0xf9,0xfa,0xf9,0xfa,0xf9,0xf9,
+       0xfa,0xf9,0xfa,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xfa,0xf9,0xf9,0xf9,0xf9,0xfa,
+       0xfa,0xfa,0xfa,0xfa,0xf9,0xf9,0x81,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,
+       0xfa,0xf9,0x56,0x56,0xf9,0x56,0xfa,0x56,0xf9,0xfa,0x56,0x56,0xf9,0xf9,0x56,0x00,
+       0x00,0x00,0x00,0x00,0x56,0xf9,0x56,0xf9,0xf9,0x56,0x56,0x56,0xfa,0x56,0xf9,0xf9,
+       0xf8,0x00,0x00,0x00,0x00,0xf5,0xf9,0xf9,0x56,0xf9,0xf9,0xfa,0xfa,0xfa,0xfa,0xfa,
+       0xfa,0xf9,0x81,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0xfa,0x56,0x56,0x56,0x56,0xf9,
+       0xf9,0xf9,0x56,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,
+       0xf9,0xf9,0xf9,0xf9,0x56,0x2b,0xf5,0x00,0x00,0xf5,0xf6,0xf8,0xf9,0xf9,0xf9,0xf9,
+       0xf9,0xf9,0xf9,0xfa,0x56,0xf9,0xf9,0x56,0x56,0x56,0x2b,0xf6,0x00,0x00,0xf6,0x2b,
+       0xf8,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0x00,0x00,0xf6,
+       0xf6,0x2b,0xf6,0xf6,0xf6,0xf8,0x56,0xf9,0xf9,0xf5,0xf5,0xf6,0xf6,0xf6,0xf6,0xf5,
+       0x00,0xf9,0x56,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0x2b,0xf6,0x00,
+       0x00,0xf6,0xf7,0xf8,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0x56,
+       0xf9,0xf9,0x56,0x56,0x56,0xfa,0x56,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xf9,0xfa,0xf9,
+       0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,
+       0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0x56,0x56,0xf9,
+       0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0x56,0x56,
+       0xfa,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xfa,0x56,0xf9,0x56,0xf9,0xf9,0x56,0xf9,
+       0xf9,0xf9,0xf9,0x56,0x56,0x56,0x56,0x56,0xfa,0x56,0xf9,0x56,0x56,0x56,0xfa,0xf9,
+       0xf9,0xf9,0xf9,0x56,0xf9,0xfa,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,
+       0xf9,0xfc,0xff,0xff,0xfc,0xab,0xab,0xfb,0xab,0x80,0xfb,0x80,0xfb,0x80,0x80,0x80,
+       0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xff,0x2b,0xf9,0xf9,0xf9,0xfa,0xfa,
+       0xf9,0xfa,0xfa,0xf9,0xf9,0xfa,0xf9,0xfa,0xf9,0xfa,0xfa,0xf9,0xf9,0xf9,0xfa,0xfa,
+       0xfa,0xf9,0xf9,0xfa,0xfa,0xf9,0xfa,0xfa,0xf9,0xf9,0xf9,0xfa,0xfa,0xfa,0xf9,0xf9,
+       0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0x56,0x56,0x56,0xf9,0xf9,
+       0xf8,0xf7,0x00,0x00,0x00,0x2b,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0x56,0xf9,
+       0x56,0xf7,0x00,0x00,0x00,0xf7,0x56,0x56,0xf9,0xf9,0xf9,0xfa,0xfa,0xf9,0xf9,0x81,
+       0xfa,0xfa,0xfa,0xfa,0xfa,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0x56,
+       0xf9,0xfa,0x56,0x56,0x56,0x56,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xfa,0x56,0x56,0xf9,
+       0xf9,0xf9,0x56,0x56,0xf6,0x00,0xf5,0x2b,0xf8,0xf8,0xf7,0xf6,0x00,0xf6,0x56,0xf9,
+       0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xf9,0xf7,0x00,0x2b,0xf7,0xf8,0xf7,0xf6,
+       0x00,0x00,0x2b,0xf9,0xfa,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0x2b,
+       0x00,0x00,0x00,0x00,0x2b,0xf7,0xf9,0x56,0xf9,0xf9,0x56,0x2b,0x00,0x00,0x00,0xf6,
+       0xf7,0xf8,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0x56,0x2b,0x00,0x2b,0xf7,
+       0xf8,0xf7,0xf6,0x00,0x00,0x2b,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0x56,0xf9,
+       0x56,0x56,0x56,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0x56,0xf9,0x56,0xf9,0x56,0xf9,0xf9,
+       0x56,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xfa,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0xf9,
+       0xf9,0x56,0x56,0x56,0xf9,0x56,0x56,0xf9,0x56,0xf9,0xf9,0x56,0x56,0x56,0x56,0x56,
+       0x56,0xf9,0xf9,0x56,0xf9,0xfa,0x56,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,
+       0x56,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0x56,0x56,0x56,0xf9,0x56,0x56,
+       0xfa,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,
+       0xf9,0x56,0xfa,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xf9,0x56,0x56,0x56,0x56,0xf9,0x56,
+       0x56,0xf9,0xfc,0xff,0xff,0xab,0xfc,0xab,0xfb,0xfb,0xfb,0xaa,0x80,0x80,0x80,0x80,
+       0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xff,0x2b,0xf9,0xfa,0xf9,0xf9,
+       0xfa,0xf9,0xfa,0xf9,0xf9,0xfa,0xf9,0xfa,0xf9,0xfa,0xfa,0xfa,0xf9,0xf9,0xfa,0xfa,
+       0xfa,0xfa,0xfa,0xf9,0xf9,0xf9,0xf9,0xfa,0xfa,0xf9,0xfa,0xf9,0xfa,0xfa,0xfa,0xfa,
+       0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0x56,
+       0xf9,0x56,0xf9,0xf7,0x00,0x00,0xf5,0xfa,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,
+       0x56,0xf9,0xf6,0x00,0x00,0xf7,0xfa,0xfa,0xf9,0xf9,0xfa,0x81,0xfa,0xfa,0xf9,0xfa,
+       0xfa,0xfa,0xf9,0xfa,0xfa,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,
+       0x56,0xf9,0x56,0x56,0x56,0xf9,0x56,0xf9,0xfa,0x56,0xf9,0xf9,0xf9,0x56,0x56,0x56,
+       0xf9,0x56,0x56,0xf8,0x00,0x00,0xf7,0x56,0xf9,0xf9,0xf9,0xfa,0xf9,0xf8,0x00,0x00,
+       0x56,0xf9,0xf9,0x56,0x56,0x56,0x56,0xf9,0x56,0xf7,0x00,0x56,0xf9,0xf9,0x56,0xfa,
+       0xf9,0x2b,0x00,0xf6,0xfa,0xfa,0xf9,0x56,0xf9,0xfa,0xf9,0xf9,0xf9,0x56,0xf9,0x56,
+       0x56,0x2b,0x00,0x00,0xf5,0xf9,0xfa,0xf9,0xfa,0xf9,0xfa,0xf9,0xf9,0x00,0x00,0x2b,
+       0xf9,0xf9,0xfa,0xfa,0xf9,0xfa,0xfa,0xf9,0xf9,0xf9,0x56,0xf9,0xf7,0xf5,0xf8,0x56,
+       0x56,0xf9,0xf9,0xfa,0x2b,0x00,0xf6,0xfa,0xf9,0xfa,0xf9,0xf9,0xf9,0x56,0x56,0x56,
+       0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,
+       0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0x56,0x56,0xfa,0xf9,0x56,0xf9,
+       0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xf9,0x56,
+       0xf9,0xfa,0x56,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xf9,0x56,0x56,0xf9,0x56,0xf9,0x56,
+       0xf9,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0x56,0x56,0x56,0x56,0xf9,0xf9,0x56,0xf9,
+       0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xfa,0xf9,
+       0xf9,0x56,0x56,0x56,0x56,0x56,0xfa,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,
+       0xf9,0x56,0xfa,0xfb,0xff,0xff,0xab,0xab,0xab,0xab,0xfb,0xaa,0x81,0xfb,0x80,0xfb,
+       0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xff,0x2b,0xf9,0xfa,0xfa,
+       0xfa,0xf9,0xfa,0xf9,0xfa,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0xfa,0xfa,0xf9,0xf9,0xfa,
+       0xfa,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0xfa,0xf9,0xfa,0xfa,0xfa,0xf9,0xfa,0xf9,
+       0xfa,0xf9,0x56,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0x56,0xf9,0x56,
+       0xf9,0xf9,0xf9,0xf9,0xf8,0x00,0x00,0x00,0xfa,0x81,0x81,0x81,0xf9,0xf9,0xf9,0xf9,
+       0x56,0xf9,0xf9,0x00,0x00,0x00,0xf7,0xfa,0x81,0xfa,0x81,0xfa,0x81,0xfa,0xf9,0xf9,
+       0xfa,0xfa,0xfa,0xfa,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xfa,0xfa,0xf9,0x56,0x56,
+       0x56,0x56,0x56,0x56,0xf9,0xf9,0xfa,0xf9,0x56,0x56,0x56,0xf9,0x56,0x56,0xf9,0x56,
+       0x56,0x56,0xf9,0x56,0xf5,0x00,0xf7,0xf9,0xf9,0xf9,0xf9,0xfa,0xfa,0xfa,0xfa,0x56,
+       0x00,0xf5,0xf9,0xfa,0xf9,0xf9,0xf9,0x56,0xfa,0xf9,0xf5,0x2b,0xf9,0xf9,0xf9,0xf9,
+       0xfa,0xfa,0xf9,0xf5,0xf5,0xfa,0xfa,0xf9,0xfa,0xf9,0xf9,0xf9,0x56,0x56,0x56,0x56,
+       0xf9,0xf9,0xf9,0x00,0x00,0x00,0xfa,0x81,0x81,0x81,0x81,0xfa,0xf9,0xf8,0x00,0xf6,
+       0xf9,0xfa,0xfa,0x81,0x81,0x81,0xfa,0xf9,0xf9,0xf9,0x56,0x56,0x56,0x00,0x2b,0xf9,
+       0xf9,0xfa,0xfa,0xfa,0xfa,0xfa,0xf5,0xf5,0xfa,0xfa,0xfa,0xf9,0xf9,0xfa,0xf9,0x56,
+       0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0x56,0xf9,0x56,0x56,0x56,0x56,
+       0xf9,0xf9,0x56,0xf9,0xf9,0xfa,0xf9,0x56,0x56,0x56,0xf9,0x56,0xf9,0xf9,0x56,0x56,
+       0xf9,0x56,0xf9,0xf9,0xf9,0xfa,0xf9,0x56,0x56,0xf9,0x56,0x56,0x56,0xf9,0xf9,0xf9,
+       0xf9,0xf9,0x56,0x56,0xf9,0x56,0x56,0xf9,0x56,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xfa,
+       0xf9,0x56,0x56,0x56,0xf9,0xf9,0xf9,0x56,0xfa,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,
+       0x56,0xf9,0xf9,0xf9,0x56,0xfa,0x56,0x56,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,
+       0xf9,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xf9,0x56,0x56,0xf9,0xfa,0xf9,
+       0xfa,0x56,0xf9,0x56,0xfc,0xff,0xff,0xfc,0xfc,0xfb,0xaa,0xfb,0xfb,0xfb,0x80,0xaa,
+       0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xff,0xf7,0xfa,0x81,
+       0xfa,0xf9,0xfa,0xf9,0xfa,0xfa,0xf9,0xfa,0xf9,0xf9,0xfa,0xf9,0xf9,0xfa,0xfa,0xf9,
+       0xf9,0xfa,0xfa,0xfa,0xf9,0xf9,0xfa,0xfa,0x81,0xfa,0xf9,0xfa,0xfa,0xf9,0xfa,0xf9,
+       0xfa,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0x56,0xf9,0x56,0x56,0x56,
+       0x56,0x56,0xfa,0x56,0xf9,0xf7,0xf5,0x00,0x00,0x56,0xfc,0xfb,0x81,0xfa,0xf9,0xf9,
+       0xf9,0x56,0xf9,0xf7,0x00,0x00,0x00,0xf7,0x81,0xfb,0xfb,0xfb,0x81,0x81,0xfa,0xfa,
+       0xf9,0xf9,0x81,0xfa,0x81,0xfa,0xf9,0xfa,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,
+       0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xfa,0x56,0x56,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0x56,
+       0x56,0xf9,0xfa,0xf9,0xf5,0x00,0xf6,0xf9,0xf9,0xf9,0xfa,0xfa,0xfa,0xfb,0x81,0x81,
+       0x81,0xf7,0x00,0xf5,0xf9,0xfa,0xfa,0xfa,0xfa,0xfa,0x2b,0x00,0x56,0xf9,0xf9,0xf9,
+       0xfa,0xfa,0xfa,0xfa,0xf8,0x00,0x81,0xfb,0x81,0xfa,0xf9,0xfa,0xf9,0xf9,0x56,0x56,
+       0xf9,0xfa,0xf9,0xfa,0x2b,0x00,0x00,0xf8,0xfb,0xfb,0xfb,0x81,0xfa,0xf9,0x2b,0x00,
+       0xf9,0x81,0xfb,0xfb,0xfc,0xfb,0x81,0x81,0xfa,0xf9,0xf9,0xf9,0xf9,0x2b,0x00,0x56,
+       0xf9,0xfa,0xfa,0xfa,0xfa,0x81,0x81,0xf7,0x00,0x81,0x81,0xfb,0xfa,0xfa,0xf9,0x56,
+       0xf9,0xf9,0xf9,0xfa,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xf9,
+       0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xfa,0xf9,0xfa,0x56,
+       0x56,0xfa,0x56,0x56,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xfa,0xf9,0xfa,
+       0xf9,0x56,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0x56,0x56,0xf9,0xfa,0xfa,0xf9,0xf9,0x56,
+       0x56,0xf9,0x56,0x56,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xfa,0xf9,0xfa,0xf9,
+       0xf9,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,
+       0xf9,0xf9,0x56,0x56,0x56,0xf9,0xfa,0xf9,0xfa,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,
+       0x56,0xf9,0x56,0x56,0xf9,0xfc,0xff,0xff,0xfc,0xab,0xab,0xfb,0xab,0x80,0xaa,0xfb,
+       0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xff,0x2b,0xfa,
+       0xf9,0xf9,0xfa,0xf9,0xf9,0xfa,0xf9,0xfa,0xf9,0xf9,0xfa,0xfa,0xfa,0xfa,0xfa,0xf9,
+       0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0xfa,0xf9,0xfa,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0xfa,
+       0xfa,0xfa,0x81,0xfa,0xfa,0xf9,0xf9,0xfa,0xfa,0x56,0x56,0xf9,0x56,0x56,0xf9,0xf9,
+       0xf9,0xf9,0xfa,0xf9,0xf9,0x56,0x2b,0xf7,0xf5,0x00,0x2b,0xfc,0xfc,0x81,0x81,0xf9,
+       0xf9,0xf9,0xf9,0x56,0x2b,0x2b,0x00,0x00,0xf8,0xfb,0xfc,0xfc,0xfb,0x81,0x81,0xfa,
+       0xfa,0xf9,0xfa,0xfa,0xfa,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xfa,0xf9,0x56,
+       0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xfa,0xf9,0xfa,0xf9,0xf9,0xf9,
+       0xf9,0xf9,0xfa,0xf9,0xf6,0x00,0x00,0x56,0xf9,0xfa,0xfa,0x81,0x81,0xfb,0x81,0x81,
+       0xfa,0xfa,0x81,0xf5,0x00,0x2b,0x81,0x81,0xf9,0xf9,0x56,0xf6,0x00,0x56,0xf9,0xfa,
+       0xfa,0xfa,0xfa,0xfa,0x81,0xfa,0x00,0xfb,0xfb,0x81,0xfa,0xfa,0xf9,0xf9,0x56,0x56,
+       0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf5,0x00,0xf5,0xfb,0xfc,0xfc,0x81,0x81,0xf9,0x00,
+       0xf8,0xfa,0x81,0x81,0xfb,0xfb,0xfb,0x81,0x81,0x81,0xfa,0xfa,0xf9,0xf9,0xf6,0x00,
+       0xf9,0xfa,0xf9,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0x00,0x81,0xfb,0xfb,0x81,0xf9,0xf9,
+       0x56,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,
+       0xf9,0xfa,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0x56,
+       0x56,0xf9,0x56,0x56,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xfa,0xf9,0xf9,0x56,0x56,
+       0xf9,0x56,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0x56,
+       0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0x56,0x56,
+       0x56,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xfa,0x56,0x56,
+       0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,0x56,0x56,0x56,0xf9,
+       0xf9,0xf9,0x56,0x56,0xfa,0xf9,0xfc,0xff,0xff,0xab,0xab,0xfc,0xab,0xfb,0xfb,0x80,
+       0x80,0xfb,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xff,0xf6,
+       0xf9,0xf9,0xfa,0xf9,0xf9,0xfa,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0xfa,0xfa,0xfa,0xfa,
+       0xf9,0xfa,0xfa,0xf9,0xfa,0xfa,0xf9,0xfa,0xf9,0xf9,0xfa,0xfa,0xf9,0xfa,0xfa,0xf9,
+       0xfa,0xf9,0xfa,0xf9,0xfa,0xfa,0x81,0xfa,0xfa,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,
+       0xfa,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf7,0xf7,0x2b,0x00,0xf5,0xfc,0xfc,0xfc,0x81,
+       0xf9,0xf9,0xf9,0xf9,0x56,0xf5,0xf8,0x00,0x00,0xf8,0xfb,0xac,0xfc,0xfc,0xfb,0x81,
+       0x81,0xf9,0xfa,0xfa,0xfa,0xfa,0xfa,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,
+       0x56,0x56,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xf9,0x56,0xf9,0x56,0xf9,0x56,0xf9,0xf9,
+       0xf9,0xf9,0xf9,0xf9,0xf8,0x00,0x00,0x2b,0xf9,0xf9,0x81,0xfb,0x81,0xfb,0xfb,0x81,
+       0xfa,0xfa,0x81,0xfa,0xf7,0x00,0x00,0xfa,0x81,0xfa,0xf9,0xf9,0xf5,0x00,0x56,0xf9,
+       0xfa,0x81,0xfa,0x81,0xfa,0xfa,0x81,0xf8,0x81,0xfb,0xfb,0x81,0x81,0xfa,0xfa,0xf9,
+       0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf7,0x00,0x00,0x56,0xac,0xfc,0xfb,0xfa,0xf7,
+       0xf5,0x56,0xfa,0x81,0x81,0xfb,0xfc,0xfb,0x81,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xf5,
+       0x00,0xf9,0xf9,0xfa,0xfa,0x81,0xfa,0x81,0x81,0x81,0xf8,0xfb,0xfb,0xfb,0x81,0xfa,
+       0xfa,0xf9,0x56,0xf9,0x56,0x56,0x56,0xf9,0x56,0x56,0xf9,0xf9,0x56,0x56,0x56,0xf9,
+       0x56,0xfa,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,
+       0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xfa,0x56,0xf9,0xf9,0x56,
+       0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,
+       0xf9,0x56,0x56,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0x56,
+       0x56,0x56,0xf9,0x56,0x56,0xf9,0xf9,0x56,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,
+       0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,
+       0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xfc,0xff,0xff,0xfc,0xab,0xab,0xfb,0xaa,0xfb,
+       0xfb,0xaa,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xff,
+       0x2b,0xfa,0xfa,0xf9,0x81,0xf9,0xfa,0xf9,0xf9,0xf9,0xfa,0x81,0xfa,0xfa,0xfa,0xfa,
+       0xf9,0xfa,0xf9,0xfa,0xfa,0xf9,0xfa,0xfa,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0xfa,0xfa,
+       0xf9,0xf9,0xf9,0xfa,0xfa,0xfa,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0xf9,
+       0xfa,0x56,0xf9,0x56,0xf9,0xf9,0xfa,0xf9,0xf7,0xf7,0xf8,0x00,0x00,0x81,0xac,0xfc,
+       0xfb,0xfa,0xf9,0xf9,0x56,0xf8,0xf5,0xfa,0x00,0x00,0xf8,0xfc,0xac,0xac,0xfc,0xfb,
+       0xfa,0xfa,0xf9,0xfa,0xfa,0xf9,0xf9,0x81,0xf9,0xf9,0xfa,0xfa,0xfa,0xf9,0xf9,0xf9,
+       0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0x56,0x56,0xfa,0xf9,
+       0xf9,0x56,0x56,0x56,0x56,0x2b,0x00,0x00,0x56,0xf9,0x81,0xfb,0xfb,0xfb,0x81,0x81,
+       0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0x00,0x00,0xf7,0x81,0x81,0x81,0xfa,0x00,0x00,0xf8,
+       0xfa,0xfa,0x81,0xfa,0x81,0x81,0xfa,0xfa,0xfa,0x81,0x81,0xfb,0x81,0x81,0xf9,0xf9,
+       0x56,0xf9,0xf9,0x56,0x56,0xfa,0xf9,0xf9,0xf9,0xf5,0x00,0xf5,0xfc,0xfc,0xfb,0x81,
+       0x00,0xf7,0xf9,0xfa,0x81,0xfb,0xfc,0xfb,0xfb,0xfa,0xfa,0xf9,0xfa,0xf9,0xf9,0x56,
+       0x00,0x00,0xf8,0xf9,0xfa,0x81,0x81,0xfa,0xfa,0xfa,0xf9,0xfa,0xfa,0x81,0xfb,0xfb,
+       0x81,0xfa,0xf9,0xf9,0x56,0x56,0xfa,0xf9,0x56,0xfa,0x56,0x56,0xf9,0x56,0x56,0xfa,
+       0xf9,0xf9,0xf9,0xfa,0xf9,0x56,0xf9,0x56,0xfa,0xf9,0xf9,0x56,0xf9,0x56,0x56,0x56,
+       0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,0x56,0x56,0xf9,0xfa,0x56,0x56,0xf9,0xf9,
+       0xfa,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xfa,0xf9,0x56,0xf9,0x56,0x56,0x56,0x56,0xf9,
+       0x56,0xf9,0x56,0xf9,0xfa,0x56,0xf9,0x56,0xf9,0xf9,0xfa,0xf9,0xf9,0x56,0x56,0x56,
+       0xf9,0xfa,0x56,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xfa,0xf9,0xf9,0xf9,0xfa,0xf9,0x56,
+       0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0x56,0x56,0xfa,0xf9,0x56,0xf9,0x56,0xf9,
+       0x56,0x56,0x56,0x56,0xf9,0xfa,0x56,0x56,0xfc,0xff,0xff,0xfc,0xab,0xfb,0xab,0xfb,
+       0xaa,0xfb,0x80,0xfb,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
+       0xff,0x2b,0xfa,0x56,0x56,0xfa,0xfa,0xf9,0xfa,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0xfa,
+       0xf9,0xfa,0xfa,0xfa,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xfa,0xfa,0xf9,0xfa,0xf9,
+       0xf9,0xfa,0xfa,0xfa,0xfa,0xf9,0xf9,0xfa,0xfa,0xfa,0x81,0xfa,0xfa,0xfa,0xf9,0xf9,
+       0xfa,0xf9,0x56,0x56,0x56,0x56,0xf9,0xf9,0x56,0xf7,0xf8,0xf9,0x00,0x00,0xf8,0xfc,
+       0xfc,0xfc,0x81,0xf9,0xf9,0x56,0x2b,0x2b,0xf9,0x00,0x00,0xf8,0xfc,0xac,0xfc,0xfc,
+       0xfb,0xfa,0xf9,0xf9,0xfa,0xfa,0xfa,0x81,0xfa,0xfa,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,
+       0xf9,0x56,0xf9,0x56,0x56,0x56,0xf9,0x56,0xfa,0x56,0x56,0x56,0xf9,0x56,0xfa,0xf9,
+       0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0x00,0x00,0xf5,0xf9,0xfa,0x81,0xfb,0xfb,0x81,0xfa,
+       0xfa,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xf6,0x00,0xf5,0xfb,0xfb,0x81,0xfa,0x00,0x00,
+       0xf5,0xfa,0x81,0x81,0x81,0x81,0xf9,0x56,0xf9,0xf9,0xfa,0xfa,0x81,0xfb,0x81,0xf9,
+       0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf7,0x00,0x00,0x56,0xfc,0xfb,
+       0xf8,0xf5,0x56,0xf9,0xfa,0xfa,0xfb,0x81,0x81,0xfa,0xfa,0xf9,0xfa,0xf9,0xf9,0x56,
+       0xf9,0x00,0x00,0xf5,0x81,0xfb,0xfb,0x81,0xfa,0x81,0xf9,0x56,0xf9,0xf9,0xfa,0x81,
+       0x81,0xfa,0xfa,0xf9,0x56,0x56,0xf9,0xfa,0x56,0x56,0xf9,0xf9,0xf9,0x56,0x56,0x56,
+       0xf9,0xf9,0x56,0x56,0x56,0xf9,0xf9,0xf9,0xfa,0xf9,0x56,0x56,0xf9,0x56,0xf9,0xf9,
+       0xf9,0xfa,0x56,0xf9,0x56,0x56,0x56,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,
+       0x56,0xf9,0x56,0xf9,0x56,0xf9,0x56,0xfa,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xfa,
+       0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,
+       0xf9,0xfa,0x56,0x56,0xfa,0x56,0x56,0xf9,0x56,0x56,0xf9,0xf9,0x56,0x56,0xf9,0x56,
+       0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0xf9,
+       0x56,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xfc,0xff,0xff,0xab,0xfc,0xab,0xab,
+       0xfb,0xfb,0x80,0xfb,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
+       0x80,0xff,0x2b,0xf9,0x56,0xfa,0xfa,0xfa,0xf9,0xf9,0xf9,0xfa,0xfa,0xf9,0xf9,0xf9,
+       0xf9,0xfa,0xf9,0xf9,0xfa,0xf9,0xf9,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xf9,
+       0xf9,0xf9,0xf9,0xfa,0xfa,0xf9,0xfa,0xfa,0xf9,0xfa,0xfa,0xfa,0xfa,0xfa,0xf9,0xf9,
+       0xf9,0xf9,0xf9,0x56,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0x2b,0xf8,0xf9,0xf5,0x00,0xf6,
+       0xfc,0xac,0xfc,0x81,0xf9,0x56,0x56,0xf6,0xf8,0x56,0x00,0x00,0xf8,0xfc,0xac,0xfc,
+       0xfb,0x81,0xfa,0xf9,0xfa,0xf8,0x2b,0xf5,0x00,0xf5,0x2b,0xf9,0xf9,0xf9,0xf9,0xf9,
+       0xfa,0xfa,0xf9,0xf9,0x56,0x2b,0xf6,0xf6,0xf5,0xf5,0x2b,0x56,0x56,0x56,0xf9,0xfa,
+       0x56,0x56,0xf9,0x56,0xf9,0xf9,0xf8,0x00,0x00,0xf6,0xfa,0x81,0xfc,0xfb,0xfb,0x81,
+       0xfa,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf7,0x00,0x00,0xf9,0xfc,0xfb,0xfa,0xf6,
+       0x00,0x00,0x2b,0xfa,0x81,0x81,0x81,0xf9,0x56,0xf9,0x56,0xf9,0xfa,0xfa,0x81,0xf9,
+       0xf9,0xf9,0xf9,0x56,0xfa,0xf9,0xfa,0xf9,0x56,0xf9,0x56,0xf9,0xf5,0x00,0xf5,0xfc,
+       0xfc,0xf5,0xf7,0xf9,0xf9,0xfa,0xfa,0xfb,0x81,0xfa,0xf9,0xf9,0xf9,0xf9,0x56,0x56,
+       0xf9,0x56,0xf6,0x00,0x00,0xf7,0xfa,0xfb,0x81,0x81,0xfa,0xf9,0x56,0xf9,0xf9,0xfa,
+       0xfa,0x81,0xfa,0xf9,0xf9,0x56,0x2b,0xf6,0xf6,0xf5,0x2b,0xf7,0xf9,0x56,0x56,0x56,
+       0xf9,0xfa,0x56,0x56,0x2b,0x56,0xf9,0x56,0x2b,0x00,0xf5,0xf7,0xf6,0x00,0x00,0x00,
+       0x00,0xf5,0xf7,0x56,0xf9,0x56,0xf6,0x00,0x00,0x00,0x00,0xf8,0xf9,0xf9,0x56,0x56,
+       0xf7,0xf6,0xf6,0xf5,0xf6,0xf7,0x56,0xf9,0xfa,0x56,0x56,0xf9,0x56,0xf9,0x2b,0xf9,
+       0xf9,0x56,0x2b,0x00,0xf5,0xf8,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,
+       0x56,0xf9,0x56,0x56,0xfa,0xf9,0xf9,0x56,0x56,0x56,0x56,0xfa,0x56,0x56,0xf9,0x56,
+       0xf9,0xf9,0x56,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xfa,0xf9,0xf9,0xf9,0xf9,0x56,0x56,
+       0x56,0xf9,0xf9,0xfa,0xf9,0xfa,0xf9,0xf9,0x56,0xf9,0xfc,0xff,0xff,0xfc,0xab,0xab,
+       0xfb,0xfb,0xaa,0xfb,0x80,0xaa,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
+       0x80,0x80,0xff,0x2b,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0xfa,0xf9,0xfa,
+       0xfa,0xfa,0xf9,0xfa,0xf9,0xfa,0xfa,0xf9,0xfa,0xfa,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,
+       0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xfa,0xf9,0xfa,0xf9,0xfa,
+       0xf9,0x56,0xfa,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf6,0xf8,0xf9,0xf7,0x00,
+       0x00,0xfb,0xfc,0xfb,0x81,0xfa,0xf9,0x56,0x00,0x56,0xf9,0x00,0x00,0x56,0xfb,0xfc,
+       0xfc,0xfb,0x81,0xfa,0xfa,0xf6,0xf6,0xf8,0xfa,0x56,0xf5,0x00,0xf7,0xf9,0xfa,0xfa,
+       0xfa,0xf9,0x56,0x56,0xf7,0xf5,0x2b,0xf9,0xf9,0xfa,0x2b,0x00,0x00,0x56,0x56,0xf9,
+       0x56,0x56,0x56,0x56,0x56,0xf9,0xf9,0x2b,0x00,0x00,0xf7,0xfa,0x81,0xfc,0xfb,0xfb,
+       0x81,0x81,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xf7,0x00,0x00,0xf8,0xfb,0xfb,0x81,
+       0xf8,0x00,0x00,0x00,0xf6,0xfa,0x81,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,
+       0xfa,0xf9,0xfa,0xf9,0xf9,0x56,0x56,0x56,0x56,0x56,0x56,0x56,0xf9,0xf7,0x00,0x00,
+       0x56,0x56,0xf5,0xfa,0xfa,0xfa,0x81,0x81,0xfb,0xfa,0xfa,0xf9,0x56,0xf9,0x56,0x56,
+       0x56,0x56,0x56,0xf7,0x00,0x00,0x00,0xf6,0xfa,0x81,0xfa,0xfa,0xf9,0x56,0xf9,0xfa,
+       0xf9,0xfa,0xf9,0xf9,0xf9,0xf8,0x00,0x2b,0x56,0x56,0x56,0xf8,0x00,0x2b,0xf9,0xf9,
+       0xf9,0x56,0x56,0x56,0x2b,0x00,0xf9,0x56,0x00,0x00,0x00,0x00,0x00,0xfa,0xf7,0x00,
+       0x00,0xf6,0xf9,0x56,0xf9,0x56,0x56,0xf9,0xf9,0x00,0xf5,0x56,0xf9,0xf9,0xf9,0xf8,
+       0x00,0x2b,0xf9,0xfa,0x56,0xf7,0x00,0x2b,0xf9,0x56,0x56,0x56,0x56,0x56,0x2b,0x00,
+       0xf9,0x56,0x00,0x00,0x00,0x00,0x00,0xf9,0x56,0xf9,0xfa,0xf9,0x56,0x56,0x56,0xf9,
+       0x56,0x56,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,
+       0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0x56,0x56,0x56,0x56,
+       0x56,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xf9,0x56,0xf9,0xf9,0xfc,0xff,0xff,0xab,0xfc,
+       0xab,0xab,0xfb,0x80,0xfb,0x80,0x81,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
+       0x80,0x80,0x80,0xff,0x2b,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xfa,0xfa,0xfa,0xf9,0xfa,
+       0xfa,0xfa,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0xfa,0xfa,0xf9,0xf9,0xf9,0xf9,0xfa,0xfa,
+       0xfa,0xfa,0xfa,0xfa,0xfa,0xf9,0xfa,0xfa,0xf9,0xf9,0xfa,0xfa,0xf9,0xfa,0xf9,0xf9,
+       0xfa,0xfa,0xf9,0xfa,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf6,0xf8,0xf9,0x56,
+       0x00,0x00,0xf9,0xfc,0xfc,0xfb,0xfa,0xfa,0xf8,0xf6,0xf9,0xfa,0x00,0x00,0xf8,0xfc,
+       0xfc,0xfc,0xfb,0x81,0xf9,0x00,0xf6,0xf9,0xfa,0xf9,0xfa,0xf8,0x00,0xf6,0xfa,0x81,
+       0xfa,0xf9,0xf9,0xf9,0xf7,0x00,0x2b,0x56,0xf9,0xf9,0xf9,0xf9,0xf6,0x00,0xf7,0xfa,
+       0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf6,0x00,0x00,0x56,0x81,0xfb,0xfc,0xfc,
+       0x81,0x81,0xfa,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf8,0x00,0x00,0x2b,0xfc,0xfc,
+       0xfb,0xfa,0xf5,0x00,0x00,0x00,0x00,0xf8,0xfa,0x81,0xfa,0xfa,0xf9,0x56,0xf9,0xf9,
+       0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0x00,
+       0x00,0xf5,0xf5,0xf8,0x81,0x81,0xfa,0x81,0x81,0xfa,0xfa,0xfa,0xf9,0xf9,0x56,0xfa,
+       0xf9,0xf9,0xf9,0xf9,0xf9,0x00,0x00,0x00,0x00,0x00,0xf8,0xfa,0xfa,0xf9,0x56,0xf9,
+       0xf9,0xf9,0xf9,0xf9,0xf9,0xf7,0x00,0xf7,0xf9,0xfa,0xf9,0xf9,0xf9,0xf7,0x00,0x2b,
+       0xf9,0xfa,0xf9,0x56,0xf5,0x00,0x00,0xf9,0xf6,0xf7,0xf7,0x00,0x00,0xf5,0xf9,0xfa,
+       0x00,0x00,0xf6,0xfa,0xfa,0x81,0xfa,0xf9,0xfa,0xf9,0x00,0xf8,0xf9,0xf9,0xf9,0xf7,
+       0x00,0xf7,0xf9,0xf9,0x56,0xf9,0xfa,0xf7,0x00,0x2b,0xfa,0xf9,0xf9,0x56,0xf5,0x00,
+       0x00,0xf9,0xf6,0xf7,0xf7,0x00,0x00,0xf5,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,
+       0x56,0xf9,0x56,0xfa,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,
+       0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xf9,0xf9,0x56,0x56,0x56,0xf9,0xf9,0xf9,
+       0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xf9,0xfc,0xff,0xff,0xfc,
+       0xab,0xab,0xfb,0xaa,0xfb,0xaa,0xfb,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
+       0x80,0x80,0x80,0x80,0xff,0x2b,0x56,0x56,0xf9,0x56,0x56,0x56,0xf9,0xf9,0xf9,0xfa,
+       0xfa,0xfa,0xf9,0xfa,0xfa,0xfa,0xfa,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0xfa,0xfa,
+       0xfa,0xfa,0xf9,0xfa,0xfa,0xf9,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xf9,
+       0xf9,0x81,0xf9,0xfa,0xfa,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf6,0xf8,0xf9,
+       0xf9,0xf5,0x00,0x2b,0xfc,0xfb,0xfb,0xfa,0xfa,0x2b,0x2b,0xf9,0xfa,0x00,0x00,0x56,
+       0xfb,0xac,0xac,0xfb,0x81,0xf6,0x00,0xf8,0xfa,0xfa,0x81,0x81,0x56,0x00,0x00,0x81,
+       0x81,0x81,0xfa,0xfa,0x56,0x00,0xf6,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf8,0x00,0xf7,
+       0xfa,0xfa,0x81,0xf9,0xfa,0xf9,0xfa,0xf9,0xfa,0x00,0x00,0x00,0x56,0x81,0xfc,0xfc,
+       0xfb,0x81,0xfa,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x00,0x00,0xf6,0xfb,
+       0xfc,0xfb,0x81,0x56,0xf5,0x00,0x00,0x00,0x00,0xf5,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,
+       0xfa,0xf9,0x56,0x56,0x56,0x56,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xfa,0xf9,
+       0xf7,0x00,0x00,0x00,0xfb,0xfb,0xfb,0x81,0x81,0x81,0xfa,0xfa,0xfa,0xf9,0x56,0xf9,
+       0xf9,0x56,0xf9,0xfa,0xf9,0xf9,0x56,0xf5,0x00,0x00,0x00,0x00,0xf5,0x56,0xfa,0x56,
+       0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0x00,0xf6,0x56,0x56,0xf9,0xf9,0xf9,0xfa,0xf9,0x00,
+       0x00,0xf9,0xfa,0xf9,0xf8,0x2b,0x00,0x00,0x2b,0xf8,0xfa,0xfa,0xf8,0x00,0xf8,0xfa,
+       0x81,0x2b,0x00,0xf5,0x81,0x81,0x81,0xfa,0xfa,0xfa,0x56,0xf5,0xf9,0x81,0xfa,0xfa,
+       0xf5,0xf6,0xfa,0xf9,0xf9,0xf9,0xf9,0xfa,0xfa,0xf5,0x00,0xf9,0xfa,0xfa,0x56,0x2b,
+       0x00,0x00,0x2b,0xf8,0xf9,0xfa,0xf7,0xf5,0xf8,0xfa,0xfa,0xfa,0xfa,0xfa,0xf9,0xf9,
+       0xf9,0xf9,0x56,0x56,0xf9,0x56,0x56,0xf9,0x56,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,
+       0xf9,0x56,0xf9,0x56,0xf9,0xfa,0x56,0x56,0x56,0x56,0x56,0x56,0x56,0xf9,0xfa,0xf9,
+       0xf9,0x56,0x56,0xfa,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0xfc,0xff,0xff,
+       0xfc,0xab,0xfb,0xab,0xfb,0xaa,0xfb,0x80,0x80,0xfb,0x80,0x80,0x80,0x80,0x80,0x80,
+       0x80,0x80,0x80,0x80,0x80,0xff,0x2b,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0x56,0xf9,
+       0xf9,0xfa,0xf9,0xf9,0xfa,0xf9,0xf9,0xfa,0xfa,0xf9,0xfa,0xf9,0xfa,0xfa,0xfa,0xf9,
+       0xfa,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0xfa,0xfa,0xf9,0xf9,0xfa,0xfa,0xf9,0xf9,0xf9,
+       0xf9,0xfa,0xfa,0xf9,0xf9,0xfa,0xf9,0xf9,0xfa,0xf9,0xf9,0x56,0x56,0x56,0xf6,0xf8,
+       0xfa,0xfa,0xf7,0x00,0xf5,0xfc,0xfc,0xfb,0x81,0xfa,0xf5,0xf8,0xf9,0xf9,0xf5,0x00,
+       0xf8,0xfb,0xfc,0xfc,0xfb,0xf8,0x00,0xf5,0xfa,0x81,0x81,0x81,0x81,0xf9,0x00,0x00,
+       0x81,0xfb,0x81,0xfa,0x81,0xf6,0x00,0xf8,0xf9,0xf9,0xfa,0xfa,0xfa,0xfa,0x81,0x2b,
+       0xf9,0xfa,0x81,0x81,0xfa,0xf9,0xf9,0xf9,0x56,0x56,0x00,0x00,0x00,0xf9,0x81,0xfc,
+       0xfc,0xfc,0x81,0x81,0xf9,0xf9,0x56,0x56,0xf9,0x56,0x56,0x56,0x56,0x00,0x00,0xf5,
+       0xfb,0xfc,0xfc,0xfb,0x81,0xf9,0xf6,0x00,0x00,0x00,0x00,0x00,0x2b,0xf9,0xfa,0xf9,
+       0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,
+       0xf9,0x56,0xf5,0x00,0x00,0xfc,0xfc,0xfb,0xfc,0x81,0xfa,0xf9,0xfa,0xfa,0xf9,0x56,
+       0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0x56,0xf5,0x00,0x00,0x00,0x00,0x00,0x2b,
+       0xf9,0xfa,0xf9,0xf9,0x56,0x56,0x2b,0x00,0xf7,0xf9,0xf9,0xfa,0xfa,0xfa,0x81,0x81,
+       0xf6,0x00,0x2b,0xfa,0xfa,0xfa,0xf9,0x00,0x00,0xf5,0xfa,0xfa,0xfa,0xfa,0x81,0x81,
+       0x81,0xfb,0x56,0x00,0x00,0x81,0xfb,0xfb,0xfb,0xfa,0x81,0xf7,0x2b,0xfa,0x81,0x81,
+       0xf7,0x00,0x56,0x81,0xfa,0xf9,0xfa,0xfa,0x81,0xfa,0xf6,0x00,0xf7,0xfa,0xfa,0xfa,
+       0xf9,0x00,0x00,0xf5,0xfa,0xfa,0x81,0xfa,0xfa,0x81,0xfb,0xfb,0xfb,0x81,0xfa,0xf9,
+       0xf9,0x56,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xf9,
+       0x56,0x56,0x56,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,
+       0x56,0x56,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xfc,0xff,
+       0xff,0xab,0xfc,0xab,0xfb,0xfb,0xfb,0x80,0xfb,0xaa,0x80,0x80,0x80,0x80,0x80,0x80,
+       0x80,0x80,0x80,0x80,0x80,0x80,0xff,0x2b,0xf9,0x56,0xf9,0x56,0x56,0xfa,0xf9,0xf9,
+       0xfa,0xfa,0xfa,0xf9,0x81,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xfa,0xf9,
+       0xf9,0xfa,0xfa,0xf9,0xfa,0xfa,0xfa,0xf9,0xfa,0xfa,0xfa,0xfa,0xf9,0xf9,0xf9,0xf9,
+       0xf9,0xf9,0xfa,0xfa,0xf9,0xfa,0xf9,0xfa,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0xf6,
+       0x56,0xfa,0xfa,0xf8,0x00,0x00,0xfa,0xfc,0xfb,0xfb,0xf9,0xf5,0xf9,0xfa,0xfa,0xf6,
+       0x00,0x2b,0xfb,0xfc,0xfb,0xfb,0xf5,0x00,0x2b,0x81,0x81,0x81,0x81,0xfb,0xf9,0x00,
+       0x00,0xfb,0xfb,0xfb,0x81,0xf9,0x00,0x00,0x56,0x56,0xf9,0x81,0xfa,0xfa,0x81,0x81,
+       0xfa,0x81,0x81,0xfb,0xfb,0xfa,0xfa,0xf9,0x56,0x56,0x56,0x00,0x00,0x00,0xf9,0xfb,
+       0xfc,0xfc,0xfb,0xfa,0xf9,0x56,0xf9,0x56,0xf9,0x56,0x56,0xf9,0x56,0x56,0x00,0x00,
+       0x00,0xfb,0xfc,0xfc,0xfb,0x81,0xfa,0x81,0xf8,0xf5,0x00,0x00,0x00,0x00,0xf6,0xfa,
+       0xf9,0xf9,0x56,0x56,0x56,0x56,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,
+       0x56,0xf9,0xf9,0xf6,0x00,0x00,0x56,0xfc,0xfc,0xfc,0x81,0xfa,0x81,0xfa,0xf9,0x56,
+       0xf9,0xf9,0xfa,0x56,0xf9,0x56,0x56,0x56,0x56,0xf9,0xfa,0x56,0xf5,0x00,0x00,0x00,
+       0x00,0xf6,0xfa,0xf9,0xf9,0xf9,0x56,0x00,0x00,0xf9,0xfa,0xfa,0xfa,0x81,0x81,0xfa,
+       0xfa,0xf6,0x00,0xf5,0x81,0x81,0x81,0xfa,0x00,0x00,0x2b,0xfa,0x81,0x81,0x81,0x81,
+       0x81,0xfb,0xfc,0xfb,0x00,0x00,0x56,0xfc,0xfc,0xfb,0x81,0xfa,0xf5,0xf7,0xf9,0xfa,
+       0xfa,0x00,0x00,0x81,0x81,0xfa,0xfa,0x81,0x81,0x81,0xfa,0xf6,0x00,0xf5,0x81,0x81,
+       0xfa,0xfa,0x00,0x00,0x2b,0xfa,0xfb,0xfb,0x81,0x81,0xfb,0x81,0xfb,0xfb,0x81,0xfa,
+       0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,
+       0xf9,0xf9,0xf9,0xf9,0xfa,0x56,0x56,0x56,0x56,0x56,0x56,0x56,0xf9,0xfa,0x56,0x56,
+       0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0x56,0x56,0xf9,0xf9,0xfc,
+       0xff,0xff,0xab,0xab,0xab,0xab,0xfb,0xaa,0xfb,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
+       0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xff,0xf6,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0x56,
+       0x56,0xfa,0xf9,0xf9,0xfa,0x81,0xf9,0xf9,0xfa,0xf9,0xfa,0xf9,0xf9,0xfa,0xfa,0xfa,
+       0xf9,0x81,0xfa,0xfa,0xf9,0xfa,0xf9,0xf9,0xfa,0xfa,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,
+       0xfa,0xf9,0xf9,0xfa,0xfa,0xf9,0xfa,0xfa,0xf9,0xfa,0xf9,0x56,0xfa,0xf9,0xf9,0xfa,
+       0xf5,0xf9,0xf9,0xf9,0xfa,0x00,0x00,0xf8,0xfb,0xfb,0xfb,0xf7,0x2b,0xfa,0xf9,0xfa,
+       0xf6,0x00,0xf6,0xfb,0xfc,0xfc,0xfb,0x00,0x00,0xf9,0x81,0x81,0xfb,0xfb,0xfb,0xf9,
+       0x00,0x00,0xfb,0xfb,0xfc,0xfb,0xf8,0x00,0xf6,0xf9,0xf9,0x81,0x81,0x81,0x81,0x81,
+       0xfa,0xf9,0xfa,0x81,0x81,0x81,0xfa,0xfa,0xf9,0xf9,0x56,0xf9,0x00,0x00,0x00,0x56,
+       0xfc,0xfc,0xfc,0xfb,0x81,0xf9,0x56,0xfa,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0x00,
+       0x00,0xf5,0xfb,0xfc,0xfc,0xfb,0x81,0xfa,0xfa,0x81,0x81,0xf7,0x00,0x00,0x00,0x00,
+       0x2b,0xfa,0xfa,0xf9,0xf9,0xf9,0x56,0xf9,0xfa,0x56,0xf9,0xfa,0xfa,0xf9,0xf9,0xf9,
+       0xf9,0xf9,0xf9,0xf9,0xf5,0x00,0x00,0xf5,0xfc,0xac,0xfc,0xfb,0x81,0xfa,0xf9,0x56,
+       0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xfa,0xfb,0x81,0xf7,0x00,
+       0x00,0x00,0x00,0x2b,0xfa,0x81,0xfa,0xf7,0x00,0xf5,0xf9,0xf9,0xfa,0x81,0x81,0x81,
+       0xf9,0xf7,0x00,0x00,0x00,0x81,0xfb,0x81,0xfa,0x00,0x00,0xf8,0x81,0xfb,0xfc,0xfb,
+       0xfb,0x81,0xfb,0xfc,0xfb,0xf6,0x00,0xf7,0xfb,0xfc,0xfb,0xfb,0xfa,0xf5,0xf9,0xfa,
+       0x81,0xf8,0x00,0xf5,0x81,0x81,0xfa,0x81,0xfb,0x81,0xf9,0xf7,0x00,0x00,0x00,0x81,
+       0x81,0x81,0xfa,0x00,0x00,0xf7,0x81,0xfc,0xfb,0xfb,0xfb,0x81,0xfb,0xfb,0xfb,0x81,
+       0x81,0xfa,0xf9,0xfa,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0x56,0x56,
+       0xfa,0xf9,0x56,0xfa,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,
+       0xfa,0xfa,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,
+       0xfb,0xff,0xff,0xfc,0xfc,0xab,0xfb,0xab,0x80,0xfb,0x80,0xfb,0x80,0x80,0x80,0x80,
+       0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xff,0x2b,0xf9,0x56,0xf9,0x56,0x56,0x56,
+       0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0xfa,0xfa,0xfa,0xfa,0xfa,0xf9,0xfa,0xfa,0xf9,0xfa,
+       0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0xfa,0xfa,0xf9,
+       0xf9,0xfa,0xfa,0xfa,0xfa,0xf9,0xfa,0xf9,0xf9,0xfa,0xfa,0xfa,0xfa,0xf9,0x56,0x56,
+       0xf9,0x00,0xf9,0xfa,0x81,0xfa,0xf6,0x00,0xf6,0xfc,0xfb,0xfb,0xf6,0x56,0xfa,0xf9,
+       0xfa,0xf6,0x00,0xf6,0xfb,0xfc,0xfc,0xfb,0xfa,0xfa,0x81,0x81,0xfb,0xfb,0xfb,0xfb,
+       0x56,0x00,0x00,0x81,0xfb,0xfc,0xfb,0xf6,0x00,0x2b,0x56,0xfa,0x81,0x81,0x81,0x81,
+       0xfa,0xf9,0xf9,0xfa,0x81,0x81,0x81,0xfa,0x81,0xf9,0x56,0x56,0xf9,0x00,0x00,0x00,
+       0xf9,0xfc,0xfc,0xfc,0xfb,0x81,0xfa,0xf9,0xf9,0x56,0x56,0xf9,0x56,0x56,0xf9,0xf8,
+       0x00,0x00,0xf6,0xfb,0xfc,0xfc,0xfc,0x81,0xfa,0xfa,0xfa,0xfb,0xfc,0xfa,0xf5,0x00,
+       0x00,0x00,0xf9,0xfb,0x81,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0x56,0x56,0x56,0x56,
+       0x56,0x56,0x56,0xf9,0xf7,0xf5,0xf6,0x00,0x00,0x56,0xac,0xfc,0xfb,0x81,0xfa,0x56,
+       0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0x81,0x81,0xfc,
+       0xfa,0xf5,0x00,0x00,0x00,0xf9,0x81,0xfa,0x2b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+       0x00,0x00,0x00,0x00,0x00,0xf5,0xfb,0xfb,0xfb,0x81,0x00,0x00,0x56,0xfb,0xfc,0xfc,
+       0xfb,0xfb,0x81,0x81,0xfb,0x81,0xf7,0x00,0xf5,0xfb,0xfc,0xfc,0x81,0xf7,0x2b,0xf9,
+       0xf9,0xfa,0xf7,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf5,
+       0x81,0xfc,0xfb,0x81,0x00,0x00,0xf9,0xfb,0xfc,0xfc,0xfb,0x81,0x81,0x81,0xfb,0xfb,
+       0x81,0xfa,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0x56,
+       0xfa,0xf9,0x56,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,
+       0x56,0x56,0x56,0x56,0x56,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xfa,0xf9,0x56,0x56,0xfa,
+       0x56,0xfc,0xff,0xff,0xfc,0xab,0xfb,0xaa,0xfb,0xfb,0xaa,0xfb,0x80,0x80,0x80,0x80,
+       0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xff,0x2b,0xf9,0x56,0xf9,0xf9,0xf9,
+       0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xfa,0xf9,0xf9,0xfa,0xf9,0xfa,0xfa,0xfa,
+       0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0xfa,0xfa,0xf9,0x81,0xfa,0xf9,0xf9,0xfa,0xfa,0xf9,
+       0xf9,0xf9,0xfa,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0xfa,0xfa,0xf9,0xfa,0xf9,0xf9,
+       0xf9,0xf9,0x00,0xf9,0xfa,0xfa,0xfa,0xf8,0x00,0x00,0x81,0xfc,0xfb,0x00,0x81,0xf9,
+       0xfa,0xfa,0xf6,0x00,0xf6,0xfb,0xfb,0xfc,0xfb,0xfb,0x81,0x81,0x81,0xfb,0xfc,0xfc,
+       0x81,0x56,0x00,0x00,0x81,0xfb,0xfc,0xfb,0xf5,0x00,0xf7,0xf9,0xfa,0x81,0x81,0x81,
+       0xfa,0xf9,0x56,0xf9,0xfa,0xfa,0xf9,0xfa,0xfa,0xfa,0xf9,0xf9,0x56,0xfa,0xf6,0x00,
+       0x00,0xf9,0xfc,0xfc,0xfc,0xfb,0x81,0xf9,0xf9,0x56,0x56,0xf9,0x56,0x56,0xf9,0x56,
+       0xf8,0x00,0x00,0xf6,0x81,0xfc,0xfc,0xfc,0x81,0xfa,0xfa,0xfa,0x81,0xfb,0xfc,0x81,
+       0xf5,0x00,0x00,0xf8,0xfb,0x81,0xfa,0xfa,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,
+       0xfa,0xf9,0xf9,0xf9,0x56,0xf5,0xf7,0xf9,0xf5,0x00,0xf5,0xfc,0xfc,0xfb,0x81,0xf9,
+       0x56,0xf9,0xfa,0xf9,0x56,0x56,0xf9,0xfa,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xfa,0x81,
+       0x81,0xfb,0x81,0xf5,0x00,0x00,0xf8,0xfb,0x81,0xf5,0x00,0x2b,0xfa,0x81,0x81,0xfb,
+       0xfb,0x81,0xfa,0xf9,0xf9,0xfa,0x81,0xfb,0xfc,0xfb,0xfb,0x00,0x00,0x56,0xfb,0xfc,
+       0xfc,0xfb,0xfb,0x81,0x81,0xfa,0xfa,0x56,0x00,0x00,0xfa,0xfc,0xfc,0x81,0x2b,0xf8,
+       0xf9,0xfa,0xfa,0xf6,0x00,0xf7,0xfa,0x81,0x81,0xfb,0x81,0xfa,0xfa,0xfa,0xfa,0xf9,
+       0xfa,0x81,0xfc,0xfb,0xfb,0x00,0x00,0x56,0xfb,0xfc,0xfc,0xfb,0x81,0xfa,0x81,0xfa,
+       0xfa,0xfa,0xf9,0xf9,0xf9,0xf9,0x56,0xfa,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0xf9,
+       0xf9,0xfa,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,
+       0x56,0xf9,0xf9,0x56,0x56,0xfa,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xf9,
+       0x56,0x56,0xfc,0xff,0xff,0xab,0xfc,0xab,0xfb,0xfb,0xaa,0x81,0x80,0xaa,0x80,0x80,
+       0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xff,0xf6,0x56,0x56,0xfa,0xf9,
+       0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0xfa,
+       0xf9,0xfa,0xfa,0xfa,0xf9,0xf9,0xfa,0xfa,0xfa,0xf9,0xfa,0xfa,0xf9,0xf9,0xf9,0xfa,
+       0xf9,0xf9,0xfa,0xfa,0xf9,0xfa,0xfa,0xfa,0xf9,0xf9,0xfa,0x81,0xf9,0xf9,0xfa,0xfa,
+       0xfa,0xfa,0xf9,0x00,0xf9,0xfa,0xfa,0xfa,0x56,0x00,0x00,0x56,0xfb,0xf9,0x2b,0x81,
+       0xfa,0xfa,0xfa,0xf6,0x00,0xf6,0x81,0xfb,0xfb,0xfb,0x81,0x81,0x81,0x81,0xfb,0xfc,
+       0xfb,0x56,0xf5,0x00,0x00,0x81,0xfb,0xfc,0xfc,0x00,0x00,0xf7,0xfa,0x81,0xfb,0xfb,
+       0x81,0xfa,0xfa,0xf9,0x56,0xfa,0xf9,0xf9,0xf9,0xf9,0xfa,0x56,0x56,0xf9,0xf9,0x2b,
+       0x00,0x00,0xf8,0xfc,0xfc,0xac,0xfc,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,
+       0xf9,0xf8,0x00,0x00,0xf8,0x81,0xfc,0xfc,0xfc,0xfb,0xfa,0xf9,0xf9,0xfa,0xfa,0x81,
+       0xfb,0x81,0x00,0x00,0xf5,0xfc,0xfb,0x81,0xfa,0xfa,0xf9,0xf9,0xf9,0xf9,0x56,0x56,
+       0xf9,0xf9,0xf9,0x56,0xf9,0xf7,0x00,0xf9,0xf9,0xf7,0x00,0x00,0x56,0xac,0xfb,0x81,
+       0xfa,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0x56,0xfa,
+       0xfa,0xfa,0x81,0xfc,0x81,0x00,0x00,0xf5,0xac,0xfc,0x00,0x00,0xf7,0xfa,0x81,0xfb,
+       0xfb,0x81,0x81,0x81,0xfa,0xfa,0xfa,0x81,0xfb,0xfb,0xfc,0xfb,0x00,0x00,0x56,0x81,
+       0xfb,0xfc,0xfb,0x81,0xfa,0xf9,0xfa,0xf9,0xfa,0xf5,0x00,0xf8,0xfc,0xfb,0xfb,0xf5,
+       0xfa,0xfa,0xfa,0xfa,0x00,0x00,0xf8,0x81,0x81,0xfb,0xfb,0xfb,0x81,0xfa,0xfa,0xfa,
+       0xfa,0x81,0xfb,0xfc,0xfb,0xfb,0x00,0x00,0x56,0x81,0xfc,0xfc,0xfb,0x81,0x81,0xfa,
+       0xf9,0xf9,0xfa,0xfa,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0x56,0x56,0xf9,0xf9,0xf9,
+       0x56,0xf9,0x56,0xf9,0x56,0xf9,0x56,0x56,0xf9,0x56,0x56,0x56,0xf9,0xf9,0xf9,0x56,
+       0xf9,0x56,0xfa,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xfa,0x56,0xf9,0xf9,
+       0xf9,0x56,0xf9,0xfc,0xff,0xff,0xab,0xab,0xab,0xab,0xfb,0xfb,0xaa,0x81,0x80,0x80,
+       0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xff,0x2b,0x56,0xf9,0xf9,
+       0xf9,0x56,0x56,0x56,0x56,0x56,0xf9,0x56,0xf9,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,
+       0xf9,0xfa,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0xfa,0xf9,0xfa,0xfa,0xf9,0xfa,0xfa,0xfa,
+       0xfa,0xf9,0xfa,0xfa,0xfa,0xf9,0xfa,0xfa,0xf9,0xf9,0xfa,0xfa,0xf9,0xf9,0xfa,0x81,
+       0xf9,0xf9,0x81,0xf9,0x00,0xf9,0xfa,0x81,0xfa,0xfa,0x00,0x00,0x2b,0xfb,0xf7,0xf8,
+       0x81,0xfa,0xfa,0xfa,0xf6,0x00,0x2b,0xfb,0xfb,0xfc,0xfc,0x81,0xfa,0x81,0x81,0xfb,
+       0xf9,0xf6,0x2b,0xf7,0x00,0x00,0xfa,0xfb,0xfb,0xfb,0x00,0x00,0xf7,0x81,0x81,0xfc,
+       0xfb,0x81,0x81,0xfa,0x56,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0xfa,0x56,0xf9,0xf9,0xf9,
+       0xf7,0x00,0x00,0xf7,0xfc,0xac,0xfc,0xfb,0xfa,0xfa,0xfa,0x56,0x56,0xfa,0x56,0x56,
+       0x56,0xf9,0x2b,0x00,0x00,0x56,0x81,0xfc,0xfc,0xfc,0x81,0xf9,0xf9,0x56,0xf9,0xf9,
+       0xfa,0x81,0xfb,0xf7,0x00,0x00,0xac,0xfc,0xfc,0x81,0xfa,0xf9,0xf9,0x56,0xf9,0x56,
+       0x56,0x56,0xf9,0x56,0x56,0x56,0xf5,0xf7,0xf9,0xf9,0xf9,0xf5,0x00,0xf5,0xfc,0xfc,
+       0xfb,0x81,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xfa,0x56,0xf9,0xf9,0xf9,0x56,0xf9,
+       0xfa,0xf9,0xf9,0xfa,0xfb,0xfb,0x2b,0x00,0x00,0xac,0xfc,0x00,0x00,0xf8,0x81,0xfb,
+       0xfc,0xfc,0xfb,0x81,0x81,0xfa,0xfa,0xfa,0x81,0xfb,0xfb,0xfc,0xfb,0x00,0x00,0xf9,
+       0xfb,0xfc,0xfb,0xfb,0x81,0xfa,0xf9,0xf9,0xf9,0xf9,0xf6,0x00,0x2b,0xfb,0xfb,0x56,
+       0x2b,0xfa,0xf9,0xfa,0xfa,0x00,0x00,0xf7,0xfb,0xfb,0xfc,0xfc,0xfb,0x81,0x81,0x81,
+       0xfa,0xfa,0x81,0xfb,0xfc,0xfb,0xfb,0x00,0x00,0x56,0xfb,0xfc,0xfc,0xfb,0x81,0xfa,
+       0xf9,0x56,0xf9,0xfa,0x56,0x56,0xfa,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xfa,0x56,
+       0x56,0x56,0x56,0xf9,0x56,0xf9,0x56,0xf9,0xfa,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,
+       0xf9,0xf9,0x56,0xf9,0x56,0x56,0xf9,0xf9,0x56,0x56,0x56,0xf9,0xf9,0x56,0x56,0x56,
+       0xf9,0x56,0xfa,0xf9,0xfc,0xff,0xff,0xfc,0xfc,0xab,0xfb,0xaa,0xfb,0x80,0xfb,0x80,
+       0xfb,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xff,0x2b,0x56,0xf9,
+       0xf9,0x56,0x56,0x56,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xf9,
+       0xfa,0xfa,0xfa,0xfa,0xf9,0xf9,0xfa,0xfa,0xfa,0xfa,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,
+       0xf9,0xfa,0xfa,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0xfa,0xf9,0xf9,0xfa,0xfa,0xf9,0xfa,
+       0xfa,0xf9,0xfa,0xfa,0xfa,0xf5,0xfa,0xfa,0x81,0xfa,0xfa,0x2b,0x00,0xf5,0xfb,0xf6,
+       0x81,0xfb,0x81,0x81,0x81,0xf6,0x00,0xf6,0x81,0xfb,0xfc,0xfb,0xfb,0x81,0xfb,0xfa,
+       0x2b,0xf6,0x56,0x81,0x56,0x00,0x00,0x81,0xfb,0xfc,0xfc,0xf5,0x00,0x2b,0x81,0xfb,
+       0xfb,0xfb,0xfa,0xf9,0x56,0x56,0x56,0xf9,0x56,0x56,0x56,0x56,0xf9,0xf9,0x56,0xf9,
+       0x56,0x56,0x00,0x00,0xf5,0xfb,0xfc,0xac,0xfb,0xfa,0xfa,0xf9,0x56,0xf9,0xf9,0xf9,
+       0xf9,0xf9,0x56,0xf6,0x00,0x00,0x81,0xfb,0xfc,0xfc,0xfa,0x81,0xf9,0xf9,0xf9,0xf9,
+       0xf9,0xfa,0xfa,0xfa,0xf8,0x00,0x00,0xac,0xac,0xfc,0xfb,0x81,0xfa,0xf9,0x56,0x56,
+       0xf9,0xf9,0xfa,0xfa,0xf9,0x56,0xf7,0x00,0x56,0x56,0xf9,0xfa,0xf8,0x00,0x00,0x56,
+       0xfc,0xfb,0xfa,0xf9,0xf9,0xf9,0x56,0x56,0x56,0x56,0xf9,0xf9,0x56,0xf8,0x56,0xf9,
+       0x56,0x56,0xf9,0xf9,0xf9,0xfa,0xfa,0x56,0x00,0x00,0xfc,0xac,0x00,0x00,0xf7,0xfb,
+       0xfc,0xfc,0xfc,0xfb,0x81,0x81,0xfa,0xfa,0xfa,0x81,0xfb,0xfb,0xfb,0x81,0x00,0x00,
+       0x56,0x81,0xfb,0xfc,0xfb,0x81,0xfa,0xfa,0x56,0x56,0x56,0xf7,0x00,0xf5,0xfc,0xfc,
+       0xf7,0x56,0x81,0xfa,0xf9,0xfa,0x00,0x00,0xf7,0x81,0xfb,0xfb,0xfc,0xfb,0x81,0x81,
+       0xfa,0xfa,0x81,0x81,0x81,0xfb,0xfb,0x81,0x00,0x00,0x56,0x81,0xfb,0xfb,0xfb,0xfa,
+       0xfa,0xf9,0x56,0xfa,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0x56,
+       0x56,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0x56,0xf9,
+       0xfa,0xf9,0x56,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,0x56,
+       0xf9,0x56,0xf9,0x56,0xf9,0xfc,0xff,0xff,0xfc,0xab,0xfb,0xab,0xfb,0xaa,0xfb,0xaa,
+       0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xff,0x2b,0xf9,
+       0x56,0x56,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xf9,0x56,0xf9,
+       0xf9,0xfa,0xfa,0xfa,0xf9,0xf9,0xfa,0xf9,0xfa,0xfa,0xf9,0xfa,0xf9,0x81,0xfa,0xfa,
+       0xf9,0xf9,0xf9,0xfa,0xf9,0xfa,0xf9,0xfa,0xf9,0xf9,0xf9,0xfa,0xf9,0x81,0xf9,0xf9,
+       0xfa,0xf9,0xf9,0xfa,0xfa,0xf8,0xf6,0xfa,0xfa,0xfa,0x81,0xfa,0xf8,0x00,0x00,0xf8,
+       0xf5,0xfc,0xfb,0x81,0x81,0xfa,0xf6,0x00,0xf6,0x81,0xfb,0xfc,0xfb,0xfb,0x81,0x56,
+       0x00,0xf8,0x81,0xfa,0x81,0x56,0x00,0x00,0x81,0xfc,0xfc,0xfb,0xf6,0x00,0xf6,0x81,
+       0xfc,0xfb,0xfb,0x81,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,
+       0xf9,0xf9,0xf9,0x2b,0x00,0x00,0x81,0xfc,0xfc,0xfb,0xfa,0xfa,0xf9,0x56,0xf9,0xf9,
+       0xf9,0x56,0xf9,0x56,0x00,0x00,0x2b,0xfa,0xfb,0xfc,0xfa,0x56,0x81,0xfa,0xf9,0xfa,
+       0x56,0x56,0xfa,0xf9,0xf9,0x56,0x00,0xf5,0xfc,0xfc,0xfc,0xfb,0xfa,0xfa,0xf9,0x56,
+       0xf9,0xf9,0xfa,0x56,0xf9,0x56,0x56,0xf5,0x2b,0x56,0xf9,0xfa,0x81,0x81,0xf5,0x00,
+       0xf5,0xfb,0xfc,0xfb,0xfa,0xf9,0xfa,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf8,0xf7,0xf9,
+       0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xfa,0xf9,0x56,0x00,0xf5,0xfc,0xac,0x2b,0x00,0xf6,
+       0xfb,0xfb,0xfc,0xfb,0xfb,0x81,0xfa,0xfa,0xfa,0xfa,0x81,0xfa,0x81,0x81,0xfa,0x00,
+       0x00,0x56,0x81,0xfb,0xfb,0x81,0x81,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x00,0x00,0xf9,
+       0xfb,0xf5,0x81,0x81,0xfa,0xf9,0x81,0xf6,0x00,0xf6,0x81,0xfb,0xfc,0xfc,0xfb,0x81,
+       0xfa,0x81,0x81,0xfa,0xfa,0x81,0x81,0x81,0xfa,0x00,0x00,0x56,0x81,0xfb,0xfb,0xfb,
+       0xfa,0xfa,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0x56,
+       0xf9,0xf9,0x56,0xf9,0xfa,0x56,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xf9,0x56,0x56,0x56,
+       0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0x56,0x56,
+       0xf9,0xf9,0xf9,0xfa,0xf9,0x56,0xfc,0xff,0xff,0xab,0xab,0xab,0xfb,0xfb,0xfb,0x80,
+       0x80,0xfb,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xff,0xf6,
+       0x56,0x56,0xf9,0xfa,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0x56,0x56,0xf9,0xf9,0xfa,0xf9,
+       0x56,0xf9,0xf9,0xfa,0xf9,0xfa,0xf9,0xfa,0xfa,0xf9,0xf9,0xf9,0xf9,0xfa,0xfa,0xfa,
+       0xf9,0xfa,0xfa,0xfa,0xfa,0xf9,0xf9,0xfa,0xfa,0xfa,0xf9,0xf9,0xfa,0xfa,0xf9,0xfa,
+       0xf9,0xfa,0xf9,0xf9,0xfa,0xf9,0xf8,0xf6,0xfa,0xfa,0xfa,0xfa,0xfa,0xf9,0x00,0x00,
+       0x00,0xf8,0xfc,0xfb,0xfb,0x81,0xfa,0xf6,0x00,0xf6,0xfb,0xfb,0xfc,0xfb,0x81,0xf8,
+       0x00,0xf8,0xfa,0xfa,0xfa,0xfa,0xf8,0x00,0x00,0xfb,0xfc,0xfc,0xfc,0xf8,0x00,0xf5,
+       0x81,0xfb,0xfc,0xfb,0x81,0xf9,0x56,0xf9,0xf9,0xfa,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,
+       0xf9,0x56,0x56,0xf9,0xf8,0x00,0x00,0xf8,0xfc,0xfc,0xfb,0x81,0xfa,0x56,0x56,0xf9,
+       0x56,0x56,0x56,0xf9,0x2b,0x00,0x00,0x56,0xfa,0xfb,0xfb,0xfa,0xf6,0x81,0xfa,0xf9,
+       0xf9,0xf9,0xf9,0x56,0x56,0x56,0xf8,0x00,0xf6,0xfb,0xfc,0xfc,0xfb,0x81,0xfa,0xf9,
+       0xf9,0x56,0xf9,0x56,0x56,0x56,0x56,0xf7,0x00,0xf9,0xf9,0xf9,0x81,0x81,0x81,0xf8,
+       0x00,0x00,0x56,0xfc,0x81,0x81,0xfa,0xfa,0xf9,0x56,0xf9,0xfa,0xf9,0xf9,0xf8,0xf5,
+       0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf8,0x00,0xf6,0xfb,0xfc,0xf7,0x00,
+       0x00,0xfb,0xfc,0xfb,0xfb,0x81,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xf9,
+       0x00,0x00,0x56,0xfb,0xfb,0xfb,0x81,0x81,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf5,0x00,
+       0xf8,0xf9,0x2b,0xfb,0xfb,0xfa,0xfa,0x81,0x2b,0x00,0x00,0xfa,0xfb,0xfc,0xfb,0x81,
+       0x81,0xfa,0xfa,0xfa,0xf9,0xfa,0xfa,0xfa,0xfa,0xf9,0x00,0x00,0x56,0x81,0xfb,0xfb,
+       0xfb,0xfa,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xf9,0x56,0x56,0x56,0x56,0x56,0x56,0x56,
+       0x56,0x56,0xf9,0xfa,0xf9,0x56,0xf9,0x56,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0x56,0xf9,
+       0xf9,0xf9,0xf9,0x56,0x56,0xf9,0x56,0xf9,0x56,0x56,0x56,0x56,0x56,0xf9,0xfa,0xf9,
+       0x56,0xfa,0xf9,0x56,0xf9,0x56,0xf9,0xfc,0xff,0xff,0xfc,0xfc,0xab,0xab,0xfb,0xaa,
+       0xfb,0x80,0x80,0xfb,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xff,
+       0x2b,0xf9,0xf9,0xf9,0xfa,0x56,0x56,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xfa,0xf9,
+       0xf9,0x56,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0xfa,0xfa,0xf9,
+       0xf9,0xf9,0xfa,0xfa,0xf9,0xfa,0xfa,0xf9,0xfa,0xfa,0xf9,0xf9,0xfa,0xfa,0xf9,0xf9,
+       0xf9,0xf9,0xfa,0xfa,0xf9,0xf9,0x81,0x56,0xf6,0x81,0xfa,0xfa,0x81,0xfa,0x81,0xf5,
+       0x00,0x00,0xf9,0xfc,0xfc,0xfb,0xfb,0x81,0xf6,0x00,0xf6,0xfb,0xfb,0xfc,0xfc,0xf9,
+       0x00,0xf6,0xfa,0xf9,0xfa,0xfa,0xfa,0xf9,0x00,0x00,0xfb,0xfc,0xfc,0xfb,0x56,0x00,
+       0x00,0x56,0xfb,0xfb,0xfb,0x81,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xfa,0xf9,0x56,
+       0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x2b,0x00,0xf5,0xfb,0xfc,0xfb,0xfa,0x81,0xf9,0x56,
+       0xf9,0xf9,0xf9,0xf9,0xf9,0xf5,0x00,0x2b,0xfa,0xfa,0xfb,0xfc,0x56,0xf6,0x81,0xfa,
+       0x56,0xf9,0xfa,0x56,0xf9,0xf9,0xf9,0xf8,0x00,0xf8,0x81,0xfb,0xac,0xfb,0x81,0xf9,
+       0xf9,0x56,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf5,0x2b,0xf9,0xf9,0xf9,0x81,0x81,0x81,
+       0xfa,0xf5,0x00,0xf5,0xfb,0xfb,0xfb,0x81,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0x2b,
+       0xf5,0xf9,0xf9,0xf9,0x56,0xf9,0xfa,0x56,0xf9,0x56,0xf7,0x00,0xf7,0x81,0xfc,0xf9,
+       0x00,0x00,0x56,0xfc,0xfb,0xfb,0x81,0x81,0xfa,0xfa,0xf9,0xf9,0xf9,0xfa,0x56,0xf9,
+       0xf9,0x00,0x00,0x56,0xfb,0xfb,0xfb,0xfb,0x81,0xf9,0x56,0x56,0x56,0x56,0x56,0x2b,
+       0x00,0xf6,0xf8,0xf9,0xfb,0xfb,0x81,0xfa,0x81,0xf8,0x00,0x00,0xf8,0xfb,0xfc,0xfb,
+       0x81,0x81,0xfa,0xf9,0x56,0xf9,0xfa,0xfa,0xf9,0xf9,0xf9,0x00,0x00,0x56,0x81,0xfb,
+       0xfc,0xfb,0xfa,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,
+       0xf9,0xfa,0xf9,0xfa,0x56,0x56,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xfa,0xf9,0xf9,
+       0x56,0xf9,0xf9,0x56,0x56,0x56,0x56,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xfa,0xf9,0xf9,
+       0x56,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xfc,0xff,0xff,0xab,0xab,0xfb,0xaa,0xfb,
+       0x81,0xaa,0xfb,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
+       0xff,0x2b,0xfa,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xfa,0x56,0x56,0xf9,0xfa,0xf9,0x56,
+       0x56,0x56,0xf9,0x56,0x56,0xf9,0xf9,0xfa,0xf9,0xfa,0xf9,0xfa,0x81,0xf9,0xfa,0xf9,
+       0xf9,0xf9,0xfa,0xfa,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0xfa,0xfa,0xf9,
+       0xfa,0xf9,0xf9,0xfa,0xf9,0xfa,0xfa,0xfa,0xf8,0xf6,0xfa,0x81,0xfa,0xfb,0x81,0xfa,
+       0xf7,0x00,0x00,0xfb,0xfc,0xac,0xfb,0x81,0x81,0xf6,0x00,0x00,0x81,0xfb,0xfc,0xfb,
+       0x2b,0x00,0xf7,0xfa,0xfa,0xfa,0xfa,0xfb,0xf7,0x00,0x00,0xfb,0xfb,0xfc,0xfb,0x81,
+       0xf5,0x00,0x2b,0xfb,0xfb,0xfb,0x81,0xf9,0xf9,0xfa,0xf9,0x56,0xf9,0xf9,0xf9,0x56,
+       0x56,0x56,0x56,0xf9,0x56,0x56,0xf9,0x56,0xf5,0x00,0xf8,0xfc,0xfc,0x81,0xfa,0xf9,
+       0xf9,0xf9,0xfa,0x56,0xf9,0xf7,0x00,0xf5,0xf9,0xf9,0x81,0xfc,0xfc,0x56,0x00,0xf9,
+       0xf9,0xf9,0xf9,0xfa,0xf9,0x56,0xf9,0xf9,0x2b,0x00,0xf9,0x81,0xfb,0xfb,0xfb,0x81,
+       0xfa,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0x56,0x2b,0x00,0x56,0xf9,0xf9,0xfa,0x81,0x81,
+       0x81,0xfa,0xf7,0x00,0x00,0x56,0xfc,0xfb,0x81,0xf9,0xf9,0xfa,0xf9,0x56,0x56,0x56,
+       0xf7,0x00,0x56,0x56,0xf9,0xf9,0xfa,0xf9,0x56,0xf9,0xf9,0xf6,0xf5,0xf9,0x81,0xfb,
+       0xfb,0xf5,0x00,0x00,0xfb,0xfb,0xfc,0xfb,0xfa,0xf9,0x56,0xf9,0x56,0xf7,0xf9,0x56,
+       0x56,0xf9,0x00,0x00,0x56,0x81,0xfb,0xfc,0x81,0xfa,0xf9,0x56,0xf9,0x56,0xf9,0x56,
+       0xf8,0x00,0x00,0x00,0xfb,0xfb,0xfb,0x81,0xfa,0x81,0xf9,0xf5,0x00,0xf5,0xfb,0xfc,
+       0xfb,0x81,0xfa,0xf9,0x56,0xf9,0xf9,0xf8,0x56,0x56,0x56,0xf9,0x00,0x00,0x56,0x81,
+       0xfb,0xfc,0xfb,0xfa,0xfa,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xfa,0x56,0xf9,0x56,0x56,
+       0xfa,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xfa,0x56,0x56,0xf9,0xfa,0xf9,0x56,0x56,
+       0x56,0xf9,0x56,0x56,0xf9,0x56,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0x56,
+       0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xf9,0x56,0xfc,0xff,0xff,0xfc,0xfc,0xab,0xab,
+       0xfb,0xaa,0xfb,0x80,0xaa,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
+       0x80,0xff,0x2b,0x56,0x56,0x56,0x56,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,
+       0x56,0x56,0xf9,0xfa,0x56,0xf9,0xf9,0xfa,0xfa,0x81,0xfa,0xfa,0xfa,0xf9,0xf9,0xf9,
+       0xf9,0xfa,0xfa,0xfa,0xf9,0xf9,0xfa,0xfa,0xfa,0xf9,0xf9,0xf9,0xfa,0xf9,0xfa,0xf9,
+       0xf9,0xfa,0xf9,0xf9,0xf9,0xfa,0xf9,0xfa,0xf9,0xf7,0xf5,0xfa,0xfa,0x81,0xfb,0xfa,
+       0xf9,0x56,0x00,0x2b,0x81,0xfc,0xac,0xfc,0xfb,0x81,0xf6,0x00,0x00,0x81,0xfc,0xfc,
+       0xfb,0x00,0x00,0xf7,0x81,0x81,0xfb,0x81,0xfa,0xf5,0x00,0x00,0x81,0xfb,0xfc,0xfb,
+       0xfa,0x56,0x00,0x00,0x56,0xfb,0xfb,0x81,0xfa,0xfa,0xf9,0x56,0xf7,0xfa,0xf9,0x56,
+       0x56,0xf9,0xfa,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0x00,0x00,0xf9,0xfb,0x81,0x81,
+       0xfa,0xf9,0xf9,0xf9,0x56,0xf8,0x00,0x00,0xf8,0xf9,0xfa,0xfb,0xfc,0xfb,0xf8,0x00,
+       0xf7,0xfa,0xf9,0xfa,0xfa,0x56,0xf9,0xf9,0x56,0x00,0x2b,0xfa,0xfa,0xfb,0xfb,0xfb,
+       0xfb,0xfa,0xfa,0xf9,0xfa,0xf9,0xfa,0xf9,0x56,0xf5,0xf5,0x56,0xfa,0xfa,0xfa,0x81,
+       0x81,0xfa,0xfa,0x56,0x00,0x00,0xf5,0xfc,0xfc,0x81,0xfa,0xfa,0xf9,0x56,0x56,0xf9,
+       0xfa,0xf7,0x00,0x2b,0xf9,0xfa,0xfa,0xfa,0xf9,0x56,0xf9,0xf8,0x00,0xf7,0xfa,0xfa,
+       0xfb,0xfb,0x56,0x00,0x00,0xf6,0xfb,0xfc,0x81,0xf9,0xf9,0x56,0x56,0x2b,0x2b,0xfa,
+       0x56,0xf9,0xf9,0x00,0x00,0xf8,0x81,0xfb,0xfc,0x81,0xfa,0xfa,0xfa,0xf9,0xfa,0xf9,
+       0xf9,0xfa,0x00,0x00,0x2b,0xfb,0xfc,0xfb,0xfb,0x81,0xfa,0xfa,0xf7,0x00,0x00,0xf6,
+       0xfb,0xfb,0xfb,0xfa,0xf9,0xf9,0xf9,0xf7,0xf6,0x56,0xf9,0xfa,0xf9,0x00,0x00,0xf8,
+       0x81,0xfb,0xfb,0x81,0xfa,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0x56,
+       0xf9,0xf9,0x56,0x56,0x56,0x56,0x56,0x56,0x56,0xfa,0x56,0xf9,0xf9,0xf9,0x56,0x56,
+       0x56,0xf9,0xf9,0x56,0x56,0xfa,0xf9,0xfa,0xf9,0xfa,0xf9,0xfa,0xf9,0x56,0x56,0x56,
+       0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xfc,0xff,0xff,0xab,0xab,0xfb,
+       0xfb,0xfb,0xfb,0x80,0xfb,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
+       0x80,0x80,0xff,0x2b,0x56,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xfa,0x56,0x56,0xf9,0xf9,
+       0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0xfa,0xf9,0xfa,0xfa,0xf9,
+       0xfa,0xfa,0xf9,0xfa,0xf9,0xf9,0xf9,0xfa,0xfa,0xf9,0xf9,0xfa,0xfa,0xfa,0xfa,0xf9,
+       0xf9,0xf9,0xf9,0xfa,0xfa,0xfa,0xfa,0xfa,0xf9,0xfa,0x2b,0x00,0xfa,0xfa,0x81,0xfb,
+       0xfa,0xfa,0xf9,0xf5,0xf8,0x81,0xfc,0xac,0xfb,0xfb,0x81,0xf6,0x00,0x00,0xfb,0xfc,
+       0xfc,0xfc,0xf5,0x00,0x00,0x56,0x81,0x81,0xf8,0xf6,0x56,0x00,0x00,0xf8,0x56,0xf7,
+       0xfb,0x81,0xfa,0x2b,0x00,0xf5,0x56,0xfc,0xfb,0xfa,0xf9,0xf8,0xf5,0xf7,0x56,0xf9,
+       0x56,0x56,0xfa,0xf9,0x56,0x56,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0xf5,0x00,0x56,0xfc,
+       0x81,0xfa,0xf9,0xf9,0x56,0xf7,0x00,0x00,0x56,0xf9,0xf9,0xfa,0xfb,0xfc,0xfb,0xf9,
+       0x00,0x00,0xf7,0xfa,0xfa,0x81,0xf9,0xf9,0x56,0xf5,0xf6,0xfa,0xfa,0x81,0xfb,0xfb,
+       0xfb,0x81,0xfa,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf6,0x00,0x2b,0xf9,0xfa,0xfa,0xfa,
+       0x81,0x81,0xfa,0xf9,0xf9,0x00,0x00,0x00,0xf7,0xfb,0xfb,0x81,0xfa,0xf9,0x56,0x56,
+       0xf9,0xf9,0xf8,0x00,0x00,0xf8,0x81,0xfa,0xfa,0xf9,0xf9,0x56,0xf5,0xf6,0xfa,0xfa,
+       0x81,0x81,0xfb,0xfb,0xf6,0x00,0x00,0xf5,0x56,0xfa,0xfa,0xf9,0xf8,0xf6,0xf5,0x56,
+       0xf9,0x56,0xf9,0xf9,0x00,0x00,0x56,0xfb,0xfc,0xfc,0x81,0x81,0xfa,0xf9,0x56,0xf9,
+       0x56,0x56,0xf9,0xf6,0x00,0xf8,0xfc,0xfc,0xfc,0xfb,0xfa,0xfa,0xfa,0xf9,0xf5,0x00,
+       0x00,0xf5,0x56,0xfa,0xfa,0xf9,0xf7,0xf6,0xf5,0x56,0x56,0xf9,0xf9,0x56,0x00,0x00,
+       0xf9,0xfb,0xfb,0xfb,0xfb,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0x56,
+       0x56,0xf9,0xf9,0x56,0x56,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,
+       0xf9,0xfa,0xf9,0xfa,0xf9,0xf9,0xfa,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,
+       0xfa,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0x56,0x56,0x56,0xf9,0xfc,0xff,0xff,0xfc,0xab,
+       0xab,0xab,0xfb,0xaa,0xfb,0x80,0xfb,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
+       0x80,0x80,0x80,0xff,0x2b,0x56,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0x56,0xf9,0x56,
+       0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xfa,0x56,0xf9,0x56,0x56,0xf9,0xf9,0xfa,0xf9,
+       0xf9,0xfa,0xf9,0xf9,0xf9,0xfa,0xfa,0xf9,0xf9,0xfa,0xf9,0xf9,0xfa,0xfa,0xfa,0xf9,
+       0xfa,0xfa,0xfa,0xfa,0xf9,0xfa,0xf9,0xf9,0xfa,0x56,0xf8,0x00,0x00,0xf7,0x56,0x81,
+       0xfb,0x81,0x81,0x81,0x2b,0xfa,0xfb,0xfb,0xac,0xfb,0xf9,0xf7,0x00,0x00,0x00,0x2b,
+       0xfa,0xfb,0xfb,0xf8,0x00,0x00,0x00,0x00,0x00,0x2b,0x81,0xfa,0xf6,0x00,0x00,0xf6,
+       0xfb,0xfb,0x81,0xfa,0xfa,0x2b,0x00,0x00,0xf6,0xf8,0xf7,0x2b,0x00,0xf7,0x56,0x56,
+       0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xfa,0x56,0xf9,0xf9,0xfa,0xfa,0x2b,0x00,
+       0xf5,0xf8,0x56,0xf8,0xf7,0xf6,0x00,0xf6,0xf8,0x56,0xf9,0xfa,0x81,0xfc,0xfb,0x81,
+       0x81,0xf7,0x00,0x00,0xf6,0x56,0x56,0xf8,0x2b,0xf5,0x2b,0xf9,0xf9,0xfa,0x81,0x81,
+       0xfb,0xfb,0xfa,0xf9,0xf9,0x56,0x56,0xf8,0xf8,0xf5,0x00,0x00,0xf5,0xf8,0xfa,0x81,
+       0x81,0x81,0xfa,0xf9,0xf8,0x2b,0x00,0x00,0x00,0x00,0xf7,0xfb,0x81,0xfa,0xf9,0xf9,
+       0xf9,0x56,0xf9,0x56,0x2b,0x00,0x00,0xf6,0xf8,0x56,0x56,0x2b,0x00,0x2b,0xf9,0x56,
+       0xf9,0x81,0x81,0xfb,0x81,0xfa,0x2b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf6,0xf9,
+       0xf9,0xfa,0xf9,0xf9,0xf7,0x00,0x00,0x2b,0xfa,0xfb,0xfb,0xfb,0x81,0xf9,0xf9,0x56,
+       0x56,0x56,0x56,0xf9,0xf7,0x00,0x81,0xfb,0xfc,0xfc,0xfb,0x81,0xfa,0xf9,0xf9,0x56,
+       0x2b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf6,0x56,0xf9,0xf9,0xf9,0xf9,0xf7,0x00,
+       0x00,0x2b,0xfa,0xfb,0xfc,0x81,0x81,0xfa,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0x56,
+       0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xfa,0xf9,0xfa,0xf9,0xf9,0xfa,0x56,0xf9,0x56,0x56,
+       0xf9,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0x56,0x56,0xf9,0x56,0x56,
+       0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,0x56,0xfa,0xfc,0xff,0xff,0xab,
+       0xfc,0xab,0xfb,0xab,0x80,0xfb,0xaa,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
+       0x80,0x80,0x80,0x80,0xff,0x2b,0x56,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xfa,0x56,0xf9,
+       0xf9,0xfa,0xf9,0x56,0x56,0xf9,0x56,0xf9,0x56,0x56,0x56,0xf9,0x56,0xf9,0xfa,0xfa,
+       0xf9,0xfa,0xfa,0xfa,0xfa,0xf9,0xfa,0xf9,0xf9,0xf9,0xfa,0xf9,0xfa,0xfa,0xf9,0xf9,
+       0xfa,0xfa,0xfa,0xf9,0xf9,0xf9,0xfa,0xf9,0xfa,0xfa,0x00,0x00,0xf5,0xf6,0x00,0x00,
+       0xf8,0x81,0x81,0xfa,0xfa,0xf9,0xfa,0x81,0xfb,0xfc,0xf9,0x00,0xf6,0xf6,0xf6,0xf6,
+       0xf6,0x00,0x56,0xfc,0x81,0xf7,0xf5,0x00,0x2b,0xfa,0xfc,0xfb,0x81,0xf9,0x2b,0xf7,
+       0xfb,0xfb,0xfc,0xfb,0xfa,0xfa,0xfa,0xf9,0x2b,0xf5,0x00,0xf5,0x2b,0xf9,0xf9,0xf9,
+       0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xfa,0x81,
+       0xf9,0xf7,0xf6,0x00,0x00,0xf5,0x2b,0xf8,0xf9,0xfa,0xf9,0xfa,0xfb,0xfb,0xfb,0xfb,
+       0x81,0xfa,0xf9,0x56,0xf7,0xf6,0x00,0x00,0xf5,0x2b,0x56,0xfa,0xf9,0xf9,0xf9,0x81,
+       0x81,0x81,0x81,0xf9,0xf9,0x56,0x56,0xfa,0xf5,0x00,0xf6,0xf6,0xf6,0xf5,0x00,0xf6,
+       0xfb,0x81,0x81,0xfa,0xf8,0x00,0xf5,0xf6,0xf6,0xf6,0xf5,0x00,0x00,0x81,0x81,0x81,
+       0xf9,0x56,0xf9,0xf9,0x56,0xf9,0x56,0xf7,0xf6,0x00,0x00,0xf5,0x2b,0xf8,0xf9,0xf9,
+       0xf9,0x81,0x81,0x81,0x81,0xfa,0xfa,0x81,0xf9,0x2b,0xf5,0x00,0xf5,0x2b,0xf8,0xfa,
+       0xf9,0xf9,0xfa,0xf9,0xf5,0xf5,0xf6,0xf6,0xf6,0x00,0xf6,0xfa,0xfb,0xfa,0xf9,0xf9,
+       0x56,0x56,0xfa,0xf9,0xf9,0x56,0xf6,0x81,0xfb,0xfb,0xfc,0xfb,0x81,0xfa,0xf9,0xf9,
+       0xf9,0xfa,0xf9,0x2b,0xf5,0x00,0xf5,0x2b,0x56,0xf9,0xfa,0xf9,0xf9,0xfa,0xf5,0x00,
+       0xf6,0xf6,0xf6,0x00,0xf6,0xfa,0xfb,0xfa,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0x56,
+       0x56,0xf9,0xf9,0xfa,0xf9,0x56,0x56,0xf9,0x56,0xf9,0xf9,0x56,0xfa,0x56,0xf9,0xf9,
+       0xfa,0xf9,0x56,0x56,0xf9,0x56,0xf9,0x56,0x56,0x56,0x56,0x56,0xfa,0xf9,0xf9,0xf9,
+       0x56,0xfa,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xfc,0xff,0xff,
+       0xfc,0xab,0xfb,0xaa,0xfb,0xfb,0xfb,0x80,0xfb,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
+       0x80,0x80,0x80,0x80,0x80,0xff,0x2b,0x56,0x56,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0x56,
+       0x56,0xfa,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xfa,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,
+       0xf9,0x81,0xfa,0x81,0xf9,0xfa,0xfa,0x81,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0xfa,0xf9,
+       0xf9,0xfa,0xf9,0xf9,0xfa,0xf9,0xfa,0xfa,0xfa,0xfa,0xfa,0xf9,0xfa,0xf9,0xfa,0xfa,
+       0x81,0xfb,0xfb,0x81,0x81,0x81,0xf9,0xfa,0x81,0x81,0xfb,0x81,0xfa,0x81,0xf9,0xf9,
+       0x81,0xfb,0xfc,0xac,0xfc,0xfc,0xfb,0xfb,0x81,0xfc,0xfc,0xfc,0xfb,0xfb,0x81,0x81,
+       0xfb,0xfb,0xfc,0xfc,0x81,0x81,0xfa,0xfa,0x81,0x81,0xfb,0xfb,0xfb,0xfb,0x81,0xfa,
+       0xfa,0x81,0xfa,0xfa,0xf9,0xf9,0xf9,0x56,0x56,0xfa,0x56,0x56,0xf9,0xf9,0xf9,0xfa,
+       0xfa,0x81,0xfb,0xfb,0xfb,0x81,0xfa,0xfa,0xf9,0xf9,0xf9,0xfa,0xfa,0x81,0x81,0xfb,
+       0x81,0xfa,0xfa,0xf9,0xf9,0xfa,0x81,0x81,0xfb,0x81,0xfa,0xfa,0xf9,0xf9,0x81,0xfa,
+       0x81,0x81,0x81,0x81,0xfa,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xfa,0xfa,0xf9,0xfa,
+       0x81,0xfb,0xfb,0x81,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0x81,0xfb,0xac,0xac,0xfc,0xfb,
+       0x81,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0xfa,0xfa,0x81,0xfb,0x81,0x81,0x81,0xfa,0xf9,
+       0xfa,0x81,0x81,0x81,0x81,0x81,0xfa,0xfa,0xfa,0xfa,0xfb,0xfb,0xfc,0xfb,0xfb,0x81,
+       0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xf9,0xfa,0x81,0x81,0xfc,0xfc,0xfb,0x81,0xfa,
+       0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xfa,0x81,0x81,0xfb,0xfb,0xfb,0xfa,0xfa,0x56,
+       0xf9,0xf9,0xf9,0x81,0x81,0xfc,0xfc,0xfc,0xfb,0x81,0x81,0x81,0xfa,0xfa,0xfa,0xfa,
+       0xfa,0xf9,0xfa,0xfa,0x81,0xfb,0xfc,0xfb,0x81,0xfa,0xf9,0xf9,0xfa,0xf9,0xf9,0x56,
+       0xf9,0x56,0xf9,0x56,0xf9,0x56,0x56,0xf9,0xf9,0x56,0x56,0xf9,0x56,0xf9,0x56,0x56,
+       0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0xf9,
+       0xf9,0xfa,0xf9,0x56,0xf9,0x56,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xfb,0xff,
+       0xff,0xab,0xfc,0xab,0xfb,0xab,0xaa,0x80,0xaa,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
+       0x80,0x80,0x80,0x80,0x80,0x80,0xff,0xf6,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,
+       0x56,0x56,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,
+       0xf9,0xf9,0x56,0xfa,0xf9,0xf9,0xfa,0xfa,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0xfa,0x81,
+       0xf9,0xf9,0xf9,0xfa,0xf9,0xfa,0xfa,0xf9,0xfa,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,
+       0x81,0x81,0xfc,0xfb,0x81,0xfb,0x81,0xfa,0xfa,0x81,0x81,0x81,0xfa,0xfa,0xfa,0xf9,
+       0xfa,0x81,0xfb,0xfc,0xfc,0xac,0xfc,0xfb,0x81,0xfb,0xfc,0xfc,0xfc,0xfc,0xfb,0x81,
+       0x81,0x81,0xfb,0xfc,0xfc,0xfb,0x81,0xfa,0xfa,0x81,0x81,0x81,0xfc,0xfb,0xfb,0x81,
+       0xfa,0xfa,0xfa,0xfa,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0x56,0xf9,0x56,0xf9,0xf9,
+       0xf9,0xfa,0xfa,0xfb,0x81,0x81,0x81,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0x81,0x81,0xfb,
+       0x81,0xfa,0xf9,0xf9,0xfa,0xf9,0xfa,0x81,0xfb,0x81,0x81,0x81,0x81,0xfa,0xfa,0xfa,
+       0xfa,0x81,0x81,0x81,0xfa,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xfa,
+       0x81,0xfb,0xfc,0xfb,0x81,0xfa,0xfa,0xfa,0xf9,0xf9,0xfa,0xfb,0xfb,0xfc,0xfc,0xfc,
+       0xfc,0x81,0xfa,0xf9,0xf9,0xf9,0x56,0xfa,0xfa,0xf9,0x81,0x81,0xfb,0x81,0x81,0xfa,
+       0xfa,0x81,0xfa,0xfa,0x81,0xfa,0xfa,0xf9,0xf9,0xf9,0xfa,0xfb,0xfb,0xfb,0xfc,0xfc,
+       0xfb,0xfb,0xfb,0x81,0x81,0xfa,0xfa,0x81,0xf9,0xfa,0xfa,0x81,0xfc,0xfb,0xfb,0xfb,
+       0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xfa,0x81,0xfb,0xfb,0xfa,0xf9,
+       0xf9,0xf9,0xfa,0xf9,0xfa,0xfb,0xfb,0xfc,0xfc,0xfb,0xfb,0xfb,0x81,0x81,0xfa,0x81,
+       0xfa,0xfa,0xfa,0x81,0xfa,0x81,0xfc,0xfc,0xfb,0x81,0xfa,0xf9,0xfa,0x56,0xf9,0x56,
+       0x56,0x56,0x56,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,
+       0x56,0xfa,0x56,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0xfa,0x56,0x56,0xf9,0xf9,0xf9,0x56,
+       0xf9,0x56,0xf9,0x56,0x56,0x56,0xf9,0xf9,0x56,0x56,0x56,0xf9,0xf9,0xf9,0x56,0xfc,
+       0xff,0xff,0xab,0xab,0xab,0xfb,0xfb,0xfb,0xfb,0x80,0xfb,0x80,0x80,0x80,0x80,0x80,
+       0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xff,0x2b,0x56,0xfa,0xf9,0x56,0xfa,0xf9,0x56,
+       0x56,0xf9,0xf9,0xfa,0x56,0xf9,0x56,0x56,0x56,0xf9,0xfa,0xf9,0x56,0xf9,0xfa,0xf9,
+       0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xfa,0xfa,0xfa,
+       0xf9,0xfa,0xfa,0xfa,0xfa,0xfa,0xf9,0xf9,0xfa,0xf9,0xf9,0xfa,0xf9,0xf9,0xfa,0xfa,
+       0x81,0x81,0xfb,0xfb,0xfb,0xfb,0x81,0x81,0xfa,0x81,0x81,0xfa,0xfa,0xfa,0xfa,0xfa,
+       0xf9,0xfa,0x81,0xfb,0xfc,0xfc,0xac,0xfb,0xfb,0xfb,0xfb,0xfc,0xfc,0xfc,0xfc,0xfb,
+       0xfb,0x81,0x81,0xfb,0xfb,0xfb,0xfb,0x81,0xfa,0xf9,0xfa,0xf9,0x81,0xfb,0xfb,0xfb,
+       0x81,0x81,0x81,0xfa,0xfa,0xfa,0xf9,0xfa,0xfa,0xf9,0xf9,0xf9,0x56,0xfa,0xf9,0xf9,
+       0xf9,0x56,0xf9,0xfa,0xfa,0x81,0x81,0x81,0x81,0x81,0xfa,0xfb,0x81,0x81,0xfb,0x81,
+       0x81,0xfa,0xf9,0xf9,0xfa,0xf9,0x56,0xfa,0x81,0x81,0x81,0x81,0x81,0xfb,0x81,0x81,
+       0x81,0xfa,0x81,0xfa,0xfa,0xf9,0x56,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,
+       0xfa,0xfb,0xfc,0xfb,0xfb,0x81,0xfa,0xf9,0xf9,0x56,0xf9,0xfa,0x81,0xfb,0xfc,0xfc,
+       0xfc,0xfb,0x81,0xfa,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0xfa,0x81,0xfb,0xfb,0xfb,0x81,
+       0x81,0x81,0x81,0xfa,0x81,0xfa,0xfa,0xf9,0xf9,0xfa,0xf9,0xf9,0xfa,0x81,0xfb,0xfc,
+       0xfc,0xfb,0xfb,0xfb,0x81,0x81,0x81,0xfa,0xfa,0xf9,0xfa,0xfa,0x81,0xfb,0xfb,0xfb,
+       0x81,0xfa,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xfb,0xfb,0x81,0xfa,
+       0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xfa,0x81,0xfb,0xfb,0xfb,0xfb,0xfb,0x81,0x81,0x81,
+       0x81,0x81,0xfa,0xfa,0xfa,0xfa,0xfb,0xfb,0xfc,0x81,0xfa,0xfa,0xf9,0xf9,0x56,0xf9,
+       0x56,0x56,0xf9,0x56,0xfa,0x56,0xf9,0x56,0x56,0xfa,0xf9,0x56,0xfa,0xf9,0x56,0x56,
+       0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xfa,0x56,0xf9,
+       0xf9,0x56,0xf9,0x56,0x56,0x56,0xfa,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,
+       0xfc,0xff,0xff,0xfc,0xab,0xfb,0xab,0xab,0x80,0xaa,0xfb,0x80,0x80,0x80,0x80,0x80,
+       0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xff,0xf6,0xf9,0xf9,0x56,0x56,0xf9,0xf9,
+       0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,
+       0x56,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xfa,0xfa,0xf9,0xfa,0xfa,0xfa,0xf9,0xf9,
+       0xf9,0xfa,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0xfa,0xfa,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,
+       0xfa,0x81,0x81,0xfb,0xfc,0xfb,0xfb,0xfb,0x81,0xf9,0x81,0xfa,0xfa,0x81,0xfa,0xfa,
+       0xfa,0xf9,0xfa,0x81,0x81,0xfb,0xfc,0xfc,0xfb,0x81,0xfb,0xfb,0x81,0xfb,0xfb,0xfb,
+       0xfb,0x81,0xfa,0x81,0x81,0xfa,0x81,0xfa,0x81,0x81,0xf9,0xf9,0xfa,0xfa,0xfa,0xfa,
+       0xfb,0x81,0x81,0x81,0x81,0xfa,0xfa,0xfa,0xfa,0x56,0x56,0x56,0xf9,0xf9,0x56,0xf9,
+       0x56,0x56,0xf9,0xf9,0xfa,0xf9,0xfa,0xfa,0xfa,0x81,0x81,0x81,0x81,0xfa,0x81,0x81,
+       0xfa,0xfa,0xfa,0xf9,0xf9,0xf9,0xf9,0x56,0xfa,0xfa,0xfa,0x81,0xfb,0x81,0x81,0x81,
+       0xfa,0xfa,0xfa,0xfa,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xf9,
+       0xfa,0x81,0xfb,0xfb,0xfb,0x81,0xfb,0x81,0xfa,0xf9,0xfa,0xf9,0xfa,0xfa,0x81,0xfb,
+       0xfb,0xfc,0xfb,0x81,0x81,0xfa,0xfa,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xfa,0xfa,0x81,
+       0x81,0x81,0xfb,0xfa,0x81,0xfa,0xf9,0xfa,0xf9,0xf9,0xf9,0x56,0xf9,0xfa,0xfa,0x81,
+       0xfb,0x81,0xfb,0xfc,0xfb,0x81,0x81,0x81,0xfa,0xfa,0xf9,0xfa,0xfa,0x81,0xfb,0xfc,
+       0x81,0x81,0xfa,0xfa,0xfa,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xfa,0xfa,0xfa,0xf9,
+       0xf9,0xfa,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0xfa,0x81,0x81,0xfb,0xfb,0xfb,0xfb,0xfb,
+       0x81,0x81,0xf9,0xf9,0xf9,0xfa,0xfa,0x81,0xfb,0x81,0x81,0x81,0x81,0xfa,0xf9,0xf9,
+       0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,
+       0xf9,0xf9,0x56,0xfa,0x56,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,
+       0xf9,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,
+       0xf9,0xfc,0xff,0xff,0xfc,0xab,0xfc,0xaa,0xfb,0xfb,0xfb,0x80,0x80,0xfb,0x80,0x80,
+       0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xff,0x2b,0x56,0xfa,0x56,0x56,0xfa,
+       0x56,0x56,0xf9,0x56,0x56,0xfa,0x56,0x56,0xf9,0xf9,0xfa,0xf9,0x56,0xf9,0x56,0xf9,
+       0xf9,0x56,0x56,0x56,0x56,0x56,0xf9,0x56,0xf9,0xfa,0xfa,0xfa,0xfa,0xfa,0xf9,0xf9,
+       0xf9,0xfa,0xf9,0xfa,0xf9,0xf9,0xf9,0xfa,0xfa,0xfa,0xf9,0xf9,0xf9,0x81,0xfa,0xfa,
+       0xfa,0xfa,0xfa,0xfa,0x81,0x81,0x81,0x81,0x81,0xfa,0xf9,0x81,0xf9,0xf9,0xfa,0xfa,
+       0xf9,0xfa,0xf9,0xfa,0xfa,0x81,0xfb,0xfb,0x81,0x81,0x81,0x81,0xfa,0xfa,0x81,0x81,
+       0x81,0x81,0xfa,0xfa,0xfa,0xf9,0xf9,0xf9,0x81,0xfa,0x56,0xf9,0xf9,0xfa,0xf9,0xfa,
+       0x81,0x81,0x81,0xfa,0x81,0xfa,0xf9,0xfa,0xfa,0x56,0x56,0xf9,0x56,0xf9,0xf9,0xf9,
+       0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0x81,0x81,0xfa,0xfa,0x81,0xfa,0xfa,
+       0x81,0xf9,0xfa,0xfa,0x56,0xf9,0xf9,0x56,0x56,0xfa,0x56,0xf9,0xfa,0xfa,0xfa,0x81,
+       0xfa,0xfa,0xfa,0xfa,0xfa,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,0x56,0x56,0xf9,
+       0xf9,0xf9,0xfa,0xfa,0xfa,0xfa,0x81,0x81,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x81,0x81,
+       0x81,0x81,0x81,0x81,0xfa,0xfa,0xfa,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xfa,0xf9,
+       0x81,0x81,0x81,0xfa,0xfa,0xfa,0x81,0xfa,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,
+       0xfa,0x81,0xfa,0xfa,0x81,0xfa,0xfa,0xfa,0xf9,0xf9,0xfa,0x56,0xf9,0xfa,0xfa,0x81,
+       0x81,0xfa,0xfa,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,
+       0xf9,0xfa,0xfa,0x56,0x56,0x56,0xf9,0x56,0xf9,0xfa,0x81,0xfa,0x81,0x81,0x81,0xfa,
+       0x81,0x81,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xfa,0xfa,0xfa,0x81,0x81,0xfa,0xf9,0x56,
+       0xf9,0xf9,0xf9,0xfa,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xfa,0x56,0x56,0xfa,0x56,
+       0x56,0xf9,0x56,0x56,0xf9,0x56,0x56,0xf9,0x56,0xfa,0xf9,0x56,0x56,0xf9,0x56,0xf9,
+       0x56,0x56,0xf9,0x56,0x56,0x56,0x56,0x56,0x56,0x56,0x56,0xfa,0xfa,0x56,0x56,0xf9,
+       0xf9,0x56,0xfc,0xff,0xff,0xab,0xfc,0xab,0xfb,0xfb,0xaa,0x80,0xfb,0x80,0x80,0x80,
+       0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xff,0xf6,0xf9,0x56,0x56,0xf9,
+       0xf9,0x56,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0x56,0xf9,0x56,0xf9,
+       0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xfa,0xfa,0xfa,
+       0xf9,0xfa,0xfa,0xf9,0xfa,0xfa,0xf9,0xf9,0xfa,0xfa,0xf9,0xf9,0xf9,0xfa,0xfa,0xfa,
+       0xf9,0xf9,0xfa,0x81,0xfa,0xfa,0x81,0xfa,0xfa,0xfa,0xf9,0xfa,0xfa,0xf9,0xfa,0xfa,
+       0xf9,0xfa,0xfa,0xf9,0xfa,0xfa,0xfa,0xfa,0xfa,0x81,0x81,0x81,0xfa,0xfa,0xfa,0xfa,
+       0x81,0xfa,0xfa,0xfa,0xfa,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,
+       0x56,0xfa,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,
+       0xf9,0x56,0x56,0xf9,0xf9,0x56,0x56,0x56,0xf9,0xfa,0xf9,0xf9,0xf9,0xfa,0xfa,0xfa,
+       0xf9,0xfa,0xf9,0x56,0xf9,0x56,0xf9,0x56,0x56,0xf9,0xfa,0x56,0xf9,0xf9,0xf9,0xfa,
+       0xfa,0xfa,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xf9,0xf9,0xf9,
+       0xf9,0xf9,0xf9,0xfa,0xfa,0xfa,0xfa,0xfa,0xf9,0xf9,0x56,0xf9,0xfa,0xf9,0xf9,0xfa,
+       0xf9,0xfa,0xf9,0xfa,0xf9,0xf9,0xfa,0xf9,0xf9,0x56,0xfa,0xf9,0x56,0xf9,0xf9,0xf9,
+       0xf9,0xfa,0xfa,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0xf9,
+       0x56,0xf9,0xf9,0xf9,0xfa,0x81,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,
+       0xfa,0xf9,0xfa,0xf9,0xfa,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xfa,0xfa,
+       0xf9,0xf9,0xf9,0x56,0x56,0x56,0xf9,0xfa,0xf9,0x56,0xfa,0xf9,0xf9,0xfa,0xf9,0xf9,
+       0xfa,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xfa,0xf9,0xfa,0xf9,0xf9,0x56,
+       0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0x56,0x56,0xf9,0xf9,
+       0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,
+       0x56,0x56,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xfa,0xfa,0xf9,0x56,0xf9,0x56,0x56,0x56,
+       0x56,0xfa,0xf9,0xfb,0xff,0xff,0xfc,0xab,0xab,0xab,0xfb,0xfb,0xaa,0x80,0xfb,0x80,
+       0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xff,0x2b,0xf9,0xf9,0xfa,
+       0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xfa,
+       0xf9,0x56,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xfa,0xfa,
+       0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xfa,0xf9,0xfa,0xfa,0xfa,0xf9,
+       0xf9,0xfa,0xf9,0xf9,0xfa,0xfa,0xf9,0xfa,0xfa,0xfa,0x81,0xfa,0x81,0xfa,0xf9,0xfa,
+       0xfa,0xfa,0xfa,0x81,0xfa,0xf9,0xfa,0xf9,0xfa,0xfa,0xfa,0x81,0x81,0xf9,0xf9,0xfa,
+       0xf9,0x81,0xf9,0xfa,0xfa,0xfa,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xfa,0xf9,0xfa,
+       0x56,0x56,0xfa,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0x56,0xf9,
+       0x56,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xfa,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0xf9,
+       0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0x56,0xf9,0xfa,0xf9,
+       0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xfa,0x56,0x56,0x56,0xf9,0xf9,
+       0xf9,0xf9,0xfa,0xfa,0xfa,0xf9,0xf9,0xf9,0xf9,0x56,0xfa,0xf9,0xf9,0xf9,0xf9,0x56,
+       0xf9,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0x56,0xf9,0x56,0xf9,
+       0x56,0x56,0xf9,0xf9,0xf9,0xfa,0xfa,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0x56,
+       0xf9,0xf9,0xf9,0xf9,0xfa,0xfa,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,
+       0xf9,0x56,0xf9,0xf9,0xfa,0xfa,0x56,0x56,0xf9,0x56,0xfa,0x56,0xf9,0xf9,0xfa,0xf9,
+       0xf9,0x56,0xf9,0xf9,0x56,0xfa,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0x56,0xf9,
+       0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,
+       0xfa,0xfa,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xfa,0xfa,
+       0xf9,0x56,0xf9,0xfa,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xfa,
+       0x56,0x56,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0xfa,
+       0xf9,0xf9,0xf9,0xf9,0xfc,0xff,0xff,0xab,0xfc,0xab,0xfb,0xab,0x80,0xfb,0xfb,0x80,
+       0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xff,0x2b,0xf9,0x56,
+       0xf9,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xfa,0xf9,0xf9,0x56,0x56,0x56,0x56,0xf9,0xf9,
+       0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xfa,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0xfa,
+       0xfa,0xf9,0xf9,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xf9,0xfa,0xfa,0xf9,0xf9,0xfa,0xf9,
+       0xfa,0xf9,0xfa,0xf9,0xf9,0xfa,0xfa,0xf9,0xfa,0xfa,0xfa,0xf9,0xfa,0xf9,0xfa,0xf9,
+       0xf9,0xf9,0xf9,0xfa,0xfa,0xfa,0xfa,0xf9,0xfa,0xfa,0xfa,0xfa,0xfa,0xf9,0xf9,0xfa,
+       0xfa,0xfa,0xfa,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0x56,0x56,0x56,0xf9,0x56,0x56,0x56,
+       0x56,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0x56,0x56,0xfa,0xf9,
+       0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,
+       0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0x56,
+       0x56,0xfa,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,
+       0xfa,0x56,0x56,0x56,0x56,0x56,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0x56,0x56,0x56,0x56,
+       0x56,0xfa,0xf9,0x56,0x56,0xf9,0xfa,0xf9,0xf9,0xfa,0x56,0x56,0xf9,0xf9,0xf9,0xf9,
+       0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0x56,0xf9,0x56,0xf9,0x56,0x56,0xf9,0xf9,
+       0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,
+       0x56,0x56,0xf9,0x56,0xf9,0x56,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,
+       0x56,0x56,0xf9,0x56,0xf9,0xf9,0x56,0x56,0x56,0xf9,0x56,0x56,0xf9,0xf9,0x56,0x56,
+       0xf9,0xf9,0xf9,0xf9,0xfa,0x56,0x56,0xfa,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0xfa,0xf9,
+       0x56,0x56,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0xf9,
+       0x56,0xf9,0x56,0x56,0x56,0x56,0xfa,0xf9,0x56,0xf9,0x56,0x56,0x56,0xf9,0xf9,0x56,
+       0x56,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0x56,0xf9,0x56,0xf9,0x56,
+       0xf9,0x56,0x56,0x56,0x56,0xfb,0xff,0xff,0xfc,0xab,0xfb,0xaa,0xfb,0xfb,0xaa,0x80,
+       0xaa,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xff,0x2b,0x56,
+       0xf9,0x56,0xf9,0x56,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0xfa,0xf9,
+       0xf9,0x56,0x56,0x56,0x56,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,
+       0xf9,0xf9,0xf9,0xfa,0x81,0xf9,0xfa,0xf9,0xfa,0xfa,0xfa,0xf9,0xf9,0xf9,0xfa,0xfa,
+       0xf9,0xf9,0xfa,0xfa,0xf9,0xf9,0xfa,0xfa,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0xfa,0xf9,
+       0xf9,0xfa,0xf9,0xfa,0xfa,0xfa,0xf9,0xfa,0xfa,0xfa,0x81,0xfa,0xfa,0xfa,0xf9,0xf9,
+       0xf9,0xfa,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0x56,
+       0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xfa,
+       0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0x56,
+       0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xf9,0x56,0xf9,0x56,0x56,0x56,0x56,0x56,
+       0x56,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xf9,0xf9,
+       0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,
+       0xf9,0xf9,0xfa,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,
+       0xf9,0xf9,0xfa,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xfa,0x56,0xf9,0xf9,
+       0xf9,0x56,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0x56,0x56,0x56,0x56,0xf9,0xf9,0xf9,0x56,
+       0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xf9,0x56,0xfa,0x56,0xf9,0x56,
+       0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,
+       0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xfa,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,
+       0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xfa,0x56,0x56,0xf9,0x56,0xf9,0xf9,0x56,0xf9,
+       0x56,0x56,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0xfa,0xf9,0xf9,
+       0xf9,0x56,0x56,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,
+       0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xfc,0xff,0xff,0xac,0xab,0xab,0xfb,0xab,0x80,0xfb,
+       0x80,0x81,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xff,0x2b,
+       0xf9,0x56,0x56,0x56,0x56,0x56,0x56,0xfa,0xf9,0x56,0x56,0x56,0xf9,0x56,0xf9,0x56,
+       0x56,0xf9,0x56,0x56,0xf9,0xf9,0x56,0x56,0xfa,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,
+       0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0xfa,0xf9,0xfa,0xf9,
+       0xfa,0xfa,0xf9,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,
+       0xf9,0xf9,0xf9,0xfa,0xfa,0xf9,0xf9,0xf9,0xfa,0xf9,0xfa,0xfa,0xf9,0x81,0xf9,0xf9,
+       0xfa,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0x56,
+       0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0x56,0x56,0xf9,0x56,0xf9,0x56,0xf9,
+       0x56,0x56,0x56,0x56,0x56,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,
+       0xf9,0xf9,0xfa,0xf9,0xf9,0xfa,0xf9,0x56,0x56,0xf9,0xf9,0x56,0x56,0xf9,0x56,0x56,
+       0xf9,0xfa,0xf9,0x56,0x56,0x56,0xf9,0x56,0xf9,0x56,0x56,0xfa,0x56,0x56,0xf9,0x56,
+       0xf9,0x56,0xf9,0x56,0x56,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xf9,
+       0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xf9,0xf9,0x56,0x56,0x56,0xf9,0xf9,0x56,
+       0x56,0x56,0x56,0x56,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,
+       0xfa,0xf9,0x56,0x56,0xf9,0xf9,0x56,0x56,0x56,0x56,0x56,0xf9,0xfa,0xf9,0x56,0x56,
+       0x56,0xf9,0x56,0xf9,0xf9,0x56,0xfa,0x56,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,
+       0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,
+       0x56,0xf9,0x56,0x56,0xf9,0x56,0xf9,0x56,0xf9,0x56,0x56,0x56,0x56,0xf9,0xf9,0x56,
+       0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xfa,0x56,0x56,0xf9,0xf9,
+       0x56,0x56,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xf9,0x56,0x56,0x56,0x56,
+       0xfa,0x56,0x56,0xf9,0xf9,0x56,0x56,0xfa,0x56,0x56,0x56,0xf9,0x56,0xf9,0xf9,0xf9,
+       0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xfc,0xff,0xff,0xab,0xfc,0xab,0xfb,0xfb,0xaa,
+       0xfb,0x80,0x80,0xfb,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xff,
+       0xf6,0x56,0x56,0xfa,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,
+       0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0x56,0x56,0x56,0x56,
+       0xf9,0xfa,0xf9,0x56,0xf9,0xf9,0xfa,0xfa,0xfa,0xfa,0xfa,0xf9,0xf9,0xf9,0xfa,0xfa,
+       0xf9,0xf9,0xfa,0xfa,0xf9,0xfa,0xf9,0xfa,0xfa,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0xfa,
+       0xfa,0xf9,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,
+       0xf9,0xfa,0xfa,0xfa,0xfa,0xfa,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xf9,0xf9,0x56,0xf9,
+       0x56,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0x56,0x56,0x56,0x56,0xf9,0xfa,0xf9,0x56,0xf9,
+       0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xfa,0x56,0xf9,0xf9,0xf9,0xf9,
+       0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,0x56,0xf9,0x56,0x56,0xfa,0xf9,0xf9,
+       0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,
+       0xf9,0x56,0xfa,0xfa,0x56,0x56,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,
+       0xf9,0xf9,0xf9,0x56,0x56,0x56,0xf9,0x56,0x56,0xf9,0xfa,0xf9,0xf9,0x56,0xf9,0xf9,
+       0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xfa,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,
+       0xf9,0xf9,0x56,0x56,0x56,0xf9,0x56,0x56,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,
+       0xf9,0xf9,0xf9,0x56,0x56,0x56,0xf9,0x56,0x56,0x56,0xf9,0xf9,0xf9,0xfa,0xf9,0x56,
+       0x56,0x56,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0x56,
+       0x56,0xf9,0x56,0x56,0xf9,0xfa,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,
+       0x56,0xf9,0xf9,0xfa,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,
+       0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0x56,0xfa,0xf9,0xf9,0xf9,0x56,0x56,0xf9,
+       0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0x56,0x56,0x56,0x56,0xf9,0x56,0xf9,
+       0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xfc,0xff,0xff,0xfc,0xab,0xfb,0xab,0xab,
+       0xfb,0x80,0xab,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
+       0xff,0x2b,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0x56,0x56,0xf9,0x56,
+       0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0xfa,0x56,0x56,0xf9,0xf9,0xf9,0x56,
+       0xfa,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xfa,0xfa,0xfa,0xfa,0xfa,0xf9,0x81,0xfa,
+       0xfa,0xf9,0xfa,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,
+       0xfa,0xf9,0xfa,0xfa,0xfa,0xf9,0xf9,0xfa,0xf9,0xf9,0xfa,0xf9,0xfa,0xfa,0xfa,0xfa,
+       0xf9,0xfa,0xf9,0xf9,0xfa,0xfa,0xf9,0xf9,0xf9,0xfa,0xf9,0x56,0x56,0x56,0xf9,0x56,
+       0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0x56,0x56,
+       0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xfa,0xf9,0x56,0x56,0xf9,0xfa,0x56,
+       0x56,0x56,0x56,0x56,0x56,0x56,0x56,0x56,0x56,0x56,0xf9,0x56,0xf9,0x56,0xf9,0x56,
+       0xf9,0xfa,0xf9,0x56,0x56,0xf9,0x56,0x56,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,
+       0xf9,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xf9,
+       0xf9,0xf9,0xf9,0x56,0x56,0x56,0xf9,0xf9,0x56,0xfa,0xf9,0xf9,0x56,0x56,0xf9,0xf9,
+       0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xfa,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,0x56,
+       0x56,0x56,0x56,0x56,0x56,0xf9,0x56,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,
+       0xf9,0x56,0x56,0x56,0xf9,0x56,0xfa,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,
+       0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,
+       0x56,0xf9,0xf9,0x56,0xfa,0xf9,0xf9,0x56,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,
+       0xf9,0x56,0xfa,0xf9,0x56,0x56,0xf9,0xfa,0x56,0x56,0x56,0x56,0x56,0x56,0x56,0xf9,
+       0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xfa,0xf9,0x56,0x56,0xf9,0x56,0x56,0xf9,0x56,0xf9,
+       0xf9,0xf9,0x56,0xf9,0x56,0xf9,0x56,0xf9,0xfa,0x56,0x56,0xfa,0xf9,0xf9,0xf9,0x56,
+       0xf9,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0xfb,0xff,0xff,0xab,0xfc,0xab,0xab,
+       0x81,0xaa,0xfb,0x80,0xfb,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
+       0x80,0xff,0x2b,0xf9,0x56,0xf9,0x56,0x56,0x56,0xf9,0xf9,0x56,0x56,0x56,0x56,0xf9,
+       0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0x56,0x56,0x56,0xfa,0xf9,0xf9,
+       0xf9,0xf9,0x56,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,
+       0xf9,0xf9,0xf9,0xfa,0xfa,0xf9,0xfa,0xfa,0xfa,0xfa,0xf9,0xfa,0xf9,0x81,0xfa,0xfa,
+       0xf9,0xfa,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xfa,0xfa,0xf9,0xfa,
+       0xfa,0xfa,0xf9,0xfa,0xfa,0xfa,0xf9,0xf9,0xf9,0xfa,0xf9,0x56,0xf9,0x56,0xf9,0x56,
+       0x56,0x56,0x56,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xfa,0xf9,0xf9,0xf9,0x56,0x56,0x56,
+       0x56,0xfa,0x56,0xf9,0x56,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,
+       0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,
+       0x56,0x56,0x56,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,
+       0xf9,0x56,0xfa,0xf9,0xf9,0x56,0x56,0xfa,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0x56,
+       0x56,0x56,0xf9,0xf9,0x56,0x56,0xfa,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0x56,0x56,0xfa,
+       0x56,0xf9,0x56,0xf9,0x56,0x56,0x56,0xf9,0xf9,0x56,0xf9,0x56,0xfa,0xf9,0x56,0xf9,
+       0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xfa,0xf9,0xf9,0x56,0xf9,0x56,0x56,0x56,0xf9,0xf9,
+       0x56,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0xfa,0x56,
+       0x56,0x56,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0x56,0x56,0xf9,0xf9,0x56,
+       0x56,0xf9,0xfa,0xf9,0xf9,0xf9,0x56,0x56,0x56,0x56,0xfa,0x56,0xf9,0x56,0xf9,0x56,
+       0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,
+       0xf9,0xf9,0xf9,0x56,0xf9,0x56,0x56,0x56,0x56,0xf9,0xf9,0x56,0x56,0x56,0xf9,0xf9,
+       0x56,0xf9,0xf9,0xfa,0xf9,0xf9,0x56,0xf9,0xfa,0x56,0x56,0x56,0xf9,0xf9,0xf9,0xf9,
+       0x56,0xfa,0x56,0x56,0x56,0xf9,0x56,0xf9,0xf9,0x56,0xfc,0xff,0xff,0xfc,0xab,0xab,
+       0xfb,0xfb,0xfb,0x80,0xaa,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
+       0x80,0x80,0xff,0x2b,0x56,0xfa,0xf9,0xfa,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xf9,
+       0xf9,0xf9,0x56,0x56,0xfa,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0x56,
+       0xf9,0x56,0xf9,0x56,0x56,0xfa,0xf9,0xfa,0x56,0x56,0x56,0xf9,0xf9,0xfa,0xfa,0xfa,
+       0xf9,0xfa,0xf9,0xfa,0xfa,0xf9,0xf9,0xfa,0xf9,0xfa,0xfa,0xf9,0xf9,0xf9,0xf9,0xfa,
+       0xf9,0xfa,0xfa,0xfa,0xfa,0xfa,0xf9,0xfa,0xf9,0xf9,0xf9,0xfa,0xfa,0xfa,0xf9,0xf9,
+       0xfa,0xfa,0xf9,0xfa,0xfa,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xf9,
+       0x56,0x56,0xf9,0x56,0x56,0xfa,0xf9,0x56,0xfa,0xfa,0x56,0xf9,0x56,0x56,0x56,0x56,
+       0xfa,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xf9,
+       0x56,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0x56,0xf9,
+       0xf9,0xfa,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,
+       0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0x56,0x56,0xf9,0x56,0xf9,0xf9,0x56,0x56,
+       0xf9,0xf9,0x56,0xfa,0xf9,0x56,0xfa,0xf9,0xf9,0x56,0x56,0xf9,0x56,0x56,0xfa,0xf9,
+       0xf9,0xf9,0x56,0x56,0xf9,0x56,0x56,0xfa,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0x56,0x56,
+       0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0x56,0xfa,0xf9,0xfa,0xf9,0xf9,0x56,
+       0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0xfa,0x56,
+       0x56,0xf9,0xf9,0x56,0x56,0xf9,0x56,0xf9,0xfa,0x56,0x56,0xf9,0x56,0x56,0xfa,0xf9,
+       0x56,0xfa,0xf9,0xf9,0x56,0x56,0xf9,0x56,0x56,0xfa,0xf9,0xf9,0xf9,0x56,0x56,0xf9,
+       0x56,0x56,0xfa,0x56,0x56,0xf9,0x56,0x56,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0x56,
+       0x56,0xf9,0xf9,0x56,0xfa,0xf9,0xfa,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xf9,0xf9,0xf9,
+       0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xfa,0x56,0x56,0xf9,0xf9,0xf9,0x56,0x56,
+       0x56,0xf9,0xf9,0x56,0x56,0xf9,0x56,0x56,0xfa,0xf9,0x56,0xfc,0xff,0xff,0xab,0xfc,
+       0xab,0xab,0xfb,0xaa,0xfb,0x80,0xfb,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
+       0x80,0x80,0x80,0xff,0x2b,0xf9,0x56,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,
+       0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0x56,0x56,0xf9,0xf9,0xf9,
+       0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xfa,
+       0xfa,0xf9,0xfa,0xfa,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0xfa,0xfa,0xfa,
+       0xf9,0xfa,0xf9,0xf9,0xfa,0xf9,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xf9,0xfa,0xf9,
+       0xfa,0xfa,0xfa,0xfa,0xf9,0xf9,0xfa,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0x56,0x56,0xf9,
+       0xf9,0x56,0x56,0xfa,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xf9,
+       0xf9,0xfa,0x56,0x56,0xf9,0x56,0x56,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,
+       0x56,0xf9,0x56,0xf9,0x56,0x56,0x56,0x56,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0x56,0xf9,
+       0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xfa,
+       0xf9,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xfa,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,
+       0x56,0xf9,0xfa,0xf9,0xf9,0x56,0x56,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,
+       0xf9,0x56,0xf9,0x56,0x56,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0x56,
+       0x56,0xf9,0x56,0x56,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xf9,0x56,0xf9,
+       0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xfa,0xf9,0xf9,0x56,0x56,0xf9,
+       0x56,0x56,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xf9,0xf9,0x56,0x56,0xfa,0xf9,0xf9,0xf9,
+       0x56,0x56,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xfa,0x56,0x56,0xf9,0x56,0x56,
+       0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0x56,0x56,0x56,
+       0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xfa,0x56,0xf9,0xf9,0xf9,
+       0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,
+       0x56,0x56,0xf9,0xfa,0x56,0x56,0xf9,0xfa,0xf9,0xf9,0x56,0x56,0xfc,0xff,0xff,0xfc,
+       0xab,0xfb,0xaa,0xfb,0xfb,0x80,0xfb,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
+       0x80,0x80,0x80,0x80,0xff,0x2b,0x56,0x56,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,
+       0x56,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,0x56,0xfa,0xf9,0xf9,0xf9,0x56,
+       0x56,0xf9,0xf9,0x56,0x56,0xf9,0xfa,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0x56,0xf9,
+       0xf9,0xf9,0xf9,0xfa,0xfa,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xfa,0xf9,0xfa,0xfa,
+       0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,
+       0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0xfa,0xfa,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0x56,
+       0xf9,0x56,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xf9,0x56,0xf9,0x56,0x56,0xf9,
+       0xf9,0xfa,0x56,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,
+       0xf9,0x56,0x56,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,
+       0x56,0x56,0x56,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,0x56,0x56,0xfa,0x56,0x56,
+       0x56,0x56,0x56,0x56,0x56,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xf9,0x56,0xf9,0xfa,0x56,
+       0x56,0xf9,0xf9,0x56,0x56,0xf9,0x56,0x56,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xfa,
+       0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xf9,0x56,0x56,0xf9,0xf9,0x56,0x56,
+       0x56,0x56,0x56,0xf9,0xf9,0xf9,0x56,0xfa,0xf9,0x56,0xf9,0x56,0x56,0x56,0x56,0xf9,
+       0x56,0xf9,0xf9,0xf9,0x56,0x56,0x56,0x56,0xf9,0xf9,0x56,0x56,0xf9,0x56,0x56,0x56,
+       0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xfa,0x56,0x56,0xf9,0xf9,0xf9,0x56,
+       0xf9,0x56,0x56,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xfa,0x56,0xf9,0x56,0xf9,0xf9,
+       0x56,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xfa,0xf9,0xf9,0x56,0x56,0x56,0xf9,0x56,0xf9,
+       0xf9,0xf9,0xf9,0x56,0xf9,0x56,0x56,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,
+       0x56,0x56,0xfa,0x56,0x56,0xf9,0xf9,0x56,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0x56,
+       0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xfa,0x56,0x56,0xf9,0x56,0x56,0xfc,0xff,0xff,
+       0xfc,0xab,0xab,0xfb,0xfb,0xaa,0xfb,0xaa,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
+       0x80,0x80,0x80,0x80,0x80,0xff,0x2b,0xf9,0xfa,0xf9,0xfa,0xf9,0x56,0x56,0x56,0x56,
+       0x56,0x56,0x56,0xf9,0xf9,0xf9,0x56,0x56,0x56,0x56,0x56,0xfa,0xf9,0xf9,0x56,0xf9,
+       0xf9,0xfa,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0x56,0x56,0xf9,0x56,0x56,0xf9,0xfa,
+       0xf9,0xf9,0xfa,0x81,0xfa,0xf9,0xf9,0xf9,0xfa,0xfa,0xfa,0x81,0xfa,0xf9,0xf9,0x81,
+       0xf9,0xf9,0xf9,0xfa,0xfa,0xfa,0xfa,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,
+       0xfa,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xfa,0xf9,0xf9,0xfa,0xfa,0xfa,0xfa,0xf9,
+       0xf9,0xf9,0x56,0x56,0xfa,0xf9,0x56,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xfa,0x56,0x56,
+       0x56,0xf9,0x56,0xf9,0x56,0x56,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xfa,0xf9,
+       0x56,0x56,0x56,0xf9,0xfa,0xf9,0xf9,0xfa,0x56,0xf9,0xf9,0xf9,0x56,0xfa,0x56,0x56,
+       0xf9,0xf9,0xfa,0xf9,0xf9,0xfa,0x56,0x56,0x56,0x56,0x56,0x56,0x56,0xf9,0xf9,0xf9,
+       0x56,0xf9,0x56,0x56,0x56,0xf9,0xfa,0xf9,0x56,0xfa,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,
+       0x56,0xf9,0xfa,0xf9,0x56,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xf9,
+       0xf9,0x56,0x56,0x56,0xf9,0x56,0x56,0x56,0xfa,0xf9,0xf9,0xf9,0xfa,0xf9,0x56,0x56,
+       0x56,0xf9,0xfa,0xfa,0xf9,0xfa,0x56,0xf9,0xfa,0x56,0x56,0xf9,0xf9,0xfa,0xf9,0xf9,
+       0xfa,0x56,0x56,0x56,0x56,0x56,0x56,0x56,0xf9,0xf9,0x56,0x56,0xf9,0x56,0x56,0xf9,
+       0xf9,0xfa,0xf9,0x56,0xfa,0xf9,0xfa,0xf9,0xf9,0xf9,0xfa,0x56,0xf9,0xfa,0xf9,0x56,
+       0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xfa,0x56,0x56,0x56,0xf9,0x56,0xf9,0x56,0x56,0xf9,
+       0x56,0x56,0xf9,0xf9,0xf9,0x56,0xfa,0xf9,0xf9,0x56,0x56,0x56,0xf9,0xfa,0xf9,0xf9,
+       0xfa,0x56,0xf9,0x56,0x56,0xf9,0xf9,0xfa,0xf9,0xfa,0xf9,0x56,0x56,0x56,0x56,0x56,
+       0x56,0x56,0xf9,0xf9,0xf9,0x56,0x56,0x56,0x56,0xf9,0xf9,0xfa,0xf9,0x56,0xf9,0xf9,
+       0xfa,0xf9,0xf9,0xf9,0xfa,0x56,0x56,0xfa,0xf9,0x56,0x56,0xf9,0x56,0xfa,0xfc,0xff,
+       0xff,0xab,0xfc,0xab,0xfb,0xaa,0xfb,0x80,0x80,0xfb,0x80,0x80,0x80,0x80,0x80,0x80,
+       0x80,0x80,0x80,0x80,0x80,0x80,0xff,0x2b,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,
+       0x56,0xf9,0xfa,0xfa,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0x56,0xfa,0xf9,0xf9,0x56,0x56,
+       0xfa,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xf9,0x56,0xf9,0x56,0xf9,
+       0xf9,0x56,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xfa,0xfa,0xfa,0xf9,0xf9,0xfa,0xf9,0xf9,
+       0xfa,0xf9,0xf9,0xfa,0xfa,0xfa,0xf9,0xfa,0xf9,0xfa,0xfa,0xf9,0xfa,0xf9,0xfa,0xfa,
+       0xfa,0xf9,0xfa,0xf9,0xfa,0xf9,0xfa,0xfa,0xfa,0xfa,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,
+       0x56,0xf9,0xf9,0x56,0xfa,0xf9,0x56,0x56,0xfa,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,
+       0xf9,0xf9,0x56,0x56,0x56,0x56,0x56,0xf9,0x56,0xf9,0xf9,0xfa,0x56,0x56,0xf9,0x56,
+       0x56,0x56,0x56,0xfa,0xf9,0xf9,0x56,0x56,0xf9,0x56,0x56,0xfa,0x56,0x56,0xf9,0xf9,
+       0x56,0x56,0xfa,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xfa,0xfa,0xf9,0x56,
+       0xf9,0x56,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0x56,0xfa,
+       0xf9,0x56,0xf9,0xf9,0x56,0x56,0xfa,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,
+       0x56,0x56,0x56,0x56,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xf9,0x56,0x56,0x56,
+       0x56,0xfa,0xf9,0xf9,0x56,0x56,0xf9,0x56,0x56,0xf9,0xf9,0x56,0x56,0xfa,0x56,0xf9,
+       0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xfa,0xfa,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0x56,
+       0xfa,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0x56,0xfa,0x56,0x56,0xf9,0xf9,0x56,
+       0x56,0xfa,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0x56,0x56,0x56,0x56,
+       0xf9,0x56,0xf9,0xf9,0xfa,0x56,0x56,0x56,0x56,0x56,0x56,0x56,0xfa,0xf9,0xf9,0x56,
+       0x56,0xf9,0x56,0x56,0x56,0x56,0x56,0xfa,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,
+       0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xfa,0x56,0x56,0x56,0xfa,
+       0xf9,0x56,0xf9,0x56,0xf9,0xf9,0x56,0xfa,0xf9,0x56,0x56,0xfa,0xf9,0xf9,0xf9,0xfb,
+       0xff,0xff,0xab,0xab,0xab,0xfb,0xfb,0xfb,0xfb,0x80,0x80,0xfb,0x80,0x80,0x80,0x80,
+       0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xff,0x2b,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,
+       0xf9,0xfa,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,
+       0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,
+       0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xfa,0xfa,0xfa,0xfa,0xf9,0xf9,0xf9,0xfa,0xfa,
+       0xf9,0xfa,0xfa,0xf9,0xfa,0xfa,0xf9,0xfa,0xf9,0xf9,0xfa,0xf9,0xfa,0xfa,0x81,0xfa,
+       0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0xfa,0xf9,0xfa,0xfa,0xf9,0xfa,0xf9,0xf9,0xfa,0xf9,
+       0xf9,0x56,0xf9,0x56,0x56,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0xfa,0x56,
+       0x56,0xfa,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xf9,
+       0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,
+       0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xf9,0x56,0xf9,0xfa,0xf9,0xf9,0x56,0x56,
+       0xf9,0xf9,0x56,0x56,0x56,0xf9,0x56,0xf9,0x56,0xf9,0x56,0x56,0xf9,0x56,0xf9,0xf9,
+       0x56,0x56,0xf9,0xfa,0x56,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0xfa,0x56,0x56,0xfa,
+       0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xfa,0x56,0x56,0xf9,0x56,0xf9,0xf9,
+       0xf9,0x56,0xfa,0xf9,0x56,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,
+       0x56,0x56,0x56,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0x56,0xf9,
+       0xf9,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xfa,0x56,
+       0x56,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0xfa,0x56,0x56,0xfa,0x56,0xf9,0xf9,0xf9,0xf9,
+       0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,
+       0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xf9,0x56,0xf9,
+       0xfa,0xf9,0xfa,0xf9,0x56,0x56,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,
+       0x56,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0x56,0xf9,
+       0xfc,0xff,0xff,0xac,0xfb,0xab,0xab,0xfb,0xaa,0xaa,0xfb,0xaa,0x80,0x80,0x80,0x80,
+       0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xff,0xf6,0xf9,0xf9,0x56,0x56,0xf9,0xf9,
+       0x56,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0x56,0x56,0x56,0x56,
+       0x56,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xfa,0x56,0x56,0xfa,0x56,0x56,0xf9,0x56,0x56,
+       0xf9,0x56,0x56,0xfa,0xf9,0xf9,0xfa,0xfa,0xf9,0xfa,0xfa,0xfa,0xf9,0xf9,0xfa,0xfa,
+       0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0xfa,0xfa,0xf9,0xf9,0xfa,0xfa,0xfa,0xf9,0xfa,0xf9,
+       0xf9,0xfa,0xf9,0xfa,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xfa,
+       0xf9,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,
+       0x56,0x56,0xfa,0x56,0x56,0xfa,0x56,0x56,0xf9,0x56,0x56,0xf9,0x56,0x56,0xfa,0xfa,
+       0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xfa,0x56,0x56,0x56,0x56,0x56,
+       0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,
+       0x56,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xf9,0xf9,0x56,0x56,0x56,0xf9,0xf9,0xf9,0x56,
+       0x56,0xf9,0x56,0xf9,0x56,0x56,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0xf9,
+       0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0x56,0x56,0x56,0x56,0x56,0xf9,0xf9,0xfa,0xf9,
+       0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0x56,0xf9,
+       0xf9,0x56,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,
+       0x56,0x56,0x56,0x56,0x56,0x56,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0x56,
+       0x56,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xfa,0x56,
+       0x56,0xf9,0x56,0x56,0xf9,0x56,0x56,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,
+       0x56,0xf9,0xf9,0xfa,0x56,0x56,0xf9,0x56,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,
+       0xf9,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0x56,0x56,0x56,0x56,0xf9,0x56,0x56,0x56,
+       0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0x56,
+       0xf9,0xfc,0xff,0xff,0xfc,0xab,0xab,0xfb,0xaa,0xfb,0x81,0x80,0x80,0x80,0x80,0x80,
+       0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xff,0x2b,0x56,0x56,0x56,0xf9,0xfa,
+       0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,
+       0xf9,0xf9,0x56,0xfa,0xf9,0x56,0x56,0x56,0xf9,0x56,0x56,0xf9,0x56,0x56,0xf9,0x56,
+       0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xfa,0xfa,0xfa,0xfa,0x81,
+       0xf9,0xf9,0xfa,0xfa,0xfa,0xfa,0xf9,0xf9,0xf9,0xf9,0xfa,0xfa,0xfa,0xf9,0xf9,0xfa,
+       0xf9,0xfa,0xf9,0xfa,0xf9,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xf9,0xfa,0xf9,0xf9,0xfa,
+       0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0xfa,0xf9,0xf9,0xf9,0x56,0x56,0xf9,
+       0xf9,0x56,0xf9,0xf9,0x56,0xf9,0x56,0x56,0x56,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xf9,
+       0x56,0xf9,0xf9,0x56,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xfa,0x56,
+       0xf9,0xfa,0xf9,0xf9,0x56,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0x56,0x56,
+       0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0xfa,0xf9,0x56,
+       0x56,0x56,0xfa,0xf9,0xf9,0x56,0xf9,0xf9,0xfa,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,
+       0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0x56,
+       0xf9,0x56,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0x56,
+       0x56,0x56,0x56,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xf9,0x56,0xf9,0xf9,
+       0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xf9,0xf9,0x56,
+       0xf9,0x56,0xfa,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xfa,0x56,0xf9,0x56,
+       0x56,0x56,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,0x56,0xf9,
+       0xf9,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0x56,0xf9,0xf9,0xf9,
+       0xf9,0x56,0x56,0x56,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,
+       0x56,0xf9,0xfa,0xf9,0x56,0x56,0x56,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xfa,0xf9,0xf9,
+       0x56,0x56,0xfc,0xff,0xff,0xab,0xfc,0xab,0xfb,0xfb,0xaa,0xfb,0x80,0xfb,0x80,0x80,
+       0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xff,0xf6,0xf9,0xf9,0xf9,0xf9,
+       0x56,0x56,0xf9,0x56,0x56,0xf9,0x56,0x56,0x56,0x56,0x56,0x56,0x56,0x56,0xf9,0x56,
+       0x56,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0xfa,0xf9,0xf9,
+       0xf9,0xfa,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0x56,0xf9,0xfa,0xfa,0xf9,0xf9,0xf9,
+       0xf9,0xfa,0xf9,0xfa,0xf9,0xf9,0xfa,0xf9,0xf9,0xfa,0xfa,0xf9,0xfa,0xf9,0xf9,0xfa,
+       0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xfa,0xfa,0xfa,
+       0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0x56,0xf9,0x56,0xf9,0x56,0xf9,0x56,0xf9,0x56,0xf9,
+       0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0x56,0xf9,0xf9,
+       0xf9,0x56,0x56,0x56,0x56,0x56,0xfa,0xfa,0x56,0x56,0x56,0xf9,0xf9,0x56,0xf9,0x56,
+       0x56,0xf9,0x56,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0xf9,
+       0xf9,0x56,0x56,0x56,0x56,0x56,0x56,0x56,0xf9,0x56,0xf9,0xf9,0xfa,0xf9,0x56,0x56,
+       0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0x56,0xf9,0x56,0x56,0xf9,0x56,0xf9,0xf9,0xf9,
+       0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,
+       0xf9,0x56,0x56,0x56,0xfa,0xfa,0x56,0x56,0x56,0x56,0x56,0x56,0xf9,0x56,0x56,0xf9,
+       0x56,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0x56,0x56,0xf9,0xf9,0x56,0x56,0x56,0x56,
+       0x56,0x56,0x56,0xf9,0x56,0x56,0xfa,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0x56,0xfa,0x56,
+       0xf9,0x56,0xf9,0x56,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0x56,0xf9,
+       0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0x56,0x56,0xfa,
+       0xfa,0x56,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,
+       0x56,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,0x56,0x56,0x56,0x56,0x56,0xf9,0x56,0xf9,
+       0xf9,0xfa,0xf9,0x56,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0x56,0x56,
+       0xf9,0x56,0x56,0xfc,0xff,0xff,0xfc,0xab,0xab,0xab,0xfb,0xfb,0x80,0xfb,0x80,0x80,
+       0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xff,0x2b,0x56,0xf9,0x56,
+       0x56,0xf9,0x56,0x56,0x56,0x56,0xf9,0x56,0x56,0xfa,0xf9,0xf9,0x56,0xf9,0xf9,0x56,
+       0x56,0xf9,0xfa,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0x56,0xf9,0xf9,0x56,
+       0x56,0xfa,0xf9,0x56,0xf9,0xfa,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0xf9,
+       0xfa,0xfa,0xf9,0xfa,0xfa,0xf9,0xf9,0xfa,0xfa,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,
+       0xf9,0xf9,0xfa,0xf9,0xf9,0xfa,0xfa,0xf9,0xf9,0xfa,0xfa,0xf9,0xf9,0xf9,0xfa,0xfa,
+       0xf9,0xf9,0xf9,0xfa,0xfa,0xfa,0xfa,0xf9,0x56,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xf9,
+       0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xfa,0x56,0x56,0xf9,0xf9,0x56,0xf9,
+       0xfa,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,
+       0x56,0xf9,0xf9,0x56,0x56,0xfa,0xf9,0x56,0xf9,0x56,0x56,0x56,0x56,0x56,0x56,0x56,
+       0xf9,0x56,0x56,0xfa,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,0x56,0xfa,0x56,0xf9,0x56,
+       0xf9,0xf9,0xf9,0xfa,0xfa,0x56,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,
+       0xf9,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xfa,0x56,0x56,0xfa,0xf9,0x56,0xf9,0xfa,0x56,
+       0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,
+       0xfa,0xf9,0x56,0xf9,0x56,0x56,0xf9,0x56,0x56,0x56,0x56,0xf9,0x56,0x56,0xfa,0xf9,
+       0xf9,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xfa,0xf9,
+       0x56,0x56,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,
+       0x56,0xf9,0xfa,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xfa,0x56,0x56,0xf9,0xf9,0xf9,0xf9,
+       0xf9,0x56,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xfa,0xf9,0x56,0xf9,0x56,0x56,
+       0x56,0x56,0x56,0x56,0x56,0xf9,0x56,0x56,0xfa,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,
+       0x56,0xfa,0x56,0xf9,0x56,0xf9,0xf9,0xfa,0xf9,0xfa,0x56,0x56,0xf9,0x56,0xf9,0xf9,
+       0xf9,0xf9,0xf9,0xf9,0xfc,0xff,0xff,0xab,0xfc,0xab,0xfb,0xfb,0xab,0x80,0xaa,0xfb,
+       0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xff,0xf6,0x56,0xf9,
+       0x56,0xf9,0xf9,0xfa,0xf9,0xf9,0xfa,0xf9,0x56,0x56,0xf9,0x56,0x56,0x56,0xfa,0xf9,
+       0x56,0x56,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xfa,
+       0x56,0x56,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,
+       0xfa,0xfa,0xfa,0xfa,0xf9,0xf9,0xfa,0xfa,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0x81,0xfa,
+       0xfa,0xfa,0xfa,0xfa,0xf9,0xf9,0xfa,0xf9,0xfa,0xf9,0xfa,0xfa,0xf9,0xf9,0xfa,0xfa,
+       0xf9,0xfa,0xf9,0xfa,0xfa,0xfa,0xfa,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,
+       0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xf9,0x56,0x56,0xfa,0x56,0x56,
+       0xf9,0xf9,0x56,0xf9,0xf9,0xfa,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0x56,
+       0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0x56,0x56,0xfa,0xfa,0xf9,0xf9,
+       0xf9,0xf9,0x56,0x56,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0xf9,
+       0x56,0xf9,0xf9,0xf9,0x56,0x56,0x56,0x56,0xf9,0x56,0xf9,0x56,0xf9,0x56,0x56,0xf9,
+       0xf9,0x56,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0x56,0x56,0xfa,0x56,0x56,0xf9,0xf9,
+       0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xfa,0xf9,0x56,0x56,0xf9,0xf9,
+       0xf9,0xf9,0x56,0x56,0xf9,0x56,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,
+       0x56,0x56,0x56,0xfa,0xf9,0x56,0x56,0xf9,0xfa,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0x56,
+       0xf9,0x56,0x56,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,
+       0xf9,0x56,0x56,0xf9,0x56,0x56,0xfa,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,
+       0x56,0xf9,0xf9,0x56,0xfa,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0x56,
+       0x56,0xfa,0xfa,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0x56,
+       0xf9,0xf9,0xfa,0x56,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0x56,0x56,0x56,0xf9,0x56,0xf9,
+       0xf9,0x56,0xf9,0x56,0xf9,0xfc,0xff,0xff,0xab,0xfc,0xab,0xfb,0xaa,0x80,0xfb,0x80,
+       0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xff,0xf6,0xf9,
+       0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xf9,0x56,0xf9,0xf9,0xf9,
+       0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,0x56,0x56,0x56,0xf9,0x56,0x56,0xf9,0x56,0x56,
+       0xf9,0x56,0x56,0xfa,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,
+       0x56,0xf9,0x56,0xf9,0xfa,0xfa,0xf9,0xfa,0xf9,0xfa,0xf9,0xf9,0xfa,0xfa,0xfa,0xfa,
+       0xfa,0xf9,0xfa,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0xfa,0xfa,0xf9,0xfa,0xfa,
+       0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0x56,
+       0xf9,0x56,0xf9,0xf9,0x56,0x56,0xf9,0x56,0xf9,0x56,0x56,0xfa,0x56,0x56,0xf9,0x56,
+       0x56,0xfa,0xf9,0x56,0x56,0xfa,0x56,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,
+       0x56,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,
+       0xf9,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,
+       0x56,0x56,0x56,0x56,0x56,0x56,0x56,0x56,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xf9,0x56,
+       0xf9,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xfa,0x56,0x56,0xf9,0x56,0x56,0xf9,
+       0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xfa,0x56,0xf9,0x56,0x56,0xf9,0xf9,0xf9,
+       0x56,0xf9,0xfa,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0x56,
+       0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xfa,0x56,0x56,0x56,0x56,0x56,0x56,0xf9,
+       0x56,0x56,0x56,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xf9,0x56,0xf9,0x56,0x56,0xf9,0xf9,
+       0x56,0xf9,0x56,0x56,0xfa,0x56,0x56,0xf9,0x56,0x56,0xfa,0xf9,0x56,0x56,0xfa,0xf9,
+       0x56,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0x56,0xf9,0x56,0xfa,0x56,0x56,0xf9,
+       0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xf9,0x56,0xf9,0xf9,0xf9,
+       0x56,0xf9,0xf9,0x56,0x56,0x56,0x56,0x56,0xf9,0x56,0x56,0x56,0x56,0xf9,0xf9,0x56,
+       0x56,0x56,0x56,0xf9,0x56,0xf9,0xfc,0xff,0xff,0xfc,0xab,0xab,0xfb,0xab,0xfb,0xaa,
+       0x81,0x80,0xfb,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xff,0x2b,
+       0x56,0xf9,0x56,0x56,0xf9,0x56,0x56,0x56,0x56,0x56,0x56,0xfa,0xf9,0xfa,0xf9,0xf9,
+       0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,
+       0xf9,0xfa,0x56,0x56,0xfa,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xfa,0x56,0x56,0xf9,0x56,
+       0xf9,0x56,0x56,0x56,0xf9,0xfa,0xf9,0xfa,0xf9,0xfa,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,
+       0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xf9,0xf9,0xfa,
+       0xf9,0xf9,0xf9,0xf9,0xfa,0xfa,0xfa,0x81,0xfa,0xf9,0xfa,0xfa,0xfa,0xf9,0xf9,0xf9,
+       0xf9,0xfa,0x56,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xfa,
+       0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xf9,0x56,0xf9,0x56,0x56,0x56,0x56,
+       0xfa,0xf9,0x56,0xf9,0x56,0x56,0xf9,0x56,0xf9,0x56,0x56,0xfa,0x56,0x56,0xf9,0x56,
+       0x56,0x56,0x56,0x56,0x56,0xf9,0xfa,0xf9,0xfa,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0x56,
+       0x56,0xf9,0xf9,0xfa,0xfa,0xfa,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,
+       0x56,0xf9,0xf9,0x56,0x56,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xfa,0xf9,0x56,
+       0xfa,0xf9,0x56,0x56,0xfa,0x56,0x56,0xf9,0xf9,0x56,0x56,0x56,0x56,0x56,0xfa,0x56,
+       0xf9,0x56,0x56,0x56,0x56,0x56,0xfa,0x56,0x56,0xf9,0x56,0x56,0x56,0x56,0x56,0x56,
+       0xfa,0xf9,0xfa,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,0x56,0xf9,0xf9,0xfa,0xf9,
+       0xfa,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,
+       0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xfa,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,
+       0x56,0x56,0xf9,0x56,0xf9,0x56,0x56,0x56,0x56,0xf9,0xf9,0x56,0x56,0xf9,0x56,0x56,
+       0xfa,0x56,0x56,0xf9,0x56,0x56,0x56,0x56,0x56,0x56,0xfa,0xf9,0xf9,0xfa,0xf9,0xf9,
+       0x56,0xf9,0x56,0xf9,0x56,0x56,0xf9,0xf9,0xfa,0xf9,0xfa,0xf9,0x56,0xf9,0x56,0xf9,
+       0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xfc,0xff,0xff,0xab,0xfc,0xab,0xfb,0xfb,0xaa,
+       0x81,0xaa,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xff,
+       0xf6,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xfa,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,
+       0xf9,0x56,0x56,0x56,0x56,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xfa,
+       0x56,0x56,0xfa,0xf9,0x56,0x56,0xf9,0xfa,0x56,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0x56,
+       0xf9,0x56,0xfa,0xf9,0xf9,0xf9,0x56,0xf9,0xfa,0xf9,0xfa,0xfa,0xfa,0xf9,0xfa,0xf9,
+       0xf9,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xf9,0xf9,0xf9,
+       0xf9,0xfa,0xf9,0xf9,0xfa,0xfa,0xfa,0xf9,0xf9,0xf9,0xfa,0xf9,0xfa,0xf9,0xf9,0xfa,
+       0xf9,0xf9,0xf9,0x56,0x56,0x56,0xf9,0x56,0x56,0xfa,0xf9,0x56,0xf9,0xfa,0xf9,0x56,
+       0x56,0xf9,0xfa,0x56,0x56,0xf9,0x56,0xfa,0xfa,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0x56,
+       0xf9,0x56,0x56,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xf9,
+       0xf9,0xfa,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xfa,0x56,0x56,0x56,0xf9,0x56,
+       0x56,0x56,0xf9,0xf9,0x56,0x56,0x56,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xf9,0xfa,0xf9,
+       0xf9,0x56,0x56,0x56,0xf9,0x56,0x56,0xfa,0xfa,0x56,0x56,0xfa,0xf9,0x56,0x56,0xf9,
+       0xfa,0x56,0x56,0xf9,0xf9,0xf9,0xfa,0xf9,0x56,0x56,0x56,0xfa,0xf9,0x56,0xf9,0x56,
+       0x56,0x56,0xf9,0xfa,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xf9,0xf9,0xfa,0xf9,0xfa,0xf9,
+       0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0x56,0x56,0xf9,0x56,0x56,0xf9,0xf9,0x56,
+       0x56,0x56,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xf9,0xfa,0xf9,0xf9,0x56,0x56,0x56,0xf9,
+       0x56,0x56,0xf9,0xfa,0x56,0xf9,0xfa,0xf9,0x56,0x56,0xf9,0xfa,0xf9,0xf9,0xf9,0x56,
+       0xfa,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xf9,0xfa,0xf9,0xf9,
+       0x56,0xf9,0x56,0x56,0xf9,0xf9,0xfa,0xf9,0xfa,0xf9,0xf9,0xf9,0xfa,0xf9,0x56,0xfa,
+       0x56,0x56,0x56,0xf9,0x56,0x56,0x56,0xf9,0xf9,0x56,0x56,0xf9,0x56,0xf9,0x56,0xf9,
+       0x56,0x56,0xf9,0xfa,0xf9,0xf9,0x56,0x56,0xfc,0xff,0xff,0xfc,0xfc,0xab,0xaa,0xfb,
+       0xfb,0xfb,0x80,0xfb,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
+       0xff,0x2b,0xfa,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,0x56,0x56,0x56,0xf9,0xf9,0x56,
+       0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0x56,0xf9,0x56,0xfa,
+       0x56,0x56,0xf9,0x56,0x56,0x56,0x56,0xfa,0x56,0xf9,0x56,0x56,0x56,0xf9,0x56,0x56,
+       0xf9,0x56,0x56,0xf9,0x56,0xf9,0x56,0x56,0xfa,0xfa,0xfa,0x81,0xf9,0xfa,0xfa,0xfa,
+       0xfa,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0xfa,0xf9,0xf9,
+       0xf9,0xfa,0xfa,0xfa,0xfa,0xf9,0xf9,0xfa,0xf9,0xfa,0xf9,0xfa,0xfa,0xf9,0xfa,0xfa,
+       0xfa,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0x56,
+       0x56,0x56,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0x56,0x56,0x56,0xf9,0x56,0x56,0xfa,0x56,
+       0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,
+       0x56,0xfa,0x56,0x56,0x56,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,
+       0xf9,0xf9,0x56,0xf9,0x56,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0xfa,0xf9,0xf9,
+       0x56,0xf9,0xf9,0xfa,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0x56,0x56,
+       0xf9,0x56,0xf9,0xf9,0x56,0x56,0x56,0x56,0x56,0xf9,0x56,0x56,0xf9,0x56,0xf9,0x56,
+       0x56,0xf9,0xfa,0xf9,0xf9,0x56,0xf9,0xfa,0xf9,0xf9,0xf9,0x56,0xfa,0x56,0x56,0x56,
+       0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xfa,0xf9,0xf9,0xf9,0x56,0x56,
+       0xf9,0x56,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xfa,0x56,0xf9,0xf9,0xf9,0xfa,0xf9,
+       0xf9,0x56,0xf9,0xfa,0x56,0x56,0x56,0x56,0x56,0x56,0x56,0xf9,0x56,0x56,0x56,0x56,
+       0x56,0xf9,0x56,0x56,0xf9,0x56,0x56,0xfa,0x56,0xf9,0x56,0x56,0xfa,0xf9,0xf9,0x56,
+       0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xfa,0x56,0x56,0x56,0x56,0x56,0xf9,0x56,0x56,0xf9,
+       0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,
+       0xf9,0xf9,0xf9,0xfa,0x56,0x56,0xf9,0xf9,0xf9,0xfc,0xff,0xff,0xab,0xab,0xab,0xfb,
+       0xfb,0xaa,0x80,0xfb,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
+       0x80,0xff,0xf6,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0x56,0x56,0x56,0xf9,0xf9,0x56,0x56,
+       0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,
+       0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0x56,0x56,0x56,0xf9,0xf9,0x56,
+       0xf9,0xfa,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0x56,0xf9,0xfa,0xfa,0xf9,0xfa,
+       0xfa,0xf9,0xfa,0xfa,0xfa,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0xfa,0xfa,
+       0xf9,0xfa,0xfa,0xf9,0xfa,0xfa,0xf9,0xfa,0xfa,0xf9,0xfa,0xfa,0xf9,0xfa,0xfa,0xf9,
+       0xfa,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xfa,0xf9,0x56,0x56,0xf9,0xf9,
+       0x56,0xf9,0xf9,0xf9,0x56,0x56,0x56,0x56,0x56,0xf9,0xf9,0xf9,0xfa,0x56,0x56,0xf9,
+       0xf9,0xf9,0xf9,0xf9,0xfa,0x56,0x56,0xf9,0x56,0x56,0xfa,0x56,0x56,0xf9,0xf9,0x56,
+       0xf9,0x56,0xf9,0x56,0x56,0x56,0xf9,0xf9,0x56,0x56,0x56,0x56,0xfa,0x56,0x56,0xf9,
+       0xfa,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0x56,
+       0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xfa,0xf9,0xf9,0xfa,0x56,0x56,0xf9,0xf9,0x56,0xf9,
+       0xf9,0xf9,0x56,0x56,0x56,0x56,0x56,0xfa,0xf9,0xf9,0xfa,0x56,0xf9,0xf9,0xf9,0xf9,
+       0xf9,0xf9,0xfa,0x56,0x56,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,0x56,
+       0xf9,0x56,0xf9,0x56,0x56,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,
+       0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xf9,0x56,0xf9,0xf9,
+       0x56,0xf9,0xf9,0xfa,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0x56,
+       0x56,0x56,0xfa,0x56,0xf9,0xfa,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,
+       0xf9,0x56,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0x56,0x56,0x56,0xf9,0xf9,0x56,0x56,0x56,
+       0x56,0xf9,0xf9,0x56,0x56,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,
+       0xf9,0x56,0x56,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xfc,0xff,0xff,0xfc,0xab,0xfb,
+       0xab,0xfb,0xfb,0xaa,0x80,0x80,0xfb,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
+       0x80,0x80,0xff,0x2b,0x56,0xf9,0x56,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,
+       0xf9,0xf9,0xf9,0xfa,0x56,0x56,0x56,0xf9,0x56,0xf9,0x56,0x56,0xf9,0xf9,0x56,0x56,
+       0x56,0xf9,0x56,0xf9,0xfa,0x56,0xf9,0xfa,0x56,0xf9,0x56,0xfa,0xf9,0xf9,0xf9,0xf9,
+       0x56,0xf9,0xf9,0x56,0xf9,0xfa,0x56,0xf9,0x56,0x56,0xf9,0x56,0x56,0xfa,0xf9,0xf9,
+       0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,
+       0xf9,0xf9,0xf9,0xfa,0xf9,0xfa,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0xfa,0xfa,
+       0xf9,0xf9,0xf9,0xfa,0xfa,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0x56,0xf9,0xfa,
+       0x56,0xfa,0xfa,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0x56,0xf9,0xf9,0x56,0xf9,
+       0xfa,0x56,0xf9,0x56,0x56,0xf9,0x56,0x56,0xfa,0x56,0x56,0xf9,0xf9,0x56,0x56,0xf9,
+       0xf9,0x56,0x56,0xf9,0x56,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,
+       0x56,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,0x56,0x56,0xf9,0xf9,0x56,0x56,
+       0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xfa,0x56,0xf9,
+       0xfa,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xfa,0x56,
+       0xf9,0x56,0x56,0xf9,0x56,0x56,0xfa,0x56,0x56,0x56,0xf9,0x56,0x56,0x56,0xf9,0xf9,
+       0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0x56,0x56,0x56,0xf9,0x56,0xf9,0x56,
+       0x56,0xf9,0xf9,0x56,0x56,0x56,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0x56,
+       0xf9,0xf9,0x56,0xf9,0x56,0xf9,0x56,0xf9,0xfa,0x56,0xf9,0xfa,0x56,0x56,0xf9,0xf9,
+       0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xfa,0x56,0xf9,0x56,0x56,0xfa,0x56,
+       0xfa,0xf9,0x56,0x56,0xf9,0xf9,0x56,0x56,0xf9,0x56,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,
+       0xf9,0xfa,0xf9,0x56,0x56,0xf9,0x56,0x56,0xf9,0xf9,0x56,0x56,0xf9,0x56,0x56,0x56,
+       0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xfc,0xff,0xff,0xac,0xab,
+       0xab,0xfb,0xaa,0xfb,0x80,0xfb,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
+       0x80,0x80,0x80,0xff,0xf6,0xf9,0xfa,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,
+       0x56,0x56,0xfa,0xf9,0x56,0x56,0xf9,0xfa,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,
+       0x56,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0xfa,0x56,0x56,0xfa,0xf9,0xf9,0xf9,0x56,0xf9,
+       0xf9,0x56,0xfa,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xfa,0xf9,0xf9,0xfa,0xf9,
+       0xf9,0xfa,0xfa,0xfa,0xf9,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xf9,0xf9,0xf9,0xfa,0xfa,
+       0xf9,0xf9,0xfa,0xfa,0xfa,0xf9,0xfa,0xfa,0xfa,0xfa,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,
+       0xfa,0xf9,0xf9,0xf9,0xfa,0x81,0xf9,0xf9,0xfa,0xf9,0x56,0x56,0x56,0xf9,0x56,0xfa,
+       0x56,0x56,0xf9,0x56,0x56,0xfa,0xf9,0xfa,0xf9,0x56,0xf9,0xf9,0x56,0xfa,0xf9,0x56,
+       0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0x56,0x56,0xf9,
+       0xfa,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xfa,0xf9,0xf9,0x56,
+       0xf9,0xfa,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xf9,0x56,0xf9,0xf9,0x56,
+       0x56,0x56,0xf9,0xf9,0x56,0x56,0xfa,0x56,0x56,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0x56,
+       0xfa,0x56,0x56,0xfa,0xf9,0xfa,0xf9,0x56,0xf9,0xf9,0x56,0xfa,0xf9,0x56,0xf9,0xf9,
+       0xf9,0x56,0x56,0xf9,0xfa,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xfa,0x56,0x56,0xf9,0xf9,
+       0xf9,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xfa,0xf9,0x56,0x56,0xf9,0xfa,0xf9,0xf9,0x56,
+       0xf9,0xf9,0xf9,0x56,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xf9,0xfa,0x56,
+       0x56,0xf9,0xf9,0x56,0x56,0x56,0xf9,0x56,0xfa,0x56,0x56,0xfa,0x56,0x56,0xfa,0xf9,
+       0xfa,0xf9,0x56,0xf9,0xf9,0x56,0xfa,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xfa,
+       0x56,0xf9,0x56,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,
+       0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xfa,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0x56,
+       0xf9,0x56,0xf9,0xf9,0x56,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xfc,0xff,0xff,0xfc,
+       0xab,0xfb,0xab,0xfb,0xfb,0xaa,0xfb,0xaa,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
+       0x80,0x80,0x80,0x80,0xff,0x2b,0xfa,0xf9,0x56,0x56,0x56,0xfa,0x56,0x56,0xf9,0xf9,
+       0xf9,0x56,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,
+       0xf9,0xf9,0xfa,0x56,0xf9,0xf9,0x56,0x56,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0x56,
+       0xf9,0xfa,0x56,0xf9,0x56,0x56,0xf9,0x56,0x56,0xf9,0x56,0x56,0xf9,0x56,0xf9,0xf9,
+       0x56,0xf9,0xfa,0xfa,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,
+       0xfa,0xf9,0xf9,0xfa,0xfa,0xf9,0xfa,0xf9,0xfa,0xf9,0xf9,0xfa,0xfa,0xfa,0xfa,0xfa,
+       0xfa,0xfa,0xf9,0xfa,0xfa,0xfa,0xfa,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,
+       0xf9,0x56,0x56,0xfa,0x56,0x56,0xf9,0xf9,0x56,0x56,0x56,0xfa,0xf9,0x56,0xf9,0x56,
+       0x56,0xf9,0x56,0x56,0xf9,0x56,0x56,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xf9,
+       0xf9,0xf9,0x56,0x56,0x56,0xfa,0x56,0x56,0xf9,0x56,0xf9,0x56,0x56,0x56,0xf9,0xf9,
+       0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,
+       0x56,0xf9,0xfa,0xf9,0xfa,0x56,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,
+       0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xf9,
+       0x56,0x56,0xf9,0x56,0x56,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xfa,0xf9,0x56,0x56,0x56,
+       0xfa,0x56,0x56,0x56,0xf9,0xf9,0x56,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,
+       0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,
+       0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xf9,0x56,0x56,0xf9,
+       0xf9,0xf9,0x56,0x56,0xfa,0xf9,0x56,0xf9,0x56,0x56,0xf9,0x56,0x56,0xf9,0xf9,0x56,
+       0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xfa,0x56,0x56,0x56,0xfa,0x56,0x56,0xf9,0x56,0xf9,
+       0x56,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,
+       0xf9,0xf9,0xfa,0xf9,0xf9,0x56,0xf9,0xfa,0xf9,0xfa,0x56,0x56,0xf9,0xfc,0xff,0xff,
+       0xab,0xfc,0xab,0xab,0xfb,0xaa,0xfb,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
+       0x80,0x80,0x80,0x80,0x80,0xff,0x2b,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,
+       0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xf9,0xf9,
+       0x56,0xf9,0xf9,0xf9,0xf9,0xfa,0x56,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,
+       0x56,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0xfa,0x56,0x56,0xfa,0xf9,0xf9,
+       0x56,0x56,0xfa,0xfa,0xf9,0xf9,0xfa,0xfa,0xfa,0xfa,0xf9,0xfa,0xfa,0xfa,0xf9,0xfa,
+       0xfa,0xf9,0xfa,0xf9,0xfa,0xfa,0xf9,0xf9,0xf9,0xfa,0xf9,0xfa,0xf9,0xfa,0xf9,0xfa,
+       0xf9,0xfa,0xfa,0xf9,0xfa,0xfa,0xf9,0xf9,0xf9,0xf9,0xfa,0xfa,0xf9,0x56,0xf9,0xfa,
+       0xf9,0xf9,0x56,0xf9,0x56,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,
+       0x56,0xf9,0xf9,0xf9,0x56,0xfa,0x56,0x56,0xf9,0xf9,0x56,0xfa,0xf9,0x56,0x56,0x56,
+       0xf9,0xfa,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0x56,
+       0xf9,0xf9,0xf9,0xf9,0x56,0x56,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0x56,
+       0xf9,0xf9,0xf9,0xf9,0x56,0x56,0x56,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xfa,0x56,
+       0x56,0x56,0x56,0x56,0x56,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0x56,0xf9,
+       0xf9,0xf9,0x56,0xfa,0x56,0x56,0xfa,0xf9,0x56,0x56,0x56,0xf9,0xf9,0x56,0x56,0xf9,
+       0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xf9,
+       0x56,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xfa,0xf9,0x56,
+       0x56,0x56,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xfa,0xf9,0x56,0x56,0xf9,0xf9,0x56,0x56,
+       0xf9,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,
+       0x56,0xf9,0xf9,0x56,0x56,0xfa,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,
+       0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0x56,0xf9,0x56,
+       0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0x56,0x56,0x56,0xfc,0xff,
+       0xff,0xfc,0xab,0xab,0xfb,0xfb,0x80,0xfb,0x80,0xfb,0x80,0x80,0x80,0x80,0x80,0x80,
+       0x80,0x80,0x80,0x80,0x80,0x80,0xff,0x2b,0xf9,0xf9,0xf9,0xfa,0xf9,0x56,0xf9,0xf9,
+       0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xf9,0x56,
+       0x56,0xf9,0x56,0x56,0xf9,0xf9,0x56,0x56,0x56,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,
+       0x56,0x56,0xf9,0x56,0xf9,0xf9,0x56,0xfa,0xf9,0x56,0xf9,0xfa,0x56,0xf9,0xf9,0xf9,
+       0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xfa,0x81,0xfa,0xf9,0xfa,0xfa,0xf9,0xfa,0xfa,0xf9,
+       0xf9,0xf9,0xfa,0xfa,0xfa,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0xfa,0xf9,0xf9,
+       0xfa,0xfa,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0xfa,0x81,0xfa,0xfa,0xf9,0xf9,0xf9,0xfa,
+       0xf9,0xf9,0x56,0x56,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0x56,0x56,0x56,0x56,0xf9,
+       0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xfa,0x56,0xf9,0xfa,0xf9,0x56,0xfa,0x56,0x56,0x56,
+       0xf9,0xf9,0xf9,0x56,0xfa,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0x56,
+       0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,0x56,0xf9,0x56,0x56,0xf9,0x56,0x56,0xf9,0xf9,
+       0xf9,0x56,0x56,0xf9,0x56,0x56,0xfa,0xf9,0xfa,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0x56,
+       0x56,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xf9,0x56,0xf9,0xf9,0xf9,
+       0xf9,0xf9,0x56,0xf9,0xfa,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xfa,0xf9,0x56,0xfa,
+       0xfa,0xf9,0x56,0xf9,0x56,0x56,0xfa,0x56,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,
+       0x56,0x56,0x56,0xf9,0x56,0x56,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0x56,
+       0x56,0xfa,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xf9,0xf9,0x56,0x56,0x56,0x56,0x56,0xf9,
+       0xf9,0x56,0xf9,0xf9,0x56,0x56,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xfa,
+       0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0x56,0xf9,0x56,0x56,
+       0xf9,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,0x56,0x56,0xf9,0x56,
+       0xf9,0x56,0x56,0xf9,0x56,0xf9,0x56,0x56,0xf9,0x56,0x56,0xfa,0xf9,0xfa,0xf9,0xfc,
+       0xff,0xff,0xab,0xfc,0xab,0xfb,0xaa,0xfb,0xaa,0x80,0x80,0xfb,0x80,0x80,0x80,0x80,
+       0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xff,0x2b,0x56,0xf9,0xf9,0x56,0xf9,0x56,0xfa,
+       0x56,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xf9,0xf9,0xfa,
+       0xf9,0xf9,0xf9,0x56,0xf9,0xfa,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xfa,0xf9,0xf9,0xfa,
+       0x56,0x56,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xfa,0x56,0x56,0xf9,0xf9,
+       0x56,0xf9,0xf9,0xfa,0xf9,0x56,0xf9,0xf9,0xf9,0xfa,0xf9,0xfa,0xf9,0xfa,0xfa,0xf9,
+       0xf9,0xf9,0xf9,0xf9,0xfa,0xfa,0xf9,0xf9,0xf9,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xf9,
+       0xf9,0xfa,0xf9,0xf9,0xf9,0xfa,0xfa,0xf9,0xf9,0xfa,0xf9,0xfa,0xfa,0xfa,0xfa,0xfa,
+       0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0x56,0xf9,0xf9,0x56,
+       0xf9,0xf9,0xf9,0xfa,0x56,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,
+       0xf9,0xfa,0xf9,0x56,0xf9,0x56,0xf9,0x56,0x56,0xfa,0xf9,0xf9,0xf9,0xf9,0x56,0x56,
+       0x56,0xf9,0xfa,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,
+       0x56,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,
+       0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0x56,0x56,0x56,0xf9,0x56,0xfa,0x56,
+       0xf9,0xfa,0x56,0x56,0xfa,0x56,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,
+       0x56,0x56,0xf9,0x56,0xfa,0xf9,0x56,0xf9,0xf9,0x56,0x56,0x56,0xf9,0xf9,0xf9,0x56,
+       0xf9,0x56,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0x56,
+       0x56,0x56,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,
+       0xfa,0xf9,0xf9,0xfa,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0x56,0x56,0xf9,
+       0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0x56,0xf9,0x56,0xf9,0x56,0x56,0xfa,0xf9,
+       0xf9,0xf9,0xf9,0x56,0x56,0x56,0xf9,0xfa,0xf9,0x56,0xf9,0x56,0x56,0xfa,0xf9,0xf9,
+       0xf9,0xf9,0x56,0xf9,0xfa,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0xf9,
+       0xfc,0xff,0xff,0xfc,0xab,0xab,0xfb,0xab,0x80,0xfb,0xfb,0x80,0x80,0x80,0x80,0x80,
+       0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xff,0x2b,0x56,0x56,0x56,0xf9,0xf9,0x56,
+       0xf9,0xf9,0x56,0xf9,0x56,0xf9,0x56,0xf9,0x56,0xfa,0x56,0x56,0xf9,0xf9,0xf9,0xfa,
+       0x56,0x56,0xfa,0xf9,0x56,0xf9,0xf9,0x56,0x56,0x56,0x56,0xf9,0xf9,0xf9,0x56,0xf9,
+       0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,
+       0x56,0xf9,0x56,0xf9,0x56,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0x81,0xf9,0xfa,0xf9,
+       0xfa,0xf9,0xfa,0xf9,0xfa,0xfa,0xf9,0xf9,0xf9,0xfa,0xfa,0xfa,0xf9,0xf9,0xfa,0xfa,
+       0xf9,0xfa,0xfa,0xfa,0xf9,0xfa,0xf9,0xf9,0xf9,0xfa,0xfa,0xf9,0xf9,0xfa,0xf9,0xfa,
+       0x81,0xf9,0x56,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,
+       0xf9,0x56,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0x56,0xf9,
+       0xf9,0xf9,0x56,0xf9,0x56,0x56,0x56,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xf9,0x56,0xf9,
+       0xf9,0x56,0xf9,0xf9,0x56,0x56,0x56,0xf9,0xf9,0xfa,0xf9,0x56,0xfa,0xf9,0x56,0xf9,
+       0xfa,0xf9,0xf9,0xf9,0x56,0x56,0x56,0x56,0xf9,0x56,0x56,0xf9,0x56,0xf9,0xfa,0x56,
+       0x56,0x56,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,
+       0x56,0xf9,0xf9,0x56,0x56,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0x56,
+       0xf9,0x56,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0x56,0xfa,0x56,
+       0x56,0x56,0xf9,0xf9,0xfa,0x56,0x56,0xfa,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,
+       0x56,0x56,0xf9,0x56,0x56,0x56,0xf9,0x56,0xf9,0xf9,0x56,0x56,0x56,0x56,0x56,0x56,
+       0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0x56,
+       0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0x56,0x56,0x56,0xf9,0xf9,0x56,0xf9,
+       0x56,0x56,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,0x56,0xf9,0xf9,0xf9,0xf9,
+       0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,0x56,0x56,0xf9,0x56,0x56,
+       0xf9,0xfc,0xff,0xff,0xab,0xab,0xfb,0xab,0xfb,0xfb,0xfb,0x80,0xaa,0x80,0x80,0x80,
+       0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xff,0xf6,0x56,0x56,0xf9,0x56,0xf9,
+       0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0x56,0xfa,0xf9,0x56,0x56,0xf9,0xf9,0xf9,
+       0xf9,0xf9,0x56,0x56,0x56,0x56,0xfa,0xf9,0x56,0xf9,0x56,0xf9,0xfa,0x56,0xf9,0xf9,
+       0xf9,0xf9,0x56,0x56,0xf9,0x56,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0xf9,
+       0xf9,0xf9,0x56,0xf9,0x56,0x56,0x56,0x56,0x56,0xf9,0xf9,0xf9,0xfa,0xfa,0xfa,0xf9,
+       0xfa,0xf9,0xfa,0xf9,0xfa,0xfa,0xfa,0xf9,0xf9,0xfa,0xfa,0xfa,0xfa,0xfa,0xf9,0xf9,
+       0xf9,0xf9,0xfa,0xfa,0xf9,0xfa,0xf9,0xf9,0xfa,0xf9,0xf9,0xfa,0xfa,0xfa,0xfa,0xf9,
+       0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,
+       0x56,0x56,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,
+       0xf9,0x56,0x56,0x56,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,
+       0x56,0xf9,0x56,0xfa,0xf9,0x56,0x56,0x56,0xfa,0xf9,0xf9,0x56,0x56,0x56,0x56,0x56,
+       0xfa,0xf9,0x56,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0xfa,0x56,0xf9,0x56,
+       0x56,0x56,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xf9,0x56,0x56,
+       0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,0x56,0x56,
+       0x56,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0x56,0xfa,0xf9,
+       0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0x56,0x56,0xfa,0xf9,0x56,0xf9,0x56,
+       0xf9,0x56,0xf9,0x56,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0x56,0x56,0xf9,0xf9,
+       0xfa,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0x56,0x56,0x56,0xf9,0xf9,0xf9,0x56,
+       0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,
+       0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0x56,0xfa,0xf9,0x56,0x56,0xf9,0xfa,0xf9,0xf9,
+       0x56,0x56,0xf9,0x56,0x56,0xfa,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,
+       0xf9,0xf9,0xfc,0xff,0xff,0xfc,0xfc,0xab,0xfb,0xaa,0xfb,0xaa,0x80,0x81,0x80,0x80,
+       0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xff,0x2b,0xf9,0xf9,0xfa,0xf9,
+       0x56,0xf9,0x56,0xf9,0x56,0xf9,0x56,0x56,0x56,0x56,0xf9,0xf9,0x56,0xf9,0x56,0xfa,
+       0xf9,0x56,0x56,0x56,0xf9,0x56,0xf9,0xf9,0x56,0xfa,0xf9,0xf9,0x56,0x56,0x56,0xf9,
+       0x56,0x56,0x56,0x56,0x56,0x56,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xf9,
+       0xf9,0x56,0xf9,0xfa,0xf9,0x56,0xf9,0xf9,0x56,0xfa,0xfa,0xf9,0xf9,0xf9,0xfa,0xfa,
+       0xfa,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0xfa,0xfa,0xf9,0xf9,0xf9,0xf9,
+       0xfa,0xf9,0xf9,0xfa,0xf9,0xf9,0xfa,0xf9,0xf9,0xfa,0xfa,0x81,0xfa,0xf9,0xf9,0xf9,
+       0xfa,0xf9,0xf9,0xfa,0x81,0xfa,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0x56,0x56,0x56,0x56,
+       0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,
+       0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xfa,0xf9,0x56,0xf9,0x56,0xf9,0x56,0xfa,
+       0x56,0x56,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0xf9,
+       0x56,0xf9,0x56,0x56,0xf9,0x56,0xf9,0xf9,0xfa,0xf9,0xfa,0x56,0xf9,0x56,0x56,0x56,
+       0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0x56,0x56,0xf9,0x56,0x56,0x56,0xf9,
+       0xfa,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,
+       0xf9,0x56,0xfa,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0x56,0xfa,0x56,0x56,0x56,0x56,0xf9,
+       0xf9,0x56,0xf9,0xf9,0xfa,0x56,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xf9,
+       0x56,0x56,0xfa,0xf9,0xfa,0xf9,0x56,0x56,0xf9,0x56,0x56,0x56,0xf9,0xfa,0xf9,0xf9,
+       0x56,0x56,0x56,0xf9,0x56,0x56,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,
+       0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xfa,0xf9,0x56,
+       0xf9,0x56,0xf9,0x56,0xfa,0x56,0x56,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,
+       0x56,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0x56,0xf9,0xf9,0xfa,0xf9,0xfa,
+       0x56,0x56,0xf9,0xfb,0xff,0xff,0xab,0xab,0xab,0xfb,0xfb,0xaa,0x81,0x80,0x80,0xfb,
+       0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xff,0x2b,0xf9,0xfa,0x56,
+       0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,
+       0xf9,0xf9,0xf9,0x56,0x56,0xfa,0xf9,0xfa,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,
+       0xf9,0x56,0xf9,0x56,0x56,0xf9,0xfa,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0x56,0x56,0x56,
+       0xf9,0xfa,0xf9,0x56,0x56,0x56,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,
+       0xfa,0xfa,0xfa,0xf9,0xf9,0xfa,0xf9,0xfa,0xfa,0xfa,0xf9,0xf9,0xfa,0xfa,0xfa,0xf9,
+       0xf9,0xfa,0x81,0xfa,0xfa,0xf9,0xf9,0xfa,0xf9,0xf9,0xfa,0xfa,0xf9,0xfa,0xf9,0xf9,
+       0xfa,0xf9,0xfa,0xfa,0xfa,0x81,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,
+       0xf9,0xf9,0xfa,0xf9,0xf9,0x56,0xf9,0x56,0x56,0x56,0x56,0xf9,0xf9,0x56,0xf9,0x56,
+       0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xfa,0xfa,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,
+       0x56,0x56,0x56,0xf9,0x56,0x56,0xfa,0x56,0x56,0x56,0xfa,0x56,0xf9,0x56,0x56,0xf9,
+       0xfa,0xf9,0xfa,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xf9,0xf9,
+       0xf9,0xf9,0xfa,0xfa,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0x56,0x56,0xf9,0xf9,
+       0xfa,0xf9,0xf9,0x56,0xf9,0x56,0x56,0x56,0x56,0xf9,0xfa,0x56,0xf9,0xf9,0x56,0xf9,
+       0xfa,0xf9,0xfa,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0x56,0x56,0xf9,0x56,
+       0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0x56,0x56,0xf9,0xfa,0xfa,0xf9,0x56,0xf9,
+       0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,
+       0x56,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0x56,0x56,0xf9,0xf9,0xfa,0xf9,0x56,0x56,0xf9,
+       0x56,0x56,0x56,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xfa,0xfa,0xf9,0x56,0xf9,
+       0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xf9,0x56,0x56,0xfa,0x56,0x56,0x56,0xfa,
+       0x56,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xfa,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,
+       0x56,0x56,0x56,0xf9,0xfc,0xff,0xff,0xfc,0xfc,0xfc,0xaa,0xfb,0xfb,0xfb,0xab,0x80,
+       0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xff,0x2b,0xf9,0x56,
+       0x56,0xf9,0x56,0x56,0xf9,0x56,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0x56,
+       0x56,0xf9,0xf9,0x56,0x56,0xf9,0x56,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0x56,0xfa,0xf9,
+       0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0x56,0x56,0xf9,0x56,0x56,0xf9,0xf9,0xf9,
+       0xf9,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xf9,0x56,0xf9,
+       0xf9,0xfa,0xfa,0xfa,0xf9,0xfa,0xfa,0xfa,0xfa,0xfa,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,
+       0xf9,0xf9,0xf9,0xf9,0xfa,0xfa,0xf9,0xf9,0xfa,0xf9,0xf9,0xfa,0xfa,0xf9,0xf9,0xf9,
+       0xfa,0xfa,0xfa,0xfa,0xfa,0xf9,0xfa,0xf9,0xfa,0xfa,0xfa,0xf9,0xfa,0xf9,0xf9,0xf9,
+       0xf9,0xfa,0xf9,0x56,0x56,0x56,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0x56,
+       0x56,0x56,0x56,0x56,0x56,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xf9,0x56,0xf9,0xf9,0xf9,
+       0x56,0x56,0x56,0x56,0xfa,0xf9,0xfa,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0x56,0xf9,
+       0x56,0x56,0xf9,0xf9,0x56,0x56,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0xfa,
+       0xf9,0xfa,0x56,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0xfa,
+       0xf9,0x56,0x56,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0x56,0x56,0x56,0x56,
+       0x56,0xf9,0x56,0xf9,0x56,0x56,0xf9,0x56,0x56,0xf9,0x56,0xf9,0x56,0x56,0xf9,0xf9,
+       0xfa,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xf9,0x56,
+       0x56,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xfa,0xf9,0xf9,0xf9,0x56,0xf9,
+       0x56,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0x56,0x56,0xf9,0x56,
+       0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0x56,0x56,
+       0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,0x56,0x56,0xfa,0xf9,0xfa,0xf9,0xf9,0x56,0x56,
+       0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xf9,0x56,0x56,0xf9,0xf9,
+       0x56,0xf9,0x56,0xfa,0xf9,0xfc,0xff,0xff,0xab,0xab,0xab,0xfb,0xab,0x80,0xaa,0x80,
+       0xfb,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xff,0xf6,0x56,
+       0x56,0xf9,0x56,0x56,0x56,0xf9,0xf9,0x56,0x56,0xf9,0x56,0xfa,0xf9,0x56,0xf9,0x56,
+       0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0x56,
+       0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xfa,0xf9,
+       0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,
+       0xf9,0xf9,0xfa,0xf9,0xf9,0xfa,0xfa,0xfa,0xf9,0xfa,0xf9,0xfa,0xf9,0xfa,0xf9,0xfa,
+       0xf9,0xfa,0xfa,0xfa,0xf9,0xfa,0xf9,0xf9,0xfa,0xf9,0xf9,0xfa,0xfa,0xfa,0xfa,0xf9,
+       0xf9,0x81,0xf9,0xfa,0xf9,0xf9,0xf9,0xfa,0xf9,0xfa,0xfa,0xfa,0xf9,0xf9,0xf9,0xf9,
+       0xfa,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,
+       0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xf9,0x56,0x56,0xf9,0x56,
+       0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,
+       0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xfa,0xf9,0xf9,0x56,0x56,0xf9,
+       0xf9,0x56,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,
+       0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,
+       0xf9,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0x56,
+       0xfa,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,
+       0x56,0xf9,0xf9,0x56,0xf9,0xfa,0xf9,0xf9,0x56,0x56,0xfa,0x56,0xf9,0xf9,0x56,0x56,
+       0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,
+       0x56,0x56,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0x56,0x56,
+       0xf9,0x56,0x56,0xf9,0x56,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0xf9,
+       0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xfa,
+       0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xfc,0xff,0xff,0xfc,0xab,0xab,0xfb,0xfb,0xfb,0xfb,
+       0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xff,0x2b,
+       0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,
+       0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xfa,0xf9,0xf9,0x56,0xfa,0x56,0x56,
+       0xf9,0x56,0x56,0xf9,0x56,0x56,0x56,0x56,0xf9,0xf9,0x56,0x56,0xf9,0x56,0x56,0xf9,
+       0xf9,0x56,0x56,0xf9,0x56,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xf9,0xf9,
+       0xf9,0xfa,0xf9,0xf9,0xfa,0x81,0xfa,0xfa,0xf9,0xfa,0xf9,0xf9,0xf9,0xfa,0xfa,0xfa,
+       0xfa,0xfa,0xf9,0xf9,0xfa,0xfa,0xfa,0xfa,0xf9,0xfa,0xfa,0xfa,0xf9,0xfa,0xf9,0xf9,
+       0xf9,0xfa,0xfa,0xf9,0xf9,0xf9,0xf9,0xfa,0xfa,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,
+       0xf9,0x56,0x56,0xf9,0x56,0x56,0x56,0xfa,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0x56,
+       0xf9,0xf9,0xfa,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xf9,0xf9,0xf9,0xf9,
+       0xf9,0x56,0x56,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,
+       0x56,0x56,0xf9,0xf9,0xfa,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,
+       0xfa,0x56,0x56,0x56,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0x56,0xf9,0x56,0x56,
+       0x56,0xf9,0x56,0x56,0x56,0xf9,0x56,0x56,0xf9,0xf9,0x56,0x56,0xf9,0x56,0xf9,0xf9,
+       0xfa,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0xfa,0xf9,
+       0xf9,0xf9,0xf9,0x56,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xfa,
+       0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0xfa,0xf9,0x56,0x56,0x56,0x56,
+       0xf9,0xf9,0x56,0x56,0xf9,0x56,0x56,0xf9,0xf9,0x56,0x56,0x56,0xf9,0x56,0x56,0x56,
+       0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xfa,0xf9,0xf9,0xf9,0x56,0x56,
+       0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,
+       0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xfa,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,
+       0xf9,0xf9,0x56,0xf9,0xf9,0xfa,0x56,0xfb,0xff,0xff,0xac,0xfc,0xab,0xab,0xfb,0xaa,
+       0x80,0xfb,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xff,
+       0x2b,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0x56,0xf9,0xfa,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,
+       0x56,0x56,0xf9,0x56,0xf9,0xf9,0x56,0x56,0x56,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,
+       0x56,0xfa,0xf9,0x56,0x56,0xf9,0x56,0x56,0xf9,0x56,0xf9,0x56,0xfa,0xfa,0x56,0xf9,
+       0xfa,0x56,0x56,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,
+       0xf9,0xfa,0xf9,0xf9,0xfa,0x81,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xf9,0xf9,0xf9,0xfa,
+       0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0xfa,0xf9,0xfa,0xfa,0xfa,0xfa,
+       0xfa,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xfa,0xfa,0xf9,0xfa,0xfa,0xfa,0xfa,
+       0xf9,0x56,0x56,0xf9,0xf9,0xf9,0x56,0xfa,0xf9,0x56,0xf9,0xfa,0x56,0x56,0xf9,0x56,
+       0xf9,0x56,0x56,0xf9,0x56,0x56,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,
+       0xf9,0x56,0xfa,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,0x56,0xf9,0x56,0xf9,0xf9,
+       0x56,0x56,0x56,0x56,0xf9,0x56,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,
+       0xf9,0x56,0x56,0xf9,0x56,0xf9,0xf9,0xfa,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,
+       0x56,0xf9,0x56,0xf9,0x56,0xfa,0xfa,0x56,0xf9,0xfa,0x56,0x56,0xf9,0x56,0xf9,0x56,
+       0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xfa,0xf9,
+       0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0x56,0x56,0xf9,
+       0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0x56,0x56,0xf9,0x56,
+       0x56,0xfa,0xfa,0x56,0x56,0xfa,0xf9,0x56,0x56,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0x56,
+       0xfa,0xf9,0x56,0xf9,0xfa,0x56,0x56,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,
+       0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xfa,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,
+       0x56,0xf9,0x56,0xf9,0xf9,0x56,0x56,0x56,0x56,0xf9,0x56,0x56,0x56,0xf9,0xf9,0xf9,
+       0xf9,0x56,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xfc,0xff,0xff,0xab,0xab,0xab,0xfb,0xaa,
+       0xfb,0xfb,0xaa,0xfb,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
+       0xff,0xf6,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xf9,
+       0x56,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xf9,0x56,0x56,0xf9,0x56,0x56,0xf9,
+       0x56,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0x56,0xfa,0xf9,0xfa,0xf9,0x56,0xf9,0xf9,0x56,
+       0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,0x56,0xf9,0xf9,
+       0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xfa,0xfa,0xfa,0xfa,0xf9,0xf9,0xf9,0xfa,0xfa,
+       0xfa,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0xfa,0xfa,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,
+       0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0xfa,0xf9,0xfa,0xf9,0xfa,0xf9,0xfa,0xfa,0xfa,0xf9,
+       0xf9,0xfa,0xf9,0xfa,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0x56,
+       0xf9,0xf9,0xf9,0x56,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xfa,0xf9,0xf9,
+       0xf9,0x56,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,
+       0xf9,0x56,0x56,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xf9,0x56,0x56,0x56,0xf9,0x56,0x56,
+       0x56,0xf9,0x56,0x56,0x56,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,
+       0x56,0xfa,0xf9,0xfa,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,
+       0xf9,0x56,0xf9,0xf9,0x56,0x56,0x56,0xf9,0xfa,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0x56,
+       0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xf9,0x56,
+       0xf9,0xf9,0x56,0x56,0xf9,0x56,0x56,0x56,0x56,0xf9,0x56,0x56,0xf9,0x56,0x56,0x56,
+       0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0x56,0x56,0xfa,0xf9,0xf9,0xf9,
+       0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0x56,0x56,0xf9,0x56,0x56,
+       0x56,0xf9,0xfa,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,
+       0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xf9,0x56,
+       0x56,0x56,0xf9,0x56,0x56,0x56,0xf9,0x56,0x56,0xfc,0xff,0xff,0xab,0xfc,0xfb,0xab,
+       0xfb,0x81,0xaa,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
+       0x80,0xff,0xf6,0xfa,0xf9,0x56,0xf9,0xf9,0x56,0x56,0x56,0xf9,0x56,0xf9,0x56,0x56,
+       0x56,0xf9,0x56,0x56,0xf9,0x56,0xf9,0xf9,0x56,0xfa,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,
+       0xf9,0x56,0xf9,0x56,0x56,0xf9,0x56,0xf9,0x56,0xf9,0x56,0x56,0x56,0xf9,0x56,0x56,
+       0x56,0xfa,0x56,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0x56,0xf9,
+       0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0xfa,0xf9,0xf9,0xfa,0xfa,0xf9,0xf9,
+       0xf9,0xf9,0xfa,0xfa,0xf9,0xfa,0xfa,0xf9,0xfa,0xfa,0xf9,0xfa,0xf9,0xfa,0xf9,0xf9,
+       0xfa,0xf9,0xfa,0xf9,0xfa,0xf9,0xf9,0xfa,0xfa,0xfa,0xfa,0xf9,0xf9,0xfa,0xf9,0xf9,
+       0xfa,0xf9,0xf9,0xfa,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xf9,0x56,0x56,0xf9,
+       0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xf9,0x56,0x56,0x56,0xf9,0xf9,0x56,
+       0xf9,0x56,0x56,0x56,0xf9,0x56,0x56,0xf9,0x56,0x56,0xf9,0x56,0x56,0x56,0xf9,0x56,
+       0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0x56,
+       0xf9,0xf9,0xf9,0x56,0x56,0xfa,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0x56,0x56,0xf9,0x56,
+       0xf9,0x56,0xf9,0x56,0x56,0x56,0xf9,0x56,0x56,0x56,0xfa,0x56,0x56,0xf9,0x56,0xf9,
+       0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0x56,0x56,0x56,0x56,
+       0xf9,0x56,0xf9,0x56,0x56,0x56,0xf9,0x56,0x56,0xf9,0x56,0xf9,0xf9,0x56,0xfa,0xf9,
+       0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xf9,0x56,0xf9,0xf9,0x56,0x56,
+       0xfa,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0x56,0x56,0xf9,0x56,0xf9,0xf9,0x56,0x56,0x56,
+       0xf9,0x56,0x56,0x56,0x56,0xf9,0x56,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,
+       0x56,0x56,0xf9,0xf9,0x56,0xf9,0x56,0x56,0x56,0xf9,0x56,0x56,0xf9,0x56,0x56,0xf9,
+       0x56,0x56,0x56,0xf9,0x56,0xf9,0xf9,0x56,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,
+       0x56,0xf9,0x56,0xf9,0x56,0xf9,0x56,0xf9,0x56,0xf9,0xfc,0xff,0xff,0xfc,0xab,0xab,
+       0xfb,0xfb,0xaa,0x81,0xfb,0x80,0xfb,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
+       0x80,0x80,0xff,0x2b,0x56,0x56,0x56,0x56,0x56,0x56,0x56,0x56,0x56,0x56,0xf9,0x56,
+       0x56,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0xfa,0xf9,0xfa,
+       0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,0x56,0x56,0xf9,0x56,0xf9,0xf9,
+       0x56,0xf9,0xf9,0x56,0x56,0x56,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,
+       0x56,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xfa,0xf9,0xf9,0xf9,0xfa,0xfa,
+       0xfa,0xfa,0xfa,0xfa,0xf9,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xf9,0xf9,0xfa,
+       0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0xfa,0xfa,0xfa,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,
+       0xf9,0xf9,0xfa,0xfa,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xfa,0x56,0x56,
+       0x56,0xfa,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0x56,0xfa,0xf9,0x56,0xf9,
+       0x56,0x56,0x56,0xf9,0x56,0x56,0x56,0xf9,0xf9,0x56,0x56,0x56,0xfa,0xfa,0xf9,0xf9,
+       0xf9,0xf9,0x56,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,
+       0xf9,0xf9,0x56,0x56,0xfa,0xf9,0x56,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0x56,0xf9,
+       0xf9,0x56,0x56,0x56,0x56,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,0x56,0xfa,
+       0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xf9,0xf9,0x56,
+       0x56,0x56,0x56,0xf9,0x56,0x56,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,
+       0xf9,0x56,0xf9,0xfa,0xf9,0xfa,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xfa,
+       0xf9,0xf9,0x56,0x56,0x56,0xf9,0x56,0x56,0xf9,0x56,0x56,0xf9,0x56,0x56,0x56,0xf9,
+       0xf9,0x56,0x56,0xf9,0x56,0xf9,0xfa,0x56,0x56,0x56,0xfa,0xf9,0xf9,0xfa,0x56,0xf9,
+       0x56,0xf9,0xf9,0x56,0xf9,0x56,0x56,0x56,0xf9,0x56,0x56,0x56,0xf9,0xf9,0x56,0x56,
+       0x56,0xfa,0xfa,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,
+       0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xfc,0xff,0xff,0xac,0xab,
+       0xab,0xab,0xfb,0xfb,0x80,0xaa,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
+       0x80,0x80,0x80,0xff,0x2b,0x56,0xf9,0xf9,0x56,0xfa,0xf9,0xfa,0xf9,0xf9,0xf9,0x56,
+       0x56,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,
+       0x56,0x56,0x56,0xf9,0x56,0xf9,0x56,0x56,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0x56,0x56,
+       0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xf9,0xf9,0x56,0x56,0x56,0xfa,
+       0x56,0x56,0x56,0xf9,0xf9,0xfa,0xf9,0xfa,0xf9,0xfa,0xfa,0xfa,0xfa,0xf9,0xfa,0xfa,
+       0xfa,0xf9,0xf9,0xfa,0xfa,0xf9,0xf9,0xfa,0xf9,0xfa,0xfa,0xfa,0xf9,0xf9,0xf9,0xf9,
+       0xfa,0xfa,0xfa,0xfa,0xfa,0xf9,0xfa,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,
+       0xfa,0xf9,0xfa,0xf9,0xf9,0xf9,0xfa,0x81,0xfa,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,
+       0x56,0xf9,0x56,0x56,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0x56,0x56,0xf9,0xf9,0x56,
+       0x56,0xf9,0x56,0xf9,0xf9,0xfa,0xf9,0x56,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0x56,0xf9,
+       0xf9,0x56,0xfa,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,
+       0xf9,0xfa,0x56,0x56,0xf9,0xf9,0x56,0x56,0x56,0x56,0x56,0x56,0xf9,0x56,0xf9,0x56,
+       0xf9,0x56,0x56,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,
+       0x56,0x56,0x56,0xf9,0xf9,0x56,0x56,0x56,0xfa,0x56,0x56,0x56,0xf9,0x56,0xf9,0xf9,
+       0xfa,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0xf9,
+       0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,
+       0xf9,0x56,0x56,0x56,0x56,0x56,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0x56,0xf9,
+       0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0x56,0x56,0x56,0xf9,0xf9,
+       0x56,0x56,0xfa,0x56,0x56,0x56,0xf9,0x56,0xf9,0xf9,0xfa,0xf9,0x56,0xf9,0x56,0x56,
+       0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xfa,0x56,0xf9,0xf9,0xf9,0xf9,0xfa,0x56,0xf9,
+       0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xfa,0x56,0x56,0xf9,0xf9,0x56,0xfb,0xff,0xff,0xab,
+       0xfc,0xfb,0xaa,0xfb,0xaa,0xfb,0x80,0xfb,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
+       0x80,0x80,0x80,0x80,0xff,0xf6,0x56,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,
+       0xf9,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0x56,0x56,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0x56,
+       0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,0x56,0xf9,0xf9,0x56,0xfa,0xf9,0xfa,0x56,0x56,
+       0xf9,0x56,0xfa,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,
+       0xfa,0x56,0x56,0xf9,0xf9,0xf9,0xfa,0xf9,0xfa,0xf9,0xfa,0xfa,0xfa,0xfa,0xfa,0xf9,
+       0xf9,0xf9,0xfa,0xf9,0xf9,0xfa,0xf9,0xfa,0xf9,0xfa,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,
+       0xfa,0xfa,0xf9,0xf9,0xfa,0xf9,0xf9,0xfa,0xfa,0xf9,0xf9,0xf9,0xfa,0xfa,0xfa,0xf9,
+       0xf9,0xf9,0xf9,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,
+       0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0x56,
+       0x56,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0x56,
+       0xf9,0x56,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,
+       0xf9,0x56,0xf9,0x56,0x56,0xf9,0xf9,0x56,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0x56,
+       0x56,0xf9,0xf9,0x56,0xfa,0xf9,0xfa,0xf9,0x56,0xf9,0x56,0xfa,0xf9,0xf9,0xf9,0x56,
+       0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xfa,0xf9,0x56,0x56,0xf9,0xf9,0xfa,0xf9,
+       0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0x56,0x56,0xf9,0x56,
+       0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0x56,0xfa,0x56,0x56,
+       0xf9,0xf9,0x56,0x56,0x56,0xf9,0xfa,0xf9,0xf9,0x56,0x56,0x56,0xf9,0x56,0xf9,0xf9,
+       0xf9,0xfa,0x56,0x56,0x56,0x56,0xfa,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0x56,
+       0xf9,0xf9,0xf9,0xfa,0x56,0x56,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,
+       0xf9,0x56,0x56,0xf9,0x56,0xf9,0x56,0xf9,0x56,0x56,0x56,0xf9,0xf9,0x56,0x56,0xf9,
+       0x56,0x56,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xfc,0xff,0xff,
+       0xab,0xfc,0xab,0xab,0xfb,0xfb,0x80,0xfb,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
+       0x80,0x80,0x80,0x80,0x80,0xff,0xf6,0xfa,0xf9,0x56,0xf9,0x56,0xf9,0x56,0x56,0x56,
+       0xf9,0xfa,0xf9,0xf9,0xfa,0xf9,0x56,0xf9,0x56,0xfa,0xf9,0xf9,0xf9,0xf9,0x56,0x56,
+       0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0x56,0xfa,0xf9,0xf9,0xf9,0x56,0x56,0x56,
+       0x56,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xfa,0xf9,0xf9,0x56,
+       0xf9,0x56,0x56,0xfa,0xfa,0x56,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0x81,0x81,0xfa,0xfa,
+       0xfa,0xfa,0xf9,0xfa,0xfa,0xfa,0xfa,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0x81,0xf9,0xf9,
+       0xfa,0xfa,0xfa,0xf9,0xf9,0xf9,0xf9,0xfa,0xfa,0xf9,0xf9,0xfa,0xfa,0xfa,0xfa,0xfa,
+       0xf9,0xfa,0xf9,0xf9,0xfa,0xfa,0xf9,0xfa,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0x56,
+       0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xfa,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0x56,
+       0x56,0xf9,0xfa,0x56,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xfa,0xf9,0xf9,0xf9,0xfa,0xf9,
+       0x56,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xf9,0x56,0x56,0xf9,0xf9,
+       0xf9,0x56,0x56,0x56,0x56,0xf9,0xfa,0x56,0x56,0xfa,0xf9,0xfa,0xf9,0xf9,0xf9,0x56,
+       0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0x56,0x56,0xf9,0x56,0xf9,0x56,0xf9,0xf9,
+       0xf9,0xf9,0x56,0x56,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xfa,0xfa,0x56,0xf9,
+       0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xfa,0xf9,0xf9,0xfa,0xf9,0x56,0xf9,0x56,0xfa,0xf9,
+       0xf9,0xf9,0xf9,0x56,0x56,0x56,0xfa,0x56,0x56,0xf9,0xf9,0xf9,0x56,0x56,0x56,0x56,
+       0xf9,0xfa,0x56,0x56,0xfa,0xf9,0xfa,0xf9,0x56,0x56,0xf9,0x56,0x56,0xfa,0xf9,0xf9,
+       0xf9,0x56,0x56,0x56,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xfa,0x56,0x56,0x56,0xf9,0xf9,
+       0xfa,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xfa,0x56,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xfa,
+       0xf9,0xf9,0xf9,0xfa,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0x56,
+       0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,0x56,0x56,0xf9,0xfa,0x56,0x56,0xfc,0xff,
+       0xff,0xfc,0xab,0xab,0xfb,0xfb,0xaa,0xfb,0x80,0xaa,0x80,0x80,0x80,0x80,0x80,0x80,
+       0x80,0x80,0x80,0x80,0x80,0x80,0xff,0x2b,0xfa,0x56,0x56,0xfa,0xf9,0x56,0xf9,0x56,
+       0x56,0xfa,0x56,0x56,0x56,0xf9,0x56,0xf9,0xf9,0xfa,0xf9,0x56,0x56,0xf9,0x56,0xf9,
+       0xf9,0xf9,0xfa,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0xf9,
+       0xfa,0xf9,0xf9,0xfa,0x56,0xf9,0xf9,0xf9,0x56,0x56,0x56,0x56,0xf9,0xf9,0x56,0xf9,
+       0xf9,0x56,0x56,0xf9,0xf9,0x56,0x56,0xfa,0xf9,0xf9,0xf9,0xf9,0xfa,0x81,0xfa,0xf9,
+       0xf9,0xfa,0xf9,0xfa,0xf9,0xfa,0xfa,0xf9,0xf9,0xfa,0xf9,0xf9,0xfa,0xfa,0xfa,0xf9,
+       0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0xfa,0xfa,0xf9,0xf9,0xfa,0xf9,0xfa,0xf9,
+       0xf9,0xfa,0xfa,0xf9,0xfa,0xfa,0xf9,0xf9,0xfa,0xf9,0xfa,0xfa,0xfa,0xfa,0x81,0xf9,
+       0xf9,0xfa,0xf9,0x56,0x56,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,
+       0x56,0xf9,0xfa,0x56,0x56,0xfa,0x56,0x56,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0x56,
+       0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0x56,0x56,0xf9,0xf9,0xfa,0xf9,0xf9,0x56,
+       0x56,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xf9,0xf9,0x56,0x56,
+       0xf9,0xf9,0xf9,0xfa,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xfa,0x56,0xf9,0xf9,
+       0xf9,0x56,0x56,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0x56,0x56,0xf9,0xfa,0x56,0x56,
+       0xf9,0xf9,0x56,0x56,0x56,0x56,0xfa,0x56,0x56,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,
+       0x56,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0x56,0x56,0xf9,
+       0x56,0xfa,0xf9,0x56,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xfa,0xf9,0xf9,
+       0x56,0xf9,0x56,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0x56,0x56,
+       0xf9,0xf9,0x56,0xf9,0x56,0x56,0xf9,0xfa,0x56,0x56,0xfa,0x56,0x56,0xf9,0x56,0x56,
+       0xf9,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0x56,0x56,0xf9,0xf9,
+       0xf9,0xfa,0xf9,0x56,0x56,0x56,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xfc,
+       0xff,0xff,0xab,0xfc,0xab,0xab,0xfb,0x80,0xfb,0x80,0x81,0x80,0x80,0x80,0x80,0x80,
+       0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xff,0x2b,0x56,0x56,0xfa,0xf9,0xf9,0x56,0x56,
+       0x56,0xf9,0xf9,0x56,0x56,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,
+       0xf9,0xfa,0xf9,0xf9,0x56,0x56,0xf9,0x56,0x56,0xf9,0xfa,0x56,0xf9,0x56,0x56,0xfa,
+       0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xfa,0x56,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,
+       0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xfa,0xfa,0xf9,0xf9,0xf9,0xf9,0xfa,0xfa,0xf9,
+       0xf9,0xf9,0xf9,0xfa,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0xfa,0xfa,0xfa,0xfa,
+       0xf9,0xf9,0xf9,0xfa,0xf9,0xfa,0xfa,0xfa,0xfa,0xfa,0xf9,0xf9,0xfa,0xf9,0xf9,0x81,
+       0xf9,0xfa,0xf9,0xf9,0xfa,0xfa,0xf9,0xfa,0xf9,0xf9,0xfa,0xfa,0x81,0xfa,0xfa,0xf9,
+       0xfa,0xf9,0xfa,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,
+       0xf9,0x56,0xf9,0x56,0x56,0xf9,0xfa,0xf9,0x56,0x56,0x56,0xf9,0xf9,0x56,0x56,0x56,
+       0x56,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0x56,0x56,0x56,
+       0x56,0xf9,0xf9,0x56,0xfa,0xf9,0xfa,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xfa,0x56,0xf9,
+       0x56,0x56,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xfa,0xf9,0xfa,0xf9,0x56,0xf9,0xf9,0xf9,
+       0xfa,0x56,0x56,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0x56,
+       0xfa,0xf9,0xf9,0x56,0x56,0x56,0xf9,0xf9,0x56,0x56,0xf9,0x56,0xf9,0x56,0xf9,0xf9,
+       0x56,0x56,0xf9,0xf9,0x56,0xf9,0xfa,0xf9,0xf9,0x56,0x56,0x56,0xf9,0x56,0xf9,0xf9,
+       0xfa,0xf9,0xfa,0x56,0x56,0xf9,0xf9,0x56,0xfa,0x56,0x56,0x56,0x56,0xf9,0xfa,0x56,
+       0xf9,0x56,0x56,0xfa,0xf9,0xfa,0x56,0xf9,0xf9,0x56,0xf9,0xfa,0x56,0x56,0xf9,0x56,
+       0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xf9,0xfa,0xf9,0x56,0x56,0x56,
+       0xf9,0xf9,0x56,0x56,0x56,0x56,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,
+       0xf9,0xfa,0x56,0x56,0xf9,0x56,0xf9,0xf9,0x56,0xfa,0xf9,0xfa,0xf9,0xf9,0x56,0xf9,
+       0xfc,0xff,0xff,0xfc,0xfc,0xab,0xfb,0xaa,0xfb,0xaa,0xfb,0x80,0x80,0x80,0x80,0x80,
+       0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xff,0x2b,0x56,0xf9,0xf9,0xf9,0x56,0xf9,
+       0x56,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,
+       0xf9,0xf9,0x56,0x56,0x56,0x56,0x56,0x56,0x56,0x56,0xf9,0x56,0x56,0x56,0x56,0x56,
+       0xf9,0xf9,0xf9,0x56,0x56,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,
+       0xf9,0xf9,0x56,0x56,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xfa,0xfa,
+       0xf9,0xfa,0xfa,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xfa,0xf9,0xf9,0xf9,0xf9,
+       0xf9,0xf9,0xf9,0xf9,0xfa,0xfa,0xf9,0xfa,0xf9,0xf9,0xfa,0xfa,0xf9,0xfa,0xfa,0xfa,
+       0xfa,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xfa,0xf9,0xf9,0xf9,
+       0xfa,0xfa,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0x56,
+       0x56,0x56,0x56,0xf9,0x56,0x56,0xfa,0x56,0x56,0xf9,0x56,0xf9,0x56,0xf9,0x56,0xf9,
+       0xfa,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0x56,0x56,0x56,
+       0x56,0x56,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xfa,0x56,
+       0x56,0x56,0x56,0xf9,0x56,0x56,0x56,0x56,0x56,0xf9,0x56,0xf9,0x56,0x56,0xf9,0x56,
+       0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0x56,0x56,0x56,0xf9,0x56,
+       0xf9,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0x56,
+       0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0x56,0x56,0x56,0x56,0xf9,0xf9,0xf9,
+       0xf9,0x56,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xfa,0xf9,0x56,0x56,0x56,0x56,0xf9,0x56,
+       0x56,0x56,0x56,0x56,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,
+       0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xf9,0x56,0x56,0xfa,0x56,0x56,0xf9,0x56,
+       0xf9,0x56,0xf9,0x56,0xf9,0xfa,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xfa,0x56,
+       0xf9,0x56,0x56,0x56,0x56,0x56,0x56,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xf9,0x56,0xf9,
+       0xf9,0xfc,0xff,0xff,0xab,0xab,0xfb,0xab,0xfb,0xfb,0xfb,0x80,0x80,0xfb,0x80,0x80,
+       0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xff,0x2b,0xf9,0x56,0xf9,0x56,0xf9,
+       0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xf9,
+       0xf9,0x56,0x56,0x56,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,
+       0xf9,0xf9,0x56,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xfa,0x56,0x56,0xf9,0xf9,0xf9,0xf9,
+       0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x81,0xfa,
+       0xfa,0x81,0xfa,0xfa,0xfa,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,
+       0xfa,0xfa,0xfa,0xfa,0xf9,0xfa,0xfa,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,
+       0xfa,0xf9,0xf9,0xfa,0xfa,0xf9,0xf9,0xfa,0xfa,0xfa,0xf9,0xfa,0xfa,0xf9,0xf9,0xfa,
+       0xf9,0xfa,0xfa,0xf9,0x81,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0x56,
+       0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,
+       0xf9,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0x56,0x56,0xf9,0xf9,0x56,0x56,0x56,0xf9,0xf9,
+       0xfa,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,0x56,0x56,0xf9,0xf9,0x56,
+       0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0xf9,
+       0xf9,0x56,0xfa,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,
+       0xf9,0x56,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,
+       0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,
+       0x56,0xf9,0x56,0xf9,0x56,0x56,0x56,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0x56,
+       0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0x56,0x56,0xf9,0xf9,0x56,
+       0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,
+       0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0x56,0x56,0xf9,0xf9,
+       0x56,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,
+       0x56,0x56,0xfc,0xff,0xff,0xfc,0xab,0xab,0xfb,0xaa,0xfb,0xaa,0x80,0xfb,0x80,0x80,
+       0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xff,0x2b,0x56,0xf9,0x56,0x56,
+       0x56,0x56,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0xfa,0xf9,0x56,0x56,0x56,
+       0xf9,0x56,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xfa,0xf9,0x56,0x56,0xfa,0x56,0xfa,
+       0xf9,0xfa,0xf9,0xf9,0xf9,0x56,0x56,0xfa,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,
+       0x56,0xf9,0xfa,0xf9,0x56,0x56,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xfa,
+       0xf9,0xfa,0xfa,0xfa,0xf9,0xfa,0xf9,0xfa,0xfa,0xf9,0xf9,0x56,0x56,0x56,0x56,0x56,
+       0xfa,0xfa,0xfa,0xfa,0xf9,0xf9,0xfa,0xfa,0xf9,0xfa,0xfa,0xfa,0xf9,0xf9,0xf9,0xfa,
+       0xf9,0xf9,0xf9,0xf9,0xfa,0xfa,0xf9,0xfa,0xfa,0xf9,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,
+       0xf9,0xf9,0xfa,0xfa,0xf9,0xfa,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,
+       0xfa,0xf9,0x56,0x56,0x56,0xf9,0x56,0xf9,0x56,0x56,0x56,0x56,0xf9,0xf9,0x56,0xf9,
+       0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0x56,0x56,0x56,0xf9,0xf9,
+       0xf9,0xf9,0x56,0x56,0xfa,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,
+       0x56,0xf9,0xf9,0xf9,0x56,0x56,0xfa,0x56,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0x56,0x56,
+       0xfa,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0x56,
+       0xf9,0x56,0xf9,0x56,0x56,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0x56,
+       0xfa,0xf9,0x56,0x56,0x56,0xf9,0x56,0x56,0x56,0xf9,0xfa,0xf9,0xf9,0x56,0x56,0xfa,
+       0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xfa,0xf9,0x56,
+       0xf9,0xfa,0x56,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0x56,0x56,0xfa,0xf9,0xf9,0xf9,0xf9,
+       0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0x56,0xf9,0x56,0x56,0x56,
+       0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0x56,
+       0x56,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xfa,0xf9,0x56,0xf9,0xf9,0xf9,0x56,
+       0xf9,0xf9,0xf9,0xfc,0xff,0xff,0xac,0xfc,0xab,0xfb,0xfb,0xaa,0x81,0x80,0x80,0x80,
+       0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xff,0x2b,0xf9,0xf9,0xfa,
+       0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0x56,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,
+       0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,
+       0x56,0xf9,0x56,0x56,0xf9,0x56,0x56,0xf9,0xf9,0x56,0x56,0xf9,0x56,0xf9,0xf9,0xf9,
+       0x56,0x56,0x56,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xfa,0xf9,0xf9,0xfa,
+       0xf9,0xfa,0xfa,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,
+       0xf9,0x56,0xfa,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0xfa,0xfa,0xf9,0xfa,0xfa,0xfa,
+       0xfa,0xfa,0xf9,0xf9,0xfa,0xfa,0xf9,0xf9,0xf9,0x81,0xf9,0xfa,0xfa,0xf9,0xf9,0xfa,
+       0xf9,0xf9,0xfa,0xfa,0xf9,0xf9,0xfa,0xfa,0xf9,0xfa,0xf9,0xf9,0x56,0xf9,0x56,0x56,
+       0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0x56,0x56,0x56,
+       0xf9,0x56,0x56,0x56,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xfa,0xf9,0xf9,
+       0xf9,0xf9,0x56,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xfa,0xf9,
+       0x56,0x56,0xf9,0xfa,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,
+       0xf9,0xf9,0x56,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,0x56,0x56,0x56,0xf9,0xf9,
+       0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0x56,0x56,0x56,0x56,0xf9,0x56,0x56,0xf9,
+       0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0x56,0xf9,0xf9,0x56,0x56,0x56,
+       0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,
+       0x56,0x56,0xfa,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0x56,0x56,0xf9,0xf9,0x56,0x56,0xf9,
+       0x56,0xf9,0xfa,0x56,0xf9,0x56,0xf9,0x56,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xfa,0xf9,
+       0xf9,0xf9,0x56,0x56,0x56,0xf9,0x56,0x56,0x56,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,
+       0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,
+       0xf9,0xf9,0x56,0xfa,0xfc,0xff,0xff,0xab,0xab,0xab,0xaa,0xfb,0xfb,0xfb,0xaa,0xfb,
+       0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xff,0xf6,0xf9,0x56,
+       0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0x56,0x56,0x56,0x56,
+       0x56,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xfa,
+       0x56,0xf9,0xf9,0x56,0x56,0x56,0x56,0x56,0xfa,0xf9,0x56,0x56,0xf9,0x56,0x56,0x56,
+       0x56,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xfa,
+       0xfa,0xfa,0x81,0xfa,0xfa,0xfa,0xfa,0xfa,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xf9,
+       0xf9,0x56,0xf9,0xfa,0xf9,0xfa,0xfa,0xfa,0xfa,0xfa,0xf9,0xf9,0xf9,0xfa,0xfa,0xf9,
+       0xf9,0xfa,0xf9,0xf9,0xfa,0xfa,0xfa,0xf9,0xfa,0xfa,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,
+       0xf9,0xf9,0xf9,0xfa,0xfa,0xf9,0xfa,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,
+       0x56,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xf9,
+       0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0x56,0x56,0x56,0x56,0x56,0x56,0x56,0xf9,0xf9,0x56,
+       0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0x56,0xf9,0x56,0xf9,0xf9,
+       0x56,0x56,0xfa,0xf9,0xf9,0x56,0xf9,0xf9,0xfa,0x56,0x56,0xf9,0x56,0x56,0x56,0x56,
+       0x56,0xf9,0xf9,0x56,0x56,0xf9,0x56,0x56,0x56,0x56,0xf9,0x56,0xf9,0x56,0x56,0xf9,
+       0xf9,0x56,0xf9,0xf9,0x56,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xfa,0x56,0xf9,0xfa,
+       0xf9,0x56,0x56,0x56,0x56,0x56,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,
+       0xf9,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xf9,0x56,0x56,0xfa,0x56,0x56,0xf9,0xfa,0xf9,
+       0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0x56,0x56,0x56,0x56,0x56,0xf9,0xf9,0x56,0x56,
+       0xf9,0x56,0x56,0x56,0x56,0xf9,0x56,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,
+       0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0x56,0x56,0x56,0x56,0x56,
+       0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,
+       0x56,0xf9,0x56,0xf9,0xf9,0xfb,0xff,0xff,0xfc,0xfb,0xab,0xfb,0xab,0x80,0xaa,0x80,
+       0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xff,0x2b,0xf9,
+       0xf9,0xf9,0x56,0x56,0xf9,0x56,0x56,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,
+       0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0x56,0xf9,0x56,0x56,0xf9,0x56,
+       0xf9,0x56,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0x56,0xfa,0x56,0xf9,0xf9,0xf9,0x56,0xf9,
+       0x56,0x56,0xf9,0xf9,0x56,0xfa,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,
+       0xf9,0xfa,0xfa,0x81,0xfa,0xfa,0xfa,0xfa,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,
+       0xf9,0x56,0x56,0xfa,0xf9,0xf9,0xf9,0xf9,0xfa,0xfa,0xfa,0xf9,0xfa,0xfa,0xfa,0xf9,
+       0xf9,0xfa,0xfa,0xf9,0xfa,0xfa,0xfa,0xf9,0xf9,0xfa,0xf9,0xfa,0xf9,0xfa,0xfa,0xfa,
+       0xf9,0xf9,0xf9,0xfa,0xfa,0xfa,0xf9,0xfa,0xfa,0xf9,0xfa,0xfa,0xf9,0xfa,0xfa,0xf9,
+       0xfa,0xf9,0xf9,0xfa,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0x56,
+       0x56,0xfa,0xf9,0x56,0xfa,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0xfa,0x56,
+       0xf9,0xfa,0xfa,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,
+       0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0x56,0xf9,0x56,0xf9,0x56,0xf9,0x56,0x56,
+       0xf9,0x56,0xfa,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xf9,0xfa,0xf9,0xfa,0xf9,
+       0x56,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,
+       0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0x56,
+       0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xfa,0xf9,
+       0x56,0x56,0xf9,0x56,0xf9,0x56,0xf9,0x56,0xf9,0x56,0xf9,0x56,0xf9,0xfa,0xf9,0xf9,
+       0xf9,0x56,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,
+       0x56,0xf9,0x56,0xf9,0x56,0x56,0xfa,0xf9,0x56,0xfa,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,
+       0xf9,0x56,0x56,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,
+       0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xfc,0xff,0xff,0xab,0xab,0xfc,0xfb,0xfb,0xfb,0xfb,
+       0xfb,0x80,0xfb,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xff,0x2b,
+       0x56,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xfa,
+       0xf9,0x56,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xf9,0x56,0x56,0x56,0xf9,0x56,0xf9,0xf9,
+       0xf9,0x56,0x56,0xf9,0xf9,0x56,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xf9,
+       0xfa,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xfa,0xf9,
+       0xf9,0xf9,0xfa,0xfa,0xfa,0xfa,0xf9,0xf9,0xfa,0xf9,0xf9,0xfa,0xf9,0xf9,0x56,0x56,
+       0x56,0xf9,0x56,0xf9,0x56,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0xfa,0xfa,
+       0xf9,0xf9,0xfa,0xf9,0xf9,0xfa,0xfa,0xf9,0xf9,0xfa,0xfa,0xf9,0xf9,0xf9,0xfa,0xf9,
+       0xf9,0xf9,0xfa,0xfa,0xf9,0xfa,0xf9,0xfa,0xf9,0xf9,0xfa,0xfa,0xfa,0xf9,0xfa,0xf9,
+       0x56,0xf9,0x56,0x56,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0x56,
+       0xf9,0xfa,0xf9,0x56,0xf9,0x56,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,
+       0x56,0xf9,0x56,0x56,0x56,0x56,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xfa,0xf9,0x56,0xf9,
+       0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0x56,
+       0xf9,0xf9,0x56,0xf9,0x56,0xf9,0x56,0x56,0xf9,0xfa,0xf9,0xf9,0x56,0x56,0x56,0xf9,
+       0x56,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xfa,0xf9,0xf9,0x56,
+       0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xf9,0x56,0x56,
+       0x56,0xf9,0x56,0x56,0x56,0xf9,0x56,0xfa,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,
+       0x56,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0x56,
+       0x56,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0x56,
+       0x56,0xf9,0xf9,0x56,0x56,0xf9,0xfa,0xf9,0x56,0xf9,0x56,0xf9,0x56,0x56,0xf9,0xf9,
+       0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0x56,0x56,0x56,0xf9,0x56,0x56,0xf9,0xf9,
+       0x56,0xfa,0xf9,0x56,0xf9,0xf9,0x56,0xfc,0xff,0xff,0xfc,0xab,0xab,0xab,0xfb,0xaa,
+       0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xff,
+       0x2b,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0x56,
+       0x56,0xf9,0x56,0xfa,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,
+       0xfa,0x56,0x56,0xf9,0xf9,0x56,0x56,0x56,0xfa,0x56,0xf9,0xf9,0xf9,0x56,0x56,0x56,
+       0xf9,0xf9,0x56,0x56,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,
+       0xf9,0xf9,0xfa,0xfa,0x81,0xfa,0xf9,0xfa,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,
+       0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xfa,0xf9,0xfa,0xfa,0xf9,0xfa,0xfa,
+       0xf9,0xf9,0xfa,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0xfa,0xfa,0xf9,0xf9,0xf9,0x81,
+       0xf9,0xf9,0xf9,0xfa,0xf9,0xfa,0xfa,0xfa,0xf9,0xf9,0xf9,0xfa,0xfa,0xf9,0xfa,0xfa,
+       0xfa,0xfa,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xfa,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,
+       0xf9,0x56,0xfa,0x56,0xf9,0x56,0x56,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,
+       0xf9,0x56,0xf9,0xf9,0x56,0x56,0xfa,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0x56,0x56,0x56,
+       0xf9,0x56,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xfa,0x56,0x56,
+       0xf9,0xf9,0x56,0xf9,0xfa,0x56,0x56,0x56,0x56,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0x56,
+       0xf9,0x56,0xf9,0xfa,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0x56,0xfa,0x56,0x56,
+       0xf9,0x56,0x56,0xf9,0x56,0xf9,0x56,0x56,0xfa,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,
+       0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xf9,0x56,0x56,0xf9,0x56,
+       0x56,0x56,0x56,0xfa,0xf9,0x56,0x56,0xf9,0xfa,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,
+       0xf9,0x56,0x56,0x56,0xfa,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0xfa,0x56,0xf9,
+       0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xfa,0x56,0xf9,0x56,0x56,0x56,0xf9,0xf9,0xf9,
+       0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,
+       0x56,0xf9,0x56,0x56,0x56,0xf9,0x56,0x56,0xfc,0xff,0xff,0xfc,0xab,0xfb,0xaa,0xfb,
+       0xfb,0xfb,0xaa,0xfb,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
+       0xff,0x2b,0x56,0x56,0xfa,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0x56,0x56,0x56,0x56,0xf9,
+       0x56,0x56,0x56,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xfa,0x56,0x56,0x56,0xfa,0xf9,0x56,
+       0xfa,0x56,0x56,0xf9,0x56,0xfa,0x56,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,
+       0xf9,0xfa,0x56,0x56,0xfa,0xf9,0xf9,0xf9,0xfa,0xf9,0x56,0x56,0xf9,0x56,0x56,0xf9,
+       0xfa,0xfa,0xf9,0xfa,0xfa,0xfa,0xfa,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,
+       0x56,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xfa,0x56,0xf9,0xf9,0xfa,0x81,0xfa,
+       0xf9,0xf9,0xfa,0xfa,0xf9,0xfa,0xf9,0xf9,0xfa,0xf9,0xfa,0xfa,0xf9,0xf9,0xfa,0xf9,
+       0xfa,0xf9,0xf9,0xfa,0xfa,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0xfa,0xfa,0xf9,0xf9,0xfa,
+       0xfa,0xfa,0xfa,0xfa,0xf9,0xf9,0xfa,0xf9,0x56,0xf9,0xf9,0x56,0x56,0x56,0xfa,0xf9,
+       0xf9,0x56,0xf9,0x56,0xf9,0x56,0xf9,0x56,0xf9,0x56,0x56,0x56,0x56,0x56,0xf9,0xf9,
+       0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,
+       0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xfa,0xf9,0x56,0xf9,0x56,0xf9,0x56,
+       0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xfa,0x56,0x56,0xf9,0xf9,0xf9,
+       0xf9,0xf9,0xf9,0x56,0x56,0xf9,0x56,0x56,0x56,0xfa,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,
+       0xf9,0x56,0x56,0x56,0xf9,0x56,0x56,0x56,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xfa,0x56,
+       0x56,0x56,0xfa,0xf9,0x56,0x56,0xf9,0xfa,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,
+       0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0x56,
+       0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xfa,0x56,0xf9,0xf9,
+       0x56,0x56,0x56,0xfa,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0x56,0xf9,0x56,0xf9,0x56,0x56,
+       0x56,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0x56,0xf9,
+       0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xfc,0xff,0xff,0xab,0xfc,0xab,0xab,
+       0xfb,0xfb,0xaa,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
+       0x80,0xff,0xf6,0x56,0xf9,0xfa,0x56,0xf9,0x56,0x56,0x56,0x56,0xf9,0xf9,0x56,0xfa,
+       0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,0x56,0x56,0xf9,0xf9,0x56,
+       0xf9,0xfa,0x56,0xf9,0xf9,0xf9,0xfa,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xfa,0x56,0x56,
+       0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0x56,
+       0xf9,0xfa,0xf9,0xf9,0xfa,0xf9,0xfa,0xfa,0xfa,0xf9,0xfa,0xfa,0xfa,0xfa,0xf9,0xf9,
+       0xf9,0x56,0x56,0xf9,0x56,0x56,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,
+       0xfa,0xf9,0xf9,0xfa,0xf9,0xfa,0xfa,0xfa,0xfa,0xfa,0xf9,0xfa,0xfa,0xfa,0xf9,0xfa,
+       0xfa,0xfa,0xf9,0xf9,0xfa,0xfa,0xf9,0xfa,0xfa,0xfa,0xf9,0xfa,0xfa,0xfa,0xf9,0xfa,
+       0xfa,0xf9,0xf9,0x81,0xfa,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,
+       0x56,0x56,0x56,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,
+       0x56,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xf9,0xf9,0x56,0x56,0x56,0xf9,0x56,0xf9,0x56,
+       0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0x56,0xf9,0xfa,0x56,0xf9,0xf9,0xf9,0xfa,
+       0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xfa,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xfa,0x56,
+       0x56,0xfa,0xf9,0x56,0xf9,0xf9,0xfa,0x56,0x56,0xf9,0xfa,0x56,0x56,0x56,0x56,0x56,
+       0xf9,0x56,0xf9,0xf9,0xfa,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,
+       0x56,0x56,0xf9,0xf9,0x56,0x56,0x56,0xf9,0x56,0xf9,0x56,0x56,0xf9,0x56,0xf9,0xf9,
+       0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xfa,0x56,0xf9,0xf9,0xf9,0x56,
+       0xf9,0xfa,0xf9,0x56,0xf9,0xfa,0xf9,0x56,0xf9,0xfa,0x56,0x56,0xf9,0xf9,0x56,0xf9,
+       0xf9,0x56,0x56,0xf9,0xf9,0x56,0x56,0x56,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xfa,
+       0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0x56,0x56,0x56,0xf9,0x56,0x56,
+       0x56,0xf9,0x56,0xf9,0x56,0x56,0xf9,0xf9,0xfa,0xf9,0xfc,0xff,0xff,0xfc,0xab,0xab,
+       0xfb,0xfb,0xaa,0x80,0xfb,0x80,0xfb,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
+       0x80,0x80,0xff,0x2b,0xf9,0xf9,0x56,0x56,0x56,0x56,0xfa,0xf9,0xf9,0xf9,0xf9,0x56,
+       0xf9,0x56,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xfa,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xfa,
+       0xf9,0x56,0x56,0x56,0x56,0x56,0x56,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0x56,0xf9,
+       0xf9,0x56,0xfa,0x56,0x56,0xfa,0xf9,0x56,0xf9,0xfa,0x56,0xf9,0xf9,0xf9,0xfa,0x56,
+       0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x81,0xfa,0xfa,0xfa,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,
+       0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xf9,0xf9,0xf9,0xfa,0xf9,0x56,0xf9,0xf9,
+       0xf9,0xf9,0xf9,0xfa,0xf9,0xfa,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,
+       0xf9,0xf9,0xfa,0xfa,0xf9,0xf9,0xf9,0xfa,0xf9,0xfa,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,
+       0x81,0xfa,0xf9,0xfa,0xfa,0xfa,0xfa,0xfa,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,
+       0x56,0x56,0x56,0x56,0xfa,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xf9,0x56,
+       0xf9,0xf9,0xfa,0x56,0x56,0xf9,0x56,0xf9,0xf9,0xfa,0xf9,0x56,0xf9,0xf9,0x56,0x56,
+       0x56,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0x56,0x56,0x56,0x56,0x56,0x56,0x56,0x56,0x56,
+       0xf9,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xf9,0x56,0xfa,0x56,0x56,0xfa,0xf9,
+       0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0x56,0x56,0xfa,
+       0xf9,0x56,0xfa,0x56,0x56,0x56,0x56,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xfa,0x56,0x56,
+       0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0x56,0xf9,0xf9,
+       0xf9,0x56,0x56,0x56,0x56,0x56,0xf9,0x56,0x56,0x56,0x56,0xf9,0xf9,0x56,0x56,0x56,
+       0xf9,0xf9,0x56,0x56,0xf9,0x56,0xf9,0x56,0xf9,0xfa,0xf9,0x56,0xf9,0xfa,0x56,0xf9,
+       0xf9,0xfa,0xf9,0xf9,0xf9,0x56,0x56,0x56,0x56,0xfa,0xf9,0x56,0xf9,0xf9,0xf9,0x56,
+       0xf9,0x56,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0x56,0xfa,0xf9,0xfa,0xf9,
+       0x56,0xf9,0xf9,0x56,0x56,0x56,0xf9,0x56,0xf9,0x56,0xf9,0xfc,0xff,0xff,0xab,0xfc,
+       0xab,0xab,0xfb,0xfb,0xfb,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
+       0x80,0x80,0x80,0xff,0x2b,0x56,0x56,0xf9,0x56,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xf9,
+       0x56,0x56,0x56,0xf9,0x56,0x56,0x56,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xfa,0xf9,
+       0x56,0xf9,0xf9,0xf9,0xfa,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,
+       0x56,0xf9,0x56,0xfa,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,
+       0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xfa,0x81,0xf9,0xfa,0xfa,0xfa,0xf9,0xf9,0xf9,0xf9,
+       0xf9,0xf9,0x56,0x56,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xfa,0xf9,0x56,0xf9,0x56,0xf9,
+       0xf9,0xf9,0x56,0xfa,0xfa,0xfa,0xfa,0xf9,0xf9,0xfa,0xfa,0xfa,0xf9,0xfa,0xfa,0xfa,
+       0xfa,0xf9,0xf9,0xfa,0xf9,0xfa,0xfa,0xf9,0xfa,0xfa,0xf9,0xf9,0xfa,0xf9,0xfa,0xfa,
+       0xf9,0xfa,0xf9,0xf9,0xfa,0xfa,0xf9,0xfa,0xf9,0xfa,0xf9,0xf9,0xf9,0x56,0xf9,0x56,
+       0x56,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0xfa,0x56,0x56,0x56,0x56,0xf9,0x56,0x56,
+       0x56,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xfa,0xf9,0x56,0xf9,0x56,0x56,0xf9,0x56,
+       0x56,0xf9,0xf9,0xf9,0xfa,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0x56,
+       0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xf9,0x56,0xfa,0x56,0xf9,0xf9,
+       0x56,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xf9,0x56,0xf9,0x56,
+       0xfa,0x56,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xf9,0x56,0x56,0x56,0xf9,0x56,0xf9,0xf9,
+       0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xfa,
+       0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xf9,
+       0xf9,0xf9,0x56,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xf9,0xf9,0xf9,
+       0x56,0xf9,0x56,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0xfa,0x56,0x56,
+       0x56,0x56,0xf9,0x56,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0x56,
+       0xf9,0x56,0x56,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xfa,0x56,0x56,0xfc,0xff,0xff,0xfc,
+       0xfc,0xab,0xfb,0xfb,0xaa,0xfb,0xaa,0xfb,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
+       0x80,0x80,0x80,0x80,0xff,0x2b,0x56,0x56,0x56,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,
+       0x56,0x56,0xf9,0xf9,0xfa,0x56,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0x56,
+       0x56,0x56,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,
+       0x56,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xf9,0x56,0x56,0xf9,0x56,0x56,0x56,0xf9,0x56,
+       0x56,0xf9,0x56,0xf9,0xf9,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,
+       0xfa,0xf9,0xf9,0x56,0xf9,0x56,0x56,0x56,0x56,0xf9,0x56,0x56,0x56,0x56,0x56,0x56,
+       0xf9,0xfa,0xf9,0x56,0xfa,0xfa,0xfa,0xfa,0xf9,0xfa,0xfa,0xf9,0xf9,0xfa,0xfa,0xfa,
+       0xfa,0xf9,0xfa,0xfa,0xfa,0xfa,0xf9,0xf9,0xfa,0xfa,0xf9,0xf9,0xf9,0xfa,0xf9,0xfa,
+       0xf9,0xf9,0xfa,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,
+       0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0x56,0x56,0xf9,0xf9,0xf9,0xf9,
+       0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0x56,0x56,0x56,0x56,0x56,0xf9,0xfa,
+       0xf9,0x56,0xfa,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0x56,
+       0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0x56,
+       0xf9,0xf9,0x56,0xf9,0x56,0x56,0x56,0x56,0xf9,0x56,0x56,0x56,0x56,0x56,0xfa,0xf9,
+       0xf9,0x56,0xf9,0xf9,0x56,0x56,0x56,0xf9,0xf9,0xfa,0x56,0xf9,0x56,0xf9,0xf9,0x56,
+       0x56,0xf9,0x56,0xf9,0x56,0x56,0x56,0x56,0x56,0xf9,0xf9,0xf9,0x56,0xfa,0xf9,0x56,
+       0xf9,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0x56,
+       0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0x56,
+       0x56,0x56,0xf9,0x56,0x56,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0x56,
+       0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0x56,
+       0x56,0x56,0x56,0xf9,0xfa,0xf9,0x56,0xfa,0xf9,0x56,0xf9,0xf9,0x56,0xfc,0xff,0xff,
+       0xab,0xab,0xab,0xfb,0xaa,0x80,0xfb,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
+       0x80,0x80,0x80,0x80,0x80,0xff,0xf6,0xf9,0xfa,0xfa,0xf9,0xf9,0x56,0x56,0xf9,0x56,
+       0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0x56,0x56,0xfa,0xf9,0xf9,0x56,0x56,0x56,0x56,0x56,
+       0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xfa,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,
+       0x56,0x56,0xf9,0xfa,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xfa,0x56,0xf9,0xf9,
+       0xf9,0x56,0xf9,0xf9,0xfa,0xfa,0xfa,0xfa,0xf9,0xfa,0xfa,0xf9,0xfa,0xf9,0xfa,0xfa,
+       0xfa,0xfa,0xf9,0x56,0xf9,0x56,0x56,0x56,0x56,0x56,0x56,0x56,0xf9,0xf9,0xf9,0xf9,
+       0xf9,0xf9,0xf9,0xf9,0x56,0xfa,0x56,0xf9,0xfa,0xfa,0xfa,0xf9,0xf9,0xf9,0xfa,0xfa,
+       0xf9,0xf9,0xf9,0xfa,0xfa,0xf9,0xf9,0xfa,0xf9,0xfa,0xfa,0xf9,0xf9,0xfa,0xfa,0xf9,
+       0xf9,0xfa,0xf9,0xfa,0xfa,0xf9,0xf9,0xfa,0xf9,0xfa,0xfa,0xfa,0xfa,0x81,0xf9,0x56,
+       0xf9,0xf9,0xfa,0xf9,0xfa,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,
+       0xf9,0x56,0xf9,0xf9,0x56,0x56,0x56,0x56,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,
+       0xf9,0x56,0x56,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xf9,0x56,0x56,0xfa,0xf9,0x56,0x56,
+       0x56,0xfa,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xfa,0x56,0xf9,0x56,
+       0x56,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xfa,0xfa,0xf9,
+       0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0x56,0x56,0xfa,0xf9,0xf9,
+       0x56,0x56,0x56,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xfa,0x56,
+       0xf9,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xfa,0xf9,0x56,0x56,0x56,0xfa,0xf9,0x56,0xf9,
+       0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xfa,0x56,0x56,0xf9,
+       0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xfa,0xf9,0xfa,0xf9,0x56,0xf9,0xf9,0x56,0xf9,
+       0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,0x56,0x56,0x56,0x56,0x56,
+       0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0x56,0x56,0xfa,0x56,0xf9,0xf9,0x56,0xf9,0xfc,0xff,
+       0xff,0xfc,0xab,0xfb,0xab,0xfb,0xfb,0xaa,0x80,0xfb,0x80,0x80,0x80,0x80,0x80,0x80,
+       0x80,0x80,0x80,0x80,0x80,0x80,0xff,0x2b,0xfa,0xf9,0x56,0xf9,0x56,0x56,0xf9,0xfa,
+       0x56,0x56,0x56,0xf9,0xf9,0x56,0x56,0x56,0xf9,0x56,0x56,0x56,0x56,0xf9,0x56,0xf9,
+       0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xfa,0xf9,0x56,0x56,0x56,0xf9,0xf9,0x56,
+       0x56,0x56,0x56,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xfa,0xf9,0xf9,0xf9,
+       0xf9,0x56,0x56,0xfa,0xfa,0xfa,0xf9,0xf9,0xfa,0xfa,0xfa,0x81,0xf9,0xf9,0xfa,0xfa,
+       0xfa,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0x56,0x56,0x56,0xf9,0x56,0x56,0xf9,0xf9,0xf9,
+       0xf9,0x56,0x56,0xf9,0x56,0x56,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0xfa,0xfa,
+       0xfa,0xf9,0xf9,0xfa,0xfa,0xf9,0xf9,0xfa,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0xfa,0xfa,
+       0xf9,0xfa,0xf9,0xf9,0xfa,0xf9,0xf9,0xfa,0x81,0xf9,0xfa,0xfa,0xf9,0xfa,0xfa,0xf9,
+       0xf9,0xfa,0xfa,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xfa,0x56,0x56,0x56,0xfa,0xf9,0x56,
+       0x56,0x56,0xf9,0x56,0x56,0xf9,0x56,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,
+       0x56,0xf9,0xf9,0x56,0xfa,0xf9,0x56,0xf9,0x56,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0x56,
+       0xf9,0xfa,0xf9,0x56,0x56,0x56,0xf9,0xf9,0x56,0x56,0x56,0x56,0xfa,0xf9,0x56,0xf9,
+       0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xfa,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xfa,0xf9,0x56,
+       0xf9,0x56,0x56,0x56,0xfa,0x56,0x56,0x56,0xfa,0xf9,0x56,0x56,0x56,0xf9,0x56,0x56,
+       0x56,0x56,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0x56,0xf9,
+       0xf9,0x56,0x56,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,
+       0x56,0xf9,0xf9,0x56,0x56,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,
+       0xf9,0xfa,0x56,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0x56,0x56,0xfa,0x56,
+       0x56,0x56,0xfa,0xf9,0x56,0x56,0x56,0xf9,0x56,0x56,0xf9,0x56,0xf9,0x56,0xf9,0x56,
+       0xfa,0xf9,0xf9,0x56,0x56,0x56,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0xfc,
+       0xff,0xff,0xac,0xab,0xab,0xfb,0xaa,0xfb,0x80,0xfb,0x80,0x80,0x80,0x80,0x80,0x80,
+       0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xff,0x2b,0x56,0x56,0x56,0x56,0xf9,0x56,0x56,
+       0xf9,0x56,0xf9,0xfa,0xf9,0x56,0x56,0xf9,0xf9,0xfa,0x56,0xf9,0xf9,0xfa,0xf9,0xfa,
+       0xf9,0xf9,0xfa,0xf9,0x56,0x56,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xfa,0xf9,0x56,
+       0x56,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0x56,
+       0xf9,0x56,0x56,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0xfa,0xfa,0xf9,0xf9,0xfa,
+       0xfa,0xf9,0x56,0xf9,0xf9,0xfa,0x56,0x56,0xf9,0xf9,0xfa,0xf9,0xfa,0xf9,0xfa,0x56,
+       0x56,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0x81,
+       0xfa,0xf9,0xfa,0xfa,0xfa,0xf9,0xf9,0xfa,0xfa,0xfa,0xf9,0xf9,0xf9,0xfa,0xf9,0xfa,
+       0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xfa,0xfa,0xf9,0xfa,0xf9,0xfa,0xf9,0xfa,0xf9,0xf9,
+       0xfa,0xfa,0xfa,0x56,0xf9,0x56,0x56,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xfa,0x56,
+       0x56,0xf9,0xf9,0xf9,0x56,0x56,0xfa,0xf9,0xfa,0xf9,0xfa,0xf9,0xfa,0xf9,0x56,0xf9,
+       0xf9,0x56,0xf9,0x56,0x56,0x56,0xf9,0x56,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0x56,
+       0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xfa,0xf9,0x56,0x56,0x56,0xf9,0xf9,0x56,0x56,0x56,
+       0x56,0x56,0x56,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0x56,
+       0x56,0x56,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0x56,
+       0xf9,0xf9,0xfa,0xf9,0xfa,0xf9,0xf9,0xfa,0x56,0x56,0x56,0xf9,0x56,0xf9,0xf9,0x56,
+       0xf9,0xf9,0xf9,0x56,0x56,0x56,0xf9,0x56,0xfa,0xf9,0x56,0xf9,0xf9,0xfa,0x56,0x56,
+       0xfa,0xf9,0xf9,0x56,0x56,0x56,0xf9,0x56,0xf9,0x56,0x56,0x56,0x56,0x56,0xf9,0xf9,
+       0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xfa,0x56,0x56,0x56,0x56,0x56,0x56,0xf9,0xf9,
+       0x56,0xf9,0xf9,0xfa,0x56,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xfa,0xf9,0xfa,0xf9,0xfa,
+       0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0x56,0x56,
+       0xfc,0xff,0xff,0xfc,0xab,0xfb,0xab,0xfb,0xaa,0xfb,0x80,0xfb,0x80,0x80,0x80,0x80,
+       0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xff,0x2b,0x56,0x56,0x56,0xf9,0x56,0x56,
+       0xf9,0xfa,0x56,0x56,0xf9,0xf9,0x56,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0x56,0xf9,
+       0x56,0xf9,0x56,0xf9,0x56,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0x56,0x56,
+       0xf9,0xf9,0xfa,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xf9,0xfa,0xf9,0xf9,0x56,0xf9,0x56,
+       0xf9,0x56,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xfa,0xfa,0xfa,0x81,0xf9,0xf9,
+       0xfa,0xf9,0xf9,0xfa,0xfa,0xfa,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xf9,
+       0xf9,0x56,0xf9,0xf9,0xf9,0xfa,0x56,0x56,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xfa,0xfa,
+       0xf9,0xf9,0xfa,0xf9,0xf9,0xfa,0xf9,0xf9,0xfa,0xfa,0xf9,0xfa,0xf9,0xfa,0xfa,0xfa,
+       0xf9,0xf9,0xf9,0xfa,0xf9,0xfa,0xfa,0xfa,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,
+       0xf9,0xf9,0xfa,0xfa,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xfa,0x56,0x56,0xf9,0x56,
+       0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xf9,0x56,0x56,
+       0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0x56,0x56,
+       0xf9,0x56,0xf9,0xf9,0x56,0x56,0xf9,0x56,0x56,0xf9,0xf9,0xfa,0xf9,0x56,0xf9,0xf9,
+       0x56,0xf9,0x56,0xfa,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0x56,0x56,0x56,0xf9,0xf9,0x56,
+       0x56,0x56,0xf9,0x56,0x56,0x56,0xfa,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,
+       0xf9,0xf9,0xfa,0x56,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xfa,0x56,
+       0x56,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0x56,
+       0x56,0xf9,0xf9,0x56,0xf9,0x56,0xfa,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0x56,0xfa,0xf9,
+       0xfa,0x56,0x56,0xf9,0x56,0x56,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0x56,0x56,
+       0xfa,0x56,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0x56,0xf9,
+       0x56,0x56,0xfa,0x56,0x56,0xf9,0xf9,0xf9,0xfa,0x56,0x56,0x56,0xf9,0xf9,0x56,0x56,
+       0xf9,0xfc,0xff,0xff,0xab,0xfc,0xab,0xab,0xfb,0xfb,0xfb,0x80,0xaa,0x80,0x80,0x80,
+       0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xff,0x2b,0x56,0xf9,0xfa,0xf9,0xfa,
+       0xf9,0xf9,0xf9,0x56,0x56,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,
+       0x56,0x56,0x56,0x56,0xf9,0x56,0x56,0xf9,0x56,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,
+       0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0xfa,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0x56,
+       0xf9,0x56,0x56,0x56,0xf9,0xfa,0xf9,0xf9,0xfa,0xfa,0x81,0x81,0xfa,0xfa,0xfa,0xf9,
+       0xf9,0xfa,0xf9,0xfa,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0x56,0x56,0x56,0x56,0x56,0x56,
+       0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xfa,0xfa,
+       0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0xfa,0xfa,0xfa,
+       0xf9,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xf9,0xf9,0xfa,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,
+       0xf9,0xf9,0xfa,0xfa,0xfa,0xf9,0xfa,0xfa,0xf9,0xfa,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,
+       0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0x56,0x56,0x56,0xf9,0x56,
+       0x56,0xf9,0xfa,0x56,0xf9,0xf9,0x56,0x56,0xf9,0x56,0x56,0x56,0xfa,0xf9,0x56,0x56,
+       0x56,0x56,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,
+       0x56,0xfa,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xf9,0xfa,0xf9,
+       0x56,0xf9,0xfa,0xfa,0xf9,0xfa,0xf9,0xf9,0x56,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0x56,
+       0xf9,0xf9,0xf9,0x56,0xf9,0x56,0x56,0x56,0x56,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,
+       0xf9,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0x56,0x56,0x56,0x56,0x56,0x56,0xf9,
+       0xf9,0x56,0xf9,0xf9,0x56,0x56,0xfa,0xf9,0xf9,0x56,0xf9,0x56,0xfa,0xf9,0xf9,0xf9,
+       0x56,0x56,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xfa,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,
+       0xf9,0xfa,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,
+       0x56,0x56,0x56,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,
+       0xf9,0xf9,0xfc,0xff,0xff,0xfc,0xab,0xab,0xfb,0xfb,0xaa,0x80,0xfb,0x80,0x80,0x80,
+       0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xff,0x2b,0x56,0xf9,0x56,0x56,
+       0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0x56,0x56,0xf9,0x56,0x56,0xf9,0x56,
+       0xf9,0x56,0x56,0xfa,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0x56,0xfa,0x56,0x56,0xf9,
+       0xf9,0x56,0x56,0xfa,0x56,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,
+       0xf9,0x56,0x56,0xf9,0xfa,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0xfa,0xfa,0xfa,0xfa,0xfa,
+       0xfa,0xfa,0xfa,0xfa,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0x56,0x56,0xf9,0x56,0x56,0xfa,
+       0xf9,0xf9,0x56,0xf9,0xfa,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,
+       0x56,0x56,0xfa,0xfa,0xfa,0xfa,0xf9,0xfa,0xfa,0xf9,0xfa,0xfa,0xf9,0xf9,0x81,0xf9,
+       0xf9,0xfa,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xfa,0xf9,0xf9,0xf9,0xf9,0xfa,
+       0xf9,0xfa,0xfa,0xfa,0xfa,0xfa,0xf9,0xfa,0xfa,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,
+       0xf9,0xfa,0xf9,0x56,0x56,0xf9,0x56,0xf9,0x56,0x56,0xf9,0x56,0x56,0xfa,0xf9,0xf9,
+       0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,
+       0xf9,0xf9,0xf9,0xf9,0x56,0xfa,0x56,0x56,0xf9,0xf9,0x56,0x56,0xfa,0x56,0x56,0xf9,
+       0xf9,0xf9,0x56,0x56,0x56,0xf9,0x56,0xfa,0xf9,0x56,0x56,0x56,0xf9,0xfa,0xf9,0xf9,
+       0xf9,0x56,0xf9,0x56,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0x56,0x56,
+       0xf9,0xf9,0x56,0xf9,0x56,0xf9,0x56,0x56,0xfa,0xf9,0xf9,0x56,0xf9,0xfa,0x56,0x56,
+       0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0x56,0xfa,0x56,0x56,0xf9,0xf9,0xf9,0x56,0xf9,
+       0xf9,0x56,0x56,0x56,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0x56,
+       0xf9,0x56,0xf9,0xf9,0x56,0x56,0x56,0xf9,0xfa,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,
+       0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0x56,0x56,0xf9,0x56,0xf9,0x56,0x56,0xf9,
+       0x56,0x56,0xfa,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,
+       0xf9,0x56,0xfa,0xfc,0xff,0xff,0xab,0xfc,0xab,0xab,0xfb,0xfb,0xaa,0x80,0xfb,0x80,
+       0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xff,0xf6,0x56,0xf9,0xf9,
+       0x56,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xfa,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xfa,
+       0xf9,0x56,0x56,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0x56,0x56,
+       0x56,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xfa,0xf9,0xfa,
+       0x56,0xf9,0xf9,0x56,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xfa,0xfa,
+       0xfa,0xf9,0xf9,0xfa,0xf9,0xf9,0xfa,0xf9,0xfa,0x56,0x56,0xf9,0xf9,0x56,0x56,0xf9,
+       0x56,0xf9,0xf9,0xf9,0xf9,0xfa,0x56,0x56,0x56,0xf9,0x56,0xf9,0x56,0x56,0xf9,0xf9,
+       0xf9,0x56,0xf9,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,
+       0xf9,0xf9,0xfa,0xf9,0xf9,0xfa,0xf9,0xfa,0xfa,0xfa,0xfa,0xfa,0xf9,0xfa,0xf9,0xfa,
+       0xf9,0xf9,0xf9,0xfa,0xf9,0xfa,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,
+       0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xf9,0xf9,
+       0xf9,0xf9,0xfa,0xfa,0x56,0x56,0xf9,0x56,0x56,0xf9,0x56,0xf9,0x56,0xf9,0x56,0x56,
+       0xf9,0xf9,0xfa,0x56,0xf9,0xf9,0xfa,0x56,0x56,0x56,0xf9,0x56,0xf9,0xf9,0x56,0x56,
+       0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0x56,0xf9,0xf9,0x56,0x56,0xf9,0x56,
+       0xf9,0x56,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xfa,0x56,0xf9,0xf9,
+       0xf9,0xf9,0xf9,0x56,0xfa,0xf9,0x56,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xfa,0x56,
+       0x56,0x56,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xf9,0xfa,0xf9,0xf9,
+       0xf9,0xfa,0xf9,0x56,0xf9,0x56,0x56,0xf9,0xfa,0x56,0x56,0xf9,0xf9,0x56,0xf9,0x56,
+       0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xf9,0x56,0x56,0x56,0xf9,0x56,
+       0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,
+       0x56,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0x56,0x56,0xf9,0x56,0x56,0x56,0x56,
+       0xf9,0xf9,0x56,0x56,0xfb,0xff,0xff,0xfc,0xfc,0xab,0xfb,0xaa,0x80,0xfb,0xfb,0x80,
+       0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xff,0x2b,0x56,0xf9,
+       0xf9,0xf9,0xf9,0xf9,0x56,0x56,0x56,0x56,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xfa,
+       0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0x56,
+       0x56,0xf9,0x56,0xf9,0xf9,0xfa,0x56,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,
+       0x56,0xf9,0x56,0x56,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xfa,0xfa,0xfa,0xfa,0xfa,
+       0xfa,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,
+       0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xf9,0xf9,
+       0x56,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0xfa,0xfa,0xfa,0xf9,0xf9,0xf9,0xfa,0xf9,0x81,
+       0xfa,0xf9,0xf9,0xf9,0xfa,0xfa,0xf9,0xfa,0xf9,0x81,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,
+       0xf9,0xfa,0xf9,0xfa,0xf9,0xf9,0xfa,0xf9,0xf9,0xfa,0x81,0xf9,0xfa,0xfa,0xf9,0x56,
+       0x56,0x56,0xfa,0x56,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0xfa,0x56,0xf9,0xf9,0xf9,0x56,
+       0x56,0xf9,0xf9,0x56,0x56,0x56,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,
+       0xfa,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0x56,0xf9,0xf9,0xfa,0x56,
+       0x56,0xf9,0xf9,0x56,0x56,0xf9,0x56,0xfa,0xf9,0x56,0xf9,0x56,0x56,0x56,0x56,0xf9,
+       0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0x56,0x56,0xf9,0x56,0xf9,
+       0x56,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,
+       0x56,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xf9,0xfa,0x56,0xf9,0xf9,0xfa,0xf9,0xf9,0x56,
+       0xf9,0xf9,0x56,0x56,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0x56,0xf9,
+       0xf9,0x56,0xfa,0x56,0xf9,0x56,0x56,0x56,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,
+       0xf9,0xf9,0xf9,0x56,0x56,0x56,0x56,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0x56,0xf9,0xfa,
+       0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0x56,0xf9,0x56,0x56,0x56,0xf9,0xf9,0xf9,0x56,
+       0x56,0xf9,0xf9,0xf9,0xf9,0xfc,0xff,0xff,0xab,0xab,0xfb,0xab,0xfb,0xab,0x80,0xaa,
+       0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xff,0xf6,0x56,
+       0xf9,0xf9,0x56,0xfa,0xf9,0x56,0x56,0xf9,0xf9,0xfa,0xf9,0x56,0xf9,0x56,0xf9,0x56,
+       0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0x56,0x56,0x56,0x56,0x56,
+       0x56,0x56,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0x56,0x56,0xf9,0xf9,
+       0x56,0xf9,0x56,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xfa,0xf9,0x81,
+       0x81,0xf9,0xf9,0xf9,0xfa,0xfa,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0x56,0x56,0xf9,
+       0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xfa,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,
+       0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xfa,0xfa,
+       0xfa,0xfa,0xf9,0x81,0xfa,0xfa,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,
+       0xf9,0xfa,0xfa,0xf9,0xfa,0xf9,0xfa,0xfa,0xf9,0xf9,0xfa,0xfa,0xf9,0x81,0xfa,0xf9,
+       0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xf9,0xfa,0xf9,0x56,0x56,0xfa,0xf9,
+       0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xfa,0xfa,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0x56,
+       0x56,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0x56,0x56,0x56,0x56,0xf9,0xfa,0xf9,0xf9,0xf9,
+       0xf9,0xf9,0xfa,0xf9,0xf9,0x56,0x56,0xf9,0x56,0x56,0xf9,0x56,0x56,0xf9,0x56,0xfa,
+       0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xfa,0xf9,0x56,0x56,0xf9,0xf9,0xfa,0xf9,
+       0x56,0xf9,0x56,0x56,0x56,0xfa,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,
+       0x56,0x56,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0x56,
+       0x56,0x56,0x56,0x56,0x56,0x56,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,
+       0x56,0x56,0xf9,0x56,0x56,0xf9,0x56,0x56,0x56,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xfa,
+       0xf9,0x56,0xf9,0xfa,0x56,0x56,0xf9,0xf9,0xfa,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xfa,
+       0xf9,0x56,0x56,0xfa,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xfa,0xf9,0xf9,
+       0x56,0xf9,0xf9,0xf9,0x56,0x56,0xfc,0xff,0xff,0xfc,0xab,0xab,0xfb,0xfb,0x80,0xfb,
+       0x80,0xfb,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xff,0x2b,
+       0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xf9,
+       0xfa,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,
+       0x56,0xf9,0xfa,0xf9,0x56,0x56,0x56,0xf9,0x56,0xf9,0x56,0x56,0x56,0xf9,0xf9,0xf9,
+       0xf9,0x56,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xfa,0xf9,0xf9,0xfa,0xfa,0xfa,
+       0x81,0xf9,0xf9,0xfa,0xfa,0xfa,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0x56,
+       0xf9,0xfa,0x56,0xf9,0x56,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xfa,
+       0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xfa,0xfa,0xfa,0xfa,0x81,0xf9,
+       0xf9,0xf9,0xfa,0xf9,0xfa,0xf9,0xf9,0xf9,0xfa,0xfa,0xfa,0xf9,0xfa,0xf9,0xf9,0xf9,
+       0xfa,0xfa,0xfa,0xf9,0xfa,0xfa,0xf9,0xf9,0xfa,0xfa,0xf9,0xfa,0xfa,0xf9,0xfa,0xfa,
+       0xf9,0xfa,0xfa,0xf9,0xfa,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xfa,
+       0x56,0xf9,0x56,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0x56,0x56,0x56,0xf9,0xfa,0xf9,0xf9,
+       0xf9,0xf9,0x56,0x56,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xfa,0xf9,0x56,0x56,0x56,
+       0xf9,0x56,0xf9,0x56,0x56,0x56,0xf9,0xf9,0xfa,0xf9,0x56,0x56,0x56,0xf9,0x56,0xf9,
+       0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,
+       0x56,0xf9,0x56,0x56,0xf9,0xfa,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0x56,
+       0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,
+       0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0x56,0x56,0x56,0xf9,0x56,0xf9,0x56,0x56,
+       0x56,0xf9,0xf9,0xfa,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,
+       0xf9,0x56,0x56,0xfa,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,0x56,0xf9,0xf9,
+       0x56,0x56,0xf9,0xf9,0xfa,0x56,0xf9,0x56,0xf9,0x56,0xf9,0x56,0xf9,0xfa,0x56,0x56,
+       0x56,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xfc,0xff,0xff,0xac,0xfc,0xab,0xab,0xfb,0xaa,
+       0xfb,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xff,
+       0xf6,0xf9,0xf9,0x56,0x56,0xfa,0x56,0x56,0xf9,0x56,0x56,0xfa,0x56,0x56,0xf9,0xf9,
+       0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0x56,0x56,0xf9,0x56,0x56,0x56,0x56,0xf9,0xf9,
+       0xf9,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0x56,0x56,0x56,0xf9,0xf9,0xf9,
+       0x56,0x56,0xf9,0xfa,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0xfa,0xf9,
+       0xf9,0x81,0xf9,0xf9,0xfa,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,
+       0xf9,0x56,0xf9,0x56,0x56,0x56,0x56,0xf9,0x56,0x56,0xf9,0x56,0x56,0x56,0xfa,0xf9,
+       0x56,0x56,0x56,0xf9,0x56,0xf9,0xf9,0xfa,0x56,0xf9,0xf9,0xf9,0xf9,0xfa,0xfa,0xf9,
+       0xf9,0xf9,0xfa,0xf9,0xfa,0xf9,0xf9,0xf9,0xfa,0xfa,0xfa,0xf9,0xf9,0xf9,0xfa,0xfa,
+       0xfa,0xfa,0xf9,0xfa,0xf9,0xf9,0xfa,0xfa,0xfa,0xfa,0xf9,0xfa,0xfa,0xf9,0xf9,0xfa,
+       0xf9,0xf9,0xfa,0xf9,0x56,0xfa,0x56,0x56,0xf9,0xf9,0xfa,0xf9,0x56,0x56,0xf9,0x56,
+       0xf9,0x56,0x56,0xf9,0x56,0xf9,0x56,0x56,0x56,0x56,0x56,0x56,0xfa,0xf9,0x56,0x56,
+       0xf9,0xf9,0x56,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xf9,
+       0xf9,0x56,0xf9,0x56,0xf9,0x56,0xf9,0xfa,0xf9,0x56,0x56,0xf9,0xfa,0xf9,0xfa,0xf9,
+       0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xfa,0x56,0x56,0xf9,0x56,0x56,
+       0xfa,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0x56,0x56,0xf9,0x56,
+       0xf9,0x56,0x56,0xf9,0x56,0x56,0x56,0xfa,0xfa,0x56,0x56,0x56,0xf9,0x56,0xf9,0xf9,
+       0xfa,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,
+       0x56,0xf9,0xfa,0xf9,0x56,0x56,0xf9,0xf9,0xfa,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,
+       0x56,0xfa,0x56,0x56,0xf9,0x56,0x56,0xf9,0x56,0x56,0xfa,0x56,0x56,0xf9,0xf9,0xfa,
+       0xf9,0x56,0x56,0xf9,0x56,0xf9,0x56,0x56,0xf9,0x56,0xf9,0x56,0x56,0x56,0x56,0x56,
+       0x56,0xfa,0xf9,0x56,0x56,0x56,0xf9,0x56,0xfc,0xff,0xff,0xab,0xab,0xfb,0xaa,0xfb,
+       0xfb,0xfb,0xaa,0xfb,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
+       0xff,0x2b,0x56,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,
+       0x56,0xf9,0x56,0xf9,0x56,0xf9,0x56,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,
+       0x56,0x56,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,
+       0x56,0x56,0x56,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,
+       0xfa,0xfa,0x81,0xf9,0xfa,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,
+       0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,
+       0x56,0x56,0x56,0xf9,0xfa,0x56,0x56,0xfa,0x56,0xf9,0xf9,0x56,0x56,0x56,0xf9,0xfa,
+       0xf9,0xfa,0xfa,0xfa,0xfa,0xf9,0xfa,0xfa,0xf9,0xfa,0xfa,0xf9,0xf9,0xf9,0xfa,0xfa,
+       0xfa,0xf9,0xf9,0xf9,0xfa,0xfa,0xfa,0xfa,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0xfa,
+       0xfa,0xf9,0xfa,0xf9,0xfa,0xf9,0xfa,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xf9,0xf9,0xf9,
+       0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xfa,0xfa,0xf9,0xf9,0xf9,0x56,0x56,
+       0x56,0x56,0xfa,0xf9,0x56,0xf9,0xf9,0x56,0x56,0x56,0x56,0x56,0xf9,0xf9,0xf9,0x56,
+       0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0x56,0x56,0x56,0xf9,0xf9,0x56,
+       0x56,0x56,0xfa,0x56,0x56,0xf9,0x56,0x56,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xf9,0x56,
+       0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xf9,0xf9,
+       0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0x56,0x56,0xf9,0xfa,0xf9,0x56,
+       0xf9,0xf9,0xf9,0x56,0x56,0x56,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xf9,
+       0xf9,0x56,0xf9,0xf9,0x56,0x56,0x56,0x56,0xfa,0x56,0xf9,0x56,0x56,0xfa,0x56,0xf9,
+       0x56,0xf9,0xf9,0x56,0xf9,0xfa,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,
+       0x56,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xfa,
+       0xf9,0xf9,0xf9,0x56,0x56,0x56,0xf9,0xfa,0x56,0xfc,0xff,0xff,0xab,0xfc,0xab,0xfb,
+       0xab,0x80,0xaa,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
+       0x80,0xff,0x2b,0xf9,0xf9,0xf9,0xfa,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,
+       0x56,0xf9,0x56,0x56,0xf9,0xf9,0xfa,0x56,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,
+       0x56,0x56,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0x56,0x56,0x56,0xf9,0x56,0x56,0xf9,
+       0xf9,0x56,0xf9,0xfa,0xf9,0xf9,0x56,0x56,0x56,0xf9,0xf9,0xf9,0x56,0xfa,0xf9,0xfa,
+       0xfa,0xfa,0x81,0xfa,0xf9,0xfa,0xfa,0xfa,0xfa,0xfa,0xf9,0xf9,0xf9,0xf9,0x56,0xf8,
+       0xf9,0xf9,0xf9,0x56,0x56,0xf9,0x56,0xfa,0x56,0xf9,0xf9,0xfa,0xf9,0xf9,0x56,0xf9,
+       0xf9,0x56,0xfa,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0x56,0x56,0x56,0xf9,0xf9,
+       0xfa,0xf9,0xf9,0xfa,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0xfa,0xfa,0xf9,0xfa,0xfa,0xfa,
+       0xf9,0xf9,0xfa,0xf9,0xf9,0xfa,0xf9,0xf9,0xfa,0xfa,0xf9,0xfa,0xf9,0xfa,0xfa,0xfa,
+       0xfa,0xfa,0xf9,0xfa,0xfa,0xfa,0xfa,0xfa,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,
+       0xf9,0x56,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0x56,
+       0xfa,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0x56,0x56,0x56,0xf9,0xf9,0xf9,0x56,
+       0x56,0xf9,0x56,0x56,0x56,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xfa,0xf9,0xf9,0x56,
+       0xf9,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0x56,0xf9,0xf9,
+       0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xf9,
+       0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xfa,0xf9,0xf9,0xf9,0x56,
+       0x56,0xfa,0x56,0x56,0x56,0x56,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0x56,0xf9,0xf9,
+       0xf9,0x56,0x56,0xf9,0xf9,0x56,0xfa,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0x56,
+       0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,
+       0x56,0x56,0x56,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,
+       0xf9,0x56,0x56,0xf9,0x56,0xfa,0xf9,0xf9,0xf9,0xf9,0xfb,0xff,0xff,0xfc,0xab,0xab,
+       0xfb,0xfb,0xfb,0xfb,0x80,0xfb,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
+       0x80,0x80,0xff,0x2b,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0x56,0x56,0xf9,0xf9,0x56,
+       0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xfa,0x56,0xf9,0x56,
+       0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0x56,0x56,0xfa,0xf9,0xfa,0xf9,0xf9,0x56,0xf9,
+       0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0x56,0xfa,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xfa,
+       0xf9,0xfa,0xfa,0xfa,0xfa,0xf9,0xfa,0xf9,0xf9,0xfa,0xfa,0xf9,0xf9,0xf9,0x56,0x56,
+       0x56,0xf9,0x56,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xf9,0x56,
+       0xf9,0xf9,0x56,0xf9,0x56,0x56,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xfa,0xf9,
+       0xfa,0xf9,0xf9,0xf9,0x81,0xfa,0xfa,0xfa,0xfa,0xf9,0xf9,0xfa,0xfa,0xf9,0xfa,0xfa,
+       0xf9,0xf9,0xfa,0xfa,0xf9,0xf9,0xfa,0xfa,0xfa,0xfa,0xfa,0xf9,0xf9,0xfa,0xf9,0xfa,
+       0xfa,0xfa,0xf9,0xf9,0xfa,0xf9,0xf9,0xfa,0xfa,0xfa,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,
+       0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0xf9,
+       0x56,0xf9,0x56,0x56,0xf9,0x56,0x56,0xfa,0xf9,0x56,0xf9,0xf9,0xfa,0xf9,0xf9,0xfa,
+       0x56,0x56,0xfa,0xf9,0xfa,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,
+       0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,
+       0x56,0x56,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,
+       0xf9,0xfa,0x56,0xf9,0x56,0xf9,0x56,0x56,0x56,0xf9,0xf9,0x56,0x56,0x56,0x56,0xf9,
+       0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0x56,0x56,0xfa,0xf9,0xf9,
+       0xf9,0x56,0xf9,0x56,0xfa,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0x56,0xf9,
+       0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0x56,
+       0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,
+       0x56,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xf9,0x56,0xfc,0xff,0xff,0xac,0xfc,
+       0xab,0xab,0xfb,0xaa,0xfb,0x80,0x80,0xfb,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
+       0x80,0x80,0x80,0xff,0x2b,0xf9,0x56,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,
+       0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,
+       0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,
+       0xf9,0xf9,0x56,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,
+       0xfa,0xf9,0xfa,0xfa,0xfa,0xfa,0xf9,0xf9,0xf9,0xfa,0xfa,0xf9,0xf9,0xf9,0xf9,0x56,
+       0xf9,0xf9,0xf9,0x56,0x56,0x56,0x56,0xf9,0x56,0xfa,0x56,0xf9,0x56,0xf9,0x56,0xf9,
+       0x56,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xfa,0x56,0xf9,0xf9,0xf9,0x56,
+       0xf9,0xf9,0xf9,0x56,0xf9,0xfa,0xfa,0xfa,0xf9,0xfa,0xfa,0xfa,0xf9,0xf9,0xf9,0xf9,
+       0xfa,0xf9,0xfa,0xfa,0xfa,0xf9,0xf9,0xfa,0xfa,0xf9,0xfa,0xfa,0xf9,0xfa,0xfa,0xf9,
+       0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0xfa,0xfa,0xfa,0xfa,0xf9,0xfa,0x56,0xf9,0xfa,0xf9,
+       0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0x56,0x56,0x56,0xf9,0x56,
+       0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,
+       0x56,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xfa,0xf9,0xf9,0x56,0x56,0x56,0xf9,0xf9,
+       0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,0x56,0xf9,0xf9,0x56,
+       0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xfa,0xf9,0xf9,0x56,0x56,0x56,0xf9,
+       0xf9,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0x56,0xf9,0x56,0xfa,0xf9,0x56,0xf9,
+       0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,
+       0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,
+       0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0x56,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0x56,
+       0xf9,0x56,0x56,0xfa,0xf9,0xf9,0x56,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,
+       0x56,0x56,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xfc,0xff,0xff,0xab,
+       0xab,0xfb,0xaa,0xfb,0xfb,0x80,0xfb,0xaa,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
+       0x80,0x80,0x80,0x80,0xff,0x2b,0x56,0x56,0x56,0x56,0x56,0x56,0xf9,0xf9,0xf9,0xf9,
+       0x56,0x56,0xf9,0x56,0x56,0xf9,0x56,0xfa,0x56,0x56,0xf9,0x56,0x56,0x56,0xfa,0x56,
+       0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0x56,0x56,0x56,0x56,0xf9,
+       0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xfa,0x56,0xf9,0xfa,0xf9,0xf9,
+       0xf9,0xfa,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0xfa,0xfa,0xfa,0xf9,0xf9,0xf9,0xfa,0xf9,
+       0x56,0x56,0x56,0xf9,0x56,0x56,0xf9,0x56,0xf9,0x56,0xf9,0x56,0x56,0xf9,0xf9,0x56,
+       0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0x56,
+       0xf9,0xf9,0x56,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0xfa,0xf9,0xfa,
+       0xf9,0xfa,0xfa,0xf9,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xf9,0xf9,0xf9,0xfa,
+       0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xfa,0xf9,0xfa,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,
+       0x56,0xfa,0x56,0x56,0xf9,0x56,0xf9,0x56,0xfa,0x56,0x56,0xf9,0x56,0xf9,0xf9,0xf9,
+       0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xf9,0xf9,
+       0x56,0xf9,0x56,0xf9,0x56,0x56,0x56,0x56,0xf9,0x56,0x56,0x56,0xf9,0xf9,0xf9,0xf9,
+       0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0x56,0x56,0xf9,0xf9,0x56,0x56,0x56,0x56,
+       0x56,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0x56,0xf9,0x56,0x56,0xfa,0x56,0x56,0xf9,
+       0x56,0x56,0x56,0xfa,0x56,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,
+       0xf9,0xf9,0xf9,0xfa,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xf9,0x56,0xf9,0x56,0xf9,0x56,
+       0x56,0x56,0x56,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,
+       0xf9,0xfa,0x56,0x56,0xf9,0xf9,0x56,0x56,0x56,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0x56,
+       0x56,0xf9,0x56,0xf9,0x56,0x56,0xfa,0x56,0x56,0xf9,0x56,0xf9,0x56,0xfa,0x56,0x56,
+       0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xfc,0xff,0xff,
+       0xab,0xfc,0xab,0xab,0xfb,0xfb,0xaa,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
+       0x80,0x80,0x80,0x80,0x80,0xff,0x2b,0x56,0x56,0xfa,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,
+       0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0x56,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,
+       0x56,0x56,0x56,0x56,0x56,0x56,0xf9,0xfa,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,
+       0xf9,0x56,0x56,0xf9,0xfa,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,
+       0x56,0xf9,0xf9,0xf9,0xfa,0x81,0xfa,0xfa,0xfa,0xfa,0xfa,0xf9,0xfa,0xfa,0xf9,0xf9,
+       0x56,0x56,0x56,0x56,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0x56,0x56,0x56,0x56,
+       0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0x56,0x56,0x56,
+       0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0xfa,0xfa,0xfa,0xfa,0xf9,0xf9,0xfa,
+       0xfa,0xfa,0xf9,0xfa,0xfa,0xf9,0xfa,0xf9,0xf9,0xfa,0xf9,0xf9,0xfa,0xfa,0xf9,0xf9,
+       0xf9,0xf9,0xf9,0xfa,0xfa,0xf9,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xf9,
+       0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xfa,0x56,0x56,0x56,0x56,0xf9,0x56,
+       0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xf9,0x56,0x56,0xf9,
+       0xfa,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xfa,0xf9,0x56,
+       0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,0x56,0xf9,0x56,0x56,0xfa,0xf9,
+       0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xf9,0x56,0x56,0xf9,
+       0xf9,0xf9,0xf9,0xfa,0xf9,0x56,0x56,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0x56,
+       0xf9,0xf9,0xf9,0x56,0x56,0x56,0x56,0x56,0x56,0x56,0xf9,0xfa,0xf9,0x56,0xf9,0xf9,
+       0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,
+       0x56,0xf9,0xf9,0x56,0x56,0xf9,0x56,0x56,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,
+       0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0x56,
+       0x56,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xfc,0xff,
+       0xff,0xfc,0xab,0xfb,0xfb,0xaa,0xaa,0x81,0xfb,0x80,0xfb,0x80,0x80,0x80,0x80,0x80,
+       0x80,0x80,0x80,0x80,0x80,0x80,0xff,0xf6,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0x56,
+       0x56,0xf9,0x56,0x56,0x56,0xf9,0x56,0xf9,0xfa,0xf9,0x56,0x56,0xf9,0x56,0xf9,0xf9,
+       0x56,0x56,0xf9,0xfa,0xf9,0x56,0xfa,0xf9,0xf9,0x56,0x56,0xf9,0x56,0xf9,0xf9,0xf9,
+       0xf9,0xf9,0xf9,0x56,0xfa,0xf9,0xf9,0x56,0xf9,0xfa,0x56,0x56,0x56,0x56,0x56,0x56,
+       0x56,0xf9,0xf9,0xf9,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,
+       0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0x56,0xf9,0xfa,0x56,0x56,0xf9,0xfa,
+       0xf9,0x56,0x56,0xf9,0x56,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xf9,0xf9,
+       0xf9,0xf9,0xfa,0xf9,0x56,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xfa,0xfa,0xf9,0xfa,0xfa,
+       0xfa,0xfa,0xf9,0xfa,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,
+       0xfa,0xf9,0xfa,0xf9,0xfa,0xf9,0xfa,0xfa,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,
+       0xfa,0xfa,0xfa,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xfa,0x56,0x56,0xf9,0xf9,0xf9,0x56,
+       0x56,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xf9,0x56,0xf9,0xf9,
+       0xfa,0x56,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,
+       0x56,0xf9,0xfa,0x56,0x56,0x56,0x56,0x56,0x56,0x56,0x56,0xf9,0x56,0xf9,0x56,0xf9,
+       0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0x56,0x56,0x56,0xf9,0x56,0xfa,0xf9,0xf9,0x56,
+       0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xfa,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,
+       0x56,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0x56,0x56,0xf9,
+       0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xfa,0x56,0x56,
+       0x56,0x56,0x56,0x56,0x56,0xf9,0x56,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xfa,0x56,0x56,
+       0xf9,0x56,0x56,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xf9,0xfa,0x56,
+       0x56,0xfa,0xf9,0xf9,0x56,0x56,0xf9,0x56,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0xfb,
+       0xff,0xff,0xac,0xab,0xab,0xfb,0xfb,0xfb,0x80,0xaa,0x80,0x80,0x80,0x80,0x80,0x80,
+       0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xff,0x2b,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xf9,
+       0x56,0x56,0x56,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0x56,0xfa,0xfa,
+       0x56,0x56,0x56,0xfa,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0x56,0x56,0xfa,0xf9,0x56,0xf9,
+       0x56,0x56,0x56,0xf9,0x56,0xf9,0x56,0xf9,0x56,0xfa,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,
+       0xf9,0xf9,0xf9,0xfa,0xfa,0xfa,0xfa,0xfa,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,
+       0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0x56,0x56,0x56,0xfa,
+       0xf9,0xf9,0xf9,0x56,0xfa,0xf9,0x56,0x56,0x56,0x56,0xf9,0xf9,0x56,0x56,0xfa,0xf9,
+       0xf9,0xf9,0xf9,0x56,0x56,0x56,0x56,0xfa,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xfa,
+       0xfa,0xf9,0xf9,0xf9,0xfa,0xfa,0xf9,0xfa,0xfa,0xfa,0xfa,0xfa,0xf9,0xfa,0xfa,0xf9,
+       0xf9,0xfa,0xfa,0xfa,0xf9,0xfa,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0xfa,0xf9,0xf9,0xfa,
+       0xfa,0xfa,0xfa,0xfa,0xfa,0xf9,0xf9,0xf9,0xfa,0xf9,0x56,0x56,0x56,0xfa,0xf9,0xf9,
+       0xf9,0xf9,0xf9,0xf9,0x56,0x56,0x56,0x56,0xf9,0xf9,0x56,0x56,0xfa,0xf9,0xf9,0xf9,
+       0xf9,0x56,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xf9,0x56,0xf9,0x56,
+       0xf9,0x56,0xfa,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xfa,0xf9,0xf9,0xf9,
+       0xf9,0x56,0x56,0x56,0xf9,0x56,0x56,0x56,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,
+       0xf9,0xf9,0x56,0xfa,0xf9,0x56,0x56,0x56,0xfa,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,
+       0x56,0x56,0x56,0xf9,0xf9,0x56,0x56,0xfa,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0x56,0x56,
+       0xfa,0x56,0xf9,0x56,0xf9,0x56,0x56,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xfa,0xf9,0x56,
+       0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0x56,0x56,0x56,0x56,0xf9,0xf9,
+       0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xfa,0xf9,0xf9,0xf9,0xfa,0xf9,0x56,
+       0x56,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xfa,0xf9,0x56,0x56,0x56,0x56,0xf9,0xf9,0x56,
+       0xfc,0xff,0xff,0xab,0xfc,0xab,0xab,0xfb,0xaa,0xfb,0x81,0x80,0xfb,0x80,0x80,0x80,
+       0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xff,0x2b,0x56,0xf9,0xf9,0xfa,0xf9,0xf9,
+       0x56,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,
+       0x56,0x56,0xf9,0xf9,0x56,0x56,0x56,0x56,0xf9,0x56,0x56,0xf9,0xfa,0xf9,0x56,0x56,
+       0x56,0xf9,0x56,0x56,0xf9,0xf9,0x56,0x56,0xf9,0x56,0xf9,0x56,0x56,0xf9,0xf9,0xf9,
+       0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xfa,0xfa,0x81,0x81,0xfa,0xf9,0xf9,0xfa,0xf9,0xf9,
+       0xf9,0xf9,0xfa,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xfa,0x56,0x56,0x56,0xf9,
+       0x56,0x56,0x56,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,
+       0xf9,0xf9,0x56,0xf9,0x56,0x56,0xfa,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0x56,0xf9,0xfa,
+       0xfa,0xf9,0xfa,0xfa,0xf9,0xfa,0xf9,0xf9,0xfa,0xfa,0xf9,0xfa,0xf9,0xf9,0xfa,0xf9,
+       0xfa,0xf9,0xfa,0xfa,0xf9,0xfa,0xfa,0xfa,0xfa,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0xfa,
+       0xfa,0xfa,0xf9,0xf9,0xfa,0xfa,0xf9,0xf9,0xf9,0xfa,0xf9,0x56,0xf9,0x56,0xf9,0x56,
+       0xf9,0x56,0xf9,0xfa,0x56,0x56,0x56,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,
+       0x56,0xf9,0x56,0x56,0xfa,0xf9,0xf9,0x56,0x56,0x56,0xf9,0x56,0x56,0xf9,0xf9,0x56,
+       0xf9,0xf9,0x56,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0x56,
+       0xf9,0xf9,0xfa,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xfa,
+       0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,0x56,0x56,0xf9,0xfa,0x56,
+       0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xfa,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xf9,
+       0xfa,0xf9,0xf9,0x56,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0x56,0xf9,0x56,
+       0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0x56,0xf9,0xfa,0xfa,0xf9,0xf9,0x56,
+       0xf9,0x56,0x56,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,
+       0x56,0x56,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,
+       0x56,0xfc,0xff,0xff,0xfc,0xab,0xab,0xfb,0xaa,0xfb,0xfb,0x80,0xaa,0x80,0x80,0x80,
+       0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xff,0x2b,0xf9,0x56,0xf9,0x56,0xf9,
+       0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xfa,0xf9,0xf9,0x56,0x56,
+       0xf9,0x56,0x56,0xfa,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xfa,0xfa,0x56,0x56,0xf9,
+       0x56,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xf9,0x56,
+       0x56,0x56,0x56,0xfa,0xfa,0xf9,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xf9,
+       0xfa,0xfa,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0x56,0x56,0x56,0xfa,
+       0xf9,0xf9,0xf9,0x56,0x56,0xfa,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xfa,0x56,0x56,0xfa,
+       0x56,0xf9,0x56,0x56,0xf9,0x56,0xfa,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xf9,0x56,0x56,
+       0xf9,0xf9,0xf9,0xfa,0xfa,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,
+       0xf9,0xf9,0xfa,0xfa,0xf9,0xfa,0xf9,0xfa,0xf9,0xfa,0xfa,0xfa,0xfa,0xf9,0xfa,0xfa,
+       0xfa,0xf9,0xfa,0xf9,0xfa,0x81,0xfa,0xfa,0xf9,0x56,0xf9,0x56,0x56,0xfa,0xf9,0x56,
+       0xf9,0x56,0x56,0xf9,0xf9,0x56,0x56,0xfa,0xf9,0xf9,0xfa,0xf9,0x56,0xf9,0xf9,0x56,
+       0xf9,0x56,0xf9,0xf9,0xfa,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xf9,0x56,0xf9,0xf9,0xf9,
+       0x56,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0x56,0x56,0x56,0x56,0xf9,0xf9,0xf9,0xf9,
+       0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,
+       0xfa,0xf9,0xf9,0x56,0x56,0xf9,0x56,0x56,0xfa,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,
+       0x56,0x56,0xf9,0xf9,0xf9,0xfa,0x56,0x56,0xf9,0x56,0xf9,0x56,0x56,0xf9,0x56,0xfa,
+       0xfa,0x56,0x56,0xf9,0x56,0x56,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,
+       0x56,0x56,0xf9,0x56,0x56,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,
+       0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xfa,0xf9,0x56,0xf9,0x56,0xf9,
+       0x56,0x56,0xfa,0xf9,0x56,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xfa,
+       0x56,0x56,0xfc,0xff,0xff,0xac,0xab,0xfb,0xab,0xfb,0x80,0xaa,0x80,0x81,0x80,0x80,
+       0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xff,0xf6,0x56,0x56,0x56,0x56,
+       0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,
+       0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xfa,0x56,0xf9,0x56,
+       0xfa,0xf9,0x56,0xf9,0x56,0x56,0xf9,0x56,0x56,0xfa,0xf9,0xf9,0x56,0x56,0x56,0x56,
+       0xf9,0xf9,0xf9,0xf9,0xfa,0xfa,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,
+       0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xf9,0x56,0x56,0x56,0xfa,0xf9,0xf9,
+       0x56,0x56,0x56,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0x56,0x56,0x56,0x56,
+       0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xfa,0x56,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0x56,
+       0xf9,0xf9,0x56,0xf9,0xfa,0xfa,0xfa,0xf9,0xf9,0xf9,0xfa,0xf9,0xfa,0xfa,0xf9,0xfa,
+       0xfa,0xf9,0xfa,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0xfa,0xfa,0xf9,
+       0xf9,0xf9,0xf9,0xfa,0xfa,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0x56,
+       0xf9,0x56,0xf9,0x56,0xfa,0x56,0x56,0xf9,0xf9,0xf9,0x56,0x56,0x56,0x56,0xf9,0x56,
+       0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xfa,0x56,0xf9,0x56,0x56,0x56,0xf9,
+       0x56,0x56,0xf9,0xf9,0x56,0x56,0x56,0x56,0x56,0xf9,0xf9,0xf9,0x56,0xfa,0xf9,0x56,
+       0x56,0x56,0x56,0x56,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,0x56,0x56,0xf9,0xf9,
+       0x56,0x56,0xf9,0x56,0x56,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0x56,0xf9,0xf9,0xf9,
+       0x56,0x56,0xf9,0xfa,0xf9,0x56,0x56,0x56,0x56,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,
+       0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xfa,0xf9,0x56,
+       0x56,0x56,0x56,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0x56,0x56,0x56,0x56,0xf9,
+       0x56,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0x56,0x56,0x56,
+       0xf9,0xf9,0xf9,0x56,0x56,0xf9,0x56,0xf9,0x56,0xfa,0x56,0x56,0xf9,0xf9,0xf9,0x56,
+       0x56,0x56,0x56,0xfc,0xff,0xff,0xab,0xfc,0xab,0xfb,0xab,0xfb,0xfb,0x80,0x80,0xfb,
+       0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xff,0x2b,0xfa,0xf9,0xf9,
+       0xf9,0xfa,0x56,0x56,0x56,0x56,0x56,0x56,0x56,0xf9,0xf9,0xf9,0x56,0x56,0x56,0x56,
+       0x56,0xfa,0xf9,0xf9,0x56,0xfa,0xf9,0xfa,0xf9,0xf9,0x56,0x56,0xf9,0x56,0xf9,0x56,
+       0x56,0x56,0x56,0x56,0x56,0xfa,0xf9,0xf9,0xf9,0xfa,0xf9,0x56,0x56,0x56,0xf9,0xfa,
+       0xf9,0xfa,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0xfa,0x81,0x81,0xfa,0x81,0xfa,0xf9,0xf9,
+       0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,0x56,0x56,0x56,0x56,0xfa,0xf9,0xf9,
+       0x56,0xfa,0xf9,0xfa,0xf9,0xf9,0xf9,0xfa,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,
+       0xf9,0xf9,0xf9,0xfa,0x56,0x56,0x56,0xf9,0x56,0xf9,0x56,0x56,0xf9,0x56,0x56,0xf9,
+       0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xfa,0xfa,0xfa,0xfa,0xf9,0xfa,
+       0xfa,0xf9,0xfa,0xfa,0xf9,0xf9,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xf9,0xf9,0xf9,0xf9,
+       0xf9,0xf9,0xf9,0xfa,0xfa,0xf9,0xf9,0xfa,0xf9,0xf9,0xfa,0xfa,0xfa,0xf9,0x56,0xfa,
+       0xf9,0xfa,0xf9,0xf9,0xfa,0xf9,0x56,0xf9,0xfa,0xf9,0x56,0x56,0xf9,0x56,0xfa,0xf9,
+       0xf9,0xf9,0x56,0x56,0x56,0xf9,0x56,0xf9,0x56,0x56,0xf9,0x56,0x56,0xf9,0xfa,0xf9,
+       0x56,0xfa,0xf9,0xf9,0x56,0x56,0x56,0xf9,0xfa,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0x56,
+       0x56,0xf9,0xfa,0xf9,0xf9,0xfa,0xf9,0x56,0x56,0x56,0x56,0x56,0x56,0x56,0xf9,0xf9,
+       0xf9,0x56,0xf9,0x56,0x56,0x56,0xfa,0xf9,0xf9,0x56,0xfa,0xf9,0xfa,0xf9,0xf9,0xf9,
+       0xfa,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0x56,0x56,0x56,
+       0xf9,0xf9,0x56,0x56,0x56,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0x56,0xfa,0xf9,0xf9,0x56,
+       0x56,0x56,0xf9,0xf9,0xfa,0xf9,0xfa,0x56,0xf9,0x56,0x56,0xf9,0xf9,0xfa,0xf9,0xfa,
+       0xf9,0x56,0x56,0x56,0x56,0x56,0x56,0x56,0xf9,0xf9,0xf9,0x56,0x56,0x56,0x56,0xf9,
+       0xf9,0xfa,0x56,0x56,0xfa,0xf9,0xf9,0xfa,0xf9,0xf9,0xfa,0x56,0xf9,0xfa,0xf9,0x56,
+       0x56,0xf9,0xf9,0xf9,0xfc,0xff,0xff,0xab,0xfc,0xab,0xaa,0xfb,0xfb,0x80,0xab,0x80,
+       0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xff,0x2b,0xf9,0xf9,
+       0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,
+       0xf9,0xf9,0xfa,0x56,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,
+       0x56,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0x56,0x56,0x56,0x56,0xfa,0xf9,
+       0xf9,0x56,0x56,0xf9,0x56,0xf9,0xfa,0xf9,0xf9,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xf9,
+       0xfa,0xfa,0xf9,0xf9,0xfa,0xfa,0xf9,0x56,0xf9,0x56,0x56,0xf9,0x56,0xfa,0xf9,0xf9,
+       0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xfa,0xf9,0x56,0x56,0xf9,0xf9,
+       0xf9,0xf9,0x56,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0x56,0x56,0x56,0x56,0x56,0xf9,0x56,
+       0xf9,0xfa,0x56,0x56,0x56,0xf9,0x56,0x56,0xf9,0x81,0xfa,0xfa,0xf9,0xf9,0xfa,0xf9,
+       0xf9,0xfa,0xfa,0xf9,0xfa,0xf9,0xf9,0xf9,0xfa,0xfa,0xf9,0xfa,0xfa,0xf9,0xfa,0xf9,
+       0xf9,0xfa,0xfa,0xfa,0xf9,0xfa,0xfa,0xf9,0xf9,0xf9,0xfa,0xfa,0x81,0xfa,0xfa,0x56,
+       0xfa,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,
+       0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xf9,0x56,0xf9,0x56,0xf9,0xf9,
+       0x56,0x56,0xf9,0x56,0x56,0x56,0x56,0xfa,0xf9,0xf9,0x56,0x56,0xf9,0x56,0x56,0xfa,
+       0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xfa,0xf9,0xf9,
+       0xf9,0xf9,0x56,0xf9,0x56,0xf9,0xfa,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,
+       0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xf9,
+       0xf9,0x56,0x56,0x56,0x56,0xf9,0x56,0xf9,0x56,0xf9,0xfa,0x56,0x56,0x56,0x56,0x56,
+       0x56,0x56,0xf9,0xfa,0xf9,0x56,0x56,0x56,0xf9,0x56,0xf9,0x56,0x56,0xfa,0x56,0xf9,
+       0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,
+       0xf9,0xfa,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,
+       0x56,0xf9,0xf9,0xf9,0xf9,0xfc,0xff,0xff,0xfc,0xab,0xab,0xfb,0xfb,0xfb,0xaa,0x80,
+       0xfb,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xff,0x2b,0xf9,
+       0xf9,0x56,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0x56,0x56,0xf9,0x56,0x56,
+       0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0xf9,
+       0xf9,0x56,0xfa,0xf9,0xf9,0xf9,0xfa,0x56,0x56,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,
+       0xf9,0x56,0x56,0x56,0xf9,0xf9,0x56,0xfa,0xf9,0xf9,0xfa,0x81,0xfa,0xfa,0xf9,0xf9,
+       0xfa,0xf9,0xfa,0xfa,0xfa,0xfa,0xf9,0x56,0x56,0x56,0x56,0x56,0xf9,0xf9,0xf9,0xf9,
+       0x56,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0x56,0x56,0x56,0xfa,
+       0xf9,0x56,0xf9,0x56,0xfa,0x56,0x56,0xfa,0x56,0x56,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,
+       0xf9,0xfa,0x56,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xfa,0xf9,0xf9,0xf9,0xfa,
+       0xfa,0xf9,0xfa,0xf9,0xf9,0xfa,0xfa,0xf9,0xfa,0xfa,0xfa,0xf9,0xf9,0xf9,0xfa,0xf9,
+       0xfa,0x81,0xfa,0xfa,0xfa,0xf9,0xfa,0xf9,0xf9,0xf9,0xfa,0xf9,0xfa,0xf9,0xfa,0xf9,
+       0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xfa,0x56,0x56,0xf9,0xfa,0xf9,0x56,
+       0x56,0x56,0xfa,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xfa,0xfa,
+       0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xf9,0xf9,0x56,
+       0xf9,0xf9,0x56,0xf9,0xfa,0x56,0xf9,0x56,0x56,0xf9,0x56,0xf9,0xf9,0xfa,0xf9,0xf9,
+       0x56,0x56,0xf9,0x56,0x56,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0x56,0xf9,
+       0x56,0xf9,0x56,0xf9,0xfa,0x56,0x56,0x56,0xfa,0xf9,0x56,0xf9,0x56,0xfa,0x56,0x56,
+       0xfa,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0x56,0x56,0x56,0xf9,0xf9,
+       0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xf9,
+       0x56,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0x56,0x56,0xf9,0x56,0x56,0x56,
+       0xf9,0x56,0xf9,0xf9,0x56,0x56,0x56,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xfa,0x56,
+       0x56,0xf9,0xfa,0xf9,0x56,0xf9,0xfb,0xff,0xff,0xab,0xfc,0xab,0xfb,0xaa,0xaa,0x81,
+       0xfb,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xff,0xf6,
+       0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0x56,
+       0xf9,0x56,0x56,0xf9,0x56,0x56,0x56,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0x56,0x56,
+       0xfa,0x56,0xf9,0x56,0x56,0x56,0xf9,0x56,0x56,0xfa,0xf9,0xfa,0xfa,0xf9,0xf9,0x56,
+       0xf9,0xf9,0x56,0xf9,0xf9,0xfa,0x56,0xf9,0xf9,0xfa,0xf9,0xfa,0xfa,0xfa,0xf9,0xf9,
+       0xfa,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,0x56,0x56,0x56,
+       0x56,0x56,0x56,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,
+       0xf9,0x56,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xfa,0x56,0x56,0x56,0x56,
+       0x56,0xf9,0x56,0x56,0xfa,0xf9,0xfa,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xfa,
+       0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0xfa,0xfa,0xf9,0xf9,0xfa,0xfa,
+       0xf9,0xfa,0xf9,0xf9,0xfa,0xf9,0xf9,0xfa,0xfa,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,
+       0xf9,0xf9,0xfa,0xfa,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0x56,0x56,0xf9,0x56,0xf9,0x56,
+       0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xfa,0x56,0x56,0xf9,0x56,0x56,0xf9,
+       0x56,0x56,0xfa,0xf9,0xf9,0xfa,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xfa,0x56,
+       0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,
+       0x56,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xf9,0x56,0x56,0x56,0x56,0xf9,0xf9,0xf9,
+       0x56,0x56,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0x56,
+       0xf9,0xf9,0x56,0x56,0xfa,0x56,0x56,0xf9,0x56,0x56,0xf9,0x56,0x56,0xfa,0xf9,0xfa,
+       0xf9,0xfa,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,
+       0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0xf9,
+       0x56,0x56,0xf9,0x56,0x56,0x56,0x56,0xf9,0xfa,0xf9,0x56,0x56,0xf9,0x56,0x56,0x56,
+       0x56,0xf9,0x56,0xf9,0x56,0x56,0xf9,0xfc,0xff,0xff,0xab,0xab,0xab,0xfb,0xfb,0xfb,
+       0x80,0xaa,0x80,0xfb,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xff,
+       0xf6,0x56,0xf9,0x56,0xf9,0xfa,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0x56,0xf9,0x56,0xf9,
+       0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0xfa,0xf9,0x56,0x56,0x56,0xfa,0x56,
+       0xf9,0x56,0x56,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0x56,
+       0x56,0xfa,0xf9,0x56,0xf9,0xfa,0x56,0xf9,0xfa,0xfa,0xf9,0xfa,0xf9,0xfa,0xfa,0xf9,
+       0xfa,0xfa,0xfa,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xf9,0xf9,0xf9,0xf9,
+       0xf9,0xf9,0xf9,0x56,0xf9,0xfa,0xf9,0x56,0x56,0x56,0xfa,0xf9,0x56,0xf9,0x56,0xf9,
+       0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xfa,0x56,0xf9,0x56,0x56,0x56,0xf9,
+       0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0x56,0x56,0xfa,0xf9,0xf9,0xfa,
+       0x81,0xf9,0xf9,0xfa,0xfa,0xf9,0xfa,0xfa,0xfa,0xfa,0xf9,0xf9,0xf9,0xf9,0xfa,0xfa,
+       0xfa,0xf9,0xfa,0xf9,0xfa,0xf9,0xfa,0xf9,0xf9,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xf9,
+       0xfa,0xfa,0xfa,0xfa,0xfa,0x56,0x56,0x56,0xfa,0xf9,0xf9,0xf9,0x56,0xfa,0xf9,0xf9,
+       0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xfa,0x56,0xf9,0x56,0x56,0x56,0xf9,0xf9,0xf9,
+       0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0x56,0x56,0xfa,0xf9,0x56,0xf9,0xfa,0x56,
+       0x56,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0x56,0x56,0xf9,0xfa,0xf9,0x56,0x56,0xf9,0x56,
+       0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0xfa,0xf9,
+       0x56,0x56,0x56,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,
+       0x56,0xf9,0xfa,0x56,0xf9,0x56,0x56,0x56,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,
+       0x56,0xf9,0x56,0x56,0x56,0xfa,0xf9,0x56,0xf9,0xfa,0xf9,0x56,0xf9,0xf9,0xf9,0x56,
+       0x56,0xf9,0x56,0xf9,0xfa,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xf9,
+       0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xfa,0xf9,0xf9,
+       0xf9,0x56,0xf9,0xfa,0xf9,0xf9,0x56,0x56,0xfc,0xff,0xff,0xfc,0xfb,0xab,0xab,0xfb,
+       0xaa,0xfb,0xfb,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
+       0xff,0x2b,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0x56,0xf9,0x56,0xf9,0x56,0x56,0x56,
+       0x56,0x56,0x56,0xf9,0x56,0x56,0xf9,0xf9,0xfa,0xf9,0x56,0x56,0x56,0xf9,0xf9,0xf9,
+       0x56,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0xfa,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0x56,
+       0x56,0xfa,0xf9,0x56,0x56,0xf9,0x56,0xf9,0x56,0xfa,0xf9,0xf9,0xfa,0xfa,0xfa,0xfa,
+       0xfa,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0x56,0x56,0x56,0x56,0x56,
+       0xf9,0x56,0x56,0xf9,0xfa,0xf9,0x56,0x56,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0xf9,
+       0xf9,0xf9,0x56,0xfa,0x56,0x56,0xfa,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xfa,0xf9,
+       0xf9,0xf9,0xf9,0xf9,0x56,0xfa,0xf9,0x56,0x56,0xf9,0x56,0x56,0xf9,0xfa,0x56,0x56,
+       0xf9,0xfa,0xfa,0xf9,0xfa,0xf9,0xf9,0xfa,0xf9,0xf9,0xfa,0xf9,0xf9,0xfa,0xfa,0xf9,
+       0xf9,0xf9,0xfa,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,
+       0xfa,0xfa,0xfa,0xfa,0xfa,0xf9,0xfa,0xf9,0xf9,0xfa,0x56,0xf9,0x56,0xf9,0x56,0xf9,
+       0x56,0xfa,0x56,0x56,0xfa,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,
+       0xfa,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0x56,0x56,0xfa,0xf9,0x56,0x56,0xf9,0x56,
+       0xf9,0x56,0xf9,0x56,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,
+       0x56,0xf9,0x56,0x56,0x56,0x56,0x56,0x56,0xf9,0x56,0x56,0xf9,0xf9,0xfa,0xf9,0x56,
+       0x56,0x56,0xf9,0x56,0xfa,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0xfa,0x56,0x56,0xfa,
+       0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xfa,0xf9,
+       0x56,0xf9,0x56,0x56,0x56,0xfa,0xf9,0x56,0x56,0xf9,0x56,0x56,0x56,0xf9,0x56,0xf9,
+       0x56,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0x56,0xf9,0x56,0x56,0x56,0x56,
+       0x56,0x56,0x56,0xf9,0x56,0x56,0xf9,0xfa,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0x56,
+       0x56,0x56,0xf9,0xf9,0x56,0x56,0xfa,0x56,0x56,0xfc,0xff,0xff,0xac,0xab,0xab,0xfb,
+       0xab,0x80,0xfb,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
+       0x80,0xff,0x2b,0x56,0xf9,0x56,0x56,0xf9,0x56,0x56,0x56,0x56,0xf9,0x56,0x56,0xfa,
+       0xf9,0xf9,0xf9,0x56,0xf9,0x56,0x56,0x56,0xf9,0xf9,0x56,0xf9,0x56,0xfa,0xf9,0xf9,
+       0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xfa,0x56,0x56,0xf9,0xf9,
+       0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x81,0xfa,0xf9,
+       0x81,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,0x56,
+       0xf9,0x56,0x56,0x56,0xfa,0x56,0xf9,0xff,0xff,0xff,0xff,0xf9,0xfa,0x56,0xff,0xf9,
+       0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,
+       0x56,0xff,0xf9,0xf9,0x56,0xff,0xff,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xfa,0xf9,0x56,
+       0xf9,0xf9,0xf9,0xf9,0xfa,0xfa,0xf9,0xf9,0xfa,0xf9,0xf9,0xfa,0xfa,0xff,0xff,0xf9,
+       0xf9,0xfa,0xf9,0xf9,0xf9,0xff,0xff,0xf9,0xf9,0xfa,0xfa,0xf9,0xf9,0xf9,0xfa,0xf9,
+       0xf9,0xf9,0xfa,0xf9,0xfa,0xf9,0xfa,0xfa,0xfa,0xfa,0xfa,0x56,0x56,0xf9,0xff,0xff,
+       0xff,0xff,0xf9,0xf9,0xf9,0xf9,0xf9,0xff,0xff,0xff,0xff,0x56,0xf9,0xf9,0x56,0x56,
+       0xff,0xff,0xff,0xf9,0xfa,0x56,0xff,0xff,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0xff,0xff,
+       0xff,0xff,0xf9,0xf9,0x56,0x56,0xfa,0xf9,0x56,0xf9,0x56,0x56,0xf9,0x56,0x56,0x56,
+       0x56,0xf9,0x56,0x56,0xfa,0xf9,0x56,0xf9,0x56,0xf9,0x56,0x56,0x56,0xfa,0x56,0xf9,
+       0x56,0xf9,0xf9,0xfa,0xf9,0xfa,0x56,0x56,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,
+       0xf9,0x56,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xfa,0xf9,0x56,0xf9,0xf9,
+       0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,
+       0xf9,0xf9,0x56,0xf9,0x56,0x56,0xf9,0x56,0x56,0x56,0x56,0xf9,0x56,0x56,0xf9,0xf9,
+       0xf9,0x56,0xf9,0xf9,0x56,0x56,0x56,0xfa,0x56,0xf9,0x56,0x56,0xfa,0xf9,0xf9,0xfa,
+       0x56,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xfc,0xff,0xff,0xab,0xfc,0xab,
+       0xfb,0xfb,0xfb,0xaa,0x80,0xfb,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
+       0x80,0x80,0xff,0xf6,0x56,0xf9,0x56,0xf9,0xf9,0xfa,0xf9,0xf9,0xfa,0xf9,0x56,0x56,
+       0xf9,0x56,0x56,0x56,0xfa,0xf9,0x56,0xf9,0xf9,0xfa,0x56,0xf9,0x56,0xf9,0x56,0xf9,
+       0xf9,0xf9,0xf9,0x56,0x56,0xf9,0x56,0x56,0xfa,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,
+       0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0x81,0xf9,
+       0xfa,0xf9,0xf9,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xf9,0x56,0x56,0x56,0x56,0x56,
+       0xfa,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0xff,0xff,0xf9,0x56,0xf9,0xf9,0x56,0xff,0xff,
+       0x56,0x56,0xf9,0xf9,0x56,0x56,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,
+       0xfa,0xff,0xff,0xfa,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,
+       0x56,0xfa,0xf9,0xfa,0xf9,0xf9,0xfa,0xfa,0xfa,0xf9,0xfa,0xfa,0xfa,0xf9,0xff,0xff,
+       0xf9,0xf9,0xfa,0xfa,0xfa,0xfa,0xff,0xff,0xf9,0xf9,0xfa,0xf9,0xf9,0xfa,0xfa,0xfa,
+       0xf9,0xf9,0xfa,0xfa,0xfa,0xf9,0xf9,0xfa,0xf9,0xfa,0xfa,0xf9,0x56,0xf9,0xff,0xff,
+       0xf9,0xf9,0xff,0xff,0x56,0xf9,0xf9,0xff,0xff,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0x56,
+       0x56,0xfa,0xff,0xff,0xf9,0xf9,0xff,0xff,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xff,0xff,
+       0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0x56,0xf9,0xf9,0xfa,0xf9,
+       0xf9,0xf9,0xf9,0x56,0x56,0xf9,0x56,0xf9,0x56,0xfa,0xf9,0x56,0xf9,0xf9,0xf9,0x56,
+       0xf9,0x56,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xf9,0x56,0x56,0xf9,0xf9,0x56,0x56,0x56,
+       0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xfa,0x56,0x56,0xf9,0x56,0x56,0xf9,
+       0xf9,0x56,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xfa,0xf9,0xf9,0xf9,0x56,0xf9,
+       0xf9,0xfa,0x56,0x56,0xf9,0x56,0x56,0xf9,0xfa,0xf9,0xf9,0xf9,0xfa,0x56,0x56,0xf9,
+       0x56,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xfa,0x56,0xf9,0x56,0xf9,0x56,0xf9,0xf9,
+       0x56,0x56,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xf9,0x56,0xf9,0xfc,0xff,0xff,0xab,0xab,
+       0xab,0xab,0xfb,0xaa,0x81,0xaa,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
+       0x80,0x80,0x80,0xff,0x2b,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,
+       0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xfa,0x56,0x56,0x56,0x56,0x56,0xf9,
+       0x56,0x56,0x56,0xf9,0x56,0x56,0xfa,0x56,0x56,0xfa,0x56,0x56,0xfa,0xf9,0x56,0x56,
+       0xfa,0x56,0x56,0x56,0x56,0xf9,0xf9,0x56,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xfa,0xfa,
+       0xfa,0xfa,0x81,0xfa,0xf9,0xfa,0xfa,0xf9,0xf9,0xfa,0xf9,0x56,0x56,0x56,0x56,0xf9,
+       0x56,0xf9,0xf9,0x56,0x56,0xfa,0xf9,0x56,0xff,0xff,0x56,0xf9,0x56,0x56,0xff,0xff,
+       0xff,0xff,0xff,0xf9,0x56,0xff,0xff,0xff,0xff,0xf9,0x56,0xf9,0xff,0xff,0xf9,0xff,
+       0xff,0xff,0xff,0xff,0xff,0xff,0x56,0xff,0xff,0x56,0x56,0xff,0xff,0x56,0xff,0xff,
+       0xf9,0xf9,0x56,0x56,0xff,0xff,0xff,0xf9,0xff,0xf9,0xfa,0xf9,0xfa,0xfa,0xf9,0xff,
+       0xff,0xff,0xfa,0xfa,0xfa,0xf9,0xff,0xff,0xff,0xf9,0xf9,0xf9,0xff,0xff,0xff,0xff,
+       0xfa,0xf9,0xfa,0xfa,0xff,0xff,0xff,0xff,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0xff,0xff,
+       0x56,0xf9,0x56,0x56,0xff,0xff,0xf9,0xf9,0xff,0xff,0xf9,0x56,0xf9,0x56,0x56,0xfa,
+       0x56,0x56,0xfa,0x56,0xff,0xff,0xf9,0xff,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xf9,0xff,
+       0xff,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xff,0xff,0xff,0xff,0xf9,0xf9,0xf9,0xff,0xff,
+       0xf9,0xff,0xff,0xff,0xff,0x56,0xf9,0x56,0xff,0xff,0xf9,0xf9,0xff,0xff,0xff,0xff,
+       0x56,0x56,0x56,0xff,0xff,0x56,0xff,0xff,0x56,0xf9,0xfa,0x56,0xf9,0x56,0x56,0xf9,
+       0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xfa,0x56,0x56,0xfa,0x56,0x56,
+       0xfa,0xf9,0x56,0xf9,0xfa,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xf9,0x56,
+       0xf9,0x56,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,0x56,
+       0xf9,0x56,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,0x56,0x56,0xf9,0x56,
+       0x56,0x56,0x56,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xf9,0x56,0xf9,0xfc,0xff,0xff,0xfc,
+       0xfc,0xfb,0xaa,0xfb,0xfb,0xfb,0x80,0xfb,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
+       0x80,0x80,0x80,0x80,0xff,0xf6,0x56,0xfa,0x56,0x56,0xf9,0x56,0x56,0x56,0x56,0x56,
+       0x56,0xfa,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,0x56,0xfa,0xf9,
+       0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,
+       0xf9,0xf9,0x56,0x56,0x56,0xf9,0xf9,0x56,0x56,0xf9,0x56,0xfa,0xfa,0xf9,0xf9,0xf9,
+       0xfa,0xfa,0xf9,0xfa,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,
+       0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,0x56,0xff,0xff,0xff,0xf9,0xfa,0xf9,0x56,
+       0xff,0xff,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xff,0xff,0xf9,0x56,0xff,0xff,0xff,
+       0xff,0xff,0xf9,0xff,0xff,0xfa,0xf9,0x56,0xff,0xff,0x56,0xf9,0xff,0xff,0xff,0xf9,
+       0xff,0xff,0x56,0x56,0xff,0xff,0xfa,0xf9,0xff,0xff,0xfa,0xfa,0xf9,0xf9,0xfa,0xf9,
+       0xff,0xff,0xff,0xf9,0xf9,0xf9,0xf9,0xff,0xff,0xff,0xf9,0xfa,0xfa,0xfa,0xfa,0xfa,
+       0xff,0xff,0xf9,0xfa,0xff,0xff,0xf9,0xfa,0xff,0xfa,0x81,0xfa,0xfa,0xf9,0xfa,0xff,
+       0xff,0xf9,0xf9,0xf9,0xf9,0xff,0xff,0xf9,0x56,0xff,0xff,0xff,0x56,0xf9,0xf9,0xf9,
+       0xf9,0x56,0x56,0xf9,0xf9,0xff,0xff,0xff,0x56,0xf9,0xf9,0x56,0x56,0x56,0xf9,0xf9,
+       0xff,0xff,0xff,0x56,0xf9,0x56,0xf9,0xff,0xff,0xf9,0x56,0xff,0xff,0x56,0x56,0xff,
+       0xff,0xff,0xff,0xff,0xff,0xff,0xfa,0xf9,0xfa,0xff,0xff,0xf9,0xff,0xff,0xf9,0x56,
+       0xff,0xff,0x56,0xfa,0xff,0xff,0xff,0xff,0xff,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,
+       0xf9,0x56,0xf9,0x56,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,
+       0x56,0xf9,0xf9,0x56,0x56,0xf9,0x56,0x56,0x56,0xf9,0x56,0x56,0x56,0x56,0x56,0xf9,
+       0xf9,0xf9,0x56,0xf9,0x56,0x56,0xfa,0x56,0x56,0xf9,0x56,0x56,0x56,0x56,0x56,0x56,
+       0xf9,0xfa,0xf9,0xfa,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0x56,0x56,0xf9,0xf9,0xfa,0xf9,
+       0xfa,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xfc,0xff,0xff,
+       0xfc,0xab,0xab,0xfb,0xfb,0xaa,0x80,0xfb,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
+       0x80,0x80,0x80,0x80,0x80,0xff,0x2b,0x56,0x56,0xf9,0x56,0xf9,0xf9,0xfa,0xf9,0xfa,
+       0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xfa,0x56,0x56,0x56,0xf9,0x56,0x56,0x56,0xf9,0x56,
+       0xf9,0x56,0x56,0xf9,0xf9,0xfa,0x56,0x56,0xfa,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0x56,
+       0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xf9,
+       0x81,0xfa,0xfa,0xf9,0xfa,0xf9,0xf9,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xf9,0x56,0xf9,
+       0xf9,0x56,0xfa,0x56,0x56,0x56,0x56,0xf9,0x56,0x56,0xf9,0xff,0xff,0xff,0x56,0x56,
+       0xf9,0xff,0xff,0x56,0x56,0xfa,0xf9,0xff,0xff,0xff,0xff,0xff,0xf9,0x56,0xff,0xff,
+       0xf9,0x56,0x56,0xfa,0xff,0xff,0x56,0xf9,0xfa,0xff,0xff,0xf9,0x56,0xff,0xff,0xf9,
+       0x56,0xff,0xff,0xf9,0xf9,0xff,0xff,0x56,0x56,0xff,0xff,0xf9,0xf9,0xfa,0xfa,0xfa,
+       0xf9,0xff,0xfa,0xff,0xff,0xfa,0xfa,0xff,0xfa,0xff,0xff,0xfa,0xfa,0xfa,0xff,0xff,
+       0xff,0xff,0xff,0xf9,0xfa,0xff,0xff,0xf9,0xfa,0xf9,0xfa,0xf9,0xf9,0xfa,0xfa,0xfa,
+       0xff,0xff,0x56,0xfa,0xfa,0xf9,0xff,0xff,0x56,0x56,0xf9,0xff,0xff,0xff,0xfa,0x56,
+       0x56,0xfa,0xf9,0x56,0x56,0xf9,0xf9,0xff,0xff,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0x56,
+       0x56,0xf9,0xff,0xff,0xff,0x56,0x56,0x56,0xff,0xff,0xf9,0xf9,0xff,0xff,0xf9,0x56,
+       0xff,0xff,0xfa,0xf9,0xfa,0xf9,0xff,0xff,0xf9,0xf9,0xff,0xf9,0x56,0xff,0xff,0x56,
+       0xf9,0xff,0xff,0xf9,0xf9,0xff,0xff,0x56,0x56,0xf9,0xf9,0x56,0x56,0x56,0xfa,0xf9,
+       0xf9,0xf9,0x56,0x56,0x56,0xf9,0x56,0x56,0xfa,0xf9,0x56,0x56,0xfa,0xf9,0xf9,0x56,
+       0xf9,0xfa,0xf9,0x56,0xf9,0xf9,0xfa,0xfa,0xf9,0xf9,0x56,0x56,0xfa,0xf9,0xf9,0xf9,
+       0x56,0x56,0x56,0xfa,0xf9,0xf9,0x56,0x56,0xf9,0x56,0x56,0xfa,0xf9,0xfa,0xf9,0xfa,
+       0xf9,0xf9,0xf9,0xf9,0x56,0xfa,0x56,0x56,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,
+       0x56,0x56,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xfa,0xf9,0xf9,0xf9,0x56,0x56,0xfc,0xff,
+       0xff,0xab,0xab,0xfc,0xab,0xfb,0xfb,0xaa,0x80,0x80,0xfb,0x80,0x80,0x80,0x80,0x80,
+       0x80,0x80,0x80,0x80,0x80,0x80,0xff,0x2b,0xfa,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,
+       0x56,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,
+       0x56,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0x56,0x56,0xfa,0xf9,0x56,
+       0xf9,0x56,0x56,0xf9,0x56,0x56,0xf9,0x56,0x56,0xfa,0x56,0xf9,0xf9,0xf9,0xfa,0xfa,
+       0xfa,0x81,0xfa,0xfa,0x81,0xfa,0xfa,0xf9,0xf9,0xfa,0xf9,0xf9,0x56,0xf9,0x56,0xf9,
+       0x56,0x56,0x56,0xf9,0x56,0x56,0x56,0xfa,0xf9,0xf9,0xf9,0x56,0x56,0xff,0xff,0xff,
+       0xf9,0xf9,0xff,0xff,0xf9,0xf9,0xf9,0xff,0xff,0xf9,0xf9,0xff,0xff,0xf9,0x56,0xff,
+       0xff,0xf9,0x56,0xf9,0xf9,0xff,0xff,0x56,0xf9,0xf9,0xff,0xff,0x56,0xf9,0xff,0xff,
+       0x56,0xf9,0xff,0xff,0xfa,0x56,0xff,0xff,0x56,0xfa,0xff,0xff,0xf9,0xfa,0xfa,0xfa,
+       0xfa,0xfa,0xff,0xfa,0xff,0xff,0xf9,0xfa,0xff,0xf9,0xff,0xff,0xf9,0xfa,0xff,0xff,
+       0xf9,0xfa,0xff,0xff,0xf9,0xfa,0xff,0xff,0xf9,0xf9,0xf9,0xfa,0xf9,0xfa,0xf9,0xfa,
+       0xfa,0xff,0xff,0xfa,0xfa,0xf9,0xf9,0xff,0xff,0xfa,0xf9,0xf9,0xf9,0xff,0xff,0xff,
+       0x56,0xf9,0xf9,0x56,0x56,0x56,0xfa,0xff,0xff,0xff,0xff,0x56,0xf9,0x56,0x56,0xf9,
+       0x56,0x56,0xfa,0x56,0xff,0xff,0xff,0xfa,0xfa,0xff,0xff,0xff,0xff,0xff,0xff,0xf9,
+       0x56,0xff,0xff,0x56,0x56,0x56,0x56,0xff,0xff,0xf9,0xff,0xff,0xfa,0x56,0xff,0xff,
+       0xff,0xff,0xff,0xff,0x56,0x56,0xff,0xff,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,
+       0xf9,0x56,0xf9,0xf9,0xfa,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0x56,0x56,
+       0x56,0xf9,0xf9,0x56,0xf9,0x56,0x56,0x56,0x56,0x56,0xf9,0x56,0x56,0xf9,0x56,0x56,
+       0xf9,0x56,0xf9,0xfa,0xf9,0x56,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0x56,
+       0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0x56,
+       0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xfa,0xf9,0xf9,0x56,0xf9,0xf9,0xfa,0xfc,
+       0xff,0xff,0xfc,0xab,0xab,0xfb,0xaa,0xfb,0x80,0xfb,0x80,0x80,0x80,0x80,0x80,0x80,
+       0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xff,0xf6,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0x56,
+       0x56,0xf9,0x56,0xf9,0x56,0x56,0x56,0x56,0xfa,0xf9,0x56,0xf9,0xfa,0xf9,0xf9,0xf9,
+       0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xfa,0x56,0x56,0xf9,0xf9,0x56,0xfa,0xf9,0x56,0x56,
+       0x56,0x56,0x56,0x56,0xf9,0xf9,0xf9,0xfa,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,
+       0xf9,0xf9,0xfa,0xfa,0xfa,0xfa,0xf9,0xfa,0xfa,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,
+       0x56,0x56,0x56,0x56,0xfa,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xff,
+       0xff,0x56,0x56,0xff,0xff,0xf9,0xf9,0x56,0xff,0xff,0xf9,0xf9,0xff,0xff,0xf9,0xfa,
+       0xff,0xff,0x56,0x56,0xf9,0xf9,0xff,0xff,0xf9,0xf9,0x56,0xff,0xff,0x56,0x56,0xff,
+       0xff,0xf9,0xfa,0xff,0xff,0xf9,0xf9,0xff,0xff,0x56,0xf9,0xff,0xff,0xfa,0x56,0xf9,
+       0xfa,0xfa,0xf9,0xff,0xf9,0xf9,0xff,0xff,0xff,0xf9,0xf9,0xff,0xff,0xf9,0xf9,0xff,
+       0xff,0xf9,0xfa,0xff,0xff,0xf9,0xfa,0xff,0xff,0xfa,0xfa,0xfa,0xfa,0xf9,0xfa,0xf9,
+       0xf9,0xfa,0xff,0xff,0xfa,0xf9,0x56,0xf9,0xff,0xff,0xf9,0xf9,0xf9,0xf9,0xfa,0xff,
+       0xff,0x56,0xf9,0xf9,0x56,0xfa,0xf9,0x56,0xff,0x56,0xff,0xff,0x56,0xf9,0xf9,0xf9,
+       0xfa,0x56,0x56,0xf9,0xf9,0xf9,0xff,0xff,0xf9,0x56,0xff,0xff,0xf9,0x56,0xf9,0xf9,
+       0xf9,0xf9,0xff,0xff,0x56,0x56,0xf9,0x56,0xf9,0xff,0xff,0xff,0x56,0xfa,0xf9,0xff,
+       0xff,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xff,0xff,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,
+       0x56,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xfa,0xf9,0xfa,0x56,0x56,0xf9,0xf9,0xf9,
+       0xf9,0xf9,0xf9,0x56,0x56,0x56,0x56,0xf9,0xfa,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,
+       0xf9,0xf9,0xf9,0xf9,0x56,0xfa,0xf9,0x56,0xf9,0x56,0x56,0xf9,0x56,0xf9,0x56,0x56,
+       0xf9,0xf9,0x56,0xf9,0x56,0x56,0x56,0xfa,0x56,0x56,0xf9,0xfa,0x56,0xf9,0xf9,0xf9,
+       0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0x56,0x56,0x56,0xf9,0xf9,0xf9,0xf9,
+       0xfc,0xff,0xff,0xfc,0xab,0xfb,0xab,0xfb,0xfb,0xaa,0xfb,0xaa,0x80,0x80,0x80,0x80,
+       0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xff,0x2b,0x56,0xf9,0xf9,0x56,0x56,0xf9,
+       0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0x56,0xfa,0xf9,0xf9,0x56,0x56,0x56,0x56,0x56,0xf9,
+       0xf9,0x56,0xf9,0xf9,0x56,0x56,0x56,0x56,0x56,0xf9,0xfa,0x56,0xf9,0xf9,0x56,0xf9,
+       0x56,0xfa,0xf9,0xf9,0xf9,0xfa,0x56,0xf9,0xf9,0x56,0xf9,0xfa,0x56,0xf9,0x56,0xf9,
+       0xfa,0xf9,0xf9,0x81,0xfa,0xf9,0xfa,0xfa,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0xfa,0xfa,
+       0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xf9,0x56,0xf9,0x56,0x56,0xf9,0xf9,
+       0xff,0xff,0x56,0x56,0xff,0xff,0x56,0x56,0x56,0xff,0xff,0x56,0xff,0xff,0xff,0xf9,
+       0x56,0xff,0xff,0x56,0xf9,0xfa,0x56,0xff,0xff,0x56,0x56,0xf9,0xff,0xff,0xf9,0xf9,
+       0xff,0xff,0xf9,0xf9,0xff,0xff,0xfa,0x56,0xff,0xff,0xf9,0xff,0xff,0xff,0xfa,0x56,
+       0x56,0xfa,0xfa,0xf9,0xff,0xfa,0xfa,0xff,0xff,0xff,0xfa,0xfa,0xff,0xff,0xfa,0xfa,
+       0xff,0xff,0xfa,0xff,0xff,0xff,0xfa,0xfa,0xff,0xff,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,
+       0xf9,0xf9,0xfa,0xfa,0xff,0xff,0xf9,0xfa,0xff,0xff,0xf9,0xf9,0x56,0xf9,0xf9,0x56,
+       0xff,0xff,0xf9,0xfa,0x56,0xf9,0xf9,0x56,0xff,0xff,0xf9,0xf9,0xff,0xff,0xfa,0x56,
+       0xf9,0xf9,0x56,0xf9,0xfa,0x56,0xf9,0xff,0xff,0xfa,0x56,0xff,0xff,0xf9,0x56,0x56,
+       0xf9,0x56,0x56,0xff,0xff,0xf9,0xf9,0xf9,0xfa,0xf9,0xff,0xff,0xff,0xf9,0xf9,0x56,
+       0xff,0xff,0xf9,0x56,0xf9,0x56,0x56,0xf9,0xff,0xff,0x56,0x56,0x56,0xf9,0xf9,0x56,
+       0x56,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xf9,0xfa,0x56,
+       0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xfa,
+       0x56,0xf9,0x56,0x56,0xfa,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,
+       0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xfa,0xf9,0xf9,0x56,0x56,0xf9,0x56,0x56,0xf9,0xf9,
+       0x56,0xf9,0xf9,0x56,0x56,0x56,0x56,0xf9,0xf9,0x56,0x56,0x56,0xf9,0xf9,0x56,0x56,
+       0x56,0xfc,0xff,0xff,0xab,0xab,0xab,0xfb,0xfb,0xaa,0xfb,0x80,0x80,0x80,0x80,0x80,
+       0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xff,0xf6,0xf9,0xfa,0x56,0x56,0xf9,
+       0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xfa,0xf9,0xf9,
+       0x56,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xfa,0x56,0x56,0xfa,0xf9,0x56,
+       0xf9,0xfa,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xfa,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,
+       0xf9,0xfa,0xf9,0xfa,0x81,0xfa,0xf9,0xfa,0xfa,0xf9,0xf9,0xf9,0xfa,0xfa,0xf9,0xf9,
+       0xf9,0x56,0x56,0x56,0xf9,0x56,0xf9,0x56,0xf9,0xfa,0xf9,0x56,0xf9,0xf9,0xff,0xff,
+       0xff,0xff,0x56,0xf9,0xf9,0xf9,0xff,0xff,0xff,0x56,0x56,0xff,0xff,0x56,0xff,0xff,
+       0x56,0x56,0xff,0xff,0x56,0xfa,0x56,0x56,0xfa,0xff,0xff,0xff,0xf9,0xff,0xff,0x56,
+       0xf9,0xff,0xff,0xfa,0xf9,0xff,0xff,0xf9,0xf9,0xf9,0xff,0xff,0xf9,0xff,0xff,0xf9,
+       0xf9,0xf9,0xfa,0x56,0xf9,0xff,0x81,0xf9,0xf9,0xff,0xfa,0xfa,0xf9,0xff,0xff,0xfa,
+       0xf9,0xf9,0xff,0xff,0xfa,0xff,0xff,0xfa,0xfa,0xfa,0xff,0xff,0xff,0xff,0xf9,0xf9,
+       0xf9,0xfa,0xfa,0xf9,0xfa,0xf9,0xff,0xff,0xff,0xff,0xf9,0xf9,0xfa,0xf9,0xff,0xff,
+       0xff,0xff,0x56,0xfa,0x56,0x56,0xfa,0xf9,0xff,0xff,0xf9,0xfa,0xf9,0xff,0xff,0xff,
+       0x56,0xfa,0xf9,0x56,0xf9,0xff,0xff,0xff,0xff,0xf9,0xf9,0xf9,0xf9,0xff,0xff,0xff,
+       0xff,0xff,0x56,0x56,0xff,0xff,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0xff,0xf9,0x56,0xf9,
+       0x56,0xf9,0xff,0xff,0xff,0xff,0xff,0xf9,0xf9,0xff,0xff,0x56,0xf9,0xf9,0xf9,0xf9,
+       0x56,0x56,0x56,0x56,0xfa,0x56,0x56,0xf9,0x56,0x56,0x56,0x56,0xf9,0x56,0xfa,0x56,
+       0x56,0xfa,0xf9,0x56,0xfa,0xf9,0xfa,0xf9,0x56,0xf9,0xf9,0x56,0xfa,0xf9,0x56,0xf9,
+       0xf9,0x56,0xf9,0x56,0x56,0xfa,0x56,0xfa,0x56,0x56,0xf9,0xfa,0x56,0x56,0xf9,0xf9,
+       0xf9,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0x56,
+       0xf9,0xf9,0x56,0xf9,0x56,0x56,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0x56,0xfa,0x56,
+       0x56,0xfa,0xfc,0xff,0xff,0xfc,0xfc,0xab,0xab,0xfb,0x80,0xfb,0x80,0xfb,0x80,0x80,
+       0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xff,0x2b,0xf9,0xf9,0x56,0x56,
+       0xf9,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0x56,0x56,0x56,0xf9,0x56,0x56,0xf9,0xf9,0xf9,
+       0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xfa,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,
+       0x56,0xfa,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xf9,0x56,0x56,0xf9,
+       0xf9,0xf9,0xfa,0xf9,0xfa,0xfa,0xf9,0xfa,0xfa,0xfa,0xf9,0xf9,0xfa,0xfa,0xf9,0xf9,
+       0xf9,0xf9,0x56,0x56,0x56,0x56,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,
+       0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xfa,0xf9,0xfa,0x56,0x56,0xf9,
+       0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xf9,0x56,0x56,0xf9,0xf9,0x56,0x56,
+       0x56,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xf9,0x56,0x56,0xf9,0x56,0x56,0xf9,0xff,0xff,
+       0xfa,0xf9,0xf9,0xf9,0x56,0xf9,0xfa,0xfa,0xf9,0xf9,0xfa,0xfa,0xf9,0xf9,0xf9,0xfa,
+       0xfa,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0xfa,0xfa,0xf9,0xfa,0xfa,0xfa,0xf9,0xf9,0xfa,
+       0xf9,0xfa,0xfa,0xfa,0xfa,0xfa,0xf9,0xfa,0xfa,0xfa,0x81,0xf9,0xf9,0xf9,0xf9,0xf9,
+       0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xfa,0xf9,0x56,0xf9,0x56,0xf9,
+       0xf9,0x56,0xf9,0x56,0x56,0xf9,0x56,0x56,0xf9,0x56,0x56,0xf9,0x56,0xf9,0x56,0x56,
+       0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0x56,0x56,0xf9,0xf9,
+       0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,
+       0xf9,0x56,0xf9,0xfa,0xf9,0xfa,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,
+       0x56,0x56,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0x56,0xfa,0xf9,0x56,0xf9,0x56,0x56,
+       0xf9,0x56,0x56,0xf9,0x56,0x56,0xf9,0xf9,0x56,0x56,0x56,0xfa,0xf9,0x56,0x56,0x56,
+       0xfa,0x56,0x56,0xf9,0x56,0xf9,0x56,0x56,0x56,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,
+       0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xfa,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xfa,
+       0x56,0x56,0xf9,0xfc,0xff,0xff,0xab,0xab,0xfb,0xab,0xfb,0xaa,0xfb,0x80,0x80,0xfb,
+       0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xff,0x2b,0xfa,0x56,0x56,
+       0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,
+       0x56,0x56,0x56,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0x56,0x56,0x56,0x56,
+       0x56,0x56,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,
+       0xf9,0xf9,0x56,0xfa,0xfa,0xfa,0xf9,0xfa,0xfa,0x81,0xf9,0xf9,0xfa,0xfa,0xf9,0xf9,
+       0xf9,0xf9,0xfa,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xf9,
+       0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,0x56,0x56,
+       0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,
+       0xf9,0x56,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0xfa,0xff,0xff,0xff,0xff,
+       0xf9,0xf9,0xf9,0x56,0x56,0x56,0xfa,0xfa,0xf9,0xf9,0xfa,0xfa,0xfa,0xfa,0xf9,0xfa,
+       0xfa,0xfa,0xf9,0xfa,0xfa,0xf9,0xfa,0xf9,0xfa,0xfa,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,
+       0xfa,0xfa,0xfa,0xfa,0xf9,0xfa,0xf9,0xf9,0xfa,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,
+       0xf9,0x56,0xf9,0xfa,0xf9,0xf9,0x56,0x56,0x56,0x56,0x56,0x56,0xf9,0x56,0xf9,0x56,
+       0xf9,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xfa,0xf9,0xf9,0x56,
+       0x56,0xf9,0xfa,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xfa,0xf9,0xf9,0xf9,0x56,
+       0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,
+       0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,0x56,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,
+       0xf9,0x56,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0x56,
+       0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xfa,0xf9,0x56,0x56,0xfa,0xf9,0x56,0x56,0xf9,
+       0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0x56,
+       0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xfa,0xf9,0x56,
+       0x56,0x56,0x56,0xf9,0xfc,0xff,0xff,0xfc,0xfc,0xab,0xfb,0xab,0x81,0xaa,0xfb,0x80,
+       0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xff,0x2b,0x56,0xf9,
+       0xf9,0xfa,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xf9,0x56,0xf9,
+       0xf9,0x56,0x56,0x56,0x56,0xf9,0x56,0xf9,0x56,0x56,0xf9,0xf9,0x56,0x56,0x56,0xf9,
+       0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xf9,0x56,0xf9,0xf9,0x56,0xfa,0xf9,0x56,
+       0xf9,0xfa,0xf9,0xf9,0xfa,0xf9,0xfa,0xf9,0xfa,0x81,0xf9,0xf9,0xfa,0xfa,0xfa,0xf9,
+       0xfa,0xf9,0xf9,0xf9,0x56,0x56,0x56,0x56,0x56,0xf9,0x56,0xf9,0xf9,0x56,0x56,0x56,
+       0x56,0xf9,0x56,0xf9,0x56,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xfa,
+       0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xf9,0xf9,0x56,0x56,0xf9,
+       0x56,0x56,0x56,0xf9,0x56,0xf9,0xf9,0x56,0xfa,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,
+       0x56,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xfa,0xfa,0xfa,0xf9,0xfa,0xfa,
+       0xf9,0xfa,0xf9,0xfa,0xf9,0xf9,0xfa,0xfa,0xfa,0xf9,0xfa,0xf9,0xf9,0xf9,0xfa,0xf9,
+       0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0xfa,0xf9,0xfa,0xfa,0xf9,0xf9,0x81,0xfa,0x81,0xfa,
+       0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,
+       0x56,0xf9,0x56,0xf9,0xf9,0x56,0xfa,0xf9,0x56,0xf9,0xfa,0x56,0xf9,0xf9,0x56,0x56,
+       0x56,0xf9,0xfa,0x56,0xf9,0xf9,0xfa,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0x56,
+       0xf9,0x56,0xfa,0x56,0xf9,0xf9,0x56,0x56,0x56,0x56,0xf9,0x56,0xf9,0x56,0x56,0xfa,
+       0x56,0x56,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xfa,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,
+       0xf9,0x56,0x56,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0x56,0x56,0x56,0xf9,0xf9,
+       0x56,0xfa,0xf9,0x56,0xf9,0xfa,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0x56,0xfa,
+       0xfa,0xf9,0x56,0xf9,0x56,0x56,0xfa,0xf9,0x56,0xf9,0x56,0xf9,0xfa,0x56,0xf9,0xf9,
+       0x56,0x56,0x56,0xf9,0x56,0x56,0xf9,0x56,0x56,0xf9,0x56,0x56,0xf9,0x56,0xf9,0x56,
+       0x56,0xf9,0xfa,0xf9,0xf9,0xfc,0xff,0xff,0xab,0xab,0xfb,0xab,0xfb,0xaa,0xfb,0x80,
+       0xaa,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xff,0x2b,0x56,
+       0xf9,0x56,0xf9,0x56,0x56,0xfa,0x56,0x56,0xfa,0x56,0x56,0x56,0x56,0xf9,0xfa,0xf9,
+       0x56,0xf9,0x56,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0x56,0x56,0xfa,0xf9,0xf9,0x56,0x56,
+       0x56,0xf9,0xf9,0xf9,0xf9,0xfa,0x56,0x56,0x56,0xf9,0x56,0xfa,0x56,0xfa,0xf9,0x56,
+       0x56,0xfa,0xf9,0xf9,0xf9,0xf9,0xfa,0xfa,0x81,0x81,0xfa,0xf9,0xfa,0xfa,0xf9,0xf9,
+       0xf9,0xfa,0xf9,0xf9,0xf9,0x56,0x56,0x56,0x56,0xf9,0xfa,0xf9,0x56,0xf9,0x56,0xf9,
+       0xf9,0xfa,0xf9,0xf9,0xf9,0x56,0x56,0xfa,0xf9,0x56,0x56,0xf9,0xf9,0x56,0x56,0xfa,
+       0xf9,0x56,0xf9,0x56,0xf9,0xfa,0xf9,0xf9,0x56,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,
+       0xfa,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xfa,0x56,0x56,0xfa,0xf9,0x56,0x56,
+       0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xfa,0xf9,0xfa,0x56,0xf9,0xf9,0xf9,0xfa,0xf9,0xfa,
+       0xfa,0xf9,0xfa,0xfa,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0xfa,0xf9,0xf9,0xf9,0xfa,0xfa,
+       0xfa,0xfa,0xfa,0xf9,0xf9,0xfa,0xfa,0xf9,0xf9,0xfa,0xf9,0xf9,0xfa,0xfa,0xfa,0xf9,
+       0xfa,0xfa,0xfa,0xfa,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,
+       0x56,0x56,0xf9,0x56,0xfa,0x56,0xfa,0xf9,0x56,0x56,0xfa,0xf9,0x56,0x56,0xf9,0xf9,
+       0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0x56,0x56,0xfa,0x56,0xf9,0xf9,0xf9,0x56,
+       0x56,0x56,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0x56,0xf9,
+       0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0x56,0xfa,0xf9,0x56,0xf9,0x56,0xf9,0xfa,0xf9,
+       0xf9,0x56,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0x56,0x56,0xf9,0xf9,0xf9,0xf9,
+       0xf9,0xf9,0xfa,0x56,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xfa,0xf9,0xfa,0x56,0xf9,
+       0xf9,0x56,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0x56,0x56,0xf9,0xf9,0xf9,0x56,
+       0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xfa,0xf9,0x56,0x56,0xf9,0xf9,
+       0x56,0xf9,0xfa,0xf9,0x56,0xf9,0xfc,0xff,0xff,0xfc,0xab,0xab,0xfb,0xfb,0xfb,0x80,
+       0xfb,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xff,0x2b,
+       0x56,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0x56,0xf9,
+       0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xfa,0x56,0x56,0x56,
+       0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0x56,
+       0x56,0x56,0xf9,0xf9,0xf9,0xfa,0xf9,0xfa,0xfa,0xfa,0xfa,0xf9,0xf9,0xf9,0xf9,0xfa,
+       0xf9,0xf9,0xfa,0xf9,0xf9,0x56,0x56,0x56,0x56,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,
+       0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xfa,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,
+       0x56,0x56,0x56,0xf9,0x56,0xf9,0xf9,0x56,0x56,0x56,0x56,0x56,0xf9,0x56,0xf9,0xf9,
+       0xf9,0xf9,0x56,0x56,0xfa,0xf9,0xf9,0x56,0x56,0xf9,0x56,0x56,0x56,0x56,0xf9,0xf9,
+       0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0x56,0x56,0x56,0x56,0xf9,0xf9,0xf9,
+       0x81,0xf9,0xfa,0xf9,0xf9,0xf9,0xfa,0xf9,0xfa,0xfa,0xfa,0xf9,0xf9,0xfa,0xfa,0xfa,
+       0xfa,0xf9,0xfa,0xfa,0xf9,0xfa,0xfa,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,
+       0xf9,0xfa,0xf9,0xfa,0xfa,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,
+       0x56,0x56,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0x56,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0x56,
+       0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0x56,
+       0xf9,0x56,0xf9,0x56,0xfa,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,
+       0xf9,0xfa,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0x56,0x56,0x56,0xf9,0x56,0xf9,0xf9,
+       0x56,0x56,0x56,0x56,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,
+       0x56,0x56,0xf9,0x56,0x56,0x56,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0x56,0xf9,0x56,0x56,
+       0x56,0x56,0xf9,0xf9,0x56,0xfa,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,
+       0x56,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,
+       0x56,0x56,0x56,0x56,0x56,0x56,0xf9,0xfb,0xff,0xff,0xac,0xfc,0xab,0xab,0xaa,0xfb,
+       0xaa,0x80,0xfb,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xff,
+       0xf6,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0x56,0xf9,0xf9,0x56,0xfa,
+       0xf9,0x56,0x56,0x56,0xf9,0xfa,0xf9,0x56,0x56,0xf9,0x56,0x56,0xfa,0xf9,0x56,0xf9,
+       0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xf9,0x56,0x56,0xf9,0x56,0xf9,
+       0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xfa,0xfa,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,
+       0xf9,0xfa,0xf9,0xfa,0xf9,0x56,0xf9,0x56,0x56,0xf9,0x56,0xfa,0xf9,0x56,0x56,0x56,
+       0xf9,0xfa,0xf9,0x56,0x56,0xf9,0x56,0x56,0xfa,0xf9,0x56,0xf9,0x56,0x56,0xf9,0x56,
+       0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,
+       0x56,0xf9,0xf9,0x56,0x56,0x56,0x56,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,
+       0xf9,0x56,0xf9,0xf9,0x56,0xf9,0x56,0x56,0x56,0x56,0x56,0x56,0xf9,0xf9,0xf9,0xf9,
+       0xf9,0xfa,0xfa,0xf9,0xfa,0xfa,0xf9,0xf9,0xfa,0xfa,0xfa,0xf9,0xf9,0xf9,0xfa,0xfa,
+       0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xfa,0xfa,0xf9,0xf9,0xf9,0xfa,0xf9,0xfa,0xfa,
+       0xfa,0xf9,0x81,0xfa,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0x56,
+       0xf9,0x56,0x56,0xf9,0x56,0x56,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0x56,
+       0xf9,0xf9,0x56,0x56,0x56,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,
+       0xf9,0x56,0xf9,0x56,0xfa,0xf9,0x56,0x56,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0x56,
+       0x56,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xf9,0x56,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,
+       0x56,0x56,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xf9,0x56,
+       0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,0x56,
+       0x56,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,
+       0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xfa,0xf9,0xf9,0x56,0x56,
+       0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xfc,0xff,0xff,0xab,0xab,0xab,0xfb,0xfb,
+       0x80,0xfb,0xfb,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
+       0xff,0x2b,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0x56,0x56,
+       0xf9,0xf9,0x56,0xf9,0xf9,0xfa,0x56,0x56,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0x56,0xf9,
+       0xf9,0xf9,0xf9,0x56,0x56,0x56,0x56,0x56,0xf9,0x56,0x56,0x56,0xf9,0xfa,0xf9,0xf9,
+       0xf9,0xf9,0x56,0xf9,0x56,0xf9,0xfa,0xf9,0xf9,0x81,0xfa,0xfa,0xfa,0xfa,0xf9,0xfa,
+       0xfa,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0x56,0x56,0xf9,0xf9,0x56,0xf9,
+       0xf9,0xfa,0x56,0x56,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xf9,0x56,0xf9,0xf9,
+       0xfa,0xf9,0xf9,0x56,0x56,0xf9,0x56,0x56,0x56,0xf9,0xfa,0xf9,0xf9,0xf9,0x56,0x56,
+       0xf9,0x56,0x56,0x56,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0x56,0xf9,0x56,0x56,
+       0x56,0xfa,0x56,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0x56,0xf9,0xf9,0x56,0xfa,0xf9,0xf9,
+       0xf9,0xf9,0xf9,0xf9,0xfa,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0xfa,0xfa,
+       0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0xfa,0xfa,0xf9,0xf9,0xfa,0xf9,0xfa,0xfa,0xfa,0xfa,
+       0xfa,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0xfa,0x81,0xfa,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,
+       0x56,0xf9,0x56,0x56,0x56,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,
+       0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0x56,
+       0xf9,0x56,0x56,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0x56,0x56,
+       0xf9,0x56,0xfa,0x56,0x56,0xf9,0x56,0xf9,0xf9,0xfa,0xf9,0xf9,0x56,0x56,0xf9,0x56,
+       0x56,0x56,0xf9,0xfa,0xf9,0xf9,0x56,0xf9,0x56,0x56,0x56,0x56,0xf9,0x56,0x56,0x56,
+       0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,
+       0xf9,0x56,0xfa,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,0x56,0x56,0xf9,
+       0xf9,0x56,0x56,0xf9,0xfa,0x56,0xf9,0x56,0x56,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xf9,
+       0x56,0x56,0xfa,0xf9,0xf9,0xfa,0x56,0x56,0xf9,0xfc,0xff,0xff,0xab,0xfc,0xab,0xfb,
+       0xaa,0xfb,0xaa,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
+       0x80,0xff,0x2b,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xf9,0x56,0x56,0xf9,
+       0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xfa,0xf9,0x56,
+       0xfa,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xf9,0xf9,0xfa,0xf9,0xf9,
+       0x56,0xf9,0x56,0x56,0x56,0xf9,0xf9,0xfa,0xf9,0xfa,0xfa,0xf9,0xfa,0x81,0xfa,0xfa,
+       0xfa,0xfa,0xf9,0xf9,0xf9,0xfa,0xf9,0x56,0x56,0x56,0x56,0x56,0x56,0xf9,0xf9,0xf9,
+       0x56,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xfa,0xf9,0x56,0xf9,0xf9,0x56,0x56,
+       0xf9,0xf9,0x56,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,
+       0xf9,0xf9,0x56,0xf9,0x56,0x56,0xf9,0xf9,0xfa,0xf9,0xf9,0x56,0x56,0xf9,0x56,0x56,
+       0x56,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0x56,0x56,0x56,0xf9,0xfa,0xf9,0xfa,0xf9,0xf9,
+       0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xfa,0xf9,0xf9,0xfa,0xf9,0xfa,0xfa,0xf9,0xf9,0xf9,
+       0xfa,0xfa,0xfa,0xf9,0xf9,0xfa,0xfa,0xfa,0xfa,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0xfa,
+       0xf9,0xfa,0xf9,0xf9,0xf9,0xfa,0xfa,0xfa,0x81,0xfa,0xfa,0xf9,0xfa,0xf9,0xf9,0xf9,
+       0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xfa,0xf9,0xf9,0x56,0xf9,0x56,0x56,0x56,0x56,0xf9,
+       0xf9,0xf9,0x56,0xf9,0x56,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,
+       0xf9,0xf9,0x56,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0x56,0x56,0x56,0x56,
+       0xfa,0xf9,0xfa,0xf9,0x56,0x56,0xfa,0x56,0x56,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xf9,
+       0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,
+       0xfa,0xfa,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,
+       0xf9,0xf9,0xf9,0xfa,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0x56,0x56,0x56,0xf9,
+       0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xfa,0xf9,0xfa,0x56,0xf9,
+       0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0xfc,0xff,0xff,0xfc,0xab,0xab,
+       0xfb,0xfb,0xfb,0x80,0xfb,0xaa,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
+       0x80,0x80,0xff,0x2b,0xf9,0x56,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,
+       0xf9,0xfa,0xf9,0xfa,0x56,0x56,0x56,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0x56,
+       0x56,0xf9,0x56,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,
+       0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xfa,0xfa,0xf9,0xf9,0xf9,0xfa,0xfa,0xfa,0xf9,
+       0xfa,0xf9,0xf9,0xfa,0xf9,0xf9,0xfa,0xf9,0x56,0x56,0x56,0x56,0xfa,0xf9,0xf9,0xfa,
+       0x56,0x56,0x56,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0x56,0x56,0x56,0xf9,0x56,
+       0x56,0xf9,0xf9,0xf9,0x56,0x56,0xfa,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0xf9,
+       0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0x56,0xf9,0x56,0xf9,
+       0xf9,0xf9,0xf9,0xfa,0x56,0x56,0x56,0x56,0x56,0x56,0x56,0xf9,0xf9,0xf9,0x56,0x56,
+       0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xf9,
+       0xf9,0xfa,0xfa,0xf9,0xf9,0xfa,0xf9,0xf9,0xfa,0xfa,0xf9,0xfa,0xf9,0xf9,0xf9,0xfa,
+       0xfa,0xfa,0xf9,0xf9,0xfa,0xfa,0xfa,0xfa,0xfa,0xf9,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,
+       0xfa,0xfa,0xf9,0xf9,0xf9,0xfa,0xfa,0x56,0x56,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xf9,
+       0xf9,0xfa,0x56,0x56,0x56,0x56,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0x56,0x56,0xf9,
+       0xf9,0x56,0x56,0x56,0xf9,0xfa,0xf9,0xf9,0xfa,0x56,0x56,0x56,0xf9,0xf9,0xf9,0x56,
+       0xf9,0x56,0xf9,0x56,0xf9,0x56,0xf9,0x56,0x56,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xfa,
+       0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,
+       0xf9,0xf9,0x56,0x56,0xf9,0x56,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xfa,0x56,0x56,0x56,
+       0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xf9,0xfa,
+       0xf9,0xfa,0xfa,0x56,0x56,0x56,0xf9,0xf9,0x56,0x56,0xf9,0x56,0x56,0xf9,0x56,0x56,
+       0x56,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xfa,0xfc,0xff,0xff,0xfc,0xab,
+       0xab,0xab,0xfb,0xaa,0xfb,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
+       0x80,0x80,0x80,0xff,0xf6,0x56,0x56,0xf9,0x56,0x56,0x56,0xf9,0x56,0x56,0x56,0xf9,
+       0x56,0xfa,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,
+       0xf9,0x56,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0x56,
+       0xf9,0xf9,0x56,0xf9,0xf9,0xfa,0xf9,0xfa,0xfa,0xf9,0xf9,0xfa,0xfa,0xfa,0xfa,0xfa,
+       0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0x56,0x56,0xf9,0xf9,0xf9,
+       0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0x56,
+       0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xfa,0x56,0xf9,0x56,0x56,0x56,0xfa,0x56,0xf9,
+       0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xfa,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xfa,
+       0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0x56,0x56,
+       0x56,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xfa,0xfa,0xfa,0xfa,0xf9,0xfa,0xf9,
+       0xfa,0xfa,0xf9,0xfa,0xfa,0xf9,0xfa,0xf9,0xfa,0xfa,0xf9,0xf9,0xf9,0xfa,0xf9,0xfa,
+       0xfa,0xfa,0xf9,0xf9,0xf9,0xfa,0xfa,0xf9,0xfa,0xf9,0xf9,0xfa,0xfa,0xfa,0xfa,0xfa,
+       0xfa,0xf9,0xf9,0xf9,0xfa,0xfa,0xfa,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xfa,0xf9,0xf9,
+       0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xf9,0x56,0x56,0xf9,
+       0x56,0xf9,0x56,0x56,0xf9,0x56,0xfa,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0x56,
+       0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,
+       0xfa,0x56,0xf9,0x56,0x56,0x56,0xfa,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,
+       0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,
+       0xf9,0xf9,0x56,0xf9,0x56,0x56,0x56,0xf9,0x56,0x56,0xf9,0xf9,0x56,0x56,0xf9,0x56,
+       0xf9,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,
+       0x56,0xf9,0x56,0xf9,0xf9,0xfa,0xf9,0x56,0x56,0x56,0xfa,0x56,0xfc,0xff,0xff,0xab,
+       0xfb,0xab,0xfb,0xab,0x81,0xaa,0xfb,0x80,0xfb,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
+       0x80,0x80,0x80,0x80,0xff,0x2b,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xfa,
+       0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,
+       0xf9,0xf9,0x56,0xfa,0x56,0x56,0xf9,0x56,0x56,0xf9,0x56,0x56,0x56,0x56,0xf9,0x56,
+       0x56,0xf9,0xf9,0x56,0x56,0xfa,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0x81,0x81,0xfa,0xfa,
+       0xfa,0xfa,0xf9,0xf9,0xfa,0xfa,0xfa,0xfa,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0xf9,
+       0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,
+       0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,0x56,0x56,0xf9,0xf9,0x56,
+       0x56,0xf9,0x56,0x56,0x56,0xf9,0x56,0x56,0x56,0xf9,0x56,0x56,0x56,0xf9,0x56,0xf9,
+       0xf9,0xf9,0x56,0x56,0xf9,0x56,0xf9,0xfa,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,
+       0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xf9,
+       0xf9,0xf9,0xfa,0xfa,0xfa,0xfa,0xf9,0xf9,0xfa,0xfa,0xfa,0xf9,0xf9,0xfa,0xfa,0xfa,
+       0xf9,0xfa,0xfa,0xf9,0xfa,0xfa,0xfa,0xf9,0xf9,0xf9,0xf9,0xfa,0xfa,0xf9,0xf9,0xfa,
+       0xfa,0xf9,0xfa,0xfa,0xfa,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xfa,0x56,0xf9,0xfa,0xf9,
+       0x56,0x56,0xf9,0xf9,0xf9,0xfa,0xfa,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,
+       0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0x56,0x56,0xfa,0xf9,0xfa,
+       0xf9,0x56,0xf9,0xf9,0xf9,0xfa,0x56,0x56,0xfa,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0xf9,
+       0xf9,0xf9,0x56,0x56,0x56,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,
+       0x56,0x56,0xf9,0x56,0x56,0x56,0xf9,0x56,0x56,0xf9,0xf9,0x56,0x56,0xf9,0x56,0xf9,
+       0xfa,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0xf9,
+       0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xfa,
+       0x56,0x56,0xfa,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0xfa,0xf9,0x56,0xfc,0xff,0xff,
+       0xfc,0xab,0xfb,0xab,0xfb,0xaa,0xfb,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
+       0x80,0x80,0x80,0x80,0x80,0xff,0xf6,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0x56,0xf9,0xfa,
+       0xf9,0xf9,0x56,0xfa,0xf9,0x56,0x56,0x56,0x56,0xf9,0xf9,0xf9,0x56,0x56,0x56,0x56,
+       0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xf9,0x56,
+       0xf9,0x56,0xf9,0xfa,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0xfa,0xfa,
+       0xfa,0xfa,0xf9,0xf9,0xfa,0xfa,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xfa,
+       0xf9,0x56,0x56,0x56,0x56,0xf9,0xf9,0xf9,0x56,0x56,0x56,0x56,0xf9,0xf9,0x56,0x56,
+       0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xf9,
+       0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xfa,0x56,
+       0xf9,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0x56,0x56,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,
+       0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xfa,0xf9,0xf9,0xfa,0x81,0xfa,0xf9,
+       0xf9,0xf9,0xfa,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xfa,0xf9,0xf9,0xfa,0xfa,
+       0xf9,0xfa,0xfa,0xf9,0xfa,0xf9,0xfa,0xf9,0xf9,0xfa,0xf9,0xf9,0xfa,0xfa,0xfa,0xf9,
+       0xfa,0xf9,0xfa,0xfa,0xfa,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0xfa,0xfa,0xf9,0xf9,0xfa,
+       0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0xfa,0xfa,0xf9,
+       0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xf9,0x56,0xf9,
+       0x56,0x56,0x56,0x56,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,
+       0x56,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0x56,0x56,0xf9,
+       0x56,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xfa,0x56,0xf9,0xfa,0x56,0x56,0xf9,0x56,0xf9,
+       0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,
+       0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,0x56,0x56,0xf9,
+       0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xfc,0xff,
+       0xff,0xab,0xfc,0xab,0xfb,0xfb,0xfb,0x80,0xfb,0xaa,0x80,0x80,0x80,0x80,0x80,0x80,
+       0x80,0x80,0x80,0x80,0x80,0x80,0xff,0xf6,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xf9,
+       0x56,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0xfa,0xf9,0x56,0xf9,0x56,0x56,0xf9,
+       0x56,0xf9,0x56,0x56,0x56,0xf9,0x56,0xf9,0xfa,0x56,0x56,0x56,0xf9,0x56,0xfa,0xf9,
+       0xfa,0xf9,0x56,0xfa,0x56,0x56,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xfa,0xf9,0xfa,
+       0xfa,0xf9,0xf9,0xf9,0xfa,0xfa,0xfa,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0x56,0x56,0xf9,
+       0x56,0xf9,0xf9,0x56,0xf9,0xfa,0xf9,0x56,0xf9,0x56,0x56,0xf9,0x56,0xf9,0x56,0x56,
+       0x56,0xf9,0x56,0xf9,0x56,0x56,0x56,0x56,0x56,0xf9,0x56,0x56,0xf9,0x56,0xf9,0x56,
+       0xf9,0xf9,0xf9,0xfa,0x56,0xf9,0x56,0x56,0x56,0xfa,0xf9,0xfa,0xf9,0x56,0xfa,0x56,
+       0x56,0xfa,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xf9,0x56,
+       0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xfa,
+       0xfa,0xf9,0xfa,0xfa,0xfa,0xf9,0xfa,0xf9,0xf9,0xfa,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,
+       0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0xfa,0xf9,
+       0xfa,0xfa,0xfa,0xf9,0xf9,0xfa,0xfa,0xfa,0x81,0x81,0xfa,0xf9,0xfa,0xf9,0xf9,0xfa,
+       0xfa,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xfa,0xfa,0xf9,
+       0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,
+       0xf9,0xf9,0x56,0x56,0xf9,0x56,0xf9,0x56,0x56,0x56,0xf9,0x56,0xf9,0x56,0x56,0x56,
+       0x56,0x56,0xf9,0x56,0x56,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0x56,
+       0x56,0x56,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,
+       0xf9,0xf9,0x56,0xf9,0x56,0x56,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xf9,0xf9,
+       0x56,0xf9,0x56,0xf9,0xf9,0x56,0x56,0x56,0xfa,0xf9,0x56,0xf9,0x56,0x56,0xf9,0x56,
+       0xf9,0x56,0x56,0x56,0xf9,0x56,0xf9,0x56,0x56,0x56,0x56,0x56,0x56,0x56,0x56,0xfc,
+       0xff,0xff,0xab,0xab,0xab,0xab,0xaa,0xfb,0xaa,0x80,0x81,0x80,0x80,0x80,0x80,0x80,
+       0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xff,0x2b,0xfa,0xf9,0x56,0xf9,0xf9,0x56,0x56,
+       0x56,0xf9,0x56,0xf9,0x56,0x56,0xf9,0xf9,0x56,0x56,0xf9,0x56,0xf9,0xf9,0x56,0xfa,
+       0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0x56,0xf9,
+       0x56,0x56,0xf9,0xf9,0x56,0x56,0x56,0xfa,0x56,0x56,0xf9,0xf9,0xf9,0xfa,0xfa,0xfa,
+       0xfa,0xfa,0xfa,0xf9,0xf9,0xfa,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xf9,
+       0x56,0x56,0xf9,0x56,0x56,0x56,0xf9,0x56,0xf9,0xf9,0x56,0xfa,0xf9,0xf9,0xf9,0xf9,
+       0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xfa,0xf9,0xf9,
+       0xf9,0x56,0x56,0xf9,0x56,0x56,0xf9,0x56,0xf9,0x56,0xf9,0x56,0x56,0xf9,0x56,0x56,
+       0x56,0x56,0xf9,0x56,0x56,0xf9,0x56,0x56,0xf9,0xf9,0x56,0x56,0xf9,0x56,0xf9,0xf9,
+       0xf9,0x56,0x56,0xfa,0xf9,0x56,0xf9,0x56,0x56,0x56,0xf9,0x56,0x56,0xf9,0xf9,0xf9,
+       0xfa,0xf9,0xf9,0xf9,0xfa,0xf9,0xfa,0xfa,0xf9,0xfa,0xfa,0xf9,0xfa,0xfa,0xfa,0xfa,
+       0xfa,0xf9,0xf9,0xf9,0xfa,0xf9,0xfa,0xf9,0xfa,0xf9,0xf9,0xfa,0xfa,0xfa,0xfa,0xf9,
+       0xf9,0xfa,0xf9,0xf9,0xfa,0xf9,0xfa,0xf9,0xfa,0xf9,0xfa,0xfa,0xfa,0xf9,0xf9,0xf9,
+       0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xfa,0x56,0xf9,0xfa,0xf9,0xf9,0xf9,0xfa,0xf9,
+       0xf9,0xf9,0xf9,0x56,0x56,0x56,0x56,0x56,0xf9,0x56,0x56,0xf9,0x56,0x56,0xf9,0xf9,
+       0x56,0xf9,0xf9,0x56,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xf9,
+       0xf9,0x56,0xf9,0xf9,0x56,0x56,0xfa,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0x56,0x56,0x56,
+       0x56,0xf9,0x56,0xf9,0x56,0xf9,0x56,0xf9,0x56,0x56,0x56,0xfa,0x56,0x56,0xf9,0x56,
+       0x56,0xf9,0xf9,0x56,0x56,0xf9,0x56,0x56,0xfa,0xf9,0x56,0xf9,0x56,0x56,0x56,0x56,
+       0xf9,0x56,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xfa,0xf9,
+       0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xf9,0xf9,0xf9,0x56,0xfa,0x56,0x56,
+       0xfc,0xff,0xff,0xfc,0xfc,0xab,0xfb,0xfb,0x80,0xfb,0xfb,0x80,0x80,0x80,0x80,0x80,
+       0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xff,0xf6,0x56,0xf9,0x56,0x56,0x56,0xf9,
+       0x56,0x56,0x56,0x56,0xf9,0x56,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,
+       0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xf9,0x56,0x56,
+       0x56,0x56,0xf9,0x56,0x56,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xfa,0xfa,0xf9,0xfa,
+       0xfa,0xfa,0xfa,0xf9,0xfa,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0x56,0x56,
+       0x56,0x56,0x56,0x56,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,
+       0xfa,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,
+       0x56,0x56,0xf9,0x56,0x56,0xf9,0x56,0xf9,0xf9,0x56,0x56,0x56,0xf9,0x56,0x56,0xf9,
+       0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,
+       0x56,0x56,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0x56,
+       0x56,0xfa,0x81,0x81,0xfa,0xfa,0xfa,0xfa,0xf9,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,
+       0xfa,0xf9,0xf9,0xfa,0xfa,0xf9,0xfa,0xf9,0xf9,0xf9,0xfa,0xfa,0xfa,0xf9,0xf9,0xf9,
+       0xfa,0xf9,0xf9,0xfa,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,
+       0xfa,0xfa,0xf9,0xf9,0xf9,0xfa,0xfa,0xf9,0xfa,0xfa,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,
+       0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xfa,0x56,
+       0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0x56,0x56,0xf9,0xf9,
+       0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xf9,0xf9,0x56,0x56,0x56,
+       0xf9,0xfa,0x56,0x56,0x56,0x56,0x56,0x56,0x56,0xf9,0x56,0xf9,0xf9,0x56,0x56,0x56,
+       0xfa,0xf9,0xf9,0xfa,0x56,0xf9,0x56,0xf9,0xf9,0x56,0x56,0x56,0x56,0xf9,0xf9,0x56,
+       0x56,0x56,0x56,0xf9,0x56,0x56,0x56,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0x56,0xf9,0xf9,
+       0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xf9,
+       0xf9,0xfc,0xff,0xff,0xab,0xab,0xfb,0xab,0xfb,0xaa,0xfb,0x80,0xaa,0x80,0x80,0x80,
+       0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xff,0x2b,0x56,0x56,0x56,0xf9,0xf9,
+       0xf9,0xfa,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xfa,0xf9,0xf9,0x56,0xf9,0xf9,0x56,
+       0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0x56,
+       0x56,0xf9,0xfa,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,
+       0xfa,0xfa,0xfa,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xfa,0xfa,0xf9,0x56,
+       0x56,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,
+       0xf9,0x56,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xfa,0x56,0x56,0xf9,0xfa,0x56,0x56,
+       0x56,0x56,0x56,0x56,0xf9,0xf9,0x56,0x56,0x56,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0x56,
+       0x56,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0x56,0x56,0xf9,0xf9,0x56,0x56,0xf9,
+       0xf9,0x56,0x56,0xfa,0x56,0x56,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,
+       0xf9,0xf9,0xf9,0xfa,0xfa,0xfa,0xfa,0xf9,0xfa,0xf9,0xf9,0xfa,0xf9,0xfa,0xfa,0xf9,
+       0xfa,0xf9,0xf9,0xf9,0xfa,0xfa,0xfa,0xfa,0xfa,0xf9,0xfa,0xfa,0xf9,0xf9,0xf9,0xf9,
+       0xf9,0xf9,0xfa,0xfa,0xf9,0xf9,0xfa,0xfa,0xf9,0xf9,0xfa,0xfa,0xfa,0xf9,0xfa,0xfa,
+       0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xf9,0xfa,0xfa,0xfa,0xfa,0xfa,0xf9,0x81,0xfa,
+       0xfa,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0x56,0x56,0xfa,0x56,
+       0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xf9,0xf9,
+       0xf9,0xf9,0xfa,0x56,0x56,0xf9,0xfa,0x56,0x56,0x56,0x56,0x56,0x56,0x56,0xf9,0xf9,
+       0x56,0x56,0x56,0x56,0x56,0x56,0xfa,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,
+       0xf9,0x56,0x56,0x56,0x56,0xf9,0xf9,0x56,0xfa,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,
+       0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xfa,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,
+       0xf9,0xf9,0xf9,0xfa,0x56,0xf9,0x56,0x56,0xf9,0xfa,0xf9,0xf9,0xfa,0x56,0x56,0xf9,
+       0xfa,0x56,0xfb,0xff,0xff,0xfc,0xab,0xab,0xfb,0xaa,0xfb,0x80,0xaa,0xfa,0x80,0x80,
+       0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xff,0xf6,0x56,0xfa,0xf9,0xf9,
+       0xfa,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xf9,0x56,0xf9,0xf9,
+       0x56,0xf9,0x56,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0x56,0x56,0xf9,0xf9,
+       0x56,0xfa,0xf9,0xf9,0x56,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,
+       0xfa,0xfa,0x81,0xfa,0xfa,0xfa,0xfa,0xf9,0xf9,0xfa,0xfa,0xfa,0xfa,0xf9,0xf9,0x56,
+       0x56,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0x56,0xf9,
+       0x56,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xf9,0xf9,0x56,
+       0x56,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0x56,0x56,0xf9,0xf9,0x56,0xfa,0xf9,0xf9,0xf9,
+       0x56,0xf9,0x56,0xfa,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,
+       0xf9,0x56,0xf9,0xf9,0xfa,0x56,0x56,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0x56,0xf9,
+       0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0xfa,0xf9,0xfa,0xf9,0xfa,0xf9,0xfa,0xfa,0xf9,0xf9,
+       0xfa,0xf9,0xf9,0xf9,0xfa,0xfa,0xf9,0xf9,0xfa,0xf9,0xf9,0xfa,0xfa,0xf9,0xf9,0xf9,
+       0xfa,0xfa,0xfa,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0xfa,0xfa,0xfa,0xf9,0xf9,0xf9,
+       0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0x81,0xfa,0xfa,0x81,0x81,
+       0xf9,0xf9,0x81,0xfa,0xfa,0xfa,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,
+       0x56,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0x56,0xf9,
+       0xf9,0xf9,0x56,0xf9,0x56,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,
+       0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0x56,0x56,0x56,0xfa,0xf9,0xf9,0xf9,
+       0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xfa,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xfa,
+       0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0x56,0xf9,0x56,0xf9,
+       0x56,0xf9,0xf9,0x56,0x56,0xf9,0x56,0x56,0x56,0xf9,0xf9,0x56,0x56,0xf9,0x56,0x56,
+       0xf9,0xf9,0x56,0xfc,0xff,0xff,0xac,0xfc,0xab,0xfb,0xfb,0xfb,0xfb,0x80,0xfb,0x80,
+       0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xff,0x2b,0xf9,0xf9,0x56,
+       0xfa,0x56,0xf9,0x56,0x56,0x56,0xfa,0xfa,0x56,0xfa,0xfa,0xf9,0x56,0xf9,0xf9,0xf9,
+       0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xfa,0x56,0x56,0xf9,0xf9,0x56,0x56,0x56,0xfa,
+       0xf9,0xf9,0xf9,0x56,0x56,0x56,0x56,0xf9,0x56,0xf9,0x56,0xf9,0xfa,0xf9,0xf9,0xf9,
+       0xf9,0xfa,0x81,0xfa,0xfa,0xfa,0xf9,0xf9,0xf9,0xfa,0xfa,0xf9,0xfa,0xf9,0xf9,0x56,
+       0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,
+       0xf9,0x56,0x56,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0x56,0x56,0x56,0x56,0xf9,0xfa,0x56,
+       0x56,0xfa,0x56,0xfa,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xfa,0xf9,0xf9,0x56,0x56,0x56,
+       0x56,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xfa,0x56,0x56,0x56,0xf9,0xf9,0xfa,0xf9,0xf9,
+       0x56,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xfa,0xf9,0x56,0xfa,0x56,0xf9,0x56,0x56,0x56,
+       0xfa,0xf9,0xf9,0xfa,0xfa,0xf9,0xfa,0xfa,0xfa,0xfa,0xfa,0xf9,0xfa,0xf9,0xfa,0xf9,
+       0xf9,0xfa,0xfa,0xf9,0xfa,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0xfa,0xfa,0xf9,0xf9,0xfa,
+       0xfa,0xfa,0xfa,0xf9,0xfa,0xf9,0xf9,0xf9,0xfa,0xfa,0xfa,0xfa,0xf9,0xf9,0xf9,0xf9,
+       0xfa,0xf9,0xfa,0xf9,0xfa,0x81,0xfa,0xfa,0xfa,0xfa,0xfa,0x81,0xfa,0xfa,0xfa,0xfa,
+       0xf9,0xfa,0xfa,0xfa,0xf9,0xfa,0x56,0x56,0x56,0x56,0x56,0xf9,0xfa,0xf9,0xf9,0xfa,
+       0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,0x56,0xfa,0x56,0x56,0xf9,
+       0xf9,0xf9,0x56,0x56,0x56,0x56,0xf9,0xfa,0x56,0x56,0xfa,0x56,0xfa,0xf9,0xf9,0xf9,
+       0xf9,0x56,0x56,0xfa,0xf9,0xf9,0xf9,0x56,0x56,0x56,0x56,0xf9,0xf9,0x56,0x56,0xf9,
+       0xfa,0x56,0xf9,0x56,0xf9,0xf9,0xfa,0xf9,0xf9,0x56,0x56,0x56,0xfa,0xf9,0x56,0xfa,
+       0x56,0xf9,0x56,0x56,0x56,0xfa,0xf9,0xf9,0xf9,0xfa,0xf9,0x56,0xf9,0x56,0xfa,0xf9,
+       0x56,0xf9,0xf9,0x56,0x56,0x56,0xfa,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,0x56,0x56,
+       0xf9,0xfa,0x56,0x56,0xfc,0xff,0xff,0xab,0xab,0xab,0xab,0xab,0x80,0xaa,0xfb,0x80,
+       0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xff,0x2b,0xfa,0x56,
+       0x56,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xf9,0x56,0x56,0x56,0x56,0xf9,0xf9,0xf9,0xf9,
+       0xf9,0x56,0x56,0xf9,0x56,0x56,0xf9,0xfa,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xfa,
+       0xf9,0x56,0x56,0xf9,0xf9,0x56,0xfa,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,
+       0xf9,0xf9,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xf9,0xfa,0xfa,0xf9,0xf9,0xfa,0xf9,0xf9,
+       0x56,0x56,0x56,0xf9,0x56,0x56,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,
+       0x56,0x56,0xf9,0xf9,0xfa,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xf9,0x56,0xf9,0xfa,0xf9,
+       0x56,0x56,0xf9,0x56,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xfa,0xf9,0xf9,0x56,0xf9,0xf9,
+       0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0x56,0x56,0xf9,0xf9,0x56,
+       0xf9,0xf9,0x56,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0x56,
+       0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xfa,0xfa,0x81,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,
+       0xf9,0xfa,0xfa,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0xfa,0xf9,0xf9,0xfa,0xfa,0xf9,0xf9,
+       0xfa,0xf9,0xfa,0xfa,0xfa,0xf9,0xfa,0xfa,0xfa,0xfa,0xf9,0xf9,0xfa,0xf9,0xfa,0xfa,
+       0xfa,0xfa,0xfa,0xf9,0xfa,0xfa,0xfa,0xf9,0xf9,0xf9,0xf9,0xfa,0xfa,0xf9,0xfa,0xfa,
+       0xfa,0xf9,0xfa,0xfa,0xf9,0xf9,0xfa,0xf9,0x56,0x56,0x56,0x56,0xfa,0x56,0x56,0x56,
+       0xf9,0x56,0xf9,0x56,0xf9,0xfa,0x56,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,
+       0x56,0xf9,0x56,0x56,0xf9,0x56,0xf9,0xfa,0xf9,0x56,0x56,0xf9,0x56,0xf9,0xf9,0x56,
+       0x56,0xf9,0x56,0xfa,0xf9,0x56,0x56,0xf9,0x56,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,
+       0xf9,0xf9,0x56,0x56,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,
+       0xf9,0xf9,0x56,0xf9,0x56,0x56,0xf9,0xf9,0x56,0x56,0xf9,0x56,0xf9,0x56,0xfa,0xf9,
+       0x56,0x56,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0x56,0x56,0xf9,0xf9,
+       0xf9,0xf9,0xf9,0x56,0xf9,0xfc,0xff,0xff,0xfc,0xfb,0xab,0xfb,0xfb,0xfb,0xfb,0x80,
+       0xaa,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xff,0x2b,0xf9,
+       0x56,0xfa,0xf9,0xf9,0x56,0x56,0x56,0xf9,0xfa,0x56,0x56,0xf9,0x56,0xf9,0x56,0xf9,
+       0xf9,0x56,0x56,0xf9,0xf9,0x56,0xfa,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0x56,0x56,0xf9,
+       0xf9,0x56,0xf9,0xf9,0x56,0xfa,0xf9,0xfa,0x56,0x56,0xf9,0xf9,0x56,0xfa,0xf9,0xf9,
+       0xf9,0xf9,0xf9,0xfa,0xfa,0xfa,0xfa,0xfa,0xf9,0xf9,0xfa,0xfa,0xf9,0xfa,0xfa,0xf9,
+       0xf9,0x56,0x56,0x56,0xf9,0x56,0x56,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xf9,
+       0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0x56,0x56,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,
+       0x56,0x56,0xf9,0xf9,0x56,0xfa,0xf9,0x56,0x56,0x56,0xf9,0xf9,0x56,0x56,0xf9,0x56,
+       0xf9,0xfa,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xf9,
+       0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xfa,0x56,0x56,0x56,
+       0x56,0x56,0xfa,0x56,0x56,0xf9,0xf9,0xf9,0xfa,0xfa,0xfa,0xf9,0xf9,0xf9,0xfa,0xfa,
+       0xfa,0x81,0xfa,0xfa,0xf9,0xfa,0xf9,0xf9,0xfa,0xf9,0xfa,0xfa,0x81,0xfa,0xf9,0xf9,
+       0xfa,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0xfa,0xfa,0xf9,0xfa,0xfa,0xf9,0xfa,0xfa,
+       0xfa,0xf9,0xfa,0xf9,0xfa,0xfa,0xfa,0xf9,0xf9,0xf9,0xf9,0xfa,0xfa,0xfa,0xfa,0xf9,
+       0xfa,0xf9,0xf9,0xfa,0xf9,0xf9,0xfa,0xfa,0x56,0x56,0x56,0x56,0xf9,0xf9,0x56,0x56,
+       0x56,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0x56,
+       0x56,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xfa,0x56,
+       0xf9,0x56,0x56,0xf9,0xfa,0x56,0xf9,0xf9,0x56,0xf9,0xfa,0xf9,0xf9,0x56,0xf9,0xf9,
+       0xf9,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,
+       0xf9,0xfa,0xf9,0x56,0x56,0x56,0x56,0xfa,0x56,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,
+       0x56,0x56,0x56,0xfa,0x56,0xfa,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xf9,0xf9,0xf9,
+       0xf9,0xfa,0xf9,0xf9,0x56,0xf9,0xfc,0xff,0xff,0xab,0xab,0xab,0xfb,0xaa,0xaa,0x80,
+       0xfb,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xff,0x2b,
+       0x56,0x56,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0x56,0x56,0x56,0xf9,0xf9,0xf9,0x56,0xf9,
+       0x56,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0x56,0x56,0x56,0x56,0x56,0x56,0x56,0x56,0x56,
+       0xf9,0x56,0x56,0x56,0x56,0x56,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0x56,0x56,0xf9,0xf9,
+       0xf9,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,
+       0xf9,0xf9,0x56,0x56,0x56,0x56,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xf9,
+       0xf9,0xf9,0xf9,0xf9,0x56,0x56,0x56,0x56,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0x56,
+       0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0x56,0x56,0x56,0x56,0xf9,0x56,0x56,0x56,0x56,
+       0x56,0xf9,0x56,0xf9,0x56,0x56,0xf9,0x56,0x56,0xfa,0x56,0x56,0xf9,0xf9,0xf9,0x56,
+       0x56,0xf9,0x56,0xf9,0xf9,0x56,0x56,0x56,0x56,0xf9,0x56,0x56,0xfa,0x56,0xf9,0xf9,
+       0x56,0xf9,0xf9,0x56,0x56,0xf9,0xfa,0xf9,0xf9,0xf9,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,
+       0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xfa,0xfa,0xf9,0xf9,0xf9,0xfa,0xf9,
+       0xfa,0xfa,0xfa,0xfa,0x81,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,
+       0xfa,0xf9,0xfa,0xf9,0xfa,0xf9,0xf9,0xfa,0xfa,0xf9,0xfa,0xfa,0xfa,0xf9,0xf9,0xf9,
+       0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0x56,0x56,0x56,0xf9,0x56,
+       0xf9,0xfa,0xf9,0x56,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0x56,0x56,
+       0x56,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,
+       0x56,0x56,0x56,0x56,0xf9,0x56,0x56,0x56,0x56,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,
+       0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0x56,0x56,0xf9,0x56,
+       0x56,0xfa,0x56,0x56,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,
+       0x56,0xf9,0xf9,0xfa,0xf9,0xf9,0x56,0x56,0x56,0x56,0x56,0x56,0x56,0xf9,0xf9,0xf9,
+       0xf9,0x56,0x56,0xf9,0x56,0xf9,0xf9,0xfc,0xff,0xff,0xfc,0xfc,0xab,0xfb,0xfb,0xfb,
+       0xaa,0x80,0xfb,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xff,
+       0x2b,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,
+       0x56,0xf9,0x56,0x56,0xf9,0xf9,0x56,0x56,0x56,0x56,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,
+       0xf9,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xfa,
+       0xf9,0x56,0xf9,0xfa,0xf9,0xfa,0xfa,0xfa,0xf9,0xfa,0xf9,0xfa,0xfa,0xfa,0xf9,0xf9,
+       0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0x56,
+       0xf9,0xf9,0xf9,0x56,0x56,0x56,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,
+       0x56,0x56,0x56,0x56,0xf9,0x56,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,
+       0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,
+       0xf9,0xf9,0x56,0x56,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xfa,0xf9,0xf9,0x56,0xf9,0x56,
+       0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0xfa,0xfa,0xfa,0xfa,0xfa,
+       0xfa,0xf9,0xf9,0xf9,0xfa,0xfa,0xfa,0xfa,0xf9,0xfa,0xfa,0xf9,0xfa,0xf9,0xfa,0xf9,
+       0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0xfa,0xfa,0xf9,0xfa,0xfa,0xfa,0xf9,0xf9,0xfa,
+       0xfa,0xf9,0xfa,0xf9,0xf9,0xfa,0xf9,0xf9,0xfa,0xf9,0xf9,0xfa,0xfa,0xf9,0xfa,0xf9,
+       0xfa,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0x56,0x56,0x56,0x56,0xf9,0xf9,0x56,
+       0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xf9,
+       0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0x56,0x56,0x56,0x56,0xf9,0x56,0xf9,
+       0x56,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,
+       0xf9,0xf9,0x56,0xfa,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0xfa,
+       0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0x56,0xf9,
+       0x56,0xf9,0x56,0x56,0xf9,0xf9,0x56,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,
+       0x56,0x56,0xf9,0xf9,0x56,0x56,0x56,0xf9,0xfc,0xff,0xff,0xfc,0xab,0xab,0xab,0xab,
+       0x80,0xfb,0xfb,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
+       0xff,0x2b,0x56,0xf9,0xf9,0x56,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xfa,0xf9,0x56,0xf9,
+       0x56,0xfa,0xf9,0xf9,0x56,0x56,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xfa,
+       0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xfa,0xfa,0xf9,0xf9,0xf9,0x56,0x56,0xfa,0x56,0xf9,
+       0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xfa,0xfa,0x81,0xfa,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,
+       0xf9,0xf9,0x56,0x56,0xf9,0x56,0x56,0xf9,0xfa,0xf9,0x56,0xf9,0x56,0xfa,0xf9,0xf9,
+       0x56,0x56,0xf9,0x56,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,
+       0xfa,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xfa,0xf9,0x56,0xf9,0xfa,0xf9,
+       0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0x56,0x56,0xfa,0x56,0xf9,0xfa,0x56,0x56,0xf9,0x56,
+       0xf9,0x56,0xf9,0xfa,0xf9,0x56,0xfa,0xf9,0x56,0x56,0x56,0x56,0x56,0x56,0xf9,0x56,
+       0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0xfa,0xfa,0xfa,0xf9,0xf9,
+       0xf9,0xf9,0xf9,0xf9,0xfa,0xfa,0xfa,0xfa,0xf9,0xf9,0xfa,0xfa,0xf9,0xfa,0xfa,0xfa,
+       0xf9,0xfa,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0xfa,0xfa,0xfa,0xf9,0xfa,0xfa,0xfa,0xfa,
+       0xfa,0xfa,0xfa,0xf9,0xf9,0xf9,0xfa,0xfa,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,
+       0xfa,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0x56,0x56,0xf9,0xf9,0x56,
+       0xf9,0xfa,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0x56,0x56,0x56,0xf9,
+       0xf9,0xf9,0xf9,0x56,0x56,0xfa,0xf9,0x56,0xf9,0xfa,0xf9,0x56,0xf9,0x56,0xf9,0xf9,
+       0x56,0x56,0xf9,0xfa,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xfa,0xfa,0xf9,0xf9,0xf9,0x56,
+       0x56,0xfa,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,
+       0x56,0x56,0x56,0xf9,0x56,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,
+       0xf9,0xf9,0xf9,0x56,0x56,0x56,0x56,0x56,0x56,0xf9,0xfa,0xf9,0xf9,0x56,0x56,0xfa,
+       0xf9,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0xfc,0xff,0xff,0xab,0xfc,0xab,0xfb,
+       0xfb,0xfb,0xfb,0x80,0x80,0xfb,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
+       0x80,0xff,0x2b,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0x56,0x56,0x56,0x56,0x56,
+       0xf9,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,
+       0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,
+       0x56,0xf9,0xf9,0xf9,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xf9,0xfa,0xfa,0xf9,0xfa,0xf9,
+       0xfa,0xfa,0xfa,0xfa,0x56,0x56,0x56,0x56,0x56,0x56,0x56,0x56,0xf9,0xf9,0x56,0xf9,
+       0x56,0xf9,0xf9,0x56,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xfa,0xf9,0x56,
+       0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,
+       0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,
+       0xf9,0xf9,0x56,0x56,0x56,0x56,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,
+       0xf9,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xf9,0x56,0x56,0xfa,0xf9,0xf9,0xfa,0xfa,0xfa,
+       0xfa,0xfa,0xfa,0xfa,0xfa,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0xfa,0xfa,
+       0xf9,0xfa,0xfa,0xfa,0xfa,0xfa,0xf9,0xf9,0xfa,0xfa,0xf9,0xf9,0xfa,0xfa,0xf9,0xf9,
+       0xfa,0xfa,0xf9,0xf9,0xfa,0xf9,0xfa,0xfa,0xf9,0xf9,0xfa,0xf9,0xf9,0xfa,0xfa,0xf9,
+       0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0x56,0x56,
+       0x56,0xf9,0x56,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xfa,0xf9,
+       0xf9,0xf9,0xf9,0x56,0x56,0x56,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,
+       0xf9,0x56,0x56,0xf9,0xf9,0x56,0x56,0x56,0xfa,0xf9,0x56,0xf9,0x56,0x56,0xf9,0x56,
+       0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xf9,
+       0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xf9,0x56,0x56,0x56,0xf9,
+       0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0x56,0x56,
+       0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xfc,0xff,0xff,0xfc,0xab,0xab,
+       0xfb,0xaa,0xaa,0x80,0xaa,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
+       0x80,0x80,0xff,0x2b,0xf9,0x56,0xf9,0xf9,0x56,0xfa,0xf9,0x56,0xfa,0xf9,0xf9,0xf9,
+       0xf9,0xfa,0x56,0x56,0x56,0x56,0x56,0x56,0x56,0xf9,0xf9,0x56,0x56,0xfa,0x56,0xf9,
+       0xf9,0xf9,0xf9,0x56,0xf9,0xfa,0x56,0xf9,0x56,0x56,0x56,0x56,0x56,0x56,0xf9,0xf9,
+       0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xfa,0xfa,0xf9,0xf9,0xf9,0xfa,0xfa,0xf9,
+       0xfa,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0x56,0x56,
+       0x56,0x56,0x56,0x56,0x56,0xfa,0xf9,0x56,0x56,0xfa,0x56,0xf9,0xf9,0xf9,0x56,0xf9,
+       0x56,0xf9,0x56,0xf9,0x56,0x56,0x56,0xfa,0x56,0x56,0xfa,0xf9,0xfa,0xf9,0x56,0xf9,
+       0xfa,0xf9,0x56,0xf9,0x56,0x56,0x56,0x56,0x56,0xf9,0xf9,0x56,0xf9,0x56,0x56,0x56,
+       0x56,0x56,0x56,0xf9,0xf9,0x56,0x56,0x56,0x56,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0x56,
+       0xf9,0x56,0x56,0xf9,0xf9,0x56,0xfa,0xf9,0xf9,0xf9,0xfa,0xfa,0xf9,0xf9,0xf9,0xf9,
+       0xfa,0xf9,0xf9,0xfa,0xfa,0xf9,0xf9,0xfa,0xfa,0xf9,0xfa,0xfa,0xfa,0xfa,0xf9,0xf9,
+       0xf9,0xfa,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0xfa,0xfa,0xfa,0xfa,0xf9,0xfa,0xfa,0xfa,
+       0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,
+       0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0x56,0x56,0x56,0x56,0x56,0xf9,0xf9,
+       0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0x56,0x56,0x56,0x56,0x56,0x56,0x56,0xfa,0xf9,
+       0x56,0x56,0xfa,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0x56,0x56,0x56,
+       0xfa,0x56,0x56,0xfa,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,0x56,
+       0x56,0x56,0xf9,0xf9,0x56,0xf9,0x56,0x56,0x56,0xf9,0x56,0x56,0xf9,0x56,0x56,0x56,
+       0xf9,0xf9,0x56,0xf9,0x56,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,
+       0xfa,0x56,0x56,0x56,0x56,0x56,0x56,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,
+       0xf9,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0x56,0x56,0xf9,0xf9,0xfc,0xff,0xff,0xab,0xfc,
+       0xab,0xfb,0xfb,0xfb,0xfb,0x80,0xfb,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
+       0x80,0x80,0x80,0xff,0xf6,0xf9,0xf9,0x56,0x56,0x56,0x56,0x56,0xf9,0xf9,0xf9,0x56,
+       0xfa,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xfa,0xf9,0xf9,0xf9,0xfa,0x56,
+       0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0xfa,
+       0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0x81,0xfa,0x81,0xfa,0xfa,0xf9,0xf9,
+       0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xfa,0x56,0x56,
+       0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0xfa,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,
+       0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xfa,0x56,0x56,0xf9,0xfa,0x56,0x56,0x56,0xf9,
+       0xf9,0x56,0x56,0xf9,0x56,0xf9,0x56,0xf9,0x56,0xf9,0xfa,0xf9,0x56,0xf9,0xf9,0x56,
+       0xf9,0x56,0x56,0xfa,0xf9,0xf9,0xfa,0xf9,0xf9,0xfa,0xf9,0xf9,0x56,0x56,0xf9,0xf9,
+       0xf9,0x56,0xf9,0x56,0xf9,0x56,0x56,0xfa,0xf9,0xf9,0xfa,0xfa,0xf9,0xf9,0xf9,0xfa,
+       0xfa,0xfa,0xfa,0xf9,0xfa,0xfa,0xf9,0x81,0xfa,0xfa,0xf9,0xf9,0xfa,0xf9,0xfa,0xfa,
+       0xfa,0xfa,0xfa,0xf9,0xf9,0xfa,0xfa,0xf9,0xfa,0xfa,0xfa,0xf9,0xf9,0xfa,0xfa,0xf9,
+       0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,
+       0xf9,0xfa,0xfa,0xf9,0xfa,0xf9,0xf9,0x56,0x56,0x56,0xf9,0x56,0x56,0x56,0x56,0xf9,
+       0x56,0x56,0xfa,0xf9,0x56,0xf9,0xfa,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,
+       0xf9,0xf9,0xf9,0xfa,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,
+       0xfa,0x56,0x56,0xf9,0xfa,0x56,0x56,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,
+       0xf9,0x56,0xf9,0xfa,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xfa,0xf9,0xf9,0xfa,
+       0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0x56,0x56,0xfa,0xf9,0x56,0xfa,
+       0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0xfa,0xf9,0xf9,0xfa,0xfa,0x56,0xf9,
+       0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xfb,0xff,0xff,0xfc,
+       0xab,0xfb,0xab,0xaa,0xfb,0xaa,0xfb,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
+       0x80,0x80,0x80,0x80,0xff,0x2b,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,
+       0x56,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xf9,0x56,
+       0x56,0x56,0x56,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,
+       0xfa,0x56,0xf9,0x56,0xf9,0xf9,0xfa,0xf9,0xfa,0xfa,0xf9,0xf9,0xfa,0xf9,0xf9,0xfa,
+       0xfa,0xfa,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,
+       0xf9,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xf9,0x56,0x56,0x56,0x56,0x56,
+       0x56,0x56,0xf9,0x56,0xfa,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,
+       0xf9,0x56,0x56,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0x56,
+       0xf9,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xf9,0x56,0x56,0xf9,0x56,0x56,0xfa,0xf9,0xf9,
+       0xf9,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,
+       0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0xfa,
+       0xf9,0xf9,0xfa,0xfa,0xf9,0xf9,0xfa,0xf9,0xfa,0xfa,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,
+       0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,
+       0xf9,0xf9,0xf9,0x56,0x56,0x56,0x56,0x56,0xf9,0xf9,0x56,0x56,0x56,0xf9,0x56,0x56,
+       0x56,0x56,0xfa,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0x56,0xf9,
+       0xf9,0x56,0x56,0xf9,0x56,0x56,0x56,0x56,0x56,0x56,0x56,0xf9,0x56,0xfa,0xf9,0x56,
+       0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0x56,0x56,0xf9,0xf9,0x56,
+       0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xf9,0xfa,0xf9,0x56,0xf9,0x56,0x56,
+       0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0x56,0xfa,0xf9,0x56,0xf9,
+       0x56,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0x56,0x56,0x56,0x56,
+       0x56,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xfa,0xf9,0x56,0x56,0xfa,0x56,0xfc,0xff,0xff,
+       0xab,0xfc,0xab,0xab,0xfb,0xfb,0x80,0x80,0xaa,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
+       0x80,0x80,0x80,0x80,0x80,0xff,0x2b,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,
+       0x56,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,
+       0x56,0xf9,0xf9,0xfa,0x56,0xfa,0xf9,0x56,0x56,0xf9,0xfa,0x56,0x56,0x56,0xfa,0x56,
+       0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xfa,0xfa,0xf9,0xfa,0xfa,0xfa,0xfa,0xfa,0xf9,0xfa,
+       0xfa,0xf9,0xfa,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0x56,0x56,
+       0xf9,0xf9,0x56,0xf9,0x56,0xfa,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xfa,0xf9,
+       0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xf9,0x56,0x56,0x56,0xf9,0x56,0x56,0x56,
+       0xfa,0xf9,0x56,0x56,0xf9,0xfa,0x56,0x56,0x56,0xfa,0x56,0x56,0xf9,0xf9,0x56,0x56,
+       0x56,0xfa,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0x56,0xf9,0x56,0x56,0xfa,0x56,
+       0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,
+       0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0xfa,0xfa,0xf9,0xfa,
+       0xf9,0xf9,0xfa,0xfa,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xfa,
+       0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0xfa,0xf9,0xf9,0x56,0xf9,0xfa,
+       0xf9,0x56,0x56,0x56,0x56,0x56,0x56,0x56,0x56,0xf9,0x56,0xf9,0x56,0x56,0xf9,0xf9,
+       0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0x56,0xfa,0xf9,
+       0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xfa,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,
+       0x56,0xf9,0x56,0x56,0xf9,0x56,0x56,0x56,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xfa,0x56,
+       0x56,0x56,0xfa,0x56,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xf9,0xf9,0x56,0xf9,0x56,0xf9,
+       0x56,0xf9,0x56,0xfa,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xfa,0x56,0xf9,
+       0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,
+       0x56,0xfa,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xf9,0x56,0x56,0xfc,0xff,
+       0xff,0xfc,0xab,0xab,0xfb,0xfb,0xaa,0xfb,0xfb,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
+       0x80,0x80,0x80,0x80,0x80,0x80,0xff,0xf6,0x56,0x56,0xfa,0xf9,0x56,0xf9,0x56,0xf9,
+       0xf9,0xf9,0x56,0x56,0xf9,0x56,0x56,0x56,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,
+       0x56,0x56,0x56,0xfa,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0x56,0x56,0xfa,0xf9,
+       0x56,0x56,0xfa,0x56,0x56,0xf9,0xfa,0xfa,0xf9,0x56,0x81,0xfa,0xfa,0xfa,0xfa,0xfa,
+       0xf9,0xfa,0xfa,0xf9,0xf9,0xf9,0xfa,0xfa,0x56,0x56,0x56,0xf9,0x56,0xf9,0x56,0x56,
+       0xf9,0x56,0x56,0x56,0x56,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,
+       0xf9,0x56,0x56,0xf9,0xfa,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,
+       0xf9,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0x56,0x56,0xfa,0xf9,0xf9,0x56,0xfa,0x56,0x56,
+       0x56,0xfa,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xfa,0x56,0xf9,0xf9,0xf9,0xf9,0x56,
+       0xf9,0xf9,0x56,0x56,0xfa,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,
+       0xf9,0xfa,0xf9,0xfa,0xfa,0xfa,0xf9,0xfa,0xf9,0xfa,0xfa,0xf9,0xfa,0xfa,0xf9,0xfa,
+       0xf9,0xfa,0xfa,0xfa,0xf9,0xf9,0xfa,0xf9,0xf9,0xfa,0xf9,0xf9,0xfa,0xf9,0xf9,0xfa,
+       0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0xfa,0xfa,0xf9,0xf9,0xfa,0xf9,0x56,0x56,0xf9,
+       0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0x56,0x56,0x56,0x56,0xf9,
+       0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xf9,0x56,0x56,0x56,0x56,0xf9,0x56,
+       0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xfa,0x56,0xf9,0x56,0xf9,0xfa,0xf9,0x56,
+       0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xfa,0xf9,0x56,0xf9,0xf9,0xf9,
+       0x56,0x56,0xfa,0xf9,0x56,0x56,0xfa,0x56,0x56,0xf9,0xf9,0xfa,0x56,0x56,0xf9,0xf9,
+       0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xfa,0xf9,0x56,0xf9,0x56,0x56,0xf9,
+       0x56,0xf9,0x56,0x56,0xf9,0x56,0x56,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,
+       0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xfa,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xfc,
+       0xff,0xff,0xab,0xfc,0xab,0xfb,0xfb,0x80,0xaa,0x80,0xfb,0x80,0x80,0x80,0x80,0x80,
+       0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xff,0x2b,0x56,0xf9,0xf9,0xf9,0x56,0x56,0x56,
+       0x56,0x56,0xf9,0xf9,0x56,0xfa,0xf9,0xfa,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,
+       0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xfa,0x56,0xf9,0xf9,
+       0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xfa,0xf9,0xf9,0xfa,0x81,0xf9,0xfa,0x81,0xfa,
+       0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0xfa,0xf9,0x56,0x56,0x56,0x56,0x56,0xf9,0xf9,
+       0x56,0xfa,0xf9,0xfa,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xf9,
+       0xf9,0x56,0x56,0x56,0xf9,0x56,0xf9,0x56,0x56,0xf9,0x56,0xfa,0xf9,0xf9,0xf9,0xfa,
+       0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xfa,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xfa,0xf9,
+       0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xfa,0x56,0x56,0xfa,0xf9,0x56,0xf9,0xf9,0x56,0xf9,
+       0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0xfa,
+       0x81,0x81,0xfa,0xfa,0xfa,0xfa,0xf9,0xfa,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,
+       0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xfa,0xfa,0xfa,0xfa,0xf9,0xf9,
+       0xfa,0xf9,0xf9,0xfa,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xf9,
+       0xf9,0x56,0x56,0xf9,0xf9,0x56,0x56,0xf9,0x56,0x56,0x56,0xf9,0xf9,0x56,0x56,0xf9,
+       0xfa,0x56,0x56,0x56,0x56,0x56,0xf9,0xf9,0xf9,0x56,0xfa,0xf9,0xfa,0xf9,0x56,0xf9,
+       0xf9,0x56,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xf9,0xf9,0x56,0x56,0x56,0xf9,0x56,0xf9,
+       0x56,0x56,0xf9,0x56,0xfa,0xf9,0xf9,0xf9,0xfa,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,
+       0xfa,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xfa,0xf9,0x56,0xf9,0xfa,0x56,0x56,0xf9,0xfa,
+       0x56,0x56,0xfa,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xf9,
+       0x56,0xf9,0x56,0xf9,0xfa,0xf9,0xf9,0xf9,0x56,0xfa,0x56,0xf9,0xf9,0x56,0x56,0xf9,
+       0x56,0x56,0x56,0xf9,0x56,0x56,0x56,0xf9,0xf9,0x56,0x56,0x56,0xf9,0x56,0xfa,0xf9,
+       0xfc,0xff,0xff,0xfc,0xab,0xab,0xab,0xaa,0xfb,0xfb,0xfb,0x80,0x80,0x80,0x80,0x80,
+       0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xff,0x2b,0x56,0xf9,0xf9,0x56,0x56,0x56,
+       0xfa,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0x56,0x56,0x56,0xf9,0xf9,0xf9,0xfa,0x56,
+       0x56,0x56,0xf9,0xf9,0xf9,0xfa,0xf9,0x56,0xf9,0x56,0x56,0x56,0x56,0xf9,0xf9,0x56,
+       0xf9,0x56,0xf9,0x56,0xf9,0x56,0xf9,0x56,0xfa,0xf9,0xf9,0xfa,0xfa,0xfa,0xfa,0xfa,
+       0xf9,0xf9,0xfa,0xfa,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,
+       0x56,0xf9,0x56,0xf9,0x56,0x56,0xf9,0x56,0xf9,0xf9,0xfa,0x56,0x56,0x56,0xf9,0xf9,
+       0xf9,0xfa,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0x56,
+       0x56,0x56,0x56,0xf9,0x56,0x56,0x56,0x56,0xf9,0xf9,0x56,0x56,0x56,0xf9,0xf9,0x56,
+       0x56,0xf9,0x56,0xf9,0xf9,0x56,0xfa,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0x56,
+       0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xfa,0xfa,0xf9,0xfa,0xf9,0xfa,
+       0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xf9,0xf9,0xfa,0xf9,0xfa,0xfa,0xfa,
+       0xfa,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,
+       0xf9,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0x56,0x56,0x56,0x56,0xf9,0x56,0x56,0x56,0x56,
+       0x56,0xf9,0x56,0x56,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,
+       0xf9,0x56,0x56,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0x56,0x56,0xf9,
+       0x56,0xf9,0xf9,0xfa,0x56,0x56,0x56,0xf9,0xf9,0xf9,0xfa,0xf9,0x56,0xf9,0xf9,0xf9,
+       0x56,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0x56,0x56,0x56,0xf9,0x56,0x56,0x56,
+       0x56,0xf9,0xf9,0x56,0x56,0x56,0xf9,0xf9,0x56,0x56,0xf9,0x56,0xf9,0xf9,0x56,0xfa,
+       0xf9,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xfa,0x56,0xf9,0xf9,0x56,0x56,0x56,0x56,0xf9,
+       0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0x56,
+       0x56,0xf9,0xf9,0xf9,0xfa,0xf9,0x56,0xf9,0xf9,0x56,0x56,0x56,0xf9,0x56,0xf9,0x56,
+       0xf9,0xfc,0xff,0xff,0xab,0xfc,0xab,0xfb,0xfb,0xfb,0xaa,0x80,0x80,0x80,0x80,0x80,
+       0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xff,0x2b,0xf9,0x56,0x56,0x56,0xf9,
+       0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xf9,0x56,0x56,0x56,0xf9,0x56,0xf9,
+       0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xfa,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,
+       0x56,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xfa,0xf9,0xf9,0xfa,0xfa,0xf9,0xfa,
+       0xfa,0xfa,0xfa,0xf9,0xfa,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0x56,0x56,
+       0xf9,0xf9,0x56,0x56,0x56,0xf9,0x56,0x56,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,
+       0xf9,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xfa,0xf9,0xf9,0x56,0x56,0xf9,
+       0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0x56,
+       0x56,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0x56,0xf9,
+       0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0xfa,0xfa,
+       0xfa,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0xfa,0xf9,0xfa,0xfa,0xf9,0xfa,0xfa,0xfa,0xfa,
+       0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xfa,0xfa,0xfa,0xf9,0xf9,0xf9,0xfa,0xf9,
+       0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xf9,0x56,0xf9,0x56,0xf9,0x56,0x56,0x56,
+       0xf9,0x56,0xf9,0x56,0x56,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,
+       0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xfa,0x56,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xf9,0x56,
+       0x56,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0xf9,
+       0x56,0x56,0xf9,0xfa,0xf9,0xf9,0x56,0x56,0xf9,0xfa,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,
+       0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0x56,0xfa,0x56,0xf9,
+       0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,
+       0xfa,0x56,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xf9,0x56,0x56,0x56,0xf9,0xf9,0xf9,0x56,
+       0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0x56,0x56,0x56,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xfa,
+       0xf9,0x56,0xfc,0xff,0xff,0xfc,0xab,0xab,0xfb,0xaa,0xfb,0x80,0xfb,0x80,0xfb,0x80,
+       0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xff,0xf6,0x56,0x56,0xf9,0xfa,
+       0xf9,0xf9,0x56,0xf9,0x56,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,
+       0x56,0xf9,0x56,0xf9,0x56,0xf9,0x56,0x56,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,
+       0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xfa,0xfa,
+       0xfa,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0x56,0x56,0xf9,
+       0x56,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xf9,0x56,0xf9,
+       0x56,0xf9,0x56,0x56,0x56,0x56,0xf9,0xf9,0xf9,0x56,0xfa,0xf9,0x56,0xf9,0xf9,0xf9,
+       0xf9,0x56,0x56,0xf9,0xfa,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xfa,0x56,0x56,0xf9,0xf9,
+       0xf9,0x56,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xf9,0x56,0x56,0xf9,0x56,0x56,0x56,0xf9,
+       0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xfa,0xfa,0xf9,0xf9,0xfa,0xfa,0xfa,
+       0xf9,0xf9,0xfa,0xfa,0x81,0xf9,0xfa,0xf9,0xfa,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,
+       0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0x56,
+       0x56,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xf9,0x56,0x56,
+       0x56,0xf9,0x56,0xf9,0x56,0x56,0xf9,0x56,0x56,0x56,0x56,0x56,0x56,0xf9,0x56,0x56,
+       0x56,0x56,0x56,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0x56,0x56,0xf9,0xf9,0xf9,
+       0xf9,0x56,0xf9,0xf9,0x56,0x56,0xf9,0x56,0xf9,0x56,0xf9,0x56,0x56,0x56,0x56,0xf9,
+       0xf9,0xf9,0x56,0xfa,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xf9,0xfa,0xf9,0xf9,
+       0x56,0xf9,0xf9,0xf9,0xfa,0x56,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0xf9,
+       0x56,0xf9,0x56,0x56,0xf9,0x56,0x56,0x56,0xf9,0x56,0x56,0x56,0x56,0x56,0xf9,0xfa,
+       0xf9,0x56,0xf9,0x56,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0xf9,
+       0x56,0xf9,0x56,0xf9,0x56,0x56,0x56,0x56,0x56,0xf9,0xfa,0xf9,0x56,0xfa,0xf9,0x56,
+       0xf9,0x56,0xf9,0xfc,0xff,0xff,0xab,0xfc,0xab,0xfb,0xfb,0xaa,0xfb,0x80,0xaa,0x80,
+       0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xff,0x2b,0xf9,0xf9,0xf9,
+       0xfa,0x56,0x56,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xfa,0xf9,0xf9,0x56,0xf9,0xf9,
+       0x56,0x56,0x56,0x56,0x56,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,
+       0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0x81,0xfa,
+       0xf9,0xfa,0xfa,0xf9,0xf9,0xfa,0xfa,0xf9,0xf9,0xf9,0xfa,0xfa,0xfa,0x56,0x56,0x56,
+       0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xfa,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,0x56,
+       0x56,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0x56,
+       0x56,0xf9,0x56,0x56,0xf9,0xf9,0x56,0x56,0x56,0xfa,0xf9,0x56,0x56,0xf9,0xf9,0xf9,
+       0xf9,0x56,0x56,0xf9,0xfa,0x56,0xf9,0xf9,0x56,0xfa,0xf9,0x56,0xf9,0xfa,0xf9,0x56,
+       0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xfa,0xfa,0xf9,0xf9,0xfa,0xfa,0xf9,
+       0xfa,0xfa,0xfa,0x81,0x81,0xfa,0xfa,0xf9,0xfa,0xfa,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,
+       0xf9,0xf9,0xf9,0xf9,0xfa,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0x56,0x56,
+       0x56,0x56,0xf9,0xf9,0x56,0x56,0x56,0xf9,0xf9,0x56,0x56,0x56,0x56,0xf9,0xf9,0x56,
+       0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xfa,0x56,0xf9,0xf9,0xf9,
+       0x56,0xf9,0xf9,0xfa,0xfa,0xfa,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xfa,
+       0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,0x56,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,
+       0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,
+       0x56,0x56,0xfa,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,
+       0x56,0x56,0xfa,0xf9,0x56,0xf9,0xfa,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xfa,0xf9,0xfa,
+       0x56,0x56,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xfa,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,
+       0x56,0x56,0x56,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xfa,0xf9,0xf9,0x56,0x56,0xf9,0xf9,
+       0xf9,0xf9,0x56,0xf9,0xfc,0xff,0xff,0xab,0xfc,0xab,0xaa,0xfb,0xfb,0x80,0xfb,0x80,
+       0xfb,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xff,0x2b,0xfa,0xf9,
+       0xf9,0x56,0xf9,0x56,0x56,0xfa,0x56,0x56,0xf9,0xfa,0xf9,0x56,0x56,0x56,0xf9,0x56,
+       0x56,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xfa,0x56,0xf9,0xf9,0x56,0x56,0xfa,0xf9,
+       0x56,0x56,0xf9,0x56,0xf9,0x56,0x56,0x56,0x56,0xfa,0xf9,0xf9,0xfa,0xf9,0xf9,0xfa,
+       0xfa,0xfa,0x81,0xfa,0xfa,0xfa,0xfa,0xf9,0xf9,0xfa,0xfa,0xfa,0xf9,0xf9,0x56,0x56,
+       0x56,0xf9,0x56,0x56,0xf9,0xfa,0xf9,0x56,0x56,0x56,0xf9,0x56,0x56,0x56,0x56,0xf9,
+       0x56,0xf9,0x56,0xfa,0xf9,0x56,0xf9,0x56,0xf9,0x56,0xf9,0x56,0xfa,0x56,0xf9,0x56,
+       0xf9,0x56,0xf9,0x56,0xf9,0xfa,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,
+       0x56,0x56,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,
+       0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xfa,0xfa,0xfa,0xf9,0xfa,0xfa,0xfa,0xfa,0x81,
+       0xfa,0xfa,0xfa,0x81,0xfa,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,
+       0xf9,0xfa,0xfa,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xf9,0x56,0x56,0x56,0x56,0x56,
+       0x56,0xf8,0xf9,0xf9,0x56,0x56,0x56,0xf9,0xf9,0x56,0x56,0x56,0xf9,0xf9,0x56,0x56,
+       0xf9,0x56,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xfa,0xf9,0xf9,0xf9,0xf9,
+       0x56,0x56,0xf9,0xfa,0xf9,0x56,0x56,0xf9,0x56,0x56,0xfa,0x56,0x56,0xf9,0xfa,0xf9,
+       0x56,0x56,0x56,0xf9,0x56,0x56,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,
+       0x56,0xf9,0x56,0xf9,0x56,0xfa,0x56,0x56,0x56,0xf9,0x56,0x56,0x56,0xf9,0xfa,0xf9,
+       0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0x56,0x56,0x56,0x56,0xfa,0xf9,0x56,
+       0xf9,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xfa,0xf9,0xf9,0xf9,
+       0x56,0xf9,0x56,0x56,0xfa,0x56,0x56,0xf9,0xfa,0xf9,0x56,0x56,0x56,0xf9,0x56,0x56,
+       0xf9,0x56,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,
+       0xf9,0x56,0x56,0xf9,0x56,0xfc,0xff,0xff,0xab,0xfc,0xab,0xfb,0xfb,0xaa,0xfb,0xaa,
+       0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xff,0x2b,0x56,
+       0x56,0x56,0x56,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0x56,0xfa,
+       0x56,0xf9,0xf9,0xfa,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0xfa,0xf9,
+       0x56,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,
+       0xfa,0xfa,0xfa,0xfa,0xf9,0xfa,0xf9,0xf9,0xf9,0xfa,0xfa,0xf9,0xf9,0xf9,0x56,0x56,
+       0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0x56,0xfa,0x56,0xf9,0xf9,0xfa,
+       0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xf9,0x56,
+       0xf9,0x56,0x56,0xf9,0x56,0xfa,0xf9,0xf9,0x56,0xfa,0xf9,0x56,0x56,0xfa,0xf9,0xf9,
+       0x56,0x56,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,
+       0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xfa,0xfa,0xf9,0xf9,0xfa,0xf9,0xfa,0xf9,0xfa,
+       0x81,0xf9,0xfa,0xfa,0xfa,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0xfa,0xfa,0xfa,0xfa,
+       0xfa,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0x56,0x56,0xf9,0x56,0x56,0x56,
+       0x56,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xfa,0xf9,0x56,0x56,
+       0x56,0x56,0xf9,0xf9,0x56,0x56,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0x56,
+       0xf9,0x56,0xf9,0xfa,0x56,0x56,0x56,0x56,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,
+       0x56,0x56,0xf9,0x56,0xfa,0x56,0xf9,0xf9,0xfa,0xf9,0xfa,0xf9,0xf9,0xfa,0xf9,0x56,
+       0x56,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,
+       0xf9,0x56,0xfa,0xf9,0x56,0x56,0xfa,0xf9,0xf9,0x56,0x56,0x56,0xf9,0xf9,0xf9,0x56,
+       0x56,0x56,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,
+       0x56,0x56,0x56,0x56,0x56,0xfa,0x56,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xf9,0xf9,0x56,
+       0x56,0xf9,0xfa,0xf9,0xfa,0xf9,0xf9,0xfa,0xf9,0x56,0x56,0x56,0xf9,0xf9,0x56,0x56,
+       0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xfc,0xff,0xff,0xfc,0xab,0xab,0xfb,0xaa,0xfb,0x80,
+       0x80,0x81,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xff,0x2b,
+       0x56,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xfa,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,
+       0xf9,0xf9,0xf9,0xfa,0x56,0xf9,0x56,0xf9,0x56,0xfa,0x56,0x56,0xf9,0x56,0x56,0xf9,
+       0x56,0x56,0x56,0xfa,0xf9,0x56,0x56,0xf9,0xf9,0xfa,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,
+       0xfa,0x81,0x81,0xfa,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0xfa,0xfa,0xf9,0xf9,0xf9,0xf9,
+       0x56,0x56,0x56,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0xfa,
+       0xf9,0x56,0xf9,0x56,0x56,0xfa,0x56,0x56,0xf9,0xf9,0xf9,0xfa,0x56,0x56,0xf9,0xf9,
+       0xf9,0x56,0x56,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xf9,0x56,0xf9,0x56,0x56,0xf9,0xf9,
+       0x56,0xf9,0x56,0xfa,0xf9,0x56,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xfa,0xf9,0xf9,0x56,
+       0x56,0xf9,0x56,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0xfa,0xfa,0xfa,0xf9,
+       0xfa,0xfa,0xf9,0xf9,0xfa,0xfa,0xf9,0xfa,0xfa,0xfa,0xfa,0xf9,0xfa,0xfa,0xf9,0xf9,
+       0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0x56,0xf9,0x56,0x56,0x56,0x56,0x56,0x56,
+       0x56,0x56,0xf9,0x56,0x56,0x56,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,
+       0xf9,0xf9,0xfa,0x56,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0x56,
+       0x56,0x56,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0x56,0xf9,
+       0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0xfa,0x56,0xf9,0x56,0xf9,0x56,0xf9,0x56,
+       0x56,0xf9,0xf9,0xf9,0xfa,0x56,0x56,0xf9,0xf9,0x56,0x56,0x56,0xf9,0xf9,0x56,0x56,
+       0x56,0x56,0xf9,0x56,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0x56,0xfa,0xf9,0xf9,0x56,
+       0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0x56,0x56,0x56,0x56,0x56,0xf9,0xf9,0x56,
+       0x56,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0xfa,
+       0xf9,0xf9,0xfa,0x56,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xfa,0xf9,0xf9,0xf9,
+       0x56,0x56,0xf9,0x56,0x56,0x56,0xf9,0xfc,0xff,0xff,0xab,0xfc,0xab,0xfb,0xfb,0xfb,
+       0xfb,0xaa,0x80,0xfb,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xff,
+       0x2b,0x56,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xf9,0xf9,0xf9,
+       0xf9,0x56,0xf9,0xf9,0x56,0xf9,0x56,0x56,0x56,0x56,0x56,0x56,0x56,0xf9,0xf9,0x56,
+       0x56,0xf9,0xf9,0x56,0x56,0xf9,0x56,0xf9,0xf9,0xfa,0x56,0xf9,0xf9,0xf9,0xfa,0xfa,
+       0xf9,0x81,0xf9,0xfa,0xfa,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xfa,0x56,0xfa,0xfa,
+       0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,
+       0x56,0xf9,0x56,0x56,0x56,0x56,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,
+       0x56,0x56,0x56,0x56,0xfa,0xf9,0x56,0x56,0x56,0x56,0x56,0x56,0xf9,0xf9,0x56,0xf9,
+       0xf9,0x56,0x56,0xfa,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,
+       0xf9,0xf9,0x56,0x56,0x56,0x56,0xf9,0xf9,0xf9,0xfa,0xfa,0xfa,0xfa,0x81,0xfa,0x81,
+       0xfa,0xfa,0x81,0xf9,0xfa,0xf9,0xf9,0xfa,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,
+       0xf9,0xf9,0x56,0x56,0x56,0x56,0xf8,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xf9,0x56,0x56,
+       0x56,0x56,0xfa,0xf9,0x56,0x56,0x56,0x56,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,
+       0x56,0xfa,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xfa,0x56,0x56,0xf9,0xf9,0x56,
+       0x56,0x56,0x56,0xf9,0xfa,0xf9,0x56,0xf9,0xf9,0xfa,0xfa,0xf9,0xf9,0xfa,0x56,0xf9,
+       0x56,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0x56,0x56,0x56,0x56,0xf9,
+       0x56,0x56,0xf9,0xfa,0x56,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0x56,0x56,0xfa,0xf9,0x56,
+       0x56,0x56,0x56,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xfa,0xf9,0xf9,0x56,
+       0xf9,0x56,0xfa,0xf9,0x56,0xfa,0x56,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,
+       0x56,0xf9,0xfa,0xf9,0xfa,0xf9,0xf9,0xfa,0x56,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,
+       0x56,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0x56,0x56,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,
+       0xf9,0x56,0xf9,0xf9,0x56,0x56,0x56,0xfa,0xfc,0xff,0xff,0xfc,0xab,0xab,0xab,0xfb,
+       0xaa,0x80,0x81,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
+       0xff,0x2b,0x56,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xfa,0x56,0xf9,0xf9,0xfa,0xf9,0x56,
+       0x56,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0x56,0x56,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,
+       0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,
+       0xf9,0xf9,0xfa,0xf9,0x81,0xfa,0xf9,0xfa,0xf9,0xf9,0x81,0xfa,0xfa,0xf9,0xf9,0xf9,
+       0xf9,0xf9,0x56,0x56,0x56,0xf9,0x56,0xf9,0xf9,0xfa,0xf9,0x56,0x56,0xf9,0xf9,0x56,
+       0xf9,0x56,0xf9,0x56,0x56,0xfa,0xf9,0xf9,0xf9,0x56,0xfa,0xf9,0x56,0xf9,0xf9,0x56,
+       0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xfa,0xf9,0x56,0xf9,0xf9,0xf9,0x56,
+       0x56,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0x56,0xf9,
+       0xf9,0x56,0x56,0x56,0xf9,0xfa,0xf9,0xf9,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xf9,
+       0xfa,0xfa,0xf9,0xfa,0xf9,0xfa,0xfa,0xfa,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0x56,
+       0xf9,0x56,0x56,0xf9,0xf9,0x56,0x56,0x56,0xf9,0x56,0x56,0x56,0xf9,0x56,0xf9,0xf9,
+       0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xfa,0x56,0x56,0x56,0xf9,
+       0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0x56,0xfa,0xf9,0x56,
+       0xf9,0x56,0xf9,0xfa,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0x56,
+       0xf9,0xf9,0xfa,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0x56,0x56,0xfa,0xf9,
+       0xf9,0x56,0xf9,0xfa,0x56,0x56,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,
+       0x56,0xf9,0xfa,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0x56,0xf9,0xf9,0x56,0x56,
+       0xf9,0xf9,0xf9,0xf9,0x56,0x56,0x56,0x56,0xf9,0xf9,0x56,0x56,0x56,0xf9,0xf9,0xfa,
+       0xf9,0x56,0x56,0xf9,0x56,0xf9,0xf9,0x56,0xfa,0x56,0xf9,0xf9,0xfa,0xf9,0x56,0x56,
+       0xf9,0x56,0xf9,0x56,0x56,0xf9,0x56,0x56,0xfa,0xf9,0xf9,0xf9,0x56,0xfa,0x56,0x56,
+       0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xfc,0xff,0xff,0xab,0xfc,0xab,0xfb,
+       0xaa,0xfb,0xfb,0xaa,0xfb,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
+       0x80,0xff,0xf6,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,
+       0x56,0x56,0x56,0x56,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0x56,0x56,0x56,0x56,
+       0x56,0x56,0xf9,0xfa,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,
+       0xfa,0xfa,0xf9,0xfa,0x81,0xfa,0xf9,0xfa,0xfa,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,
+       0xf9,0xfa,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0x56,0x56,0x56,
+       0x56,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xfa,0x56,0x56,0x56,0x56,0xf9,0x56,0xf9,0xf9,
+       0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0x56,0x56,0x56,0x56,0x56,0xf9,0xf9,0x56,
+       0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xfa,0x56,0xf9,0xf9,
+       0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xfa,0xf9,0xf9,0xfa,0xfa,0xf9,0xf9,0x81,
+       0xfa,0xf9,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,
+       0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0x56,0x56,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0x56,
+       0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xf9,0x56,0x56,0xf9,0xfa,0x56,0xf9,0xf9,
+       0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xfa,0x56,0xf9,0xf9,0xf9,0x56,
+       0xf9,0x56,0xf9,0xf9,0x56,0x56,0x56,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xfa,0xf9,
+       0xf9,0xf9,0xf9,0xf9,0x56,0x56,0x56,0x56,0x56,0x56,0x56,0x56,0xf9,0xf9,0xf9,0xf9,
+       0xfa,0x56,0x56,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,
+       0xf9,0x56,0x56,0x56,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,
+       0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0x56,
+       0x56,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0x56,0xfa,0xf9,0x56,0xfa,0xf9,0x56,0xf9,0x56,
+       0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0x56,0x56,0x56,0x56,0xf9,
+       0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0x56,0xfc,0xff,0xff,0xfc,0xab,0xab,
+       0xfb,0xfb,0xaa,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
+       0x80,0x80,0xff,0x2b,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0x56,0x56,
+       0xf9,0xf9,0x56,0xfa,0xfa,0xf9,0x56,0x56,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,
+       0xf9,0xf9,0xf9,0xfa,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,
+       0xfa,0xfa,0xf9,0xf9,0x81,0xfa,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,
+       0xf9,0xf9,0xfa,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xfa,
+       0xfa,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xfa,0xf9,0x56,0x56,0xf9,
+       0x56,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,
+       0x56,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xfa,0x56,0x56,0xf9,0xf9,0xfa,0x56,0x56,0xf9,
+       0xf9,0xf9,0x56,0x56,0x56,0x56,0x56,0x56,0xf9,0x56,0xf9,0xf9,0xfa,0xfa,0xfa,0xfa,
+       0xfa,0xf9,0xfa,0xfa,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xfa,0x56,
+       0x56,0x56,0x56,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0x56,0x56,
+       0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xf9,0xf9,0x56,0xfa,0xf9,0xf9,0x56,0x56,
+       0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0xfa,0x56,0x56,0xf9,0xf9,0x56,
+       0x56,0x56,0x56,0x56,0x56,0x56,0x56,0xf9,0x56,0xf9,0x56,0xf9,0x56,0xf9,0xf9,0xf9,
+       0x56,0x56,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xfa,0xfa,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,
+       0xf9,0x56,0x56,0xf9,0xfa,0xf9,0x56,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,
+       0x56,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0x56,0x56,0xf9,0x56,0xf9,0xf9,0xf9,
+       0xfa,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xfa,0x56,0x56,0x56,0x56,0x56,0x56,
+       0x56,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xfa,0xf9,0x56,0x56,0xf9,0x56,0x56,0xf9,
+       0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xf9,0xfa,0x56,0x56,0xf9,0xf9,0xf9,
+       0x56,0x56,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xfc,0xff,0xff,0xab,0xfc,
+       0xab,0xab,0xfb,0xfb,0xfb,0xfb,0x80,0xfb,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
+       0x80,0x80,0x80,0xff,0x2b,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xf9,0xf9,0x56,0xf9,0x56,
+       0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xfa,0xf9,0x56,0xfa,0xf9,0x56,0x56,0x56,0xfa,
+       0xf9,0xf9,0xf9,0xf9,0x56,0x56,0x56,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xf9,
+       0xf9,0xf9,0xf9,0xf9,0xfa,0x81,0xfa,0xf9,0xfa,0xfa,0xfa,0xfa,0xf9,0xfa,0xf9,0xfa,
+       0xfa,0xfa,0xf9,0xf9,0x56,0x56,0x56,0x56,0x56,0x56,0xf9,0x56,0x56,0xf9,0xf9,0xf9,
+       0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xfa,0xfa,0x56,0x56,0x56,0xfa,0xf9,0xf9,0xf9,0xf9,
+       0xf9,0xf9,0x56,0x56,0x56,0x56,0xf9,0xf9,0x56,0x56,0xfa,0xf9,0xf9,0xf9,0xf9,0x56,
+       0x56,0x56,0x56,0xfa,0x56,0xf9,0x56,0xf9,0x56,0x56,0xf9,0x56,0xf9,0x56,0xf9,0x56,
+       0xfa,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0xfa,0xfa,0x81,0xfa,
+       0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0x56,0xf9,
+       0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xfa,0xf9,
+       0x56,0x56,0x56,0x56,0xf9,0xf9,0x56,0x56,0xfa,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0x56,
+       0x56,0xfa,0xf9,0x56,0xf9,0x56,0x56,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0xfa,0xf9,
+       0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xfa,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0x56,
+       0xf9,0xf9,0x56,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xfa,
+       0xfa,0x56,0x56,0x56,0xfa,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0x56,0x56,0xf9,
+       0xf9,0x56,0x56,0xfa,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0x56,0x56,0xfa,0x56,0xf9,0x56,
+       0xf9,0x56,0x56,0xf9,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,
+       0xf9,0xf9,0xf9,0xfa,0xf9,0x56,0xf9,0x56,0x56,0x56,0xf9,0xf9,0x56,0xf9,0x56,0x56,
+       0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xfa,0xf9,
+       0xf9,0xf9,0x56,0xfa,0xf9,0x56,0x56,0x56,0x56,0xf9,0xf9,0x56,0xfb,0xff,0xff,0xfc,
+       0xab,0xab,0xfb,0xaa,0xfb,0x80,0xaa,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
+       0x80,0x80,0x80,0x80,0xff,0x2b,0x56,0xf9,0xf9,0xfa,0xf9,0xf9,0x56,0xf9,0x56,0x56,
+       0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xfa,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,
+       0x56,0x56,0x56,0x56,0xf9,0x56,0x56,0xfa,0xf9,0xfa,0x56,0x56,0x56,0xf9,0x56,0x56,
+       0xfa,0xf9,0xf9,0xf9,0xf9,0xfa,0xfa,0xfa,0xf9,0xfa,0xf9,0xfa,0xfa,0xf9,0xf9,0xf9,
+       0xfa,0xf9,0xf9,0xfa,0xfa,0xfa,0xf9,0x56,0x56,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,
+       0x56,0xf9,0xfa,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0x56,0x56,0xf9,0x56,0x56,0x56,0x56,
+       0xf9,0xfa,0x56,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,
+       0x56,0x56,0xf9,0xfa,0xf9,0xf9,0x56,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0x56,
+       0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xfa,
+       0xfa,0xfa,0xfa,0xfa,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0x56,0x56,
+       0xf9,0xf9,0x56,0x56,0xf9,0xf9,0x56,0x56,0x56,0x56,0xf9,0x56,0x56,0x56,0xf9,0xf9,
+       0x56,0x56,0x56,0xf9,0x56,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0x56,
+       0xfa,0xf9,0xf9,0x56,0x56,0x56,0xf9,0x56,0x56,0xf9,0xf9,0x56,0xf9,0x56,0xf9,0xf9,
+       0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0x56,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,
+       0xf9,0x56,0xf9,0x56,0x56,0x56,0xf9,0xf9,0xf9,0x56,0xf9,0xfa,0xf9,0x56,0xf9,0xf9,
+       0xf9,0x56,0x56,0x56,0xf9,0x56,0x56,0xf9,0x56,0xf9,0xfa,0x56,0x56,0xf9,0xf9,0x56,
+       0xf9,0xf9,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xf9,0xfa,0xf9,0xf9,0x56,
+       0x56,0xf9,0x56,0x56,0xf9,0xf9,0x56,0x56,0xf9,0xf9,0xf9,0xf9,0x56,0xf9,0xf9,0xf9,
+       0xf9,0x56,0x56,0xf9,0x56,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0x56,0xf9,0x56,0x56,0xf9,
+       0xf9,0xf9,0xf9,0x56,0x56,0xfa,0xf9,0xf9,0x56,0xf9,0xfa,0xf9,0x56,0xf9,0xf9,0x56,
+       0x56,0xf9,0x56,0xf9,0xf9,0x56,0x56,0x56,0xf9,0x56,0xf9,0xf9,0x56,0xfc,0xff,0xff,
+       0xab,0xab,0xfb,0xab,0xfb,0xfb,0xaa,0xfb,0x80,0xfb,0x80,0x80,0x80,0x80,0x80,0x80,
+       0x80,0x80,0x80,0x80,0x80,0xff,0xf9,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,
+       0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfb,0xfc,0xfb,0xfc,0xfc,
+       0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfb,0xfc,0xfb,0xfc,0xfc,0xfc,
+       0xfc,0xfc,0xfc,0xfc,0xac,0xfc,0xac,0xfc,0xac,0xfc,0xac,0xfc,0xfc,0xfc,0xfc,0xac,
+       0xac,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,
+       0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfb,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,
+       0xfc,0xfc,0xfc,0xfb,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,
+       0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfb,0xfc,0xfc,0xfb,0xfc,0xfc,0xfc,0xfc,0xfc,
+       0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfb,0xfc,0xfb,0xfc,0xfc,0xfc,0xfc,0xfc,0xac,0xac,
+       0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xac,0xfc,0xfc,0xfc,0xfc,0xfb,0xfc,0xfb,
+       0xfc,0xfc,0xfc,0xfc,0xfc,0xfb,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,
+       0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,
+       0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfb,0xfc,0xfc,0xfc,
+       0xfc,0xfc,0xfb,0xfc,0xfb,0xfc,0xfb,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,
+       0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,
+       0xfb,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfb,0xfc,0xfc,0xfb,0xfc,0xfc,0xfc,
+       0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfb,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,
+       0xfb,0xfc,0xfc,0xfb,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfb,0xfc,0xfb,
+       0xfc,0xfb,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,
+       0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfb,0xfc,0xfb,0xfc,0xfc,0xfc,
+       0xfc,0xfc,0xfb,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xff,
+       0xff,0xfc,0xfc,0xab,0xfb,0xaa,0xfb,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
+       0x80,0x80,0x80,0x80,0x80,0x80,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+       0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+       0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+       0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+       0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+       0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+       0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+       0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+       0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+       0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+       0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+       0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+       0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+       0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+       0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+       0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+       0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+       0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+       0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+       0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+       0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+       0xff,0xff,0xfc,0xab,0xfb,0xab,0xfb,0x80,0x81,0x80,0xaa,0x80,0x80,0x80,0x80,0x80,
+       0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+       0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+       0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+       0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+       0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+       0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+       0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+       0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+       0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+       0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+       0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+       0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+       0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+       0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+       0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+       0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+       0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+       0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+       0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+       0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+       0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+       0xff,0xff,0xff,0xab,0xfb,0xab,0xfb,0xaa,0xfb,0xaa,0xfb,0x80,0x80,0x80,0x80,0x80,
+       0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xfb,0x80,0x80,0xaa,
+       0x81,0xaa,0xfb,0xfb,0xfb,0xab,0xab,0xab,0xab,0xfc,0xab,0xfc,0xab,0xfc,0xab,0xfc,
+       0xab,0xfc,0xab,0xfc,0xab,0xfc,0xfc,0xab,0xab,0xfc,0xfc,0xab,0xfc,0xab,0xfc,0xab,
+       0xab,0xfc,0xfc,0xab,0xab,0xfc,0xfc,0xab,0xfc,0xfc,0xab,0xfc,0xab,0xfc,0xab,0xfc,
+       0xac,0xfc,0xab,0xfc,0xab,0xfc,0xab,0xfc,0xab,0xfc,0xab,0xfc,0xac,0xab,0xfc,0xab,
+       0xfc,0xab,0xfc,0xab,0xab,0xfc,0xfc,0xab,0xab,0xfc,0xfc,0xab,0xfc,0xfc,0xab,0xfc,
+       0xab,0xfc,0xfc,0xab,0xab,0xfc,0xfc,0xab,0xab,0xfc,0xfc,0xab,0xfc,0xab,0xfc,0xab,
+       0xfc,0xab,0xfc,0xab,0xab,0xfc,0xfc,0xab,0xfc,0xab,0xfc,0xac,0xab,0xfc,0xab,0xfc,
+       0xab,0xfc,0xfc,0xab,0xab,0xac,0xfc,0xab,0xfc,0xab,0xab,0xfc,0xab,0xfc,0xab,0xfc,
+       0xac,0xfc,0xab,0xfc,0xab,0xfc,0xab,0xfc,0xab,0xfc,0xab,0xfc,0xac,0xab,0xab,0xfc,
+       0xac,0xab,0xab,0xfc,0xab,0xfc,0xab,0xfc,0xac,0xab,0xfc,0xab,0xfc,0xfc,0xab,0xfc,
+       0xab,0xfc,0xab,0xfc,0xac,0xfc,0xab,0xfc,0xab,0xfc,0xab,0xfc,0xac,0xab,0xab,0xfc,
+       0xac,0xab,0xab,0xfc,0xac,0xab,0xfc,0xac,0xab,0xab,0xfc,0xab,0xab,0xfc,0xac,0xab,
+       0xab,0xfc,0xfc,0xab,0xfc,0xfc,0xab,0xfc,0xab,0xfc,0xab,0xfc,0xac,0xab,0xab,0xfc,
+       0xfc,0xab,0xfc,0xab,0xab,0xfc,0xab,0xfc,0xac,0xab,0xfc,0xab,0xfc,0xfc,0xab,0xfc,
+       0xab,0xfc,0xab,0xfc,0xab,0xfc,0xab,0xfc,0xab,0xab,0xfc,0xfc,0xab,0xfc,0xab,0xfc,
+       0xab,0xfc,0xac,0xfc,0xab,0xfc,0xab,0xfc,0xab,0xfc,0xac,0xab,0xab,0xfc,0xac,0xab,
+       0xab,0xfc,0xac,0xab,0xfc,0xac,0xab,0xab,0xfc,0xab,0xab,0xfc,0xac,0xab,0xab,0xfc,
+       0xfc,0xab,0xfc,0xfc,0xab,0xfc,0xab,0xfc,0xab,0xfc,0xac,0xab,0xab,0xfc,0xfc,0xab,
+       0xfc,0xab,0xab,0xfc,0xab,0xfc,0xac,0xab,0xfc,0xab,0xfc,0xfc,0xab,0xfc,0xab,0xfc,
+       0xab,0xfc,0xab,0xfc,0xab,0xfc,0xab,0xab,0xab,0xfc,0xab,0xfc,0xab,0xfc,0xab,0xfc,
+       0xab,0xfc,0xab,0xfc,0xfb,0xab,0xfb,0xfb,0x80,0x80,0xaa,0x81,0x80,0x80,0x80,0x80,
+       0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xfb,
+       0x80,0xfb,0xfb,0x80,0xaa,0xfb,0xab,0xfb,0xfb,0xab,0xab,0xfb,0xab,0xfc,0xab,0xfc,
+       0xab,0xfc,0xab,0xfc,0xab,0xfc,0xab,0xab,0xfc,0xab,0xfc,0xab,0xab,0xab,0xfc,0xab,
+       0xfc,0xab,0xfc,0xab,0xfc,0xab,0xfc,0xab,0xfc,0xab,0xab,0xfc,0xab,0xfc,0xfc,0xab,
+       0xab,0xab,0xab,0xfc,0xab,0xfc,0xab,0xfc,0xab,0xfc,0xfc,0xab,0xab,0xfc,0xfc,0xab,
+       0xfc,0xab,0xfc,0xab,0xfc,0xab,0xfc,0xab,0xfc,0xab,0xfc,0xab,0xab,0xab,0xab,0xfc,
+       0xab,0xfc,0xab,0xab,0xfc,0xab,0xfc,0xab,0xfc,0xab,0xfc,0xab,0xab,0xfc,0xab,0xfc,
+       0xab,0xab,0xfc,0xab,0xfc,0xab,0xab,0xab,0xfc,0xab,0xfc,0xab,0xab,0xfc,0xab,0xfc,
+       0xab,0xfc,0xab,0xab,0xfc,0xab,0xfb,0xab,0xfc,0xab,0xfc,0xfc,0xab,0xfc,0xfc,0xab,
+       0xab,0xab,0xab,0xfc,0xab,0xfc,0xab,0xab,0xfc,0xab,0xfc,0xab,0xab,0xfc,0xab,0xfc,
+       0xab,0xab,0xfc,0xfc,0xab,0xfc,0xfc,0xab,0xab,0xfc,0xab,0xfb,0xab,0xab,0xab,0xfc,
+       0xab,0xfc,0xfc,0xab,0xab,0xab,0xab,0xfc,0xab,0xfc,0xfc,0xab,0xab,0xfc,0xab,0xfc,
+       0xab,0xfc,0xab,0xfc,0xab,0xab,0xfc,0xab,0xab,0xfc,0xfc,0xab,0xfc,0xab,0xfb,0xab,
+       0xfc,0xab,0xfc,0xab,0xab,0xab,0xab,0xab,0xfc,0xab,0xfc,0xab,0xab,0xfc,0xab,0xfc,
+       0xab,0xab,0xfb,0xab,0xfc,0xab,0xfc,0xab,0xab,0xfc,0xab,0xfb,0xab,0xfc,0xab,0xfc,
+       0xab,0xfc,0xab,0xfc,0xab,0xfc,0xab,0xfc,0xab,0xfc,0xab,0xab,0xab,0xfc,0xab,0xfc,
+       0xfc,0xab,0xab,0xab,0xab,0xfc,0xab,0xfc,0xfc,0xab,0xab,0xfc,0xab,0xfc,0xab,0xfc,
+       0xab,0xfc,0xab,0xab,0xfc,0xab,0xab,0xfc,0xfc,0xab,0xfc,0xab,0xfb,0xab,0xfc,0xab,
+       0xfc,0xab,0xab,0xab,0xab,0xab,0xfc,0xab,0xfc,0xab,0xab,0xfc,0xab,0xfc,0xab,0xab,
+       0xfb,0xab,0xfc,0xab,0xfc,0xab,0xab,0xfc,0xab,0xfb,0xab,0xfc,0xab,0xfc,0xab,0xfc,
+       0xab,0xfc,0xab,0xfc,0xab,0xfc,0xab,0xfc,0xfc,0xfc,0xab,0xfc,0xab,0xfc,0xab,0xfc,
+       0xab,0xab,0xfc,0xab,0xab,0xab,0xfb,0xfb,0xaa,0xfb,0xfb,0x80,0x80,0xfb,0x80,0x80,
+       0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
+       0x80,0x80,0xaa,0x80,0xfb,0xfb,0xaa,0xfb,0xfb,0xaa,0xfb,0xab,0xab,0xab,0xab,0xab,
+       0xab,0xab,0xab,0xab,0xab,0xab,0xab,0xab,0xfb,0xab,0xab,0xab,0xfb,0xab,0xab,0xfb,
+       0xab,0xab,0xab,0xfb,0xab,0xab,0xfb,0xab,0xab,0xab,0xab,0xfb,0xab,0xab,0xab,0xab,
+       0xab,0xfb,0xab,0xfb,0xab,0xab,0xab,0xab,0xab,0xab,0xab,0xab,0xfb,0xab,0xab,0xab,
+       0xab,0xab,0xab,0xfc,0xab,0xab,0xfb,0xab,0xab,0xab,0xab,0xfb,0xab,0xfc,0xab,0xfb,
+       0xab,0xab,0xab,0xab,0xfb,0xab,0xab,0xab,0xfb,0xab,0xab,0xab,0xfb,0xab,0xab,0xfb,
+       0xab,0xfb,0xab,0xab,0xfb,0xab,0xab,0xfb,0xfc,0xab,0xab,0xab,0xfb,0xab,0xab,0xfb,
+       0xab,0xab,0xab,0xfb,0xab,0xab,0xab,0xab,0xab,0xab,0xab,0xab,0xab,0xab,0xab,0xab,
+       0xab,0xfb,0xab,0xfb,0xab,0xab,0xab,0xab,0xfb,0xab,0xab,0xfc,0xab,0xab,0xab,0xab,
+       0xfb,0xab,0xab,0xfb,0xab,0xab,0xab,0xab,0xfb,0xab,0xab,0xab,0xab,0xfc,0xab,0xfb,
+       0xab,0xab,0xab,0xab,0xab,0xfb,0xab,0xfb,0xab,0xab,0xab,0xab,0xfb,0xab,0xab,0xfb,
+       0xab,0xab,0xab,0xfb,0xab,0xfb,0xab,0xab,0xab,0xfb,0xab,0xab,0xab,0xab,0xab,0xab,
+       0xab,0xab,0xab,0xfb,0xab,0xfc,0xab,0xfb,0xab,0xab,0xfb,0xab,0xfb,0xab,0xab,0xab,
+       0xab,0xab,0xab,0xab,0xfb,0xab,0xab,0xab,0xfb,0xab,0xab,0xab,0xab,0xab,0xab,0xab,
+       0xab,0xab,0xab,0xfb,0xab,0xab,0xab,0xab,0xab,0xab,0xab,0xfc,0xab,0xfb,0xab,0xab,
+       0xab,0xab,0xab,0xfb,0xab,0xfb,0xab,0xab,0xab,0xab,0xfb,0xab,0xab,0xfb,0xab,0xab,
+       0xab,0xfb,0xab,0xfb,0xab,0xab,0xab,0xfb,0xab,0xab,0xab,0xab,0xab,0xab,0xab,0xab,
+       0xab,0xfb,0xab,0xfc,0xab,0xfb,0xab,0xab,0xfb,0xab,0xfb,0xab,0xab,0xab,0xab,0xab,
+       0xab,0xab,0xfb,0xab,0xab,0xab,0xfb,0xab,0xab,0xab,0xab,0xab,0xab,0xab,0xab,0xab,
+       0xab,0xfb,0xab,0xab,0xab,0xab,0xab,0xab,0xab,0xab,0xab,0xab,0xab,0xab,0xab,0xab,
+       0xab,0xab,0xfb,0xab,0xfb,0xab,0xaa,0xfb,0x80,0xfb,0xaa,0x80,0xfb,0x80,0x80,0x80,
+       0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
+       0xfb,0x80,0xfb,0x80,0xfb,0xaa,0x80,0xfb,0xfb,0xaa,0xfb,0xaa,0xfb,0xfb,0xfb,0xab,
+       0xfb,0xfb,0xfb,0xab,0xfb,0xfb,0xfb,0xab,0xfb,0xab,0xfb,0xab,0xfb,0xab,0xfb,0xab,
+       0xaa,0xfb,0xfb,0xab,0xaa,0xab,0xfb,0xab,0xaa,0xfb,0xfb,0xfb,0xab,0xab,0xfb,0xab,
+       0xfb,0xfb,0xab,0xfb,0xab,0xab,0xfb,0xab,0xfb,0xfb,0xfb,0xab,0xfb,0xaa,0xfb,0xfb,
+       0xaa,0xfb,0xfb,0xfb,0xaa,0xab,0xfb,0xab,0xaa,0xfb,0xfb,0xab,0xaa,0xfb,0xab,0xfb,
+       0xab,0xab,0xfb,0xab,0xfb,0xab,0xfb,0xab,0xfb,0xaa,0xfb,0xab,0xfb,0xab,0xfb,0xab,
+       0xaa,0xab,0xfb,0xab,0xfb,0xaa,0xfb,0xfb,0xab,0xaa,0xfb,0xab,0xfb,0xaa,0xfb,0xfb,
+       0xab,0xab,0xfb,0xab,0xaa,0xfb,0xfb,0xfb,0xab,0xfb,0xfb,0xab,0xfb,0xfb,0xfb,0xfb,
+       0xaa,0xfb,0xab,0xfb,0xab,0xab,0xfb,0xfb,0xfb,0xab,0xfb,0xfb,0xaa,0xfb,0xfb,0xab,
+       0xfb,0xab,0xfb,0xab,0xaa,0xab,0xfb,0xab,0xfb,0xab,0xfb,0xfb,0xaa,0xfb,0xfb,0xab,
+       0xaa,0xab,0xfb,0xab,0xfb,0xfb,0xab,0xfb,0xab,0xab,0xfb,0xab,0xfb,0xab,0xfb,0xab,
+       0xaa,0xfb,0xfb,0xab,0xaa,0xab,0xfb,0xfb,0xab,0xfb,0xab,0xfb,0xaa,0xfb,0xfb,0xfb,
+       0xab,0xfb,0xfb,0xab,0xaa,0xfb,0xab,0xfb,0xab,0xfb,0xab,0xab,0xfb,0xab,0xfb,0xab,
+       0xfb,0xfb,0xfb,0xab,0xfb,0xab,0xfb,0xab,0xfb,0xab,0xfb,0xfb,0xab,0xfb,0xfb,0xfb,
+       0xab,0xfb,0xfb,0xfb,0xab,0xab,0xfb,0xfb,0xab,0xfb,0xfb,0xfb,0xfb,0xab,0xaa,0xab,
+       0xfb,0xab,0xfb,0xfb,0xab,0xfb,0xab,0xab,0xfb,0xab,0xfb,0xab,0xfb,0xab,0xaa,0xfb,
+       0xfb,0xab,0xaa,0xab,0xfb,0xfb,0xab,0xfb,0xab,0xfb,0xaa,0xfb,0xfb,0xfb,0xab,0xfb,
+       0xfb,0xab,0xaa,0xfb,0xab,0xfb,0xab,0xfb,0xab,0xab,0xfb,0xab,0xfb,0xab,0xfb,0xfb,
+       0xfb,0xab,0xfb,0xab,0xfb,0xab,0xfb,0xab,0xfb,0xfb,0xab,0xfb,0xfb,0xfb,0xab,0xfb,
+       0xfb,0xfb,0xab,0xab,0xfb,0xfb,0xab,0xfb,0xfb,0xfb,0xaa,0xfb,0xfb,0xfb,0xab,0xfb,
+       0xfb,0xab,0xfb,0xab,0xfb,0xab,0xfb,0xfb,0x80,0xab,0x80,0x80,0x81,0x80,0x80,0x80,
+       0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
+       0x80,0x80,0x80,0x80,0x80,0x80,0xfb,0x80,0xfb,0xaa,0xfb,0xfb,0xfb,0xfb,0xaa,0xfb,
+       0xfb,0xab,0xaa,0xfb,0xfb,0xab,0xaa,0xfb,0xfb,0xaa,0xfb,0xfb,0xfb,0xaa,0xfb,0xfb,
+       0xfb,0xfb,0xab,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xaa,0xfb,0xab,0xfb,0xfb,
+       0xfb,0xfb,0xaa,0xfb,0xfb,0xaa,0xfb,0xfb,0xfb,0xab,0xaa,0xfb,0xfb,0xab,0xfb,0xab,
+       0xfb,0xfb,0xfb,0xaa,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xab,0xfb,0xfb,0xfb,0xab,0xfb,
+       0xaa,0xfb,0xfb,0xfb,0xfb,0xaa,0xfb,0xfb,0xfb,0xab,0xfb,0xfb,0xfb,0xaa,0xfb,0xfb,
+       0xfb,0xfb,0xfb,0xfb,0xfb,0xab,0xfb,0xab,0xfb,0xab,0xfb,0xfb,0xfb,0xab,0xfb,0xab,
+       0xfb,0xab,0x81,0xfb,0xfb,0xfb,0xfb,0xaa,0xfb,0xfb,0xaa,0xfb,0xfb,0xfb,0xaa,0xab,
+       0xfb,0xfb,0xfb,0xfb,0xaa,0xfb,0xfb,0xfb,0xaa,0xab,0xfb,0xaa,0xfb,0xfb,0xab,0xfb,
+       0xfb,0xaa,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xaa,0xfb,0xaa,0xfb,0xfb,0xab,0xfb,
+       0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xaa,0xfb,0xaa,0xfb,0xfb,0xfb,0xfb,0xaa,0xfb,0xfb,
+       0xfb,0xfb,0xab,0xfb,0xfb,0xfb,0xfb,0xaa,0xfb,0xfb,0xaa,0xfb,0xab,0xfb,0xfb,0xaa,
+       0xfb,0xfb,0xab,0xfb,0xfb,0xfb,0xfb,0xfb,0xaa,0xfb,0xfb,0xfb,0xfb,0xab,0xfb,0xfb,
+       0xaa,0xfb,0xaa,0xfb,0xfb,0xab,0xfb,0xfb,0xaa,0xfb,0xfb,0xaa,0xfb,0xab,0xfb,0xaa,
+       0xfb,0xab,0xfb,0xaa,0xfb,0xaa,0xfb,0xfb,0xfb,0xaa,0xfb,0xaa,0xfb,0xfb,0xfb,0xfb,
+       0xfb,0xfb,0xfb,0xfb,0xaa,0xfb,0xaa,0xfb,0xfb,0xfb,0xfb,0xaa,0xfb,0xfb,0xfb,0xfb,
+       0xab,0xfb,0xfb,0xfb,0xfb,0xaa,0xfb,0xfb,0xaa,0xfb,0xab,0xfb,0xfb,0xaa,0xfb,0xfb,
+       0xab,0xfb,0xfb,0xfb,0xfb,0xfb,0xaa,0xfb,0xfb,0xfb,0xfb,0xab,0xfb,0xfb,0xaa,0xfb,
+       0xaa,0xfb,0xfb,0xab,0xfb,0xfb,0xaa,0xfb,0xfb,0xaa,0xfb,0xab,0xfb,0xaa,0xfb,0xab,
+       0xfb,0xaa,0xfb,0xaa,0xfb,0xfb,0xfb,0xaa,0xfb,0xaa,0xfb,0xfb,0xfb,0xaa,0xfb,0xfb,
+       0xaa,0xfb,0xfb,0xaa,0xfb,0xaa,0x81,0xfb,0xaa,0xfb,0x80,0xfb,0x80,0xaa,0x80,0xfb,
+       0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
+       0x80,0x80,0x80,0x80,0xfb,0x80,0xfb,0x80,0xaa,0x80,0xfb,0x80,0xaa,0x80,0xaa,0xfb,
+       0x80,0xfb,0x80,0xfb,0xaa,0xfb,0x80,0xfb,0xaa,0xfb,0xfb,0xfb,0xaa,0x80,0xfb,0xfb,
+       0xaa,0xfb,0xaa,0x80,0xfb,0xaa,0xfb,0xfb,0xaa,0xfb,0xaa,0xfb,0xfb,0xaa,0x80,0xfb,
+       0xaa,0xfb,0xaa,0xfb,0xaa,0xfb,0x80,0xfb,0xaa,0xfb,0x80,0xfb,0xaa,0xfb,0x80,0xfb,
+       0xaa,0xfb,0xaa,0xfb,0xfb,0xaa,0xfb,0xfb,0xaa,0xfb,0xaa,0x80,0xfb,0xaa,0xfb,0x80,
+       0xfb,0xfb,0xaa,0xfb,0xaa,0x80,0xfb,0xaa,0xfb,0xaa,0x80,0xfb,0xaa,0xfb,0xfb,0xaa,
+       0xfb,0xaa,0x81,0xaa,0xfb,0xaa,0x80,0xfb,0xaa,0xfb,0x80,0xfb,0xaa,0xfb,0x80,0xfb,
+       0x80,0xaa,0xfb,0xaa,0xfb,0xaa,0xfb,0xaa,0xfb,0xfb,0xaa,0xfb,0xaa,0xfb,0xab,0x80,
+       0xfb,0xaa,0xfb,0xaa,0xfb,0xfb,0xfb,0xaa,0x80,0xfb,0x80,0xfb,0xfb,0xaa,0xfb,0x80,
+       0xfb,0xaa,0xfb,0x81,0xaa,0xfb,0xaa,0xfb,0xaa,0x80,0xfb,0xfb,0xfb,0xaa,0xfb,0x80,
+       0xfb,0xaa,0xfb,0xfb,0xaa,0xfb,0xaa,0x80,0xfb,0xfb,0xaa,0xfb,0xaa,0xfb,0x80,0xab,
+       0x80,0xaa,0xfb,0x80,0xfb,0xaa,0xfb,0xfb,0xaa,0xfb,0xaa,0xfb,0x80,0xfb,0xfb,0xfb,
+       0xaa,0xfb,0xaa,0x80,0xfb,0xaa,0xfb,0xaa,0xfb,0xfb,0xfb,0xaa,0x80,0xaa,0x81,0xaa,
+       0xfb,0xfb,0x80,0xfb,0xfb,0xaa,0x81,0xaa,0xfb,0xfb,0x80,0xaa,0xfb,0xfb,0x80,0xfb,
+       0xaa,0xfb,0x80,0xfb,0xaa,0xfb,0xfb,0xfb,0xaa,0x80,0xfb,0xfb,0xfb,0xaa,0xfb,0xaa,
+       0xfb,0xfb,0xaa,0xfb,0xaa,0x80,0xfb,0xfb,0xaa,0xfb,0xaa,0xfb,0x80,0xab,0x80,0xaa,
+       0xfb,0x80,0xfb,0xaa,0xfb,0xfb,0xaa,0xfb,0xaa,0xfb,0x80,0xfb,0xfb,0xfb,0xaa,0xfb,
+       0xaa,0x80,0xfb,0xaa,0xfb,0xaa,0xfb,0xfb,0xfb,0xaa,0x80,0xaa,0x81,0xaa,0xfb,0xfb,
+       0x80,0xfb,0xfb,0xaa,0x81,0xaa,0xfb,0xfb,0x80,0xaa,0xfb,0xfb,0x80,0xfb,0xaa,0xfb,
+       0x80,0xfb,0xaa,0xfb,0xfb,0xfb,0xaa,0x80,0xfb,0xfb,0xfb,0xaa,0xfb,0xaa,0xfb,0xfb,
+       0xaa,0xfb,0xaa,0xfb,0xfb,0xfb,0xfb,0xaa,0xfb,0x80,0x80,0xfb,0x80,0xfb,0x80,0x80,
+       0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
+       0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x81,0xfb,0x80,0xaa,0x81,0xfb,0xfb,
+       0xfb,0xaa,0xfb,0xaa,0xfb,0x80,0xaa,0xfb,0xfb,0x80,0xfb,0xaa,0x80,0xfb,0xaa,0xfb,
+       0xaa,0x80,0x80,0xfb,0xfb,0xaa,0x81,0xfb,0xaa,0x80,0xfb,0x80,0xfb,0x80,0xfb,0xfb,
+       0xaa,0x80,0xfb,0xfb,0x80,0xfb,0xaa,0xfb,0xfb,0x80,0xfb,0xaa,0xfb,0x80,0xaa,0xfb,
+       0xfb,0x80,0xfb,0x80,0xfb,0xaa,0x80,0xfb,0xaa,0x80,0x80,0xfb,0xfb,0xaa,0x81,0xfb,
+       0xaa,0x80,0xfb,0xfb,0x80,0xfb,0xfb,0xaa,0xfb,0x80,0xfb,0xfb,0xaa,0x81,0xaa,0x80,
+       0xfb,0x80,0xfb,0xaa,0xfb,0x80,0xfb,0xfb,0xfb,0x80,0xfb,0xaa,0xfb,0x80,0xaa,0xfb,
+       0xaa,0xfb,0xfb,0x80,0xfb,0x80,0xfb,0x80,0xfb,0x80,0xfb,0xaa,0x81,0xfb,0x80,0x80,
+       0xfb,0xaa,0x81,0xfb,0x80,0xaa,0x80,0xaa,0xfb,0xfb,0xaa,0xfb,0xfb,0xaa,0x81,0xfb,
+       0xaa,0xfb,0x80,0xfb,0xaa,0x81,0x80,0xfb,0x80,0xfb,0xfb,0xaa,0xfb,0xaa,0x81,0xfb,
+       0xaa,0xfb,0x80,0xfb,0xaa,0x80,0xfb,0xfb,0xfb,0xaa,0x80,0xfb,0xfb,0x80,0xaa,0xfb,
+       0x80,0xfb,0xfb,0xfb,0xaa,0xfb,0xfb,0x80,0xaa,0x81,0x80,0xfb,0xfb,0xaa,0xfb,0x80,
+       0xaa,0x81,0x80,0xfb,0xfb,0xaa,0x81,0xfb,0x80,0xaa,0x80,0xaa,0xfb,0xfb,0xfb,0xaa,
+       0xfb,0x80,0xaa,0xfb,0xaa,0x80,0xfb,0xaa,0xfb,0x80,0xaa,0xfb,0xfb,0x80,0xfb,0xaa,
+       0xfb,0x80,0xaa,0xfb,0xfb,0x80,0xfb,0xaa,0x80,0xfb,0xaa,0xfb,0xaa,0x80,0xfb,0xfb,
+       0x80,0xfb,0xaa,0x80,0xfb,0xfb,0xfb,0xaa,0x80,0xfb,0xfb,0x80,0xaa,0xfb,0x80,0xfb,
+       0xfb,0xfb,0xaa,0xfb,0xfb,0x80,0xaa,0x81,0x80,0xfb,0xfb,0xaa,0xfb,0x80,0xaa,0x81,
+       0x80,0xfb,0xfb,0xaa,0x81,0xfb,0x80,0xaa,0x80,0xaa,0xfb,0xfb,0xfb,0xaa,0xfb,0x80,
+       0xaa,0xfb,0xaa,0x80,0xfb,0xaa,0xfb,0x80,0xaa,0xfb,0xfb,0x80,0xfb,0xaa,0xfb,0x80,
+       0xaa,0xfb,0xfb,0x80,0xfb,0xaa,0x80,0xfb,0xaa,0xfb,0xaa,0x80,0xfb,0x80,0xfb,0x80,
+       0xfb,0x80,0xfb,0x80,0xfb,0x80,0xaa,0x80,0xfb,0x80,0xfb,0xaa,0x80,0x80,0x80,0xfb,
+       0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
+       0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xfb,0x80,0x80,0x80,0x80,0xaa,0x81,0x80,0x80,
+       0xaa,0x80,0x80,0x80,0xfb,0x80,0xfb,0x80,0xfb,0x80,0xaa,0x80,0xfb,0x80,0xfb,0x80,
+       0xfb,0x80,0xfb,0xfb,0xaa,0x80,0x80,0x80,0xaa,0x80,0xfb,0x80,0xaa,0xfb,0x80,0xaa,
+       0x80,0xfb,0x80,0xaa,0x80,0xfb,0x80,0x80,0xfb,0x80,0xaa,0x80,0xfb,0x80,0xfb,0x80,
+       0xfb,0x80,0xaa,0x80,0xfb,0x80,0xfb,0x80,0xfb,0x80,0xfb,0xfb,0xaa,0x80,0x80,0xfb,
+       0x80,0xfb,0x80,0xaa,0x80,0xfb,0x80,0x80,0xfb,0x80,0xfb,0x80,0x80,0xfb,0x80,0x81,
+       0xfb,0xaa,0x80,0x80,0xfb,0x80,0xfb,0x80,0xaa,0x80,0xaa,0x80,0xfb,0x80,0xfb,0x80,
+       0xfb,0x80,0x80,0x80,0xab,0x80,0xaa,0x80,0xfb,0xaa,0x80,0x80,0xfb,0x80,0x80,0xfb,
+       0xaa,0x80,0x81,0xaa,0x80,0xfb,0x80,0xfb,0xfb,0x80,0x80,0x80,0xfb,0x80,0x80,0x80,
+       0xab,0x80,0x80,0xfb,0xaa,0x80,0xfb,0xaa,0x80,0xfb,0x80,0x80,0xfb,0x80,0x80,0x80,
+       0xaa,0x80,0xfb,0x80,0xaa,0x80,0xfb,0x80,0xaa,0x80,0x80,0xfb,0x80,0x80,0xfb,0x80,
+       0xfb,0xaa,0x80,0x80,0xaa,0x80,0x80,0x80,0xfb,0x80,0xfb,0xaa,0x81,0x80,0x80,0x80,
+       0xab,0x80,0xfb,0xaa,0xfb,0x80,0x80,0xaa,0x80,0xfb,0x80,0xfb,0xfb,0x80,0x80,0x80,
+       0xfb,0x80,0xfb,0x80,0xfb,0x80,0xfb,0x80,0xfb,0x80,0xfb,0x80,0xfb,0x80,0xaa,0x80,
+       0xfb,0x80,0xfb,0x80,0xfb,0x80,0xaa,0x80,0xfb,0x80,0xfb,0x80,0xfb,0x80,0xfb,0x80,
+       0xfb,0x80,0xaa,0x80,0xfb,0x80,0xaa,0x80,0x80,0xfb,0x80,0x80,0xfb,0x80,0xfb,0xaa,
+       0x80,0x80,0xaa,0x80,0x80,0x80,0xfb,0x80,0xfb,0xaa,0x81,0x80,0x80,0x80,0xab,0x80,
+       0xfb,0xaa,0xfb,0x80,0x80,0xaa,0x80,0xfb,0x80,0xfb,0xfb,0x80,0x80,0x80,0xfb,0x80,
+       0xfb,0x80,0xfb,0x80,0xfb,0x80,0xfb,0x80,0xfb,0x80,0xfb,0x80,0xaa,0x80,0xfb,0x80,
+       0xfb,0x80,0xfb,0x80,0xaa,0x80,0xfb,0x80,0xfb,0x80,0xfb,0x80,0xfb,0x80,0xfb,0xaa,
+       0x80,0xaa,0x81,0xaa,0x80,0xfb,0xaa,0xfb,0x80,0xfb,0xaa,0x80,0x80,0xfb,0x80,0x80,
+       0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
+       0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xfb,0x80,0x80,0x80,0x80,
+       0xfb,0x80,0xfb,0x80,0xfb,0x80,0xaa,0x80,0xfb,0x80,0x80,0x80,0xfb,0x80,0xaa,0x80,
+       0xfb,0x80,0x80,0x80,0x80,0xfb,0x80,0xfb,0x80,0xfb,0x80,0x80,0x80,0xfb,0x80,0x80,
+       0x80,0xfb,0x80,0x80,0x80,0xfb,0x80,0xaa,0x81,0x80,0x80,0x80,0xfb,0x80,0xaa,0x80,
+       0xfb,0x80,0x80,0x81,0x80,0xaa,0x80,0x80,0x80,0x80,0xaa,0x80,0x80,0x80,0xfb,0x80,
+       0x80,0xaa,0x80,0xfb,0x80,0xfb,0x80,0xaa,0x81,0x80,0x80,0xaa,0x80,0xfb,0x80,0xaa,
+       0x80,0x80,0x80,0xfb,0x80,0x80,0xaa,0x80,0xfb,0x80,0xfb,0x80,0xfb,0x80,0x80,0x80,
+       0xfb,0x80,0xaa,0x81,0x80,0x80,0xfb,0x80,0xfb,0x80,0x80,0xfb,0x80,0xaa,0x80,0xfb,
+       0x80,0xfb,0x80,0x80,0x80,0xfb,0x80,0x80,0x80,0xaa,0x80,0xfb,0x80,0x80,0xaa,0x81,
+       0x80,0x80,0xfb,0x80,0x80,0xfb,0x80,0x80,0x80,0xfb,0x80,0xaa,0x81,0x80,0x80,0xfb,
+       0x80,0xfb,0x80,0x80,0x80,0xfb,0x80,0x80,0x80,0xfb,0x80,0xfb,0x80,0xfb,0xaa,0x80,
+       0xfb,0x80,0x80,0xfb,0x80,0xfb,0x80,0xfb,0x80,0xaa,0x80,0x80,0x80,0x80,0xaa,0x81,
+       0x80,0x80,0xfb,0x80,0x80,0x80,0x80,0xfb,0x80,0xfb,0x80,0x80,0x80,0xaa,0x80,0xfb,
+       0x80,0x80,0xaa,0x80,0xfb,0x80,0x80,0xaa,0x80,0x80,0x80,0xaa,0x81,0x80,0xaa,0xfa,
+       0xfb,0x80,0xaa,0x80,0xfb,0x80,0x80,0x80,0xfb,0x80,0xaa,0x80,0xfb,0x80,0x80,0x80,
+       0xaa,0x80,0x80,0xfb,0x80,0x80,0x80,0xfb,0x80,0xfb,0x80,0xfb,0xaa,0x80,0xfb,0x80,
+       0x80,0xfb,0x80,0xfb,0x80,0xfb,0x80,0xaa,0x80,0x80,0x80,0x80,0xaa,0x81,0x80,0x80,
+       0xfb,0x80,0x80,0x80,0x80,0xfb,0x80,0xfb,0x80,0x80,0x80,0xaa,0x80,0xfb,0x80,0x80,
+       0xaa,0x80,0xfb,0x80,0x80,0xaa,0x80,0x80,0x80,0xaa,0x81,0x80,0xaa,0xfa,0xfb,0x80,
+       0xaa,0x80,0xfb,0x80,0x80,0x80,0xfb,0x80,0xaa,0x80,0xfb,0x80,0x80,0x80,0xaa,0x80,
+       0x80,0x81,0x80,0x80,0xfb,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xfb,0x80,0x80,0x80,
+       0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
+       0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xfb,0x80,
+       0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xfb,0x80,0x80,0x80,0x80,
+       0x80,0x80,0x80,0x80,0xfb,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xfb,0x80,0x80,0x80,
+       0xfb,0x80,0x80,0x80,0xfb,0x80,0x80,0x80,0x80,0x80,0x80,0xfb,0x80,0x80,0x80,0x80,
+       0x80,0x80,0x80,0x80,0x80,0xfb,0x80,0x80,0xfb,0x80,0xfb,0x80,0x80,0x80,0xfb,0x80,
+       0x80,0xfb,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xfb,0x80,0x80,0x80,0x80,
+       0x80,0x80,0xfb,0x80,0x80,0xfb,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xfb,
+       0x80,0x80,0x80,0x80,0x80,0xfb,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xfb,0x80,0x80,
+       0x80,0x80,0x80,0x80,0xfb,0x80,0x80,0x80,0xfb,0x80,0x80,0x80,0x80,0xfb,0x80,0x80,
+       0x80,0xfb,0x80,0x80,0x80,0x80,0x80,0x80,0xfb,0x80,0x80,0x80,0x80,0x80,0x80,0xfb,
+       0x80,0x80,0x80,0x80,0xfb,0x80,0x80,0x80,0xfb,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
+       0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xfb,0x80,0x80,0xfb,0x80,0xfb,0x80,
+       0x80,0xfb,0x80,0x80,0x80,0xfb,0x80,0x80,0x80,0x80,0x80,0x80,0xfb,0x80,0x80,0x80,
+       0x80,0xfb,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xfb,0x80,0x80,0x80,0x80,0x80,
+       0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xfb,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
+       0xfb,0x80,0xfb,0x80,0x80,0x80,0xfb,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
+       0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xfb,0x80,0x80,0xfb,0x80,0xfb,0x80,0x80,0xfb,
+       0x80,0x80,0x80,0xfb,0x80,0x80,0x80,0x80,0x80,0x80,0xfb,0x80,0x80,0x80,0x80,0xfb,
+       0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xfb,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
+       0x80,0x80,0x80,0x80,0x80,0xfb,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xfb,0x80,
+       0xfb,0x80,0x80,0xfb,0x80,0x80,0x80,0xfb,0x80,0xfb,0x80,0x80,0xfb,0x80,0x80,0x80,
+       0x80,0xfb,0x80,0x80,0x80,0x80,0x80,0x80,
+
+};
diff --git a/i386/util/machOconv.c b/i386/util/machOconv.c
new file mode 100644 (file)
index 0000000..88464e3
--- /dev/null
@@ -0,0 +1,156 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
+ * Reserved.  This file contains Original Code and/or Modifications of
+ * Original Code as defined in and that are subject to the Apple Public
+ * Source License Version 1.1 (the "License").  You may not use this file
+ * except in compliance with the License.  Please obtain a copy of the
+ * License at http://www.apple.com/publicsource and read it before using
+ * this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+#include <stdio.h>
+
+#include <mach/mach.h>
+#include <sys/file.h>
+#include <mach-o/loader.h>
+#include <architecture/byte_order.h>
+
+int    infile, outfile;
+
+struct mach_header     mh;
+unsigned               cmds;
+
+boolean_t              swap_ends;
+
+static unsigned long swap(
+    unsigned long x
+)
+{
+    if (swap_ends)
+       return NXSwapLong(x);
+    else
+       return x;
+}
+
+main(argc, argv)
+int    argc;
+char   *argv[];
+{
+    kern_return_t      result;
+    vm_address_t       data;
+    int                        nc, ncmds;
+    unsigned           cp;
+    
+    if (argc == 2) {
+       infile = open(argv[1], O_RDONLY);
+       if (infile < 0)
+           goto usage;
+       outfile = fileno(stdout);
+    }
+    else if (argc == 3) {
+       infile = open(argv[1], O_RDONLY);
+       if (infile < 0)
+           goto usage;
+       outfile = open(argv[2], O_WRONLY|O_CREAT|O_TRUNC, 0644);
+       if (outfile < 0)
+           goto usage;
+    }
+    else {
+usage:
+       fprintf(stderr, "usage: machOconv inputfile [outputfile]\n");
+       exit(1);
+    }
+    
+    nc = read(infile, &mh, sizeof (mh));
+    if (nc < 0) {
+       perror("read mach header");
+       exit(1);
+    }
+    if (nc < sizeof (mh)) {
+       fprintf(stderr, "read mach header: premature EOF %d\n", nc);
+       exit(1);
+    }
+    if (mh.magic == MH_MAGIC)
+       swap_ends = FALSE;
+    else if (mh.magic == MH_CIGAM)
+       swap_ends = TRUE;
+    else {
+       fprintf(stderr, "bad magic number %x\n", mh.magic);
+       exit(1);
+    }
+
+    cmds = calloc(swap(mh.sizeofcmds), sizeof (char));
+    if (cmds == 0) {
+       fprintf(stderr, "alloc load commands: no memory\n");
+       exit(1);
+    }
+    nc = read(infile, cmds, swap(mh.sizeofcmds));
+    if (nc < 0) {
+       perror("read load commands");
+       exit(1);
+    }
+    if (nc < swap(mh.sizeofcmds)) {
+       fprintf(stderr, "read load commands: premature EOF %d\n", nc);
+       exit(1);
+    }
+
+    for (      ncmds = swap(mh.ncmds), cp = cmds;
+               ncmds > 0; ncmds--) {
+           boolean_t   isDATA;
+           unsigned    vmsize;
+
+#define lcp    ((struct load_command *)cp)    
+       switch(swap(lcp->cmd)) {
+
+       case LC_SEGMENT:
+#define scp    ((struct segment_command *)cp)
+           isDATA = (strcmp(scp->segname, "__DATA") == 0);
+           if (isDATA)
+               vmsize = swap(scp->filesize);
+           else
+               vmsize = swap(scp->vmsize);
+           result = vm_allocate(mach_task_self(), &data, vmsize, TRUE);
+           if (result != KERN_SUCCESS) {
+               mach_error("vm_allocate segment data", result);
+               exit(1);
+           }
+
+           lseek(infile, swap(scp->fileoff), L_SET);
+           nc = read(infile, data, swap(scp->filesize));
+           if (nc < 0) {
+               perror("read segment data");
+               exit(1);
+           }
+           if (nc < swap(scp->filesize)) {
+               fprintf(stderr, "read segment data: premature EOF %d\n", nc);
+               exit(1);
+           }
+
+           nc = write(outfile, data, vmsize);
+           if (nc < vmsize) {
+               perror("write segment data");
+               exit(1);
+           }
+           
+           vm_deallocate(mach_task_self(), data, vmsize);
+           break;
+       }
+
+       cp += swap(lcp->cmdsize);
+    }
+       
+    exit(0);
+}
diff --git a/i386/util/mkfont.c b/i386/util/mkfont.c
new file mode 100644 (file)
index 0000000..caa9e4d
--- /dev/null
@@ -0,0 +1,581 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
+ * Reserved.  This file contains Original Code and/or Modifications of
+ * Original Code as defined in and that are subject to the Apple Public
+ * Source License Version 1.1 (the "License").  You may not use this file
+ * except in compliance with the License.  Please obtain a copy of the
+ * License at http://www.apple.com/publicsource and read it before using
+ * this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * mkfont ASCII_BITMAP_INPUT [-c (generate .c file)] [BITMAP_OUTPUT]
+ *
+ * This program parses the ascii bitmap (screen font) description given as
+ * input and produces either a binary font file suitable for use with
+ * "fbshow" or a .c file containing an initialized font_c_t struct. 
+ *
+ * If the output file is not specified, it is created in the current directory
+ * and given the name FontFamily-FontFace.PointSize (with a .c appended if
+ * the -c option is specified); e.g. for 18 point Helvetica Bold, the output
+ * file would be: Helvetica-Bold.18.
+ *
+ * The name of the font_c_t struct created by  the -c option is
+ * FontFamily_FontFace_PointSize.
+ */
+#define        EXPORT_BOOLEAN
+#import <stdio.h>
+#import <libc.h>
+#import <ctype.h>
+#import <sys/file.h>
+#import <mach/boolean.h>
+#import "font.h"
+
+#define        BITSINCR        (8*1024*8)              /* in honest-to-god bits! */
+#define        MAXLINE         256
+
+typedef enum {
+       ENDCHAR_LINE, ENCODING_LINE, DWIDTH_LINE, SWIDTH_LINE, BBX_LINE,
+       BITMAP_LINE, DATA_LINE, FONT_LINE, SIZE_LINE, FONTBOUNDINGBOX_LINE,
+       CHARS_LINE, STARTCHAR_LINE, ENDFONT_LINE, STARTPROPERTIES_LINE,
+       ENDPROPERTIES_LINE, UNKNOWN_LINE, STARTFONT_LINE, COMMENT_LINE
+} line_t;
+
+typedef struct {
+       char *string;
+       line_t linetype;
+       int len;
+} linetbl_t;
+
+#define        LINETBL(x)              { #x,   x##_LINE,       (sizeof #x) - 1 }
+
+linetbl_t linetbl[] = {
+       LINETBL(ENDCHAR),
+       LINETBL(ENCODING),
+       LINETBL(DWIDTH),
+       LINETBL(SWIDTH),
+       LINETBL(BBX),
+       LINETBL(BITMAP),
+       LINETBL(DATA),
+       LINETBL(FONT),
+       LINETBL(SIZE),
+       LINETBL(FONTBOUNDINGBOX),
+       LINETBL(CHARS),
+       LINETBL(STARTCHAR),
+       LINETBL(ENDFONT),
+       LINETBL(STARTPROPERTIES),
+       LINETBL(ENDPROPERTIES),
+       LINETBL(UNKNOWN),
+       LINETBL(STARTFONT),
+       LINETBL(COMMENT),
+       { NULL, UNKNOWN_LINE, 0 }
+};
+
+static void read_char_description(void);
+static void setbits(int bitx, int nbits, int scanbits);
+static void fatal(const char *format, ...);
+static void parse_error(void);
+static void duplicate(char *line);
+static line_t linetype(char *linebuf);
+static char *getline(char *buf, int buflen, FILE *stream);
+static void write_c_file(const char *outfile);
+static void write_bin_file(const char *outfile);
+
+const char *program_name;
+font_t font;
+unsigned char *bits = NULL;
+int bitsused;                                  /* in honest-to-god bits */
+int bitsalloc;                                 /* in honest-to-god bits */
+char linebuf[MAXLINE];
+FILE *input, *output;
+
+void
+main(int argc, const char * const argv[])
+{
+       const char *infile;
+       const char *outfile = NULL;
+       char filename[FONTNAMELEN+20];
+       boolean_t did_endfont_line, did_font_line, did_size_line,
+           did_fontboundingbox_line, did_chars_line, did_startfont_line;
+       int chars, chars_processed, nprops, bytes;
+       boolean_t gen_c_file = FALSE;
+       const char *argp;
+       char c;
+       short s1, s2, s3, s4;
+       
+       program_name = *argv++; argc--;
+       if (argc < 1 || argc > 3) {
+               fatal("Usage: %s ASCII_BITMAP_INPUT [-c (generate .c file)] "
+                       "[BITMAP_OUTPUT]", program_name);
+       }
+       
+       infile = *argv++; argc--;
+       while(argc) {
+               if (**argv == '-') {
+                       argp = *argv++ + 1; 
+                       argc--;
+                       while (c  = *argp++) {
+                               switch(c) {
+                                  case 'c':
+                                       gen_c_file = TRUE;
+                                       break;
+                                   default:
+                                       fatal("Usage: mkfont "
+                                          "ASCII_BITMAP_INPUT "
+                                          "[-c (generate .c file)]");
+                               }
+                       }
+               }
+               else {
+                       outfile = *argv++; argc--;
+               }
+       }
+       
+       if ((input = fopen(infile, "r")) == NULL)
+               fatal("Can't open input file %s", infile);
+       
+       did_endfont_line = FALSE;
+       did_font_line = FALSE;
+       did_size_line = FALSE;
+       did_fontboundingbox_line = FALSE;
+       did_chars_line = FALSE;
+       did_startfont_line = FALSE;
+       chars_processed = 0;
+       chars = 0;
+       
+       while (!did_endfont_line
+        && getline(linebuf, sizeof linebuf, input) != NULL) {
+               switch (linetype(linebuf)) {
+               case COMMENT_LINE:
+               default:
+                       break;
+               case ENDCHAR_LINE:
+               case ENCODING_LINE:
+               case DWIDTH_LINE:
+               case SWIDTH_LINE:
+               case BBX_LINE:
+               case BITMAP_LINE:
+               case DATA_LINE:
+                       parse_error();
+               case STARTFONT_LINE:
+                       if (did_startfont_line)
+                               duplicate("STARTFONT");
+                       did_startfont_line = TRUE;
+                       break;
+               case FONT_LINE:
+                       if (sscanf(linebuf, "%*s %s", font.font) != 1)
+                               parse_error();
+                       if (did_font_line)
+                               duplicate("FONT");
+                       did_font_line = TRUE;
+                       break;
+               case SIZE_LINE:
+                       if (sscanf(linebuf, "%*s %hd", &font.size) != 1)
+                               parse_error();
+                       if (did_size_line)
+                               duplicate("SIZE");
+                       did_size_line = TRUE;
+                       break;
+               case FONTBOUNDINGBOX_LINE:
+                       if (sscanf(linebuf, "%*s %hd %hd %hd %hd",
+                        &s1, &s2, &s3, &s4) != 4)
+                               parse_error();
+                       font.bbx.width = s1;
+                       font.bbx.height = s2;
+                       font.bbx.xoff = s3;
+                       font.bbx.yoff = s4;
+                       if (did_fontboundingbox_line)
+                               duplicate("FONTBOUNDINGBOX");
+                       did_fontboundingbox_line = TRUE;
+                       break;
+               case CHARS_LINE:
+                       if (sscanf(linebuf, "%*s %d", &chars) != 1)
+                               parse_error();
+                       if (did_chars_line)
+                               duplicate("CHARS");
+                       did_chars_line = TRUE;
+                       break;
+               case STARTCHAR_LINE:
+                       read_char_description();
+                       chars_processed++;
+                       break;
+               case ENDFONT_LINE:
+                       did_endfont_line = TRUE;
+                       break;
+               case STARTPROPERTIES_LINE:
+                       if (sscanf(linebuf, "%*s %d", &nprops) != 1)
+                               parse_error();
+                       while (nprops-- > 0 && getline(linebuf, sizeof linebuf, input) != NULL)
+                               continue;
+                       if (nprops != 0 || getline(linebuf, sizeof linebuf, input) == NULL
+                         || linetype(linebuf) != ENDPROPERTIES_LINE)
+                               parse_error();
+                       break;
+               }
+       }
+       fclose(input);
+
+       if (! did_font_line || ! did_size_line || ! did_fontboundingbox_line
+        || ! did_chars_line || ! did_endfont_line || ! did_startfont_line)
+               fatal("Incomplete input file");
+       if (chars_processed != chars)
+               fatal("Input file missing character descriptions");
+       if (bits == NULL)
+               fatal("No bitmaps generated!");
+       if(gen_c_file) {
+               /*
+                * Generate a compilable file. 
+                */
+               write_c_file(outfile);
+       }
+       else {
+               write_bin_file(outfile);
+       }
+}
+
+static void
+read_char_description(void)
+{
+       boolean_t did_endchar_line, did_encoding_line, did_dwidth_line, did_bbx_line,
+        did_bitmap_line;
+       int encoding, scanbits, nbits, h;
+       bitmap_t bm;
+       short s1, s2, s3, s4;
+       
+       did_endchar_line = FALSE;
+       did_encoding_line = FALSE;
+       did_dwidth_line = FALSE;
+       did_bbx_line = FALSE;
+       did_bitmap_line = FALSE;
+       nbits = 0;
+       bzero(&bm, sizeof bm);
+       while (! did_endchar_line && getline(linebuf, sizeof linebuf, input) != NULL) {
+               switch (linetype(linebuf)) {
+               case FONT_LINE:
+               case SIZE_LINE:
+               case FONTBOUNDINGBOX_LINE:
+               case ENDFONT_LINE:
+               case CHARS_LINE:
+               case DATA_LINE:
+               case STARTPROPERTIES_LINE:
+               case ENDPROPERTIES_LINE:
+               case STARTFONT_LINE:
+                       parse_error();
+               case ENCODING_LINE:
+                       if (sscanf(linebuf, "%*s %d", &encoding) != 1)
+                               parse_error();
+                       if (did_encoding_line)
+                               duplicate("ENCODING");
+                       did_encoding_line = TRUE;
+                       break;
+               case ENDCHAR_LINE:
+                       did_endchar_line = TRUE;
+                       break;
+               case DWIDTH_LINE:
+                       if (sscanf(linebuf, "%*s %hd", &s1) != 1)
+                               parse_error();
+                       bm.dwidth = s1;
+                       if (did_dwidth_line)
+                               duplicate("DWIDTH");
+                       did_dwidth_line = TRUE;
+                       break;
+               case BBX_LINE:
+                       if (sscanf(linebuf, "%*s %hd %hd %hd %hd",
+                        &s1, &s2, &s3, &s4) != 4)
+                               parse_error();
+                       bm.bbx.width = s1;
+                       bm.bbx.height = s2;
+                       bm.bbx.xoff = s3;
+                       bm.bbx.yoff = s4;
+
+                       if (did_bbx_line)
+                               duplicate("BBX");
+                       did_bbx_line = TRUE;
+                       break;
+               case BITMAP_LINE:
+                       if (! did_bbx_line)
+                               fatal("BITMAP line not proceeded by BBX line");
+                       if (did_bitmap_line)
+                               duplicate("BITMAP");
+                       did_bitmap_line = TRUE;
+                       nbits = bm.bbx.width * bm.bbx.height;
+                       while (bitsused + nbits > bitsalloc) {
+                               if (bits == NULL) {
+                                       bits = (unsigned char *)malloc(BITSINCR >> 3);
+                                       bitsused = 1;   /* bitx == 0 means no char */
+                               } else
+                                       bits = (unsigned char *)realloc(bits,
+                                        (BITSINCR + bitsalloc + 7) >> 3);
+                               if (bits == NULL)
+                                       fatal("Out of memory");
+                               bitsalloc += (BITSINCR >> 3) * 8;
+                       }
+                       bm.bitx = bitsused;
+                       for (h = 0; h < bm.bbx.height; h++) {
+                               if (getline(linebuf, sizeof linebuf, input) == NULL)
+                                       fatal("Unexpected EOF on input");
+                               if (linetype(linebuf) != DATA_LINE)
+                                       parse_error();
+                               if (sscanf(linebuf, "%x", &scanbits) != 1)
+                                       parse_error();
+                               setbits(bm.bitx + h * bm.bbx.width, bm.bbx.width, scanbits);
+                       }
+                       break;
+               }
+       }
+       if ( ! did_endchar_line || ! did_encoding_line || ! did_dwidth_line
+        || ! did_bbx_line || ! did_bitmap_line)
+               parse_error();
+       if (encoding >= ENCODEBASE && encoding <= ENCODELAST) {
+               font.bitmaps[encoding - ENCODEBASE] = bm;
+               bitsused += nbits;
+       }
+       return;
+}
+
+static void
+setbits(int bitx, int nbits, int scanbits)
+{
+       int i, mask;
+       
+       for (i = 0; i < nbits; i++) {
+               mask = 0x80 >> ((bitx + i) & 0x7);
+               if (scanbits & (1 << (((nbits + 7) & ~7) - i - 1)))
+                       bits[(bitx + i) >> 3] |= mask;
+               else
+                       bits[(bitx + i) >> 3] &= ~mask;
+       }
+}
+       
+static void
+fatal(const char *format, ...)
+{
+       va_list ap;
+       
+       va_start(ap, format);
+       fprintf(stderr, "%s: ", program_name);
+       vfprintf(stderr, format, ap);
+       fprintf(stderr, "\n");
+       va_end(ap);
+       exit(1);
+}
+
+static int lineNum = 0;
+
+static void
+parse_error(void)
+{
+       fatal("Couldn't parse line %d: <%s>", lineNum, linebuf);
+}
+
+static void
+duplicate(char *line)
+{
+       fatal("Duplicate declaration of %s", line);
+}
+
+static line_t
+linetype(char *linebuf)
+{
+       linetbl_t *ltp;
+       int len;
+
+       for (ltp = linetbl; ltp->string; ltp++) {
+               if (strncmp(ltp->string, linebuf, ltp->len) == 0
+                && (linebuf[ltp->len] == '\0' || isspace(linebuf[ltp->len])))
+                       return ltp->linetype;
+       }
+       len = strlen(linebuf);
+       if (len == 0)
+               return UNKNOWN_LINE;
+       while (--len > 0)
+               if (! isxdigit(*linebuf++))
+                       break;
+       return (len == 0) ? DATA_LINE : UNKNOWN_LINE;
+}
+
+static char *
+getline(char *buf, int buflen, FILE *stream)
+{
+       char *retval;
+       int len;
+       
+       retval = fgets(buf, buflen, stream);
+       lineNum++;
+
+       if (retval == NULL)
+               return retval;
+               
+       len = strlen(buf);
+       while (len > 0 && isspace(buf[--len]))
+               buf[len] = '\0';
+       return retval;
+}
+
+/*
+ * generate raw binary file which will get map_fd'd into
+ * a font_t in fbshow.
+ */
+static void write_bin_file(const char *outfile)
+{
+       char filename[FONTNAMELEN+20];
+       FILE *output;
+       int bytes;
+               
+       /*
+        * Generate default filename if necessary.
+        */     
+       if (outfile == NULL) {
+               sprintf(filename, "%s.%d", font.font, font.size);
+               outfile = filename;
+       }
+       if ((output = fopen(outfile, "w")) == NULL)
+               fatal("Can't create output file %s", outfile);
+               
+       /*
+        * Write the font_t.
+        */
+       if (fwrite(&font, sizeof font, 1, output) != 1)
+               fatal("Write to file %s failed", outfile);
+
+       /*
+        * Now the bit array (declared  in font_t as size 0).
+        */
+       bytes = (bitsused + 7) >> 3;
+       if (fwrite(bits, sizeof(unsigned char), bytes, output) != bytes) {
+               fatal("Write to file %s failed", output);
+       }
+       fclose(output);
+}
+
+/*
+ * Generate a compilable file.
+ */
+#define FONTNAME_STRING_NAME   "fontname"
+#define BITS_ARRAY_NAME                "bits_array"
+
+static void write_c_file(const char *outfile)
+{
+       char structname[FONTNAMELEN+20];
+       char filename[FONTNAMELEN+20];
+       char fontname[FONTNAMELEN+20];
+       char *np;
+       FILE  *out;
+       char line[120];
+       int bytes;
+       unsigned char *bitp;
+       int loop;
+       bitmap_t *bmap;
+       
+       /*
+        * Generate default filename if necessary.
+        */     
+       if (outfile == NULL) {
+               sprintf(filename, "%s.%d.c", font.font, font.size);
+               outfile = filename;
+       }
+
+       if ((out = fopen(outfile, "w")) == NULL)
+               fatal("Can't create output file %s", outfile);
+       
+       /*
+        * generate the name of the font_c_t struct, converting 
+        * possible '-' into '_'.
+        */
+       sprintf(structname, "%s_%d", font.font, font.size);
+       for(np=structname; *np; np++) {
+               if(*np == '-') {
+                       *np = '_';
+               }
+       }
+       
+       /*
+        * Start emitting code. Place fontname and bits_array first to keep
+        * them static.
+        */
+       fprintf(out, "/* generated by mkfont */\n\n");
+       
+       /*
+        * FIXME - maybe this should be passed in in argv...
+        */
+       fprintf(out, "#import \"font.h\"\n\n");
+               
+       /*
+        * The bit array first.
+        */
+       fprintf(out, "static const char %s[] = {\n", BITS_ARRAY_NAME);
+       bytes = (bitsused + 7) >> 3;
+       bitp = bits;
+       fprintf(out, "\t");
+       for(loop=0; loop<bytes; loop++) {
+               fprintf(out, "0x%02x, ", *bitp++);
+               if(loop % 8 == 7) {
+                       /*
+                        * Line wrap.
+                        */
+                       fprintf(out, "\n\t");
+               }
+       }
+
+       fprintf(out, "\n};\n\n");
+       
+       /*
+        * Finally, the font_c_t itself. 
+        */
+       fprintf(out, "const font_c_t %s = {\n", structname); 
+       fprintf(out, "\t\"%s-%d\",\n", font.font, font.size);
+       fprintf(out, "\t%d,\n", font.size);
+       fprintf(out, "\t{%d, %d, %d, %d},\n",
+               font.bbx.width, font.bbx.height, 
+               font.bbx.xoff, font.bbx.yoff);
+               
+       /*
+        * bitmap structs.
+        */
+       bmap = font.bitmaps;
+       fprintf(out, "\t{\n");
+       for(loop=0; loop<(ENCODELAST - ENCODEBASE + 1); loop++) {
+               fprintf(out, "\t    { {%4d, %4d, %4d, %4d}, %4d, %6d },",
+                       bmap->bbx.width, bmap->bbx.height,
+                       bmap->bbx.xoff, bmap->bbx.yoff,
+                       bmap->dwidth, bmap->bitx);
+               bmap++;
+               fprintf(out, "\t/* 0x%02x */\n", loop + ENCODEBASE);
+       }
+       fprintf(out, "\n\t},\n");
+       
+       /*
+        * and the bits array ptr.
+        */
+       fprintf(out, "\t%s,\n", BITS_ARRAY_NAME);
+       fprintf(out, "};\n");
+       
+       /*
+        * now some junk to make our code smaller.
+        */
+       fprintf(out, "\n#define %s_BBX_WIDTH\t%d\n",
+                   structname, font.bbx.width);
+       fprintf(out, "#define %s_BBX_HEIGHT\t%d\n",
+                   structname, font.bbx.height);
+       fprintf(out, "#define %s_BBX_XOFF\t%d\n",
+                   structname, font.bbx.xoff);
+       fprintf(out, "#define %s_BBX_YOFF\t%d\n",
+                   structname, font.bbx.yoff);
+
+       fclose(out);    
+}
+
diff --git a/i386/util/ns_box.h b/i386/util/ns_box.h
new file mode 100644 (file)
index 0000000..d087fa8
--- /dev/null
@@ -0,0 +1,27 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
+ * Reserved.  This file contains Original Code and/or Modifications of
+ * Original Code as defined in and that are subject to the Apple Public
+ * Source License Version 1.1 (the "License").  You may not use this file
+ * except in compliance with the License.  Please obtain a copy of the
+ * License at http://www.apple.com/publicsource and read it before using
+ * this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+extern struct bitmap ns_box_bitmap;
+
+#define ns_box_bitmap_WIDTH    312
+#define ns_box_bitmap_HEIGHT   176
diff --git a/i386/util/ns_box.tiff b/i386/util/ns_box.tiff
new file mode 100644 (file)
index 0000000..1e5ade1
Binary files /dev/null and b/i386/util/ns_box.tiff differ
diff --git a/i386/util/ns_box_bitmap.h b/i386/util/ns_box_bitmap.h
new file mode 100644 (file)
index 0000000..9731bc7
--- /dev/null
@@ -0,0 +1,397 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
+ * Reserved.  This file contains Original Code and/or Modifications of
+ * Original Code as defined in and that are subject to the Apple Public
+ * Source License Version 1.1 (the "License").  You may not use this file
+ * except in compliance with the License.  Please obtain a copy of the
+ * License at http://www.apple.com/publicsource and read it before using
+ * this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+unsigned char ns_box_bitmap_plane_0[] =
+ {
+// plane 0
+0xda, 0xff, 0xdb, 0xff, 0x00, 0xfc, 0x00, 0xc0, 0xdc, 0x00, 0x00, 
+0x02, 0x00, 0xc0, 0xdc, 0x00, 0x00, 0x02, 0x00, 0xc0, 0xdc, 0x00, 
+0x00, 0x02, 0x00, 0xc0, 0xdc, 0x00, 0x00, 0x02, 0x00, 0xc0, 0xdc, 
+0x00, 0x00, 0x02, 0x00, 0xc0, 0xdc, 0x00, 0x00, 0x02, 0x00, 0xc0, 
+0xdc, 0x00, 0x00, 0x02, 0x00, 0xc0, 0xdc, 0x00, 0x00, 0x02, 0x00, 
+0xc0, 0xdc, 0x00, 0x00, 0x02, 0x00, 0xc0, 0xdc, 0x00, 0x00, 0x02, 
+0x00, 0xc0, 0xdc, 0x00, 0x00, 0x02, 0x00, 0xc0, 0xdc, 0x00, 0x00, 
+0x02, 0x00, 0xc0, 0xf8, 0x00, 0x01, 0x0f, 0xe0, 0xf8, 0x00, 0x00, 
+0xfe, 0xf1, 0x00, 0x00, 0x02, 0x00, 0xc0, 0xf8, 0x00, 0x0c, 0x30, 
+0x04, 0x07, 0xff, 0xc0, 0x3f, 0xff, 0xff, 0xf8, 0x7f, 0xc3, 0x00, 
+0x4f, 0xfc, 0xff, 0x00, 0xf8, 0xf8, 0x00, 0x00, 0x02, 0x00, 0xc0, 
+0xf8, 0x00, 0x12, 0xc5, 0x57, 0x04, 0x00, 0x10, 0x20, 0x00, 0x50, 
+0x04, 0x40, 0x86, 0x55, 0x68, 0x00, 0x05, 0x00, 0x02, 0x80, 0x02, 
+0xf8, 0x00, 0x00, 0x02, 0x00, 0xc0, 0xf9, 0x00, 0x0d, 0x01, 0xaa, 
+0xab, 0x84, 0xaa, 0xac, 0x2a, 0xaa, 0xd5, 0x5c, 0x55, 0x8c, 0xaa, 
+0xa9, 0xfe, 0x55, 0x03, 0x56, 0x95, 0x55, 0x80, 0xf9, 0x00, 0x00, 
+0x02, 0x00, 0xc0, 0xf9, 0x00, 0x10, 0x01, 0x55, 0x55, 0x45, 0x55, 
+0x56, 0x25, 0x55, 0x52, 0xa8, 0x4a, 0x89, 0x55, 0x6a, 0xaa, 0xad, 
+0x2a, 0xfe, 0xaa, 0x00, 0xc0, 0xf9, 0x00, 0x00, 0x02, 0x00, 0xc0, 
+0xf9, 0x00, 0x0d, 0x02, 0xaa, 0xaa, 0x84, 0xaa, 0xab, 0x2a, 0xaa, 
+0xd5, 0x52, 0x55, 0x9a, 0xaa, 0xa9, 0xfe, 0x55, 0x03, 0x56, 0x95, 
+0x55, 0x60, 0xf9, 0x00, 0x00, 0x02, 0x00, 0xc0, 0xf9, 0x00, 0x10, 
+0x02, 0x55, 0x55, 0xa5, 0x55, 0x55, 0xa5, 0x55, 0x52, 0xae, 0x4a, 
+0x95, 0x55, 0x6a, 0xaa, 0xad, 0x2a, 0xfe, 0xaa, 0x00, 0xb0, 0xf9, 
+0x00, 0x00, 0x02, 0x00, 0xc0, 0xf9, 0x00, 0x14, 0x04, 0xaf, 0xea, 
+0xc4, 0xaf, 0xaa, 0x2a, 0xff, 0xd5, 0x54, 0x55, 0x92, 0xbf, 0xa9, 
+0x55, 0x55, 0x57, 0xfe, 0x95, 0xf5, 0x40, 0xf9, 0x00, 0x00, 0x02, 
+0x00, 0xc0, 0xf9, 0x00, 0x14, 0x05, 0x5c, 0x75, 0x45, 0x58, 0xd5, 
+0xe5, 0x40, 0x12, 0xa9, 0x4a, 0x95, 0x70, 0xef, 0xea, 0xfd, 0x2a, 
+0x00, 0xab, 0x1a, 0xb8, 0xf9, 0x00, 0x00, 0x02, 0x00, 0xc0, 0xf9, 
+0x00, 0x14, 0x04, 0xba, 0x4a, 0xd4, 0xa8, 0x4a, 0xaa, 0xc0, 0x15, 
+0x57, 0x55, 0x92, 0xa0, 0x28, 0x15, 0x81, 0x56, 0x00, 0x95, 0x09, 
+0x50, 0xf9, 0x00, 0x00, 0x02, 0x00, 0xc0, 0xf9, 0x00, 0x14, 0x09, 
+0x58, 0x05, 0x65, 0x58, 0x15, 0xa5, 0x40, 0x12, 0xaa, 0x4a, 0x95, 
+0x60, 0x00, 0x4a, 0x81, 0x2a, 0x00, 0xab, 0x02, 0xb0, 0xf9, 0x00, 
+0x00, 0x02, 0x00, 0xc0, 0xf9, 0x00, 0x14, 0x06, 0xb4, 0x12, 0x94, 
+0xa8, 0x4a, 0xaa, 0xc0, 0x15, 0x54, 0xd5, 0x92, 0xb8, 0x10, 0x55, 
+0x81, 0x56, 0x00, 0x95, 0x09, 0x50, 0xf9, 0x00, 0x00, 0x02, 0x00, 
+0xc0, 0xf9, 0x00, 0x14, 0x09, 0x54, 0x15, 0x65, 0x58, 0x55, 0xa5, 
+0x7f, 0xd2, 0xab, 0xca, 0x81, 0x5c, 0x00, 0x4a, 0x81, 0x2b, 0xfe, 
+0xab, 0x0a, 0xb0, 0xf9, 0x00, 0x00, 0x02, 0x00, 0xc0, 0xf9, 0x00, 
+0x14, 0x0a, 0xb0, 0x12, 0xa4, 0xa8, 0xca, 0xaa, 0x80, 0x95, 0x55, 
+0x55, 0x8a, 0xae, 0x00, 0x55, 0x81, 0x54, 0x04, 0x95, 0x19, 0x50, 
+0xf9, 0x00, 0x00, 0x02, 0x00, 0xc0, 0xf9, 0x00, 0x14, 0x09, 0x50, 
+0x15, 0x65, 0x5f, 0x95, 0xa5, 0x55, 0x92, 0xaa, 0x4a, 0x89, 0x57, 
+0x00, 0x4a, 0x81, 0x2a, 0xac, 0xab, 0xf2, 0xb0, 0xf9, 0x00, 0x00, 
+0x02, 0x00, 0xc0, 0xf9, 0x00, 0x14, 0x0a, 0xb0, 0x12, 0xa4, 0xa8, 
+0x2b, 0x6a, 0xaa, 0x95, 0x55, 0x95, 0x80, 0xab, 0x80, 0x55, 0x81, 
+0x55, 0x54, 0x95, 0x05, 0x68, 0xf9, 0x00, 0x00, 0x02, 0x00, 0xc0, 
+0xf9, 0x00, 0x14, 0x09, 0x50, 0x15, 0x65, 0x55, 0x55, 0x25, 0x55, 
+0x92, 0xaa, 0xaa, 0x82, 0x55, 0xc0, 0x4a, 0x81, 0x2a, 0xac, 0xaa, 
+0xaa, 0xa0, 0xf9, 0x00, 0x00, 0x02, 0x00, 0xc0, 0xf9, 0x00, 0x03, 
+0x0a, 0xb0, 0x12, 0xa4, 0xfd, 0xaa, 0x0c, 0x95, 0x6d, 0x55, 0x80, 
+0x2a, 0xe0, 0x55, 0x81, 0x55, 0x54, 0x95, 0x55, 0x50, 0xf9, 0x00, 
+0x00, 0x02, 0x00, 0xc0, 0xf9, 0x00, 0x14, 0x09, 0x50, 0x15, 0x65, 
+0x55, 0x56, 0x25, 0x7f, 0x92, 0xaa, 0xaa, 0x80, 0x95, 0x70, 0x4a, 
+0x81, 0x2b, 0xfc, 0xaa, 0xaa, 0xc0, 0xf9, 0x00, 0x00, 0x02, 0x00, 
+0xc0, 0xf9, 0x00, 0x13, 0x0a, 0xb0, 0x12, 0xa4, 0xaa, 0xb8, 0x2a, 
+0xc0, 0x15, 0x61, 0x55, 0x80, 0x0a, 0xa0, 0x55, 0x81, 0x56, 0x00, 
+0x95, 0x57, 0xf8, 0x00, 0x00, 0x02, 0x00, 0xc0, 0xf9, 0x00, 0x14, 
+0x05, 0x50, 0x15, 0x65, 0x5f, 0xe4, 0x25, 0x40, 0x12, 0xa4, 0xaa, 
+0x80, 0x25, 0x78, 0x4a, 0x81, 0x2a, 0x00, 0xab, 0xfc, 0x80, 0xf9, 
+0x00, 0x00, 0x02, 0x00, 0xc0, 0xf9, 0x00, 0x13, 0x08, 0xbc, 0x32, 
+0x94, 0xa8, 0x10, 0x2a, 0xc0, 0x15, 0x65, 0x55, 0x90, 0x12, 0xb0, 
+0x55, 0x81, 0x56, 0x00, 0x95, 0x02, 0xf8, 0x00, 0x00, 0x02, 0x00, 
+0xc0, 0xf9, 0x00, 0x12, 0x05, 0x58, 0x25, 0x65, 0x58, 0x00, 0x25, 
+0x40, 0x12, 0xa0, 0xaa, 0x90, 0x09, 0x50, 0x4a, 0x81, 0x2a, 0x00, 
+0xab, 0xf7, 0x00, 0x00, 0x02, 0x00, 0xc0, 0xf9, 0x00, 0x12, 0x04, 
+0xae, 0x6a, 0xd4, 0xa8, 0x00, 0x2a, 0xc0, 0x15, 0x62, 0x55, 0x92, 
+0x0a, 0xb0, 0x55, 0x81, 0x56, 0x00, 0x95, 0xf7, 0x00, 0x00, 0x02, 
+0x00, 0xc0, 0xf9, 0x00, 0x12, 0x05, 0x55, 0xc5, 0x45, 0x58, 0x00, 
+0x25, 0x7f, 0xf2, 0xa2, 0xaa, 0x94, 0x99, 0x50, 0x4a, 0x81, 0x2b, 
+0xff, 0xab, 0xf7, 0x00, 0x00, 0x02, 0x00, 0xc0, 0xf9, 0x00, 0x12, 
+0x02, 0xaa, 0x0a, 0xc4, 0xa8, 0x00, 0x2a, 0x80, 0x55, 0x60, 0x55, 
+0x92, 0x32, 0xb0, 0x55, 0x81, 0x54, 0x02, 0x95, 0xf7, 0x00, 0x00, 
+0x02, 0x00, 0xc0, 0xf9, 0x00, 0x12, 0x02, 0x55, 0x55, 0xa5, 0x58, 
+0x00, 0x25, 0x55, 0x52, 0xa1, 0x2a, 0x95, 0x55, 0x48, 0x4a, 0x81, 
+0x2a, 0xaa, 0xab, 0xf7, 0x00, 0x00, 0x02, 0x00, 0xc0, 0xf8, 0x00, 
+0x11, 0xaa, 0xab, 0x84, 0xa8, 0x00, 0x2a, 0xaa, 0xd5, 0x61, 0x55, 
+0x92, 0xaa, 0xa0, 0x55, 0x81, 0x55, 0x56, 0x95, 0xf7, 0x00, 0x00, 
+0x02, 0x00, 0xc0, 0xf8, 0x00, 0xff, 0x55, 0x0f, 0x45, 0x58, 0x00, 
+0x25, 0x55, 0x52, 0xa0, 0x2a, 0x95, 0x55, 0x50, 0x4a, 0x81, 0x2a, 
+0xaa, 0xab, 0xf7, 0x00, 0x00, 0x02, 0x00, 0xc0, 0xf8, 0x00, 0x11, 
+0xea, 0xaa, 0x04, 0xa8, 0x00, 0x2a, 0xaa, 0xd5, 0x60, 0x95, 0x9a, 
+0xaa, 0xc0, 0x55, 0x81, 0x55, 0x56, 0x95, 0xf7, 0x00, 0x00, 0x02, 
+0x00, 0xc0, 0xf8, 0x00, 0x11, 0x75, 0x5c, 0x05, 0xf8, 0x00, 0x2f, 
+0xff, 0xdf, 0xe0, 0xbf, 0x8f, 0x55, 0x00, 0x7f, 0x81, 0x7f, 0xfe, 
+0xbf, 0xf7, 0x00, 0x00, 0x02, 0x00, 0xc0, 0xf8, 0x00, 0x11, 0x27, 
+0xf2, 0x04, 0x00, 0x00, 0x20, 0x00, 0x10, 0x00, 0x40, 0x04, 0xfc, 
+0x80, 0x40, 0x01, 0x00, 0x00, 0x80, 0xf7, 0x00, 0x00, 0x02, 0x00, 
+0xc0, 0xf8, 0x00, 0x01, 0x0c, 0x18, 0xf9, 0x00, 0x01, 0x01, 0x86, 
+0xf1, 0x00, 0x00, 0x02, 0x00, 0xc0, 0xdc, 0x00, 0x00, 0x02, 0x00, 
+0xc0, 0xdc, 0x00, 0x00, 0x02, 0x00, 0xc0, 0xdc, 0x00, 0x00, 0x02, 
+0x00, 0xc0, 0xdc, 0x00, 0x00, 0x02, 0x00, 0xc0, 0xdc, 0x00, 0x00, 
+0x02, 0x00, 0xc0, 0xdc, 0x00, 0x00, 0x02, 0x00, 0xc0, 0xdc, 0x00, 
+0x00, 0x02, 0x00, 0xc0, 0xdc, 0x00, 0x00, 0x02, 0x00, 0xc0, 0xdc, 
+0x00, 0x00, 0x02, 0x00, 0xc0, 0xdc, 0x00, 0x00, 0x02, 0x00, 0xc0, 
+0xdc, 0x00, 0x00, 0x02, 0x00, 0xc0, 0xdc, 0x00, 0x00, 0x02, 0x00, 
+0xc0, 0xdc, 0x00, 0x00, 0x02, 0xdb, 0xff, 0x00, 0xfe, 0xdb, 0xff, 
+0x00, 0xfe, 0x00, 0xc0, 0xdc, 0x00, 0x00, 0x02, 0x00, 0xc0, 0xdc, 
+0x00, 0x00, 0x02, 0x00, 0xc0, 0xdc, 0x00, 0x00, 0x02, 0x00, 0xc0, 
+0xdc, 0x00, 0x00, 0x02, 0x00, 0xc0, 0xdc, 0x00, 0x00, 0x02, 0x00, 
+0xc0, 0xdc, 0x00, 0x00, 0x02, 0x00, 0xc0, 0xdc, 0x00, 0x00, 0x02, 
+0x00, 0xc0, 0xdc, 0x00, 0x00, 0x02, 0x00, 0xc0, 0xdc, 0x00, 0x00, 
+0x02, 0x00, 0xc0, 0xdc, 0x00, 0x00, 0x02, 0x00, 0xc0, 0xdc, 0x00, 
+0x00, 0x02, 0x00, 0xc0, 0xdc, 0x00, 0x00, 0x02, 0x00, 0xc0, 0xdc, 
+0x00, 0x00, 0x02, 0x00, 0xc0, 0xdc, 0x00, 0x00, 0x02, 0x00, 0xc0, 
+0xdc, 0x00, 0x00, 0x02, 0x00, 0xc0, 0xdc, 0x00, 0x00, 0x02, 0x00, 
+0xc0, 0xdc, 0x00, 0x00, 0x02, 0x00, 0xc0, 0xdc, 0x00, 0x00, 0x02, 
+0x00, 0xc0, 0xdc, 0x00, 0x00, 0x02, 0x00, 0xc0, 0xdc, 0x00, 0x00, 
+0x02, 0x00, 0xc0, 0xdc, 0x00, 0x00, 0x02, 0x00, 0xc0, 0xdc, 0x00, 
+0x00, 0x02, 0x00, 0xc0, 0xdc, 0x00, 0x00, 0x02, 0x00, 0xc0, 0xdc, 
+0x00, 0x00, 0x02, 0x00, 0xc0, 0xdc, 0x00, 0x00, 0x02, 0x00, 0xc0, 
+0xdc, 0x00, 0x00, 0x02, 0x00, 0xc0, 0xdc, 0x00, 0x00, 0x02, 0x00, 
+0xc0, 0xdc, 0x00, 0x00, 0x02, 0x00, 0xc0, 0xdc, 0x00, 0x00, 0x02, 
+0x00, 0xc0, 0xdc, 0x00, 0x00, 0x02, 0x00, 0xc0, 0xdc, 0x00, 0x00, 
+0x02, 0x00, 0xc0, 0xdc, 0x00, 0x00, 0x02, 0x00, 0xc0, 0xdc, 0x00, 
+0x00, 0x02, 0x00, 0xc0, 0xdc, 0x00, 0x00, 0x02, 0x00, 0xc0, 0xdc, 
+0x00, 0x00, 0x02, 0x00, 0xc0, 0xdc, 0x00, 0x00, 0x02, 0x00, 0xc0, 
+0xdc, 0x00, 0x00, 0x02, 0x00, 0xc0, 0xdc, 0x00, 0x00, 0x02, 0x00, 
+0xc0, 0xdc, 0x00, 0x00, 0x02, 0x00, 0xc0, 0xdc, 0x00, 0x00, 0x02, 
+0x00, 0xc0, 0xdc, 0x00, 0x00, 0x02, 0x00, 0xc0, 0xdc, 0x00, 0x00, 
+0x02, 0x00, 0xc0, 0xdc, 0x00, 0x00, 0x02, 0x00, 0xc0, 0xdc, 0x00, 
+0x00, 0x02, 0x00, 0xc0, 0xdc, 0x00, 0x00, 0x02, 0x00, 0xc0, 0xdc, 
+0x00, 0x00, 0x02, 0x00, 0xc0, 0xdc, 0x00, 0x00, 0x02, 0x00, 0xc0, 
+0xdc, 0x00, 0x00, 0x02, 0x00, 0xc0, 0xdc, 0x00, 0x00, 0x02, 0x00, 
+0xc0, 0xdc, 0x00, 0x00, 0x02, 0x00, 0xc0, 0xdc, 0x00, 0x00, 0x02, 
+0x00, 0xc0, 0xdc, 0x00, 0x00, 0x02, 0xdb, 0xff, 0x00, 0xfe, 0xdb, 
+0xff, 0x00, 0xfe, 0x00, 0xc0, 0xdc, 0x00, 0x00, 0x02, 0x00, 0xc0, 
+0xdc, 0x00, 0x00, 0x02, 0x00, 0xc0, 0xdc, 0x00, 0x00, 0x02, 0x00, 
+0xc0, 0xdc, 0x00, 0x00, 0x02, 0x00, 0xc0, 0xee, 0x00, 0x00, 0xc0, 
+0xf0, 0x00, 0x00, 0x02, 0x00, 0xc0, 0xef, 0x00, 0x01, 0x03, 0x60, 
+0xf0, 0x00, 0x00, 0x02, 0x00, 0xc0, 0xef, 0x00, 0x01, 0x0d, 0x10, 
+0xf0, 0x00, 0x00, 0x02, 0x00, 0xc0, 0xef, 0x00, 0x00, 0x34, 0xef, 
+0x00, 0x00, 0x02, 0x00, 0xc0, 0xef, 0x00, 0x01, 0xd3, 0x88, 0xf0, 
+0x00, 0x00, 0x02, 0x00, 0xc0, 0xf0, 0x00, 0x02, 0x03, 0x4f, 0xa0, 
+0xf0, 0x00, 0x00, 0x02, 0x00, 0xc0, 0xf0, 0x00, 0x02, 0x0d, 0x0c, 
+0x34, 0xf0, 0x00, 0x00, 0x02, 0x00, 0xc0, 0xf0, 0x00, 0x02, 0x34, 
+0x30, 0x10, 0xf0, 0x00, 0x00, 0x02, 0x00, 0xc0, 0xf0, 0x00, 0x02, 
+0xd0, 0x20, 0xf2, 0xf0, 0x00, 0x00, 0x02, 0x00, 0xc0, 0xf1, 0x00, 
+0x03, 0x03, 0x40, 0x73, 0x80, 0xf0, 0x00, 0x00, 0x02, 0x00, 0xc0, 
+0xf1, 0x00, 0x03, 0x0d, 0x07, 0x7e, 0x1d, 0xf0, 0x00, 0x00, 0x02, 
+0x00, 0xc0, 0xf1, 0x00, 0x03, 0x14, 0x01, 0x28, 0x1c, 0xf0, 0x00, 
+0x00, 0x02, 0x00, 0xc0, 0xf1, 0x00, 0x04, 0x30, 0x03, 0xb0, 0x08, 
+0x80, 0xf1, 0x00, 0x00, 0x02, 0x00, 0xc0, 0xf1, 0x00, 0x03, 0x35, 
+0x00, 0xb0, 0x38, 0xf0, 0x00, 0x00, 0x02, 0x00, 0xc0, 0xf1, 0x00, 
+0x04, 0x23, 0xa1, 0xca, 0x20, 0x40, 0xf1, 0x00, 0x00, 0x02, 0x00, 
+0xc0, 0xf1, 0x00, 0x04, 0x3b, 0xe4, 0x4f, 0xe3, 0x80, 0xf1, 0x00, 
+0x00, 0x02, 0x00, 0xc0, 0xf1, 0x00, 0x04, 0x51, 0x2e, 0xe3, 0x8e, 
+0x20, 0xf1, 0x00, 0x00, 0x02, 0x00, 0xc0, 0xf1, 0x00, 0x03, 0x3d, 
+0xc2, 0xe0, 0x38, 0xf0, 0x00, 0x00, 0x02, 0x00, 0xc0, 0xf1, 0x00, 
+0x04, 0x58, 0x80, 0x50, 0xf0, 0x10, 0xf1, 0x00, 0x00, 0x02, 0x00, 
+0xc0, 0xf1, 0x00, 0x03, 0x36, 0xe0, 0x01, 0x8c, 0xf0, 0x00, 0x00, 
+0x02, 0x00, 0xc0, 0xf1, 0x00, 0x02, 0x5c, 0x60, 0x12, 0xff, 0x08, 
+0xf1, 0x00, 0x00, 0x02, 0x00, 0xc0, 0xf1, 0x00, 0x03, 0x4b, 0x70, 
+0x08, 0x0e, 0xf0, 0x00, 0x00, 0x02, 0x00, 0xc0, 0xf1, 0x00, 0x02, 
+0x5a, 0x30, 0x00, 0xff, 0x04, 0xf1, 0x00, 0x00, 0x02, 0x00, 0xc0, 
+0xf1, 0x00, 0x03, 0x6d, 0x80, 0x18, 0x07, 0xf0, 0x00, 0x00, 0x02, 
+0x00, 0xc0, 0xf1, 0x00, 0x04, 0x52, 0x14, 0x30, 0x00, 0x02, 0xf1, 
+0x00, 0x00, 0x02, 0x00, 0xc0, 0xf1, 0x00, 0x04, 0x6c, 0xcf, 0x80, 
+0x03, 0x86, 0xf1, 0x00, 0x00, 0x02, 0x00, 0xc0, 0xf1, 0x00, 0x04, 
+0x35, 0x05, 0xe0, 0x00, 0x18, 0xf1, 0x00, 0x00, 0x02, 0x00, 0xc0, 
+0xf1, 0x00, 0x04, 0x28, 0x60, 0xbf, 0x00, 0x60, 0xf1, 0x00, 0x00, 
+0x02, 0x00, 0xc0, 0xf1, 0x00, 0x04, 0x05, 0x00, 0x7b, 0x81, 0x84, 
+0xf1, 0x00, 0x00, 0x02, 0x00, 0xc0, 0xf1, 0x00, 0x03, 0x10, 0x30, 
+0x01, 0x06, 0xf0, 0x00, 0x00, 0x02, 0x00, 0xc0, 0xef, 0x00, 0x02, 
+0x60, 0x18, 0x08, 0xf1, 0x00, 0x00, 0x02, 0x00, 0xc0, 0xf1, 0x00, 
+0x03, 0x0a, 0x58, 0xc0, 0x62, 0xf0, 0x00, 0x00, 0x02, 0x00, 0xc0, 
+0xef, 0x00, 0x02, 0x01, 0xd0, 0x10, 0xf1, 0x00, 0x00, 0x02, 0x00, 
+0xc0, 0xf1, 0x00, 0x03, 0x04, 0x0c, 0xc7, 0x40, 0xf0, 0x00, 0x00, 
+0x02, 0x00, 0xc0, 0xf0, 0x00, 0x03, 0x20, 0x1e, 0xa4, 0x20, 0xf1, 
+0x00, 0x00, 0x02, 0x00, 0xc0, 0xf1, 0x00, 0x03, 0x02, 0x06, 0x75, 
+0xa1, 0xf0, 0x00, 0x00, 0x02, 0x00, 0xc0, 0xf0, 0x00, 0x03, 0x09, 
+0xed, 0x48, 0x40, 0xf1, 0x00, 0x00, 0x02, 0x00, 0xc0, 0xf1, 0x00, 
+0x04, 0x01, 0x03, 0xbb, 0x20, 0x80, 0xf1, 0x00, 0x00, 0x02, 0x00, 
+0xc0, 0xf0, 0x00, 0x02, 0x03, 0xec, 0x92, 0xf0, 0x00, 0x00, 0x02, 
+0x00, 0xc0, 0xf0, 0x00, 0x02, 0x93, 0x73, 0x48, 0xf0, 0x00, 0x00, 
+0x02, 0x00, 0xc0, 0xf0, 0x00, 0x02, 0x07, 0xda, 0x20, 0xf0, 0x00, 
+0x00, 0x02, 0x00, 0xc0, 0xf0, 0x00, 0x02, 0x43, 0xec, 0x80, 0xf0, 
+0x00, 0x00, 0x02, 0x00, 0xc0, 0xf0, 0x00, 0x01, 0x07, 0x72, 0xef, 
+0x00, 0x00, 0x02, 0x00, 0xc0, 0xf0, 0x00, 0x01, 0x23, 0xc8, 0xef, 
+0x00, 0x00, 0x02, 0x00, 0xc0, 0xf0, 0x00, 0x01, 0x07, 0x20, 0xef, 
+0x00, 0x00, 0x02, 0x00, 0xc0, 0xf0, 0x00, 0x01, 0x14, 0x80, 0xef, 
+0x00, 0x00, 0x02, 0x00, 0xc0, 0xf0, 0x00, 0x00, 0x02, 0xee, 0x00, 
+0x00, 0x02, 0x00, 0xc0, 0xf0, 0x00, 0x00, 0x08, 0xee, 0x00, 0x00, 
+0x02, 0x00, 0xc0, 0xdc, 0x00, 0x00, 0x02, 0x00, 0xc0, 0xdc, 0x00, 
+0x00, 0x02, 0x00, 0xc0, 0xdc, 0x00, 0x00, 0x02, 0x00, 0xc0, 0xdc, 
+0x00, 0x00, 0x02, 0x00, 0xc0, 0xdc, 0x00, 0x00, 0x02, 0x00, 0xc0, 
+0xdc, 0x00, 0x00, 0x02, 0x00, 0xbf, 0xdc, 0xff, 0x00, 0xfe, 0x00, 
+0x80, 0xdb, 0x00, };
+unsigned char ns_box_bitmap_plane_1[] =
+ {
+// plane 1
+0xdb, 0xff, 0x00, 0xfe, 0xdb, 0xff, 0x00, 0xfe, 0xdb, 0xff, 0x00, 
+0xfc, 0xdb, 0xff, 0x00, 0xfc, 0xdb, 0xff, 0x00, 0xfc, 0xdb, 0xff, 
+0x00, 0xfc, 0xdb, 0xff, 0x00, 0xfc, 0xdb, 0xff, 0x00, 0xfc, 0xdb, 
+0xff, 0x00, 0xfc, 0xdb, 0xff, 0x00, 0xfc, 0xdb, 0xff, 0x00, 0xfc, 
+0xdb, 0xff, 0x00, 0xfc, 0xdb, 0xff, 0x00, 0xfc, 0xdb, 0xff, 0x00, 
+0xfc, 0xdb, 0xff, 0x00, 0xfc, 0xf6, 0xff, 0x00, 0xfb, 0xfc, 0xff, 
+0x03, 0xdf, 0xf7, 0xff, 0xbf, 0xfe, 0xff, 0x02, 0xfd, 0xff, 0xfe, 
+0xf6, 0xff, 0x00, 0xfc, 0xf7, 0xff, 0x12, 0xfa, 0xa8, 0xff, 0xff, 
+0xef, 0xff, 0xff, 0x9f, 0xf3, 0xff, 0x3f, 0xaa, 0x9f, 0xff, 0xf9, 
+0xff, 0xfc, 0xff, 0xfd, 0xf8, 0xff, 0x00, 0xfc, 0xf7, 0xff, 0x13, 
+0xd5, 0x54, 0x7f, 0x55, 0x53, 0xf5, 0x55, 0x1a, 0xa3, 0xea, 0x3f, 
+0x55, 0x4e, 0xaa, 0xa9, 0xaa, 0xa8, 0xea, 0xaa, 0x7f, 0xf9, 0xff, 
+0x00, 0xfc, 0xf7, 0xff, 0xff, 0xaa, 0x11, 0x3e, 0xaa, 0xa9, 0xfa, 
+0xaa, 0x9d, 0x53, 0xf5, 0x3e, 0xaa, 0x8d, 0x55, 0x51, 0xd5, 0x54, 
+0xd5, 0x55, 0x3f, 0xf9, 0xff, 0x00, 0xfc, 0xf7, 0xff, 0xff, 0x55, 
+0x11, 0x3f, 0x55, 0x54, 0xf5, 0x55, 0x1a, 0xa9, 0xea, 0x3d, 0x55, 
+0x4e, 0xaa, 0xa9, 0xaa, 0xa8, 0xea, 0xaa, 0x9f, 0xf9, 0xff, 0x00, 
+0xfc, 0xf7, 0xff, 0xff, 0xaa, 0x11, 0x1e, 0xaa, 0xaa, 0x7a, 0xaa, 
+0x9d, 0x51, 0xf5, 0x3a, 0xaa, 0x8d, 0x55, 0x51, 0xd5, 0x54, 0xd5, 
+0x55, 0x4f, 0xf9, 0xff, 0x00, 0xfc, 0xf7, 0xff, 0x13, 0x50, 0x15, 
+0x1f, 0x50, 0x55, 0x75, 0x00, 0x1a, 0xa9, 0xea, 0x3d, 0x40, 0x4e, 
+0xaa, 0xa9, 0xa8, 0x00, 0xea, 0x0a, 0xaf, 0xf9, 0xff, 0x00, 0xfc, 
+0xf8, 0xff, 0x14, 0xfe, 0xa0, 0x0a, 0x9e, 0xa0, 0x2a, 0x3a, 0x80, 
+0x1d, 0x54, 0xf5, 0x3a, 0x80, 0x08, 0x15, 0x01, 0xd4, 0x00, 0xd4, 
+0x05, 0x47, 0xf9, 0xff, 0x00, 0xfc, 0xf7, 0xff, 0x13, 0x41, 0xb5, 
+0x0f, 0x53, 0xb5, 0x35, 0x1f, 0xfa, 0xa8, 0xea, 0x3d, 0x47, 0x08, 
+0x2a, 0x01, 0xa8, 0xff, 0xea, 0x76, 0xa7, 0xf9, 0xff, 0x00, 0xfc, 
+0xf8, 0xff, 0x14, 0xfe, 0xa3, 0xfa, 0x8e, 0xa3, 0xea, 0x3a, 0x9f, 
+0xfd, 0x54, 0xf5, 0x3a, 0x8f, 0xcf, 0xf5, 0x3f, 0xd4, 0xff, 0xd4, 
+0x7d, 0x47, 0xf9, 0xff, 0x00, 0xfc, 0xf8, 0xff, 0x14, 0xfd, 0x43, 
+0xfd, 0x4f, 0x53, 0xf5, 0x35, 0x1f, 0xfa, 0xaa, 0x6a, 0x3d, 0x47, 
+0xef, 0xea, 0x3f, 0xa8, 0xff, 0xea, 0x7e, 0xa7, 0xf9, 0xff, 0x00, 
+0xfc, 0xf8, 0xff, 0x14, 0xfe, 0xa3, 0xfa, 0x8e, 0xa3, 0xea, 0x3a, 
+0x9f, 0xbd, 0x54, 0x75, 0x3e, 0xa3, 0xff, 0xf5, 0x3f, 0xd4, 0xfd, 
+0xd4, 0x7d, 0x47, 0xf9, 0xff, 0x00, 0xfc, 0xf8, 0xff, 0x14, 0xfd, 
+0x47, 0xfd, 0x4f, 0x53, 0xf5, 0x35, 0x7f, 0x3a, 0xaa, 0x6a, 0x3d, 
+0x51, 0xff, 0xea, 0x3f, 0xab, 0xf9, 0xea, 0x7e, 0xa7, 0xf9, 0xff, 
+0x00, 0xfc, 0xf8, 0xff, 0x14, 0xfe, 0xa7, 0xfa, 0x8e, 0xa3, 0xea, 
+0x3a, 0xaa, 0x3d, 0x55, 0x75, 0x3e, 0xa8, 0xff, 0xf5, 0x3f, 0xd5, 
+0x51, 0xd4, 0x7d, 0x47, 0xf9, 0xff, 0x00, 0xfc, 0xf8, 0xff, 0x14, 
+0xfd, 0x47, 0xfd, 0x4f, 0x57, 0xd4, 0x35, 0x55, 0x3a, 0xaa, 0x6a, 
+0x3f, 0x54, 0x7f, 0xea, 0x3f, 0xaa, 0xa9, 0xea, 0xfa, 0x87, 0xf9, 
+0xff, 0x00, 0xfc, 0xf8, 0xff, 0x14, 0xfe, 0xa7, 0xfa, 0x8e, 0xaa, 
+0xaa, 0x7a, 0xaa, 0x3d, 0x55, 0x55, 0x3f, 0xaa, 0x3f, 0xf5, 0x3f, 
+0xd5, 0x51, 0xd5, 0x55, 0x4f, 0xf9, 0xff, 0x00, 0xfc, 0xf8, 0xff, 
+0x14, 0xfd, 0x47, 0xfd, 0x4f, 0x55, 0x54, 0x75, 0x55, 0x3a, 0x8a, 
+0xaa, 0x3f, 0xd5, 0x1f, 0xea, 0x3f, 0xaa, 0xa9, 0xea, 0xaa, 0x8f, 
+0xf9, 0xff, 0x00, 0xfc, 0xf8, 0xff, 0x14, 0xfe, 0xa7, 0xfa, 0x8e, 
+0xaa, 0xa8, 0xfa, 0x80, 0x3d, 0x4d, 0x55, 0x3f, 0xea, 0x8f, 0xf5, 
+0x3f, 0xd4, 0x01, 0xd5, 0x55, 0x1f, 0xf9, 0xff, 0x00, 0xfc, 0xf8, 
+0xff, 0x14, 0xfd, 0x47, 0xfd, 0x4f, 0x55, 0x41, 0xf5, 0x00, 0x3a, 
+0x8e, 0xaa, 0x3f, 0xf5, 0x4f, 0xea, 0x3f, 0xa8, 0x01, 0xea, 0xa8, 
+0x3f, 0xf9, 0xff, 0x00, 0xfc, 0xf8, 0xff, 0x14, 0xfe, 0xa7, 0xfa, 
+0x8e, 0xa0, 0x03, 0xfa, 0x9f, 0xfd, 0x4f, 0x55, 0x3f, 0xfa, 0x87, 
+0xf5, 0x3f, 0xd4, 0xff, 0xd4, 0x00, 0x7f, 0xf9, 0xff, 0x00, 0xfc, 
+0xf7, 0xff, 0x12, 0x43, 0xfd, 0x4f, 0x50, 0x0f, 0xf5, 0x1f, 0xfa, 
+0x8e, 0xaa, 0x3f, 0xfd, 0x47, 0xea, 0x3f, 0xa8, 0xff, 0xea, 0x01, 
+0xf8, 0xff, 0x00, 0xfc, 0xf8, 0xff, 0x13, 0xfe, 0xa3, 0xfa, 0x8e, 
+0xa3, 0xff, 0xfa, 0x9f, 0xfd, 0x4f, 0x55, 0x3f, 0xfe, 0xa7, 0xf5, 
+0x3f, 0xd4, 0xff, 0xd4, 0x7f, 0xf8, 0xff, 0x00, 0xfc, 0xf7, 0xff, 
+0x12, 0x51, 0xf5, 0x0f, 0x53, 0xff, 0xf5, 0x1f, 0xfa, 0x8f, 0xaa, 
+0x3f, 0xfd, 0x47, 0xea, 0x3f, 0xa8, 0xff, 0xea, 0x7f, 0xf8, 0xff, 
+0x00, 0xfc, 0xf8, 0xff, 0x13, 0xfe, 0xab, 0xfa, 0x9e, 0xa3, 0xff, 
+0xfa, 0x9f, 0xdd, 0x4f, 0x55, 0x3b, 0xfe, 0xa7, 0xf5, 0x3f, 0xd4, 
+0xfe, 0xd4, 0x7f, 0xf8, 0xff, 0x00, 0xfc, 0xf7, 0xff, 0x12, 0x55, 
+0xf5, 0x1f, 0x53, 0xff, 0xf5, 0x7f, 0x9a, 0x8f, 0xaa, 0x3d, 0xfd, 
+0x47, 0xea, 0x3f, 0xab, 0xfc, 0xea, 0x7f, 0xf8, 0xff, 0x00, 0xfc, 
+0xf7, 0xff, 0xff, 0xaa, 0x10, 0x1e, 0xa3, 0xff, 0xfa, 0xaa, 0x9d, 
+0x4f, 0xd5, 0x3a, 0xaa, 0xa7, 0xf5, 0x3f, 0xd5, 0x54, 0xd4, 0x7f, 
+0xf8, 0xff, 0x00, 0xfc, 0xf7, 0xff, 0x12, 0x55, 0x54, 0x3f, 0x53, 
+0xff, 0xf5, 0x55, 0x1a, 0x8f, 0xaa, 0x3d, 0x55, 0x4f, 0xea, 0x3f, 
+0xaa, 0xa8, 0xea, 0x7f, 0xf8, 0xff, 0x00, 0xfc, 0xf7, 0xff, 0xff, 
+0xaa, 0x10, 0x3e, 0xa3, 0xff, 0xfa, 0xaa, 0x9d, 0x4f, 0xd5, 0x3a, 
+0xaa, 0x8f, 0xf5, 0x3f, 0xd5, 0x54, 0xd4, 0x7f, 0xf8, 0xff, 0x00, 
+0xfc, 0xf7, 0xff, 0x12, 0x15, 0x54, 0x7f, 0x53, 0xff, 0xf5, 0x55, 
+0x1a, 0x8f, 0xea, 0x35, 0x55, 0x1f, 0xea, 0x3f, 0xaa, 0xa8, 0xea, 
+0x7f, 0xf8, 0xff, 0x00, 0xfc, 0xf7, 0xff, 0x12, 0x8a, 0xa0, 0xfe, 
+0x03, 0xff, 0xf0, 0x00, 0x10, 0x0f, 0xc0, 0x30, 0xaa, 0x3f, 0xc0, 
+0x3f, 0x80, 0x00, 0xc0, 0x7f, 0xf8, 0xff, 0x00, 0xfc, 0xf7, 0xff, 
+0x0e, 0xc0, 0x01, 0xf8, 0x03, 0xff, 0xc0, 0x00, 0x00, 0x0f, 0x80, 
+0x38, 0x00, 0x7f, 0x80, 0x3e, 0xfe, 0x00, 0x00, 0x7f, 0xf8, 0xff, 
+0x00, 0xfc, 0xf7, 0xff, 0x01, 0xf0, 0x07, 0xf9, 0xff, 0x01, 0xfe, 
+0x01, 0xf1, 0xff, 0x00, 0xfc, 0xdb, 0xff, 0x00, 0xfc, 0xdb, 0xff, 
+0x00, 0xfc, 0xdb, 0xff, 0x00, 0xfc, 0xdb, 0xff, 0x00, 0xfc, 0xdb, 
+0xff, 0x00, 0xfc, 0xdb, 0xff, 0x00, 0xfc, 0xdb, 0xff, 0x00, 0xfc, 
+0xdb, 0xff, 0x00, 0xfc, 0xdb, 0xff, 0x00, 0xfc, 0xdb, 0xff, 0x00, 
+0xfc, 0xdb, 0xff, 0x00, 0xfc, 0xdb, 0xff, 0x00, 0xfc, 0xdb, 0xff, 
+0x00, 0xfc, 0x00, 0xc0, 0xdb, 0x00, 0xdb, 0xff, 0x00, 0xfc, 0xdb, 
+0xff, 0x00, 0xfc, 0xdb, 0xff, 0x00, 0xfc, 0xdb, 0xff, 0x00, 0xfc, 
+0xdb, 0xff, 0x00, 0xfc, 0xdb, 0xff, 0x00, 0xfc, 0xdb, 0xff, 0x00, 
+0xfc, 0xdb, 0xff, 0x00, 0xfc, 0xdb, 0xff, 0x00, 0xfc, 0xdb, 0xff, 
+0x00, 0xfc, 0xdb, 0xff, 0x00, 0xfc, 0xdb, 0xff, 0x00, 0xfc, 0xdb, 
+0xff, 0x00, 0xfc, 0xdb, 0xff, 0x00, 0xfc, 0xdb, 0xff, 0x00, 0xfc, 
+0xdb, 0xff, 0x00, 0xfc, 0xdb, 0xff, 0x00, 0xfc, 0xdb, 0xff, 0x00, 
+0xfc, 0xdb, 0xff, 0x00, 0xfc, 0xdb, 0xff, 0x00, 0xfc, 0xdb, 0xff, 
+0x00, 0xfc, 0xdb, 0xff, 0x00, 0xfc, 0xdb, 0xff, 0x00, 0xfc, 0xdb, 
+0xff, 0x00, 0xfc, 0xdb, 0xff, 0x00, 0xfc, 0xdb, 0xff, 0x00, 0xfc, 
+0xdb, 0xff, 0x00, 0xfc, 0xdb, 0xff, 0x00, 0xfc, 0xdb, 0xff, 0x00, 
+0xfc, 0xdb, 0xff, 0x00, 0xfc, 0xdb, 0xff, 0x00, 0xfc, 0xdb, 0xff, 
+0x00, 0xfc, 0xdb, 0xff, 0x00, 0xfc, 0xdb, 0xff, 0x00, 0xfc, 0xdb, 
+0xff, 0x00, 0xfc, 0xdb, 0xff, 0x00, 0xfc, 0xdb, 0xff, 0x00, 0xfc, 
+0xdb, 0xff, 0x00, 0xfc, 0xdb, 0xff, 0x00, 0xfc, 0xdb, 0xff, 0x00, 
+0xfc, 0xdb, 0xff, 0x00, 0xfc, 0xdb, 0xff, 0x00, 0xfc, 0xdb, 0xff, 
+0x00, 0xfc, 0xdb, 0xff, 0x00, 0xfc, 0xdb, 0xff, 0x00, 0xfc, 0xdb, 
+0xff, 0x00, 0xfc, 0xdb, 0xff, 0x00, 0xfc, 0xdb, 0xff, 0x00, 0xfc, 
+0xdb, 0xff, 0x00, 0xfc, 0xdb, 0xff, 0x00, 0xfc, 0xdb, 0xff, 0x00, 
+0xfc, 0xdb, 0xff, 0x00, 0xfc, 0xdb, 0xff, 0x00, 0xfc, 0x00, 0xc0, 
+0xdb, 0x00, 0xdb, 0xff, 0x00, 0xfc, 0xdb, 0xff, 0x00, 0xfc, 0xdb, 
+0xff, 0x00, 0xfc, 0xdb, 0xff, 0x00, 0xfc, 0xdb, 0xff, 0x00, 0xfc, 
+0xdb, 0xff, 0x00, 0xfc, 0xed, 0xff, 0x00, 0x9f, 0xf0, 0xff, 0x00, 
+0xfc, 0xee, 0xff, 0x01, 0xfe, 0x0f, 0xf0, 0xff, 0x00, 0xfc, 0xee, 
+0xff, 0x01, 0xf8, 0x0f, 0xf0, 0xff, 0x00, 0xfc, 0xee, 0xff, 0x01, 
+0xe0, 0x07, 0xf0, 0xff, 0x00, 0xfc, 0xee, 0xff, 0x01, 0x87, 0xc7, 
+0xf0, 0xff, 0x00, 0xfc, 0xef, 0xff, 0x02, 0xfe, 0x18, 0x63, 0xf0, 
+0xff, 0x00, 0xfc, 0xef, 0xff, 0x02, 0xf8, 0x10, 0x33, 0xf0, 0xff, 
+0x00, 0xfc, 0xef, 0xff, 0x02, 0xe0, 0x30, 0x61, 0xf0, 0xff, 0x00, 
+0xfc, 0xef, 0xff, 0x02, 0x86, 0x21, 0xc1, 0xf0, 0xff, 0x00, 0xfc, 
+0xf0, 0xff, 0x03, 0xfe, 0x02, 0x27, 0x08, 0xf0, 0xff, 0x00, 0xfc, 
+0xf0, 0xff, 0x03, 0xf8, 0x03, 0x3c, 0x08, 0xf0, 0xff, 0x00, 0xfc, 
+0xf0, 0xff, 0x04, 0xe0, 0x01, 0x30, 0x18, 0x7f, 0xf1, 0xff, 0x00, 
+0xfc, 0xf0, 0xff, 0x04, 0xe2, 0x01, 0x98, 0x10, 0x7f, 0xf1, 0xff, 
+0x00, 0xfc, 0xf0, 0xff, 0x04, 0xf3, 0xc0, 0x9c, 0x71, 0x3f, 0xf1, 
+0xff, 0x00, 0xfc, 0xf0, 0xff, 0x04, 0xe1, 0xf8, 0xc7, 0xc7, 0x3f, 
+0xf1, 0xff, 0x00, 0xfc, 0xf0, 0xff, 0x04, 0xe9, 0x9f, 0x40, 0x1c, 
+0x1f, 0xf1, 0xff, 0x00, 0xfc, 0xf0, 0xff, 0x04, 0xe0, 0x81, 0xe0, 
+0x70, 0x1f, 0xf1, 0xff, 0x00, 0xfc, 0xf0, 0xff, 0x04, 0xe4, 0xc0, 
+0x21, 0xd8, 0x0f, 0xf1, 0xff, 0x00, 0xfc, 0xf0, 0xff, 0x04, 0xe0, 
+0x40, 0x03, 0x18, 0x0f, 0xf1, 0xff, 0x00, 0xfc, 0xf0, 0xff, 0x04, 
+0xe2, 0x60, 0x08, 0x0c, 0x07, 0xf1, 0xff, 0x00, 0xfc, 0xf0, 0xff, 
+0x04, 0xe0, 0x20, 0x18, 0x04, 0x07, 0xf1, 0xff, 0x00, 0xfc, 0xf0, 
+0xff, 0x04, 0xe1, 0x20, 0x18, 0x06, 0x03, 0xf1, 0xff, 0x00, 0xfc, 
+0xf0, 0xff, 0x04, 0xc0, 0x00, 0x10, 0x02, 0x03, 0xf1, 0xff, 0x00, 
+0xfc, 0xf0, 0xff, 0x04, 0xe0, 0x88, 0x10, 0x03, 0x01, 0xf1, 0xff, 
+0x00, 0xfc, 0xf0, 0xff, 0x02, 0xc0, 0x1e, 0x30, 0xff, 0x01, 0xf1, 
+0xff, 0x00, 0xfc, 0xf0, 0xff, 0x04, 0xc0, 0x43, 0xf0, 0x01, 0x03, 
+0xf1, 0xff, 0x00, 0xfc, 0xf0, 0xff, 0x04, 0xc0, 0x00, 0x7c, 0x00, 
+0x03, 0xf1, 0xff, 0x00, 0xfc, 0xf0, 0xff, 0x04, 0xe0, 0x20, 0x27, 
+0xc0, 0x03, 0xf1, 0xff, 0x00, 0xfc, 0xf0, 0xff, 0x04, 0xe0, 0x00, 
+0x60, 0xc0, 0x07, 0xf1, 0xff, 0x00, 0xfc, 0xf0, 0xff, 0x04, 0xf0, 
+0x10, 0x40, 0x00, 0x07, 0xf1, 0xff, 0x00, 0xfc, 0xf0, 0xff, 0x04, 
+0xf0, 0x00, 0x40, 0x00, 0x0f, 0xf1, 0xff, 0x00, 0xfc, 0xf0, 0xff, 
+0x04, 0xf8, 0x08, 0xc0, 0x00, 0x0f, 0xf1, 0xff, 0x00, 0xfc, 0xf0, 
+0xff, 0x04, 0xf8, 0x00, 0x80, 0x00, 0x1f, 0xf1, 0xff, 0x00, 0xfc, 
+0xf0, 0xff, 0x04, 0xfc, 0x04, 0x00, 0x00, 0x1f, 0xf1, 0xff, 0x00, 
+0xfc, 0xf0, 0xff, 0x00, 0xfc, 0xfe, 0x00, 0x00, 0x3f, 0xf1, 0xff, 
+0x00, 0xfc, 0xf0, 0xff, 0x04, 0xfe, 0x02, 0x00, 0x00, 0x3f, 0xf1, 
+0xff, 0x00, 0xfc, 0xf0, 0xff, 0x00, 0xfe, 0xfe, 0x00, 0x00, 0x7f, 
+0xf1, 0xff, 0x00, 0xfc, 0xef, 0xff, 0xff, 0x00, 0x00, 0x01, 0xf0, 
+0xff, 0x00, 0xfc, 0xef, 0xff, 0xff, 0x00, 0x00, 0x07, 0xf0, 0xff, 
+0x00, 0xfc, 0xef, 0xff, 0x02, 0x80, 0x00, 0x1f, 0xf0, 0xff, 0x00, 
+0xfc, 0xef, 0xff, 0x02, 0x80, 0x00, 0x7f, 0xf0, 0xff, 0x00, 0xfc, 
+0xef, 0xff, 0x01, 0xc0, 0x01, 0xef, 0xff, 0x00, 0xfc, 0xef, 0xff, 
+0x01, 0xc0, 0x07, 0xef, 0xff, 0x00, 0xfc, 0xef, 0xff, 0x01, 0xe0, 
+0x1f, 0xef, 0xff, 0x00, 0xfc, 0xef, 0xff, 0x01, 0xe0, 0x7f, 0xef, 
+0xff, 0x00, 0xfc, 0xef, 0xff, 0x00, 0xf1, 0xee, 0xff, 0x00, 0xfc, 
+0xef, 0xff, 0x00, 0xf7, 0xee, 0xff, 0x00, 0xfc, 0xdb, 0xff, 0x00, 
+0xfc, 0xdb, 0xff, 0x00, 0xfc, 0xdb, 0xff, 0x00, 0xfc, 0xdb, 0xff, 
+0x00, 0xfc, 0xdb, 0xff, 0x00, 0xfc, 0xdb, 0xff, 0x00, 0xfc, 0x00, 
+0xc0, 0xdb, 0x00, 0xda, 0x00, };
+struct bitmap ns_box_bitmap = {
+1,     // packed
+6864,  // bytes_per_plane
+39,    // bytes_per_row
+1,     // bits per pixel
+312,   // width
+176,   // height
+{
+  2082,
+  1743,
+},
+{
+  ns_box_bitmap_plane_0,
+  ns_box_bitmap_plane_1
+}
+};
+
+#define ns_box_bitmap_WIDTH    312
+#define ns_box_bitmap_HEIGHT   176
diff --git a/i386/util/ns_logo.h b/i386/util/ns_logo.h
new file mode 100644 (file)
index 0000000..21ffd3d
--- /dev/null
@@ -0,0 +1,27 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
+ * Reserved.  This file contains Original Code and/or Modifications of
+ * Original Code as defined in and that are subject to the Apple Public
+ * Source License Version 1.1 (the "License").  You may not use this file
+ * except in compliance with the License.  Please obtain a copy of the
+ * License at http://www.apple.com/publicsource and read it before using
+ * this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+extern struct bitmap ns_logo_bitmap;
+
+#define ns_logo_bitmap_WIDTH   45
+#define ns_logo_bitmap_HEIGHT  48
diff --git a/i386/util/ns_logo.tiff b/i386/util/ns_logo.tiff
new file mode 100644 (file)
index 0000000..88f9b45
Binary files /dev/null and b/i386/util/ns_logo.tiff differ
diff --git a/i386/util/ns_logo_bitmap.h b/i386/util/ns_logo_bitmap.h
new file mode 100644 (file)
index 0000000..980289f
--- /dev/null
@@ -0,0 +1,102 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
+ * Reserved.  This file contains Original Code and/or Modifications of
+ * Original Code as defined in and that are subject to the Apple Public
+ * Source License Version 1.1 (the "License").  You may not use this file
+ * except in compliance with the License.  Please obtain a copy of the
+ * License at http://www.apple.com/publicsource and read it before using
+ * this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+unsigned char ns_logo_bitmap_plane_0[] =
+ {
+// plane 0
+0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc8, 0x00, 
+0x00, 0x00, 0x00, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00, 0x0d, 0xc6, 
+0x00, 0x00, 0x00, 0x00, 0x37, 0xd1, 0x00, 0x00, 0x00, 0x00, 0xc6, 
+0x1a, 0x80, 0x00, 0x00, 0x03, 0x18, 0x09, 0x40, 0x00, 0x00, 0x0c, 
+0x18, 0x79, 0xa0, 0x00, 0x00, 0x30, 0x31, 0xc0, 0x40, 0x00, 0x00, 
+0xc3, 0xb7, 0x0e, 0xa0, 0x00, 0x03, 0x00, 0x94, 0x0e, 0x50, 0x00, 
+0x0c, 0x01, 0xd8, 0x04, 0x68, 0x00, 0x0a, 0x80, 0x58, 0x1c, 0x10, 
+0x00, 0x09, 0xd0, 0xe5, 0xd0, 0x28, 0x00, 0x1d, 0xf2, 0x27, 0xf1, 
+0xd4, 0x00, 0x04, 0x97, 0x71, 0xc7, 0x1a, 0x00, 0x1e, 0xe1, 0x70, 
+0x1c, 0x04, 0x00, 0x16, 0x40, 0x28, 0x78, 0x0a, 0x00, 0x1d, 0x70, 
+0x03, 0xc6, 0x05, 0x00, 0x0f, 0x30, 0x0b, 0x04, 0x06, 0x80, 0x32, 
+0xb8, 0x04, 0x07, 0x01, 0x40, 0x0d, 0x18, 0x00, 0x02, 0x02, 0x80, 
+0x32, 0x40, 0x0c, 0x03, 0x81, 0x40, 0x09, 0x0a, 0x18, 0x00, 0x01, 
+0xa0, 0x36, 0x27, 0xc0, 0x01, 0xc0, 0x50, 0x02, 0x82, 0xf0, 0x00, 
+0x04, 0xa0, 0x14, 0x10, 0x5f, 0x80, 0x11, 0x50, 0x02, 0xa0, 0x3d, 
+0xc0, 0x42, 0xa0, 0x08, 0x08, 0x00, 0x81, 0x01, 0x40, 0x00, 0x00, 
+0x30, 0x04, 0x06, 0xa0, 0x05, 0x24, 0x60, 0x10, 0x05, 0x40, 0x00, 
+0x00, 0x00, 0x44, 0x0a, 0x80, 0x02, 0x02, 0x61, 0x10, 0x05, 0x40, 
+0x00, 0x10, 0x04, 0x02, 0x1a, 0x80, 0x01, 0x01, 0x12, 0x90, 0x95, 
+0x00, 0x00, 0x04, 0x48, 0x40, 0x2a, 0x00, 0x00, 0x80, 0xa5, 0x28, 
+0x55, 0x00, 0x00, 0x00, 0xa8, 0x01, 0xaa, 0x00, 0x00, 0x48, 0x52, 
+0x87, 0x54, 0x00, 0x00, 0x00, 0xa5, 0x1a, 0xa8, 0x00, 0x00, 0x21, 
+0x52, 0x75, 0x40, 0x00, 0x00, 0x00, 0x89, 0xaa, 0x00, 0x00, 0x00, 
+0x11, 0x27, 0x50, 0x00, 0x00, 0x00, 0x02, 0x9a, 0x80, 0x00, 0x00, 
+0x00, 0x0a, 0x74, 0x00, 0x00, 0x00, 0x00, 0x01, 0xa0, 0x00, 0x00, 
+0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+0x00, 0x00, };
+unsigned char ns_logo_bitmap_plane_1[] =
+ {
+// plane 1
+0xff, 0xff, 0xff, 0xcf, 0xff, 0xf8, 0xff, 0xff, 0xff, 0x07, 0xff, 
+0xf8, 0xff, 0xff, 0xfc, 0x03, 0xff, 0xf8, 0xff, 0xff, 0xf0, 0x01, 
+0xff, 0xf8, 0xff, 0xff, 0xc3, 0xe2, 0xff, 0xf8, 0xff, 0xff, 0x0c, 
+0x31, 0x7f, 0xf8, 0xff, 0xfc, 0x08, 0x18, 0xbf, 0xf8, 0xff, 0xf0, 
+0x10, 0x30, 0x5f, 0xf8, 0xff, 0xc3, 0x10, 0xe0, 0xbf, 0xf8, 0xff, 
+0x01, 0x13, 0x84, 0x5f, 0xf8, 0xfc, 0x01, 0x9e, 0x04, 0x2f, 0xf8, 
+0xf0, 0x00, 0x98, 0x0c, 0x17, 0xf8, 0xf1, 0x00, 0xcc, 0x08, 0x2f, 
+0xf8, 0xf1, 0xe0, 0x4e, 0x38, 0x97, 0xf8, 0xe0, 0xfc, 0x63, 0xe3, 
+0x8b, 0xf8, 0xf0, 0xcf, 0xa0, 0x0e, 0x05, 0xf8, 0xe0, 0x40, 0xf0, 
+0x38, 0x0b, 0xf8, 0xe0, 0x60, 0x10, 0xec, 0x05, 0xf8, 0xe0, 0x20, 
+0x01, 0x8c, 0x02, 0xf8, 0xe0, 0x30, 0x04, 0x06, 0x01, 0x78, 0xc0, 
+0x10, 0x0c, 0x02, 0x02, 0xb8, 0xe0, 0x10, 0x0c, 0x03, 0x01, 0x78, 
+0xc0, 0x00, 0x08, 0x01, 0x00, 0xb8, 0xe0, 0x04, 0x08, 0x01, 0x80, 
+0x58, 0xc0, 0x0f, 0x18, 0x00, 0x80, 0xa8, 0xe0, 0x01, 0xf8, 0x00, 
+0x81, 0x58, 0xe0, 0x00, 0x3e, 0x00, 0x00, 0xa8, 0xf0, 0x00, 0x13, 
+0xe0, 0x01, 0x58, 0xf0, 0x00, 0x30, 0x60, 0x02, 0xb8, 0xf8, 0x00, 
+0x20, 0x00, 0x01, 0x58, 0xf8, 0x00, 0x20, 0x00, 0x02, 0xb8, 0xfc, 
+0x00, 0x60, 0x00, 0x05, 0x78, 0xfc, 0x00, 0x40, 0x00, 0x0a, 0xb8, 
+0xfe, 0x00, 0x00, 0x00, 0x05, 0x78, 0xfe, 0x00, 0x00, 0x00, 0x0a, 
+0xf8, 0xff, 0x00, 0x00, 0x00, 0x15, 0xf8, 0xff, 0x00, 0x00, 0x00, 
+0x2a, 0xf8, 0xff, 0x80, 0x00, 0x00, 0x55, 0xf8, 0xff, 0x80, 0x00, 
+0x00, 0xab, 0xf8, 0xff, 0xc0, 0x00, 0x05, 0x57, 0xf8, 0xff, 0xc0, 
+0x00, 0x0a, 0xbf, 0xf8, 0xff, 0xe0, 0x00, 0x55, 0xff, 0xf8, 0xff, 
+0xe0, 0x00, 0xaf, 0xff, 0xf8, 0xff, 0xf0, 0x05, 0x7f, 0xff, 0xf8, 
+0xff, 0xf0, 0x0b, 0xff, 0xff, 0xf8, 0xff, 0xf8, 0x5f, 0xff, 0xff, 
+0xf8, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 
+0xff, 0xf8, };
+struct bitmap ns_logo_bitmap = {
+0,     // packed
+288,   // bytes_per_plane
+6,     // bytes_per_row
+1,     // bits per pixel
+45,    // width
+48,    // height
+{
+  288,
+  288,
+},
+{
+  ns_logo_bitmap_plane_0,
+  ns_logo_bitmap_plane_1
+}
+};
+
+#define ns_logo_bitmap_WIDTH   45
+#define ns_logo_bitmap_HEIGHT  48
diff --git a/i386/util/ns_wait1.h b/i386/util/ns_wait1.h
new file mode 100644 (file)
index 0000000..603a4ca
--- /dev/null
@@ -0,0 +1,27 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
+ * Reserved.  This file contains Original Code and/or Modifications of
+ * Original Code as defined in and that are subject to the Apple Public
+ * Source License Version 1.1 (the "License").  You may not use this file
+ * except in compliance with the License.  Please obtain a copy of the
+ * License at http://www.apple.com/publicsource and read it before using
+ * this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+extern struct bitmap ns_wait1_bitmap;
+
+#define ns_wait1_bitmap_WIDTH  16
+#define ns_wait1_bitmap_HEIGHT 16
diff --git a/i386/util/ns_wait1.image b/i386/util/ns_wait1.image
new file mode 100644 (file)
index 0000000..b0fad13
Binary files /dev/null and b/i386/util/ns_wait1.image differ
diff --git a/i386/util/ns_wait1_bitmap.h b/i386/util/ns_wait1_bitmap.h
new file mode 100644 (file)
index 0000000..aa11729
--- /dev/null
@@ -0,0 +1,54 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
+ * Reserved.  This file contains Original Code and/or Modifications of
+ * Original Code as defined in and that are subject to the Apple Public
+ * Source License Version 1.1 (the "License").  You may not use this file
+ * except in compliance with the License.  Please obtain a copy of the
+ * License at http://www.apple.com/publicsource and read it before using
+ * this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+unsigned char ns_wait1_bitmap_plane_0[] =
+ {
+// plane 0
+0x07, 0xe0, 0x19, 0x80, 0x31, 0x98, 0x79, 0x3e, 0x5d, 0x72, 0x85, 
+0x66, 0xeb, 0x5e, 0xff, 0xa0, 0xd1, 0xf4, 0x86, 0xce, 0x9d, 0x62, 
+0x39, 0x30, 0x31, 0xb8, 0x13, 0x38, 0x1f, 0xa0, 0x00, 0x00, };
+unsigned char ns_wait1_bitmap_plane_1[] =
+ {
+// plane 1
+0xff, 0xff, 0xfe, 0x1f, 0xfe, 0x07, 0xfe, 0x01, 0xfe, 0x0d, 0xfe, 
+0x1e, 0x96, 0x3e, 0x80, 0x7e, 0x80, 0x0a, 0x81, 0x00, 0x83, 0x80, 
+0xc7, 0xc1, 0xcf, 0xc1, 0xef, 0xc3, 0xe7, 0xc7, 0xf8, 0x1f, };
+struct bitmap ns_wait1_bitmap = {
+0,     // packed
+32,    // bytes_per_plane
+2,     // bytes_per_row
+1,     // bits per pixel
+16,    // width
+16,    // height
+{
+  32,
+  32,
+},
+{
+  ns_wait1_bitmap_plane_0,
+  ns_wait1_bitmap_plane_1
+}
+};
+
+#define ns_wait1_bitmap_WIDTH  16
+#define ns_wait1_bitmap_HEIGHT 16
diff --git a/i386/util/ns_wait2.h b/i386/util/ns_wait2.h
new file mode 100644 (file)
index 0000000..05c1336
--- /dev/null
@@ -0,0 +1,27 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
+ * Reserved.  This file contains Original Code and/or Modifications of
+ * Original Code as defined in and that are subject to the Apple Public
+ * Source License Version 1.1 (the "License").  You may not use this file
+ * except in compliance with the License.  Please obtain a copy of the
+ * License at http://www.apple.com/publicsource and read it before using
+ * this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+extern struct bitmap ns_wait2_bitmap;
+
+#define ns_wait2_bitmap_WIDTH  16
+#define ns_wait2_bitmap_HEIGHT 16
diff --git a/i386/util/ns_wait2.image b/i386/util/ns_wait2.image
new file mode 100644 (file)
index 0000000..585e8f3
Binary files /dev/null and b/i386/util/ns_wait2.image differ
diff --git a/i386/util/ns_wait2_bitmap.h b/i386/util/ns_wait2_bitmap.h
new file mode 100644 (file)
index 0000000..3165054
--- /dev/null
@@ -0,0 +1,54 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
+ * Reserved.  This file contains Original Code and/or Modifications of
+ * Original Code as defined in and that are subject to the Apple Public
+ * Source License Version 1.1 (the "License").  You may not use this file
+ * except in compliance with the License.  Please obtain a copy of the
+ * License at http://www.apple.com/publicsource and read it before using
+ * this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+unsigned char ns_wait2_bitmap_plane_0[] =
+ {
+// plane 0
+0x07, 0xe0, 0x1b, 0x80, 0x23, 0x18, 0x71, 0x32, 0x59, 0x62, 0x8d, 
+0x4e, 0xc2, 0x1c, 0xf9, 0x60, 0xd6, 0x7c, 0x83, 0x4e, 0x9d, 0x22, 
+0x39, 0x30, 0x31, 0x38, 0x13, 0x98, 0x07, 0x80, 0x00, 0x00, };
+unsigned char ns_wait2_bitmap_plane_1[] =
+ {
+// plane 1
+0xff, 0xff, 0xff, 0xff, 0xff, 0xe7, 0xcf, 0xc1, 0xc7, 0x81, 0x83, 
+0x80, 0x81, 0x82, 0x80, 0x1e, 0xa8, 0x3e, 0xfe, 0x3e, 0xfe, 0x1c, 
+0xfe, 0x0d, 0xfe, 0x05, 0xfc, 0x03, 0xf8, 0x07, 0xf8, 0x1f, };
+struct bitmap ns_wait2_bitmap = {
+0,     // packed
+32,    // bytes_per_plane
+2,     // bytes_per_row
+1,     // bits per pixel
+16,    // width
+16,    // height
+{
+  32,
+  32,
+},
+{
+  ns_wait2_bitmap_plane_0,
+  ns_wait2_bitmap_plane_1
+}
+};
+
+#define ns_wait2_bitmap_WIDTH  16
+#define ns_wait2_bitmap_HEIGHT 16
diff --git a/i386/util/ns_wait3.h b/i386/util/ns_wait3.h
new file mode 100644 (file)
index 0000000..3a0d435
--- /dev/null
@@ -0,0 +1,27 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
+ * Reserved.  This file contains Original Code and/or Modifications of
+ * Original Code as defined in and that are subject to the Apple Public
+ * Source License Version 1.1 (the "License").  You may not use this file
+ * except in compliance with the License.  Please obtain a copy of the
+ * License at http://www.apple.com/publicsource and read it before using
+ * this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+extern struct bitmap ns_wait3_bitmap;
+
+#define ns_wait3_bitmap_WIDTH  16
+#define ns_wait3_bitmap_HEIGHT 16
diff --git a/i386/util/ns_wait3.image b/i386/util/ns_wait3.image
new file mode 100644 (file)
index 0000000..456e7c2
Binary files /dev/null and b/i386/util/ns_wait3.image differ
diff --git a/i386/util/ns_wait3_bitmap.h b/i386/util/ns_wait3_bitmap.h
new file mode 100644 (file)
index 0000000..4ec9868
--- /dev/null
@@ -0,0 +1,54 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
+ * Reserved.  This file contains Original Code and/or Modifications of
+ * Original Code as defined in and that are subject to the Apple Public
+ * Source License Version 1.1 (the "License").  You may not use this file
+ * except in compliance with the License.  Please obtain a copy of the
+ * License at http://www.apple.com/publicsource and read it before using
+ * this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+unsigned char ns_wait3_bitmap_plane_0[] =
+ {
+// plane 0
+0x07, 0xe0, 0x1b, 0x98, 0x33, 0x9c, 0x59, 0x3e, 0x59, 0x32, 0x8d, 
+0x06, 0xe6, 0x7e, 0xfd, 0x00, 0xd2, 0xf0, 0x86, 0x1e, 0x9d, 0x4e, 
+0x39, 0x44, 0x31, 0x20, 0x13, 0x38, 0x1f, 0xa0, 0x00, 0x00, };
+unsigned char ns_wait3_bitmap_plane_1[] =
+ {
+// plane 1
+0xff, 0xff, 0xf8, 0x7f, 0xe0, 0x7f, 0xe0, 0xfd, 0xe0, 0xfd, 0xf0, 
+0xf8, 0xf8, 0x80, 0xfe, 0x00, 0xfc, 0x00, 0xf8, 0xe0, 0xe0, 0xf0, 
+0xc0, 0xf9, 0xc0, 0xf9, 0xe0, 0xf3, 0xe0, 0x47, 0xf8, 0x1f, };
+struct bitmap ns_wait3_bitmap = {
+0,     // packed
+32,    // bytes_per_plane
+2,     // bytes_per_row
+1,     // bits per pixel
+16,    // width
+16,    // height
+{
+  32,
+  32,
+},
+{
+  ns_wait3_bitmap_plane_0,
+  ns_wait3_bitmap_plane_1
+}
+};
+
+#define ns_wait3_bitmap_WIDTH  16
+#define ns_wait3_bitmap_HEIGHT 16
diff --git a/i386/util/return.h b/i386/util/return.h
new file mode 100644 (file)
index 0000000..218b682
--- /dev/null
@@ -0,0 +1,27 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
+ * Reserved.  This file contains Original Code and/or Modifications of
+ * Original Code as defined in and that are subject to the Apple Public
+ * Source License Version 1.1 (the "License").  You may not use this file
+ * except in compliance with the License.  Please obtain a copy of the
+ * License at http://www.apple.com/publicsource and read it before using
+ * this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+extern struct bitmap return_bitmap;
+
+#define return_bitmap_WIDTH    15
+#define return_bitmap_HEIGHT   10
diff --git a/i386/util/return.tiff b/i386/util/return.tiff
new file mode 100644 (file)
index 0000000..89102c2
Binary files /dev/null and b/i386/util/return.tiff differ
diff --git a/i386/util/return_bitmap.h b/i386/util/return_bitmap.h
new file mode 100644 (file)
index 0000000..0d35951
--- /dev/null
@@ -0,0 +1,52 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
+ * Reserved.  This file contains Original Code and/or Modifications of
+ * Original Code as defined in and that are subject to the Apple Public
+ * Source License Version 1.1 (the "License").  You may not use this file
+ * except in compliance with the License.  Please obtain a copy of the
+ * License at http://www.apple.com/publicsource and read it before using
+ * this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+unsigned char return_bitmap_plane_0[] =
+ {
+// plane 0
+0x00, 0x02, 0x00, 0x02, 0x0c, 0x02, 0x14, 0x02, 0x20, 0x02, 0x40, 
+0x02, 0x00, 0x02, 0x07, 0xfe, 0x04, 0x00, 0x04, 0x00, };
+unsigned char return_bitmap_plane_1[] =
+ {
+// plane 1
+0xff, 0xc0, 0xf3, 0xde, 0xe3, 0xde, 0xc8, 0x1e, 0x9f, 0xfe, 0x3f, 
+0xfe, 0xbf, 0xfe, 0xdf, 0xfe, 0xef, 0xfe, 0xf7, 0xfe, };
+struct bitmap return_bitmap = {
+0,     // packed
+20,    // bytes_per_plane
+2,     // bytes_per_row
+1,     // bits per pixel
+15,    // width
+10,    // height
+{
+  20,
+  20,
+},
+{
+  return_bitmap_plane_0,
+  return_bitmap_plane_1
+}
+};
+
+#define return_bitmap_WIDTH    15
+#define return_bitmap_HEIGHT   10
diff --git a/i386/util/sig.c b/i386/util/sig.c
new file mode 100644 (file)
index 0000000..5c5314c
--- /dev/null
@@ -0,0 +1,336 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
+ * Reserved.  This file contains Original Code and/or Modifications of
+ * Original Code as defined in and that are subject to the Apple Public
+ * Source License Version 1.1 (the "License").  You may not use this file
+ * except in compliance with the License.  Please obtain a copy of the
+ * License at http://www.apple.com/publicsource and read it before using
+ * this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright 1993 NeXT Computer, Inc.
+ * All rights reserved.
+ */
+
+/*
+ * Standalone Interface Generator
+ *
+ * Input file format: a series of lines of the form:
+ *
+ *     #<text>
+ * or
+ *     <function declaration> <arg list> ;
+ *
+ * e.g.:
+ *     void *malloc(int len) len;
+ *
+ * Lines starting with '#' are passed through unchanged.
+ * Lines starting with '/' are ignored.
+ *
+ *
+ */
+#import <stdio.h>
+#import <ctype.h>
+#import <string.h>
+#import <stdlib.h>
+#import <sys/param.h>
+
+#define MAXLINE 65535
+typedef enum {NO=0, YES=1} BOOL;
+#define strdup(str) ((char *)strcpy(malloc(strlen(str)+1),str))
+extern int getopt();
+
+enum {
+    none,
+    external,
+    internal,
+    table,
+    defs
+} which;
+char *osuffix[] = {
+    "none",
+    "_external.h",
+    "_internal.h",
+    "_table.c",
+    "_defs.h"
+};
+
+FILE *ofile;
+int lineNumber, outputNumber;
+char *moduleName;
+char *moduleNameCaps;
+
+char *stringToLower(char *string)
+{
+    char *new = strdup(string);
+    char *p = new;
+    
+    while (*p)
+       *p = tolower(*p++);
+    return new;
+}
+
+char *stringToUpper(char *string)
+{
+    char *new = strdup(string);
+    char *p = new;
+    
+    while (*p)
+       *p = toupper(*p++);
+    return new;
+}
+
+inline BOOL
+isIdentifier(char c)
+{
+    if (isalnum(c) || c == '_')
+       return YES;
+    else
+       return NO;
+}
+
+void
+outputLine(char *decl, char *function, char *args, char *arglist)
+{
+    if (which == table) {
+       static int struct_started;
+       if (struct_started == 0) {
+           fprintf(ofile, "unsigned long (*%s_functions[])() = {\n",
+                   moduleName);
+           struct_started = 1;
+       }
+       fprintf(ofile, "(unsigned long (*)())_%s,\t\t/* %d */\n", function, outputNumber);
+    }
+    
+    if (which == defs) {
+       fprintf(ofile, "#define %s _%s\n",function,function);
+    }
+    
+    if (which == internal) {
+       fprintf(ofile, "extern %s _%s(%s);\n", decl, function, args);
+    }
+    
+    if (which == external) {
+       fprintf(ofile, "#define %s_%s_FN %d\n",
+           moduleNameCaps, function, outputNumber);
+       fprintf(ofile, 
+           "static inline %s %s ( %s ) {\n", decl, function, args);
+       fprintf(ofile,
+           "\treturn (%s)(*%s_FN[%d])(%s);\n",
+           decl, moduleNameCaps, outputNumber, arglist);
+       fprintf(ofile, "}\n");
+    }
+    outputNumber++;
+}
+
+void
+parseLine(char *line)
+{
+    char *paren, *parenEnd;
+    char *ident, *identEnd;
+    char *arglist, *arglistEnd;
+    char *function;
+    
+    paren = strchr(line, '(');
+    if (paren == NULL)
+       goto syntax_error;
+    for (identEnd = paren - 1; !isIdentifier(*identEnd); identEnd--)
+       continue;
+    for (ident = identEnd; isIdentifier(*ident); ident--)
+       continue;
+    ident++;
+    *++identEnd = '\0';
+    paren++;
+    parenEnd = strchr(paren, ')');
+    if (parenEnd == NULL)
+       goto syntax_error;
+    *parenEnd = '\0';
+
+    arglist = parenEnd + 1;
+    while (isspace(*arglist))
+       arglist++;
+    arglistEnd = strchr(arglist, ';');
+    if (arglistEnd == NULL)
+       goto syntax_error;
+    *arglistEnd = '\0';
+    
+    function = strdup(ident);
+    *ident = '\0';
+    outputLine(line, function, paren, arglist);
+    free(function);
+    return;
+
+syntax_error:
+    fprintf(stderr, "Syntax error at line %d\n",lineNumber);
+    return;
+}
+
+int
+getLineThru(FILE *file, char *linebuf, char stop, int len)
+{
+    char *p = linebuf;
+    int c, gotten;
+
+    gotten = 0;
+    while (((c = fgetc(file)) != EOF) && len) {
+       *p++ = c;
+       len--;
+       gotten++;
+       if (c == '\n') lineNumber++;
+       if (c == stop)
+           break;
+    }
+    *p = '\0';
+    return gotten;
+}
+
+int
+peekf(FILE *file)
+{
+    int c = fgetc(file);
+    ungetc(c, file);
+    return c;
+}
+
+void
+skipWhitespace(FILE *file)
+{
+    int c;
+    
+    while ((c = fgetc(file)) != EOF && isspace(c))
+       if (c == '\n') ++lineNumber;
+    ungetc(c, file);
+}
+
+void
+parseFile(FILE *file)
+{
+    char *line, c;
+    int len, lineNumber;
+    
+    line = malloc(MAXLINE+1);
+    lineNumber = 1;
+    
+    skipWhitespace(file);
+    
+    while (!feof(file)) {
+       c = peekf(file);
+       if (c == '#' || c == '/') {
+           len = getLineThru(file, line, '\n', MAXLINE);
+           if (c == '#')
+               fprintf(ofile, line);
+       } else {
+           len = getLineThru(file, line, ';', MAXLINE);
+           parseLine(line);
+       }
+       skipWhitespace(file);
+    }
+    free(line);
+}
+
+int
+main(int argc, char **argv)
+{
+    extern char *optarg; 
+    extern int optind;
+    FILE *file;
+    int c, errflag = 0;
+    char ofilename[MAXPATHLEN];
+    char *ifile, *odir = ".";
+
+    while ((c = getopt(argc, argv, "d:n:")) != EOF)
+       switch (c) {
+       case 'd':
+           odir = optarg;
+           break;
+       case 'n':
+           moduleName = optarg;
+           moduleNameCaps = stringToUpper(moduleName);
+           break;
+       default:
+           errflag++;
+           break;
+       }
+
+    ofile = stdout;
+    if ((ifile = argv[optind]) != NULL) {
+       file = fopen(argv[optind], "r");
+       if (file == NULL) {
+           perror("open");
+           exit(1);
+       }
+    } else {
+       fprintf(stderr,"No input file specified\n");
+       exit(2);
+    }
+
+    if (moduleName == NULL) {
+       char *newName, *dot;
+       int len;
+       newName = strchr(ifile, '/');
+       if (newName == NULL)
+           newName = ifile;
+       dot = strchr(newName, '.');
+       if (dot == NULL)
+           dot = &newName[strlen(newName)];
+       len = dot - newName;
+       moduleName = (char *)malloc(len + 1);
+       strncpy(moduleName, newName, len);
+       moduleName[len] = '\0';
+       moduleNameCaps = stringToUpper(moduleName);
+    }
+    
+    for (which = external; which <= defs; which++) {
+       rewind(file);
+       lineNumber = 1;
+       outputNumber = 0;
+       sprintf(ofilename, "%s/%s%s", odir, moduleName, osuffix[which]);
+       ofile = fopen((const char *)ofilename, "w");
+       if (ofile == NULL) {
+           fprintf(stderr,"error opening output file %s\n",ofilename);
+           exit(3);
+       }
+
+       if (which == table) {
+           fprintf(ofile, "#define %s_TABLE 1\n", moduleNameCaps);
+           fprintf(ofile, "#import \"%s_internal.h\"\n",moduleName);
+       }
+    
+       if (which == internal) {
+           fprintf(ofile, "#define %s_INTERNAL 1\n", moduleNameCaps);
+       }
+       
+       if (which == defs) {
+           fprintf(ofile, "#define %s_DEFS 1\n", moduleNameCaps);
+       }
+       
+       if (which == external) {
+           fprintf(ofile, "#import \"memory.h\"\n");
+           fprintf(ofile, "#define %s_EXTERNAL 1\n", moduleNameCaps);
+           fprintf(ofile, 
+           "#define %s_FN (*(unsigned long (***)())%s_TABLE_POINTER)\n\n",
+               moduleNameCaps, moduleNameCaps);
+       }
+       parseFile(file);
+       
+       if (which == table) {
+           fprintf(ofile, "};\n\n");
+       }
+    }
+    return 0;
+}
diff --git a/i386/util/spin_cursor.h b/i386/util/spin_cursor.h
new file mode 100644 (file)
index 0000000..fc4d364
--- /dev/null
@@ -0,0 +1,122 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
+ * Reserved.  This file contains Original Code and/or Modifications of
+ * Original Code as defined in and that are subject to the Apple Public
+ * Source License Version 1.1 (the "License").  You may not use this file
+ * except in compliance with the License.  Please obtain a copy of the
+ * License at http://www.apple.com/publicsource and read it before using
+ * this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+#define SPIN_WIDTH 16
+
+#define BIG_WIDTH      353
+#define BIG_HEIGHT     264
+#define BIG_DY 0
+
+static char waitCursors_1[ SPIN_WIDTH * SPIN_WIDTH ] = {
+
+        0xf9,0xf9,0x56,0xf9,0xfa,0x2c,0x32,0x2d,0x57,0x51,0x56,0x56,0x56,0xf9,0xf9,0x56,
+        0x56,0xfa,0x56,0x56,0x2c,0x5e,0x58,0x5f,0x58,0x7d,0x52,0x57,0x56,0x56,0xf9,0xf9,
+        0xf9,0x56,0xf9,0x33,0x3a,0x34,0x5f,0x59,0x83,0x52,0x7c,0x76,0x76,0x7b,0x5d,0x56,
+        0xf9,0x56,0x0f,0x39,0x33,0x3a,0x34,0x59,0x58,0x58,0x52,0x76,0x4b,0x75,0x7b,0x56,
+        0xf9,0x0e,0x15,0x0f,0x39,0x34,0x5e,0x59,0x83,0x7c,0x7c,0x4b,0x75,0x6f,0x7b,0x56,
+        0x56,0x39,0x0e,0x14,0x0e,0x39,0x33,0x57,0x57,0x7c,0x4b,0x6f,0x4a,0x75,0x6e,0xa6,
+        0x32,0x38,0x3f,0x39,0x39,0x0e,0x5d,0x81,0x81,0x57,0x75,0x6f,0x75,0x6e,0x75,0xa6,
+        0x31,0x3e,0x38,0x3e,0x38,0x38,0x7b,0x81,0x56,0x56,0x75,0x74,0x6e,0x74,0x74,0xa5,
+        0x38,0x3f,0x63,0x63,0x69,0x62,0x81,0x7b,0x56,0x56,0xa5,0x99,0x9f,0x99,0x9f,0xa6,
+        0x31,0x69,0x62,0x68,0x62,0x8d,0x5c,0x5c,0x56,0xa5,0xc2,0xc2,0x98,0xc3,0x98,0xac,
+        0x5c,0x62,0x69,0x68,0x8c,0x62,0x86,0x7f,0x7f,0x79,0xa4,0xc2,0xc9,0x9e,0xc9,0xac,
+        0x56,0x62,0x62,0x8c,0x62,0x85,0x5b,0x7e,0x78,0x7f,0x9d,0xc8,0x9e,0xc8,0xc9,0x81,
+        0xf9,0x81,0x8c,0x62,0x8c,0x85,0x85,0x7e,0x7f,0x79,0xa3,0x9d,0xa4,0xc8,0xac,0x56,
+        0xf9,0xf9,0x80,0x86,0x5b,0x85,0x5a,0x7e,0x54,0x7f,0x79,0xa3,0x9d,0xd0,0x56,0xf9,
+        0xf9,0xf9,0x56,0x81,0x86,0x5b,0x85,0x7e,0x7e,0x78,0xa3,0xa4,0xac,0x56,0xfa,0xf9,
+        0xf9,0x56,0xf9,0xf9,0x56,0xab,0xa5,0x80,0x80,0xab,0xac,0x81,0x56,0xf9,0x56,0xf9,
+};
+
+struct bitmap wait1_bitmap = {
+0,     // packed
+256,   // bytes_per_plane
+16,    // bytes_per_row
+8,     // bits per pixel
+16,    // width
+16,    // height
+{  256,  0, },
+{  waitCursors_1,  0 }
+};
+
+static char waitCursors_2[ SPIN_WIDTH * SPIN_WIDTH ] = {
+
+        0xf9,0xf9,0x56,0xf9,0xfa,0xf9,0x2c,0x2c,0x2d,0x2c,0x56,0x56,0x56,0xf9,0xf9,0x56,
+        0x56,0xfa,0x56,0x56,0x08,0x09,0x09,0x2d,0x2d,0x58,0x52,0x7b,0x56,0x56,0xf9,0xf9,
+        0xf9,0x56,0x07,0x33,0x33,0x09,0x09,0x2d,0x2e,0x52,0x7d,0x7d,0xa7,0x7b,0x5d,0x56,
+        0xf9,0x56,0x39,0x3a,0x33,0x0f,0x08,0x09,0x2d,0x58,0x76,0xa7,0xa1,0xa0,0x81,0x56,
+        0xf9,0x39,0x64,0x3a,0x3a,0x33,0x0f,0x09,0x58,0x7c,0xa7,0xa1,0xa1,0xa0,0xa6,0x7b,
+        0x56,0x6a,0x64,0x64,0x3a,0x3a,0x0f,0x2c,0x2d,0x7d,0xa1,0xa0,0x9a,0xa0,0x99,0xac,
+        0x32,0x64,0x6a,0x6a,0x6a,0x40,0x5d,0x81,0x81,0x7b,0xa1,0x9a,0xa0,0x75,0x9f,0xa6,
+        0x32,0x69,0x63,0x6a,0x64,0x6a,0x7b,0x81,0x56,0x56,0x75,0x74,0x6e,0x74,0x6e,0x9f,
+        0x5c,0x63,0x69,0x63,0x69,0x62,0x81,0x7b,0x56,0x56,0x74,0x6d,0x74,0x6e,0x74,0x9f,
+        0x31,0x62,0x3e,0x3e,0x37,0x3d,0x55,0x5c,0x50,0xa5,0x73,0x73,0x6d,0x73,0x49,0xa5,
+        0x5c,0x37,0x3e,0x37,0x3d,0x30,0x5b,0x85,0xd4,0xa4,0xa4,0x97,0x97,0x6d,0x73,0xac,
+        0x56,0x37,0x36,0x37,0x30,0x36,0x5a,0x85,0xaa,0xce,0x9d,0x9e,0x73,0x73,0x74,0x81,
+        0xf9,0x81,0x37,0x30,0x36,0x5b,0x85,0xa9,0xd4,0xce,0xce,0x9e,0xa4,0x9e,0xac,0x56,
+        0xf9,0xf9,0x5c,0x36,0x30,0x61,0x7f,0xa9,0xa9,0xce,0xc8,0xa4,0x9e,0xd0,0x56,0xf9,
+        0xf9,0xf9,0x56,0x81,0x86,0x5b,0x85,0xaa,0xd4,0xaa,0xcf,0xcf,0xd6,0x56,0xfa,0xf9,
+        0xf9,0x56,0xf9,0xf9,0x7b,0xac,0xab,0xab,0xab,0xd0,0xac,0x81,0x56,0xf9,0x56,0xf9,
+};
+
+struct bitmap wait2_bitmap = {
+0,     // packed
+256,   // bytes_per_plane
+16,    // bytes_per_row
+8,     // bits per pixel
+16,    // width
+16,    // height
+{  256,  0, },
+{  waitCursors_2,  0 }
+};
+
+static char waitCursors_3[ SPIN_WIDTH * SPIN_WIDTH ] = {
+
+        0xf9,0xf9,0x56,0xf9,0xfa,0x2c,0x2c,0x2c,0x2c,0x2c,0x56,0x56,0x56,0xf9,0xf9,0x56,
+        0x56,0xfa,0x56,0x56,0x33,0x5e,0x34,0x2d,0x27,0x2d,0x26,0x50,0x56,0x56,0xf9,0xf9,
+        0xf9,0x56,0x32,0x65,0x65,0x58,0x5e,0x2e,0x2d,0x27,0x2d,0x51,0x76,0x7b,0x5d,0x56,
+        0xf9,0x56,0x5e,0x65,0x5f,0x5e,0x34,0x34,0x27,0x27,0x27,0x76,0x75,0x76,0x81,0x56,
+        0x56,0x39,0x6a,0x64,0x6b,0x65,0x5f,0x34,0x2d,0x27,0x51,0x75,0xa0,0xa0,0xa6,0x56,
+        0xf9,0x64,0x39,0x64,0x64,0x65,0x5e,0x33,0x26,0x51,0x75,0x9a,0x9a,0xc4,0xa0,0xac,
+        0x32,0x39,0x3f,0x3f,0x64,0x40,0x5d,0x81,0x81,0x57,0xa0,0xa0,0xca,0xa0,0xca,0xa6,
+        0xf7,0x38,0x14,0x38,0x38,0x38,0x7b,0x81,0x56,0x56,0xa0,0xc4,0xc3,0xc4,0x9f,0xca,
+        0x32,0x13,0x14,0x13,0x13,0x13,0x81,0x7b,0x56,0x56,0x9f,0x9f,0x9f,0x9f,0xc3,0xca,
+        0xf7,0x13,0x0d,0x13,0x13,0x3d,0x5c,0x5c,0x50,0x80,0x6d,0x97,0x98,0x9e,0x98,0xac,
+        0x81,0x13,0x3d,0x37,0x61,0x61,0x8c,0xaa,0xaa,0x72,0x73,0x73,0x97,0x73,0x9e,0xac,
+        0x56,0x37,0x37,0x61,0x61,0x86,0xaa,0xaa,0xa3,0x79,0x72,0x72,0x6c,0x73,0x9e,0x81,
+        0xf9,0x5d,0x62,0x61,0x8c,0x8c,0xb1,0xaa,0xaa,0x7f,0x79,0x4e,0x73,0x73,0xac,0x56,
+        0xf9,0xf9,0x80,0x86,0x86,0xb0,0xaa,0xaa,0xa3,0xa3,0x78,0x78,0x72,0xac,0x56,0xf9,
+        0xf9,0xf9,0x56,0x81,0xb1,0xaa,0xb0,0xaa,0xaa,0x7f,0xa3,0xa4,0xac,0x56,0xfa,0xf9,
+        0xf9,0x56,0xf9,0xf9,0x56,0x87,0xac,0xab,0xab,0xac,0xa5,0x81,0x56,0xf9,0x56,0xf9
+};
+
+struct bitmap wait3_bitmap = {
+0,     // packed
+256,   // bytes_per_plane
+16,    // bytes_per_row
+8,     // bits per pixel
+16,    // width
+16,    // height
+{  256,  0, },
+{  waitCursors_3,  0 }
+};
+
diff --git a/i386/util/test.c b/i386/util/test.c
new file mode 100644 (file)
index 0000000..e216435
--- /dev/null
@@ -0,0 +1,31 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
+ * Reserved.  This file contains Original Code and/or Modifications of
+ * Original Code as defined in and that are subject to the Apple Public
+ * Source License Version 1.1 (the "License").  You may not use this file
+ * except in compliance with the License.  Please obtain a copy of the
+ * License at http://www.apple.com/publicsource and read it before using
+ * this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+#include "font.h"
+#include "FontBitmap.h"
+
+main()
+{
+    printf("Hello, world.\n");
+    exit(1);
+}
diff --git a/i386/util/test.def b/i386/util/test.def
new file mode 100644 (file)
index 0000000..6331874
--- /dev/null
@@ -0,0 +1,2 @@
+char *malloc(int len) len ;
+int gets(char *buf) buf ;
diff --git a/i386/util/tif_packbits.c b/i386/util/tif_packbits.c
new file mode 100644 (file)
index 0000000..d90c80e
--- /dev/null
@@ -0,0 +1,198 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
+ * Reserved.  This file contains Original Code and/or Modifications of
+ * Original Code as defined in and that are subject to the Apple Public
+ * Source License Version 1.1 (the "License").  You may not use this file
+ * except in compliance with the License.  Please obtain a copy of the
+ * License at http://www.apple.com/publicsource and read it before using
+ * this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+#ifndef lint
+static char rcsid[] = "$Header: /cvs/Darwin/System/boot/i386/util/tif_packbits.c,v 1.1.1.2 1999/08/04 21:17:19 wsanchez Exp $";
+#endif
+
+/*
+ * Copyright (c) 1988, 1989, 1990, 1991 Sam Leffler
+ * Copyright (c) 1991 Silicon Graphics, Inc.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and 
+ * its documentation for any purpose is hereby granted without fee, provided
+ * that (i) the above copyright notices and this permission notice appear in
+ * all copies of the software and related documentation, and (ii) the names of
+ * Sam Leffler and Silicon Graphics may not be used in any advertising or
+ * publicity relating to the software without the specific, prior written
+ * permission of Sam Leffler and Silicon Graphics.
+ * 
+ * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, 
+ * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY 
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.  
+ * 
+ * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
+ * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
+ * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+ * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF 
+ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE 
+ * OF THIS SOFTWARE.
+ */
+
+/*
+ * TIFF Library.
+ *
+ * PackBits Compression Algorithm Support
+ */
+#import "bitmap.h"
+
+typedef unsigned int u_int;
+typedef unsigned char u_char;
+
+static
+TIFFAppendToStrip(tif, strip, data, cc)
+       TIFF *tif;
+       u_int strip;
+       u_char *data;
+       u_int cc;
+{
+}
+
+
+
+/*
+ * Encode a scanline of pixels.
+ */
+int
+PackBitsEncode(tif, bp, cc, s)
+       TIFF *tif;
+       u_char *bp;
+       register int cc;
+       u_int s;
+{
+       register char *op, *lastliteral;
+       register int n, b;
+       enum { BASE, LITERAL, RUN, LITERAL_RUN } state;
+       char *ep;
+       int slop;
+
+       op = tif->tif_rawcp;
+       ep = tif->tif_rawdata + tif->tif_rawdatasize;
+       state = BASE;
+       lastliteral = 0;
+       while (cc > 0) {
+               /*
+                * Find the longest string of identical bytes.
+                */
+               b = *bp++, cc--, n = 1;
+               for (; cc > 0 && b == *bp; cc--, bp++)
+                       n++;
+       again:
+               if (op + 2 >= ep) {             /* insure space for new data */
+                       /*
+                        * Be careful about writing the last
+                        * literal.  Must write up to that point
+                        * and then copy the remainder to the
+                        * front of the buffer.
+                        */
+                       if (state == LITERAL || state == LITERAL_RUN) {
+                               slop = op - lastliteral;
+                               tif->tif_rawcc += lastliteral - tif->tif_rawcp;
+                               // no space left
+                               return (-1);
+                               op = tif->tif_rawcp;
+                               for (; slop-- > 0; *op++ = *lastliteral++)
+                                       ;
+                               lastliteral = tif->tif_rawcp;
+                       } else {
+                               tif->tif_rawcc += op - tif->tif_rawcp;
+                               // no space left
+                               return (-1);
+                               op = tif->tif_rawcp;
+                       }
+               }
+               switch (state) {
+               case BASE:              /* initial state, set run/literal */
+                       if (n > 1) {
+                               state = RUN;
+                               if (n > 128) {
+                                       *op++ = -127;
+                                       *op++ = b;
+                                       n -= 128;
+                                       goto again;
+                               }
+                               *op++ = -(n-1);
+                               *op++ = b;
+                       } else {
+                               lastliteral = op;
+                               *op++ = 0;
+                               *op++ = b;
+                               state = LITERAL;
+                       }
+                       break;
+               case LITERAL:           /* last object was literal string */
+                       if (n > 1) {
+                               state = LITERAL_RUN;
+                               if (n > 128) {
+                                       *op++ = -127;
+                                       *op++ = b;
+                                       n -= 128;
+                                       goto again;
+                               }
+                               *op++ = -(n-1);         /* encode run */
+                               *op++ = b;
+                       } else {                        /* extend literal */
+                               if (++(*lastliteral) == 127)
+                                       state = BASE;
+                               *op++ = b;
+                       }
+                       break;
+               case RUN:               /* last object was run */
+                       if (n > 1) {
+                               if (n > 128) {
+                                       *op++ = -127;
+                                       *op++ = b;
+                                       n -= 128;
+                                       goto again;
+                               }
+                               *op++ = -(n-1);
+                               *op++ = b;
+                       } else {
+                               lastliteral = op;
+                               *op++ = 0;
+                               *op++ = b;
+                               state = LITERAL;
+                       }
+                       break;
+               case LITERAL_RUN:       /* literal followed by a run */
+                       /*
+                        * Check to see if previous run should
+                        * be converted to a literal, in which
+                        * case we convert literal-run-literal
+                        * to a single literal.
+                        */
+                       if (n == 1 && op[-2] == (char)-1 &&
+                           *lastliteral < 126) {
+                               state = (((*lastliteral) += 2) == 127 ?
+                                   BASE : LITERAL);
+                               op[-2] = op[-1];        /* replicate */
+                       } else
+                               state = RUN;
+                       goto again;
+               }
+       }
+       tif->tif_rawcc += op - tif->tif_rawcp;
+       tif->tif_rawcp = op;
+       return (1);
+}
+